summaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/7zip/7zip.pri12
-rw-r--r--src/libs/7zip/7zip.pro2
-rw-r--r--src/libs/7zip/installer_framework_changes.txt54
-rw-r--r--src/libs/7zip/unix/7zC.txt (renamed from src/libs/7zip/unix/DOCS/7zC.txt)0
-rw-r--r--src/libs/7zip/unix/7zFormat.txt (renamed from src/libs/7zip/unix/DOCS/7zFormat.txt)84
-rw-r--r--src/libs/7zip/unix/C/7zCrcT8.c43
-rw-r--r--src/libs/7zip/unix/C/Aes.c284
-rw-r--r--src/libs/7zip/unix/C/Aes.h38
-rw-r--r--src/libs/7zip/unix/C/BwtSort.c516
-rw-r--r--src/libs/7zip/unix/C/BwtSort.h30
-rw-r--r--src/libs/7zip/unix/C/CpuArch.c8
-rw-r--r--src/libs/7zip/unix/C/HuffEnc.c146
-rw-r--r--src/libs/7zip/unix/C/HuffEnc.h27
-rw-r--r--src/libs/7zip/unix/C/Lzma86Dec.c (renamed from src/libs/7zip/unix/C/LzmaUtil/Lzma86Dec.c)0
-rw-r--r--src/libs/7zip/unix/C/Lzma86Enc.c (renamed from src/libs/7zip/unix/C/LzmaUtil/Lzma86Enc.c)0
-rw-r--r--src/libs/7zip/unix/C/LzmaUtil/Lzma86Dec.h51
-rw-r--r--src/libs/7zip/unix/C/LzmaUtil/Lzma86Enc.h78
-rw-r--r--src/libs/7zip/unix/C/Ppmd.h85
-rw-r--r--src/libs/7zip/unix/C/Ppmd7.c708
-rw-r--r--src/libs/7zip/unix/C/Ppmd7.h140
-rw-r--r--src/libs/7zip/unix/C/Ppmd7Dec.c187
-rw-r--r--src/libs/7zip/unix/C/Ppmd7Enc.c185
-rw-r--r--src/libs/7zip/unix/C/Ppmd8.c1120
-rw-r--r--src/libs/7zip/unix/C/Ppmd8.h133
-rw-r--r--src/libs/7zip/unix/C/Ppmd8Dec.c155
-rw-r--r--src/libs/7zip/unix/C/Ppmd8Enc.c161
-rw-r--r--src/libs/7zip/unix/C/Sort.c93
-rw-r--r--src/libs/7zip/unix/C/Sort.h20
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/ApmHandler.cpp356
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/ArjHandler.cpp798
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Bz2Handler.cpp423
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabBlockInStream.cpp189
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabBlockInStream.h44
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHandler.cpp929
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHandler.h28
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHeader.cpp15
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHeader.h44
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabIn.cpp272
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabIn.h161
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabItem.h63
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabRegister.cpp13
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHandler.cpp721
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHandler.h29
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHeader.cpp24
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHeader.h28
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmIn.cpp937
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmIn.h244
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmRegister.cpp13
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Com/ComHandler.cpp239
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Com/ComHandler.h28
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Com/ComIn.cpp389
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Com/ComIn.h119
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Com/ComRegister.cpp13
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Common/CoderMixer2ST.cpp239
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Common/CoderMixer2ST.h88
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Common/FindSignature.cpp62
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Common/FindSignature.h12
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp18
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Common/OutStreamWithSha1.h36
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/CpioHandler.cpp624
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/CramfsHandler.cpp644
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/DebHandler.cpp413
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/DeflateProps.cpp118
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/DeflateProps.h35
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/DmgHandler.cpp918
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/ElfHandler.cpp534
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/FatHandler.cpp996
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/FlvHandler.cpp544
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/GzHandler.cpp698
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsHandler.cpp243
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsHandler.h26
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsIn.cpp480
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsIn.h154
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsRegister.cpp13
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHandler.cpp326
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHandler.h30
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHeader.cpp21
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHeader.h61
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoIn.cpp453
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoIn.h315
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoItem.h141
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoRegister.cpp13
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/LzhHandler.cpp775
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/MachoHandler.cpp500
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/MbrHandler.cpp507
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/MslzHandler.cpp257
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/MubHandler.cpp266
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisDecode.cpp130
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisDecode.h47
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisHandler.cpp510
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisHandler.h43
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisIn.cpp1461
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisIn.h181
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisRegister.cpp13
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/NtfsHandler.cpp1764
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/PeHandler.cpp1752
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/PpmdHandler.cpp456
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHandler.cpp869
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHandler.h66
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHeader.cpp21
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHeader.h205
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarIn.cpp478
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarIn.h123
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarItem.cpp55
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarItem.h79
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarRegister.cpp13
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp78
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarVolumeInStream.h49
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/RpmHandler.cpp292
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/SquashfsHandler.cpp2155
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/SwfHandler.cpp706
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandler.cpp386
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandler.h61
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandlerOut.cpp122
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHeader.cpp25
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHeader.h108
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarIn.cpp207
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarIn.h17
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarItem.h72
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarOut.cpp187
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarOut.h28
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarRegister.cpp18
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarUpdate.cpp139
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarUpdate.h34
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfHandler.cpp451
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfHandler.h37
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfIn.cpp876
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfIn.h375
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfRegister.cpp13
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/VhdHandler.cpp734
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandler.cpp660
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandler.h77
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandlerOut.cpp639
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimIn.cpp855
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimIn.h297
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimRegister.cpp18
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/XarHandler.cpp588
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/ZHandler.cpp161
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipAddCommon.cpp379
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipAddCommon.h56
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipCompressionMode.h42
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandler.cpp822
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandler.h101
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp537
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHeader.cpp36
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHeader.h284
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipIn.cpp893
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipIn.h125
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItem.cpp181
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItem.h281
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItemEx.h34
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipOut.cpp289
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipOut.h56
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipRegister.cpp18
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipUpdate.cpp1076
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipUpdate.h58
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Common/MemBlocks.cpp183
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Common/MemBlocks.h71
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Common/OutMemStream.cpp142
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Common/OutMemStream.h96
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Common/ProgressMt.cpp53
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Common/ProgressMt.h46
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Common/StreamObjects.h2
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder1.cpp309
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder1.h98
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder2.cpp90
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder2.h59
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BZip2Const.h54
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BZip2Crc.cpp26
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BZip2Crc.h31
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BZip2Decoder.cpp943
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BZip2Decoder.h205
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BZip2Encoder.cpp895
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BZip2Encoder.h245
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BZip2Register.cpp20
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BitlDecoder.cpp24
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BitlDecoder.h141
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BitlEncoder.h57
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BitmDecoder.h66
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/BitmEncoder.h50
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Deflate64Register.cpp20
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/DeflateConst.h134
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/DeflateDecoder.cpp353
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/DeflateDecoder.h157
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/DeflateEncoder.cpp986
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/DeflateEncoder.h211
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/DeflateNsisRegister.cpp14
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/DeflateRegister.cpp21
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/DllExports.cpp39
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/DllExports2.cpp28
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/HuffmanDecoder.h89
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ImplodeDecoder.cpp219
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ImplodeDecoder.h57
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp89
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ImplodeHuffmanDecoder.h34
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp531
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp1018
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h48
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp311
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h20
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/LzOutWindow.cpp14
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/LzOutWindow.h66
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/LzhDecoder.cpp220
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/LzhDecoder.h106
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Lzx.h61
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Lzx86Converter.cpp90
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Lzx86Converter.h46
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/LzxDecoder.cpp387
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/LzxDecoder.h159
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Mtf8.h193
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PPMD_Alone/PpmdAlone.cpp348
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdContext.h490
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecode.h156
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecoder.cpp167
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecoder.h78
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncode.h142
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncoder.cpp119
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncoder.h48
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdRegister.cpp21
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdSubAlloc.h293
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdType.h14
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdZip.cpp223
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/PpmdZip.h72
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/QuantumDecoder.cpp175
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/QuantumDecoder.h264
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Rar1Decoder.cpp480
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Rar1Decoder.h88
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Rar2Decoder.cpp391
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Rar2Decoder.h174
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Rar3Decoder.cpp897
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Rar3Decoder.h267
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Rar3Vm.cpp1091
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/Rar3Vm.h179
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/RarCodecsRegister.cpp26
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ShrinkDecoder.cpp145
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ShrinkDecoder.h38
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ZDecoder.cpp159
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ZDecoder.h42
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ZlibDecoder.cpp89
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ZlibDecoder.h48
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ZlibEncoder.cpp61
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Compress/ZlibEncoder.h48
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/7zAes.cpp244
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/7zAes.h117
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/7zAesRegister.cpp18
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/HmacSha1.cpp109
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/HmacSha1.h39
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/MyAes.cpp48
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/MyAes.h38
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp83
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/Pbkdf2HmacSha1.h21
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/RandGen.cpp107
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/RandGen.h21
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/Rar20Crypto.cpp133
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/Rar20Crypto.h50
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/RarAes.cpp134
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/RarAes.h47
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/Sha1.cpp229
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/Sha1.h68
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/WzAes.cpp221
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/WzAes.h125
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/ZipCrypto.cpp88
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/ZipCrypto.h56
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/ZipStrong.cpp164
-rw-r--r--src/libs/7zip/unix/CPP/7zip/Crypto/ZipStrong.h47
-rw-r--r--src/libs/7zip/unix/CPP/7zip/UI/Common/CompressCall.cpp470
-rw-r--r--src/libs/7zip/unix/CPP/7zip/UI/Common/CompressCall.h24
-rw-r--r--src/libs/7zip/unix/CPP/7zip/UI/Common/HandlerLoader.h38
-rw-r--r--src/libs/7zip/unix/CPP/7zip/UI/Common/UpdatePair.cpp7
-rw-r--r--src/libs/7zip/unix/CPP/7zip/UI/Common/ZipRegistry.cpp293
-rw-r--r--src/libs/7zip/unix/CPP/Common/DynamicBuffer.h2
-rw-r--r--src/libs/7zip/unix/CPP/Common/Lang.cpp130
-rw-r--r--src/libs/7zip/unix/CPP/Common/Lang.h28
-rw-r--r--src/libs/7zip/unix/CPP/Common/MyMap.cpp140
-rw-r--r--src/libs/7zip/unix/CPP/Common/MyMap.h28
-rw-r--r--src/libs/7zip/unix/CPP/Common/MyXml.cpp209
-rw-r--r--src/libs/7zip/unix/CPP/Common/MyXml.h40
-rw-r--r--src/libs/7zip/unix/CPP/Common/TextConfig.cpp138
-rw-r--r--src/libs/7zip/unix/CPP/Common/TextConfig.h22
-rw-r--r--src/libs/7zip/unix/CPP/Windows/COM.cpp37
-rw-r--r--src/libs/7zip/unix/CPP/Windows/COM.h69
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Clipboard.cpp160
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Clipboard.h28
-rw-r--r--src/libs/7zip/unix/CPP/Windows/CommonDialog.h19
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/ComboBox.h82
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/Controls.cpp515
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/Dialog.cpp560
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/Dialog.h179
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/DialogImpl.h73
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/Edit.h24
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/ListView.h164
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/ProgressBar.h34
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/Static.h23
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/StatusBar.h56
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/Window2.cpp211
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Control/Window2.h111
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Menu.h4
-rw-r--r--src/libs/7zip/unix/CPP/Windows/PropVariantConversions.cpp7
-rw-r--r--src/libs/7zip/unix/CPP/Windows/PropVariantUtils.cpp78
-rw-r--r--src/libs/7zip/unix/CPP/Windows/PropVariantUtils.h28
-rw-r--r--src/libs/7zip/unix/CPP/Windows/ResourceString.h22
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Shell.h21
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Time.cpp20
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Window.cpp101
-rw-r--r--src/libs/7zip/unix/CPP/Windows/Window.h43
-rw-r--r--src/libs/7zip/unix/CPP/include_windows/windows.h4
-rw-r--r--src/libs/7zip/unix/CPP/myWindows/myAddExeFlag.cpp20
-rw-r--r--src/libs/7zip/unix/CPP/myWindows/myDateAndTime.cpp146
-rw-r--r--src/libs/7zip/unix/CPP/myWindows/myGetTickCount.cpp8
-rw-r--r--src/libs/7zip/unix/CPP/myWindows/mySplitCommandLine.cpp82
-rw-r--r--src/libs/7zip/unix/CPP/myWindows/test_emul.cpp745
-rw-r--r--src/libs/7zip/unix/CPP/myWindows/wine_GetXXXDefaultLangID.cpp741
-rw-r--r--src/libs/7zip/unix/CPP/myWindows/wine_date_and_time.cpp434
-rw-r--r--src/libs/7zip/unix/ChangeLog914
-rw-r--r--src/libs/7zip/unix/DOCS/License.txt52
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/commands/add.htm87
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/commands/bench.htm79
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/commands/delete.htm59
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/commands/extract.htm91
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/commands/extract_full.htm68
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/commands/index.htm33
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/commands/list.htm77
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/commands/style.css232
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/commands/test.htm46
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/commands/update.htm66
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/exit_codes.htm27
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/index.htm29
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/style.css232
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/ar_exclude.htm56
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/ar_include.htm83
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/ar_no.htm52
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/charset.htm49
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/exclude.htm60
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/include.htm87
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/index.htm64
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/large_pages.htm50
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/list_tech.htm36
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/method.htm625
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/output_dir.htm53
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/overwrite.htm56
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/password.htm54
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/recurse.htm83
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/sfx.htm156
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/ssc.htm50
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/stdin.htm55
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/stdout.htm50
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/stop_switch.htm31
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/style.css232
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/type.htm83
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/update.htm176
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/volume.htm49
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/working_dir.htm55
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/switches/yes.htm48
-rw-r--r--src/libs/7zip/unix/DOCS/MANUAL/syntax.htm120
-rw-r--r--src/libs/7zip/unix/DOCS/copying.txt504
-rw-r--r--src/libs/7zip/unix/DOCS/history.txt456
-rw-r--r--src/libs/7zip/unix/DOCS/readme.txt181
-rw-r--r--src/libs/7zip/unix/DOCS/unRarLicense.txt41
-rw-r--r--src/libs/7zip/unix/Methods.txt (renamed from src/libs/7zip/unix/DOCS/Methods.txt)0
-rw-r--r--src/libs/7zip/unix/README358
-rw-r--r--src/libs/7zip/unix/TODO39
-rw-r--r--src/libs/7zip/unix/history.txt271
-rw-r--r--src/libs/7zip/unix/installer_framework_changes.txt511
-rw-r--r--src/libs/7zip/unix/lzma.txt (renamed from src/libs/7zip/unix/DOCS/lzma.txt)0
-rw-r--r--src/libs/7zip/unix/unix.pri350
-rw-r--r--src/libs/7zip/win/7zC.txt (renamed from src/libs/7zip/win/DOC/7zC.txt)0
-rw-r--r--src/libs/7zip/win/7zFormat.txt (renamed from src/libs/7zip/win/DOC/7zFormat.txt)84
-rw-r--r--src/libs/7zip/win/C/Aes.c282
-rw-r--r--src/libs/7zip/win/C/Aes.h38
-rw-r--r--src/libs/7zip/win/C/AesOpt.c182
-rw-r--r--src/libs/7zip/win/C/BwtSort.c516
-rw-r--r--src/libs/7zip/win/C/BwtSort.h30
-rw-r--r--src/libs/7zip/win/C/HuffEnc.c146
-rw-r--r--src/libs/7zip/win/C/HuffEnc.h27
-rw-r--r--src/libs/7zip/win/C/Ppmd.h81
-rw-r--r--src/libs/7zip/win/C/Ppmd7.c708
-rw-r--r--src/libs/7zip/win/C/Ppmd7.h140
-rw-r--r--src/libs/7zip/win/C/Ppmd7Dec.c187
-rw-r--r--src/libs/7zip/win/C/Ppmd7Enc.c185
-rw-r--r--src/libs/7zip/win/C/Ppmd8.c1120
-rw-r--r--src/libs/7zip/win/C/Ppmd8.h133
-rw-r--r--src/libs/7zip/win/C/Ppmd8Dec.c155
-rw-r--r--src/libs/7zip/win/C/Ppmd8Enc.c161
-rw-r--r--src/libs/7zip/win/C/Sort.c93
-rw-r--r--src/libs/7zip/win/C/Sort.h20
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/ApmHandler.cpp356
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Archive.def6
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Archive2.def9
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/ArjHandler.cpp798
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Bz2Handler.cpp423
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.cpp189
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.h44
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.cpp929
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.h28
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.cpp15
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.h44
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.cpp272
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.h161
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Cab/CabItem.h63
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Cab/CabRegister.cpp13
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Cab/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHandler.cpp721
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHandler.h29
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHeader.cpp24
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHeader.h28
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmIn.cpp937
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmIn.h244
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmRegister.cpp13
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Chm/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Com/ComHandler.cpp239
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Com/ComHandler.h28
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Com/ComIn.cpp389
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Com/ComIn.h119
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Com/ComRegister.cpp13
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer.cpp19
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer.h32
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2ST.cpp239
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2ST.h88
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixerMT.cpp99
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixerMT.h69
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/FindSignature.cpp62
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/FindSignature.h12
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp18
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithSha1.h36
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/CpioHandler.cpp624
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/CramfsHandler.cpp644
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/DebHandler.cpp413
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/DeflateProps.cpp118
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/DeflateProps.h35
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/DllExports.cpp47
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/DmgHandler.cpp918
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/ElfHandler.cpp534
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/FatHandler.cpp996
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/FlvHandler.cpp544
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/GzHandler.cpp698
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsHandler.cpp243
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsHandler.h26
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsIn.cpp480
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsIn.h154
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsRegister.cpp13
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHandler.cpp326
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHandler.h30
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHeader.cpp21
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHeader.h61
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoIn.cpp453
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoIn.h315
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoItem.h141
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoRegister.cpp13
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Iso/StdAfx.h9
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/LzhHandler.cpp775
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/MachoHandler.cpp500
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/MbrHandler.cpp507
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/MslzHandler.cpp257
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/MubHandler.cpp266
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.cpp130
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.h47
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.cpp510
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.h43
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.cpp1461
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.h181
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisRegister.cpp13
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Nsis/StdAfx.h9
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/NtfsHandler.cpp1764
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/PeHandler.cpp1752
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/PpmdHandler.cpp456
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHandler.cpp869
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHandler.h66
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHeader.cpp21
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHeader.h205
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/RarIn.cpp478
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/RarIn.h123
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/RarItem.cpp55
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/RarItem.h79
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/RarRegister.cpp13
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp78
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/RarVolumeInStream.h49
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/StdAfx.cpp3
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Rar/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/RpmHandler.cpp292
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/SquashfsHandler.cpp2155
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/SwfHandler.cpp706
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/StdAfx.h9
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandler.cpp386
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandler.h61
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandlerOut.cpp122
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHeader.cpp25
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHeader.h108
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarIn.cpp207
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarIn.h17
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarItem.h72
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarOut.cpp187
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarOut.h28
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarRegister.cpp18
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarUpdate.cpp139
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Tar/TarUpdate.h34
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Udf/StdAfx.h9
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfHandler.cpp451
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfHandler.h37
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfIn.cpp876
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfIn.h375
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfRegister.cpp13
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/VhdHandler.cpp734
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Wim/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandler.cpp660
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandler.h77
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandlerOut.cpp639
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Wim/WimIn.cpp855
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Wim/WimIn.h297
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Wim/WimRegister.cpp18
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/XarHandler.cpp588
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/ZHandler.cpp161
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipAddCommon.cpp379
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipAddCommon.h56
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipCompressionMode.h42
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandler.cpp822
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandler.h101
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp531
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHeader.cpp36
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHeader.h284
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipIn.cpp893
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipIn.h125
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItem.cpp172
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItem.h281
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItemEx.h34
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipOut.cpp289
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipOut.h56
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipRegister.cpp18
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipUpdate.cpp1068
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipUpdate.h58
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/InMemStream.cpp222
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/InMemStream.h284
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/MemBlocks.cpp183
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/MemBlocks.h71
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/OutMemStream.cpp142
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/OutMemStream.h96
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/ProgressMt.cpp53
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/ProgressMt.h46
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder1.cpp309
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder1.h98
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder2.cpp90
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder2.h59
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BZip2Const.h54
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BZip2Crc.cpp26
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BZip2Crc.h31
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BZip2Decoder.cpp943
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BZip2Decoder.h205
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BZip2Encoder.cpp895
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BZip2Encoder.h245
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BZip2Register.cpp20
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BitlDecoder.cpp24
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BitlDecoder.h141
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BitlEncoder.h57
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BitmDecoder.h66
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BitmEncoder.h50
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Deflate64Register.cpp20
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/DeflateConst.h134
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/DeflateDecoder.cpp353
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/DeflateDecoder.h157
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/DeflateEncoder.cpp986
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/DeflateEncoder.h211
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/DeflateRegister.cpp21
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/DllExports.cpp45
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/DllExports2.cpp28
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/HuffmanDecoder.h89
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ImplodeDecoder.cpp219
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ImplodeDecoder.h57
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp89
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ImplodeHuffmanDecoder.h34
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/LzOutWindow.cpp14
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/LzOutWindow.h66
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/LzhDecoder.cpp220
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/LzhDecoder.h106
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Lzx.h61
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Lzx86Converter.cpp90
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Lzx86Converter.h46
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/LzxDecoder.cpp387
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/LzxDecoder.h159
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Mtf8.h193
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/PpmdDecoder.cpp167
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/PpmdDecoder.h78
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/PpmdEncoder.cpp119
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/PpmdEncoder.h48
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/PpmdRegister.cpp21
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/PpmdZip.cpp223
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/PpmdZip.h72
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/QuantumDecoder.cpp175
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/QuantumDecoder.h264
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Rar1Decoder.cpp480
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Rar1Decoder.h88
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Rar2Decoder.cpp391
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Rar2Decoder.h174
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Rar3Decoder.cpp897
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Rar3Decoder.h267
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Rar3Vm.cpp1091
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Rar3Vm.h179
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/RarCodecsRegister.cpp26
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ShrinkDecoder.cpp145
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ShrinkDecoder.h38
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ZDecoder.cpp159
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ZDecoder.h42
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ZlibDecoder.cpp89
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ZlibDecoder.h48
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ZlibEncoder.cpp61
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ZlibEncoder.h48
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/7zAes.cpp244
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/7zAes.h117
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/7zAesRegister.cpp18
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/HmacSha1.cpp109
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/HmacSha1.h39
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/MyAes.cpp48
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/MyAes.h38
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp83
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/Pbkdf2HmacSha1.h21
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/RandGen.cpp107
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/RandGen.h21
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/Rar20Crypto.cpp133
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/Rar20Crypto.h50
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/RarAes.cpp134
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/RarAes.h47
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/Sha1.cpp229
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/Sha1.h68
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/WzAes.cpp221
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/WzAes.h125
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/ZipCrypto.cpp88
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/ZipCrypto.h56
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/ZipStrong.cpp164
-rw-r--r--src/libs/7zip/win/CPP/7zip/Crypto/ZipStrong.h47
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall.cpp246
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall.h24
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall2.cpp178
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/Update.h4
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/ZipRegistry.cpp293
-rw-r--r--src/libs/7zip/win/CPP/Common/Lang.cpp130
-rw-r--r--src/libs/7zip/win/CPP/Common/Lang.h28
-rw-r--r--src/libs/7zip/win/CPP/Common/MyMap.cpp140
-rw-r--r--src/libs/7zip/win/CPP/Common/MyMap.h28
-rw-r--r--src/libs/7zip/win/CPP/Common/MyWindows.cpp109
-rw-r--r--src/libs/7zip/win/CPP/Common/MyXml.cpp209
-rw-r--r--src/libs/7zip/win/CPP/Common/MyXml.h40
-rw-r--r--src/libs/7zip/win/CPP/Common/Random.cpp26
-rw-r--r--src/libs/7zip/win/CPP/Common/Random.h16
-rw-r--r--src/libs/7zip/win/CPP/Common/TextConfig.cpp138
-rw-r--r--src/libs/7zip/win/CPP/Common/TextConfig.h22
-rw-r--r--src/libs/7zip/win/CPP/Windows/COM.cpp37
-rw-r--r--src/libs/7zip/win/CPP/Windows/COM.h69
-rw-r--r--src/libs/7zip/win/CPP/Windows/Clipboard.cpp135
-rw-r--r--src/libs/7zip/win/CPP/Windows/Clipboard.h28
-rw-r--r--src/libs/7zip/win/CPP/Windows/CommonDialog.cpp184
-rw-r--r--src/libs/7zip/win/CPP/Windows/CommonDialog.h19
-rw-r--r--src/libs/7zip/win/CPP/Windows/Console.cpp10
-rw-r--r--src/libs/7zip/win/CPP/Windows/Console.h52
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileSystem.cpp126
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileSystem.h51
-rw-r--r--src/libs/7zip/win/CPP/Windows/Memory.cpp36
-rw-r--r--src/libs/7zip/win/CPP/Windows/Memory.h53
-rw-r--r--src/libs/7zip/win/CPP/Windows/Menu.cpp191
-rw-r--r--src/libs/7zip/win/CPP/Windows/Menu.h153
-rw-r--r--src/libs/7zip/win/CPP/Windows/NationalTime.cpp37
-rw-r--r--src/libs/7zip/win/CPP/Windows/NationalTime.h20
-rw-r--r--src/libs/7zip/win/CPP/Windows/Net.cpp380
-rw-r--r--src/libs/7zip/win/CPP/Windows/Net.h87
-rw-r--r--src/libs/7zip/win/CPP/Windows/Process.cpp81
-rw-r--r--src/libs/7zip/win/CPP/Windows/Process.h100
-rw-r--r--src/libs/7zip/win/CPP/Windows/ProcessMessages.cpp22
-rw-r--r--src/libs/7zip/win/CPP/Windows/ProcessMessages.h14
-rw-r--r--src/libs/7zip/win/CPP/Windows/PropVariantUtils.cpp78
-rw-r--r--src/libs/7zip/win/CPP/Windows/PropVariantUtils.h28
-rw-r--r--src/libs/7zip/win/CPP/Windows/ResourceString.cpp64
-rw-r--r--src/libs/7zip/win/CPP/Windows/ResourceString.h22
-rw-r--r--src/libs/7zip/win/CPP/Windows/Security.cpp179
-rw-r--r--src/libs/7zip/win/CPP/Windows/Security.h167
-rw-r--r--src/libs/7zip/win/CPP/Windows/Shell.cpp335
-rw-r--r--src/libs/7zip/win/CPP/Windows/Shell.h93
-rw-r--r--src/libs/7zip/win/CPP/Windows/Window.cpp169
-rw-r--r--src/libs/7zip/win/CPP/Windows/Window.h261
-rw-r--r--src/libs/7zip/win/DOC/License.txt52
-rw-r--r--src/libs/7zip/win/DOC/copying.txt504
-rw-r--r--src/libs/7zip/win/DOC/history.txt456
-rw-r--r--src/libs/7zip/win/DOC/readme.txt181
-rw-r--r--src/libs/7zip/win/DOC/unRarLicense.txt41
-rw-r--r--src/libs/7zip/win/Methods.txt (renamed from src/libs/7zip/win/DOC/Methods.txt)0
-rw-r--r--src/libs/7zip/win/history.txt271
-rw-r--r--src/libs/7zip/win/installer_framework_changes.txt519
-rw-r--r--src/libs/7zip/win/lzma.txt (renamed from src/libs/7zip/win/DOC/lzma.txt)0
-rw-r--r--src/libs/7zip/win/win.pri164
-rw-r--r--src/libs/installer/addqtcreatorarrayvalueoperation.h6
-rw-r--r--src/libs/installer/adminauthorization_win.cpp40
-rw-r--r--src/libs/installer/adminauthorization_x11.cpp2
-rw-r--r--src/libs/installer/binaryformat.cpp24
-rw-r--r--src/libs/installer/binaryformat.h2
-rw-r--r--src/libs/installer/binaryformatengine.cpp6
-rw-r--r--src/libs/installer/binaryformatenginehandler.cpp4
-rw-r--r--src/libs/installer/component.cpp511
-rw-r--r--src/libs/installer/component.h16
-rw-r--r--src/libs/installer/component_p.cpp177
-rw-r--r--src/libs/installer/component_p.h26
-rw-r--r--src/libs/installer/componentmodel.cpp459
-rw-r--r--src/libs/installer/componentmodel.h51
-rw-r--r--src/libs/installer/constants.h1
-rw-r--r--src/libs/installer/consumeoutputoperation.cpp158
-rw-r--r--src/libs/installer/consumeoutputoperation.h65
-rw-r--r--src/libs/installer/createdesktopentryoperation.cpp2
-rw-r--r--src/libs/installer/createshortcutoperation.cpp59
-rw-r--r--src/libs/installer/downloadarchivesjob.cpp16
-rw-r--r--src/libs/installer/elevatedexecuteoperation.cpp18
-rw-r--r--src/libs/installer/environmentvariablesoperation.cpp4
-rw-r--r--src/libs/installer/errors.h5
-rw-r--r--src/libs/installer/extractarchiveoperation_p.h8
-rw-r--r--src/libs/installer/fileutils.cpp42
-rw-r--r--src/libs/installer/fileutils.h3
-rw-r--r--src/libs/installer/fsengineclient.cpp34
-rw-r--r--src/libs/installer/fsengineserver.cpp16
-rw-r--r--src/libs/installer/getrepositoriesmetainfojob.cpp25
-rw-r--r--src/libs/installer/getrepositoriesmetainfojob.h6
-rw-r--r--src/libs/installer/getrepositorymetainfojob.cpp63
-rw-r--r--src/libs/installer/getrepositorymetainfojob.h6
-rw-r--r--src/libs/installer/globals.cpp47
-rw-r--r--src/libs/installer/globals.h54
-rw-r--r--src/libs/installer/graph.h158
-rw-r--r--src/libs/installer/init.cpp91
-rw-r--r--src/libs/installer/installer.pro21
-rw-r--r--src/libs/installer/installiconsoperation.cpp47
-rw-r--r--src/libs/installer/lib7z_facade.cpp117
-rw-r--r--src/libs/installer/lib7z_facade.h92
-rw-r--r--src/libs/installer/link.h2
-rw-r--r--src/libs/installer/macreplaceinstallnamesoperation.cpp3
-rw-r--r--src/libs/installer/macreplaceinstallnamesoperation.h6
-rw-r--r--src/libs/installer/messageboxhandler.cpp167
-rw-r--r--src/libs/installer/messageboxhandler.h4
-rw-r--r--src/libs/installer/packagemanagercore.cpp914
-rw-r--r--src/libs/installer/packagemanagercore.h16
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp139
-rw-r--r--src/libs/installer/packagemanagercore_p.h43
-rw-r--r--src/libs/installer/packagemanagercoredata.cpp4
-rw-r--r--src/libs/installer/packagemanagergui.cpp380
-rw-r--r--src/libs/installer/packagemanagergui.h14
-rw-r--r--src/libs/installer/packagemanagerproxyfactory.h2
-rw-r--r--src/libs/installer/performinstallationform.cpp12
-rw-r--r--src/libs/installer/performinstallationform.h2
-rw-r--r--src/libs/installer/productkeycheck.cpp31
-rw-r--r--src/libs/installer/productkeycheck.h14
-rw-r--r--src/libs/installer/progresscoordinator.cpp18
-rw-r--r--src/libs/installer/progresscoordinator.h6
-rw-r--r--src/libs/installer/qinstallerglobal.h23
-rw-r--r--src/libs/installer/qprocesswrapper.cpp40
-rw-r--r--src/libs/installer/qprocesswrapper.h2
-rw-r--r--src/libs/installer/qsettingswrapper.cpp30
-rw-r--r--src/libs/installer/qtpatch.cpp57
-rw-r--r--src/libs/installer/qtpatch.h1
-rw-r--r--src/libs/installer/qtpatchoperation.cpp186
-rw-r--r--src/libs/installer/qtpatchoperation.h2
-rw-r--r--src/libs/installer/registerqtincreatorqnxoperation.cpp (renamed from src/libs/installer/registerqtvqnxoperation.cpp)2
-rw-r--r--src/libs/installer/registerqtincreatorqnxoperation.h (renamed from src/libs/installer/registerqtvqnxoperation.h)6
-rw-r--r--src/libs/installer/resources/files-to-patch-linux-emb-arm1
-rw-r--r--src/libs/installer/resources/files-to-patch-windows-emb-arm1
-rw-r--r--src/libs/installer/scriptengine.cpp410
-rw-r--r--src/libs/installer/scriptengine.h88
-rw-r--r--src/libs/installer/settings.cpp160
-rw-r--r--src/libs/installer/settings.h12
-rw-r--r--src/libs/installer/sysinfo_win.cpp224
-rw-r--r--src/libs/installer/utils.cpp34
-rw-r--r--src/libs/installer/utils.h3
-rw-r--r--src/libs/kdtools/environment.cpp41
-rw-r--r--src/libs/kdtools/environment.h41
-rw-r--r--src/libs/kdtools/kdgenericfactory.cpp158
-rw-r--r--src/libs/kdtools/kdgenericfactory.h45
-rw-r--r--src/libs/kdtools/kdjob.cpp45
-rw-r--r--src/libs/kdtools/kdjob.h45
-rw-r--r--src/libs/kdtools/kdlockfile.cpp79
-rw-r--r--src/libs/kdtools/kdlockfile.h45
-rw-r--r--src/libs/kdtools/kdlockfile_p.h45
-rw-r--r--src/libs/kdtools/kdlockfile_unix.cpp45
-rw-r--r--src/libs/kdtools/kdlockfile_win.cpp47
-rw-r--r--src/libs/kdtools/kdrunoncechecker.cpp45
-rw-r--r--src/libs/kdtools/kdrunoncechecker.h45
-rw-r--r--src/libs/kdtools/kdsavefile.cpp115
-rw-r--r--src/libs/kdtools/kdsavefile.h45
-rw-r--r--src/libs/kdtools/kdselfrestarter.cpp51
-rw-r--r--src/libs/kdtools/kdselfrestarter.h47
-rw-r--r--src/libs/kdtools/kdsysinfo.cpp45
-rw-r--r--src/libs/kdtools/kdsysinfo.h45
-rw-r--r--src/libs/kdtools/kdsysinfo_mac.cpp45
-rw-r--r--src/libs/kdtools/kdsysinfo_win.cpp222
-rw-r--r--src/libs/kdtools/kdsysinfo_x11.cpp47
-rw-r--r--src/libs/kdtools/kdtools.pri3
-rw-r--r--src/libs/kdtools/kdtoolsglobal.h45
-rw-r--r--src/libs/kdtools/kdupdater.h57
-rw-r--r--src/libs/kdtools/kdupdaterapplication.cpp92
-rw-r--r--src/libs/kdtools/kdupdaterapplication.h72
-rw-r--r--src/libs/kdtools/kdupdaterfiledownloader.cpp101
-rw-r--r--src/libs/kdtools/kdupdaterfiledownloader.h50
-rw-r--r--src/libs/kdtools/kdupdaterfiledownloader_p.h45
-rw-r--r--src/libs/kdtools/kdupdaterfiledownloaderfactory.cpp59
-rw-r--r--src/libs/kdtools/kdupdaterfiledownloaderfactory.h48
-rw-r--r--src/libs/kdtools/kdupdaterpackagesinfo.cpp98
-rw-r--r--src/libs/kdtools/kdupdaterpackagesinfo.h58
-rw-r--r--src/libs/kdtools/kdupdatersignatureverificationrunnable.cpp137
-rw-r--r--src/libs/kdtools/kdupdatersignatureverificationrunnable.h92
-rw-r--r--src/libs/kdtools/kdupdatertask.cpp45
-rw-r--r--src/libs/kdtools/kdupdatertask.h45
-rw-r--r--src/libs/kdtools/kdupdaterupdate.cpp310
-rw-r--r--src/libs/kdtools/kdupdaterupdate.h102
-rw-r--r--src/libs/kdtools/kdupdaterupdatefinder.cpp399
-rw-r--r--src/libs/kdtools/kdupdaterupdatefinder.h64
-rw-r--r--src/libs/kdtools/kdupdaterupdateoperation.cpp71
-rw-r--r--src/libs/kdtools/kdupdaterupdateoperation.h50
-rw-r--r--src/libs/kdtools/kdupdaterupdateoperationfactory.cpp48
-rw-r--r--src/libs/kdtools/kdupdaterupdateoperationfactory.h45
-rw-r--r--src/libs/kdtools/kdupdaterupdateoperations.cpp557
-rw-r--r--src/libs/kdtools/kdupdaterupdateoperations.h102
-rw-r--r--src/libs/kdtools/kdupdaterupdatesinfo.cpp237
-rw-r--r--src/libs/kdtools/kdupdaterupdatesinfo_p.h85
-rw-r--r--src/libs/kdtools/kdupdaterupdatesinfodata_p.h76
-rw-r--r--src/libs/kdtools/kdupdaterupdatesourcesinfo.cpp198
-rw-r--r--src/libs/kdtools/kdupdaterupdatesourcesinfo.h61
817 files changed, 6926 insertions, 149097 deletions
diff --git a/src/libs/7zip/7zip.pri b/src/libs/7zip/7zip.pri
index 22140c372..ded5793f4 100644
--- a/src/libs/7zip/7zip.pri
+++ b/src/libs/7zip/7zip.pri
@@ -1,15 +1,17 @@
win32 {
7ZIP_BASE=$$PWD/win
- INCLUDEPATH += $$7ZIP_BASE/CPP
- DEFINES += WIN_LONG_PATH _UNICODE
+ INCLUDEPATH += $$7ZIP_BASE/C $$7ZIP_BASE/CPP
+ DEFINES += WIN_LONG_PATH _UNICODE _NO_CRYPTO
}
unix {
7ZIP_BASE=$$PWD/unix
- INCLUDEPATH += $$7ZIP_BASE/CPP \
- $$7ZIP_BASE/CPP/myWindows \
+ INCLUDEPATH += \
+ $$7ZIP_BASE/C \
+ $$7ZIP_BASE/CPP \
+ $$7ZIP_BASE/CPP/myWindows \
$$7ZIP_BASE/CPP/include_windows
macx:DEFINES += ENV_MACOSX
- DEFINES += _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE NDEBUG _REENTRANT ENV_UNIX UNICODE _UNICODE
+ DEFINES += _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE NDEBUG _REENTRANT ENV_UNIX UNICODE _UNICODE _NO_CRYPTO
}
diff --git a/src/libs/7zip/7zip.pro b/src/libs/7zip/7zip.pro
index d09cbf9a5..549778e67 100644
--- a/src/libs/7zip/7zip.pro
+++ b/src/libs/7zip/7zip.pro
@@ -1,6 +1,6 @@
include(../../../installerfw.pri)
-QT =
+QT = core
TARGET = 7z
TEMPLATE = lib
INCLUDEPATH += . ..
diff --git a/src/libs/7zip/installer_framework_changes.txt b/src/libs/7zip/installer_framework_changes.txt
new file mode 100644
index 000000000..6b5839208
--- /dev/null
+++ b/src/libs/7zip/installer_framework_changes.txt
@@ -0,0 +1,54 @@
+There are deleted files and very small changes to get the integration process of new versions very simple.
+--diff-filter=M means "modified" and
+--diff-filter=D means "deleted" files
+
+=== output of: git diff --diff-filter=M ===
+
+diff --git a/CPP/7zip/Common/RegisterArc.h b/CPP/7zip/Common/RegisterArc.h
+index bc2a034..9b8cbd3 100644
+--- a/CPP/7zip/Common/RegisterArc.h
++++ b/CPP/7zip/Common/RegisterArc.h
+@@ -27,6 +27,6 @@ void RegisterArc(const CArcInfo *arcInfo);
+
+ #define REGISTER_ARC(x) struct REGISTER_ARC_NAME(x) { \
+ REGISTER_ARC_NAME(x)() { RegisterArc(&g_ArcInfo); }}; \
+- static REGISTER_ARC_NAME(x) g_RegisterArc;
+-
++ static REGISTER_ARC_NAME(x) g_RegisterArc; \
++ void registerArc##x() { static REGISTER_ARC_NAME(x) g_RegisterArc; }
+ #endif
+diff --git a/CPP/7zip/Common/RegisterCodec.h b/CPP/7zip/Common/RegisterCodec.h
+index 786b4a4..d53c434 100644
+--- a/CPP/7zip/Common/RegisterCodec.h
++++ b/CPP/7zip/Common/RegisterCodec.h
+@@ -22,12 +22,13 @@ void RegisterCodec(const CCodecInfo *codecInfo);
+
+ #define REGISTER_CODEC(x) struct REGISTER_CODEC_NAME(x) { \
+ REGISTER_CODEC_NAME(x)() { RegisterCodec(&g_CodecInfo); }}; \
+- static REGISTER_CODEC_NAME(x) g_RegisterCodec;
++ static REGISTER_CODEC_NAME(x) g_RegisterCodec; \
++ void registerCodec##x() { static REGISTER_CODEC_NAME(x) g_RegisterCodecs; }
+
+ #define REGISTER_CODECS_NAME(x) CRegisterCodecs ## x
+ #define REGISTER_CODECS(x) struct REGISTER_CODECS_NAME(x) { \
+ REGISTER_CODECS_NAME(x)() { for (int i = 0; i < sizeof(g_CodecsInfo) / sizeof(g_CodecsInfo[0]); i++) \
+ RegisterCodec(&g_CodecsInfo[i]); }}; \
+- static REGISTER_CODECS_NAME(x) g_RegisterCodecs;
+-
++ static REGISTER_CODECS_NAME(x) g_RegisterCodecs; \
++ void registerCodec##x() { static REGISTER_CODECS_NAME(x) g_RegisterCodecs; }
+ #endif
+diff --git a/CPP/Common/MyString.h b/CPP/Common/MyString.h
+index eb3c52d..f483e39 100644
+--- a/CPP/Common/MyString.h
++++ b/CPP/Common/MyString.h
+@@ -7,6 +7,8 @@
+
+ #include "MyVector.h"
+
++#include <windows.h>
++
+ template <class T>
+ inline int MyStringLen(const T *s)
+ {
+
diff --git a/src/libs/7zip/unix/DOCS/7zC.txt b/src/libs/7zip/unix/7zC.txt
index 5d5d06d7b..5d5d06d7b 100644
--- a/src/libs/7zip/unix/DOCS/7zC.txt
+++ b/src/libs/7zip/unix/7zC.txt
diff --git a/src/libs/7zip/unix/DOCS/7zFormat.txt b/src/libs/7zip/unix/7zFormat.txt
index 55b52b1b9..e1cf7380d 100644
--- a/src/libs/7zip/unix/DOCS/7zFormat.txt
+++ b/src/libs/7zip/unix/7zFormat.txt
@@ -1,5 +1,5 @@
-7z Format description (4.59)
-----------------------------
+7z Format description (2.30 Beta 25)
+-----------------------------------
This file contains description of 7z archive format.
7z archive can contain files compressed with any method.
@@ -126,43 +126,40 @@ UINT64 means real UINT64 encoded with the following scheme:
Property IDs
------------
-0x00 = kEnd
+0x00 = kEnd,
-0x01 = kHeader
+0x01 = kHeader,
-0x02 = kArchiveProperties
+0x02 = kArchiveProperties,
-0x03 = kAdditionalStreamsInfo
-0x04 = kMainStreamsInfo
-0x05 = kFilesInfo
+0x03 = kAdditionalStreamsInfo,
+0x04 = kMainStreamsInfo,
+0x05 = kFilesInfo,
-0x06 = kPackInfo
-0x07 = kUnPackInfo
-0x08 = kSubStreamsInfo
+0x06 = kPackInfo,
+0x07 = kUnPackInfo,
+0x08 = kSubStreamsInfo,
-0x09 = kSize
-0x0A = kCRC
+0x09 = kSize,
+0x0A = kCRC,
-0x0B = kFolder
+0x0B = kFolder,
-0x0C = kCodersUnPackSize
-0x0D = kNumUnPackStream
+0x0C = kCodersUnPackSize,
+0x0D = kNumUnPackStream,
-0x0E = kEmptyStream
-0x0F = kEmptyFile
-0x10 = kAnti
+0x0E = kEmptyStream,
+0x0F = kEmptyFile,
+0x10 = kAnti,
-0x11 = kName
-0x12 = kCTime
-0x13 = kATime
-0x14 = kMTime
-0x15 = kWinAttributes
-0x16 = kComment
+0x11 = kName,
+0x12 = kCreationTime,
+0x13 = kLastAccessTime,
+0x14 = kLastWriteTime,
+0x15 = kWinAttributes,
+0x16 = kComment,
-0x17 = kEncodedHeader
-
-0x18 = kStartPos
-0x19 = kDummy
+0x17 = kEncodedHeader,
7z format headers
@@ -241,19 +238,24 @@ Folder
{
BYTE
{
- 0:3 CodecIdSize
- 4: Is Complex Coder
- 5: There Are Attributes
- 6: Reserved
- 7: There are more alternative methods. (Not used anymore, must be 0).
+ 0:3 DecompressionMethod.IDSize
+ 4:
+ 0 - IsSimple
+ 1 - Is not simple
+ 5:
+ 0 - No Attributes
+ 1 - There Are Attributes
+ 7:
+ 0 - Last Method in Alternative_Method_List
+ 1 - There are more alternative methods
}
- BYTE CodecId[CodecIdSize]
- if (Is Complex Coder)
+ BYTE DecompressionMethod.ID[DecompressionMethod.IDSize]
+ if (!IsSimple)
{
UINT64 NumInStreams;
UINT64 NumOutStreams;
}
- if (There Are Attributes)
+ if (DecompressionMethod[0] != 0)
{
UINT64 PropertiesSize
BYTE Properties[PropertiesSize]
@@ -385,9 +387,9 @@ FilesInfo
for(EmptyStreams)
BIT IsAntiFile
- case kCTime: (0x12)
- case kATime: (0x13)
- case kMTime: (0x14)
+ case kCreationTime: (0x12)
+ case kLastAccessTime: (0x13)
+ case kLastWriteTime: (0x14)
BYTE AllAreDefined
if (AllAreDefined == 0)
{
@@ -399,7 +401,7 @@ FilesInfo
UINT64 DataIndex
[]
for(Definded Items)
- UINT64 Time
+ UINT32 Time
[]
kNames: (0x11)
diff --git a/src/libs/7zip/unix/C/7zCrcT8.c b/src/libs/7zip/unix/C/7zCrcT8.c
deleted file mode 100644
index cd80e262b..000000000
--- a/src/libs/7zip/unix/C/7zCrcT8.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* 7zCrcT8.c -- CRC32 calculation with 8 tables
-2008-03-19
-Igor Pavlov
-Public domain */
-
-#include "7zCrc.h"
-
-#define kCrcPoly 0xEDB88320
-#define CRC_NUM_TABLES 8
-
-UInt32 g_CrcTable[256 * CRC_NUM_TABLES];
-
-void MY_FAST_CALL CrcGenerateTable()
-{
- UInt32 i;
- for (i = 0; i < 256; i++)
- {
- UInt32 r = i;
- int j;
- for (j = 0; j < 8; j++)
- r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));
- g_CrcTable[i] = r;
- }
- #if CRC_NUM_TABLES > 1
- for (; i < 256 * CRC_NUM_TABLES; i++)
- {
- UInt32 r = g_CrcTable[i - 256];
- g_CrcTable[i] = g_CrcTable[r & 0xFF] ^ (r >> 8);
- }
- #endif
-}
-
-UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table);
-
-UInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size)
-{
- return CrcUpdateT8(v, data, size, g_CrcTable);
-}
-
-UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size)
-{
- return CrcUpdateT8(CRC_INIT_VAL, data, size, g_CrcTable) ^ 0xFFFFFFFF;
-}
diff --git a/src/libs/7zip/unix/C/Aes.c b/src/libs/7zip/unix/C/Aes.c
deleted file mode 100644
index 1bb658793..000000000
--- a/src/libs/7zip/unix/C/Aes.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/* Aes.c -- AES encryption / decryption
-2009-11-23 : Igor Pavlov : Public domain */
-
-#include "Aes.h"
-#include "CpuArch.h"
-
-static UInt32 T[256 * 4];
-static Byte Sbox[256] = {
- 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
- 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
- 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
- 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
- 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
- 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
- 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
- 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
- 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
- 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
- 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
- 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
- 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
- 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
- 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
- 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16};
-
-void MY_FAST_CALL AesCbc_Encode(UInt32 *ivAes, Byte *data, size_t numBlocks);
-void MY_FAST_CALL AesCbc_Decode(UInt32 *ivAes, Byte *data, size_t numBlocks);
-void MY_FAST_CALL AesCtr_Code(UInt32 *ivAes, Byte *data, size_t numBlocks);
-
-void MY_FAST_CALL AesCbc_Encode_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks);
-void MY_FAST_CALL AesCbc_Decode_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks);
-void MY_FAST_CALL AesCtr_Code_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks);
-
-AES_CODE_FUNC g_AesCbc_Encode;
-AES_CODE_FUNC g_AesCbc_Decode;
-AES_CODE_FUNC g_AesCtr_Code;
-
-static UInt32 D[256 * 4];
-static Byte InvS[256];
-
-static Byte Rcon[11] = { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 };
-
-#define xtime(x) ((((x) << 1) ^ (((x) & 0x80) != 0 ? 0x1B : 0)) & 0xFF)
-
-#define Ui32(a0, a1, a2, a3) ((UInt32)(a0) | ((UInt32)(a1) << 8) | ((UInt32)(a2) << 16) | ((UInt32)(a3) << 24))
-
-#define gb0(x) ( (x) & 0xFF)
-#define gb1(x) (((x) >> ( 8)) & 0xFF)
-#define gb2(x) (((x) >> (16)) & 0xFF)
-#define gb3(x) (((x) >> (24)) & 0xFF)
-
-void AesGenTables(void)
-{
- unsigned i;
- for (i = 0; i < 256; i++)
- InvS[Sbox[i]] = (Byte)i;
- for (i = 0; i < 256; i++)
- {
- {
- UInt32 a1 = Sbox[i];
- UInt32 a2 = xtime(a1);
- UInt32 a3 = a2 ^ a1;
- T[ i] = Ui32(a2, a1, a1, a3);
- T[0x100 + i] = Ui32(a3, a2, a1, a1);
- T[0x200 + i] = Ui32(a1, a3, a2, a1);
- T[0x300 + i] = Ui32(a1, a1, a3, a2);
- }
- {
- UInt32 a1 = InvS[i];
- UInt32 a2 = xtime(a1);
- UInt32 a4 = xtime(a2);
- UInt32 a8 = xtime(a4);
- UInt32 a9 = a8 ^ a1;
- UInt32 aB = a8 ^ a2 ^ a1;
- UInt32 aD = a8 ^ a4 ^ a1;
- UInt32 aE = a8 ^ a4 ^ a2;
- D[ i] = Ui32(aE, a9, aD, aB);
- D[0x100 + i] = Ui32(aB, aE, a9, aD);
- D[0x200 + i] = Ui32(aD, aB, aE, a9);
- D[0x300 + i] = Ui32(a9, aD, aB, aE);
- }
- }
- g_AesCbc_Encode = AesCbc_Encode;
- g_AesCbc_Decode = AesCbc_Decode;
- g_AesCtr_Code = AesCtr_Code;
-/* FIXME
- #ifdef MY_CPU_X86_OR_AMD64
- if (CPU_Is_Aes_Supported())
- {
- g_AesCbc_Encode = AesCbc_Encode_Intel;
- g_AesCbc_Decode = AesCbc_Decode_Intel;
- g_AesCtr_Code = AesCtr_Code_Intel;
- }
- #endif
-*/
-}
-
-#define HT(i, x, s) (T + (x << 8))[gb ## x(s[(i + x) & 3])]
-#define HT4(m, i, s, p) m[i] = \
- HT(i, 0, s) ^ \
- HT(i, 1, s) ^ \
- HT(i, 2, s) ^ \
- HT(i, 3, s) ^ w[p + i]
-/* such order (2031) in HT16 is for VC6/K8 speed optimization) */
-#define HT16(m, s, p) \
- HT4(m, 2, s, p); \
- HT4(m, 0, s, p); \
- HT4(m, 3, s, p); \
- HT4(m, 1, s, p); \
-
-#define FT(i, x) Sbox[gb ## x(m[(i + x) & 3])]
-#define FT4(i) dest[i] = Ui32(FT(i, 0), FT(i, 1), FT(i, 2), FT(i, 3)) ^ w[i];
-
-#define HD(i, x, s) (D + (x << 8))[gb ## x(s[(i - x) & 3])]
-#define HD4(m, i, s, p) m[i] = \
- HD(i, 0, s) ^ \
- HD(i, 1, s) ^ \
- HD(i, 2, s) ^ \
- HD(i, 3, s) ^ w[p + i];
-/* such order (0231) in HD16 is for VC6/K8 speed optimization) */
-#define HD16(m, s, p) \
- HD4(m, 0, s, p); \
- HD4(m, 2, s, p); \
- HD4(m, 3, s, p); \
- HD4(m, 1, s, p); \
-
-#define FD(i, x) InvS[gb ## x(m[(i - x) & 3])]
-#define FD4(i) dest[i] = Ui32(FD(i, 0), FD(i, 1), FD(i, 2), FD(i, 3)) ^ w[i];
-
-void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *w, const Byte *key, unsigned keySize)
-{
- unsigned i, wSize;
- wSize = keySize + 28;
- keySize /= 4;
- w[0] = ((UInt32)keySize / 2) + 3;
- w += 4;
-
- for (i = 0; i < keySize; i++, key += 4)
- w[i] = GetUi32(key);
-
- for (; i < wSize; i++)
- {
- UInt32 t = w[i - 1];
- unsigned rem = i % keySize;
- if (rem == 0)
- t = Ui32(Sbox[gb1(t)] ^ Rcon[i / keySize], Sbox[gb2(t)], Sbox[gb3(t)], Sbox[gb0(t)]);
- else if (keySize > 6 && rem == 4)
- t = Ui32(Sbox[gb0(t)], Sbox[gb1(t)], Sbox[gb2(t)], Sbox[gb3(t)]);
- w[i] = w[i - keySize] ^ t;
- }
-}
-
-void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *w, const Byte *key, unsigned keySize)
-{
- unsigned i, num;
- Aes_SetKey_Enc(w, key, keySize);
- num = keySize + 20;
- w += 8;
- for (i = 0; i < num; i++)
- {
- UInt32 r = w[i];
- w[i] =
- D[ Sbox[gb0(r)]] ^
- D[0x100 + Sbox[gb1(r)]] ^
- D[0x200 + Sbox[gb2(r)]] ^
- D[0x300 + Sbox[gb3(r)]];
- }
-}
-
-/* Aes_Encode and Aes_Decode functions work with little-endian words.
- src and dest are pointers to 4 UInt32 words.
- arc and dest can point to same block */
-
-static void Aes_Encode(const UInt32 *w, UInt32 *dest, const UInt32 *src)
-{
- UInt32 s[4];
- UInt32 m[4];
- UInt32 numRounds2 = w[0];
- w += 4;
- s[0] = src[0] ^ w[0];
- s[1] = src[1] ^ w[1];
- s[2] = src[2] ^ w[2];
- s[3] = src[3] ^ w[3];
- w += 4;
- for (;;)
- {
- HT16(m, s, 0);
- if (--numRounds2 == 0)
- break;
- HT16(s, m, 4);
- w += 8;
- }
- w += 4;
- FT4(0); FT4(1); FT4(2); FT4(3);
-}
-
-static void Aes_Decode(const UInt32 *w, UInt32 *dest, const UInt32 *src)
-{
- UInt32 s[4];
- UInt32 m[4];
- UInt32 numRounds2 = w[0];
- w += 4 + numRounds2 * 8;
- s[0] = src[0] ^ w[0];
- s[1] = src[1] ^ w[1];
- s[2] = src[2] ^ w[2];
- s[3] = src[3] ^ w[3];
- for (;;)
- {
- w -= 8;
- HD16(m, s, 4);
- if (--numRounds2 == 0)
- break;
- HD16(s, m, 0);
- }
- FD4(0); FD4(1); FD4(2); FD4(3);
-}
-
-void AesCbc_Init(UInt32 *p, const Byte *iv)
-{
- unsigned i;
- for (i = 0; i < 4; i++)
- p[i] = GetUi32(iv + i * 4);
-}
-
-void MY_FAST_CALL AesCbc_Encode(UInt32 *p, Byte *data, size_t numBlocks)
-{
- for (; numBlocks != 0; numBlocks--, data += AES_BLOCK_SIZE)
- {
- p[0] ^= GetUi32(data);
- p[1] ^= GetUi32(data + 4);
- p[2] ^= GetUi32(data + 8);
- p[3] ^= GetUi32(data + 12);
-
- Aes_Encode(p + 4, p, p);
-
- SetUi32(data, p[0]);
- SetUi32(data + 4, p[1]);
- SetUi32(data + 8, p[2]);
- SetUi32(data + 12, p[3]);
- }
-}
-
-void MY_FAST_CALL AesCbc_Decode(UInt32 *p, Byte *data, size_t numBlocks)
-{
- UInt32 in[4], out[4];
- for (; numBlocks != 0; numBlocks--, data += AES_BLOCK_SIZE)
- {
- in[0] = GetUi32(data);
- in[1] = GetUi32(data + 4);
- in[2] = GetUi32(data + 8);
- in[3] = GetUi32(data + 12);
-
- Aes_Decode(p + 4, out, in);
-
- SetUi32(data, p[0] ^ out[0]);
- SetUi32(data + 4, p[1] ^ out[1]);
- SetUi32(data + 8, p[2] ^ out[2]);
- SetUi32(data + 12, p[3] ^ out[3]);
-
- p[0] = in[0];
- p[1] = in[1];
- p[2] = in[2];
- p[3] = in[3];
- }
-}
-
-void MY_FAST_CALL AesCtr_Code(UInt32 *p, Byte *data, size_t numBlocks)
-{
- for (; numBlocks != 0; numBlocks--)
- {
- UInt32 temp[4];
- Byte buf[16];
- int i;
- if (++p[0] == 0)
- p[1]++;
- Aes_Encode(p + 4, temp, p);
- SetUi32(buf, temp[0]);
- SetUi32(buf + 4, temp[1]);
- SetUi32(buf + 8, temp[2]);
- SetUi32(buf + 12, temp[3]);
- for (i = 0; i < 16; i++)
- *data++ ^= buf[i];
- }
-}
diff --git a/src/libs/7zip/unix/C/Aes.h b/src/libs/7zip/unix/C/Aes.h
deleted file mode 100644
index c9b0677c8..000000000
--- a/src/libs/7zip/unix/C/Aes.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Aes.h -- AES encryption / decryption
-2009-11-23 : Igor Pavlov : Public domain */
-
-#ifndef __AES_H
-#define __AES_H
-
-#include "Types.h"
-
-EXTERN_C_BEGIN
-
-#define AES_BLOCK_SIZE 16
-
-/* Call AesGenTables one time before other AES functions */
-void AesGenTables(void);
-
-/* UInt32 pointers must be 16-byte aligned */
-
-/* 16-byte (4 * 32-bit words) blocks: 1 (IV) + 1 (keyMode) + 15 (AES-256 roundKeys) */
-#define AES_NUM_IVMRK_WORDS ((1 + 1 + 15) * 4)
-
-/* aes - 16-byte aligned pointer to keyMode+roundKeys sequence */
-/* keySize = 16 or 24 or 32 (bytes) */
-typedef void (MY_FAST_CALL *AES_SET_KEY_FUNC)(UInt32 *aes, const Byte *key, unsigned keySize);
-void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *aes, const Byte *key, unsigned keySize);
-void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *aes, const Byte *key, unsigned keySize);
-
-/* ivAes - 16-byte aligned pointer to iv+keyMode+roundKeys sequence: UInt32[AES_NUM_IVMRK_WORDS] */
-void AesCbc_Init(UInt32 *ivAes, const Byte *iv); /* iv size is AES_BLOCK_SIZE */
-/* data - 16-byte aligned pointer to data */
-/* numBlocks - the number of 16-byte blocks in data array */
-typedef void (MY_FAST_CALL *AES_CODE_FUNC)(UInt32 *ivAes, Byte *data, size_t numBlocks);
-extern AES_CODE_FUNC g_AesCbc_Encode;
-extern AES_CODE_FUNC g_AesCbc_Decode;
-extern AES_CODE_FUNC g_AesCtr_Code;
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/unix/C/BwtSort.c b/src/libs/7zip/unix/C/BwtSort.c
deleted file mode 100644
index 207305072..000000000
--- a/src/libs/7zip/unix/C/BwtSort.c
+++ /dev/null
@@ -1,516 +0,0 @@
-/* BwtSort.c -- BWT block sorting
-2008-08-17
-Igor Pavlov
-Public domain */
-
-#include "BwtSort.h"
-#include "Sort.h"
-
-/* #define BLOCK_SORT_USE_HEAP_SORT */
-
-#define NO_INLINE MY_FAST_CALL
-
-/* Don't change it !!! */
-#define kNumHashBytes 2
-#define kNumHashValues (1 << (kNumHashBytes * 8))
-
-/* kNumRefBitsMax must be < (kNumHashBytes * 8) = 16 */
-#define kNumRefBitsMax 12
-
-#define BS_TEMP_SIZE kNumHashValues
-
-#ifdef BLOCK_SORT_EXTERNAL_FLAGS
-
-/* 32 Flags in UInt32 word */
-#define kNumFlagsBits 5
-#define kNumFlagsInWord (1 << kNumFlagsBits)
-#define kFlagsMask (kNumFlagsInWord - 1)
-#define kAllFlags 0xFFFFFFFF
-
-#else
-
-#define kNumBitsMax 20
-#define kIndexMask ((1 << kNumBitsMax) - 1)
-#define kNumExtraBits (32 - kNumBitsMax)
-#define kNumExtra0Bits (kNumExtraBits - 2)
-#define kNumExtra0Mask ((1 << kNumExtra0Bits) - 1)
-
-#define SetFinishedGroupSize(p, size) \
- { *(p) |= ((((size) - 1) & kNumExtra0Mask) << kNumBitsMax); \
- if ((size) > (1 << kNumExtra0Bits)) { \
- *(p) |= 0x40000000; *((p) + 1) |= ((((size) - 1)>> kNumExtra0Bits) << kNumBitsMax); } } \
-
-static void SetGroupSize(UInt32 *p, UInt32 size)
-{
- if (--size == 0)
- return;
- *p |= 0x80000000 | ((size & kNumExtra0Mask) << kNumBitsMax);
- if (size >= (1 << kNumExtra0Bits))
- {
- *p |= 0x40000000;
- p[1] |= ((size >> kNumExtra0Bits) << kNumBitsMax);
- }
-}
-
-#endif
-
-/*
-SortGroup - is recursive Range-Sort function with HeapSort optimization for small blocks
- "range" is not real range. It's only for optimization.
-returns: 1 - if there are groups, 0 - no more groups
-*/
-
-UInt32 NO_INLINE SortGroup(UInt32 BlockSize, UInt32 NumSortedBytes, UInt32 groupOffset, UInt32 groupSize, int NumRefBits, UInt32 *Indices
- #ifndef BLOCK_SORT_USE_HEAP_SORT
- , UInt32 left, UInt32 range
- #endif
- )
-{
- UInt32 *ind2 = Indices + groupOffset;
- UInt32 *Groups;
- if (groupSize <= 1)
- {
- /*
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetFinishedGroupSize(ind2, 1);
- #endif
- */
- return 0;
- }
- Groups = Indices + BlockSize + BS_TEMP_SIZE;
- if (groupSize <= ((UInt32)1 << NumRefBits)
- #ifndef BLOCK_SORT_USE_HEAP_SORT
- && groupSize <= range
- #endif
- )
- {
- UInt32 *temp = Indices + BlockSize;
- UInt32 j;
- UInt32 mask, thereAreGroups, group, cg;
- {
- UInt32 gPrev;
- UInt32 gRes = 0;
- {
- UInt32 sp = ind2[0] + NumSortedBytes;
- if (sp >= BlockSize) sp -= BlockSize;
- gPrev = Groups[sp];
- temp[0] = (gPrev << NumRefBits);
- }
-
- for (j = 1; j < groupSize; j++)
- {
- UInt32 sp = ind2[j] + NumSortedBytes;
- UInt32 g;
- if (sp >= BlockSize) sp -= BlockSize;
- g = Groups[sp];
- temp[j] = (g << NumRefBits) | j;
- gRes |= (gPrev ^ g);
- }
- if (gRes == 0)
- {
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetGroupSize(ind2, groupSize);
- #endif
- return 1;
- }
- }
-
- HeapSort(temp, groupSize);
- mask = ((1 << NumRefBits) - 1);
- thereAreGroups = 0;
-
- group = groupOffset;
- cg = (temp[0] >> NumRefBits);
- temp[0] = ind2[temp[0] & mask];
-
- {
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 *Flags = Groups + BlockSize;
- #else
- UInt32 prevGroupStart = 0;
- #endif
-
- for (j = 1; j < groupSize; j++)
- {
- UInt32 val = temp[j];
- UInt32 cgCur = (val >> NumRefBits);
-
- if (cgCur != cg)
- {
- cg = cgCur;
- group = groupOffset + j;
-
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- {
- UInt32 t = group - 1;
- Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));
- }
- #else
- SetGroupSize(temp + prevGroupStart, j - prevGroupStart);
- prevGroupStart = j;
- #endif
- }
- else
- thereAreGroups = 1;
- {
- UInt32 ind = ind2[val & mask];
- temp[j] = ind;
- Groups[ind] = group;
- }
- }
-
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetGroupSize(temp + prevGroupStart, j - prevGroupStart);
- #endif
- }
-
- for (j = 0; j < groupSize; j++)
- ind2[j] = temp[j];
- return thereAreGroups;
- }
-
- /* Check that all strings are in one group (cannot sort) */
- {
- UInt32 group, j;
- UInt32 sp = ind2[0] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;
- group = Groups[sp];
- for (j = 1; j < groupSize; j++)
- {
- sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;
- if (Groups[sp] != group)
- break;
- }
- if (j == groupSize)
- {
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetGroupSize(ind2, groupSize);
- #endif
- return 1;
- }
- }
-
- #ifndef BLOCK_SORT_USE_HEAP_SORT
- {
- /* ---------- Range Sort ---------- */
- UInt32 i;
- UInt32 mid;
- for (;;)
- {
- UInt32 j;
- if (range <= 1)
- {
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetGroupSize(ind2, groupSize);
- #endif
- return 1;
- }
- mid = left + ((range + 1) >> 1);
- j = groupSize;
- i = 0;
- do
- {
- UInt32 sp = ind2[i] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;
- if (Groups[sp] >= mid)
- {
- for (j--; j > i; j--)
- {
- sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;
- if (Groups[sp] < mid)
- {
- UInt32 temp = ind2[i]; ind2[i] = ind2[j]; ind2[j] = temp;
- break;
- }
- }
- if (i >= j)
- break;
- }
- }
- while (++i < j);
- if (i == 0)
- {
- range = range - (mid - left);
- left = mid;
- }
- else if (i == groupSize)
- range = (mid - left);
- else
- break;
- }
-
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- {
- UInt32 t = (groupOffset + i - 1);
- UInt32 *Flags = Groups + BlockSize;
- Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));
- }
- #endif
-
- {
- UInt32 j;
- for (j = i; j < groupSize; j++)
- Groups[ind2[j]] = groupOffset + i;
- }
-
- {
- UInt32 res = SortGroup(BlockSize, NumSortedBytes, groupOffset, i, NumRefBits, Indices, left, mid - left);
- return res | SortGroup(BlockSize, NumSortedBytes, groupOffset + i, groupSize - i, NumRefBits, Indices, mid, range - (mid - left));
- }
-
- }
-
- #else
-
- /* ---------- Heap Sort ---------- */
-
- {
- UInt32 j;
- for (j = 0; j < groupSize; j++)
- {
- UInt32 sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;
- ind2[j] = sp;
- }
-
- HeapSortRef(ind2, Groups, groupSize);
-
- /* Write Flags */
- {
- UInt32 sp = ind2[0];
- UInt32 group = Groups[sp];
-
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 *Flags = Groups + BlockSize;
- #else
- UInt32 prevGroupStart = 0;
- #endif
-
- for (j = 1; j < groupSize; j++)
- {
- sp = ind2[j];
- if (Groups[sp] != group)
- {
- group = Groups[sp];
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- {
- UInt32 t = groupOffset + j - 1;
- Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));
- }
- #else
- SetGroupSize(ind2 + prevGroupStart, j - prevGroupStart);
- prevGroupStart = j;
- #endif
- }
- }
-
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetGroupSize(ind2 + prevGroupStart, j - prevGroupStart);
- #endif
- }
- {
- /* Write new Groups values and Check that there are groups */
- UInt32 thereAreGroups = 0;
- for (j = 0; j < groupSize; j++)
- {
- UInt32 group = groupOffset + j;
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 subGroupSize = ((ind2[j] & ~0xC0000000) >> kNumBitsMax);
- if ((ind2[j] & 0x40000000) != 0)
- subGroupSize += ((ind2[j + 1] >> kNumBitsMax) << kNumExtra0Bits);
- subGroupSize++;
- for (;;)
- {
- UInt32 original = ind2[j];
- UInt32 sp = original & kIndexMask;
- if (sp < NumSortedBytes) sp += BlockSize; sp -= NumSortedBytes;
- ind2[j] = sp | (original & ~kIndexMask);
- Groups[sp] = group;
- if (--subGroupSize == 0)
- break;
- j++;
- thereAreGroups = 1;
- }
- #else
- UInt32 *Flags = Groups + BlockSize;
- for (;;)
- {
- UInt32 sp = ind2[j]; if (sp < NumSortedBytes) sp += BlockSize; sp -= NumSortedBytes;
- ind2[j] = sp;
- Groups[sp] = group;
- if ((Flags[(groupOffset + j) >> kNumFlagsBits] & (1 << ((groupOffset + j) & kFlagsMask))) == 0)
- break;
- j++;
- thereAreGroups = 1;
- }
- #endif
- }
- return thereAreGroups;
- }
- }
- #endif
-}
-
-/* conditions: blockSize > 0 */
-UInt32 BlockSort(UInt32 *Indices, const Byte *data, UInt32 blockSize)
-{
- UInt32 *counters = Indices + blockSize;
- UInt32 i;
- UInt32 *Groups;
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 *Flags;
- #endif
-
- /* Radix-Sort for 2 bytes */
- for (i = 0; i < kNumHashValues; i++)
- counters[i] = 0;
- for (i = 0; i < blockSize - 1; i++)
- counters[((UInt32)data[i] << 8) | data[i + 1]]++;
- counters[((UInt32)data[i] << 8) | data[0]]++;
-
- Groups = counters + BS_TEMP_SIZE;
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- Flags = Groups + blockSize;
- {
- UInt32 numWords = (blockSize + kFlagsMask) >> kNumFlagsBits;
- for (i = 0; i < numWords; i++)
- Flags[i] = kAllFlags;
- }
- #endif
-
- {
- UInt32 sum = 0;
- for (i = 0; i < kNumHashValues; i++)
- {
- UInt32 groupSize = counters[i];
- if (groupSize > 0)
- {
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 t = sum + groupSize - 1;
- Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));
- #endif
- sum += groupSize;
- }
- counters[i] = sum - groupSize;
- }
-
- for (i = 0; i < blockSize - 1; i++)
- Groups[i] = counters[((UInt32)data[i] << 8) | data[i + 1]];
- Groups[i] = counters[((UInt32)data[i] << 8) | data[0]];
-
- for (i = 0; i < blockSize - 1; i++)
- Indices[counters[((UInt32)data[i] << 8) | data[i + 1]]++] = i;
- Indices[counters[((UInt32)data[i] << 8) | data[0]]++] = i;
-
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- {
- UInt32 prev = 0;
- for (i = 0; i < kNumHashValues; i++)
- {
- UInt32 prevGroupSize = counters[i] - prev;
- if (prevGroupSize == 0)
- continue;
- SetGroupSize(Indices + prev, prevGroupSize);
- prev = counters[i];
- }
- }
- #endif
- }
-
- {
- int NumRefBits;
- UInt32 NumSortedBytes;
- for (NumRefBits = 0; ((blockSize - 1) >> NumRefBits) != 0; NumRefBits++);
- NumRefBits = 32 - NumRefBits;
- if (NumRefBits > kNumRefBitsMax)
- NumRefBits = kNumRefBitsMax;
-
- for (NumSortedBytes = kNumHashBytes; ; NumSortedBytes <<= 1)
- {
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 finishedGroupSize = 0;
- #endif
- UInt32 newLimit = 0;
- for (i = 0; i < blockSize;)
- {
- UInt32 groupSize;
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
-
- if ((Flags[i >> kNumFlagsBits] & (1 << (i & kFlagsMask))) == 0)
- {
- i++;
- continue;
- }
- for (groupSize = 1;
- (Flags[(i + groupSize) >> kNumFlagsBits] & (1 << ((i + groupSize) & kFlagsMask))) != 0;
- groupSize++);
-
- groupSize++;
-
- #else
-
- groupSize = ((Indices[i] & ~0xC0000000) >> kNumBitsMax);
- {
- Bool finishedGroup = ((Indices[i] & 0x80000000) == 0);
- if ((Indices[i] & 0x40000000) != 0)
- {
- groupSize += ((Indices[i + 1] >> kNumBitsMax) << kNumExtra0Bits);
- Indices[i + 1] &= kIndexMask;
- }
- Indices[i] &= kIndexMask;
- groupSize++;
- if (finishedGroup || groupSize == 1)
- {
- Indices[i - finishedGroupSize] &= kIndexMask;
- if (finishedGroupSize > 1)
- Indices[i - finishedGroupSize + 1] &= kIndexMask;
- {
- UInt32 newGroupSize = groupSize + finishedGroupSize;
- SetFinishedGroupSize(Indices + i - finishedGroupSize, newGroupSize);
- finishedGroupSize = newGroupSize;
- }
- i += groupSize;
- continue;
- }
- finishedGroupSize = 0;
- }
-
- #endif
-
- if (NumSortedBytes >= blockSize)
- {
- UInt32 j;
- for (j = 0; j < groupSize; j++)
- {
- UInt32 t = (i + j);
- /* Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask)); */
- Groups[Indices[t]] = t;
- }
- }
- else
- if (SortGroup(blockSize, NumSortedBytes, i, groupSize, NumRefBits, Indices
- #ifndef BLOCK_SORT_USE_HEAP_SORT
- , 0, blockSize
- #endif
- ) != 0)
- newLimit = i + groupSize;
- i += groupSize;
- }
- if (newLimit == 0)
- break;
- }
- }
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- for (i = 0; i < blockSize;)
- {
- UInt32 groupSize = ((Indices[i] & ~0xC0000000) >> kNumBitsMax);
- if ((Indices[i] & 0x40000000) != 0)
- {
- groupSize += ((Indices[i + 1] >> kNumBitsMax) << kNumExtra0Bits);
- Indices[i + 1] &= kIndexMask;
- }
- Indices[i] &= kIndexMask;
- groupSize++;
- i += groupSize;
- }
- #endif
- return Groups[0];
-}
-
diff --git a/src/libs/7zip/unix/C/BwtSort.h b/src/libs/7zip/unix/C/BwtSort.h
deleted file mode 100644
index ce5598f0f..000000000
--- a/src/libs/7zip/unix/C/BwtSort.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* BwtSort.h -- BWT block sorting
-2009-02-07 : Igor Pavlov : Public domain */
-
-#ifndef __BWT_SORT_H
-#define __BWT_SORT_H
-
-#include "Types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* use BLOCK_SORT_EXTERNAL_FLAGS if blockSize can be > 1M */
-/* #define BLOCK_SORT_EXTERNAL_FLAGS */
-
-#ifdef BLOCK_SORT_EXTERNAL_FLAGS
-#define BLOCK_SORT_EXTERNAL_SIZE(blockSize) ((((blockSize) + 31) >> 5))
-#else
-#define BLOCK_SORT_EXTERNAL_SIZE(blockSize) 0
-#endif
-
-#define BLOCK_SORT_BUF_SIZE(blockSize) ((blockSize) * 2 + BLOCK_SORT_EXTERNAL_SIZE(blockSize) + (1 << 16))
-
-UInt32 BlockSort(UInt32 *indices, const Byte *data, UInt32 blockSize);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/libs/7zip/unix/C/CpuArch.c b/src/libs/7zip/unix/C/CpuArch.c
index 260cc1f45..dffa5bd65 100644
--- a/src/libs/7zip/unix/C/CpuArch.c
+++ b/src/libs/7zip/unix/C/CpuArch.c
@@ -73,9 +73,17 @@ static void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d)
#else
__asm__ __volatile__ (
+ #if defined(MY_CPU_X86) && defined(__PIC__)
+ "mov %%ebx, %%edi;"
+ "cpuid;"
+ "xchgl %%ebx, %%edi;"
+ : "=a" (*a) ,
+ "=D" (*b) , /* edi */
+ #else
"cpuid"
: "=a" (*a) ,
"=b" (*b) ,
+ #endif
"=c" (*c) ,
"=d" (*d)
: "0" (function)) ;
diff --git a/src/libs/7zip/unix/C/HuffEnc.c b/src/libs/7zip/unix/C/HuffEnc.c
deleted file mode 100644
index 561c7e5da..000000000
--- a/src/libs/7zip/unix/C/HuffEnc.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/* HuffEnc.c -- functions for Huffman encoding
-2009-09-02 : Igor Pavlov : Public domain */
-
-#include "HuffEnc.h"
-#include "Sort.h"
-
-#define kMaxLen 16
-#define NUM_BITS 10
-#define MASK ((1 << NUM_BITS) - 1)
-
-#define NUM_COUNTERS 64
-
-#define HUFFMAN_SPEED_OPT
-
-void Huffman_Generate(const UInt32 *freqs, UInt32 *p, Byte *lens, UInt32 numSymbols, UInt32 maxLen)
-{
- UInt32 num = 0;
- /* if (maxLen > 10) maxLen = 10; */
- {
- UInt32 i;
-
- #ifdef HUFFMAN_SPEED_OPT
-
- UInt32 counters[NUM_COUNTERS];
- for (i = 0; i < NUM_COUNTERS; i++)
- counters[i] = 0;
- for (i = 0; i < numSymbols; i++)
- {
- UInt32 freq = freqs[i];
- counters[(freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1]++;
- }
-
- for (i = 1; i < NUM_COUNTERS; i++)
- {
- UInt32 temp = counters[i];
- counters[i] = num;
- num += temp;
- }
-
- for (i = 0; i < numSymbols; i++)
- {
- UInt32 freq = freqs[i];
- if (freq == 0)
- lens[i] = 0;
- else
- p[counters[((freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1)]++] = i | (freq << NUM_BITS);
- }
- counters[0] = 0;
- HeapSort(p + counters[NUM_COUNTERS - 2], counters[NUM_COUNTERS - 1] - counters[NUM_COUNTERS - 2]);
-
- #else
-
- for (i = 0; i < numSymbols; i++)
- {
- UInt32 freq = freqs[i];
- if (freq == 0)
- lens[i] = 0;
- else
- p[num++] = i | (freq << NUM_BITS);
- }
- HeapSort(p, num);
-
- #endif
- }
-
- if (num < 2)
- {
- unsigned minCode = 0;
- unsigned maxCode = 1;
- if (num == 1)
- {
- maxCode = (unsigned)p[0] & MASK;
- if (maxCode == 0)
- maxCode++;
- }
- p[minCode] = 0;
- p[maxCode] = 1;
- lens[minCode] = lens[maxCode] = 1;
- return;
- }
-
- {
- UInt32 b, e, i;
-
- i = b = e = 0;
- do
- {
- UInt32 n, m, freq;
- n = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++;
- freq = (p[n] & ~MASK);
- p[n] = (p[n] & MASK) | (e << NUM_BITS);
- m = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++;
- freq += (p[m] & ~MASK);
- p[m] = (p[m] & MASK) | (e << NUM_BITS);
- p[e] = (p[e] & MASK) | freq;
- e++;
- }
- while (num - e > 1);
-
- {
- UInt32 lenCounters[kMaxLen + 1];
- for (i = 0; i <= kMaxLen; i++)
- lenCounters[i] = 0;
-
- p[--e] &= MASK;
- lenCounters[1] = 2;
- while (e > 0)
- {
- UInt32 len = (p[p[--e] >> NUM_BITS] >> NUM_BITS) + 1;
- p[e] = (p[e] & MASK) | (len << NUM_BITS);
- if (len >= maxLen)
- for (len = maxLen - 1; lenCounters[len] == 0; len--);
- lenCounters[len]--;
- lenCounters[len + 1] += 2;
- }
-
- {
- UInt32 len;
- i = 0;
- for (len = maxLen; len != 0; len--)
- {
- UInt32 num;
- for (num = lenCounters[len]; num != 0; num--)
- lens[p[i++] & MASK] = (Byte)len;
- }
- }
-
- {
- UInt32 nextCodes[kMaxLen + 1];
- {
- UInt32 code = 0;
- UInt32 len;
- for (len = 1; len <= kMaxLen; len++)
- nextCodes[len] = code = (code + lenCounters[len - 1]) << 1;
- }
- /* if (code + lenCounters[kMaxLen] - 1 != (1 << kMaxLen) - 1) throw 1; */
-
- {
- UInt32 i;
- for (i = 0; i < numSymbols; i++)
- p[i] = nextCodes[lens[i]]++;
- }
- }
- }
- }
-}
diff --git a/src/libs/7zip/unix/C/HuffEnc.h b/src/libs/7zip/unix/C/HuffEnc.h
deleted file mode 100644
index 9cf4bfde8..000000000
--- a/src/libs/7zip/unix/C/HuffEnc.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* HuffEnc.h -- Huffman encoding
-2009-02-07 : Igor Pavlov : Public domain */
-
-#ifndef __HUFF_ENC_H
-#define __HUFF_ENC_H
-
-#include "Types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-Conditions:
- num <= 1024 = 2 ^ NUM_BITS
- Sum(freqs) < 4M = 2 ^ (32 - NUM_BITS)
- maxLen <= 16 = kMaxLen
- Num_Items(p) >= HUFFMAN_TEMP_SIZE(num)
-*/
-
-void Huffman_Generate(const UInt32 *freqs, UInt32 *p, Byte *lens, UInt32 num, UInt32 maxLen);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/libs/7zip/unix/C/LzmaUtil/Lzma86Dec.c b/src/libs/7zip/unix/C/Lzma86Dec.c
index b801dd1ca..b801dd1ca 100644
--- a/src/libs/7zip/unix/C/LzmaUtil/Lzma86Dec.c
+++ b/src/libs/7zip/unix/C/Lzma86Dec.c
diff --git a/src/libs/7zip/unix/C/LzmaUtil/Lzma86Enc.c b/src/libs/7zip/unix/C/Lzma86Enc.c
index efc81ea35..efc81ea35 100644
--- a/src/libs/7zip/unix/C/LzmaUtil/Lzma86Enc.c
+++ b/src/libs/7zip/unix/C/Lzma86Enc.c
diff --git a/src/libs/7zip/unix/C/LzmaUtil/Lzma86Dec.h b/src/libs/7zip/unix/C/LzmaUtil/Lzma86Dec.h
deleted file mode 100644
index 138ce1ff7..000000000
--- a/src/libs/7zip/unix/C/LzmaUtil/Lzma86Dec.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Lzma86Dec.h -- LZMA + x86 (BCJ) Filter Decoder
-2009-02-07 : Igor Pavlov : Public domain */
-
-#ifndef __LZMA86_DEC_H
-#define __LZMA86_DEC_H
-
-#include "../Types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-Lzma86_GetUnpackSize:
- In:
- src - input data
- srcLen - input data size
- Out:
- unpackSize - size of uncompressed stream
- Return code:
- SZ_OK - OK
- SZ_ERROR_INPUT_EOF - Error in headers
-*/
-
-SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize);
-
-/*
-Lzma86_Decode:
- In:
- dest - output data
- destLen - output data size
- src - input data
- srcLen - input data size
- Out:
- destLen - processed output size
- srcLen - processed input size
- Return code:
- SZ_OK - OK
- SZ_ERROR_DATA - Data error
- SZ_ERROR_MEM - Memory allocation error
- SZ_ERROR_UNSUPPORTED - unsupported file
- SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer
-*/
-
-SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/libs/7zip/unix/C/LzmaUtil/Lzma86Enc.h b/src/libs/7zip/unix/C/LzmaUtil/Lzma86Enc.h
deleted file mode 100644
index 355bf343c..000000000
--- a/src/libs/7zip/unix/C/LzmaUtil/Lzma86Enc.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Lzma86Enc.h -- LZMA + x86 (BCJ) Filter Encoder
-2009-02-07 : Igor Pavlov : Public domain */
-
-#ifndef __LZMA86_ENC_H
-#define __LZMA86_ENC_H
-
-#include "../Types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-It's an example for LZMA + x86 Filter use.
-You can use .lzma86 extension, if you write that stream to file.
-.lzma86 header adds one additional byte to standard .lzma header.
-.lzma86 header (14 bytes):
- Offset Size Description
- 0 1 = 0 - no filter,
- = 1 - x86 filter
- 1 1 lc, lp and pb in encoded form
- 2 4 dictSize (little endian)
- 6 8 uncompressed size (little endian)
-
-
-Lzma86_Encode
--------------
-level - compression level: 0 <= level <= 9, the default value for "level" is 5.
-
-
-dictSize - The dictionary size in bytes. The maximum value is
- 128 MB = (1 << 27) bytes for 32-bit version
- 1 GB = (1 << 30) bytes for 64-bit version
- The default value is 16 MB = (1 << 24) bytes, for level = 5.
- It's recommended to use the dictionary that is larger than 4 KB and
- that can be calculated as (1 << N) or (3 << N) sizes.
- For better compression ratio dictSize must be >= inSize.
-
-filterMode:
- SZ_FILTER_NO - no Filter
- SZ_FILTER_YES - x86 Filter
- SZ_FILTER_AUTO - it tries both alternatives to select best.
- Encoder will use 2 or 3 passes:
- 2 passes when FILTER_NO provides better compression.
- 3 passes when FILTER_YES provides better compression.
-
-Lzma86Encode allocates Data with MyAlloc functions.
-RAM Requirements for compressing:
- RamSize = dictionarySize * 11.5 + 6MB + FilterBlockSize
- filterMode FilterBlockSize
- SZ_FILTER_NO 0
- SZ_FILTER_YES inSize
- SZ_FILTER_AUTO inSize
-
-
-Return code:
- SZ_OK - OK
- SZ_ERROR_MEM - Memory allocation error
- SZ_ERROR_PARAM - Incorrect paramater
- SZ_ERROR_OUTPUT_EOF - output buffer overflow
- SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
-*/
-
-enum ESzFilterMode
-{
- SZ_FILTER_NO,
- SZ_FILTER_YES,
- SZ_FILTER_AUTO
-};
-
-SRes Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen,
- int level, UInt32 dictSize, int filterMode);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/libs/7zip/unix/C/Ppmd.h b/src/libs/7zip/unix/C/Ppmd.h
deleted file mode 100644
index 621d92703..000000000
--- a/src/libs/7zip/unix/C/Ppmd.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* Ppmd.h -- PPMD codec common code
-2010-03-12 : Igor Pavlov : Public domain
-This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
-
-#ifndef __PPMD_H
-#define __PPMD_H
-
-#include "Types.h"
-#include "CpuArch.h"
-
-EXTERN_C_BEGIN
-
-#ifdef MY_CPU_32BIT
- #define PPMD_32BIT
-#endif
-
-#define PPMD_INT_BITS 7
-#define PPMD_PERIOD_BITS 7
-#define PPMD_BIN_SCALE (1 << (PPMD_INT_BITS + PPMD_PERIOD_BITS))
-
-#define PPMD_GET_MEAN_SPEC(summ, shift, round) (((summ) + (1 << ((shift) - (round)))) >> (shift))
-#define PPMD_GET_MEAN(summ) PPMD_GET_MEAN_SPEC((summ), PPMD_PERIOD_BITS, 2)
-#define PPMD_UPDATE_PROB_0(prob) ((prob) + (1 << PPMD_INT_BITS) - PPMD_GET_MEAN(prob))
-#define PPMD_UPDATE_PROB_1(prob) ((prob) - PPMD_GET_MEAN(prob))
-
-#define PPMD_N1 4
-#define PPMD_N2 4
-#define PPMD_N3 4
-#define PPMD_N4 ((128 + 3 - 1 * PPMD_N1 - 2 * PPMD_N2 - 3 * PPMD_N3) / 4)
-#define PPMD_NUM_INDEXES (PPMD_N1 + PPMD_N2 + PPMD_N3 + PPMD_N4)
-
-#pragma pack(push,1)
-
-/* SEE-contexts for PPM-contexts with masked symbols */
-typedef struct
-{
- UInt16 Summ; /* Freq */
- Byte Shift; /* Speed of Freq change; low Shift is for fast change */
- Byte Count; /* Count to next change of Shift */
-} CPpmd_See;
-
-#define Ppmd_See_Update(p) if ((p)->Shift < PPMD_PERIOD_BITS && --(p)->Count == 0) \
- { (p)->Summ <<= 1; (p)->Count = (Byte)(3 << (p)->Shift++); }
-
-typedef struct
-{
- Byte Symbol;
- Byte Freq;
- UInt16 SuccessorLow;
- UInt16 SuccessorHigh;
-} CPpmd_State;
-
-#pragma pack(pop)
-
-typedef
- #ifdef PPMD_32BIT
- CPpmd_State *
- #else
- UInt32
- #endif
- CPpmd_State_Ref;
-
-typedef
- #ifdef PPMD_32BIT
- void *
- #else
- UInt32
- #endif
- CPpmd_Void_Ref;
-
-typedef
- #ifdef PPMD_32BIT
- Byte *
- #else
- UInt32
- #endif
- CPpmd_Byte_Ref;
-
-#define PPMD_SetAllBitsIn256Bytes(p) \
- { unsigned i; for (i = 0; i < 256 / sizeof(p[0]); i += 8) { \
- p[i+7] = p[i+6] = p[i+5] = p[i+4] = p[i+3] = p[i+2] = p[i+1] = p[i+0] = ~(size_t)0; }}
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/unix/C/Ppmd7.c b/src/libs/7zip/unix/C/Ppmd7.c
deleted file mode 100644
index 060d86d2e..000000000
--- a/src/libs/7zip/unix/C/Ppmd7.c
+++ /dev/null
@@ -1,708 +0,0 @@
-/* Ppmd7.c -- PPMdH codec
-2010-03-12 : Igor Pavlov : Public domain
-This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
-
-#include <memory.h>
-
-#include "Ppmd7.h"
-
-const Byte PPMD7_kExpEscape[16] = { 25, 14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 };
-static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051};
-
-#define MAX_FREQ 124
-#define UNIT_SIZE 12
-
-#define U2B(nu) ((UInt32)(nu) * UNIT_SIZE)
-#define U2I(nu) (p->Units2Indx[(nu) - 1])
-#define I2U(indx) (p->Indx2Units[indx])
-
-#ifdef PPMD_32BIT
- #define REF(ptr) (ptr)
-#else
- #define REF(ptr) ((UInt32)((Byte *)(ptr) - (p)->Base))
-#endif
-
-#define STATS_REF(ptr) ((CPpmd_State_Ref)REF(ptr))
-
-#define CTX(ref) ((CPpmd7_Context *)Ppmd7_GetContext(p, ref))
-#define STATS(ctx) Ppmd7_GetStats(p, ctx)
-#define ONE_STATE(ctx) Ppmd7Context_OneState(ctx)
-#define SUFFIX(ctx) CTX((ctx)->Suffix)
-
-typedef CPpmd7_Context * CTX_PTR;
-
-struct CPpmd7_Node_;
-
-typedef
- #ifdef PPMD_32BIT
- struct CPpmd7_Node_ *
- #else
- UInt32
- #endif
- CPpmd7_Node_Ref;
-
-typedef struct CPpmd7_Node_
-{
- UInt16 Stamp; /* must be at offset 0 as CPpmd7_Context::NumStats. Stamp=0 means free */
- UInt16 NU;
- CPpmd7_Node_Ref Next; /* must be at offset >= 4 */
- CPpmd7_Node_Ref Prev;
-} CPpmd7_Node;
-
-#ifdef PPMD_32BIT
- #define NODE(ptr) (ptr)
-#else
- #define NODE(offs) ((CPpmd7_Node *)(p->Base + (offs)))
-#endif
-
-void Ppmd7_Construct(CPpmd7 *p)
-{
- unsigned i, k, m;
-
- p->Base = 0;
-
- for (i = 0, k = 0; i < PPMD_NUM_INDEXES; i++)
- {
- unsigned step = (i >= 12 ? 4 : (i >> 2) + 1);
- do { p->Units2Indx[k++] = (Byte)i; } while(--step);
- p->Indx2Units[i] = (Byte)k;
- }
-
- p->NS2BSIndx[0] = (0 << 1);
- p->NS2BSIndx[1] = (1 << 1);
- memset(p->NS2BSIndx + 2, (2 << 1), 9);
- memset(p->NS2BSIndx + 11, (3 << 1), 256 - 11);
-
- for (i = 0; i < 3; i++)
- p->NS2Indx[i] = (Byte)i;
- for (m = i, k = 1; i < 256; i++)
- {
- p->NS2Indx[i] = (Byte)m;
- if (--k == 0)
- k = (++m) - 2;
- }
-
- memset(p->HB2Flag, 0, 0x40);
- memset(p->HB2Flag + 0x40, 8, 0x100 - 0x40);
-}
-
-void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc)
-{
- alloc->Free(alloc, p->Base);
- p->Size = 0;
- p->Base = 0;
-}
-
-Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc)
-{
- if (p->Base == 0 || p->Size != size)
- {
- Ppmd7_Free(p, alloc);
- p->AlignOffset =
- #ifdef PPMD_32BIT
- (4 - size) & 3;
- #else
- 4 - (size & 3);
- #endif
- if ((p->Base = (Byte *)alloc->Alloc(alloc, p->AlignOffset + size
- #ifndef PPMD_32BIT
- + UNIT_SIZE
- #endif
- )) == 0)
- return False;
- p->Size = size;
- }
- return True;
-}
-
-static void InsertNode(CPpmd7 *p, void *node, unsigned indx)
-{
- *((CPpmd_Void_Ref *)node) = p->FreeList[indx];
- p->FreeList[indx] = REF(node);
-}
-
-static void *RemoveNode(CPpmd7 *p, unsigned indx)
-{
- CPpmd_Void_Ref *node = (CPpmd_Void_Ref *)Ppmd7_GetPtr(p, p->FreeList[indx]);
- p->FreeList[indx] = *node;
- return node;
-}
-
-static void SplitBlock(CPpmd7 *p, void *ptr, unsigned oldIndx, unsigned newIndx)
-{
- unsigned i, nu = I2U(oldIndx) - I2U(newIndx);
- ptr = (Byte *)ptr + U2B(I2U(newIndx));
- if (I2U(i = U2I(nu)) != nu)
- {
- unsigned k = I2U(--i);
- InsertNode(p, ((Byte *)ptr) + U2B(k), nu - k - 1);
- }
- InsertNode(p, ptr, i);
-}
-
-static void GlueFreeBlocks(CPpmd7 *p)
-{
- #ifdef PPMD_32BIT
- CPpmd7_Node headItem;
- CPpmd7_Node_Ref head = &headItem;
- #else
- CPpmd7_Node_Ref head = p->AlignOffset + p->Size;
- #endif
-
- CPpmd7_Node_Ref n = head;
- unsigned i;
-
- p->GlueCount = 255;
-
- /* create doubly-linked list of free blocks */
- for (i = 0; i < PPMD_NUM_INDEXES; i++)
- {
- UInt16 nu = I2U(i);
- CPpmd7_Node_Ref next = (CPpmd7_Node_Ref)p->FreeList[i];
- p->FreeList[i] = 0;
- while (next != 0)
- {
- CPpmd7_Node *node = NODE(next);
- node->Next = n;
- n = NODE(n)->Prev = next;
- next = *(const CPpmd7_Node_Ref *)node;
- node->Stamp = 0;
- node->NU = (UInt16)nu;
- }
- }
- NODE(head)->Stamp = 1;
- NODE(head)->Next = n;
- NODE(n)->Prev = head;
- if (p->LoUnit != p->HiUnit)
- ((CPpmd7_Node *)p->LoUnit)->Stamp = 1;
-
- /* Glue free blocks */
- while (n != head)
- {
- CPpmd7_Node *node = NODE(n);
- UInt32 nu = (UInt32)node->NU;
- for (;;)
- {
- CPpmd7_Node *node2 = NODE(n) + nu;
- nu += node2->NU;
- if (node2->Stamp != 0 || nu >= 0x10000)
- break;
- NODE(node2->Prev)->Next = node2->Next;
- NODE(node2->Next)->Prev = node2->Prev;
- node->NU = (UInt16)nu;
- }
- n = node->Next;
- }
-
- /* Fill lists of free blocks */
- for (n = NODE(head)->Next; n != head;)
- {
- CPpmd7_Node *node = NODE(n);
- unsigned nu;
- CPpmd7_Node_Ref next = node->Next;
- for (nu = node->NU; nu > 128; nu -= 128, node += 128)
- InsertNode(p, node, PPMD_NUM_INDEXES - 1);
- if (I2U(i = U2I(nu)) != nu)
- {
- unsigned k = I2U(--i);
- InsertNode(p, node + k, nu - k - 1);
- }
- InsertNode(p, node, i);
- n = next;
- }
-}
-
-static void *AllocUnitsRare(CPpmd7 *p, unsigned indx)
-{
- unsigned i;
- void *retVal;
- if (p->GlueCount == 0)
- {
- GlueFreeBlocks(p);
- if (p->FreeList[indx] != 0)
- return RemoveNode(p, indx);
- }
- i = indx;
- do
- {
- if (++i == PPMD_NUM_INDEXES)
- {
- UInt32 numBytes = U2B(I2U(indx));
- p->GlueCount--;
- return ((UInt32)(p->UnitsStart - p->Text) > numBytes) ? (p->UnitsStart -= numBytes) : (NULL);
- }
- }
- while (p->FreeList[i] == 0);
- retVal = RemoveNode(p, i);
- SplitBlock(p, retVal, i, indx);
- return retVal;
-}
-
-static void *AllocUnits(CPpmd7 *p, unsigned indx)
-{
- UInt32 numBytes;
- if (p->FreeList[indx] != 0)
- return RemoveNode(p, indx);
- numBytes = U2B(I2U(indx));
- if (numBytes <= (UInt32)(p->HiUnit - p->LoUnit))
- {
- void *retVal = p->LoUnit;
- p->LoUnit += numBytes;
- return retVal;
- }
- return AllocUnitsRare(p, indx);
-}
-
-#define MyMem12Cpy(dest, src, num) \
- { UInt32 *d = (UInt32 *)dest; const UInt32 *s = (const UInt32 *)src; UInt32 n = num; \
- do { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; s += 3; d += 3; } while(--n); }
-
-static void *ShrinkUnits(CPpmd7 *p, void *oldPtr, unsigned oldNU, unsigned newNU)
-{
- unsigned i0 = U2I(oldNU);
- unsigned i1 = U2I(newNU);
- if (i0 == i1)
- return oldPtr;
- if (p->FreeList[i1] != 0)
- {
- void *ptr = RemoveNode(p, i1);
- MyMem12Cpy(ptr, oldPtr, newNU);
- InsertNode(p, oldPtr, i0);
- return ptr;
- }
- SplitBlock(p, oldPtr, i0, i1);
- return oldPtr;
-}
-
-#define SUCCESSOR(p) ((CPpmd_Void_Ref)((p)->SuccessorLow | ((UInt32)(p)->SuccessorHigh << 16)))
-
-static void SetSuccessor(CPpmd_State *p, CPpmd_Void_Ref v)
-{
- (p)->SuccessorLow = (UInt16)((UInt32)(v) & 0xFFFF);
- (p)->SuccessorHigh = (UInt16)(((UInt32)(v) >> 16) & 0xFFFF);
-}
-
-static void RestartModel(CPpmd7 *p)
-{
- unsigned i, k, m;
-
- memset(p->FreeList, 0, sizeof(p->FreeList));
- p->Text = p->Base + p->AlignOffset;
- p->HiUnit = p->Text + p->Size;
- p->LoUnit = p->UnitsStart = p->HiUnit - p->Size / 8 / UNIT_SIZE * 7 * UNIT_SIZE;
- p->GlueCount = 0;
-
- p->OrderFall = p->MaxOrder;
- p->RunLength = p->InitRL = -(Int32)((p->MaxOrder < 12) ? p->MaxOrder : 12) - 1;
- p->PrevSuccess = 0;
-
- p->MinContext = p->MaxContext = (CTX_PTR)(p->HiUnit -= UNIT_SIZE); /* AllocContext(p); */
- p->MinContext->Suffix = 0;
- p->MinContext->NumStats = 256;
- p->MinContext->SummFreq = 256 + 1;
- p->FoundState = (CPpmd_State *)p->LoUnit; /* AllocUnits(p, PPMD_NUM_INDEXES - 1); */
- p->LoUnit += U2B(256 / 2);
- p->MinContext->Stats = REF(p->FoundState);
- for (i = 0; i < 256; i++)
- {
- CPpmd_State *s = &p->FoundState[i];
- s->Symbol = (Byte)i;
- s->Freq = 1;
- SetSuccessor(s, 0);
- }
-
- for (i = 0; i < 128; i++)
- for (k = 0; k < 8; k++)
- {
- UInt16 *dest = p->BinSumm[i] + k;
- UInt16 val = (UInt16)(PPMD_BIN_SCALE - kInitBinEsc[k] / (i + 2));
- for (m = 0; m < 64; m += 8)
- dest[m] = val;
- }
-
- for (i = 0; i < 25; i++)
- for (k = 0; k < 16; k++)
- {
- CPpmd_See *s = &p->See[i][k];
- s->Summ = (UInt16)((5 * i + 10) << (s->Shift = PPMD_PERIOD_BITS - 4));
- s->Count = 4;
- }
-}
-
-void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder)
-{
- p->MaxOrder = maxOrder;
- RestartModel(p);
- p->DummySee.Shift = PPMD_PERIOD_BITS;
- p->DummySee.Summ = 0; /* unused */
- p->DummySee.Count = 64; /* unused */
-}
-
-static CTX_PTR CreateSuccessors(CPpmd7 *p, Bool skip)
-{
- CPpmd_State upState;
- CTX_PTR c = p->MinContext;
- CPpmd_Byte_Ref upBranch = (CPpmd_Byte_Ref)SUCCESSOR(p->FoundState);
- CPpmd_State *ps[PPMD7_MAX_ORDER];
- unsigned numPs = 0;
-
- if (!skip)
- ps[numPs++] = p->FoundState;
-
- while (c->Suffix)
- {
- CPpmd_Void_Ref successor;
- CPpmd_State *s;
- c = SUFFIX(c);
- if (c->NumStats != 1)
- {
- for (s = STATS(c); s->Symbol != p->FoundState->Symbol; s++);
- }
- else
- s = ONE_STATE(c);
- successor = SUCCESSOR(s);
- if (successor != upBranch)
- {
- c = CTX(successor);
- if (numPs == 0)
- return c;
- break;
- }
- ps[numPs++] = s;
- }
-
- upState.Symbol = *(const Byte *)Ppmd7_GetPtr(p, upBranch);
- SetSuccessor(&upState, upBranch + 1);
-
- if (c->NumStats == 1)
- upState.Freq = ONE_STATE(c)->Freq;
- else
- {
- UInt32 cf, s0;
- CPpmd_State *s;
- for (s = STATS(c); s->Symbol != upState.Symbol; s++);
- cf = s->Freq - 1;
- s0 = c->SummFreq - c->NumStats - cf;
- upState.Freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : ((2 * cf + 3 * s0 - 1) / (2 * s0))));
- }
-
- do
- {
- /* Create Child */
- CTX_PTR c1; /* = AllocContext(p); */
- if (p->HiUnit != p->LoUnit)
- c1 = (CTX_PTR)(p->HiUnit -= UNIT_SIZE);
- else if (p->FreeList[0] != 0)
- c1 = (CTX_PTR)RemoveNode(p, 0);
- else
- {
- c1 = (CTX_PTR)AllocUnitsRare(p, 0);
- if (!c1)
- return NULL;
- }
- c1->NumStats = 1;
- *ONE_STATE(c1) = upState;
- c1->Suffix = REF(c);
- SetSuccessor(ps[--numPs], REF(c1));
- c = c1;
- }
- while (numPs != 0);
-
- return c;
-}
-
-static void SwapStates(CPpmd_State *t1, CPpmd_State *t2)
-{
- CPpmd_State tmp = *t1;
- *t1 = *t2;
- *t2 = tmp;
-}
-
-static void UpdateModel(CPpmd7 *p)
-{
- CPpmd_Void_Ref successor, fSuccessor = SUCCESSOR(p->FoundState);
- CTX_PTR c;
- unsigned s0, ns;
-
- if (p->FoundState->Freq < MAX_FREQ / 4 && p->MinContext->Suffix != 0)
- {
- c = SUFFIX(p->MinContext);
-
- if (c->NumStats == 1)
- {
- CPpmd_State *s = ONE_STATE(c);
- if (s->Freq < 32)
- s->Freq++;
- }
- else
- {
- CPpmd_State *s = STATS(c);
- if (s->Symbol != p->FoundState->Symbol)
- {
- do { s++; } while (s->Symbol != p->FoundState->Symbol);
- if (s[0].Freq >= s[-1].Freq)
- {
- SwapStates(&s[0], &s[-1]);
- s--;
- }
- }
- if (s->Freq < MAX_FREQ - 9)
- {
- s->Freq += 2;
- c->SummFreq += 2;
- }
- }
- }
-
- if (p->OrderFall == 0)
- {
- p->MinContext = p->MaxContext = CreateSuccessors(p, True);
- if (p->MinContext == 0)
- {
- RestartModel(p);
- return;
- }
- SetSuccessor(p->FoundState, REF(p->MinContext));
- return;
- }
-
- *p->Text++ = p->FoundState->Symbol;
- successor = REF(p->Text);
- if (p->Text >= p->UnitsStart)
- {
- RestartModel(p);
- return;
- }
-
- if (fSuccessor)
- {
- if (fSuccessor <= successor)
- {
- CTX_PTR cs = CreateSuccessors(p, False);
- if (cs == NULL)
- {
- RestartModel(p);
- return;
- }
- fSuccessor = REF(cs);
- }
- if (--p->OrderFall == 0)
- {
- successor = fSuccessor;
- p->Text -= (p->MaxContext != p->MinContext);
- }
- }
- else
- {
- SetSuccessor(p->FoundState, successor);
- fSuccessor = REF(p->MinContext);
- }
-
- s0 = p->MinContext->SummFreq - (ns = p->MinContext->NumStats) - (p->FoundState->Freq - 1);
-
- for (c = p->MaxContext; c != p->MinContext; c = SUFFIX(c))
- {
- unsigned ns1;
- UInt32 cf, sf;
- if ((ns1 = c->NumStats) != 1)
- {
- if ((ns1 & 1) == 0)
- {
- /* Expand for one UNIT */
- unsigned oldNU = ns1 >> 1;
- unsigned i = U2I(oldNU);
- if (i != U2I(oldNU + 1))
- {
- void *ptr = AllocUnits(p, i + 1);
- void *oldPtr;
- if (!ptr)
- {
- RestartModel(p);
- return;
- }
- oldPtr = STATS(c);
- MyMem12Cpy(ptr, oldPtr, oldNU);
- InsertNode(p, oldPtr, i);
- c->Stats = STATS_REF(ptr);
- }
- }
- c->SummFreq = (UInt16)(c->SummFreq + (2 * ns1 < ns) + 2 * ((4 * ns1 <= ns) & (c->SummFreq <= 8 * ns1)));
- }
- else
- {
- CPpmd_State *s = (CPpmd_State*)AllocUnits(p, 0);
- if (!s)
- {
- RestartModel(p);
- return;
- }
- *s = *ONE_STATE(c);
- c->Stats = REF(s);
- if (s->Freq < MAX_FREQ / 4 - 1)
- s->Freq <<= 1;
- else
- s->Freq = MAX_FREQ - 4;
- c->SummFreq = (UInt16)(s->Freq + p->InitEsc + (ns > 3));
- }
- cf = 2 * (UInt32)p->FoundState->Freq * (c->SummFreq + 6);
- sf = (UInt32)s0 + c->SummFreq;
- if (cf < 6 * sf)
- {
- cf = 1 + (cf > sf) + (cf >= 4 * sf);
- c->SummFreq += 3;
- }
- else
- {
- cf = 4 + (cf >= 9 * sf) + (cf >= 12 * sf) + (cf >= 15 * sf);
- c->SummFreq = (UInt16)(c->SummFreq + cf);
- }
- {
- CPpmd_State *s = STATS(c) + ns1;
- SetSuccessor(s, successor);
- s->Symbol = p->FoundState->Symbol;
- s->Freq = (Byte)cf;
- c->NumStats = (UInt16)(ns1 + 1);
- }
- }
- p->MaxContext = p->MinContext = CTX(fSuccessor);
-}
-
-static void Rescale(CPpmd7 *p)
-{
- unsigned i, adder, sumFreq, escFreq;
- CPpmd_State *stats = STATS(p->MinContext);
- CPpmd_State *s = p->FoundState;
- {
- CPpmd_State tmp = *s;
- for (; s != stats; s--)
- s[0] = s[-1];
- *s = tmp;
- }
- escFreq = p->MinContext->SummFreq - s->Freq;
- s->Freq += 4;
- adder = (p->OrderFall != 0);
- s->Freq = (Byte)((s->Freq + adder) >> 1);
- sumFreq = s->Freq;
-
- i = p->MinContext->NumStats - 1;
- do
- {
- escFreq -= (++s)->Freq;
- s->Freq = (Byte)((s->Freq + adder) >> 1);
- sumFreq += s->Freq;
- if (s[0].Freq > s[-1].Freq)
- {
- CPpmd_State *s1 = s;
- CPpmd_State tmp = *s1;
- do
- s1[0] = s1[-1];
- while (--s1 != stats && tmp.Freq > s1[-1].Freq);
- *s1 = tmp;
- }
- }
- while (--i);
-
- if (s->Freq == 0)
- {
- unsigned numStats = p->MinContext->NumStats;
- unsigned n0, n1;
- do { i++; } while ((--s)->Freq == 0);
- escFreq += i;
- p->MinContext->NumStats = (UInt16)(p->MinContext->NumStats - i);
- if (p->MinContext->NumStats == 1)
- {
- CPpmd_State tmp = *stats;
- do
- {
- tmp.Freq = (Byte)(tmp.Freq - (tmp.Freq >> 1));
- escFreq >>= 1;
- }
- while (escFreq > 1);
- InsertNode(p, stats, U2I(((numStats + 1) >> 1)));
- *(p->FoundState = ONE_STATE(p->MinContext)) = tmp;
- return;
- }
- n0 = (numStats + 1) >> 1;
- n1 = (p->MinContext->NumStats + 1) >> 1;
- if (n0 != n1)
- p->MinContext->Stats = STATS_REF(ShrinkUnits(p, stats, n0, n1));
- }
- p->MinContext->SummFreq = (UInt16)(sumFreq + escFreq - (escFreq >> 1));
- p->FoundState = STATS(p->MinContext);
-}
-
-CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *escFreq)
-{
- CPpmd_See *see;
- unsigned nonMasked = p->MinContext->NumStats - numMasked;
- if (p->MinContext->NumStats != 256)
- {
- see = p->See[p->NS2Indx[nonMasked - 1]] +
- (nonMasked < (unsigned)SUFFIX(p->MinContext)->NumStats - p->MinContext->NumStats) +
- 2 * (p->MinContext->SummFreq < 11 * p->MinContext->NumStats) +
- 4 * (numMasked > nonMasked) +
- p->HiBitsFlag;
- {
- unsigned r = (see->Summ >> see->Shift);
- see->Summ = (UInt16)(see->Summ - r);
- *escFreq = r + (r == 0);
- }
- }
- else
- {
- see = &p->DummySee;
- *escFreq = 1;
- }
- return see;
-}
-
-static void NextContext(CPpmd7 *p)
-{
- CTX_PTR c = CTX(SUCCESSOR(p->FoundState));
- if (p->OrderFall == 0 && (Byte *)c > p->Text)
- p->MinContext = p->MaxContext = c;
- else
- UpdateModel(p);
-}
-
-void Ppmd7_Update1(CPpmd7 *p)
-{
- CPpmd_State *s = p->FoundState;
- s->Freq += 4;
- p->MinContext->SummFreq += 4;
- if (s[0].Freq > s[-1].Freq)
- {
- SwapStates(&s[0], &s[-1]);
- p->FoundState = --s;
- if (s->Freq > MAX_FREQ)
- Rescale(p);
- }
- NextContext(p);
-}
-
-void Ppmd7_Update1_0(CPpmd7 *p)
-{
- p->PrevSuccess = (2 * p->FoundState->Freq > p->MinContext->SummFreq);
- p->RunLength += p->PrevSuccess;
- p->MinContext->SummFreq += 4;
- if ((p->FoundState->Freq += 4) > MAX_FREQ)
- Rescale(p);
- NextContext(p);
-}
-
-void Ppmd7_UpdateBin(CPpmd7 *p)
-{
- p->FoundState->Freq = (Byte)(p->FoundState->Freq + (p->FoundState->Freq < 128 ? 1: 0));
- p->PrevSuccess = 1;
- p->RunLength++;
- NextContext(p);
-}
-
-void Ppmd7_Update2(CPpmd7 *p)
-{
- p->MinContext->SummFreq += 4;
- if ((p->FoundState->Freq += 4) > MAX_FREQ)
- Rescale(p);
- p->RunLength = p->InitRL;
- UpdateModel(p);
-}
diff --git a/src/libs/7zip/unix/C/Ppmd7.h b/src/libs/7zip/unix/C/Ppmd7.h
deleted file mode 100644
index 96521c31f..000000000
--- a/src/libs/7zip/unix/C/Ppmd7.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/* Ppmd7.h -- PPMdH compression codec
-2010-03-12 : Igor Pavlov : Public domain
-This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
-
-/* This code supports virtual RangeDecoder and includes the implementation
-of RangeCoder from 7z, instead of RangeCoder from original PPMd var.H.
-If you need the compatibility with original PPMd var.H, you can use external RangeDecoder */
-
-#ifndef __PPMD7_H
-#define __PPMD7_H
-
-#include "Ppmd.h"
-
-EXTERN_C_BEGIN
-
-#define PPMD7_MIN_ORDER 2
-#define PPMD7_MAX_ORDER 64
-
-#define PPMD7_MIN_MEM_SIZE (1 << 11)
-#define PPMD7_MAX_MEM_SIZE (0xFFFFFFFF - 12 * 3)
-
-struct CPpmd7_Context_;
-
-typedef
- #ifdef PPMD_32BIT
- struct CPpmd7_Context_ *
- #else
- UInt32
- #endif
- CPpmd7_Context_Ref;
-
-typedef struct CPpmd7_Context_
-{
- UInt16 NumStats;
- UInt16 SummFreq;
- CPpmd_State_Ref Stats;
- CPpmd7_Context_Ref Suffix;
-} CPpmd7_Context;
-
-#define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->SummFreq)
-
-typedef struct
-{
- CPpmd7_Context *MinContext, *MaxContext;
- CPpmd_State *FoundState;
- unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag;
- Int32 RunLength, InitRL; /* must be 32-bit at least */
-
- UInt32 Size;
- UInt32 GlueCount;
- Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart;
- UInt32 AlignOffset;
-
- Byte Indx2Units[PPMD_NUM_INDEXES];
- Byte Units2Indx[128];
- CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES];
- Byte NS2Indx[256], NS2BSIndx[256], HB2Flag[256];
- CPpmd_See DummySee, See[25][16];
- UInt16 BinSumm[128][64];
-} CPpmd7;
-
-void Ppmd7_Construct(CPpmd7 *p);
-Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc);
-void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc);
-void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder);
-#define Ppmd7_WasAllocated(p) ((p)->Base != NULL)
-
-
-/* ---------- Internal Functions ---------- */
-
-extern const Byte PPMD7_kExpEscape[16];
-
-#ifdef PPMD_32BIT
- #define Ppmd7_GetPtr(p, ptr) (ptr)
- #define Ppmd7_GetContext(p, ptr) (ptr)
- #define Ppmd7_GetStats(p, ctx) ((ctx)->Stats)
-#else
- #define Ppmd7_GetPtr(p, offs) ((void *)((p)->Base + (offs)))
- #define Ppmd7_GetContext(p, offs) ((CPpmd7_Context *)Ppmd7_GetPtr((p), (offs)))
- #define Ppmd7_GetStats(p, ctx) ((CPpmd_State *)Ppmd7_GetPtr((p), ((ctx)->Stats)))
-#endif
-
-void Ppmd7_Update1(CPpmd7 *p);
-void Ppmd7_Update1_0(CPpmd7 *p);
-void Ppmd7_Update2(CPpmd7 *p);
-void Ppmd7_UpdateBin(CPpmd7 *p);
-
-#define Ppmd7_GetBinSumm(p) \
- &p->BinSumm[Ppmd7Context_OneState(p->MinContext)->Freq - 1][p->PrevSuccess + \
- p->NS2BSIndx[Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \
- (p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \
- 2 * p->HB2Flag[Ppmd7Context_OneState(p->MinContext)->Symbol] + \
- ((p->RunLength >> 26) & 0x20)]
-
-CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale);
-
-
-/* ---------- Decode ---------- */
-
-typedef struct
-{
- UInt32 (*GetThreshold)(void *p, UInt32 total);
- void (*Decode)(void *p, UInt32 start, UInt32 size);
- UInt32 (*DecodeBit)(void *p, UInt32 size0);
-} IPpmd7_RangeDec;
-
-typedef struct
-{
- IPpmd7_RangeDec p;
- UInt32 Range;
- UInt32 Code;
- IByteIn *Stream;
-} CPpmd7z_RangeDec;
-
-void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p);
-Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p);
-#define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0)
-
-int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc);
-
-
-/* ---------- Encode ---------- */
-
-typedef struct
-{
- UInt64 Low;
- UInt32 Range;
- Byte Cache;
- UInt64 CacheSize;
- IByteOut *Stream;
-} CPpmd7z_RangeEnc;
-
-void Ppmd7z_RangeEnc_Init(CPpmd7z_RangeEnc *p);
-void Ppmd7z_RangeEnc_FlushData(CPpmd7z_RangeEnc *p);
-
-void Ppmd7_EncodeSymbol(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/unix/C/Ppmd7Dec.c b/src/libs/7zip/unix/C/Ppmd7Dec.c
deleted file mode 100644
index 68438d5ce..000000000
--- a/src/libs/7zip/unix/C/Ppmd7Dec.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* Ppmd7Dec.c -- PPMdH Decoder
-2010-03-12 : Igor Pavlov : Public domain
-This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
-
-#include "Ppmd7.h"
-
-#define kTopValue (1 << 24)
-
-Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p)
-{
- unsigned i;
- p->Code = 0;
- p->Range = 0xFFFFFFFF;
- if (p->Stream->Read((void *)p->Stream) != 0)
- return False;
- for (i = 0; i < 4; i++)
- p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
- return (p->Code < 0xFFFFFFFF);
-}
-
-static UInt32 Range_GetThreshold(void *pp, UInt32 total)
-{
- CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
- return (p->Code) / (p->Range /= total);
-}
-
-static void Range_Normalize(CPpmd7z_RangeDec *p)
-{
- if (p->Range < kTopValue)
- {
- p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
- p->Range <<= 8;
- if (p->Range < kTopValue)
- {
- p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
- p->Range <<= 8;
- }
- }
-}
-
-static void Range_Decode(void *pp, UInt32 start, UInt32 size)
-{
- CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
- p->Code -= start * p->Range;
- p->Range *= size;
- Range_Normalize(p);
-}
-
-static UInt32 Range_DecodeBit(void *pp, UInt32 size0)
-{
- CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
- UInt32 newBound = (p->Range >> 14) * size0;
- UInt32 symbol;
- if (p->Code < newBound)
- {
- symbol = 0;
- p->Range = newBound;
- }
- else
- {
- symbol = 1;
- p->Code -= newBound;
- p->Range -= newBound;
- }
- Range_Normalize(p);
- return symbol;
-}
-
-void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p)
-{
- p->p.GetThreshold = Range_GetThreshold;
- p->p.Decode = Range_Decode;
- p->p.DecodeBit = Range_DecodeBit;
-}
-
-
-#define MASK(sym) ((signed char *)charMask)[sym]
-
-int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc)
-{
- size_t charMask[256 / sizeof(size_t)];
- if (p->MinContext->NumStats != 1)
- {
- CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext);
- unsigned i;
- UInt32 count, hiCnt;
- if ((count = rc->GetThreshold(rc, p->MinContext->SummFreq)) < (hiCnt = s->Freq))
- {
- Byte symbol;
- rc->Decode(rc, 0, s->Freq);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd7_Update1_0(p);
- return symbol;
- }
- p->PrevSuccess = 0;
- i = p->MinContext->NumStats - 1;
- do
- {
- if ((hiCnt += (++s)->Freq) > count)
- {
- Byte symbol;
- rc->Decode(rc, hiCnt - s->Freq, s->Freq);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd7_Update1(p);
- return symbol;
- }
- }
- while (--i);
- if (count >= p->MinContext->SummFreq)
- return -2;
- p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol];
- rc->Decode(rc, hiCnt, p->MinContext->SummFreq - hiCnt);
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- i = p->MinContext->NumStats - 1;
- do { MASK((--s)->Symbol) = 0; } while (--i);
- }
- else
- {
- UInt16 *prob = Ppmd7_GetBinSumm(p);
- if (rc->DecodeBit(rc, *prob) == 0)
- {
- Byte symbol;
- *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob);
- symbol = (p->FoundState = Ppmd7Context_OneState(p->MinContext))->Symbol;
- Ppmd7_UpdateBin(p);
- return symbol;
- }
- *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob);
- p->InitEsc = PPMD7_kExpEscape[*prob >> 10];
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(Ppmd7Context_OneState(p->MinContext)->Symbol) = 0;
- p->PrevSuccess = 0;
- }
- for (;;)
- {
- CPpmd_State *ps[256], *s;
- UInt32 freqSum, count, hiCnt;
- CPpmd_See *see;
- unsigned i, num, numMasked = p->MinContext->NumStats;
- do
- {
- p->OrderFall++;
- if (!p->MinContext->Suffix)
- return -1;
- p->MinContext = Ppmd7_GetContext(p, p->MinContext->Suffix);
- }
- while (p->MinContext->NumStats == numMasked);
- hiCnt = 0;
- s = Ppmd7_GetStats(p, p->MinContext);
- i = 0;
- num = p->MinContext->NumStats - numMasked;
- do
- {
- int k = (int)(MASK(s->Symbol));
- hiCnt += (s->Freq & k);
- ps[i] = s++;
- i -= k;
- }
- while (i != num);
-
- see = Ppmd7_MakeEscFreq(p, numMasked, &freqSum);
- freqSum += hiCnt;
- count = rc->GetThreshold(rc, freqSum);
-
- if (count < hiCnt)
- {
- Byte symbol;
- CPpmd_State **pps = ps;
- for (hiCnt = 0; (hiCnt += (*pps)->Freq) <= count; pps++);
- s = *pps;
- rc->Decode(rc, hiCnt - s->Freq, s->Freq);
- Ppmd_See_Update(see);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd7_Update2(p);
- return symbol;
- }
- if (count >= freqSum)
- return -2;
- rc->Decode(rc, hiCnt, freqSum - hiCnt);
- see->Summ = (UInt16)(see->Summ + freqSum);
- do { MASK(ps[--i]->Symbol) = 0; } while (i != 0);
- }
-}
diff --git a/src/libs/7zip/unix/C/Ppmd7Enc.c b/src/libs/7zip/unix/C/Ppmd7Enc.c
deleted file mode 100644
index 8247757d0..000000000
--- a/src/libs/7zip/unix/C/Ppmd7Enc.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/* Ppmd7Enc.c -- PPMdH Encoder
-2010-03-12 : Igor Pavlov : Public domain
-This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
-
-#include "Ppmd7.h"
-
-#define kTopValue (1 << 24)
-
-void Ppmd7z_RangeEnc_Init(CPpmd7z_RangeEnc *p)
-{
- p->Low = 0;
- p->Range = 0xFFFFFFFF;
- p->Cache = 0;
- p->CacheSize = 1;
-}
-
-static void RangeEnc_ShiftLow(CPpmd7z_RangeEnc *p)
-{
- if ((UInt32)p->Low < (UInt32)0xFF000000 || (unsigned)(p->Low >> 32) != 0)
- {
- Byte temp = p->Cache;
- do
- {
- p->Stream->Write(p->Stream, (Byte)(temp + (Byte)(p->Low >> 32)));
- temp = 0xFF;
- }
- while(--p->CacheSize != 0);
- p->Cache = (Byte)((UInt32)p->Low >> 24);
- }
- p->CacheSize++;
- p->Low = (UInt32)p->Low << 8;
-}
-
-static void RangeEnc_Encode(CPpmd7z_RangeEnc *p, UInt32 start, UInt32 size, UInt32 total)
-{
- p->Low += start * (p->Range /= total);
- p->Range *= size;
- while (p->Range < kTopValue)
- {
- p->Range <<= 8;
- RangeEnc_ShiftLow(p);
- }
-}
-
-static void RangeEnc_EncodeBit_0(CPpmd7z_RangeEnc *p, UInt32 size0)
-{
- p->Range = (p->Range >> 14) * size0;
- while (p->Range < kTopValue)
- {
- p->Range <<= 8;
- RangeEnc_ShiftLow(p);
- }
-}
-
-static void RangeEnc_EncodeBit_1(CPpmd7z_RangeEnc *p, UInt32 size0)
-{
- UInt32 newBound = (p->Range >> 14) * size0;
- p->Low += newBound;
- p->Range -= newBound;
- while (p->Range < kTopValue)
- {
- p->Range <<= 8;
- RangeEnc_ShiftLow(p);
- }
-}
-
-void Ppmd7z_RangeEnc_FlushData(CPpmd7z_RangeEnc *p)
-{
- unsigned i;
- for (i = 0; i < 5; i++)
- RangeEnc_ShiftLow(p);
-}
-
-
-#define MASK(sym) ((signed char *)charMask)[sym]
-
-void Ppmd7_EncodeSymbol(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol)
-{
- size_t charMask[256 / sizeof(size_t)];
- if (p->MinContext->NumStats != 1)
- {
- CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext);
- UInt32 sum;
- unsigned i;
- if (s->Symbol == symbol)
- {
- RangeEnc_Encode(rc, 0, s->Freq, p->MinContext->SummFreq);
- p->FoundState = s;
- Ppmd7_Update1_0(p);
- return;
- }
- p->PrevSuccess = 0;
- sum = s->Freq;
- i = p->MinContext->NumStats - 1;
- do
- {
- if ((++s)->Symbol == symbol)
- {
- RangeEnc_Encode(rc, sum, s->Freq, p->MinContext->SummFreq);
- p->FoundState = s;
- Ppmd7_Update1(p);
- return;
- }
- sum += s->Freq;
- }
- while (--i);
-
- p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol];
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- i = p->MinContext->NumStats - 1;
- do { MASK((--s)->Symbol) = 0; } while (--i);
- RangeEnc_Encode(rc, sum, p->MinContext->SummFreq - sum, p->MinContext->SummFreq);
- }
- else
- {
- UInt16 *prob = Ppmd7_GetBinSumm(p);
- CPpmd_State *s = Ppmd7Context_OneState(p->MinContext);
- if (s->Symbol == symbol)
- {
- RangeEnc_EncodeBit_0(rc, *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob);
- p->FoundState = s;
- Ppmd7_UpdateBin(p);
- return;
- }
- else
- {
- RangeEnc_EncodeBit_1(rc, *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob);
- p->InitEsc = PPMD7_kExpEscape[*prob >> 10];
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- p->PrevSuccess = 0;
- }
- }
- for (;;)
- {
- UInt32 escFreq;
- CPpmd_See *see;
- CPpmd_State *s;
- UInt32 sum;
- unsigned i, numMasked = p->MinContext->NumStats;
- do
- {
- p->OrderFall++;
- if (!p->MinContext->Suffix)
- return; /* EndMarker (symbol = -1) */
- p->MinContext = Ppmd7_GetContext(p, p->MinContext->Suffix);
- }
- while (p->MinContext->NumStats == numMasked);
-
- see = Ppmd7_MakeEscFreq(p, numMasked, &escFreq);
- s = Ppmd7_GetStats(p, p->MinContext);
- sum = 0;
- i = p->MinContext->NumStats;
- do
- {
- int cur = s->Symbol;
- if (cur == symbol)
- {
- UInt32 low = sum;
- CPpmd_State *s1 = s;
- do
- {
- sum += (s->Freq & (int)(MASK(s->Symbol)));
- s++;
- }
- while (--i);
- RangeEnc_Encode(rc, low, s1->Freq, sum + escFreq);
- Ppmd_See_Update(see);
- p->FoundState = s1;
- Ppmd7_Update2(p);
- return;
- }
- sum += (s->Freq & (int)(MASK(cur)));
- MASK(cur) = 0;
- s++;
- }
- while (--i);
-
- RangeEnc_Encode(rc, sum, escFreq, sum + escFreq);
- see->Summ = (UInt16)(see->Summ + sum + escFreq);
- }
-}
diff --git a/src/libs/7zip/unix/C/Ppmd8.c b/src/libs/7zip/unix/C/Ppmd8.c
deleted file mode 100644
index 9187a88ef..000000000
--- a/src/libs/7zip/unix/C/Ppmd8.c
+++ /dev/null
@@ -1,1120 +0,0 @@
-/* Ppmd8.c -- PPMdI codec
-2010-03-24 : Igor Pavlov : Public domain
-This code is based on PPMd var.I (2002): Dmitry Shkarin : Public domain */
-
-#include <memory.h>
-
-#include "Ppmd8.h"
-
-const Byte PPMD8_kExpEscape[16] = { 25, 14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 };
-static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051};
-
-#define MAX_FREQ 124
-#define UNIT_SIZE 12
-
-#define U2B(nu) ((UInt32)(nu) * UNIT_SIZE)
-#define U2I(nu) (p->Units2Indx[(nu) - 1])
-#define I2U(indx) (p->Indx2Units[indx])
-
-#ifdef PPMD_32BIT
- #define REF(ptr) (ptr)
-#else
- #define REF(ptr) ((UInt32)((Byte *)(ptr) - (p)->Base))
-#endif
-
-#define STATS_REF(ptr) ((CPpmd_State_Ref)REF(ptr))
-
-#define CTX(ref) ((CPpmd8_Context *)Ppmd8_GetContext(p, ref))
-#define STATS(ctx) Ppmd8_GetStats(p, ctx)
-#define ONE_STATE(ctx) Ppmd8Context_OneState(ctx)
-#define SUFFIX(ctx) CTX((ctx)->Suffix)
-
-typedef CPpmd8_Context * CTX_PTR;
-
-struct CPpmd8_Node_;
-
-typedef
- #ifdef PPMD_32BIT
- struct CPpmd8_Node_ *
- #else
- UInt32
- #endif
- CPpmd8_Node_Ref;
-
-typedef struct CPpmd8_Node_
-{
- UInt32 Stamp;
- CPpmd8_Node_Ref Next;
- UInt32 NU;
-} CPpmd8_Node;
-
-#ifdef PPMD_32BIT
- #define NODE(ptr) (ptr)
-#else
- #define NODE(offs) ((CPpmd8_Node *)(p->Base + (offs)))
-#endif
-
-#define EMPTY_NODE 0xFFFFFFFF
-
-void Ppmd8_Construct(CPpmd8 *p)
-{
- unsigned i, k, m;
-
- p->Base = 0;
-
- for (i = 0, k = 0; i < PPMD_NUM_INDEXES; i++)
- {
- unsigned step = (i >= 12 ? 4 : (i >> 2) + 1);
- do { p->Units2Indx[k++] = (Byte)i; } while(--step);
- p->Indx2Units[i] = (Byte)k;
- }
-
- p->NS2BSIndx[0] = (0 << 1);
- p->NS2BSIndx[1] = (1 << 1);
- memset(p->NS2BSIndx + 2, (2 << 1), 9);
- memset(p->NS2BSIndx + 11, (3 << 1), 256 - 11);
-
- for (i = 0; i < 5; i++)
- p->NS2Indx[i] = (Byte)i;
- for (m = i, k = 1; i < 260; i++)
- {
- p->NS2Indx[i] = (Byte)m;
- if (--k == 0)
- k = (++m) - 4;
- }
-}
-
-void Ppmd8_Free(CPpmd8 *p, ISzAlloc *alloc)
-{
- alloc->Free(alloc, p->Base);
- p->Size = 0;
- p->Base = 0;
-}
-
-Bool Ppmd8_Alloc(CPpmd8 *p, UInt32 size, ISzAlloc *alloc)
-{
- if (p->Base == 0 || p->Size != size)
- {
- Ppmd8_Free(p, alloc);
- p->AlignOffset =
- #ifdef PPMD_32BIT
- (4 - size) & 3;
- #else
- 4 - (size & 3);
- #endif
- if ((p->Base = (Byte *)alloc->Alloc(alloc, p->AlignOffset + size)) == 0)
- return False;
- p->Size = size;
- }
- return True;
-}
-
-static void InsertNode(CPpmd8 *p, void *node, unsigned indx)
-{
- ((CPpmd8_Node *)node)->Stamp = EMPTY_NODE;
- ((CPpmd8_Node *)node)->Next = (CPpmd8_Node_Ref)p->FreeList[indx];
- ((CPpmd8_Node *)node)->NU = I2U(indx);
- p->FreeList[indx] = REF(node);
- p->Stamps[indx]++;
-}
-
-static void *RemoveNode(CPpmd8 *p, unsigned indx)
-{
- CPpmd8_Node *node = NODE((CPpmd8_Node_Ref)p->FreeList[indx]);
- p->FreeList[indx] = node->Next;
- p->Stamps[indx]--;
- return node;
-}
-
-static void SplitBlock(CPpmd8 *p, void *ptr, unsigned oldIndx, unsigned newIndx)
-{
- unsigned i, nu = I2U(oldIndx) - I2U(newIndx);
- ptr = (Byte *)ptr + U2B(I2U(newIndx));
- if (I2U(i = U2I(nu)) != nu)
- {
- unsigned k = I2U(--i);
- InsertNode(p, ((Byte *)ptr) + U2B(k), nu - k - 1);
- }
- InsertNode(p, ptr, i);
-}
-
-static void GlueFreeBlocks(CPpmd8 *p)
-{
- CPpmd8_Node_Ref head = 0;
- CPpmd8_Node_Ref *prev = &head;
- unsigned i;
-
- p->GlueCount = 1 << 13;
- memset(p->Stamps, 0, sizeof(p->Stamps));
-
- /* Order-0 context is always at top UNIT, so we don't need guard NODE at the end.
- All blocks up to p->LoUnit can be free, so we need guard NODE at LoUnit. */
- if (p->LoUnit != p->HiUnit)
- ((CPpmd8_Node *)p->LoUnit)->Stamp = 0;
-
- /* Glue free blocks */
- for (i = 0; i < PPMD_NUM_INDEXES; i++)
- {
- CPpmd8_Node_Ref next = (CPpmd8_Node_Ref)p->FreeList[i];
- p->FreeList[i] = 0;
- while (next != 0)
- {
- CPpmd8_Node *node = NODE(next);
- if (node->NU != 0)
- {
- CPpmd8_Node *node2;
- *prev = next;
- prev = &(node->Next);
- while ((node2 = node + node->NU)->Stamp == EMPTY_NODE)
- {
- node->NU += node2->NU;
- node2->NU = 0;
- }
- }
- next = node->Next;
- }
- }
- *prev = 0;
-
- /* Fill lists of free blocks */
- while (head != 0)
- {
- CPpmd8_Node *node = NODE(head);
- unsigned nu;
- head = node->Next;
- nu = node->NU;
- if (nu == 0)
- continue;
- for (; nu > 128; nu -= 128, node += 128)
- InsertNode(p, node, PPMD_NUM_INDEXES - 1);
- if (I2U(i = U2I(nu)) != nu)
- {
- unsigned k = I2U(--i);
- InsertNode(p, node + k, nu - k - 1);
- }
- InsertNode(p, node, i);
- }
-}
-
-static void *AllocUnitsRare(CPpmd8 *p, unsigned indx)
-{
- unsigned i;
- void *retVal;
- if (p->GlueCount == 0)
- {
- GlueFreeBlocks(p);
- if (p->FreeList[indx] != 0)
- return RemoveNode(p, indx);
- }
- i = indx;
- do
- {
- if (++i == PPMD_NUM_INDEXES)
- {
- UInt32 numBytes = U2B(I2U(indx));
- p->GlueCount--;
- return ((UInt32)(p->UnitsStart - p->Text) > numBytes) ? (p->UnitsStart -= numBytes) : (NULL);
- }
- }
- while (p->FreeList[i] == 0);
- retVal = RemoveNode(p, i);
- SplitBlock(p, retVal, i, indx);
- return retVal;
-}
-
-static void *AllocUnits(CPpmd8 *p, unsigned indx)
-{
- UInt32 numBytes;
- if (p->FreeList[indx] != 0)
- return RemoveNode(p, indx);
- numBytes = U2B(I2U(indx));
- if (numBytes <= (UInt32)(p->HiUnit - p->LoUnit))
- {
- void *retVal = p->LoUnit;
- p->LoUnit += numBytes;
- return retVal;
- }
- return AllocUnitsRare(p, indx);
-}
-
-#define MyMem12Cpy(dest, src, num) \
- { UInt32 *d = (UInt32 *)dest; const UInt32 *s = (const UInt32 *)src; UInt32 n = num; \
- do { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; s += 3; d += 3; } while(--n); }
-
-static void *ShrinkUnits(CPpmd8 *p, void *oldPtr, unsigned oldNU, unsigned newNU)
-{
- unsigned i0 = U2I(oldNU);
- unsigned i1 = U2I(newNU);
- if (i0 == i1)
- return oldPtr;
- if (p->FreeList[i1] != 0)
- {
- void *ptr = RemoveNode(p, i1);
- MyMem12Cpy(ptr, oldPtr, newNU);
- InsertNode(p, oldPtr, i0);
- return ptr;
- }
- SplitBlock(p, oldPtr, i0, i1);
- return oldPtr;
-}
-
-static void FreeUnits(CPpmd8 *p, void *ptr, unsigned nu)
-{
- InsertNode(p, ptr, U2I(nu));
-}
-
-static void SpecialFreeUnit(CPpmd8 *p, void *ptr)
-{
- if ((Byte *)ptr != p->UnitsStart)
- InsertNode(p, ptr, 0);
- else
- {
- #ifdef PPMD8_FREEZE_SUPPORT
- *(UInt32 *)ptr = EMPTY_NODE; /* it's used for (Flags == 0xFF) check in RemoveBinContexts */
- #endif
- p->UnitsStart += UNIT_SIZE;
- }
-}
-
-static void *MoveUnitsUp(CPpmd8 *p, void *oldPtr, unsigned nu)
-{
- unsigned indx = U2I(nu);
- void *ptr;
- if ((Byte *)oldPtr > p->UnitsStart + 16 * 1024 || REF(oldPtr) > p->FreeList[indx])
- return oldPtr;
- ptr = RemoveNode(p, indx);
- MyMem12Cpy(ptr, oldPtr, nu);
- if ((Byte*)oldPtr != p->UnitsStart)
- InsertNode(p, oldPtr, indx);
- else
- p->UnitsStart += U2B(I2U(indx));
- return ptr;
-}
-
-static void ExpandTextArea(CPpmd8 *p)
-{
- UInt32 count[PPMD_NUM_INDEXES];
- unsigned i;
- memset(count, 0, sizeof(count));
- if (p->LoUnit != p->HiUnit)
- ((CPpmd8_Node *)p->LoUnit)->Stamp = 0;
-
- {
- CPpmd8_Node *node = (CPpmd8_Node *)p->UnitsStart;
- for (; node->Stamp == EMPTY_NODE; node += node->NU)
- {
- node->Stamp = 0;
- count[U2I(node->NU)]++;
- }
- p->UnitsStart = (Byte *)node;
- }
-
- for (i = 0; i < PPMD_NUM_INDEXES; i++)
- {
- CPpmd8_Node_Ref *next = (CPpmd8_Node_Ref *)&p->FreeList[i];
- while (count[i] != 0)
- {
- CPpmd8_Node *node = NODE(*next);
- while (node->Stamp == 0)
- {
- *next = node->Next;
- node = NODE(*next);
- p->Stamps[i]--;
- if (--count[i] == 0)
- break;
- }
- next = &node->Next;
- }
- }
-}
-
-#define SUCCESSOR(p) ((CPpmd_Void_Ref)((p)->SuccessorLow | ((UInt32)(p)->SuccessorHigh << 16)))
-
-static void SetSuccessor(CPpmd_State *p, CPpmd_Void_Ref v)
-{
- (p)->SuccessorLow = (UInt16)((UInt32)(v) & 0xFFFF);
- (p)->SuccessorHigh = (UInt16)(((UInt32)(v) >> 16) & 0xFFFF);
-}
-
-#define RESET_TEXT(offs) { p->Text = p->Base + p->AlignOffset + (offs); }
-
-static void RestartModel(CPpmd8 *p)
-{
- unsigned i, k, m, r;
-
- memset(p->FreeList, 0, sizeof(p->FreeList));
- memset(p->Stamps, 0, sizeof(p->Stamps));
- RESET_TEXT(0);
- p->HiUnit = p->Text + p->Size;
- p->LoUnit = p->UnitsStart = p->HiUnit - p->Size / 8 / UNIT_SIZE * 7 * UNIT_SIZE;
- p->GlueCount = 0;
-
- p->OrderFall = p->MaxOrder;
- p->RunLength = p->InitRL = -(Int32)((p->MaxOrder < 12) ? p->MaxOrder : 12) - 1;
- p->PrevSuccess = 0;
-
- p->MinContext = p->MaxContext = (CTX_PTR)(p->HiUnit -= UNIT_SIZE); /* AllocContext(p); */
- p->MinContext->Suffix = 0;
- p->MinContext->NumStats = 255;
- p->MinContext->Flags = 0;
- p->MinContext->SummFreq = 256 + 1;
- p->FoundState = (CPpmd_State *)p->LoUnit; /* AllocUnits(p, PPMD_NUM_INDEXES - 1); */
- p->LoUnit += U2B(256 / 2);
- p->MinContext->Stats = REF(p->FoundState);
- for (i = 0; i < 256; i++)
- {
- CPpmd_State *s = &p->FoundState[i];
- s->Symbol = (Byte)i;
- s->Freq = 1;
- SetSuccessor(s, 0);
- }
-
- for (i = m = 0; m < 25; m++)
- {
- while (p->NS2Indx[i] == m)
- i++;
- for (k = 0; k < 8; k++)
- {
- UInt16 val = (UInt16)(PPMD_BIN_SCALE - kInitBinEsc[k] / (i + 1));
- UInt16 *dest = p->BinSumm[m] + k;
- for (r = 0; r < 64; r += 8)
- dest[r] = val;
- }
- }
-
- for (i = m = 0; m < 24; m++)
- {
- while (p->NS2Indx[i + 3] == m + 3)
- i++;
- for (k = 0; k < 32; k++)
- {
- CPpmd_See *s = &p->See[m][k];
- s->Summ = (UInt16)((2 * i + 5) << (s->Shift = PPMD_PERIOD_BITS - 4));
- s->Count = 7;
- }
- }
-}
-
-void Ppmd8_Init(CPpmd8 *p, unsigned maxOrder, unsigned restoreMethod)
-{
- p->MaxOrder = maxOrder;
- p->RestoreMethod = restoreMethod;
- RestartModel(p);
- p->DummySee.Shift = PPMD_PERIOD_BITS;
- p->DummySee.Summ = 0; /* unused */
- p->DummySee.Count = 64; /* unused */
-}
-
-static void Refresh(CPpmd8 *p, CTX_PTR ctx, unsigned oldNU, unsigned scale)
-{
- unsigned i = ctx->NumStats, escFreq, sumFreq, flags;
- CPpmd_State *s = (CPpmd_State *)ShrinkUnits(p, STATS(ctx), oldNU, (i + 2) >> 1);
- ctx->Stats = REF(s);
- #ifdef PPMD8_FREEZE_SUPPORT
- /* fixed over Shkarin's code. Fixed code is not compatible with original code for some files in FREEZE mode. */
- scale |= (ctx->SummFreq >= ((UInt32)1 << 15));
- #endif
- flags = (ctx->Flags & (0x10 + 0x04 * scale)) + 0x08 * (s->Symbol >= 0x40);
- escFreq = ctx->SummFreq - s->Freq;
- sumFreq = (s->Freq = (Byte)((s->Freq + scale) >> scale));
- do
- {
- escFreq -= (++s)->Freq;
- sumFreq += (s->Freq = (Byte)((s->Freq + scale) >> scale));
- flags |= 0x08 * (s->Symbol >= 0x40);
- }
- while (--i);
- ctx->SummFreq = (UInt16)(sumFreq + ((escFreq + scale) >> scale));
- ctx->Flags = (Byte)flags;
-}
-
-static void SwapStates(CPpmd_State *t1, CPpmd_State *t2)
-{
- CPpmd_State tmp = *t1;
- *t1 = *t2;
- *t2 = tmp;
-}
-
-static CPpmd_Void_Ref CutOff(CPpmd8 *p, CTX_PTR ctx, unsigned order)
-{
- int i;
- unsigned tmp;
- CPpmd_State *s;
-
- if (!ctx->NumStats)
- {
- s = ONE_STATE(ctx);
- if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) >= p->UnitsStart)
- {
- if (order < p->MaxOrder)
- SetSuccessor(s, CutOff(p, CTX(SUCCESSOR(s)), order + 1));
- else
- SetSuccessor(s, 0);
- if (SUCCESSOR(s) || order <= 9) /* O_BOUND */
- return REF(ctx);
- }
- SpecialFreeUnit(p, ctx);
- return 0;
- }
-
- ctx->Stats = STATS_REF(MoveUnitsUp(p, STATS(ctx), tmp = ((unsigned)ctx->NumStats + 2) >> 1));
-
- for (s = STATS(ctx) + (i = ctx->NumStats); s >= STATS(ctx); s--)
- if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) < p->UnitsStart)
- {
- CPpmd_State *s2 = STATS(ctx) + (i--);
- SetSuccessor(s, 0);
- SwapStates(s, s2);
- }
- else if (order < p->MaxOrder)
- SetSuccessor(s, CutOff(p, CTX(SUCCESSOR(s)), order + 1));
- else
- SetSuccessor(s, 0);
-
- if (i != ctx->NumStats && order)
- {
- ctx->NumStats = (Byte)i;
- s = STATS(ctx);
- if (i < 0)
- {
- FreeUnits(p, s, tmp);
- SpecialFreeUnit(p, ctx);
- return 0;
- }
- if (i == 0)
- {
- ctx->Flags = (ctx->Flags & 0x10) + 0x08 * (s->Symbol >= 0x40);
- *ONE_STATE(ctx) = *s;
- FreeUnits(p, s, tmp);
- ONE_STATE(ctx)->Freq = (Byte)((unsigned)ONE_STATE(ctx)->Freq + 11) >> 3;
- }
- else
- Refresh(p, ctx, tmp, ctx->SummFreq > 16 * i);
- }
- return REF(ctx);
-}
-
-#ifdef PPMD8_FREEZE_SUPPORT
-static CPpmd_Void_Ref RemoveBinContexts(CPpmd8 *p, CTX_PTR ctx, unsigned order)
-{
- CPpmd_State *s;
- if (!ctx->NumStats)
- {
- s = ONE_STATE(ctx);
- if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) >= p->UnitsStart && order < p->MaxOrder)
- SetSuccessor(s, RemoveBinContexts(p, CTX(SUCCESSOR(s)), order + 1));
- else
- SetSuccessor(s, 0);
- /* Suffix context can be removed already, since different (high-order)
- Successors may refer to same context. So we check Flags == 0xFF (Stamp == EMPTY_NODE) */
- if (!SUCCESSOR(s) && (!SUFFIX(ctx)->NumStats || SUFFIX(ctx)->Flags == 0xFF))
- {
- FreeUnits(p, ctx, 1);
- return 0;
- }
- else
- return REF(ctx);
- }
-
- for (s = STATS(ctx) + ctx->NumStats; s >= STATS(ctx); s--)
- if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) >= p->UnitsStart && order < p->MaxOrder)
- SetSuccessor(s, RemoveBinContexts(p, CTX(SUCCESSOR(s)), order + 1));
- else
- SetSuccessor(s, 0);
-
- return REF(ctx);
-}
-#endif
-
-static UInt32 GetUsedMemory(const CPpmd8 *p)
-{
- UInt32 v = 0;
- unsigned i;
- for (i = 0; i < PPMD_NUM_INDEXES; i++)
- v += p->Stamps[i] * I2U(i);
- return p->Size - (UInt32)(p->HiUnit - p->LoUnit) - (UInt32)(p->UnitsStart - p->Text) - U2B(v);
-}
-
-#ifdef PPMD8_FREEZE_SUPPORT
- #define RESTORE_MODEL(c1, fSuccessor) RestoreModel(p, c1, fSuccessor)
-#else
- #define RESTORE_MODEL(c1, fSuccessor) RestoreModel(p, c1)
-#endif
-
-static void RestoreModel(CPpmd8 *p, CTX_PTR c1
- #ifdef PPMD8_FREEZE_SUPPORT
- , CTX_PTR fSuccessor
- #endif
- )
-{
- CTX_PTR c;
- CPpmd_State *s;
- RESET_TEXT(0);
- for (c = p->MaxContext; c != c1; c = SUFFIX(c))
- if (--(c->NumStats) == 0)
- {
- s = STATS(c);
- c->Flags = (c->Flags & 0x10) + 0x08 * (s->Symbol >= 0x40);
- *ONE_STATE(c) = *s;
- SpecialFreeUnit(p, s);
- ONE_STATE(c)->Freq = (ONE_STATE(c)->Freq + 11) >> 3;
- }
- else
- Refresh(p, c, (c->NumStats+3) >> 1, 0);
-
- for (; c != p->MinContext; c = SUFFIX(c))
- if (!c->NumStats)
- ONE_STATE(c)->Freq -= ONE_STATE(c)->Freq >> 1;
- else if ((c->SummFreq += 4) > 128 + 4 * c->NumStats)
- Refresh(p, c, (c->NumStats + 2) >> 1, 1);
-
- #ifdef PPMD8_FREEZE_SUPPORT
- if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE)
- {
- p->MaxContext = fSuccessor;
- p->GlueCount += !(p->Stamps[1] & 1);
- }
- else if (p->RestoreMethod == PPMD8_RESTORE_METHOD_FREEZE)
- {
- while (p->MaxContext->Suffix)
- p->MaxContext = SUFFIX(p->MaxContext);
- RemoveBinContexts(p, p->MaxContext, 0);
- p->RestoreMethod++;
- p->GlueCount = 0;
- p->OrderFall = p->MaxOrder;
- }
- else
- #endif
- if (p->RestoreMethod == PPMD8_RESTORE_METHOD_RESTART || GetUsedMemory(p) < (p->Size >> 1))
- RestartModel(p);
- else
- {
- while (p->MaxContext->Suffix)
- p->MaxContext = SUFFIX(p->MaxContext);
- do
- {
- CutOff(p, p->MaxContext, 0);
- ExpandTextArea(p);
- }
- while (GetUsedMemory(p) > 3 * (p->Size >> 2));
- p->GlueCount = 0;
- p->OrderFall = p->MaxOrder;
- }
-}
-
-static CTX_PTR CreateSuccessors(CPpmd8 *p, Bool skip, CPpmd_State *s1, CTX_PTR c)
-{
- CPpmd_State upState;
- Byte flags;
- CPpmd_Byte_Ref upBranch = (CPpmd_Byte_Ref)SUCCESSOR(p->FoundState);
- /* fixed over Shkarin's code. Maybe it could work without + 1 too. */
- CPpmd_State *ps[PPMD8_MAX_ORDER + 1];
- unsigned numPs = 0;
-
- if (!skip)
- ps[numPs++] = p->FoundState;
-
- while (c->Suffix)
- {
- CPpmd_Void_Ref successor;
- CPpmd_State *s;
- c = SUFFIX(c);
- if (s1)
- {
- s = s1;
- s1 = NULL;
- }
- else if (c->NumStats != 0)
- {
- for (s = STATS(c); s->Symbol != p->FoundState->Symbol; s++);
- if (s->Freq < MAX_FREQ - 9)
- {
- s->Freq++;
- c->SummFreq++;
- }
- }
- else
- {
- s = ONE_STATE(c);
- s->Freq += (!SUFFIX(c)->NumStats & (s->Freq < 24));
- }
- successor = SUCCESSOR(s);
- if (successor != upBranch)
- {
- c = CTX(successor);
- if (numPs == 0)
- return c;
- break;
- }
- ps[numPs++] = s;
- }
-
- upState.Symbol = *(const Byte *)Ppmd8_GetPtr(p, upBranch);
- SetSuccessor(&upState, upBranch + 1);
- flags = 0x10 * (p->FoundState->Symbol >= 0x40) + 0x08 * (upState.Symbol >= 0x40);
-
- if (c->NumStats == 0)
- upState.Freq = ONE_STATE(c)->Freq;
- else
- {
- UInt32 cf, s0;
- CPpmd_State *s;
- for (s = STATS(c); s->Symbol != upState.Symbol; s++);
- cf = s->Freq - 1;
- s0 = c->SummFreq - c->NumStats - cf;
- upState.Freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : ((cf + 2 * s0 - 3) / s0)));
- }
-
- do
- {
- /* Create Child */
- CTX_PTR c1; /* = AllocContext(p); */
- if (p->HiUnit != p->LoUnit)
- c1 = (CTX_PTR)(p->HiUnit -= UNIT_SIZE);
- else if (p->FreeList[0] != 0)
- c1 = (CTX_PTR)RemoveNode(p, 0);
- else
- {
- c1 = (CTX_PTR)AllocUnitsRare(p, 0);
- if (!c1)
- return NULL;
- }
- c1->NumStats = 0;
- c1->Flags = flags;
- *ONE_STATE(c1) = upState;
- c1->Suffix = REF(c);
- SetSuccessor(ps[--numPs], REF(c1));
- c = c1;
- }
- while (numPs != 0);
-
- return c;
-}
-
-static CTX_PTR ReduceOrder(CPpmd8 *p, CPpmd_State *s1, CTX_PTR c)
-{
- CPpmd_State *s = NULL;
- CTX_PTR c1 = c;
- CPpmd_Void_Ref upBranch = REF(p->Text);
-
- #ifdef PPMD8_FREEZE_SUPPORT
- /* The BUG in Shkarin's code was fixed: ps could overflow in CUT_OFF mode. */
- CPpmd_State *ps[PPMD8_MAX_ORDER + 1];
- unsigned numPs = 0;
- ps[numPs++] = p->FoundState;
- #endif
-
- SetSuccessor(p->FoundState, upBranch);
- p->OrderFall++;
-
- for (;;)
- {
- if (s1)
- {
- c = SUFFIX(c);
- s = s1;
- s1 = NULL;
- }
- else
- {
- if (!c->Suffix)
- {
- #ifdef PPMD8_FREEZE_SUPPORT
- if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE)
- {
- do { SetSuccessor(ps[--numPs], REF(c)); } while (numPs);
- RESET_TEXT(1);
- p->OrderFall = 1;
- }
- #endif
- return c;
- }
- c = SUFFIX(c);
- if (c->NumStats)
- {
- if ((s = STATS(c))->Symbol != p->FoundState->Symbol)
- do { s++; } while (s->Symbol != p->FoundState->Symbol);
- if (s->Freq < MAX_FREQ - 9)
- {
- s->Freq += 2;
- c->SummFreq += 2;
- }
- }
- else
- {
- s = ONE_STATE(c);
- s->Freq += (s->Freq < 32);
- }
- }
- if (SUCCESSOR(s))
- break;
- #ifdef PPMD8_FREEZE_SUPPORT
- ps[numPs++] = s;
- #endif
- SetSuccessor(s, upBranch);
- p->OrderFall++;
- }
-
- #ifdef PPMD8_FREEZE_SUPPORT
- if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE)
- {
- c = CTX(SUCCESSOR(s));
- do { SetSuccessor(ps[--numPs], REF(c)); } while (numPs);
- RESET_TEXT(1);
- p->OrderFall = 1;
- return c;
- }
- else
- #endif
- if (SUCCESSOR(s) <= upBranch)
- {
- CTX_PTR successor;
- CPpmd_State *s1 = p->FoundState;
- p->FoundState = s;
-
- successor = CreateSuccessors(p, False, NULL, c);
- if (successor == NULL)
- SetSuccessor(s, 0);
- else
- SetSuccessor(s, REF(successor));
- p->FoundState = s1;
- }
-
- if (p->OrderFall == 1 && c1 == p->MaxContext)
- {
- SetSuccessor(p->FoundState, SUCCESSOR(s));
- p->Text--;
- }
- if (SUCCESSOR(s) == 0)
- return NULL;
- return CTX(SUCCESSOR(s));
-}
-
-static void UpdateModel(CPpmd8 *p)
-{
- CPpmd_Void_Ref successor, fSuccessor = SUCCESSOR(p->FoundState);
- CTX_PTR c;
- unsigned s0, ns, fFreq = p->FoundState->Freq;
- Byte flag, fSymbol = p->FoundState->Symbol;
- CPpmd_State *s = NULL;
-
- if (p->FoundState->Freq < MAX_FREQ / 4 && p->MinContext->Suffix != 0)
- {
- c = SUFFIX(p->MinContext);
-
- if (c->NumStats == 0)
- {
- s = ONE_STATE(c);
- if (s->Freq < 32)
- s->Freq++;
- }
- else
- {
- s = STATS(c);
- if (s->Symbol != p->FoundState->Symbol)
- {
- do { s++; } while (s->Symbol != p->FoundState->Symbol);
- if (s[0].Freq >= s[-1].Freq)
- {
- SwapStates(&s[0], &s[-1]);
- s--;
- }
- }
- if (s->Freq < MAX_FREQ - 9)
- {
- s->Freq += 2;
- c->SummFreq += 2;
- }
- }
- }
-
- c = p->MaxContext;
- if (p->OrderFall == 0 && fSuccessor)
- {
- CTX_PTR cs = CreateSuccessors(p, True, s, p->MinContext);
- if (cs == 0)
- {
- SetSuccessor(p->FoundState, 0);
- RESTORE_MODEL(c, CTX(fSuccessor));
- }
- else
- {
- SetSuccessor(p->FoundState, REF(cs));
- p->MaxContext = cs;
- }
- return;
- }
-
- *p->Text++ = p->FoundState->Symbol;
- successor = REF(p->Text);
- if (p->Text >= p->UnitsStart)
- {
- RESTORE_MODEL(c, CTX(fSuccessor)); /* check it */
- return;
- }
-
- if (!fSuccessor)
- {
- CTX_PTR cs = ReduceOrder(p, s, p->MinContext);
- if (cs == NULL)
- {
- RESTORE_MODEL(c, 0);
- return;
- }
- fSuccessor = REF(cs);
- }
- else if ((Byte *)Ppmd8_GetPtr(p, fSuccessor) < p->UnitsStart)
- {
- CTX_PTR cs = CreateSuccessors(p, False, s, p->MinContext);
- if (cs == NULL)
- {
- RESTORE_MODEL(c, 0);
- return;
- }
- fSuccessor = REF(cs);
- }
-
- if (--p->OrderFall == 0)
- {
- successor = fSuccessor;
- p->Text -= (p->MaxContext != p->MinContext);
- }
- #ifdef PPMD8_FREEZE_SUPPORT
- else if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE)
- {
- successor = fSuccessor;
- RESET_TEXT(0);
- p->OrderFall = 0;
- }
- #endif
-
- s0 = p->MinContext->SummFreq - (ns = p->MinContext->NumStats) - fFreq;
- flag = 0x08 * (fSymbol >= 0x40);
-
- for (; c != p->MinContext; c = SUFFIX(c))
- {
- unsigned ns1;
- UInt32 cf, sf;
- if ((ns1 = c->NumStats) != 0)
- {
- if ((ns1 & 1) != 0)
- {
- /* Expand for one UNIT */
- unsigned oldNU = (ns1 + 1) >> 1;
- unsigned i = U2I(oldNU);
- if (i != U2I(oldNU + 1))
- {
- void *ptr = AllocUnits(p, i + 1);
- void *oldPtr;
- if (!ptr)
- {
- RESTORE_MODEL(c, CTX(fSuccessor));
- return;
- }
- oldPtr = STATS(c);
- MyMem12Cpy(ptr, oldPtr, oldNU);
- InsertNode(p, oldPtr, i);
- c->Stats = STATS_REF(ptr);
- }
- }
- c->SummFreq = (UInt16)(c->SummFreq + (3 * ns1 + 1 < ns));
- }
- else
- {
- CPpmd_State *s = (CPpmd_State*)AllocUnits(p, 0);
- if (!s)
- {
- RESTORE_MODEL(c, CTX(fSuccessor));
- return;
- }
- *s = *ONE_STATE(c);
- c->Stats = REF(s);
- if (s->Freq < MAX_FREQ / 4 - 1)
- s->Freq <<= 1;
- else
- s->Freq = MAX_FREQ - 4;
- c->SummFreq = (UInt16)(s->Freq + p->InitEsc + (ns > 2));
- }
- cf = 2 * fFreq * (c->SummFreq + 6);
- sf = (UInt32)s0 + c->SummFreq;
- if (cf < 6 * sf)
- {
- cf = 1 + (cf > sf) + (cf >= 4 * sf);
- c->SummFreq += 4;
- }
- else
- {
- cf = 4 + (cf > 9 * sf) + (cf > 12 * sf) + (cf > 15 * sf);
- c->SummFreq = (UInt16)(c->SummFreq + cf);
- }
- {
- CPpmd_State *s = STATS(c) + ns1 + 1;
- SetSuccessor(s, successor);
- s->Symbol = fSymbol;
- s->Freq = (Byte)cf;
- c->Flags |= flag;
- c->NumStats = (Byte)(ns1 + 1);
- }
- }
- p->MaxContext = p->MinContext = CTX(fSuccessor);
-}
-
-static void Rescale(CPpmd8 *p)
-{
- unsigned i, adder, sumFreq, escFreq;
- CPpmd_State *stats = STATS(p->MinContext);
- CPpmd_State *s = p->FoundState;
- {
- CPpmd_State tmp = *s;
- for (; s != stats; s--)
- s[0] = s[-1];
- *s = tmp;
- }
- escFreq = p->MinContext->SummFreq - s->Freq;
- s->Freq += 4;
- adder = (p->OrderFall != 0
- #ifdef PPMD8_FREEZE_SUPPORT
- || p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE
- #endif
- );
- s->Freq = (Byte)((s->Freq + adder) >> 1);
- sumFreq = s->Freq;
-
- i = p->MinContext->NumStats;
- do
- {
- escFreq -= (++s)->Freq;
- s->Freq = (Byte)((s->Freq + adder) >> 1);
- sumFreq += s->Freq;
- if (s[0].Freq > s[-1].Freq)
- {
- CPpmd_State *s1 = s;
- CPpmd_State tmp = *s1;
- do
- s1[0] = s1[-1];
- while (--s1 != stats && tmp.Freq > s1[-1].Freq);
- *s1 = tmp;
- }
- }
- while (--i);
-
- if (s->Freq == 0)
- {
- unsigned numStats = p->MinContext->NumStats;
- unsigned n0, n1;
- do { i++; } while ((--s)->Freq == 0);
- escFreq += i;
- p->MinContext->NumStats = (Byte)(p->MinContext->NumStats - i);
- if (p->MinContext->NumStats == 0)
- {
- CPpmd_State tmp = *stats;
- tmp.Freq = (Byte)((2 * tmp.Freq + escFreq - 1) / escFreq);
- if (tmp.Freq > MAX_FREQ / 3)
- tmp.Freq = MAX_FREQ / 3;
- InsertNode(p, stats, U2I((numStats + 2) >> 1));
- p->MinContext->Flags = (p->MinContext->Flags & 0x10) + 0x08 * (tmp.Symbol >= 0x40);
- *(p->FoundState = ONE_STATE(p->MinContext)) = tmp;
- return;
- }
- n0 = (numStats + 2) >> 1;
- n1 = (p->MinContext->NumStats + 2) >> 1;
- if (n0 != n1)
- p->MinContext->Stats = STATS_REF(ShrinkUnits(p, stats, n0, n1));
- p->MinContext->Flags &= ~0x08;
- p->MinContext->Flags |= 0x08 * ((s = STATS(p->MinContext))->Symbol >= 0x40);
- i = p->MinContext->NumStats;
- do { p->MinContext->Flags |= 0x08*((++s)->Symbol >= 0x40); } while (--i);
- }
- p->MinContext->SummFreq = (UInt16)(sumFreq + escFreq - (escFreq >> 1));
- p->MinContext->Flags |= 0x4;
- p->FoundState = STATS(p->MinContext);
-}
-
-CPpmd_See *Ppmd8_MakeEscFreq(CPpmd8 *p, unsigned numMasked1, UInt32 *escFreq)
-{
- CPpmd_See *see;
- if (p->MinContext->NumStats != 0xFF)
- {
- see = p->See[p->NS2Indx[p->MinContext->NumStats + 2] - 3] +
- (p->MinContext->SummFreq > 11 * ((unsigned)p->MinContext->NumStats + 1)) +
- 2 * (2 * (unsigned)p->MinContext->NumStats <
- ((unsigned)SUFFIX(p->MinContext)->NumStats + numMasked1)) +
- p->MinContext->Flags;
- {
- unsigned r = (see->Summ >> see->Shift);
- see->Summ = (UInt16)(see->Summ - r);
- *escFreq = r + (r == 0);
- }
- }
- else
- {
- see = &p->DummySee;
- *escFreq = 1;
- }
- return see;
-}
-
-static void NextContext(CPpmd8 *p)
-{
- CTX_PTR c = CTX(SUCCESSOR(p->FoundState));
- if (p->OrderFall == 0 && (Byte *)c >= p->UnitsStart)
- p->MinContext = p->MaxContext = c;
- else
- {
- UpdateModel(p);
- p->MinContext = p->MaxContext;
- }
-}
-
-void Ppmd8_Update1(CPpmd8 *p)
-{
- CPpmd_State *s = p->FoundState;
- s->Freq += 4;
- p->MinContext->SummFreq += 4;
- if (s[0].Freq > s[-1].Freq)
- {
- SwapStates(&s[0], &s[-1]);
- p->FoundState = --s;
- if (s->Freq > MAX_FREQ)
- Rescale(p);
- }
- NextContext(p);
-}
-
-void Ppmd8_Update1_0(CPpmd8 *p)
-{
- p->PrevSuccess = (2 * p->FoundState->Freq >= p->MinContext->SummFreq);
- p->RunLength += p->PrevSuccess;
- p->MinContext->SummFreq += 4;
- if ((p->FoundState->Freq += 4) > MAX_FREQ)
- Rescale(p);
- NextContext(p);
-}
-
-void Ppmd8_UpdateBin(CPpmd8 *p)
-{
- p->FoundState->Freq = (Byte)(p->FoundState->Freq + (p->FoundState->Freq < 196));
- p->PrevSuccess = 1;
- p->RunLength++;
- NextContext(p);
-}
-
-void Ppmd8_Update2(CPpmd8 *p)
-{
- p->MinContext->SummFreq += 4;
- if ((p->FoundState->Freq += 4) > MAX_FREQ)
- Rescale(p);
- p->RunLength = p->InitRL;
- UpdateModel(p);
- p->MinContext = p->MaxContext;
-}
-
-/* H->I changes:
- NS2Indx
- GlewCount, and Glue method
- BinSum
- See / EscFreq
- CreateSuccessors updates more suffix contexts
- UpdateModel consts.
- PrevSuccess Update
-*/
diff --git a/src/libs/7zip/unix/C/Ppmd8.h b/src/libs/7zip/unix/C/Ppmd8.h
deleted file mode 100644
index 870dc9dd8..000000000
--- a/src/libs/7zip/unix/C/Ppmd8.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/* Ppmd8.h -- PPMdI codec
-2010-03-24 : Igor Pavlov : Public domain
-This code is based on:
- PPMd var.I (2002): Dmitry Shkarin : Public domain
- Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#ifndef __PPMD8_H
-#define __PPMD8_H
-
-#include "Ppmd.h"
-
-EXTERN_C_BEGIN
-
-#define PPMD8_MIN_ORDER 2
-#define PPMD8_MAX_ORDER 16
-
-struct CPpmd8_Context_;
-
-typedef
- #ifdef PPMD_32BIT
- struct CPpmd8_Context_ *
- #else
- UInt32
- #endif
- CPpmd8_Context_Ref;
-
-typedef struct CPpmd8_Context_
-{
- Byte NumStats;
- Byte Flags;
- UInt16 SummFreq;
- CPpmd_State_Ref Stats;
- CPpmd8_Context_Ref Suffix;
-} CPpmd8_Context;
-
-#define Ppmd8Context_OneState(p) ((CPpmd_State *)&(p)->SummFreq)
-
-/* The BUG in Shkarin's code for FREEZE mode was fixed, but that fixed
- code is not compatible with original code for some files compressed
- in FREEZE mode. So we disable FREEZE mode support. */
-
-enum
-{
- PPMD8_RESTORE_METHOD_RESTART,
- PPMD8_RESTORE_METHOD_CUT_OFF
- #ifdef PPMD8_FREEZE_SUPPORT
- , PPMD8_RESTORE_METHOD_FREEZE
- #endif
-};
-
-typedef struct
-{
- CPpmd8_Context *MinContext, *MaxContext;
- CPpmd_State *FoundState;
- unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder;
- Int32 RunLength, InitRL; /* must be 32-bit at least */
-
- UInt32 Size;
- UInt32 GlueCount;
- Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart;
- UInt32 AlignOffset;
- unsigned RestoreMethod;
-
- /* Range Coder */
- UInt32 Range;
- UInt32 Code;
- UInt32 Low;
- union
- {
- IByteIn *In;
- IByteOut *Out;
- } Stream;
-
- Byte Indx2Units[PPMD_NUM_INDEXES];
- Byte Units2Indx[128];
- CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES];
- UInt32 Stamps[PPMD_NUM_INDEXES];
-
- Byte NS2BSIndx[256], NS2Indx[260];
- CPpmd_See DummySee, See[24][32];
- UInt16 BinSumm[25][64];
-} CPpmd8;
-
-void Ppmd8_Construct(CPpmd8 *p);
-Bool Ppmd8_Alloc(CPpmd8 *p, UInt32 size, ISzAlloc *alloc);
-void Ppmd8_Free(CPpmd8 *p, ISzAlloc *alloc);
-void Ppmd8_Init(CPpmd8 *p, unsigned maxOrder, unsigned restoreMethod);
-#define Ppmd8_WasAllocated(p) ((p)->Base != NULL)
-
-
-/* ---------- Internal Functions ---------- */
-
-extern const Byte PPMD8_kExpEscape[16];
-
-#ifdef PPMD_32BIT
- #define Ppmd8_GetPtr(p, ptr) (ptr)
- #define Ppmd8_GetContext(p, ptr) (ptr)
- #define Ppmd8_GetStats(p, ctx) ((ctx)->Stats)
-#else
- #define Ppmd8_GetPtr(p, offs) ((void *)((p)->Base + (offs)))
- #define Ppmd8_GetContext(p, offs) ((CPpmd8_Context *)Ppmd8_GetPtr((p), (offs)))
- #define Ppmd8_GetStats(p, ctx) ((CPpmd_State *)Ppmd8_GetPtr((p), ((ctx)->Stats)))
-#endif
-
-void Ppmd8_Update1(CPpmd8 *p);
-void Ppmd8_Update1_0(CPpmd8 *p);
-void Ppmd8_Update2(CPpmd8 *p);
-void Ppmd8_UpdateBin(CPpmd8 *p);
-
-#define Ppmd8_GetBinSumm(p) \
- &p->BinSumm[p->NS2Indx[Ppmd8Context_OneState(p->MinContext)->Freq - 1]][ \
- p->NS2BSIndx[Ppmd8_GetContext(p, p->MinContext->Suffix)->NumStats] + \
- p->PrevSuccess + p->MinContext->Flags + ((p->RunLength >> 26) & 0x20)]
-
-CPpmd_See *Ppmd8_MakeEscFreq(CPpmd8 *p, unsigned numMasked, UInt32 *scale);
-
-
-/* ---------- Decode ---------- */
-
-Bool Ppmd8_RangeDec_Init(CPpmd8 *p);
-#define Ppmd8_RangeDec_IsFinishedOK(p) ((p)->Code == 0)
-int Ppmd8_DecodeSymbol(CPpmd8 *p); /* returns: -1 as EndMarker, -2 as DataError */
-
-
-/* ---------- Encode ---------- */
-
-#define Ppmd8_RangeEnc_Init(p) { (p)->Low = 0; (p)->Range = 0xFFFFFFFF; }
-void Ppmd8_RangeEnc_FlushData(CPpmd8 *p);
-void Ppmd8_EncodeSymbol(CPpmd8 *p, int symbol); /* symbol = -1 means EndMarker */
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/unix/C/Ppmd8Dec.c b/src/libs/7zip/unix/C/Ppmd8Dec.c
deleted file mode 100644
index c54e02ab2..000000000
--- a/src/libs/7zip/unix/C/Ppmd8Dec.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/* Ppmd8Dec.c -- PPMdI Decoder
-2010-04-16 : Igor Pavlov : Public domain
-This code is based on:
- PPMd var.I (2002): Dmitry Shkarin : Public domain
- Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#include "Ppmd8.h"
-
-#define kTop (1 << 24)
-#define kBot (1 << 15)
-
-Bool Ppmd8_RangeDec_Init(CPpmd8 *p)
-{
- unsigned i;
- p->Low = 0;
- p->Range = 0xFFFFFFFF;
- p->Code = 0;
- for (i = 0; i < 4; i++)
- p->Code = (p->Code << 8) | p->Stream.In->Read(p->Stream.In);
- return (p->Code < 0xFFFFFFFF);
-}
-
-static UInt32 RangeDec_GetThreshold(CPpmd8 *p, UInt32 total)
-{
- return p->Code / (p->Range /= total);
-}
-
-static void RangeDec_Decode(CPpmd8 *p, UInt32 start, UInt32 size)
-{
- start *= p->Range;
- p->Low += start;
- p->Code -= start;
- p->Range *= size;
-
- while ((p->Low ^ (p->Low + p->Range)) < kTop ||
- (p->Range < kBot && ((p->Range = (0 - p->Low) & (kBot - 1)), 1)))
- {
- p->Code = (p->Code << 8) | p->Stream.In->Read(p->Stream.In);
- p->Range <<= 8;
- p->Low <<= 8;
- }
-}
-
-#define MASK(sym) ((signed char *)charMask)[sym]
-
-int Ppmd8_DecodeSymbol(CPpmd8 *p)
-{
- size_t charMask[256 / sizeof(size_t)];
- if (p->MinContext->NumStats != 0)
- {
- CPpmd_State *s = Ppmd8_GetStats(p, p->MinContext);
- unsigned i;
- UInt32 count, hiCnt;
- if ((count = RangeDec_GetThreshold(p, p->MinContext->SummFreq)) < (hiCnt = s->Freq))
- {
- Byte symbol;
- RangeDec_Decode(p, 0, s->Freq);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd8_Update1_0(p);
- return symbol;
- }
- p->PrevSuccess = 0;
- i = p->MinContext->NumStats;
- do
- {
- if ((hiCnt += (++s)->Freq) > count)
- {
- Byte symbol;
- RangeDec_Decode(p, hiCnt - s->Freq, s->Freq);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd8_Update1(p);
- return symbol;
- }
- }
- while (--i);
- if (count >= p->MinContext->SummFreq)
- return -2;
- RangeDec_Decode(p, hiCnt, p->MinContext->SummFreq - hiCnt);
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- i = p->MinContext->NumStats;
- do { MASK((--s)->Symbol) = 0; } while (--i);
- }
- else
- {
- UInt16 *prob = Ppmd8_GetBinSumm(p);
- if (((p->Code / (p->Range >>= 14)) < *prob))
- {
- Byte symbol;
- RangeDec_Decode(p, 0, *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob);
- symbol = (p->FoundState = Ppmd8Context_OneState(p->MinContext))->Symbol;
- Ppmd8_UpdateBin(p);
- return symbol;
- }
- RangeDec_Decode(p, *prob, (1 << 14) - *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob);
- p->InitEsc = PPMD8_kExpEscape[*prob >> 10];
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(Ppmd8Context_OneState(p->MinContext)->Symbol) = 0;
- p->PrevSuccess = 0;
- }
- for (;;)
- {
- CPpmd_State *ps[256], *s;
- UInt32 freqSum, count, hiCnt;
- CPpmd_See *see;
- unsigned i, num, numMasked = p->MinContext->NumStats;
- do
- {
- p->OrderFall++;
- if (!p->MinContext->Suffix)
- return -1;
- p->MinContext = Ppmd8_GetContext(p, p->MinContext->Suffix);
- }
- while (p->MinContext->NumStats == numMasked);
- hiCnt = 0;
- s = Ppmd8_GetStats(p, p->MinContext);
- i = 0;
- num = p->MinContext->NumStats - numMasked;
- do
- {
- int k = (int)(MASK(s->Symbol));
- hiCnt += (s->Freq & k);
- ps[i] = s++;
- i -= k;
- }
- while (i != num);
-
- see = Ppmd8_MakeEscFreq(p, numMasked, &freqSum);
- freqSum += hiCnt;
- count = RangeDec_GetThreshold(p, freqSum);
-
- if (count < hiCnt)
- {
- Byte symbol;
- CPpmd_State **pps = ps;
- for (hiCnt = 0; (hiCnt += (*pps)->Freq) <= count; pps++);
- s = *pps;
- RangeDec_Decode(p, hiCnt - s->Freq, s->Freq);
- Ppmd_See_Update(see);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd8_Update2(p);
- return symbol;
- }
- if (count >= freqSum)
- return -2;
- RangeDec_Decode(p, hiCnt, freqSum - hiCnt);
- see->Summ = (UInt16)(see->Summ + freqSum);
- do { MASK(ps[--i]->Symbol) = 0; } while (i != 0);
- }
-}
diff --git a/src/libs/7zip/unix/C/Ppmd8Enc.c b/src/libs/7zip/unix/C/Ppmd8Enc.c
deleted file mode 100644
index 8da727eb2..000000000
--- a/src/libs/7zip/unix/C/Ppmd8Enc.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/* Ppmd8Enc.c -- PPMdI Encoder
-2010-04-16 : Igor Pavlov : Public domain
-This code is based on:
- PPMd var.I (2002): Dmitry Shkarin : Public domain
- Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#include "Ppmd8.h"
-
-#define kTop (1 << 24)
-#define kBot (1 << 15)
-
-void Ppmd8_RangeEnc_FlushData(CPpmd8 *p)
-{
- unsigned i;
- for (i = 0; i < 4; i++, p->Low <<= 8 )
- p->Stream.Out->Write(p->Stream.Out, (Byte)(p->Low >> 24));
-}
-
-static void RangeEnc_Normalize(CPpmd8 *p)
-{
- while ((p->Low ^ (p->Low + p->Range)) < kTop ||
- (p->Range < kBot && ((p->Range = (0 - p->Low) & (kBot - 1)), 1)))
- {
- p->Stream.Out->Write(p->Stream.Out, (Byte)(p->Low >> 24));
- p->Range <<= 8;
- p->Low <<= 8;
- }
-}
-
-static void RangeEnc_Encode(CPpmd8 *p, UInt32 start, UInt32 size, UInt32 total)
-{
- p->Low += start * (p->Range /= total);
- p->Range *= size;
- RangeEnc_Normalize(p);
-}
-
-static void RangeEnc_EncodeBit_0(CPpmd8 *p, UInt32 size0)
-{
- p->Range >>= 14;
- p->Range *= size0;
- RangeEnc_Normalize(p);
-}
-
-static void RangeEnc_EncodeBit_1(CPpmd8 *p, UInt32 size0)
-{
- p->Low += size0 * (p->Range >>= 14);
- p->Range *= ((1 << 14) - size0);
- RangeEnc_Normalize(p);
-}
-
-
-#define MASK(sym) ((signed char *)charMask)[sym]
-
-void Ppmd8_EncodeSymbol(CPpmd8 *p, int symbol)
-{
- size_t charMask[256 / sizeof(size_t)];
- if (p->MinContext->NumStats != 0)
- {
- CPpmd_State *s = Ppmd8_GetStats(p, p->MinContext);
- UInt32 sum;
- unsigned i;
- if (s->Symbol == symbol)
- {
- RangeEnc_Encode(p, 0, s->Freq, p->MinContext->SummFreq);
- p->FoundState = s;
- Ppmd8_Update1_0(p);
- return;
- }
- p->PrevSuccess = 0;
- sum = s->Freq;
- i = p->MinContext->NumStats;
- do
- {
- if ((++s)->Symbol == symbol)
- {
- RangeEnc_Encode(p, sum, s->Freq, p->MinContext->SummFreq);
- p->FoundState = s;
- Ppmd8_Update1(p);
- return;
- }
- sum += s->Freq;
- }
- while (--i);
-
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- i = p->MinContext->NumStats;
- do { MASK((--s)->Symbol) = 0; } while (--i);
- RangeEnc_Encode(p, sum, p->MinContext->SummFreq - sum, p->MinContext->SummFreq);
- }
- else
- {
- UInt16 *prob = Ppmd8_GetBinSumm(p);
- CPpmd_State *s = Ppmd8Context_OneState(p->MinContext);
- if (s->Symbol == symbol)
- {
- RangeEnc_EncodeBit_0(p, *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob);
- p->FoundState = s;
- Ppmd8_UpdateBin(p);
- return;
- }
- else
- {
- RangeEnc_EncodeBit_1(p, *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob);
- p->InitEsc = PPMD8_kExpEscape[*prob >> 10];
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- p->PrevSuccess = 0;
- }
- }
- for (;;)
- {
- UInt32 escFreq;
- CPpmd_See *see;
- CPpmd_State *s;
- UInt32 sum;
- unsigned i, numMasked = p->MinContext->NumStats;
- do
- {
- p->OrderFall++;
- if (!p->MinContext->Suffix)
- return; /* EndMarker (symbol = -1) */
- p->MinContext = Ppmd8_GetContext(p, p->MinContext->Suffix);
- }
- while (p->MinContext->NumStats == numMasked);
-
- see = Ppmd8_MakeEscFreq(p, numMasked, &escFreq);
- s = Ppmd8_GetStats(p, p->MinContext);
- sum = 0;
- i = p->MinContext->NumStats + 1;
- do
- {
- int cur = s->Symbol;
- if (cur == symbol)
- {
- UInt32 low = sum;
- CPpmd_State *s1 = s;
- do
- {
- sum += (s->Freq & (int)(MASK(s->Symbol)));
- s++;
- }
- while (--i);
- RangeEnc_Encode(p, low, s1->Freq, sum + escFreq);
- Ppmd_See_Update(see);
- p->FoundState = s1;
- Ppmd8_Update2(p);
- return;
- }
- sum += (s->Freq & (int)(MASK(cur)));
- MASK(cur) = 0;
- s++;
- }
- while (--i);
-
- RangeEnc_Encode(p, sum, escFreq, sum + escFreq);
- see->Summ = (UInt16)(see->Summ + sum + escFreq);
- }
-}
diff --git a/src/libs/7zip/unix/C/Sort.c b/src/libs/7zip/unix/C/Sort.c
deleted file mode 100644
index 388d22893..000000000
--- a/src/libs/7zip/unix/C/Sort.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Sort.c -- Sort functions
-2010-09-17 : Igor Pavlov : Public domain */
-
-#include "Sort.h"
-
-#define HeapSortDown(p, k, size, temp) \
- { for (;;) { \
- UInt32 s = (k << 1); \
- if (s > size) break; \
- if (s < size && p[s + 1] > p[s]) s++; \
- if (temp >= p[s]) break; \
- p[k] = p[s]; k = s; \
- } p[k] = temp; }
-
-void HeapSort(UInt32 *p, UInt32 size)
-{
- if (size <= 1)
- return;
- p--;
- {
- UInt32 i = size / 2;
- do
- {
- UInt32 temp = p[i];
- UInt32 k = i;
- HeapSortDown(p, k, size, temp)
- }
- while (--i != 0);
- }
- /*
- do
- {
- UInt32 k = 1;
- UInt32 temp = p[size];
- p[size--] = p[1];
- HeapSortDown(p, k, size, temp)
- }
- while (size > 1);
- */
- while (size > 3)
- {
- UInt32 temp = p[size];
- UInt32 k = (p[3] > p[2]) ? 3 : 2;
- p[size--] = p[1];
- p[1] = p[k];
- HeapSortDown(p, k, size, temp)
- }
- {
- UInt32 temp = p[size];
- p[size] = p[1];
- if (size > 2 && p[2] < temp)
- {
- p[1] = p[2];
- p[2] = temp;
- }
- else
- p[1] = temp;
- }
-}
-
-/*
-#define HeapSortRefDown(p, vals, n, size, temp) \
- { UInt32 k = n; UInt32 val = vals[temp]; for (;;) { \
- UInt32 s = (k << 1); \
- if (s > size) break; \
- if (s < size && vals[p[s + 1]] > vals[p[s]]) s++; \
- if (val >= vals[p[s]]) break; \
- p[k] = p[s]; k = s; \
- } p[k] = temp; }
-
-void HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size)
-{
- if (size <= 1)
- return;
- p--;
- {
- UInt32 i = size / 2;
- do
- {
- UInt32 temp = p[i];
- HeapSortRefDown(p, vals, i, size, temp);
- }
- while (--i != 0);
- }
- do
- {
- UInt32 temp = p[size];
- p[size--] = p[1];
- HeapSortRefDown(p, vals, 1, size, temp);
- }
- while (size > 1);
-}
-*/
diff --git a/src/libs/7zip/unix/C/Sort.h b/src/libs/7zip/unix/C/Sort.h
deleted file mode 100644
index 65dfc6f6a..000000000
--- a/src/libs/7zip/unix/C/Sort.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Sort.h -- Sort functions
-2009-02-07 : Igor Pavlov : Public domain */
-
-#ifndef __7Z_SORT_H
-#define __7Z_SORT_H
-
-#include "Types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void HeapSort(UInt32 *p, UInt32 size);
-/* void HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size); */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/ApmHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/ApmHandler.cpp
deleted file mode 100644
index a3b5e19b9..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/ApmHandler.cpp
+++ /dev/null
@@ -1,356 +0,0 @@
-// ApmHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#define Get16(p) GetBe16(p)
-#define Get32(p) GetBe32(p)
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NApm {
-
-struct CItem
-{
- UInt32 StartBlock;
- UInt32 NumBlocks;
- char Name[32];
- char Type[32];
- /*
- UInt32 DataStartBlock;
- UInt32 NumDataBlocks;
- UInt32 Status;
- UInt32 BootStartBlock;
- UInt32 BootSize;
- UInt32 BootAddr;
- UInt32 BootEntry;
- UInt32 BootChecksum;
- char Processor[16];
- */
-
- bool Parse(const Byte *p, UInt32 &numBlocksInMap)
- {
- if (p[0] != 0x50 || p[1] != 0x4D || p[2] != 0 || p[3] != 0)
- return false;
- numBlocksInMap = Get32(p + 4);
- StartBlock = Get32(p + 8);
- NumBlocks = Get32(p + 0xC);
- memcpy(Name, p + 0x10, 32);
- memcpy(Type, p + 0x30, 32);
- /*
- DataStartBlock = Get32(p + 0x50);
- NumDataBlocks = Get32(p + 0x54);
- Status = Get32(p + 0x58);
- BootStartBlock = Get32(p + 0x5C);
- BootSize = Get32(p + 0x60);
- BootAddr = Get32(p + 0x64);
- if (Get32(p + 0x68) != 0)
- return false;
- BootEntry = Get32(p + 0x6C);
- if (Get32(p + 0x70) != 0)
- return false;
- BootChecksum = Get32(p + 0x74);
- memcpy(Processor, p + 0x78, 16);
- */
- return true;
- }
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CRecordVector<CItem> _items;
-
- int _blockSizeLog;
- UInt32 _numBlocks;
-
- HRESULT ReadTables(IInStream *stream);
- UInt64 BlocksToBytes(UInt32 i) const { return (UInt64)i << _blockSizeLog; }
- UInt64 GetItemSize(const CItem &item) { return BlocksToBytes(item.NumBlocks); }
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-static inline int GetLog(UInt32 num)
-{
- for (int i = 0; i < 31; i++)
- if (((UInt32)1 << i) == num)
- return i;
- return -1;
-}
-
-HRESULT CHandler::ReadTables(IInStream *stream)
-{
- const UInt32 kSectorSize = 512;
- Byte buf[kSectorSize];
- {
- RINOK(ReadStream_FALSE(stream, buf, kSectorSize));
- if (buf[0] != 0x45 || buf[1] != 0x52)
- return S_FALSE;
- _blockSizeLog = GetLog(Get16(buf + 2));
- if (_blockSizeLog < 9 || _blockSizeLog > 14)
- return S_FALSE;
- _numBlocks = Get32(buf + 4);
- for (int i = 8; i < 16; i++)
- if (buf[i] != 0)
- return S_FALSE;
- }
-
- unsigned numSkips = (unsigned)1 << (_blockSizeLog - 9);
- for (unsigned j = 1; j < numSkips; j++)
- {
- RINOK(ReadStream_FALSE(stream, buf, kSectorSize));
- }
-
- UInt32 numBlocksInMap = 0;
- for (unsigned i = 0;;)
- {
- RINOK(ReadStream_FALSE(stream, buf, kSectorSize));
-
- CItem item;
-
- UInt32 numBlocksInMap2;
- if (!item.Parse(buf, numBlocksInMap2))
- return S_FALSE;
- if (i == 0)
- {
- numBlocksInMap = numBlocksInMap2;
- if (numBlocksInMap > (1 << 8))
- return S_FALSE;
- }
- else if (numBlocksInMap2 != numBlocksInMap)
- return S_FALSE;
-
- UInt32 finish = item.StartBlock + item.NumBlocks;
- if (finish < item.StartBlock)
- return S_FALSE;
- _numBlocks = MyMax(_numBlocks, finish);
-
- _items.Add(item);
- for (unsigned j = 1; j < numSkips; j++)
- {
- RINOK(ReadStream_FALSE(stream, buf, kSectorSize));
- }
- if (++i == numBlocksInMap)
- break;
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- RINOK(ReadTables(stream));
- _stream = stream;
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _items.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidOffset, VT_UI8}
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidPhySize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-static AString GetString(const char *s)
-{
- AString res;
- for (int i = 0; i < 32 && s[i] != 0; i++)
- res += s[i];
- return res;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMainSubfile:
- {
- int mainIndex = -1;
- for (int i = 0; i < _items.Size(); i++)
- {
- AString s = GetString(_items[i].Type);
- if (s != "Apple_Free" &&
- s != "Apple_partition_map")
- {
- if (mainIndex >= 0)
- {
- mainIndex = -1;
- break;
- }
- mainIndex = i;
- }
- }
- if (mainIndex >= 0)
- prop = (UInt32)mainIndex;
- break;
- }
- case kpidClusterSize: prop = (UInt32)1 << _blockSizeLog; break;
- case kpidPhySize: prop = BlocksToBytes(_numBlocks); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- const CItem &item = _items[index];
- switch(propID)
- {
- case kpidPath:
- {
- AString s = GetString(item.Name);
- if (s.IsEmpty())
- {
- char s2[32];
- ConvertUInt32ToString(index, s2);
- s = s2;
- }
- AString type = GetString(item.Type);
- if (type == "Apple_HFS")
- type = "hfs";
- if (!type.IsEmpty())
- {
- s += '.';
- s += type;
- }
- prop = s;
- break;
- }
- case kpidSize:
- case kpidPackSize:
- prop = GetItemSize(item);
- break;
- case kpidOffset: prop = BlocksToBytes(item.StartBlock); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += GetItemSize(_items[allFilesMode ? i : indices[i]]);
- extractCallback->SetTotal(totalSize);
-
- totalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
-
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- UInt64 size = GetItemSize(item);
- totalSize += size;
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- RINOK(_stream->Seek(BlocksToBytes(item.StartBlock), STREAM_SEEK_SET, NULL));
- streamSpec->Init(size);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == size ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItem &item = _items[index];
- return CreateLimitedInStream(_stream, BlocksToBytes(item.StartBlock), GetItemSize(item), stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"APM", L"", 0, 0xD4, { 0x50, 0x4D, 0, 0, 0, 0, 0 }, 7, false, CreateArc, 0 };
-
-REGISTER_ARC(Apm)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/ArjHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/ArjHandler.cpp
deleted file mode 100644
index 4dd686ec0..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/ArjHandler.cpp
+++ /dev/null
@@ -1,798 +0,0 @@
-// ArjHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/ArjDecoder1.h"
-#include "../Compress/ArjDecoder2.h"
-#include "../Compress/CopyCoder.h"
-
-#include "Common/ItemNameUtils.h"
-#include "Common/OutStreamWithCRC.h"
-
-using namespace NWindows;
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-
-namespace NArchive {
-namespace NArj {
-
-const int kBlockSizeMin = 30;
-const int kBlockSizeMax = 2600;
-
-namespace NSignature
-{
- const Byte kSig0 = 0x60;
- const Byte kSig1 = 0xEA;
-}
-
-namespace NFileHeader
-{
- namespace NCompressionMethod
- {
- enum
- {
- kStored = 0,
- kCompressed1a = 1,
- kCompressed1b = 2,
- kCompressed1c = 3,
- kCompressed2 = 4,
- kNoDataNoCRC = 8,
- kNoData = 9
- };
- }
-
- namespace NFileType
- {
- enum
- {
- kBinary = 0,
- k7BitText = 1,
- kArchiveHeader = 2,
- kDirectory = 3,
- kVolumeLablel = 4,
- kChapterLabel = 5
- };
- }
-
- namespace NFlags
- {
- const Byte kGarbled = 1;
- const Byte kVolume = 4;
- const Byte kExtFile = 8;
- const Byte kPathSym = 0x10;
- const Byte kBackup = 0x20;
- }
-
- namespace NHostOS
- {
- enum EEnum
- {
- kMSDOS = 0, // filesystem used by MS-DOS, OS/2, Win32
- // pkarj 2.50 (FAT / VFAT / FAT32 file systems)
- kPRIMOS,
- kUnix,
- kAMIGA,
- kMac,
- kOS_2,
- kAPPLE_GS,
- kAtari_ST,
- kNext,
- kVAX_VMS,
- kWIN95
- };
- }
-}
-
-struct CArchiveHeader
-{
- // Byte ArchiverVersion;
- // Byte ExtractVersion;
- Byte HostOS;
- // Byte Flags;
- // Byte SecuryVersion;
- // Byte FileType;
- // Byte Reserved;
- UInt32 CTime;
- UInt32 MTime;
- UInt32 ArchiveSize;
- // UInt32 SecurityEnvelopeFilePosition;
- // UInt16 FilespecPositionInFilename;
- // UInt16 LengthOfSecurityEnvelopeSata;
- // Byte EncryptionVersion;
- // Byte LastChapter;
- AString Name;
- AString Comment;
-
- HRESULT Parse(const Byte *p, unsigned size);
-};
-
-static HRESULT ReadString(const Byte *p, unsigned &size, AString &res)
-{
- AString s;
- for (unsigned i = 0; i < size;)
- {
- char c = (char)p[i++];
- if (c == 0)
- {
- size = i;
- res = s;
- return S_OK;
- }
- s += c;
- }
- return S_FALSE;
-}
-
-HRESULT CArchiveHeader::Parse(const Byte *p, unsigned size)
-{
- if (size < kBlockSizeMin)
- return S_FALSE;
- Byte firstHeaderSize = p[0];
- if (firstHeaderSize > size)
- return S_FALSE;
- // ArchiverVersion = p[1];
- // ExtractVersion = p[2];
- HostOS = p[3];
- // Flags = p[4];
- // SecuryVersion = p[5];
- if (p[6] != NFileHeader::NFileType::kArchiveHeader)
- return S_FALSE;
- // Reserved = p[7];
- CTime = Get32(p + 8);
- MTime = Get32(p + 12);
- ArchiveSize = Get32(p + 16);
- // SecurityEnvelopeFilePosition = Get32(p + 20);
- // UInt16 filespecPositionInFilename = Get16(p + 24);
- // LengthOfSecurityEnvelopeSata = Get16(p + 26);
- // EncryptionVersion = p[28];
- // LastChapter = p[29];
- unsigned pos = firstHeaderSize;
- unsigned size1 = size - pos;
- RINOK(ReadString(p + pos, size1, Name));
- pos += size1;
- size1 = size - pos;
- RINOK(ReadString(p + pos, size1, Comment));
- pos += size1;
- return S_OK;
-}
-
-struct CItem
-{
- AString Name;
- AString Comment;
-
- UInt32 MTime;
- UInt32 PackSize;
- UInt32 Size;
- UInt32 FileCRC;
- UInt32 SplitPos;
-
- Byte Version;
- Byte ExtractVersion;
- Byte HostOS;
- Byte Flags;
- Byte Method;
- Byte FileType;
-
- // UInt16 FilespecPositionInFilename;
- UInt16 FileAccessMode;
- // Byte FirstChapter;
- // Byte LastChapter;
-
- UInt64 DataPosition;
-
- bool IsEncrypted() const { return (Flags & NFileHeader::NFlags::kGarbled) != 0; }
- bool IsDir() const { return (FileType == NFileHeader::NFileType::kDirectory); }
- bool IsSplitAfter() const { return (Flags & NFileHeader::NFlags::kVolume) != 0; }
- bool IsSplitBefore() const { return (Flags & NFileHeader::NFlags::kExtFile) != 0; }
- UInt32 GetWinAttributes() const
- {
- UInt32 winAtrributes;
- switch(HostOS)
- {
- case NFileHeader::NHostOS::kMSDOS:
- case NFileHeader::NHostOS::kWIN95:
- winAtrributes = FileAccessMode;
- break;
- default:
- winAtrributes = 0;
- }
- if (IsDir())
- winAtrributes |= FILE_ATTRIBUTE_DIRECTORY;
- return winAtrributes;
- }
-
- HRESULT Parse(const Byte *p, unsigned size);
-};
-
-HRESULT CItem::Parse(const Byte *p, unsigned size)
-{
- if (size < kBlockSizeMin)
- return S_FALSE;
-
- Byte firstHeaderSize = p[0];
-
- Version = p[1];
- ExtractVersion = p[2];
- HostOS = p[3];
- Flags = p[4];
- Method = p[5];
- FileType = p[6];
- // Reserved = p[7];
- MTime = Get32(p + 8);
- PackSize = Get32(p + 12);
- Size = Get32(p + 16);
- FileCRC = Get32(p + 20);
- // FilespecPositionInFilename = Get16(p + 24);
- FileAccessMode = Get16(p + 26);
- // FirstChapter = p[28];
- // FirstChapter = p[29];
-
- SplitPos = 0;
- if (IsSplitBefore() && firstHeaderSize >= 34)
- SplitPos = Get32(p + 30);
-
- unsigned pos = firstHeaderSize;
- unsigned size1 = size - pos;
- RINOK(ReadString(p + pos, size1, Name));
- pos += size1;
- size1 = size - pos;
- RINOK(ReadString(p + pos, size1, Comment));
- pos += size1;
-
- return S_OK;
-}
-
-struct CInArchiveException
-{
- enum CCauseType
- {
- kUnexpectedEndOfArchive = 0,
- kCRCError,
- kIncorrectArchive
- }
- Cause;
- CInArchiveException(CCauseType cause): Cause(cause) {};
-};
-
-class CInArchive
-{
- UInt32 _blockSize;
- Byte _block[kBlockSizeMax + 4];
-
- HRESULT ReadBlock(bool &filled);
- HRESULT ReadSignatureAndBlock(bool &filled);
- HRESULT SkipExtendedHeaders();
-
- HRESULT SafeReadBytes(void *data, UInt32 size);
-
-public:
- CArchiveHeader Header;
-
- IInStream *Stream;
- IArchiveOpenCallback *Callback;
- UInt64 NumFiles;
- UInt64 NumBytes;
-
- HRESULT Open(const UInt64 *searchHeaderSizeLimit);
- HRESULT GetNextItem(bool &filled, CItem &item);
-};
-
-static inline bool TestMarkerCandidate(const Byte *p, unsigned maxSize)
-{
- if (p[0] != NSignature::kSig0 || p[1] != NSignature::kSig1)
- return false;
- UInt32 blockSize = Get16(p + 2);
- p += 4;
- if (p[6] != NFileHeader::NFileType::kArchiveHeader ||
- p[0] > blockSize ||
- maxSize < 2 + 2 + blockSize + 4 ||
- blockSize < kBlockSizeMin || blockSize > kBlockSizeMax ||
- p[28] > 8) // EncryptionVersion
- return false;
- // return (Get32(p + blockSize) == CrcCalc(p, blockSize));
- return true;
-}
-
-static HRESULT FindAndReadMarker(ISequentialInStream *stream, const UInt64 *searchHeaderSizeLimit, UInt64 &position)
-{
- position = 0;
-
- const int kMarkerSizeMin = 2 + 2 + kBlockSizeMin + 4;
- const int kMarkerSizeMax = 2 + 2 + kBlockSizeMax + 4;
-
- CByteBuffer byteBuffer;
- const UInt32 kBufSize = 1 << 16;
- byteBuffer.SetCapacity(kBufSize);
- Byte *buf = byteBuffer;
-
- size_t processedSize = kMarkerSizeMax;
- RINOK(ReadStream(stream, buf, &processedSize));
- if (processedSize < kMarkerSizeMin)
- return S_FALSE;
- if (TestMarkerCandidate(buf, (unsigned)processedSize))
- return S_OK;
-
- UInt32 numBytesPrev = (UInt32)processedSize - 1;
- memmove(buf, buf + 1, numBytesPrev);
- UInt64 curTestPos = 1;
- for (;;)
- {
- if (searchHeaderSizeLimit != NULL)
- if (curTestPos > *searchHeaderSizeLimit)
- return S_FALSE;
- processedSize = kBufSize - numBytesPrev;
- RINOK(ReadStream(stream, buf + numBytesPrev, &processedSize));
- UInt32 numBytesInBuffer = numBytesPrev + (UInt32)processedSize;
- if (numBytesInBuffer < kMarkerSizeMin)
- return S_FALSE;
- UInt32 numTests = numBytesInBuffer - kMarkerSizeMin + 1;
- UInt32 pos;
- for (pos = 0; pos < numTests; pos++)
- {
- for (; buf[pos] != NSignature::kSig0 && pos < numTests; pos++);
- if (pos == numTests)
- break;
- if (TestMarkerCandidate(buf + pos, numBytesInBuffer - pos))
- {
- position = curTestPos + pos;
- return S_OK;
- }
- }
- curTestPos += pos;
- numBytesPrev = numBytesInBuffer - numTests;
- memmove(buf, buf + numTests, numBytesPrev);
- }
-}
-
-HRESULT CInArchive::SafeReadBytes(void *data, UInt32 size)
-{
- size_t processed = size;
- RINOK(ReadStream(Stream, data, &processed));
- if (processed != size)
- throw CInArchiveException(CInArchiveException::kUnexpectedEndOfArchive);
- return S_OK;
-}
-
-HRESULT CInArchive::ReadBlock(bool &filled)
-{
- filled = false;
- Byte buf[2];
- RINOK(SafeReadBytes(buf, 2));
- _blockSize = Get16(buf);
- if (_blockSize == 0)
- return S_OK;
- if (_blockSize > kBlockSizeMax)
- throw CInArchiveException(CInArchiveException::kIncorrectArchive);
- RINOK(SafeReadBytes(_block, _blockSize + 4));
- NumBytes += _blockSize + 6;
- if (Get32(_block + _blockSize) != CrcCalc(_block, _blockSize))
- throw CInArchiveException(CInArchiveException::kCRCError);
- filled = true;
- return S_OK;
-}
-
-HRESULT CInArchive::ReadSignatureAndBlock(bool &filled)
-{
- Byte id[2];
- RINOK(SafeReadBytes(id, 2));
- if (id[0] != NSignature::kSig0 || id[1] != NSignature::kSig1)
- throw CInArchiveException(CInArchiveException::kIncorrectArchive);
- return ReadBlock(filled);
-}
-
-HRESULT CInArchive::SkipExtendedHeaders()
-{
- for (UInt32 i = 0;; i++)
- {
- bool filled;
- RINOK(ReadBlock(filled));
- if (!filled)
- return S_OK;
- if (Callback && (i & 0xFF) == 0)
- RINOK(Callback->SetCompleted(&NumFiles, &NumBytes));
- }
-}
-
-HRESULT CInArchive::Open(const UInt64 *searchHeaderSizeLimit)
-{
- UInt64 position = 0;
- RINOK(FindAndReadMarker(Stream, searchHeaderSizeLimit, position));
- RINOK(Stream->Seek(position, STREAM_SEEK_SET, NULL));
- bool filled;
- RINOK(ReadSignatureAndBlock(filled));
- if (!filled)
- return S_FALSE;
- RINOK(Header.Parse(_block, _blockSize));
- return SkipExtendedHeaders();
-}
-
-HRESULT CInArchive::GetNextItem(bool &filled, CItem &item)
-{
- RINOK(ReadSignatureAndBlock(filled));
- if (!filled)
- return S_OK;
- filled = false;
- RINOK(item.Parse(_block, _blockSize));
- /*
- UInt32 extraData;
- if ((header.Flags & NFileHeader::NFlags::kExtFile) != 0)
- extraData = GetUi32(_block + pos);
- */
-
- RINOK(SkipExtendedHeaders());
- filled = true;
- return S_OK;
-}
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP1(IInArchive)
-
- INTERFACE_IInArchive(;)
-
- HRESULT Open2(IInStream *inStream, const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *callback);
-private:
- CInArchive _archive;
- CObjectVector<CItem> _items;
- CMyComPtr<IInStream> _stream;
-};
-
-const wchar_t *kHostOS[] =
-{
- L"MSDOS",
- L"PRIMOS",
- L"UNIX",
- L"AMIGA",
- L"MAC",
- L"OS/2",
- L"APPLE GS",
- L"ATARI ST",
- L"NEXT",
- L"VAX VMS",
- L"WIN95"
-};
-
-const wchar_t *kUnknownOS = L"Unknown";
-
-const int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]);
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidName, VT_BSTR},
- { NULL, kpidCTime, VT_BSTR},
- { NULL, kpidMTime, VT_BSTR},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidComment, VT_BSTR}
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI4},
- { NULL, kpidPosition, VT_UI8},
- { NULL, kpidPackSize, VT_UI4},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidEncrypted, VT_BOOL},
- { NULL, kpidCRC, VT_UI4},
- { NULL, kpidMethod, VT_UI1},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidComment, VT_BSTR}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-static void SetTime(UInt32 dosTime, NWindows::NCOM::CPropVariant &prop)
-{
- if (dosTime == 0)
- return;
- FILETIME localFileTime, utc;
- if (NTime::DosTimeToFileTime(dosTime, localFileTime))
- {
- if (!LocalFileTimeToFileTime(&localFileTime, &utc))
- utc.dwHighDateTime = utc.dwLowDateTime = 0;
- }
- else
- utc.dwHighDateTime = utc.dwLowDateTime = 0;
- prop = utc;
-}
-
-static void SetHostOS(Byte hostOS, NWindows::NCOM::CPropVariant &prop)
-{
- prop = hostOS < kNumHostOSes ? kHostOS[hostOS] : kUnknownOS;
-}
-
-static void SetUnicodeString(const AString &s, NWindows::NCOM::CPropVariant &prop)
-{
- if (!s.IsEmpty())
- prop = MultiByteToUnicodeString(s, CP_OEMCP);
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidName: SetUnicodeString(_archive.Header.Name, prop); break;
- case kpidCTime: SetTime(_archive.Header.CTime, prop); break;
- case kpidMTime: SetTime(_archive.Header.MTime, prop); break;
- case kpidHostOS: SetHostOS(_archive.Header.HostOS, prop); break;
- case kpidComment: SetUnicodeString(_archive.Header.Comment, prop); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _items[index];
- switch(propID)
- {
- case kpidPath: prop = NItemName::GetOSName(MultiByteToUnicodeString(item.Name, CP_OEMCP)); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.Size; break;
- case kpidPackSize: prop = item.PackSize; break;
- case kpidPosition: if (item.IsSplitBefore() || item.IsSplitAfter()) prop = (UInt64)item.SplitPos; break;
- case kpidAttrib: prop = item.GetWinAttributes(); break;
- case kpidEncrypted: prop = item.IsEncrypted(); break;
- case kpidCRC: prop = item.FileCRC; break;
- case kpidMethod: prop = item.Method; break;
- case kpidHostOS: SetHostOS(item.HostOS, prop); break;
- case kpidMTime: SetTime(item.MTime, prop); break;
- case kpidComment: SetUnicodeString(item.Comment, prop); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::Open2(IInStream *inStream, const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *callback)
-{
- Close();
-
- UInt64 endPos = 0;
- if (callback != NULL)
- {
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPos));
- RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));
- }
-
- _archive.Stream = inStream;
- _archive.Callback = callback;
- _archive.NumFiles = _archive.NumBytes = 0;
-
- RINOK(_archive.Open(maxCheckStartPosition));
- if (callback != NULL)
- RINOK(callback->SetTotal(NULL, &endPos));
- for (;;)
- {
- CItem item;
- bool filled;
-
-
- RINOK(_archive.GetNextItem(filled, item));
-
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &item.DataPosition));
-
- if (!filled)
- break;
- _items.Add(item);
-
- if (inStream->Seek(item.PackSize, STREAM_SEEK_CUR, NULL) != S_OK)
- throw CInArchiveException(CInArchiveException::kUnexpectedEndOfArchive);
-
- _archive.NumFiles = _items.Size();
- _archive.NumBytes = item.DataPosition;
-
- if (callback != NULL && _items.Size() % 100 == 0)
- {
- RINOK(callback->SetCompleted(&_archive.NumFiles, &_archive.NumBytes));
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- HRESULT res;
- try
- {
- res = Open2(inStream, maxCheckStartPosition, callback);
- if (res == S_OK)
- {
- _stream = inStream;
- return S_OK;
- }
- }
- catch(const CInArchiveException &) { res = S_FALSE; }
- Close();
- return res;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _items.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- UInt64 totalUnpacked = 0, totalPacked = 0;
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const CItem &item = _items[allFilesMode ? i : indices[i]];
- totalUnpacked += item.Size;
- totalPacked += item.PackSize;
- }
- extractCallback->SetTotal(totalUnpacked);
-
- totalUnpacked = totalPacked = 0;
- UInt64 curUnpacked, curPacked;
-
- CMyComPtr<ICompressCoder> arj1Decoder;
- CMyComPtr<ICompressCoder> arj2Decoder;
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *inStreamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(inStreamSpec);
- inStreamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++, totalUnpacked += curUnpacked, totalPacked += curPacked)
- {
- lps->InSize = totalPacked;
- lps->OutSize = totalUnpacked;
- RINOK(lps->SetCur());
-
- curUnpacked = curPacked = 0;
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (item.IsDir())
- {
- // if (!testMode)
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- continue;
- }
-
- if (!testMode && !realOutStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- curUnpacked = item.Size;
- curPacked = item.PackSize;
-
- {
- COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init();
-
- inStreamSpec->Init(item.PackSize);
-
- UInt64 pos;
- _stream->Seek(item.DataPosition, STREAM_SEEK_SET, &pos);
-
- HRESULT result = S_OK;
- Int32 opRes = NExtract::NOperationResult::kOK;
-
- if (item.IsEncrypted())
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- switch(item.Method)
- {
- case NFileHeader::NCompressionMethod::kStored:
- {
- result = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (result == S_OK && copyCoderSpec->TotalSize != item.PackSize)
- result = S_FALSE;
- break;
- }
- case NFileHeader::NCompressionMethod::kCompressed1a:
- case NFileHeader::NCompressionMethod::kCompressed1b:
- case NFileHeader::NCompressionMethod::kCompressed1c:
- {
- if (!arj1Decoder)
- arj1Decoder = new NCompress::NArj::NDecoder1::CCoder;
- result = arj1Decoder->Code(inStream, outStream, NULL, &curUnpacked, progress);
- break;
- }
- case NFileHeader::NCompressionMethod::kCompressed2:
- {
- if (!arj2Decoder)
- arj2Decoder = new NCompress::NArj::NDecoder2::CCoder;
- result = arj2Decoder->Code(inStream, outStream, NULL, &curUnpacked, progress);
- break;
- }
- default:
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- }
- }
- if (opRes == NExtract::NOperationResult::kOK)
- {
- if (result == S_FALSE)
- opRes = NExtract::NOperationResult::kDataError;
- else
- {
- RINOK(result);
- opRes = (outStreamSpec->GetCRC() == item.FileCRC) ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kCRCError;
- }
- }
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Arj", L"arj", 0, 4, { 0x60, 0xEA }, 2, false, CreateArc, 0 };
-
-REGISTER_ARC(Arj)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Bz2Handler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Bz2Handler.cpp
deleted file mode 100644
index 98cbcc182..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Bz2Handler.cpp
+++ /dev/null
@@ -1,423 +0,0 @@
-// Bz2Handler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariant.h"
-
-#ifndef _7ZIP_ST
-#include "../../Windows/System.h"
-#endif
-
-#include "../Common/CreateCoder.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/BZip2Decoder.h"
-#include "../Compress/BZip2Encoder.h"
-#include "../Compress/CopyCoder.h"
-
-#include "Common/DummyOutStream.h"
-#include "Common/ParseProperties.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NBz2 {
-
-static const UInt32 kNumPassesX1 = 1;
-static const UInt32 kNumPassesX7 = 2;
-static const UInt32 kNumPassesX9 = 7;
-
-static const UInt32 kDicSizeX1 = 100000;
-static const UInt32 kDicSizeX3 = 500000;
-static const UInt32 kDicSizeX5 = 900000;
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public IOutArchive,
- public ISetProperties,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CMyComPtr<ISequentialInStream> _seqStream;
- UInt64 _packSize;
- UInt64 _startPosition;
- bool _packSizeDefined;
-
- UInt32 _level;
- UInt32 _dicSize;
- UInt32 _numPasses;
- #ifndef _7ZIP_ST
- UInt32 _numThreads;
- #endif
-
- void InitMethodProperties()
- {
- _level = 5;
- _dicSize =
- _numPasses = 0xFFFFFFFF;
- #ifndef _7ZIP_ST
- _numThreads = NWindows::NSystem::GetNumberOfProcessors();;
- #endif
- }
-
-public:
- MY_UNKNOWN_IMP4(IInArchive, IArchiveOpenSeq, IOutArchive, ISetProperties)
-
- INTERFACE_IInArchive(;)
- INTERFACE_IOutArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
- STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProps);
-
- CHandler() { InitMethodProperties(); }
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPackSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPackSize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- try
- {
- Close();
- RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_startPosition));
- const int kSignatureSize = 3;
- Byte buf[kSignatureSize];
- RINOK(ReadStream_FALSE(stream, buf, kSignatureSize));
- if (buf[0] != 'B' || buf[1] != 'Z' || buf[2] != 'h')
- return S_FALSE;
-
- UInt64 endPosition;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPosition));
- _packSize = endPosition - _startPosition;
- _packSizeDefined = true;
- _stream = stream;
- _seqStream = stream;
- }
- catch(...) { return S_FALSE; }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- Close();
- _seqStream = stream;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _packSizeDefined = false;
- _seqStream.Release();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- if (_stream)
- extractCallback->SetTotal(_packSize);
- UInt64 currentTotalPacked = 0;
- RINOK(extractCallback->SetCompleted(&currentTotalPacked));
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- NCompress::NBZip2::CDecoder *decoderSpec = new NCompress::NBZip2::CDecoder;
- CMyComPtr<ICompressCoder> decoder = decoderSpec;
-
- if (_stream)
- {
- RINOK(_stream->Seek(_startPosition, STREAM_SEEK_SET, NULL));
- }
-
- decoderSpec->SetInStream(_seqStream);
-
- #ifndef _7ZIP_ST
- RINOK(decoderSpec->SetNumberOfThreads(_numThreads));
- #endif
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
-
- realOutStream.Release();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, true);
-
- HRESULT result = S_OK;
-
- bool firstItem = true;
- for (;;)
- {
- lps->InSize = currentTotalPacked;
- lps->OutSize = outStreamSpec->GetSize();
-
- RINOK(lps->SetCur());
-
- bool isBz2;
- result = decoderSpec->CodeResume(outStream, isBz2, progress);
-
- if (result != S_OK)
- break;
- if (!isBz2)
- {
- if (firstItem)
- result = S_FALSE;
- break;
- }
- firstItem = false;
-
- _packSize = currentTotalPacked = decoderSpec->GetInputProcessedSize();
- _packSizeDefined = true;
- }
- decoderSpec->ReleaseInStream();
- outStream.Release();
-
- Int32 retResult;
- if (result == S_OK)
- retResult = NExtract::NOperationResult::kOK;
- else if (result == S_FALSE)
- retResult = NExtract::NOperationResult::kDataError;
- else
- return result;
- return extractCallback->SetOperationResult(retResult);
-
- COM_TRY_END
-}
-
-static HRESULT UpdateArchive(
- UInt64 unpackSize,
- ISequentialOutStream *outStream,
- int indexInClient,
- UInt32 dictionary,
- UInt32 numPasses,
- #ifndef _7ZIP_ST
- UInt32 numThreads,
- #endif
- IArchiveUpdateCallback *updateCallback)
-{
- RINOK(updateCallback->SetTotal(unpackSize));
- UInt64 complexity = 0;
- RINOK(updateCallback->SetCompleted(&complexity));
-
- CMyComPtr<ISequentialInStream> fileInStream;
-
- RINOK(updateCallback->GetStream(indexInClient, &fileInStream));
-
- CLocalProgress *localProgressSpec = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> localProgress = localProgressSpec;
- localProgressSpec->Init(updateCallback, true);
-
- NCompress::NBZip2::CEncoder *encoderSpec = new NCompress::NBZip2::CEncoder;
- CMyComPtr<ICompressCoder> encoder = encoderSpec;
- {
- NWindows::NCOM::CPropVariant properties[] =
- {
- dictionary,
- numPasses
- #ifndef _7ZIP_ST
- , numThreads
- #endif
- };
- PROPID propIDs[] =
- {
- NCoderPropID::kDictionarySize,
- NCoderPropID::kNumPasses
- #ifndef _7ZIP_ST
- , NCoderPropID::kNumThreads
- #endif
- };
- RINOK(encoderSpec->SetCoderProperties(propIDs, properties, sizeof(propIDs) / sizeof(propIDs[0])));
- }
-
- RINOK(encoder->Code(fileInStream, outStream, NULL, NULL, localProgress));
-
- return updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK);
-}
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *type)
-{
- *type = NFileTimeType::kUnix;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *updateCallback)
-{
- if (numItems != 1)
- return E_INVALIDARG;
-
- Int32 newData, newProps;
- UInt32 indexInArchive;
- if (!updateCallback)
- return E_FAIL;
- RINOK(updateCallback->GetUpdateItemInfo(0, &newData, &newProps, &indexInArchive));
-
- if (IntToBool(newProps))
- {
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidIsDir, &prop));
- if (prop.vt == VT_BOOL)
- {
- if (prop.boolVal != VARIANT_FALSE)
- return E_INVALIDARG;
- }
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- }
- }
-
- if (IntToBool(newData))
- {
- UInt64 size;
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- size = prop.uhVal.QuadPart;
- }
-
- UInt32 dicSize = _dicSize;
- if (dicSize == 0xFFFFFFFF)
- dicSize = (_level >= 5 ? kDicSizeX5 :
- (_level >= 3 ? kDicSizeX3 :
- kDicSizeX1));
-
- UInt32 numPasses = _numPasses;
- if (numPasses == 0xFFFFFFFF)
- numPasses = (_level >= 9 ? kNumPassesX9 :
- (_level >= 7 ? kNumPassesX7 :
- kNumPassesX1));
-
- return UpdateArchive(
- size, outStream, 0, dicSize, numPasses,
- #ifndef _7ZIP_ST
- _numThreads,
- #endif
- updateCallback);
- }
- if (indexInArchive != 0)
- return E_INVALIDARG;
- if (_stream)
- RINOK(_stream->Seek(_startPosition, STREAM_SEEK_SET, NULL));
- return NCompress::CopyStream(_stream, outStream, NULL);
-}
-
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps)
-{
- InitMethodProperties();
- #ifndef _7ZIP_ST
- const UInt32 numProcessors = NSystem::GetNumberOfProcessors();
- _numThreads = numProcessors;
- #endif
-
- for (int i = 0; i < numProps; i++)
- {
- UString name = names[i];
- name.MakeUpper();
- if (name.IsEmpty())
- return E_INVALIDARG;
- const PROPVARIANT &prop = values[i];
- if (name[0] == L'X')
- {
- UInt32 level = 9;
- RINOK(ParsePropValue(name.Mid(1), prop, level));
- _level = level;
- }
- else if (name[0] == L'D')
- {
- UInt32 dicSize = kDicSizeX5;
- RINOK(ParsePropDictionaryValue(name.Mid(1), prop, dicSize));
- _dicSize = dicSize;
- }
- else if (name.Left(4) == L"PASS")
- {
- UInt32 num = kNumPassesX9;
- RINOK(ParsePropValue(name.Mid(4), prop, num));
- _numPasses = num;
- }
- else if (name.Left(2) == L"MT")
- {
- #ifndef _7ZIP_ST
- RINOK(ParseMtProp(name.Mid(2), prop, numProcessors, _numThreads));
- #endif
- }
- else
- return E_INVALIDARG;
- }
- return S_OK;
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new CHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
- { L"bzip2", L"bz2 bzip2 tbz2 tbz", L"* * .tar .tar", 2, { 'B', 'Z', 'h' }, 3, true, CreateArc, CreateArcOut };
-
-REGISTER_ARC(BZip2)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabBlockInStream.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabBlockInStream.cpp
deleted file mode 100644
index 12c73eb5f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabBlockInStream.cpp
+++ /dev/null
@@ -1,189 +0,0 @@
-// CabBlockInStream.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/Alloc.h"
-
-#include "Common/Defs.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "CabBlockInStream.h"
-
-namespace NArchive {
-namespace NCab {
-
-static const UInt32 kBlockSize = (1 << 16);
-
-bool CCabBlockInStream::Create()
-{
- if (!_buffer)
- _buffer = (Byte *)::MyAlloc(kBlockSize);
- return (_buffer != 0);
-}
-
-CCabBlockInStream::~CCabBlockInStream()
-{
- MyFree(_buffer);
-}
-
-class CCheckSum2
-{
- UInt32 m_Value;
- int m_Pos;
- Byte m_Hist[4];
-public:
- CCheckSum2(): m_Value(0){};
- void Init() { m_Value = 0; m_Pos = 0; }
- void Update(const void *data, UInt32 size);
- void FinishDataUpdate()
- {
- for (int i = 0; i < m_Pos; i++)
- m_Value ^= ((UInt32)(m_Hist[i])) << (8 * (m_Pos - i - 1));
- }
- void UpdateUInt32(UInt32 v) { m_Value ^= v; }
- UInt32 GetResult() const { return m_Value; }
-};
-
-void CCheckSum2::Update(const void *data, UInt32 size)
-{
- UInt32 checkSum = m_Value;
- const Byte *dataPointer = (const Byte *)data;
-
- while (size != 0 && m_Pos != 0)
- {
- m_Hist[m_Pos] = *dataPointer++;
- m_Pos = (m_Pos + 1) & 3;
- size--;
- if (m_Pos == 0)
- for (int i = 0; i < 4; i++)
- checkSum ^= ((UInt32)m_Hist[i]) << (8 * i);
- }
-
- int numWords = size / 4;
-
- while (numWords-- != 0)
- {
- UInt32 temp = *dataPointer++;
- temp |= ((UInt32)(*dataPointer++)) << 8;
- temp |= ((UInt32)(*dataPointer++)) << 16;
- temp |= ((UInt32)(*dataPointer++)) << 24;
- checkSum ^= temp;
- }
- m_Value = checkSum;
-
- size &= 3;
-
- while (size != 0)
- {
- m_Hist[m_Pos] = *dataPointer++;
- m_Pos = (m_Pos + 1) & 3;
- size--;
- }
-}
-
-static const UInt32 kDataBlockHeaderSize = 8;
-
-class CTempCabInBuffer2
-{
-public:
- Byte Buffer[kDataBlockHeaderSize];
- UInt32 Pos;
- Byte ReadByte()
- {
- return Buffer[Pos++];
- }
- UInt32 ReadUInt32()
- {
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- value |= (((UInt32)ReadByte()) << (8 * i));
- return value;
- }
- UInt16 ReadUInt16()
- {
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- value |= (((UInt16)ReadByte()) << (8 * i));
- return value;
- }
-};
-
-HRESULT CCabBlockInStream::PreRead(UInt32 &packSize, UInt32 &unpackSize)
-{
- CTempCabInBuffer2 inBuffer;
- inBuffer.Pos = 0;
- RINOK(ReadStream_FALSE(_stream, inBuffer.Buffer, kDataBlockHeaderSize))
-
- UInt32 checkSum = inBuffer.ReadUInt32();
- packSize = inBuffer.ReadUInt16();
- unpackSize = inBuffer.ReadUInt16();
- if (ReservedSize != 0)
- {
- RINOK(ReadStream_FALSE(_stream, _buffer, ReservedSize));
- }
- _pos = 0;
- CCheckSum2 checkSumCalc;
- checkSumCalc.Init();
- UInt32 packSize2 = packSize;
- if (MsZip && _size == 0)
- {
- if (packSize < 2)
- return S_FALSE; // bad block;
- Byte sig[2];
- RINOK(ReadStream_FALSE(_stream, sig, 2));
- if (sig[0] != 0x43 || sig[1] != 0x4B)
- return S_FALSE;
- packSize2 -= 2;
- checkSumCalc.Update(sig, 2);
- }
-
- if (kBlockSize - _size < packSize2)
- return S_FALSE;
-
- UInt32 curSize = packSize2;
- if (curSize != 0)
- {
- size_t processedSizeLoc = curSize;
- RINOK(ReadStream(_stream, _buffer + _size, &processedSizeLoc));
- checkSumCalc.Update(_buffer + _size, (UInt32)processedSizeLoc);
- _size += (UInt32)processedSizeLoc;
- if (processedSizeLoc != curSize)
- return S_FALSE;
- }
- TotalPackSize = _size;
-
- checkSumCalc.FinishDataUpdate();
-
- bool dataError;
- if (checkSum == 0)
- dataError = false;
- else
- {
- checkSumCalc.UpdateUInt32(packSize | (((UInt32)unpackSize) << 16));
- dataError = (checkSumCalc.GetResult() != checkSum);
- }
- DataError |= dataError;
- return dataError ? S_FALSE : S_OK;
-}
-
-STDMETHODIMP CCabBlockInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != 0)
- *processedSize = 0;
- if (size == 0)
- return S_OK;
- if (_size != 0)
- {
- size = MyMin(_size, size);
- memmove(data, _buffer + _pos, size);
- _pos += size;
- _size -= size;
- if (processedSize != 0)
- *processedSize = size;
- return S_OK;
- }
- return S_OK; // no blocks data
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabBlockInStream.h b/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabBlockInStream.h
deleted file mode 100644
index 1db3835b4..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabBlockInStream.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// CabBlockInStream.cpp
-
-#ifndef __CABBLOCKINSTREAM_H
-#define __CABBLOCKINSTREAM_H
-
-#include "Common/MyCom.h"
-#include "../../IStream.h"
-
-namespace NArchive {
-namespace NCab {
-
-class CCabBlockInStream:
- public ISequentialInStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialInStream> _stream;
- Byte *_buffer;
- UInt32 _pos;
- UInt32 _size;
-
-public:
- UInt32 TotalPackSize;
- UInt32 ReservedSize;
- bool DataError;
- bool MsZip;
-
- CCabBlockInStream(): _buffer(0), ReservedSize(0), MsZip(false), DataError(false), TotalPackSize(0) {}
- ~CCabBlockInStream();
- bool Create();
- void SetStream(ISequentialInStream *stream) { _stream = stream; }
-
- void InitForNewFolder() { TotalPackSize = 0; }
- void InitForNewBlock() { _size = 0; }
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-
- HRESULT PreRead(UInt32 &packSize, UInt32 &unpackSize);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHandler.cpp
deleted file mode 100644
index 20f670d35..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHandler.cpp
+++ /dev/null
@@ -1,929 +0,0 @@
-// CabHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/Alloc.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/Defs.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-#include "Common/UTFConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-#include "../../Compress/DeflateDecoder.h"
-#include "../../Compress/LzxDecoder.h"
-#include "../../Compress/QuantumDecoder.h"
-
-#include "../Common/ItemNameUtils.h"
-
-#include "CabBlockInStream.h"
-#include "CabHandler.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NCab {
-
-// #define _CAB_DETAILS
-
-#ifdef _CAB_DETAILS
-enum
-{
- kpidBlockReal = kpidUserDefined
-};
-#endif
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidBlock, VT_I4}
- #ifdef _CAB_DETAILS
- ,
- { L"BlockReal", kpidBlockReal, VT_UI4},
- { NULL, kpidOffset, VT_UI4},
- { NULL, kpidVolume, VT_UI4}
- #endif
-};
-
-static const char *kMethods[] =
-{
- "None",
- "MSZip",
- "Quantum",
- "LZX"
-};
-
-static const int kNumMethods = sizeof(kMethods) / sizeof(kMethods[0]);
-static const char *kUnknownMethod = "Unknown";
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidMethod, VT_BSTR},
- // { NULL, kpidSolid, VT_BOOL},
- { NULL, kpidNumBlocks, VT_UI4},
- { NULL, kpidNumVolumes, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMethod:
- {
- AString resString;
- CRecordVector<Byte> ids;
- int i;
- for (int v = 0; v < m_Database.Volumes.Size(); v++)
- {
- const CDatabaseEx &de = m_Database.Volumes[v];
- for (i = 0; i < de.Folders.Size(); i++)
- ids.AddToUniqueSorted(de.Folders[i].GetCompressionMethod());
- }
- for (i = 0; i < ids.Size(); i++)
- {
- Byte id = ids[i];
- AString method = (id < kNumMethods) ? kMethods[id] : kUnknownMethod;
- if (!resString.IsEmpty())
- resString += ' ';
- resString += method;
- }
- prop = resString;
- break;
- }
- // case kpidSolid: prop = _database.IsSolid(); break;
- case kpidNumBlocks:
- {
- UInt32 numFolders = 0;
- for (int v = 0; v < m_Database.Volumes.Size(); v++)
- numFolders += m_Database.Volumes[v].Folders.Size();
- prop = numFolders;
- break;
- }
- case kpidNumVolumes:
- {
- prop = (UInt32)m_Database.Volumes.Size();
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- const CMvItem &mvItem = m_Database.Items[index];
- const CDatabaseEx &db = m_Database.Volumes[mvItem.VolumeIndex];
- int itemIndex = mvItem.ItemIndex;
- const CItem &item = db.Items[itemIndex];
- switch(propID)
- {
- case kpidPath:
- {
- UString unicodeName;
- if (item.IsNameUTF())
- ConvertUTF8ToUnicode(item.Name, unicodeName);
- else
- unicodeName = MultiByteToUnicodeString(item.Name, CP_ACP);
- prop = (const wchar_t *)NItemName::WinNameToOSName(unicodeName);
- break;
- }
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.Size; break;
- case kpidAttrib: prop = item.GetWinAttributes(); break;
-
- case kpidMTime:
- {
- FILETIME localFileTime, utcFileTime;
- if (NTime::DosTimeToFileTime(item.Time, localFileTime))
- {
- if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))
- utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
- }
- else
- utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
- prop = utcFileTime;
- break;
- }
-
- case kpidMethod:
- {
- UInt32 realFolderIndex = item.GetFolderIndex(db.Folders.Size());
- const CFolder &folder = db.Folders[realFolderIndex];
- int methodIndex = folder.GetCompressionMethod();
- AString method = (methodIndex < kNumMethods) ? kMethods[methodIndex] : kUnknownMethod;
- if (methodIndex == NHeader::NCompressionMethodMajor::kLZX ||
- methodIndex == NHeader::NCompressionMethodMajor::kQuantum)
- {
- method += ':';
- char temp[32];
- ConvertUInt64ToString(folder.CompressionTypeMinor, temp);
- method += temp;
- }
- prop = method;
- break;
- }
- case kpidBlock: prop = (Int32)m_Database.GetFolderIndex(&mvItem); break;
-
- #ifdef _CAB_DETAILS
-
- case kpidBlockReal: prop = (UInt32)item.FolderIndex; break;
- case kpidOffset: prop = (UInt32)item.Offset; break;
- case kpidVolume: prop = (UInt32)mvItem.VolumeIndex; break;
-
- #endif
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-/*
-class CProgressImp: public CProgressVirt
-{
- CMyComPtr<IArchiveOpenCallback> m_OpenArchiveCallback;
-public:
- STDMETHOD(SetTotal)(const UInt64 *numFiles);
- STDMETHOD(SetCompleted)(const UInt64 *numFiles);
- void Init(IArchiveOpenCallback *openArchiveCallback)
- { m_OpenArchiveCallback = openArchiveCallback; }
-};
-
-STDMETHODIMP CProgressImp::SetTotal(const UInt64 *numFiles)
-{
- if (m_OpenArchiveCallback)
- return m_OpenArchiveCallback->SetCompleted(numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CProgressImp::SetCompleted(const UInt64 *numFiles)
-{
- if (m_OpenArchiveCallback)
- return m_OpenArchiveCallback->SetCompleted(numFiles, NULL);
- return S_OK;
-}
-*/
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- Close();
- HRESULT res = S_FALSE;
- CInArchive archive;
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
- callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback);
-
- CMyComPtr<IInStream> nextStream = inStream;
- bool prevChecked = false;
- UInt64 numItems = 0;
- try
- {
- while (nextStream != 0)
- {
- CDatabaseEx db;
- db.Stream = nextStream;
- res = archive.Open(maxCheckStartPosition, db);
- if (res == S_OK)
- {
- if (!m_Database.Volumes.IsEmpty())
- {
- const CDatabaseEx &dbPrev = m_Database.Volumes[prevChecked ? m_Database.Volumes.Size() - 1 : 0];
- if (dbPrev.ArchiveInfo.SetID != db.ArchiveInfo.SetID ||
- dbPrev.ArchiveInfo.CabinetNumber + (prevChecked ? 1: - 1) !=
- db.ArchiveInfo.CabinetNumber)
- res = S_FALSE;
- }
- }
- if (res == S_OK)
- m_Database.Volumes.Insert(prevChecked ? m_Database.Volumes.Size() : 0, db);
- else if (res != S_FALSE)
- return res;
- else
- {
- if (m_Database.Volumes.IsEmpty())
- return S_FALSE;
- if (prevChecked)
- break;
- prevChecked = true;
- }
-
- numItems += db.Items.Size();
- RINOK(callback->SetCompleted(&numItems, NULL));
-
- nextStream = 0;
- for (;;)
- {
- const COtherArchive *otherArchive = 0;
- if (!prevChecked)
- {
- const CInArchiveInfo &ai = m_Database.Volumes.Front().ArchiveInfo;
- if (ai.IsTherePrev())
- otherArchive = &ai.PrevArc;
- else
- prevChecked = true;
- }
- if (otherArchive == 0)
- {
- const CInArchiveInfo &ai = m_Database.Volumes.Back().ArchiveInfo;
- if (ai.IsThereNext())
- otherArchive = &ai.NextArc;
- }
- if (!otherArchive)
- break;
- const UString fullName = MultiByteToUnicodeString(otherArchive->FileName, CP_ACP);
- if (!openVolumeCallback)
- break;
-
- HRESULT result = openVolumeCallback->GetStream(fullName, &nextStream);
- if (result == S_OK)
- break;
- if (result != S_FALSE)
- return result;
- if (prevChecked)
- break;
- prevChecked = true;
- }
- }
- if (res == S_OK)
- {
- m_Database.FillSortAndShrink();
- if (!m_Database.Check())
- res = S_FALSE;
- }
- }
- catch(...)
- {
- res = S_FALSE;
- }
- if (res != S_OK)
- {
- Close();
- return res;
- }
- COM_TRY_END
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- m_Database.Clear();
- return S_OK;
-}
-
-class CFolderOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-private:
- const CMvDatabaseEx *m_Database;
- const CRecordVector<bool> *m_ExtractStatuses;
-
- Byte *TempBuf;
- UInt32 TempBufSize;
- int NumIdenticalFiles;
- bool TempBufMode;
- UInt32 m_BufStartFolderOffset;
-
- int m_StartIndex;
- int m_CurrentIndex;
- CMyComPtr<IArchiveExtractCallback> m_ExtractCallback;
- bool m_TestMode;
-
- CMyComPtr<ISequentialOutStream> m_RealOutStream;
-
- bool m_IsOk;
- bool m_FileIsOpen;
- UInt32 m_RemainFileSize;
- UInt64 m_FolderSize;
- UInt64 m_PosInFolder;
-
- void FreeTempBuf()
- {
- ::MyFree(TempBuf);
- TempBuf = NULL;
- }
-
- HRESULT OpenFile();
- HRESULT CloseFileWithResOp(Int32 resOp);
- HRESULT CloseFile();
- HRESULT Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK);
-public:
- HRESULT WriteEmptyFiles();
-
- CFolderOutStream(): TempBuf(NULL) {}
- ~CFolderOutStream() { FreeTempBuf(); }
- void Init(
- const CMvDatabaseEx *database,
- const CRecordVector<bool> *extractStatuses,
- int startIndex,
- UInt64 folderSize,
- IArchiveExtractCallback *extractCallback,
- bool testMode);
- HRESULT FlushCorrupted();
- HRESULT Unsupported();
-
- UInt64 GetRemain() const { return m_FolderSize - m_PosInFolder; }
- UInt64 GetPosInFolder() const { return m_PosInFolder; }
-};
-
-void CFolderOutStream::Init(
- const CMvDatabaseEx *database,
- const CRecordVector<bool> *extractStatuses,
- int startIndex,
- UInt64 folderSize,
- IArchiveExtractCallback *extractCallback,
- bool testMode)
-{
- m_Database = database;
- m_ExtractStatuses = extractStatuses;
- m_StartIndex = startIndex;
- m_FolderSize = folderSize;
-
- m_ExtractCallback = extractCallback;
- m_TestMode = testMode;
-
- m_CurrentIndex = 0;
- m_PosInFolder = 0;
- m_FileIsOpen = false;
- m_IsOk = true;
- TempBufMode = false;
- NumIdenticalFiles = 0;
-}
-
-HRESULT CFolderOutStream::CloseFileWithResOp(Int32 resOp)
-{
- m_RealOutStream.Release();
- m_FileIsOpen = false;
- NumIdenticalFiles--;
- return m_ExtractCallback->SetOperationResult(resOp);
-}
-
-HRESULT CFolderOutStream::CloseFile()
-{
- return CloseFileWithResOp(m_IsOk ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError);
-}
-
-HRESULT CFolderOutStream::OpenFile()
-{
- if (NumIdenticalFiles == 0)
- {
- const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex];
- const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
- int numExtractItems = 0;
- int curIndex;
- for (curIndex = m_CurrentIndex; curIndex < m_ExtractStatuses->Size(); curIndex++)
- {
- const CMvItem &mvItem2 = m_Database->Items[m_StartIndex + curIndex];
- const CItem &item2 = m_Database->Volumes[mvItem2.VolumeIndex].Items[mvItem2.ItemIndex];
- if (item.Offset != item2.Offset ||
- item.Size != item2.Size ||
- item.Size == 0)
- break;
- if (!m_TestMode && (*m_ExtractStatuses)[curIndex])
- numExtractItems++;
- }
- NumIdenticalFiles = (curIndex - m_CurrentIndex);
- if (NumIdenticalFiles == 0)
- NumIdenticalFiles = 1;
- TempBufMode = false;
- if (numExtractItems > 1)
- {
- if (!TempBuf || item.Size > TempBufSize)
- {
- FreeTempBuf();
- TempBuf = (Byte *)MyAlloc(item.Size);
- TempBufSize = item.Size;
- if (TempBuf == NULL)
- return E_OUTOFMEMORY;
- }
- TempBufMode = true;
- m_BufStartFolderOffset = item.Offset;
- }
- else if (numExtractItems == 1)
- {
- while (NumIdenticalFiles && !(*m_ExtractStatuses)[m_CurrentIndex])
- {
- CMyComPtr<ISequentialOutStream> stream;
- RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &stream, NExtract::NAskMode::kSkip));
- if (stream)
- return E_FAIL;
- RINOK(m_ExtractCallback->PrepareOperation(NExtract::NAskMode::kSkip));
- m_CurrentIndex++;
- m_FileIsOpen = true;
- CloseFile();
- }
- }
- }
-
- Int32 askMode = (*m_ExtractStatuses)[m_CurrentIndex] ? (m_TestMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract) :
- NExtract::NAskMode::kSkip;
- RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &m_RealOutStream, askMode));
- if (!m_RealOutStream && !m_TestMode)
- askMode = NExtract::NAskMode::kSkip;
- return m_ExtractCallback->PrepareOperation(askMode);
-}
-
-HRESULT CFolderOutStream::WriteEmptyFiles()
-{
- if (m_FileIsOpen)
- return S_OK;
- for (; m_CurrentIndex < m_ExtractStatuses->Size(); m_CurrentIndex++)
- {
- const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex];
- const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
- UInt64 fileSize = item.Size;
- if (fileSize != 0)
- return S_OK;
- HRESULT result = OpenFile();
- m_RealOutStream.Release();
- RINOK(result);
- RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- return S_OK;
-}
-
-// This is Write function
-HRESULT CFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK)
-{
- COM_TRY_BEGIN
- UInt32 realProcessed = 0;
- if (processedSize != NULL)
- *processedSize = 0;
- while (size != 0)
- {
- if (m_FileIsOpen)
- {
- UInt32 numBytesToWrite = MyMin(m_RemainFileSize, size);
- HRESULT res = S_OK;
- if (numBytesToWrite > 0)
- {
- if (!isOK)
- m_IsOk = false;
- if (m_RealOutStream)
- {
- UInt32 processedSizeLocal = 0;
- res = m_RealOutStream->Write((const Byte *)data, numBytesToWrite, &processedSizeLocal);
- numBytesToWrite = processedSizeLocal;
- }
- if (TempBufMode && TempBuf)
- memcpy(TempBuf + (m_PosInFolder - m_BufStartFolderOffset), data, numBytesToWrite);
- }
- realProcessed += numBytesToWrite;
- if (processedSize != NULL)
- *processedSize = realProcessed;
- data = (const void *)((const Byte *)data + numBytesToWrite);
- size -= numBytesToWrite;
- m_RemainFileSize -= numBytesToWrite;
- m_PosInFolder += numBytesToWrite;
- if (res != S_OK)
- return res;
- if (m_RemainFileSize == 0)
- {
- RINOK(CloseFile());
-
- while (NumIdenticalFiles)
- {
- HRESULT result = OpenFile();
- m_FileIsOpen = true;
- m_CurrentIndex++;
- if (result == S_OK && m_RealOutStream && TempBuf)
- result = WriteStream(m_RealOutStream, TempBuf, (size_t)(m_PosInFolder - m_BufStartFolderOffset));
-
- if (!TempBuf && TempBufMode && m_RealOutStream)
- {
- RINOK(CloseFileWithResOp(NExtract::NOperationResult::kUnSupportedMethod));
- }
- else
- {
- RINOK(CloseFile());
- }
- RINOK(result);
- }
- TempBufMode = false;
- }
- if (realProcessed > 0)
- break; // with this break this function works as Write-Part
- }
- else
- {
- if (m_CurrentIndex >= m_ExtractStatuses->Size())
- return E_FAIL;
-
- const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex];
- const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
-
- m_RemainFileSize = item.Size;
-
- UInt32 fileOffset = item.Offset;
- if (fileOffset < m_PosInFolder)
- return E_FAIL;
- if (fileOffset > m_PosInFolder)
- {
- UInt32 numBytesToWrite = MyMin(fileOffset - (UInt32)m_PosInFolder, size);
- realProcessed += numBytesToWrite;
- if (processedSize != NULL)
- *processedSize = realProcessed;
- data = (const void *)((const Byte *)data + numBytesToWrite);
- size -= numBytesToWrite;
- m_PosInFolder += numBytesToWrite;
- }
- if (fileOffset == m_PosInFolder)
- {
- RINOK(OpenFile());
- m_FileIsOpen = true;
- m_CurrentIndex++;
- m_IsOk = true;
- }
- }
- }
- return WriteEmptyFiles();
- COM_TRY_END
-}
-
-STDMETHODIMP CFolderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- return Write2(data, size, processedSize, true);
-}
-
-HRESULT CFolderOutStream::FlushCorrupted()
-{
- const UInt32 kBufferSize = (1 << 10);
- Byte buffer[kBufferSize];
- for (int i = 0; i < kBufferSize; i++)
- buffer[i] = 0;
- for (;;)
- {
- UInt64 remain = GetRemain();
- if (remain == 0)
- return S_OK;
- UInt32 size = (UInt32)MyMin(remain, (UInt64)kBufferSize);
- UInt32 processedSizeLocal = 0;
- RINOK(Write2(buffer, size, &processedSizeLocal, false));
- }
-}
-
-HRESULT CFolderOutStream::Unsupported()
-{
- while(m_CurrentIndex < m_ExtractStatuses->Size())
- {
- HRESULT result = OpenFile();
- if (result != S_FALSE && result != S_OK)
- return result;
- m_RealOutStream.Release();
- RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- m_CurrentIndex++;
- }
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testModeSpec, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = m_Database.Items.Size();
- if(numItems == 0)
- return S_OK;
- bool testMode = (testModeSpec != 0);
- UInt64 totalUnPacked = 0;
-
- UInt32 i;
- int lastFolder = -2;
- UInt64 lastFolderSize = 0;
- for(i = 0; i < numItems; i++)
- {
- int index = allFilesMode ? i : indices[i];
- const CMvItem &mvItem = m_Database.Items[index];
- const CItem &item = m_Database.Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
- if (item.IsDir())
- continue;
- int folderIndex = m_Database.GetFolderIndex(&mvItem);
- if (folderIndex != lastFolder)
- totalUnPacked += lastFolderSize;
- lastFolder = folderIndex;
- lastFolderSize = item.GetEndOffset();
- }
- totalUnPacked += lastFolderSize;
-
- extractCallback->SetTotal(totalUnPacked);
-
- totalUnPacked = 0;
-
- UInt64 totalPacked = 0;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- NCompress::NDeflate::NDecoder::CCOMCoder *deflateDecoderSpec = NULL;
- CMyComPtr<ICompressCoder> deflateDecoder;
-
- NCompress::NLzx::CDecoder *lzxDecoderSpec = NULL;
- CMyComPtr<ICompressCoder> lzxDecoder;
-
- NCompress::NQuantum::CDecoder *quantumDecoderSpec = NULL;
- CMyComPtr<ICompressCoder> quantumDecoder;
-
- CCabBlockInStream *cabBlockInStreamSpec = new CCabBlockInStream();
- CMyComPtr<ISequentialInStream> cabBlockInStream = cabBlockInStreamSpec;
- if (!cabBlockInStreamSpec->Create())
- return E_OUTOFMEMORY;
-
- CRecordVector<bool> extractStatuses;
- for(i = 0; i < numItems;)
- {
- int index = allFilesMode ? i : indices[i];
-
- const CMvItem &mvItem = m_Database.Items[index];
- const CDatabaseEx &db = m_Database.Volumes[mvItem.VolumeIndex];
- int itemIndex = mvItem.ItemIndex;
- const CItem &item = db.Items[itemIndex];
-
- i++;
- if (item.IsDir())
- {
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- int folderIndex = m_Database.GetFolderIndex(&mvItem);
- if (folderIndex < 0)
- {
- // If we need previous archive
- Int32 askMode= testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kDataError));
- continue;
- }
- int startIndex2 = m_Database.FolderStartFileIndex[folderIndex];
- int startIndex = startIndex2;
- extractStatuses.Clear();
- for (; startIndex < index; startIndex++)
- extractStatuses.Add(false);
- extractStatuses.Add(true);
- startIndex++;
- UInt64 curUnpack = item.GetEndOffset();
- for(;i < numItems; i++)
- {
- int indexNext = allFilesMode ? i : indices[i];
- const CMvItem &mvItem = m_Database.Items[indexNext];
- const CItem &item = m_Database.Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
- if (item.IsDir())
- continue;
- int newFolderIndex = m_Database.GetFolderIndex(&mvItem);
-
- if (newFolderIndex != folderIndex)
- break;
- for (; startIndex < indexNext; startIndex++)
- extractStatuses.Add(false);
- extractStatuses.Add(true);
- startIndex++;
- curUnpack = item.GetEndOffset();
- }
-
- lps->OutSize = totalUnPacked;
- lps->InSize = totalPacked;
- RINOK(lps->SetCur());
-
- CFolderOutStream *cabFolderOutStream = new CFolderOutStream;
- CMyComPtr<ISequentialOutStream> outStream(cabFolderOutStream);
-
- const CFolder &folder = db.Folders[item.GetFolderIndex(db.Folders.Size())];
-
- cabFolderOutStream->Init(&m_Database, &extractStatuses, startIndex2,
- curUnpack, extractCallback, testMode);
-
- cabBlockInStreamSpec->MsZip = false;
- switch(folder.GetCompressionMethod())
- {
- case NHeader::NCompressionMethodMajor::kNone:
- break;
- case NHeader::NCompressionMethodMajor::kMSZip:
- if(deflateDecoderSpec == NULL)
- {
- deflateDecoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder;
- deflateDecoder = deflateDecoderSpec;
- }
- cabBlockInStreamSpec->MsZip = true;
- break;
- case NHeader::NCompressionMethodMajor::kLZX:
- if(lzxDecoderSpec == NULL)
- {
- lzxDecoderSpec = new NCompress::NLzx::CDecoder;
- lzxDecoder = lzxDecoderSpec;
- }
- RINOK(lzxDecoderSpec->SetParams(folder.CompressionTypeMinor));
- break;
- case NHeader::NCompressionMethodMajor::kQuantum:
- if(quantumDecoderSpec == NULL)
- {
- quantumDecoderSpec = new NCompress::NQuantum::CDecoder;
- quantumDecoder = quantumDecoderSpec;
- }
- quantumDecoderSpec->SetParams(folder.CompressionTypeMinor);
- break;
- default:
- {
- RINOK(cabFolderOutStream->Unsupported());
- totalUnPacked += curUnpack;
- continue;
- }
- }
-
- cabBlockInStreamSpec->InitForNewFolder();
-
- HRESULT res = S_OK;
-
- {
- int volIndex = mvItem.VolumeIndex;
- int locFolderIndex = item.GetFolderIndex(db.Folders.Size());
- bool keepHistory = false;
- bool keepInputBuffer = false;
- for (UInt32 f = 0; cabFolderOutStream->GetRemain() != 0;)
- {
- if (volIndex >= m_Database.Volumes.Size())
- {
- res = S_FALSE;
- break;
- }
-
- const CDatabaseEx &db = m_Database.Volumes[volIndex];
- const CFolder &folder = db.Folders[locFolderIndex];
- if (f == 0)
- {
- cabBlockInStreamSpec->SetStream(db.Stream);
- cabBlockInStreamSpec->ReservedSize = db.ArchiveInfo.GetDataBlockReserveSize();
- RINOK(db.Stream->Seek(db.StartPosition + folder.DataStart, STREAM_SEEK_SET, NULL));
- }
- if (f == folder.NumDataBlocks)
- {
- volIndex++;
- locFolderIndex = 0;
- f = 0;
- continue;
- }
- f++;
-
- cabBlockInStreamSpec->DataError = false;
-
- if (!keepInputBuffer)
- cabBlockInStreamSpec->InitForNewBlock();
-
- UInt32 packSize, unpackSize;
- res = cabBlockInStreamSpec->PreRead(packSize, unpackSize);
- if (res == S_FALSE)
- break;
- RINOK(res);
- keepInputBuffer = (unpackSize == 0);
- if (keepInputBuffer)
- continue;
-
- UInt64 totalUnPacked2 = totalUnPacked + cabFolderOutStream->GetPosInFolder();
- totalPacked += packSize;
-
- lps->OutSize = totalUnPacked2;
- lps->InSize = totalPacked;
- RINOK(lps->SetCur());
-
- UInt64 unpackRemain = cabFolderOutStream->GetRemain();
-
- const UInt32 kBlockSizeMax = (1 << 15);
- if (unpackRemain > kBlockSizeMax)
- unpackRemain = kBlockSizeMax;
- if (unpackRemain > unpackSize)
- unpackRemain = unpackSize;
-
- switch(folder.GetCompressionMethod())
- {
- case NHeader::NCompressionMethodMajor::kNone:
- res = copyCoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);
- break;
- case NHeader::NCompressionMethodMajor::kMSZip:
- deflateDecoderSpec->SetKeepHistory(keepHistory);
- res = deflateDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);
- break;
- case NHeader::NCompressionMethodMajor::kLZX:
- lzxDecoderSpec->SetKeepHistory(keepHistory);
- res = lzxDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);
- break;
- case NHeader::NCompressionMethodMajor::kQuantum:
- quantumDecoderSpec->SetKeepHistory(keepHistory);
- res = quantumDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);
- break;
- }
- if (res != S_OK)
- {
- if (res != S_FALSE)
- RINOK(res);
- break;
- }
- keepHistory = true;
- }
- if (res == S_OK)
- {
- RINOK(cabFolderOutStream->WriteEmptyFiles());
- }
- }
- if (res != S_OK || cabFolderOutStream->GetRemain() != 0)
- {
- RINOK(cabFolderOutStream->FlushCorrupted());
- }
- totalUnPacked += curUnpack;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = m_Database.Items.Size();
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHandler.h b/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHandler.h
deleted file mode 100644
index 1edcd11e2..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHandler.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// CabHandler.h
-
-#ifndef __CAB_HANDLER_H
-#define __CAB_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-#include "CabIn.h"
-
-namespace NArchive {
-namespace NCab {
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP1(IInArchive)
-
- INTERFACE_IInArchive(;)
-
-private:
- CMvDatabaseEx m_Database;
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHeader.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHeader.cpp
deleted file mode 100644
index 0cba1b0b7..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHeader.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// CabHeader.cpp
-
-#include "StdAfx.h"
-
-#include "CabHeader.h"
-
-namespace NArchive {
-namespace NCab {
-namespace NHeader {
-
-Byte kMarker[kMarkerSize] = {'M', 'S', 'C', 'F', 0, 0, 0, 0 };
-
-// struct CSignatureInitializer { CSignatureInitializer() { kMarker[0]--; }; } g_SignatureInitializer;
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHeader.h b/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHeader.h
deleted file mode 100644
index 0f0d2af35..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabHeader.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Archive/Cab/Header.h
-
-#ifndef __ARCHIVE_CAB_HEADER_H
-#define __ARCHIVE_CAB_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NCab {
-namespace NHeader {
-
-const unsigned kMarkerSize = 8;
-extern Byte kMarker[kMarkerSize];
-
-namespace NArchive
-{
- namespace NFlags
- {
- const int kPrevCabinet = 0x0001;
- const int kNextCabinet = 0x0002;
- const int kReservePresent = 0x0004;
- }
-}
-
-namespace NCompressionMethodMajor
-{
- const Byte kNone = 0;
- const Byte kMSZip = 1;
- const Byte kQuantum = 2;
- const Byte kLZX = 3;
-}
-
-const int kFileNameIsUTFAttributeMask = 0x80;
-
-namespace NFolderIndex
-{
- const int kContinuedFromPrev = 0xFFFD;
- const int kContinuedToNext = 0xFFFE;
- const int kContinuedPrevAndNext = 0xFFFF;
-}
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabIn.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabIn.cpp
deleted file mode 100644
index c0bffa2d2..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabIn.cpp
+++ /dev/null
@@ -1,272 +0,0 @@
-// Archive/CabIn.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/FindSignature.h"
-
-#include "CabIn.h"
-
-namespace NArchive {
-namespace NCab {
-
-Byte CInArchive::Read8()
-{
- Byte b;
- if (!inBuffer.ReadByte(b))
- throw CInArchiveException(CInArchiveException::kUnsupported);
- return b;
-}
-
-UInt16 CInArchive::Read16()
-{
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- {
- Byte b = Read8();
- value |= (UInt16(b) << (8 * i));
- }
- return value;
-}
-
-UInt32 CInArchive::Read32()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- {
- Byte b = Read8();
- value |= (UInt32(b) << (8 * i));
- }
- return value;
-}
-
-AString CInArchive::SafeReadName()
-{
- AString name;
- for (;;)
- {
- Byte b = Read8();
- if (b == 0)
- return name;
- name += (char)b;
- }
-}
-
-void CInArchive::ReadOtherArchive(COtherArchive &oa)
-{
- oa.FileName = SafeReadName();
- oa.DiskName = SafeReadName();
-}
-
-void CInArchive::Skip(UInt32 size)
-{
- while (size-- != 0)
- Read8();
-}
-
-HRESULT CInArchive::Open(const UInt64 *searchHeaderSizeLimit, CDatabaseEx &db)
-{
- IInStream *stream = db.Stream;
- db.Clear();
- RINOK(stream->Seek(0, STREAM_SEEK_SET, &db.StartPosition));
-
- RINOK(FindSignatureInStream(stream, NHeader::kMarker, NHeader::kMarkerSize,
- searchHeaderSizeLimit, db.StartPosition));
-
- RINOK(stream->Seek(db.StartPosition + NHeader::kMarkerSize, STREAM_SEEK_SET, NULL));
- if (!inBuffer.Create(1 << 17))
- return E_OUTOFMEMORY;
- inBuffer.SetStream(stream);
- inBuffer.Init();
-
- CInArchiveInfo &ai = db.ArchiveInfo;
-
- ai.Size = Read32();
- if (Read32() != 0)
- return S_FALSE;
- ai.FileHeadersOffset = Read32();
- if (Read32() != 0)
- return S_FALSE;
-
- ai.VersionMinor = Read8();
- ai.VersionMajor = Read8();
- ai.NumFolders = Read16();
- ai.NumFiles = Read16();
- ai.Flags = Read16();
- if (ai.Flags > 7)
- return S_FALSE;
- ai.SetID = Read16();
- ai.CabinetNumber = Read16();
-
- if (ai.ReserveBlockPresent())
- {
- ai.PerCabinetAreaSize = Read16();
- ai.PerFolderAreaSize = Read8();
- ai.PerDataBlockAreaSize = Read8();
-
- Skip(ai.PerCabinetAreaSize);
- }
-
- {
- if (ai.IsTherePrev())
- ReadOtherArchive(ai.PrevArc);
- if (ai.IsThereNext())
- ReadOtherArchive(ai.NextArc);
- }
-
- int i;
- for (i = 0; i < ai.NumFolders; i++)
- {
- CFolder folder;
-
- folder.DataStart = Read32();
- folder.NumDataBlocks = Read16();
- folder.CompressionTypeMajor = Read8();
- folder.CompressionTypeMinor = Read8();
-
- Skip(ai.PerFolderAreaSize);
- db.Folders.Add(folder);
- }
-
- RINOK(stream->Seek(db.StartPosition + ai.FileHeadersOffset, STREAM_SEEK_SET, NULL));
-
- inBuffer.SetStream(stream);
- inBuffer.Init();
- for (i = 0; i < ai.NumFiles; i++)
- {
- CItem item;
- item.Size = Read32();
- item.Offset = Read32();
- item.FolderIndex = Read16();
- UInt16 pureDate = Read16();
- UInt16 pureTime = Read16();
- item.Time = ((UInt32(pureDate) << 16)) | pureTime;
- item.Attributes = Read16();
- item.Name = SafeReadName();
- int folderIndex = item.GetFolderIndex(db.Folders.Size());
- if (folderIndex >= db.Folders.Size())
- return S_FALSE;
- db.Items.Add(item);
- }
- return S_OK;
-}
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareMvItems(const CMvItem *p1, const CMvItem *p2, void *param)
-{
- const CMvDatabaseEx &mvDb = *(const CMvDatabaseEx *)param;
- const CDatabaseEx &db1 = mvDb.Volumes[p1->VolumeIndex];
- const CDatabaseEx &db2 = mvDb.Volumes[p2->VolumeIndex];
- const CItem &item1 = db1.Items[p1->ItemIndex];
- const CItem &item2 = db2.Items[p2->ItemIndex];;
- bool isDir1 = item1.IsDir();
- bool isDir2 = item2.IsDir();
- if (isDir1 && !isDir2)
- return -1;
- if (isDir2 && !isDir1)
- return 1;
- int f1 = mvDb.GetFolderIndex(p1);
- int f2 = mvDb.GetFolderIndex(p2);
- RINOZ(MyCompare(f1, f2));
- RINOZ(MyCompare(item1.Offset, item2.Offset));
- RINOZ(MyCompare(item1.Size, item2.Size));
- RINOZ(MyCompare(p1->VolumeIndex, p2->VolumeIndex));
- return MyCompare(p1->ItemIndex, p2->ItemIndex);
-}
-
-bool CMvDatabaseEx::AreItemsEqual(int i1, int i2)
-{
- const CMvItem *p1 = &Items[i1];
- const CMvItem *p2 = &Items[i2];
- const CDatabaseEx &db1 = Volumes[p1->VolumeIndex];
- const CDatabaseEx &db2 = Volumes[p2->VolumeIndex];
- const CItem &item1 = db1.Items[p1->ItemIndex];
- const CItem &item2 = db2.Items[p2->ItemIndex];;
- return GetFolderIndex(p1) == GetFolderIndex(p2) &&
- item1.Offset == item2.Offset &&
- item1.Size == item2.Size &&
- item1.Name == item2.Name;
-}
-
-void CMvDatabaseEx::FillSortAndShrink()
-{
- Items.Clear();
- StartFolderOfVol.Clear();
- FolderStartFileIndex.Clear();
- int offset = 0;
- for (int v = 0; v < Volumes.Size(); v++)
- {
- const CDatabaseEx &db = Volumes[v];
- int curOffset = offset;
- if (db.IsTherePrevFolder())
- curOffset--;
- StartFolderOfVol.Add(curOffset);
- offset += db.GetNumberOfNewFolders();
-
- CMvItem mvItem;
- mvItem.VolumeIndex = v;
- for (int i = 0 ; i < db.Items.Size(); i++)
- {
- mvItem.ItemIndex = i;
- Items.Add(mvItem);
- }
- }
-
- Items.Sort(CompareMvItems, (void *)this);
- int j = 1;
- int i;
- for (i = 1; i < Items.Size(); i++)
- if (!AreItemsEqual(i, i -1))
- Items[j++] = Items[i];
- Items.DeleteFrom(j);
-
- for (i = 0; i < Items.Size(); i++)
- {
- int folderIndex = GetFolderIndex(&Items[i]);
- if (folderIndex >= FolderStartFileIndex.Size())
- FolderStartFileIndex.Add(i);
- }
-}
-
-bool CMvDatabaseEx::Check()
-{
- for (int v = 1; v < Volumes.Size(); v++)
- {
- const CDatabaseEx &db1 = Volumes[v];
- if (db1.IsTherePrevFolder())
- {
- const CDatabaseEx &db0 = Volumes[v - 1];
- if (db0.Folders.IsEmpty() || db1.Folders.IsEmpty())
- return false;
- const CFolder &f0 = db0.Folders.Back();
- const CFolder &f1 = db1.Folders.Front();
- if (f0.CompressionTypeMajor != f1.CompressionTypeMajor ||
- f0.CompressionTypeMinor != f1.CompressionTypeMinor)
- return false;
- }
- }
- UInt32 beginPos = 0;
- UInt64 endPos = 0;
- int prevFolder = -2;
- for (int i = 0; i < Items.Size(); i++)
- {
- const CMvItem &mvItem = Items[i];
- int fIndex = GetFolderIndex(&mvItem);
- if (fIndex >= FolderStartFileIndex.Size())
- return false;
- const CItem &item = Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
- if (item.IsDir())
- continue;
- int folderIndex = GetFolderIndex(&mvItem);
- if (folderIndex != prevFolder)
- prevFolder = folderIndex;
- else if (item.Offset < endPos &&
- (item.Offset != beginPos || item.GetEndOffset() != endPos))
- return false;
- beginPos = item.Offset;
- endPos = item.GetEndOffset();
- }
- return true;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabIn.h b/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabIn.h
deleted file mode 100644
index 1e9b188b5..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabIn.h
+++ /dev/null
@@ -1,161 +0,0 @@
-// Archive/CabIn.h
-
-#ifndef __ARCHIVE_CAB_IN_H
-#define __ARCHIVE_CAB_IN_H
-
-#include "../../IStream.h"
-#include "../../Common/InBuffer.h"
-#include "CabHeader.h"
-#include "CabItem.h"
-
-namespace NArchive {
-namespace NCab {
-
-class CInArchiveException
-{
-public:
- enum CCauseType
- {
- kUnexpectedEndOfArchive = 0,
- kIncorrectArchive,
- kUnsupported
- } Cause;
- CInArchiveException(CCauseType cause) : Cause(cause) {}
-};
-
-struct COtherArchive
-{
- AString FileName;
- AString DiskName;
-};
-
-struct CArchiveInfo
-{
- Byte VersionMinor; /* cabinet file format version, minor */
- Byte VersionMajor; /* cabinet file format version, major */
- UInt16 NumFolders; /* number of CFFOLDER entries in this cabinet */
- UInt16 NumFiles; /* number of CFFILE entries in this cabinet */
- UInt16 Flags; /* cabinet file option indicators */
- UInt16 SetID; /* must be the same for all cabinets in a set */
- UInt16 CabinetNumber; /* number of this cabinet file in a set */
-
- bool ReserveBlockPresent() const { return (Flags & NHeader::NArchive::NFlags::kReservePresent) != 0; }
-
- bool IsTherePrev() const { return (Flags & NHeader::NArchive::NFlags::kPrevCabinet) != 0; }
- bool IsThereNext() const { return (Flags & NHeader::NArchive::NFlags::kNextCabinet) != 0; }
-
- UInt16 PerCabinetAreaSize; // (optional) size of per-cabinet reserved area
- Byte PerFolderAreaSize; // (optional) size of per-folder reserved area
- Byte PerDataBlockAreaSize; // (optional) size of per-datablock reserved area
-
- Byte GetDataBlockReserveSize() const { return (Byte)(ReserveBlockPresent() ? PerDataBlockAreaSize : 0); }
-
- COtherArchive PrevArc;
- COtherArchive NextArc;
-
- CArchiveInfo()
- {
- Clear();
- }
-
- void Clear()
- {
- PerCabinetAreaSize = 0;
- PerFolderAreaSize = 0;
- PerDataBlockAreaSize = 0;
- }
-};
-
-struct CInArchiveInfo: public CArchiveInfo
-{
- UInt32 Size; /* size of this cabinet file in bytes */
- UInt32 FileHeadersOffset; // offset of the first CFFILE entry
-};
-
-
-struct CDatabase
-{
- UInt64 StartPosition;
- CInArchiveInfo ArchiveInfo;
- CObjectVector<CFolder> Folders;
- CObjectVector<CItem> Items;
-
- void Clear()
- {
- ArchiveInfo.Clear();
- Folders.Clear();
- Items.Clear();
- }
- bool IsTherePrevFolder() const
- {
- for (int i = 0; i < Items.Size(); i++)
- if (Items[i].ContinuedFromPrev())
- return true;
- return false;
- }
- int GetNumberOfNewFolders() const
- {
- int res = Folders.Size();
- if (IsTherePrevFolder())
- res--;
- return res;
- }
- UInt32 GetFileOffset(int index) const { return Items[index].Offset; }
- UInt32 GetFileSize(int index) const { return Items[index].Size; }
-};
-
-struct CDatabaseEx: public CDatabase
-{
- CMyComPtr<IInStream> Stream;
-};
-
-struct CMvItem
-{
- int VolumeIndex;
- int ItemIndex;
-};
-
-class CMvDatabaseEx
-{
- bool AreItemsEqual(int i1, int i2);
-public:
- CObjectVector<CDatabaseEx> Volumes;
- CRecordVector<CMvItem> Items;
- CRecordVector<int> StartFolderOfVol;
- CRecordVector<int> FolderStartFileIndex;
-
- int GetFolderIndex(const CMvItem *mvi) const
- {
- const CDatabaseEx &db = Volumes[mvi->VolumeIndex];
- return StartFolderOfVol[mvi->VolumeIndex] +
- db.Items[mvi->ItemIndex].GetFolderIndex(db.Folders.Size());
- }
- void Clear()
- {
- Volumes.Clear();
- Items.Clear();
- StartFolderOfVol.Clear();
- FolderStartFileIndex.Clear();
- }
- void FillSortAndShrink();
- bool Check();
-};
-
-class CInArchive
-{
- CInBuffer inBuffer;
-
- Byte Read8();
- UInt16 Read16();
- UInt32 Read32();
- AString SafeReadName();
- void Skip(UInt32 size);
- void ReadOtherArchive(COtherArchive &oa);
-
-public:
- HRESULT Open(const UInt64 *searchHeaderSizeLimit, CDatabaseEx &db);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabItem.h b/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabItem.h
deleted file mode 100644
index 63a1e856c..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabItem.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Archive/CabItem.h
-
-#ifndef __ARCHIVE_CAB_ITEM_H
-#define __ARCHIVE_CAB_ITEM_H
-
-#include "Common/Types.h"
-#include "Common/MyString.h"
-#include "CabHeader.h"
-
-namespace NArchive {
-namespace NCab {
-
-struct CFolder
-{
- UInt32 DataStart; // offset of the first CFDATA block in this folder
- UInt16 NumDataBlocks; // number of CFDATA blocks in this folder
- Byte CompressionTypeMajor;
- Byte CompressionTypeMinor;
- Byte GetCompressionMethod() const { return (Byte)(CompressionTypeMajor & 0xF); }
-};
-
-struct CItem
-{
- AString Name;
- UInt32 Offset;
- UInt32 Size;
- UInt32 Time;
- UInt16 FolderIndex;
- UInt16 Flags;
- UInt16 Attributes;
-
- UInt64 GetEndOffset() const { return (UInt64)Offset + Size; }
- UInt32 GetWinAttributes() const { return (Attributes & ~NHeader::kFileNameIsUTFAttributeMask); }
- bool IsNameUTF() const { return (Attributes & NHeader::kFileNameIsUTFAttributeMask) != 0; }
- bool IsDir() const { return (Attributes & FILE_ATTRIBUTE_DIRECTORY) != 0; }
-
- bool ContinuedFromPrev() const
- {
- return
- (FolderIndex == NHeader::NFolderIndex::kContinuedFromPrev) ||
- (FolderIndex == NHeader::NFolderIndex::kContinuedPrevAndNext);
- }
-
- bool ContinuedToNext() const
- {
- return
- (FolderIndex == NHeader::NFolderIndex::kContinuedToNext) ||
- (FolderIndex == NHeader::NFolderIndex::kContinuedPrevAndNext);
- }
-
- int GetFolderIndex(int numFolders) const
- {
- if (ContinuedFromPrev())
- return 0;
- if (ContinuedToNext())
- return (numFolders - 1);
- return FolderIndex;
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabRegister.cpp
deleted file mode 100644
index 15fe4099f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Cab/CabRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// CabRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "CabHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NCab::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Cab", L"cab", 0, 8, { 0x4D, 0x53, 0x43, 0x46 }, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Cab)
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHandler.cpp
deleted file mode 100644
index a9e334b03..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHandler.cpp
+++ /dev/null
@@ -1,721 +0,0 @@
-// ChmHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/Defs.h"
-#include "Common/StringConvert.h"
-#include "Common/UTFConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-#include "../../Compress/LzxDecoder.h"
-
-#include "../Common/ItemNameUtils.h"
-
-#include "ChmHandler.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-namespace NArchive {
-namespace NChm {
-
-// #define _CHM_DETAILS
-
-#ifdef _CHM_DETAILS
-
-enum
-{
- kpidSection = kpidUserDefined
-};
-
-#endif
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidBlock, VT_UI4}
-
- #ifdef _CHM_DETAILS
- ,
- { L"Section", kpidSection, VT_UI4},
- { NULL, kpidOffset, VT_UI4}
- #endif
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidNumBlocks, VT_UI8}
-};
-
-IMP_IInArchive_Props
-
-IMP_IInArchive_ArcProps_NO
-/*
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidNumBlocks:
- {
- UInt64 numBlocks = 0;
- for (int i = 0; i < m_Database.Sections.Size(); i++)
- {
- const CSectionInfo &s = m_Database.Sections[i];
- for (int j = 0; j < s.Methods.Size(); j++)
- {
- const CMethodInfo &m = s.Methods[j];
- if (m.IsLzx())
- numBlocks += m.LzxInfo.ResetTable.GetNumBlocks();
- }
- }
- prop = numBlocks;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-*/
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- if (m_Database.NewFormat)
- {
- switch(propID)
- {
- case kpidSize:
- prop = (UInt64)m_Database.NewFormatString.Length();
- break;
- }
- prop.Detach(value);
- return S_OK;
- }
- int entryIndex;
- if (m_Database.LowLevel)
- entryIndex = index;
- else
- entryIndex = m_Database.Indices[index];
- const CItem &item = m_Database.Items[entryIndex];
- switch(propID)
- {
- case kpidPath:
- {
- UString us;
- if (ConvertUTF8ToUnicode(item.Name, us))
- {
- if (!m_Database.LowLevel)
- {
- if (us.Length() > 1)
- if (us[0] == L'/')
- us.Delete(0);
- }
- prop = NItemName::GetOSName2(us);
- }
- break;
- }
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.Size; break;
- case kpidMethod:
- {
- if (!item.IsDir())
- if (item.Section == 0)
- prop = L"Copy";
- else if (item.Section < m_Database.Sections.Size())
- prop = m_Database.Sections[(int)item.Section].GetMethodName();
- break;
- }
- case kpidBlock:
- if (m_Database.LowLevel)
- prop = item.Section;
- else if (item.Section != 0)
- prop = m_Database.GetFolder(index);
- break;
-
- #ifdef _CHM_DETAILS
-
- case kpidSection: prop = (UInt32)item.Section; break;
- case kpidOffset: prop = (UInt32)item.Offset; break;
-
- #endif
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CProgressImp: public CProgressVirt
-{
- CMyComPtr<IArchiveOpenCallback> _callback;
-public:
- STDMETHOD(SetTotal)(const UInt64 *numFiles);
- STDMETHOD(SetCompleted)(const UInt64 *numFiles);
- CProgressImp(IArchiveOpenCallback *callback): _callback(callback) {};
-};
-
-STDMETHODIMP CProgressImp::SetTotal(const UInt64 *numFiles)
-{
- if (_callback)
- return _callback->SetCompleted(numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CProgressImp::SetCompleted(const UInt64 *numFiles)
-{
- if (_callback)
- return _callback->SetCompleted(numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- m_Stream.Release();
- try
- {
- CInArchive archive;
- // CProgressImp progressImp(openArchiveCallback);
- RINOK(archive.Open(inStream, maxCheckStartPosition, m_Database));
- /*
- if (m_Database.LowLevel)
- return S_FALSE;
- */
- m_Stream = inStream;
- }
- catch(...)
- {
- return S_FALSE;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- m_Database.Clear();
- m_Stream.Release();
- return S_OK;
-}
-
-class CChmFolderOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
-
- HRESULT Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK);
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-
- UInt64 m_FolderSize;
- UInt64 m_PosInFolder;
- UInt64 m_PosInSection;
- const CRecordVector<bool> *m_ExtractStatuses;
- int m_StartIndex;
- int m_CurrentIndex;
- int m_NumFiles;
-
-private:
- const CFilesDatabase *m_Database;
- CMyComPtr<IArchiveExtractCallback> m_ExtractCallback;
- bool m_TestMode;
-
- bool m_IsOk;
- bool m_FileIsOpen;
- UInt64 m_RemainFileSize;
- CMyComPtr<ISequentialOutStream> m_RealOutStream;
-
- HRESULT OpenFile();
- HRESULT WriteEmptyFiles();
-public:
- void Init(
- const CFilesDatabase *database,
- IArchiveExtractCallback *extractCallback,
- bool testMode);
- HRESULT FlushCorrupted(UInt64 maxSize);
-};
-
-void CChmFolderOutStream::Init(
- const CFilesDatabase *database,
- IArchiveExtractCallback *extractCallback,
- bool testMode)
-{
- m_Database = database;
- m_ExtractCallback = extractCallback;
- m_TestMode = testMode;
-
- m_CurrentIndex = 0;
- m_FileIsOpen = false;
-}
-
-HRESULT CChmFolderOutStream::OpenFile()
-{
- Int32 askMode = (*m_ExtractStatuses)[m_CurrentIndex] ? (m_TestMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract) :
- NExtract::NAskMode::kSkip;
- m_RealOutStream.Release();
- RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &m_RealOutStream, askMode));
- if (!m_RealOutStream && !m_TestMode)
- askMode = NExtract::NAskMode::kSkip;
- return m_ExtractCallback->PrepareOperation(askMode);
-}
-
-HRESULT CChmFolderOutStream::WriteEmptyFiles()
-{
- if (m_FileIsOpen)
- return S_OK;
- for (;m_CurrentIndex < m_NumFiles; m_CurrentIndex++)
- {
- UInt64 fileSize = m_Database->GetFileSize(m_StartIndex + m_CurrentIndex);
- if (fileSize != 0)
- return S_OK;
- HRESULT result = OpenFile();
- m_RealOutStream.Release();
- RINOK(result);
- RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- return S_OK;
-}
-
-// This is WritePart function
-HRESULT CChmFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK)
-{
- UInt32 realProcessed = 0;
- if (processedSize != NULL)
- *processedSize = 0;
- while(size != 0)
- {
- if (m_FileIsOpen)
- {
- UInt32 numBytesToWrite = (UInt32)MyMin(m_RemainFileSize, (UInt64)(size));
- HRESULT res = S_OK;
- if (numBytesToWrite > 0)
- {
- if (!isOK)
- m_IsOk = false;
- if (m_RealOutStream)
- {
- UInt32 processedSizeLocal = 0;
- res = m_RealOutStream->Write((const Byte *)data, numBytesToWrite, &processedSizeLocal);
- numBytesToWrite = processedSizeLocal;
- }
- }
- realProcessed += numBytesToWrite;
- if (processedSize != NULL)
- *processedSize = realProcessed;
- data = (const void *)((const Byte *)data + numBytesToWrite);
- size -= numBytesToWrite;
- m_RemainFileSize -= numBytesToWrite;
- m_PosInSection += numBytesToWrite;
- m_PosInFolder += numBytesToWrite;
- if (res != S_OK)
- return res;
- if (m_RemainFileSize == 0)
- {
- m_RealOutStream.Release();
- RINOK(m_ExtractCallback->SetOperationResult(
- m_IsOk ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- m_FileIsOpen = false;
- }
- if (realProcessed > 0)
- break; // with this break this function works as write part
- }
- else
- {
- if (m_CurrentIndex >= m_NumFiles)
- return E_FAIL;
- int fullIndex = m_StartIndex + m_CurrentIndex;
- m_RemainFileSize = m_Database->GetFileSize(fullIndex);
- UInt64 fileOffset = m_Database->GetFileOffset(fullIndex);
- if (fileOffset < m_PosInSection)
- return E_FAIL;
- if (fileOffset > m_PosInSection)
- {
- UInt32 numBytesToWrite = (UInt32)MyMin(fileOffset - m_PosInSection, UInt64(size));
- realProcessed += numBytesToWrite;
- if (processedSize != NULL)
- *processedSize = realProcessed;
- data = (const void *)((const Byte *)data + numBytesToWrite);
- size -= numBytesToWrite;
- m_PosInSection += numBytesToWrite;
- m_PosInFolder += numBytesToWrite;
- }
- if (fileOffset == m_PosInSection)
- {
- RINOK(OpenFile());
- m_FileIsOpen = true;
- m_CurrentIndex++;
- m_IsOk = true;
- }
- }
- }
- return WriteEmptyFiles();
-}
-
-STDMETHODIMP CChmFolderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- return Write2(data, size, processedSize, true);
-}
-
-HRESULT CChmFolderOutStream::FlushCorrupted(UInt64 maxSize)
-{
- const UInt32 kBufferSize = (1 << 10);
- Byte buffer[kBufferSize];
- for (int i = 0; i < kBufferSize; i++)
- buffer[i] = 0;
- if (maxSize > m_FolderSize)
- maxSize = m_FolderSize;
- while (m_PosInFolder < maxSize)
- {
- UInt32 size = (UInt32)MyMin(maxSize - m_PosInFolder, (UInt64)kBufferSize);
- UInt32 processedSizeLocal = 0;
- RINOK(Write2(buffer, size, &processedSizeLocal, false));
- if (processedSizeLocal == 0)
- return S_OK;
- }
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testModeSpec, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
-
- if (allFilesMode)
- numItems = m_Database.NewFormat ? 1:
- (m_Database.LowLevel ?
- m_Database.Items.Size():
- m_Database.Indices.Size());
- if (numItems == 0)
- return S_OK;
- bool testMode = (testModeSpec != 0);
-
- UInt64 currentTotalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
- UInt32 i;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(m_Stream);
-
- if (m_Database.LowLevel)
- {
- UInt64 currentItemSize = 0;
- UInt64 totalSize = 0;
- if (m_Database.NewFormat)
- totalSize = m_Database.NewFormatString.Length();
- else
- for (i = 0; i < numItems; i++)
- totalSize += m_Database.Items[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- currentItemSize = 0;
- lps->InSize = currentTotalSize; // Change it
- lps->OutSize = currentTotalSize;
-
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode= testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (m_Database.NewFormat)
- {
- if (index != 0)
- return E_FAIL;
- if (!testMode && !realOutStream)
- continue;
- if (!testMode)
- {
- UInt32 size = m_Database.NewFormatString.Length();
- RINOK(WriteStream(realOutStream, (const char *)m_Database.NewFormatString, size));
- }
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- const CItem &item = m_Database.Items[index];
-
- currentItemSize = item.Size;
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (item.Section != 0)
- {
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
-
- if (testMode)
- {
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- RINOK(m_Stream->Seek(m_Database.ContentOffset + item.Offset, STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
-
- RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- }
-
- UInt64 lastFolderIndex = ((UInt64)0 - 1);
- for (i = 0; i < numItems; i++)
- {
- UInt32 index = allFilesMode ? i : indices[i];
- int entryIndex = m_Database.Indices[index];
- const CItem &item = m_Database.Items[entryIndex];
- UInt64 sectionIndex = item.Section;
- if (item.IsDir() || item.Size == 0)
- continue;
- if (sectionIndex == 0)
- {
- currentTotalSize += item.Size;
- continue;
- }
- const CSectionInfo &section = m_Database.Sections[(int)item.Section];
- if (section.IsLzx())
- {
- const CLzxInfo &lzxInfo = section.Methods[0].LzxInfo;
- UInt64 folderIndex = m_Database.GetFolder(index);
- if (lastFolderIndex == folderIndex)
- folderIndex++;
- lastFolderIndex = m_Database.GetLastFolder(index);
- for (; folderIndex <= lastFolderIndex; folderIndex++)
- currentTotalSize += lzxInfo.GetFolderSize();
- }
- }
-
- RINOK(extractCallback->SetTotal(currentTotalSize));
-
- NCompress::NLzx::CDecoder *lzxDecoderSpec = 0;
- CMyComPtr<ICompressCoder> lzxDecoder;
- CChmFolderOutStream *chmFolderOutStream = 0;
- CMyComPtr<ISequentialOutStream> outStream;
-
- currentTotalSize = 0;
-
- CRecordVector<bool> extractStatuses;
- for (i = 0; i < numItems;)
- {
- RINOK(extractCallback->SetCompleted(&currentTotalSize));
- UInt32 index = allFilesMode ? i : indices[i];
- i++;
- int entryIndex = m_Database.Indices[index];
- const CItem &item = m_Database.Items[entryIndex];
- UInt64 sectionIndex = item.Section;
- Int32 askMode= testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- if (item.IsDir())
- {
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- lps->InSize = currentTotalSize; // Change it
- lps->OutSize = currentTotalSize;
-
- if (item.Size == 0 || sectionIndex == 0)
- {
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- Int32 opRes = NExtract::NOperationResult::kOK;
- if (!testMode && item.Size != 0)
- {
- RINOK(m_Stream->Seek(m_Database.ContentOffset + item.Offset, STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
- RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));
- if (copyCoderSpec->TotalSize != item.Size)
- opRes = NExtract::NOperationResult::kDataError;
- }
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(opRes));
- currentTotalSize += item.Size;
- continue;
- }
-
- const CSectionInfo &section = m_Database.Sections[(int)sectionIndex];
-
- if (!section.IsLzx())
- {
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
-
- const CLzxInfo &lzxInfo = section.Methods[0].LzxInfo;
-
- if (chmFolderOutStream == 0)
- {
- chmFolderOutStream = new CChmFolderOutStream;
- outStream = chmFolderOutStream;
- }
-
- chmFolderOutStream->Init(&m_Database, extractCallback, testMode);
-
- if (lzxDecoderSpec == NULL)
- {
- lzxDecoderSpec = new NCompress::NLzx::CDecoder;
- lzxDecoder = lzxDecoderSpec;
- }
-
- UInt64 folderIndex = m_Database.GetFolder(index);
-
- UInt64 compressedPos = m_Database.ContentOffset + section.Offset;
- UInt32 numDictBits = lzxInfo.GetNumDictBits();
- RINOK(lzxDecoderSpec->SetParams(numDictBits));
-
- const CItem *lastItem = &item;
- extractStatuses.Clear();
- extractStatuses.Add(true);
-
- for (;; folderIndex++)
- {
- RINOK(extractCallback->SetCompleted(&currentTotalSize));
-
- UInt64 startPos = lzxInfo.GetFolderPos(folderIndex);
- UInt64 finishPos = lastItem->Offset + lastItem->Size;
- UInt64 limitFolderIndex = lzxInfo.GetFolder(finishPos);
-
- lastFolderIndex = m_Database.GetLastFolder(index);
- UInt64 folderSize = lzxInfo.GetFolderSize();
- UInt64 unPackSize = folderSize;
- if (extractStatuses.IsEmpty())
- chmFolderOutStream->m_StartIndex = index + 1;
- else
- chmFolderOutStream->m_StartIndex = index;
- if (limitFolderIndex == folderIndex)
- {
- for (; i < numItems; i++)
- {
- UInt32 nextIndex = allFilesMode ? i : indices[i];
- int entryIndex = m_Database.Indices[nextIndex];
- const CItem &nextItem = m_Database.Items[entryIndex];
- if (nextItem.Section != sectionIndex)
- break;
- UInt64 nextFolderIndex = m_Database.GetFolder(nextIndex);
- if (nextFolderIndex != folderIndex)
- break;
- for (index++; index < nextIndex; index++)
- extractStatuses.Add(false);
- extractStatuses.Add(true);
- index = nextIndex;
- lastItem = &nextItem;
- if (nextItem.Size != 0)
- finishPos = nextItem.Offset + nextItem.Size;
- lastFolderIndex = m_Database.GetLastFolder(index);
- }
- }
- unPackSize = MyMin(finishPos - startPos, unPackSize);
-
- chmFolderOutStream->m_FolderSize = folderSize;
- chmFolderOutStream->m_PosInFolder = 0;
- chmFolderOutStream->m_PosInSection = startPos;
- chmFolderOutStream->m_ExtractStatuses = &extractStatuses;
- chmFolderOutStream->m_NumFiles = extractStatuses.Size();
- chmFolderOutStream->m_CurrentIndex = 0;
- try
- {
- UInt64 startBlock = lzxInfo.GetBlockIndexFromFolderIndex(folderIndex);
- const CResetTable &rt = lzxInfo.ResetTable;
- UInt32 numBlocks = (UInt32)rt.GetNumBlocks(unPackSize);
- for (UInt32 b = 0; b < numBlocks; b++)
- {
- UInt64 completedSize = currentTotalSize + chmFolderOutStream->m_PosInSection - startPos;
- RINOK(extractCallback->SetCompleted(&completedSize));
- UInt64 bCur = startBlock + b;
- if (bCur >= rt.ResetOffsets.Size())
- return E_FAIL;
- UInt64 offset = rt.ResetOffsets[(int)bCur];
- UInt64 compressedSize;
- rt.GetCompressedSizeOfBlock(bCur, compressedSize);
- UInt64 rem = finishPos - chmFolderOutStream->m_PosInSection;
- if (rem > rt.BlockSize)
- rem = rt.BlockSize;
- RINOK(m_Stream->Seek(compressedPos + offset, STREAM_SEEK_SET, NULL));
- streamSpec->SetStream(m_Stream);
- streamSpec->Init(compressedSize);
- lzxDecoderSpec->SetKeepHistory(b > 0);
- HRESULT res = lzxDecoder->Code(inStream, outStream, NULL, &rem, NULL);
- if (res != S_OK)
- {
- if (res != S_FALSE)
- return res;
- throw 1;
- }
- }
- }
- catch(...)
- {
- RINOK(chmFolderOutStream->FlushCorrupted(unPackSize));
- }
- currentTotalSize += folderSize;
- if (folderIndex == lastFolderIndex)
- break;
- extractStatuses.Clear();
- }
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = m_Database.NewFormat ? 1:
- (m_Database.LowLevel ?
- m_Database.Items.Size():
- m_Database.Indices.Size());
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHandler.h b/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHandler.h
deleted file mode 100644
index 440c50f11..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHandler.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// ChmHandler.h
-
-#ifndef __ARCHIVE_CHM_HANDLER_H
-#define __ARCHIVE_CHM_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-#include "ChmIn.h"
-
-namespace NArchive {
-namespace NChm {
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP1(IInArchive)
-
- INTERFACE_IInArchive(;)
-
-private:
- CFilesDatabase m_Database;
- CMyComPtr<IInStream> m_Stream;
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHeader.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHeader.cpp
deleted file mode 100644
index e8dc9f3e8..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHeader.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-// Archive/Chm/Header.h
-
-#include "StdAfx.h"
-
-#include "ChmHeader.h"
-
-namespace NArchive{
-namespace NChm{
-namespace NHeader{
-
-UInt32 kItsfSignature = 0x46535449 + 1;
-UInt32 kItolSignature = 0x4C4F5449 + 1;
-static class CSignatureInitializer
-{
-public:
- CSignatureInitializer()
- {
- kItsfSignature--;
- kItolSignature--;
- }
-}g_SignatureInitializer;
-
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHeader.h b/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHeader.h
deleted file mode 100644
index 9f1bd42b6..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmHeader.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Archive/Chm/Header.h
-
-#ifndef __ARCHIVE_CHM_HEADER_H
-#define __ARCHIVE_CHM_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NChm {
-namespace NHeader{
-
-const UInt32 kItspSignature = 0x50535449;
-const UInt32 kPmglSignature = 0x4C474D50;
-const UInt32 kLzxcSignature = 0x43585A4C;
-
-const UInt32 kIfcmSignature = 0x4D434649;
-const UInt32 kAollSignature = 0x4C4C4F41;
-const UInt32 kCaolSignature = 0x4C4F4143;
-
-extern UInt32 kItsfSignature;
-
-extern UInt32 kItolSignature;
-const UInt32 kItlsSignature = 0x534C5449;
-UInt64 inline GetHxsSignature() { return ((UInt64)kItlsSignature << 32) | kItolSignature; }
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmIn.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmIn.cpp
deleted file mode 100644
index d52b9ba6c..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmIn.cpp
+++ /dev/null
@@ -1,937 +0,0 @@
-// Archive/ChmIn.cpp
-
-#include "StdAfx.h"
-
-#include "Common/IntToString.h"
-#include "Common/UTFConvert.h"
-
-#include "../../Common/LimitedStreams.h"
-
-#include "ChmIn.h"
-
-namespace NArchive {
-namespace NChm {
-
-// define CHM_LOW, if you want to see low level items
-// #define CHM_LOW
-
-static const GUID kChmLzxGuid = { 0x7FC28940, 0x9D31, 0x11D0, { 0x9B, 0x27, 0x00, 0xA0, 0xC9, 0x1E, 0x9C, 0x7C } };
-static const GUID kHelp2LzxGuid = { 0x0A9007C6, 0x4076, 0x11D3, { 0x87, 0x89, 0x00, 0x00, 0xF8, 0x10, 0x57, 0x54 } };
-static const GUID kDesGuid = { 0x67F6E4A2, 0x60BF, 0x11D3, { 0x85, 0x40, 0x00, 0xC0, 0x4F, 0x58, 0xC3, 0xCF } };
-
-static bool AreGuidsEqual(REFGUID g1, REFGUID g2)
-{
- if (g1.Data1 != g2.Data1 ||
- g1.Data2 != g2.Data2 ||
- g1.Data3 != g2.Data3)
- return false;
- for (int i = 0; i < 8; i++)
- if (g1.Data4[i] != g2.Data4[i])
- return false;
- return true;
-}
-
-static char GetHex(Byte value)
-{
- return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));
-}
-
-static void PrintByte(Byte b, AString &s)
-{
- s += GetHex(b >> 4);
- s += GetHex(b & 0xF);
-}
-
-static void PrintUInt16(UInt16 v, AString &s)
-{
- PrintByte((Byte)(v >> 8), s);
- PrintByte((Byte)v, s);
-}
-
-static void PrintUInt32(UInt32 v, AString &s)
-{
- PrintUInt16((UInt16)(v >> 16), s);
- PrintUInt16((UInt16)v, s);
-}
-
-AString CMethodInfo::GetGuidString() const
-{
- AString s;
- s += '{';
- PrintUInt32(Guid.Data1, s);
- s += '-';
- PrintUInt16(Guid.Data2, s);
- s += '-';
- PrintUInt16(Guid.Data3, s);
- s += '-';
- PrintByte(Guid.Data4[0], s);
- PrintByte(Guid.Data4[1], s);
- s += '-';
- for (int i = 2; i < 8; i++)
- PrintByte(Guid.Data4[i], s);
- s += '}';
- return s;
-}
-
-bool CMethodInfo::IsLzx() const
-{
- if (AreGuidsEqual(Guid, kChmLzxGuid))
- return true;
- return AreGuidsEqual(Guid, kHelp2LzxGuid);
-}
-
-bool CMethodInfo::IsDes() const
-{
- return AreGuidsEqual(Guid, kDesGuid);
-}
-
-UString CMethodInfo::GetName() const
-{
- UString s;
- if (IsLzx())
- {
- s = L"LZX:";
- wchar_t temp[16];
- ConvertUInt32ToString(LzxInfo.GetNumDictBits(), temp);
- s += temp;
- }
- else
- {
- AString s2;
- if (IsDes())
- s2 = "DES";
- else
- {
- s2 = GetGuidString();
- if (ControlData.GetCapacity() > 0)
- {
- s2 += ':';
- for (size_t i = 0; i < ControlData.GetCapacity(); i++)
- PrintByte(ControlData[i], s2);
- }
- }
- ConvertUTF8ToUnicode(s2, s);
- }
- return s;
-}
-
-bool CSectionInfo::IsLzx() const
-{
- if (Methods.Size() != 1)
- return false;
- return Methods[0].IsLzx();
-}
-
-UString CSectionInfo::GetMethodName() const
-{
- UString s;
- if (!IsLzx())
- {
- UString temp;
- if (ConvertUTF8ToUnicode(Name, temp))
- s += temp;
- s += L": ";
- }
- for (int i = 0; i < Methods.Size(); i++)
- {
- if (i != 0)
- s += L' ';
- s += Methods[i].GetName();
- }
- return s;
-}
-
-Byte CInArchive::ReadByte()
-{
- Byte b;
- if (!_inBuffer.ReadByte(b))
- throw 1;
- return b;
-}
-
-void CInArchive::Skip(size_t size)
-{
- while (size-- != 0)
- ReadByte();
-}
-
-void CInArchive::ReadBytes(Byte *data, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- data[i] = ReadByte();
-}
-
-UInt16 CInArchive::ReadUInt16()
-{
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- value |= ((UInt16)(ReadByte()) << (8 * i));
- return value;
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- value |= ((UInt32)(ReadByte()) << (8 * i));
- return value;
-}
-
-UInt64 CInArchive::ReadUInt64()
-{
- UInt64 value = 0;
- for (int i = 0; i < 8; i++)
- value |= ((UInt64)(ReadByte()) << (8 * i));
- return value;
-}
-
-UInt64 CInArchive::ReadEncInt()
-{
- UInt64 val = 0;;
- for (int i = 0; i < 10; i++)
- {
- Byte b = ReadByte();
- val |= (b & 0x7F);
- if (b < 0x80)
- return val;
- val <<= 7;
- }
- throw 1;
-}
-
-void CInArchive::ReadGUID(GUID &g)
-{
- g.Data1 = ReadUInt32();
- g.Data2 = ReadUInt16();
- g.Data3 = ReadUInt16();
- ReadBytes(g.Data4, 8);
-}
-
-void CInArchive::ReadString(int size, AString &s)
-{
- s.Empty();
- while(size-- != 0)
- {
- char c = (char)ReadByte();
- if (c == 0)
- {
- Skip(size);
- return;
- }
- s += c;
- }
-}
-
-void CInArchive::ReadUString(int size, UString &s)
-{
- s.Empty();
- while(size-- != 0)
- {
- wchar_t c = ReadUInt16();
- if (c == 0)
- {
- Skip(2 * size);
- return;
- }
- s += c;
- }
-}
-
-HRESULT CInArchive::ReadChunk(IInStream *inStream, UInt64 pos, UInt64 size)
-{
- RINOK(inStream->Seek(pos, STREAM_SEEK_SET, NULL));
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> limitedStream(streamSpec);
- streamSpec->SetStream(inStream);
- streamSpec->Init(size);
- _inBuffer.SetStream(limitedStream);
- _inBuffer.Init();
- return S_OK;
-}
-
-HRESULT CInArchive::ReadDirEntry(CDatabase &database)
-{
- CItem item;
- UInt64 nameLength = ReadEncInt();
- if (nameLength == 0 || nameLength >= 0x10000000)
- return S_FALSE;
- ReadString((int)nameLength, item.Name);
- item.Section = ReadEncInt();
- item.Offset = ReadEncInt();
- item.Size = ReadEncInt();
- database.Items.Add(item);
- return S_OK;
-}
-
-HRESULT CInArchive::OpenChm(IInStream *inStream, CDatabase &database)
-{
- UInt32 headerSize = ReadUInt32();
- if (headerSize != 0x60)
- return S_FALSE;
- UInt32 unknown1 = ReadUInt32();
- if (unknown1 != 0 && unknown1 != 1) // it's 0 in one .sll file
- return S_FALSE;
- /* UInt32 timeStamp = */ ReadUInt32();
- // Considered as a big-endian DWORD, it appears to contain seconds (MSB) and
- // fractional seconds (second byte).
- // The third and fourth bytes may contain even more fractional bits.
- // The 4 least significant bits in the last byte are constant.
- /* UInt32 lang = */ ReadUInt32();
- GUID g;
- ReadGUID(g); // {7C01FD10-7BAA-11D0-9E0C-00A0-C922-E6EC}
- ReadGUID(g); // {7C01FD11-7BAA-11D0-9E0C-00A0-C922-E6EC}
- const int kNumSections = 2;
- UInt64 sectionOffsets[kNumSections];
- UInt64 sectionSizes[kNumSections];
- int i;
- for (i = 0; i < kNumSections; i++)
- {
- sectionOffsets[i] = ReadUInt64();
- sectionSizes[i] = ReadUInt64();
- }
- // if (chmVersion == 3)
- database.ContentOffset = ReadUInt64();
- /*
- else
- database.ContentOffset = _startPosition + 0x58
- */
-
- /*
- // Section 0
- ReadChunk(inStream, sectionOffsets[0], sectionSizes[0]);
- if (sectionSizes[0] != 0x18)
- return S_FALSE;
- ReadUInt32(); // unknown: 01FE
- ReadUInt32(); // unknown: 0
- UInt64 fileSize = ReadUInt64();
- ReadUInt32(); // unknown: 0
- ReadUInt32(); // unknown: 0
- */
-
- // Section 1: The Directory Listing
- ReadChunk(inStream, sectionOffsets[1], sectionSizes[1]);
- if (ReadUInt32() != NHeader::kItspSignature)
- return S_FALSE;
- if (ReadUInt32() != 1) // version
- return S_FALSE;
- /* UInt32 dirHeaderSize = */ ReadUInt32();
- ReadUInt32(); // 0x0A (unknown)
- UInt32 dirChunkSize = ReadUInt32(); // $1000
- if (dirChunkSize < 32)
- return S_FALSE;
- /* UInt32 density = */ ReadUInt32(); // "Density" of quickref section, usually 2.
- /* UInt32 depth = */ ReadUInt32(); // Depth of the index tree: 1 there is no index,
- // 2 if there is one level of PMGI chunks.
-
- /* UInt32 chunkNumber = */ ReadUInt32(); // Chunk number of root index chunk, -1 if there is none
- // (though at least one file has 0 despite there being no
- // index chunk, probably a bug.)
- /* UInt32 firstPmglChunkNumber = */ ReadUInt32(); // Chunk number of first PMGL (listing) chunk
- /* UInt32 lastPmglChunkNumber = */ ReadUInt32(); // Chunk number of last PMGL (listing) chunk
- ReadUInt32(); // -1 (unknown)
- UInt32 numDirChunks = ReadUInt32(); // Number of directory chunks (total)
- /* UInt32 windowsLangId = */ ReadUInt32();
- ReadGUID(g); // {5D02926A-212E-11D0-9DF9-00A0C922E6EC}
- ReadUInt32(); // 0x54 (This is the length again)
- ReadUInt32(); // -1 (unknown)
- ReadUInt32(); // -1 (unknown)
- ReadUInt32(); // -1 (unknown)
-
- for (UInt32 ci = 0; ci < numDirChunks; ci++)
- {
- UInt64 chunkPos = _inBuffer.GetProcessedSize();
- if (ReadUInt32() == NHeader::kPmglSignature)
- {
- // The quickref area is written backwards from the end of the chunk.
- // One quickref entry exists for every n entries in the file, where n
- // is calculated as 1 + (1 << quickref density). So for density = 2, n = 5.
-
- UInt32 quickrefLength = ReadUInt32(); // Length of free space and/or quickref area at end of directory chunk
- if (quickrefLength > dirChunkSize || quickrefLength < 2)
- return S_FALSE;
- ReadUInt32(); // Always 0
- ReadUInt32(); // Chunk number of previous listing chunk when reading
- // directory in sequence (-1 if this is the first listing chunk)
- ReadUInt32(); // Chunk number of next listing chunk when reading
- // directory in sequence (-1 if this is the last listing chunk)
- int numItems = 0;
- for (;;)
- {
- UInt64 offset = _inBuffer.GetProcessedSize() - chunkPos;
- UInt32 offsetLimit = dirChunkSize - quickrefLength;
- if (offset > offsetLimit)
- return S_FALSE;
- if (offset == offsetLimit)
- break;
- RINOK(ReadDirEntry(database));
- numItems++;
- }
- Skip(quickrefLength - 2);
- if (ReadUInt16() != numItems)
- return S_FALSE;
- }
- else
- Skip(dirChunkSize - 4);
- }
- return S_OK;
-}
-
-HRESULT CInArchive::OpenHelp2(IInStream *inStream, CDatabase &database)
-{
- if (ReadUInt32() != 1) // version
- return S_FALSE;
- if (ReadUInt32() != 0x28) // Location of header section table
- return S_FALSE;
- UInt32 numHeaderSections = ReadUInt32();
- const int kNumHeaderSectionsMax = 5;
- if (numHeaderSections != kNumHeaderSectionsMax)
- return S_FALSE;
- ReadUInt32(); // Length of post-header table
- GUID g;
- ReadGUID(g); // {0A9007C1-4076-11D3-8789-0000F8105754}
-
- // header section table
- UInt64 sectionOffsets[kNumHeaderSectionsMax];
- UInt64 sectionSizes[kNumHeaderSectionsMax];
- UInt32 i;
- for (i = 0; i < numHeaderSections; i++)
- {
- sectionOffsets[i] = ReadUInt64();
- sectionSizes[i] = ReadUInt64();
- }
-
- // Post-Header
- ReadUInt32(); // 2
- ReadUInt32(); // 0x98: offset to CAOL from beginning of post-header)
- // ----- Directory information
- ReadUInt64(); // Chunk number of top-level AOLI chunk in directory, or -1
- ReadUInt64(); // Chunk number of first AOLL chunk in directory
- ReadUInt64(); // Chunk number of last AOLL chunk in directory
- ReadUInt64(); // 0 (unknown)
- ReadUInt32(); // $2000 (Directory chunk size of directory)
- ReadUInt32(); // Quickref density for main directory, usually 2
- ReadUInt32(); // 0 (unknown)
- ReadUInt32(); // Depth of main directory index tree
- // 1 there is no index, 2 if there is one level of AOLI chunks.
- ReadUInt64(); // 0 (unknown)
- UInt64 numDirEntries = ReadUInt64(); // Number of directory entries
- // ----- Directory Index Information
- ReadUInt64(); // -1 (unknown, probably chunk number of top-level AOLI in directory index)
- ReadUInt64(); // Chunk number of first AOLL chunk in directory index
- ReadUInt64(); // Chunk number of last AOLL chunk in directory index
- ReadUInt64(); // 0 (unknown)
- ReadUInt32(); // $200 (Directory chunk size of directory index)
- ReadUInt32(); // Quickref density for directory index, usually 2
- ReadUInt32(); // 0 (unknown)
- ReadUInt32(); // Depth of directory index index tree.
- ReadUInt64(); // Possibly flags -- sometimes 1, sometimes 0.
- ReadUInt64(); // Number of directory index entries (same as number of AOLL
- // chunks in main directory)
-
- // (The obvious guess for the following two fields, which recur in a number
- // of places, is they are maximum sizes for the directory and directory index.
- // However, I have seen no direct evidence that this is the case.)
-
- ReadUInt32(); // $100000 (Same as field following chunk size in directory)
- ReadUInt32(); // $20000 (Same as field following chunk size in directory index)
-
- ReadUInt64(); // 0 (unknown)
- if (ReadUInt32() != NHeader::kCaolSignature)
- return S_FALSE;
- if (ReadUInt32() != 2) // (Most likely a version number)
- return S_FALSE;
- UInt32 caolLength = ReadUInt32(); // $50 (Length of the CAOL section, which includes the ITSF section)
- if (caolLength >= 0x2C)
- {
- /* UInt32 c7 = */ ReadUInt16(); // Unknown. Remains the same when identical files are built.
- // Does not appear to be a checksum. Many files have
- // 'HH' (HTML Help?) here, indicating this may be a compiler ID
- // field. But at least one ITOL/ITLS compiler does not set this
- // field to a constant value.
- ReadUInt16(); // 0 (Unknown. Possibly part of 00A4 field)
- ReadUInt32(); // Unknown. Two values have been seen -- $43ED, and 0.
- ReadUInt32(); // $2000 (Directory chunk size of directory)
- ReadUInt32(); // $200 (Directory chunk size of directory index)
- ReadUInt32(); // $100000 (Same as field following chunk size in directory)
- ReadUInt32(); // $20000 (Same as field following chunk size in directory index)
- ReadUInt32(); // 0 (unknown)
- ReadUInt32(); // 0 (Unknown)
- if (caolLength == 0x2C)
- {
- database.ContentOffset = 0;
- database.NewFormat = true;
- }
- else if (caolLength == 0x50)
- {
- ReadUInt32(); // 0 (Unknown)
- if (ReadUInt32() != NHeader::kItsfSignature)
- return S_FALSE;
- if (ReadUInt32() != 4) // $4 (Version number -- CHM uses 3)
- return S_FALSE;
- if (ReadUInt32() != 0x20) // $20 (length of ITSF)
- return S_FALSE;
- UInt32 unknown = ReadUInt32();
- if (unknown != 0 && unknown != 1) // = 0 for some HxW files, 1 in other cases;
- return S_FALSE;
- database.ContentOffset = _startPosition + ReadUInt64();
- /* UInt32 timeStamp = */ ReadUInt32();
- // A timestamp of some sort.
- // Considered as a big-endian DWORD, it appears to contain
- // seconds (MSB) and fractional seconds (second byte).
- // The third and fourth bytes may contain even more fractional
- // bits. The 4 least significant bits in the last byte are constant.
- /* UInt32 lang = */ ReadUInt32(); // BE?
- }
- else
- return S_FALSE;
- }
-
- /*
- // Section 0
- ReadChunk(inStream, _startPosition + sectionOffsets[0], sectionSizes[0]);
- if (sectionSizes[0] != 0x18)
- return S_FALSE;
- ReadUInt32(); // unknown: 01FE
- ReadUInt32(); // unknown: 0
- UInt64 fileSize = ReadUInt64();
- ReadUInt32(); // unknown: 0
- ReadUInt32(); // unknown: 0
- */
-
- // Section 1: The Directory Listing
- ReadChunk(inStream, _startPosition + sectionOffsets[1], sectionSizes[1]);
- if (ReadUInt32() != NHeader::kIfcmSignature)
- return S_FALSE;
- if (ReadUInt32() != 1) // (probably a version number)
- return S_FALSE;
- UInt32 dirChunkSize = ReadUInt32(); // $2000
- if (dirChunkSize < 64)
- return S_FALSE;
- ReadUInt32(); // $100000 (unknown)
- ReadUInt32(); // -1 (unknown)
- ReadUInt32(); // -1 (unknown)
- UInt32 numDirChunks = ReadUInt32();
- ReadUInt32(); // 0 (unknown, probably high word of above)
-
- for (UInt32 ci = 0; ci < numDirChunks; ci++)
- {
- UInt64 chunkPos = _inBuffer.GetProcessedSize();
- if (ReadUInt32() == NHeader::kAollSignature)
- {
- UInt32 quickrefLength = ReadUInt32(); // Length of quickref area at end of directory chunk
- if (quickrefLength > dirChunkSize || quickrefLength < 2)
- return S_FALSE;
- ReadUInt64(); // Directory chunk number
- // This must match physical position in file, that is
- // the chunk size times the chunk number must be the
- // offset from the end of the directory header.
- ReadUInt64(); // Chunk number of previous listing chunk when reading
- // directory in sequence (-1 if first listing chunk)
- ReadUInt64(); // Chunk number of next listing chunk when reading
- // directory in sequence (-1 if last listing chunk)
- ReadUInt64(); // Number of first listing entry in this chunk
- ReadUInt32(); // 1 (unknown -- other values have also been seen here)
- ReadUInt32(); // 0 (unknown)
-
- int numItems = 0;
- for (;;)
- {
- UInt64 offset = _inBuffer.GetProcessedSize() - chunkPos;
- UInt32 offsetLimit = dirChunkSize - quickrefLength;
- if (offset > offsetLimit)
- return S_FALSE;
- if (offset == offsetLimit)
- break;
- if (database.NewFormat)
- {
- UInt16 nameLength = ReadUInt16();
- if (nameLength == 0)
- return S_FALSE;
- UString name;
- ReadUString((int)nameLength, name);
- AString s;
- ConvertUnicodeToUTF8(name, s);
- Byte b = ReadByte();
- s += ' ';
- PrintByte(b, s);
- s += ' ';
- UInt64 len = ReadEncInt();
- // then number of items ?
- // then length ?
- // then some data (binary encoding?)
- while (len-- != 0)
- {
- b = ReadByte();
- PrintByte(b, s);
- }
- database.NewFormatString += s;
- database.NewFormatString += "\r\n";
- }
- else
- {
- RINOK(ReadDirEntry(database));
- }
- numItems++;
- }
- Skip(quickrefLength - 2);
- if (ReadUInt16() != numItems)
- return S_FALSE;
- if (numItems > numDirEntries)
- return S_FALSE;
- numDirEntries -= numItems;
- }
- else
- Skip(dirChunkSize - 4);
- }
- return numDirEntries == 0 ? S_OK : S_FALSE;
-}
-
-HRESULT CInArchive::DecompressStream(IInStream *inStream, const CDatabase &database, const AString &name)
-{
- int index = database.FindItem(name);
- if (index < 0)
- return S_FALSE;
- const CItem &item = database.Items[index];
- _chunkSize = item.Size;
- return ReadChunk(inStream, database.ContentOffset + item.Offset, item.Size);
-}
-
-
-#define DATA_SPACE "::DataSpace/"
-static const char *kNameList = DATA_SPACE "NameList";
-static const char *kStorage = DATA_SPACE "Storage/";
-static const char *kContent = "Content";
-static const char *kControlData = "ControlData";
-static const char *kSpanInfo = "SpanInfo";
-static const char *kTransform = "Transform/";
-static const char *kResetTable = "/InstanceData/ResetTable";
-static const char *kTransformList = "List";
-
-static AString GetSectionPrefix(const AString &name)
-{
- return AString(kStorage) + name + AString("/");
-}
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareFiles(const int *p1, const int *p2, void *param)
-{
- const CObjectVector<CItem> &items = *(const CObjectVector<CItem> *)param;
- const CItem &item1 = items[*p1];
- const CItem &item2 = items[*p2];
- bool isDir1 = item1.IsDir();
- bool isDir2 = item2.IsDir();
- if (isDir1 && !isDir2)
- return -1;
- if (isDir2)
- {
- if (isDir1)
- return MyCompare(*p1, *p2);
- return 1;
- }
- RINOZ(MyCompare(item1.Section, item2.Section));
- RINOZ(MyCompare(item1.Offset, item2.Offset));
- RINOZ(MyCompare(item1.Size, item2.Size));
- return MyCompare(*p1, *p2);
-}
-
-void CFilesDatabase::SetIndices()
-{
- for (int i = 0; i < Items.Size(); i++)
- {
- const CItem &item = Items[i];
- if (item.IsUserItem() && item.Name.Length() != 1)
- Indices.Add(i);
- }
-}
-
-void CFilesDatabase::Sort()
-{
- Indices.Sort(CompareFiles, (void *)&Items);
-}
-
-bool CFilesDatabase::Check()
-{
- UInt64 maxPos = 0;
- UInt64 prevSection = 0;
- for(int i = 0; i < Indices.Size(); i++)
- {
- const CItem &item = Items[Indices[i]];
- if (item.Section == 0 || item.IsDir())
- continue;
- if (item.Section != prevSection)
- {
- prevSection = item.Section;
- maxPos = 0;
- continue;
- }
- if (item.Offset < maxPos)
- return false;
- maxPos = item.Offset + item.Size;
- if (maxPos < item.Offset)
- return false;
- }
- return true;
-}
-
-HRESULT CInArchive::OpenHighLevel(IInStream *inStream, CFilesDatabase &database)
-{
- {
- // The NameList file
- RINOK(DecompressStream(inStream, database, kNameList));
- /* UInt16 length = */ ReadUInt16();
- UInt16 numSections = ReadUInt16();
- for (int i = 0; i < numSections; i++)
- {
- CSectionInfo section;
- UInt16 nameLength = ReadUInt16();
- UString name;
- ReadUString(nameLength, name);
- if (ReadUInt16() != 0)
- return S_FALSE;
- if (!ConvertUnicodeToUTF8(name, section.Name))
- return S_FALSE;
- database.Sections.Add(section);
- }
- }
-
- int i;
- for (i = 1; i < database.Sections.Size(); i++)
- {
- CSectionInfo &section = database.Sections[i];
- AString sectionPrefix = GetSectionPrefix(section.Name);
- {
- // Content
- int index = database.FindItem(sectionPrefix + kContent);
- if (index < 0)
- return S_FALSE;
- const CItem &item = database.Items[index];
- section.Offset = item.Offset;
- section.CompressedSize = item.Size;
- }
- AString transformPrefix = sectionPrefix + kTransform;
- if (database.Help2Format)
- {
- // Transform List
- RINOK(DecompressStream(inStream, database, transformPrefix + kTransformList));
- if ((_chunkSize & 0xF) != 0)
- return S_FALSE;
- int numGuids = (int)(_chunkSize / 0x10);
- if (numGuids < 1)
- return S_FALSE;
- for (int i = 0; i < numGuids; i++)
- {
- CMethodInfo method;
- ReadGUID(method.Guid);
- section.Methods.Add(method);
- }
- }
- else
- {
- CMethodInfo method;
- method.Guid = kChmLzxGuid;
- section.Methods.Add(method);
- }
-
- {
- // Control Data
- RINOK(DecompressStream(inStream, database, sectionPrefix + kControlData));
- for (int mi = 0; mi < section.Methods.Size(); mi++)
- {
- CMethodInfo &method = section.Methods[mi];
- UInt32 numDWORDS = ReadUInt32();
- if (method.IsLzx())
- {
- if (numDWORDS < 5)
- return S_FALSE;
- if (ReadUInt32() != NHeader::kLzxcSignature)
- return S_FALSE;
- CLzxInfo &li = method.LzxInfo;
- li.Version = ReadUInt32();
- if (li.Version != 2 && li.Version != 3)
- return S_FALSE;
- li.ResetInterval = ReadUInt32();
- li.WindowSize = ReadUInt32();
- li.CacheSize = ReadUInt32();
- if (
- li.ResetInterval != 1 &&
- li.ResetInterval != 2 &&
- li.ResetInterval != 4 &&
- li.ResetInterval != 8 &&
- li.ResetInterval != 16 &&
- li.ResetInterval != 32 &&
- li.ResetInterval != 64)
- return S_FALSE;
- if (
- li.WindowSize != 1 &&
- li.WindowSize != 2 &&
- li.WindowSize != 4 &&
- li.WindowSize != 8 &&
- li.WindowSize != 16 &&
- li.WindowSize != 32 &&
- li.WindowSize != 64)
- return S_FALSE;
- numDWORDS -= 5;
- while (numDWORDS-- != 0)
- ReadUInt32();
- }
- else
- {
- UInt32 numBytes = numDWORDS * 4;
- method.ControlData.SetCapacity(numBytes);
- ReadBytes(method.ControlData, numBytes);
- }
- }
- }
-
- {
- // SpanInfo
- RINOK(DecompressStream(inStream, database, sectionPrefix + kSpanInfo));
- section.UncompressedSize = ReadUInt64();
- }
-
- // read ResetTable for LZX
- for (int mi = 0; mi < section.Methods.Size(); mi++)
- {
- CMethodInfo &method = section.Methods[mi];
- if (method.IsLzx())
- {
- // ResetTable;
- RINOK(DecompressStream(inStream, database, transformPrefix +
- method.GetGuidString() + kResetTable));
- CResetTable &rt = method.LzxInfo.ResetTable;
- if (_chunkSize < 4)
- {
- if (_chunkSize != 0)
- return S_FALSE;
- // ResetTable is empty in .chw files
- if (section.UncompressedSize != 0)
- return S_FALSE;
- rt.UncompressedSize = 0;
- rt.CompressedSize = 0;
- rt.BlockSize = 0;
- }
- else
- {
- UInt32 ver = ReadUInt32(); // 2 unknown (possibly a version number)
- if (ver != 2 && ver != 3)
- return S_FALSE;
- UInt32 numEntries = ReadUInt32();
- if (ReadUInt32() != 8) // Size of table entry (bytes)
- return S_FALSE;
- if (ReadUInt32() != 0x28) // Length of table header
- return S_FALSE;
- rt.UncompressedSize = ReadUInt64();
- rt.CompressedSize = ReadUInt64();
- rt.BlockSize = ReadUInt64(); // 0x8000 block size for locations below
- if (rt.BlockSize != 0x8000)
- return S_FALSE;
- rt.ResetOffsets.Reserve(numEntries);
- for (UInt32 i = 0; i < numEntries; i++)
- rt.ResetOffsets.Add(ReadUInt64());
- }
- }
- }
- }
-
- database.SetIndices();
- database.Sort();
- return database.Check() ? S_OK : S_FALSE;
-}
-
-HRESULT CInArchive::Open2(IInStream *inStream,
- const UInt64 *searchHeaderSizeLimit,
- CFilesDatabase &database)
-{
- database.Clear();
-
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &_startPosition));
-
- database.Help2Format = false;
- const UInt32 chmVersion = 3;
- {
- if (!_inBuffer.Create(1 << 14))
- return E_OUTOFMEMORY;
- _inBuffer.SetStream(inStream);
- _inBuffer.Init();
- UInt64 value = 0;
- const int kSignatureSize = 8;
- UInt64 hxsSignature = NHeader::GetHxsSignature();
- UInt64 chmSignature = ((UInt64)chmVersion << 32)| NHeader::kItsfSignature;
- UInt64 limit = 1 << 18;
- if (searchHeaderSizeLimit)
- if (limit > *searchHeaderSizeLimit)
- limit = *searchHeaderSizeLimit;
-
- for (;;)
- {
- Byte b;
- if (!_inBuffer.ReadByte(b))
- return S_FALSE;
- value >>= 8;
- value |= ((UInt64)b) << ((kSignatureSize - 1) * 8);
- if (_inBuffer.GetProcessedSize() >= kSignatureSize)
- {
- if (value == chmSignature)
- break;
- if (value == hxsSignature)
- {
- database.Help2Format = true;
- break;
- }
- if (_inBuffer.GetProcessedSize() > limit)
- return S_FALSE;
- }
- }
- _startPosition += _inBuffer.GetProcessedSize() - kSignatureSize;
- }
-
- if (database.Help2Format)
- {
- RINOK(OpenHelp2(inStream, database));
- if (database.NewFormat)
- return S_OK;
- }
- else
- {
- RINOK(OpenChm(inStream, database));
- }
-
- #ifndef CHM_LOW
- try
- {
- HRESULT res = OpenHighLevel(inStream, database);
- if (res == S_FALSE)
- {
- database.HighLevelClear();
- return S_OK;
- }
- RINOK(res);
- database.LowLevel = false;
- }
- catch(...)
- {
- return S_OK;
- }
- #endif
- return S_OK;
-}
-
-HRESULT CInArchive::Open(IInStream *inStream,
- const UInt64 *searchHeaderSizeLimit,
- CFilesDatabase &database)
-{
- try
- {
- HRESULT res = Open2(inStream, searchHeaderSizeLimit, database);
- _inBuffer.ReleaseStream();
- return res;
- }
- catch(...)
- {
- _inBuffer.ReleaseStream();
- throw;
- }
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmIn.h b/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmIn.h
deleted file mode 100644
index 4719a484d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmIn.h
+++ /dev/null
@@ -1,244 +0,0 @@
-// Archive/ChmIn.h
-
-#ifndef __ARCHIVE_CHM_IN_H
-#define __ARCHIVE_CHM_IN_H
-
-#include "Common/Buffer.h"
-#include "Common/MyString.h"
-
-#include "../../IStream.h"
-#include "../../Common/InBuffer.h"
-
-#include "ChmHeader.h"
-
-namespace NArchive {
-namespace NChm {
-
-struct CItem
-{
- UInt64 Section;
- UInt64 Offset;
- UInt64 Size;
- AString Name;
-
- bool IsFormatRelatedItem() const
- {
- if (Name.Length() < 2)
- return false;
- return Name[0] == ':' && Name[1] == ':';
- }
-
- bool IsUserItem() const
- {
- if (Name.Length() < 2)
- return false;
- return Name[0] == '/';
- }
-
- bool IsDir() const
- {
- if (Name.Length() == 0)
- return false;
- return (Name[Name.Length() - 1] == '/');
- }
-};
-
-struct CDatabase
-{
- UInt64 ContentOffset;
- CObjectVector<CItem> Items;
- AString NewFormatString;
- bool Help2Format;
- bool NewFormat;
-
- int FindItem(const AString &name) const
- {
- for (int i = 0; i < Items.Size(); i++)
- if (Items[i].Name == name)
- return i;
- return -1;
- }
-
- void Clear()
- {
- NewFormat = false;
- NewFormatString.Empty();
- Help2Format = false;
- Items.Clear();
- }
-};
-
-struct CResetTable
-{
- UInt64 UncompressedSize;
- UInt64 CompressedSize;
- UInt64 BlockSize;
- CRecordVector<UInt64> ResetOffsets;
- bool GetCompressedSizeOfBlocks(UInt64 blockIndex, UInt32 numBlocks, UInt64 &size) const
- {
- if (blockIndex >= ResetOffsets.Size())
- return false;
- UInt64 startPos = ResetOffsets[(int)blockIndex];
- if (blockIndex + numBlocks >= ResetOffsets.Size())
- size = CompressedSize - startPos;
- else
- size = ResetOffsets[(int)(blockIndex + numBlocks)] - startPos;
- return true;
- }
- bool GetCompressedSizeOfBlock(UInt64 blockIndex, UInt64 &size) const
- {
- return GetCompressedSizeOfBlocks(blockIndex, 1, size);
- }
- UInt64 GetNumBlocks(UInt64 size) const
- {
- return (size + BlockSize - 1) / BlockSize;
- }
-};
-
-struct CLzxInfo
-{
- UInt32 Version;
- UInt32 ResetInterval;
- UInt32 WindowSize;
- UInt32 CacheSize;
- CResetTable ResetTable;
-
- UInt32 GetNumDictBits() const
- {
- if (Version == 2 || Version == 3)
- {
- for (int i = 0; i <= 31; i++)
- if (((UInt32)1 << i) >= WindowSize)
- return 15 + i;
- }
- return 0;
- }
-
- UInt64 GetFolderSize() const { return ResetTable.BlockSize * ResetInterval; };
- UInt64 GetFolder(UInt64 offset) const { return offset / GetFolderSize(); };
- UInt64 GetFolderPos(UInt64 folderIndex) const { return folderIndex * GetFolderSize(); };
- UInt64 GetBlockIndexFromFolderIndex(UInt64 folderIndex) const { return folderIndex * ResetInterval; };
- bool GetOffsetOfFolder(UInt64 folderIndex, UInt64 &offset) const
- {
- UInt64 blockIndex = GetBlockIndexFromFolderIndex(folderIndex);
- if (blockIndex >= ResetTable.ResetOffsets.Size())
- return false;
- offset = ResetTable.ResetOffsets[(int)blockIndex];
- return true;
- }
- bool GetCompressedSizeOfFolder(UInt64 folderIndex, UInt64 &size) const
- {
- UInt64 blockIndex = GetBlockIndexFromFolderIndex(folderIndex);
- return ResetTable.GetCompressedSizeOfBlocks(blockIndex, ResetInterval, size);
- }
-};
-
-struct CMethodInfo
-{
- GUID Guid;
- CByteBuffer ControlData;
- CLzxInfo LzxInfo;
- bool IsLzx() const;
- bool IsDes() const;
- AString GetGuidString() const;
- UString GetName() const;
-};
-
-struct CSectionInfo
-{
- UInt64 Offset;
- UInt64 CompressedSize;
- UInt64 UncompressedSize;
-
- AString Name;
- CObjectVector<CMethodInfo> Methods;
-
- bool IsLzx() const;
- UString GetMethodName() const;
-};
-
-class CFilesDatabase: public CDatabase
-{
-public:
- bool LowLevel;
- CRecordVector<int> Indices;
- CObjectVector<CSectionInfo> Sections;
-
- UInt64 GetFileSize(int fileIndex) const { return Items[Indices[fileIndex]].Size; }
- UInt64 GetFileOffset(int fileIndex) const { return Items[Indices[fileIndex]].Offset; }
-
- UInt64 GetFolder(int fileIndex) const
- {
- const CItem &item = Items[Indices[fileIndex]];
- const CSectionInfo &section = Sections[(int)item.Section];
- if (section.IsLzx())
- return section.Methods[0].LzxInfo.GetFolder(item.Offset);
- return 0;
- }
-
- UInt64 GetLastFolder(int fileIndex) const
- {
- const CItem &item = Items[Indices[fileIndex]];
- const CSectionInfo &section = Sections[(int)item.Section];
- if (section.IsLzx())
- return section.Methods[0].LzxInfo.GetFolder(item.Offset + item.Size - 1);
- return 0;
- }
-
- void HighLevelClear()
- {
- LowLevel = true;
- Indices.Clear();
- Sections.Clear();
- }
-
- void Clear()
- {
- CDatabase::Clear();
- HighLevelClear();
- }
- void SetIndices();
- void Sort();
- bool Check();
-};
-
-class CProgressVirt
-{
-public:
- STDMETHOD(SetTotal)(const UInt64 *numFiles) PURE;
- STDMETHOD(SetCompleted)(const UInt64 *numFiles) PURE;
-};
-
-class CInArchive
-{
- UInt64 _startPosition;
- ::CInBuffer _inBuffer;
- UInt64 _chunkSize;
-
- Byte ReadByte();
- void ReadBytes(Byte *data, UInt32 size);
- void Skip(size_t size);
- UInt16 ReadUInt16();
- UInt32 ReadUInt32();
- UInt64 ReadUInt64();
- UInt64 ReadEncInt();
- void ReadString(int size, AString &s);
- void ReadUString(int size, UString &s);
- void ReadGUID(GUID &g);
-
- HRESULT ReadChunk(IInStream *inStream, UInt64 pos, UInt64 size);
-
- HRESULT ReadDirEntry(CDatabase &database);
- HRESULT DecompressStream(IInStream *inStream, const CDatabase &database, const AString &name);
-
-public:
- HRESULT OpenChm(IInStream *inStream, CDatabase &database);
- HRESULT OpenHelp2(IInStream *inStream, CDatabase &database);
- HRESULT OpenHighLevel(IInStream *inStream, CFilesDatabase &database);
- HRESULT Open2(IInStream *inStream, const UInt64 *searchHeaderSizeLimit, CFilesDatabase &database);
- HRESULT Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit, CFilesDatabase &database);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmRegister.cpp
deleted file mode 100644
index e5f38afa4..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Chm/ChmRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// ChmRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "ChmHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NChm::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Chm", L"chm chi chq chw hxs hxi hxr hxq hxw lit", 0, 0xE9, { 'I', 'T', 'S', 'F' }, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Chm)
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComHandler.cpp
deleted file mode 100644
index 58f76439f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComHandler.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-// ComHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "ComHandler.h"
-
-namespace NArchive {
-namespace NCom {
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidMTime, VT_FILETIME}
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidSectorSize, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidClusterSize: prop = (UInt32)1 << _db.SectorSizeBits; break;
- case kpidSectorSize: prop = (UInt32)1 << _db.MiniSectorSizeBits; break;
- case kpidMainSubfile: if (_db.MainSubfile >= 0) prop = (UInt32)_db.MainSubfile; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CRef &ref = _db.Refs[index];
- const CItem &item = _db.Items[ref.Did];
-
- switch(propID)
- {
- case kpidPath: prop = _db.GetItemPath(index); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidCTime: prop = item.CTime; break;
- case kpidMTime: prop = item.MTime; break;
- case kpidPackSize: if (!item.IsDir()) prop = _db.GetItemPackSize(item.Size); break;
- case kpidSize: if (!item.IsDir()) prop = item.Size; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- try
- {
- if (_db.Open(inStream) != S_OK)
- return S_FALSE;
- _stream = inStream;
- }
- catch(...) { return S_FALSE; }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _db.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _db.Refs.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- UInt64 totalSize = 0;
- for(i = 0; i < numItems; i++)
- {
- const CItem &item = _db.Items[_db.Refs[allFilesMode ? i : indices[i]].Did];
- if (!item.IsDir())
- totalSize += item.Size;
- }
- RINOK(extractCallback->SetTotal(totalSize));
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _db.Items[_db.Refs[index].Did];
-
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
-
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- totalPackSize += _db.GetItemPackSize(item.Size);
- totalSize += item.Size;
-
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- Int32 res = NExtract::NOperationResult::kDataError;
- CMyComPtr<ISequentialInStream> inStream;
- HRESULT hres = GetStream(index, &inStream);
- if (hres == S_FALSE)
- res = NExtract::NOperationResult::kDataError;
- else if (hres == E_NOTIMPL)
- res = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- RINOK(hres);
- if (inStream)
- {
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- if (copyCoderSpec->TotalSize == item.Size)
- res = NExtract::NOperationResult::kOK;
- }
- }
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _db.Refs.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
- const CItem &item = _db.Items[_db.Refs[index].Did];
- CClusterInStream *streamSpec = new CClusterInStream;
- CMyComPtr<ISequentialInStream> streamTemp = streamSpec;
- streamSpec->Stream = _stream;
- streamSpec->StartOffset = 0;
-
- bool isLargeStream = _db.IsLargeStream(item.Size);
- int bsLog = isLargeStream ? _db.SectorSizeBits : _db.MiniSectorSizeBits;
- streamSpec->BlockSizeLog = bsLog;
- streamSpec->Size = item.Size;
-
- UInt32 clusterSize = (UInt32)1 << bsLog;
- UInt64 numClusters64 = (item.Size + clusterSize - 1) >> bsLog;
- if (numClusters64 >= ((UInt32)1 << 31))
- return E_NOTIMPL;
- streamSpec->Vector.Reserve((int)numClusters64);
- UInt32 sid = item.Sid;
- UInt64 size = item.Size;
-
- if (size != 0)
- {
- for (;; size -= clusterSize)
- {
- if (isLargeStream)
- {
- if (sid >= _db.FatSize)
- return S_FALSE;
- streamSpec->Vector.Add(sid + 1);
- sid = _db.Fat[sid];
- }
- else
- {
- UInt64 val;
- if (sid >= _db.MatSize || !_db.GetMiniCluster(sid, val) || val >= (UInt64)1 << 32)
- return S_FALSE;
- streamSpec->Vector.Add((UInt32)val);
- sid = _db.Mat[sid];
- }
- if (size <= clusterSize)
- break;
- }
- }
- if (sid != NFatID::kEndOfChain)
- return S_FALSE;
- RINOK(streamSpec->InitAndSeek());
- *stream = streamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComHandler.h b/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComHandler.h
deleted file mode 100644
index f2b7de96d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComHandler.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// ComHandler.h
-
-#ifndef __ARCHIVE_COM_HANDLER_H
-#define __ARCHIVE_COM_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-#include "ComIn.h"
-
-namespace NArchive {
-namespace NCom {
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CDatabase _db;
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComIn.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComIn.cpp
deleted file mode 100644
index 2203ca531..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComIn.cpp
+++ /dev/null
@@ -1,389 +0,0 @@
-// Archive/ComIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/Alloc.h"
-#include "../../../../C/CpuArch.h"
-
-#include "Common/IntToString.h"
-#include "Common/MyCom.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "ComIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-
-namespace NArchive{
-namespace NCom{
-
-static const UInt32 kSignatureSize = 8;
-static const Byte kSignature[kSignatureSize] = { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 };
-
-void CUInt32Buf::Free()
-{
- MyFree(_buf);
- _buf = 0;
-}
-
-bool CUInt32Buf::Allocate(UInt32 numItems)
-{
- Free();
- if (numItems == 0)
- return true;
- size_t newSize = (size_t)numItems * sizeof(UInt32);
- if (newSize / sizeof(UInt32) != numItems)
- return false;
- _buf = (UInt32 *)MyAlloc(newSize);
- return (_buf != 0);
-}
-
-static HRESULT ReadSector(IInStream *inStream, Byte *buf, int sectorSizeBits, UInt32 sid)
-{
- RINOK(inStream->Seek((((UInt64)sid + 1) << sectorSizeBits), STREAM_SEEK_SET, NULL));
- return ReadStream_FALSE(inStream, buf, (UInt32)1 << sectorSizeBits);
-}
-
-static HRESULT ReadIDs(IInStream *inStream, Byte *buf, int sectorSizeBits, UInt32 sid, UInt32 *dest)
-{
- RINOK(ReadSector(inStream, buf, sectorSizeBits, sid));
- UInt32 sectorSize = (UInt32)1 << sectorSizeBits;
- for (UInt32 t = 0; t < sectorSize; t += 4)
- *dest++ = Get32(buf + t);
- return S_OK;
-}
-
-static void GetFileTimeFromMem(const Byte *p, FILETIME *ft)
-{
- ft->dwLowDateTime = Get32(p);
- ft->dwHighDateTime = Get32(p + 4);
-}
-
-void CItem::Parse(const Byte *p, bool mode64bit)
-{
- memcpy(Name, p, kNameSizeMax);
- // NameSize = Get16(p + 64);
- Type = p[66];
- LeftDid = Get32(p + 68);
- RightDid = Get32(p + 72);
- SonDid = Get32(p + 76);
- // Flags = Get32(p + 96);
- GetFileTimeFromMem(p + 100, &CTime);
- GetFileTimeFromMem(p + 108, &MTime);
- Sid = Get32(p + 116);
- Size = Get32(p + 120);
- if (mode64bit)
- Size |= ((UInt64)Get32(p + 124) << 32);
-}
-
-void CDatabase::Clear()
-{
- Fat.Free();
- MiniSids.Free();
- Mat.Free();
- Items.Clear();
- Refs.Clear();
-}
-
-static const UInt32 kNoDid = 0xFFFFFFFF;
-
-HRESULT CDatabase::AddNode(int parent, UInt32 did)
-{
- if (did == kNoDid)
- return S_OK;
- if (did >= (UInt32)Items.Size())
- return S_FALSE;
- const CItem &item = Items[did];
- if (item.IsEmpty())
- return S_FALSE;
- CRef ref;
- ref.Parent = parent;
- ref.Did = did;
- int index = Refs.Add(ref);
- if (Refs.Size() > Items.Size())
- return S_FALSE;
- RINOK(AddNode(parent, item.LeftDid));
- RINOK(AddNode(parent, item.RightDid));
- if (item.IsDir())
- {
- RINOK(AddNode(index, item.SonDid));
- }
- return S_OK;
-}
-
-static const char kCharOpenBracket = '[';
-static const char kCharCloseBracket = ']';
-
-static UString CompoundNameToFileName(const UString &s)
-{
- UString res;
- for (int i = 0; i < s.Length(); i++)
- {
- wchar_t c = s[i];
- if (c < 0x20)
- {
- res += kCharOpenBracket;
- wchar_t buf[32];
- ConvertUInt32ToString(c, buf);
- res += buf;
- res += kCharCloseBracket;
- }
- else
- res += c;
- }
- return res;
-}
-
-static char g_MsiChars[] =
-"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._";
-
-static const wchar_t *kMsi_ID = L""; // L"{msi}";
-
-static const int kMsiNumBits = 6;
-static const UInt32 kMsiNumChars = 1 << kMsiNumBits;
-static const UInt32 kMsiCharMask = kMsiNumChars - 1;
-static const UInt32 kMsiStartUnicodeChar = 0x3800;
-static const UInt32 kMsiUnicodeRange = kMsiNumChars * (kMsiNumChars + 1);
-
-bool CompoundMsiNameToFileName(const UString &name, UString &resultName)
-{
- resultName.Empty();
- for (int i = 0; i < name.Length(); i++)
- {
- wchar_t c = name[i];
- if (c < kMsiStartUnicodeChar || c > kMsiStartUnicodeChar + kMsiUnicodeRange)
- return false;
- if (i == 0)
- resultName += kMsi_ID;
- c -= kMsiStartUnicodeChar;
-
- UInt32 c0 = c & kMsiCharMask;
- UInt32 c1 = c >> kMsiNumBits;
-
- if (c1 <= kMsiNumChars)
- {
- resultName += (wchar_t)g_MsiChars[c0];
- if (c1 == kMsiNumChars)
- break;
- resultName += (wchar_t)g_MsiChars[c1];
- }
- else
- resultName += L'!';
- }
- return true;
-}
-
-static UString ConvertName(const Byte *p, bool &isMsi)
-{
- isMsi = false;
- UString s;
- for (int i = 0; i < kNameSizeMax; i += 2)
- {
- wchar_t c = (p[i] | (wchar_t)p[i + 1] << 8);
- if (c == 0)
- break;
- s += c;
- }
- UString msiName;
- if (CompoundMsiNameToFileName(s, msiName))
- {
- isMsi = true;
- return msiName;
- }
- return CompoundNameToFileName(s);
-}
-
-static UString ConvertName(const Byte *p)
-{
- bool isMsi;
- return ConvertName(p, isMsi);
-}
-
-UString CDatabase::GetItemPath(UInt32 index) const
-{
- UString s;
- while (index != kNoDid)
- {
- const CRef &ref = Refs[index];
- const CItem &item = Items[ref.Did];
- if (!s.IsEmpty())
- s = (UString)WCHAR_PATH_SEPARATOR + s;
- s = ConvertName(item.Name) + s;
- index = ref.Parent;
- }
- return s;
-}
-
-HRESULT CDatabase::Open(IInStream *inStream)
-{
- MainSubfile = -1;
- static const UInt32 kHeaderSize = 512;
- Byte p[kHeaderSize];
- RINOK(ReadStream_FALSE(inStream, p, kHeaderSize));
- if (memcmp(p, kSignature, kSignatureSize) != 0)
- return S_FALSE;
- if (Get16(p + 0x1A) > 4) // majorVer
- return S_FALSE;
- if (Get16(p + 0x1C) != 0xFFFE)
- return S_FALSE;
- int sectorSizeBits = Get16(p + 0x1E);
- bool mode64bit = (sectorSizeBits >= 12);
- int miniSectorSizeBits = Get16(p + 0x20);
- SectorSizeBits = sectorSizeBits;
- MiniSectorSizeBits = miniSectorSizeBits;
-
- if (sectorSizeBits > 28 || miniSectorSizeBits > 28 ||
- sectorSizeBits < 7 || miniSectorSizeBits < 2 || miniSectorSizeBits > sectorSizeBits)
- return S_FALSE;
- UInt32 numSectorsForFAT = Get32(p + 0x2C);
- LongStreamMinSize = Get32(p + 0x38);
-
- UInt32 sectSize = (UInt32)1 << (int)sectorSizeBits;
-
- CByteBuffer sect;
- sect.SetCapacity(sectSize);
-
- int ssb2 = (int)(sectorSizeBits - 2);
- UInt32 numSidsInSec = (UInt32)1 << ssb2;
- UInt32 numFatItems = numSectorsForFAT << ssb2;
- if ((numFatItems >> ssb2) != numSectorsForFAT)
- return S_FALSE;
- FatSize = numFatItems;
-
- {
- CUInt32Buf bat;
- UInt32 numSectorsForBat = Get32(p + 0x48);
- const UInt32 kNumHeaderBatItems = 109;
- UInt32 numBatItems = kNumHeaderBatItems + (numSectorsForBat << ssb2);
- if (numBatItems < kNumHeaderBatItems || ((numBatItems - kNumHeaderBatItems) >> ssb2) != numSectorsForBat)
- return S_FALSE;
- if (!bat.Allocate(numBatItems))
- return S_FALSE;
- UInt32 i;
- for (i = 0; i < kNumHeaderBatItems; i++)
- bat[i] = Get32(p + 0x4c + i * 4);
- UInt32 sid = Get32(p + 0x44);
- for (UInt32 s = 0; s < numSectorsForBat; s++)
- {
- RINOK(ReadIDs(inStream, sect, sectorSizeBits, sid, bat + i));
- i += numSidsInSec - 1;
- sid = bat[i];
- }
- numBatItems = i;
-
- if (!Fat.Allocate(numFatItems))
- return S_FALSE;
- UInt32 j = 0;
-
- for (i = 0; i < numFatItems; j++, i += numSidsInSec)
- {
- if (j >= numBatItems)
- return S_FALSE;
- RINOK(ReadIDs(inStream, sect, sectorSizeBits, bat[j], Fat + i));
- }
- }
-
- UInt32 numMatItems;
- {
- UInt32 numSectorsForMat = Get32(p + 0x40);
- numMatItems = (UInt32)numSectorsForMat << ssb2;
- if ((numMatItems >> ssb2) != numSectorsForMat)
- return S_FALSE;
- if (!Mat.Allocate(numMatItems))
- return S_FALSE;
- UInt32 i;
- UInt32 sid = Get32(p + 0x3C);
- for (i = 0; i < numMatItems; i += numSidsInSec)
- {
- RINOK(ReadIDs(inStream, sect, sectorSizeBits, sid, Mat + i));
- if (sid >= numFatItems)
- return S_FALSE;
- sid = Fat[sid];
- }
- if (sid != NFatID::kEndOfChain)
- return S_FALSE;
- }
-
- {
- UInt32 sid = Get32(p + 0x30);
- for (;;)
- {
- if (sid >= numFatItems)
- return S_FALSE;
- RINOK(ReadSector(inStream, sect, sectorSizeBits, sid));
- for (UInt32 i = 0; i < sectSize; i += 128)
- {
- CItem item;
- item.Parse(sect + i, mode64bit);
- Items.Add(item);
- }
- sid = Fat[sid];
- if (sid == NFatID::kEndOfChain)
- break;
- }
- }
-
- CItem root = Items[0];
-
- {
- UInt32 numSectorsInMiniStream;
- {
- UInt64 numSatSects64 = (root.Size + sectSize - 1) >> sectorSizeBits;
- if (numSatSects64 > NFatID::kMaxValue)
- return S_FALSE;
- numSectorsInMiniStream = (UInt32)numSatSects64;
- }
- NumSectorsInMiniStream = numSectorsInMiniStream;
- if (!MiniSids.Allocate(numSectorsInMiniStream))
- return S_FALSE;
- {
- UInt64 matSize64 = (root.Size + ((UInt64)1 << miniSectorSizeBits) - 1) >> miniSectorSizeBits;
- if (matSize64 > NFatID::kMaxValue)
- return S_FALSE;
- MatSize = (UInt32)matSize64;
- if (numMatItems < MatSize)
- return S_FALSE;
- }
-
- UInt32 sid = root.Sid;
- for (UInt32 i = 0; ; i++)
- {
- if (sid == NFatID::kEndOfChain)
- {
- if (i != numSectorsInMiniStream)
- return S_FALSE;
- break;
- }
- if (i >= numSectorsInMiniStream)
- return S_FALSE;
- MiniSids[i] = sid;
- if (sid >= numFatItems)
- return S_FALSE;
- sid = Fat[sid];
- }
- }
-
- RINOK(AddNode(-1, root.SonDid));
-
- unsigned numCabs = 0;
- for (int i = 0; i < Refs.Size(); i++)
- {
- const CItem &item = Items[Refs[i].Did];
- if (item.IsDir() || numCabs > 1)
- continue;
- bool isMsiName;
- UString msiName = ConvertName(item.Name, isMsiName);
- if (isMsiName && msiName.Right(4).CompareNoCase(L".cab") == 0)
- {
- numCabs++;
- MainSubfile = i;
- }
- }
- if (numCabs > 1)
- MainSubfile = -1;
-
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComIn.h b/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComIn.h
deleted file mode 100644
index 429d3796e..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComIn.h
+++ /dev/null
@@ -1,119 +0,0 @@
-// Archive/ComIn.h
-
-#ifndef __ARCHIVE_COM_IN_H
-#define __ARCHIVE_COM_IN_H
-
-#include "Common/MyString.h"
-#include "Common/Buffer.h"
-
-namespace NArchive {
-namespace NCom {
-
-struct CUInt32Buf
-{
- UInt32 *_buf;
-public:
- CUInt32Buf(): _buf(0) {}
- ~CUInt32Buf() { Free(); }
- void Free();
- bool Allocate(UInt32 numItems);
- operator UInt32 *() const { return _buf; };
-};
-
-namespace NFatID
-{
- const UInt32 kFree = 0xFFFFFFFF;
- const UInt32 kEndOfChain = 0xFFFFFFFE;
- const UInt32 kFatSector = 0xFFFFFFFD;
- const UInt32 kMatSector = 0xFFFFFFFC;
- const UInt32 kMaxValue = 0xFFFFFFFA;
-}
-
-namespace NItemType
-{
- const Byte kEmpty = 0;
- const Byte kStorage = 1;
- const Byte kStream = 2;
- const Byte kLockBytes = 3;
- const Byte kProperty = 4;
- const Byte kRootStorage = 5;
-}
-
-const UInt32 kNameSizeMax = 64;
-
-struct CItem
-{
- Byte Name[kNameSizeMax];
- // UInt16 NameSize;
- // UInt32 Flags;
- FILETIME CTime;
- FILETIME MTime;
- UInt64 Size;
- UInt32 LeftDid;
- UInt32 RightDid;
- UInt32 SonDid;
- UInt32 Sid;
- Byte Type;
-
- bool IsEmpty() const { return Type == NItemType::kEmpty; }
- bool IsDir() const { return Type == NItemType::kStorage || Type == NItemType::kRootStorage; }
-
- void Parse(const Byte *p, bool mode64bit);
-};
-
-struct CRef
-{
- int Parent;
- UInt32 Did;
-};
-
-class CDatabase
-{
- UInt32 NumSectorsInMiniStream;
- CUInt32Buf MiniSids;
-
- HRESULT AddNode(int parent, UInt32 did);
-public:
-
- CUInt32Buf Fat;
- UInt32 FatSize;
-
- CUInt32Buf Mat;
- UInt32 MatSize;
-
- CObjectVector<CItem> Items;
- CRecordVector<CRef> Refs;
-
- UInt32 LongStreamMinSize;
- int SectorSizeBits;
- int MiniSectorSizeBits;
-
- Int32 MainSubfile;
-
- void Clear();
- bool IsLargeStream(UInt64 size) const { return size >= LongStreamMinSize; }
- UString GetItemPath(UInt32 index) const;
-
- UInt64 GetItemPackSize(UInt64 size) const
- {
- UInt64 mask = ((UInt64)1 << (IsLargeStream(size) ? SectorSizeBits : MiniSectorSizeBits)) - 1;
- return (size + mask) & ~mask;
- }
-
- bool GetMiniCluster(UInt32 sid, UInt64 &res) const
- {
- int subBits = SectorSizeBits - MiniSectorSizeBits;
- UInt32 fid = sid >> subBits;
- if (fid >= NumSectorsInMiniStream)
- return false;
- res = (((UInt64)MiniSids[fid] + 1) << subBits) + (sid & ((1 << subBits) - 1));
- return true;
- }
-
- HRESULT Open(IInStream *inStream);
-};
-
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComRegister.cpp
deleted file mode 100644
index 6712b890f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Com/ComRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// ComRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "ComHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NCom::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Compound", L"msi msp doc xls ppt", 0, 0xE5, { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 }, 8, false, CreateArc, 0 };
-
-REGISTER_ARC(Com)
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Common/CoderMixer2ST.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Common/CoderMixer2ST.cpp
deleted file mode 100644
index a59ce5fc0..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Common/CoderMixer2ST.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-// CoderMixer2ST.cpp
-
-#include "StdAfx.h"
-
-#include "CoderMixer2ST.h"
-
-namespace NCoderMixer2 {
-
-CCoderMixer2ST::CCoderMixer2ST() {}
-
-CCoderMixer2ST::~CCoderMixer2ST(){ }
-
-HRESULT CCoderMixer2ST::SetBindInfo(const CBindInfo &bindInfo)
-{
- _bindInfo = bindInfo;
- return S_OK;
-}
-
-void CCoderMixer2ST::AddCoderCommon(bool isMain)
-{
- const CCoderStreamsInfo &csi = _bindInfo.Coders[_coders.Size()];
- _coders.Add(CSTCoderInfo(csi.NumInStreams, csi.NumOutStreams, isMain));
-}
-
-void CCoderMixer2ST::AddCoder(ICompressCoder *coder, bool isMain)
-{
- AddCoderCommon(isMain);
- _coders.Back().Coder = coder;
-}
-
-void CCoderMixer2ST::AddCoder2(ICompressCoder2 *coder, bool isMain)
-{
- AddCoderCommon(isMain);
- _coders.Back().Coder2 = coder;
-}
-
-void CCoderMixer2ST::ReInit() { }
-
-HRESULT CCoderMixer2ST::GetInStream(
- ISequentialInStream **inStreams, const UInt64 **inSizes,
- UInt32 streamIndex, ISequentialInStream **inStreamRes)
-{
- CMyComPtr<ISequentialInStream> seqInStream;
- int i;
- for(i = 0; i < _bindInfo.InStreams.Size(); i++)
- if (_bindInfo.InStreams[i] == streamIndex)
- {
- seqInStream = inStreams[i];
- *inStreamRes = seqInStream.Detach();
- return S_OK;
- }
- int binderIndex = _bindInfo.FindBinderForInStream(streamIndex);
- if (binderIndex < 0)
- return E_INVALIDARG;
-
- UInt32 coderIndex, coderStreamIndex;
- _bindInfo.FindOutStream(_bindInfo.BindPairs[binderIndex].OutIndex,
- coderIndex, coderStreamIndex);
-
- CCoderInfo &coder = _coders[coderIndex];
- if (!coder.Coder)
- return E_NOTIMPL;
- coder.Coder.QueryInterface(IID_ISequentialInStream, &seqInStream);
- if (!seqInStream)
- return E_NOTIMPL;
-
- UInt32 startIndex = _bindInfo.GetCoderInStreamIndex(coderIndex);
-
- CMyComPtr<ICompressSetInStream> setInStream;
- if (!coder.Coder)
- return E_NOTIMPL;
- coder.Coder.QueryInterface(IID_ICompressSetInStream, &setInStream);
- if (!setInStream)
- return E_NOTIMPL;
-
- if (coder.NumInStreams > 1)
- return E_NOTIMPL;
- for (i = 0; i < (int)coder.NumInStreams; i++)
- {
- CMyComPtr<ISequentialInStream> seqInStream2;
- RINOK(GetInStream(inStreams, inSizes, startIndex + i, &seqInStream2));
- RINOK(setInStream->SetInStream(seqInStream2));
- }
- *inStreamRes = seqInStream.Detach();
- return S_OK;
-}
-
-HRESULT CCoderMixer2ST::GetOutStream(
- ISequentialOutStream **outStreams, const UInt64 **outSizes,
- UInt32 streamIndex, ISequentialOutStream **outStreamRes)
-{
- CMyComPtr<ISequentialOutStream> seqOutStream;
- int i;
- for(i = 0; i < _bindInfo.OutStreams.Size(); i++)
- if (_bindInfo.OutStreams[i] == streamIndex)
- {
- seqOutStream = outStreams[i];
- *outStreamRes = seqOutStream.Detach();
- return S_OK;
- }
- int binderIndex = _bindInfo.FindBinderForOutStream(streamIndex);
- if (binderIndex < 0)
- return E_INVALIDARG;
-
- UInt32 coderIndex, coderStreamIndex;
- _bindInfo.FindInStream(_bindInfo.BindPairs[binderIndex].InIndex,
- coderIndex, coderStreamIndex);
-
- CCoderInfo &coder = _coders[coderIndex];
- if (!coder.Coder)
- return E_NOTIMPL;
- coder.Coder.QueryInterface(IID_ISequentialOutStream, &seqOutStream);
- if (!seqOutStream)
- return E_NOTIMPL;
-
- UInt32 startIndex = _bindInfo.GetCoderOutStreamIndex(coderIndex);
-
- CMyComPtr<ICompressSetOutStream> setOutStream;
- if (!coder.Coder)
- return E_NOTIMPL;
- coder.Coder.QueryInterface(IID_ICompressSetOutStream, &setOutStream);
- if (!setOutStream)
- return E_NOTIMPL;
-
- if (coder.NumOutStreams > 1)
- return E_NOTIMPL;
- for (i = 0; i < (int)coder.NumOutStreams; i++)
- {
- CMyComPtr<ISequentialOutStream> seqOutStream2;
- RINOK(GetOutStream(outStreams, outSizes, startIndex + i, &seqOutStream2));
- RINOK(setOutStream->SetOutStream(seqOutStream2));
- }
- *outStreamRes = seqOutStream.Detach();
- return S_OK;
-}
-
-
-STDMETHODIMP CCoderMixer2ST::Code(ISequentialInStream **inStreams,
- const UInt64 **inSizes,
- UInt32 numInStreams,
- ISequentialOutStream **outStreams,
- const UInt64 **outSizes,
- UInt32 numOutStreams,
- ICompressProgressInfo *progress)
-{
- if (numInStreams != (UInt32)_bindInfo.InStreams.Size() ||
- numOutStreams != (UInt32)_bindInfo.OutStreams.Size())
- return E_INVALIDARG;
-
- // Find main coder
- int _mainCoderIndex = -1;
- int i;
- for (i = 0; i < _coders.Size(); i++)
- if (_coders[i].IsMain)
- {
- _mainCoderIndex = i;
- break;
- }
- if (_mainCoderIndex < 0)
- for (i = 0; i < _coders.Size(); i++)
- if (_coders[i].NumInStreams > 1)
- {
- if (_mainCoderIndex >= 0)
- return E_NOTIMPL;
- _mainCoderIndex = i;
- }
- if (_mainCoderIndex < 0)
- _mainCoderIndex = 0;
-
- // _mainCoderIndex = 0;
- // _mainCoderIndex = _coders.Size() - 1;
- CCoderInfo &mainCoder = _coders[_mainCoderIndex];
-
- CObjectVector< CMyComPtr<ISequentialInStream> > seqInStreams;
- CObjectVector< CMyComPtr<ISequentialOutStream> > seqOutStreams;
- UInt32 startInIndex = _bindInfo.GetCoderInStreamIndex(_mainCoderIndex);
- UInt32 startOutIndex = _bindInfo.GetCoderOutStreamIndex(_mainCoderIndex);
- for (i = 0; i < (int)mainCoder.NumInStreams; i++)
- {
- CMyComPtr<ISequentialInStream> seqInStream;
- RINOK(GetInStream(inStreams, inSizes, startInIndex + i, &seqInStream));
- seqInStreams.Add(seqInStream);
- }
- for (i = 0; i < (int)mainCoder.NumOutStreams; i++)
- {
- CMyComPtr<ISequentialOutStream> seqOutStream;
- RINOK(GetOutStream(outStreams, outSizes, startOutIndex + i, &seqOutStream));
- seqOutStreams.Add(seqOutStream);
- }
- CRecordVector< ISequentialInStream * > seqInStreamsSpec;
- CRecordVector< ISequentialOutStream * > seqOutStreamsSpec;
- for (i = 0; i < (int)mainCoder.NumInStreams; i++)
- seqInStreamsSpec.Add(seqInStreams[i]);
- for (i = 0; i < (int)mainCoder.NumOutStreams; i++)
- seqOutStreamsSpec.Add(seqOutStreams[i]);
-
- for (i = 0; i < _coders.Size(); i++)
- {
- if (i == _mainCoderIndex)
- continue;
- CCoderInfo &coder = _coders[i];
- CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;
- coder.Coder.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize);
- if (setOutStreamSize)
- {
- RINOK(setOutStreamSize->SetOutStreamSize(coder.OutSizePointers[0]));
- }
- }
- if (mainCoder.Coder)
- {
- RINOK(mainCoder.Coder->Code(
- seqInStreamsSpec[0], seqOutStreamsSpec[0],
- mainCoder.InSizePointers[0], mainCoder.OutSizePointers[0],
- progress));
- }
- else
- {
- RINOK(mainCoder.Coder2->Code(
- &seqInStreamsSpec.Front(),
- &mainCoder.InSizePointers.Front(), mainCoder.NumInStreams,
- &seqOutStreamsSpec.Front(),
- &mainCoder.OutSizePointers.Front(), mainCoder.NumOutStreams,
- progress));
- }
- CMyComPtr<IOutStreamFlush> flush;
- seqOutStreams.Front().QueryInterface(IID_IOutStreamFlush, &flush);
- if (flush)
- return flush->Flush();
- return S_OK;
-}
-
-/*
-UInt64 CCoderMixer2ST::GetWriteProcessedSize(UInt32 binderIndex) const
-{
- return _streamBinders[binderIndex].ProcessedSize;
-}
-*/
-
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Common/CoderMixer2ST.h b/src/libs/7zip/unix/CPP/7zip/Archive/Common/CoderMixer2ST.h
deleted file mode 100644
index a4ea7e80d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Common/CoderMixer2ST.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// CoderMixer2ST.h
-
-#ifndef __CODER_MIXER2_ST_H
-#define __CODER_MIXER2_ST_H
-
-#include "CoderMixer2.h"
-#include "../../../Common/MyCom.h"
-#include "../../ICoder.h"
-
-namespace NCoderMixer2 {
-
-// SetBindInfo()
-// for each coder
-// {
-// AddCoder[2]()
-// }
-//
-// for each file
-// {
-// ReInit()
-// for each coder
-// {
-// SetCoderInfo
-// }
-// SetProgressIndex(UInt32 coderIndex);
-// Code
-// }
-
-struct CSTCoderInfo: public CCoderInfo
-{
- bool IsMain;
- CSTCoderInfo(UInt32 numInStreams, UInt32 numOutStreams, bool isMain):
- CCoderInfo(numInStreams, numOutStreams),IsMain(isMain) {}
-};
-
-class CCoderMixer2ST:
- public ICompressCoder2,
- public CCoderMixer2,
- public CMyUnknownImp
-{
- MY_UNKNOWN_IMP
-
- HRESULT GetInStream(
- ISequentialInStream **inStreams, const UInt64 **inSizes,
- UInt32 streamIndex, ISequentialInStream **inStreamRes);
- HRESULT GetOutStream(
- ISequentialOutStream **outStreams, const UInt64 **outSizes,
- UInt32 streamIndex, ISequentialOutStream **outStreamRes);
-public:
- STDMETHOD(Code)(ISequentialInStream **inStreams,
- const UInt64 **inSizes,
- UInt32 numInStreams,
- ISequentialOutStream **outStreams,
- const UInt64 **outSizes,
- UInt32 numOutStreams,
- ICompressProgressInfo *progress);
-
- CCoderMixer2ST();
- ~CCoderMixer2ST();
- void AddCoderCommon(bool isMain);
- void AddCoder(ICompressCoder *coder, bool isMain);
- void AddCoder2(ICompressCoder2 *coder, bool isMain);
-
- void ReInit();
- void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes)
- {
- { _coders[coderIndex].SetCoderInfo(inSizes, outSizes); }
- }
-
- void SetProgressCoderIndex(UInt32 /*coderIndex*/)
- {
- // _progressCoderIndex = coderIndex;
- }
-
- // UInt64 GetWriteProcessedSize(UInt32 binderIndex) const;
-
-private:
- CBindInfo _bindInfo;
- CObjectVector<CSTCoderInfo> _coders;
- int _mainCoderIndex;
-public:
- HRESULT SetBindInfo(const CBindInfo &bindInfo);
-
-};
-
-}
-#endif
-
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Common/FindSignature.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Common/FindSignature.cpp
deleted file mode 100644
index dc4e33980..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Common/FindSignature.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-// FindSignature.cpp
-
-#include "StdAfx.h"
-
-#include "Common/Buffer.h"
-
-#include "FindSignature.h"
-
-#include "../../Common/StreamUtils.h"
-
-HRESULT FindSignatureInStream(ISequentialInStream *stream,
- const Byte *signature, unsigned signatureSize,
- const UInt64 *limit, UInt64 &resPos)
-{
- resPos = 0;
- CByteBuffer byteBuffer2;
- byteBuffer2.SetCapacity(signatureSize);
- RINOK(ReadStream_FALSE(stream, byteBuffer2, signatureSize));
-
- if (memcmp(byteBuffer2, signature, signatureSize) == 0)
- return S_OK;
-
- const UInt32 kBufferSize = (1 << 16);
- CByteBuffer byteBuffer;
- byteBuffer.SetCapacity(kBufferSize);
- Byte *buffer = byteBuffer;
- UInt32 numPrevBytes = signatureSize - 1;
- memcpy(buffer, (const Byte *)byteBuffer2 + 1, numPrevBytes);
- resPos = 1;
- for (;;)
- {
- if (limit != NULL)
- if (resPos > *limit)
- return S_FALSE;
- do
- {
- UInt32 numReadBytes = kBufferSize - numPrevBytes;
- UInt32 processedSize;
- RINOK(stream->Read(buffer + numPrevBytes, numReadBytes, &processedSize));
- numPrevBytes += processedSize;
- if (processedSize == 0)
- return S_FALSE;
- }
- while (numPrevBytes < signatureSize);
- UInt32 numTests = numPrevBytes - signatureSize + 1;
- for (UInt32 pos = 0; pos < numTests; pos++)
- {
- Byte b = signature[0];
- for (; buffer[pos] != b && pos < numTests; pos++) {}
- if (pos == numTests)
- break;
- if (memcmp(buffer + pos, signature, signatureSize) == 0)
- {
- resPos += pos;
- return S_OK;
- }
- }
- resPos += numTests;
- numPrevBytes -= numTests;
- memmove(buffer, buffer + numTests, numPrevBytes);
- }
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Common/FindSignature.h b/src/libs/7zip/unix/CPP/7zip/Archive/Common/FindSignature.h
deleted file mode 100644
index e15af5732..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Common/FindSignature.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// FindSignature.h
-
-#ifndef __FINDSIGNATURE_H
-#define __FINDSIGNATURE_H
-
-#include "../../IStream.h"
-
-HRESULT FindSignatureInStream(ISequentialInStream *stream,
- const Byte *signature, unsigned signatureSize,
- const UInt64 *limit, UInt64 &resPos);
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp
deleted file mode 100644
index 0526c1b1d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// OutStreamWithSha1.cpp
-
-#include "StdAfx.h"
-
-#include "OutStreamWithSha1.h"
-
-STDMETHODIMP COutStreamWithSha1::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- HRESULT result = S_OK;
- if (_stream)
- result = _stream->Write(data, size, &size);
- if (_calculate)
- _sha.Update((const Byte *)data, size);
- _size += size;
- if (processedSize != NULL)
- *processedSize = size;
- return result;
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Common/OutStreamWithSha1.h b/src/libs/7zip/unix/CPP/7zip/Archive/Common/OutStreamWithSha1.h
deleted file mode 100644
index 3bbfbbe19..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Common/OutStreamWithSha1.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// OutStreamWithSha1.h
-
-#ifndef __OUT_STREAM_WITH_SHA1_H
-#define __OUT_STREAM_WITH_SHA1_H
-
-#include "../../Crypto/Sha1.h"
-
-#include "../../../Common/MyCom.h"
-
-#include "../../IStream.h"
-
-class COutStreamWithSha1:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialOutStream> _stream;
- UInt64 _size;
- NCrypto::NSha1::CContext _sha;
- bool _calculate;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- void SetStream(ISequentialOutStream *stream) { _stream = stream; }
- void ReleaseStream() { _stream.Release(); }
- void Init(bool calculate = true)
- {
- _size = 0;
- _calculate = calculate;
- _sha.Init();
- }
- void InitSha1() { _sha.Init(); }
- UInt64 GetSize() const { return _size; }
- void Final(Byte *digest) { _sha.Final(digest); }
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/CpioHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/CpioHandler.cpp
deleted file mode 100644
index 0f32ef663..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/CpioHandler.cpp
+++ /dev/null
@@ -1,624 +0,0 @@
-// CpioHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-#include "Common/StringToInt.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#include "Common/ItemNameUtils.h"
-
-namespace NArchive {
-namespace NCpio {
-
-namespace NFileHeader
-{
- namespace NMagic
- {
- const char *kMagic1 = "070701";
- const char *kMagic2 = "070702";
- const char *kMagic3 = "070707";
- const char *kEndName = "TRAILER!!!";
-
- const Byte kMagicForRecord2[2] = { 0xC7, 0x71 };
- }
-
- const UInt32 kRecord2Size = 26;
- /*
- struct CRecord2
- {
- unsigned short c_magic;
- short c_dev;
- unsigned short c_ino;
- unsigned short c_mode;
- unsigned short c_uid;
- unsigned short c_gid;
- unsigned short c_nlink;
- short c_rdev;
- unsigned short c_mtimes[2];
- unsigned short c_namesize;
- unsigned short c_filesizes[2];
- };
- */
-
- const UInt32 kRecordSize = 110;
- /*
- struct CRecord
- {
- char Magic[6]; // "070701" for "new" portable format, "070702" for CRC format
- char inode[8];
- char Mode[8];
- char UID[8];
- char GID[8];
- char nlink[8];
- char mtime[8];
- char Size[8]; // must be 0 for FIFOs and directories
- char DevMajor[8];
- char DevMinor[8];
- char RDevMajor[8]; //only valid for chr and blk special files
- char RDevMinor[8]; //only valid for chr and blk special files
- char NameSize[8]; // count includes terminating NUL in pathname
- char ChkSum[8]; // 0 for "new" portable format; for CRC format the sum of all the bytes in the file
- bool CheckMagic() const
- { return memcmp(Magic, NMagic::kMagic1, 6) == 0 ||
- memcmp(Magic, NMagic::kMagic2, 6) == 0; };
- };
- */
-
- const UInt32 kOctRecordSize = 76;
-
-}
-
-struct CItem
-{
- AString Name;
- UInt32 inode;
- UInt32 Mode;
- UInt32 UID;
- UInt32 GID;
- UInt32 Size;
- UInt32 MTime;
-
- // char LinkFlag;
- // AString LinkName; ?????
- char Magic[8];
- UInt32 NumLinks;
- UInt32 DevMajor;
- UInt32 DevMinor;
- UInt32 RDevMajor;
- UInt32 RDevMinor;
- UInt32 ChkSum;
-
- UInt32 Align;
-
- bool IsDir() const { return (Mode & 0170000) == 0040000; }
-};
-
-class CItemEx: public CItem
-{
-public:
- UInt64 HeaderPosition;
- UInt32 HeaderSize;
- UInt64 GetDataPosition() const { return HeaderPosition + HeaderSize; };
-};
-
-const UInt32 kMaxBlockSize = NFileHeader::kRecordSize;
-
-class CInArchive
-{
- CMyComPtr<IInStream> m_Stream;
- UInt64 m_Position;
-
- UInt16 _blockSize;
- Byte _block[kMaxBlockSize];
- UInt32 _blockPos;
- Byte ReadByte();
- UInt16 ReadUInt16();
- UInt32 ReadUInt32();
-
- bool ReadNumber(UInt32 &resultValue);
- bool ReadOctNumber(int size, UInt32 &resultValue);
-
- HRESULT ReadBytes(void *data, UInt32 size, UInt32 &processedSize);
-public:
- HRESULT Open(IInStream *inStream);
- HRESULT GetNextItem(bool &filled, CItemEx &itemInfo);
- HRESULT Skip(UInt64 numBytes);
- HRESULT SkipDataRecords(UInt64 dataSize, UInt32 align);
-};
-
-HRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 &processedSize)
-{
- size_t realProcessedSize = size;
- RINOK(ReadStream(m_Stream, data, &realProcessedSize));
- processedSize = (UInt32)realProcessedSize;
- m_Position += processedSize;
- return S_OK;
-}
-
-Byte CInArchive::ReadByte()
-{
- if (_blockPos >= _blockSize)
- throw "Incorrect cpio archive";
- return _block[_blockPos++];
-}
-
-UInt16 CInArchive::ReadUInt16()
-{
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- {
- Byte b = ReadByte();
- value |= (UInt16(b) << (8 * i));
- }
- return value;
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- {
- Byte b = ReadByte();
- value |= (UInt32(b) << (8 * i));
- }
- return value;
-}
-
-HRESULT CInArchive::Open(IInStream *inStream)
-{
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Position));
- m_Stream = inStream;
- return S_OK;
-}
-
-bool CInArchive::ReadNumber(UInt32 &resultValue)
-{
- resultValue = 0;
- for (int i = 0; i < 8; i++)
- {
- char c = char(ReadByte());
- int d;
- if (c >= '0' && c <= '9')
- d = c - '0';
- else if (c >= 'A' && c <= 'F')
- d = 10 + c - 'A';
- else if (c >= 'a' && c <= 'f')
- d = 10 + c - 'a';
- else
- return false;
- resultValue *= 0x10;
- resultValue += d;
- }
- return true;
-}
-
-static bool OctalToNumber(const char *s, UInt64 &res)
-{
- const char *end;
- res = ConvertOctStringToUInt64(s, &end);
- return (*end == ' ' || *end == 0);
-}
-
-static bool OctalToNumber32(const char *s, UInt32 &res)
-{
- UInt64 res64;
- if (!OctalToNumber(s, res64))
- return false;
- res = (UInt32)res64;
- return (res64 <= 0xFFFFFFFF);
-}
-
-bool CInArchive::ReadOctNumber(int size, UInt32 &resultValue)
-{
- char sz[32 + 4];
- int i;
- for (i = 0; i < size && i < 32; i++)
- sz[i] = (char)ReadByte();
- sz[i] = 0;
- return OctalToNumber32(sz, resultValue);
-}
-
-#define GetFromHex(y) { if (!ReadNumber(y)) return S_FALSE; }
-#define GetFromOct6(y) { if (!ReadOctNumber(6, y)) return S_FALSE; }
-#define GetFromOct11(y) { if (!ReadOctNumber(11, y)) return S_FALSE; }
-
-static unsigned short ConvertValue(unsigned short value, bool convert)
-{
- if (!convert)
- return value;
- return (unsigned short)((((unsigned short)(value & 0xFF)) << 8) | (value >> 8));
-}
-
-static UInt32 GetAlignedSize(UInt32 size, UInt32 align)
-{
- while ((size & (align - 1)) != 0)
- size++;
- return size;
-}
-
-
-HRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item)
-{
- filled = false;
-
- UInt32 processedSize;
- item.HeaderPosition = m_Position;
-
- _blockSize = kMaxBlockSize;
- RINOK(ReadBytes(_block, 2, processedSize));
- if (processedSize != 2)
- return S_FALSE;
- _blockPos = 0;
-
- UInt32 nameSize;
-
- bool oldBE =
- _block[0] == NFileHeader::NMagic::kMagicForRecord2[1] &&
- _block[1] == NFileHeader::NMagic::kMagicForRecord2[0];
-
- bool binMode = (_block[0] == NFileHeader::NMagic::kMagicForRecord2[0] &&
- _block[1] == NFileHeader::NMagic::kMagicForRecord2[1]) ||
- oldBE;
-
- if (binMode)
- {
- RINOK(ReadBytes(_block + 2, NFileHeader::kRecord2Size - 2, processedSize));
- if (processedSize != NFileHeader::kRecord2Size - 2)
- return S_FALSE;
- item.Align = 2;
- _blockPos = 2;
- item.DevMajor = 0;
- item.DevMinor = ConvertValue(ReadUInt16(), oldBE);
- item.inode = ConvertValue(ReadUInt16(), oldBE);
- item.Mode = ConvertValue(ReadUInt16(), oldBE);
- item.UID = ConvertValue(ReadUInt16(), oldBE);
- item.GID = ConvertValue(ReadUInt16(), oldBE);
- item.NumLinks = ConvertValue(ReadUInt16(), oldBE);
- item.RDevMajor =0;
- item.RDevMinor = ConvertValue(ReadUInt16(), oldBE);
- UInt16 timeHigh = ConvertValue(ReadUInt16(), oldBE);
- UInt16 timeLow = ConvertValue(ReadUInt16(), oldBE);
- item.MTime = (UInt32(timeHigh) << 16) + timeLow;
- nameSize = ConvertValue(ReadUInt16(), oldBE);
- UInt16 sizeHigh = ConvertValue(ReadUInt16(), oldBE);
- UInt16 sizeLow = ConvertValue(ReadUInt16(), oldBE);
- item.Size = (UInt32(sizeHigh) << 16) + sizeLow;
-
- item.ChkSum = 0;
- item.HeaderSize = GetAlignedSize(
- nameSize + NFileHeader::kRecord2Size, item.Align);
- nameSize = item.HeaderSize - NFileHeader::kRecord2Size;
- }
- else
- {
- RINOK(ReadBytes(_block + 2, 4, processedSize));
- if (processedSize != 4)
- return S_FALSE;
-
- bool magicOK =
- memcmp(_block, NFileHeader::NMagic::kMagic1, 6) == 0 ||
- memcmp(_block, NFileHeader::NMagic::kMagic2, 6) == 0;
- _blockPos = 6;
- if (magicOK)
- {
- RINOK(ReadBytes(_block + 6, NFileHeader::kRecordSize - 6, processedSize));
- if (processedSize != NFileHeader::kRecordSize - 6)
- return S_FALSE;
- item.Align = 4;
-
- GetFromHex(item.inode);
- GetFromHex(item.Mode);
- GetFromHex(item.UID);
- GetFromHex(item.GID);
- GetFromHex(item.NumLinks);
- UInt32 mTime;
- GetFromHex(mTime);
- item.MTime = mTime;
- GetFromHex(item.Size);
- GetFromHex(item.DevMajor);
- GetFromHex(item.DevMinor);
- GetFromHex(item.RDevMajor);
- GetFromHex(item.RDevMinor);
- GetFromHex(nameSize);
- GetFromHex(item.ChkSum);
- item.HeaderSize = GetAlignedSize(
- nameSize + NFileHeader::kRecordSize, item.Align);
- nameSize = item.HeaderSize - NFileHeader::kRecordSize;
- }
- else
- {
- if (!memcmp(_block, NFileHeader::NMagic::kMagic3, 6) == 0)
- return S_FALSE;
- RINOK(ReadBytes(_block + 6, NFileHeader::kOctRecordSize - 6, processedSize));
- if (processedSize != NFileHeader::kOctRecordSize - 6)
- return S_FALSE;
- item.Align = 1;
- item.DevMajor = 0;
- GetFromOct6(item.DevMinor);
- GetFromOct6(item.inode);
- GetFromOct6(item.Mode);
- GetFromOct6(item.UID);
- GetFromOct6(item.GID);
- GetFromOct6(item.NumLinks);
- item.RDevMajor = 0;
- GetFromOct6(item.RDevMinor);
- UInt32 mTime;
- GetFromOct11(mTime);
- item.MTime = mTime;
- GetFromOct6(nameSize);
- GetFromOct11(item.Size); // ?????
- item.HeaderSize = GetAlignedSize(
- nameSize + NFileHeader::kOctRecordSize, item.Align);
- nameSize = item.HeaderSize - NFileHeader::kOctRecordSize;
- }
- }
- if (nameSize == 0 || nameSize >= (1 << 27))
- return E_FAIL;
- RINOK(ReadBytes(item.Name.GetBuffer(nameSize), nameSize, processedSize));
- if (processedSize != nameSize)
- return E_FAIL;
- item.Name.ReleaseBuffer();
- if (strcmp(item.Name, NFileHeader::NMagic::kEndName) == 0)
- return S_OK;
- filled = true;
- return S_OK;
-}
-
-HRESULT CInArchive::Skip(UInt64 numBytes)
-{
- UInt64 newPostion;
- RINOK(m_Stream->Seek(numBytes, STREAM_SEEK_CUR, &newPostion));
- m_Position += numBytes;
- if (m_Position != newPostion)
- return E_FAIL;
- return S_OK;
-}
-
-HRESULT CInArchive::SkipDataRecords(UInt64 dataSize, UInt32 align)
-{
- while ((dataSize & (align - 1)) != 0)
- dataSize++;
- return Skip(dataSize);
-}
-
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CObjectVector<CItemEx> _items;
- CMyComPtr<IInStream> _stream;
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-/*
-enum
-{
- kpidinode = kpidUserDefined,
- kpidiChkSum
-};
-*/
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidPosixAttrib, VT_UI4},
- // { L"inode", kpidinode, VT_UI4}
- // { L"CheckSum", kpidiChkSum, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- // try
- {
- CInArchive archive;
-
- UInt64 endPos = 0;
- bool needSetTotal = true;
-
- if (callback != NULL)
- {
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
-
- RINOK(archive.Open(stream));
-
- _items.Clear();
-
- for (;;)
- {
- CItemEx item;
- bool filled;
- HRESULT result = archive.GetNextItem(filled, item);
- if (result == S_FALSE)
- return S_FALSE;
- if (result != S_OK)
- return S_FALSE;
- if (!filled)
- break;
- _items.Add(item);
- archive.SkipDataRecords(item.Size, item.Align);
- if (callback != NULL)
- {
- if (needSetTotal)
- {
- RINOK(callback->SetTotal(NULL, &endPos));
- needSetTotal = false;
- }
- if (_items.Size() % 100 == 0)
- {
- UInt64 numFiles = _items.Size();
- UInt64 numBytes = item.HeaderPosition;
- RINOK(callback->SetCompleted(&numFiles, &numBytes));
- }
- }
- }
- if (_items.Size() == 0)
- return S_FALSE;
-
- _stream = stream;
- }
- /*
- catch(...)
- {
- return S_FALSE;
- }
- */
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _items.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItemEx &item = _items[index];
-
- switch(propID)
- {
- case kpidPath: prop = NItemName::GetOSName(MultiByteToUnicodeString(item.Name, CP_OEMCP)); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)item.Size;
- break;
- case kpidMTime:
- {
- if (item.MTime != 0)
- {
- FILETIME utc;
- NWindows::NTime::UnixTimeToFileTime(item.MTime, utc);
- prop = utc;
- }
- break;
- }
- case kpidPosixAttrib: prop = item.Mode; break;
- /*
- case kpidinode: prop = item.inode; break;
- case kpidiChkSum: prop = item.ChkSum; break;
- */
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItemEx &item = _items[index];
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- currentTotalSize += item.Size;
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (testMode)
- {
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- RINOK(_stream->Seek(item.GetDataPosition(), STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItemEx &item = _items[index];
- return CreateLimitedInStream(_stream, item.GetDataPosition(), item.Size, stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NCpio::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Cpio", L"cpio", 0, 0xED, { 0 }, 0, false, CreateArc, 0 };
-
-REGISTER_ARC(Cpio)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/CramfsHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/CramfsHandler.cpp
deleted file mode 100644
index a55e3743d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/CramfsHandler.cpp
+++ /dev/null
@@ -1,644 +0,0 @@
-// CramfsHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/CpuArch.h"
-#include "../../../C/Alloc.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariantUtils.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-#include "../Compress/ZlibDecoder.h"
-
-namespace NArchive {
-namespace NCramfs {
-
-#define SIGNATURE { 'C','o','m','p','r','e','s','s','e','d',' ','R','O','M','F','S' }
-
-static const UInt32 kSignatureSize = 16;
-static const char kSignature[kSignatureSize] = SIGNATURE;
-
-static const UInt32 kArcSizeMax = (256 + 16) << 20;
-static const UInt32 kNumFilesMax = (1 << 19);
-static const unsigned kNumDirLevelsMax = (1 << 8);
-
-static const UInt32 kHeaderSize = 0x40;
-static const unsigned kHeaderNameSize = 16;
-static const UInt32 kNodeSize = 12;
-
-static const UInt32 kFlag_FsVer2 = (1 << 0);
-
-static const CUInt32PCharPair k_Flags[] =
-{
- { 0, "Ver2" },
- { 1, "SortedDirs" },
- { 8, "Holes" },
- { 9, "WrongSignature" },
- { 10, "ShiftedRootOffset" }
-};
-
-static const unsigned kBlockSizeLog = 12;
-static const UInt32 kBlockSize = 1 << kBlockSizeLog;
-
-/*
-struct CNode
-{
- UInt16 Mode;
- UInt16 Uid;
- UInt32 Size;
- Byte Gid;
- UInt32 NameLen;
- UInt32 Offset;
-
- void Parse(const Byte *p)
- {
- Mode = GetUi16(p);
- Uid = GetUi16(p + 2);
- Size = Get32(p + 4) & 0xFFFFFF;
- Gid = p[7];
- NameLen = p[8] & 0x3F;
- Offset = Get32(p + 8) >> 6;
- }
-};
-*/
-
-#define Get32(p) (be ? GetBe32(p) : GetUi32(p))
-
-static UInt32 GetMode(const Byte *p, bool be) { return be ? GetBe16(p) : GetUi16(p); }
-static bool IsDir(const Byte *p, bool be) { return (GetMode(p, be) & 0xF000) == 0x4000; }
-
-static UInt32 GetSize(const Byte *p, bool be)
-{
- if (be)
- return GetBe32(p + 4) >> 8;
- else
- return GetUi32(p + 4) & 0xFFFFFF;
-}
-
-static UInt32 GetNameLen(const Byte *p, bool be)
-{
- if (be)
- return (p[8] & 0xFC);
- else
- return (p[8] & 0x3F) << 2;
-}
-
-static UInt32 GetOffset(const Byte *p, bool be)
-{
- if (be)
- return (GetBe32(p + 8) & 0x03FFFFFF) << 2;
- else
- return GetUi32(p + 8) >> 6 << 2;
-}
-
-struct CItem
-{
- UInt32 Offset;
- int Parent;
-};
-
-struct CHeader
-{
- bool be;
- UInt32 Size;
- UInt32 Flags;
- // UInt32 Future;
- UInt32 Crc;
- // UInt32 Edition;
- UInt32 NumBlocks;
- UInt32 NumFiles;
- char Name[kHeaderNameSize];
-
- bool Parse(const Byte *p)
- {
- if (memcmp(p + 16, kSignature, kSignatureSize) != 0)
- return false;
- switch(GetUi32(p))
- {
- case 0x28CD3D45: be = false; break;
- case 0x453DCD28: be = true; break;
- default: return false;
- }
- Size = Get32(p + 4);
- Flags = Get32(p + 8);
- // Future = Get32(p + 0xC);
- Crc = Get32(p + 0x20);
- // Edition = Get32(p + 0x24);
- NumBlocks = Get32(p + 0x28);
- NumFiles = Get32(p + 0x2C);
- memcpy(Name, p + 0x30, kHeaderNameSize);
- return true;
- }
-
- bool IsVer2() const { return (Flags & kFlag_FsVer2) != 0; }
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CRecordVector<CItem> _items;
- CMyComPtr<IInStream> _stream;
- Byte *_data;
- UInt32 _size;
- UInt32 _headersSize;
- AString _errorMessage;
- CHeader _h;
-
- // Current file
-
- NCompress::NZlib::CDecoder *_zlibDecoderSpec;
- CMyComPtr<ICompressCoder> _zlibDecoder;
-
- CBufInStream *_inStreamSpec;
- CMyComPtr<ISequentialInStream> _inStream;
-
- CBufPtrSeqOutStream *_outStreamSpec;
- CMyComPtr<ISequentialOutStream> _outStream;
-
- UInt32 _curBlocksOffset;
- UInt32 _curNumBlocks;
-
- HRESULT OpenDir(int parent, UInt32 baseOffsetBase, unsigned level);
- HRESULT Open2(IInStream *inStream);
- AString GetPath(int index) const;
- bool GetPackSize(int index, UInt32 &res) const;
- void Free();
-public:
- CHandler(): _data(0) {}
- ~CHandler() { Free(); }
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
- HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize);
-};
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI4},
- { NULL, kpidPackSize, VT_UI4},
- { NULL, kpidPosixAttrib, VT_UI4}
- // { NULL, kpidOffset, VT_UI4}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidName, VT_BSTR},
- { NULL, kpidBigEndian, VT_BOOL},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidPhySize, VT_UI4},
- { NULL, kpidHeadersSize, VT_UI4},
- { NULL, kpidNumSubFiles, VT_UI4},
- { NULL, kpidNumBlocks, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-HRESULT CHandler::OpenDir(int parent, UInt32 baseOffset, unsigned level)
-{
- const Byte *p = _data + baseOffset;
- bool be = _h.be;
- if (!IsDir(p, be))
- return S_OK;
- UInt32 offset = GetOffset(p, be);
- UInt32 size = GetSize(p, be);
- if (offset == 0 && size == 0)
- return S_OK;
- UInt32 end = offset + size;
- if (offset < kHeaderSize || end > _size || level > kNumDirLevelsMax)
- return S_FALSE;
- if (end > _headersSize)
- _headersSize = end;
-
- int startIndex = _items.Size();
-
- while (size != 0)
- {
- if (size < kNodeSize || (UInt32)_items.Size() >= kNumFilesMax)
- return S_FALSE;
- CItem item;
- item.Parent = parent;
- item.Offset = offset;
- _items.Add(item);
- UInt32 nodeLen = kNodeSize + GetNameLen(_data + offset, be);
- if (size < nodeLen)
- return S_FALSE;
- offset += nodeLen;
- size -= nodeLen;
- }
-
- int endIndex = _items.Size();
- for (int i = startIndex; i < endIndex; i++)
- {
- RINOK(OpenDir(i, _items[i].Offset, level + 1));
- }
- return S_OK;
-}
-
-HRESULT CHandler::Open2(IInStream *inStream)
-{
- Byte buf[kHeaderSize];
- RINOK(ReadStream_FALSE(inStream, buf, kHeaderSize));
- if (!_h.Parse(buf))
- return S_FALSE;
- if (_h.IsVer2())
- {
- if (_h.Size < kHeaderSize || _h.Size > kArcSizeMax || _h.NumFiles > kNumFilesMax)
- return S_FALSE;
- }
- else
- {
- UInt64 size;
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &size));
- if (size > kArcSizeMax)
- return S_FALSE;
- _h.Size = (UInt32)size;
- RINOK(inStream->Seek(kHeaderSize, STREAM_SEEK_SET, NULL));
- }
- _data = (Byte *)MidAlloc(_h.Size);
- if (_data == 0)
- return E_OUTOFMEMORY;
- memcpy(_data, buf, kHeaderSize);
- size_t processed = _h.Size - kHeaderSize;
- RINOK(ReadStream(inStream, _data + kHeaderSize, &processed));
- if (processed < kNodeSize)
- return S_FALSE;
- _size = kHeaderSize + (UInt32)processed;
- if (_size != _h.Size)
- _errorMessage = "Unexpected end of archive";
- else
- {
- SetUi32(_data + 0x20, 0);
- if (_h.IsVer2())
- if (CrcCalc(_data, _h.Size) != _h.Crc)
- _errorMessage = "CRC error";
- }
- if (_h.IsVer2())
- _items.Reserve(_h.NumFiles - 1);
- return OpenDir(-1, kHeaderSize, 0);
-}
-
-AString CHandler::GetPath(int index) const
-{
- unsigned len = 0;
- int indexMem = index;
- do
- {
- const CItem &item = _items[index];
- index = item.Parent;
- const Byte *p = _data + item.Offset;
- unsigned size = GetNameLen(p, _h.be);
- p += kNodeSize;
- unsigned i;
- for (i = 0; i < size && p[i]; i++);
- len += i + 1;
- }
- while (index >= 0);
- len--;
-
- AString path;
- char *dest = path.GetBuffer(len) + len;
- index = indexMem;
- for (;;)
- {
- const CItem &item = _items[index];
- index = item.Parent;
- const Byte *p = _data + item.Offset;
- unsigned size = GetNameLen(p, _h.be);
- p += kNodeSize;
- unsigned i;
- for (i = 0; i < size && p[i]; i++);
- dest -= i;
- memcpy(dest, p, i);
- if (index < 0)
- break;
- *(--dest) = CHAR_PATH_SEPARATOR;
- }
- path.ReleaseBuffer(len);
- return path;
-}
-
-bool CHandler::GetPackSize(int index, UInt32 &res) const
-{
- const CItem &item = _items[index];
- const Byte *p = _data + item.Offset;
- bool be = _h.be;
- UInt32 offset = GetOffset(p, be);
- if (offset < kHeaderSize)
- return false;
- UInt32 numBlocks = (GetSize(p, be) + kBlockSize - 1) >> kBlockSizeLog;
- UInt32 start = offset + numBlocks * 4;
- if (start > _size)
- return false;
- UInt32 end = Get32(_data + start - 4);
- if (end < start)
- return false;
- res = end - start;
- return true;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback * /* callback */)
-{
- COM_TRY_BEGIN
- {
- Close();
- RINOK(Open2(stream));
- _stream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-void CHandler::Free()
-{
- MidFree(_data);
- _data = 0;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _headersSize = 0;
- _items.Clear();
- _stream.Release();
- _errorMessage.Empty();
- Free();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidName:
- {
- char dest[kHeaderNameSize + 4];
- memcpy(dest, _h.Name, kHeaderNameSize);
- dest[kHeaderNameSize] = 0;
- prop = dest;
- break;
- }
- case kpidBigEndian: prop = _h.be; break;
- case kpidCharacts: FLAGS_TO_PROP(k_Flags, _h.Flags, prop); break;
- case kpidNumBlocks: if (_h.IsVer2()) prop = _h.NumBlocks; break;
- case kpidNumSubFiles: if (_h.IsVer2()) prop = _h.NumFiles; break;
- case kpidPhySize: if (_h.IsVer2()) prop = _h.Size; break;
- case kpidHeadersSize: prop = _headersSize; break;
- case kpidError: if (!_errorMessage.IsEmpty()) prop = _errorMessage; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _items[index];
- const Byte *p = _data + item.Offset;
- bool be = _h.be;
- bool isDir = IsDir(p, be);
- switch(propID)
- {
- case kpidPath: prop = MultiByteToUnicodeString(GetPath(index), CP_OEMCP); break;
- case kpidIsDir: prop = isDir; break;
- // case kpidOffset: prop = (UInt32)GetOffset(p, be); break;
- case kpidSize: if (!isDir) prop = GetSize(p, be); break;
- case kpidPackSize:
- if (!isDir)
- {
- UInt32 size;
- if (GetPackSize(index, size))
- prop = size;
- }
- break;
- case kpidPosixAttrib: prop = (UInt32)GetMode(p, be); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CCramfsInStream: public CCachedInStream
-{
- HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize);
-public:
- CHandler *Handler;
-};
-
-HRESULT CCramfsInStream::ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize)
-{
- return Handler->ReadBlock(blockIndex, dest, blockSize);
-}
-
-HRESULT CHandler::ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize)
-{
- if (!_zlibDecoder)
- {
- _zlibDecoderSpec = new NCompress::NZlib::CDecoder();
- _zlibDecoder = _zlibDecoderSpec;
- }
- if (!_inStream)
- {
- _inStreamSpec = new CBufInStream();
- _inStream = _inStreamSpec;
- }
- if (!_outStream)
- {
- _outStreamSpec = new CBufPtrSeqOutStream();
- _outStream = _outStreamSpec;
- }
- bool be = _h.be;
- const Byte *p = _data + (_curBlocksOffset + (UInt32)blockIndex * 4);
- UInt32 start = (blockIndex == 0 ? _curBlocksOffset + _curNumBlocks * 4: Get32(p - 4));
- UInt32 end = Get32(p);
- if (end < start || end > _size)
- return S_FALSE;
- UInt32 inSize = end - start;
- _inStreamSpec->Init(_data + start, inSize);
- _outStreamSpec->Init(dest, blockSize);
- RINOK(_zlibDecoder->Code(_inStream, _outStream, NULL, NULL, NULL));
- return (_zlibDecoderSpec->GetInputProcessedSize() == inSize &&
- _outStreamSpec->GetPos() == blockSize) ? S_OK : S_FALSE;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- bool be = _h.be;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const Byte *p = _data + _items[allFilesMode ? i : indices[i]].Offset;
- if (!IsDir(p, be))
- totalSize += GetSize(p, be);
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- const Byte *p = _data + item.Offset;
-
- if (IsDir(p, be))
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- UInt32 curSize = GetSize(p, be);
- totalSize += curSize;
- UInt32 packSize;
- if (GetPackSize(index, packSize))
- totalPackSize += packSize;
-
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- UInt32 offset = GetOffset(p, be);
- if (offset < kHeaderSize)
- curSize = 0;
-
- int res = NExtract::NOperationResult::kDataError;
- {
- CMyComPtr<ISequentialInStream> inSeqStream;
- CMyComPtr<IInStream> inStream;
- HRESULT hres = GetStream(index, &inSeqStream);
- if (inSeqStream)
- inSeqStream.QueryInterface(IID_IInStream, &inStream);
- if (hres == E_OUTOFMEMORY)
- return E_OUTOFMEMORY;
- if (hres == S_FALSE || !inStream)
- res = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- RINOK(hres);
- if (inStream)
- {
- HRESULT hres = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (hres != S_OK && hres != S_FALSE)
- {
- RINOK(hres);
- }
- if (copyCoderSpec->TotalSize == curSize && hres == S_OK)
- res = NExtract::NOperationResult::kOK;
- }
- }
- }
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
-
- const CItem &item = _items[index];
- const Byte *p = _data + item.Offset;
-
- bool be = _h.be;
- if (IsDir(p, be))
- return E_FAIL;
-
- UInt32 size = GetSize(p, be);
- UInt32 numBlocks = (size + kBlockSize - 1) >> kBlockSizeLog;
- UInt32 offset = GetOffset(p, be);
- if (offset < kHeaderSize)
- {
- if (offset != 0)
- return S_FALSE;
- CBufInStream *streamSpec = new CBufInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- streamSpec->Init(NULL, 0);
- *stream = streamTemp.Detach();
- return S_OK;
- }
-
- if (offset + numBlocks * 4 > _size)
- return S_FALSE;
- UInt32 prev = offset;
- for (UInt32 i = 0; i < numBlocks; i++)
- {
- UInt32 next = Get32(_data + offset + i * 4);
- if (next < prev || next > _size)
- return S_FALSE;
- prev = next;
- }
-
- CCramfsInStream *streamSpec = new CCramfsInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- _curNumBlocks = numBlocks;
- _curBlocksOffset = offset;
- streamSpec->Handler = this;
- if (!streamSpec->Alloc(kBlockSizeLog, 21 - kBlockSizeLog))
- return E_OUTOFMEMORY;
- streamSpec->Init(size);
- *stream = streamTemp.Detach();
-
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NCramfs::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"CramFS", L"cramfs", 0, 0xD3, SIGNATURE, kSignatureSize, false, CreateArc, 0 };
-
-REGISTER_ARC(Cramfs)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/DebHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/DebHandler.cpp
deleted file mode 100644
index 82d2cde88..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/DebHandler.cpp
+++ /dev/null
@@ -1,413 +0,0 @@
-// DebHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-#include "Common/StringToInt.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#include "Common/ItemNameUtils.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-namespace NArchive {
-namespace NDeb {
-
-namespace NHeader
-{
- const int kSignatureLen = 8;
-
- const char *kSignature = "!<arch>\n";
-
- const int kNameSize = 16;
- const int kTimeSize = 12;
- const int kModeSize = 8;
- const int kSizeSize = 10;
-
- /*
- struct CHeader
- {
- char Name[kNameSize];
- char MTime[kTimeSize];
- char Number0[6];
- char Number1[6];
- char Mode[kModeSize];
- char Size[kSizeSize];
- char Quote;
- char NewLine;
- };
- */
- const int kHeaderSize = kNameSize + kTimeSize + 6 + 6 + kModeSize + kSizeSize + 1 + 1;
-}
-
-struct CItem
-{
- AString Name;
- UInt64 Size;
- UInt32 MTime;
- UInt32 Mode;
-
- UInt64 HeaderPos;
- UInt64 GetDataPos() const { return HeaderPos + NHeader::kHeaderSize; };
- // UInt64 GetFullSize() const { return NFileHeader::kRecordSize + Size; };
-};
-
-class CInArchive
-{
- CMyComPtr<IInStream> m_Stream;
-
- HRESULT GetNextItemReal(bool &filled, CItem &itemInfo);
-public:
- UInt64 m_Position;
- HRESULT Open(IInStream *inStream);
- HRESULT GetNextItem(bool &filled, CItem &itemInfo);
- HRESULT SkipData(UInt64 dataSize);
-};
-
-HRESULT CInArchive::Open(IInStream *inStream)
-{
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Position));
- char signature[NHeader::kSignatureLen];
- RINOK(ReadStream_FALSE(inStream, signature, NHeader::kSignatureLen));
- m_Position += NHeader::kSignatureLen;
- if (memcmp(signature, NHeader::kSignature, NHeader::kSignatureLen) != 0)
- return S_FALSE;
- m_Stream = inStream;
- return S_OK;
-}
-
-static void MyStrNCpy(char *dest, const char *src, int size)
-{
- for (int i = 0; i < size; i++)
- {
- char c = src[i];
- dest[i] = c;
- if (c == 0)
- break;
- }
-}
-
-static bool OctalToNumber(const char *s, int size, UInt64 &res)
-{
- char sz[32];
- MyStrNCpy(sz, s, size);
- sz[size] = 0;
- const char *end;
- int i;
- for (i = 0; sz[i] == ' '; i++);
- res = ConvertOctStringToUInt64(sz + i, &end);
- return (*end == ' ' || *end == 0);
-}
-
-static bool OctalToNumber32(const char *s, int size, UInt32 &res)
-{
- UInt64 res64;
- if (!OctalToNumber(s, size, res64))
- return false;
- res = (UInt32)res64;
- return (res64 <= 0xFFFFFFFF);
-}
-
-static bool DecimalToNumber(const char *s, int size, UInt64 &res)
-{
- char sz[32];
- MyStrNCpy(sz, s, size);
- sz[size] = 0;
- const char *end;
- int i;
- for (i = 0; sz[i] == ' '; i++);
- res = ConvertStringToUInt64(sz + i, &end);
- return (*end == ' ' || *end == 0);
-}
-
-static bool DecimalToNumber32(const char *s, int size, UInt32 &res)
-{
- UInt64 res64;
- if (!DecimalToNumber(s, size, res64))
- return false;
- res = (UInt32)res64;
- return (res64 <= 0xFFFFFFFF);
-}
-
-#define RIF(x) { if (!(x)) return S_FALSE; }
-
-
-HRESULT CInArchive::GetNextItemReal(bool &filled, CItem &item)
-{
- filled = false;
-
- char header[NHeader::kHeaderSize];
- const char *cur = header;
-
- size_t processedSize = sizeof(header);
- item.HeaderPos = m_Position;
- RINOK(ReadStream(m_Stream, header, &processedSize));
- if (processedSize != sizeof(header))
- return S_OK;
- m_Position += processedSize;
-
- char tempString[NHeader::kNameSize + 1];
- MyStrNCpy(tempString, cur, NHeader::kNameSize);
- cur += NHeader::kNameSize;
- tempString[NHeader::kNameSize] = '\0';
- item.Name = tempString;
- item.Name.Trim();
-
- for (int i = 0; i < item.Name.Length(); i++)
- if (((Byte)item.Name[i]) < 0x20)
- return S_FALSE;
-
- RIF(DecimalToNumber32(cur, NHeader::kTimeSize, item.MTime));
- cur += NHeader::kTimeSize;
-
- cur += 6 + 6;
-
- RIF(OctalToNumber32(cur, NHeader::kModeSize, item.Mode));
- cur += NHeader::kModeSize;
-
- RIF(DecimalToNumber(cur, NHeader::kSizeSize, item.Size));
- cur += NHeader::kSizeSize;
-
- filled = true;
- return S_OK;
-}
-
-HRESULT CInArchive::GetNextItem(bool &filled, CItem &item)
-{
- for (;;)
- {
- RINOK(GetNextItemReal(filled, item));
- if (!filled)
- return S_OK;
- if (item.Name.Compare("debian-binary") != 0)
- return S_OK;
- if (item.Size != 4)
- return S_OK;
- SkipData(item.Size);
- }
-}
-
-HRESULT CInArchive::SkipData(UInt64 dataSize)
-{
- return m_Stream->Seek((dataSize + 1) & (~((UInt64)0x1)), STREAM_SEEK_CUR, &m_Position);
-}
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CObjectVector<CItem> _items;
- CMyComPtr<IInStream> _stream;
- Int32 _mainSubfile;
- UInt64 _phySize;
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidPhySize, VT_UI8}
-};
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback *openArchiveCallback)
-{
- COM_TRY_BEGIN
- {
- _mainSubfile = -1;
- CInArchive archive;
- if (archive.Open(stream) != S_OK)
- return S_FALSE;
- _items.Clear();
-
- if (openArchiveCallback != NULL)
- {
- RINOK(openArchiveCallback->SetTotal(NULL, NULL));
- UInt64 numFiles = _items.Size();
- RINOK(openArchiveCallback->SetCompleted(&numFiles, NULL));
- }
-
- for (;;)
- {
- CItem item;
- bool filled;
- HRESULT result = archive.GetNextItem(filled, item);
- if (result == S_FALSE)
- return S_FALSE;
- if (result != S_OK)
- return S_FALSE;
- if (!filled)
- break;
- if (item.Name.Left(5) == "data.")
- _mainSubfile = _items.Size();
- _items.Add(item);
- archive.SkipData(item.Size);
- if (openArchiveCallback != NULL)
- {
- UInt64 numFiles = _items.Size();
- RINOK(openArchiveCallback->SetCompleted(&numFiles, NULL));
- }
- }
- _stream = stream;
- _phySize = archive.m_Position;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _items.Clear();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: prop = _phySize; break;
- case kpidMainSubfile: if (_mainSubfile >= 0) prop = (UInt32)_mainSubfile; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _items[index];
-
- switch(propID)
- {
- case kpidPath: prop = (const wchar_t *)NItemName::GetOSName2(MultiByteToUnicodeString(item.Name, CP_OEMCP)); break;
- case kpidSize:
- case kpidPackSize:
- prop = item.Size;
- break;
- case kpidMTime:
- {
- if (item.MTime != 0)
- {
- FILETIME fileTime;
- NTime::UnixTimeToFileTime(item.MTime, fileTime);
- prop = fileTime;
- }
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- currentTotalSize += item.Size;
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (testMode)
- {
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- RINOK(_stream->Seek(item.GetDataPos(), STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
- RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItem &item = _items[index];
- return CreateLimitedInStream(_stream, item.GetDataPos(), item.Size, stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NDeb::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Deb", L"deb", 0, 0xEC, { '!', '<', 'a', 'r', 'c', 'h', '>', '\n' }, 8, false, CreateArc, 0 };
-
-REGISTER_ARC(Deb)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/DeflateProps.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/DeflateProps.cpp
deleted file mode 100644
index 8498e0565..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/DeflateProps.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-// DeflateProps.cpp
-
-#include "StdAfx.h"
-
-#include "Windows/PropVariant.h"
-
-#include "Common/ParseProperties.h"
-
-#include "DeflateProps.h"
-
-namespace NArchive {
-
-static const UInt32 kAlgo1 = 0;
-static const UInt32 kAlgo5 = 1;
-
-static const UInt32 kPasses1 = 1;
-static const UInt32 kPasses7 = 3;
-static const UInt32 kPasses9 = 10;
-
-static const UInt32 kFb1 = 32;
-static const UInt32 kFb7 = 64;
-static const UInt32 kFb9 = 128;
-
-void CDeflateProps::Normalize()
-{
- UInt32 level = Level;
- if (level == 0xFFFFFFFF)
- level = 5;
-
- if (Algo == 0xFFFFFFFF)
- Algo = (level >= 5 ?
- kAlgo5 :
- kAlgo1);
-
- if (NumPasses == 0xFFFFFFFF)
- NumPasses =
- (level >= 9 ? kPasses9 :
- (level >= 7 ? kPasses7 :
- kPasses1));
- if (Fb == 0xFFFFFFFF)
- Fb =
- (level >= 9 ? kFb9 :
- (level >= 7 ? kFb7 :
- kFb1));
-}
-
-HRESULT CDeflateProps::SetCoderProperties(ICompressSetCoderProperties *setCoderProperties)
-{
- Normalize();
-
- NWindows::NCOM::CPropVariant props[] =
- {
- Algo,
- NumPasses,
- Fb,
- Mc
- };
- PROPID propIDs[] =
- {
- NCoderPropID::kAlgorithm,
- NCoderPropID::kNumPasses,
- NCoderPropID::kNumFastBytes,
- NCoderPropID::kMatchFinderCycles
- };
- int numProps = sizeof(propIDs) / sizeof(propIDs[0]);
- if (!McDefined)
- numProps--;
- return setCoderProperties->SetCoderProperties(propIDs, props, numProps);
-}
-
-HRESULT CDeflateProps::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps)
-{
- Init();
- for (int i = 0; i < numProps; i++)
- {
- UString name = names[i];
- name.MakeUpper();
- if (name.IsEmpty())
- return E_INVALIDARG;
- const PROPVARIANT &prop = values[i];
- if (name[0] == L'X')
- {
- UInt32 a = 9;
- RINOK(ParsePropValue(name.Mid(1), prop, a));
- Level = a;
- }
- else if (name.Left(1) == L"A")
- {
- UInt32 a = kAlgo5;
- RINOK(ParsePropValue(name.Mid(1), prop, a));
- Algo = a;
- }
- else if (name.Left(4) == L"PASS")
- {
- UInt32 a = kPasses9;
- RINOK(ParsePropValue(name.Mid(4), prop, a));
- NumPasses = a;
- }
- else if (name.Left(2) == L"FB")
- {
- UInt32 a = kFb9;
- RINOK(ParsePropValue(name.Mid(2), prop, a));
- Fb = a;
- }
- else if (name.Left(2) == L"MC")
- {
- UInt32 a = 0xFFFFFFFF;
- RINOK(ParsePropValue(name.Mid(2), prop, a));
- Mc = a;
- McDefined = true;
- }
- else
- return E_INVALIDARG;
- }
- return S_OK;
-}
-
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/DeflateProps.h b/src/libs/7zip/unix/CPP/7zip/Archive/DeflateProps.h
deleted file mode 100644
index e05a9d4aa..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/DeflateProps.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// DeflateProps.h
-
-#ifndef __DEFLATE_PROPS_H
-#define __DEFLATE_PROPS_H
-
-#include "../ICoder.h"
-
-namespace NArchive {
-
-class CDeflateProps
-{
- UInt32 Level;
- UInt32 NumPasses;
- UInt32 Fb;
- UInt32 Algo;
- UInt32 Mc;
- bool McDefined;
-
- void Init()
- {
- Level = NumPasses = Fb = Algo = Mc = 0xFFFFFFFF;
- McDefined = false;
- }
- void Normalize();
-public:
- CDeflateProps() { Init(); }
- bool IsMaximum() const { return Algo > 0; }
-
- HRESULT SetCoderProperties(ICompressSetCoderProperties *setCoderProperties);
- HRESULT SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps);
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/DmgHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/DmgHandler.cpp
deleted file mode 100644
index 5040d5182..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/DmgHandler.cpp
+++ /dev/null
@@ -1,918 +0,0 @@
-// DmgHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyXml.h"
-#include "Common/UTFConvert.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/BZip2Decoder.h"
-#include "../Compress/CopyCoder.h"
-#include "../Compress/ZlibDecoder.h"
-
-// #define DMG_SHOW_RAW
-
-// #include <stdio.h>
-#define PRF(x) // x
-
-#define Get32(p) GetBe32(p)
-#define Get64(p) GetBe64(p)
-
-static int Base64ToByte(char c)
-{
- if (c >= 'A' && c <= 'Z') return c - 'A';
- if (c >= 'a' && c <= 'z') return c - 'a' + 26;
- if (c >= '0' && c <= '9') return c - '0' + 52;
- if (c == '+') return 62;
- if (c == '/') return 63;
- if (c == '=') return 0;
- return -1;
-}
-
-static int Base64ToBin(Byte *dest, const char *src, int srcLen)
-{
- int srcPos = 0;
- int destPos = 0;
- while (srcPos < srcLen)
- {
- Byte buf[4];
- int filled = 0;
- while (srcPos < srcLen)
- {
- int n = Base64ToByte(src[srcPos++]);
- if (n >= 0)
- {
- buf[filled++] = (Byte)n;
- if (filled == 4)
- break;
- }
- }
- if (filled >= 2) { if (dest) dest[destPos] = (buf[0] << 2) | (buf[1] >> 4); destPos++; }
- if (filled >= 3) { if (dest) dest[destPos] = (buf[1] << 4) | (buf[2] >> 2); destPos++; }
- if (filled >= 4) { if (dest) dest[destPos] = (buf[2] << 6) | (buf[3] ); destPos++; }
- }
- return destPos;
-}
-
-static UString GetSizeString(UInt64 value)
-{
- wchar_t s[32];
- wchar_t c;
- if (value < (UInt64)20000) c = 0;
- else if (value < ((UInt64)20000 << 10)) { value >>= 10; c = L'K'; }
- else if (value < ((UInt64)20000 << 20)) { value >>= 20; c = L'M'; }
- else { value >>= 30; c = L'G'; }
- ConvertUInt64ToString(value, s);
- int p = MyStringLen(s);
- s[p++] = c;
- s[p++] = L'\0';
- return s;
-}
-
-namespace NArchive {
-namespace NDmg {
-
-struct CBlock
-{
- UInt32 Type;
- UInt64 UnpPos;
- UInt64 UnpSize;
- UInt64 PackPos;
- UInt64 PackSize;
-
- UInt64 GetNextPackOffset() const { return PackPos + PackSize; }
-};
-
-struct CFile
-{
- CByteBuffer Raw;
- UInt64 StartPos;
- CRecordVector<CBlock> Blocks;
- UInt64 GetUnpackSize() const
- {
- UInt64 size = 0;
- for (int i = 0; i < Blocks.Size(); i++)
- size += Blocks[i].UnpSize;
- return size;
- };
- UInt64 GetPackSize() const
- {
- UInt64 size = 0;
- for (int i = 0; i < Blocks.Size(); i++)
- size += Blocks[i].PackSize;
- return size;
- };
-
- AString Name;
-};
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _inStream;
-
- AString _xml;
- CObjectVector<CFile> _files;
- CRecordVector<int> _fileIndices;
-
- HRESULT Open2(IInStream *stream);
- HRESULT Extract(IInStream *stream);
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-const UInt32 kXmlSizeMax = ((UInt32)1 << 31) - (1 << 14);
-
-enum
-{
- METHOD_ZERO_0 = 0,
- METHOD_COPY = 1,
- METHOD_ZERO_2 = 2,
- METHOD_ADC = 0x80000004,
- METHOD_ZLIB = 0x80000005,
- METHOD_BZIP2 = 0x80000006,
- METHOD_DUMMY = 0x7FFFFFFE,
- METHOD_END = 0xFFFFFFFF
-};
-
-struct CMethodStat
-{
- UInt32 NumBlocks;
- UInt64 PackSize;
- UInt64 UnpSize;
- CMethodStat(): NumBlocks(0), PackSize(0), UnpSize(0) {}
-};
-
-struct CMethods
-{
- CRecordVector<CMethodStat> Stats;
- CRecordVector<UInt32> Types;
- void Update(const CFile &file);
- UString GetString() const;
-};
-
-void CMethods::Update(const CFile &file)
-{
- for (int i = 0; i < file.Blocks.Size(); i++)
- {
- const CBlock &b = file.Blocks[i];
- int index = Types.FindInSorted(b.Type);
- if (index < 0)
- {
- index = Types.AddToUniqueSorted(b.Type);
- Stats.Insert(index, CMethodStat());
- }
- CMethodStat &m = Stats[index];
- m.PackSize += b.PackSize;
- m.UnpSize += b.UnpSize;
- m.NumBlocks++;
- }
-}
-
-UString CMethods::GetString() const
-{
- UString res;
- for (int i = 0; i < Types.Size(); i++)
- {
- if (i != 0)
- res += L' ';
- wchar_t buf[32];
- const wchar_t *s;
- const CMethodStat &m = Stats[i];
- bool showPack = true;
- UInt32 type = Types[i];
- switch(type)
- {
- case METHOD_ZERO_0: s = L"zero0"; showPack = (m.PackSize != 0); break;
- case METHOD_ZERO_2: s = L"zero2"; showPack = (m.PackSize != 0); break;
- case METHOD_COPY: s = L"copy"; showPack = (m.UnpSize != m.PackSize); break;
- case METHOD_ADC: s = L"adc"; break;
- case METHOD_ZLIB: s = L"zlib"; break;
- case METHOD_BZIP2: s = L"bzip2"; break;
- default: ConvertUInt64ToString(type, buf); s = buf;
- }
- res += s;
- if (m.NumBlocks != 1)
- {
- res += L'[';
- ConvertUInt64ToString(m.NumBlocks, buf);
- res += buf;
- res += L']';
- }
- res += L'-';
- res += GetSizeString(m.UnpSize);
- if (showPack)
- {
- res += L'-';
- res += GetSizeString(m.PackSize);
- }
- }
- return res;
-}
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidMethod, VT_BSTR}
-};
-
-IMP_IInArchive_Props
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidNumBlocks, VT_UI4}
-};
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMethod:
- {
- CMethods m;
- for (int i = 0; i < _files.Size(); i++)
- m.Update(_files[i]);
- prop = m.GetString();
- break;
- }
- case kpidNumBlocks:
- {
- UInt64 numBlocks = 0;
- for (int i = 0; i < _files.Size(); i++)
- numBlocks += _files[i].Blocks.Size();
- prop = numBlocks;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-IMP_IInArchive_ArcProps
-
-static int FindKeyPair(const CXmlItem &item, const AString &key, const AString &nextTag)
-{
- for (int i = 0; i + 1 < item.SubItems.Size(); i++)
- {
- const CXmlItem &si = item.SubItems[i];
- if (si.IsTagged("key") && si.GetSubString() == key && item.SubItems[i + 1].IsTagged(nextTag))
- return i + 1;
- }
- return -1;
-}
-
-static AString GetStringFromKeyPair(const CXmlItem &item, const AString &key, const AString &nextTag)
-{
- int index = FindKeyPair(item, key, nextTag);
- if (index >= 0)
- return item.SubItems[index].GetSubString();
- return AString();
-}
-
-HRESULT CHandler::Open2(IInStream *stream)
-{
- const int HEADER_SIZE = 0x1E0;
-
- UInt64 headerPos;
- RINOK(stream->Seek(-HEADER_SIZE, STREAM_SEEK_END, &headerPos));
- Byte buf[HEADER_SIZE];
- RINOK(ReadStream_FALSE(stream, buf, HEADER_SIZE));
- UInt64 address1 = Get64(buf + 0);
- UInt64 address2 = Get64(buf + 0xB8);
- UInt64 size64 = Get64(buf + 0xC0);
- if (address1 != address2 || size64 >= kXmlSizeMax || size64 == 0 ||
- address1 >= headerPos || address1 + size64 > headerPos)
- return S_FALSE;
- RINOK(stream->Seek(address1, STREAM_SEEK_SET, NULL));
- size_t size = (size_t)size64;
-
- char *ss = _xml.GetBuffer((int)size + 1);
- RINOK(ReadStream_FALSE(stream, ss, size));
- ss[size] = 0;
- _xml.ReleaseBuffer();
-
- CXml xml;
- if (!xml.Parse(_xml))
- return S_FALSE;
- if (xml.Root.Name != "plist")
- return S_FALSE;
-
- int dictIndex = xml.Root.FindSubTag("dict");
- if (dictIndex < 0)
- return S_FALSE;
-
- const CXmlItem &dictItem = xml.Root.SubItems[dictIndex];
- int rfDictIndex = FindKeyPair(dictItem, "resource-fork", "dict");
- if (rfDictIndex < 0)
- return S_FALSE;
-
- const CXmlItem &rfDictItem = dictItem.SubItems[rfDictIndex];
- int arrIndex = FindKeyPair(rfDictItem, "blkx", "array");
- if (arrIndex < 0)
- return S_FALSE;
-
- const CXmlItem &arrItem = rfDictItem.SubItems[arrIndex];
-
- int i;
- for (i = 0; i < arrItem.SubItems.Size(); i++)
- {
- const CXmlItem &item = arrItem.SubItems[i];
- if (!item.IsTagged("dict"))
- continue;
-
- CFile file;
- file.StartPos = 0;
-
- int destLen;
- {
- AString dataString;
- AString name = GetStringFromKeyPair(item, "Name", "string");
- if (name.IsEmpty())
- name = GetStringFromKeyPair(item, "CFName", "string");
- file.Name = name;
- dataString = GetStringFromKeyPair(item, "Data", "data");
-
- destLen = Base64ToBin(NULL, dataString, dataString.Length());
- file.Raw.SetCapacity(destLen);
- Base64ToBin(file.Raw, dataString, dataString.Length());
- }
-
- if (destLen > 0xCC && Get32(file.Raw) == 0x6D697368)
- {
- PRF(printf("\n\n index = %d", _files.Size()));
- const int kRecordSize = 40;
- for (int offset = 0xCC; offset + kRecordSize <= destLen; offset += kRecordSize)
- {
- const Byte *p = (const Byte *)file.Raw + offset;
- CBlock b;
- b.Type = Get32(p);
- if (b.Type == METHOD_END)
- break;
- if (b.Type == METHOD_DUMMY)
- continue;
-
- b.UnpPos = Get64(p + 0x08) << 9;
- b.UnpSize = Get64(p + 0x10) << 9;
- b.PackPos = Get64(p + 0x18);
- b.PackSize = Get64(p + 0x20);
-
- file.Blocks.Add(b);
-
- PRF(printf("\nType=%8x m[1]=%8x uPos=%8x uSize=%7x pPos=%8x pSize=%7x",
- b.Type, Get32(p + 4), (UInt32)b.UnpPos, (UInt32)b.UnpSize, (UInt32)b.PackPos, (UInt32)b.PackSize));
- }
- }
- int itemIndex = _files.Add(file);
- if (file.Blocks.Size() > 0)
- {
- // if (file.Name.Find("HFS") >= 0)
- _fileIndices.Add(itemIndex);
- }
- }
-
- // PackPos for each new file is 0 in some DMG files. So we use additional StartPos
-
- bool allStartAreZeros = true;
- for (i = 0; i < _files.Size(); i++)
- {
- const CFile &file = _files[i];
- if (!file.Blocks.IsEmpty() && file.Blocks[0].PackPos != 0)
- allStartAreZeros = false;
- }
- UInt64 startPos = 0;
- if (allStartAreZeros)
- {
- for (i = 0; i < _files.Size(); i++)
- {
- CFile &file = _files[i];
- file.StartPos = startPos;
- if (!file.Blocks.IsEmpty())
- startPos += file.Blocks.Back().GetNextPackOffset();
- }
- }
-
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- {
- Close();
- if (Open2(stream) != S_OK)
- return S_FALSE;
- _inStream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _inStream.Release();
- _fileIndices.Clear();
- _files.Clear();
- _xml.Empty();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _fileIndices.Size()
- #ifdef DMG_SHOW_RAW
- + _files.Size() + 1;
- #endif
- ;
- return S_OK;
-}
-
-#define RAW_PREFIX L"raw" WSTRING_PATH_SEPARATOR
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- #ifdef DMG_SHOW_RAW
- if ((int)index == _fileIndices.Size())
- {
- switch(propID)
- {
- case kpidPath:
- prop = RAW_PREFIX L"a.xml";
- break;
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)_xml.Length();
- break;
- }
- }
- else if ((int)index > _fileIndices.Size())
- {
- int rawIndex = (int)index - (_fileIndices.Size() + 1);
- switch(propID)
- {
- case kpidPath:
- {
- wchar_t s[32] = RAW_PREFIX;
- ConvertUInt64ToString(rawIndex, s + MyStringLen(s));
- prop = s;
- break;
- }
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)_files[rawIndex].Raw.GetCapacity();
- break;
- }
- }
- else
- #endif
- {
- int itemIndex = _fileIndices[index];
- const CFile &item = _files[itemIndex];
- switch(propID)
- {
- case kpidMethod:
- {
- CMethods m;
- m.Update(item);
- UString resString = m.GetString();
- if (!resString.IsEmpty())
- prop = resString;
- break;
- }
-
- // case kpidExtension: prop = L"hfs"; break;
-
- case kpidPath:
- {
- // break;
- UString name;
- wchar_t s[32];
- ConvertUInt64ToString(index, s);
- name = s;
- int num = 10;
- int numDigits;
- for (numDigits = 1; num < _fileIndices.Size(); numDigits++)
- num *= 10;
- while (name.Length() < numDigits)
- name = L'0' + name;
-
- AString subName;
- int pos1 = item.Name.Find('(');
- if (pos1 >= 0)
- {
- pos1++;
- int pos2 = item.Name.Find(')', pos1);
- if (pos2 >= 0)
- {
- subName = item.Name.Mid(pos1, pos2 - pos1);
- pos1 = subName.Find(':');
- if (pos1 >= 0)
- subName = subName.Left(pos1);
- }
- }
- subName.Trim();
- if (!subName.IsEmpty())
- {
- if (subName == "Apple_HFS")
- subName = "hfs";
- else if (subName == "Apple_HFSX")
- subName = "hfsx";
- else if (subName == "Apple_Free")
- subName = "free";
- else if (subName == "DDM")
- subName = "ddm";
- UString name2;
- ConvertUTF8ToUnicode(subName, name2);
- name += L'.';
- name += name2;
- }
- else
- {
- UString name2;
- ConvertUTF8ToUnicode(item.Name, name2);
- if (!name2.IsEmpty())
- name += L" - ";
- name += name2;
- }
- prop = name;
- break;
- }
- case kpidComment:
- {
- UString name;
- ConvertUTF8ToUnicode(item.Name, name);
- prop = name;
- break;
- }
-
- case kpidSize: prop = item.GetUnpackSize(); break;
- case kpidPackSize: prop = item.GetPackSize(); break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CAdcDecoder:
- public ICompressCoder,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- CInBuffer m_InStream;
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InStream.ReleaseStream();
- }
-
- class CCoderReleaser
- {
- CAdcDecoder *m_Coder;
- public:
- bool NeedFlush;
- CCoderReleaser(CAdcDecoder *coder): m_Coder(coder), NeedFlush(true) {}
- ~CCoderReleaser()
- {
- if (NeedFlush)
- m_Coder->m_OutWindowStream.Flush();
- m_Coder->ReleaseStreams();
- }
- };
- friend class CCoderReleaser;
-
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(CodeReal)(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress);
-};
-
-STDMETHODIMP CAdcDecoder::CodeReal(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress)
-{
- if (!m_OutWindowStream.Create(1 << 18))
- return E_OUTOFMEMORY;
- if (!m_InStream.Create(1 << 18))
- return E_OUTOFMEMORY;
-
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(false);
- m_InStream.SetStream(inStream);
- m_InStream.Init();
-
- CCoderReleaser coderReleaser(this);
-
- const UInt32 kStep = (1 << 20);
- UInt64 nextLimit = kStep;
-
- UInt64 pos = 0;
- while (pos < *outSize)
- {
- if (pos > nextLimit && progress)
- {
- UInt64 packSize = m_InStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &pos));
- nextLimit += kStep;
- }
- Byte b;
- if (!m_InStream.ReadByte(b))
- return S_FALSE;
- UInt64 rem = *outSize - pos;
- if (b & 0x80)
- {
- unsigned num = (b & 0x7F) + 1;
- if (num > rem)
- return S_FALSE;
- for (unsigned i = 0; i < num; i++)
- {
- if (!m_InStream.ReadByte(b))
- return S_FALSE;
- m_OutWindowStream.PutByte(b);
- }
- pos += num;
- continue;
- }
- Byte b1;
- if (!m_InStream.ReadByte(b1))
- return S_FALSE;
-
- UInt32 len, distance;
-
- if (b & 0x40)
- {
- len = ((UInt32)b & 0x3F) + 4;
- Byte b2;
- if (!m_InStream.ReadByte(b2))
- return S_FALSE;
- distance = ((UInt32)b1 << 8) + b2;
- }
- else
- {
- b &= 0x3F;
- len = ((UInt32)b >> 2) + 3;
- distance = (((UInt32)b & 3) << 8) + b1;
- }
-
- if (distance >= pos || len > rem)
- return S_FALSE;
- m_OutWindowStream.CopyBlock(distance, len);
- pos += len;
- }
- if (*inSize != m_InStream.GetProcessedSize())
- return S_FALSE;
- coderReleaser.NeedFlush = false;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CAdcDecoder::Code(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress);}
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _files.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- int index = (int)(allFilesMode ? i : indices[i]);
- #ifdef DMG_SHOW_RAW
- if (index == _fileIndices.Size())
- totalSize += _xml.Length();
- else if (index > _fileIndices.Size())
- totalSize += _files[index - (_fileIndices.Size() + 1)].Raw.GetCapacity();
- else
- #endif
- totalSize += _files[_fileIndices[index]].GetUnpackSize();
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentPackTotal = 0;
- UInt64 currentUnpTotal = 0;
- UInt64 currentPackSize = 0;
- UInt64 currentUnpSize = 0;
-
- const UInt32 kZeroBufSize = (1 << 14);
- CByteBuffer zeroBuf;
- zeroBuf.SetCapacity(kZeroBufSize);
- memset(zeroBuf, 0, kZeroBufSize);
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- NCompress::NBZip2::CDecoder *bzip2CoderSpec = new NCompress::NBZip2::CDecoder();
- CMyComPtr<ICompressCoder> bzip2Coder = bzip2CoderSpec;
-
- NCompress::NZlib::CDecoder *zlibCoderSpec = new NCompress::NZlib::CDecoder();
- CMyComPtr<ICompressCoder> zlibCoder = zlibCoderSpec;
-
- CAdcDecoder *adcCoderSpec = new CAdcDecoder();
- CMyComPtr<ICompressCoder> adcCoder = adcCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_inStream);
-
- for (i = 0; i < numItems; i++, currentPackTotal += currentPackSize, currentUnpTotal += currentUnpSize)
- {
- lps->InSize = currentPackTotal;
- lps->OutSize = currentUnpTotal;
- currentPackSize = 0;
- currentUnpSize = 0;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- // const CItemEx &item = _files[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- CLimitedSequentialOutStream *outStreamSpec = new CLimitedSequentialOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
-
- realOutStream.Release();
-
- Int32 opRes = NExtract::NOperationResult::kOK;
- #ifdef DMG_SHOW_RAW
- if (index > _fileIndices.Size())
- {
- const CByteBuffer &buf = _files[index - (_fileIndices.Size() + 1)].Raw;
- outStreamSpec->Init(buf.GetCapacity());
- RINOK(WriteStream(outStream, buf, buf.GetCapacity()));
- currentPackSize = currentUnpSize = buf.GetCapacity();
- }
- else if (index == _fileIndices.Size())
- {
- outStreamSpec->Init(_xml.Length());
- RINOK(WriteStream(outStream, (const char *)_xml, _xml.Length()));
- currentPackSize = currentUnpSize = _xml.Length();
- }
- else
- #endif
- {
- const CFile &item = _files[_fileIndices[index]];
- currentPackSize = item.GetPackSize();
- currentUnpSize = item.GetUnpackSize();
-
- UInt64 unpPos = 0;
- UInt64 packPos = 0;
- {
- for (int j = 0; j < item.Blocks.Size(); j++)
- {
- lps->InSize = currentPackTotal + packPos;
- lps->OutSize = currentUnpTotal + unpPos;
- RINOK(lps->SetCur());
-
- const CBlock &block = item.Blocks[j];
-
- packPos += block.PackSize;
- if (block.UnpPos != unpPos)
- {
- opRes = NExtract::NOperationResult::kDataError;
- break;
- }
-
- RINOK(_inStream->Seek(item.StartPos + block.PackPos, STREAM_SEEK_SET, NULL));
- streamSpec->Init(block.PackSize);
- // UInt64 startSize = outStreamSpec->GetSize();
- bool realMethod = true;
- outStreamSpec->Init(block.UnpSize);
- HRESULT res = S_OK;
-
- switch(block.Type)
- {
- case METHOD_ZERO_0:
- case METHOD_ZERO_2:
- realMethod = false;
- if (block.PackSize != 0)
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- break;
-
- case METHOD_COPY:
- if (block.UnpSize != block.PackSize)
- {
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- break;
- }
- res = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- break;
-
- case METHOD_ADC:
- {
- res = adcCoder->Code(inStream, outStream, &block.PackSize, &block.UnpSize, progress);
- break;
- }
-
- case METHOD_ZLIB:
- {
- res = zlibCoder->Code(inStream, outStream, NULL, NULL, progress);
- break;
- }
-
- case METHOD_BZIP2:
- {
- res = bzip2Coder->Code(inStream, outStream, NULL, NULL, progress);
- if (res == S_OK)
- if (streamSpec->GetSize() != block.PackSize)
- opRes = NExtract::NOperationResult::kDataError;
- break;
- }
-
- default:
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- break;
- }
- if (res != S_OK)
- {
- if (res != S_FALSE)
- return res;
- if (opRes == NExtract::NOperationResult::kOK)
- opRes = NExtract::NOperationResult::kDataError;
- }
- unpPos += block.UnpSize;
- if (!outStreamSpec->IsFinishedOK())
- {
- if (realMethod && opRes == NExtract::NOperationResult::kOK)
- opRes = NExtract::NOperationResult::kDataError;
-
- while (outStreamSpec->GetRem() != 0)
- {
- UInt64 rem = outStreamSpec->GetRem();
- UInt32 size = (UInt32)MyMin(rem, (UInt64)kZeroBufSize);
- RINOK(WriteStream(outStream, zeroBuf, size));
- }
- }
- }
- }
- }
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Dmg", L"dmg", 0, 0xE4, { 0 }, 0, false, CreateArc, 0 };
-
-REGISTER_ARC(Dmg)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/ElfHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/ElfHandler.cpp
deleted file mode 100644
index c4ad78e9e..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/ElfHandler.cpp
+++ /dev/null
@@ -1,534 +0,0 @@
-// ElfHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-
-#include "Windows/PropVariantUtils.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-static UInt16 Get16(const Byte *p, int be) { if (be) return GetBe16(p); return GetUi16(p); }
-static UInt32 Get32(const Byte *p, int be) { if (be) return GetBe32(p); return GetUi32(p); }
-static UInt64 Get64(const Byte *p, int be) { if (be) return GetBe64(p); return GetUi64(p); }
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NElf {
-
-#define ELF_CLASS_32 1
-#define ELF_CLASS_64 2
-
-#define ELF_DATA_2LSB 1
-#define ELF_DATA_2MSB 2
-
-#define NUM_SCAN_SECTIONS_MAX (1 << 6)
-
-struct CHeader
-{
- bool Mode64;
- bool Be;
- Byte Os;
- Byte AbiVer;
-
- UInt16 Type;
- UInt16 Machine;
- // UInt32 Version;
-
- // UInt64 EntryVa;
- UInt64 ProgOffset;
- UInt64 SectOffset;
- UInt32 Flags;
- UInt16 ElfHeaderSize;
- UInt16 SegmentEntrySize;
- UInt16 NumSegments;
- UInt16 SectEntrySize;
- UInt16 NumSections;
- // UInt16 SectNameStringTableIndex;
-
- bool Parse(const Byte *buf);
-
- bool CheckSegmentEntrySize() const
- {
- return (Mode64 && SegmentEntrySize == 0x38) || (!Mode64 && SegmentEntrySize == 0x20);
- };
-
- UInt64 GetHeadersSize() const
- { return ElfHeaderSize +
- (UInt64)SegmentEntrySize * NumSegments +
- (UInt64)SectEntrySize * NumSections; }
-
-};
-
-bool CHeader::Parse(const Byte *p)
-{
- switch(p[4])
- {
- case ELF_CLASS_32: Mode64 = false; break;
- case ELF_CLASS_64: Mode64 = true; break;
- default: return false;
- }
- bool be;
- switch(p[5])
- {
- case ELF_DATA_2LSB: be = false; break;
- case ELF_DATA_2MSB: be = true; break;
- default: return false;
- }
- Be = be;
- if (p[6] != 1) // Version
- return false;
- Os = p[7];
- AbiVer = p[8];
- for (int i = 9; i < 16; i++)
- if (p[i] != 0)
- return false;
-
- Type = Get16(p + 0x10, be);
- Machine = Get16(p + 0x12, be);
- if (Get32(p + 0x14, be) != 1) // Version
- return false;
-
- if (Mode64)
- {
- // EntryVa = Get64(p + 0x18, be);
- ProgOffset = Get64(p + 0x20, be);
- SectOffset = Get64(p + 0x28, be);
- p += 0x30;
- }
- else
- {
- // EntryVa = Get32(p + 0x18, be);
- ProgOffset = Get32(p + 0x1C, be);
- SectOffset = Get32(p + 0x20, be);
- p += 0x24;
- }
-
- Flags = Get32(p + 0, be);
- ElfHeaderSize = Get16(p + 4, be);
- SegmentEntrySize = Get16(p + 6, be);
- NumSegments = Get16(p + 8, be);
- SectEntrySize = Get16(p + 10, be);
- NumSections = Get16(p + 12, be);
- // SectNameStringTableIndex = Get16(p + 14, be);
- return CheckSegmentEntrySize();
-}
-
-struct CSegment
-{
- UInt32 Type;
- UInt32 Flags;
- UInt64 Offset;
- UInt64 Va;
- // UInt64 Pa;
- UInt64 PSize;
- UInt64 VSize;
- // UInt64 Align;
-
- void UpdateTotalSize(UInt64 &totalSize)
- {
- UInt64 t = Offset + PSize;
- if (t > totalSize)
- totalSize = t;
- }
- void Parse(const Byte *p, bool mode64, bool be);
-};
-
-void CSegment::Parse(const Byte *p, bool mode64, bool be)
-{
- Type = Get32(p, be);
- if (mode64)
- {
- Flags = Get32(p + 4, be);
- Offset = Get64(p + 8, be);
- Va = Get64(p + 0x10, be);
- // Pa = Get64(p + 0x18, be);
- PSize = Get64(p + 0x20, be);
- VSize = Get64(p + 0x28, be);
- // Align = Get64(p + 0x30, be);
- }
- else
- {
- Offset = Get32(p + 4, be);
- Va = Get32(p + 8, be);
- // Pa = Get32(p + 12, be);
- PSize = Get32(p + 16, be);
- VSize = Get32(p + 20, be);
- Flags = Get32(p + 24, be);
- // Align = Get32(p + 28, be);
- }
-}
-
-static const CUInt32PCharPair g_MachinePairs[] =
-{
- { 0, "None" },
- { 1, "AT&T WE 32100" },
- { 2, "SPARC" },
- { 3, "Intel 386" },
- { 4, "Motorola 68000" },
- { 5, "Motorola 88000" },
- { 6, "Intel 486" },
- { 7, "Intel i860" },
- { 8, "MIPS" },
- { 9, "IBM S/370" },
- { 10, "MIPS RS3000 LE" },
- { 11, "RS6000" },
-
- { 15, "PA-RISC" },
- { 16, "nCUBE" },
- { 17, "Fujitsu VPP500" },
- { 18, "SPARC 32+" },
- { 19, "Intel i960" },
- { 20, "PowerPC" },
- { 21, "PowerPC 64-bit" },
- { 22, "IBM S/390" },
-
- { 36, "NEX v800" },
- { 37, "Fujitsu FR20" },
- { 38, "TRW RH-32" },
- { 39, "Motorola RCE" },
- { 40, "ARM" },
- { 41, "Alpha" },
- { 42, "Hitachi SH" },
- { 43, "SPARC-V9" },
- { 44, "Siemens Tricore" },
- { 45, "ARC" },
- { 46, "H8/300" },
- { 47, "H8/300H" },
- { 48, "H8S" },
- { 49, "H8/500" },
- { 50, "IA-64" },
- { 51, "Stanford MIPS-X" },
- { 52, "Motorola ColdFire" },
- { 53, "M68HC12" },
- { 54, "Fujitsu MMA" },
- { 55, "Siemens PCP" },
- { 56, "Sony nCPU" },
- { 57, "Denso NDR1" },
- { 58, "Motorola StarCore" },
- { 59, "Toyota ME16" },
- { 60, "ST100" },
- { 61, "Advanced Logic TinyJ" },
- { 62, "AMD64" },
- { 63, "Sony DSP" },
-
- { 66, "Siemens FX66" },
- { 67, "ST9+" },
- { 68, "ST7" },
- { 69, "MC68HC16" },
- { 70, "MC68HC11" },
- { 71, "MC68HC08" },
- { 72, "MC68HC05" },
- { 73, "Silicon Graphics SVx" },
- { 74, "ST19" },
- { 75, "Digital VAX" },
- { 76, "Axis CRIS" },
- { 77, "Infineon JAVELIN" },
- { 78, "Element 14 FirePath" },
- { 79, "LSI ZSP" },
- { 80, "MMIX" },
- { 81, "HUANY" },
- { 82, "SiTera Prism" },
- { 83, "Atmel AVR" },
- { 84, "Fujitsu FR30" },
- { 85, "Mitsubishi D10V" },
- { 86, "Mitsubishi D30V" },
- { 87, "NEC v850" },
- { 88, "Mitsubishi M32R" },
- { 89, "Matsushita MN10300" },
- { 90, "Matsushita MN10200" },
- { 91, "picoJava" },
- { 92, "OpenRISC" },
- { 93, "ARC Tangent-A5" },
- { 94, "Tensilica Xtensa" },
- { 0x9026, "Alpha" }
-};
-
-static const CUInt32PCharPair g_AbiOS[] =
-{
- { 0, "None" },
- { 1, "HP-UX" },
- { 2, "NetBSD" },
- { 3, "Linux" },
-
- { 6, "Solaris" },
- { 7, "AIX" },
- { 8, "IRIX" },
- { 9, "FreeBSD" },
- { 10, "TRU64" },
- { 11, "Novell Modesto" },
- { 12, "OpenBSD" },
- { 13, "OpenVMS" },
- { 14, "HP NSK" },
- { 15, "AROS" },
- { 97, "ARM" },
- { 255, "Standalone" }
-};
-
-static const CUInt32PCharPair g_SegmentFlags[] =
-{
- { 0, "Execute" },
- { 1, "Write" },
- { 2, "Read" }
-};
-
-static const char *g_Types[] =
-{
- "None",
- "Relocatable file",
- "Executable file",
- "Shared object file",
- "Core file"
-};
-
-static const char *g_SegnmentTypes[] =
-{
- "Unused",
- "Loadable segment",
- "Dynamic linking tables",
- "Program interpreter path name",
- "Note section",
- "SHLIB",
- "Program header table",
- "TLS"
-};
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _inStream;
- CObjectVector<CSegment> _sections;
- UInt32 _peOffset;
- CHeader _header;
- UInt64 _totalSize;
- HRESULT Open2(IInStream *stream);
- bool Parse(const Byte *buf, UInt32 size);
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-#define ELF_PT_PHDR 6
-
-bool CHandler::Parse(const Byte *buf, UInt32 size)
-{
- if (size < 64)
- return false;
- if (!_header.Parse(buf))
- return false;
- if (_header.ProgOffset > size ||
- _header.ProgOffset + (UInt64)_header.SegmentEntrySize * _header.NumSegments > size ||
- _header.NumSegments > NUM_SCAN_SECTIONS_MAX)
- return false;
- const Byte *p = buf + _header.ProgOffset;
- _totalSize = _header.ProgOffset;
-
- for (int i = 0; i < _header.NumSegments; i++, p += _header.SegmentEntrySize)
- {
- CSegment sect;
- sect.Parse(p, _header.Mode64, _header.Be);
- sect.UpdateTotalSize(_totalSize);
- if (sect.Type != ELF_PT_PHDR)
- _sections.Add(sect);
- }
- UInt64 total2 = _header.SectOffset + (UInt64)_header.SectEntrySize * _header.NumSections;
- if (total2 > _totalSize)
- _totalSize = total2;
- return true;
-}
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidCpu, VT_BSTR},
- { NULL, kpidBit64, VT_BOOL},
- { NULL, kpidBigEndian, VT_BOOL},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI8}
- };
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidType, VT_BSTR},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidOffset, VT_UI8},
- { NULL, kpidVa, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: prop = _totalSize; break;
- case kpidHeadersSize: prop = _header.GetHeadersSize(); break;
- case kpidBit64: if (_header.Mode64) prop = _header.Mode64; break;
- case kpidBigEndian: if (_header.Be) prop = _header.Be; break;
- case kpidCpu: PAIR_TO_PROP(g_MachinePairs, _header.Machine, prop); break;
- case kpidHostOS: PAIR_TO_PROP(g_AbiOS, _header.Os, prop); break;
- case kpidCharacts: TYPE_TO_PROP(g_Types, _header.Type, prop); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- const CSegment &item = _sections[index];
- switch(propID)
- {
- case kpidPath:
- {
- wchar_t sz[32];
- ConvertUInt64ToString(index, sz);
- prop = sz;
- break;
- }
- case kpidSize: prop = (UInt64)item.VSize; break;
- case kpidPackSize: prop = (UInt64)item.PSize; break;
- case kpidOffset: prop = item.Offset; break;
- case kpidVa: prop = item.Va; break;
- case kpidType: TYPE_TO_PROP(g_SegnmentTypes, item.Type, prop); break;
- case kpidCharacts: FLAGS_TO_PROP(g_SegmentFlags, item.Flags, prop); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::Open2(IInStream *stream)
-{
- const UInt32 kBufSize = 1 << 18;
- const UInt32 kSigSize = 4;
-
- CByteBuffer buffer;
- buffer.SetCapacity(kBufSize);
- Byte *buf = buffer;
-
- size_t processed = kSigSize;
- RINOK(ReadStream_FALSE(stream, buf, processed));
- if (buf[0] != 0x7F || buf[1] != 'E' || buf[2] != 'L' || buf[3] != 'F')
- return S_FALSE;
- processed = kBufSize - kSigSize;
- RINOK(ReadStream(stream, buf + kSigSize, &processed));
- processed += kSigSize;
- if (!Parse(buf, (UInt32)processed))
- return S_FALSE;
- UInt64 fileSize;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize));
- return (fileSize == _totalSize) ? S_OK : S_FALSE;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- RINOK(Open2(inStream));
- _inStream = inStream;
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _inStream.Release();
- _sections.Clear();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _sections.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _sections.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _sections[allFilesMode ? i : indices[i]].PSize;
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
- UInt64 currentItemSize;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_inStream);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CSegment &item = _sections[index];
- currentItemSize = item.PSize;
-
- CMyComPtr<ISequentialOutStream> outStream;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(_inStream->Seek(item.Offset, STREAM_SEEK_SET, NULL));
- streamSpec->Init(currentItemSize);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == currentItemSize ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"ELF", L"", 0, 0xDE, { 0 }, 0, false, CreateArc, 0 };
-
-REGISTER_ARC(Elf)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/FatHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/FatHandler.cpp
deleted file mode 100644
index 1c374a444..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/FatHandler.cpp
+++ /dev/null
@@ -1,996 +0,0 @@
-// FatHandler.cpp
-
-#include "StdAfx.h"
-
-// #include <stdio.h>
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyCom.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#include "Common/DummyOutStream.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-
-#define PRF(x) /* x */
-
-namespace NArchive {
-namespace NFat {
-
-static const UInt32 kFatItemUsedByDirMask = (UInt32)1 << 31;
-
-struct CHeader
-{
- UInt32 NumSectors;
- UInt16 NumReservedSectors;
- Byte NumFats;
- UInt32 NumFatSectors;
- UInt32 RootDirSector;
- UInt32 NumRootDirSectors;
- UInt32 DataSector;
-
- UInt32 FatSize;
- UInt32 BadCluster;
-
- Byte NumFatBits;
- Byte SectorSizeLog;
- Byte SectorsPerClusterLog;
- Byte ClusterSizeLog;
-
- UInt16 SectorsPerTrack;
- UInt16 NumHeads;
- UInt32 NumHiddenSectors;
-
- bool VolFieldsDefined;
-
- UInt32 VolId;
- // Byte VolName[11];
- // Byte FileSys[8];
-
- // Byte OemName[5];
- Byte MediaType;
-
- // 32-bit FAT
- UInt16 Flags;
- UInt16 FsInfoSector;
- UInt32 RootCluster;
-
- bool IsFat32() const { return NumFatBits == 32; }
- UInt64 GetPhySize() const { return (UInt64)NumSectors << SectorSizeLog; }
- UInt32 SectorSize() const { return (UInt32)1 << SectorSizeLog; }
- UInt32 ClusterSize() const { return (UInt32)1 << ClusterSizeLog; }
- UInt32 ClusterToSector(UInt32 c) const { return DataSector + ((c - 2) << SectorsPerClusterLog); }
- UInt32 IsEoc(UInt32 c) const { return c > BadCluster; }
- UInt32 IsEocAndUnused(UInt32 c) const { return c > BadCluster && (c & kFatItemUsedByDirMask) == 0; }
- UInt32 IsValidCluster(UInt32 c) const { return c >= 2 && c < FatSize; }
- UInt32 SizeToSectors(UInt32 size) const { return (size + SectorSize() - 1) >> SectorSizeLog; }
- UInt32 CalcFatSizeInSectors() const { return SizeToSectors((FatSize * (NumFatBits / 4) + 1) / 2); }
-
- UInt32 GetFatSector() const
- {
- UInt32 index = (IsFat32() && (Flags & 0x80) != 0) ? (Flags & 0xF) : 0;
- if (index > NumFats)
- index = 0;
- return NumReservedSectors + index * NumFatSectors;
- }
-
- UInt64 GetFilePackSize(UInt32 unpackSize) const
- {
- UInt64 mask = ClusterSize() - 1;
- return (unpackSize + mask) & ~mask;
- }
-
- UInt32 GetNumClusters(UInt32 size) const
- { return (UInt32)(((UInt64)size + ClusterSize() - 1) >> ClusterSizeLog); }
-
- bool Parse(const Byte *p);
-};
-
-static int GetLog(UInt32 num)
-{
- for (int i = 0; i < 31; i++)
- if (((UInt32)1 << i) == num)
- return i;
- return -1;
-}
-
-bool CHeader::Parse(const Byte *p)
-{
- if (p[0x1FE] != 0x55 || p[0x1FF] != 0xAA)
- return false;
-
- int codeOffset = 0;
- switch (p[0])
- {
- case 0xE9: codeOffset = 3 + (Int16)Get16(p + 1); break;
- case 0xEB: if (p[2] != 0x90) return false; codeOffset = 2 + (signed char)p[1]; break;
- default: return false;
- }
- {
- int s = GetLog(Get16(p + 11));
- if (s < 9 || s > 12)
- return false;
- SectorSizeLog = (Byte)s;
- s = GetLog(p[13]);
- if (s < 0)
- return false;
- SectorsPerClusterLog = (Byte)s;
- ClusterSizeLog = SectorSizeLog + SectorsPerClusterLog;
- }
-
- NumReservedSectors = Get16(p + 14);
- if (NumReservedSectors == 0)
- return false;
-
- NumFats = p[16];
- if (NumFats < 1 || NumFats > 4)
- return false;
-
- UInt16 numRootDirEntries = Get16(p + 17);
- if (numRootDirEntries == 0)
- {
- if (codeOffset < 90)
- return false;
- NumFatBits = 32;
- NumRootDirSectors = 0;
- }
- else
- {
- if (codeOffset < 62)
- return false;
- NumFatBits = 0;
- UInt32 mask = (1 << (SectorSizeLog - 5)) - 1;
- if ((numRootDirEntries & mask) != 0)
- return false;
- NumRootDirSectors = (numRootDirEntries + mask) >> (SectorSizeLog - 5);
- }
-
- NumSectors = Get16(p + 19);
- if (NumSectors == 0)
- NumSectors = Get32(p + 32);
- else if (IsFat32())
- return false;
-
- MediaType = p[21];
- NumFatSectors = Get16(p + 22);
- SectorsPerTrack = Get16(p + 24);
- NumHeads = Get16(p + 26);
- NumHiddenSectors = Get32(p + 28);
-
- // memcpy(OemName, p + 3, 5);
-
- p += 36;
- if (IsFat32())
- {
- if (NumFatSectors != 0)
- return false;
- NumFatSectors = Get32(p);
- if (NumFatSectors >= (1 << 24))
- return false;
-
- Flags = Get16(p + 4);
- if (Get16(p + 6) != 0)
- return false;
- RootCluster = Get32(p + 8);
- FsInfoSector = Get16(p + 12);
- for (int i = 16; i < 28; i++)
- if (p[i] != 0)
- return false;
- p += 28;
- }
-
- // DriveNumber = p[0];
- VolFieldsDefined = (p[2] == 0x29); // ExtendedBootSig
- VolId = Get32(p + 3);
- // memcpy(VolName, p + 7, 11);
- // memcpy(FileSys, p + 18, 8);
-
- if (NumFatSectors == 0)
- return false;
- RootDirSector = NumReservedSectors + NumFatSectors * NumFats;
- DataSector = RootDirSector + NumRootDirSectors;
- if (NumSectors < DataSector)
- return false;
- UInt32 numDataSectors = NumSectors - DataSector;
- UInt32 numClusters = numDataSectors >> SectorsPerClusterLog;
-
- BadCluster = 0x0FFFFFF7;
- if (numClusters < 0xFFF5)
- {
- if (NumFatBits == 32)
- return false;
- NumFatBits = (numClusters < 0xFF5) ? 12: 16;
- BadCluster &= ((1 << NumFatBits) - 1);
- }
- else if (NumFatBits != 32)
- return false;
-
- FatSize = numClusters + 2;
- if (FatSize > BadCluster || CalcFatSizeInSectors() > NumFatSectors)
- return false;
- return true;
-}
-
-struct CItem
-{
- UString UName;
- char DosName[11];
- Byte CTime2;
- UInt32 CTime;
- UInt32 MTime;
- UInt16 ADate;
- Byte Attrib;
- Byte Flags;
- UInt32 Size;
- UInt32 Cluster;
- Int32 Parent;
-
- // NT uses Flags to store Low Case status
- bool NameIsLow() const { return (Flags & 0x8) != 0; }
- bool ExtIsLow() const { return (Flags & 0x10) != 0; }
- bool IsDir() const { return (Attrib & 0x10) != 0; }
- UString GetShortName() const;
- UString GetName() const;
- UString GetVolName() const;
-};
-
-static int CopyAndTrim(char *dest, const char *src, int size, bool toLower)
-{
- int i;
- memcpy(dest, src, size);
- if (toLower)
- for (i = 0; i < size; i++)
- {
- char c = dest[i];
- if (c >= 'A' && c <= 'Z')
- dest[i] = c + 0x20;
- }
- for (i = size - 1; i >= 0 && dest[i] == ' '; i--);
- return i + 1;
-}
-
-static UString FatStringToUnicode(const char *s)
-{
- return MultiByteToUnicodeString(s, CP_OEMCP);
-}
-
-UString CItem::GetShortName() const
-{
- char s[16];
- int i = CopyAndTrim(s, DosName, 8, NameIsLow());
- s[i++] = '.';
- int j = CopyAndTrim(s + i, DosName + 8, 3, ExtIsLow());
- if (j == 0)
- j--;
- s[i + j] = 0;
- return FatStringToUnicode(s);
-}
-
-UString CItem::GetName() const
-{
- if (!UName.IsEmpty())
- return UName;
- return GetShortName();
-}
-
-UString CItem::GetVolName() const
-{
- if (!UName.IsEmpty())
- return UName;
- char s[12];
- int i = CopyAndTrim(s, DosName, 11, false);
- s[i] = 0;
- return FatStringToUnicode(s);
-}
-
-struct CDatabase
-{
- CHeader Header;
- CObjectVector<CItem> Items;
- UInt32 *Fat;
- CMyComPtr<IInStream> InStream;
- IArchiveOpenCallback *OpenCallback;
-
- UInt32 NumFreeClusters;
- bool VolItemDefined;
- CItem VolItem;
- UInt32 NumDirClusters;
- CByteBuffer ByteBuf;
- UInt64 NumCurUsedBytes;
-
- CDatabase(): Fat(0) {}
- ~CDatabase() { ClearAndClose(); }
-
- void Clear();
- void ClearAndClose();
- HRESULT OpenProgressFat(bool changeTotal = true);
- HRESULT OpenProgress();
-
- UString GetItemPath(Int32 index) const;
- HRESULT Open();
- HRESULT ReadDir(Int32 parent, UInt32 cluster, int level);
-
- UInt64 GetHeadersSize() const
- {
- return (UInt64)(Header.DataSector + (NumDirClusters << Header.SectorsPerClusterLog)) << Header.SectorSizeLog;
- }
- HRESULT SeekToSector(UInt32 sector);
- HRESULT SeekToCluster(UInt32 cluster) { return SeekToSector(Header.ClusterToSector(cluster)); }
-};
-
-HRESULT CDatabase::SeekToSector(UInt32 sector)
-{
- return InStream->Seek((UInt64)sector << Header.SectorSizeLog, STREAM_SEEK_SET, NULL);
-}
-
-void CDatabase::Clear()
-{
- VolItemDefined = false;
- NumDirClusters = 0;
- NumCurUsedBytes = 0;
-
- Items.Clear();
- delete []Fat;
- Fat = 0;
-}
-
-void CDatabase::ClearAndClose()
-{
- Clear();
- InStream.Release();
-}
-
-HRESULT CDatabase::OpenProgressFat(bool changeTotal)
-{
- if (!OpenCallback)
- return S_OK;
- if (changeTotal)
- {
- UInt64 numTotalBytes = (Header.CalcFatSizeInSectors() << Header.SectorSizeLog) +
- ((UInt64)(Header.FatSize - NumFreeClusters) << Header.ClusterSizeLog);
- RINOK(OpenCallback->SetTotal(NULL, &numTotalBytes));
- }
- return OpenCallback->SetCompleted(NULL, &NumCurUsedBytes);
-}
-
-HRESULT CDatabase::OpenProgress()
-{
- if (!OpenCallback)
- return S_OK;
- UInt64 numItems = Items.Size();
- return OpenCallback->SetCompleted(&numItems, &NumCurUsedBytes);
-}
-
-UString CDatabase::GetItemPath(Int32 index) const
-{
- const CItem *item = &Items[index];
- UString name = item->GetName();
- for (;;)
- {
- index = item->Parent;
- if (index < 0)
- return name;
- item = &Items[index];
- name = item->GetName() + WCHAR_PATH_SEPARATOR + name;
- }
-}
-
-static wchar_t *AddSubStringToName(wchar_t *dest, const Byte *p, int numChars)
-{
- for (int i = 0; i < numChars; i++)
- {
- wchar_t c = Get16(p + i * 2);
- if (c != 0 && c != 0xFFFF)
- *dest++ = c;
- }
- *dest = 0;
- return dest;
-}
-
-HRESULT CDatabase::ReadDir(Int32 parent, UInt32 cluster, int level)
-{
- int startIndex = Items.Size();
- if (startIndex >= (1 << 30) || level > 256)
- return S_FALSE;
-
- UInt32 sectorIndex = 0;
- UInt32 blockSize = Header.ClusterSize();
- bool clusterMode = (Header.IsFat32() || parent >= 0);
- if (!clusterMode)
- {
- blockSize = Header.SectorSize();
- RINOK(SeekToSector(Header.RootDirSector));
- }
-
- ByteBuf.SetCapacity(blockSize);
- UString curName;
- int checkSum = -1;
- int numLongRecords = -1;
- for (UInt32 pos = blockSize;; pos += 32)
- {
- if (pos == blockSize)
- {
- pos = 0;
-
- if ((NumDirClusters & 0xFF) == 0)
- {
- RINOK(OpenProgress());
- }
-
- if (clusterMode)
- {
- if (Header.IsEoc(cluster))
- break;
- if (!Header.IsValidCluster(cluster))
- return S_FALSE;
- PRF(printf("\nCluster = %4X", cluster));
- RINOK(SeekToCluster(cluster));
- UInt32 newCluster = Fat[cluster];
- if ((newCluster & kFatItemUsedByDirMask) != 0)
- return S_FALSE;
- Fat[cluster] |= kFatItemUsedByDirMask;
- cluster = newCluster;
- NumDirClusters++;
- NumCurUsedBytes += Header.ClusterSize();
- }
- else if (sectorIndex++ >= Header.NumRootDirSectors)
- break;
-
- RINOK(ReadStream_FALSE(InStream, ByteBuf, blockSize));
- }
- const Byte *p = ByteBuf + pos;
- if (p[0] == 0)
- {
- /*
- // FreeDOS formats FAT partition with cluster chain longer than required.
- if (clusterMode && !Header.IsEoc(cluster))
- return S_FALSE;
- */
- break;
- }
- if (p[0] == 0xE5)
- {
- if (numLongRecords > 0)
- return S_FALSE;
- continue;
- }
-
- Byte attrib = p[11];
- if ((attrib & 0x3F) == 0xF)
- {
- if (p[0] > 0x7F || Get16(p + 26) != 0)
- return S_FALSE;
- int longIndex = p[0] & 0x3F;
- if (longIndex == 0)
- return S_FALSE;
- bool isLast = (p[0] & 0x40) != 0;
- if (numLongRecords < 0)
- {
- if (!isLast)
- return S_FALSE;
- numLongRecords = longIndex;
- }
- else if (isLast || numLongRecords != longIndex)
- return S_FALSE;
-
- numLongRecords--;
-
- if (p[12] == 0)
- {
- wchar_t nameBuf[14];
- wchar_t *dest;
-
- dest = AddSubStringToName(nameBuf, p + 1, 5);
- dest = AddSubStringToName(dest, p + 14, 6);
- AddSubStringToName(dest, p + 28, 2);
- curName = nameBuf + curName;
- if (isLast)
- checkSum = p[13];
- if (checkSum != p[13])
- return S_FALSE;
- }
- }
- else
- {
- if (numLongRecords > 0)
- return S_FALSE;
- CItem item;
- memcpy(item.DosName, p, 11);
-
- if (checkSum >= 0)
- {
- Byte sum = 0;
- for (int i = 0; i < 11; i++)
- sum = ((sum & 1) ? 0x80 : 0) + (sum >> 1) + (Byte)item.DosName[i];
- if (sum == checkSum)
- item.UName = curName;
- }
-
- if (item.DosName[0] == 5)
- item.DosName[0] = (char)(Byte)0xE5;
- item.Attrib = attrib;
- item.Flags = p[12];
- item.Size = Get32(p + 28);
- item.Cluster = Get16(p + 26);
- if (Header.NumFatBits > 16)
- item.Cluster |= ((UInt32)Get16(p + 20) << 16);
- else
- {
- // OS/2 and WinNT probably can store EA (extended atributes) in that field.
- }
-
- item.CTime = Get32(p + 14);
- item.CTime2 = p[13];
- item.ADate = Get16(p + 18);
- item.MTime = Get32(p + 22);
- item.Parent = parent;
-
- if (attrib == 8)
- {
- VolItem = item;
- VolItemDefined = true;
- }
- else
- if (memcmp(item.DosName, ". ", 11) != 0 &&
- memcmp(item.DosName, ".. ", 11) != 0)
- {
- if (!item.IsDir())
- NumCurUsedBytes += Header.GetFilePackSize(item.Size);
- Items.Add(item);
- PRF(printf("\n%7d: %S", Items.Size(), GetItemPath(Items.Size() - 1)));
- }
- numLongRecords = -1;
- curName.Empty();
- checkSum = -1;
- }
- }
-
- int finishIndex = Items.Size();
- for (int i = startIndex; i < finishIndex; i++)
- {
- const CItem &item = Items[i];
- if (item.IsDir())
- {
- PRF(printf("\n%S", GetItemPath(i)));
- RINOK(CDatabase::ReadDir(i, item.Cluster, level + 1));
- }
- }
- return S_OK;
-}
-
-HRESULT CDatabase::Open()
-{
- Clear();
- bool numFreeClustersDefined = false;
- {
- static const UInt32 kHeaderSize = 512;
- Byte buf[kHeaderSize];
- RINOK(ReadStream_FALSE(InStream, buf, kHeaderSize));
- if (!Header.Parse(buf))
- return S_FALSE;
- UInt64 fileSize;
- RINOK(InStream->Seek(0, STREAM_SEEK_END, &fileSize));
-
- /* we comment that check to support truncated images */
- /*
- if (fileSize < Header.GetPhySize())
- return S_FALSE;
- */
-
- if (Header.IsFat32())
- {
- SeekToSector(Header.FsInfoSector);
- RINOK(ReadStream_FALSE(InStream, buf, kHeaderSize));
- if (buf[0x1FE] != 0x55 || buf[0x1FF] != 0xAA)
- return S_FALSE;
- if (Get32(buf) == 0x41615252 && Get32(buf + 484) == 0x61417272)
- {
- NumFreeClusters = Get32(buf + 488);
- numFreeClustersDefined = (NumFreeClusters <= Header.FatSize);
- }
- }
- }
-
- // numFreeClustersDefined = false; // to recalculate NumFreeClusters
- if (!numFreeClustersDefined)
- NumFreeClusters = 0;
-
- CByteBuffer byteBuf;
- Fat = new UInt32[Header.FatSize];
-
- RINOK(OpenProgressFat());
- RINOK(SeekToSector(Header.GetFatSector()));
- if (Header.NumFatBits == 32)
- {
- const UInt32 kBufSize = (1 << 15);
- byteBuf.SetCapacity(kBufSize);
- for (UInt32 i = 0; i < Header.FatSize;)
- {
- UInt32 size = Header.FatSize - i;
- const UInt32 kBufSize32 = kBufSize / 4;
- if (size > kBufSize32)
- size = kBufSize32;
- UInt32 readSize = Header.SizeToSectors(size * 4) << Header.SectorSizeLog;
- RINOK(ReadStream_FALSE(InStream, byteBuf, readSize));
- NumCurUsedBytes += readSize;
-
- const UInt32 *src = (const UInt32 *)(const Byte *)byteBuf;
- UInt32 *dest = Fat + i;
- if (numFreeClustersDefined)
- for (UInt32 j = 0; j < size; j++)
- dest[j] = Get32(src + j) & 0x0FFFFFFF;
- else
- {
- UInt32 numFreeClusters = 0;
- for (UInt32 j = 0; j < size; j++)
- {
- UInt32 v = Get32(src + j) & 0x0FFFFFFF;
- numFreeClusters += (UInt32)(v - 1) >> 31;
- dest[j] = v;
- }
- NumFreeClusters += numFreeClusters;
- }
- i += size;
- if ((i & 0xFFFFF) == 0)
- {
- RINOK(OpenProgressFat(!numFreeClustersDefined));
- }
- }
- }
- else
- {
- const UInt32 kBufSize = (UInt32)Header.CalcFatSizeInSectors() << Header.SectorSizeLog;
- NumCurUsedBytes += kBufSize;
- byteBuf.SetCapacity(kBufSize);
- Byte *p = byteBuf;
- RINOK(ReadStream_FALSE(InStream, p, kBufSize));
- UInt32 fatSize = Header.FatSize;
- UInt32 *fat = &Fat[0];
- if (Header.NumFatBits == 16)
- for (UInt32 j = 0; j < fatSize; j++)
- fat[j] = Get16(p + j * 2);
- else
- for (UInt32 j = 0; j < fatSize; j++)
- fat[j] = (Get16(p + j * 3 / 2) >> ((j & 1) << 2)) & 0xFFF;
-
- if (!numFreeClustersDefined)
- {
- UInt32 numFreeClusters = 0;
- for (UInt32 i = 0; i < fatSize; i++)
- numFreeClusters += (UInt32)(fat[i] - 1) >> 31;
- NumFreeClusters = numFreeClusters;
- }
- }
-
- RINOK(OpenProgressFat());
-
- if ((Fat[0] & 0xFF) != Header.MediaType)
- return S_FALSE;
-
- return ReadDir(-1, Header.RootCluster, 0);
-}
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp,
- CDatabase
-{
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
- const CItem &item = Items[index];
- CClusterInStream *streamSpec = new CClusterInStream;
- CMyComPtr<ISequentialInStream> streamTemp = streamSpec;
- streamSpec->Stream = InStream;
- streamSpec->StartOffset = Header.DataSector << Header.SectorSizeLog;
- streamSpec->BlockSizeLog = Header.ClusterSizeLog;
- streamSpec->Size = item.Size;
-
- UInt32 numClusters = Header.GetNumClusters(item.Size);
- streamSpec->Vector.Reserve(numClusters);
- UInt32 cluster = item.Cluster;
- UInt32 size = item.Size;
-
- if (size == 0)
- {
- if (cluster != 0)
- return S_FALSE;
- }
- else
- {
- UInt32 clusterSize = Header.ClusterSize();
- for (;; size -= clusterSize)
- {
- if (!Header.IsValidCluster(cluster))
- return S_FALSE;
- streamSpec->Vector.Add(cluster - 2);
- cluster = Fat[cluster];
- if (size <= clusterSize)
- break;
- }
- if (!Header.IsEocAndUnused(cluster))
- return S_FALSE;
- }
- RINOK(streamSpec->InitAndSeek());
- *stream = streamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI8},
- { NULL, kpidShortName, VT_BSTR}
-};
-
-enum
-{
- kpidNumFats = kpidUserDefined
- // kpidOemName,
- // kpidVolName,
- // kpidFileSysType
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidFileSystem, VT_BSTR},
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidFreeSpace, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidVolumeName, VT_BSTR},
-
- { L"FATs", kpidNumFats, VT_UI4},
- { NULL, kpidSectorSize, VT_UI4},
- { NULL, kpidId, VT_UI4},
- // { L"OEM Name", kpidOemName, VT_BSTR},
- // { L"Volume Name", kpidVolName, VT_BSTR},
- // { L"File System Type", kpidFileSysType, VT_BSTR}
- // { NULL, kpidSectorsPerTrack, VT_UI4},
- // { NULL, kpidNumHeads, VT_UI4},
- // { NULL, kpidHiddenSectors, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_WITH_NAME
-
-static void FatTimeToProp(UInt32 dosTime, UInt32 ms10, NWindows::NCOM::CPropVariant &prop)
-{
- FILETIME localFileTime, utc;
- if (NWindows::NTime::DosTimeToFileTime(dosTime, localFileTime))
- if (LocalFileTimeToFileTime(&localFileTime, &utc))
- {
- UInt64 t64 = (((UInt64)utc.dwHighDateTime) << 32) + utc.dwLowDateTime;
- t64 += ms10 * 100000;
- utc.dwLowDateTime = (DWORD)t64;
- utc.dwHighDateTime = (DWORD)(t64 >> 32);
- prop = utc;
- }
-}
-
-/*
-static void StringToProp(const Byte *src, int size, NWindows::NCOM::CPropVariant &prop)
-{
- char dest[32];
- memcpy(dest, src, size);
- dest[size] = 0;
- prop = FatStringToUnicode(dest);
-}
-
-#define STRING_TO_PROP(s, p) StringToProp(s, sizeof(s), prop)
-*/
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidFileSystem:
- {
- wchar_t s[32] = { L'F', L'A', L'T' };
- ConvertUInt32ToString(Header.NumFatBits, s + 3);
- prop = s;
- break;
- }
- case kpidClusterSize: prop = Header.ClusterSize(); break;
- case kpidPhySize: prop = Header.GetPhySize(); break;
- case kpidFreeSpace: prop = (UInt64)NumFreeClusters << Header.ClusterSizeLog; break;
- case kpidHeadersSize: prop = GetHeadersSize(); break;
- case kpidMTime: if (VolItemDefined) FatTimeToProp(VolItem.MTime, 0, prop); break;
- case kpidVolumeName: if (VolItemDefined) prop = VolItem.GetVolName(); break;
- case kpidNumFats: if (Header.NumFats != 2) prop = Header.NumFats; break;
- case kpidSectorSize: prop = (UInt32)1 << Header.SectorSizeLog; break;
- // case kpidSectorsPerTrack: prop = Header.SectorsPerTrack; break;
- // case kpidNumHeads: prop = Header.NumHeads; break;
- // case kpidOemName: STRING_TO_PROP(Header.OemName, prop); break;
- case kpidId: if (Header.VolFieldsDefined) prop = Header.VolId; break;
- // case kpidVolName: if (Header.VolFieldsDefined) STRING_TO_PROP(Header.VolName, prop); break;
- // case kpidFileSysType: if (Header.VolFieldsDefined) STRING_TO_PROP(Header.FileSys, prop); break;
- // case kpidHiddenSectors: prop = Header.NumHiddenSectors; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = Items[index];
- switch(propID)
- {
- case kpidPath: prop = GetItemPath(index); break;
- case kpidShortName: prop = item.GetShortName(); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidMTime: FatTimeToProp(item.MTime, 0, prop); break;
- case kpidCTime: FatTimeToProp(item.CTime, item.CTime2, prop); break;
- case kpidATime: FatTimeToProp(((UInt32)item.ADate << 16), 0, prop); break;
- case kpidAttrib: prop = (UInt32)item.Attrib; break;
- case kpidSize: if (!item.IsDir()) prop = item.Size; break;
- case kpidPackSize: if (!item.IsDir()) prop = Header.GetFilePackSize(item.Size); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- {
- OpenCallback = callback;
- InStream = stream;
- HRESULT res;
- try
- {
- res = CDatabase::Open();
- if (res == S_OK)
- return S_OK;
- }
- catch(...)
- {
- Close();
- throw;
- }
- Close();
- return res;
- }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- ClearAndClose();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = Items.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- UInt64 totalSize = 0;
- for (i = 0; i < numItems; i++)
- {
- const CItem &item = Items[allFilesMode ? i : indices[i]];
- if (!item.IsDir())
- totalSize += item.Size;
- }
- RINOK(extractCallback->SetTotal(totalSize));
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = Items[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- totalPackSize += Header.GetFilePackSize(item.Size);
- totalSize += item.Size;
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init();
-
- int res = NExtract::NOperationResult::kDataError;
- CMyComPtr<ISequentialInStream> inStream;
- HRESULT hres = GetStream(index, &inStream);
- if (hres != S_FALSE)
- {
- RINOK(hres);
- if (inStream)
- {
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- if (copyCoderSpec->TotalSize == item.Size)
- res = NExtract::NOperationResult::kOK;
- }
- }
- outStreamSpec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = Items.Size();
- return S_OK;
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"FAT", L"fat img", 0, 0xDA, { 0x55, 0xAA }, 2, false, CreateArc, 0 };
-
-REGISTER_ARC(Fat)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/FlvHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/FlvHandler.cpp
deleted file mode 100644
index a22c29e30..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/FlvHandler.cpp
+++ /dev/null
@@ -1,544 +0,0 @@
-// FlvHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-// #include "Common/Defs.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#define GetBe24(p) ( \
- ((UInt32)((const Byte *)(p))[0] << 16) | \
- ((UInt32)((const Byte *)(p))[1] << 8) | \
- ((const Byte *)(p))[2] )
-
-#define Get16(p) GetBe16(p)
-#define Get24(p) GetBe24(p)
-#define Get32(p) GetBe32(p)
-
-namespace NArchive {
-namespace NFlv {
-
-static const UInt32 kFileSizeMax = (UInt32)1 << 30;
-static const int kNumChunksMax = (UInt32)1 << 23;
-
-const UInt32 kTagHeaderSize = 11;
-
-static const Byte kFlag_Video = 1;
-static const Byte kFlag_Audio = 4;
-
-static const Byte kType_Audio = 8;
-static const Byte kType_Video = 9;
-static const Byte kType_Meta = 18;
-static const int kNumTypes = 19;
-
-struct CItem
-{
- UInt32 Offset;
- UInt32 Size;
- // UInt32 Time;
- Byte Type;
-};
-
-struct CItem2
-{
- Byte Type;
- Byte SubType;
- Byte Props;
- bool SameSubTypes;
- int NumChunks;
- size_t Size;
-
- CReferenceBuf *BufSpec;
- CMyComPtr<IUnknown> RefBuf;
-
- bool IsAudio() const { return Type == kType_Audio; }
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- int _isRaw;
- CMyComPtr<IInStream> _stream;
- CObjectVector<CItem2> _items2;
- // CByteBuffer _metadata;
- HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback);
- AString GetComment();
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidNumBlocks, VT_UI4},
- { NULL, kpidComment, VT_BSTR}
-};
-
-/*
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidComment, VT_BSTR}
-};
-*/
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-static const char *g_AudioTypes[16] =
-{
- "pcm",
- "adpcm",
- "mp3",
- "pcm_le",
- "nellymoser16",
- "nellymoser8",
- "nellymoser",
- "g711a",
- "g711m",
- "audio9",
- "aac",
- "speex",
- "audio12",
- "audio13",
- "mp3",
- "audio15"
-};
-
-static const char *g_VideoTypes[16] =
-{
- "video0",
- "jpeg",
- "h263",
- "screen",
- "vp6",
- "vp6alpha",
- "screen2",
- "avc",
- "video8",
- "video9",
- "video10",
- "video11",
- "video12",
- "video13",
- "video14",
- "video15"
-};
-
-static const char *g_Rates[4] =
-{
- "5.5 kHz",
- "11 kHz",
- "22 kHz",
- "44 kHz"
-};
-
-static void MyStrCat(char *d, const char *s)
-{
- MyStringCopy(d + MyStringLen(d), s);
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- const CItem2 &item = _items2[index];
- switch(propID)
- {
- case kpidExtension:
- prop = _isRaw ?
- (item.IsAudio() ? g_AudioTypes[item.SubType] : g_VideoTypes[item.SubType]) :
- (item.IsAudio() ? "audio.flv" : "video.flv");
- break;
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)item.Size;
- break;
- case kpidNumBlocks: prop = (UInt32)item.NumChunks; break;
- case kpidComment:
- {
- char sz[64];
- MyStringCopy(sz, (item.IsAudio() ? g_AudioTypes[item.SubType] : g_VideoTypes[item.SubType]) );
- if (item.IsAudio())
- {
- MyStrCat(sz, " ");
- MyStrCat(sz, g_Rates[(item.Props >> 2) & 3]);
- MyStrCat(sz, (item.Props & 2) ? " 16-bit" : " 8-bit");
- MyStrCat(sz, (item.Props & 1) ? " stereo" : " mono");
- }
- prop = sz;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
-}
-
-/*
-AString CHandler::GetComment()
-{
- const Byte *p = _metadata;
- size_t size = _metadata.GetCapacity();
- AString res;
- if (size > 0)
- {
- p++;
- size--;
- for (;;)
- {
- if (size < 2)
- break;
- int len = Get16(p);
- p += 2;
- size -= 2;
- if (len == 0 || (size_t)len > size)
- break;
- {
- AString temp;
- char *sz = temp.GetBuffer(len);
- memcpy(sz, p, len);
- sz[len] = 0;
- temp.ReleaseBuffer();
- if (!res.IsEmpty())
- res += '\n';
- res += temp;
- }
- p += len;
- size -= len;
- if (size < 1)
- break;
- Byte type = *p++;
- size--;
- bool ok = false;
- switch(type)
- {
- case 0:
- {
- if (size < 8)
- break;
- ok = true;
- Byte reverse[8];
- for (int i = 0; i < 8; i++)
- {
- bool little_endian = 1;
- if (little_endian)
- reverse[i] = p[7 - i];
- else
- reverse[i] = p[i];
- }
- double d = *(double *)reverse;
- char temp[32];
- sprintf(temp, " = %.3f", d);
- res += temp;
- p += 8;
- size -= 8;
- break;
- }
- case 8:
- {
- if (size < 4)
- break;
- ok = true;
- // UInt32 numItems = Get32(p);
- p += 4;
- size -= 4;
- break;
- }
- }
- if (!ok)
- break;
- }
- }
- return res;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidComment: prop = GetComment(); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-*/
-
-HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback)
-{
- CRecordVector<CItem> items;
-
- const UInt32 kHeaderSize = 13;
- Byte header[kHeaderSize];
- RINOK(ReadStream_FALSE(stream, header, kHeaderSize));
- if (header[0] != 'F' ||
- header[1] != 'L' ||
- header[2] != 'V' ||
- header[3] != 1 ||
- (header[4] & 0xFA) != 0)
- return S_FALSE;
- UInt32 offset = Get32(header + 5);
- if (offset != 9 || Get32(header + 9) != 0)
- return S_FALSE;
- offset += 4;
-
- CByteBuffer inBuf;
- size_t fileSize;
- {
- UInt64 fileSize64;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize64));
- if (fileSize64 > kFileSizeMax)
- return S_FALSE;
-
- if (callback)
- RINOK(callback->SetTotal(NULL, &fileSize64))
-
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- fileSize = (size_t)fileSize64;
- inBuf.SetCapacity(fileSize);
- for (size_t pos = 0; pos < fileSize;)
- {
- UInt64 offset64 = pos;
- if (callback)
- RINOK(callback->SetCompleted(NULL, &offset64))
- size_t rem = MyMin(fileSize - pos, (size_t)(1 << 20));
- RINOK(ReadStream_FALSE(stream, inBuf + pos, rem));
- pos += rem;
- }
- }
-
- int lasts[kNumTypes];
- int i;
- for (i = 0; i < kNumTypes; i++)
- lasts[i] = -1;
-
- while (offset < fileSize)
- {
- CItem item;
- item.Offset = offset;
- const Byte *buf = inBuf + offset;
- offset += kTagHeaderSize;
- if (offset > fileSize)
- return S_FALSE;
-
- item.Type = buf[0];
- UInt32 size = Get24(buf + 1);
- if (size < 1)
- return S_FALSE;
- // item.Time = Get24(buf + 4);
- // item.Time |= (UInt32)buf[7] << 24;
- if (Get24(buf + 8) != 0) // streamID
- return S_FALSE;
-
- UInt32 curSize = kTagHeaderSize + size + 4;
- item.Size = curSize;
-
- offset += curSize - kTagHeaderSize;
- if (offset > fileSize)
- return S_FALSE;
-
- if (Get32(buf + kTagHeaderSize + size) != kTagHeaderSize + size)
- return S_FALSE;
-
- // printf("\noffset = %6X type = %2d time = %6d size = %6d", (UInt32)offset, item.Type, item.Time, item.Size);
-
- if (item.Type == kType_Meta)
- {
- // _metadata = item.Buf;
- }
- else
- {
- if (item.Type != kType_Audio && item.Type != kType_Video)
- return S_FALSE;
- if (items.Size() >= kNumChunksMax)
- return S_FALSE;
- Byte firstByte = buf[kTagHeaderSize];
- Byte subType, props;
- if (item.Type == kType_Audio)
- {
- subType = firstByte >> 4;
- props = firstByte & 0xF;
- }
- else
- {
- subType = firstByte & 0xF;
- props = firstByte >> 4;
- }
- int last = lasts[item.Type];
- if (last < 0)
- {
- CItem2 item2;
- item2.RefBuf = item2.BufSpec = new CReferenceBuf;
- item2.Size = curSize;
- item2.Type = item.Type;
- item2.SubType = subType;
- item2.Props = props;
- item2.NumChunks = 1;
- item2.SameSubTypes = true;
- lasts[item.Type] = _items2.Add(item2);
- }
- else
- {
- CItem2 &item2 = _items2[last];
- if (subType != item2.SubType)
- item2.SameSubTypes = false;
- item2.Size += curSize;
- item2.NumChunks++;
- }
- items.Add(item);
- }
- }
-
- _isRaw = (_items2.Size() == 1);
- for (i = 0; i < _items2.Size(); i++)
- {
- CItem2 &item2 = _items2[i];
- CByteBuffer &itemBuf = item2.BufSpec->Buf;
- if (_isRaw)
- {
- if (!item2.SameSubTypes)
- return S_FALSE;
- itemBuf.SetCapacity((size_t)item2.Size - (kTagHeaderSize + 4 + 1) * item2.NumChunks);
- item2.Size = 0;
- }
- else
- {
- itemBuf.SetCapacity(kHeaderSize + (size_t)item2.Size);
- memcpy(itemBuf, header, kHeaderSize);
- itemBuf[4] = item2.IsAudio() ? kFlag_Audio : kFlag_Video;
- item2.Size = kHeaderSize;
- }
- }
-
- for (i = 0; i < items.Size(); i++)
- {
- const CItem &item = items[i];
- CItem2 &item2 = _items2[lasts[item.Type]];
- size_t size = item.Size;
- const Byte *src = inBuf + item.Offset;
- if (_isRaw)
- {
- src += kTagHeaderSize + 1;
- size -= (kTagHeaderSize + 4 + 1);
- }
- memcpy(item2.BufSpec->Buf + item2.Size, src, size);
- item2.Size += size;
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- Close();
- HRESULT res;
- try
- {
- res = Open2(inStream, callback);
- if (res == S_OK)
- _stream = inStream;
- }
- catch(...) { res = S_FALSE; }
- if (res != S_OK)
- {
- Close();
- return S_FALSE;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _items2.Clear();
- // _metadata.SetCapacity(0);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items2.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items2.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items2[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- totalSize = 0;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CItem2 &item = _items2[index];
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- totalSize += item.Size;
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (outStream)
- {
- RINOK(WriteStream(outStream, item.BufSpec->Buf, item.BufSpec->Buf.GetCapacity()));
- }
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
- CBufInStream *streamSpec = new CBufInStream;
- CMyComPtr<ISequentialInStream> streamTemp = streamSpec;
- streamSpec->Init(_items2[index].BufSpec);
- *stream = streamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"FLV", L"flv", 0, 0xD6, { 'F', 'L', 'V' }, 3, false, CreateArc, 0 };
-
-REGISTER_ARC(Flv)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/GzHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/GzHandler.cpp
deleted file mode 100644
index 7b73bddc3..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/GzHandler.cpp
+++ /dev/null
@@ -1,698 +0,0 @@
-// GzHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-#include "../Compress/DeflateDecoder.h"
-#include "../Compress/DeflateEncoder.h"
-
-#include "Common/InStreamWithCRC.h"
-#include "Common/OutStreamWithCRC.h"
-
-#include "DeflateProps.h"
-
-#define Get32(p) GetUi32(p)
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NGz {
-
-static const UInt16 kSignature = 0x8B1F;
-
-namespace NHeader
-{
- namespace NFlags
- {
- const Byte kIsText = 1 << 0;
- const Byte kCrc = 1 << 1;
- const Byte kExtra = 1 << 2;
- const Byte kName = 1 << 3;
- const Byte kComment = 1 << 4;
- }
-
- namespace NExtraFlags
- {
- const Byte kMaximum = 2;
- const Byte kFastest = 4;
- }
-
- namespace NCompressionMethod
- {
- const Byte kDeflate = 8;
- }
-
- namespace NHostOS
- {
- enum EEnum
- {
- kFAT = 0,
- kAMIGA,
- kVMS,
- kUnix,
- kVM_CMS,
- kAtari,
- kHPFS,
- kMac,
- kZ_System,
- kCPM,
- kTOPS20,
- kNTFS,
- kQDOS,
- kAcorn,
- kVFAT,
- kMVS,
- kBeOS,
- kTandem,
-
- kUnknown = 255
- };
- }
-}
-
-static const char *kHostOSes[] =
-{
- "FAT",
- "AMIGA",
- "VMS",
- "Unix",
- "VM/CMS",
- "Atari",
- "HPFS",
- "Macintosh",
- "Z-System",
- "CP/M",
- "TOPS-20",
- "NTFS",
- "SMS/QDOS",
- "Acorn",
- "VFAT",
- "MVS",
- "BeOS",
- "Tandem",
- "OS/400",
- "OS/X"
-};
-
-static const char *kUnknownOS = "Unknown";
-
-class CItem
-{
- bool TestFlag(Byte flag) const { return (Flags & flag) != 0; }
-public:
- Byte Method;
- Byte Flags;
- Byte ExtraFlags;
- Byte HostOS;
- UInt32 Time;
- UInt32 Crc;
- UInt32 Size32;
-
- AString Name;
- AString Comment;
- // CByteBuffer Extra;
-
- // bool IsText() const { return TestFlag(NHeader::NFlags::kIsText); }
- bool HeaderCrcIsPresent() const { return TestFlag(NHeader::NFlags::kCrc); }
- bool ExtraFieldIsPresent() const { return TestFlag(NHeader::NFlags::kExtra); }
- bool NameIsPresent() const { return TestFlag(NHeader::NFlags::kName); }
- bool CommentIsPresent() const { return TestFlag(NHeader::NFlags::kComment); }
-
- void Clear()
- {
- Name.Empty();
- Comment.Empty();
- // Extra.SetCapacity(0);
- }
-
- HRESULT ReadHeader(NCompress::NDeflate::NDecoder::CCOMCoder *stream);
- HRESULT ReadFooter1(NCompress::NDeflate::NDecoder::CCOMCoder *stream);
- HRESULT ReadFooter2(ISequentialInStream *stream);
-
- HRESULT WriteHeader(ISequentialOutStream *stream);
- HRESULT WriteFooter(ISequentialOutStream *stream);
-};
-
-static HRESULT ReadBytes(NCompress::NDeflate::NDecoder::CCOMCoder *stream, Byte *data, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- data[i] = stream->ReadByte();
- return stream->InputEofError() ? S_FALSE : S_OK;
-}
-
-static HRESULT SkipBytes(NCompress::NDeflate::NDecoder::CCOMCoder *stream, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- stream->ReadByte();
- return stream->InputEofError() ? S_FALSE : S_OK;
-}
-
-static HRESULT ReadUInt16(NCompress::NDeflate::NDecoder::CCOMCoder *stream, UInt16 &value /* , UInt32 &crc */)
-{
- value = 0;
- for (int i = 0; i < 2; i++)
- {
- Byte b = stream->ReadByte();
- if (stream->InputEofError())
- return S_FALSE;
- // crc = CRC_UPDATE_BYTE(crc, b);
- value |= (UInt16(b) << (8 * i));
- }
- return S_OK;
-}
-
-static HRESULT ReadString(NCompress::NDeflate::NDecoder::CCOMCoder *stream, AString &s, UInt32 limit /* , UInt32 &crc */)
-{
- s.Empty();
- for (UInt32 i = 0; i < limit; i++)
- {
- Byte b = stream->ReadByte();
- if (stream->InputEofError())
- return S_FALSE;
- // crc = CRC_UPDATE_BYTE(crc, b);
- if (b == 0)
- return S_OK;
- s += (char)b;
- }
- return S_FALSE;
-}
-
-HRESULT CItem::ReadHeader(NCompress::NDeflate::NDecoder::CCOMCoder *stream)
-{
- Clear();
-
- // Header-CRC field had another meaning in old version of gzip!
- // UInt32 crc = CRC_INIT_VAL;
- Byte buf[10];
-
- RINOK(ReadBytes(stream, buf, 10));
-
- if (GetUi16(buf) != kSignature)
- return S_FALSE;
-
- Method = buf[2];
-
- if (Method != NHeader::NCompressionMethod::kDeflate)
- return S_FALSE;
-
- Flags = buf[3];
- Time = Get32(buf + 4);
- ExtraFlags = buf[8];
- HostOS = buf[9];
-
- // crc = CrcUpdate(crc, buf, 10);
-
- if (ExtraFieldIsPresent())
- {
- UInt16 extraSize;
- RINOK(ReadUInt16(stream, extraSize /* , crc */));
- RINOK(SkipBytes(stream, extraSize));
- // Extra.SetCapacity(extraSize);
- // RINOK(ReadStream_FALSE(stream, Extra, extraSize));
- // crc = CrcUpdate(crc, Extra, extraSize);
- }
- if (NameIsPresent())
- RINOK(ReadString(stream, Name, (1 << 10) /* , crc */));
- if (CommentIsPresent())
- RINOK(ReadString(stream, Comment, (1 << 16) /* , crc */));
-
- if (HeaderCrcIsPresent())
- {
- UInt16 headerCRC;
- // UInt32 dummy = 0;
- RINOK(ReadUInt16(stream, headerCRC /* , dummy */));
- /*
- if ((UInt16)CRC_GET_DIGEST(crc) != headerCRC)
- return S_FALSE;
- */
- }
- return stream->InputEofError() ? S_FALSE : S_OK;
-}
-
-HRESULT CItem::ReadFooter1(NCompress::NDeflate::NDecoder::CCOMCoder *stream)
-{
- Byte buf[8];
- RINOK(ReadBytes(stream, buf, 8));
- Crc = Get32(buf);
- Size32 = Get32(buf + 4);
- return stream->InputEofError() ? S_FALSE : S_OK;
-}
-
-HRESULT CItem::ReadFooter2(ISequentialInStream *stream)
-{
- Byte buf[8];
- RINOK(ReadStream_FALSE(stream, buf, 8));
- Crc = Get32(buf);
- Size32 = Get32(buf + 4);
- return S_OK;
-}
-
-HRESULT CItem::WriteHeader(ISequentialOutStream *stream)
-{
- Byte buf[10];
- SetUi16(buf, kSignature);
- buf[2] = Method;
- buf[3] = Flags & NHeader::NFlags::kName;
- // buf[3] |= NHeader::NFlags::kCrc;
- SetUi32(buf + 4, Time);
- buf[8] = ExtraFlags;
- buf[9] = HostOS;
- RINOK(WriteStream(stream, buf, 10));
- // crc = CrcUpdate(CRC_INIT_VAL, buf, 10);
- if (NameIsPresent())
- {
- // crc = CrcUpdate(crc, (const char *)Name, Name.Length() + 1);
- RINOK(WriteStream(stream, (const char *)Name, Name.Length() + 1));
- }
- // SetUi16(buf, (UInt16)CRC_GET_DIGEST(crc));
- // RINOK(WriteStream(stream, buf, 2));
- return S_OK;
-}
-
-HRESULT CItem::WriteFooter(ISequentialOutStream *stream)
-{
- Byte buf[8];
- SetUi32(buf, Crc);
- SetUi32(buf + 4, Size32);
- return WriteStream(stream, buf, 8);
-}
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public IOutArchive,
- public ISetProperties,
- public CMyUnknownImp
-{
- CItem _item;
- UInt64 _startPosition;
- UInt64 _headerSize;
- UInt64 _packSize;
- bool _packSizeDefined;
- CMyComPtr<IInStream> _stream;
- CMyComPtr<ICompressCoder> _decoder;
- NCompress::NDeflate::NDecoder::CCOMCoder *_decoderSpec;
-
- CDeflateProps _method;
-
-public:
- MY_UNKNOWN_IMP4(IInArchive, IArchiveOpenSeq, IOutArchive, ISetProperties)
- INTERFACE_IInArchive(;)
- INTERFACE_IOutArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
- STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProps);
-
- CHandler()
- {
- _decoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder;
- _decoder = _decoderSpec;
- }
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidCRC, VT_UI4}
- // { NULL, kpidComment, VT_BSTR}
-}
-;
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPath:
- if (_item.NameIsPresent())
- prop = MultiByteToUnicodeString(_item.Name, CP_ACP);
- break;
- // case kpidComment: if (_item.CommentIsPresent()) prop = MultiByteToUnicodeString(_item.Comment, CP_ACP); break;
- case kpidMTime:
- {
- if (_item.Time != 0)
- {
- FILETIME utc;
- NTime::UnixTimeToFileTime(_item.Time, utc);
- prop = utc;
- }
- break;
- }
- case kpidSize: if (_stream) prop = (UInt64)_item.Size32; break;
- case kpidPackSize: if (_packSizeDefined) prop = _packSize; break;
- case kpidHostOS: prop = (_item.HostOS < sizeof(kHostOSes) / sizeof(kHostOSes[0])) ?
- kHostOSes[_item.HostOS] : kUnknownOS; break;
- case kpidCRC: if (_stream) prop = _item.Crc; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *)
-{
- COM_TRY_BEGIN
- HRESULT res;
- try
- {
- RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_startPosition));
- res = OpenSeq(stream);
- if (res == S_OK)
- {
- UInt64 endPos;
- res = stream->Seek(-8, STREAM_SEEK_END, &endPos);
- _packSize = endPos + 8 - _startPosition;
- _packSizeDefined = true;
- if (res == S_OK)
- {
- res = _item.ReadFooter2(stream);
- _stream = stream;
- }
- }
- }
- catch(...) { res = S_FALSE; }
- if (res != S_OK)
- Close();
- return res;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- COM_TRY_BEGIN
- HRESULT res;
- try
- {
- Close();
- _decoderSpec->SetInStream(stream);
- _decoderSpec->InitInStream(true);
- res = _item.ReadHeader(_decoderSpec);
- _headerSize = _decoderSpec->GetInputProcessedSize();
- }
- catch(...) { res = S_FALSE; }
- if (res != S_OK)
- Close();
- return res;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _packSizeDefined = false;
- _stream.Release();
- _decoderSpec->ReleaseInStream();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- if (_stream)
- extractCallback->SetTotal(_packSize);
- UInt64 currentTotalPacked = 0;
- RINOK(extractCallback->SetCompleted(&currentTotalPacked));
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
- realOutStream.Release();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, true);
-
- if (_stream)
- {
- RINOK(_stream->Seek(_startPosition, STREAM_SEEK_SET, NULL));
- _decoderSpec->InitInStream(true);
- }
- bool firstItem = true;
- Int32 opRes;
- for (;;)
- {
- lps->InSize = _packSize = _decoderSpec->GetInputProcessedSize();
- _packSizeDefined = true;
- lps->OutSize = outStreamSpec->GetSize();
- RINOK(lps->SetCur());
-
- CItem item;
- if (!firstItem || _stream)
- {
- HRESULT result = item.ReadHeader(_decoderSpec);
- if (result != S_OK)
- {
- if (result != S_FALSE)
- return result;
- opRes = firstItem ?
- NExtract::NOperationResult::kDataError :
- NExtract::NOperationResult::kOK;
- break;
- }
- }
- firstItem = false;
-
- UInt64 startOffset = outStreamSpec->GetSize();
- outStreamSpec->InitCRC();
-
- HRESULT result = _decoderSpec->CodeResume(outStream, NULL, progress);
- if (result != S_OK)
- {
- if (result != S_FALSE)
- return result;
- opRes = NExtract::NOperationResult::kDataError;
- break;
- }
-
- _decoderSpec->AlignToByte();
- if (item.ReadFooter1(_decoderSpec) != S_OK)
- {
- opRes = NExtract::NOperationResult::kDataError;
- break;
- }
- if (item.Crc != outStreamSpec->GetCRC() ||
- item.Size32 != (UInt32)(outStreamSpec->GetSize() - startOffset))
- {
- opRes = NExtract::NOperationResult::kCRCError;
- break;
- }
- }
- outStream.Release();
- return extractCallback->SetOperationResult(opRes);
- COM_TRY_END
-}
-
-static const Byte kHostOS =
- #ifdef _WIN32
- NHeader::NHostOS::kFAT;
- #else
- NHeader::NHostOS::kUnix;
- #endif
-
-static HRESULT UpdateArchive(
- ISequentialOutStream *outStream,
- UInt64 unpackSize,
- const CItem &newItem,
- CDeflateProps &deflateProps,
- IArchiveUpdateCallback *updateCallback)
-{
- UInt64 complexity = 0;
- RINOK(updateCallback->SetTotal(unpackSize));
- RINOK(updateCallback->SetCompleted(&complexity));
-
- CMyComPtr<ISequentialInStream> fileInStream;
-
- RINOK(updateCallback->GetStream(0, &fileInStream));
-
- CSequentialInStreamWithCRC *inStreamSpec = new CSequentialInStreamWithCRC;
- CMyComPtr<ISequentialInStream> crcStream(inStreamSpec);
- inStreamSpec->SetStream(fileInStream);
- inStreamSpec->Init();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(updateCallback, true);
-
- CItem item = newItem;
- item.Method = NHeader::NCompressionMethod::kDeflate;
- item.ExtraFlags = deflateProps.IsMaximum() ?
- NHeader::NExtraFlags::kMaximum :
- NHeader::NExtraFlags::kFastest;
-
- item.HostOS = kHostOS;
-
- RINOK(item.WriteHeader(outStream));
-
- NCompress::NDeflate::NEncoder::CCOMCoder *deflateEncoderSpec = new NCompress::NDeflate::NEncoder::CCOMCoder;
- CMyComPtr<ICompressCoder> deflateEncoder = deflateEncoderSpec;
- RINOK(deflateProps.SetCoderProperties(deflateEncoderSpec));
- RINOK(deflateEncoder->Code(crcStream, outStream, NULL, NULL, progress));
-
- item.Crc = inStreamSpec->GetCRC();
- item.Size32 = (UInt32)inStreamSpec->GetSize();
- RINOK(item.WriteFooter(outStream));
- return updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK);
-}
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *timeType)
-{
- *timeType = NFileTimeType::kUnix;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *updateCallback)
-{
- if (numItems != 1)
- return E_INVALIDARG;
-
- Int32 newData, newProps;
- UInt32 indexInArchive;
- if (!updateCallback)
- return E_FAIL;
- RINOK(updateCallback->GetUpdateItemInfo(0, &newData, &newProps, &indexInArchive));
-
- CItem newItem = _item;
- newItem.ExtraFlags = 0;
- newItem.Flags = 0;
- if (IntToBool(newProps))
- {
- {
- FILETIME utcTime;
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidMTime, &prop));
- if (prop.vt != VT_FILETIME)
- return E_INVALIDARG;
- utcTime = prop.filetime;
- if (!NTime::FileTimeToUnixTime(utcTime, newItem.Time))
- return E_INVALIDARG;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidPath, &prop));
- if (prop.vt == VT_BSTR)
- {
- UString name = prop.bstrVal;
- int dirDelimiterPos = name.ReverseFind(CHAR_PATH_SEPARATOR);
- if (dirDelimiterPos >= 0)
- name = name.Mid(dirDelimiterPos + 1);
- newItem.Name = UnicodeStringToMultiByte(name, CP_ACP);
- if (!newItem.Name.IsEmpty())
- newItem.Flags |= NHeader::NFlags::kName;
- }
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidIsDir, &prop));
- if (prop.vt == VT_BOOL)
- {
- if (prop.boolVal != VARIANT_FALSE)
- return E_INVALIDARG;
- }
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- }
- }
-
- if (IntToBool(newData))
- {
- UInt64 size;
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- size = prop.uhVal.QuadPart;
- }
-
- return UpdateArchive(outStream, size, newItem, _method, updateCallback);
- }
-
- if (indexInArchive != 0)
- return E_INVALIDARG;
-
- if (!_stream)
- return E_NOTIMPL;
-
- UInt64 offset = _startPosition;
- if (IntToBool(newProps))
- {
- newItem.WriteHeader(outStream);
- offset += _headerSize;
- }
- RINOK(_stream->Seek(offset, STREAM_SEEK_SET, NULL));
- return NCompress::CopyStream(_stream, outStream, NULL);
-}
-
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps)
-{
- return _method.SetProperties(names, values, numProps);
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new CHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
- { L"gzip", L"gz gzip tgz tpz", L"* * .tar .tar", 0xEF, { 0x1F, 0x8B, 8 }, 3, true, CreateArc, CreateArcOut };
-
-REGISTER_ARC(GZip)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsHandler.cpp
deleted file mode 100644
index f226458d4..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsHandler.cpp
+++ /dev/null
@@ -1,243 +0,0 @@
-// HfsHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Windows/PropVariant.h"
-#include "../../Common/StreamUtils.h"
-#include "HfsHandler.h"
-
-namespace NArchive {
-namespace NHfs {
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME}
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidFreeSpace, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidMTime, VT_FILETIME}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-static void HfsTimeToProp(UInt32 hfsTime, NWindows::NCOM::CPropVariant &prop)
-{
- FILETIME ft;
- HfsTimeToFileTime(hfsTime, ft);
- prop = ft;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMethod: prop = _db.Header.IsHfsX() ? L"HFSX" : L"HFS+"; break;
- case kpidClusterSize: prop = (UInt32)1 << _db.Header.BlockSizeLog; break;
- case kpidFreeSpace: prop = (UInt64)_db.Header.NumFreeBlocks << _db.Header.BlockSizeLog; break;
- case kpidMTime: HfsTimeToProp(_db.Header.MTime, prop); break;
- case kpidCTime:
- {
- FILETIME localFt, ft;
- HfsTimeToFileTime(_db.Header.CTime, localFt);
- if (LocalFileTimeToFileTime(&localFt, &ft))
- prop = ft;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _db.Items[index];
- switch(propID)
- {
- case kpidPath: prop = _db.GetItemPath(index); break;
- case kpidIsDir: prop = item.IsDir(); break;
-
- case kpidCTime: HfsTimeToProp(item.CTime, prop); break;
- case kpidMTime: HfsTimeToProp(item.MTime, prop); break;
- case kpidATime: HfsTimeToProp(item.ATime, prop); break;
-
- case kpidPackSize: if (!item.IsDir()) prop = (UInt64)item.NumBlocks << _db.Header.BlockSizeLog; break;
- case kpidSize: if (!item.IsDir()) prop = item.Size; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CProgressImp: public CProgressVirt
-{
- CMyComPtr<IArchiveOpenCallback> _callback;
-public:
- HRESULT SetTotal(UInt64 numFiles);
- HRESULT SetCompleted(UInt64 numFiles);
- CProgressImp(IArchiveOpenCallback *callback): _callback(callback) {}
-};
-
-HRESULT CProgressImp::SetTotal(UInt64 numFiles)
-{
- if (_callback)
- return _callback->SetTotal(&numFiles, NULL);
- return S_OK;
-}
-
-HRESULT CProgressImp::SetCompleted(UInt64 numFiles)
-{
- if (_callback)
- return _callback->SetCompleted(&numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- Close();
- try
- {
- CProgressImp progressImp(callback);
- HRESULT res = _db.Open(inStream, &progressImp);
- if (res == E_ABORT)
- return res;
- if (res != S_OK)
- return S_FALSE;
- _stream = inStream;
- }
- catch(...) { return S_FALSE; }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _db.Clear();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _db.Items.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- UInt64 totalSize = 0;
- for (i = 0; i < numItems; i++)
- {
- const CItem &item = _db.Items[allFilesMode ? i : indices[i]];
- if (!item.IsDir())
- totalSize += item.Size;
- }
- RINOK(extractCallback->SetTotal(totalSize));
-
- UInt64 currentTotalSize = 0, currentItemSize = 0;
-
- CByteBuffer buf;
- const UInt32 kBufSize = (1 << 16);
- buf.SetCapacity(kBufSize);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- RINOK(extractCallback->SetCompleted(&currentTotalSize));
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _db.Items[index];
- currentItemSize = 0;
- if (!item.IsDir())
- currentItemSize = item.Size;
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- UInt64 pos = 0;
- int res = NExtract::NOperationResult::kOK;
- int i;
- for (i = 0; i < item.Extents.Size(); i++)
- {
- if (item.Size == pos)
- break;
- if (res != NExtract::NOperationResult::kOK)
- break;
- const CExtent &e = item.Extents[i];
- RINOK(_stream->Seek((UInt64)e.Pos << _db.Header.BlockSizeLog, STREAM_SEEK_SET, NULL));
- UInt64 extentSize = (UInt64)e.NumBlocks << _db.Header.BlockSizeLog;
- for (;;)
- {
- if (extentSize == 0)
- break;
- UInt64 rem = item.Size - pos;
- if (rem == 0)
- {
- if (extentSize >= (UInt64)((UInt32)1 << _db.Header.BlockSizeLog))
- res = NExtract::NOperationResult::kDataError;
- break;
- }
- UInt32 curSize = kBufSize;
- if (curSize > rem)
- curSize = (UInt32)rem;
- if (curSize > extentSize)
- curSize = (UInt32)extentSize;
- RINOK(ReadStream_FALSE(_stream, buf, curSize));
- if (realOutStream)
- {
- RINOK(WriteStream(realOutStream, buf, curSize));
- }
- pos += curSize;
- extentSize -= curSize;
- UInt64 processed = currentTotalSize + pos;
- RINOK(extractCallback->SetCompleted(&processed));
- }
- }
- if (i != item.Extents.Size() || item.Size != pos)
- res = NExtract::NOperationResult::kDataError;
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _db.Items.Size();
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsHandler.h b/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsHandler.h
deleted file mode 100644
index 269af218e..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsHandler.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// HfsHandler.h
-
-#ifndef __ARCHIVE_HFS_HANDLER_H
-#define __ARCHIVE_HFS_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-#include "HfsIn.h"
-
-namespace NArchive {
-namespace NHfs {
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CDatabase _db;
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsIn.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsIn.cpp
deleted file mode 100644
index 8391dd936..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsIn.cpp
+++ /dev/null
@@ -1,480 +0,0 @@
-// HfsIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/StreamUtils.h"
-#include "Common/IntToString.h"
-
-#include "HfsIn.h"
-
-#include "../../../../C/CpuArch.h"
-
-#define Get16(p) GetBe16(p)
-#define Get32(p) GetBe32(p)
-#define Get64(p) GetBe64(p)
-
-namespace NArchive {
-namespace NHfs {
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareIdToIndex(const CIdIndexPair *p1, const CIdIndexPair *p2, void * /* param */)
-{
- RINOZ(MyCompare(p1->ID, p2->ID));
- return MyCompare(p1->Index, p2->Index);
-}
-
-bool operator< (const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID < a2.ID); }
-bool operator> (const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID > a2.ID); }
-bool operator==(const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID == a2.ID); }
-bool operator!=(const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID != a2.ID); }
-
-static UString GetSpecName(const UString &name, UInt32 /* id */)
-{
- UString name2 = name;
- name2.Trim();
- if (name2.IsEmpty())
- {
- /*
- wchar_t s[32];
- ConvertUInt64ToString(id, s);
- return L"[" + (UString)s + L"]";
- */
- return L"[]";
- }
- return name;
-}
-
-UString CDatabase::GetItemPath(int index) const
-{
- const CItem *item = &Items[index];
- UString name = GetSpecName(item->Name, item->ID);
-
- for (int i = 0; i < 1000; i++)
- {
- if (item->ParentID < 16 && item->ParentID != 2)
- {
- if (item->ParentID != 1)
- break;
- return name;
- }
- CIdIndexPair pair;
- pair.ID = item->ParentID;
- pair.Index = 0;
- int indexInMap = IdToIndexMap.FindInSorted(pair);
- if (indexInMap < 0)
- break;
- item = &Items[IdToIndexMap[indexInMap].Index];
- name = GetSpecName(item->Name, item->ID) + WCHAR_PATH_SEPARATOR + name;
- }
- return (UString)L"Unknown" + WCHAR_PATH_SEPARATOR + name;
-}
-
-void CFork::Parse(const Byte *p)
-{
- Size = Get64(p);
- // ClumpSize = Get32(p + 8);
- NumBlocks = Get32(p + 0xC);
- for (int i = 0; i < 8; i++)
- {
- CExtent &e = Extents[i];
- e.Pos = Get32(p + 0x10 + i * 8);
- e.NumBlocks = Get32(p + 0x10 + i * 8 + 4);
- }
-}
-
-static HRESULT ReadExtent(int blockSizeLog, IInStream *inStream, Byte *buf, const CExtent &e)
-{
- RINOK(inStream->Seek((UInt64)e.Pos << blockSizeLog, STREAM_SEEK_SET, NULL));
- return ReadStream_FALSE(inStream, buf, (size_t)e.NumBlocks << blockSizeLog);
-}
-
-HRESULT CDatabase::ReadFile(const CFork &fork, CByteBuffer &buf, IInStream *inStream)
-{
- if (fork.NumBlocks >= Header.NumBlocks)
- return S_FALSE;
- size_t totalSize = (size_t)fork.NumBlocks << Header.BlockSizeLog;
- if ((totalSize >> Header.BlockSizeLog) != fork.NumBlocks)
- return S_FALSE;
- buf.SetCapacity(totalSize);
- UInt32 curBlock = 0;
- for (int i = 0; i < 8; i++)
- {
- if (curBlock >= fork.NumBlocks)
- break;
- const CExtent &e = fork.Extents[i];
- if (fork.NumBlocks - curBlock < e.NumBlocks || e.Pos >= Header.NumBlocks)
- return S_FALSE;
- RINOK(ReadExtent(Header.BlockSizeLog, inStream,
- (Byte *)buf + ((size_t)curBlock << Header.BlockSizeLog), e));
- curBlock += e.NumBlocks;
- }
- return S_OK;
-}
-
-struct CNodeDescriptor
-{
- UInt32 fLink;
- UInt32 bLink;
- Byte Kind;
- Byte Height;
- UInt16 NumRecords;
- // UInt16 Reserved;
- void Parse(const Byte *p);
-};
-
-void CNodeDescriptor::Parse(const Byte *p)
-{
- fLink = Get32(p);
- bLink = Get32(p + 4);
- Kind = p[8];
- Height = p[9];
- NumRecords = Get16(p + 10);
-}
-
-struct CHeaderRec
-{
- // UInt16 TreeDepth;
- // UInt32 RootNode;
- // UInt32 LeafRecords;
- UInt32 FirstLeafNode;
- // UInt32 LastLeafNode;
- int NodeSizeLog;
- // UInt16 MaxKeyLength;
- UInt32 TotalNodes;
- // UInt32 FreeNodes;
- // UInt16 Reserved1;
- // UInt32 ClumpSize;
- // Byte BtreeType;
- // Byte KeyCompareType;
- // UInt32 Attributes;
- // UInt32 Reserved3[16];
-
- HRESULT Parse(const Byte *p);
-};
-
-HRESULT CHeaderRec::Parse(const Byte *p)
-{
- // TreeDepth = Get16(p);
- // RootNode = Get32(p + 2);
- // LeafRecords = Get32(p + 6);
- FirstLeafNode = Get32(p + 0xA);
- // LastLeafNode = Get32(p + 0xE);
- UInt32 nodeSize = Get16(p + 0x12);
-
- int i;
- for (i = 9; ((UInt32)1 << i) != nodeSize; i++)
- if (i == 16)
- return S_FALSE;
- NodeSizeLog = i;
-
- // MaxKeyLength = Get16(p + 0x14);
- TotalNodes = Get32(p + 0x16);
- // FreeNodes = Get32(p + 0x1A);
- // Reserved1 = Get16(p + 0x1E);
- // ClumpSize = Get32(p + 0x20);
- // BtreeType = p[0x24];
- // KeyCompareType = p[0x25];
- // Attributes = Get32(p + 0x26);
- /*
- for (int i = 0; i < 16; i++)
- Reserved3[i] = Get32(p + 0x2A + i * 4);
- */
- return S_OK;
-}
-
-
-enum ENodeType
-{
- NODE_TYPE_LEAF = 0xFF,
- NODE_TYPE_INDEX = 0,
- NODE_TYPE_HEADER = 1,
- NODE_TYPE_MODE = 2
-};
-
-HRESULT CDatabase::LoadExtentFile(IInStream *inStream)
-{
- // FileExtents.Clear();
- // ResExtents.Clear();
-
- CByteBuffer extents;
- RINOK(ReadFile(Header.ExtentsFile, extents, inStream));
-
- const Byte *p = (const Byte *)extents;
-
- // CNodeDescriptor nodeDesc;
- // nodeDesc.Parse(p);
- CHeaderRec hr;
- RINOK(hr.Parse(p + 14));
-
- UInt32 node = hr.FirstLeafNode;
- if (node != 0)
- return S_FALSE;
- /*
- while (node != 0)
- {
- size_t nodeOffset = node * hr.NodeSize;
- if ((node + 1)* hr.NodeSize > CatalogBuf.GetCapacity())
- return S_FALSE;
- CNodeDescriptor desc;
- desc.Parse(p + nodeOffset);
- if (desc.Kind != NODE_TYPE_LEAF)
- return S_FALSE;
- UInt32 ptr = hr.NodeSize;
- for (int i = 0; i < desc.NumRecords; i++)
- {
- UInt32 offs = Get16(p + nodeOffset + hr.NodeSize - (i + 1) * 2);
- UInt32 offsNext = Get16(p + nodeOffset + hr.NodeSize - (i + 2) * 2);
-
- const Byte *r = p + nodeOffset + offs;
- int keyLength = Get16(r);
- Byte forkType = r[2];
- UInt32 id = Get16(r + 4);
- UInt32 startBlock = Get16(r + 4);
- CObjectVector<CIdExtents> *extents = (forkType == 0) ? &FileExtents : &ResExtents;
- if (extents->Size() == 0)
- extents->Add(CIdExtents());
- else
- {
- CIdExtents &e = extents->Back();
- if (e.ID != id)
- {
- if (e.ID > id)
- return S_FALSE;
- extents->Add(CIdExtents());
- }
- }
- CIdExtents &e = extents->Back();
- for (UInt32 k = offs + 10 + 2; k + 8 <= offsNext; k += 8)
- {
- CExtent ee;
- ee.Pos = Get32(p + nodeOffset + k);
- ee.NumBlocks = Get32(p + nodeOffset + k * 4);
- e.Extents.Add(ee);
- }
- }
- node = desc.fLink;
- }
- */
- return S_OK;
-}
-
-
-HRESULT CDatabase::LoadCatalog(IInStream *inStream, CProgressVirt *progress)
-{
- Items.Clear();
- IdToIndexMap.ClearAndFree();
-
- CByteBuffer catalogBuf;
- RINOK(ReadFile(Header.CatalogFile, catalogBuf, inStream));
- const Byte *p = (const Byte *)catalogBuf;
-
- // CNodeDescriptor nodeDesc;
- // nodeDesc.Parse(p);
- CHeaderRec hr;
- hr.Parse(p + 14);
-
- // CaseSensetive = (Header.IsHfsX() && hr.KeyCompareType == 0xBC);
-
- if ((catalogBuf.GetCapacity() >> hr.NodeSizeLog) < hr.TotalNodes)
- return S_FALSE;
-
- CByteBuffer usedBuf;
- usedBuf.SetCapacity(hr.TotalNodes);
- for (UInt32 i = 0; i < hr.TotalNodes; i++)
- usedBuf[i] = 0;
-
- UInt32 node = hr.FirstLeafNode;
- while (node != 0)
- {
- if (node >= hr.TotalNodes)
- return S_FALSE;
- if (usedBuf[node])
- return S_FALSE;
- usedBuf[node] = 1;
- size_t nodeOffset = (size_t)node << hr.NodeSizeLog;
- CNodeDescriptor desc;
- desc.Parse(p + nodeOffset);
- if (desc.Kind != NODE_TYPE_LEAF)
- return S_FALSE;
- for (int i = 0; i < desc.NumRecords; i++)
- {
- UInt32 nodeSize = (1 << hr.NodeSizeLog);
- UInt32 offs = Get16(p + nodeOffset + nodeSize - (i + 1) * 2);
- UInt32 offsNext = Get16(p + nodeOffset + nodeSize - (i + 2) * 2);
- UInt32 recSize = offsNext - offs;
- if (offsNext >= nodeSize || offsNext < offs || recSize < 6)
- return S_FALSE;
-
- CItem item;
-
- const Byte *r = p + nodeOffset + offs;
- UInt32 keyLength = Get16(r);
- item.ParentID = Get32(r + 2);
- UString name;
- if (keyLength < 6 || (keyLength & 1) != 0 || keyLength + 2 > recSize)
- return S_FALSE;
- r += 6;
- recSize -= 6;
- keyLength -= 6;
-
- int nameLength = Get16(r);
- if (nameLength * 2 != (int)keyLength)
- return S_FALSE;
- r += 2;
- recSize -= 2;
-
- wchar_t *pp = name.GetBuffer(nameLength + 1);
-
- int j;
- for (j = 0; j < nameLength; j++)
- pp[j] = ((wchar_t)r[j * 2] << 8) | r[j * 2 + 1];
- pp[j] = 0;
- name.ReleaseBuffer();
- r += j * 2;
- recSize -= j * 2;
-
- if (recSize < 2)
- return S_FALSE;
- item.Type = Get16(r);
-
- if (item.Type != RECORD_TYPE_FOLDER && item.Type != RECORD_TYPE_FILE)
- continue;
- if (recSize < 0x58)
- return S_FALSE;
-
- // item.Flags = Get16(r + 2);
- // item.Valence = Get32(r + 4);
- item.ID = Get32(r + 8);
- item.CTime = Get32(r + 0xC);
- item.MTime = Get32(r + 0x10);
- // item.AttrMTime = Get32(r + 0x14);
- item.ATime = Get32(r + 0x18);
- // item.BackupDate = Get32(r + 0x1C);
-
- /*
- item.OwnerID = Get32(r + 0x20);
- item.GroupID = Get32(r + 0x24);
- item.AdminFlags = r[0x28];
- item.OwnerFlags = r[0x29];
- item.FileMode = Get16(r + 0x2A);
- item.special.iNodeNum = Get16(r + 0x2C);
- */
-
- item.Name = name;
-
- if (item.IsDir())
- {
- CIdIndexPair pair;
- pair.ID = item.ID;
- pair.Index = Items.Size();
- IdToIndexMap.Add(pair);
- }
- else
- {
- CFork fd;
- recSize -= 0x58;
- r += 0x58;
- if (recSize < 0x50 * 2)
- return S_FALSE;
- fd.Parse(r);
- item.Size = fd.Size;
- item.NumBlocks = fd.NumBlocks;
- UInt32 curBlock = 0;
- for (int j = 0; j < 8; j++)
- {
- if (curBlock >= fd.NumBlocks)
- break;
- const CExtent &e = fd.Extents[j];
- item.Extents.Add(e);
- curBlock += e.NumBlocks;
- }
- }
- Items.Add(item);
- if (progress && Items.Size() % 100 == 0)
- {
- RINOK(progress->SetCompleted(Items.Size()));
- }
- }
- node = desc.fLink;
- }
- IdToIndexMap.Sort(CompareIdToIndex, NULL);
- return S_OK;
-}
-
-HRESULT CDatabase::Open(IInStream *inStream, CProgressVirt *progress)
-{
- static const UInt32 kHeaderSize = 1024 + 512;
- Byte buf[kHeaderSize];
- RINOK(ReadStream_FALSE(inStream, buf, kHeaderSize));
- int i;
- for (i = 0; i < 1024; i++)
- if (buf[i] != 0)
- return S_FALSE;
- const Byte *p = buf + 1024;
- CVolHeader &h = Header;
-
- h.Header[0] = p[0];
- h.Header[1] = p[1];
- if (p[0] != 'H' || (p[1] != '+' && p[1] != 'X'))
- return S_FALSE;
- h.Version = Get16(p + 2);
- if (h.Version < 4 || h.Version > 5)
- return S_FALSE;
-
- // h.Attr = Get32(p + 4);
- // h.LastMountedVersion = Get32(p + 8);
- // h.JournalInfoBlock = Get32(p + 0xC);
-
- h.CTime = Get32(p + 0x10);
- h.MTime = Get32(p + 0x14);
- // h.BackupTime = Get32(p + 0x18);
- // h.CheckedTime = Get32(p + 0x1C);
-
- // h.NumFiles = Get32(p + 0x20);
- // h.NumFolders = Get32(p + 0x24);
-
- UInt32 numFiles = Get32(p + 0x20);
- UInt32 numFolders = Get32(p + 0x24);;
- if (progress)
- {
- RINOK(progress->SetTotal(numFolders + numFiles));
- }
-
- UInt32 blockSize = Get32(p + 0x28);
-
- for (i = 9; ((UInt32)1 << i) != blockSize; i++)
- if (i == 31)
- return S_FALSE;
- h.BlockSizeLog = i;
-
- h.NumBlocks = Get32(p + 0x2C);
- h.NumFreeBlocks = Get32(p + 0x30);
-
- /*
- h.WriteCount = Get32(p + 0x44);
- for (i = 0; i < 6; i++)
- h.FinderInfo[i] = Get32(p + 0x50 + i * 4);
- h.VolID = Get64(p + 0x68);
- */
-
- UInt64 endPos;
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPos));
- if ((endPos >> h.BlockSizeLog) < h.NumBlocks)
- return S_FALSE;
-
- // h.AllocationFile.Parse(p + 0x70 + 0x50 * 0);
- h.ExtentsFile.Parse( p + 0x70 + 0x50 * 1);
- h.CatalogFile.Parse( p + 0x70 + 0x50 * 2);
- // h.AttributesFile.Parse(p + 0x70 + 0x50 * 3);
- // h.StartupFile.Parse( p + 0x70 + 0x50 * 4);
-
- RINOK(LoadExtentFile(inStream));
- RINOK(LoadCatalog(inStream, progress));
-
- // if (Header.NumFiles + Header.NumFolders != (UInt32)Items.Size()) return S_OK;
-
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsIn.h b/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsIn.h
deleted file mode 100644
index c19539057..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsIn.h
+++ /dev/null
@@ -1,154 +0,0 @@
-// HfsIn.h
-
-#ifndef __ARCHIVE_HFS_IN_H
-#define __ARCHIVE_HFS_IN_H
-
-#include "Common/MyString.h"
-#include "Common/Buffer.h"
-
-namespace NArchive {
-namespace NHfs {
-
-struct CExtent
-{
- UInt32 Pos;
- UInt32 NumBlocks;
-};
-
-struct CFork
-{
- UInt64 Size;
- // UInt32 ClumpSize;
- UInt32 NumBlocks;
- CExtent Extents[8];
- void Parse(const Byte *p);
-};
-
-struct CVolHeader
-{
- Byte Header[2];
- UInt16 Version;
- // UInt32 Attr;
- // UInt32 LastMountedVersion;
- // UInt32 JournalInfoBlock;
-
- UInt32 CTime;
- UInt32 MTime;
- // UInt32 BackupTime;
- // UInt32 CheckedTime;
-
- // UInt32 NumFiles;
- // UInt32 NumFolders;
- int BlockSizeLog;
- UInt32 NumBlocks;
- UInt32 NumFreeBlocks;
-
- // UInt32 WriteCount;
- // UInt32 FinderInfo[8];
- // UInt64 VolID;
-
- // CFork AllocationFile;
- CFork ExtentsFile;
- CFork CatalogFile;
- // CFork AttributesFile;
- // CFork StartupFile;
-
- bool IsHfsX() const { return Version > 4; }
-};
-
-inline void HfsTimeToFileTime(UInt32 hfsTime, FILETIME &ft)
-{
- UInt64 v = ((UInt64)3600 * 24 * (365 * 303 + 24 * 3) + hfsTime) * 10000000;
- ft.dwLowDateTime = (DWORD)v;
- ft.dwHighDateTime = (DWORD)(v >> 32);
-}
-
-enum ERecordType
-{
- RECORD_TYPE_FOLDER = 1,
- RECORD_TYPE_FILE = 2,
- RECORD_TYPE_FOLDER_THREAD = 3,
- RECORD_TYPE_FILE_THREAD = 4
-};
-
-struct CItem
-{
- UString Name;
-
- UInt32 ParentID;
-
- UInt16 Type;
- // UInt16 Flags;
- // UInt32 Valence;
- UInt32 ID;
- UInt32 CTime;
- UInt32 MTime;
- // UInt32 AttrMTime;
- UInt32 ATime;
- // UInt32 BackupDate;
-
- /*
- UInt32 OwnerID;
- UInt32 GroupID;
- Byte AdminFlags;
- Byte OwnerFlags;
- UInt16 FileMode;
- union
- {
- UInt32 iNodeNum;
- UInt32 LinkCount;
- UInt32 RawDevice;
- } special;
- */
-
- UInt64 Size;
- UInt32 NumBlocks;
- CRecordVector<CExtent> Extents;
-
- bool IsDir() const { return Type == RECORD_TYPE_FOLDER; }
- CItem(): Size(0), NumBlocks(0) {}
-};
-
-struct CIdIndexPair
-{
- UInt32 ID;
- int Index;
-};
-
-struct CProgressVirt
-{
- virtual HRESULT SetTotal(UInt64 numFiles) PURE;
- virtual HRESULT SetCompleted(UInt64 numFiles) PURE;
-};
-
-class CDatabase
-{
- // CObjectVector<CIdExtents> FileExtents;
- // CObjectVector<CIdExtents> ResExtents;
- CRecordVector<CIdIndexPair> IdToIndexMap;
-
- HRESULT LoadExtentFile(IInStream *inStream);
- HRESULT LoadCatalog(IInStream *inStream, CProgressVirt *progress);
-
- HRESULT ReadFile(const CFork &fork, CByteBuffer &buf, IInStream *inStream);
-public:
- CVolHeader Header;
- CObjectVector<CItem> Items;
- // bool CaseSensetive;
-
- void Clear()
- {
- // CaseSensetive = false;
- Items.Clear();
- // FileExtents.Clear();
- // ResExtents.Clear();
- IdToIndexMap.Clear();
- }
-
- UString GetItemPath(int index) const;
- HRESULT Open(IInStream *inStream, CProgressVirt *progress);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsRegister.cpp
deleted file mode 100644
index 51c3c2b15..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Hfs/HfsRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// HfsRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "HfsHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NHfs::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"HFS", L"hfs", 0, 0xE3, { 'H', '+', 0, 4 }, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Hfs)
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHandler.cpp
deleted file mode 100644
index 7a9f1a458..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHandler.cpp
+++ /dev/null
@@ -1,326 +0,0 @@
-// IsoHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "../Common/ItemNameUtils.h"
-
-#include "IsoHandler.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-namespace NArchive {
-namespace NIso {
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidMTime, VT_FILETIME}
- // { NULL, kpidPhySize, VT_UI8},
- // { NULL, kpidHeadersSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- // try
- {
- if (_archive.Open(stream) != S_OK)
- return S_FALSE;
- _stream = stream;
- }
- // catch(...) { return S_FALSE; }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _archive.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _archive.Refs.Size() + _archive.BootEntries.Size();
- return S_OK;
-}
-
-static void AddString(AString &s, const char *name, const Byte *p, int size)
-{
- int i;
- for (i = 0; i < size && p[i]; i++);
- for (; i > 0 && p[i - 1] == ' '; i--);
- if (i != 0)
- {
- AString d;
- memcpy(d.GetBuffer(i), p, i);
- d.ReleaseBuffer(i);
- s += '\n';
- s += name;
- s += ": ";
- s += d;
- }
-}
-
-#define ADD_STRING(n, V) AddString(s, n, vol. V, sizeof(vol. V))
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CVolumeDescriptor &vol = _archive.VolDescs[_archive.MainVolDescIndex];
- switch(propID)
- {
- case kpidComment:
- {
- AString s;
- ADD_STRING("System", SystemId);
- ADD_STRING("Volume", VolumeId);
- ADD_STRING("VolumeSet", VolumeSetId);
- ADD_STRING("Publisher", PublisherId);
- ADD_STRING("Preparer", DataPreparerId);
- ADD_STRING("Application", ApplicationId);
- ADD_STRING("Copyright", CopyrightFileId);
- ADD_STRING("Abstract", AbstractFileId);
- ADD_STRING("Bib", BibFileId);
- prop = s;
- break;
- }
- case kpidCTime: { FILETIME utc; if (vol.CTime.GetFileTime(utc)) prop = utc; break; }
- case kpidMTime: { FILETIME utc; if (vol.MTime.GetFileTime(utc)) prop = utc; break; }
- // case kpidPhySize: break;
- // case kpidHeadersSize: break;
- case kpidError: if (_archive.IncorrectBigEndian) prop = "Incorrect big-endian headers"; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- if (index >= (UInt32)_archive.Refs.Size())
- {
- index -= _archive.Refs.Size();
- const CBootInitialEntry &be = _archive.BootEntries[index];
- switch(propID)
- {
- case kpidPath:
- {
- // wchar_t name[32];
- // ConvertUInt64ToString(index + 1, name);
- UString s = L"[BOOT]" WSTRING_PATH_SEPARATOR;
- // s += name;
- // s += L"-";
- s += be.GetName();
- prop = (const wchar_t *)s;
- break;
- }
- case kpidIsDir: prop = false; break;
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)_archive.GetBootItemSize(index);
- break;
- }
- }
- else
- {
- const CRef &ref = _archive.Refs[index];
- const CDir &item = ref.Dir->_subItems[ref.Index];
- switch(propID)
- {
- case kpidPath:
- // if (item.FileId.GetCapacity() >= 0)
- {
- UString s;
- if (_archive.IsJoliet())
- s = item.GetPathU();
- else
- s = MultiByteToUnicodeString(item.GetPath(_archive.IsSusp, _archive.SuspSkipSize), CP_OEMCP);
-
- int pos = s.ReverseFind(L';');
- if (pos >= 0 && pos == s.Length() - 2)
- if (s[s.Length() - 1] == L'1')
- s = s.Left(pos);
- if (!s.IsEmpty())
- if (s[s.Length() - 1] == L'.')
- s = s.Left(s.Length() - 1);
- prop = (const wchar_t *)NItemName::GetOSName2(s);
- }
- break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize:
- case kpidPackSize:
- if (!item.IsDir())
- prop = (UInt64)item.DataLength;
- break;
- case kpidMTime:
- {
- FILETIME utc;
- if (item.DateTime.GetFileTime(utc))
- prop = utc;
- break;
- }
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _archive.Refs.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for(i = 0; i < numItems; i++)
- {
- UInt32 index = (allFilesMode ? i : indices[i]);
- if (index < (UInt32)_archive.Refs.Size())
- {
- const CRef &ref = _archive.Refs[index];
- const CDir &item = ref.Dir->_subItems[ref.Index];
- totalSize += item.DataLength;
- }
- else
- {
- totalSize += _archive.GetBootItemSize(index - _archive.Refs.Size());
- }
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
- UInt64 currentItemSize;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- CLimitedSequentialOutStream *outStreamSpec = new CLimitedSequentialOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- currentItemSize = 0;
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- UInt64 blockIndex;
- if (index < (UInt32)_archive.Refs.Size())
- {
- const CRef &ref = _archive.Refs[index];
- const CDir &item = ref.Dir->_subItems[ref.Index];
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- currentItemSize = item.DataLength;
- blockIndex = item.ExtentLocation;
- }
- else
- {
- int bootIndex = index - _archive.Refs.Size();
- const CBootInitialEntry &be = _archive.BootEntries[bootIndex];
- currentItemSize = _archive.GetBootItemSize(bootIndex);
- blockIndex = be.LoadRBA;
- }
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init(currentItemSize);
- RINOK(_stream->Seek(blockIndex * _archive.BlockSize, STREAM_SEEK_SET, NULL));
- streamSpec->Init(currentItemSize);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStreamSpec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(outStreamSpec->IsFinishedOK() ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
- UInt64 blockIndex;
- UInt64 currentItemSize;
- if (index < (UInt32)_archive.Refs.Size())
- {
- const CRef &ref = _archive.Refs[index];
- const CDir &item = ref.Dir->_subItems[ref.Index];
- if (item.IsDir())
- return S_FALSE;
- currentItemSize = item.DataLength;
- blockIndex = item.ExtentLocation;
- }
- else
- {
- int bootIndex = index - _archive.Refs.Size();
- const CBootInitialEntry &be = _archive.BootEntries[bootIndex];
- currentItemSize = _archive.GetBootItemSize(bootIndex);
- blockIndex = be.LoadRBA;
- }
- return CreateLimitedInStream(_stream, blockIndex * _archive.BlockSize, currentItemSize, stream);
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHandler.h b/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHandler.h
deleted file mode 100644
index 1dcade8f9..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHandler.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// IsoHandler.h
-
-#ifndef __ISO_HANDLER_H
-#define __ISO_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-
-#include "IsoIn.h"
-#include "IsoItem.h"
-
-namespace NArchive {
-namespace NIso {
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CInArchive _archive;
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHeader.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHeader.cpp
deleted file mode 100644
index b3e418bbc..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHeader.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// Archive/Iso/Header.h
-
-#include "StdAfx.h"
-
-#include "IsoHeader.h"
-
-namespace NArchive {
-namespace NIso {
-
-const char *kElToritoSpec = "EL TORITO SPECIFICATION\0\0\0\0\0\0\0\0\0";
-
-const wchar_t *kMediaTypes[5] =
-{
- L"NoEmulation",
- L"1.2M",
- L"1.44M",
- L"2.88M",
- L"HardDisk"
-};
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHeader.h b/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHeader.h
deleted file mode 100644
index 9702d70ae..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoHeader.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Archive/IsoHeader.h
-
-#ifndef __ARCHIVE_ISO_HEADER_H
-#define __ARCHIVE_ISO_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NIso {
-
-namespace NVolDescType
-{
- const Byte kBootRecord = 0;
- const Byte kPrimaryVol = 1;
- const Byte kSupplementaryVol = 2;
- const Byte kVolParttition = 3;
- const Byte kTerminator = 255;
-}
-
-const Byte kVersion = 1;
-
-namespace NFileFlags
-{
- const Byte kDirectory = 1 << 1;
-}
-
-extern const char *kElToritoSpec;
-
-const UInt32 kStartPos = 0x8000;
-
-namespace NBootEntryId
-{
- const Byte kValidationEntry = 1;
- const Byte kInitialEntryNotBootable = 0;
- const Byte kInitialEntryBootable = 0x88;
-}
-
-namespace NBootPlatformId
-{
- const Byte kX86 = 0;
- const Byte kPowerPC = 1;
- const Byte kMac = 2;
-}
-
-const BYTE kBootMediaTypeMask = 0xF;
-
-namespace NBootMediaType
-{
- const Byte kNoEmulation = 0;
- const Byte k1d2Floppy = 1;
- const Byte k1d44Floppy = 2;
- const Byte k2d88Floppy = 3;
- const Byte kHardDisk = 4;
-}
-
-const int kNumBootMediaTypes = 5;
-extern const wchar_t *kMediaTypes[];
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoIn.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoIn.cpp
deleted file mode 100644
index 7ed618d29..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoIn.cpp
+++ /dev/null
@@ -1,453 +0,0 @@
-// Archive/IsoIn.cpp
-
-#include "StdAfx.h"
-
-#include "IsoIn.h"
-
-#include "../../Common/StreamUtils.h"
-
-namespace NArchive {
-namespace NIso {
-
-Byte CInArchive::ReadByte()
-{
- if (m_BufferPos >= BlockSize)
- m_BufferPos = 0;
- if (m_BufferPos == 0)
- {
- size_t processedSize = BlockSize;
- if (ReadStream(_stream, m_Buffer, &processedSize) != S_OK)
- throw 1;
- if (processedSize != BlockSize)
- throw 1;
- }
- Byte b = m_Buffer[m_BufferPos++];
- _position++;
- return b;
-}
-
-void CInArchive::ReadBytes(Byte *data, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- data[i] = ReadByte();
-}
-
-void CInArchive::Skip(size_t size)
-{
- while (size-- != 0)
- ReadByte();
-}
-
-void CInArchive::SkipZeros(size_t size)
-{
- while (size-- != 0)
- {
- Byte b = ReadByte();
- if (b != 0)
- throw 1;
- }
-}
-
-UInt16 CInArchive::ReadUInt16Spec()
-{
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- value |= ((UInt16)(ReadByte()) << (8 * i));
- return value;
-}
-
-
-UInt16 CInArchive::ReadUInt16()
-{
- Byte b[4];
- ReadBytes(b, 4);
- UInt32 value = 0;
- for (int i = 0; i < 2; i++)
- {
- if (b[i] != b[3 - i])
- IncorrectBigEndian = true;
- value |= ((UInt16)(b[i]) << (8 * i));
- }
- return (UInt16)value;
-}
-
-UInt32 CInArchive::ReadUInt32Le()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- value |= ((UInt32)(ReadByte()) << (8 * i));
- return value;
-}
-
-UInt32 CInArchive::ReadUInt32Be()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- {
- value <<= 8;
- value |= ReadByte();
- }
- return value;
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- Byte b[8];
- ReadBytes(b, 8);
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- {
- if (b[i] != b[7 - i])
- throw 1;
- value |= ((UInt32)(b[i]) << (8 * i));
- }
- return value;
-}
-
-UInt32 CInArchive::ReadDigits(int numDigits)
-{
- UInt32 res = 0;
- for (int i = 0; i < numDigits; i++)
- {
- Byte b = ReadByte();
- if (b < '0' || b > '9')
- {
- if (b == 0) // it's bug in some CD's
- b = '0';
- else
- throw 1;
- }
- UInt32 d = (UInt32)(b - '0');
- res *= 10;
- res += d;
- }
- return res;
-}
-
-void CInArchive::ReadDateTime(CDateTime &d)
-{
- d.Year = (UInt16)ReadDigits(4);
- d.Month = (Byte)ReadDigits(2);
- d.Day = (Byte)ReadDigits(2);
- d.Hour = (Byte)ReadDigits(2);
- d.Minute = (Byte)ReadDigits(2);
- d.Second = (Byte)ReadDigits(2);
- d.Hundredths = (Byte)ReadDigits(2);
- d.GmtOffset = (signed char)ReadByte();
-}
-
-void CInArchive::ReadBootRecordDescriptor(CBootRecordDescriptor &d)
-{
- ReadBytes(d.BootSystemId, sizeof(d.BootSystemId));
- ReadBytes(d.BootId, sizeof(d.BootId));
- ReadBytes(d.BootSystemUse, sizeof(d.BootSystemUse));
-}
-
-void CInArchive::ReadRecordingDateTime(CRecordingDateTime &t)
-{
- t.Year = ReadByte();
- t.Month = ReadByte();
- t.Day = ReadByte();
- t.Hour = ReadByte();
- t.Minute = ReadByte();
- t.Second = ReadByte();
- t.GmtOffset = (signed char)ReadByte();
-}
-
-void CInArchive::ReadDirRecord2(CDirRecord &r, Byte len)
-{
- r.ExtendedAttributeRecordLen = ReadByte();
- if (r.ExtendedAttributeRecordLen != 0)
- throw 1;
- r.ExtentLocation = ReadUInt32();
- r.DataLength = ReadUInt32();
- ReadRecordingDateTime(r.DateTime);
- r.FileFlags = ReadByte();
- r.FileUnitSize = ReadByte();
- r.InterleaveGapSize = ReadByte();
- r.VolSequenceNumber = ReadUInt16();
- Byte idLen = ReadByte();
- r.FileId.SetCapacity(idLen);
- ReadBytes((Byte *)r.FileId, idLen);
- int padSize = 1 - (idLen & 1);
-
- // SkipZeros(1 - (idLen & 1));
- Skip(1 - (idLen & 1)); // it's bug in some cd's. Must be zeros
-
- int curPos = 33 + idLen + padSize;
- if (curPos > len)
- throw 1;
- int rem = len - curPos;
- r.SystemUse.SetCapacity(rem);
- ReadBytes((Byte *)r.SystemUse, rem);
-}
-
-void CInArchive::ReadDirRecord(CDirRecord &r)
-{
- Byte len = ReadByte();
- // Some CDs can have incorrect value len = 48 ('0') in VolumeDescriptor.
- // But maybe we must use real "len" for other records.
- len = 34;
- ReadDirRecord2(r, len);
-}
-
-void CInArchive::ReadVolumeDescriptor(CVolumeDescriptor &d)
-{
- d.VolFlags = ReadByte();
- ReadBytes(d.SystemId, sizeof(d.SystemId));
- ReadBytes(d.VolumeId, sizeof(d.VolumeId));
- SkipZeros(8);
- d.VolumeSpaceSize = ReadUInt32();
- ReadBytes(d.EscapeSequence, sizeof(d.EscapeSequence));
- d.VolumeSetSize = ReadUInt16();
- d.VolumeSequenceNumber = ReadUInt16();
- d.LogicalBlockSize = ReadUInt16();
- d.PathTableSize = ReadUInt32();
- d.LPathTableLocation = ReadUInt32Le();
- d.LOptionalPathTableLocation = ReadUInt32Le();
- d.MPathTableLocation = ReadUInt32Be();
- d.MOptionalPathTableLocation = ReadUInt32Be();
- ReadDirRecord(d.RootDirRecord);
- ReadBytes(d.VolumeSetId, sizeof(d.VolumeSetId));
- ReadBytes(d.PublisherId, sizeof(d.PublisherId));
- ReadBytes(d.DataPreparerId, sizeof(d.DataPreparerId));
- ReadBytes(d.ApplicationId, sizeof(d.ApplicationId));
- ReadBytes(d.CopyrightFileId, sizeof(d.CopyrightFileId));
- ReadBytes(d.AbstractFileId, sizeof(d.AbstractFileId));
- ReadBytes(d.BibFileId, sizeof(d.BibFileId));
- ReadDateTime(d.CTime);
- ReadDateTime(d.MTime);
- ReadDateTime(d.ExpirationTime);
- ReadDateTime(d.EffectiveTime);
- d.FileStructureVersion = ReadByte(); // = 1
- SkipZeros(1);
- ReadBytes(d.ApplicationUse, sizeof(d.ApplicationUse));
- SkipZeros(653);
-}
-
-static const Byte kSig_CD001[5] = { 'C', 'D', '0', '0', '1' };
-
-static const Byte kSig_NSR02[5] = { 'N', 'S', 'R', '0', '2' };
-static const Byte kSig_NSR03[5] = { 'N', 'S', 'R', '0', '3' };
-static const Byte kSig_BEA01[5] = { 'B', 'E', 'A', '0', '1' };
-static const Byte kSig_TEA01[5] = { 'T', 'E', 'A', '0', '1' };
-
-static inline bool CheckSignature(const Byte *sig, const Byte *data)
-{
- for (int i = 0; i < 5; i++)
- if (sig[i] != data[i])
- return false;
- return true;
-}
-
-void CInArchive::SeekToBlock(UInt32 blockIndex)
-{
- if (_stream->Seek((UInt64)blockIndex * VolDescs[MainVolDescIndex].LogicalBlockSize, STREAM_SEEK_SET, &_position) != S_OK)
- throw 1;
- m_BufferPos = 0;
-}
-
-void CInArchive::ReadDir(CDir &d, int level)
-{
- if (!d.IsDir())
- return;
- SeekToBlock(d.ExtentLocation);
- UInt64 startPos = _position;
-
- bool firstItem = true;
- for (;;)
- {
- UInt64 offset = _position - startPos;
- if (offset >= d.DataLength)
- break;
- Byte len = ReadByte();
- if (len == 0)
- continue;
- CDir subItem;
- ReadDirRecord2(subItem, len);
- if (firstItem && level == 0)
- IsSusp = subItem.CheckSusp(SuspSkipSize);
-
- if (!subItem.IsSystemItem())
- d._subItems.Add(subItem);
-
- firstItem = false;
- }
- for (int i = 0; i < d._subItems.Size(); i++)
- ReadDir(d._subItems[i], level + 1);
-}
-
-void CInArchive::CreateRefs(CDir &d)
-{
- if (!d.IsDir())
- return;
- for (int i = 0; i < d._subItems.Size(); i++)
- {
- CRef ref;
- CDir &subItem = d._subItems[i];
- subItem.Parent = &d;
- ref.Dir = &d;
- ref.Index = i;
- Refs.Add(ref);
- CreateRefs(subItem);
- }
-}
-
-void CInArchive::ReadBootInfo()
-{
- if (!_bootIsDefined)
- return;
- if (memcmp(_bootDesc.BootSystemId, kElToritoSpec, sizeof(_bootDesc.BootSystemId)) != 0)
- return;
-
- const Byte *p = (const Byte *)_bootDesc.BootSystemUse;
- UInt32 blockIndex = p[0] | ((UInt32)p[1] << 8) | ((UInt32)p[2] << 16) | ((UInt32)p[3] << 24);
- SeekToBlock(blockIndex);
- Byte b = ReadByte();
- if (b != NBootEntryId::kValidationEntry)
- return;
- {
- CBootValidationEntry e;
- e.PlatformId = ReadByte();
- if (ReadUInt16Spec() != 0)
- throw 1;
- ReadBytes(e.Id, sizeof(e.Id));
- /* UInt16 checkSum = */ ReadUInt16Spec();
- if (ReadByte() != 0x55)
- throw 1;
- if (ReadByte() != 0xAA)
- throw 1;
- }
- b = ReadByte();
- if (b == NBootEntryId::kInitialEntryBootable || b == NBootEntryId::kInitialEntryNotBootable)
- {
- CBootInitialEntry e;
- e.Bootable = (b == NBootEntryId::kInitialEntryBootable);
- e.BootMediaType = ReadByte();
- e.LoadSegment = ReadUInt16Spec();
- e.SystemType = ReadByte();
- if (ReadByte() != 0)
- throw 1;
- e.SectorCount = ReadUInt16Spec();
- e.LoadRBA = ReadUInt32Le();
- if (ReadByte() != 0)
- throw 1;
- BootEntries.Add(e);
- }
- else
- return;
-}
-
-HRESULT CInArchive::Open2()
-{
- Clear();
- RINOK(_stream->Seek(kStartPos, STREAM_SEEK_CUR, &_position));
-
- m_BufferPos = 0;
- BlockSize = kBlockSize;
- for (;;)
- {
- Byte sig[7];
- ReadBytes(sig, 7);
- Byte ver = sig[6];
- if (!CheckSignature(kSig_CD001, sig + 1))
- {
- return S_FALSE;
- /*
- if (sig[0] != 0 || ver != 1)
- break;
- if (CheckSignature(kSig_BEA01, sig + 1))
- {
- }
- else if (CheckSignature(kSig_TEA01, sig + 1))
- {
- break;
- }
- else if (CheckSignature(kSig_NSR02, sig + 1))
- {
- }
- else
- break;
- SkipZeros(0x800 - 7);
- continue;
- */
- }
- // version = 2 for ISO 9660:1999?
- if (ver > 2)
- throw S_FALSE;
-
- if (sig[0] == NVolDescType::kTerminator)
- {
- break;
- // Skip(0x800 - 7);
- // continue;
- }
- switch(sig[0])
- {
- case NVolDescType::kBootRecord:
- {
- _bootIsDefined = true;
- ReadBootRecordDescriptor(_bootDesc);
- break;
- }
- case NVolDescType::kPrimaryVol:
- case NVolDescType::kSupplementaryVol:
- {
- // some ISOs have two PrimaryVols.
- CVolumeDescriptor vd;
- ReadVolumeDescriptor(vd);
- if (sig[0] == NVolDescType::kPrimaryVol)
- {
- // some burners write "Joliet" Escape Sequence to primary volume
- memset(vd.EscapeSequence, 0, sizeof(vd.EscapeSequence));
- }
- VolDescs.Add(vd);
- break;
- }
- default:
- break;
- }
- }
- if (VolDescs.IsEmpty())
- return S_FALSE;
- for (MainVolDescIndex = VolDescs.Size() - 1; MainVolDescIndex > 0; MainVolDescIndex--)
- if (VolDescs[MainVolDescIndex].IsJoliet())
- break;
- // MainVolDescIndex = 0; // to read primary volume
- const CVolumeDescriptor &vd = VolDescs[MainVolDescIndex];
- if (vd.LogicalBlockSize != kBlockSize)
- return S_FALSE;
- (CDirRecord &)_rootDir = vd.RootDirRecord;
- ReadDir(_rootDir, 0);
- CreateRefs(_rootDir);
- ReadBootInfo();
- return S_OK;
-}
-
-HRESULT CInArchive::Open(IInStream *inStream)
-{
- _stream = inStream;
- UInt64 pos;
- RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &pos));
- RINOK(_stream->Seek(0, STREAM_SEEK_END, &_archiveSize));
- RINOK(_stream->Seek(pos, STREAM_SEEK_SET, &_position));
- HRESULT res = S_FALSE;
- try { res = Open2(); }
- catch(...) { Clear(); res = S_FALSE; }
- _stream.Release();
- return res;
-}
-
-void CInArchive::Clear()
-{
- IncorrectBigEndian = false;
- Refs.Clear();
- _rootDir.Clear();
- VolDescs.Clear();
- _bootIsDefined = false;
- BootEntries.Clear();
- SuspSkipSize = 0;
- IsSusp = false;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoIn.h b/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoIn.h
deleted file mode 100644
index f9c6f6403..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoIn.h
+++ /dev/null
@@ -1,315 +0,0 @@
-// Archive/IsoIn.h
-
-#ifndef __ARCHIVE_ISO_IN_H
-#define __ARCHIVE_ISO_IN_H
-
-#include "Common/IntToString.h"
-#include "Common/MyCom.h"
-
-#include "../../IStream.h"
-
-#include "IsoHeader.h"
-#include "IsoItem.h"
-
-namespace NArchive {
-namespace NIso {
-
-struct CDir: public CDirRecord
-{
- CDir *Parent;
- CObjectVector<CDir> _subItems;
-
- void Clear()
- {
- Parent = 0;
- _subItems.Clear();
- }
-
- int GetLength(bool checkSusp, int skipSize) const
- {
- int len = GetLengthCur(checkSusp, skipSize);
- if (Parent != 0)
- if (Parent->Parent != 0)
- len += 1 + Parent->GetLength(checkSusp, skipSize);
- return len;
- }
-
- int GetLengthU() const
- {
- int len = (int)(FileId.GetCapacity() / 2);
- if (Parent != 0)
- if (Parent->Parent != 0)
- len += 1 + Parent->GetLengthU();
- return len;
- }
-
- AString GetPath(bool checkSusp, int skipSize) const
- {
- AString s;
- int len = GetLength(checkSusp, skipSize);
- char *p = s.GetBuffer(len + 1);
- p += len;
- *p = 0;
- const CDir *cur = this;
- for (;;)
- {
- int curLen = cur->GetLengthCur(checkSusp, skipSize);
- p -= curLen;
- memmove(p, (const char *)(const Byte *)cur->GetNameCur(checkSusp, skipSize), curLen);
- cur = cur->Parent;
- if (cur == 0)
- break;
- if (cur->Parent == 0)
- break;
- p--;
- *p = CHAR_PATH_SEPARATOR;
- }
- s.ReleaseBuffer();
- return s;
- }
-
- UString GetPathU() const
- {
- UString s;
- int len = GetLengthU();
- wchar_t *p = s.GetBuffer(len + 1);
- p += len;
- *p = 0;
- const CDir *cur = this;
- for (;;)
- {
- int curLen = (int)(cur->FileId.GetCapacity() / 2);
- p -= curLen;
- for (int i = 0; i < curLen; i++)
- {
- Byte b0 = ((const Byte *)cur->FileId)[i * 2];
- Byte b1 = ((const Byte *)cur->FileId)[i * 2 + 1];
- p[i] = (wchar_t)(((wchar_t)b0 << 8) | b1);
- }
- cur = cur->Parent;
- if (cur == 0)
- break;
- if (cur->Parent == 0)
- break;
- p--;
- *p = WCHAR_PATH_SEPARATOR;
- }
- s.ReleaseBuffer();
- return s;
- }
-};
-
-struct CDateTime
-{
- UInt16 Year;
- Byte Month;
- Byte Day;
- Byte Hour;
- Byte Minute;
- Byte Second;
- Byte Hundredths;
- signed char GmtOffset; // min intervals from -48 (West) to +52 (East) recorded.
- bool NotSpecified() const { return Year == 0 && Month == 0 && Day == 0 &&
- Hour == 0 && Minute == 0 && Second == 0 && GmtOffset == 0; }
-
- bool GetFileTime(FILETIME &ft) const
- {
- UInt64 value;
- bool res = NWindows::NTime::GetSecondsSince1601(Year, Month, Day, Hour, Minute, Second, value);
- if (res)
- {
- value -= (UInt64)((Int64)GmtOffset * 15 * 60);
- value *= 10000000;
- }
- ft.dwLowDateTime = (DWORD)value;
- ft.dwHighDateTime = (DWORD)(value >> 32);
- return res;
- }
-};
-
-struct CBootRecordDescriptor
-{
- Byte BootSystemId[32]; // a-characters
- Byte BootId[32]; // a-characters
- Byte BootSystemUse[1977];
-};
-
-struct CBootValidationEntry
-{
- Byte PlatformId;
- Byte Id[24]; // to identify the manufacturer/developer of the CD-ROM.
-};
-
-struct CBootInitialEntry
-{
- bool Bootable;
- Byte BootMediaType;
- UInt16 LoadSegment;
- /* This is the load segment for the initial boot image. If this
- value is 0 the system will use the traditional segment of 7C0. If this value
- is non-zero the system will use the specified segment. This applies to x86
- architectures only. For "flat" model architectures (such as Motorola) this
- is the address divided by 10. */
- Byte SystemType; // This must be a copy of byte 5 (System Type) from the
- // Partition Table found in the boot image.
- UInt16 SectorCount; // This is the number of virtual/emulated sectors the system
- // will store at Load Segment during the initial boot procedure.
- UInt32 LoadRBA; // This is the start address of the virtual disk. CD’s use
- // Relative/Logical block addressing.
-
- UInt64 GetSize() const
- {
- // if (BootMediaType == NBootMediaType::k1d44Floppy) (1440 << 10);
- return SectorCount * 512;
- }
-
- UString GetName() const
- {
- UString s;
- if (Bootable)
- s += L"Bootable";
- else
- s += L"NotBootable";
- s += L"_";
- if (BootMediaType >= kNumBootMediaTypes)
- {
- wchar_t name[16];
- ConvertUInt32ToString(BootMediaType, name);
- s += name;
- }
- else
- s += kMediaTypes[BootMediaType];
- s += L".img";
- return s;
- }
-};
-
-struct CVolumeDescriptor
-{
- Byte VolFlags;
- Byte SystemId[32]; // a-characters. An identification of a system
- // which can recognize and act upon the content of the Logical
- // Sectors with logical Sector Numbers 0 to 15 of the volume.
- Byte VolumeId[32]; // d-characters. An identification of the volume.
- UInt32 VolumeSpaceSize; // the number of Logical Blocks in which the Volume Space of the volume is recorded
- Byte EscapeSequence[32];
- UInt16 VolumeSetSize;
- UInt16 VolumeSequenceNumber; // the ordinal number of the volume in the Volume Set of which the volume is a member.
- UInt16 LogicalBlockSize;
- UInt32 PathTableSize;
- UInt32 LPathTableLocation;
- UInt32 LOptionalPathTableLocation;
- UInt32 MPathTableLocation;
- UInt32 MOptionalPathTableLocation;
- CDirRecord RootDirRecord;
- Byte VolumeSetId[128];
- Byte PublisherId[128];
- Byte DataPreparerId[128];
- Byte ApplicationId[128];
- Byte CopyrightFileId[37];
- Byte AbstractFileId[37];
- Byte BibFileId[37];
- CDateTime CTime;
- CDateTime MTime;
- CDateTime ExpirationTime;
- CDateTime EffectiveTime;
- Byte FileStructureVersion; // = 1;
- Byte ApplicationUse[512];
-
- bool IsJoliet() const
- {
- if ((VolFlags & 1) != 0)
- return false;
- Byte b = EscapeSequence[2];
- return (EscapeSequence[0] == 0x25 && EscapeSequence[1] == 0x2F &&
- (b == 0x40 || b == 0x43 || b == 0x45));
- }
-};
-
-struct CRef
-{
- CDir *Dir;
- UInt32 Index;
-};
-
-const UInt32 kBlockSize = 1 << 11;
-
-class CInArchive
-{
- CMyComPtr<IInStream> _stream;
- UInt64 _position;
-
- Byte m_Buffer[kBlockSize];
- UInt32 m_BufferPos;
-
- CDir _rootDir;
- bool _bootIsDefined;
- CBootRecordDescriptor _bootDesc;
-
- void Skip(size_t size);
- void SkipZeros(size_t size);
- Byte ReadByte();
- void ReadBytes(Byte *data, UInt32 size);
- UInt16 ReadUInt16Spec();
- UInt16 ReadUInt16();
- UInt32 ReadUInt32Le();
- UInt32 ReadUInt32Be();
- UInt32 ReadUInt32();
- UInt64 ReadUInt64();
- UInt32 ReadDigits(int numDigits);
- void ReadDateTime(CDateTime &d);
- void ReadRecordingDateTime(CRecordingDateTime &t);
- void ReadDirRecord2(CDirRecord &r, Byte len);
- void ReadDirRecord(CDirRecord &r);
-
- void ReadBootRecordDescriptor(CBootRecordDescriptor &d);
- void ReadVolumeDescriptor(CVolumeDescriptor &d);
-
- void SeekToBlock(UInt32 blockIndex);
- void ReadDir(CDir &d, int level);
- void CreateRefs(CDir &d);
-
- void ReadBootInfo();
- HRESULT Open2();
-public:
- HRESULT Open(IInStream *inStream);
- void Clear();
-
- UInt64 _archiveSize;
-
- CRecordVector<CRef> Refs;
- CObjectVector<CVolumeDescriptor> VolDescs;
- int MainVolDescIndex;
- UInt32 BlockSize;
- CObjectVector<CBootInitialEntry> BootEntries;
- bool IncorrectBigEndian;
-
-
- bool IsJoliet() const { return VolDescs[MainVolDescIndex].IsJoliet(); }
-
- UInt64 GetBootItemSize(int index) const
- {
- const CBootInitialEntry &be = BootEntries[index];
- UInt64 size = be.GetSize();
- if (be.BootMediaType == NBootMediaType::k1d2Floppy)
- size = (1200 << 10);
- else if (be.BootMediaType == NBootMediaType::k1d44Floppy)
- size = (1440 << 10);
- else if (be.BootMediaType == NBootMediaType::k2d88Floppy)
- size = (2880 << 10);
- UInt64 startPos = be.LoadRBA * BlockSize;
- if (startPos < _archiveSize)
- {
- if (_archiveSize - startPos < size)
- size = _archiveSize - startPos;
- }
- return size;
- }
-
- bool IsSusp;
- int SuspSkipSize;
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoItem.h b/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoItem.h
deleted file mode 100644
index f39c2f5d2..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoItem.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// Archive/IsoItem.h
-
-#ifndef __ARCHIVE_ISO_ITEM_H
-#define __ARCHIVE_ISO_ITEM_H
-
-#include "Common/Types.h"
-#include "Common/MyString.h"
-#include "Common/Buffer.h"
-
-#include "Windows/Time.h"
-
-#include "IsoHeader.h"
-
-namespace NArchive {
-namespace NIso {
-
-struct CRecordingDateTime
-{
- Byte Year;
- Byte Month;
- Byte Day;
- Byte Hour;
- Byte Minute;
- Byte Second;
- signed char GmtOffset; // min intervals from -48 (West) to +52 (East) recorded.
-
- bool GetFileTime(FILETIME &ft) const
- {
- UInt64 value;
- bool res = NWindows::NTime::GetSecondsSince1601(Year + 1900, Month, Day, Hour, Minute, Second, value);
- if (res)
- {
- value -= (UInt64)((Int64)GmtOffset * 15 * 60);
- value *= 10000000;
- }
- ft.dwLowDateTime = (DWORD)value;
- ft.dwHighDateTime = (DWORD)(value >> 32);
- return res;
- }
-};
-
-struct CDirRecord
-{
- Byte ExtendedAttributeRecordLen;
- UInt32 ExtentLocation;
- UInt32 DataLength;
- CRecordingDateTime DateTime;
- Byte FileFlags;
- Byte FileUnitSize;
- Byte InterleaveGapSize;
- UInt16 VolSequenceNumber;
- CByteBuffer FileId;
- CByteBuffer SystemUse;
-
- bool IsDir() const { return (FileFlags & NFileFlags::kDirectory) != 0; }
- bool IsSystemItem() const
- {
- if (FileId.GetCapacity() != 1)
- return false;
- Byte b = *(const Byte *)FileId;
- return (b == 0 || b == 1);
- }
-
- const Byte* FindSuspName(int skipSize, int &lenRes) const
- {
- lenRes = 0;
- const Byte *p = (const Byte *)SystemUse + skipSize;
- int length = (int)(SystemUse.GetCapacity() - skipSize);
- while (length >= 5)
- {
- int len = p[2];
- if (p[0] == 'N' && p[1] == 'M' && p[3] == 1)
- {
- lenRes = len - 5;
- return p + 5;
- }
- p += len;
- length -= len;
- }
- return 0;
- }
-
- int GetLengthCur(bool checkSusp, int skipSize) const
- {
- if (checkSusp)
- {
- int len;
- const Byte *res = FindSuspName(skipSize, len);
- if (res != 0)
- return len;
- }
- return (int)FileId.GetCapacity();
- }
-
- const Byte* GetNameCur(bool checkSusp, int skipSize) const
- {
- if (checkSusp)
- {
- int len;
- const Byte *res = FindSuspName(skipSize, len);
- if (res != 0)
- return res;
- }
- return (const Byte *)FileId;
- }
-
-
- bool CheckSusp(const Byte *p, int &startPos) const
- {
- if (p[0] == 'S' &&
- p[1] == 'P' &&
- p[2] == 0x7 &&
- p[3] == 0x1 &&
- p[4] == 0xBE &&
- p[5] == 0xEF)
- {
- startPos = p[6];
- return true;
- }
- return false;
- }
-
- bool CheckSusp(int &startPos) const
- {
- const Byte *p = (const Byte *)SystemUse;
- int length = (int)SystemUse.GetCapacity();
- const int kMinLen = 7;
- if (length < kMinLen)
- return false;
- if (CheckSusp(p, startPos))
- return true;
- const int kOffset2 = 14;
- if (length < kOffset2 + kMinLen)
- return false;
- return CheckSusp(p + kOffset2, startPos);
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoRegister.cpp
deleted file mode 100644
index 67a09c769..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Iso/IsoRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// IsoRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "IsoHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NIso::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Iso", L"iso img", 0, 0xE7, { 'C', 'D', '0', '0', '1', 0x1 }, 7, false, CreateArc, 0 };
-
-REGISTER_ARC(Iso)
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/LzhHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/LzhHandler.cpp
deleted file mode 100644
index 2c4eb9089..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/LzhHandler.cpp
+++ /dev/null
@@ -1,775 +0,0 @@
-// LzhHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../ICoder.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-#include "../Compress/LzhDecoder.h"
-
-#include "IArchive.h"
-
-#include "Common/ItemNameUtils.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-
-namespace NArchive {
-namespace NLzh{
-
-const int kMethodIdSize = 5;
-
-const Byte kExtIdFileName = 0x01;
-const Byte kExtIdDirName = 0x02;
-const Byte kExtIdUnixTime = 0x54;
-
-struct CExtension
-{
- Byte Type;
- CByteBuffer Data;
- AString GetString() const
- {
- AString s;
- for (size_t i = 0; i < Data.GetCapacity(); i++)
- {
- char c = (char)Data[i];
- if (c == 0)
- break;
- s += c;
- }
- return s;
- }
-};
-
-struct CItem
-{
- AString Name;
- Byte Method[kMethodIdSize];
- Byte Attributes;
- Byte Level;
- Byte OsId;
- UInt32 PackSize;
- UInt32 Size;
- UInt32 ModifiedTime;
- UInt16 CRC;
- CObjectVector<CExtension> Extensions;
-
- bool IsValidMethod() const { return (Method[0] == '-' && Method[1] == 'l' && Method[4] == '-'); }
- bool IsLhMethod() const {return (IsValidMethod() && Method[2] == 'h'); }
- bool IsDir() const {return (IsLhMethod() && Method[3] == 'd'); }
-
- bool IsCopyMethod() const
- {
- return (IsLhMethod() && Method[3] == '0') ||
- (IsValidMethod() && Method[2] == 'z' && Method[3] == '4');
- }
-
- bool IsLh1GroupMethod() const
- {
- if (!IsLhMethod())
- return false;
- switch(Method[3])
- {
- case '1':
- return true;
- }
- return false;
- }
-
- bool IsLh4GroupMethod() const
- {
- if (!IsLhMethod())
- return false;
- switch(Method[3])
- {
- case '4':
- case '5':
- case '6':
- case '7':
- return true;
- }
- return false;
- }
-
- int GetNumDictBits() const
- {
- if (!IsLhMethod())
- return 0;
- switch(Method[3])
- {
- case '1': return 12;
- case '2': return 13;
- case '3': return 13;
- case '4': return 12;
- case '5': return 13;
- case '6': return 15;
- case '7': return 16;
- }
- return 0;
- }
-
- int FindExt(Byte type) const
- {
- for (int i = 0; i < Extensions.Size(); i++)
- if (Extensions[i].Type == type)
- return i;
- return -1;
- }
- bool GetUnixTime(UInt32 &value) const
- {
- int index = FindExt(kExtIdUnixTime);
- if (index < 0)
- {
- if (Level == 2)
- {
- value = ModifiedTime;
- return true;
- }
- return false;
- }
- const Byte *data = (const Byte *)(Extensions[index].Data);
- value = GetUi32(data);
- return true;
- }
-
- AString GetDirName() const
- {
- int index = FindExt(kExtIdDirName);
- if (index < 0)
- return AString();
- return Extensions[index].GetString();
- }
-
- AString GetFileName() const
- {
- int index = FindExt(kExtIdFileName);
- if (index < 0)
- return Name;
- return Extensions[index].GetString();
- }
-
- AString GetName() const
- {
- AString dirName = GetDirName();
- const char kDirSeparator = CHAR_PATH_SEPARATOR; // '\\';
- // check kDirSeparator in Linux
- dirName.Replace((char)(unsigned char)0xFF, kDirSeparator);
- if (!dirName.IsEmpty() && dirName.Back() != kDirSeparator)
- dirName += kDirSeparator;
- return dirName + GetFileName();
- }
-};
-
-struct CItemEx: public CItem
-{
- UInt64 DataPosition;
-};
-
-class CInArchive
-{
- CMyComPtr<IInStream> m_Stream;
- UInt64 m_Position;
-
- HRESULT ReadBytes(void *data, UInt32 size, UInt32 &processedSize);
- HRESULT CheckReadBytes(void *data, UInt32 size);
-public:
- HRESULT Open(IInStream *inStream);
- HRESULT GetNextItem(bool &filled, CItemEx &itemInfo);
- HRESULT Skip(UInt64 numBytes);
-};
-
-HRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 &processedSize)
-{
- size_t realProcessedSize = size;
- RINOK(ReadStream(m_Stream, data, &realProcessedSize));
- processedSize = (UInt32)realProcessedSize;
- m_Position += processedSize;
- return S_OK;
-}
-
-HRESULT CInArchive::CheckReadBytes(void *data, UInt32 size)
-{
- UInt32 processedSize;
- RINOK(ReadBytes(data, size, processedSize));
- return (processedSize == size) ? S_OK: S_FALSE;
-}
-
-HRESULT CInArchive::Open(IInStream *inStream)
-{
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Position));
- m_Stream = inStream;
- return S_OK;
-}
-
-static const Byte *ReadUInt16(const Byte *p, UInt16 &v)
-{
- v = Get16(p);
- return p + 2;
-}
-
-static const Byte *ReadString(const Byte *p, size_t size, AString &s)
-{
- s.Empty();
- for (size_t i = 0; i < size; i++)
- {
- char c = p[i];
- if (c == 0)
- break;
- s += c;
- }
- return p + size;
-}
-
-static Byte CalcSum(const Byte *data, size_t size)
-{
- Byte sum = 0;
- for (size_t i = 0; i < size; i++)
- sum = (Byte)(sum + data[i]);
- return sum;
-}
-
-HRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item)
-{
- filled = false;
-
- UInt32 processedSize;
- Byte startHeader[2];
- RINOK(ReadBytes(startHeader, 2, processedSize))
- if (processedSize == 0)
- return S_OK;
- if (processedSize == 1)
- return (startHeader[0] == 0) ? S_OK: S_FALSE;
- if (startHeader[0] == 0 && startHeader[1] == 0)
- return S_OK;
-
- Byte header[256];
- const UInt32 kBasicPartSize = 22;
- RINOK(ReadBytes(header, kBasicPartSize, processedSize));
- if (processedSize != kBasicPartSize)
- return (startHeader[0] == 0) ? S_OK: S_FALSE;
-
- const Byte *p = header;
- memcpy(item.Method, p, kMethodIdSize);
- if (!item.IsValidMethod())
- return S_OK;
- p += kMethodIdSize;
- item.PackSize = Get32(p);
- item.Size = Get32(p + 4);
- item.ModifiedTime = Get32(p + 8);
- item.Attributes = p[12];
- item.Level = p[13];
- p += 14;
- if (item.Level > 2)
- return S_FALSE;
- UInt32 headerSize;
- if (item.Level < 2)
- {
- headerSize = startHeader[0];
- if (headerSize < kBasicPartSize)
- return S_FALSE;
- UInt32 remain = headerSize - kBasicPartSize;
- RINOK(CheckReadBytes(header + kBasicPartSize, remain));
- if (startHeader[1] != CalcSum(header, headerSize))
- return S_FALSE;
- size_t nameLength = *p++;
- if ((p - header) + nameLength + 2 > headerSize)
- return S_FALSE;
- p = ReadString(p, nameLength, item.Name);
- }
- else
- headerSize = startHeader[0] | ((UInt32)startHeader[1] << 8);
- p = ReadUInt16(p, item.CRC);
- if (item.Level != 0)
- {
- if (item.Level == 2)
- {
- RINOK(CheckReadBytes(header + kBasicPartSize, 2));
- }
- if ((size_t)(p - header) + 3 > headerSize)
- return S_FALSE;
- item.OsId = *p++;
- UInt16 nextSize;
- p = ReadUInt16(p, nextSize);
- while (nextSize != 0)
- {
- if (nextSize < 3)
- return S_FALSE;
- if (item.Level == 1)
- {
- if (item.PackSize < nextSize)
- return S_FALSE;
- item.PackSize -= nextSize;
- }
- CExtension ext;
- RINOK(CheckReadBytes(&ext.Type, 1))
- nextSize -= 3;
- ext.Data.SetCapacity(nextSize);
- RINOK(CheckReadBytes((Byte *)ext.Data, nextSize))
- item.Extensions.Add(ext);
- Byte hdr2[2];
- RINOK(CheckReadBytes(hdr2, 2));
- ReadUInt16(hdr2, nextSize);
- }
- }
- item.DataPosition = m_Position;
- filled = true;
- return S_OK;
-}
-
-HRESULT CInArchive::Skip(UInt64 numBytes)
-{
- UInt64 newPostion;
- RINOK(m_Stream->Seek(numBytes, STREAM_SEEK_CUR, &newPostion));
- m_Position += numBytes;
- if (m_Position != newPostion)
- return E_FAIL;
- return S_OK;
-}
-
-struct COsPair
-{
- Byte Id;
- const char *Name;
-};
-
-static COsPair g_OsPairs[] =
-{
- { 0, "MS-DOS" },
- { 'M', "MS-DOS" },
- { '2', "OS/2" },
- { '9', "OS9" },
- { 'K', "OS/68K" },
- { '3', "OS/386" },
- { 'H', "HUMAN" },
- { 'U', "UNIX" },
- { 'C', "CP/M" },
- { 'F', "FLEX" },
- { 'm', "Mac" },
- { 'R', "Runser" },
- { 'T', "TownsOS" },
- { 'X', "XOSK" },
- { 'w', "Windows 95" },
- { 'W', "Windows NT" },
- { 'J', "Java VM" }
-};
-
-static const char *kUnknownOS = "Unknown";
-
-static const char *GetOS(Byte osId)
-{
- for (int i = 0; i < sizeof(g_OsPairs) / sizeof(g_OsPairs[0]); i++)
- if (g_OsPairs[i].Id == osId)
- return g_OsPairs[i].Name;
- return kUnknownOS;
-}
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- // { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidCRC, VT_UI4},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidHostOS, VT_BSTR}
-};
-
-class CCRC
-{
- UInt16 _value;
-public:
- static UInt16 Table[256];
- static void InitTable();
-
- CCRC(): _value(0) {}
- void Init() { _value = 0; }
- void Update(const void *data, size_t size);
- UInt16 GetDigest() const { return _value; }
-};
-
-static const UInt16 kCRCPoly = 0xA001;
-
-UInt16 CCRC::Table[256];
-
-void CCRC::InitTable()
-{
- for (UInt32 i = 0; i < 256; i++)
- {
- UInt32 r = i;
- for (int j = 0; j < 8; j++)
- if (r & 1)
- r = (r >> 1) ^ kCRCPoly;
- else
- r >>= 1;
- CCRC::Table[i] = (UInt16)r;
- }
-}
-
-class CCRCTableInit
-{
-public:
- CCRCTableInit() { CCRC::InitTable(); }
-} g_CRCTableInit;
-
-void CCRC::Update(const void *data, size_t size)
-{
- UInt16 v = _value;
- const Byte *p = (const Byte *)data;
- for (; size > 0; size--, p++)
- v = (UInt16)(Table[((Byte)(v)) ^ *p] ^ (v >> 8));
- _value = v;
-}
-
-
-class COutStreamWithCRC:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-private:
- CCRC _crc;
- CMyComPtr<ISequentialOutStream> _stream;
-public:
- void Init(ISequentialOutStream *stream)
- {
- _stream = stream;
- _crc.Init();
- }
- void ReleaseStream() { _stream.Release(); }
- UInt32 GetCRC() const { return _crc.GetDigest(); }
- void InitCRC() { _crc.Init(); }
-};
-
-STDMETHODIMP COutStreamWithCRC::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize;
- HRESULT result;
- if (!_stream)
- {
- realProcessedSize = size;
- result = S_OK;
- }
- else
- result = _stream->Write(data, size, &realProcessedSize);
- _crc.Update(data, realProcessedSize);
- if (processedSize != NULL)
- *processedSize = realProcessedSize;
- return result;
-}
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CObjectVector<CItemEx> _items;
- CMyComPtr<IInStream> _stream;
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
- CHandler();
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-CHandler::CHandler() {}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItemEx &item = _items[index];
- switch(propID)
- {
- case kpidPath:
- {
- UString s = NItemName::WinNameToOSName(MultiByteToUnicodeString(item.GetName(), CP_OEMCP));
- if (!s.IsEmpty())
- {
- if (s[s.Length() - 1] == WCHAR_PATH_SEPARATOR)
- s.Delete(s.Length() - 1);
- prop = s;
- }
- break;
- }
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.Size; break;
- case kpidPackSize: prop = item.PackSize; break;
- case kpidCRC: prop = (UInt32)item.CRC; break;
- case kpidHostOS: prop = GetOS(item.OsId); break;
- case kpidMTime:
- {
- FILETIME utc;
- UInt32 unixTime;
- if (item.GetUnixTime(unixTime))
- NTime::UnixTimeToFileTime(unixTime, utc);
- else
- {
- FILETIME localFileTime;
- if (DosTimeToFileTime(item.ModifiedTime, localFileTime))
- {
- if (!LocalFileTimeToFileTime(&localFileTime, &utc))
- utc.dwHighDateTime = utc.dwLowDateTime = 0;
- }
- else
- utc.dwHighDateTime = utc.dwLowDateTime = 0;
- }
- prop = utc;
- break;
- }
- // case kpidAttrib: prop = (UInt32)item.Attributes; break;
- case kpidMethod:
- {
- char method2[kMethodIdSize + 1];
- method2[kMethodIdSize] = 0;
- memcpy(method2, item.Method, kMethodIdSize);
- prop = method2;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- try
- {
- _items.Clear();
- CInArchive archive;
-
- UInt64 endPos = 0;
- bool needSetTotal = true;
-
- if (callback != NULL)
- {
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
-
- RINOK(archive.Open(stream));
- for (;;)
- {
- CItemEx item;
- bool filled;
- HRESULT result = archive.GetNextItem(filled, item);
- if (result == S_FALSE)
- return S_FALSE;
- if (result != S_OK)
- return S_FALSE;
- if (!filled)
- break;
- _items.Add(item);
- archive.Skip(item.PackSize);
- if (callback != NULL)
- {
- if (needSetTotal)
- {
- RINOK(callback->SetTotal(NULL, &endPos));
- needSetTotal = false;
- }
- if (_items.Size() % 100 == 0)
- {
- UInt64 numFiles = _items.Size();
- UInt64 numBytes = item.DataPosition;
- RINOK(callback->SetCompleted(&numFiles, &numBytes));
- }
- }
- }
- if (_items.IsEmpty())
- return S_FALSE;
-
- _stream = stream;
- }
- catch(...)
- {
- return S_FALSE;
- }
- COM_TRY_END
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _items.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testModeSpec, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool testMode = (testModeSpec != 0);
- UInt64 totalUnPacked = 0, totalPacked = 0;
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const CItemEx &item = _items[allFilesMode ? i : indices[i]];
- totalUnPacked += item.Size;
- totalPacked += item.PackSize;
- }
- RINOK(extractCallback->SetTotal(totalUnPacked));
-
- UInt64 currentTotalUnPacked = 0, currentTotalPacked = 0;
- UInt64 currentItemUnPacked, currentItemPacked;
-
- NCompress::NLzh::NDecoder::CCoder *lzhDecoderSpec = 0;
- CMyComPtr<ICompressCoder> lzhDecoder;
- CMyComPtr<ICompressCoder> lzh1Decoder;
- CMyComPtr<ICompressCoder> arj2Decoder;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++, currentTotalUnPacked += currentItemUnPacked,
- currentTotalPacked += currentItemPacked)
- {
- currentItemUnPacked = 0;
- currentItemPacked = 0;
-
- lps->InSize = currentTotalPacked;
- lps->OutSize = currentTotalUnPacked;
- RINOK(lps->SetCur());
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode;
- askMode = testMode ? NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItemEx &item = _items[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (item.IsDir())
- {
- // if (!testMode)
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- continue;
- }
-
- if (!testMode && !realOutStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- currentItemUnPacked = item.Size;
- currentItemPacked = item.PackSize;
-
- {
- COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->Init(realOutStream);
- realOutStream.Release();
-
- UInt64 pos;
- _stream->Seek(item.DataPosition, STREAM_SEEK_SET, &pos);
-
- streamSpec->Init(item.PackSize);
-
- HRESULT result = S_OK;
- Int32 opRes = NExtract::NOperationResult::kOK;
-
- if (item.IsCopyMethod())
- {
- result = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (result == S_OK && copyCoderSpec->TotalSize != item.PackSize)
- result = S_FALSE;
- }
- else if (item.IsLh4GroupMethod())
- {
- if (!lzhDecoder)
- {
- lzhDecoderSpec = new NCompress::NLzh::NDecoder::CCoder;
- lzhDecoder = lzhDecoderSpec;
- }
- lzhDecoderSpec->SetDictionary(item.GetNumDictBits());
- result = lzhDecoder->Code(inStream, outStream, NULL, &currentItemUnPacked, progress);
- }
- /*
- else if (item.IsLh1GroupMethod())
- {
- if (!lzh1Decoder)
- {
- lzh1DecoderSpec = new NCompress::NLzh1::NDecoder::CCoder;
- lzh1Decoder = lzh1DecoderSpec;
- }
- lzh1DecoderSpec->SetDictionary(item.GetNumDictBits());
- result = lzh1Decoder->Code(inStream, outStream, NULL, &currentItemUnPacked, progress);
- }
- */
- else
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
-
- if (opRes == NExtract::NOperationResult::kOK)
- {
- if (result == S_FALSE)
- opRes = NExtract::NOperationResult::kDataError;
- else
- {
- RINOK(result);
- if (outStreamSpec->GetCRC() != item.CRC)
- opRes = NExtract::NOperationResult::kCRCError;
- }
- }
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Lzh", L"lzh lha", 0, 6, { '-', 'l' }, 2, false, CreateArc, 0 };
-
-REGISTER_ARC(Lzh)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/MachoHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/MachoHandler.cpp
deleted file mode 100644
index a6261f34d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/MachoHandler.cpp
+++ /dev/null
@@ -1,500 +0,0 @@
-// MachoHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariantUtils.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-static UInt32 Get32(const Byte *p, int be) { if (be) return GetBe32(p); return GetUi32(p); }
-static UInt64 Get64(const Byte *p, int be) { if (be) return GetBe64(p); return GetUi64(p); }
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NMacho {
-
-#define MACH_ARCH_ABI64 (1 << 24)
-#define MACH_MACHINE_386 7
-#define MACH_MACHINE_ARM 12
-#define MACH_MACHINE_SPARC 14
-#define MACH_MACHINE_PPC 18
-
-#define MACH_MACHINE_PPC64 (MACH_ARCH_ABI64 | MACH_MACHINE_PPC)
-#define MACH_MACHINE_AMD64 (MACH_ARCH_ABI64 | MACH_MACHINE_386)
-
-#define MACH_CMD_SEGMENT_32 1
-#define MACH_CMD_SEGMENT_64 0x19
-
-#define MACH_SECT_TYPE_MASK 0x000000FF
-#define MACH_SECT_ATTR_MASK 0xFFFFFF00
-
-#define MACH_SECT_ATTR_ZEROFILL 1
-
-static const char *g_SectTypes[] =
-{
- "REGULAR",
- "ZEROFILL",
- "CSTRINGS",
- "4BYTE_LITERALS",
- "8BYTE_LITERALS",
- "LITERAL_POINTERS",
- "NON_LAZY_SYMBOL_POINTERS",
- "LAZY_SYMBOL_POINTERS",
- "SYMBOL_STUBS",
- "MOD_INIT_FUNC_POINTERS",
- "MOD_TERM_FUNC_POINTERS",
- "COALESCED",
- "GB_ZEROFILL",
- "INTERPOSING",
- "16BYTE_LITERALS"
-};
-
-static const char *g_FileTypes[] =
-{
- "0",
- "OBJECT",
- "EXECUTE",
- "FVMLIB",
- "CORE",
- "PRELOAD",
- "DYLIB",
- "DYLINKER",
- "BUNDLE",
- "DYLIB_STUB",
- "DSYM"
-};
-
-static const CUInt32PCharPair g_Flags[] =
-{
- { 31, "PURE_INSTRUCTIONS" },
- { 30, "NO_TOC" },
- { 29, "STRIP_STATIC_SYMS" },
- { 28, "NO_DEAD_STRIP" },
- { 27, "LIVE_SUPPORT" },
- { 26, "SELF_MODIFYING_CODE" },
- { 25, "DEBUG" },
- { 10, "SOME_INSTRUCTIONS" },
- { 9, "EXT_RELOC" },
- { 8, "LOC_RELOC" }
-};
-
-static const CUInt32PCharPair g_MachinePairs[] =
-{
- { MACH_MACHINE_386, "x86" },
- { MACH_MACHINE_ARM, "ARM" },
- { MACH_MACHINE_SPARC, "SPARC" },
- { MACH_MACHINE_PPC, "PowerPC" },
- { MACH_MACHINE_PPC64, "PowerPC 64-bit" },
- { MACH_MACHINE_AMD64, "x64" }
-};
-
-static const int kNameSize = 16;
-
-struct CSegment
-{
- char Name[kNameSize];
-};
-
-struct CSection
-{
- char Name[kNameSize];
- char SegName[kNameSize];
- UInt64 Va;
- UInt64 Pa;
- UInt64 VSize;
- UInt64 PSize;
-
- UInt32 Flags;
- int SegmentIndex;
-
- bool IsDummy;
-
- CSection(): IsDummy(false) {}
- // UInt64 GetPackSize() const { return Flags == MACH_SECT_ATTR_ZEROFILL ? 0 : Size; }
- UInt64 GetPackSize() const { return PSize; }
-};
-
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _inStream;
- CObjectVector<CSegment> _segments;
- CObjectVector<CSection> _sections;
- bool _mode64;
- bool _be;
- UInt32 _machine;
- UInt32 _type;
- UInt32 _headersSize;
- UInt64 _totalSize;
- HRESULT Open2(ISequentialInStream *stream);
- bool Parse(const Byte *buf, UInt32 size);
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-bool CHandler::Parse(const Byte *buf, UInt32 size)
-{
- bool mode64 = _mode64;
- bool be = _be;
-
- const Byte *bufStart = buf;
- bool reduceCommands = false;
- if (size < 512)
- return false;
-
- _machine = Get32(buf + 4, be);
- _type = Get32(buf + 0xC, be);
-
- UInt32 numCommands = Get32(buf + 0x10, be);
- UInt32 commandsSize = Get32(buf + 0x14, be);
- if (commandsSize > size)
- return false;
-
- if (commandsSize > (1 << 24) || numCommands > (1 << 18))
- return false;
-
- if (numCommands > 16)
- {
- reduceCommands = true;
- numCommands = 16;
- }
-
- _headersSize = 0;
-
- buf += 0x1C;
- size -= 0x1C;
-
- if (mode64)
- {
- buf += 4;
- size -= 4;
- }
-
- _totalSize = (UInt32)(buf - bufStart);
- if (commandsSize < size)
- size = commandsSize;
-
- for (UInt32 cmdIndex = 0; cmdIndex < numCommands; cmdIndex++)
- {
- if (size < 8)
- return false;
- UInt32 cmd = Get32(buf, be);
- UInt32 cmdSize = Get32(buf + 4, be);
- if (size < cmdSize)
- return false;
- if (cmd == MACH_CMD_SEGMENT_32 || cmd == MACH_CMD_SEGMENT_64)
- {
- UInt32 offs = (cmd == MACH_CMD_SEGMENT_64) ? 0x48 : 0x38;
- if (cmdSize < offs)
- break;
-
- UInt64 vmAddr, vmSize, phAddr, phSize;
-
- {
- if (cmd == MACH_CMD_SEGMENT_64)
- {
- vmAddr = Get64(buf + 0x18, be);
- vmSize = Get64(buf + 0x20, be);
- phAddr = Get64(buf + 0x28, be);
- phSize = Get64(buf + 0x30, be);
- }
- else
- {
- vmAddr = Get32(buf + 0x18, be);
- vmSize = Get32(buf + 0x1C, be);
- phAddr = Get32(buf + 0x20, be);
- phSize = Get32(buf + 0x24, be);
- }
- {
- UInt64 totalSize = phAddr + phSize;
- if (totalSize > _totalSize)
- _totalSize = totalSize;
- }
- }
-
- CSegment seg;
- memcpy(seg.Name, buf + 8, kNameSize);
- _segments.Add(seg);
-
- UInt32 numSections = Get32(buf + offs - 8, be);
- if (numSections > (1 << 8))
- return false;
-
- if (numSections == 0)
- {
- CSection section;
- section.IsDummy = true;
- section.SegmentIndex = _segments.Size() - 1;
- section.Va = vmAddr;
- section.PSize = phSize;
- section.VSize = vmSize;
- section.Pa = phAddr;
- section.Flags = 0;
- _sections.Add(section);
- }
- else do
- {
- CSection section;
- UInt32 headerSize = (cmd == MACH_CMD_SEGMENT_64) ? 0x50 : 0x44;
- const Byte *p = buf + offs;
- if (cmdSize - offs < headerSize)
- break;
- if (cmd == MACH_CMD_SEGMENT_64)
- {
- section.Va = Get64(p + 0x20, be);
- section.VSize = Get64(p + 0x28, be);
- section.Pa = Get32(p + 0x30, be);
- section.Flags = Get32(p + 0x40, be);
- }
- else
- {
- section.Va = Get32(p + 0x20, be);
- section.VSize = Get32(p + 0x24, be);
- section.Pa = Get32(p + 0x28, be);
- section.Flags = Get32(p + 0x38, be);
- }
- if (section.Flags == MACH_SECT_ATTR_ZEROFILL)
- section.PSize = 0;
- else
- section.PSize = section.VSize;
- memcpy(section.Name, p, kNameSize);
- memcpy(section.SegName, p + kNameSize, kNameSize);
- section.SegmentIndex = _segments.Size() - 1;
- _sections.Add(section);
- offs += headerSize;
- }
- while (--numSections);
-
- if (offs != cmdSize)
- return false;
- }
- buf += cmdSize;
- size -= cmdSize;
- }
- _headersSize = (UInt32)(buf - bufStart);
- return reduceCommands || (size == 0);
-}
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidCpu, VT_BSTR},
- { NULL, kpidBit64, VT_BOOL},
- { NULL, kpidBigEndian, VT_BOOL},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI4}
-};
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidOffset, VT_UI8},
- { NULL, kpidVa, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidCpu: PAIR_TO_PROP(g_MachinePairs, _machine, prop); break;
- case kpidCharacts: TYPE_TO_PROP(g_FileTypes, _type, prop); break;
- case kpidPhySize: prop = _totalSize; break;
- case kpidHeadersSize: prop = _headersSize; break;
- case kpidBit64: if (_mode64) prop = _mode64; break;
- case kpidBigEndian: if (_be) prop = _be; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-static AString GetName(const char *name)
-{
- char res[kNameSize + 1];
- memcpy(res, name, kNameSize);
- res[kNameSize] = 0;
- return res;
-}
-
-static AString SectFlagsToString(UInt32 flags)
-{
- AString res = TypeToString(g_SectTypes, sizeof(g_SectTypes) / sizeof(g_SectTypes[0]),
- flags & MACH_SECT_TYPE_MASK);
- AString s = FlagsToString(g_Flags, sizeof(g_Flags) / sizeof(g_Flags[0]),
- flags & MACH_SECT_ATTR_MASK);
- if (!s.IsEmpty())
- {
- res += ' ';
- res += s;
- }
- return res;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- const CSection &item = _sections[index];
- switch(propID)
- {
- case kpidPath:
- {
- AString s = GetName(_segments[item.SegmentIndex].Name);
- if (!item.IsDummy)
- s += GetName(item.Name);
- StringToProp(s, prop);
- break;
- }
- case kpidSize: /* prop = (UInt64)item.VSize; break; */
- case kpidPackSize: prop = (UInt64)item.GetPackSize(); break;
- case kpidCharacts: if (!item.IsDummy) StringToProp(SectFlagsToString(item.Flags), prop); break;
- case kpidOffset: prop = item.Pa; break;
- case kpidVa: prop = item.Va; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::Open2(ISequentialInStream *stream)
-{
- const UInt32 kBufSize = 1 << 18;
- const UInt32 kSigSize = 4;
-
- CByteBuffer buffer;
- buffer.SetCapacity(kBufSize);
- Byte *buf = buffer;
-
- size_t processed = kSigSize;
- RINOK(ReadStream_FALSE(stream, buf, processed));
- UInt32 sig = GetUi32(buf);
- bool be, mode64;
- switch(sig)
- {
- case 0xCEFAEDFE: be = true; mode64 = false; break;
- case 0xCFFAEDFE: be = true; mode64 = true; break;
- case 0xFEEDFACE: be = false; mode64 = false; break;
- case 0xFEEDFACF: be = false; mode64 = true; break;
- default: return S_FALSE;
- }
- processed = kBufSize - kSigSize;
- RINOK(ReadStream(stream, buf + kSigSize, &processed));
- _mode64 = mode64;
- _be = be;
- return Parse(buf, (UInt32)processed + kSigSize) ? S_OK : S_FALSE;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- RINOK(Open2(inStream));
- _inStream = inStream;
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _inStream.Release();
- _sections.Clear();
- _segments.Clear();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _sections.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _sections.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _sections[allFilesMode ? i : indices[i]].GetPackSize();
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
- UInt64 currentItemSize;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_inStream);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CSection &item = _sections[index];
- currentItemSize = item.GetPackSize();
-
- CMyComPtr<ISequentialOutStream> outStream;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(_inStream->Seek(item.Pa, STREAM_SEEK_SET, NULL));
- streamSpec->Init(currentItemSize);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == currentItemSize ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"MachO", L"", 0, 0xDF, { 0 }, 0, false, CreateArc, 0 };
-
-REGISTER_ARC(Macho)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/MbrHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/MbrHandler.cpp
deleted file mode 100644
index b6d791829..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/MbrHandler.cpp
+++ /dev/null
@@ -1,507 +0,0 @@
-// MbrHandler.cpp
-
-#include "StdAfx.h"
-
-// #define SHOW_DEBUG_INFO
-
-#ifdef SHOW_DEBUG_INFO
-#include <stdio.h>
-#endif
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#ifdef SHOW_DEBUG_INFO
-#define PRF(x) x
-#else
-#define PRF(x)
-#endif
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NMbr {
-
-struct CChs
-{
- Byte Head;
- Byte SectCyl;
- Byte Cyl8;
-
- UInt32 GetSector() const { return SectCyl & 0x3F; }
- UInt32 GetCyl() const { return ((UInt32)SectCyl >> 6 << 8) | Cyl8; }
- void ToString(NCOM::CPropVariant &prop) const;
-
- void Parse(const Byte *p)
- {
- Head = p[0];
- SectCyl = p[1];
- Cyl8 = p[2];
- }
- bool Check() const { return GetSector() > 0; }
-};
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareChs(const CChs &c1, const CChs &c2)
-{
- RINOZ(MyCompare(c1.GetCyl(), c2.GetCyl()));
- RINOZ(MyCompare(c1.Head, c2.Head));
- return MyCompare(c1.GetSector(), c2.GetSector());
-}
-
-static void AddUIntToString(UInt32 val, AString &res)
-{
- char s[16];
- ConvertUInt32ToString(val, s);
- res += s;
-}
-
-void CChs::ToString(NCOM::CPropVariant &prop) const
-{
- AString s;
- AddUIntToString(GetCyl(), s);
- s += '-';
- AddUIntToString(Head, s);
- s += '-';
- AddUIntToString(GetSector(), s);
- prop = s;
-}
-
-struct CPartition
-{
- Byte Status;
- CChs BeginChs;
- Byte Type;
- CChs EndChs;
- UInt32 Lba;
- UInt32 NumBlocks;
-
- CPartition() { memset (this, 0, sizeof(*this)); }
-
- bool IsEmpty() const { return Type == 0; }
- bool IsExtended() const { return Type == 5 || Type == 0xF; }
- UInt32 GetLimit() const { return Lba + NumBlocks; }
- // bool IsActive() const { return Status == 0x80; }
- UInt64 GetPos() const { return (UInt64)Lba * 512; }
- UInt64 GetSize() const { return (UInt64)NumBlocks * 512; }
-
- bool CheckLbaLimits() const { return (UInt32)0xFFFFFFFF - Lba >= NumBlocks; }
- bool Parse(const Byte *p)
- {
- Status = p[0];
- BeginChs.Parse(p + 1);
- Type = p[4];
- EndChs.Parse(p + 5);
- Lba = GetUi32(p + 8);
- NumBlocks = GetUi32(p + 12);
- if (Type == 0)
- return true;
- if (Status != 0 && Status != 0x80)
- return false;
- return
- BeginChs.Check() &&
- EndChs.Check() &&
- CompareChs(BeginChs, EndChs) <= 0 &&
- NumBlocks > 0 &&
- CheckLbaLimits();
- }
-
- #ifdef SHOW_DEBUG_INFO
- void Print() const
- {
- NCOM::CPropVariant prop, prop2;
- BeginChs.ToString(prop);
- EndChs.ToString(prop2);
- printf(" %2x %2x %8X %8X %12S %12S", (int)Status, (int)Type, Lba, NumBlocks, prop.bstrVal, prop2.bstrVal);
- }
- #endif
-};
-
-struct CPartType
-{
- UInt32 Id;
- const char *Ext;
- const char *Name;
-};
-
-static const char *kFat = "fat";
-
-static const CPartType kPartTypes[] =
-{
- { 0x01, kFat, "FAT12" },
- { 0x04, kFat, "FAT16 DOS 3.0+" },
- { 0x05, 0, "Extended" },
- { 0x06, kFat, "FAT16 DOS 3.31+" },
- { 0x07, "ntfs", "NTFS" },
- { 0x0B, kFat, "FAT32" },
- { 0x0C, kFat, "FAT32-LBA" },
- { 0x0E, kFat, "FAT16-LBA" },
- { 0x0F, 0, "Extended-LBA" },
- { 0x11, kFat, "FAT12-Hidden" },
- { 0x14, kFat, "FAT16-Hidden < 32 MB" },
- { 0x16, kFat, "FAT16-Hidden >= 32 MB" },
- { 0x1B, kFat, "FAT32-Hidden" },
- { 0x1C, kFat, "FAT32-LBA-Hidden" },
- { 0x1E, kFat, "FAT16-LBA-WIN95-Hidden" },
- { 0x82, 0, "Solaris x86 / Linux swap" },
- { 0x83, 0, "Linux" },
- { 0xBE, 0, "Solaris 8 boot" },
- { 0xBF, 0, "New Solaris x86" },
- { 0xC2, 0, "Linux-Hidden" },
- { 0xC3, 0, "Linux swap-Hidden" },
- { 0xEE, 0, "EFI-MBR" },
- { 0xEE, 0, "EFI" }
-};
-
-static int FindPartType(UInt32 type)
-{
- for (int i = 0; i < sizeof(kPartTypes) / sizeof(kPartTypes[0]); i++)
- if (kPartTypes[i].Id == type)
- return i;
- return -1;
-}
-
-struct CItem
-{
- bool IsReal;
- bool IsPrim;
- UInt64 Size;
- CPartition Part;
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CObjectVector<CItem> _items;
- UInt64 _totalSize;
- CByteBuffer _buffer;
-
- HRESULT ReadTables(IInStream *stream, UInt32 baseLba, UInt32 lba, int level);
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-HRESULT CHandler::ReadTables(IInStream *stream, UInt32 baseLba, UInt32 lba, int level)
-{
- if (level >= 128 || _items.Size() >= 128)
- return S_FALSE;
-
- const int kNumHeaderParts = 4;
- CPartition parts[kNumHeaderParts];
-
- {
- const UInt32 kSectorSize = 512;
- _buffer.SetCapacity(kSectorSize);
- Byte *buf = _buffer;
- UInt64 newPos = (UInt64)lba << 9;
- if (newPos + 512 > _totalSize)
- return S_FALSE;
- RINOK(stream->Seek(newPos, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(stream, buf, kSectorSize));
-
- if (buf[0x1FE] != 0x55 || buf[0x1FF] != 0xAA)
- return S_FALSE;
-
- for (int i = 0; i < kNumHeaderParts; i++)
- if (!parts[i].Parse(buf + 0x1BE + 16 * i))
- return S_FALSE;
- }
-
- PRF(printf("\n# %8X", lba));
-
- UInt32 limLba = lba + 1;
- if (limLba == 0)
- return S_FALSE;
-
- for (int i = 0; i < kNumHeaderParts; i++)
- {
- CPartition &part = parts[i];
-
- if (part.IsEmpty())
- continue;
- PRF(printf("\n %2d ", (int)level));
- #ifdef SHOW_DEBUG_INFO
- part.Print();
- #endif
-
- int numItems = _items.Size();
- UInt32 newLba = lba + part.Lba;
-
- if (part.IsExtended())
- {
- // if (part.Type == 5) // Check it!
- newLba = baseLba + part.Lba;
- if (newLba < limLba)
- return S_FALSE;
- HRESULT res = ReadTables(stream, level < 1 ? newLba : baseLba, newLba, level + 1);
- if (res != S_FALSE && res != S_OK)
- return res;
- }
- if (newLba < limLba)
- return S_FALSE;
- part.Lba = newLba;
- if (!part.CheckLbaLimits())
- return S_FALSE;
-
- CItem n;
- n.Part = part;
- bool addItem = false;
- if (numItems == _items.Size())
- {
- n.IsPrim = (level == 0);
- n.IsReal = true;
- addItem = true;
- }
- else
- {
- const CItem &back = _items.Back();
- UInt32 backLimit = back.Part.GetLimit();
- UInt32 partLimit = part.GetLimit();
- if (backLimit < partLimit)
- {
- n.IsReal = false;
- n.Part.Lba = backLimit;
- n.Part.NumBlocks = partLimit - backLimit;
- addItem = true;
- }
- }
- if (addItem)
- {
- if (n.Part.GetLimit() < limLba)
- return S_FALSE;
- limLba = n.Part.GetLimit();
- n.Size = n.Part.GetSize();
- _items.Add(n);
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- RINOK(stream->Seek(0, STREAM_SEEK_END, &_totalSize));
- RINOK(ReadTables(stream, 0, 0, 0));
- if (_items.IsEmpty())
- return S_FALSE;
- UInt32 lbaLimit = _items.Back().Part.GetLimit();
- UInt64 lim = (UInt64)lbaLimit << 9;
- if (lim < _totalSize)
- {
- CItem n;
- n.Part.Lba = lbaLimit;
- n.Size = _totalSize - lim;
- n.IsReal = false;
- _items.Add(n);
- }
- _stream = stream;
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _items.Clear();
- _stream.Release();
- return S_OK;
-}
-
-enum
-{
- kpidPrimary = kpidUserDefined,
- kpidBegChs,
- kpidEndChs
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidFileSystem, VT_BSTR},
- { NULL, kpidOffset, VT_UI8},
- { L"Primary", kpidPrimary, VT_BOOL},
- { L"Begin CHS", kpidBegChs, VT_BSTR},
- { L"End CHS", kpidEndChs, VT_BSTR}
-};
-
-IMP_IInArchive_Props_WITH_NAME
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMainSubfile:
- {
- int mainIndex = -1;
- for (int i = 0; i < _items.Size(); i++)
- if (_items[i].IsReal)
- {
- if (mainIndex >= 0)
- {
- mainIndex = -1;
- break;
- }
- mainIndex = i;
- }
- if (mainIndex >= 0)
- prop = (UInt32)mainIndex;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
-
- const CItem &item = _items[index];
- const CPartition &part = item.Part;
- switch(propID)
- {
- case kpidPath:
- {
- AString s;
- AddUIntToString(index, s);
- if (item.IsReal)
- {
- int typeIndex = FindPartType(part.Type);
- s += '.';
- const char *ext = "img";
- if (typeIndex >= 0 && kPartTypes[typeIndex].Ext != 0)
- ext = kPartTypes[typeIndex].Ext;
- s += ext;
- }
- prop = s;
- break;
- }
- case kpidFileSystem:
- if (item.IsReal)
- {
- char s[32];
- ConvertUInt32ToString(part.Type, s);
- const char *res = s;
- int typeIndex = FindPartType(part.Type);
- if (typeIndex >= 0 && kPartTypes[typeIndex].Name)
- res = kPartTypes[typeIndex].Name;
- prop = res;
- }
- break;
- case kpidSize: prop = item.Size; break;;
- case kpidPackSize: prop = item.Size; break;
- case kpidOffset: prop = part.GetPos(); break;
- case kpidPrimary: if (item.IsReal) prop = item.IsPrim; break;
- case kpidBegChs: if (item.IsReal) part.BeginChs.ToString(prop); break;
- case kpidEndChs: if (item.IsReal) part.EndChs.ToString(prop); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- totalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- const CPartition &part = item.Part;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- totalSize += item.Size;
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- RINOK(_stream->Seek(part.GetPos(), STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == item.Size ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItem &item = _items[index];
- return CreateLimitedInStream(_stream, item.Part.GetPos(), item.Size, stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"MBR", L"mbr", 0, 0xDB, { 1, 1, 0 }, 3, false, CreateArc, 0 };
-
-REGISTER_ARC(Mbr)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/MslzHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/MslzHandler.cpp
deleted file mode 100644
index 67495e765..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/MslzHandler.cpp
+++ /dev/null
@@ -1,257 +0,0 @@
-// MslzHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "Common/DummyOutStream.h"
-
-namespace NArchive {
-namespace NMslz {
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- UInt32 _size;
- UInt64 _packSize;
- UString _name;
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPath: if (!_name.IsEmpty()) prop = _name; break;
- case kpidSize: prop = _size; break;
- case kpidPackSize: prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-static const unsigned kSignatureSize = 9;
-static const unsigned kHeaderSize = kSignatureSize + 1 + 4;
-#define MSLZ_SIGNATURE { 0x53, 0x5A, 0x44, 0x44, 0x88, 0xF0, 0x27, 0x33, 0x41 }
-// old signature: 53 5A 20 88 F0 27 33
-static const Byte signature[kSignatureSize] = MSLZ_SIGNATURE;
-
-static const wchar_t *g_Exts[] =
-{
- L"dll",
- L"exe",
- L"kmd",
- L"sys"
-};
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- {
- Close();
- Byte buffer[kHeaderSize];
- RINOK(ReadStream_FALSE(stream, buffer, kHeaderSize));
- if (memcmp(buffer, signature, kSignatureSize) != 0)
- return S_FALSE;
- _size = GetUi32(buffer + 10);
- if (_size > 0xFFFFFFE0)
- return S_FALSE;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &_packSize));
-
- if (callback)
- {
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
- callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback);
- if (openVolumeCallback)
- {
- NWindows::NCOM::CPropVariant prop;
- if (openVolumeCallback->GetProperty(kpidName, &prop) == S_OK && prop.vt == VT_BSTR)
- {
- UString baseName = prop.bstrVal;
- if (!baseName.IsEmpty() && baseName.Back() == L'_')
- {
- baseName.DeleteBack();
- Byte replaceByte = buffer[kSignatureSize];
- if (replaceByte == 0)
- {
- for (int i = 0; i < sizeof(g_Exts) / sizeof(g_Exts[0]); i++)
- {
- UString s = g_Exts[i];
- int len = s.Length();
- Byte b = (Byte)s.Back();
- s.DeleteBack();
- if (baseName.Length() >= len &&
- baseName[baseName.Length() - len] == '.' &&
- s.CompareNoCase(baseName.Right(len - 1)) == 0)
- {
- replaceByte = b;
- break;
- }
- }
- }
- if (replaceByte >= 0x20 && replaceByte < 0x80)
- _name = baseName + (wchar_t)replaceByte;
- }
- }
- }
- }
- _stream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _name.Empty();
- return S_OK;
-}
-
-// MslzDec is modified LZSS algorithm of Haruhiko Okumura:
-// maxLen = 18; Okumura
-// maxLen = 16; MS
-
-#define PROGRESS_AND_WRITE \
- if ((dest & kMask) == 0) { RINOK(WriteStream(outStream, buf, kBufSize)); \
- if ((dest & ((1 << 20) - 1)) == 0) \
- { UInt64 inSize = inStream.GetProcessedSize(); UInt64 outSize = dest; \
- RINOK(progress->SetRatioInfo(&inSize, &outSize)); }}
-
-static HRESULT MslzDec(CInBuffer &inStream, ISequentialOutStream *outStream, UInt32 unpackSize, ICompressProgressInfo *progress)
-{
- const unsigned kBufSize = (1 << 12);
- const unsigned kMask = kBufSize - 1;
- Byte buf[kBufSize];
- UInt32 dest = 0;
- memset(buf, ' ', kBufSize);
- while (dest < unpackSize)
- {
- Byte b;
- if (!inStream.ReadByte(b))
- return S_FALSE;
- for (unsigned mask = (unsigned)b | 0x100; mask > 1 && dest < unpackSize; mask >>= 1)
- {
- if (!inStream.ReadByte(b))
- return S_FALSE;
- if (mask & 1)
- {
- buf[dest++ & kMask] = b;
- PROGRESS_AND_WRITE
- }
- else
- {
- Byte b1;
- if (!inStream.ReadByte(b1))
- return S_FALSE;
- const unsigned kMaxLen = 16; // 18 in Okumura's code.
- unsigned src = (((((unsigned)b1 & 0xF0) << 4) | b) + kMaxLen) & kMask;
- unsigned len = (b1 & 0xF) + 3;
- if (len > kMaxLen || dest + len > unpackSize)
- return S_FALSE;
- do
- {
- buf[dest++ & kMask] = buf[src++ & kMask];
- PROGRESS_AND_WRITE
- }
- while (--len != 0);
- }
- }
- }
- return WriteStream(outStream, buf, dest & kMask);
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- extractCallback->SetTotal(_size);
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
- realOutStream.Release();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL));
- CInBuffer s;
- if (!s.Create(1 << 20))
- return E_OUTOFMEMORY;
- s.SetStream(_stream);
- s.Init();
- Byte buffer[kHeaderSize];
- Int32 opRes = NExtract::NOperationResult::kDataError;
- if (s.ReadBytes(buffer, kHeaderSize) == kHeaderSize)
- {
- HRESULT result = MslzDec(s, outStream, _size, progress);
- if (result == S_OK)
- opRes = NExtract::NOperationResult::kOK;
- else if (result != S_FALSE)
- return result;
- }
- outStream.Release();
- return extractCallback->SetOperationResult(opRes);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"MsLZ", L"", 0, 0xD5, MSLZ_SIGNATURE, kSignatureSize, false, CreateArc, 0 };
-
-REGISTER_ARC(Mslz)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/MubHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/MubHandler.cpp
deleted file mode 100644
index da4df24c9..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/MubHandler.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-// MubHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#define Get32(p) GetBe32(p)
-
-namespace NArchive {
-namespace NMub {
-
-struct CItem
-{
- UInt32 Type;
- UInt32 SubType;
- UInt64 Offset;
- UInt64 Size;
- UInt32 Align;
- bool IsTail;
-};
-
-const UInt32 kNumFilesMax = 10;
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- UInt64 _startPos;
- CMyComPtr<IInStream> _stream;
- UInt32 _numItems;
- CItem _items[kNumFilesMax + 1];
- HRESULT Open2(IInStream *stream);
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-#define MACH_ARCH_ABI64 0x1000000
-#define MACH_MACHINE_386 7
-#define MACH_MACHINE_ARM 12
-#define MACH_MACHINE_SPARC 14
-#define MACH_MACHINE_PPC 18
-
-#define MACH_MACHINE_PPC64 (MACH_MACHINE_PPC | MACH_ARCH_ABI64)
-#define MACH_MACHINE_AMD64 (MACH_MACHINE_386 | MACH_ARCH_ABI64)
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _items[index];
- switch(propID)
- {
- case kpidExtension:
- {
- const wchar_t *ext;
- if (item.IsTail)
- ext = L"tail";
- else
- {
- switch(item.Type)
- {
- case MACH_MACHINE_386: ext = L"86"; break;
- case MACH_MACHINE_ARM: ext = L"arm"; break;
- case MACH_MACHINE_SPARC: ext = L"sparc"; break;
- case MACH_MACHINE_PPC: ext = L"ppc"; break;
- case MACH_MACHINE_PPC64: ext = L"ppc64"; break;
- case MACH_MACHINE_AMD64: ext = L"x64"; break;
- default: ext = L"unknown"; break;
- }
- }
- prop = ext;
- break;
- }
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)item.Size;
- break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-#define MACH_TYPE_ABI64 (1 << 24)
-#define MACH_SUBTYPE_ABI64 (1 << 31)
-
-HRESULT CHandler::Open2(IInStream *stream)
-{
- RINOK(stream->Seek(0, STREAM_SEEK_SET, &_startPos));
-
- const UInt32 kHeaderSize = 8;
- const UInt32 kRecordSize = 5 * 4;
- const UInt32 kBufSize = kHeaderSize + kNumFilesMax * kRecordSize;
- Byte buf[kBufSize];
- size_t processed = kBufSize;
- RINOK(ReadStream(stream, buf, &processed));
- if (processed < kHeaderSize)
- return S_FALSE;
- UInt32 num = Get32(buf + 4);
- if (Get32(buf) != 0xCAFEBABE || num > kNumFilesMax || processed < kHeaderSize + num * kRecordSize)
- return S_FALSE;
- UInt64 endPosMax = kHeaderSize;
- for (UInt32 i = 0; i < num; i++)
- {
- const Byte *p = buf + kHeaderSize + i * kRecordSize;
- CItem &sb = _items[i];
- sb.IsTail = false;
- sb.Type = Get32(p);
- sb.SubType = Get32(p + 4);
- sb.Offset = Get32(p + 8);
- sb.Size = Get32(p + 12);
- sb.Align = Get32(p + 16);
-
- if ((sb.Type & ~MACH_TYPE_ABI64) >= 0x100 ||
- (sb.SubType & ~MACH_SUBTYPE_ABI64) >= 0x100 ||
- sb.Align > 31)
- return S_FALSE;
-
- UInt64 endPos = (UInt64)sb.Offset + sb.Size;
- if (endPos > endPosMax)
- endPosMax = endPos;
- }
- UInt64 fileSize;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize));
- fileSize -= _startPos;
- _numItems = num;
- if (fileSize > endPosMax)
- {
- CItem &sb = _items[_numItems++];
- sb.IsTail = true;
- sb.Type = 0;
- sb.SubType = 0;
- sb.Offset = endPosMax;
- sb.Size = fileSize - endPosMax;
- sb.Align = 0;
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- try
- {
- if (Open2(inStream) != S_OK)
- return S_FALSE;
- _stream = inStream;
- }
- catch(...) { return S_FALSE; }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _numItems = 0;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _numItems;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _numItems;
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- currentTotalSize += item.Size;
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (testMode)
- {
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- RINOK(_stream->Seek(_startPos + item.Offset, STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
- RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItem &item = _items[index];
- return CreateLimitedInStream(_stream, _startPos + item.Offset, item.Size, stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Mub", L"", 0, 0xE2, { 0xCA, 0xFE, 0xBA, 0xBE, 0, 0, 0 }, 7, false, CreateArc, 0 };
-
-REGISTER_ARC(Mub)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisDecode.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisDecode.cpp
deleted file mode 100644
index 0845f965d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisDecode.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-// NsisDecode.cpp
-
-#include "StdAfx.h"
-
-#include "NsisDecode.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "../../Common/MethodId.h"
-
-#include "../../Compress/BZip2Decoder.h"
-#include "../../Compress/DeflateDecoder.h"
-#include "../../Compress/LzmaDecoder.h"
-
-namespace NArchive {
-namespace NNsis {
-
-static const CMethodId k_BCJ_X86 = 0x03030103;
-
-HRESULT CDecoder::Init(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream, NMethodType::EEnum method, bool thereIsFilterFlag, bool &useFilter)
-{
- useFilter = false;
- CObjectVector< CMyComPtr<ISequentialInStream> > inStreams;
-
- if (_decoderInStream)
- if (method != _method)
- Release();
- _method = method;
- if (!_codecInStream)
- {
- switch (method)
- {
- // case NMethodType::kCopy: return E_NOTIMPL;
- case NMethodType::kDeflate: _codecInStream = new NCompress::NDeflate::NDecoder::CNsisCOMCoder(); break;
- case NMethodType::kBZip2: _codecInStream = new NCompress::NBZip2::CNsisDecoder(); break;
- case NMethodType::kLZMA: _codecInStream = new NCompress::NLzma::CDecoder(); break;
- default: return E_NOTIMPL;
- }
- }
-
- if (thereIsFilterFlag)
- {
- UInt32 processedSize;
- BYTE flag;
- RINOK(inStream->Read(&flag, 1, &processedSize));
- if (processedSize != 1)
- return E_FAIL;
- if (flag > 1)
- return E_NOTIMPL;
- useFilter = (flag != 0);
- }
-
- if (useFilter)
- {
- if (!_filterInStream)
- {
- CMyComPtr<ICompressCoder> coder;
- RINOK(CreateCoder(
- EXTERNAL_CODECS_LOC_VARS
- k_BCJ_X86, coder, false));
- if (!coder)
- return E_NOTIMPL;
- coder.QueryInterface(IID_ISequentialInStream, &_filterInStream);
- if (!_filterInStream)
- return E_NOTIMPL;
- }
- CMyComPtr<ICompressSetInStream> setInStream;
- _filterInStream.QueryInterface(IID_ICompressSetInStream, &setInStream);
- if (!setInStream)
- return E_NOTIMPL;
- RINOK(setInStream->SetInStream(_codecInStream));
- _decoderInStream = _filterInStream;
- }
- else
- _decoderInStream = _codecInStream;
-
- if (method == NMethodType::kLZMA)
- {
- CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;
- _codecInStream.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties);
- if (setDecoderProperties)
- {
- static const UInt32 kPropertiesSize = 5;
- BYTE properties[kPropertiesSize];
- UInt32 processedSize;
- RINOK(inStream->Read(properties, kPropertiesSize, &processedSize));
- if (processedSize != kPropertiesSize)
- return E_FAIL;
- RINOK(setDecoderProperties->SetDecoderProperties2((const Byte *)properties, kPropertiesSize));
- }
- }
-
- {
- CMyComPtr<ICompressSetInStream> setInStream;
- _codecInStream.QueryInterface(IID_ICompressSetInStream, &setInStream);
- if (!setInStream)
- return E_NOTIMPL;
- RINOK(setInStream->SetInStream(inStream));
- }
-
- {
- CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;
- _codecInStream.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize);
- if (!setOutStreamSize)
- return E_NOTIMPL;
- RINOK(setOutStreamSize->SetOutStreamSize(NULL));
- }
-
- if (useFilter)
- {
- /*
- CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;
- _filterInStream.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize);
- if (!setOutStreamSize)
- return E_NOTIMPL;
- RINOK(setOutStreamSize->SetOutStreamSize(NULL));
- */
- }
-
- return S_OK;
-}
-
-HRESULT CDecoder::Read(void *data, size_t *processedSize)
-{
- return ReadStream(_decoderInStream, data, processedSize);;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisDecode.h b/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisDecode.h
deleted file mode 100644
index 36aeb2b14..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisDecode.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// NsisDecode.h
-
-#ifndef __NSIS_DECODE_H
-#define __NSIS_DECODE_H
-
-#include "../../IStream.h"
-
-#include "../../Common/CreateCoder.h"
-
-namespace NArchive {
-namespace NNsis {
-
-namespace NMethodType
-{
- enum EEnum
- {
- kCopy,
- kDeflate,
- kBZip2,
- kLZMA
- };
-}
-
-class CDecoder
-{
- NMethodType::EEnum _method;
-
- CMyComPtr<ISequentialInStream> _filterInStream;
- CMyComPtr<ISequentialInStream> _codecInStream;
- CMyComPtr<ISequentialInStream> _decoderInStream;
-
-public:
- void Release()
- {
- _filterInStream.Release();
- _codecInStream.Release();
- _decoderInStream.Release();
- }
- HRESULT Init(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream, NMethodType::EEnum method, bool thereIsFilterFlag, bool &useFilter);
- HRESULT Read(void *data, size_t *processedSize);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisHandler.cpp
deleted file mode 100644
index 4058bd2af..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisHandler.cpp
+++ /dev/null
@@ -1,510 +0,0 @@
-// NSisHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "../Common/ItemNameUtils.h"
-
-#include "NsisHandler.h"
-
-#define Get32(p) GetUi32(p)
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NNsis {
-
-static const char *kBcjMethod = "BCJ";
-static const char *kUnknownMethod = "Unknown";
-
-static const char *kMethods[] =
-{
- "Copy",
- "Deflate",
- "BZip2",
- "LZMA"
-};
-
-static const int kNumMethods = sizeof(kMethods) / sizeof(kMethods[0]);
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidSolid, VT_BOOL}
-};
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidSolid, VT_BOOL}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMethod:
- {
- UInt32 dict = 1;
- bool filter = false;
- for (int i = 0; i < _archive.Items.Size(); i++)
- {
- const CItem &item = _archive.Items[i];
- filter |= item.UseFilter;
- if (item.DictionarySize > dict)
- dict = item.DictionarySize;
- }
- prop = GetMethod(filter, dict);
- break;
- }
- case kpidSolid: prop = _archive.IsSolid; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 * maxCheckStartPosition, IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- {
- if (_archive.Open(
- EXTERNAL_CODECS_VARS
- stream, maxCheckStartPosition) != S_OK)
- return S_FALSE;
- _inStream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _archive.Clear();
- _archive.Release();
- _inStream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _archive.Items.Size()
- #ifdef NSIS_SCRIPT
- + 1
- #endif
- ;
- return S_OK;
-}
-
-static AString UInt32ToString(UInt32 value)
-{
- char buffer[16];
- ConvertUInt32ToString(value, buffer);
- return buffer;
-}
-
-static AString GetStringForSizeValue(UInt32 value)
-{
- for (int i = 31; i >= 0; i--)
- if (((UInt32)1 << i) == value)
- return UInt32ToString(i);
- char c = 'b';
- if (value % (1 << 20) == 0)
- {
- value >>= 20;
- c = 'm';
- }
- else if (value % (1 << 10) == 0)
- {
- value >>= 10;
- c = 'k';
- }
- return UInt32ToString(value) + c;
-}
-
-AString CHandler::GetMethod(bool useItemFilter, UInt32 dictionary) const
-{
- NMethodType::EEnum methodIndex = _archive.Method;
- AString method;
- if (_archive.IsSolid && _archive.UseFilter || !_archive.IsSolid && useItemFilter)
- {
- method += kBcjMethod;
- method += ' ';
- }
- method += (methodIndex < kNumMethods) ? kMethods[methodIndex] : kUnknownMethod;
- if (methodIndex == NMethodType::kLZMA)
- {
- method += ':';
- method += GetStringForSizeValue(_archive.IsSolid ? _archive.DictionarySize: dictionary);
- }
- return method;
-}
-
-bool CHandler::GetUncompressedSize(int index, UInt32 &size)
-{
- size = 0;
- const CItem &item = _archive.Items[index];
- if (item.SizeIsDefined)
- size = item.Size;
- else if (_archive.IsSolid && item.EstimatedSizeIsDefined)
- size = item.EstimatedSize;
- else
- return false;
- return true;
-}
-
-bool CHandler::GetCompressedSize(int index, UInt32 &size)
-{
- size = 0;
- const CItem &item = _archive.Items[index];
- if (item.CompressedSizeIsDefined)
- size = item.CompressedSize;
- else
- {
- if (_archive.IsSolid)
- {
- if (index == 0)
- size = _archive.FirstHeader.GetDataSize();
- else
- return false;
- }
- else
- {
- if (!item.IsCompressed)
- size = item.Size;
- else
- return false;
- }
- }
- return true;
-}
-
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- #ifdef NSIS_SCRIPT
- if (index >= (UInt32)_archive.Items.Size())
- {
- switch(propID)
- {
- case kpidPath: prop = L"[NSIS].nsi"; break;
- case kpidSize:
- case kpidPackSize: prop = (UInt64)_archive.Script.Length(); break;
- case kpidSolid: prop = false; break;
- }
- }
- else
- #endif
- {
- const CItem &item = _archive.Items[index];
- switch(propID)
- {
- case kpidPath:
- {
- UString s = NItemName::WinNameToOSName(item.GetReducedName(_archive.IsUnicode));
- if (!s.IsEmpty())
- prop = (const wchar_t *)s;
- break;
- }
- case kpidSize:
- {
- UInt32 size;
- if (GetUncompressedSize(index, size))
- prop = (UInt64)size;
- break;
- }
- case kpidPackSize:
- {
- UInt32 size;
- if (GetCompressedSize(index, size))
- prop = (UInt64)size;
- break;
- }
- case kpidMTime:
- {
- if (item.MTime.dwHighDateTime > 0x01000000 &&
- item.MTime.dwHighDateTime < 0xFF000000)
- prop = item.MTime;
- break;
- }
- case kpidMethod: prop = GetMethod(item.UseFilter, item.DictionarySize); break;
- case kpidSolid: prop = _archive.IsSolid; break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- GetNumberOfItems(&numItems);
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
-
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- UInt32 index = (allFilesMode ? i : indices[i]);
- #ifdef NSIS_SCRIPT
- if (index >= (UInt32)_archive.Items.Size())
- totalSize += _archive.Script.Length();
- else
- #endif
- {
- UInt32 size;
- if (_archive.IsSolid)
- {
- GetUncompressedSize(index, size);
- UInt64 pos = _archive.GetPosOfSolidItem(index);
- if (pos > totalSize)
- totalSize = pos + size;
- }
- else
- {
- GetCompressedSize(index, size);
- totalSize += size;
- }
- }
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
- UInt32 currentItemSize = 0;
-
- UInt64 streamPos = 0;
- if (_archive.IsSolid)
- {
- RINOK(_inStream->Seek(_archive.StreamOffset, STREAM_SEEK_SET, NULL));
- bool useFilter;
- RINOK(_archive.Decoder.Init(
- EXTERNAL_CODECS_VARS
- _inStream, _archive.Method, _archive.FilterFlag, useFilter));
- }
-
- CByteBuffer byteBuf;
- const UInt32 kBufferLength = 1 << 16;
- byteBuf.SetCapacity(kBufferLength);
- Byte *buffer = byteBuf;
-
- CByteBuffer tempBuf;
-
- bool dataError = false;
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- currentItemSize = 0;
- RINOK(extractCallback->SetCompleted(&currentTotalSize));
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- #ifdef NSIS_SCRIPT
- if (index >= (UInt32)_archive.Items.Size())
- {
- currentItemSize = _archive.Script.Length();
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (!testMode)
- RINOK(WriteStream(realOutStream, (const char *)_archive.Script, (UInt32)_archive.Script.Length()));
- }
- else
- #endif
- {
- const CItem &item = _archive.Items[index];
-
- if (_archive.IsSolid)
- GetUncompressedSize(index, currentItemSize);
- else
- GetCompressedSize(index, currentItemSize);
-
- if (!testMode && !realOutStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
-
- if (!dataError)
- {
- bool needDecompress = false;
- bool sizeIsKnown = false;
- UInt32 fullSize = 0;
-
- bool writeToTemp = false;
- bool readFromTemp = false;
-
- if (_archive.IsSolid)
- {
- UInt64 pos = _archive.GetPosOfSolidItem(index);
- while (streamPos < pos)
- {
- size_t processedSize = (UInt32)MyMin(pos - streamPos, (UInt64)kBufferLength);
- HRESULT res = _archive.Decoder.Read(buffer, &processedSize);
- if (res != S_OK)
- {
- if (res != S_FALSE)
- return res;
- dataError = true;
- break;
- }
- if (processedSize == 0)
- {
- dataError = true;
- break;
- }
- streamPos += processedSize;
- }
- if (streamPos == pos)
- {
- Byte buffer2[4];
- size_t processedSize = 4;
- RINOK(_archive.Decoder.Read(buffer2, &processedSize));
- if (processedSize != 4)
- return E_FAIL;
- streamPos += processedSize;
- fullSize = Get32(buffer2);
- sizeIsKnown = true;
- needDecompress = true;
-
- if (!testMode && i + 1 < numItems)
- {
- UInt64 nextPos = _archive.GetPosOfSolidItem(allFilesMode ? i : indices[i + 1]);
- if (nextPos < streamPos + fullSize)
- {
- tempBuf.Free();
- tempBuf.SetCapacity(fullSize);
- writeToTemp = true;
- }
- }
- }
- else
- readFromTemp = true;
- }
- else
- {
- RINOK(_inStream->Seek(_archive.GetPosOfNonSolidItem(index) + 4, STREAM_SEEK_SET, NULL));
- if (item.IsCompressed)
- {
- needDecompress = true;
- bool useFilter;
- RINOK(_archive.Decoder.Init(
- EXTERNAL_CODECS_VARS
- _inStream, _archive.Method, _archive.FilterFlag, useFilter));
- // fullSize = Get32(buffer); // It's bug !!!
- // Test it: what is exact fullSize?
- fullSize = 0xFFFFFFFF;
- }
- else
- fullSize = item.Size;
- }
- if (!dataError)
- {
- if (needDecompress)
- {
- UInt64 offset = 0;
- while (!sizeIsKnown || fullSize > 0)
- {
- UInt32 curSize = kBufferLength;
- if (sizeIsKnown && curSize > fullSize)
- curSize = fullSize;
- size_t processedSize = curSize;
- HRESULT res = _archive.Decoder.Read(buffer, &processedSize);
- if (res != S_OK)
- {
- if (res != S_FALSE)
- return res;
- dataError = true;
- break;
- }
- if (processedSize == 0)
- {
- if (sizeIsKnown)
- dataError = true;
- break;
- }
-
- if (writeToTemp)
- memcpy((Byte *)tempBuf + (size_t)offset, buffer, processedSize);
-
- fullSize -= (UInt32)processedSize;
- streamPos += processedSize;
- offset += processedSize;
-
- UInt64 completed;
- if (_archive.IsSolid)
- completed = currentTotalSize + offset;
- else
- completed = streamPos;
- RINOK(extractCallback->SetCompleted(&completed));
- if (!testMode)
- RINOK(WriteStream(realOutStream, buffer, processedSize));
- }
- }
- else
- {
- if (readFromTemp)
- {
- if (!testMode)
- RINOK(WriteStream(realOutStream, tempBuf, tempBuf.GetCapacity()));
- }
- else
- while (fullSize > 0)
- {
- UInt32 curSize = MyMin(fullSize, kBufferLength);
- UInt32 processedSize;
- RINOK(_inStream->Read(buffer, curSize, &processedSize));
- if (processedSize == 0)
- {
- dataError = true;
- break;
- }
- fullSize -= processedSize;
- streamPos += processedSize;
- if (!testMode)
- RINOK(WriteStream(realOutStream, buffer, processedSize));
- }
- }
- }
- }
- }
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(dataError ?
- NExtract::NOperationResult::kDataError :
- NExtract::NOperationResult::kOK));
- }
- return S_OK;
- COM_TRY_END
-}
-
-IMPL_ISetCompressCodecsInfo
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisHandler.h b/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisHandler.h
deleted file mode 100644
index 6de493df8..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisHandler.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// NSisHandler.h
-
-#ifndef __NSIS_HANDLER_H
-#define __NSIS_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-
-#include "NsisIn.h"
-
-#include "../../Common/CreateCoder.h"
-
-namespace NArchive {
-namespace NNsis {
-
-class CHandler:
- public IInArchive,
- PUBLIC_ISetCompressCodecsInfo
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _inStream;
- CInArchive _archive;
-
- DECL_EXTERNAL_CODECS_VARS
-
- bool GetUncompressedSize(int index, UInt32 &size);
- bool GetCompressedSize(int index, UInt32 &size);
-
- AString GetMethod(bool useItemFilter, UInt32 dictionary) const;
-public:
- MY_QUERYINTERFACE_BEGIN2(IInArchive)
- QUERY_ENTRY_ISetCompressCodecsInfo
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- INTERFACE_IInArchive(;)
-
- DECL_ISetCompressCodecsInfo
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisIn.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisIn.cpp
deleted file mode 100644
index 407560085..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisIn.cpp
+++ /dev/null
@@ -1,1461 +0,0 @@
-// NsisIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/IntToString.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "NsisIn.h"
-
-#define Get32(p) GetUi32(p)
-
-namespace NArchive {
-namespace NNsis {
-
-Byte kSignature[kSignatureSize] = NSIS_SIGNATURE;
-
-#ifdef NSIS_SCRIPT
-static const char *kCrLf = "\x0D\x0A";
-#endif
-
-#define NS_UN_SKIP_CODE 0xE000
-#define NS_UN_VAR_CODE 0xE001
-#define NS_UN_SHELL_CODE 0xE002
-#define NS_UN_LANG_CODE 0xE003
-#define NS_UN_CODES_START NS_UN_SKIP_CODE
-#define NS_UN_CODES_END NS_UN_LANG_CODE
-
-Byte CInArchive::ReadByte()
-{
- if (_posInData >= _size)
- throw 1;
- return _data[_posInData++];
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- value |= ((UInt32)(ReadByte()) << (8 * i));
- return value;
-}
-
-void CInArchive::ReadBlockHeader(CBlockHeader &bh)
-{
- bh.Offset = ReadUInt32();
- bh.Num = ReadUInt32();
-}
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareItems(void *const *p1, void *const *p2, void * /* param */)
-{
- const CItem &i1 = **(CItem **)p1;
- const CItem &i2 = **(CItem **)p2;
- RINOZ(MyCompare(i1.Pos, i2.Pos));
- if (i1.IsUnicode)
- {
- RINOZ(i1.PrefixU.Compare(i2.PrefixU));
- RINOZ(i1.NameU.Compare(i2.NameU));
- }
- else
- {
- RINOZ(i1.PrefixA.Compare(i2.PrefixA));
- RINOZ(i1.NameA.Compare(i2.NameA));
- }
- return 0;
-}
-
-static AString UIntToString(UInt32 v)
-{
- char sz[32];
- ConvertUInt64ToString(v, sz);
- return sz;
-}
-
-static AString IntToString(Int32 v)
-{
- char sz[32];
- ConvertInt64ToString(v, sz);
- return sz;
-}
-
-AString CInArchive::ReadStringA(UInt32 pos) const
-{
- AString s;
- if (pos >= _size)
- return IntToString((Int32)pos);
- UInt32 offset = GetOffset() + _stringsPos + pos;
- for (;;)
- {
- if (offset >= _size)
- break; // throw 1;
- char c = _data[offset++];
- if (c == 0)
- break;
- s += c;
- }
- return s;
-}
-
-UString CInArchive::ReadStringU(UInt32 pos) const
-{
- UString s;
- UInt32 offset = GetOffset() + _stringsPos + (pos * 2);
- for (;;)
- {
- if (offset >= _size || offset + 1 >= _size)
- return s; // throw 1;
- char c0 = _data[offset++];
- char c1 = _data[offset++];
- wchar_t c = (c0 | ((wchar_t)c1 << 8));
- if (c == 0)
- break;
- s += c;
- }
- return s;
-}
-
-/*
-static AString ParsePrefix(const AString &prefix)
-{
- AString res = prefix;
- if (prefix.Length() >= 3)
- {
- if ((Byte)prefix[0] == 0xFD && (Byte)prefix[1] == 0x95 && (Byte)prefix[2] == 0x80)
- res = "$INSTDIR" + prefix.Mid(3);
- else if ((Byte)prefix[0] == 0xFD && (Byte)prefix[1] == 0x96 && (Byte)prefix[2] == 0x80)
- res = "$OUTDIR" + prefix.Mid(3);
- }
- return res;
-}
-*/
-
-#define SYSREGKEY "Software\\Microsoft\\Windows\\CurrentVersion"
-
-/*
-# define CSIDL_PROGRAMS 0x2
-# define CSIDL_PRINTERS 0x4
-# define CSIDL_PERSONAL 0x5
-# define CSIDL_FAVORITES 0x6
-# define CSIDL_STARTUP 0x7
-# define CSIDL_RECENT 0x8
-# define CSIDL_SENDTO 0x9
-# define CSIDL_STARTMENU 0xB
-# define CSIDL_MYMUSIC 0xD
-# define CSIDL_MYVIDEO 0xE
-
-# define CSIDL_DESKTOPDIRECTORY 0x10
-# define CSIDL_NETHOOD 0x13
-# define CSIDL_FONTS 0x14
-# define CSIDL_TEMPLATES 0x15
-# define CSIDL_COMMON_STARTMENU 0x16
-# define CSIDL_COMMON_PROGRAMS 0x17
-# define CSIDL_COMMON_STARTUP 0x18
-# define CSIDL_COMMON_DESKTOPDIRECTORY 0x19
-# define CSIDL_APPDATA 0x1A
-# define CSIDL_PRINTHOOD 0x1B
-# define CSIDL_LOCAL_APPDATA 0x1C
-# define CSIDL_ALTSTARTUP 0x1D
-# define CSIDL_COMMON_ALTSTARTUP 0x1E
-# define CSIDL_COMMON_FAVORITES 0x1F
-
-# define CSIDL_INTERNET_CACHE 0x20
-# define CSIDL_COOKIES 0x21
-# define CSIDL_HISTORY 0x22
-# define CSIDL_COMMON_APPDATA 0x23
-# define CSIDL_WINDOWS 0x24
-# define CSIDL_SYSTEM 0x25
-# define CSIDL_PROGRAM_FILES 0x26
-# define CSIDL_MYPICTURES 0x27
-# define CSIDL_PROFILE 0x28
-# define CSIDL_PROGRAM_FILES_COMMON 0x2B
-# define CSIDL_COMMON_TEMPLATES 0x2D
-# define CSIDL_COMMON_DOCUMENTS 0x2E
-# define CSIDL_COMMON_ADMINTOOLS 0x2F
-
-# define CSIDL_ADMINTOOLS 0x30
-# define CSIDL_COMMON_MUSIC 0x35
-# define CSIDL_COMMON_PICTURES 0x36
-# define CSIDL_COMMON_VIDEO 0x37
-# define CSIDL_RESOURCES 0x38
-# define CSIDL_RESOURCES_LOCALIZED 0x39
-# define CSIDL_CDBURN_AREA 0x3B
-*/
-
-struct CCommandPair
-{
- int NumParams;
- const char *Name;
-};
-
-enum
-{
- // 0
- EW_INVALID_OPCODE, // zero is invalid. useful for catching errors. (otherwise an all zeroes instruction
- // does nothing, which is easily ignored but means something is wrong.
- EW_RET, // return from function call
- EW_NOP, // Nop/Jump, do nothing: 1, [?new address+1:advance one]
- EW_ABORT, // Abort: 1 [status]
- EW_QUIT, // Quit: 0
- EW_CALL, // Call: 1 [new address+1]
- EW_UPDATETEXT, // Update status text: 2 [update str, ui_st_updateflag=?ui_st_updateflag:this]
- EW_SLEEP, // Sleep: 1 [sleep time in milliseconds]
- EW_BRINGTOFRONT, // BringToFront: 0
- EW_CHDETAILSVIEW, // SetDetailsView: 2 [listaction,buttonaction]
-
- // 10
- EW_SETFILEATTRIBUTES, // SetFileAttributes: 2 [filename, attributes]
- EW_CREATEDIR, // Create directory: 2, [path, ?update$INSTDIR]
- EW_IFFILEEXISTS, // IfFileExists: 3, [file name, jump amount if exists, jump amount if not exists]
- EW_SETFLAG, // Sets a flag: 2 [id, data]
- EW_IFFLAG, // If a flag: 4 [on, off, id, new value mask]
- EW_GETFLAG, // Gets a flag: 2 [output, id]
- EW_RENAME, // Rename: 3 [old, new, rebootok]
- EW_GETFULLPATHNAME, // GetFullPathName: 2 [output, input, ?lfn:sfn]
- EW_SEARCHPATH, // SearchPath: 2 [output, filename]
- EW_GETTEMPFILENAME, // GetTempFileName: 2 [output, base_dir]
-
- // 20
- EW_EXTRACTFILE, // File to extract: 6 [overwriteflag, output filename, compressed filedata, filedatetimelow, filedatetimehigh, allow ignore]
- // overwriteflag: 0x1 = no. 0x0=force, 0x2=try, 0x3=if date is newer
- EW_DELETEFILE, // Delete File: 2, [filename, rebootok]
- EW_MESSAGEBOX, // MessageBox: 5,[MB_flags,text,retv1:retv2,moveonretv1:moveonretv2]
- EW_RMDIR, // RMDir: 2 [path, recursiveflag]
- EW_STRLEN, // StrLen: 2 [output, input]
- EW_ASSIGNVAR, // Assign: 4 [variable (0-9) to assign, string to assign, maxlen, startpos]
- EW_STRCMP, // StrCmp: 5 [str1, str2, jump_if_equal, jump_if_not_equal, case-sensitive?]
- EW_READENVSTR, // ReadEnvStr/ExpandEnvStrings: 3 [output, string_with_env_variables, IsRead]
- EW_INTCMP, // IntCmp: 6 [val1, val2, equal, val1<val2, val1>val2, unsigned?]
- EW_INTOP, // IntOp: 4 [output, input1, input2, op] where op: 0=add, 1=sub, 2=mul, 3=div, 4=bor, 5=band, 6=bxor, 7=bnot input1, 8=lnot input1, 9=lor, 10=land], 11=1%2
-
- // 30
- EW_INTFMT, // IntFmt: [output, format, input]
- EW_PUSHPOP, // Push/Pop/Exchange: 3 [variable/string, ?pop:push, ?exch]
- EW_FINDWINDOW, // FindWindow: 5, [outputvar, window class,window name, window_parent, window_after]
- EW_SENDMESSAGE, // SendMessage: 6 [output, hwnd, msg, wparam, lparam, [wparamstring?1:0 | lparamstring?2:0 | timeout<<2]
- EW_ISWINDOW, // IsWindow: 3 [hwnd, jump_if_window, jump_if_notwindow]
- EW_GETDLGITEM, // GetDlgItem: 3: [outputvar, dialog, item_id]
- EW_SETCTLCOLORS, // SerCtlColors: 3: [hwnd, pointer to struct colors]
- EW_SETBRANDINGIMAGE, // SetBrandingImage: 1: [Bitmap file]
- EW_CREATEFONT, // CreateFont: 5: [handle output, face name, height, weight, flags]
- EW_SHOWWINDOW, // ShowWindow: 2: [hwnd, show state]
-
- // 40
- EW_SHELLEXEC, // ShellExecute program: 4, [shell action, complete commandline, parameters, showwindow]
- EW_EXECUTE, // Execute program: 3,[complete command line,waitflag,>=0?output errorcode]
- EW_GETFILETIME, // GetFileTime; 3 [file highout lowout]
- EW_GETDLLVERSION, // GetDLLVersion: 3 [file highout lowout]
- EW_REGISTERDLL, // Register DLL: 3,[DLL file name, string ptr of function to call, text to put in display (<0 if none/pass parms), 1 - no unload, 0 - unload]
- EW_CREATESHORTCUT, // Make Shortcut: 5, [link file, target file, parameters, icon file, iconindex|show mode<<8|hotkey<<16]
- EW_COPYFILES, // CopyFiles: 3 [source mask, destination location, flags]
- EW_REBOOT, // Reboot: 0
- EW_WRITEINI, // Write INI String: 4, [Section, Name, Value, INI File]
- EW_READINISTR, // ReadINIStr: 4 [output, section, name, ini_file]
-
- // 50
- EW_DELREG, // DeleteRegValue/DeleteRegKey: 4, [root key(int), KeyName, ValueName, delkeyonlyifempty]. ValueName is -1 if delete key
- EW_WRITEREG, // Write Registry value: 5, [RootKey(int),KeyName,ItemName,ItemData,typelen]
- // typelen=1 for str, 2 for dword, 3 for binary, 0 for expanded str
- EW_READREGSTR, // ReadRegStr: 5 [output, rootkey(int), keyname, itemname, ==1?int::str]
- EW_REGENUM, // RegEnum: 5 [output, rootkey, keyname, index, ?key:value]
- EW_FCLOSE, // FileClose: 1 [handle]
- EW_FOPEN, // FileOpen: 4 [name, openmode, createmode, outputhandle]
- EW_FPUTS, // FileWrite: 3 [handle, string, ?int:string]
- EW_FGETS, // FileRead: 4 [handle, output, maxlen, ?getchar:gets]
- EW_FSEEK, // FileSeek: 4 [handle, offset, mode, >=0?positionoutput]
- EW_FINDCLOSE, // FindClose: 1 [handle]
-
- // 60
- EW_FINDNEXT, // FindNext: 2 [output, handle]
- EW_FINDFIRST, // FindFirst: 2 [filespec, output, handleoutput]
- EW_WRITEUNINSTALLER, // WriteUninstaller: 3 [name, offset, icon_size]
- EW_LOG, // LogText: 2 [0, text] / LogSet: [1, logstate]
- EW_SECTIONSET, // SectionSetText: 3: [idx, 0, text]
- // SectionGetText: 3: [idx, 1, output]
- // SectionSetFlags: 3: [idx, 2, flags]
- // SectionGetFlags: 3: [idx, 3, output]
- EW_INSTTYPESET, // InstTypeSetFlags: 3: [idx, 0, flags]
- // InstTypeGetFlags: 3: [idx, 1, output]
- // instructions not actually implemented in exehead, but used in compiler.
- EW_GETLABELADDR, // both of these get converted to EW_ASSIGNVAR
- EW_GETFUNCTIONADDR,
-
- EW_LOCKWINDOW
-};
-
-#ifdef NSIS_SCRIPT
-static CCommandPair kCommandPairs[] =
-{
- { 0, "Invalid" },
- { 0, "Return" },
- { 1, "Goto" },
- { 0, "Abort" },
- { 0, "Quit" },
- { 1, "Call" },
- { 2, "UpdateSatusText" },
- { 1, "Sleep" },
- { 0, "BringToFront" },
- { 2, "SetDetailsView" },
-
- { 2, "SetFileAttributes" },
- { 2, "SetOutPath" },
- { 3, "IfFileExists" },
- { 2, "SetFlag" },
- { 4, "IfFlag" },
- { 2, "GetFlag" },
- { 3, "Rename" },
- { 2, "GetFullPathName" },
- { 2, "SearchPath" },
- { 2, "GetTempFileName" },
-
- { 6, "File" },
- { 2, "Delete" },
- { 5, "MessageBox" },
- { 2, "RMDir" },
- { 2, "StrLen" },
- { 4, "StrCpy" },
- { 5, "StrCmp" },
- { 3, "ReadEnvStr" },
- { 6, "IntCmp" },
- { 4, "IntOp" },
-
- { 3, "IntFmt" },
- { 3, "PushPop" },
- { 5, "FindWindow" },
- { 6, "SendMessage" },
- { 3, "IsWindow" },
- { 3, "GetDlgItem" },
- { 3, "SerCtlColors" },
- { 1, "SetBrandingImage" },
- { 5, "CreateFont" },
- { 2, "ShowWindow" },
-
- { 4, "ShellExecute" },
- { 3, "Execute" },
- { 3, "GetFileTime" },
- { 3, "GetDLLVersion" },
- { 3, "RegisterDLL" },
- { 5, "CreateShortCut" },
- { 3, "CopyFiles" },
- { 0, "Reboot" },
- { 4, "WriteINIStr" },
- { 4, "ReadINIStr" },
-
- { 4, "DelReg" },
- { 5, "WriteReg" },
- { 5, "ReadRegStr" },
- { 5, "RegEnum" },
- { 1, "FileClose" },
- { 4, "FileOpen" },
- { 3, "FileWrite" },
- { 4, "FileRead" },
- { 4, "FileSeek" },
- { 1, "FindClose" },
-
- { 2, "FindNext" },
- { 2, "FindFirst" },
- { 3, "WriteUninstaller" },
- { 2, "LogText" },
- { 3, "Section?etText" },
- { 3, "InstType?etFlags" },
- { 6, "GetLabelAddr" },
- { 2, "GetFunctionAddress" },
- { 6, "LockWindow" }
-};
-
-#endif
-
-static const char *kShellStrings[] =
-{
- "",
- "",
-
- "SMPROGRAMS",
- "",
- "PRINTERS",
- "DOCUMENTS",
- "FAVORITES",
- "SMSTARTUP",
- "RECENT",
- "SENDTO",
- "",
- "STARTMENU",
- "",
- "MUSIC",
- "VIDEO",
- "",
-
- "DESKTOP",
- "",
- "",
- "NETHOOD",
- "FONTS",
- "TEMPLATES",
- "COMMONSTARTMENU",
- "COMMONFILES",
- "COMMON_STARTUP",
- "COMMON_DESKTOPDIRECTORY",
- "QUICKLAUNCH",
- "PRINTHOOD",
- "LOCALAPPDATA",
- "ALTSTARTUP",
- "ALTSTARTUP",
- "FAVORITES",
-
- "INTERNET_CACHE",
- "COOKIES",
- "HISTORY",
- "APPDATA",
- "WINDIR",
- "SYSDIR",
- "PROGRAMFILES",
- "PICTURES",
- "PROFILE",
- "",
- "",
- "COMMONFILES",
- "",
- "TEMPLATES",
- "DOCUMENTS",
- "ADMINTOOLS",
-
- "ADMINTOOLS",
- "",
- "",
- "",
- "",
- "MUSIC",
- "PICTURES",
- "VIDEO",
- "RESOURCES",
- "RESOURCES_LOCALIZED",
- "",
- "CDBURN_AREA"
-};
-
-static const int kNumShellStrings = sizeof(kShellStrings) / sizeof(kShellStrings[0]);
-
-/*
-# define CMDLINE 20 // everything before here doesn't have trailing slash removal
-# define INSTDIR 21
-# define OUTDIR 22
-# define EXEDIR 23
-# define LANGUAGE 24
-# define TEMP 25
-# define PLUGINSDIR 26
-# define HWNDPARENT 27
-# define _CLICK 28
-# define _OUTDIR 29
-*/
-
-static const char *kVarStrings[] =
-{
- "CMDLINE",
- "INSTDIR",
- "OUTDIR",
- "EXEDIR",
- "LANGUAGE",
- "TEMP",
- "PLUGINSDIR",
- "EXEPATH", // test it
- "EXEFILE", // test it
- "HWNDPARENT",
- "_CLICK",
- "_OUTDIR"
-};
-
-static const int kNumVarStrings = sizeof(kVarStrings) / sizeof(kVarStrings[0]);
-
-
-static AString GetVar(UInt32 index)
-{
- AString res = "$";
- if (index < 10)
- res += UIntToString(index);
- else if (index < 20)
- {
- res += "R";
- res += UIntToString(index - 10);
- }
- else if (index < 20 + kNumVarStrings)
- res += kVarStrings[index - 20];
- else
- {
- res += "[";
- res += UIntToString(index);
- res += "]";
- }
- return res;
-}
-
-#define NS_SKIP_CODE 252
-#define NS_VAR_CODE 253
-#define NS_SHELL_CODE 254
-#define NS_LANG_CODE 255
-#define NS_CODES_START NS_SKIP_CODE
-
-static AString GetShellString(int index)
-{
- AString res = "$";
- if (index < kNumShellStrings)
- {
- const char *sz = kShellStrings[index];
- if (sz[0] != 0)
- return res + sz;
- }
- res += "SHELL[";
- res += UIntToString(index);
- res += "]";
- return res;
-}
-
-// Based on Dave Laundon's simplified process_string
-AString GetNsisString(const AString &s)
-{
- AString res;
- for (int i = 0; i < s.Length();)
- {
- unsigned char nVarIdx = s[i++];
- if (nVarIdx > NS_CODES_START && i + 2 <= s.Length())
- {
- int nData = s[i++] & 0x7F;
- unsigned char c1 = s[i++];
- nData |= (((int)(c1 & 0x7F)) << 7);
-
- if (nVarIdx == NS_SHELL_CODE)
- res += GetShellString(c1);
- else if (nVarIdx == NS_VAR_CODE)
- res += GetVar(nData);
- else if (nVarIdx == NS_LANG_CODE)
- res += "NS_LANG_CODE";
- }
- else if (nVarIdx == NS_SKIP_CODE)
- {
- if (i < s.Length())
- res += s[i++];
- }
- else // Normal char
- res += (char)nVarIdx;
- }
- return res;
-}
-
-UString GetNsisString(const UString &s)
-{
- UString res;
- for (int i = 0; i < s.Length();)
- {
- wchar_t nVarIdx = s[i++];
- if (nVarIdx > NS_UN_CODES_START && nVarIdx <= NS_UN_CODES_END)
- {
- if (i == s.Length())
- break;
- int nData = s[i++] & 0x7FFF;
-
- if (nVarIdx == NS_UN_SHELL_CODE)
- res += GetUnicodeString(GetShellString(nData >> 8));
- else if (nVarIdx == NS_UN_VAR_CODE)
- res += GetUnicodeString(GetVar(nData));
- else if (nVarIdx == NS_UN_LANG_CODE)
- res += L"NS_LANG_CODE";
- }
- else if (nVarIdx == NS_UN_SKIP_CODE)
- {
- if (i == s.Length())
- break;
- res += s[i++];
- }
- else // Normal char
- res += (char)nVarIdx;
- }
- return res;
-}
-
-AString CInArchive::ReadString2A(UInt32 pos) const
-{
- return GetNsisString(ReadStringA(pos));
-}
-
-UString CInArchive::ReadString2U(UInt32 pos) const
-{
- return GetNsisString(ReadStringU(pos));
-}
-
-AString CInArchive::ReadString2(UInt32 pos) const
-{
- if (IsUnicode)
- return UnicodeStringToMultiByte(ReadString2U(pos));
- else
- return ReadString2A(pos);
-}
-
-AString CInArchive::ReadString2Qw(UInt32 pos) const
-{
- return "\"" + ReadString2(pos) + "\"";
-}
-
-#define DEL_DIR 1
-#define DEL_RECURSE 2
-#define DEL_REBOOT 4
-// #define DEL_SIMPLE 8
-
-static const int kNumEntryParams = 6;
-
-struct CEntry
-{
- UInt32 Which;
- UInt32 Params[kNumEntryParams];
- AString GetParamsString(int numParams);
- CEntry()
- {
- Which = 0;
- for (UInt32 j = 0; j < kNumEntryParams; j++)
- Params[j] = 0;
- }
-};
-
-AString CEntry::GetParamsString(int numParams)
-{
- AString s;
- for (int i = 0; i < numParams; i++)
- {
- s += " ";
- UInt32 v = Params[i];
- if (v > 0xFFF00000)
- s += IntToString((Int32)Params[i]);
- else
- s += UIntToString(Params[i]);
- }
- return s;
-}
-
-#ifdef NSIS_SCRIPT
-
-static AString GetRegRootID(UInt32 val)
-{
- const char *s;
- switch(val)
- {
- case 0: s = "SHCTX"; break;
- case 0x80000000: s = "HKCR"; break;
- case 0x80000001: s = "HKCU"; break;
- case 0x80000002: s = "HKLM"; break;
- case 0x80000003: s = "HKU"; break;
- case 0x80000004: s = "HKPD"; break;
- case 0x80000005: s = "HKCC"; break;
- case 0x80000006: s = "HKDD"; break;
- case 0x80000050: s = "HKPT"; break;
- case 0x80000060: s = "HKPN"; break;
- default:
- return UIntToString(val); break;
- }
- return s;
-}
-
-#endif
-
-HRESULT CInArchive::ReadEntries(const CBlockHeader &bh)
-{
- _posInData = bh.Offset + GetOffset();
- AString prefixA;
- UString prefixU;
- for (UInt32 i = 0; i < bh.Num; i++)
- {
- CEntry e;
- e.Which = ReadUInt32();
- for (UInt32 j = 0; j < kNumEntryParams; j++)
- e.Params[j] = ReadUInt32();
- #ifdef NSIS_SCRIPT
- if (e.Which != EW_PUSHPOP && e.Which < sizeof(kCommandPairs) / sizeof(kCommandPairs[0]))
- {
- const CCommandPair &pair = kCommandPairs[e.Which];
- Script += pair.Name;
- }
- #endif
-
- switch (e.Which)
- {
- case EW_CREATEDIR:
- {
- if (IsUnicode)
- {
- prefixU.Empty();
- prefixU = ReadString2U(e.Params[0]);
- }
- else
- {
- prefixA.Empty();
- prefixA = ReadString2A(e.Params[0]);
- }
- #ifdef NSIS_SCRIPT
- Script += " ";
- if (IsUnicode)
- Script += UnicodeStringToMultiByte(prefixU);
- else
- Script += prefixA;
- #endif
- break;
- }
-
- case EW_EXTRACTFILE:
- {
- CItem item;
- item.IsUnicode = IsUnicode;
- if (IsUnicode)
- {
- item.PrefixU = prefixU;
- item.NameU = ReadString2U(e.Params[1]);
- }
- else
- {
- item.PrefixA = prefixA;
- item.NameA = ReadString2A(e.Params[1]);
- }
- /* UInt32 overwriteFlag = e.Params[0]; */
- item.Pos = e.Params[2];
- item.MTime.dwLowDateTime = e.Params[3];
- item.MTime.dwHighDateTime = e.Params[4];
- /* UInt32 allowIgnore = e.Params[5]; */
- if (Items.Size() > 0)
- {
- /*
- if (item.Pos == Items.Back().Pos)
- continue;
- */
- }
- Items.Add(item);
- #ifdef NSIS_SCRIPT
- Script += " ";
-
- if (IsUnicode)
- Script += UnicodeStringToMultiByte(item.NameU);
- else
- Script += item.NameA;
- #endif
- break;
- }
-
-
- #ifdef NSIS_SCRIPT
- case EW_UPDATETEXT:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += UIntToString(e.Params[1]);
- break;
- }
- case EW_SETFILEATTRIBUTES:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += UIntToString(e.Params[1]);
- break;
- }
- case EW_IFFILEEXISTS:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += UIntToString(e.Params[1]);
- Script += " ";
- Script += UIntToString(e.Params[2]);
- break;
- }
- case EW_RENAME:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
- Script += " ";
- Script += UIntToString(e.Params[2]);
- break;
- }
- case EW_GETFULLPATHNAME:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
- Script += " ";
- Script += UIntToString(e.Params[2]);
- break;
- }
- case EW_SEARCHPATH:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
- break;
- }
- case EW_GETTEMPFILENAME:
- {
- AString s;
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
- break;
- }
-
- case EW_DELETEFILE:
- {
- UInt64 flag = e.Params[1];
- if (flag != 0)
- {
- Script += " ";
- if (flag == DEL_REBOOT)
- Script += "/REBOOTOK";
- else
- Script += UIntToString(e.Params[1]);
- }
- Script += " ";
- Script += ReadString2(e.Params[0]);
- break;
- }
- case EW_RMDIR:
- {
- UInt64 flag = e.Params[1];
- if (flag != 0)
- {
- if ((flag & DEL_REBOOT) != 0)
- Script += " /REBOOTOK";
- if ((flag & DEL_RECURSE) != 0)
- Script += " /r";
- }
- Script += " ";
- Script += ReadString2(e.Params[0]);
- break;
- }
- case EW_STRLEN:
- {
- Script += " ";
- Script += GetVar(e.Params[0]);;
- Script += " ";
- Script += ReadString2Qw(e.Params[1]);
- break;
- }
- case EW_ASSIGNVAR:
- {
- Script += " ";
- Script += GetVar(e.Params[0]);;
- Script += " ";
- Script += ReadString2Qw(e.Params[1]);
- AString maxLen, startOffset;
- if (e.Params[2] != 0)
- maxLen = ReadString2(e.Params[2]);
- if (e.Params[3] != 0)
- startOffset = ReadString2(e.Params[3]);
- if (!maxLen.IsEmpty() || !startOffset.IsEmpty())
- {
- Script += " ";
- if (maxLen.IsEmpty())
- Script += "\"\"";
- else
- Script += maxLen;
- if (!startOffset.IsEmpty())
- {
- Script += " ";
- Script += startOffset;
- }
- }
- break;
- }
- case EW_STRCMP:
- {
- Script += " ";
-
- Script += " ";
- Script += ReadString2Qw(e.Params[0]);
-
- Script += " ";
- Script += ReadString2Qw(e.Params[1]);
-
- for (int j = 2; j < 5; j++)
- {
- Script += " ";
- Script += UIntToString(e.Params[j]);
- }
- break;
- }
- case EW_INTCMP:
- {
- if (e.Params[5] != 0)
- Script += "U";
-
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
-
- for (int i = 2; i < 5; i++)
- {
- Script += " ";
- Script += UIntToString(e.Params[i]);
- }
- break;
- }
- case EW_INTOP:
- {
- Script += " ";
- Script += GetVar(e.Params[0]);
- Script += " ";
- int numOps = 2;
- AString op;
- switch (e.Params[3])
- {
- case 0: op = '+'; break;
- case 1: op = '-'; break;
- case 2: op = '*'; break;
- case 3: op = '/'; break;
- case 4: op = '|'; break;
- case 5: op = '&'; break;
- case 6: op = '^'; break;
- case 7: op = '~'; numOps = 1; break;
- case 8: op = '!'; numOps = 1; break;
- case 9: op = "||"; break;
- case 10: op = "&&"; break;
- case 11: op = '%'; break;
- default: op = UIntToString(e.Params[3]);
- }
- AString p1 = ReadString2(e.Params[1]);
- if (numOps == 1)
- {
- Script += op;
- Script += p1;
- }
- else
- {
- Script += p1;
- Script += " ";
- Script += op;
- Script += " ";
- Script += ReadString2(e.Params[2]);
- }
- break;
- }
-
- case EW_PUSHPOP:
- {
- int isPop = (e.Params[1] != 0);
- if (isPop)
- {
- Script += "Pop";
- Script += " ";
- Script += GetVar(e.Params[0]);;
- }
- else
- {
- int isExch = (e.Params[2] != 0);
- if (isExch)
- {
- Script += "Exch";
- }
- else
- {
- Script += "Push";
- Script += " ";
- Script += ReadString2(e.Params[0]);
- }
- }
- break;
- }
-
- case EW_SENDMESSAGE:
- {
- // SendMessage: 6 [output, hwnd, msg, wparam, lparam, [wparamstring?1:0 | lparamstring?2:0 | timeout<<2]
- Script += " ";
- // Script += ReadString2(e.Params[0]);
- // Script += " ";
- Script += ReadString2(e.Params[1]);
- Script += " ";
- Script += ReadString2(e.Params[2]);
-
- Script += " ";
- UInt32 spec = e.Params[5];
- // if (spec & 1)
- Script += IntToString(e.Params[3]);
- // else
- // Script += ReadString2(e.Params[3]);
-
- Script += " ";
- // if (spec & 2)
- Script += IntToString(e.Params[4]);
- // else
- // Script += ReadString2(e.Params[4]);
-
- if ((Int32)e.Params[0] >= 0)
- {
- Script += " ";
- Script += GetVar(e.Params[1]);
- }
-
- spec >>= 2;
- if (spec != 0)
- {
- Script += " /TIMEOUT=";
- Script += IntToString(spec);
- }
- break;
- }
-
- case EW_GETDLGITEM:
- {
- Script += " ";
- Script += GetVar(e.Params[0]);;
- Script += " ";
- Script += ReadString2(e.Params[1]);
- Script += " ";
- Script += ReadString2(e.Params[2]);
- break;
- }
-
-
- case EW_REGISTERDLL:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
- Script += " ";
- Script += UIntToString(e.Params[2]);
- break;
- }
-
- case EW_CREATESHORTCUT:
- {
- AString s;
-
- Script += " ";
- Script += ReadString2Qw(e.Params[0]);
-
- Script += " ";
- Script += ReadString2Qw(e.Params[1]);
-
- for (int j = 2; j < 5; j++)
- {
- Script += " ";
- Script += UIntToString(e.Params[j]);
- }
- break;
- }
-
- /*
- case EW_DELREG:
- {
- AString keyName, valueName;
- keyName = ReadString2(e.Params[1]);
- bool isValue = (e.Params[2] != -1);
- if (isValue)
- {
- valueName = ReadString2(e.Params[2]);
- Script += "Key";
- }
- else
- Script += "Value";
- Script += " ";
- Script += UIntToString(e.Params[0]);
- Script += " ";
- Script += keyName;
- if (isValue)
- {
- Script += " ";
- Script += valueName;
- }
- Script += " ";
- Script += UIntToString(e.Params[3]);
- break;
- }
- */
-
- case EW_WRITEREG:
- {
- AString s;
- switch(e.Params[4])
- {
- case 1: s = "Str"; break;
- case 2: s = "ExpandStr"; break;
- case 3: s = "Bin"; break;
- case 4: s = "DWORD"; break;
- default: s = "?" + UIntToString(e.Params[4]); break;
- }
- Script += s;
- Script += " ";
- Script += GetRegRootID(e.Params[0]);
- Script += " ";
-
- AString keyName, valueName;
- keyName = ReadString2Qw(e.Params[1]);
- Script += keyName;
- Script += " ";
-
- valueName = ReadString2Qw(e.Params[2]);
- Script += valueName;
- Script += " ";
-
- valueName = ReadString2Qw(e.Params[3]);
- Script += valueName;
- Script += " ";
-
- break;
- }
-
- case EW_WRITEUNINSTALLER:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- for (int j = 1; j < 3; j++)
- {
- Script += " ";
- Script += UIntToString(e.Params[j]);
- }
- break;
- }
-
- default:
- {
- int numParams = kNumEntryParams;
- if (e.Which < sizeof(kCommandPairs) / sizeof(kCommandPairs[0]))
- {
- const CCommandPair &pair = kCommandPairs[e.Which];
- // Script += pair.Name;
- numParams = pair.NumParams;
- }
- else
- {
- Script += "Unknown";
- Script += UIntToString(e.Which);
- }
- Script += e.GetParamsString(numParams);
- }
- #endif
- }
- #ifdef NSIS_SCRIPT
- Script += kCrLf;
- #endif
- }
-
- {
- Items.Sort(CompareItems, 0);
- int i;
- // if (IsSolid)
- for (i = 0; i + 1 < Items.Size();)
- {
- bool sameName = IsUnicode ?
- (Items[i].NameU == Items[i + 1].NameU) :
- (Items[i].NameA == Items[i + 1].NameA);
- if (Items[i].Pos == Items[i + 1].Pos && sameName)
- Items.Delete(i + 1);
- else
- i++;
- }
- for (i = 0; i < Items.Size(); i++)
- {
- CItem &item = Items[i];
- UInt32 curPos = item.Pos + 4;
- for (int nextIndex = i + 1; nextIndex < Items.Size(); nextIndex++)
- {
- UInt32 nextPos = Items[nextIndex].Pos;
- if (curPos <= nextPos)
- {
- item.EstimatedSizeIsDefined = true;
- item.EstimatedSize = nextPos - curPos;
- break;
- }
- }
- }
- if (!IsSolid)
- {
- for (i = 0; i < Items.Size(); i++)
- {
- CItem &item = Items[i];
- RINOK(_stream->Seek(GetPosOfNonSolidItem(i), STREAM_SEEK_SET, NULL));
- const UInt32 kSigSize = 4 + 1 + 5;
- BYTE sig[kSigSize];
- size_t processedSize = kSigSize;
- RINOK(ReadStream(_stream, sig, &processedSize));
- if (processedSize < 4)
- return S_FALSE;
- UInt32 size = Get32(sig);
- if ((size & 0x80000000) != 0)
- {
- item.IsCompressed = true;
- // is compressed;
- size &= ~0x80000000;
- if (Method == NMethodType::kLZMA)
- {
- if (processedSize < 9)
- return S_FALSE;
- if (FilterFlag)
- item.UseFilter = (sig[4] != 0);
- item.DictionarySize = Get32(sig + 5 + (FilterFlag ? 1 : 0));
- }
- }
- else
- {
- item.IsCompressed = false;
- item.Size = size;
- item.SizeIsDefined = true;
- }
- item.CompressedSize = size;
- item.CompressedSizeIsDefined = true;
- }
- }
- }
- return S_OK;
-}
-
-HRESULT CInArchive::Parse()
-{
- // UInt32 offset = ReadUInt32();
- // ???? offset == FirstHeader.HeaderLength
- /* UInt32 ehFlags = */ ReadUInt32();
- CBlockHeader bhPages, bhSections, bhEntries, bhStrings, bhLangTables, bhCtlColors, bhData;
- // CBlockHeader bgFont;
- ReadBlockHeader(bhPages);
- ReadBlockHeader(bhSections);
- ReadBlockHeader(bhEntries);
- ReadBlockHeader(bhStrings);
- ReadBlockHeader(bhLangTables);
- ReadBlockHeader(bhCtlColors);
- // ReadBlockHeader(bgFont);
- ReadBlockHeader(bhData);
-
- _stringsPos = bhStrings.Offset;
- UInt32 pos = GetOffset() + _stringsPos;
- int numZeros0 = 0;
- int numZeros1 = 0;
- int i;
- const int kBlockSize = 256;
- for (i = 0; i < kBlockSize; i++)
- {
- if (pos >= _size || pos + 1 >= _size)
- break;
- char c0 = _data[pos++];
- char c1 = _data[pos++];
- wchar_t c = (c0 | ((wchar_t)c1 << 8));
-
- if (c >= NS_UN_CODES_START && c < NS_UN_CODES_END)
- {
- if (pos >= _size || pos + 1 >= _size)
- break;
- pos += 2;
- numZeros1++;
- }
- else
- {
- if (c0 == 0 && c1 != 0)
- numZeros0++;
- if (c1 == 0)
- numZeros1++;
- }
- // printf("\nnumZeros0 = %2x %2x", _data[pos + 0], _data[pos + 1]);
- }
- IsUnicode = (numZeros1 > numZeros0 * 3 + kBlockSize / 16);
- // printf("\nnumZeros0 = %3d numZeros1 = %3d", numZeros0, numZeros1);
- return ReadEntries(bhEntries);
-}
-
-static bool IsLZMA(const Byte *p, UInt32 &dictionary)
-{
- dictionary = Get32(p + 1);
- return (p[0] == 0x5D && p[1] == 0x00 && p[2] == 0x00 && p[5] == 0x00);
-}
-
-static bool IsLZMA(const Byte *p, UInt32 &dictionary, bool &thereIsFlag)
-{
- if (IsLZMA(p, dictionary))
- {
- thereIsFlag = false;
- return true;
- }
- if (IsLZMA(p + 1, dictionary))
- {
- thereIsFlag = true;
- return true;
- }
- return false;
-}
-
-static bool IsBZip2(const Byte *p)
-{
- return (p[0] == 0x31 && p[1] < 14);
-}
-
-HRESULT CInArchive::Open2(
- DECL_EXTERNAL_CODECS_LOC_VARS2
- )
-{
- RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &StreamOffset));
-
- const UInt32 kSigSize = 4 + 1 + 5 + 1; // size, flag, lzma props, lzma first byte
- BYTE sig[kSigSize];
- RINOK(ReadStream_FALSE(_stream, sig, kSigSize));
- UInt64 position;
- RINOK(_stream->Seek(StreamOffset, STREAM_SEEK_SET, &position));
-
- _headerIsCompressed = true;
- IsSolid = true;
- FilterFlag = false;
- DictionarySize = 1;
-
- UInt32 compressedHeaderSize = Get32(sig);
-
- if (compressedHeaderSize == FirstHeader.HeaderLength)
- {
- _headerIsCompressed = false;
- IsSolid = false;
- Method = NMethodType::kCopy;
- }
- else if (IsLZMA(sig, DictionarySize, FilterFlag))
- {
- Method = NMethodType::kLZMA;
- }
- else if (IsLZMA(sig + 4, DictionarySize, FilterFlag))
- {
- IsSolid = false;
- Method = NMethodType::kLZMA;
- }
- else if (sig[3] == 0x80)
- {
- IsSolid = false;
- if (IsBZip2(sig + 4))
- Method = NMethodType::kBZip2;
- else
- Method = NMethodType::kDeflate;
- }
- else if (IsBZip2(sig))
- {
- Method = NMethodType::kBZip2;
- }
- else
- {
- Method = NMethodType::kDeflate;
- }
-
- _posInData = 0;
- if (!IsSolid)
- {
- _headerIsCompressed = ((compressedHeaderSize & 0x80000000) != 0);
- if (_headerIsCompressed)
- compressedHeaderSize &= ~0x80000000;
- _nonSolidStartOffset = compressedHeaderSize;
- RINOK(_stream->Seek(StreamOffset + 4, STREAM_SEEK_SET, NULL));
- }
- UInt32 unpackSize = FirstHeader.HeaderLength;
- if (_headerIsCompressed)
- {
- // unpackSize = (1 << 23);
- _data.SetCapacity(unpackSize);
- RINOK(Decoder.Init(
- EXTERNAL_CODECS_LOC_VARS
- _stream, Method, FilterFlag, UseFilter));
- size_t processedSize = unpackSize;
- RINOK(Decoder.Read(_data, &processedSize));
- if (processedSize != unpackSize)
- return S_FALSE;
- _size = processedSize;
- if (IsSolid)
- {
- UInt32 size2 = ReadUInt32();
- if (size2 < _size)
- _size = size2;
- }
- }
- else
- {
- _data.SetCapacity(unpackSize);
- _size = (size_t)unpackSize;
- RINOK(ReadStream_FALSE(_stream, (Byte *)_data, unpackSize));
- }
- return Parse();
-}
-
-/*
-NsisExe =
-{
- ExeStub
- Archive // must start from 512 * N
- #ifndef NSIS_CONFIG_CRC_ANAL
- {
- Some additional data
- }
-}
-
-Archive
-{
- FirstHeader
- Data
- #ifdef NSIS_CONFIG_CRC_SUPPORT && FirstHeader.ThereIsCrc()
- {
- CRC
- }
-}
-
-FirstHeader
-{
- UInt32 Flags;
- Byte Signature[16];
- // points to the header+sections+entries+stringtable in the datablock
- UInt32 HeaderLength;
- UInt32 ArchiveSize;
-}
-*/
-
-HRESULT CInArchive::Open(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream, const UInt64 *maxCheckStartPosition)
-{
- Clear();
- RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));
- UInt64 maxSize = ((maxCheckStartPosition != 0) ? *maxCheckStartPosition : 0);
- const UInt32 kStep = 512;
- Byte buffer[kStep];
-
- UInt64 position = 0;
- for (; position <= maxSize; position += kStep)
- {
- RINOK(ReadStream_FALSE(inStream, buffer, kStep));
- if (memcmp(buffer + 4, kSignature, kSignatureSize) == 0)
- break;
- }
- if (position > maxSize)
- return S_FALSE;
- const UInt32 kStartHeaderSize = 4 * 7;
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &_archiveSize));
- RINOK(inStream->Seek(position + kStartHeaderSize, STREAM_SEEK_SET, 0));
- FirstHeader.Flags = Get32(buffer);
- FirstHeader.HeaderLength = Get32(buffer + kSignatureSize + 4);
- FirstHeader.ArchiveSize = Get32(buffer + kSignatureSize + 8);
- if (_archiveSize - position < FirstHeader.ArchiveSize)
- return S_FALSE;
-
- try
- {
- _stream = inStream;
- HRESULT res = Open2(EXTERNAL_CODECS_LOC_VARS2);
- if (res != S_OK)
- Clear();
- _stream.Release();
- return res;
- }
- catch(...) { Clear(); return S_FALSE; }
-}
-
-void CInArchive::Clear()
-{
- #ifdef NSIS_SCRIPT
- Script.Empty();
- #endif
- Items.Clear();
- _stream.Release();
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisIn.h b/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisIn.h
deleted file mode 100644
index 87ae3f1ca..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisIn.h
+++ /dev/null
@@ -1,181 +0,0 @@
-// NsisIn.h
-
-#ifndef __ARCHIVE_NSIS_IN_H
-#define __ARCHIVE_NSIS_IN_H
-
-#include "Common/Buffer.h"
-#include "Common/MyCom.h"
-#include "Common/StringConvert.h"
-
-#include "NsisDecode.h"
-
-// #define NSIS_SCRIPT
-
-namespace NArchive {
-namespace NNsis {
-
-const int kSignatureSize = 16;
-#define NSIS_SIGNATURE { 0xEF, 0xBE, 0xAD, 0xDE, 0x4E, 0x75, 0x6C, 0x6C, 0x73, 0x6F, 0x66, 0x74, 0x49, 0x6E, 0x73, 0x74}
-
-extern Byte kSignature[kSignatureSize];
-
-const UInt32 kFlagsMask = 0xF;
-namespace NFlags
-{
- const UInt32 kUninstall = 1;
- const UInt32 kSilent = 2;
- const UInt32 kNoCrc = 4;
- const UInt32 kForceCrc = 8;
-}
-
-struct CFirstHeader
-{
- UInt32 Flags;
- UInt32 HeaderLength;
-
- UInt32 ArchiveSize;
-
- bool ThereIsCrc() const
- {
- if ((Flags & NFlags::kForceCrc ) != 0)
- return true;
- return ((Flags & NFlags::kNoCrc) == 0);
- }
-
- UInt32 GetDataSize() const { return ArchiveSize - (ThereIsCrc() ? 4 : 0); }
-};
-
-
-struct CBlockHeader
-{
- UInt32 Offset;
- UInt32 Num;
-};
-
-struct CItem
-{
- AString PrefixA;
- UString PrefixU;
- AString NameA;
- UString NameU;
- FILETIME MTime;
- bool IsUnicode;
- bool UseFilter;
- bool IsCompressed;
- bool SizeIsDefined;
- bool CompressedSizeIsDefined;
- bool EstimatedSizeIsDefined;
- UInt32 Pos;
- UInt32 Size;
- UInt32 CompressedSize;
- UInt32 EstimatedSize;
- UInt32 DictionarySize;
-
- CItem(): IsUnicode(false), UseFilter(false), IsCompressed(true), SizeIsDefined(false),
- CompressedSizeIsDefined(false), EstimatedSizeIsDefined(false), Size(0), DictionarySize(1) {}
-
- bool IsINSTDIR() const
- {
- return (PrefixA.Length() >= 3 || PrefixU.Length() >= 3);
- }
-
- UString GetReducedName(bool unicode) const
- {
- UString s;
- if (unicode)
- s = PrefixU;
- else
- s = MultiByteToUnicodeString(PrefixA);
- if (s.Length() > 0)
- if (s[s.Length() - 1] != L'\\')
- s += L'\\';
- if (unicode)
- s += NameU;
- else
- s += MultiByteToUnicodeString(NameA);
- const int len = 9;
- if (s.Left(len).CompareNoCase(L"$INSTDIR\\") == 0)
- s = s.Mid(len);
- return s;
- }
-};
-
-class CInArchive
-{
- UInt64 _archiveSize;
- CMyComPtr<IInStream> _stream;
-
- Byte ReadByte();
- UInt32 ReadUInt32();
- HRESULT Open2(
- DECL_EXTERNAL_CODECS_LOC_VARS2
- );
- void ReadBlockHeader(CBlockHeader &bh);
- AString ReadStringA(UInt32 pos) const;
- UString ReadStringU(UInt32 pos) const;
- AString ReadString2A(UInt32 pos) const;
- UString ReadString2U(UInt32 pos) const;
- AString ReadString2(UInt32 pos) const;
- AString ReadString2Qw(UInt32 pos) const;
- HRESULT ReadEntries(const CBlockHeader &bh);
- HRESULT Parse();
-
- CByteBuffer _data;
- UInt64 _size;
-
- size_t _posInData;
-
- UInt32 _stringsPos;
-
-
- bool _headerIsCompressed;
- UInt32 _nonSolidStartOffset;
-public:
- HRESULT Open(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream, const UInt64 *maxCheckStartPosition);
- void Clear();
-
- UInt64 StreamOffset;
- CDecoder Decoder;
- CObjectVector<CItem> Items;
- CFirstHeader FirstHeader;
- NMethodType::EEnum Method;
- UInt32 DictionarySize;
- bool IsSolid;
- bool UseFilter;
- bool FilterFlag;
- bool IsUnicode;
-
- #ifdef NSIS_SCRIPT
- AString Script;
- #endif
- UInt32 GetOffset() const { return IsSolid ? 4 : 0; }
- UInt64 GetDataPos(int index)
- {
- const CItem &item = Items[index];
- return GetOffset() + FirstHeader.HeaderLength + item.Pos;
- }
-
- UInt64 GetPosOfSolidItem(int index) const
- {
- const CItem &item = Items[index];
- return 4 + FirstHeader.HeaderLength + item.Pos;
- }
-
- UInt64 GetPosOfNonSolidItem(int index) const
- {
- const CItem &item = Items[index];
- return StreamOffset + _nonSolidStartOffset + 4 + item.Pos;
- }
-
- void Release()
- {
- Decoder.Release();
- }
-
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisRegister.cpp
deleted file mode 100644
index 41dedb0d3..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Nsis/NsisRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// NsisRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "NsisHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NNsis::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Nsis", L"", 0, 0x9, NSIS_SIGNATURE, NArchive::NNsis::kSignatureSize, false, CreateArc, 0 };
-
-REGISTER_ARC(Nsis)
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/NtfsHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/NtfsHandler.cpp
deleted file mode 100644
index 505486fc5..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/NtfsHandler.cpp
+++ /dev/null
@@ -1,1764 +0,0 @@
-// NtfsHandler.cpp
-
-#include "StdAfx.h"
-
-// #define SHOW_DEBUG_INFO
-// #define SHOW_DEBUG_INFO2
-
-#if defined(SHOW_DEBUG_INFO) || defined(SHOW_DEBUG_INFO2)
-#include <stdio.h>
-#endif
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyCom.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#include "Common/DummyOutStream.h"
-
-#ifdef SHOW_DEBUG_INFO
-#define PRF(x) x
-#else
-#define PRF(x)
-#endif
-
-#ifdef SHOW_DEBUG_INFO2
-#define PRF2(x) x
-#else
-#define PRF2(x)
-#endif
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-#define G16(p, dest) dest = Get16(p);
-#define G32(p, dest) dest = Get32(p);
-#define G64(p, dest) dest = Get64(p);
-
-namespace NArchive {
-namespace Ntfs {
-
-static const UInt32 kNumSysRecs = 16;
-static const UInt32 kRecIndex_Volume = 3;
-static const UInt32 kRecIndex_BadClus = 8;
-
-struct CHeader
-{
- Byte SectorSizeLog;
- Byte ClusterSizeLog;
- // Byte MediaType;
- UInt32 NumHiddenSectors;
- UInt64 NumClusters;
- UInt64 MftCluster;
- UInt64 SerialNumber;
- UInt16 SectorsPerTrack;
- UInt16 NumHeads;
-
- UInt64 GetPhySize() const { return NumClusters << ClusterSizeLog; }
- UInt32 ClusterSize() const { return (UInt32)1 << ClusterSizeLog; }
- bool Parse(const Byte *p);
-};
-
-static int GetLog(UInt32 num)
-{
- for (int i = 0; i < 31; i++)
- if (((UInt32)1 << i) == num)
- return i;
- return -1;
-}
-
-bool CHeader::Parse(const Byte *p)
-{
- if (p[0x1FE] != 0x55 || p[0x1FF] != 0xAA)
- return false;
-
- int codeOffset = 0;
- switch (p[0])
- {
- case 0xE9: codeOffset = 3 + (Int16)Get16(p + 1); break;
- case 0xEB: if (p[2] != 0x90) return false; codeOffset = 2 + (signed char)p[1]; break;
- default: return false;
- }
- Byte sectorsPerClusterLog;
-
- if (memcmp(p + 3, "NTFS ", 8) != 0)
- return false;
- {
- int s = GetLog(Get16(p + 11));
- if (s < 9 || s > 12)
- return false;
- SectorSizeLog = (Byte)s;
- s = GetLog(p[13]);
- if (s < 0)
- return false;
- sectorsPerClusterLog = (Byte)s;
- ClusterSizeLog = SectorSizeLog + sectorsPerClusterLog;
- }
-
- for (int i = 14; i < 21; i++)
- if (p[i] != 0)
- return false;
-
- // MediaType = p[21];
- if (Get16(p + 22) != 0) // NumFatSectors
- return false;
- G16(p + 24, SectorsPerTrack);
- G16(p + 26, NumHeads);
- G32(p + 28, NumHiddenSectors);
- if (Get32(p + 32) != 0) // NumSectors32
- return false;
-
- // DriveNumber = p[0x24];
- if (p[0x25] != 0) // CurrentHead
- return false;
- /*
- NTFS-HDD: p[0x26] = 0x80
- NTFS-FLASH: p[0x26] = 0
- */
- if (p[0x26] != 0x80 && p[0x26] != 0) // ExtendedBootSig
- return false;
- if (p[0x27] != 0) // reserved
- return false;
- UInt64 numSectors = Get64(p + 0x28);
- NumClusters = numSectors >> sectorsPerClusterLog;
-
- G64(p + 0x30, MftCluster);
- // G64(p + 0x38, Mft2Cluster);
- G64(p + 0x48, SerialNumber);
- UInt32 numClustersInMftRec;
- UInt32 numClustersInIndexBlock;
- G32(p + 0x40, numClustersInMftRec);
- G32(p + 0x44, numClustersInIndexBlock);
- return (numClustersInMftRec < 256 && numClustersInIndexBlock < 256);
-}
-
-struct CMftRef
-{
- UInt64 Val;
- UInt64 GetIndex() const { return Val & (((UInt64)1 << 48) - 1); }
- UInt16 GetNumber() const { return (UInt16)(Val >> 48); }
- bool IsBaseItself() const { return Val == 0; }
-};
-
-#define ATNAME(n) ATTR_TYPE_ ## n
-#define DEF_ATTR_TYPE(v, n) ATNAME(n) = v
-
-enum
-{
- DEF_ATTR_TYPE(0x00, UNUSED),
- DEF_ATTR_TYPE(0x10, STANDARD_INFO),
- DEF_ATTR_TYPE(0x20, ATTRIBUTE_LIST),
- DEF_ATTR_TYPE(0x30, FILE_NAME),
- DEF_ATTR_TYPE(0x40, OBJECT_ID),
- DEF_ATTR_TYPE(0x50, SECURITY_DESCRIPTOR),
- DEF_ATTR_TYPE(0x60, VOLUME_NAME),
- DEF_ATTR_TYPE(0x70, VOLUME_INFO),
- DEF_ATTR_TYPE(0x80, DATA),
- DEF_ATTR_TYPE(0x90, INDEX_ROOT),
- DEF_ATTR_TYPE(0xA0, INDEX_ALLOCATION),
- DEF_ATTR_TYPE(0xB0, BITMAP),
- DEF_ATTR_TYPE(0xC0, REPARSE_POINT),
- DEF_ATTR_TYPE(0xD0, EA_INFO),
- DEF_ATTR_TYPE(0xE0, EA),
- DEF_ATTR_TYPE(0xF0, PROPERTY_SET),
- DEF_ATTR_TYPE(0x100, LOGGED_UTILITY_STREAM),
- DEF_ATTR_TYPE(0x1000, FIRST_USER_DEFINED_ATTRIBUTE)
-};
-
-static const Byte kFileNameType_Posix = 0;
-static const Byte kFileNameType_Win32 = 1;
-static const Byte kFileNameType_Dos = 2;
-static const Byte kFileNameType_Win32Dos = 3;
-
-struct CFileNameAttr
-{
- CMftRef ParentDirRef;
- // UInt64 CTime;
- // UInt64 MTime;
- // UInt64 ThisRecMTime;
- // UInt64 ATime;
- // UInt64 AllocatedSize;
- // UInt64 DataSize;
- // UInt16 PackedEaSize;
- UString Name;
- UInt32 Attrib;
- Byte NameType;
-
- bool IsDos() const { return NameType == kFileNameType_Dos; }
- bool Parse(const Byte *p, unsigned size);
-};
-
-static void GetString(const Byte *p, unsigned length, UString &res)
-{
- wchar_t *s = res.GetBuffer(length);
- for (unsigned i = 0; i < length; i++)
- s[i] = Get16(p + i * 2);
- s[length] = 0;
- res.ReleaseBuffer();
-}
-
-bool CFileNameAttr::Parse(const Byte *p, unsigned size)
-{
- if (size < 0x42)
- return false;
- G64(p + 0x00, ParentDirRef.Val);
- // G64(p + 0x08, CTime);
- // G64(p + 0x10, MTime);
- // G64(p + 0x18, ThisRecMTime);
- // G64(p + 0x20, ATime);
- // G64(p + 0x28, AllocatedSize);
- // G64(p + 0x30, DataSize);
- G32(p + 0x38, Attrib);
- // G16(p + 0x3C, PackedEaSize);
- NameType = p[0x41];
- unsigned length = p[0x40];
- if (0x42 + length > size)
- return false;
- GetString(p + 0x42, length, Name);
- return true;
-}
-
-struct CSiAttr
-{
- UInt64 CTime;
- UInt64 MTime;
- // UInt64 ThisRecMTime;
- UInt64 ATime;
- UInt32 Attrib;
-
- /*
- UInt32 MaxVersions;
- UInt32 Version;
- UInt32 ClassId;
- UInt32 OwnerId;
- UInt32 SecurityId;
- UInt64 QuotaCharged;
- */
-
- bool Parse(const Byte *p, unsigned size);
-};
-
-bool CSiAttr::Parse(const Byte *p, unsigned size)
-{
- if (size < 0x24)
- return false;
- G64(p + 0x00, CTime);
- G64(p + 0x08, MTime);
- // G64(p + 0x10, ThisRecMTime);
- G64(p + 0x18, ATime);
- G32(p + 0x20, Attrib);
- return true;
-}
-
-static const UInt64 kEmptyExtent = (UInt64)(Int64)-1;
-
-struct CExtent
-{
- UInt64 Virt;
- UInt64 Phy;
-
- bool IsEmpty() const { return Phy == kEmptyExtent; }
-};
-
-struct CVolInfo
-{
- Byte MajorVer;
- Byte MinorVer;
- // UInt16 Flags;
-
- bool Parse(const Byte *p, unsigned size);
-};
-
-bool CVolInfo::Parse(const Byte *p, unsigned size)
-{
- if (size < 12)
- return false;
- MajorVer = p[8];
- MinorVer = p[9];
- // Flags = Get16(p + 10);
- return true;
-}
-
-struct CAttr
-{
- UInt32 Type;
- // UInt32 Length;
- UString Name;
- // UInt16 Flags;
- // UInt16 Instance;
- CByteBuffer Data;
- Byte NonResident;
-
- // Non-Resident
- Byte CompressionUnit;
- UInt64 LowVcn;
- UInt64 HighVcn;
- UInt64 AllocatedSize;
- UInt64 Size;
- UInt64 PackSize;
- UInt64 InitializedSize;
-
- // Resident
- // UInt16 ResidentFlags;
-
- bool IsCompressionUnitSupported() const { return CompressionUnit == 0 || CompressionUnit == 4; }
-
- UInt32 Parse(const Byte *p, unsigned size);
- bool ParseFileName(CFileNameAttr &a) const { return a.Parse(Data, (unsigned)Data.GetCapacity()); }
- bool ParseSi(CSiAttr &a) const { return a.Parse(Data, (unsigned)Data.GetCapacity()); }
- bool ParseVolInfo(CVolInfo &a) const { return a.Parse(Data, (unsigned)Data.GetCapacity()); }
- bool ParseExtents(CRecordVector<CExtent> &extents, UInt64 numClustersMax, int compressionUnit) const;
- UInt64 GetSize() const { return NonResident ? Size : Data.GetCapacity(); }
- UInt64 GetPackSize() const
- {
- if (!NonResident)
- return Data.GetCapacity();
- if (CompressionUnit != 0)
- return PackSize;
- return AllocatedSize;
- }
-};
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareAttr(void *const *elem1, void *const *elem2, void *)
-{
- const CAttr &a1 = *(*((const CAttr **)elem1));
- const CAttr &a2 = *(*((const CAttr **)elem2));
- RINOZ(MyCompare(a1.Type, a2.Type));
- RINOZ(MyCompare(a1.Name, a2.Name));
- return MyCompare(a1.LowVcn, a2.LowVcn);
-}
-
-UInt32 CAttr::Parse(const Byte *p, unsigned size)
-{
- if (size < 4)
- return 0;
- G32(p, Type);
- if (Type == 0xFFFFFFFF)
- return 4;
- if (size < 0x18)
- return 0;
- PRF(printf(" T=%2X", Type));
-
- UInt32 length = Get32(p + 0x04);
- PRF(printf(" L=%3d", length));
- if (length > size)
- return 0;
- NonResident = p[0x08];
- {
- int nameLength = p[9];
- UInt32 nameOffset = Get16(p + 0x0A);
- if (nameLength != 0)
- {
- if (nameOffset + nameLength * 2 > length)
- return 0;
- GetString(p + nameOffset, nameLength, Name);
- PRF(printf(" N=%S", Name));
- }
- }
-
- // G16(p + 0x0C, Flags);
- // G16(p + 0x0E, Instance);
- // PRF(printf(" F=%4X", Flags));
- // PRF(printf(" Inst=%d", Instance));
-
- UInt32 dataSize;
- UInt32 offs;
- if (NonResident)
- {
- if (length < 0x40)
- return 0;
- PRF(printf(" NR"));
- G64(p + 0x10, LowVcn);
- G64(p + 0x18, HighVcn);
- G64(p + 0x28, AllocatedSize);
- G64(p + 0x30, Size);
- G64(p + 0x38, InitializedSize);
- G16(p + 0x20, offs);
- CompressionUnit = p[0x22];
-
- PackSize = Size;
- if (CompressionUnit != 0)
- {
- if (length < 0x48)
- return 0;
- G64(p + 0x40, PackSize);
- PRF(printf(" PS=%I64x", PackSize));
- }
-
- // PRF(printf("\n"));
- PRF(printf(" ASize=%4I64d", AllocatedSize));
- PRF(printf(" Size=%I64d", Size));
- PRF(printf(" IS=%I64d", InitializedSize));
- PRF(printf(" Low=%I64d", LowVcn));
- PRF(printf(" High=%I64d", HighVcn));
- PRF(printf(" CU=%d", (int)CompressionUnit));
- dataSize = length - offs;
- }
- else
- {
- if (length < 0x18)
- return 0;
- PRF(printf(" RES"));
- dataSize = Get32(p + 0x10);
- PRF(printf(" dataSize=%3d", dataSize));
- offs = Get16(p + 0x14);
- // G16(p + 0x16, ResidentFlags);
- // PRF(printf(" ResFlags=%4X", ResidentFlags));
- }
- if (offs > length || dataSize > length || length - dataSize < offs)
- return 0;
- Data.SetCapacity(dataSize);
- memcpy(Data, p + offs, dataSize);
- #ifdef SHOW_DEBUG_INFO
- PRF(printf(" : "));
- for (unsigned i = 0; i < Data.GetCapacity(); i++)
- {
- PRF(printf(" %02X", (int)Data[i]));
- }
- #endif
- return length;
-}
-
-bool CAttr::ParseExtents(CRecordVector<CExtent> &extents, UInt64 numClustersMax, int compressionUnit) const
-{
- const Byte *p = Data;
- unsigned size = (unsigned)Data.GetCapacity();
- UInt64 vcn = LowVcn;
- UInt64 lcn = 0;
- UInt64 highVcn1 = HighVcn + 1;
- if (LowVcn != extents.Back().Virt || highVcn1 > (UInt64)1 << 63)
- return false;
-
- extents.DeleteBack();
-
- PRF2(printf("\n# ParseExtents # LowVcn = %4I64X # HighVcn = %4I64X", LowVcn, HighVcn));
-
- while (size > 0)
- {
- Byte b = *p++;
- size--;
- if (b == 0)
- break;
- UInt32 num = b & 0xF;
- if (num == 0 || num > 8 || num > size)
- return false;
-
- int i;
- UInt64 vSize = p[num - 1];
- for (i = (int)num - 2; i >= 0; i--)
- vSize = (vSize << 8) | p[i];
- if (vSize == 0)
- return false;
- p += num;
- size -= num;
- if ((highVcn1 - vcn) < vSize)
- return false;
-
- num = (b >> 4) & 0xF;
- if (num > 8 || num > size)
- return false;
- CExtent e;
- e.Virt = vcn;
- if (num == 0)
- {
- if (compressionUnit == 0)
- return false;
- e.Phy = kEmptyExtent;
- }
- else
- {
- Int64 v = (signed char)p[num - 1];
- for (i = (int)num - 2; i >= 0; i--)
- v = (v << 8) | p[i];
- p += num;
- size -= num;
- lcn += v;
- if (lcn > numClustersMax)
- return false;
- e.Phy = lcn;
- }
- extents.Add(e);
- vcn += vSize;
- }
- CExtent e;
- e.Phy = kEmptyExtent;
- e.Virt = vcn;
- extents.Add(e);
- return (highVcn1 == vcn);
-}
-
-static const UInt64 kEmptyTag = (UInt64)(Int64)-1;
-
-static const int kNumCacheChunksLog = 1;
-static const UInt32 kNumCacheChunks = (1 << kNumCacheChunksLog);
-
-class CInStream:
- public IInStream,
- public CMyUnknownImp
-{
- UInt64 _virtPos;
- UInt64 _physPos;
- UInt64 _curRem;
- bool _sparseMode;
- size_t _compressedPos;
-
- UInt64 _tags[kNumCacheChunks];
- int _chunkSizeLog;
- CByteBuffer _inBuf;
- CByteBuffer _outBuf;
-public:
- CMyComPtr<IInStream> Stream;
- UInt64 Size;
- UInt64 InitializedSize;
- int BlockSizeLog;
- int CompressionUnit;
- bool InUse;
- CRecordVector<CExtent> Extents;
-
- HRESULT SeekToPhys() { return Stream->Seek(_physPos, STREAM_SEEK_SET, NULL); }
-
- UInt32 GetCuSize() const { return (UInt32)1 << (BlockSizeLog + CompressionUnit); }
- HRESULT InitAndSeek(int compressionUnit)
- {
- CompressionUnit = compressionUnit;
- if (compressionUnit != 0)
- {
- UInt32 cuSize = GetCuSize();
- _inBuf.SetCapacity(cuSize);
- _chunkSizeLog = BlockSizeLog + CompressionUnit;
- _outBuf.SetCapacity(kNumCacheChunks << _chunkSizeLog);
- }
- for (int i = 0; i < kNumCacheChunks; i++)
- _tags[i] = kEmptyTag;
-
- _sparseMode = false;
- _curRem = 0;
- _virtPos = 0;
- _physPos = 0;
- const CExtent &e = Extents[0];
- if (!e.IsEmpty())
- _physPos = e.Phy << BlockSizeLog;
- return SeekToPhys();
- }
-
- MY_UNKNOWN_IMP1(IInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-
-static size_t Lznt1Dec(Byte *dest, size_t outBufLim, size_t destLen, const Byte *src, size_t srcLen)
-{
- size_t destSize = 0;
- while (destSize < destLen)
- {
- if (srcLen < 2 || (destSize & 0xFFF) != 0)
- break;
- UInt32 v = Get16(src);
- if (v == 0)
- break;
- src += 2;
- srcLen -= 2;
- UInt32 comprSize = (v & 0xFFF) + 1;
- if (comprSize > srcLen)
- break;
- srcLen -= comprSize;
- if ((v & 0x8000) == 0)
- {
- if (comprSize != (1 << 12))
- break;
- memcpy(dest + destSize, src, comprSize);
- src += comprSize;
- destSize += comprSize;
- }
- else
- {
- if (destSize + (1 << 12) > outBufLim || (src[0] & 1) != 0)
- return 0;
- int numDistBits = 4;
- UInt32 sbOffset = 0;
- UInt32 pos = 0;
-
- do
- {
- comprSize--;
- for (UInt32 mask = src[pos++] | 0x100; mask > 1 && comprSize > 0; mask >>= 1)
- {
- if ((mask & 1) == 0)
- {
- if (sbOffset >= (1 << 12))
- return 0;
- dest[destSize++] = src[pos++];
- sbOffset++;
- comprSize--;
- }
- else
- {
- if (comprSize < 2)
- return 0;
- UInt32 v = Get16(src + pos);
- pos += 2;
- comprSize -= 2;
-
- while (((sbOffset - 1) >> numDistBits) != 0)
- numDistBits++;
-
- UInt32 len = (v & (0xFFFF >> numDistBits)) + 3;
- if (sbOffset + len > (1 << 12))
- return 0;
- UInt32 dist = (v >> (16 - numDistBits));
- if (dist >= sbOffset)
- return 0;
- Int32 offs = -1 - dist;
- Byte *p = dest + destSize;
- for (UInt32 t = 0; t < len; t++)
- p[t] = p[t + offs];
- destSize += len;
- sbOffset += len;
- }
- }
- }
- while (comprSize > 0);
- src += pos;
- }
- }
- return destSize;
-}
-
-STDMETHODIMP CInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- if (_virtPos >= Size)
- return (Size == _virtPos) ? S_OK: E_FAIL;
- if (size == 0)
- return S_OK;
- UInt64 rem = Size - _virtPos;
- if (size > rem)
- size = (UInt32)rem;
- if (_virtPos >= InitializedSize)
- {
- memset((Byte *)data, 0, size);
- _virtPos += size;
- *processedSize = size;
- return S_OK;
- }
- rem = InitializedSize - _virtPos;
- if (size > rem)
- size = (UInt32)rem;
-
- while (_curRem == 0)
- {
- UInt64 cacheTag = _virtPos >> _chunkSizeLog;
- UInt32 cacheIndex = (UInt32)cacheTag & (kNumCacheChunks - 1);
- if (_tags[cacheIndex] == cacheTag)
- {
- UInt32 chunkSize = (UInt32)1 << _chunkSizeLog;
- UInt32 offset = (UInt32)_virtPos & (chunkSize - 1);
- UInt32 cur = MyMin(chunkSize - offset, size);
- memcpy(data, _outBuf + (cacheIndex << _chunkSizeLog) + offset, cur);
- *processedSize = cur;
- _virtPos += cur;
- return S_OK;
- }
-
- PRF2(printf("\nVirtPos = %6d", _virtPos));
-
- UInt32 comprUnitSize = (UInt32)1 << CompressionUnit;
- UInt64 virtBlock = _virtPos >> BlockSizeLog;
- UInt64 virtBlock2 = virtBlock & ~((UInt64)comprUnitSize - 1);
-
- int left = 0, right = Extents.Size();
- for (;;)
- {
- int mid = (left + right) / 2;
- if (mid == left)
- break;
- if (virtBlock2 < Extents[mid].Virt)
- right = mid;
- else
- left = mid;
- }
-
- bool isCompressed = false;
- UInt64 virtBlock2End = virtBlock2 + comprUnitSize;
- if (CompressionUnit != 0)
- for (int i = left; i < Extents.Size(); i++)
- {
- const CExtent &e = Extents[i];
- if (e.Virt >= virtBlock2End)
- break;
- if (e.IsEmpty())
- {
- isCompressed = true;
- break;
- }
- }
-
- int i;
- for (i = left; Extents[i + 1].Virt <= virtBlock; i++);
-
- _sparseMode = false;
- if (!isCompressed)
- {
- const CExtent &e = Extents[i];
- UInt64 newPos = (e.Phy << BlockSizeLog) + _virtPos - (e.Virt << BlockSizeLog);
- if (newPos != _physPos)
- {
- _physPos = newPos;
- RINOK(SeekToPhys());
- }
- UInt64 next = Extents[i + 1].Virt;
- if (next > virtBlock2End)
- next &= ~((UInt64)comprUnitSize - 1);
- next <<= BlockSizeLog;
- if (next > Size)
- next = Size;
- _curRem = next - _virtPos;
- break;
- }
- bool thereArePhy = false;
- for (int i2 = left; i2 < Extents.Size(); i2++)
- {
- const CExtent &e = Extents[i2];
- if (e.Virt >= virtBlock2End)
- break;
- if (!e.IsEmpty())
- {
- thereArePhy = true;
- break;
- }
- }
- if (!thereArePhy)
- {
- _curRem = (Extents[i + 1].Virt << BlockSizeLog) - _virtPos;
- _sparseMode = true;
- break;
- }
-
- size_t offs = 0;
- UInt64 curVirt = virtBlock2;
- for (i = left; i < Extents.Size(); i++)
- {
- const CExtent &e = Extents[i];
- if (e.IsEmpty())
- break;
- if (e.Virt >= virtBlock2End)
- return S_FALSE;
- UInt64 newPos = (e.Phy + (curVirt - e.Virt)) << BlockSizeLog;
- if (newPos != _physPos)
- {
- _physPos = newPos;
- RINOK(SeekToPhys());
- }
- UInt64 numChunks = Extents[i + 1].Virt - curVirt;
- if (curVirt + numChunks > virtBlock2End)
- numChunks = virtBlock2End - curVirt;
- size_t compressed = (size_t)numChunks << BlockSizeLog;
- RINOK(ReadStream_FALSE(Stream, _inBuf + offs, compressed));
- curVirt += numChunks;
- _physPos += compressed;
- offs += compressed;
- }
- size_t destLenMax = GetCuSize();
- size_t destLen = destLenMax;
- UInt64 rem = Size - (virtBlock2 << BlockSizeLog);
- if (destLen > rem)
- destLen = (size_t)rem;
-
- Byte *dest = _outBuf + (cacheIndex << _chunkSizeLog);
- size_t destSizeRes = Lznt1Dec(dest, destLenMax, destLen, _inBuf, offs);
- _tags[cacheIndex] = cacheTag;
-
- // some files in Vista have destSize > destLen
- if (destSizeRes < destLen)
- {
- memset(dest, 0, destLenMax);
- if (InUse)
- return S_FALSE;
- }
- }
- if (size > _curRem)
- size = (UInt32)_curRem;
- HRESULT res = S_OK;
- if (_sparseMode)
- memset(data, 0, size);
- else
- {
- res = Stream->Read(data, size, &size);
- _physPos += size;
- }
- if (processedSize != NULL)
- *processedSize = size;
- _virtPos += size;
- _curRem -= size;
- return res;
-}
-
-STDMETHODIMP CInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- UInt64 newVirtPos = offset;
- switch(seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: newVirtPos += _virtPos; break;
- case STREAM_SEEK_END: newVirtPos += Size; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (_virtPos != newVirtPos)
- _curRem = 0;
- _virtPos = newVirtPos;
- if (newPosition)
- *newPosition = newVirtPos;
- return S_OK;
-}
-
-class CByteBufStream:
- public IInStream,
- public CMyUnknownImp
-{
- UInt64 _virtPos;
-public:
- CByteBuffer Buf;
- void Init() { _virtPos = 0; }
-
- MY_UNKNOWN_IMP1(IInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-
-STDMETHODIMP CByteBufStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- if (_virtPos >= Buf.GetCapacity())
- return (_virtPos == Buf.GetCapacity()) ? S_OK: E_FAIL;
- UInt64 rem = Buf.GetCapacity() - _virtPos;
- if (rem < size)
- size = (UInt32)rem;
- memcpy(data, Buf + (size_t)_virtPos, size);
- if (processedSize != NULL)
- *processedSize = size;
- _virtPos += size;
- return S_OK;
-}
-
-STDMETHODIMP CByteBufStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch(seekOrigin)
- {
- case STREAM_SEEK_SET: _virtPos = offset; break;
- case STREAM_SEEK_CUR: _virtPos += offset; break;
- case STREAM_SEEK_END: _virtPos = Buf.GetCapacity() + offset; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
-}
-
-static HRESULT DataParseExtents(int clusterSizeLog, const CObjectVector<CAttr> &attrs,
- int attrIndex, int attrIndexLim, UInt64 numPhysClusters, CRecordVector<CExtent> &Extents)
-{
- CExtent e;
- e.Virt = 0;
- e.Phy = kEmptyExtent;
- Extents.Add(e);
- const CAttr &attr0 = attrs[attrIndex];
-
- if (attr0.AllocatedSize < attr0.Size ||
- (attrs[attrIndexLim - 1].HighVcn + 1) != (attr0.AllocatedSize >> clusterSizeLog) ||
- (attr0.AllocatedSize & ((1 << clusterSizeLog) - 1)) != 0)
- return S_FALSE;
-
- for (int i = attrIndex; i < attrIndexLim; i++)
- if (!attrs[i].ParseExtents(Extents, numPhysClusters, attr0.CompressionUnit))
- return S_FALSE;
-
- UInt64 packSizeCalc = 0;
- for (int k = 0; k < Extents.Size(); k++)
- {
- CExtent &e = Extents[k];
- if (!e.IsEmpty())
- packSizeCalc += (Extents[k + 1].Virt - e.Virt) << clusterSizeLog;
- PRF2(printf("\nSize = %4I64X", Extents[k + 1].Virt - e.Virt));
- PRF2(printf(" Pos = %4I64X", e.Phy));
- }
-
- if (attr0.CompressionUnit != 0)
- {
- if (packSizeCalc != attr0.PackSize)
- return S_FALSE;
- }
- else
- {
- if (packSizeCalc != attr0.AllocatedSize)
- return S_FALSE;
- }
- return S_OK;
-}
-
-struct CDataRef
-{
- int Start;
- int Num;
-};
-
-static const UInt32 kMagic_FILE = 0x454c4946;
-static const UInt32 kMagic_BAAD = 0x44414142;
-
-struct CMftRec
-{
- UInt32 Magic;
- // UInt64 Lsn;
- UInt16 SeqNumber;
- UInt16 Flags;
- // UInt16 LinkCount;
- // UInt16 NextAttrInstance;
- CMftRef BaseMftRef;
- // UInt32 ThisRecNumber;
- UInt32 MyNumNameLinks;
-
- CObjectVector<CAttr> DataAttrs;
- CObjectVector<CFileNameAttr> FileNames;
- CRecordVector<CDataRef> DataRefs;
-
- CSiAttr SiAttr;
-
- void MoveAttrsFrom(CMftRec &src)
- {
- DataAttrs += src.DataAttrs;
- FileNames += src.FileNames;
- src.DataAttrs.ClearAndFree();
- src.FileNames.ClearAndFree();
- }
-
- UInt64 GetPackSize() const
- {
- UInt64 res = 0;
- for (int i = 0; i < DataRefs.Size(); i++)
- res += DataAttrs[DataRefs[i].Start].GetPackSize();
- return res;
- }
-
- bool Parse(Byte *p, int sectorSizeLog, UInt32 numSectors, UInt32 recNumber, CObjectVector<CAttr> *attrs);
-
- bool IsEmpty() const { return (Magic <= 2); }
- bool IsFILE() const { return (Magic == kMagic_FILE); }
- bool IsBAAD() const { return (Magic == kMagic_BAAD); }
-
- bool InUse() const { return (Flags & 1) != 0; }
- bool IsDir() const { return (Flags & 2) != 0; }
-
- void ParseDataNames();
- HRESULT GetStream(IInStream *mainStream, int dataIndex,
- int clusterSizeLog, UInt64 numPhysClusters, IInStream **stream) const;
- int GetNumExtents(int dataIndex, int clusterSizeLog, UInt64 numPhysClusters) const;
-
- UInt64 GetSize(int dataIndex) const { return DataAttrs[DataRefs[dataIndex].Start].GetSize(); }
-
- CMftRec(): MyNumNameLinks(0) {}
-};
-
-void CMftRec::ParseDataNames()
-{
- DataRefs.Clear();
- DataAttrs.Sort(CompareAttr, 0);
-
- for (int i = 0; i < DataAttrs.Size();)
- {
- CDataRef ref;
- ref.Start = i;
- for (i++; i < DataAttrs.Size(); i++)
- if (DataAttrs[ref.Start].Name != DataAttrs[i].Name)
- break;
- ref.Num = i - ref.Start;
- DataRefs.Add(ref);
- }
-}
-
-HRESULT CMftRec::GetStream(IInStream *mainStream, int dataIndex,
- int clusterSizeLog, UInt64 numPhysClusters, IInStream **destStream) const
-{
- *destStream = 0;
- CByteBufStream *streamSpec = new CByteBufStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
-
- if (dataIndex < 0)
- return E_FAIL;
-
- if (dataIndex < DataRefs.Size())
- {
- const CDataRef &ref = DataRefs[dataIndex];
- int numNonResident = 0;
- int i;
- for (i = ref.Start; i < ref.Start + ref.Num; i++)
- if (DataAttrs[i].NonResident)
- numNonResident++;
-
- const CAttr &attr0 = DataAttrs[ref.Start];
-
- if (numNonResident != 0 || ref.Num != 1)
- {
- if (numNonResident != ref.Num || !attr0.IsCompressionUnitSupported())
- return S_FALSE;
- CInStream *streamSpec = new CInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- RINOK(DataParseExtents(clusterSizeLog, DataAttrs, ref.Start, ref.Start + ref.Num, numPhysClusters, streamSpec->Extents));
- streamSpec->Size = attr0.Size;
- streamSpec->InitializedSize = attr0.InitializedSize;
- streamSpec->Stream = mainStream;
- streamSpec->BlockSizeLog = clusterSizeLog;
- streamSpec->InUse = InUse();
- RINOK(streamSpec->InitAndSeek(attr0.CompressionUnit));
- *destStream = streamTemp.Detach();
- return S_OK;
- }
- streamSpec->Buf = attr0.Data;
- }
- streamSpec->Init();
- *destStream = streamTemp.Detach();
- return S_OK;
-}
-
-int CMftRec::GetNumExtents(int dataIndex, int clusterSizeLog, UInt64 numPhysClusters) const
-{
- if (dataIndex < 0)
- return 0;
- {
- const CDataRef &ref = DataRefs[dataIndex];
- int numNonResident = 0;
- int i;
- for (i = ref.Start; i < ref.Start + ref.Num; i++)
- if (DataAttrs[i].NonResident)
- numNonResident++;
-
- const CAttr &attr0 = DataAttrs[ref.Start];
-
- if (numNonResident != 0 || ref.Num != 1)
- {
- if (numNonResident != ref.Num || !attr0.IsCompressionUnitSupported())
- return 0; // error;
- CRecordVector<CExtent> extents;
- if (DataParseExtents(clusterSizeLog, DataAttrs, ref.Start, ref.Start + ref.Num, numPhysClusters, extents) != S_OK)
- return 0; // error;
- return extents.Size() - 1;
- }
- // if (attr0.Data.GetCapacity() != 0)
- // return 1;
- return 0;
- }
-}
-
-bool CMftRec::Parse(Byte *p, int sectorSizeLog, UInt32 numSectors, UInt32 recNumber,
- CObjectVector<CAttr> *attrs)
-{
- G32(p, Magic);
- if (!IsFILE())
- return IsEmpty() || IsBAAD();
-
- UInt32 usaOffset;
- UInt32 numUsaItems;
- G16(p + 0x04, usaOffset);
- G16(p + 0x06, numUsaItems);
-
- if ((usaOffset & 1) != 0 || usaOffset + numUsaItems * 2 > ((UInt32)1 << sectorSizeLog) - 2 ||
- numUsaItems == 0 || numUsaItems - 1 != numSectors)
- return false;
-
- UInt16 usn = Get16(p + usaOffset);
- // PRF(printf("\nusn = %d", usn));
- for (UInt32 i = 1; i < numUsaItems; i++)
- {
- void *pp = p + (i << sectorSizeLog) - 2;
- if (Get16(pp) != usn)
- return false;
- SetUi16(pp, Get16(p + usaOffset + i * 2));
- }
-
- // G64(p + 0x08, Lsn);
- G16(p + 0x10, SeqNumber);
- // G16(p + 0x12, LinkCount);
- // PRF(printf(" L=%d", LinkCount));
- UInt32 attrOffs = Get16(p + 0x14);
- G16(p + 0x16, Flags);
- PRF(printf(" F=%4X", Flags));
-
- UInt32 bytesInUse = Get32(p + 0x18);
- UInt32 bytesAlloc = Get32(p + 0x1C);
- G64(p + 0x20, BaseMftRef.Val);
- if (BaseMftRef.Val != 0)
- {
- PRF(printf(" BaseRef=%d", (int)BaseMftRef.Val));
- // return false; // Check it;
- }
- // G16(p + 0x28, NextAttrInstance);
- if (usaOffset >= 0x30)
- if (Get32(p + 0x2C) != recNumber) // NTFS 3.1+
- return false;
-
- UInt32 limit = numSectors << sectorSizeLog;
- if (attrOffs >= limit || (attrOffs & 7) != 0 || bytesInUse > limit
- || bytesAlloc != limit)
- return false;
-
-
- for (UInt32 t = attrOffs; t < limit;)
- {
- CAttr attr;
- // PRF(printf("\n %2d:", Attrs.Size()));
- PRF(printf("\n"));
- UInt32 length = attr.Parse(p + t, limit - t);
- if (length == 0 || limit - t < length)
- return false;
- t += length;
- if (attr.Type == 0xFFFFFFFF)
- break;
- switch(attr.Type)
- {
- case ATTR_TYPE_FILE_NAME:
- {
- CFileNameAttr fna;
- if (!attr.ParseFileName(fna))
- return false;
- FileNames.Add(fna);
- PRF(printf(" flags = %4x", (int)fna.NameType));
- PRF(printf("\n %S", fna.Name));
- break;
- }
- case ATTR_TYPE_STANDARD_INFO:
- if (!attr.ParseSi(SiAttr))
- return false;
- break;
- case ATTR_TYPE_DATA:
- DataAttrs.Add(attr);
- break;
- default:
- if (attrs)
- attrs->Add(attr);
- break;
- }
- }
-
- return true;
-}
-
-struct CItem
-{
- int RecIndex;
- int DataIndex;
- CMftRef ParentRef;
- UString Name;
- UInt32 Attrib;
-
- bool IsDir() const { return (DataIndex < 0); }
-};
-
-struct CDatabase
-{
- CHeader Header;
- CObjectVector<CItem> Items;
- CObjectVector<CMftRec> Recs;
- CMyComPtr<IInStream> InStream;
- IArchiveOpenCallback *OpenCallback;
-
- CByteBuffer ByteBuf;
-
- CObjectVector<CAttr> VolAttrs;
-
- ~CDatabase() { ClearAndClose(); }
-
- void Clear();
- void ClearAndClose();
-
- UString GetItemPath(Int32 index) const;
- HRESULT Open();
- HRESULT ReadDir(Int32 parent, UInt32 cluster, int level);
-
- HRESULT SeekToCluster(UInt64 cluster);
-
- int FindMtfRec(const CMftRef &ref) const
- {
- UInt64 val = ref.GetIndex();
- int left = 0, right = Items.Size();
- while (left != right)
- {
- int mid = (left + right) / 2;
- UInt64 midValue = Items[mid].RecIndex;
- if (val == midValue)
- return mid;
- if (val < midValue)
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
- }
-
-};
-
-HRESULT CDatabase::SeekToCluster(UInt64 cluster)
-{
- return InStream->Seek(cluster << Header.ClusterSizeLog, STREAM_SEEK_SET, NULL);
-}
-
-void CDatabase::Clear()
-{
- Items.Clear();
- Recs.Clear();
-}
-
-void CDatabase::ClearAndClose()
-{
- Clear();
- InStream.Release();
-}
-
-#define MY_DIR_PREFIX(x) L"[" x L"]" WSTRING_PATH_SEPARATOR
-
-UString CDatabase::GetItemPath(Int32 index) const
-{
- const CItem *item = &Items[index];
- UString name = item->Name;
- for (int j = 0; j < 256; j++)
- {
- CMftRef ref = item->ParentRef;
- index = FindMtfRec(ref);
- if (ref.GetIndex() == 5)
- return name;
- if (index < 0 || Recs[Items[index].RecIndex].SeqNumber != ref.GetNumber())
- return MY_DIR_PREFIX(L"UNKNOWN") + name;
- item = &Items[index];
- name = item->Name + WCHAR_PATH_SEPARATOR + name;
- }
- return MY_DIR_PREFIX(L"BAD") + name;
-}
-
-HRESULT CDatabase::Open()
-{
- Clear();
-
- static const UInt32 kHeaderSize = 512;
- Byte buf[kHeaderSize];
- RINOK(ReadStream_FALSE(InStream, buf, kHeaderSize));
- if (!Header.Parse(buf))
- return S_FALSE;
- UInt64 fileSize;
- RINOK(InStream->Seek(0, STREAM_SEEK_END, &fileSize));
- if (fileSize < Header.GetPhySize())
- return S_FALSE;
-
- SeekToCluster(Header.MftCluster);
-
- CMftRec mftRec;
- UInt32 numSectorsInRec;
- int recSizeLog;
- CMyComPtr<IInStream> mftStream;
- {
- UInt32 blockSize = 1 << 12;
- ByteBuf.SetCapacity(blockSize);
- RINOK(ReadStream_FALSE(InStream, ByteBuf, blockSize));
-
- UInt32 allocSize = Get32(ByteBuf + 0x1C);
- recSizeLog = GetLog(allocSize);
- if (recSizeLog < Header.SectorSizeLog)
- return false;
- numSectorsInRec = 1 << (recSizeLog - Header.SectorSizeLog);
- if (!mftRec.Parse(ByteBuf, Header.SectorSizeLog, numSectorsInRec, NULL, 0))
- return S_FALSE;
- if (!mftRec.IsFILE())
- return S_FALSE;
- mftRec.ParseDataNames();
- if (mftRec.DataRefs.IsEmpty())
- return S_FALSE;
- RINOK(mftRec.GetStream(InStream, 0, Header.ClusterSizeLog, Header.NumClusters, &mftStream));
- if (!mftStream)
- return S_FALSE;
- }
-
- UInt64 mftSize = mftRec.DataAttrs[0].Size;
- if ((mftSize >> 4) > Header.GetPhySize())
- return S_FALSE;
-
- UInt64 numFiles = mftSize >> recSizeLog;
- if (numFiles > (1 << 30))
- return S_FALSE;
- if (OpenCallback)
- {
- RINOK(OpenCallback->SetTotal(&numFiles, &mftSize));
- }
- const UInt32 kBufSize = (1 << 15);
- if (kBufSize < (1 << recSizeLog))
- return S_FALSE;
-
- ByteBuf.SetCapacity((size_t)kBufSize);
- Recs.Reserve((int)numFiles);
- for (UInt64 pos64 = 0;;)
- {
- if (OpenCallback)
- {
- UInt64 numFiles = Recs.Size();
- if ((numFiles & 0x3FF) == 0)
- {
- RINOK(OpenCallback->SetCompleted(&numFiles, &pos64));
- }
- }
- UInt32 readSize = kBufSize;
- UInt64 rem = mftSize - pos64;
- if (readSize > rem)
- readSize = (UInt32)rem;
- if (readSize < ((UInt32)1 << recSizeLog))
- break;
- RINOK(ReadStream_FALSE(mftStream, ByteBuf, (size_t)readSize));
- pos64 += readSize;
- for (int i = 0; ((UInt32)(i + 1) << recSizeLog) <= readSize; i++)
- {
- PRF(printf("\n---------------------"));
- PRF(printf("\n%5d:", Recs.Size()));
- Byte *p = ByteBuf + ((UInt32)i << recSizeLog);
- CMftRec rec;
- if (!rec.Parse(p, Header.SectorSizeLog, numSectorsInRec, (UInt32)Recs.Size(),
- (Recs.Size() == kRecIndex_Volume) ? &VolAttrs: NULL))
- return S_FALSE;
- Recs.Add(rec);
- }
- }
-
- int i;
- for (i = 0; i < Recs.Size(); i++)
- {
- CMftRec &rec = Recs[i];
- if (!rec.BaseMftRef.IsBaseItself())
- {
- UInt64 refIndex = rec.BaseMftRef.GetIndex();
- if (refIndex > (UInt32)Recs.Size())
- return S_FALSE;
- CMftRec &refRec = Recs[(int)refIndex];
- bool moveAttrs = (refRec.SeqNumber == rec.BaseMftRef.GetNumber() && refRec.BaseMftRef.IsBaseItself());
- if (rec.InUse() && refRec.InUse())
- {
- if (!moveAttrs)
- return S_FALSE;
- }
- else if (rec.InUse() || refRec.InUse())
- moveAttrs = false;
- if (moveAttrs)
- refRec.MoveAttrsFrom(rec);
- }
- }
-
- for (i = 0; i < Recs.Size(); i++)
- Recs[i].ParseDataNames();
-
- for (i = 0; i < Recs.Size(); i++)
- {
- CMftRec &rec = Recs[i];
- if (!rec.IsFILE() || !rec.BaseMftRef.IsBaseItself())
- continue;
- int numNames = 0;
- // printf("\n%4d: ", i);
- for (int t = 0; t < rec.FileNames.Size(); t++)
- {
- const CFileNameAttr &fna = rec.FileNames[t];
- // printf("%4d %S | ", (int)fna.NameType, fna.Name);
- if (fna.IsDos())
- continue;
- int numDatas = rec.DataRefs.Size();
-
- // For hard linked files we show substreams only for first Name.
- if (numDatas > 1 && numNames > 0)
- numDatas = 1;
- numNames++;
-
- if (rec.IsDir())
- {
- CItem item;
- item.Name = fna.Name;
- item.RecIndex = i;
- item.DataIndex = -1;
- item.ParentRef = fna.ParentDirRef;
- item.Attrib = rec.SiAttr.Attrib | 0x10;
- // item.Attrib = fna.Attrib;
- Items.Add(item);
- }
- for (int di = 0; di < numDatas; di++)
- {
- CItem item;
- item.Name = fna.Name;
- item.Attrib = rec.SiAttr.Attrib;
- const UString &subName = rec.DataAttrs[rec.DataRefs[di].Start].Name;
- if (!subName.IsEmpty())
- {
- // $BadClus:$Bad is sparse file for all clusters. So we skip it.
- if (i == kRecIndex_BadClus && subName == L"$Bad")
- continue;
- item.Name += L":";
- item.Name += subName;
- item.Attrib = fna.Attrib;
- }
-
- PRF(printf("\n%3d", i));
- PRF(printf(" attrib=%2x", rec.SiAttr.Attrib));
- PRF(printf(" %S", item.Name));
-
- item.RecIndex = i;
- item.DataIndex = di;
- item.ParentRef = fna.ParentDirRef;
-
- Items.Add(item);
- rec.MyNumNameLinks++;
- }
- }
- rec.FileNames.ClearAndFree();
- }
-
- return S_OK;
-}
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp,
- CDatabase
-{
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- IInStream *stream2;
- const CItem &item = Items[index];
- const CMftRec &rec = Recs[item.RecIndex];
- HRESULT res = rec.GetStream(InStream, item.DataIndex, Header.ClusterSizeLog, Header.NumClusters, &stream2);
- *stream = (ISequentialInStream *)stream2;
- return res;
- COM_TRY_END
-}
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidLinks, VT_UI4},
- { NULL, kpidNumBlocks, VT_UI4}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidVolumeName, VT_BSTR},
- { NULL, kpidFileSystem, VT_BSTR},
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME},
-
- { NULL, kpidSectorSize, VT_UI4},
- { NULL, kpidId, VT_UI8}
- // { NULL, kpidSectorsPerTrack, VT_UI4},
- // { NULL, kpidNumHeads, VT_UI4},
- // { NULL, kpidHiddenSectors, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-static void NtfsTimeToProp(UInt64 t, NWindows::NCOM::CPropVariant &prop)
-{
- FILETIME ft;
- ft.dwLowDateTime = (DWORD)t;
- ft.dwHighDateTime = (DWORD)(t >> 32);
- prop = ft;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- const CMftRec *volRec = (Recs.Size() > kRecIndex_Volume ? &Recs[kRecIndex_Volume] : NULL);
-
- switch(propID)
- {
- case kpidClusterSize: prop = Header.ClusterSize(); break;
- case kpidPhySize: prop = Header.GetPhySize(); break;
- /*
- case kpidHeadersSize:
- {
- UInt64 val = 0;
- for (int i = 0; i < kNumSysRecs; i++)
- {
- printf("\n%2d: %8I64d ", i, Recs[i].GetPackSize());
- if (i == 8)
- i = i
- val += Recs[i].GetPackSize();
- }
- prop = val;
- break;
- }
- */
- case kpidCTime: if (volRec) NtfsTimeToProp(volRec->SiAttr.CTime, prop); break;break;
- case kpidVolumeName:
- {
- for (int i = 0; i < VolAttrs.Size(); i++)
- {
- const CAttr &attr = VolAttrs[i];
- if (attr.Type == ATTR_TYPE_VOLUME_NAME)
- {
- UString name;
- GetString(attr.Data, (int)attr.Data.GetCapacity() / 2, name);
- prop = name;
- break;
- }
- }
- break;
- }
- case kpidFileSystem:
- {
- AString s = "NTFS";
- for (int i = 0; i < VolAttrs.Size(); i++)
- {
- const CAttr &attr = VolAttrs[i];
- if (attr.Type == ATTR_TYPE_VOLUME_INFO)
- {
- CVolInfo vi;
- if (attr.ParseVolInfo(vi))
- {
- s += ' ';
- char temp[16];
- ConvertUInt32ToString(vi.MajorVer, temp);
- s += temp;
- s += '.';
- ConvertUInt32ToString(vi.MinorVer, temp);
- s += temp;
- }
- break;
- }
- }
- prop = s;
- break;
- }
- case kpidSectorSize: prop = (UInt32)1 << Header.SectorSizeLog; break;
- case kpidId: prop = Header.SerialNumber; break;
- // case kpidMediaType: prop = Header.MediaType; break;
- // case kpidSectorsPerTrack: prop = Header.SectorsPerTrack; break;
- // case kpidNumHeads: prop = Header.NumHeads; break;
- // case kpidHiddenSectors: prop = Header.NumHiddenSectors; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = Items[index];
- const CMftRec &rec = Recs[item.RecIndex];
-
- const CAttr *data= NULL;
- if (item.DataIndex >= 0)
- data = &rec.DataAttrs[rec.DataRefs[item.DataIndex].Start];
-
- switch(propID)
- {
- case kpidPath:
- {
- UString name = GetItemPath(index);
- const wchar_t *prefix = NULL;
- if (!rec.InUse())
- prefix = MY_DIR_PREFIX(L"DELETED");
- else if (item.RecIndex < kNumSysRecs)
- prefix = MY_DIR_PREFIX(L"SYSTEM");
- if (prefix)
- name = prefix + name;
- prop = name;
- break;
- }
-
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidMTime: NtfsTimeToProp(rec.SiAttr.MTime, prop); break;
-
- case kpidCTime: NtfsTimeToProp(rec.SiAttr.CTime, prop); break;
- case kpidATime: NtfsTimeToProp(rec.SiAttr.ATime, prop); break;
- case kpidAttrib:
- prop = item.Attrib;
- break;
- case kpidLinks: prop = rec.MyNumNameLinks; break;
- case kpidSize: if (data) prop = data->GetSize(); break;
- case kpidPackSize: if (data) prop = data->GetPackSize(); break;
- case kpidNumBlocks: if (data) prop = (UInt32)rec.GetNumExtents(item.DataIndex, Header.ClusterSizeLog, Header.NumClusters); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- {
- OpenCallback = callback;
- InStream = stream;
- HRESULT res;
- try
- {
- res = CDatabase::Open();
- if (res == S_OK)
- return S_OK;
- }
- catch(...)
- {
- Close();
- throw;
- }
- Close();
- return res;
- }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- ClearAndClose();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = Items.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- UInt64 totalSize = 0;
- for (i = 0; i < numItems; i++)
- {
- const CItem &item = Items[allFilesMode ? i : indices[i]];
- const CMftRec &rec = Recs[item.RecIndex];
- if (!rec.IsDir())
- totalSize += rec.GetSize(item.DataIndex);
- }
- RINOK(extractCallback->SetTotal(totalSize));
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- CByteBuffer buf;
- UInt32 clusterSize = Header.ClusterSize();
- buf.SetCapacity(clusterSize);
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- const CItem &item = Items[index];
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init();
-
- const CMftRec &rec = Recs[item.RecIndex];
- const CAttr &data = rec.DataAttrs[rec.DataRefs[item.DataIndex].Start];
-
- int res = NExtract::NOperationResult::kDataError;
- {
- CMyComPtr<IInStream> inStream;
- HRESULT hres = rec.GetStream(InStream, item.DataIndex, Header.ClusterSizeLog, Header.NumClusters, &inStream);
- if (hres == S_FALSE)
- res = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- RINOK(hres);
- if (inStream)
- {
- HRESULT hres = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (hres != S_OK && hres != S_FALSE)
- {
- RINOK(hres);
- }
- if (/* copyCoderSpec->TotalSize == item.GetSize() && */ hres == S_OK)
- res = NExtract::NOperationResult::kOK;
- }
- }
- }
- totalPackSize += data.GetPackSize();
- totalSize += data.GetSize();
- outStreamSpec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = Items.Size();
- return S_OK;
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"NTFS", L"ntfs img", 0, 0xD9, { 'N', 'T', 'F', 'S', ' ', ' ', ' ', ' ', 0 }, 9, false, CreateArc, 0 };
-
-REGISTER_ARC(Fat)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/PeHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/PeHandler.cpp
deleted file mode 100644
index c64067aa5..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/PeHandler.cpp
+++ /dev/null
@@ -1,1752 +0,0 @@
-// PeHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/DynamicBuffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariantUtils.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NPe {
-
-#define NUM_SCAN_SECTIONS_MAX (1 << 6)
-
-#define PE_SIG 0x00004550
-#define PE_OptHeader_Magic_32 0x10B
-#define PE_OptHeader_Magic_64 0x20B
-
-static AString GetDecString(UInt32 v)
-{
- char sz[32];
- ConvertUInt64ToString(v, sz);
- return sz;
-}
-
-struct CVersion
-{
- UInt16 Major;
- UInt16 Minor;
-
- void Parse(const Byte *buf);
- AString GetString() const { return GetDecString(Major) + '.' + GetDecString(Minor); }
-};
-
-void CVersion::Parse(const Byte *p)
-{
- Major = Get16(p);
- Minor = Get16(p + 2);
-}
-
-static const UInt32 kHeaderSize = 4 + 20;
-
-struct CHeader
-{
- UInt16 NumSections;
- UInt32 Time;
- UInt32 PointerToSymbolTable;
- UInt32 NumSymbols;
- UInt16 OptHeaderSize;
- UInt16 Flags;
- UInt16 Machine;
-
- bool Parse(const Byte *buf);
-};
-
-bool CHeader::Parse(const Byte *p)
-{
- if (Get32(p) != PE_SIG)
- return false;
- p += 4;
- Machine = Get16(p + 0);
- NumSections = Get16(p + 2);
- Time = Get32(p + 4);
- PointerToSymbolTable = Get32(p + 8);
- NumSymbols = Get32(p + 12);
- OptHeaderSize = Get16(p + 16);
- Flags = Get16(p + 18);
- return true;
-}
-
-struct CDirLink
-{
- UInt32 Va;
- UInt32 Size;
- void Parse(const Byte *p);
-};
-
-void CDirLink::Parse(const Byte *p)
-{
- Va = Get32(p);
- Size = Get32(p + 4);
-}
-
-enum
-{
- kDirLink_Certificate = 4,
- kDirLink_Debug = 6
-};
-
-struct CDebugEntry
-{
- UInt32 Flags;
- UInt32 Time;
- CVersion Ver;
- UInt32 Type;
- UInt32 Size;
- UInt32 Va;
- UInt32 Pa;
-
- void Parse(const Byte *p);
-};
-
-void CDebugEntry::Parse(const Byte *p)
-{
- Flags = Get32(p);
- Time = Get32(p + 4);
- Ver.Parse(p + 8);
- Type = Get32(p + 12);
- Size = Get32(p + 16);
- Va = Get32(p + 20);
- Pa = Get32(p + 24);
-}
-
-static const UInt32 kNumDirItemsMax = 16;
-
-struct COptHeader
-{
- UInt16 Magic;
- Byte LinkerVerMajor;
- Byte LinkerVerMinor;
-
- UInt32 CodeSize;
- UInt32 InitDataSize;
- UInt32 UninitDataSize;
-
- // UInt32 AddressOfEntryPoint;
- // UInt32 BaseOfCode;
- // UInt32 BaseOfData32;
- UInt64 ImageBase;
-
- UInt32 SectAlign;
- UInt32 FileAlign;
-
- CVersion OsVer;
- CVersion ImageVer;
- CVersion SubsysVer;
-
- UInt32 ImageSize;
- UInt32 HeadersSize;
- UInt32 CheckSum;
- UInt16 SubSystem;
- UInt16 DllCharacts;
-
- UInt64 StackReserve;
- UInt64 StackCommit;
- UInt64 HeapReserve;
- UInt64 HeapCommit;
-
- UInt32 NumDirItems;
- CDirLink DirItems[kNumDirItemsMax];
-
- bool Is64Bit() const { return Magic == PE_OptHeader_Magic_64; }
- bool Parse(const Byte *p, UInt32 size);
-
- int GetNumFileAlignBits() const
- {
- for (int i = 9; i <= 16; i++)
- if (((UInt32)1 << i) == FileAlign)
- return i;
- return -1;
- }
-};
-
-bool COptHeader::Parse(const Byte *p, UInt32 size)
-{
- Magic = Get16(p);
- switch (Magic)
- {
- case PE_OptHeader_Magic_32:
- case PE_OptHeader_Magic_64:
- break;
- default:
- return false;
- }
- LinkerVerMajor = p[2];
- LinkerVerMinor = p[3];
-
- bool hdr64 = Is64Bit();
-
- CodeSize = Get32(p + 4);
- InitDataSize = Get32(p + 8);
- UninitDataSize = Get32(p + 12);
-
- // AddressOfEntryPoint = Get32(p + 16);
- // BaseOfCode = Get32(p + 20);
- // BaseOfData32 = hdr64 ? 0: Get32(p + 24);
- ImageBase = hdr64 ? GetUi64(p + 24) : Get32(p + 28);
-
- SectAlign = Get32(p + 32);
- FileAlign = Get32(p + 36);
-
- OsVer.Parse(p + 40);
- ImageVer.Parse(p + 44);
- SubsysVer.Parse(p + 48);
-
- // reserved = Get32(p + 52);
-
- ImageSize = Get32(p + 56);
- HeadersSize = Get32(p + 60);
- CheckSum = Get32(p + 64);
- SubSystem = Get16(p + 68);
- DllCharacts = Get16(p + 70);
-
- if (hdr64)
- {
- StackReserve = Get64(p + 72);
- StackCommit = Get64(p + 80);
- HeapReserve = Get64(p + 88);
- HeapCommit = Get64(p + 96);
- }
- else
- {
- StackReserve = Get32(p + 72);
- StackCommit = Get32(p + 76);
- HeapReserve = Get32(p + 80);
- HeapCommit = Get32(p + 84);
- }
- UInt32 pos = (hdr64 ? 108 : 92);
- NumDirItems = Get32(p + pos);
- pos += 4;
- if (pos + 8 * NumDirItems != size)
- return false;
- for (UInt32 i = 0; i < NumDirItems && i < kNumDirItemsMax; i++)
- DirItems[i].Parse(p + pos + i * 8);
- return true;
-}
-
-static const UInt32 kSectionSize = 40;
-
-struct CSection
-{
- AString Name;
-
- UInt32 VSize;
- UInt32 Va;
- UInt32 PSize;
- UInt32 Pa;
- UInt32 Flags;
- UInt32 Time;
- // UInt16 NumRelocs;
- bool IsDebug;
- bool IsRealSect;
- bool IsAdditionalSection;
-
- CSection(): IsRealSect(false), IsDebug(false), IsAdditionalSection(false) {}
- UInt64 GetPackSize() const { return PSize; }
-
- void UpdateTotalSize(UInt32 &totalSize)
- {
- UInt32 t = Pa + PSize;
- if (t > totalSize)
- totalSize = t;
- }
- void Parse(const Byte *p);
-};
-
-static bool operator <(const CSection &a1, const CSection &a2) { return (a1.Pa < a2.Pa) || ((a1.Pa == a2.Pa) && (a1.PSize < a2.PSize)) ; }
-static bool operator ==(const CSection &a1, const CSection &a2) { return (a1.Pa == a2.Pa) && (a1.PSize == a2.PSize); }
-
-static AString GetName(const Byte *name)
-{
- const int kNameSize = 8;
- AString res;
- char *p = res.GetBuffer(kNameSize);
- memcpy(p, name, kNameSize);
- p[kNameSize] = 0;
- res.ReleaseBuffer();
- return res;
-}
-
-void CSection::Parse(const Byte *p)
-{
- Name = GetName(p);
- VSize = Get32(p + 8);
- Va = Get32(p + 12);
- PSize = Get32(p + 16);
- Pa = Get32(p + 20);
- // NumRelocs = Get16(p + 32);
- Flags = Get32(p + 36);
-}
-
-static const CUInt32PCharPair g_HeaderCharacts[] =
-{
- { 1, "Executable" },
- { 13, "DLL" },
- { 8, "32-bit" },
- { 5, "LargeAddress" },
- { 0, "NoRelocs" },
- { 2, "NoLineNums" },
- { 3, "NoLocalSyms" },
- { 4, "AggressiveWsTrim" },
- { 9, "NoDebugInfo" },
- { 10, "RemovableRun" },
- { 11, "NetRun" },
- { 12, "System" },
- { 14, "UniCPU" },
- { 7, "Little-Endian" },
- { 15, "Big-Endian" }
-};
-
-static const CUInt32PCharPair g_DllCharacts[] =
-{
- { 6, "Relocated" },
- { 7, "Integrity" },
- { 8, "NX-Compatible" },
- { 9, "NoIsolation" },
- { 10, "NoSEH" },
- { 11, "NoBind" },
- { 13, "WDM" },
- { 15, "TerminalServerAware" }
-};
-
-static const CUInt32PCharPair g_SectFlags[] =
-{
- { 3, "NoPad" },
- { 5, "Code" },
- { 6, "InitializedData" },
- { 7, "UninitializedData" },
- { 9, "Comments" },
- { 11, "Remove" },
- { 12, "COMDAT" },
- { 15, "GP" },
- { 24, "ExtendedRelocations" },
- { 25, "Discardable" },
- { 26, "NotCached" },
- { 27, "NotPaged" },
- { 28, "Shared" },
- { 29, "Execute" },
- { 30, "Read" },
- { 31, "Write" }
-};
-
-static const CUInt32PCharPair g_MachinePairs[] =
-{
- { 0x014C, "x86" },
- { 0x0162, "MIPS-R3000" },
- { 0x0166, "MIPS-R4000" },
- { 0x0168, "MIPS-R10000" },
- { 0x0169, "MIPS-V2" },
- { 0x0184, "Alpha" },
- { 0x01A2, "SH3" },
- { 0x01A3, "SH3-DSP" },
- { 0x01A4, "SH3E" },
- { 0x01A6, "SH4" },
- { 0x01A8, "SH5" },
- { 0x01C0, "ARM" },
- { 0x01C2, "ARM-Thumb" },
- { 0x01F0, "PPC" },
- { 0x01F1, "PPC-FP" },
- { 0x0200, "IA-64" },
- { 0x0284, "Alpha-64" },
- { 0x0200, "IA-64" },
- { 0x0366, "MIPSFPU" },
- { 0x8664, "x64" },
- { 0x0EBC, "EFI" }
-};
-
-static const CUInt32PCharPair g_SubSystems[] =
-{
- { 0, "Unknown" },
- { 1, "Native" },
- { 2, "Windows GUI" },
- { 3, "Windows CUI" },
- { 7, "Posix" },
- { 9, "Windows CE" },
- { 10, "EFI" },
- { 11, "EFI Boot" },
- { 12, "EFI Runtime" },
- { 13, "EFI ROM" },
- { 14, "XBOX" }
-};
-
-static const wchar_t *g_ResTypes[] =
-{
- NULL,
- L"CURSOR",
- L"BITMAP",
- L"ICON",
- L"MENU",
- L"DIALOG",
- L"STRING",
- L"FONTDIR",
- L"FONT",
- L"ACCELERATOR",
- L"RCDATA",
- L"MESSAGETABLE",
- L"GROUP_CURSOR",
- NULL,
- L"GROUP_ICON",
- NULL,
- L"VERSION",
- L"DLGINCLUDE",
- NULL,
- L"PLUGPLAY",
- L"VXD",
- L"ANICURSOR",
- L"ANIICON",
- L"HTML",
- L"MANIFEST"
-};
-
-const UInt32 kFlag = (UInt32)1 << 31;
-const UInt32 kMask = ~kFlag;
-
-struct CTableItem
-{
- UInt32 Offset;
- UInt32 ID;
-};
-
-
-const UInt32 kBmpHeaderSize = 14;
-const UInt32 kIconHeaderSize = 22;
-
-struct CResItem
-{
- UInt32 Type;
- UInt32 ID;
- UInt32 Lang;
-
- UInt32 Size;
- UInt32 Offset;
-
- UInt32 HeaderSize;
- Byte Header[kIconHeaderSize]; // it must be enough for max size header.
- bool Enabled;
-
- bool IsNameEqual(const CResItem &item) const { return Lang == item.Lang; }
- UInt32 GetSize() const { return Size + HeaderSize; }
- bool IsBmp() const { return Type == 2; }
- bool IsIcon() const { return Type == 3; }
- bool IsString() const { return Type == 6; }
- bool IsRcData() const { return Type == 10; }
- bool IsRcDataOrUnknown() const { return IsRcData() || Type > 64; }
-};
-
-struct CStringItem
-{
- UInt32 Lang;
- UInt32 Size;
- CByteDynamicBuffer Buf;
-
- void AddChar(Byte c);
- void AddWChar(UInt16 c);
-};
-
-void CStringItem::AddChar(Byte c)
-{
- Buf.EnsureCapacity(Size + 2);
- Buf[Size++] = c;
- Buf[Size++] = 0;
-}
-
-void CStringItem::AddWChar(UInt16 c)
-{
- if (c == '\n')
- {
- AddChar('\\');
- c = 'n';
- }
- Buf.EnsureCapacity(Size + 2);
- SetUi16(Buf + Size, c);
- Size += 2;
-}
-
-struct CMixItem
-{
- int SectionIndex;
- int ResourceIndex;
- int StringIndex;
-
- bool IsSectionItem() const { return ResourceIndex < 0 && StringIndex < 0; };
-};
-
-struct CUsedBitmap
-{
- CByteBuffer Buf;
-public:
- void Alloc(size_t size)
- {
- size = (size + 7) / 8;
- Buf.SetCapacity(size);
- memset(Buf, 0, size);
- }
- void Free()
- {
- Buf.SetCapacity(0);
- }
- bool SetRange(size_t from, int size)
- {
- for (int i = 0; i < size; i++)
- {
- size_t pos = (from + i) >> 3;
- Byte mask = (Byte)(1 << ((from + i) & 7));
- Byte b = Buf[pos];
- if ((b & mask) != 0)
- return false;
- Buf[pos] = b | mask;
- }
- return true;
- }
-};
-
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CObjectVector<CSection> _sections;
- UInt32 _peOffset;
- CHeader _header;
- COptHeader _optHeader;
- UInt32 _totalSize;
- UInt32 _totalSizeLimited;
- Int32 _mainSubfile;
-
- CRecordVector<CResItem> _items;
- CObjectVector<CStringItem> _strings;
-
- CByteBuffer _buf;
- bool _oneLang;
- UString _resourceFileName;
- CUsedBitmap _usedRes;
- bool _parseResources;
-
- CRecordVector<CMixItem> _mixItems;
-
- HRESULT LoadDebugSections(IInStream *stream, bool &thereIsSection);
- HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback);
- bool Parse(const Byte *buf, UInt32 size);
-
- void AddResNameToString(UString &s, UInt32 id) const;
- UString GetLangPrefix(UInt32 lang);
- HRESULT ReadString(UInt32 offset, UString &dest) const;
- HRESULT ReadTable(UInt32 offset, CRecordVector<CTableItem> &items);
- bool ParseStringRes(UInt32 id, UInt32 lang, const Byte *src, UInt32 size);
- HRESULT OpenResources(int sectIndex, IInStream *stream, IArchiveOpenCallback *callback);
- void CloseResources();
-
-
- bool CheckItem(const CSection &sect, const CResItem &item, size_t offset) const
- {
- return item.Offset >= sect.Va && offset <= _buf.GetCapacity() && _buf.GetCapacity() - offset >= item.Size;
- }
-
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-bool CHandler::Parse(const Byte *buf, UInt32 size)
-{
- UInt32 i;
- if (size < 512)
- return false;
- _peOffset = Get32(buf + 0x3C);
- if (_peOffset >= 0x1000 || _peOffset + 512 > size || (_peOffset & 7) != 0)
- return false;
-
- UInt32 pos = _peOffset;
- if (!_header.Parse(buf + pos))
- return false;
- if (_header.OptHeaderSize > 512 || _header.NumSections > NUM_SCAN_SECTIONS_MAX)
- return false;
- pos += kHeaderSize;
-
- if (!_optHeader.Parse(buf + pos, _header.OptHeaderSize))
- return false;
-
- pos += _header.OptHeaderSize;
- _totalSize = pos;
-
- for (i = 0; i < _header.NumSections; i++, pos += kSectionSize)
- {
- CSection sect;
- if (pos + kSectionSize > size)
- return false;
- sect.Parse(buf + pos);
- sect.IsRealSect = true;
- sect.UpdateTotalSize(_totalSize);
- _sections.Add(sect);
- }
-
- return true;
-}
-
-enum
-{
- kpidSectAlign = kpidUserDefined,
- kpidFileAlign,
- kpidLinkerVer,
- kpidOsVer,
- kpidImageVer,
- kpidSubsysVer,
- kpidCodeSize,
- kpidImageSize,
- kpidInitDataSize,
- kpidUnInitDataSize,
- kpidHeadersSizeUnInitDataSize,
- kpidSubSystem,
- kpidDllCharacts,
- kpidStackReserve,
- kpidStackCommit,
- kpidHeapReserve,
- kpidHeapCommit,
- kpidImageBase
- // kpidAddressOfEntryPoint,
- // kpidBaseOfCode,
- // kpidBaseOfData32,
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidCpu, VT_BSTR},
- { NULL, kpidBit64, VT_BOOL},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidPhySize, VT_UI4},
- { NULL, kpidHeadersSize, VT_UI4},
- { NULL, kpidChecksum, VT_UI4},
- { L"Image Size", kpidImageSize, VT_UI4},
- { L"Section Alignment", kpidSectAlign, VT_UI4},
- { L"File Alignment", kpidFileAlign, VT_UI4},
- { L"Code Size", kpidCodeSize, VT_UI4},
- { L"Initialized Data Size", kpidInitDataSize, VT_UI4},
- { L"Uninitialized Data Size", kpidUnInitDataSize, VT_UI4},
- { L"Linker Version", kpidLinkerVer, VT_BSTR},
- { L"OS Version", kpidOsVer, VT_BSTR},
- { L"Image Version", kpidImageVer, VT_BSTR},
- { L"Subsystem Version", kpidSubsysVer, VT_BSTR},
- { L"Subsystem", kpidSubSystem, VT_BSTR},
- { L"DLL Characteristics", kpidDllCharacts, VT_BSTR},
- { L"Stack Reserve", kpidStackReserve, VT_UI8},
- { L"Stack Commit", kpidStackCommit, VT_UI8},
- { L"Heap Reserve", kpidHeapReserve, VT_UI8},
- { L"Heap Commit", kpidHeapCommit, VT_UI8},
- { L"Image Base", kpidImageBase, VT_UI8}
- // { L"Address Of Entry Point", kpidAddressOfEntryPoint, VT_UI8},
- // { L"Base Of Code", kpidBaseOfCode, VT_UI8},
- // { L"Base Of Data", kpidBaseOfData32, VT_UI8},
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidOffset, VT_UI8},
- { NULL, kpidVa, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_WITH_NAME
-
-static void VerToProp(const CVersion &v, NCOM::CPropVariant &prop)
-{
- StringToProp(v.GetString(), prop);
-}
-
-void TimeToProp(UInt32 unixTime, NCOM::CPropVariant &prop)
-{
- if (unixTime != 0)
- {
- FILETIME ft;
- NTime::UnixTimeToFileTime(unixTime, ft);
- prop = ft;
- }
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidSectAlign: prop = _optHeader.SectAlign; break;
- case kpidFileAlign: prop = _optHeader.FileAlign; break;
- case kpidLinkerVer:
- {
- CVersion v = { _optHeader.LinkerVerMajor, _optHeader.LinkerVerMinor };
- VerToProp(v, prop);
- break;
- }
-
- case kpidOsVer: VerToProp(_optHeader.OsVer, prop); break;
- case kpidImageVer: VerToProp(_optHeader.ImageVer, prop); break;
- case kpidSubsysVer: VerToProp(_optHeader.SubsysVer, prop); break;
- case kpidCodeSize: prop = _optHeader.CodeSize; break;
- case kpidInitDataSize: prop = _optHeader.InitDataSize; break;
- case kpidUnInitDataSize: prop = _optHeader.UninitDataSize; break;
- case kpidImageSize: prop = _optHeader.ImageSize; break;
- case kpidPhySize: prop = _totalSize; break;
- case kpidHeadersSize: prop = _optHeader.HeadersSize; break;
- case kpidChecksum: prop = _optHeader.CheckSum; break;
-
- case kpidCpu: PAIR_TO_PROP(g_MachinePairs, _header.Machine, prop); break;
- case kpidBit64: if (_optHeader.Is64Bit()) prop = true; break;
- case kpidSubSystem: PAIR_TO_PROP(g_SubSystems, _optHeader.SubSystem, prop); break;
-
- case kpidMTime:
- case kpidCTime: TimeToProp(_header.Time, prop); break;
- case kpidCharacts: FLAGS_TO_PROP(g_HeaderCharacts, _header.Flags, prop); break;
- case kpidDllCharacts: FLAGS_TO_PROP(g_DllCharacts, _optHeader.DllCharacts, prop); break;
- case kpidStackReserve: prop = _optHeader.StackReserve; break;
- case kpidStackCommit: prop = _optHeader.StackCommit; break;
- case kpidHeapReserve: prop = _optHeader.HeapReserve; break;
- case kpidHeapCommit: prop = _optHeader.HeapCommit; break;
-
- case kpidImageBase: prop = _optHeader.ImageBase; break;
- // case kpidAddressOfEntryPoint: prop = _optHeader.AddressOfEntryPoint; break;
- // case kpidBaseOfCode: prop = _optHeader.BaseOfCode; break;
- // case kpidBaseOfData32: if (!_optHeader.Is64Bit()) prop = _optHeader.BaseOfData32; break;
-
- case kpidMainSubfile: if (_mainSubfile >= 0) prop = (UInt32)_mainSubfile; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-void CHandler::AddResNameToString(UString &s, UInt32 id) const
-{
- if ((id & kFlag) != 0)
- {
- UString name;
- if (ReadString(id & kMask, name) == S_OK)
- {
- if (name.IsEmpty())
- s += L"[]";
- else
- {
- if (name.Length() > 1 && name[0] == '"' && name.Back() == '"')
- name = name.Mid(1, name.Length() - 2);
- s += name;
- }
- return;
- }
- }
- wchar_t sz[32];
- ConvertUInt32ToString(id, sz);
- s += sz;
-}
-
-UString CHandler::GetLangPrefix(UInt32 lang)
-{
- UString s = _resourceFileName;
- s += WCHAR_PATH_SEPARATOR;
- if (!_oneLang)
- {
- AddResNameToString(s, lang);
- s += WCHAR_PATH_SEPARATOR;
- }
- return s;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- const CMixItem &mixItem = _mixItems[index];
- if (mixItem.StringIndex >= 0)
- {
- const CStringItem &item = _strings[mixItem.StringIndex];
- switch(propID)
- {
- case kpidPath: prop = GetLangPrefix(item.Lang) + L"string.txt"; break;
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)item.Size; break;
- }
- }
- else if (mixItem.ResourceIndex < 0)
- {
- const CSection &item = _sections[mixItem.SectionIndex];
- switch(propID)
- {
- case kpidPath: StringToProp(item.Name, prop); break;
- case kpidSize: prop = (UInt64)item.VSize; break;
- case kpidPackSize: prop = (UInt64)item.GetPackSize(); break;
- case kpidOffset: prop = item.Pa; break;
- case kpidVa: if (item.IsRealSect) prop = item.Va; break;
- case kpidMTime:
- case kpidCTime:
- TimeToProp(item.IsDebug ? item.Time : _header.Time, prop); break;
- case kpidCharacts: if (item.IsRealSect) FLAGS_TO_PROP(g_SectFlags, item.Flags, prop); break;
- }
- }
- else
- {
- const CResItem &item = _items[mixItem.ResourceIndex];
- switch(propID)
- {
- case kpidPath:
- {
- UString s = GetLangPrefix(item.Lang);
- {
- const wchar_t *p = NULL;
- if (item.Type < sizeof(g_ResTypes) / sizeof(g_ResTypes[0]))
- p = g_ResTypes[item.Type];
- if (p != 0)
- s += p;
- else
- AddResNameToString(s, item.Type);
- }
- s += WCHAR_PATH_SEPARATOR;
- AddResNameToString(s, item.ID);
- if (item.HeaderSize != 0)
- {
- if (item.IsBmp())
- s += L".bmp";
- else if (item.IsIcon())
- s += L".ico";
- }
- prop = s;
- break;
- }
- case kpidSize: prop = (UInt64)item.GetSize(); break;
- case kpidPackSize: prop = (UInt64)item.Size; break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::LoadDebugSections(IInStream *stream, bool &thereIsSection)
-{
- thereIsSection = false;
- const CDirLink &debugLink = _optHeader.DirItems[kDirLink_Debug];
- if (debugLink.Size == 0)
- return S_OK;
- const unsigned kEntrySize = 28;
- UInt32 numItems = debugLink.Size / kEntrySize;
- if (numItems * kEntrySize != debugLink.Size || numItems > 16)
- return S_FALSE;
-
- UInt64 pa = 0;
- int i;
- for (i = 0; i < _sections.Size(); i++)
- {
- const CSection &sect = _sections[i];
- if (sect.Va < debugLink.Va && debugLink.Va + debugLink.Size <= sect.Va + sect.PSize)
- {
- pa = sect.Pa + (debugLink.Va - sect.Va);
- break;
- }
- }
- if (i == _sections.Size())
- {
- return S_OK;
- // Exe for ARM requires S_OK
- // return S_FALSE;
- }
-
- CByteBuffer buffer;
- buffer.SetCapacity(debugLink.Size);
- Byte *buf = buffer;
-
- RINOK(stream->Seek(pa, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(stream, buf, debugLink.Size));
-
- for (i = 0; i < (int)numItems; i++)
- {
- CDebugEntry de;
- de.Parse(buf);
-
- if (de.Size == 0)
- continue;
-
- CSection sect;
- sect.Name = ".debug" + GetDecString(i);
-
- sect.IsDebug = true;
- sect.Time = de.Time;
- sect.Va = de.Va;
- sect.Pa = de.Pa;
- sect.PSize = sect.VSize = de.Size;
- UInt32 totalSize = sect.Pa + sect.PSize;
- if (totalSize > _totalSize)
- {
- _totalSize = totalSize;
- _sections.Add(sect);
- thereIsSection = true;
- }
- buf += kEntrySize;
- }
-
- return S_OK;
-}
-
-HRESULT CHandler::ReadString(UInt32 offset, UString &dest) const
-{
- if ((offset & 1) != 0 || offset >= _buf.GetCapacity())
- return S_FALSE;
- size_t rem = _buf.GetCapacity() - offset;
- if (rem < 2)
- return S_FALSE;
- unsigned length = Get16(_buf + offset);
- if ((rem - 2) / 2 < length)
- return S_FALSE;
- dest.Empty();
- offset += 2;
- for (unsigned i = 0; i < length; i++)
- dest += (wchar_t)Get16(_buf + offset + i * 2);
- return S_OK;
-}
-
-HRESULT CHandler::ReadTable(UInt32 offset, CRecordVector<CTableItem> &items)
-{
- if ((offset & 3) != 0 || offset >= _buf.GetCapacity())
- return S_FALSE;
- size_t rem = _buf.GetCapacity() - offset;
- if (rem < 16)
- return S_FALSE;
- items.Clear();
- unsigned numNameItems = Get16(_buf + offset + 12);
- unsigned numIdItems = Get16(_buf + offset + 14);
- unsigned numItems = numNameItems + numIdItems;
- if ((rem - 16) / 8 < numItems)
- return S_FALSE;
- if (!_usedRes.SetRange(offset, 16 + numItems * 8))
- return S_FALSE;
- offset += 16;
- _oneLang = true;
- unsigned i;
- for (i = 0; i < numItems; i++)
- {
- CTableItem item;
- const Byte *buf = _buf + offset;
- offset += 8;
- item.ID = Get32(buf + 0);
- if (((item.ID & kFlag) != 0) != (i < numNameItems))
- return S_FALSE;
- item.Offset = Get32(buf + 4);
- items.Add(item);
- }
- return S_OK;
-}
-
-static const UInt32 kFileSizeMax = (UInt32)1 << 30;
-static const int kNumResItemsMax = (UInt32)1 << 23;
-static const int kNumStringLangsMax = 128;
-
-// BITMAPINFOHEADER
-struct CBitmapInfoHeader
-{
- // UInt32 HeaderSize;
- UInt32 XSize;
- Int32 YSize;
- UInt16 Planes;
- UInt16 BitCount;
- UInt32 Compression;
- UInt32 SizeImage;
-
- bool Parse(const Byte *p, size_t size);
-};
-
-static const UInt32 kBitmapInfoHeader_Size = 0x28;
-
-bool CBitmapInfoHeader::Parse(const Byte *p, size_t size)
-{
- if (size < kBitmapInfoHeader_Size || Get32(p) != kBitmapInfoHeader_Size)
- return false;
- XSize = Get32(p + 4);
- YSize = (Int32)Get32(p + 8);
- Planes = Get16(p + 12);
- BitCount = Get16(p + 14);
- Compression = Get32(p + 16);
- SizeImage = Get32(p + 20);
- return true;
-}
-
-static UInt32 GetImageSize(UInt32 xSize, UInt32 ySize, UInt32 bitCount)
-{
- return ((xSize * bitCount + 7) / 8 + 3) / 4 * 4 * ySize;
-}
-
-static UInt32 SetBitmapHeader(Byte *dest, const Byte *src, UInt32 size)
-{
- CBitmapInfoHeader h;
- if (!h.Parse(src, size))
- return 0;
- if (h.YSize < 0)
- h.YSize = -h.YSize;
- if (h.XSize > (1 << 26) || h.YSize > (1 << 26) || h.Planes != 1 || h.BitCount > 32 ||
- h.Compression != 0) // BI_RGB
- return 0;
- if (h.SizeImage == 0)
- h.SizeImage = GetImageSize(h.XSize, h.YSize, h.BitCount);
- UInt32 totalSize = kBmpHeaderSize + size;
- UInt32 offBits = totalSize - h.SizeImage;
- // BITMAPFILEHEADER
- SetUi16(dest, 0x4D42);
- SetUi32(dest + 2, totalSize);
- SetUi32(dest + 6, 0);
- SetUi32(dest + 10, offBits);
- return kBmpHeaderSize;
-}
-
-static UInt32 SetIconHeader(Byte *dest, const Byte *src, UInt32 size)
-{
- CBitmapInfoHeader h;
- if (!h.Parse(src, size))
- return 0;
- if (h.YSize < 0)
- h.YSize = -h.YSize;
- if (h.XSize > (1 << 26) || h.YSize > (1 << 26) || h.Planes != 1 ||
- h.Compression != 0) // BI_RGB
- return 0;
-
- UInt32 numBitCount = h.BitCount;
- if (numBitCount != 1 &&
- numBitCount != 4 &&
- numBitCount != 8 &&
- numBitCount != 24 &&
- numBitCount != 32)
- return 0;
-
- if ((h.YSize & 1) != 0)
- return 0;
- h.YSize /= 2;
- if (h.XSize > 0x100 || h.YSize > 0x100)
- return 0;
-
- UInt32 imageSize;
- // imageSize is not correct if AND mask array contains zeros
- // in this case it is equal image1Size
-
- // UInt32 imageSize = h.SizeImage;
- // if (imageSize == 0)
- // {
- UInt32 image1Size = GetImageSize(h.XSize, h.YSize, h.BitCount);
- UInt32 image2Size = GetImageSize(h.XSize, h.YSize, 1);
- imageSize = image1Size + image2Size;
- // }
- UInt32 numColors = 0;
- if (numBitCount < 16)
- numColors = 1 << numBitCount;
-
- SetUi16(dest, 0); // Reserved
- SetUi16(dest + 2, 1); // RES_ICON
- SetUi16(dest + 4, 1); // ResCount
-
- dest[6] = (Byte)h.XSize; // Width
- dest[7] = (Byte)h.YSize; // Height
- dest[8] = (Byte)numColors; // ColorCount
- dest[9] = 0; // Reserved
-
- SetUi32(dest + 10, 0); // Reserved1 / Reserved2
-
- UInt32 numQuadsBytes = numColors * 4;
- UInt32 BytesInRes = kBitmapInfoHeader_Size + numQuadsBytes + imageSize;
- SetUi32(dest + 14, BytesInRes);
- SetUi32(dest + 18, kIconHeaderSize);
-
- /*
- Description = DWORDToString(xSize) +
- kDelimiterChar + DWORDToString(ySize) +
- kDelimiterChar + DWORDToString(numBitCount);
- */
- return kIconHeaderSize;
-}
-
-bool CHandler::ParseStringRes(UInt32 id, UInt32 lang, const Byte *src, UInt32 size)
-{
- if ((size & 1) != 0)
- return false;
-
- int i;
- for (i = 0; i < _strings.Size(); i++)
- if (_strings[i].Lang == lang)
- break;
- if (i == _strings.Size())
- {
- if (_strings.Size() >= kNumStringLangsMax)
- return false;
- CStringItem item;
- item.Size = 0;
- item.Lang = lang;
- i = _strings.Add(item);
- }
-
- CStringItem &item = _strings[i];
- id = (id - 1) << 4;
- UInt32 pos = 0;
- for (i = 0; i < 16; i++)
- {
- if (size - pos < 2)
- return false;
- UInt32 len = Get16(src + pos);
- pos += 2;
- if (len != 0)
- {
- if (size - pos < len * 2)
- return false;
- char temp[32];
- ConvertUInt32ToString(id + i, temp);
- size_t tempLen = strlen(temp);
- size_t j;
- for (j = 0; j < tempLen; j++)
- item.AddChar(temp[j]);
- item.AddChar('\t');
- for (j = 0; j < len; j++, pos += 2)
- item.AddWChar(Get16(src + pos));
- item.AddChar(0x0D);
- item.AddChar(0x0A);
- }
- }
- return (size == pos);
-}
-
-HRESULT CHandler::OpenResources(int sectionIndex, IInStream *stream, IArchiveOpenCallback *callback)
-{
- const CSection &sect = _sections[sectionIndex];
- size_t fileSize = sect.PSize; // Maybe we need sect.VSize here !!!
- if (fileSize > kFileSizeMax)
- return S_FALSE;
- {
- UInt64 fileSize64 = fileSize;
- if (callback)
- RINOK(callback->SetTotal(NULL, &fileSize64));
- RINOK(stream->Seek(sect.Pa, STREAM_SEEK_SET, NULL));
- _buf.SetCapacity(fileSize);
- for (size_t pos = 0; pos < fileSize;)
- {
- UInt64 offset64 = pos;
- if (callback)
- RINOK(callback->SetCompleted(NULL, &offset64))
- size_t rem = MyMin(fileSize - pos, (size_t)(1 << 20));
- RINOK(ReadStream_FALSE(stream, _buf + pos, rem));
- pos += rem;
- }
- }
-
- _usedRes.Alloc(fileSize);
- CRecordVector<CTableItem> specItems;
- RINOK(ReadTable(0, specItems));
-
- _oneLang = true;
- bool stringsOk = true;
- size_t maxOffset = 0;
- for (int i = 0; i < specItems.Size(); i++)
- {
- const CTableItem &item1 = specItems[i];
- if ((item1.Offset & kFlag) == 0)
- return S_FALSE;
-
- CRecordVector<CTableItem> specItems2;
- RINOK(ReadTable(item1.Offset & kMask, specItems2));
-
- for (int j = 0; j < specItems2.Size(); j++)
- {
- const CTableItem &item2 = specItems2[j];
- if ((item2.Offset & kFlag) == 0)
- return S_FALSE;
-
- CRecordVector<CTableItem> specItems3;
- RINOK(ReadTable(item2.Offset & kMask, specItems3));
-
- CResItem item;
- item.Type = item1.ID;
- item.ID = item2.ID;
-
- for (int k = 0; k < specItems3.Size(); k++)
- {
- if (_items.Size() >= kNumResItemsMax)
- return S_FALSE;
- const CTableItem &item3 = specItems3[k];
- if ((item3.Offset & kFlag) != 0)
- return S_FALSE;
- if (item3.Offset >= _buf.GetCapacity() || _buf.GetCapacity() - item3.Offset < 16)
- return S_FALSE;
- const Byte *buf = _buf + item3.Offset;
- item.Lang = item3.ID;
- item.Offset = Get32(buf + 0);
- item.Size = Get32(buf + 4);
- // UInt32 codePage = Get32(buf + 8);
- if (Get32(buf + 12) != 0)
- return S_FALSE;
- if (!_items.IsEmpty() && _oneLang && !item.IsNameEqual(_items.Back()))
- _oneLang = false;
-
- item.HeaderSize = 0;
-
- size_t offset = item.Offset - sect.Va;
- if (offset > maxOffset)
- maxOffset = offset;
- if (offset + item.Size > maxOffset)
- maxOffset = offset + item.Size;
-
- if (CheckItem(sect, item, offset))
- {
- const Byte *data = _buf + offset;
- if (item.IsBmp())
- item.HeaderSize = SetBitmapHeader(item.Header, data, item.Size);
- else if (item.IsIcon())
- item.HeaderSize = SetIconHeader(item.Header, data, item.Size);
- else if (item.IsString())
- {
- if (stringsOk)
- stringsOk = ParseStringRes(item.ID, item.Lang, data, item.Size);
- }
- }
-
- item.Enabled = true;
- _items.Add(item);
- }
- }
- }
-
- if (stringsOk && !_strings.IsEmpty())
- {
- int i;
- for (i = 0; i < _items.Size(); i++)
- {
- CResItem &item = _items[i];
- if (item.IsString())
- item.Enabled = false;
- }
- for (i = 0; i < _strings.Size(); i++)
- {
- if (_strings[i].Size == 0)
- continue;
- CMixItem mixItem;
- mixItem.ResourceIndex = -1;
- mixItem.StringIndex = i;
- mixItem.SectionIndex = sectionIndex;
- _mixItems.Add(mixItem);
- }
- }
-
- _usedRes.Free();
-
- int numBits = _optHeader.GetNumFileAlignBits();
- if (numBits >= 0)
- {
- UInt32 mask = (1 << numBits) - 1;
- size_t end = ((maxOffset + mask) & ~mask);
- if (end < sect.VSize && end <= sect.PSize)
- {
- CSection sect2;
- sect2.Flags = 0;
-
- // we skip Zeros to start of aligned block
- size_t i;
- for (i = maxOffset; i < end; i++)
- if (_buf[i] != 0)
- break;
- if (i == end)
- maxOffset = end;
-
- sect2.Pa = sect.Pa + (UInt32)maxOffset;
- sect2.Va = sect.Va + (UInt32)maxOffset;
- sect2.PSize = sect.VSize - (UInt32)maxOffset;
- sect2.VSize = sect2.PSize;
- sect2.Name = ".rsrc_1";
- sect2.Time = 0;
- sect2.IsAdditionalSection = true;
- _sections.Add(sect2);
- }
- }
-
- return S_OK;
-}
-
-HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback)
-{
- const UInt32 kBufSize = 1 << 18;
- const UInt32 kSigSize = 2;
-
- _mainSubfile = -1;
-
- CByteBuffer buffer;
- buffer.SetCapacity(kBufSize);
- Byte *buf = buffer;
-
- size_t processed = kSigSize;
- RINOK(ReadStream_FALSE(stream, buf, processed));
- if (buf[0] != 'M' || buf[1] != 'Z')
- return S_FALSE;
- processed = kBufSize - kSigSize;
- RINOK(ReadStream(stream, buf + kSigSize, &processed));
- processed += kSigSize;
- if (!Parse(buf, (UInt32)processed))
- return S_FALSE;
- bool thereISDebug;
- RINOK(LoadDebugSections(stream, thereISDebug));
-
- const CDirLink &certLink = _optHeader.DirItems[kDirLink_Certificate];
- if (certLink.Size != 0)
- {
- CSection sect;
- sect.Name = "CERTIFICATE";
- sect.Va = 0;
- sect.Pa = certLink.Va;
- sect.PSize = sect.VSize = certLink.Size;
- sect.UpdateTotalSize(_totalSize);
- _sections.Add(sect);
- }
-
- if (thereISDebug)
- {
- const UInt32 kAlign = 1 << 12;
- UInt32 alignPos = _totalSize & (kAlign - 1);
- if (alignPos != 0)
- {
- UInt32 size = kAlign - alignPos;
- RINOK(stream->Seek(_totalSize, STREAM_SEEK_SET, NULL));
- buffer.Free();
- buffer.SetCapacity(kAlign);
- Byte *buf = buffer;
- size_t processed = size;
- RINOK(ReadStream(stream, buf, &processed));
- size_t i;
- for (i = 0; i < processed; i++)
- {
- if (buf[i] != 0)
- break;
- }
- if (processed < size && processed < 100)
- _totalSize += (UInt32)processed;
- else if (((_totalSize + i) & 0x1FF) == 0 || processed < size)
- _totalSize += (UInt32)i;
- }
- }
-
- if (_header.NumSymbols > 0 && _header.PointerToSymbolTable >= 512)
- {
- if (_header.NumSymbols >= (1 << 24))
- return S_FALSE;
- CSection sect;
- sect.Name = "COFF_SYMBOLS";
- UInt32 size = _header.NumSymbols * 18;
- RINOK(stream->Seek((UInt64)_header.PointerToSymbolTable + size, STREAM_SEEK_SET, NULL));
- Byte buf[4];
- RINOK(ReadStream_FALSE(stream, buf, 4));
- UInt32 size2 = Get32(buf);
- if (size2 >= (1 << 28))
- return S_FALSE;
- size += size2;
-
- sect.Va = 0;
- sect.Pa = _header.PointerToSymbolTable;
- sect.PSize = sect.VSize = size;
- sect.UpdateTotalSize(_totalSize);
- _sections.Add(sect);
- }
-
- UInt64 fileSize;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize));
- if (fileSize > _totalSize)
- return S_FALSE;
- _totalSizeLimited = (_totalSize < fileSize) ? _totalSize : (UInt32)fileSize;
-
- {
- CObjectVector<CSection> sections = _sections;
- sections.Sort();
- UInt32 limit = (1 << 12);
- int num = 0;
- int numSections = sections.Size();
- for (int i = 0; i < numSections; i++)
- {
- const CSection &s = sections[i];
- if (s.Pa > limit)
- {
- CSection s2;
- s2.Pa = s2.Va = limit;
- s2.PSize = s2.VSize = s.Pa - limit;
- s2.IsAdditionalSection = true;
- s2.Name = '[';
- s2.Name += GetDecString(num++);
- s2.Name += ']';
- _sections.Add(s2);
- limit = s.Pa;
- }
- UInt32 next = s.Pa + s.PSize;
- if (next < s.Pa)
- break;
- if (next >= limit)
- limit = next;
- }
- }
-
- _parseResources = true;
-
- UInt64 mainSize = 0, mainSize2 = 0;
- int i;
- for (i = 0; i < _sections.Size(); i++)
- {
- const CSection &sect = _sections[i];
- CMixItem mixItem;
- mixItem.SectionIndex = i;
- if (_parseResources && sect.Name == ".rsrc" && _items.IsEmpty())
- {
- HRESULT res = OpenResources(i, stream, callback);
- if (res == S_OK)
- {
- _resourceFileName = GetUnicodeString(sect.Name);
- for (int j = 0; j < _items.Size(); j++)
- {
- const CResItem &item = _items[j];
- if (item.Enabled)
- {
- mixItem.ResourceIndex = j;
- mixItem.StringIndex = -1;
- if (item.IsRcDataOrUnknown())
- {
- if (item.Size >= mainSize)
- {
- mainSize2 = mainSize;
- mainSize = item.Size;
- _mainSubfile = _mixItems.Size();
- }
- else if (item.Size >= mainSize2)
- mainSize2 = item.Size;
- }
- _mixItems.Add(mixItem);
- }
- }
- if (sect.PSize > sect.VSize)
- {
- int numBits = _optHeader.GetNumFileAlignBits();
- if (numBits >= 0)
- {
- UInt32 mask = (1 << numBits) - 1;
- UInt32 end = ((sect.VSize + mask) & ~mask);
-
- if (sect.PSize > end)
- {
- CSection sect2;
- sect2.Flags = 0;
- sect2.Pa = sect.Pa + end;
- sect2.Va = sect.Va + end;
- sect2.PSize = sect.PSize - end;
- sect2.VSize = sect2.PSize;
- sect2.Name = ".rsrc_2";
- sect2.Time = 0;
- sect2.IsAdditionalSection = true;
- _sections.Add(sect2);
- }
- }
- }
- continue;
- }
- if (res != S_FALSE)
- return res;
- CloseResources();
- }
- mixItem.StringIndex = -1;
- mixItem.ResourceIndex = -1;
- if (sect.IsAdditionalSection)
- {
- if (sect.PSize >= mainSize)
- {
- mainSize2 = mainSize;
- mainSize = sect.PSize;
- _mainSubfile = _mixItems.Size();
- }
- else
- mainSize2 = sect.PSize;
- }
- _mixItems.Add(mixItem);
- }
-
- if (mainSize2 >= (1 << 20) && mainSize < mainSize2 * 2)
- _mainSubfile = -1;
-
- for (i = 0; i < _mixItems.Size(); i++)
- {
- const CMixItem &mixItem = _mixItems[i];
- if (mixItem.StringIndex < 0 && mixItem.ResourceIndex < 0 && _sections[mixItem.SectionIndex].Name == "_winzip_")
- {
- _mainSubfile = i;
- break;
- }
- }
-
- return S_OK;
-}
-
-HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 excludePos, UInt32 &res)
-{
- // size &= ~1;
- const UInt32 kBufSize = 1 << 23;
- CByteBuffer buffer;
- buffer.SetCapacity(kBufSize);
- Byte *buf = buffer;
-
- UInt32 sum = 0;
- UInt32 pos = 0;
- for (;;)
- {
- UInt32 rem = size - pos;
- if (rem > kBufSize)
- rem = kBufSize;
- if (rem == 0)
- break;
- size_t processed = rem;
- RINOK(ReadStream(stream, buf, &processed));
-
- /*
- for (; processed < rem; processed++)
- buf[processed] = 0;
- */
-
- if ((processed & 1) != 0)
- buf[processed] = 0;
-
- for (int j = 0; j < 4; j++)
- {
- UInt32 p = excludePos + j;
- if (pos <= p && p < pos + processed)
- buf[p - pos] = 0;
- }
-
- for (size_t i = 0; i < processed; i += 2)
- {
- sum += Get16(buf + i);
- sum = (sum + (sum >> 16)) & 0xFFFF;
- }
- pos += (UInt32)processed;
- if (rem != processed)
- break;
- }
- sum += pos;
- res = sum;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- Close();
- RINOK(Open2(inStream, callback));
- _stream = inStream;
- return S_OK;
- COM_TRY_END
-}
-
-void CHandler::CloseResources()
-{
- _usedRes.Free();
- _items.Clear();
- _strings.Clear();
- _buf.SetCapacity(0);
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _sections.Clear();
- _mixItems.Clear();
- CloseResources();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _mixItems.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _mixItems.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const CMixItem &mixItem = _mixItems[allFilesMode ? i : indices[i]];
- if (mixItem.StringIndex >= 0)
- totalSize += _strings[mixItem.StringIndex].Size;
- else if (mixItem.ResourceIndex < 0)
- totalSize += _sections[mixItem.SectionIndex].GetPackSize();
- else
- totalSize += _items[mixItem.ResourceIndex].GetSize();
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
- UInt64 currentItemSize;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- bool checkSumOK = true;
- if (_optHeader.CheckSum != 0 && (int)numItems == _mixItems.Size())
- {
- UInt32 checkSum = 0;
- RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL));
- CalcCheckSum(_stream, _totalSizeLimited, _peOffset + kHeaderSize + 64, checkSum);
- checkSumOK = (checkSum == _optHeader.CheckSum);
- }
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
-
- CMyComPtr<ISequentialOutStream> outStream;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- const CMixItem &mixItem = _mixItems[index];
-
- const CSection &sect = _sections[mixItem.SectionIndex];
- bool isOk = true;
- if (mixItem.StringIndex >= 0)
- {
- const CStringItem &item = _strings[mixItem.StringIndex];
- currentItemSize = item.Size;
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- if (outStream)
- RINOK(WriteStream(outStream, item.Buf, item.Size));
- }
- else if (mixItem.ResourceIndex < 0)
- {
- currentItemSize = sect.GetPackSize();
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(_stream->Seek(sect.Pa, STREAM_SEEK_SET, NULL));
- streamSpec->Init(currentItemSize);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- isOk = (copyCoderSpec->TotalSize == currentItemSize);
- }
- else
- {
- const CResItem &item = _items[mixItem.ResourceIndex];
- currentItemSize = item.GetSize();
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- size_t offset = item.Offset - sect.Va;
- if (!CheckItem(sect, item, offset))
- isOk = false;
- else if (outStream)
- {
- if (item.HeaderSize != 0)
- RINOK(WriteStream(outStream, item.Header, item.HeaderSize));
- RINOK(WriteStream(outStream, _buf + offset, item.Size));
- }
- }
-
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(isOk ?
- checkSumOK ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kCRCError:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
-
- const CMixItem &mixItem = _mixItems[index];
- const CSection &sect = _sections[mixItem.SectionIndex];
- if (mixItem.IsSectionItem())
- return CreateLimitedInStream(_stream, sect.Pa, sect.PSize, stream);
-
- CBufInStream *inStreamSpec = new CBufInStream;
- CMyComPtr<ISequentialInStream> streamTemp = inStreamSpec;
- CReferenceBuf *referenceBuf = new CReferenceBuf;
- CMyComPtr<IUnknown> ref = referenceBuf;
- if (mixItem.StringIndex >= 0)
- {
- const CStringItem &item = _strings[mixItem.StringIndex];
- referenceBuf->Buf.SetCapacity(item.Size);
- memcpy(referenceBuf->Buf, item.Buf, item.Size);
- }
- else
- {
- const CResItem &item = _items[mixItem.ResourceIndex];
- size_t offset = item.Offset - sect.Va;
- if (!CheckItem(sect, item, offset))
- return S_FALSE;
- if (item.HeaderSize == 0)
- {
- CBufInStream *streamSpec = new CBufInStream;
- CMyComPtr<IInStream> streamTemp2 = streamSpec;
- streamSpec->Init(_buf + offset, item.Size, (IInArchive *)this);
- *stream = streamTemp2.Detach();
- return S_OK;
- }
- referenceBuf->Buf.SetCapacity(item.HeaderSize + item.Size);
- memcpy(referenceBuf->Buf, item.Header, item.HeaderSize);
- memcpy(referenceBuf->Buf + item.HeaderSize, _buf + offset, item.Size);
- }
- inStreamSpec->Init(referenceBuf);
-
- *stream = streamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"PE", L"exe dll sys", 0, 0xDD, { 'P', 'E', 0, 0 }, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Pe)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/PpmdHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/PpmdHandler.cpp
deleted file mode 100644
index 9b2ef0482..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/PpmdHandler.cpp
+++ /dev/null
@@ -1,456 +0,0 @@
-/* PpmdHandler.c -- PPMd format handler
-2010-03-10 : Igor Pavlov : Public domain
-This code is based on:
- PPMd var.H (2001) / var.I (2002): Dmitry Shkarin : Public domain
- Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-#include "../../../C/Alloc.h"
-#include "../../../C/Ppmd7.h"
-#include "../../../C/Ppmd8.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/CWrappers.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NPpmd {
-
-static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
-static void SzBigFree(void *, void *address) { BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-static const UInt32 kBufSize = (1 << 20);
-
-struct CBuf
-{
- Byte *Buf;
-
- CBuf(): Buf(0) {}
- ~CBuf() { ::MidFree(Buf); }
- bool Alloc()
- {
- if (!Buf)
- Buf = (Byte *)::MidAlloc(kBufSize);
- return (Buf != 0);
- }
-};
-
-static const UInt32 kHeaderSize = 16;
-static const UInt32 kSignature = 0x84ACAF8F;
-static const unsigned kNewHeaderVer = 8;
-
-struct CItem
-{
- UInt32 Attrib;
- UInt32 Time;
- AString Name;
-
- unsigned Order;
- unsigned MemInMB;
- unsigned Ver;
- unsigned Restor;
-
- HRESULT ReadHeader(ISequentialInStream *s, UInt32 &headerSize);
- bool IsSupported() const { return Ver == 7 || (Ver == 8 && Restor <= 1); }
-};
-
-HRESULT CItem::ReadHeader(ISequentialInStream *s, UInt32 &headerSize)
-{
- Byte h[kHeaderSize];
- RINOK(ReadStream_FALSE(s, h, kHeaderSize));
- if (GetUi32(h) != kSignature)
- return S_FALSE;
- Attrib = GetUi32(h + 4);
- Time = GetUi32(h + 12);
-
- unsigned info = GetUi16(h + 8);
- Order = (info & 0xF) + 1;
- MemInMB = ((info >> 4) & 0xFF) + 1;
- Ver = info >> 12;
-
- UInt32 nameLen = GetUi16(h + 10);
- Restor = nameLen >> 14;
- if (Restor > 2)
- return S_FALSE;
- if (Ver >= kNewHeaderVer)
- nameLen &= 0x3FFF;
- if (nameLen > (1 << 9))
- return S_FALSE;
- char *name = Name.GetBuffer(nameLen + 1);
- HRESULT res = ReadStream_FALSE(s, name, nameLen);
- name[nameLen] = 0;
- headerSize = kHeaderSize + nameLen;
- Name.ReleaseBuffer();
- return res;
-}
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public CMyUnknownImp
-{
- CItem _item;
- UInt32 _headerSize;
- UInt64 _packSize;
- bool _packSizeDefined;
- CMyComPtr<ISequentialInStream> _stream;
-
-public:
- MY_UNKNOWN_IMP2(IInArchive, IArchiveOpenSeq)
- INTERFACE_IInArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidMethod, VT_BSTR}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-static void UIntToString(AString &s, const char *prefix, unsigned value)
-{
- s += prefix;
- char temp[16];
- ::ConvertUInt32ToString((UInt32)value, temp);
- s += temp;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPath: prop = MultiByteToUnicodeString(_item.Name, CP_ACP); break;
- case kpidMTime:
- {
- FILETIME utc;
- if (NTime::DosTimeToFileTime(_item.Time, utc))
- prop = utc;
- break;
- }
- case kpidAttrib: prop = _item.Attrib; break;
- case kpidPackSize: if (_packSizeDefined) prop = _packSize; break;
- case kpidMethod:
- {
- AString s = "PPMd";
- s += (char)('A' + _item.Ver);
- UIntToString(s, ":o", _item.Order);
- UIntToString(s, ":mem", _item.MemInMB);
- s += 'm';
- if (_item.Ver >= kNewHeaderVer && _item.Restor != 0)
- UIntToString(s, ":r", _item.Restor);
- prop = s;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *)
-{
- return OpenSeq(stream);
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- COM_TRY_BEGIN
- HRESULT res;
- try
- {
- Close();
- res = _item.ReadHeader(stream, _headerSize);
- }
- catch(...) { res = S_FALSE; }
- if (res == S_OK)
- _stream = stream;
- else
- Close();
- return res;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _packSizeDefined = false;
- _stream.Release();
- return S_OK;
-}
-
-static const UInt32 kTopValue = (1 << 24);
-static const UInt32 kBot = (1 << 15);
-
-struct CRangeDecoder
-{
- IPpmd7_RangeDec s;
- UInt32 Range;
- UInt32 Code;
- UInt32 Low;
- CByteInBufWrap *Stream;
-
-public:
- bool Init()
- {
- Code = 0;
- Low = 0;
- Range = 0xFFFFFFFF;
- for (int i = 0; i < 4; i++)
- Code = (Code << 8) | Stream->ReadByte();
- return Code < 0xFFFFFFFF;
- }
-
- void Normalize()
- {
- while ((Low ^ (Low + Range)) < kTopValue ||
- Range < kBot && ((Range = (0 - Low) & (kBot - 1)), 1))
- {
- Code = (Code << 8) | Stream->ReadByte();
- Range <<= 8;
- Low <<= 8;
- }
- }
-
- CRangeDecoder();
-};
-
-
-extern "C" {
-
-static UInt32 Range_GetThreshold(void *pp, UInt32 total)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- return p->Code / (p->Range /= total);
-}
-
-static void Range_Decode(void *pp, UInt32 start, UInt32 size)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- start *= p->Range;
- p->Low += start;
- p->Code -= start;
- p->Range *= size;
- p->Normalize();
-}
-
-static UInt32 Range_DecodeBit(void *pp, UInt32 size0)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- if (p->Code / (p->Range >>= 14) < size0)
- {
- Range_Decode(p, 0, size0);
- return 0;
- }
- else
- {
- Range_Decode(p, size0, (1 << 14) - size0);
- return 1;
- }
-}
-
-}
-
-CRangeDecoder::CRangeDecoder()
-{
- s.GetThreshold = Range_GetThreshold;
- s.Decode = Range_Decode;
- s.DecodeBit = Range_DecodeBit;
-}
-
-struct CPpmdCpp
-{
- unsigned Ver;
- CRangeDecoder _rc;
- CPpmd7 _ppmd7;
- CPpmd8 _ppmd8;
-
- CPpmdCpp(unsigned version)
- {
- Ver = version;
- Ppmd7_Construct(&_ppmd7);
- Ppmd8_Construct(&_ppmd8);
- }
-
- ~CPpmdCpp()
- {
- Ppmd7_Free(&_ppmd7, &g_BigAlloc);
- Ppmd8_Free(&_ppmd8, &g_BigAlloc);
- }
-
- bool Alloc(UInt32 memInMB)
- {
- memInMB <<= 20;
- if (Ver == 7)
- return Ppmd7_Alloc(&_ppmd7, memInMB, &g_BigAlloc) != 0;
- return Ppmd8_Alloc(&_ppmd8, memInMB, &g_BigAlloc) != 0;
- }
-
- void Init(unsigned order, unsigned restor)
- {
- if (Ver == 7)
- Ppmd7_Init(&_ppmd7, order);
- else
- Ppmd8_Init(&_ppmd8, order, restor);;
- }
-
- bool InitRc(CByteInBufWrap *inStream)
- {
- if (Ver == 7)
- {
- _rc.Stream = inStream;
- return _rc.Init();
- }
- else
- {
- _ppmd8.Stream.In = &inStream->p;
- return Ppmd8_RangeDec_Init(&_ppmd8) != 0;
- }
- }
-
- bool IsFinishedOK()
- {
- if (Ver == 7)
- return Ppmd7z_RangeDec_IsFinishedOK(&_rc);
- return Ppmd8_RangeDec_IsFinishedOK(&_ppmd8);
- }
-};
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- // extractCallback->SetTotal(_packSize);
- UInt64 currentTotalPacked = 0;
- RINOK(extractCallback->SetCompleted(&currentTotalPacked));
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- CByteInBufWrap inBuf;
- if (!inBuf.Alloc(1 << 20))
- return E_OUTOFMEMORY;
- inBuf.Stream = _stream;
-
- CBuf outBuf;
- if (!outBuf.Alloc())
- return E_OUTOFMEMORY;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, true);
-
- CPpmdCpp ppmd(_item.Ver);
- if (!ppmd.Alloc(_item.MemInMB))
- return E_OUTOFMEMORY;
- Int32 opRes = NExtract::NOperationResult::kUnSupportedMethod;
- if (_item.IsSupported())
- {
- opRes = NExtract::NOperationResult::kDataError;
- ppmd.Init(_item.Order, _item.Restor);
- inBuf.Init();
- UInt64 outSize = 0;
- if (ppmd.InitRc(&inBuf) && !inBuf.Extra && inBuf.Res == S_OK)
- for (;;)
- {
- lps->InSize = _packSize = inBuf.GetProcessed();
- lps->OutSize = outSize;
- RINOK(lps->SetCur());
-
- size_t i;
- int sym = 0;
-
- if (ppmd.Ver == 7)
- {
- for (i = 0; i < kBufSize; i++)
- {
- sym = Ppmd7_DecodeSymbol(&ppmd._ppmd7, &ppmd._rc.s);
- if (inBuf.Extra || sym < 0)
- break;
- outBuf.Buf[i] = (Byte)sym;
- }
- }
- else
- {
- for (i = 0; i < kBufSize; i++)
- {
- sym = Ppmd8_DecodeSymbol(&ppmd._ppmd8);
- if (inBuf.Extra || sym < 0)
- break;
- outBuf.Buf[i] = (Byte)sym;
- }
- }
-
- outSize += i;
- _packSize = _headerSize + inBuf.GetProcessed();
- _packSizeDefined = true;
- if (realOutStream)
- {
- RINOK(WriteStream(realOutStream, outBuf.Buf, i));
- }
- if (sym < 0)
- {
- if (sym == -1 && ppmd.IsFinishedOK())
- opRes = NExtract::NOperationResult::kOK;
- break;
- }
- }
- RINOK(inBuf.Res);
- }
- realOutStream.Release();
- return extractCallback->SetOperationResult(opRes);
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Ppmd", L"pmd", 0, 0xD, { 0x8F, 0xAF, 0xAC, 0x84 }, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Ppmd)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHandler.cpp
deleted file mode 100644
index 5d072d34d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHandler.cpp
+++ /dev/null
@@ -1,869 +0,0 @@
-// RarHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/PropVariantUtils.h"
-#include "Windows/Time.h"
-
-#include "../../IPassword.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/FilterCoder.h"
-#include "../../Common/MethodId.h"
-#include "../../Common/ProgressUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "../../Crypto/Rar20Crypto.h"
-#include "../../Crypto/RarAes.h"
-
-#include "../Common/ItemNameUtils.h"
-#include "../Common/OutStreamWithCRC.h"
-
-#include "RarHandler.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-namespace NArchive {
-namespace NRar {
-
-static const wchar_t *kHostOS[] =
-{
- L"MS DOS",
- L"OS/2",
- L"Win32",
- L"Unix",
- L"Mac OS",
- L"BeOS"
-};
-
-static const int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]);
-
-static const wchar_t *kUnknownOS = L"Unknown";
-
-static const CUInt32PCharPair k_Flags[] =
-{
- { 0, "Volume" },
- { 1, "Comment" },
- { 2, "Lock" },
- { 3, "Solid" },
- { 4, "NewVolName" }, // pack_comment in old versuons
- { 5, "Authenticity" },
- { 6, "Recovery" },
- { 7, "BlockEncryption" },
- { 8, "FirstVolume" },
- { 9, "EncryptVer" }
-};
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
-
- { NULL, kpidEncrypted, VT_BOOL},
- { NULL, kpidSolid, VT_BOOL},
- { NULL, kpidCommented, VT_BOOL},
- { NULL, kpidSplitBefore, VT_BOOL},
- { NULL, kpidSplitAfter, VT_BOOL},
- { NULL, kpidCRC, VT_UI4},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidUnpackVer, VT_UI1}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidSolid, VT_BOOL},
- { NULL, kpidNumBlocks, VT_UI4},
- // { NULL, kpidEncrypted, VT_BOOL},
- { NULL, kpidIsVolume, VT_BOOL},
- { NULL, kpidNumVolumes, VT_UI4},
- { NULL, kpidPhySize, VT_UI8}
- // { NULL, kpidCommented, VT_BOOL}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-UInt64 CHandler::GetPackSize(int refIndex) const
-{
- const CRefItem &refItem = _refItems[refIndex];
- UInt64 totalPackSize = 0;
- for (int i = 0; i < refItem.NumItems; i++)
- totalPackSize += _items[refItem.ItemIndex + i].PackSize;
- return totalPackSize;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidSolid: prop = _archiveInfo.IsSolid(); break;
- case kpidCharacts: FLAGS_TO_PROP(k_Flags, _archiveInfo.Flags, prop); break;
- // case kpidEncrypted: prop = _archiveInfo.IsEncrypted(); break; // it's for encrypted names.
- case kpidIsVolume: prop = _archiveInfo.IsVolume(); break;
- case kpidNumVolumes: prop = (UInt32)_archives.Size(); break;
- case kpidOffset: if (_archiveInfo.StartPosition != 0) prop = _archiveInfo.StartPosition; break;
- // case kpidCommented: prop = _archiveInfo.IsCommented(); break;
- case kpidNumBlocks:
- {
- UInt32 numBlocks = 0;
- for (int i = 0; i < _refItems.Size(); i++)
- if (!IsSolid(i))
- numBlocks++;
- prop = (UInt32)numBlocks;
- break;
- }
- case kpidError: if (!_errorMessage.IsEmpty()) prop = _errorMessage; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _refItems.Size();
- return S_OK;
-}
-
-static bool RarTimeToFileTime(const CRarTime &rarTime, FILETIME &result)
-{
- if (!DosTimeToFileTime(rarTime.DosTime, result))
- return false;
- UInt64 value = (((UInt64)result.dwHighDateTime) << 32) + result.dwLowDateTime;
- value += (UInt64)rarTime.LowSecond * 10000000;
- value += ((UInt64)rarTime.SubTime[2] << 16) +
- ((UInt64)rarTime.SubTime[1] << 8) +
- ((UInt64)rarTime.SubTime[0]);
- result.dwLowDateTime = (DWORD)value;
- result.dwHighDateTime = DWORD(value >> 32);
- return true;
-}
-
-static void RarTimeToProp(const CRarTime &rarTime, NWindows::NCOM::CPropVariant &prop)
-{
- FILETIME localFileTime, utcFileTime;
- if (RarTimeToFileTime(rarTime, localFileTime))
- {
- if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))
- utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
- }
- else
- utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
- prop = utcFileTime;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CRefItem &refItem = _refItems[index];
- const CItemEx &item = _items[refItem.ItemIndex];
- switch(propID)
- {
- case kpidPath:
- {
- UString u;
- if (item.HasUnicodeName() && !item.UnicodeName.IsEmpty())
- u = item.UnicodeName;
- else
- u = MultiByteToUnicodeString(item.Name, CP_OEMCP);
- prop = (const wchar_t *)NItemName::WinNameToOSName(u);
- break;
- }
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.Size; break;
- case kpidPackSize: prop = GetPackSize(index); break;
- case kpidMTime: RarTimeToProp(item.MTime, prop); break;
- case kpidCTime: if (item.CTimeDefined) RarTimeToProp(item.CTime, prop); break;
- case kpidATime: if (item.ATimeDefined) RarTimeToProp(item.ATime, prop); break;
- case kpidAttrib: prop = item.GetWinAttributes(); break;
- case kpidEncrypted: prop = item.IsEncrypted(); break;
- case kpidSolid: prop = IsSolid(index); break;
- case kpidCommented: prop = item.IsCommented(); break;
- case kpidSplitBefore: prop = item.IsSplitBefore(); break;
- case kpidSplitAfter: prop = _items[refItem.ItemIndex + refItem.NumItems - 1].IsSplitAfter(); break;
- case kpidCRC:
- {
- const CItemEx &lastItem = _items[refItem.ItemIndex + refItem.NumItems - 1];
- prop = ((lastItem.IsSplitAfter()) ? item.FileCRC : lastItem.FileCRC);
- break;
- }
- case kpidUnpackVer: prop = item.UnPackVersion; break;
- case kpidMethod:
- {
- UString method;
- if (item.Method >= Byte('0') && item.Method <= Byte('5'))
- {
- method = L"m";
- wchar_t temp[32];
- ConvertUInt64ToString(item.Method - Byte('0'), temp);
- method += temp;
- if (!item.IsDir())
- {
- method += L":";
- ConvertUInt64ToString(16 + item.GetDictSize(), temp);
- method += temp;
- }
- }
- else
- {
- wchar_t temp[32];
- ConvertUInt64ToString(item.Method, temp);
- method += temp;
- }
- prop = method;
- break;
- }
- case kpidHostOS: prop = (item.HostOS < kNumHostOSes) ? (kHostOS[item.HostOS]) : kUnknownOS; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CVolumeName
-{
- bool _first;
- bool _newStyle;
- UString _unchangedPart;
- UString _changedPart;
- UString _afterPart;
-public:
- CVolumeName(): _newStyle(true) {};
-
- bool InitName(const UString &name, bool newStyle)
- {
- _first = true;
- _newStyle = newStyle;
- int dotPos = name.ReverseFind('.');
- UString basePart = name;
- if (dotPos >= 0)
- {
- UString ext = name.Mid(dotPos + 1);
- if (ext.CompareNoCase(L"rar") == 0)
- {
- _afterPart = name.Mid(dotPos);
- basePart = name.Left(dotPos);
- }
- else if (ext.CompareNoCase(L"exe") == 0)
- {
- _afterPart = L".rar";
- basePart = name.Left(dotPos);
- }
- else if (!_newStyle)
- {
- if (ext.CompareNoCase(L"000") == 0 ||
- ext.CompareNoCase(L"001") == 0 ||
- ext.CompareNoCase(L"r00") == 0 ||
- ext.CompareNoCase(L"r01") == 0)
- {
- _afterPart.Empty();
- _first = false;
- _changedPart = ext;
- _unchangedPart = name.Left(dotPos + 1);
- return true;
- }
- }
- }
-
- if (!_newStyle)
- {
- _afterPart.Empty();
- _unchangedPart = basePart + UString(L".");
- _changedPart = L"r00";
- return true;
- }
-
- int numLetters = 1;
- if (basePart.Right(numLetters) == L"1" || basePart.Right(numLetters) == L"0")
- {
- while (numLetters < basePart.Length())
- {
- if (basePart[basePart.Length() - numLetters - 1] != '0')
- break;
- numLetters++;
- }
- }
- else
- return false;
- _unchangedPart = basePart.Left(basePart.Length() - numLetters);
- _changedPart = basePart.Right(numLetters);
- return true;
- }
-
- UString GetNextName()
- {
- UString newName;
- if (_newStyle || !_first)
- {
- int i;
- int numLetters = _changedPart.Length();
- for (i = numLetters - 1; i >= 0; i--)
- {
- wchar_t c = _changedPart[i];
- if (c == L'9')
- {
- c = L'0';
- newName = c + newName;
- if (i == 0)
- newName = UString(L'1') + newName;
- continue;
- }
- c++;
- newName = UString(c) + newName;
- i--;
- for (; i >= 0; i--)
- newName = _changedPart[i] + newName;
- break;
- }
- _changedPart = newName;
- }
- _first = false;
- return _unchangedPart + _changedPart + _afterPart;
- }
-};
-
-HRESULT CHandler::Open2(IInStream *stream,
- const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *openCallback)
-{
- {
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
- CMyComPtr<ICryptoGetTextPassword> getTextPassword;
- CMyComPtr<IArchiveOpenCallback> openArchiveCallbackWrap = openCallback;
-
- CVolumeName seqName;
-
- UInt64 totalBytes = 0;
- UInt64 curBytes = 0;
-
- if (openCallback)
- {
- openArchiveCallbackWrap.QueryInterface(IID_IArchiveOpenVolumeCallback, &openVolumeCallback);
- openArchiveCallbackWrap.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword);
- }
-
- for (;;)
- {
- CMyComPtr<IInStream> inStream;
- if (!_archives.IsEmpty())
- {
- if (!openVolumeCallback)
- break;
-
- if (_archives.Size() == 1)
- {
- if (!_archiveInfo.IsVolume())
- break;
- UString baseName;
- {
- NCOM::CPropVariant prop;
- RINOK(openVolumeCallback->GetProperty(kpidName, &prop));
- if (prop.vt != VT_BSTR)
- break;
- baseName = prop.bstrVal;
- }
- seqName.InitName(baseName, _archiveInfo.HaveNewVolumeName());
- }
-
- UString fullName = seqName.GetNextName();
- HRESULT result = openVolumeCallback->GetStream(fullName, &inStream);
- if (result == S_FALSE)
- break;
- if (result != S_OK)
- return result;
- if (!stream)
- break;
- }
- else
- inStream = stream;
-
- UInt64 endPos = 0;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- if (openCallback)
- {
- totalBytes += endPos;
- RINOK(openCallback->SetTotal(NULL, &totalBytes));
- }
-
- NArchive::NRar::CInArchive archive;
- RINOK(archive.Open(inStream, maxCheckStartPosition));
-
- if (_archives.IsEmpty())
- archive.GetArchiveInfo(_archiveInfo);
-
- CItemEx item;
- for (;;)
- {
- if (archive.m_Position > endPos)
- {
- AddErrorMessage("Unexpected end of archive");
- break;
- }
- bool decryptionError;
- AString errorMessageLoc;
- HRESULT result = archive.GetNextItem(item, getTextPassword, decryptionError, errorMessageLoc);
- if (errorMessageLoc)
- AddErrorMessage(errorMessageLoc);
- if (result == S_FALSE)
- {
- if (decryptionError && _items.IsEmpty())
- return S_FALSE;
- break;
- }
- RINOK(result);
- if (item.IgnoreItem())
- continue;
-
- bool needAdd = true;
- if (item.IsSplitBefore())
- {
- if (!_refItems.IsEmpty())
- {
- CRefItem &refItem = _refItems.Back();
- refItem.NumItems++;
- needAdd = false;
- }
- }
- if (needAdd)
- {
- CRefItem refItem;
- refItem.ItemIndex = _items.Size();
- refItem.NumItems = 1;
- refItem.VolumeIndex = _archives.Size();
- _refItems.Add(refItem);
- }
- _items.Add(item);
- if (openCallback && _items.Size() % 100 == 0)
- {
- UInt64 numFiles = _items.Size();
- UInt64 numBytes = curBytes + item.Position;
- RINOK(openCallback->SetCompleted(&numFiles, &numBytes));
- }
- }
- curBytes += endPos;
- _archives.Add(archive);
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *openCallback)
-{
- COM_TRY_BEGIN
- Close();
- try
- {
- HRESULT res = Open2(stream, maxCheckStartPosition, openCallback);
- if (res != S_OK)
- Close();
- return res;
- }
- catch(const CInArchiveException &) { Close(); return S_FALSE; }
- catch(...) { Close(); throw; }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- COM_TRY_BEGIN
- _errorMessage.Empty();
- _refItems.Clear();
- _items.Clear();
- _archives.Clear();
- return S_OK;
- COM_TRY_END
-}
-
-struct CMethodItem
-{
- Byte RarUnPackVersion;
- CMyComPtr<ICompressCoder> Coder;
-};
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- CMyComPtr<ICryptoGetTextPassword> getTextPassword;
- UInt64 censoredTotalUnPacked = 0,
- // censoredTotalPacked = 0,
- importantTotalUnPacked = 0;
- // importantTotalPacked = 0;
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _refItems.Size();
- if (numItems == 0)
- return S_OK;
- int lastIndex = 0;
- CRecordVector<int> importantIndexes;
- CRecordVector<bool> extractStatuses;
-
- for (UInt32 t = 0; t < numItems; t++)
- {
- int index = allFilesMode ? t : indices[t];
- const CRefItem &refItem = _refItems[index];
- const CItemEx &item = _items[refItem.ItemIndex];
- censoredTotalUnPacked += item.Size;
- // censoredTotalPacked += item.PackSize;
- int j;
- for (j = lastIndex; j <= index; j++)
- // if (!_items[_refItems[j].ItemIndex].IsSolid())
- if (!IsSolid(j))
- lastIndex = j;
- for (j = lastIndex; j <= index; j++)
- {
- const CRefItem &refItem = _refItems[j];
- const CItemEx &item = _items[refItem.ItemIndex];
-
- // const CItemEx &item = _items[j];
-
- importantTotalUnPacked += item.Size;
- // importantTotalPacked += item.PackSize;
- importantIndexes.Add(j);
- extractStatuses.Add(j == index);
- }
- lastIndex = index + 1;
- }
-
- RINOK(extractCallback->SetTotal(importantTotalUnPacked));
- UInt64 currentImportantTotalUnPacked = 0;
- UInt64 currentImportantTotalPacked = 0;
- UInt64 currentUnPackSize, currentPackSize;
-
- CObjectVector<CMethodItem> methodItems;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CFilterCoder *filterStreamSpec = new CFilterCoder;
- CMyComPtr<ISequentialInStream> filterStream = filterStreamSpec;
-
- NCrypto::NRar20::CDecoder *rar20CryptoDecoderSpec = NULL;
- CMyComPtr<ICompressFilter> rar20CryptoDecoder;
- NCrypto::NRar29::CDecoder *rar29CryptoDecoderSpec = NULL;
- CMyComPtr<ICompressFilter> rar29CryptoDecoder;
-
- CFolderInStream *folderInStreamSpec = NULL;
- CMyComPtr<ISequentialInStream> folderInStream;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- bool solidStart = true;
- for (int i = 0; i < importantIndexes.Size(); i++,
- currentImportantTotalUnPacked += currentUnPackSize,
- currentImportantTotalPacked += currentPackSize)
- {
- lps->InSize = currentImportantTotalPacked;
- lps->OutSize = currentImportantTotalUnPacked;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
-
- Int32 askMode;
- if (extractStatuses[i])
- askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- else
- askMode = NExtract::NAskMode::kSkip;
-
- UInt32 index = importantIndexes[i];
-
- const CRefItem &refItem = _refItems[index];
- const CItemEx &item = _items[refItem.ItemIndex];
-
- currentUnPackSize = item.Size;
-
- currentPackSize = GetPackSize(index);
-
- if (item.IgnoreItem())
- continue;
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (!IsSolid(index))
- solidStart = true;
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- bool mustBeProcessedAnywhere = false;
- if (i < importantIndexes.Size() - 1)
- {
- // const CRefItem &nextRefItem = _refItems[importantIndexes[i + 1]];
- // const CItemEx &nextItemInfo = _items[nextRefItem.ItemIndex];
- // mustBeProcessedAnywhere = nextItemInfo.IsSolid();
- mustBeProcessedAnywhere = IsSolid(importantIndexes[i + 1]);
- }
-
- if (!mustBeProcessedAnywhere && !testMode && !realOutStream)
- continue;
-
- if (!realOutStream && !testMode)
- askMode = NExtract::NAskMode::kSkip;
-
- RINOK(extractCallback->PrepareOperation(askMode));
-
- COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
- realOutStream.Release();
-
- /*
- for (int partIndex = 0; partIndex < 1; partIndex++)
- {
- CMyComPtr<ISequentialInStream> inStream;
-
- // item redefinition
- const CItemEx &item = _items[refItem.ItemIndex + partIndex];
-
- NArchive::NRar::CInArchive &archive = _archives[refItem.VolumeIndex + partIndex];
-
- inStream.Attach(archive.CreateLimitedStream(item.GetDataPosition(),
- item.PackSize));
- */
- if (!folderInStream)
- {
- folderInStreamSpec = new CFolderInStream;
- folderInStream = folderInStreamSpec;
- }
-
- folderInStreamSpec->Init(&_archives, &_items, refItem);
-
- UInt64 packSize = currentPackSize;
-
- // packedPos += item.PackSize;
- // unpackedPos += 0;
-
- CMyComPtr<ISequentialInStream> inStream;
- if (item.IsEncrypted())
- {
- CMyComPtr<ICryptoSetPassword> cryptoSetPassword;
- if (item.UnPackVersion >= 29)
- {
- if (!rar29CryptoDecoder)
- {
- rar29CryptoDecoderSpec = new NCrypto::NRar29::CDecoder;
- rar29CryptoDecoder = rar29CryptoDecoderSpec;
- // RINOK(rar29CryptoDecoder.CoCreateInstance(CLSID_CCryptoRar29Decoder));
- }
- rar29CryptoDecoderSpec->SetRar350Mode(item.UnPackVersion < 36);
- CMyComPtr<ICompressSetDecoderProperties2> cryptoProperties;
- RINOK(rar29CryptoDecoder.QueryInterface(IID_ICompressSetDecoderProperties2,
- &cryptoProperties));
- RINOK(cryptoProperties->SetDecoderProperties2(item.Salt, item.HasSalt() ? sizeof(item.Salt) : 0));
- filterStreamSpec->Filter = rar29CryptoDecoder;
- }
- else if (item.UnPackVersion >= 20)
- {
- if (!rar20CryptoDecoder)
- {
- rar20CryptoDecoderSpec = new NCrypto::NRar20::CDecoder;
- rar20CryptoDecoder = rar20CryptoDecoderSpec;
- // RINOK(rar20CryptoDecoder.CoCreateInstance(CLSID_CCryptoRar20Decoder));
- }
- filterStreamSpec->Filter = rar20CryptoDecoder;
- }
- else
- {
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
- RINOK(filterStreamSpec->Filter.QueryInterface(IID_ICryptoSetPassword,
- &cryptoSetPassword));
-
- if (!getTextPassword)
- extractCallback->QueryInterface(IID_ICryptoGetTextPassword, (void **)&getTextPassword);
- if (getTextPassword)
- {
- CMyComBSTR password;
- RINOK(getTextPassword->CryptoGetTextPassword(&password));
- if (item.UnPackVersion >= 29)
- {
- CByteBuffer buffer;
- UString unicodePassword(password);
- const UInt32 sizeInBytes = unicodePassword.Length() * 2;
- buffer.SetCapacity(sizeInBytes);
- for (int i = 0; i < unicodePassword.Length(); i++)
- {
- wchar_t c = unicodePassword[i];
- ((Byte *)buffer)[i * 2] = (Byte)c;
- ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);
- }
- RINOK(cryptoSetPassword->CryptoSetPassword(
- (const Byte *)buffer, sizeInBytes));
- }
- else
- {
- AString oemPassword = UnicodeStringToMultiByte(
- (const wchar_t *)password, CP_OEMCP);
- RINOK(cryptoSetPassword->CryptoSetPassword(
- (const Byte *)(const char *)oemPassword, oemPassword.Length()));
- }
- }
- else
- {
- RINOK(cryptoSetPassword->CryptoSetPassword(0, 0));
- }
- filterStreamSpec->SetInStream(folderInStream);
- inStream = filterStream;
- }
- else
- {
- inStream = folderInStream;
- }
- CMyComPtr<ICompressCoder> commonCoder;
- switch(item.Method)
- {
- case '0':
- {
- commonCoder = copyCoder;
- break;
- }
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- {
- /*
- if (item.UnPackVersion >= 29)
- {
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
- */
- int m;
- for (m = 0; m < methodItems.Size(); m++)
- if (methodItems[m].RarUnPackVersion == item.UnPackVersion)
- break;
- if (m == methodItems.Size())
- {
- CMethodItem mi;
- mi.RarUnPackVersion = item.UnPackVersion;
-
- mi.Coder.Release();
- if (item.UnPackVersion <= 30)
- {
- UInt32 methodID = 0x040300;
- if (item.UnPackVersion < 20)
- methodID += 1;
- else if (item.UnPackVersion < 29)
- methodID += 2;
- else
- methodID += 3;
- RINOK(CreateCoder(EXTERNAL_CODECS_VARS methodID, mi.Coder, false));
- }
-
- if (mi.Coder == 0)
- {
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
-
- m = methodItems.Add(mi);
- }
- CMyComPtr<ICompressCoder> decoder = methodItems[m].Coder;
-
- CMyComPtr<ICompressSetDecoderProperties2> compressSetDecoderProperties;
- RINOK(decoder.QueryInterface(IID_ICompressSetDecoderProperties2,
- &compressSetDecoderProperties));
-
- Byte isSolid = (Byte)((IsSolid(index) || item.IsSplitBefore()) ? 1: 0);
- if (solidStart)
- {
- isSolid = false;
- solidStart = false;
- }
-
-
- RINOK(compressSetDecoderProperties->SetDecoderProperties2(&isSolid, 1));
-
- commonCoder = decoder;
- break;
- }
- default:
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
- HRESULT result = commonCoder->Code(inStream, outStream, &packSize, &item.Size, progress);
- if (item.IsEncrypted())
- filterStreamSpec->ReleaseInStream();
- if (result == S_FALSE)
- {
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kDataError));
- continue;
- }
- if (result != S_OK)
- return result;
-
- /*
- if (refItem.NumItems == 1 &&
- !item.IsSplitBefore() && !item.IsSplitAfter())
- */
- {
- const CItemEx &lastItem = _items[refItem.ItemIndex + refItem.NumItems - 1];
- bool crcOK = outStreamSpec->GetCRC() == lastItem.FileCRC;
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(crcOK ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kCRCError));
- }
- /*
- else
- {
- bool crcOK = true;
- for (int partIndex = 0; partIndex < refItem.NumItems; partIndex++)
- {
- const CItemEx &item = _items[refItem.ItemIndex + partIndex];
- if (item.FileCRC != folderInStreamSpec->CRCs[partIndex])
- {
- crcOK = false;
- break;
- }
- }
- RINOK(extractCallback->SetOperationResult(crcOK ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kCRCError));
- }
- */
- }
- return S_OK;
- COM_TRY_END
-}
-
-IMPL_ISetCompressCodecsInfo
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHandler.h b/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHandler.h
deleted file mode 100644
index 792668273..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHandler.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Rar/Handler.h
-
-#ifndef __RAR_HANDLER_H
-#define __RAR_HANDLER_H
-
-#include "../IArchive.h"
-
-#include "../../Common/CreateCoder.h"
-
-#include "RarIn.h"
-#include "RarVolumeInStream.h"
-
-namespace NArchive {
-namespace NRar {
-
-class CHandler:
- public IInArchive,
- PUBLIC_ISetCompressCodecsInfo
- public CMyUnknownImp
-{
- CRecordVector<CRefItem> _refItems;
- CObjectVector<CItemEx> _items;
- CObjectVector<CInArchive> _archives;
- NArchive::NRar::CInArchiveInfo _archiveInfo;
- AString _errorMessage;
-
- DECL_EXTERNAL_CODECS_VARS
-
- UInt64 GetPackSize(int refIndex) const;
-
- bool IsSolid(int refIndex)
- {
- const CItemEx &item = _items[_refItems[refIndex].ItemIndex];
- if (item.UnPackVersion < 20)
- {
- if (_archiveInfo.IsSolid())
- return (refIndex > 0);
- return false;
- }
- return item.IsSolid();
- }
- void AddErrorMessage(const AString &s)
- {
- if (!_errorMessage.IsEmpty())
- _errorMessage += '\n';
- _errorMessage += s;
- }
-
- HRESULT Open2(IInStream *stream,
- const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *openCallback);
-
-public:
- MY_QUERYINTERFACE_BEGIN2(IInArchive)
- QUERY_ENTRY_ISetCompressCodecsInfo
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- INTERFACE_IInArchive(;)
-
- DECL_ISetCompressCodecsInfo
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHeader.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHeader.cpp
deleted file mode 100644
index 94481e025..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHeader.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// Archive/Rar/Headers.cpp
-
-#include "StdAfx.h"
-
-#include "RarHeader.h"
-
-namespace NArchive{
-namespace NRar{
-namespace NHeader{
-
-Byte kMarker[kMarkerSize] = {0x52 + 1, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00};
-
-class CMarkerInitializer
-{
-public:
- CMarkerInitializer() { kMarker[0]--; };
-};
-
-static CMarkerInitializer markerInitializer;
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHeader.h b/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHeader.h
deleted file mode 100644
index 5c21a2ac0..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarHeader.h
+++ /dev/null
@@ -1,205 +0,0 @@
-// Archive/RarHeader.h
-
-#ifndef __ARCHIVE_RAR_HEADER_H
-#define __ARCHIVE_RAR_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NRar {
-namespace NHeader {
-
-const int kMarkerSize = 7;
-extern Byte kMarker[kMarkerSize];
-
-const int kArchiveSolid = 0x1;
-
-namespace NBlockType
-{
- enum EBlockType
- {
- kMarker = 0x72,
- kArchiveHeader,
- kFileHeader,
- kCommentHeader,
- kOldAuthenticity,
- kOldSubBlock,
- kRecoveryRecord,
- kAuthenticity,
- kSubBlock,
- kEndOfArchive
- };
-}
-
-namespace NArchive
-{
- const UInt16 kVolume = 1;
- const UInt16 kComment = 2;
- const UInt16 kLock = 4;
- const UInt16 kSolid = 8;
- const UInt16 kNewVolName = 0x10; // ('volname.partN.rar')
- const UInt16 kAuthenticity = 0x20;
- const UInt16 kRecovery = 0x40;
- const UInt16 kBlockEncryption = 0x80;
- const UInt16 kFirstVolume = 0x100; // (set only by RAR 3.0 and later)
- const UInt16 kEncryptVer = 0x200; // RAR 3.6 there is EncryptVer Byte in End of MainHeader
-
- const int kHeaderSizeMin = 7;
-
- const int kArchiveHeaderSize = 13;
-
- const int kBlockHeadersAreEncrypted = 0x80;
-
-}
-
-namespace NFile
-{
- const int kSplitBefore = 1 << 0;
- const int kSplitAfter = 1 << 1;
- const int kEncrypted = 1 << 2;
- const int kComment = 1 << 3;
- const int kSolid = 1 << 4;
-
- const int kDictBitStart = 5;
- const int kNumDictBits = 3;
- const int kDictMask = (1 << kNumDictBits) - 1;
- const int kDictDirectoryValue = 0x7;
-
- const int kSize64Bits = 1 << 8;
- const int kUnicodeName = 1 << 9;
- const int kSalt = 1 << 10;
- const int kOldVersion = 1 << 11;
- const int kExtTime = 1 << 12;
- // const int kExtFlags = 1 << 13;
- // const int kSkipIfUnknown = 1 << 14;
-
- const int kLongBlock = 1 << 15;
-
- /*
- struct CBlock
- {
- // UInt16 HeadCRC;
- // Byte Type;
- // UInt16 Flags;
- // UInt16 HeadSize;
- UInt32 PackSize;
- UInt32 UnPackSize;
- Byte HostOS;
- UInt32 FileCRC;
- UInt32 Time;
- Byte UnPackVersion;
- Byte Method;
- UInt16 NameSize;
- UInt32 Attributes;
- };
- */
-
- /*
- struct CBlock32
- {
- UInt16 HeadCRC;
- Byte Type;
- UInt16 Flags;
- UInt16 HeadSize;
- UInt32 PackSize;
- UInt32 UnPackSize;
- Byte HostOS;
- UInt32 FileCRC;
- UInt32 Time;
- Byte UnPackVersion;
- Byte Method;
- UInt16 NameSize;
- UInt32 Attributes;
- UInt16 GetRealCRC(const void *aName, UInt32 aNameSize,
- bool anExtraDataDefined = false, Byte *anExtraData = 0) const;
- };
- struct CBlock64
- {
- UInt16 HeadCRC;
- Byte Type;
- UInt16 Flags;
- UInt16 HeadSize;
- UInt32 PackSizeLow;
- UInt32 UnPackSizeLow;
- Byte HostOS;
- UInt32 FileCRC;
- UInt32 Time;
- Byte UnPackVersion;
- Byte Method;
- UInt16 NameSize;
- UInt32 Attributes;
- UInt32 PackSizeHigh;
- UInt32 UnPackSizeHigh;
- UInt16 GetRealCRC(const void *aName, UInt32 aNameSize) const;
- };
- */
-
- const int kLabelFileAttribute = 0x08;
- const int kWinFileDirectoryAttributeMask = 0x10;
-
- enum CHostOS
- {
- kHostMSDOS = 0,
- kHostOS2 = 1,
- kHostWin32 = 2,
- kHostUnix = 3,
- kHostMacOS = 4,
- kHostBeOS = 5
- };
-}
-
-namespace NBlock
-{
- const UInt16 kLongBlock = 1 << 15;
- struct CBlock
- {
- UInt16 CRC;
- Byte Type;
- UInt16 Flags;
- UInt16 HeadSize;
- // UInt32 DataSize;
- };
-}
-
-/*
-struct CSubBlock
-{
- UInt16 HeadCRC;
- Byte HeadType;
- UInt16 Flags;
- UInt16 HeadSize;
- UInt32 DataSize;
- UInt16 SubType;
- Byte Level; // Reserved : Must be 0
-};
-
-struct CCommentBlock
-{
- UInt16 HeadCRC;
- Byte HeadType;
- UInt16 Flags;
- UInt16 HeadSize;
- UInt16 UnpSize;
- Byte UnpVer;
- Byte Method;
- UInt16 CommCRC;
-};
-
-
-struct CProtectHeader
-{
- UInt16 HeadCRC;
- Byte HeadType;
- UInt16 Flags;
- UInt16 HeadSize;
- UInt32 DataSize;
- Byte Version;
- UInt16 RecSectors;
- UInt32 TotalBlocks;
- Byte Mark[8];
-};
-*/
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarIn.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarIn.cpp
deleted file mode 100644
index e4c23752c..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarIn.cpp
+++ /dev/null
@@ -1,478 +0,0 @@
-// Archive/RarIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/7zCrc.h"
-#include "../../../../C/CpuArch.h"
-
-#include "Common/StringConvert.h"
-#include "Common/UTFConvert.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../Common/FindSignature.h"
-
-#include "RarIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-namespace NArchive {
-namespace NRar {
-
-static const char *k_UnexpectedEnd = "Unexpected end of archive";
-static const char *k_DecryptionError = "Decryption Error";
-
-void CInArchive::ThrowExceptionWithCode(
- CInArchiveException::CCauseType cause)
-{
- throw CInArchiveException(cause);
-}
-
-HRESULT CInArchive::Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit)
-{
- try
- {
- Close();
- HRESULT res = Open2(inStream, searchHeaderSizeLimit);
- if (res == S_OK)
- return res;
- Close();
- return res;
- }
- catch(...) { Close(); throw; }
-}
-
-void CInArchive::Close()
-{
- m_Stream.Release();
-}
-
-HRESULT CInArchive::ReadBytesSpec(void *data, size_t *resSize)
-{
- if (m_CryptoMode)
- {
- size_t size = *resSize;
- *resSize = 0;
- const Byte *bufData = m_DecryptedDataAligned;
- UInt32 bufSize = m_DecryptedDataSize;
- size_t i;
- for (i = 0; i < size && m_CryptoPos < bufSize; i++)
- ((Byte *)data)[i] = bufData[m_CryptoPos++];
- *resSize = i;
- return S_OK;
- }
- return ReadStream(m_Stream, data, resSize);
-}
-
-bool CInArchive::ReadBytesAndTestSize(void *data, UInt32 size)
-{
- size_t processed = size;
- if (ReadBytesSpec(data, &processed) != S_OK)
- return false;
- return processed == size;
-}
-
-HRESULT CInArchive::Open2(IInStream *stream, const UInt64 *searchHeaderSizeLimit)
-{
- m_CryptoMode = false;
- RINOK(stream->Seek(0, STREAM_SEEK_SET, &m_StreamStartPosition));
- m_Position = m_StreamStartPosition;
-
- UInt64 arcStartPos;
- RINOK(FindSignatureInStream(stream, NHeader::kMarker, NHeader::kMarkerSize,
- searchHeaderSizeLimit, arcStartPos));
- m_Position = arcStartPos + NHeader::kMarkerSize;
- RINOK(stream->Seek(m_Position, STREAM_SEEK_SET, NULL));
- Byte buf[NHeader::NArchive::kArchiveHeaderSize + 1];
-
- RINOK(ReadStream_FALSE(stream, buf, NHeader::NArchive::kArchiveHeaderSize));
- AddToSeekValue(NHeader::NArchive::kArchiveHeaderSize);
-
-
- UInt32 blockSize = Get16(buf + 5);
-
- _header.EncryptVersion = 0;
- _header.Flags = Get16(buf + 3);
-
- UInt32 headerSize = NHeader::NArchive::kArchiveHeaderSize;
- if (_header.IsThereEncryptVer())
- {
- if (blockSize <= headerSize)
- return S_FALSE;
- RINOK(ReadStream_FALSE(stream, buf + NHeader::NArchive::kArchiveHeaderSize, 1));
- AddToSeekValue(1);
- _header.EncryptVersion = buf[NHeader::NArchive::kArchiveHeaderSize];
- headerSize += 1;
- }
- if (blockSize < headerSize ||
- buf[2] != NHeader::NBlockType::kArchiveHeader ||
- (UInt32)Get16(buf) != (CrcCalc(buf + 2, headerSize - 2) & 0xFFFF))
- return S_FALSE;
-
- size_t commentSize = blockSize - headerSize;
- _comment.SetCapacity(commentSize);
- RINOK(ReadStream_FALSE(stream, _comment, commentSize));
- AddToSeekValue(commentSize);
- m_Stream = stream;
- _header.StartPosition = arcStartPos;
- return S_OK;
-}
-
-void CInArchive::GetArchiveInfo(CInArchiveInfo &archiveInfo) const
-{
- archiveInfo = _header;
-}
-
-static void DecodeUnicodeFileName(const char *name, const Byte *encName,
- int encSize, wchar_t *unicodeName, int maxDecSize)
-{
- int encPos = 0;
- int decPos = 0;
- int flagBits = 0;
- Byte flags = 0;
- Byte highByte = encName[encPos++];
- while (encPos < encSize && decPos < maxDecSize)
- {
- if (flagBits == 0)
- {
- flags = encName[encPos++];
- flagBits = 8;
- }
- switch(flags >> 6)
- {
- case 0:
- unicodeName[decPos++] = encName[encPos++];
- break;
- case 1:
- unicodeName[decPos++] = (wchar_t)(encName[encPos++] + (highByte << 8));
- break;
- case 2:
- unicodeName[decPos++] = (wchar_t)(encName[encPos] + (encName[encPos + 1] << 8));
- encPos += 2;
- break;
- case 3:
- {
- int length = encName[encPos++];
- if (length & 0x80)
- {
- Byte correction = encName[encPos++];
- for (length = (length & 0x7f) + 2;
- length > 0 && decPos < maxDecSize; length--, decPos++)
- unicodeName[decPos] = (wchar_t)(((name[decPos] + correction) & 0xff) + (highByte << 8));
- }
- else
- for (length += 2; length > 0 && decPos < maxDecSize; length--, decPos++)
- unicodeName[decPos] = name[decPos];
- }
- break;
- }
- flags <<= 2;
- flagBits -= 2;
- }
- unicodeName[decPos < maxDecSize ? decPos : maxDecSize - 1] = 0;
-}
-
-void CInArchive::ReadName(CItemEx &item, int nameSize)
-{
- item.UnicodeName.Empty();
- if (nameSize > 0)
- {
- m_NameBuffer.EnsureCapacity(nameSize + 1);
- char *buffer = (char *)m_NameBuffer;
-
- for (int i = 0; i < nameSize; i++)
- buffer[i] = ReadByte();
-
- int mainLen;
- for (mainLen = 0; mainLen < nameSize; mainLen++)
- if (buffer[mainLen] == '\0')
- break;
- buffer[mainLen] = '\0';
- item.Name = buffer;
-
- if(item.HasUnicodeName())
- {
- if(mainLen < nameSize)
- {
- int unicodeNameSizeMax = MyMin(nameSize, (0x400));
- _unicodeNameBuffer.EnsureCapacity(unicodeNameSizeMax + 1);
- DecodeUnicodeFileName(buffer, (const Byte *)buffer + mainLen + 1,
- nameSize - (mainLen + 1), _unicodeNameBuffer, unicodeNameSizeMax);
- item.UnicodeName = _unicodeNameBuffer;
- }
- else if (!ConvertUTF8ToUnicode(item.Name, item.UnicodeName))
- item.UnicodeName.Empty();
- }
- }
- else
- item.Name.Empty();
-}
-
-Byte CInArchive::ReadByte()
-{
- if (m_CurPos >= m_PosLimit)
- throw CInArchiveException(CInArchiveException::kIncorrectArchive);
- return m_CurData[m_CurPos++];
-}
-
-UInt16 CInArchive::ReadUInt16()
-{
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- {
- Byte b = ReadByte();
- value |= (UInt16(b) << (8 * i));
- }
- return value;
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- {
- Byte b = ReadByte();
- value |= (UInt32(b) << (8 * i));
- }
- return value;
-}
-
-void CInArchive::ReadTime(Byte mask, CRarTime &rarTime)
-{
- rarTime.LowSecond = (Byte)(((mask & 4) != 0) ? 1 : 0);
- int numDigits = (mask & 3);
- rarTime.SubTime[0] = rarTime.SubTime[1] = rarTime.SubTime[2] = 0;
- for (int i = 0; i < numDigits; i++)
- rarTime.SubTime[3 - numDigits + i] = ReadByte();
-}
-
-void CInArchive::ReadHeaderReal(CItemEx &item)
-{
- item.Flags = m_BlockHeader.Flags;
- item.PackSize = ReadUInt32();
- item.Size = ReadUInt32();
- item.HostOS = ReadByte();
- item.FileCRC = ReadUInt32();
- item.MTime.DosTime = ReadUInt32();
- item.UnPackVersion = ReadByte();
- item.Method = ReadByte();
- int nameSize = ReadUInt16();
- item.Attrib = ReadUInt32();
-
- item.MTime.LowSecond = 0;
- item.MTime.SubTime[0] =
- item.MTime.SubTime[1] =
- item.MTime.SubTime[2] = 0;
-
- if((item.Flags & NHeader::NFile::kSize64Bits) != 0)
- {
- item.PackSize |= ((UInt64)ReadUInt32() << 32);
- item.Size |= ((UInt64)ReadUInt32() << 32);
- }
-
- ReadName(item, nameSize);
-
- if (item.HasSalt())
- for (int i = 0; i < sizeof(item.Salt); i++)
- item.Salt[i] = ReadByte();
-
- // some rar archives have HasExtTime flag without field.
- if (m_CurPos < m_PosLimit && item.HasExtTime())
- {
- Byte accessMask = (Byte)(ReadByte() >> 4);
- Byte b = ReadByte();
- Byte modifMask = (Byte)(b >> 4);
- Byte createMask = (Byte)(b & 0xF);
- if ((modifMask & 8) != 0)
- ReadTime(modifMask, item.MTime);
- item.CTimeDefined = ((createMask & 8) != 0);
- if (item.CTimeDefined)
- {
- item.CTime.DosTime = ReadUInt32();
- ReadTime(createMask, item.CTime);
- }
- item.ATimeDefined = ((accessMask & 8) != 0);
- if (item.ATimeDefined)
- {
- item.ATime.DosTime = ReadUInt32();
- ReadTime(accessMask, item.ATime);
- }
- }
-
- UInt16 fileHeaderWithNameSize = (UInt16)m_CurPos;
-
- item.Position = m_Position;
- item.MainPartSize = fileHeaderWithNameSize;
- item.CommentSize = (UInt16)(m_BlockHeader.HeadSize - fileHeaderWithNameSize);
-
- if (m_CryptoMode)
- item.AlignSize = (UInt16)((16 - ((m_BlockHeader.HeadSize) & 0xF)) & 0xF);
- else
- item.AlignSize = 0;
- AddToSeekValue(m_BlockHeader.HeadSize);
-}
-
-void CInArchive::AddToSeekValue(UInt64 addValue)
-{
- m_Position += addValue;
-}
-
-HRESULT CInArchive::GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword, bool &decryptionError, AString &errorMessage)
-{
- decryptionError = false;
- for (;;)
- {
- SeekInArchive(m_Position);
- if (!m_CryptoMode && (_header.Flags &
- NHeader::NArchive::kBlockHeadersAreEncrypted) != 0)
- {
- m_CryptoMode = false;
- if (getTextPassword == 0)
- return S_FALSE;
- if (!m_RarAES)
- {
- m_RarAESSpec = new NCrypto::NRar29::CDecoder;
- m_RarAES = m_RarAESSpec;
- }
- m_RarAESSpec->SetRar350Mode(_header.IsEncryptOld());
-
- // Salt
- const UInt32 kSaltSize = 8;
- Byte salt[kSaltSize];
- if(!ReadBytesAndTestSize(salt, kSaltSize))
- return S_FALSE;
- m_Position += kSaltSize;
- RINOK(m_RarAESSpec->SetDecoderProperties2(salt, kSaltSize))
- // Password
- CMyComBSTR password;
- RINOK(getTextPassword->CryptoGetTextPassword(&password))
- UString unicodePassword(password);
-
- CByteBuffer buffer;
- const UInt32 sizeInBytes = unicodePassword.Length() * 2;
- buffer.SetCapacity(sizeInBytes);
- for (int i = 0; i < unicodePassword.Length(); i++)
- {
- wchar_t c = unicodePassword[i];
- ((Byte *)buffer)[i * 2] = (Byte)c;
- ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);
- }
-
- RINOK(m_RarAESSpec->CryptoSetPassword((const Byte *)buffer, sizeInBytes));
-
- const UInt32 kDecryptedBufferSize = (1 << 12);
- if (m_DecryptedData.GetCapacity() == 0)
- {
- const UInt32 kAlign = 16;
- m_DecryptedData.SetCapacity(kDecryptedBufferSize + kAlign);
- m_DecryptedDataAligned = (Byte *)((ptrdiff_t)((Byte *)m_DecryptedData + kAlign - 1) & ~(ptrdiff_t)(kAlign - 1));
- }
- RINOK(m_RarAES->Init());
- size_t decryptedDataSizeT = kDecryptedBufferSize;
- RINOK(ReadStream(m_Stream, m_DecryptedDataAligned, &decryptedDataSizeT));
- m_DecryptedDataSize = (UInt32)decryptedDataSizeT;
- m_DecryptedDataSize = m_RarAES->Filter(m_DecryptedDataAligned, m_DecryptedDataSize);
-
- m_CryptoMode = true;
- m_CryptoPos = 0;
- }
-
- m_FileHeaderData.EnsureCapacity(7);
- size_t processed = 7;
- RINOK(ReadBytesSpec((Byte *)m_FileHeaderData, &processed));
- if (processed != 7)
- {
- if (processed != 0)
- errorMessage = k_UnexpectedEnd;
- return S_FALSE;
- }
-
- m_CurData = (Byte *)m_FileHeaderData;
- m_CurPos = 0;
- m_PosLimit = 7;
- m_BlockHeader.CRC = ReadUInt16();
- m_BlockHeader.Type = ReadByte();
- m_BlockHeader.Flags = ReadUInt16();
- m_BlockHeader.HeadSize = ReadUInt16();
-
- if (m_BlockHeader.HeadSize < 7)
- ThrowExceptionWithCode(CInArchiveException::kIncorrectArchive);
-
- if (m_BlockHeader.Type == NHeader::NBlockType::kEndOfArchive)
- return S_FALSE;
-
- if (m_BlockHeader.Type == NHeader::NBlockType::kFileHeader)
- {
- m_FileHeaderData.EnsureCapacity(m_BlockHeader.HeadSize);
- m_CurData = (Byte *)m_FileHeaderData;
- m_PosLimit = m_BlockHeader.HeadSize;
- if (!ReadBytesAndTestSize(m_CurData + m_CurPos, m_BlockHeader.HeadSize - 7))
- {
- errorMessage = k_UnexpectedEnd;
- return S_FALSE;
- }
-
- ReadHeaderReal(item);
- if ((CrcCalc(m_CurData + 2,
- m_BlockHeader.HeadSize - item.CommentSize - 2) & 0xFFFF) != m_BlockHeader.CRC)
- ThrowExceptionWithCode(CInArchiveException::kFileHeaderCRCError);
-
- FinishCryptoBlock();
- m_CryptoMode = false;
- SeekInArchive(m_Position); // Move Position to compressed Data;
- AddToSeekValue(item.PackSize); // m_Position points to next header;
- return S_OK;
- }
- if (m_CryptoMode && m_BlockHeader.HeadSize > (1 << 10))
- {
- decryptionError = true;
- errorMessage = k_DecryptionError;
- return S_FALSE;
- }
- if ((m_BlockHeader.Flags & NHeader::NBlock::kLongBlock) != 0)
- {
- m_FileHeaderData.EnsureCapacity(7 + 4);
- m_CurData = (Byte *)m_FileHeaderData;
- if (!ReadBytesAndTestSize(m_CurData + m_CurPos, 4))
- {
- errorMessage = k_UnexpectedEnd;
- return S_FALSE;
- }
- m_PosLimit = 7 + 4;
- UInt32 dataSize = ReadUInt32();
- AddToSeekValue(dataSize);
- if (m_CryptoMode && dataSize > (1 << 27))
- {
- decryptionError = true;
- errorMessage = k_DecryptionError;
- return S_FALSE;
- }
- m_CryptoPos = m_BlockHeader.HeadSize;
- }
- else
- m_CryptoPos = 0;
- AddToSeekValue(m_BlockHeader.HeadSize);
- FinishCryptoBlock();
- m_CryptoMode = false;
- }
-}
-
-void CInArchive::SeekInArchive(UInt64 position)
-{
- m_Stream->Seek(position, STREAM_SEEK_SET, NULL);
-}
-
-ISequentialInStream* CInArchive::CreateLimitedStream(UInt64 position, UInt64 size)
-{
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- SeekInArchive(position);
- streamSpec->SetStream(m_Stream);
- streamSpec->Init(size);
- return inStream.Detach();
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarIn.h b/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarIn.h
deleted file mode 100644
index a6998db26..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarIn.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// RarIn.h
-
-#ifndef __ARCHIVE_RAR_IN_H
-#define __ARCHIVE_RAR_IN_H
-
-#include "Common/DynamicBuffer.h"
-#include "Common/MyCom.h"
-
-#include "../../ICoder.h"
-#include "../../IStream.h"
-
-#include "../../Common/StreamObjects.h"
-
-#include "../../Crypto/RarAes.h"
-
-#include "RarHeader.h"
-#include "RarItem.h"
-
-namespace NArchive {
-namespace NRar {
-
-class CInArchiveException
-{
-public:
- enum CCauseType
- {
- kUnexpectedEndOfArchive = 0,
- kArchiveHeaderCRCError,
- kFileHeaderCRCError,
- kIncorrectArchive
- }
- Cause;
- CInArchiveException(CCauseType cause) : Cause(cause) {}
-};
-
-
-struct CInArchiveInfo
-{
- UInt32 Flags;
- Byte EncryptVersion;
- UInt64 StartPosition;
-
- bool IsSolid() const { return (Flags & NHeader::NArchive::kSolid) != 0; }
- bool IsCommented() const { return (Flags & NHeader::NArchive::kComment) != 0; }
- bool IsVolume() const { return (Flags & NHeader::NArchive::kVolume) != 0; }
- bool HaveNewVolumeName() const { return (Flags & NHeader::NArchive::kNewVolName) != 0; }
- bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; }
- bool IsThereEncryptVer() const { return (Flags & NHeader::NArchive::kEncryptVer) != 0; }
- bool IsEncryptOld() const { return (!IsThereEncryptVer() || EncryptVersion < 36); }
-};
-
-class CInArchive
-{
- CMyComPtr<IInStream> m_Stream;
-
- UInt64 m_StreamStartPosition;
-
- CInArchiveInfo _header;
- CDynamicBuffer<char> m_NameBuffer;
- CDynamicBuffer<wchar_t> _unicodeNameBuffer;
-
- CByteBuffer _comment;
-
- void ReadName(CItemEx &item, int nameSize);
- void ReadHeaderReal(CItemEx &item);
-
- HRESULT ReadBytesSpec(void *data, size_t *size);
- bool ReadBytesAndTestSize(void *data, UInt32 size);
-
- HRESULT Open2(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
-
- void ThrowExceptionWithCode(CInArchiveException::CCauseType cause);
- void ThrowUnexpectedEndOfArchiveException();
-
- void AddToSeekValue(UInt64 addValue);
-
- CDynamicBuffer<Byte> m_FileHeaderData;
-
- NHeader::NBlock::CBlock m_BlockHeader;
-
- NCrypto::NRar29::CDecoder *m_RarAESSpec;
- CMyComPtr<ICompressFilter> m_RarAES;
-
- Byte *m_CurData; // it must point to start of Rar::Block
- UInt32 m_CurPos;
- UInt32 m_PosLimit;
- Byte ReadByte();
- UInt16 ReadUInt16();
- UInt32 ReadUInt32();
- void ReadTime(Byte mask, CRarTime &rarTime);
-
- CBuffer<Byte> m_DecryptedData;
- Byte *m_DecryptedDataAligned;
- UInt32 m_DecryptedDataSize;
-
- bool m_CryptoMode;
- UInt32 m_CryptoPos;
- void FinishCryptoBlock()
- {
- if (m_CryptoMode)
- while ((m_CryptoPos & 0xF) != 0)
- {
- m_CryptoPos++;
- m_Position++;
- }
- }
-
-public:
- UInt64 m_Position;
-
- HRESULT Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit);
- void Close();
- HRESULT GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword, bool &decryptionError, AString &errorMessage);
-
- void GetArchiveInfo(CInArchiveInfo &archiveInfo) const;
-
- void SeekInArchive(UInt64 position);
- ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarItem.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarItem.cpp
deleted file mode 100644
index 9216ae57b..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarItem.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-// RarItem.cpp
-
-#include "StdAfx.h"
-
-#include "RarItem.h"
-
-namespace NArchive{
-namespace NRar{
-
-bool CItem::IgnoreItem() const
-{
- switch(HostOS)
- {
- case NHeader::NFile::kHostMSDOS:
- case NHeader::NFile::kHostOS2:
- case NHeader::NFile::kHostWin32:
- return ((Attrib & NHeader::NFile::kLabelFileAttribute) != 0);
- }
- return false;
-}
-
-bool CItem::IsDir() const
-{
- if (GetDictSize() == NHeader::NFile::kDictDirectoryValue)
- return true;
- switch(HostOS)
- {
- case NHeader::NFile::kHostMSDOS:
- case NHeader::NFile::kHostOS2:
- case NHeader::NFile::kHostWin32:
- if ((Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0)
- return true;
- }
- return false;
-}
-
-UInt32 CItem::GetWinAttributes() const
-{
- UInt32 winAttributes;
- switch(HostOS)
- {
- case NHeader::NFile::kHostMSDOS:
- case NHeader::NFile::kHostOS2:
- case NHeader::NFile::kHostWin32:
- winAttributes = Attrib;
- break;
- default:
- winAttributes = 0; // must be converted from unix value;
- }
- if (IsDir())
- winAttributes |= NHeader::NFile::kWinFileDirectoryAttributeMask;
- return winAttributes;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarItem.h b/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarItem.h
deleted file mode 100644
index 4aa4d8667..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarItem.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// RarItem.h
-
-#ifndef __ARCHIVE_RAR_ITEM_H
-#define __ARCHIVE_RAR_ITEM_H
-
-#include "Common/Types.h"
-#include "Common/MyString.h"
-
-#include "RarHeader.h"
-
-namespace NArchive{
-namespace NRar{
-
-struct CRarTime
-{
- UInt32 DosTime;
- Byte LowSecond;
- Byte SubTime[3];
-};
-
-struct CItem
-{
- UInt64 Size;
- UInt64 PackSize;
-
- CRarTime CTime;
- CRarTime ATime;
- CRarTime MTime;
-
- UInt32 FileCRC;
- UInt32 Attrib;
-
- UInt16 Flags;
- Byte HostOS;
- Byte UnPackVersion;
- Byte Method;
-
- bool CTimeDefined;
- bool ATimeDefined;
-
- AString Name;
- UString UnicodeName;
-
- Byte Salt[8];
-
- bool IsEncrypted() const { return (Flags & NHeader::NFile::kEncrypted) != 0; }
- bool IsSolid() const { return (Flags & NHeader::NFile::kSolid) != 0; }
- bool IsCommented() const { return (Flags & NHeader::NFile::kComment) != 0; }
- bool IsSplitBefore() const { return (Flags & NHeader::NFile::kSplitBefore) != 0; }
- bool IsSplitAfter() const { return (Flags & NHeader::NFile::kSplitAfter) != 0; }
- bool HasSalt() const { return (Flags & NHeader::NFile::kSalt) != 0; }
- bool HasExtTime() const { return (Flags & NHeader::NFile::kExtTime) != 0; }
- bool HasUnicodeName()const { return (Flags & NHeader::NFile::kUnicodeName) != 0; }
- bool IsOldVersion() const { return (Flags & NHeader::NFile::kOldVersion) != 0; }
-
- UInt32 GetDictSize() const { return (Flags >> NHeader::NFile::kDictBitStart) & NHeader::NFile::kDictMask; }
- bool IsDir() const;
- bool IgnoreItem() const;
- UInt32 GetWinAttributes() const;
-
- CItem(): CTimeDefined(false), ATimeDefined(false) {}
-};
-
-class CItemEx: public CItem
-{
-public:
- UInt64 Position;
- UInt16 MainPartSize;
- UInt16 CommentSize;
- UInt16 AlignSize;
- UInt64 GetFullSize() const { return MainPartSize + CommentSize + AlignSize + PackSize; };
- // DWORD GetHeaderWithCommentSize() const { return MainPartSize + CommentSize; };
- UInt64 GetCommentPosition() const { return Position + MainPartSize; };
- UInt64 GetDataPosition() const { return GetCommentPosition() + CommentSize + AlignSize; };
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarRegister.cpp
deleted file mode 100644
index 2bcf569ef..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// RarRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "RarHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NRar::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Rar", L"rar r00", 0, 3, {0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}, 7, false, CreateArc, 0, };
-
-REGISTER_ARC(Rar)
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp
deleted file mode 100644
index 25194f915..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-// RarVolumeInStream.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/7zCrc.h"
-
-#include "RarVolumeInStream.h"
-
-namespace NArchive {
-namespace NRar {
-
-void CFolderInStream::Init(
- CObjectVector<CInArchive> *archives,
- const CObjectVector<CItemEx> *items,
- const CRefItem &refItem)
-{
- _archives = archives;
- _items = items;
- _refItem = refItem;
- _curIndex = 0;
- CRCs.Clear();
- _fileIsOpen = false;
-}
-
-HRESULT CFolderInStream::OpenStream()
-{
- while (_curIndex < _refItem.NumItems)
- {
- const CItemEx &item = (*_items)[_refItem.ItemIndex + _curIndex];
- _stream.Attach((*_archives)[_refItem.VolumeIndex + _curIndex].
- CreateLimitedStream(item.GetDataPosition(), item.PackSize));
- _curIndex++;
- _fileIsOpen = true;
- _crc = CRC_INIT_VAL;
- return S_OK;
- }
- return S_OK;
-}
-
-HRESULT CFolderInStream::CloseStream()
-{
- CRCs.Add(CRC_GET_DIGEST(_crc));
- _stream.Release();
- _fileIsOpen = false;
- return S_OK;
-}
-
-STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize = 0;
- while ((_curIndex < _refItem.NumItems || _fileIsOpen) && size > 0)
- {
- if (_fileIsOpen)
- {
- UInt32 localProcessedSize;
- RINOK(_stream->Read(
- ((Byte *)data) + realProcessedSize, size, &localProcessedSize));
- _crc = CrcUpdate(_crc, ((Byte *)data) + realProcessedSize, localProcessedSize);
- if (localProcessedSize == 0)
- {
- RINOK(CloseStream());
- continue;
- }
- realProcessedSize += localProcessedSize;
- size -= localProcessedSize;
- break;
- }
- else
- {
- RINOK(OpenStream());
- }
- }
- if (processedSize != 0)
- *processedSize = realProcessedSize;
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarVolumeInStream.h b/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarVolumeInStream.h
deleted file mode 100644
index 78d95b10f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Rar/RarVolumeInStream.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// RarVolumeInStream.h
-
-#ifndef __RAR_VOLUME_IN_STREAM_H
-#define __RAR_VOLUME_IN_STREAM_H
-
-#include "../../IStream.h"
-#include "RarIn.h"
-
-namespace NArchive {
-namespace NRar {
-
-struct CRefItem
-{
- int VolumeIndex;
- int ItemIndex;
- int NumItems;
-};
-
-class CFolderInStream:
- public ISequentialInStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-
-private:
- CObjectVector<CInArchive> *_archives;
- const CObjectVector<CItemEx> *_items;
- CRefItem _refItem;
- int _curIndex;
- UInt32 _crc;
- bool _fileIsOpen;
- CMyComPtr<ISequentialInStream> _stream;
-
- HRESULT OpenStream();
- HRESULT CloseStream();
-public:
- void Init(CObjectVector<CInArchive> *archives,
- const CObjectVector<CItemEx> *items,
- const CRefItem &refItem);
-
- CRecordVector<UInt32> CRCs;
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/RpmHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/RpmHandler.cpp
deleted file mode 100644
index 1d31d4514..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/RpmHandler.cpp
+++ /dev/null
@@ -1,292 +0,0 @@
-// RpmHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-using namespace NWindows;
-
-#define Get16(p) GetBe16(p)
-#define Get32(p) GetBe32(p)
-
-namespace NArchive {
-namespace NRpm {
-
-/* Reference: lib/signature.h of rpm package */
-#define RPMSIG_NONE 0 /* Do not change! */
-/* The following types are no longer generated */
-#define RPMSIG_PGP262_1024 1 /* No longer generated */ /* 256 byte */
-/* These are the new-style signatures. They are Header structures. */
-/* Inside them we can put any number of any type of signature we like. */
-
-#define RPMSIG_HEADERSIG 5 /* New Header style signature */
-
-const UInt32 kLeadSize = 96;
-struct CLead
-{
- unsigned char Magic[4];
- unsigned char Major; // not supported ver1, only support 2,3 and lator
- unsigned char Minor;
- UInt16 Type;
- UInt16 ArchNum;
- char Name[66];
- UInt16 OSNum;
- UInt16 SignatureType;
- char Reserved[16]; // pad to 96 bytes -- 8 byte aligned
- bool MagicCheck() const
- { return Magic[0] == 0xed && Magic[1] == 0xab && Magic[2] == 0xee && Magic[3] == 0xdb; };
-};
-
-const UInt32 kEntryInfoSize = 16;
-/*
-struct CEntryInfo
-{
- int Tag;
- int Type;
- int Offset; // Offset from beginning of data segment, only defined on disk
- int Count;
-};
-*/
-
-// case: SignatureType == RPMSIG_HEADERSIG
-const UInt32 kCSigHeaderSigSize = 16;
-struct CSigHeaderSig
-{
- unsigned char Magic[4];
- UInt32 Reserved;
- UInt32 IndexLen; // count of index entries
- UInt32 DataLen; // number of bytes
- bool MagicCheck()
- { return Magic[0] == 0x8e && Magic[1] == 0xad && Magic[2] == 0xe8 && Magic[3] == 0x01; };
- UInt32 GetLostHeaderLen()
- { return IndexLen * kEntryInfoSize + DataLen; };
-};
-
-static HRESULT RedSigHeaderSig(IInStream *inStream, CSigHeaderSig &h)
-{
- char dat[kCSigHeaderSigSize];
- char *cur = dat;
- RINOK(ReadStream_FALSE(inStream, dat, kCSigHeaderSigSize));
- memcpy(h.Magic, cur, 4);
- cur += 4;
- cur += 4;
- h.IndexLen = Get32(cur);
- cur += 4;
- h.DataLen = Get32(cur);
- return S_OK;
-}
-
-HRESULT OpenArchive(IInStream *inStream)
-{
- UInt64 pos;
- char leadData[kLeadSize];
- char *cur = leadData;
- CLead lead;
- RINOK(ReadStream_FALSE(inStream, leadData, kLeadSize));
- memcpy(lead.Magic, cur, 4);
- cur += 4;
- lead.Major = *cur++;
- lead.Minor = *cur++;
- lead.Type = Get16(cur);
- cur += 2;
- lead.ArchNum = Get16(cur);
- cur += 2;
- memcpy(lead.Name, cur, sizeof(lead.Name));
- cur += sizeof(lead.Name);
- lead.OSNum = Get16(cur);
- cur += 2;
- lead.SignatureType = Get16(cur);
- cur += 2;
-
- if (!lead.MagicCheck() || lead.Major < 3)
- return S_FALSE;
-
- CSigHeaderSig sigHeader, header;
- if (lead.SignatureType == RPMSIG_NONE)
- {
- ;
- }
- else if (lead.SignatureType == RPMSIG_PGP262_1024)
- {
- UInt64 pos;
- RINOK(inStream->Seek(256, STREAM_SEEK_CUR, &pos));
- }
- else if (lead.SignatureType == RPMSIG_HEADERSIG)
- {
- RINOK(RedSigHeaderSig(inStream, sigHeader));
- if (!sigHeader.MagicCheck())
- return S_FALSE;
- UInt32 len = sigHeader.GetLostHeaderLen();
- RINOK(inStream->Seek(len, STREAM_SEEK_CUR, &pos));
- if ((pos % 8) != 0)
- {
- RINOK(inStream->Seek((pos / 8 + 1) * 8 - pos,
- STREAM_SEEK_CUR, &pos));
- }
- }
- else
- return S_FALSE;
-
- RINOK(RedSigHeaderSig(inStream, header));
- if (!header.MagicCheck())
- return S_FALSE;
- int headerLen = header.GetLostHeaderLen();
- if (headerLen == -1)
- return S_FALSE;
- RINOK(inStream->Seek(headerLen, STREAM_SEEK_CUR, &pos));
- return S_OK;
-}
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- UInt64 _pos;
- UInt64 _size;
- Byte _sig[4];
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID) { case kpidMainSubfile: prop = (UInt32)0; break; }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- try
- {
- Close();
- if (OpenArchive(inStream) != S_OK)
- return S_FALSE;
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &_pos));
- RINOK(ReadStream_FALSE(inStream, _sig, sizeof(_sig) / sizeof(_sig[0])));
- UInt64 endPosition;
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPosition));
- _size = endPosition - _pos;
- _stream = inStream;
- return S_OK;
- }
- catch(...) { return S_FALSE; }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidSize:
- case kpidPackSize:
- prop = _size;
- break;
- case kpidExtension:
- {
- char s[32];
- MyStringCopy(s, "cpio.");
- const char *ext;
- if (_sig[0] == 0x1F && _sig[1] == 0x8B)
- ext = "gz";
- else if (_sig[0] == 'B' && _sig[1] == 'Z' && _sig[2] == 'h')
- ext = "bz2";
- else
- ext = "lzma";
- MyStringCopy(s + MyStringLen(s), ext);
- prop = s;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- RINOK(extractCallback->SetTotal(_size));
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &outStream, askMode));
- if (!testMode && !outStream)
- return S_OK;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- CMyComPtr<ICompressCoder> copyCoder = new NCompress::CCopyCoder;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- RINOK(_stream->Seek(_pos, STREAM_SEEK_SET, NULL));
- RINOK(copyCoder->Code(_stream, outStream, NULL, NULL, progress));
- outStream.Release();
- return extractCallback->SetOperationResult(NExtract::NOperationResult::kOK);
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 /* index */, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- return CreateLimitedInStream(_stream, _pos, _size, stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NRpm::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Rpm", L"rpm", 0, 0xEB, { 0xED, 0xAB, 0xEE, 0xDB}, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Rpm)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/SquashfsHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/SquashfsHandler.cpp
deleted file mode 100644
index 2cc1219ad..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/SquashfsHandler.cpp
+++ /dev/null
@@ -1,2155 +0,0 @@
-// SquashfsHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/Alloc.h"
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariantUtils.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-#include "../Compress/ZlibDecoder.h"
-#include "../Compress/LzmaDecoder.h"
-
-namespace NArchive {
-namespace NSquashfs {
-
-static const UInt32 kNumFilesMax = (1 << 28);
-static const unsigned kNumDirLevelsMax = (1 << 10);
-
-// Layout: Header, Data, inodes, Directories, Fragments, UIDs, GIDs
-
-/*
-#define Get16(p) (be ? GetBe16(p) : GetUi16(p))
-#define Get32(p) (be ? GetBe32(p) : GetUi32(p))
-#define Get64(p) (be ? GetBe64(p) : GetUi64(p))
-*/
-
-UInt16 Get16b(const Byte *p, bool be) { return be ? GetBe16(p) : GetUi16(p); }
-UInt32 Get32b(const Byte *p, bool be) { return be ? GetBe32(p) : GetUi32(p); }
-UInt64 Get64b(const Byte *p, bool be) { return be ? GetBe64(p) : GetUi64(p); }
-
-#define Get16(p) Get16b(p, be)
-#define Get32(p) Get32b(p, be)
-#define Get64(p) Get64b(p, be)
-
-#define LE_16(offs, dest) dest = GetUi16(p + (offs));
-#define LE_32(offs, dest) dest = GetUi32(p + (offs));
-#define LE_64(offs, dest) dest = GetUi64(p + (offs));
-
-#define GET_16(offs, dest) dest = Get16(p + (offs));
-#define GET_32(offs, dest) dest = Get32(p + (offs));
-#define GET_64(offs, dest) dest = Get64(p + (offs));
-
-static const UInt32 kSignatureSize = 4;
-#define SIGNATURE { 'h', 's', 'q', 's' }
-static const UInt32 kSignature32_LE = 0x73717368;
-static const UInt32 kSignature32_BE = 0x68737173;
-static const UInt32 kSignature32_LZ = 0x71736873;
-
-#define kMethod_ZLIB 1
-#define kMethod_LZMA 2
-#define kMethod_LZO 3
-
-static const char *k_Methods[] =
-{
- "Unknown",
- "ZLIB",
- "LZMA",
- "LZO"
-};
-
-static const UInt32 kMetadataBlockSizeLog = 13;
-static const UInt32 kMetadataBlockSize = (1 << kMetadataBlockSizeLog);
-
-#define MY_S_IFIFO 0x1000
-#define MY_S_IFCHR 0x2000
-#define MY_S_IFDIR 0x4000
-#define MY_S_IFBLK 0x6000
-#define MY_S_IFREG 0x8000
-#define MY_S_IFLNK 0xA000
-#define MY_S_IFSOCK 0xC000
-
-enum
-{
- kType_IPC,
- kType_DIR,
- kType_FILE,
- kType_LNK,
- kType_BLK,
- kType_CHR,
- kType_FIFO,
- kType_SOCK
-};
-
-static const UInt32 k_TypeToMode[] =
-{
- 0,
- MY_S_IFDIR, MY_S_IFREG, MY_S_IFLNK, MY_S_IFBLK, MY_S_IFCHR, MY_S_IFIFO, MY_S_IFSOCK,
- MY_S_IFDIR, MY_S_IFREG, MY_S_IFLNK, MY_S_IFBLK, MY_S_IFCHR, MY_S_IFIFO, MY_S_IFSOCK
-};
-
-
-enum
-{
- kFlag_UNC_INODES,
- kFlag_UNC_DATA,
- kFlag_CHECK,
- kFlag_UNC_FRAGS,
- kFlag_NO_FRAGS,
- kFlag_ALWAYS_FRAG,
- kFlag_DUPLICATE,
- kFlag_EXPORT
-};
-
-static const CUInt32PCharPair k_Flags[] =
-{
- { kFlag_UNC_INODES, "UNCOMPRESSED_INODES" },
- { kFlag_UNC_DATA, "UNCOMPRESSED_DATA" },
- { kFlag_CHECK, "CHECK" },
- { kFlag_UNC_FRAGS, "UNCOMPRESSED_FRAGMENTS" },
- { kFlag_NO_FRAGS, "NO_FRAGMENTS" },
- { kFlag_ALWAYS_FRAG, "ALWAYS_FRAGMENTS" },
- { kFlag_DUPLICATE, "DUPLICATES_REMOVED" },
- { kFlag_EXPORT, "EXPORTABLE" }
-};
-
-static const UInt32 kNotCompressedBit16 = (1 << 15);
-static const UInt32 kNotCompressedBit32 = (1 << 24);
-
-#define GET_COMPRESSED_BLOCK_SIZE(size) ((size) & ~kNotCompressedBit32)
-#define IS_COMPRESSED_BLOCK(size) (((size) & kNotCompressedBit32) == 0)
-
-static const UInt32 kHeaderSize1 = 0x33;
-static const UInt32 kHeaderSize2 = 0x3F;
-static const UInt32 kHeaderSize3 = 0x77;
-static const UInt32 kHeaderSize4 = 0x60;
-
-struct CHeader
-{
- bool be;
- bool SeveralMethods;
- Byte NumUids;
- Byte NumGids;
-
- UInt32 NumInodes;
- UInt32 CTime;
- UInt32 BlockSize;
- UInt32 NumFrags;
- UInt16 Method;
- UInt16 BlockSizeLog;
- UInt16 Flags;
- UInt16 NumIDs;
- UInt16 Major;
- UInt16 Minor;
- UInt64 RootInode;
- UInt64 Size;
- UInt64 UidTable;
- UInt64 GidTable;
- UInt64 XattrIdTable;
- UInt64 InodeTable;
- UInt64 DirTable;
- UInt64 FragTable;
- UInt64 LookupTable;
-
- void Parse3(const Byte *p)
- {
- Method = kMethod_ZLIB;
- GET_32 (0x08, Size);
- GET_32 (0x0C, UidTable);
- GET_32 (0x10, GidTable);
- GET_32 (0x14, InodeTable);
- GET_32 (0x18, DirTable);
- GET_16 (0x20, BlockSize);
- GET_16 (0x22, BlockSizeLog);
- Flags = p[0x24];
- NumUids = p[0x25];
- NumGids = p[0x26];
- GET_32 (0x27, CTime);
- GET_64 (0x2B, RootInode);
- NumFrags = 0;
- FragTable = UidTable;
-
- if (Major >= 2)
- {
- GET_32 (0x33, BlockSize);
- GET_32 (0x37, NumFrags);
- GET_32 (0x3B, FragTable);
- if (Major == 3)
- {
- GET_64 (0x3F, Size);
- GET_64 (0x47, UidTable);
- GET_64 (0x4F, GidTable);
- GET_64 (0x57, InodeTable);
- GET_64 (0x5F, DirTable);
- GET_64 (0x67, FragTable);
- GET_64 (0x6F, LookupTable);
- }
- }
- }
-
- void Parse4(const Byte *p)
- {
- LE_32 (0x08, CTime);
- LE_32 (0x0C, BlockSize);
- LE_32 (0x10, NumFrags);
- LE_16 (0x14, Method);
- LE_16 (0x16, BlockSizeLog);
- LE_16 (0x18, Flags);
- LE_16 (0x1A, NumIDs);
- LE_64 (0x20, RootInode);
- LE_64 (0x28, Size);
- LE_64 (0x30, UidTable);
- LE_64 (0x38, XattrIdTable);
- LE_64 (0x40, InodeTable);
- LE_64 (0x48, DirTable);
- LE_64 (0x50, FragTable);
- LE_64 (0x58, LookupTable);
- GidTable = 0;
- }
-
- bool Parse(const Byte *p)
- {
- be = false;
- SeveralMethods = false;
- switch (GetUi32(p))
- {
- case kSignature32_LE: break;
- case kSignature32_BE: be = true; break;
- case kSignature32_LZ: SeveralMethods = true; break;
- default: return false;
- }
- GET_32 (4, NumInodes);
- GET_16 (0x1C, Major);
- GET_16 (0x1E, Minor);
- if (Major <= 3)
- Parse3(p);
- else
- {
- if (be)
- return false;
- Parse4(p);
- }
- return
- InodeTable < DirTable &&
- DirTable <= FragTable &&
- FragTable <= Size &&
- UidTable <= Size &&
- BlockSizeLog >= 12 &&
- BlockSizeLog < 31 &&
- BlockSize == ((UInt32)1 << BlockSizeLog);
- }
-
- bool IsSupported() const { return Major > 0 && Major <= 4 && BlockSizeLog <= 23; }
- bool IsOldVersion() const { return Major < 4; }
- bool NeedCheckData() const { return (Flags & (1 << kFlag_CHECK)) != 0; }
- unsigned GetFileNameOffset() const { return Major <= 2 ? 3 : (Major == 3 ? 5 : 8); }
- unsigned GetSymLinkOffset() const { return Major <= 1 ? 5: (Major <= 2 ? 6: (Major == 3 ? 18 : 24)); }
- unsigned GetSpecGuidIndex() const { return Major <= 1 ? 0xF: 0xFF; }
-};
-
-static const UInt32 kFrag_Empty = (UInt32)(Int32)-1;
-// static const UInt32 kXattr_Empty = (UInt32)(Int32)-1;
-
-struct CNode
-{
- UInt16 Type;
- UInt16 Mode;
- UInt16 Uid;
- UInt16 Gid;
- UInt32 Frag;
- UInt32 Offset;
- // UInt32 MTime;
- // UInt32 Number;
- // UInt32 NumLinks;
- // UInt32 RDev;
- // UInt32 Xattr;
- // UInt32 Parent;
-
- UInt64 FileSize;
- UInt64 StartBlock;
- // UInt64 Sparse;
-
- UInt32 Parse1(const Byte *p, UInt32 size, const CHeader &_h);
- UInt32 Parse2(const Byte *p, UInt32 size, const CHeader &_h);
- UInt32 Parse3(const Byte *p, UInt32 size, const CHeader &_h);
- UInt32 Parse4(const Byte *p, UInt32 size, const CHeader &_h);
-
- bool IsDir() const { return (Type == kType_DIR || Type == kType_DIR + 7); }
- bool IsLink() const { return (Type == kType_LNK || Type == kType_LNK + 7); }
- UInt64 GetSize() const { return IsDir() ? 0 : FileSize; }
-
- bool ThereAreFrags() const { return Frag != kFrag_Empty; }
- UInt64 GetNumBlocks(const CHeader &_h) const
- {
- return (FileSize >> _h.BlockSizeLog) +
- (!ThereAreFrags() && (FileSize & (_h.BlockSize - 1)) != 0);
- }
-};
-
-UInt32 CNode::Parse1(const Byte *p, UInt32 size, const CHeader &_h)
-{
- bool be = _h.be;
- if (size < 4)
- return 0;
- UInt16 t = Get16(p);
- if (be)
- {
- Type = t >> 12;
- Mode = t & 0xFFF;
- Uid = p[2] >> 4;
- Gid = p[2] & 0xF;
- }
- else
- {
- Type = t & 0xF;
- Mode = t >> 4;
- Uid = p[2] & 0xF;
- Gid = p[2] >> 4;
- }
-
- // Xattr = kXattr_Empty;
- // MTime = 0;
- FileSize = 0;
- StartBlock = 0;
- Frag = kFrag_Empty;
-
- if (Type == 0)
- {
- Byte t = p[3];
- if (be)
- {
- Type = t >> 4;
- Offset = t & 0xF;
- }
- else
- {
- Type = t & 0xF;
- Offset = t >> 4;
- }
- return (Type == kType_FIFO || Type == kType_SOCK) ? 4 : 0;
- }
-
- Type--;
- Uid += (Type / 5) * 16;
- Type = (Type % 5) + 1;
-
- if (Type == kType_FILE)
- {
- if (size < 15)
- return 0;
- // GET_32 (3, MTime);
- GET_32 (7, StartBlock);
- UInt32 t;
- GET_32 (11, t);
- FileSize = t;
- UInt32 numBlocks = t >> _h.BlockSizeLog;
- if ((t & (_h.BlockSize - 1)) != 0)
- numBlocks++;
- UInt32 pos = numBlocks * 2 + 15;
- return (pos <= size) ? pos : 0;
- }
-
- if (Type == kType_DIR)
- {
- if (size < 14)
- return 0;
- UInt32 t = Get32(p + 3);
- if (be)
- {
- FileSize = t >> 13;
- Offset = t & 0x1FFF;
- }
- else
- {
- FileSize = t & 0x7FFFF;
- Offset = t >> 19;
- }
- // GET_32 (7, MTime);
- GET_32 (10, StartBlock);
- if (be)
- StartBlock &= 0xFFFFFF;
- else
- StartBlock >>= 8;
- return 14;
- }
-
- if (size < 5)
- return 0;
-
- if (Type == kType_LNK)
- {
- UInt32 len;
- GET_16 (3, len);
- FileSize = len;
- len += 5;
- return (len <= size) ? len : 0;
- }
-
- // GET_32 (3, RDev);
- return 5;
-}
-
-UInt32 CNode::Parse2(const Byte *p, UInt32 size, const CHeader &_h)
-{
- bool be = _h.be;
- if (size < 4)
- return 0;
- UInt16 t = Get16(p);
- if (be)
- {
- Type = t >> 12;
- Mode = t & 0xFFF;
- }
- else
- {
- Type = t & 0xF;
- Mode = t >> 4;
- }
- Uid = p[2];
- Gid = p[3];
-
- // Xattr = kXattr_Empty;
-
- if (Type == kType_FILE)
- {
- if (size < 24)
- return 0;
- // GET_32 (4, MTime);
- GET_32 (8, StartBlock);
- GET_32 (12, Frag);
- GET_32 (16, Offset);
- UInt32 t;
- GET_32 (20, t);
- FileSize = t;
- UInt32 numBlocks = t >> _h.BlockSizeLog;
- if (!ThereAreFrags() && (t & (_h.BlockSize - 1)) != 0)
- numBlocks++;
- UInt32 pos = numBlocks * 4 + 24;
- return (pos <= size) ? (UInt32)pos : 0;
- }
-
- FileSize = 0;
- // MTime = 0;
- StartBlock = 0;
- Frag = kFrag_Empty;
-
- if (Type == kType_DIR)
- {
- if (size < 15)
- return 0;
- UInt32 t = Get32(p + 4);
- if (be)
- {
- FileSize = t >> 13;
- Offset = t & 0x1FFF;
- }
- else
- {
- FileSize = t & 0x7FFFF;
- Offset = t >> 19;
- }
- // GET_32 (8, MTime);
- GET_32 (11, StartBlock);
- if (be)
- StartBlock &= 0xFFFFFF;
- else
- StartBlock >>= 8;
- return 15;
- }
-
- if (Type == kType_DIR + 7)
- {
- if (size < 18)
- return 0;
- UInt32 t = Get32(p + 4);
- UInt32 t2 = Get16(p + 7);
- if (be)
- {
- FileSize = t >> 5;
- Offset = t2 & 0x1FFF;
- }
- else
- {
- FileSize = t & 0x7FFFFFF;
- Offset = t2 >> 3;
- }
- // GET_32 (9, MTime);
- GET_32 (12, StartBlock);
- if (be)
- StartBlock &= 0xFFFFFF;
- else
- StartBlock >>= 8;
- UInt32 iCount;
- GET_16 (16, iCount);
- UInt32 pos = 18;
- for (UInt32 i = 0; i < iCount; i++)
- {
- // 27 bits: index
- // 29 bits: startBlock
- if (pos + 8 > size)
- return 0;
- pos += 8 + (UInt32)p[pos + 7] + 1; // nameSize
- if (pos > size)
- return 0;
- }
- return pos;
- }
-
- if (Type == kType_FIFO || Type == kType_SOCK)
- return 4;
-
- if (size < 6)
- return 0;
-
- if (Type == kType_LNK)
- {
- UInt32 len;
- GET_16 (4, len);
- FileSize = len;
- len += 6;
- return (len <= size) ? len : 0;
- }
-
- if (Type == kType_BLK || Type == kType_CHR)
- {
- // GET_16 (4, RDev);
- return 6;
- }
-
- return 0;
-}
-
-UInt32 CNode::Parse3(const Byte *p, UInt32 size, const CHeader &_h)
-{
- bool be = _h.be;
- if (size < 12)
- return 0;
- UInt16 t = Get16(p);
- if (be)
- {
- Type = t >> 12;
- Mode = t & 0xFFF;
- }
- else
- {
- Type = t & 0xF;
- Mode = t >> 4;
- }
- Uid = p[2];
- Gid = p[3];
- // GET_32 (4, MTime);
- // GET_32 (8, Number);
- // Xattr = kXattr_Empty;
- FileSize = 0;
- StartBlock = 0;
-
- if (Type == kType_FILE || Type == kType_FILE + 7)
- {
- UInt32 offset;
- if (Type == kType_FILE)
- {
- if (size < 32)
- return 0;
- GET_64 (12, StartBlock);
- GET_32 (20, Frag);
- GET_32 (24, Offset);
- GET_32 (28, FileSize);
- offset = 32;
- }
- else
- {
- if (size < 40)
- return 0;
- // GET_32 (12, NumLinks);
- GET_64 (16, StartBlock);
- GET_32 (24, Frag);
- GET_32 (28, Offset);
- GET_64 (32, FileSize);
- offset = 40;
- }
- UInt64 pos = GetNumBlocks(_h) * 4 + offset;
- return (pos <= size) ? (UInt32)pos : 0;
- }
-
- if (size < 16)
- return 0;
- // GET_32 (12, NumLinks);
-
- if (Type == kType_DIR)
- {
- if (size < 28)
- return 0;
- UInt32 t = Get32(p + 16);
- if (be)
- {
- FileSize = t >> 13;
- Offset = t & 0x1FFF;
- }
- else
- {
- FileSize = t & 0x7FFFF;
- Offset = t >> 19;
- }
- GET_32 (20, StartBlock);
- // GET_32 (24, Parent);
- return 28;
- }
-
- if (Type == kType_DIR + 7)
- {
- if (size < 31)
- return 0;
- UInt32 t = Get32(p + 16);
- UInt32 t2 = Get16(p + 19);
- if (be)
- {
- FileSize = t >> 5;
- Offset = t2 & 0x1FFF;
- }
- else
- {
- FileSize = t & 0x7FFFFFF;
- Offset = t2 >> 3;
- }
- GET_32 (21, StartBlock);
- UInt32 iCount;
- GET_16 (25, iCount);
- // GET_32 (27, Parent);
- UInt32 pos = 31;
- for (UInt32 i = 0; i < iCount; i++)
- {
- // UInt32 index
- // UInt32 startBlock
- if (pos + 9 > size)
- return 0;
- pos += 9 + (unsigned)p[pos + 8] + 1; // nameSize
- if (pos > size)
- return 0;
- }
- return pos;
- }
-
- if (Type == kType_FIFO || Type == kType_SOCK)
- return 16;
-
- if (size < 18)
- return 0;
- if (Type == kType_LNK)
- {
- UInt32 len;
- GET_16 (16, len);
- FileSize = len;
- len += 18;
- return (len <= size) ? len : 0;
- }
-
- if (Type == kType_BLK || Type == kType_CHR)
- {
- // GET_16 (16, RDev);
- return 18;
- }
-
- return 0;
-}
-
-UInt32 CNode::Parse4(const Byte *p, UInt32 size, const CHeader &_h)
-{
- if (size < 20)
- return 0;
- LE_16 (0, Type);
- LE_16 (2, Mode);
- LE_16 (4, Uid);
- LE_16 (6, Gid);
- // LE_32 (8, MTime);
- // LE_32 (12, Number);
-
- // Xattr = kXattr_Empty;
- FileSize = 0;
- StartBlock = 0;
-
- if (Type == kType_FILE || Type == kType_FILE + 7)
- {
- UInt32 offset;
- if (Type == kType_FILE)
- {
- if (size < 32)
- return 0;
- LE_32 (16, StartBlock);
- LE_32 (20, Frag);
- LE_32 (24, Offset);
- LE_32 (28, FileSize);
- offset = 32;
- }
- else
- {
- if (size < 56)
- return 0;
- LE_64 (16, StartBlock);
- LE_64 (24, FileSize);
- // LE_64 (32, Sparse);
- // LE_32 (40, NumLinks);
- LE_32 (44, Frag);
- LE_32 (48, Offset);
- // LE_32 (52, Xattr);
- offset = 56;
- }
- UInt64 pos = GetNumBlocks(_h) * 4 + offset;
- return (pos <= size) ? (UInt32)pos : 0;
- }
-
- if (Type == kType_DIR)
- {
- if (size < 32)
- return 0;
- LE_32 (16, StartBlock);
- // LE_32 (20, NumLinks);
- LE_16 (24, FileSize);
- LE_16 (26, Offset);
- // LE_32 (28, Parent);
- return 32;
- }
-
- // LE_32 (16, NumLinks);
-
- if (Type == kType_DIR + 7)
- {
- if (size < 40)
- return 0;
- LE_32 (20, FileSize);
- LE_32 (24, StartBlock);
- // LE_32 (28, Parent);
- UInt32 iCount;
- LE_16 (32, iCount);
- LE_16 (34, Offset);
- // LE_32 (36, Xattr);
-
- UInt32 pos = 40;
- for (UInt32 i = 0; i < iCount; i++)
- {
- // UInt32 index
- // UInt32 startBlock
- if (pos + 12 > size)
- return 0;
- UInt32 nameLen = GetUi32(p + pos + 8);
- pos += 12 + nameLen + 1;
- if (pos > size || nameLen > (1 << 10))
- return 0;
- }
- return pos;
- }
-
- unsigned offset = 20;
- switch(Type)
- {
- case kType_FIFO: case kType_FIFO + 7:
- case kType_SOCK: case kType_SOCK + 7:
- break;
- case kType_LNK: case kType_LNK + 7:
- {
- if (size < 24)
- return 0;
- UInt32 len;
- LE_32 (20, len);
- FileSize = len;
- offset = len + 24;
- if (size < offset || len > (1 << 30))
- return 0;
- break;
- }
- case kType_BLK: case kType_BLK + 7:
- case kType_CHR: case kType_CHR + 7:
- if (size < 24)
- return 0;
- // LE_32 (20, RDev);
- offset = 24;
- break;
- default:
- return 0;
- }
-
- if (Type >= 8)
- {
- if (size < offset + 4)
- return 0;
- // LE_32 (offset, Xattr);
- offset += 4;
- }
- return offset;
-}
-
-struct CItem
-{
- int Node;
- int Parent;
- UInt32 Ptr;
-};
-
-struct CData
-{
- CByteBuffer Data;
- CRecordVector<UInt32> PackPos;
- CRecordVector<UInt32> UnpackPos; // additional item at the end contains TotalUnpackSize
-
- UInt32 GetNumBlocks() const { return PackPos.Size(); }
- void Clear()
- {
- Data.Free();
- PackPos.Clear();
- UnpackPos.Clear();
- }
-};
-
-struct CFrag
-{
- UInt64 StartBlock;
- UInt32 Size;
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CRecordVector<CItem> _items;
- CRecordVector<CNode> _nodes;
- CRecordVector<UInt32> _nodesPos;
- CRecordVector<UInt32> _blockToNode;
- CData _inodesData;
- CData _dirs;
- CRecordVector<CFrag> _frags;
- // CByteBuffer _uids;
- // CByteBuffer _gids;
- CHeader _h;
-
- CMyComPtr<IInStream> _stream;
- UInt64 _sizeCalculated;
-
- IArchiveOpenCallback *_openCallback;
-
- int _nodeIndex;
- CRecordVector<bool> _blockCompressed;
- CRecordVector<UInt64> _blockOffsets;
-
- CByteBuffer _cachedBlock;
- UInt64 _cachedBlockStartPos;
- UInt32 _cachedPackBlockSize;
- UInt32 _cachedUnpackBlockSize;
-
- CLimitedSequentialInStream *_limitedInStreamSpec;
- CMyComPtr<ISequentialInStream> _limitedInStream;
-
- CBufPtrSeqOutStream *_outStreamSpec;
- CMyComPtr<ISequentialOutStream> _outStream;
-
- NCompress::NLzma::CDecoder *_lzmaDecoderSpec;
- CMyComPtr<ICompressCoder> _lzmaDecoder;
-
- NCompress::NZlib::CDecoder *_zlibDecoderSpec;
- CMyComPtr<ICompressCoder> _zlibDecoder;
-
- CByteBuffer _inputBuffer;
-
- CDynBufSeqOutStream *_dynOutStreamSpec;
- CMyComPtr<ISequentialOutStream> _dynOutStream;
-
- void ClearCache()
- {
- _cachedBlockStartPos = 0;
- _cachedPackBlockSize = 0;
- _cachedUnpackBlockSize = 0;
- }
-
- HRESULT Decompress(ISequentialOutStream *outStream, Byte *outBuf, bool *outBufWasWritten, UInt32 *outBufWasWrittenSize,
- UInt32 inSize, UInt32 outSizeMax);
- HRESULT ReadMetadataBlock(UInt32 &packSize);
- HRESULT ReadData(CData &data, UInt64 start, UInt64 end);
-
- HRESULT OpenDir(int parent, UInt32 startBlock, UInt32 offset, unsigned level, int &nodeIndex);
- HRESULT ScanInodes(UInt64 ptr);
- // HRESULT ReadUids(UInt64 start, UInt32 num, CByteBuffer &ids);
- HRESULT Open2(IInStream *inStream);
- AString GetPath(int index) const;
- bool GetPackSize(int index, UInt64 &res, bool fillOffsets);
-
-public:
- CHandler();
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-
- HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize);
-};
-
-CHandler::CHandler()
-{
- _limitedInStreamSpec = new CLimitedSequentialInStream;
- _limitedInStream = _limitedInStreamSpec;
-
- _outStreamSpec = new CBufPtrSeqOutStream();
- _outStream = _outStreamSpec;
-
- _dynOutStreamSpec = new CDynBufSeqOutStream;
- _dynOutStream = _dynOutStreamSpec;
-}
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidPosixAttrib, VT_UI4}
- // { NULL, kpidUser, VT_BSTR},
- // { NULL, kpidGroup, VT_BSTR},
- // { NULL, kpidLinks, VT_UI4},
- // { NULL, kpidOffset, VT_UI4}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidFileSystem, VT_BSTR},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidBlock, VT_UI4},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI8},
- { NULL, kpidBigEndian, VT_BOOL},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidCharacts, VT_BSTR}
- // { NULL, kpidNumBlocks, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-static HRESULT LzoDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen)
-{
- SizeT destRem = *destLen;
- SizeT srcRem = *srcLen;
- *destLen = 0;
- *srcLen = 0;
- const Byte *destStart = dest;
- const Byte *srcStart = src;
- unsigned mode = 2;
-
- {
- if (srcRem == 0)
- return S_FALSE;
- UInt32 b = *src;
- if (b > 17)
- {
- src++;
- srcRem--;
- b -= 17;
- mode = (b < 4 ? 0 : 1);
- if (b > srcRem || b > destRem)
- return S_FALSE;
- srcRem -= b;
- destRem -= b;
- do
- *dest++ = *src++;
- while (--b);
- }
- }
-
- for (;;)
- {
- if (srcRem < 3)
- return S_FALSE;
- UInt32 b = *src++;
- srcRem--;
- UInt32 len, back;
- if (b >= 64)
- {
- srcRem--;
- back = ((b >> 2) & 7) + ((UInt32)*src++ << 3);
- len = (b >> 5) + 1;
- }
- else if (b < 16)
- {
- if (mode == 2)
- {
- if (b == 0)
- {
- for (b = 15;; b += 255)
- {
- if (srcRem == 0)
- return S_FALSE;
- UInt32 b2 = *src++;
- srcRem--;
- if (b2 != 0)
- {
- b += b2;
- break;
- }
- }
- }
- b += 3;
- if (b > srcRem || b > destRem)
- return S_FALSE;
- srcRem -= b;
- destRem -= b;
- mode = 1;
- do
- *dest++ = *src++;
- while (--b);
- continue;
- }
- srcRem--;
- back = (b >> 2) + (*src++ << 2);
- len = 2;
- if (mode == 1)
- {
- back += (1 << 11);
- len = 3;
- }
- }
- else
- {
- UInt32 bOld = b;
- b = (b < 32 ? 7 : 31);
- len = bOld & b;
- if (len == 0)
- {
- for (len = b;; len += 255)
- {
- if (srcRem == 0)
- return S_FALSE;
- UInt32 b2 = *src++;
- srcRem--;
- if (b2 != 0)
- {
- len += b2;
- break;
- }
- }
- }
- len += 2;
- if (srcRem < 2)
- return S_FALSE;
- b = *src;
- back = (b >> 2) + ((UInt32)src[1] << 6);
- src += 2;
- srcRem -= 2;
- if (bOld < 32)
- {
- if (back == 0)
- {
- *destLen = dest - destStart;
- *srcLen = src - srcStart;
- return S_OK;
- }
- back += ((bOld & 8) << 11) + (1 << 14) - 1;
- }
- }
- back++;
- if (len > destRem || (size_t)(dest - destStart) < back)
- return S_FALSE;
- destRem -= len;
- Byte *destTemp = dest - back;
- dest += len;
- do
- {
- *(destTemp + back) = *destTemp;
- destTemp++;
- }
- while (--len);
- b &= 3;
- if (b == 0)
- {
- mode = 2;
- continue;
- }
- if (b > srcRem || b > destRem)
- return S_FALSE;
- srcRem -= b;
- destRem -= b;
- mode = 0;
- *dest++ = *src++;
- if (b > 1)
- {
- *dest++ = *src++;
- if (b > 2)
- *dest++ = *src++;
- }
- }
-}
-
-HRESULT CHandler::Decompress(ISequentialOutStream *outStream, Byte *outBuf, bool *outBufWasWritten, UInt32 *outBufWasWrittenSize, UInt32 inSize, UInt32 outSizeMax)
-{
- if (outBuf)
- {
- *outBufWasWritten = false;
- *outBufWasWrittenSize = 0;
- }
- UInt32 method = _h.Method;
- if (_h.SeveralMethods)
- {
- Byte props[1];
- RINOK(ReadStream_FALSE(_stream, props, 1));
- method = (props[0] == 0x5D ? kMethod_LZMA : kMethod_ZLIB);
- RINOK(_stream->Seek(-1, STREAM_SEEK_CUR, NULL));
- }
-
- if (method == kMethod_LZO)
- {
- if (_inputBuffer.GetCapacity() < inSize)
- {
- _inputBuffer.Free();
- _inputBuffer.SetCapacity(inSize);
- }
- RINOK(ReadStream_FALSE(_stream, _inputBuffer, inSize));
-
- Byte *dest = outBuf;
- if (!outBuf)
- {
- dest = _dynOutStreamSpec->GetBufPtrForWriting(outSizeMax);
- if (!dest)
- return E_OUTOFMEMORY;
- }
- SizeT destLen = outSizeMax, srcLen = inSize;
- RINOK(LzoDecode(dest, &destLen, _inputBuffer, &srcLen));
- if (inSize != srcLen)
- return S_FALSE;
- if (outBuf)
- {
- *outBufWasWritten = true;
- *outBufWasWrittenSize = (UInt32)destLen;
- }
- else
- _dynOutStreamSpec->UpdateSize(destLen);
- }
- else if (method == kMethod_LZMA)
- {
- if (!_lzmaDecoder)
- {
- _lzmaDecoderSpec = new NCompress::NLzma::CDecoder();
- _lzmaDecoderSpec->FinishStream = true;
- _lzmaDecoder = _lzmaDecoderSpec;
- }
- const UInt32 kPropsSize = 5 + 8;
- Byte props[kPropsSize];
- ReadStream_FALSE(_limitedInStream, props, kPropsSize);
- RINOK(_lzmaDecoderSpec->SetDecoderProperties2(props, 5));
- UInt64 outSize = GetUi64(props + 5);
- if (outSize > outSizeMax)
- return S_FALSE;
- RINOK(_lzmaDecoder->Code(_limitedInStream, outStream, NULL, &outSize, NULL));
- if (inSize != kPropsSize + _lzmaDecoderSpec->GetInputProcessedSize())
- return S_FALSE;
- }
- else
- {
- if (!_zlibDecoder)
- {
- _zlibDecoderSpec = new NCompress::NZlib::CDecoder();
- _zlibDecoder = _zlibDecoderSpec;
- }
- RINOK(_zlibDecoder->Code(_limitedInStream, outStream, NULL, NULL, NULL));
- if (inSize != _zlibDecoderSpec->GetInputProcessedSize())
- return S_FALSE;
- }
- return S_OK;
-}
-
-HRESULT CHandler::ReadMetadataBlock(UInt32 &packSize)
-{
- Byte temp[3];
- unsigned offset = _h.NeedCheckData() ? 3 : 2;
- if (offset > packSize)
- return S_FALSE;
- RINOK(ReadStream_FALSE(_stream, temp, offset));
- // if (NeedCheckData && Major < 4) checkByte must be = 0xFF
- bool be = _h.be;
- UInt32 size = Get16(temp);
- bool isCompressed = ((size & kNotCompressedBit16) == 0);
- if (size != kNotCompressedBit16)
- size &= ~kNotCompressedBit16;
-
- if (size > kMetadataBlockSize || offset + size > packSize)
- return S_FALSE;
- packSize = offset + size;
- if (isCompressed)
- {
- _limitedInStreamSpec->Init(size);
- RINOK(Decompress(_dynOutStream, NULL, NULL, NULL, size, kMetadataBlockSize));
- }
- else
- {
- // size != 0 here
- Byte *buf = _dynOutStreamSpec->GetBufPtrForWriting(size);
- if (!buf)
- return E_OUTOFMEMORY;
- RINOK(ReadStream_FALSE(_stream, buf, size));
- _dynOutStreamSpec->UpdateSize(size);
- }
- return S_OK;
-}
-
-HRESULT CHandler::ReadData(CData &data, UInt64 start, UInt64 end)
-{
- if (end < start || end - start >= ((UInt64)1 << 32))
- return S_FALSE;
- UInt32 size = (UInt32)(end - start);
- RINOK(_stream->Seek(start, STREAM_SEEK_SET, NULL));
- _dynOutStreamSpec->Init();
- UInt32 packPos = 0;
- while (packPos != size)
- {
- data.PackPos.Add(packPos);
- data.UnpackPos.Add((UInt32)_dynOutStreamSpec->GetSize());
- if (packPos > size)
- return S_FALSE;
- UInt32 packSize = size - packPos;
- RINOK(ReadMetadataBlock(packSize));
- if (_dynOutStreamSpec->GetSize() >= ((UInt64)1 << 32))
- return S_FALSE;
- packPos += packSize;
- }
- data.UnpackPos.Add((UInt32)_dynOutStreamSpec->GetSize());
- _dynOutStreamSpec->CopyToBuffer(data.Data);
- return S_OK;
-}
-
-struct CTempItem
-{
- UInt32 StartBlock;
- // UInt32 iNodeNumber1;
- UInt32 Offset;
- // UInt16 iNodeNumber2;
- UInt16 Type;
-};
-
-HRESULT CHandler::OpenDir(int parent, UInt32 startBlock, UInt32 offset, unsigned level, int &nodeIndex)
-{
- if (level > kNumDirLevelsMax)
- return S_FALSE;
-
- int blockIndex = _inodesData.PackPos.FindInSorted(startBlock);
- if (blockIndex < 0)
- return S_FALSE;
- UInt32 unpackPos = _inodesData.UnpackPos[blockIndex] + offset;
- if (unpackPos < offset)
- return S_FALSE;
-
- nodeIndex = _nodesPos.FindInSorted(unpackPos, _blockToNode[blockIndex], _blockToNode[blockIndex + 1]);
- // nodeIndex = _nodesPos.FindInSorted(unpackPos);
- if (nodeIndex < 0)
- return S_FALSE;
-
- const CNode &n = _nodes[nodeIndex];
- if (!n.IsDir())
- return S_OK;
- blockIndex = _dirs.PackPos.FindInSorted((UInt32)n.StartBlock);
- if (blockIndex < 0)
- return S_FALSE;
- unpackPos = _dirs.UnpackPos[blockIndex] + n.Offset;
- if (unpackPos < n.Offset || unpackPos > _dirs.Data.GetCapacity())
- return S_FALSE;
-
- UInt32 rem = (UInt32)_dirs.Data.GetCapacity() - unpackPos;
- const Byte *p = _dirs.Data + unpackPos;
- UInt32 fileSize = (UInt32)n.FileSize;
-
- if (fileSize > rem)
- return S_FALSE;
- rem = fileSize;
- if (_h.Major >= 3)
- {
- if (rem < 3)
- return S_FALSE;
- rem -= 3;
- }
-
- CRecordVector<CTempItem> tempItems;
- while (rem != 0)
- {
- bool be = _h.be;
- UInt32 count;
- CTempItem tempItem;
- if (_h.Major <= 2)
- {
- if (rem < 4)
- return S_FALSE;
- count = p[0];
- tempItem.StartBlock = Get32(p);
- if (be)
- tempItem.StartBlock &= 0xFFFFFF;
- else
- tempItem.StartBlock >>= 8;
- p += 4;
- rem -= 4;
- }
- else
- {
- if (_h.Major == 3)
- {
- if (rem < 9)
- return S_FALSE;
- count = p[0];
- p += 1;
- rem -= 1;
- }
- else
- {
- if (rem < 12)
- return S_FALSE;
- count = GetUi32(p);
- p += 4;
- rem -= 4;
- }
- GET_32 (0, tempItem.StartBlock);
- // GET_32 (4, tempItem.iNodeNumber1);
- p += 8;
- rem -= 8;
- }
- count++;
-
- for (UInt32 i = 0; i < count; i++)
- {
- if (rem == 0)
- return S_FALSE;
-
- UInt32 nameOffset = _h.GetFileNameOffset();
- if (rem < nameOffset)
- return S_FALSE;
-
- if ((UInt32)_items.Size() >= kNumFilesMax)
- return S_FALSE;
- if (_openCallback)
- {
- UInt64 numFiles = _items.Size();
- if ((numFiles & 0xFFFF) == 0)
- {
- RINOK(_openCallback->SetCompleted(&numFiles, NULL));
- }
- }
-
- CItem item;
- item.Ptr = (UInt32)(p - _dirs.Data);
-
- UInt32 size;
- if (_h.IsOldVersion())
- {
- UInt32 t = Get16(p);
- if (be)
- {
- tempItem.Offset = t >> 3;
- tempItem.Type = (UInt16)(t & 0x7);
- }
- else
- {
- tempItem.Offset = t & 0x1FFF;
- tempItem.Type = (UInt16)(t >> 13);
- }
- size = (UInt32)p[2];
- /*
- if (_h.Major > 2)
- tempItem.iNodeNumber2 = Get16(p + 3);
- */
- }
- else
- {
- GET_16 (0, tempItem.Offset);
- // GET_16 (2, tempItem.iNodeNumber2);
- GET_16 (4, tempItem.Type);
- GET_16 (6, size);
- }
- p += nameOffset;
- rem -= nameOffset;
- size++;
- if (rem < size)
- return S_FALSE;
- p += size;
- rem -= size;
- item.Parent = parent;
- _items.Add(item);
- tempItems.Add(tempItem);
- }
- }
-
- int startItemIndex = _items.Size() - tempItems.Size();
- for (int i = 0; i < tempItems.Size(); i++)
- {
- const CTempItem &tempItem = tempItems[i];
- int index = startItemIndex + i;
- CItem &item = _items[index];
- RINOK(OpenDir(index, tempItem.StartBlock, tempItem.Offset, level + 1, item.Node));
- }
-
- return S_OK;
-}
-
-/*
-HRESULT CHandler::ReadUids(UInt64 start, UInt32 num, CByteBuffer &ids)
-{
- size_t size = num * 4;
- ids.SetCapacity(size);
- RINOK(_stream->Seek(start, STREAM_SEEK_SET, NULL));
- return ReadStream_FALSE(_stream, ids, size);
-}
-*/
-
-HRESULT CHandler::Open2(IInStream *inStream)
-{
- {
- Byte buf[kHeaderSize3];
- RINOK(ReadStream_FALSE(inStream, buf, kHeaderSize3));
- if (!_h.Parse(buf))
- return S_FALSE;
- if (!_h.IsSupported())
- return E_NOTIMPL;
-
- switch (_h.Method)
- {
- case kMethod_ZLIB:
- case kMethod_LZMA:
- case kMethod_LZO:
- break;
- default:
- return E_NOTIMPL;
- }
- }
-
- _stream = inStream;
-
- if (_h.NumFrags != 0)
- {
- if (_h.NumFrags > kNumFilesMax)
- return S_FALSE;
- _frags.Reserve(_h.NumFrags);
- CByteBuffer data;
- unsigned bigFrag = (_h.Major > 2);
-
- unsigned fragPtrsInBlockLog = kMetadataBlockSizeLog - (3 + bigFrag);
- UInt32 numBlocks = (_h.NumFrags + (1 << fragPtrsInBlockLog) - 1) >> fragPtrsInBlockLog;
- size_t numBlocksBytes = (size_t)numBlocks << (2 + bigFrag);
- data.SetCapacity(numBlocksBytes);
- RINOK(inStream->Seek(_h.FragTable, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(inStream, data, numBlocksBytes));
- bool be = _h.be;
-
- for (UInt32 i = 0; i < numBlocks; i++)
- {
- UInt64 offset = bigFrag ? Get64(data + i * 8) : Get32(data + i * 4);
- RINOK(_stream->Seek(offset, STREAM_SEEK_SET, NULL));
- _dynOutStreamSpec->Init();
- UInt32 packSize = kMetadataBlockSize + 3;
- RINOK(ReadMetadataBlock(packSize));
- UInt32 unpackSize = (UInt32)_dynOutStreamSpec->GetSize();
- if (unpackSize != kMetadataBlockSize)
- if (i != numBlocks - 1 || unpackSize != ((_h.NumFrags << (3 + bigFrag)) & (kMetadataBlockSize - 1)))
- return S_FALSE;
- const Byte *buf = _dynOutStreamSpec->GetBuffer();
- for (UInt32 j = 0; j < kMetadataBlockSize && j < unpackSize;)
- {
- CFrag frag;
- if (bigFrag)
- {
- frag.StartBlock = Get64(buf + j);
- frag.Size = Get32(buf + j + 8);
- // some archives contain nonzero in unused (buf + j + 12)
- j += 16;
- }
- else
- {
- frag.StartBlock = Get32(buf + j);
- frag.Size = Get32(buf + j + 4);
- j += 8;
- }
- _frags.Add(frag);
- }
- }
- if ((UInt32)_frags.Size() != _h.NumFrags)
- return S_FALSE;
- }
-
- // RINOK(inStream->Seek(_h.InodeTable, STREAM_SEEK_SET, NULL));
-
- RINOK(ReadData(_inodesData, _h.InodeTable, _h.DirTable));
- RINOK(ReadData(_dirs, _h.DirTable, _h.FragTable));
-
- UInt64 absOffset = _h.RootInode >> 16;
- if (absOffset >= ((UInt64)1 << 32))
- return S_FALSE;
- {
- UInt32 pos = 0;
- UInt32 totalSize = (UInt32)_inodesData.Data.GetCapacity();
- _nodesPos.Reserve(_h.NumInodes);
- _nodes.Reserve(_h.NumInodes);
- // we use _blockToNode for binary search seed optimizations
- _blockToNode.Reserve(_inodesData.GetNumBlocks() + 1);
- int curBlock = 0;
- for (UInt32 i = 0; i < _h.NumInodes; i++)
- {
- CNode n;
- const Byte *p = _inodesData.Data + pos;
- UInt32 size = totalSize - pos;
-
- switch(_h.Major)
- {
- case 1: size = n.Parse1(p, size, _h); break;
- case 2: size = n.Parse2(p, size, _h); break;
- case 3: size = n.Parse3(p, size, _h); break;
- default: size = n.Parse4(p, size, _h); break;
- }
- if (size == 0)
- return S_FALSE;
- while (pos >= _inodesData.UnpackPos[curBlock])
- {
- _blockToNode.Add(_nodesPos.Size());
- curBlock++;
- }
- _nodesPos.Add(pos);
- _nodes.Add(n);
- pos += size;
- }
- _blockToNode.Add(_nodesPos.Size());
- if (pos != totalSize)
- return S_FALSE;
- }
- int rootNodeIndex;
- RINOK(OpenDir(-1, (UInt32)absOffset, (UInt32)_h.RootInode & 0xFFFF, 0, rootNodeIndex));
-
- /*
- if (_h.Major < 4)
- {
- RINOK(ReadUids(_h.UidTable, _h.NumUids, _uids));
- RINOK(ReadUids(_h.GidTable, _h.NumGids, _gids));
- }
- else
- {
- UInt32 size = _h.NumIDs * 4;
- _uids.SetCapacity(size);
-
- UInt32 numBlocks = (size + kMetadataBlockSize - 1) / kMetadataBlockSize;
- UInt32 numBlocksBytes = numBlocks << 3;
- CByteBuffer data;
- data.SetCapacity(numBlocksBytes);
- RINOK(inStream->Seek(_h.UidTable, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(inStream, data, numBlocksBytes));
-
- for (UInt32 i = 0; i < numBlocks; i++)
- {
- UInt64 offset = GetUi64(data + i * 8);
- UInt32 unpackSize, packSize;
- RINOK(_stream->Seek(offset, STREAM_SEEK_SET, NULL));
- RINOK(ReadMetadataBlock(NULL, _uids + kMetadataBlockSize * i, packSize, unpackSize));
- if (unpackSize != kMetadataBlockSize)
- if (i != numBlocks - 1 || unpackSize != (size & (kMetadataBlockSize - 1)))
- return S_FALSE;
- }
- }
- */
-
- {
- const UInt32 alignSize = 1 << 12;
- Byte buf[alignSize];
- RINOK(inStream->Seek(_h.Size, STREAM_SEEK_SET, NULL));
- UInt32 rem = (UInt32)(0 - _h.Size) & (alignSize - 1);
- _sizeCalculated = _h.Size;
- if (rem != 0)
- {
- if (ReadStream_FALSE(_stream, buf, rem) == S_OK)
- {
- size_t i;
- for (i = 0; i < rem && buf[i] == 0; i++);
- if (i == rem)
- _sizeCalculated = _h.Size + rem;
- }
- }
- }
- return S_OK;
-}
-
-AString CHandler::GetPath(int index) const
-{
- unsigned len = 0;
- int indexMem = index;
- bool be = _h.be;
- do
- {
- const CItem &item = _items[index];
- index = item.Parent;
- const Byte *p = _dirs.Data + item.Ptr;
- unsigned size = (_h.IsOldVersion() ? (unsigned)p[2] : (unsigned)Get16(p + 6)) + 1;
- p += _h.GetFileNameOffset();
- unsigned i;
- for (i = 0; i < size && p[i]; i++);
- len += i + 1;
- }
- while (index >= 0);
- len--;
-
- AString path;
- char *dest = path.GetBuffer(len) + len;
- index = indexMem;
- for (;;)
- {
- const CItem &item = _items[index];
- index = item.Parent;
-
- const Byte *p = _dirs.Data + item.Ptr;
- unsigned size = (_h.IsOldVersion() ? (unsigned)p[2] : (unsigned)Get16(p + 6)) + 1;
- p += _h.GetFileNameOffset();
- unsigned i;
- for (i = 0; i < size && p[i]; i++);
- dest -= i;
- memcpy(dest, p, i);
- if (index < 0)
- break;
- *(--dest) = CHAR_PATH_SEPARATOR;
- }
- path.ReleaseBuffer(len);
- return path;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- {
- Close();
- _limitedInStreamSpec->SetStream(stream);
- HRESULT res;
- try
- {
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- _openCallback = callback;
- res = Open2(stream);
- }
- catch(...)
- {
- Close();
- throw;
- }
- if (res != S_OK)
- {
- Close();
- return res;
- }
- _stream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _limitedInStreamSpec->ReleaseStream();
- _stream.Release();
-
- _items.Clear();
- _nodes.Clear();
- _nodesPos.Clear();
- _blockToNode.Clear();
- _frags.Clear();
- _inodesData.Clear();
- _dirs.Clear();
-
- // _uids.Free();
- // _gids.Free();;
-
- _cachedBlock.Free();
- ClearCache();
-
- return S_OK;
-}
-
-bool CHandler::GetPackSize(int index, UInt64 &totalPack, bool fillOffsets)
-{
- totalPack = 0;
- const CItem &item = _items[index];
- const CNode &node = _nodes[item.Node];
- UInt32 ptr = _nodesPos[item.Node];
- const Byte *p = _inodesData.Data + ptr;
- bool be = _h.be;
-
- UInt32 type = node.Type;
- UInt32 offset;
- if (node.IsLink() || node.FileSize == 0)
- {
- totalPack = node.FileSize;
- return true;
- }
-
- UInt32 numBlocks = (UInt32)node.GetNumBlocks(_h);
-
- if (fillOffsets)
- {
- _blockOffsets.Clear();
- _blockCompressed.Clear();
- _blockOffsets.Add(totalPack);
- }
-
- if (_h.Major <= 1)
- {
- offset = 15;
- p += offset;
-
- for (UInt32 i = 0; i < numBlocks; i++)
- {
- UInt32 t = Get16(p + i * 2);
- if (fillOffsets)
- _blockCompressed.Add((t & kNotCompressedBit16) == 0);
- if (t != kNotCompressedBit16)
- t &= ~kNotCompressedBit16;
- totalPack += t;
- if (fillOffsets)
- _blockOffsets.Add(totalPack);
- }
- }
- else
- {
- if (_h.Major <= 2)
- offset = 24;
- else if (type == kType_FILE)
- offset = 32;
- else if (type == kType_FILE + 7)
- offset = (_h.Major <= 3 ? 40 : 56);
- else
- return false;
-
- p += offset;
-
- for (UInt64 i = 0; i < numBlocks; i++)
- {
- UInt32 t = Get32(p + i * 4);
- if (fillOffsets)
- _blockCompressed.Add(IS_COMPRESSED_BLOCK(t));
- UInt32 size = GET_COMPRESSED_BLOCK_SIZE(t);
- if (size > _h.BlockSize)
- return false;
- totalPack += size;
- if (fillOffsets)
- _blockOffsets.Add(totalPack);
- }
-
- if (node.ThereAreFrags())
- {
- if (node.Frag >= (UInt32)_frags.Size())
- return false;
- const CFrag &frag = _frags[node.Frag];
- if (node.Offset == 0)
- {
- UInt32 size = GET_COMPRESSED_BLOCK_SIZE(frag.Size);
- if (size > _h.BlockSize)
- return false;
- totalPack += size;
- }
- }
- }
- return true;
-}
-
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMethod:
- {
- const char *s;
- if (_h.SeveralMethods)
- s = "LZMA ZLIB";
- else
- {
- s = k_Methods[0];
- if (_h.Method < sizeof(k_Methods) / sizeof(k_Methods[0]))
- s = k_Methods[_h.Method];
- }
- prop = s;
- break;
- }
- case kpidFileSystem:
- {
- AString res = "SquashFS";
- if (_h.SeveralMethods)
- res += "-LZMA";
- res += ' ';
- char s[16];
- ConvertUInt32ToString(_h.Major, s);
- res += s;
- res += '.';
- ConvertUInt32ToString(_h.Minor, s);
- res += s;
- prop = res;
- break;
- }
- case kpidBlock: prop = _h.BlockSize; break;
- case kpidBigEndian: prop = _h.be; break;
- case kpidCTime:
- if (_h.CTime != 0)
- {
- FILETIME ft;
- NWindows::NTime::UnixTimeToFileTime(_h.CTime, ft);
- prop = ft;
- }
- break;
- case kpidCharacts: FLAGS_TO_PROP(k_Flags, _h.Flags, prop); break;
- // case kpidNumBlocks: prop = _h.NumFrags; break;
- case kpidPhySize: prop = _sizeCalculated; break;
- case kpidHeadersSize:
- if (_sizeCalculated >= _h.InodeTable)
- prop = _sizeCalculated - _h.InodeTable;
- break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _items[index];
- const CNode &node = _nodes[item.Node];
- bool isDir = node.IsDir();
- bool be = _h.be;
-
- switch(propID)
- {
- case kpidPath: prop = MultiByteToUnicodeString(GetPath(index), CP_OEMCP); break;
- case kpidIsDir: prop = isDir; break;
- // case kpidOffset: if (!node.IsLink()) prop = (UInt64)node.StartBlock; break;
- case kpidSize: if (!isDir) prop = node.GetSize(); break;
- case kpidPackSize:
- if (!isDir)
- {
- UInt64 size;
- if (GetPackSize(index, size, false))
- prop = size;
- }
- break;
- case kpidMTime:
- {
- UInt32 offset = 0;
- switch(_h.Major)
- {
- case 1:
- if (node.Type == kType_FILE)
- offset = 3;
- else if (node.Type == kType_DIR)
- offset = 7;
- break;
- case 2:
- if (node.Type == kType_FILE)
- offset = 4;
- else if (node.Type == kType_DIR)
- offset = 8;
- else if (node.Type == kType_DIR + 7)
- offset = 9;
- break;
- case 3: offset = 4; break;
- case 4: offset = 8; break;
- }
- if (offset != 0)
- {
- const Byte *p = _inodesData.Data + _nodesPos[item.Node] + offset;
- FILETIME ft;
- NWindows::NTime::UnixTimeToFileTime(Get32(p), ft);
- prop = ft;
- }
- break;
- }
- case kpidPosixAttrib:
- {
- if (node.Type != 0 && node.Type < sizeof(k_TypeToMode) / sizeof(k_TypeToMode[0]))
- prop = (UInt32)(node.Mode & 0xFFF) | k_TypeToMode[node.Type];
- break;
- }
- /*
- case kpidUser:
- {
- UInt32 offset = node.Uid * 4;
- if (offset < _uids.GetCapacity())
- prop = (UInt32)Get32(_uids + offset);
- break;
- }
- case kpidGroup:
- {
- if (_h.Major == 4 || node.Gid == _h.GetSpecGuidIndex())
- {
- UInt32 offset = node.Uid * 4;
- if (offset < _uids.GetCapacity())
- prop = (UInt32)Get32(_uids + offset);
- }
- else
- {
- UInt32 offset = node.Gid * 4;
- if (offset < _gids.GetCapacity())
- prop = (UInt32)Get32(_gids + offset);
- }
- break;
- }
- */
- /*
- case kpidLinks:
- if (_h.Major >= 3 && node.Type != kType_FILE)
- prop = node.NumLinks;
- break;
- */
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CSquashfsInStream: public CCachedInStream
-{
- HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize);
-public:
- CHandler *Handler;
-};
-
-HRESULT CSquashfsInStream::ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize)
-{
- return Handler->ReadBlock(blockIndex, dest, blockSize);
-}
-
-HRESULT CHandler::ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize)
-{
- const CNode &node = _nodes[_nodeIndex];
- UInt64 blockOffset;
- UInt32 packBlockSize;
- UInt32 offsetInBlock = 0;
- bool compressed;
- if (blockIndex < _blockCompressed.Size())
- {
- compressed = _blockCompressed[(int)blockIndex];
- blockOffset = _blockOffsets[(int)blockIndex];
- packBlockSize = (UInt32)(_blockOffsets[(int)blockIndex + 1] - blockOffset);
- blockOffset += node.StartBlock;
- }
- else
- {
- if (!node.ThereAreFrags())
- return S_FALSE;
- const CFrag &frag = _frags[node.Frag];
- offsetInBlock = node.Offset;
- blockOffset = frag.StartBlock;
- packBlockSize = GET_COMPRESSED_BLOCK_SIZE(frag.Size);
- compressed = IS_COMPRESSED_BLOCK(frag.Size);
- }
-
- if (packBlockSize == 0)
- {
- // sparse file ???
- memset(dest, 0, blockSize);
- return S_OK;
- }
-
- if (blockOffset != _cachedBlockStartPos ||
- packBlockSize != _cachedPackBlockSize)
- {
- ClearCache();
- RINOK(_stream->Seek(blockOffset, STREAM_SEEK_SET, NULL));
- _limitedInStreamSpec->Init(packBlockSize);
-
- if (compressed)
- {
- _outStreamSpec->Init((Byte *)_cachedBlock, _h.BlockSize);
- bool outBufWasWritten;
- UInt32 outBufWasWrittenSize;
- HRESULT res = Decompress(_outStream, _cachedBlock, &outBufWasWritten, &outBufWasWrittenSize, packBlockSize, _h.BlockSize);
- if (outBufWasWritten)
- _cachedUnpackBlockSize = outBufWasWrittenSize;
- else
- _cachedUnpackBlockSize = (UInt32)_outStreamSpec->GetPos();
- RINOK(res);
- }
- else
- {
- RINOK(ReadStream_FALSE(_limitedInStream, _cachedBlock, packBlockSize));
- _cachedUnpackBlockSize = packBlockSize;
- }
- _cachedBlockStartPos = blockOffset;
- _cachedPackBlockSize = packBlockSize;
- }
- if (offsetInBlock + blockSize > _cachedUnpackBlockSize)
- return S_FALSE;
- memcpy(dest, _cachedBlock + offsetInBlock, blockSize);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const CItem &item = _items[allFilesMode ? i : indices[i]];
- const CNode &node = _nodes[item.Node];
- totalSize += node.GetSize();
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- const CNode &node = _nodes[item.Node];
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- // const Byte *p = _data + item.Offset;
-
- if (node.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- UInt64 unpackSize = node.GetSize();
- totalSize += unpackSize;
- UInt64 packSize;
- if (GetPackSize(index, packSize, false))
- totalPackSize += packSize;
-
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- int res = NExtract::NOperationResult::kDataError;
- {
- CMyComPtr<ISequentialInStream> inSeqStream;
- CMyComPtr<IInStream> inStream;
- HRESULT hres = GetStream(index, &inSeqStream);
- if (inSeqStream)
- inSeqStream.QueryInterface(IID_IInStream, &inStream);
- if (hres == S_FALSE || !inStream)
- {
- if (hres == E_OUTOFMEMORY)
- return hres;
- res = NExtract::NOperationResult::kUnSupportedMethod;
- }
- else
- {
- RINOK(hres);
- if (inStream)
- {
- HRESULT hres = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (hres != S_OK && hres != S_FALSE)
- {
- RINOK(hres);
- }
- if (copyCoderSpec->TotalSize == unpackSize && hres == S_OK)
- res = NExtract::NOperationResult::kOK;
- else
- {
- res = res;
- }
- }
- }
- }
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
-
- const CItem &item = _items[index];
- const CNode &node = _nodes[item.Node];
-
- if (node.IsDir())
- return E_FAIL;
-
- const Byte *p = _inodesData.Data + _nodesPos[item.Node];
-
- if (node.FileSize == 0 || node.IsLink())
- {
- CBufInStream *streamSpec = new CBufInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- if (node.IsLink())
- streamSpec->Init(p + _h.GetSymLinkOffset(), (size_t)node.FileSize);
- else
- streamSpec->Init(NULL, 0);
- *stream = streamTemp.Detach();
- return S_OK;
- }
-
- UInt64 packSize;
- if (!GetPackSize(index, packSize, true))
- return S_FALSE;
-
- _nodeIndex = item.Node;
-
- size_t cacheSize = _h.BlockSize;
- if (_cachedBlock.GetCapacity() != cacheSize)
- {
- ClearCache();
- _cachedBlock.SetCapacity(cacheSize);
- }
-
- CSquashfsInStream *streamSpec = new CSquashfsInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- streamSpec->Handler = this;
- unsigned cacheSizeLog = 22;
- if (cacheSizeLog <= _h.BlockSizeLog)
- cacheSizeLog = _h.BlockSizeLog + 1;
- if (!streamSpec->Alloc(_h.BlockSizeLog, cacheSizeLog - _h.BlockSizeLog))
- return E_OUTOFMEMORY;
- streamSpec->Init(node.FileSize);
- *stream = streamTemp.Detach();
-
- return S_OK;
-
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NSquashfs::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"SquashFS", L"squashfs", 0, 0xD2, SIGNATURE, kSignatureSize, false, CreateArc, 0 };
-
-REGISTER_ARC(Cramfs)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/SwfHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/SwfHandler.cpp
deleted file mode 100644
index dfc0326d1..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/SwfHandler.cpp
+++ /dev/null
@@ -1,706 +0,0 @@
-// SwfHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-#include "../Compress/ZlibDecoder.h"
-#include "../Compress/ZlibEncoder.h"
-
-#include "Common/DummyOutStream.h"
-
-#include "DeflateProps.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NSwfc {
-
-static const UInt32 kHeaderSize = 8;
-
-static const Byte SWF_UNCOMPRESSED = 'F';
-static const Byte SWF_COMPRESSED = 'C';
-static const Byte SWF_MIN_COMPRESSED_VER = 6;
-
-struct CItem
-{
- Byte Buf[kHeaderSize];
-
- UInt32 GetSize() const { return GetUi32(Buf + 4); }
- bool IsSwf(Byte c) const { return (Buf[0] == c && Buf[1] == 'W' && Buf[2] == 'S' && Buf[3] < 32); }
- bool IsUncompressed() const { return IsSwf(SWF_UNCOMPRESSED); }
- bool IsCompressed() const { return IsSwf(SWF_COMPRESSED); }
-
- void MakeUncompressed() { Buf[0] = SWF_UNCOMPRESSED; }
- void MakeCompressed()
- {
- Buf[0] = SWF_COMPRESSED;
- if (Buf[3] < SWF_MIN_COMPRESSED_VER)
- Buf[3] = SWF_MIN_COMPRESSED_VER;
- }
-
- HRESULT ReadHeader(ISequentialInStream *stream) { return ReadStream_FALSE(stream, Buf, kHeaderSize); }
- HRESULT WriteHeader(ISequentialOutStream *stream) { return WriteStream(stream, Buf, kHeaderSize); }
-};
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public IOutArchive,
- public ISetProperties,
- public CMyUnknownImp
-{
- CItem _item;
- UInt64 _packSize;
- bool _packSizeDefined;
- CMyComPtr<ISequentialInStream> _seqStream;
- CMyComPtr<IInStream> _stream;
-
- CDeflateProps _method;
-
-public:
- MY_UNKNOWN_IMP4(IInArchive, IArchiveOpenSeq, IOutArchive, ISetProperties)
- INTERFACE_IInArchive(;)
- INTERFACE_IOutArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
- STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProps);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidSize: prop = (UInt64)_item.GetSize(); break;
- case kpidPackSize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *)
-{
- RINOK(OpenSeq(stream));
- _stream = stream;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- Close();
- HRESULT res = _item.ReadHeader(stream);
- if (res == S_OK)
- if (_item.IsCompressed())
- _seqStream = stream;
- else
- res = S_FALSE;
- return res;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _packSizeDefined = false;
- _seqStream.Release();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- extractCallback->SetTotal(_item.GetSize());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- NCompress::NZlib::CDecoder *_decoderSpec = new NCompress::NZlib::CDecoder;
- CMyComPtr<ICompressCoder> _decoder = _decoderSpec;
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
- realOutStream.Release();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- lps->InSize = kHeaderSize;
- lps->OutSize = outStreamSpec->GetSize();
- RINOK(lps->SetCur());
-
- CItem item = _item;
- item.MakeUncompressed();
- RINOK(item.WriteHeader(outStream));
- if (_stream)
- RINOK(_stream->Seek(kHeaderSize, STREAM_SEEK_SET, NULL));
- HRESULT result = _decoderSpec->Code(_seqStream, outStream, NULL, NULL, progress);
- Int32 opRes = NExtract::NOperationResult::kDataError;
- if (result == S_OK)
- {
- if (_item.GetSize() == outStreamSpec->GetSize())
- {
- _packSizeDefined = true;
- _packSize = _decoderSpec->GetInputProcessedSize() + kHeaderSize;
- opRes = NExtract::NOperationResult::kOK;
- }
- }
- else if (result != S_FALSE)
- return result;
-
- outStream.Release();
- return extractCallback->SetOperationResult(opRes);
- COM_TRY_END
-}
-
-static HRESULT UpdateArchive(ISequentialOutStream *outStream,
- UInt64 size, CDeflateProps &deflateProps,
- IArchiveUpdateCallback *updateCallback)
-{
- UInt64 complexity = 0;
- RINOK(updateCallback->SetTotal(size));
- RINOK(updateCallback->SetCompleted(&complexity));
-
- CMyComPtr<ISequentialInStream> fileInStream;
- RINOK(updateCallback->GetStream(0, &fileInStream));
-
- CItem item;
- HRESULT res = item.ReadHeader(fileInStream);
- if (res == S_FALSE)
- return E_INVALIDARG;
- RINOK(res);
- if (!item.IsUncompressed() || size != item.GetSize())
- return E_INVALIDARG;
-
- item.MakeCompressed();
- item.WriteHeader(outStream);
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(updateCallback, true);
-
- NCompress::NZlib::CEncoder *encoderSpec = new NCompress::NZlib::CEncoder;
- CMyComPtr<ICompressCoder> encoder = encoderSpec;
- encoderSpec->Create();
- RINOK(deflateProps.SetCoderProperties(encoderSpec->DeflateEncoderSpec));
- RINOK(encoder->Code(fileInStream, outStream, NULL, NULL, progress));
- if (encoderSpec->GetInputProcessedSize() + kHeaderSize != size)
- return E_INVALIDARG;
- return updateCallback->SetOperationResult(NUpdate::NOperationResult::kOK);
-}
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *timeType)
-{
- *timeType = NFileTimeType::kUnix;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *updateCallback)
-{
- if (numItems != 1)
- return E_INVALIDARG;
-
- Int32 newData, newProps;
- UInt32 indexInArchive;
- if (!updateCallback)
- return E_FAIL;
- RINOK(updateCallback->GetUpdateItemInfo(0, &newData, &newProps, &indexInArchive));
-
- if (IntToBool(newProps))
- {
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidIsDir, &prop));
- if (prop.vt == VT_BOOL)
- {
- if (prop.boolVal != VARIANT_FALSE)
- return E_INVALIDARG;
- }
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- }
- }
-
- if (IntToBool(newData))
- {
- UInt64 size;
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- size = prop.uhVal.QuadPart;
- }
- return UpdateArchive(outStream, size, _method, updateCallback);
- }
-
- if (indexInArchive != 0)
- return E_INVALIDARG;
-
- if (!_seqStream)
- return E_NOTIMPL;
-
- if (_stream)
- {
- RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
- else
- _item.WriteHeader(outStream);
- return NCompress::CopyStream(_seqStream, outStream, NULL);
-}
-
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps)
-{
- return _method.SetProperties(names, values, numProps);
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new CHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
- { L"SWFc", L"swf", L"~.swf", 0xD8, { 'C', 'W', 'S' }, 3, true, CreateArc, CreateArcOut };
-
-REGISTER_ARC(Swfc)
-
-}
-
-namespace NSwf {
-
-static const UInt32 kFileSizeMax = (UInt32)1 << 30;
-static const int kNumTagsMax = (UInt32)1 << 23;
-
-struct CTag
-{
- UInt32 Type;
- CByteBuffer Buf;
-};
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public CMyUnknownImp
-{
- CObjectVector<CTag> _tags;
- NSwfc::CItem _item;
- UInt64 _packSize;
-
- HRESULT OpenSeq3(ISequentialInStream *stream, IArchiveOpenCallback *callback);
- HRESULT OpenSeq2(ISequentialInStream *stream, IArchiveOpenCallback *callback);
-public:
- MY_UNKNOWN_IMP2(IInArchive, IArchiveOpenSeq)
- INTERFACE_IInArchive(;)
-
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidComment, VT_BSTR}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _tags.Size();
- return S_OK;
-}
-
-static const char *g_TagDesc[92] =
-{
- "End",
- "ShowFrame",
- "DefineShape",
- NULL,
- "PlaceObject",
- "RemoveObject",
- "DefineBits",
- "DefineButton",
- "JPEGTables",
- "SetBackgroundColor",
- "DefineFont",
- "DefineText",
- "DoAction",
- "DefineFontInfo",
- "DefineSound",
- "StartSound",
- NULL,
- "DefineButtonSound",
- "SoundStreamHead",
- "SoundStreamBlock",
- "DefineBitsLossless",
- "DefineBitsJPEG2",
- "DefineShape2",
- "DefineButtonCxform",
- "Protect",
- NULL,
- "PlaceObject2",
- NULL,
- "RemoveObject2",
- NULL,
- NULL,
- NULL,
- "DefineShape3",
- "DefineText2",
- "DefineButton2",
- "DefineBitsJPEG3",
- "DefineBitsLossless2",
- "DefineEditText",
- NULL,
- "DefineSprite",
- NULL,
- "41",
- NULL,
- "FrameLabel",
- NULL,
- "SoundStreamHead2",
- "DefineMorphShape",
- NULL,
- "DefineFont2",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "ExportAssets",
- "ImportAssets",
- "EnableDebugger",
- "DoInitAction",
- "DefineVideoStream",
- "VideoFrame",
- "DefineFontInfo2",
- NULL,
- "EnableDebugger2",
- "ScriptLimits",
- "SetTabIndex",
- NULL,
- NULL,
- "FileAttributes",
- "PlaceObject3",
- "ImportAssets2",
- NULL,
- "DefineFontAlignZones",
- "CSMTextSettings",
- "DefineFont3",
- "SymbolClass",
- "Metadata",
- "DefineScalingGrid",
- NULL,
- NULL,
- NULL,
- "DoABC",
- "DefineShape4",
- "DefineMorphShape2",
- NULL,
- "DefineSceneAndFrameLabelData",
- "DefineBinaryData",
- "DefineFontName",
- "StartSound2",
- "DefineBitsJPEG4",
- "DefineFont4"
-};
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- const CTag &tag = _tags[index];
- switch(propID)
- {
- case kpidPath:
- {
- char s[32];
- ConvertUInt32ToString(index, s);
- size_t i = strlen(s);
- s[i++] = '.';
- ConvertUInt32ToString(tag.Type, s + i);
- prop = s;
- break;
- }
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)tag.Buf.GetCapacity(); break;
- case kpidComment:
- if (tag.Type < sizeof(g_TagDesc) / sizeof(g_TagDesc[0]))
- {
- const char *s = g_TagDesc[tag.Type];
- if (s != NULL)
- prop = s;
- }
- break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- return OpenSeq2(stream, callback);
-}
-
-static UInt16 Read16(CInBuffer &stream)
-{
- UInt16 res = 0;
- for (int i = 0; i < 2; i++)
- {
- Byte b;
- if (!stream.ReadByte(b))
- throw 1;
- res |= (UInt16)b << (i * 8);
- }
- return res;
-}
-
-static UInt32 Read32(CInBuffer &stream)
-{
- UInt32 res = 0;
- for (int i = 0; i < 4; i++)
- {
- Byte b;
- if (!stream.ReadByte(b))
- throw 1;
- res |= (UInt32)b << (i * 8);
- }
- return res;
-}
-
-struct CBitReader
-{
- CInBuffer *stream;
- unsigned NumBits;
- Byte Val;
-
- CBitReader(): NumBits(0), Val(0) {}
-
- UInt32 ReadBits(unsigned numBits);
-};
-
-UInt32 CBitReader::ReadBits(unsigned numBits)
-{
- UInt32 res = 0;
- while (numBits > 0)
- {
- if (NumBits == 0)
- {
- Val = stream->ReadByte();
- NumBits = 8;
- }
- if (numBits <= NumBits)
- {
- res <<= numBits;
- NumBits -= numBits;
- res |= (Val >> NumBits);
- Val &= (1 << NumBits) - 1;
- break;
- }
- else
- {
- res <<= NumBits;
- res |= Val;
- numBits -= NumBits;
- NumBits = 0;
- }
- }
- return res;
-}
-
-HRESULT CHandler::OpenSeq3(ISequentialInStream *stream, IArchiveOpenCallback *callback)
-{
- RINOK(_item.ReadHeader(stream))
- if (!_item.IsUncompressed())
- return S_FALSE;
-
- CInBuffer s;
- if (!s.Create(1 << 20))
- return E_OUTOFMEMORY;
- s.SetStream(stream);
- s.Init();
- {
- CBitReader br;
- br.stream = &s;
- unsigned numBits = br.ReadBits(5);
- /* UInt32 xMin = */ br.ReadBits(numBits);
- /* UInt32 xMax = */ br.ReadBits(numBits);
- /* UInt32 yMin = */ br.ReadBits(numBits);
- /* UInt32 yMax = */ br.ReadBits(numBits);
- }
- /* UInt32 frameDelay = */ Read16(s);
- /* UInt32 numFrames = */ Read16(s);
-
- _tags.Clear();
- UInt64 offsetPrev = 0;
- for (;;)
- {
- UInt32 pair = Read16(s);
- UInt32 type = pair >> 6;
- UInt32 length = pair & 0x3F;
- if (length == 0x3F)
- length = Read32(s);
- if (type == 0)
- break;
- UInt64 offset = s.GetProcessedSize() + NSwfc::kHeaderSize + length;
- if (offset > kFileSizeMax || _tags.Size() >= kNumTagsMax)
- return S_FALSE;
- _tags.Add(CTag());
- CTag &tag = _tags.Back();
- tag.Type = type;
- tag.Buf.SetCapacity(length);
- if (s.ReadBytes(tag.Buf, length) != length)
- return S_FALSE;
- if (callback && offset >= offsetPrev + (1 << 20))
- {
- UInt64 numItems = _tags.Size();
- RINOK(callback->SetCompleted(&numItems, &offset));
- offsetPrev = offset;
- }
- }
- _packSize = s.GetProcessedSize() + NSwfc::kHeaderSize;
- return S_OK;
-}
-
-HRESULT CHandler::OpenSeq2(ISequentialInStream *stream, IArchiveOpenCallback *callback)
-{
- HRESULT res;
- try { res = OpenSeq3(stream, callback); }
- catch(...) { res = S_FALSE; }
- return res;
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- return OpenSeq2(stream, NULL);
-}
-
-STDMETHODIMP CHandler::Close()
-{
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _tags.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _tags[allFilesMode ? i : indices[i]].Buf.GetCapacity();
- extractCallback->SetTotal(totalSize);
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- totalSize = 0;
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CByteBuffer &buf = _tags[index].Buf;
- totalSize += buf.GetCapacity();
-
- CMyComPtr<ISequentialOutStream> outStream;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- if (outStream)
- RINOK(WriteStream(outStream, buf, buf.GetCapacity()));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"SWF", L"swf", 0, 0xD7, { 'F', 'W', 'S' }, 3, true, CreateArc, 0 };
-
-REGISTER_ARC(Swf)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandler.cpp
deleted file mode 100644
index 4db0cae82..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandler.cpp
+++ /dev/null
@@ -1,386 +0,0 @@
-// TarHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamObjects.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../Common/ItemNameUtils.h"
-
-#include "TarHandler.h"
-#include "TarIn.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NTar {
-
-static const char *kUnexpectedEnd = "Unexpected end of archive";
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidPosixAttrib, VT_UI4},
- { NULL, kpidUser, VT_BSTR},
- { NULL, kpidGroup, VT_BSTR},
- { NULL, kpidLink, VT_BSTR}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: if (_phySizeDefined) prop = _phySize; break;
- case kpidHeadersSize: if (_phySizeDefined) prop = _headersSize; break;
- case kpidError: if (!_errorMessage.IsEmpty()) prop = _errorMessage; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-HRESULT CHandler::ReadItem2(ISequentialInStream *stream, bool &filled, CItemEx &item)
-{
- item.HeaderPos = _phySize;
- RINOK(ReadItem(stream, filled, item, _errorMessage));
- _phySize += item.HeaderSize;
- _headersSize += item.HeaderSize;
- return S_OK;
-}
-
-HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback)
-{
- UInt64 endPos = 0;
- {
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
-
- _phySizeDefined = true;
- for (;;)
- {
- CItemEx item;
- bool filled;
- RINOK(ReadItem2(stream, filled, item));
- if (!filled)
- break;
- _items.Add(item);
-
- RINOK(stream->Seek(item.GetPackSize(), STREAM_SEEK_CUR, &_phySize));
- if (_phySize > endPos)
- {
- _errorMessage = kUnexpectedEnd;
- break;
- }
- /*
- if (_phySize == endPos)
- {
- _errorMessage = "There are no trailing zero-filled records";
- break;
- }
- */
- if (callback != NULL)
- {
- if (_items.Size() == 1)
- {
- RINOK(callback->SetTotal(NULL, &endPos));
- }
- if (_items.Size() % 100 == 0)
- {
- UInt64 numFiles = _items.Size();
- RINOK(callback->SetCompleted(&numFiles, &_phySize));
- }
- }
- }
-
- if (_items.Size() == 0)
- {
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
- if (!callback)
- return S_FALSE;
- callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback);
- if (!openVolumeCallback)
- return S_FALSE;
- NCOM::CPropVariant prop;
- if (openVolumeCallback->GetProperty(kpidName, &prop) != S_OK)
- return S_FALSE;
- if (prop.vt != VT_BSTR)
- return S_FALSE;
- UString baseName = prop.bstrVal;
- baseName = baseName.Right(4);
- if (baseName.CompareNoCase(L".tar") != 0)
- return S_FALSE;
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *openArchiveCallback)
-{
- COM_TRY_BEGIN
- {
- Close();
- RINOK(Open2(stream, openArchiveCallback));
- _stream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- Close();
- _seqStream = stream;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _errorMessage.Empty();
- _phySizeDefined = false;
- _phySize = 0;
- _headersSize = 0;
- _curIndex = 0;
- _latestIsRead = false;
- _items.Clear();
- _seqStream.Release();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = (_stream ? _items.Size() : (UInt32)(Int32)-1);
- return S_OK;
-}
-
-CHandler::CHandler()
-{
- copyCoderSpec = new NCompress::CCopyCoder();
- copyCoder = copyCoderSpec;
-}
-
-HRESULT CHandler::SkipTo(UInt32 index)
-{
- while (_curIndex < index || !_latestIsRead)
- {
- if (_latestIsRead)
- {
- UInt64 packSize = _latestItem.GetPackSize();
- RINOK(copyCoderSpec->Code(_seqStream, NULL, &packSize, &packSize, NULL));
- _phySize += copyCoderSpec->TotalSize;
- if (copyCoderSpec->TotalSize != packSize)
- {
- _errorMessage = kUnexpectedEnd;
- return S_FALSE;
- }
- _latestIsRead = false;
- _curIndex++;
- }
- else
- {
- bool filled;
- RINOK(ReadItem2(_seqStream, filled, _latestItem));
- if (!filled)
- {
- _phySizeDefined = true;
- return E_INVALIDARG;
- }
- _latestIsRead = true;
- }
- }
- return S_OK;
-}
-
-static UString TarStringToUnicode(const AString &s)
-{
- return MultiByteToUnicodeString(s, CP_OEMCP);
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- const CItemEx *item;
- if (_stream)
- item = &_items[index];
- else
- {
- if (index < _curIndex)
- return E_INVALIDARG;
- else
- {
- RINOK(SkipTo(index));
- item = &_latestItem;
- }
- }
-
- switch(propID)
- {
- case kpidPath: prop = NItemName::GetOSName2(TarStringToUnicode(item->Name)); break;
- case kpidIsDir: prop = item->IsDir(); break;
- case kpidSize: prop = item->GetUnpackSize(); break;
- case kpidPackSize: prop = item->GetPackSize(); break;
- case kpidMTime:
- if (item->MTime != 0)
- {
- FILETIME ft;
- NTime::UnixTimeToFileTime(item->MTime, ft);
- prop = ft;
- }
- break;
- case kpidPosixAttrib: prop = item->Mode; break;
- case kpidUser: prop = TarStringToUnicode(item->User); break;
- case kpidGroup: prop = TarStringToUnicode(item->Group); break;
- case kpidLink: prop = TarStringToUnicode(item->LinkName); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- ISequentialInStream *stream = _seqStream;
- bool seqMode = (_stream == NULL);
- if (!seqMode)
- stream = _stream;
-
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (_stream && numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items[allFilesMode ? i : indices[i]].GetUnpackSize();
- extractCallback->SetTotal(totalSize);
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(stream);
-
- CLimitedSequentialOutStream *outStreamSpec = new CLimitedSequentialOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
-
- for (i = 0; i < numItems || seqMode; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItemEx *item;
- if (seqMode)
- {
- HRESULT res = SkipTo(index);
- if (res == E_INVALIDARG)
- break;
- RINOK(res);
- item = &_latestItem;
- }
- else
- item = &_items[index];
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- UInt64 unpackSize = item->GetUnpackSize();
- totalSize += unpackSize;
- totalPackSize += item->GetPackSize();
- if (item->IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- bool skipMode = false;
- if (!testMode && !realOutStream)
- {
- if (!seqMode)
- continue;
- skipMode = true;
- askMode = NExtract::NAskMode::kSkip;
- }
- RINOK(extractCallback->PrepareOperation(askMode));
-
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init(skipMode ? 0 : unpackSize, true);
-
- if (item->IsLink())
- {
- RINOK(WriteStream(outStreamSpec, (const char *)item->LinkName, item->LinkName.Length()));
- }
- else
- {
- if (!seqMode)
- {
- RINOK(_stream->Seek(item->GetDataPosition(), STREAM_SEEK_SET, NULL));
- }
- streamSpec->Init(item->GetPackSize());
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- }
- if (seqMode)
- {
- _latestIsRead = false;
- _curIndex++;
- }
- outStreamSpec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(outStreamSpec->GetRem() == 0 ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItemEx &item = _items[index];
- if (item.IsLink())
- {
- CBufInStream *streamSpec = new CBufInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- streamSpec->Init((const Byte *)(const char *)item.LinkName, item.LinkName.Length(), (IInArchive *)this);
- *stream = streamTemp.Detach();
- return S_OK;
- }
- return CreateLimitedInStream(_stream, item.GetDataPosition(), item.Size, stream);
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandler.h b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandler.h
deleted file mode 100644
index b19670616..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandler.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// TarHandler.h
-
-#ifndef __TAR_HANDLER_H
-#define __TAR_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "TarItem.h"
-
-namespace NArchive {
-namespace NTar {
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public IInArchiveGetStream,
- public IOutArchive,
- public CMyUnknownImp
-{
- CObjectVector<CItemEx> _items;
- CMyComPtr<IInStream> _stream;
- CMyComPtr<ISequentialInStream> _seqStream;
-
- UInt32 _curIndex;
- bool _latestIsRead;
- CItemEx _latestItem;
-
- UInt64 _phySize;
- UInt64 _headersSize;
- bool _phySizeDefined;
- AString _errorMessage;
-
- NCompress::CCopyCoder *copyCoderSpec;
- CMyComPtr<ICompressCoder> copyCoder;
-
- HRESULT ReadItem2(ISequentialInStream *stream, bool &filled, CItemEx &itemInfo);
- HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback);
- HRESULT SkipTo(UInt32 index);
-
-public:
- MY_UNKNOWN_IMP4(
- IInArchive,
- IArchiveOpenSeq,
- IInArchiveGetStream,
- IOutArchive
- )
-
- INTERFACE_IInArchive(;)
- INTERFACE_IOutArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-
- CHandler();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandlerOut.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandlerOut.cpp
deleted file mode 100644
index ffdf2b136..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHandlerOut.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-// TarHandlerOut.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "TarHandler.h"
-#include "TarUpdate.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NTar {
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *type)
-{
- *type = NFileTimeType::kUnix;
- return S_OK;
-}
-
-static HRESULT GetPropString(IArchiveUpdateCallback *callback, UInt32 index, PROPID propId, AString &res)
-{
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(index, propId, &prop));
- if (prop.vt == VT_BSTR)
- res = UnicodeStringToMultiByte(prop.bstrVal, CP_OEMCP);
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *callback)
-{
- COM_TRY_BEGIN
- if ((_stream && !_errorMessage.IsEmpty()) || _seqStream)
- return E_NOTIMPL;
- CObjectVector<CUpdateItem> updateItems;
- for (UInt32 i = 0; i < numItems; i++)
- {
- CUpdateItem ui;
- Int32 newData;
- Int32 newProps;
- UInt32 indexInArchive;
- if (!callback)
- return E_FAIL;
- RINOK(callback->GetUpdateItemInfo(i, &newData, &newProps, &indexInArchive));
- ui.NewProps = IntToBool(newProps);
- ui.NewData = IntToBool(newData);
- ui.IndexInArchive = indexInArchive;
- ui.IndexInClient = i;
-
- if (IntToBool(newProps))
- {
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidIsDir, &prop));
- if (prop.vt == VT_EMPTY)
- ui.IsDir = false;
- else if (prop.vt != VT_BOOL)
- return E_INVALIDARG;
- else
- ui.IsDir = (prop.boolVal != VARIANT_FALSE);
- }
-
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidPosixAttrib, &prop));
- if (prop.vt == VT_EMPTY)
- ui.Mode = 0777 | (ui.IsDir ? 0040000 : 0100000);
- else if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- else
- ui.Mode = prop.ulVal;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidMTime, &prop));
- if (prop.vt == VT_EMPTY)
- ui.Time = 0;
- else if (prop.vt != VT_FILETIME)
- return E_INVALIDARG;
- else if (!NTime::FileTimeToUnixTime(prop.filetime, ui.Time))
- ui.Time = 0;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidPath, &prop));
- if (prop.vt == VT_BSTR)
- ui.Name = UnicodeStringToMultiByte(NItemName::MakeLegalName(prop.bstrVal), CP_OEMCP);
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- if (ui.IsDir)
- ui.Name += '/';
- }
- RINOK(GetPropString(callback, i, kpidUser, ui.User));
- RINOK(GetPropString(callback, i, kpidGroup, ui.Group));
- }
- if (IntToBool(newData))
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- ui.Size = prop.uhVal.QuadPart;
- /*
- // now we support GNU extension for big files
- if (ui.Size >= ((UInt64)1 << 33))
- return E_INVALIDARG;
- */
- }
- updateItems.Add(ui);
- }
- return UpdateArchive(_stream, outStream, _items, updateItems, callback);
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHeader.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHeader.cpp
deleted file mode 100644
index 3275b284c..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHeader.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// Archive/Tar/Header.h
-
-#include "StdAfx.h"
-
-#include "TarHeader.h"
-
-namespace NArchive {
-namespace NTar {
-namespace NFileHeader {
-
- // The checksum field is filled with this while the checksum is computed.
- const char *kCheckSumBlanks = " "; // 8 blanks, no null
-
- const char *kLongLink = "././@LongLink";
- const char *kLongLink2 = "@LongLink";
-
- // The magic field is filled with this if uname and gname are valid.
- namespace NMagic
- {
- const char *kUsTar = "ustar"; // 5 chars
- const char *kGNUTar = "GNUtar "; // 7 chars and a null
- const char *kEmpty = "\0\0\0\0\0\0\0\0"; // 7 chars and a null
- }
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHeader.h b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHeader.h
deleted file mode 100644
index 0b78bdc26..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarHeader.h
+++ /dev/null
@@ -1,108 +0,0 @@
-// Archive/Tar/Header.h
-
-#ifndef __ARCHIVE_TAR_HEADER_H
-#define __ARCHIVE_TAR_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NTar {
-
-namespace NFileHeader
-{
- const int kRecordSize = 512;
- const int kNameSize = 100;
- const int kUserNameSize = 32;
- const int kGroupNameSize = 32;
- const int kPrefixSize = 155;
-
- /*
- struct CHeader
- {
- char Name[kNameSize];
- char Mode[8];
- char UID[8];
- char GID[8];
- char Size[12];
- char ModificationTime[12];
- char CheckSum[8];
- char LinkFlag;
- char LinkName[kNameSize];
- char Magic[8];
- char UserName[kUserNameSize];
- char GroupName[kGroupNameSize];
- char DeviceMajor[8];
- char DeviceMinor[8];
- char Prefix[155];
- };
- union CRecord
- {
- CHeader Header;
- Byte Padding[kRecordSize];
- };
- */
-
- namespace NMode
- {
- const int kSetUID = 04000; // Set UID on execution
- const int kSetGID = 02000; // Set GID on execution
- const int kSaveText = 01000; // Save text (sticky bit)
- }
-
- namespace NFilePermissions
- {
- const int kUserRead = 00400; // read by owner
- const int kUserWrite = 00200; // write by owner
- const int kUserExecute = 00100; // execute/search by owner
- const int kGroupRead = 00040; // read by group
- const int kGroupWrite = 00020; // write by group
- const int kGroupExecute = 00010; // execute/search by group
- const int kOtherRead = 00004; // read by other
- const int kOtherWrite = 00002; // write by other
- const int kOtherExecute = 00001; // execute/search by other
- }
-
-
- // The linkflag defines the type of file
- namespace NLinkFlag
- {
- const char kOldNormal = '\0'; // Normal disk file, Unix compatible
- const char kNormal = '0'; // Normal disk file
- const char kLink = '1'; // Link to previously dumped file
- const char kSymbolicLink = '2'; // Symbolic link
- const char kCharacter = '3'; // Character special file
- const char kBlock = '4'; // Block special file
- const char kDirectory = '5'; // Directory
- const char kFIFO = '6'; // FIFO special file
- const char kContiguous = '7'; // Contiguous file
-
- const char kDumpDir = 'D'; /* GNUTYPE_DUMPDIR.
- data: list of files created by the --incremental (-G) option
- Each file name is preceded by either
- - 'Y' (file should be in this archive)
- - 'N' (file is a directory, or is not stored in the archive.)
- Each file name is terminated by a null + an additional null after
- the last file name. */
-
- }
- // Further link types may be defined later.
-
- // The checksum field is filled with this while the checksum is computed.
- extern const char *kCheckSumBlanks;// = " "; // 8 blanks, no null
-
- extern const char *kLongLink; // = "././@LongLink";
- extern const char *kLongLink2; // = "@LongLink";
-
- // The magic field is filled with this if uname and gname are valid.
- namespace NMagic
- {
- extern const char *kUsTar; // = "ustar"; // 5 chars
- extern const char *kGNUTar; // = "GNUtar "; // 7 chars and a null
- extern const char *kEmpty; // = "GNUtar "; // 7 chars and a null
- }
-
-}
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarIn.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarIn.cpp
deleted file mode 100644
index 311ac1786..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarIn.cpp
+++ /dev/null
@@ -1,207 +0,0 @@
-// TarIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/StringToInt.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "TarIn.h"
-
-namespace NArchive {
-namespace NTar {
-
-static void MyStrNCpy(char *dest, const char *src, int size)
-{
- for (int i = 0; i < size; i++)
- {
- char c = src[i];
- dest[i] = c;
- if (c == 0)
- break;
- }
-}
-
-static bool OctalToNumber(const char *srcString, int size, UInt64 &res)
-{
- char sz[32];
- MyStrNCpy(sz, srcString, size);
- sz[size] = 0;
- const char *end;
- int i;
- for (i = 0; sz[i] == ' '; i++) {}
- res = ConvertOctStringToUInt64(sz + i, &end);
- return (*end == ' ' || *end == 0);
-}
-
-static bool OctalToNumber32(const char *srcString, int size, UInt32 &res)
-{
- UInt64 res64;
- if (!OctalToNumber(srcString, size, res64))
- return false;
- res = (UInt32)res64;
- return (res64 <= 0xFFFFFFFF);
-}
-
-#define RIF(x) { if (!(x)) return S_FALSE; }
-
-static bool IsRecordLast(const char *buf)
-{
- for (int i = 0; i < NFileHeader::kRecordSize; i++)
- if (buf[i] != 0)
- return false;
- return true;
-}
-
-static void ReadString(const char *s, int size, AString &result)
-{
- char temp[NFileHeader::kRecordSize + 1];
- MyStrNCpy(temp, s, size);
- temp[size] = '\0';
- result = temp;
-}
-
-static HRESULT GetNextItemReal(ISequentialInStream *stream, bool &filled, CItemEx &item, AString &error)
-{
- char buf[NFileHeader::kRecordSize];
- char *p = buf;
-
- error.Empty();
- filled = false;
-
- bool thereAreEmptyRecords = false;
- for (;;)
- {
- size_t processedSize = NFileHeader::kRecordSize;
- RINOK(ReadStream(stream, buf, &processedSize));
- if (processedSize == 0)
- {
- if (!thereAreEmptyRecords )
- error = "There are no trailing zero-filled records";
- return S_OK;
- }
- if (processedSize != NFileHeader::kRecordSize)
- {
- error = "There is no correct record at the end of archive";
- return S_OK;
- }
- item.HeaderSize += NFileHeader::kRecordSize;
- if (!IsRecordLast(buf))
- break;
- thereAreEmptyRecords = true;
- }
- if (thereAreEmptyRecords)
- {
- error = "There are data after end of archive";
- return S_OK;
- }
-
- ReadString(p, NFileHeader::kNameSize, item.Name); p += NFileHeader::kNameSize;
-
- RIF(OctalToNumber32(p, 8, item.Mode)); p += 8;
-
- if (!OctalToNumber32(p, 8, item.UID)) item.UID = 0; p += 8;
- if (!OctalToNumber32(p, 8, item.GID)) item.GID = 0; p += 8;
-
- if (GetBe32(p) == (UInt32)1 << 31)
- {
- // GNU extension
- item.Size = GetBe64(p + 4);
- }
- else
- {
- RIF(OctalToNumber(p, 12, item.Size));
- }
- p += 12;
- RIF(OctalToNumber32(p, 12, item.MTime)); p += 12;
-
- UInt32 checkSum;
- RIF(OctalToNumber32(p, 8, checkSum));
- memcpy(p, NFileHeader::kCheckSumBlanks, 8); p += 8;
-
- item.LinkFlag = *p++;
-
- ReadString(p, NFileHeader::kNameSize, item.LinkName); p += NFileHeader::kNameSize;
-
- memcpy(item.Magic, p, 8); p += 8;
-
- ReadString(p, NFileHeader::kUserNameSize, item.User); p += NFileHeader::kUserNameSize;
- ReadString(p, NFileHeader::kGroupNameSize, item.Group); p += NFileHeader::kGroupNameSize;
-
- item.DeviceMajorDefined = (p[0] != 0); RIF(OctalToNumber32(p, 8, item.DeviceMajor)); p += 8;
- item.DeviceMinorDefined = (p[0] != 0); RIF(OctalToNumber32(p, 8, item.DeviceMinor)); p += 8;
-
- AString prefix;
- ReadString(p, NFileHeader::kPrefixSize, prefix);
- p += NFileHeader::kPrefixSize;
- if (!prefix.IsEmpty() && item.IsMagic() &&
- (item.LinkFlag != 'L' /* || prefix != "00000000000" */ ))
- item.Name = prefix + AString('/') + item.Name;
-
- if (item.LinkFlag == NFileHeader::NLinkFlag::kLink)
- item.Size = 0;
-
- UInt32 checkSumReal = 0;
- for (int i = 0; i < NFileHeader::kRecordSize; i++)
- checkSumReal += (Byte)buf[i];
-
- if (checkSumReal != checkSum)
- return S_FALSE;
-
- filled = true;
- return S_OK;
-}
-
-HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &item, AString &error)
-{
- item.HeaderSize = 0;
- bool flagL = false;
- bool flagK = false;
- AString nameL;
- AString nameK;
- for (;;)
- {
- RINOK(GetNextItemReal(stream, filled, item, error));
- if (!filled)
- return S_OK;
- if (item.LinkFlag == 'L' || // NEXT file has a long name
- item.LinkFlag == 'K') // NEXT file has a long linkname
- {
- AString *name;
- if (item.LinkFlag == 'L')
- { if (flagL) return S_FALSE; flagL = true; name = &nameL; }
- else
- { if (flagK) return S_FALSE; flagK = true; name = &nameK; }
-
- if (item.Name.Compare(NFileHeader::kLongLink) != 0 &&
- item.Name.Compare(NFileHeader::kLongLink2) != 0)
- return S_FALSE;
- if (item.Size > (1 << 14))
- return S_FALSE;
- int packSize = (int)item.GetPackSize();
- char *buf = name->GetBuffer(packSize);
- RINOK(ReadStream_FALSE(stream, buf, packSize));
- item.HeaderSize += packSize;
- buf[(size_t)item.Size] = '\0';
- name->ReleaseBuffer();
- continue;
- }
- if (item.LinkFlag == 'g' || item.LinkFlag == 'x' || item.LinkFlag == 'X')
- {
- // pax Extended Header
- }
- else if (item.LinkFlag == NFileHeader::NLinkFlag::kDumpDir)
- {
- // GNU Extensions to the Archive Format
- }
- else if (item.LinkFlag > '7' || (item.LinkFlag < '0' && item.LinkFlag != 0))
- return S_FALSE;
- if (flagL) item.Name = nameL;
- if (flagK) item.LinkName = nameK;
- return S_OK;
- }
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarIn.h b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarIn.h
deleted file mode 100644
index a5491ebe4..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarIn.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// TarIn.h
-
-#ifndef __ARCHIVE_TAR_IN_H
-#define __ARCHIVE_TAR_IN_H
-
-#include "../../IStream.h"
-
-#include "TarItem.h"
-
-namespace NArchive {
-namespace NTar {
-
-HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &itemInfo, AString &error);
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarItem.h b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarItem.h
deleted file mode 100644
index 859e66dd8..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarItem.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// TarItem.h
-
-#ifndef __ARCHIVE_TAR_ITEM_H
-#define __ARCHIVE_TAR_ITEM_H
-
-#include "../Common/ItemNameUtils.h"
-
-#include "TarHeader.h"
-
-namespace NArchive {
-namespace NTar {
-
-struct CItem
-{
- AString Name;
- UInt64 Size;
-
- UInt32 Mode;
- UInt32 UID;
- UInt32 GID;
- UInt32 MTime;
- UInt32 DeviceMajor;
- UInt32 DeviceMinor;
-
- AString LinkName;
- AString User;
- AString Group;
-
- char Magic[8];
- char LinkFlag;
- bool DeviceMajorDefined;
- bool DeviceMinorDefined;
-
- bool IsLink() const { return LinkFlag == NFileHeader::NLinkFlag::kSymbolicLink && (Size == 0); }
- UInt64 GetUnpackSize() const { return IsLink() ? LinkName.Length() : Size; }
-
- bool IsDir() const
- {
- switch(LinkFlag)
- {
- case NFileHeader::NLinkFlag::kDirectory:
- case NFileHeader::NLinkFlag::kDumpDir:
- return true;
- case NFileHeader::NLinkFlag::kOldNormal:
- case NFileHeader::NLinkFlag::kNormal:
- return NItemName::HasTailSlash(Name, CP_OEMCP);
- }
- return false;
- }
-
- bool IsMagic() const
- {
- for (int i = 0; i < 5; i++)
- if (Magic[i] != NFileHeader::NMagic::kUsTar[i])
- return false;
- return true;
- }
-
- UInt64 GetPackSize() const { return (Size + 0x1FF) & (~((UInt64)0x1FF)); }
-};
-
-struct CItemEx: public CItem
-{
- UInt64 HeaderPos;
- unsigned HeaderSize;
- UInt64 GetDataPosition() const { return HeaderPos + HeaderSize; }
- UInt64 GetFullSize() const { return HeaderSize + Size; }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarOut.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarOut.cpp
deleted file mode 100644
index e542a3b2f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarOut.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-// TarOut.cpp
-
-#include "StdAfx.h"
-
-#include "Common/IntToString.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "TarOut.h"
-
-namespace NArchive {
-namespace NTar {
-
-HRESULT COutArchive::WriteBytes(const void *buffer, UInt32 size)
-{
- return WriteStream(m_Stream, buffer, size);
-}
-
-void COutArchive::Create(ISequentialOutStream *outStream)
-{
- m_Stream = outStream;
-}
-
-static AString MakeOctalString(UInt64 value)
-{
- char s[32];
- ConvertUInt64ToString(value, s, 8);
- return AString(s) + ' ';
-}
-
-static void MyStrNCpy(char *dest, const char *src, int size)
-{
- for (int i = 0; i < size; i++)
- {
- char c = src[i];
- dest[i] = c;
- if (c == 0)
- break;
- }
-}
-
-static bool MakeOctalString8(char *s, UInt32 value)
-{
- AString tempString = MakeOctalString(value);
-
- const int kMaxSize = 8;
- if (tempString.Length() >= kMaxSize)
- return false;
- int numSpaces = kMaxSize - (tempString.Length() + 1);
- for(int i = 0; i < numSpaces; i++)
- s[i] = ' ';
- MyStringCopy(s + numSpaces, (const char *)tempString);
- return true;
-}
-
-static void MakeOctalString12(char *s, UInt64 value)
-{
- AString tempString = MakeOctalString(value);
- const int kMaxSize = 12;
- if (tempString.Length() > kMaxSize)
- {
- // GNU extension;
- s[0] = (char)(Byte)0x80;
- s[1] = s[2] = s[3] = 0;
- for (int i = 0; i < 8; i++, value <<= 8)
- s[4 + i] = (char)(value >> 56);
- return;
- }
- int numSpaces = kMaxSize - tempString.Length();
- for(int i = 0; i < numSpaces; i++)
- s[i] = ' ';
- memmove(s + numSpaces, (const char *)tempString, tempString.Length());
-}
-
-static bool CopyString(char *dest, const AString &src, int maxSize)
-{
- if (src.Length() >= maxSize)
- return false;
- MyStringCopy(dest, (const char *)src);
- return true;
-}
-
-#define RETURN_IF_NOT_TRUE(x) { if (!(x)) return E_FAIL; }
-
-HRESULT COutArchive::WriteHeaderReal(const CItem &item)
-{
- char record[NFileHeader::kRecordSize];
- char *cur = record;
- int i;
- for (i = 0; i < NFileHeader::kRecordSize; i++)
- record[i] = 0;
-
- // RETURN_IF_NOT_TRUE(CopyString(header.Name, item.Name, NFileHeader::kNameSize));
- if (item.Name.Length() > NFileHeader::kNameSize)
- return E_FAIL;
- MyStrNCpy(cur, item.Name, NFileHeader::kNameSize);
- cur += NFileHeader::kNameSize;
-
- RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.Mode)); cur += 8;
- RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.UID)); cur += 8;
- RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.GID)); cur += 8;
-
- MakeOctalString12(cur, item.Size); cur += 12;
- MakeOctalString12(cur, item.MTime); cur += 12;
-
- memmove(cur, NFileHeader::kCheckSumBlanks, 8);
- cur += 8;
-
- *cur++ = item.LinkFlag;
-
- RETURN_IF_NOT_TRUE(CopyString(cur, item.LinkName, NFileHeader::kNameSize));
- cur += NFileHeader::kNameSize;
-
- memmove(cur, item.Magic, 8);
- cur += 8;
-
- RETURN_IF_NOT_TRUE(CopyString(cur, item.User, NFileHeader::kUserNameSize));
- cur += NFileHeader::kUserNameSize;
- RETURN_IF_NOT_TRUE(CopyString(cur, item.Group, NFileHeader::kGroupNameSize));
- cur += NFileHeader::kGroupNameSize;
-
-
- if (item.DeviceMajorDefined)
- RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.DeviceMajor));
- cur += 8;
-
- if (item.DeviceMinorDefined)
- RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.DeviceMinor));
- cur += 8;
-
-
- UInt32 checkSumReal = 0;
- for(i = 0; i < NFileHeader::kRecordSize; i++)
- checkSumReal += Byte(record[i]);
-
- RETURN_IF_NOT_TRUE(MakeOctalString8(record + 148, checkSumReal));
-
- return WriteBytes(record, NFileHeader::kRecordSize);
-}
-
-HRESULT COutArchive::WriteHeader(const CItem &item)
-{
- int nameSize = item.Name.Length();
- if (nameSize < NFileHeader::kNameSize)
- return WriteHeaderReal(item);
-
- CItem modifiedItem = item;
- int nameStreamSize = nameSize + 1;
- modifiedItem.Size = nameStreamSize;
- modifiedItem.LinkFlag = 'L';
- modifiedItem.Name = NFileHeader::kLongLink;
- modifiedItem.LinkName.Empty();
- RINOK(WriteHeaderReal(modifiedItem));
- RINOK(WriteBytes(item.Name, nameStreamSize));
- RINOK(FillDataResidual(nameStreamSize));
-
- modifiedItem = item;
- modifiedItem.Name = item.Name.Left(NFileHeader::kNameSize - 1);
- return WriteHeaderReal(modifiedItem);
-}
-
-HRESULT COutArchive::FillDataResidual(UInt64 dataSize)
-{
- UInt32 lastRecordSize = UInt32(dataSize & (NFileHeader::kRecordSize - 1));
- if (lastRecordSize == 0)
- return S_OK;
- UInt32 residualSize = NFileHeader::kRecordSize - lastRecordSize;
- Byte residualBytes[NFileHeader::kRecordSize];
- for (UInt32 i = 0; i < residualSize; i++)
- residualBytes[i] = 0;
- return WriteBytes(residualBytes, residualSize);
-}
-
-HRESULT COutArchive::WriteFinishHeader()
-{
- Byte record[NFileHeader::kRecordSize];
- int i;
- for (i = 0; i < NFileHeader::kRecordSize; i++)
- record[i] = 0;
- for (i = 0; i < 2; i++)
- {
- RINOK(WriteBytes(record, NFileHeader::kRecordSize));
- }
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarOut.h b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarOut.h
deleted file mode 100644
index ef837869b..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarOut.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Archive/TarOut.h
-
-#ifndef __ARCHIVE_TAR_OUT_H
-#define __ARCHIVE_TAR_OUT_H
-
-#include "TarItem.h"
-
-#include "Common/MyCom.h"
-#include "../../IStream.h"
-
-namespace NArchive {
-namespace NTar {
-
-class COutArchive
-{
- CMyComPtr<ISequentialOutStream> m_Stream;
- HRESULT WriteBytes(const void *buffer, UInt32 size);
-public:
- void Create(ISequentialOutStream *outStream);
- HRESULT WriteHeaderReal(const CItem &item);
- HRESULT WriteHeader(const CItem &item);
- HRESULT FillDataResidual(UInt64 dataSize);
- HRESULT WriteFinishHeader();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarRegister.cpp
deleted file mode 100644
index e21c0aac4..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarRegister.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// TarRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "TarHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NTar::CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new NArchive::NTar::CHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
-{ L"tar", L"tar", 0, 0xEE, { 'u', 's', 't', 'a', 'r' }, 5, false, CreateArc, CreateArcOut };
-
-REGISTER_ARC(Tar)
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarUpdate.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarUpdate.cpp
deleted file mode 100644
index c16332189..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarUpdate.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-// TarUpdate.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "TarOut.h"
-#include "TarUpdate.h"
-
-namespace NArchive {
-namespace NTar {
-
-HRESULT UpdateArchive(IInStream *inStream, ISequentialOutStream *outStream,
- const CObjectVector<NArchive::NTar::CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- IArchiveUpdateCallback *updateCallback)
-{
- COutArchive outArchive;
- outArchive.Create(outStream);
-
- UInt64 complexity = 0;
-
- int i;
- for(i = 0; i < updateItems.Size(); i++)
- {
- const CUpdateItem &ui = updateItems[i];
- if (ui.NewData)
- complexity += ui.Size;
- else
- complexity += inputItems[ui.IndexInArchive].GetFullSize();
- }
-
- RINOK(updateCallback->SetTotal(complexity));
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(updateCallback, true);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<CLimitedSequentialInStream> inStreamLimited(streamSpec);
- streamSpec->SetStream(inStream);
-
- complexity = 0;
-
- for(i = 0; i < updateItems.Size(); i++)
- {
- lps->InSize = lps->OutSize = complexity;
- RINOK(lps->SetCur());
-
- const CUpdateItem &ui = updateItems[i];
- CItem item;
- if (ui.NewProps)
- {
- item.Mode = ui.Mode;
- item.Name = ui.Name;
- item.User = ui.User;
- item.Group = ui.Group;
- if (ui.IsDir)
- {
- item.LinkFlag = NFileHeader::NLinkFlag::kDirectory;
- item.Size = 0;
- }
- else
- {
- item.LinkFlag = NFileHeader::NLinkFlag::kNormal;
- item.Size = ui.Size;
- }
- item.MTime = ui.Time;
- item.DeviceMajorDefined = false;
- item.DeviceMinorDefined = false;
- item.UID = 0;
- item.GID = 0;
- memmove(item.Magic, NFileHeader::NMagic::kEmpty, 8);
- }
- else
- item = inputItems[ui.IndexInArchive];
-
- if (ui.NewData)
- {
- item.Size = ui.Size;
- if (item.Size == (UInt64)(Int64)-1)
- return E_INVALIDARG;
- }
- else
- item.Size = inputItems[ui.IndexInArchive].Size;
-
- if (ui.NewData)
- {
- CMyComPtr<ISequentialInStream> fileInStream;
- HRESULT res = updateCallback->GetStream(ui.IndexInClient, &fileInStream);
- if (res != S_FALSE)
- {
- RINOK(res);
- RINOK(outArchive.WriteHeader(item));
- if (!ui.IsDir)
- {
- RINOK(copyCoder->Code(fileInStream, outStream, NULL, NULL, progress));
- if (copyCoderSpec->TotalSize != item.Size)
- return E_FAIL;
- RINOK(outArchive.FillDataResidual(item.Size));
- }
- }
- complexity += ui.Size;
- RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- }
- else
- {
- const CItemEx &existItem = inputItems[ui.IndexInArchive];
- UInt64 size;
- if (ui.NewProps)
- {
- RINOK(outArchive.WriteHeader(item));
- RINOK(inStream->Seek(existItem.GetDataPosition(), STREAM_SEEK_SET, NULL));
- size = existItem.Size;
- }
- else
- {
- RINOK(inStream->Seek(existItem.HeaderPos, STREAM_SEEK_SET, NULL));
- size = existItem.GetFullSize();
- }
- streamSpec->Init(size);
-
- RINOK(copyCoder->Code(inStreamLimited, outStream, NULL, NULL, progress));
- if (copyCoderSpec->TotalSize != size)
- return E_FAIL;
- RINOK(outArchive.FillDataResidual(existItem.Size));
- complexity += size;
- }
- }
- return outArchive.WriteFinishHeader();
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarUpdate.h b/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarUpdate.h
deleted file mode 100644
index fb217d196..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Tar/TarUpdate.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// TarUpdate.h
-
-#ifndef __TAR_UPDATE_H
-#define __TAR_UPDATE_H
-
-#include "../IArchive.h"
-#include "TarItem.h"
-
-namespace NArchive {
-namespace NTar {
-
-struct CUpdateItem
-{
- int IndexInArchive;
- int IndexInClient;
- UInt32 Time;
- UInt32 Mode;
- UInt64 Size;
- AString Name;
- AString User;
- AString Group;
- bool NewData;
- bool NewProps;
- bool IsDir;
-};
-
-HRESULT UpdateArchive(IInStream *inStream, ISequentialOutStream *outStream,
- const CObjectVector<CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- IArchiveUpdateCallback *updateCallback);
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfHandler.cpp
deleted file mode 100644
index c70852728..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfHandler.cpp
+++ /dev/null
@@ -1,451 +0,0 @@
-// UdfHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamObjects.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "UdfHandler.h"
-
-namespace NArchive {
-namespace NUdf {
-
-void UdfTimeToFileTime(const CTime &t, NWindows::NCOM::CPropVariant &prop)
-{
- UInt64 numSecs;
- const Byte *d = t.Data;
- if (!NWindows::NTime::GetSecondsSince1601(t.GetYear(), d[4], d[5], d[6], d[7], d[8], numSecs))
- return;
- if (t.IsLocal())
- numSecs -= t.GetMinutesOffset() * 60;
- FILETIME ft;
- UInt64 v = (((numSecs * 100 + d[9]) * 100 + d[10]) * 100 + d[11]) * 10;
- ft.dwLowDateTime = (UInt32)v;
- ft.dwHighDateTime = (UInt32)(v >> 32);
- prop = ft;
-}
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME}
-};
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidCTime, VT_FILETIME}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidComment:
- {
- UString comment = _archive.GetComment();
- if (!comment.IsEmpty())
- prop = comment;
- break;
- }
-
- case kpidClusterSize:
- if (_archive.LogVols.Size() > 0)
- {
- UInt32 blockSize = _archive.LogVols[0].BlockSize;
- int i;
- for (i = 1; i < _archive.LogVols.Size(); i++)
- if (_archive.LogVols[i].BlockSize != blockSize)
- break;
- if (i == _archive.LogVols.Size())
- prop = blockSize;
- }
- break;
-
- case kpidCTime:
- if (_archive.LogVols.Size() == 1)
- {
- const CLogVol &vol = _archive.LogVols[0];
- if (vol.FileSets.Size() >= 1)
- UdfTimeToFileTime(vol.FileSets[0].RecodringTime, prop);
- }
- break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CProgressImp: public CProgressVirt
-{
- CMyComPtr<IArchiveOpenCallback> _callback;
- UInt64 _numFiles;
- UInt64 _numBytes;
-public:
- HRESULT SetTotal(UInt64 numBytes);
- HRESULT SetCompleted(UInt64 numFiles, UInt64 numBytes);
- HRESULT SetCompleted();
- CProgressImp(IArchiveOpenCallback *callback): _callback(callback), _numFiles(0), _numBytes(0) {}
-};
-
-HRESULT CProgressImp::SetTotal(UInt64 numBytes)
-{
- if (_callback)
- return _callback->SetTotal(NULL, &numBytes);
- return S_OK;
-}
-
-HRESULT CProgressImp::SetCompleted(UInt64 numFiles, UInt64 numBytes)
-{
- _numFiles = numFiles;
- _numBytes = numBytes;
- return SetCompleted();
-}
-
-HRESULT CProgressImp::SetCompleted()
-{
- if (_callback)
- return _callback->SetCompleted(&_numFiles, &_numBytes);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- {
- Close();
- CProgressImp progressImp(callback);
- RINOK(_archive.Open(stream, &progressImp));
- bool showVolName = (_archive.LogVols.Size() > 1);
- for (int volIndex = 0; volIndex < _archive.LogVols.Size(); volIndex++)
- {
- const CLogVol &vol = _archive.LogVols[volIndex];
- bool showFileSetName = (vol.FileSets.Size() > 1);
- for (int fsIndex = 0; fsIndex < vol.FileSets.Size(); fsIndex++)
- {
- const CFileSet &fs = vol.FileSets[fsIndex];
- for (int i = ((showVolName || showFileSetName) ? 0 : 1); i < fs.Refs.Size(); i++)
- {
- CRef2 ref2;
- ref2.Vol = volIndex;
- ref2.Fs = fsIndex;
- ref2.Ref = i;
- _refs2.Add(ref2);
- }
- }
- }
- _inStream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _inStream.Release();
- _archive.Clear();
- _refs2.Clear();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _refs2.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- {
- const CRef2 &ref2 = _refs2[index];
- const CLogVol &vol = _archive.LogVols[ref2.Vol];
- const CRef &ref = vol.FileSets[ref2.Fs].Refs[ref2.Ref];
- const CFile &file = _archive.Files[ref.FileIndex];
- const CItem &item = _archive.Items[file.ItemIndex];
- switch(propID)
- {
- case kpidPath: prop = _archive.GetItemPath(ref2.Vol, ref2.Fs, ref2.Ref,
- _archive.LogVols.Size() > 1, vol.FileSets.Size() > 1); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: if (!item.IsDir()) prop = (UInt64)item.Size; break;
- case kpidPackSize: if (!item.IsDir()) prop = (UInt64)item.NumLogBlockRecorded * vol.BlockSize; break;
- case kpidMTime: UdfTimeToFileTime(item.MTime, prop); break;
- case kpidATime: UdfTimeToFileTime(item.ATime, prop); break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-struct CSeekExtent
-{
- UInt64 Phy;
- UInt64 Virt;
-};
-
-class CExtentsStream:
- public IInStream,
- public CMyUnknownImp
-{
- UInt64 _phyPos;
- UInt64 _virtPos;
- bool _needStartSeek;
-
- HRESULT SeekToPhys() { return Stream->Seek(_phyPos, STREAM_SEEK_SET, NULL); }
-
-public:
- CMyComPtr<IInStream> Stream;
- CRecordVector<CSeekExtent> Extents;
-
- MY_UNKNOWN_IMP1(IInStream)
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
- void ReleaseStream() { Stream.Release(); }
-
- void Init()
- {
- _virtPos = 0;
- _phyPos = 0;
- _needStartSeek = true;
- }
-
-};
-
-
-STDMETHODIMP CExtentsStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (size > 0)
- {
- UInt64 totalSize = Extents.Back().Virt;
- if (_virtPos >= totalSize)
- return (_virtPos == totalSize) ? S_OK : E_FAIL;
- int left = 0, right = Extents.Size() - 1;
- for (;;)
- {
- int mid = (left + right) / 2;
- if (mid == left)
- break;
- if (_virtPos < Extents[mid].Virt)
- right = mid;
- else
- left = mid;
- }
-
- const CSeekExtent &extent = Extents[left];
- UInt64 phyPos = extent.Phy + (_virtPos - extent.Virt);
- if (_needStartSeek || _phyPos != phyPos)
- {
- _needStartSeek = false;
- _phyPos = phyPos;
- RINOK(SeekToPhys());
- }
-
- UInt64 rem = Extents[left + 1].Virt - _virtPos;
- if (size > rem)
- size = (UInt32)rem;
-
- HRESULT res = Stream->Read(data, size, &size);
- _phyPos += size;
- _virtPos += size;
- if (processedSize)
- *processedSize = size;
- return res;
- }
- return S_OK;
-}
-
-STDMETHODIMP CExtentsStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch(seekOrigin)
- {
- case STREAM_SEEK_SET: _virtPos = offset; break;
- case STREAM_SEEK_CUR: _virtPos += offset; break;
- case STREAM_SEEK_END: _virtPos = Extents.Back().Virt + offset; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- *stream = 0;
-
- const CRef2 &ref2 = _refs2[index];
- const CLogVol &vol = _archive.LogVols[ref2.Vol];
- const CRef &ref = vol.FileSets[ref2.Fs].Refs[ref2.Ref];
- const CFile &file = _archive.Files[ref.FileIndex];
- const CItem &item = _archive.Items[file.ItemIndex];
- UInt64 size = item.Size;
-
- if (!item.IsRecAndAlloc() || !item.CheckChunkSizes() || ! _archive.CheckItemExtents(ref2.Vol, item))
- return E_NOTIMPL;
-
- if (item.IsInline)
- {
- CBufInStream *inStreamSpec = new CBufInStream;
- CMyComPtr<ISequentialInStream> inStream = inStreamSpec;
- CReferenceBuf *referenceBuf = new CReferenceBuf;
- CMyComPtr<IUnknown> ref = referenceBuf;
- referenceBuf->Buf = item.InlineData;
- inStreamSpec->Init(referenceBuf);
- *stream = inStream.Detach();
- return S_OK;
- }
-
- CExtentsStream *extentStreamSpec = new CExtentsStream();
- CMyComPtr<ISequentialInStream> extentStream = extentStreamSpec;
-
- extentStreamSpec->Stream = _inStream;
-
- UInt64 virtOffset = 0;
- for (int extentIndex = 0; extentIndex < item.Extents.Size(); extentIndex++)
- {
- const CMyExtent &extent = item.Extents[extentIndex];
- UInt32 len = extent.GetLen();
- if (len == 0)
- continue;
- if (size < len)
- return S_FALSE;
-
- int partitionIndex = vol.PartitionMaps[extent.PartitionRef].PartitionIndex;
- UInt32 logBlockNumber = extent.Pos;
- const CPartition &partition = _archive.Partitions[partitionIndex];
- UInt64 offset = ((UInt64)partition.Pos << _archive.SecLogSize) +
- (UInt64)logBlockNumber * vol.BlockSize;
-
- CSeekExtent se;
- se.Phy = offset;
- se.Virt = virtOffset;
- virtOffset += len;
- extentStreamSpec->Extents.Add(se);
-
- size -= len;
- }
- if (size != 0)
- return S_FALSE;
- CSeekExtent se;
- se.Phy = 0;
- se.Virt = virtOffset;
- extentStreamSpec->Extents.Add(se);
- extentStreamSpec->Init();
- *stream = extentStream.Detach();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _refs2.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
-
- for (i = 0; i < numItems; i++)
- {
- UInt32 index = (allFilesMode ? i : indices[i]);
- const CRef2 &ref2 = _refs2[index];
- const CRef &ref = _archive.LogVols[ref2.Vol].FileSets[ref2.Fs].Refs[ref2.Ref];
- const CFile &file = _archive.Files[ref.FileIndex];
- const CItem &item = _archive.Items[file.ItemIndex];
- if (!item.IsDir())
- totalSize += item.Size;
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialOutStream *outStreamSpec = new CLimitedSequentialOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- const CRef2 &ref2 = _refs2[index];
- const CRef &ref = _archive.LogVols[ref2.Vol].FileSets[ref2.Fs].Refs[ref2.Ref];
- const CFile &file = _archive.Files[ref.FileIndex];
- const CItem &item = _archive.Items[file.ItemIndex];
-
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- currentTotalSize += item.Size;
-
- if (!testMode && !realOutStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init(item.Size);
- Int32 opRes;
- CMyComPtr<ISequentialInStream> udfInStream;
- HRESULT res = GetStream(index, &udfInStream);
- if (res == E_NOTIMPL)
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- else if (res != S_OK)
- opRes = NExtract::NOperationResult::kDataError;
- else
- {
- RINOK(copyCoder->Code(udfInStream, outStream, NULL, NULL, progress));
- opRes = outStreamSpec->IsFinishedOK() ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError;
- }
- outStreamSpec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- return S_OK;
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfHandler.h b/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfHandler.h
deleted file mode 100644
index f513727d7..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfHandler.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Udf/Handler.h
-
-#ifndef __UDF_HANDLER_H
-#define __UDF_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-
-#include "UdfIn.h"
-
-namespace NArchive {
-namespace NUdf {
-
-struct CRef2
-{
- int Vol;
- int Fs;
- int Ref;
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _inStream;
- CInArchive _archive;
- CRecordVector<CRef2> _refs2;
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfIn.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfIn.cpp
deleted file mode 100644
index 60d5fc2ad..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfIn.cpp
+++ /dev/null
@@ -1,876 +0,0 @@
-// Archive/UdfIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "UdfIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-namespace NArchive {
-namespace NUdf {
-
-const int kNumPartitionsMax = 64;
-const int kNumLogVolumesMax = 64;
-const int kNumRecureseLevelsMax = 1 << 10;
-const int kNumItemsMax = 1 << 27;
-const int kNumFilesMax = 1 << 28;
-const int kNumRefsMax = 1 << 28;
-const UInt32 kNumExtentsMax = (UInt32)1 << 30;
-const UInt64 kFileNameLengthTotalMax = (UInt64)1 << 33;
-const UInt64 kInlineExtentsSizeMax = (UInt64)1 << 33;
-
-void MY_FAST_CALL Crc16GenerateTable(void);
-
-#define CRC16_INIT_VAL 0
-#define CRC16_GET_DIGEST(crc) (crc)
-#define CRC16_UPDATE_BYTE(crc, b) (g_Crc16Table[(((crc) >> 8) ^ (b)) & 0xFF] ^ ((crc) << 8))
-
-#define kCrc16Poly 0x1021
-UInt16 g_Crc16Table[256];
-
-void MY_FAST_CALL Crc16GenerateTable(void)
-{
- UInt32 i;
- for (i = 0; i < 256; i++)
- {
- UInt32 r = (i << 8);
- for (int j = 8; j > 0; j--)
- r = ((r & 0x8000) ? ((r << 1) ^ kCrc16Poly) : (r << 1)) & 0xFFFF;
- g_Crc16Table[i] = (UInt16)r;
- }
-}
-
-UInt16 MY_FAST_CALL Crc16_Update(UInt16 v, const void *data, size_t size)
-{
- const Byte *p = (const Byte *)data;
- for (; size > 0 ; size--, p++)
- v = CRC16_UPDATE_BYTE(v, *p);
- return v;
-}
-
-UInt16 MY_FAST_CALL Crc16Calc(const void *data, size_t size)
-{
- return Crc16_Update(CRC16_INIT_VAL, data, size);
-}
-
-struct CCrc16TableInit { CCrc16TableInit() { Crc16GenerateTable(); } } g_Crc16TableInit;
-
-void CDString128::Parse(const Byte *buf) { memcpy(Data, buf, sizeof(Data)); }
-
-void CDString::Parse(const Byte *p, unsigned size)
-{
- Data.SetCapacity(size);
- memcpy(Data, p, size);
-}
-
-static UString ParseDString(const Byte *data, int size)
-{
- UString res;
- wchar_t *p;
- if (size > 0)
- {
- Byte type = data[0];
- if (type == 8)
- {
- p = res.GetBuffer((int)size + 1);
- for (int i = 1; i < size; i++)
- {
- wchar_t c = data[i];
- if (c == 0)
- break;
- *p++ = c;
- }
- }
- else if (type == 16)
- {
- p = res.GetBuffer((int)size / 2 + 1);
- for (int i = 1; i + 2 <= size; i += 2)
- {
- wchar_t c = ((wchar_t)data[i] << 8) | data[i + 1];
- if (c == 0)
- break;
- *p++ = c;
- }
- }
- else
- return L"[unknow]";
- *p++ = 0;
- res.ReleaseBuffer();
- }
- return res;
-}
-
-UString CDString:: GetString() const { return ParseDString(Data, (int)Data.GetCapacity()); }
-UString CDString128::GetString() const
-{
- int size = Data[sizeof(Data) - 1];
- return ParseDString(Data, MyMin(size, (int)(sizeof(Data) - 1)));
-}
-
-void CTime::Parse(const Byte *buf) { memcpy(Data, buf, sizeof(Data)); }
-
-/*
-void CRegId::Parse(const Byte *buf)
-{
- Flags = buf[0];
- memcpy(Id, buf + 1, sizeof(Id));
- memcpy(Suffix, buf + 24, sizeof(Suffix));
-}
-*/
-
-// ECMA 3/7.1
-
-struct CExtent
-{
- UInt32 Len;
- UInt32 Pos;
-
- void Parse(const Byte *buf);
-};
-
-void CExtent::Parse(const Byte *buf)
-{
- Len = Get32(buf);
- Pos = Get32(buf + 4);
-}
-
-// ECMA 3/7.2
-
-struct CTag
-{
- UInt16 Id;
- UInt16 Version;
- // Byte Checksum;
- // UInt16 SerialNumber;
- // UInt16 Crc;
- // UInt16 CrcLen;
- // UInt32 TagLocation;
-
- HRESULT Parse(const Byte *buf, size_t size);
-};
-
-HRESULT CTag::Parse(const Byte *buf, size_t size)
-{
- if (size < 16)
- return S_FALSE;
- Byte sum = 0;
- int i;
- for (i = 0; i < 4; i++) sum = sum + buf[i];
- for (i = 5; i < 16; i++) sum = sum + buf[i];
- if (sum != buf[4] || buf[5] != 0) return S_FALSE;
-
- Id = Get16(buf);
- Version = Get16(buf + 2);
- // SerialNumber = Get16(buf + 6);
- UInt16 crc = Get16(buf + 8);
- UInt16 crcLen = Get16(buf + 10);
- // TagLocation = Get32(buf + 12);
-
- if (size >= 16 + (size_t)crcLen)
- if (crc == Crc16Calc(buf + 16, crcLen))
- return S_OK;
- return S_FALSE;
-}
-
-// ECMA 3/7.2.1
-
-enum EDescriptorType
-{
- DESC_TYPE_SpoaringTable = 0, // UDF
- DESC_TYPE_PrimVol = 1,
- DESC_TYPE_AnchorVolPtr = 2,
- DESC_TYPE_VolPtr = 3,
- DESC_TYPE_ImplUseVol = 4,
- DESC_TYPE_Partition = 5,
- DESC_TYPE_LogicalVol = 6,
- DESC_TYPE_UnallocSpace = 7,
- DESC_TYPE_Terminating = 8,
- DESC_TYPE_LogicalVolIntegrity = 9,
- DESC_TYPE_FileSet = 256,
- DESC_TYPE_FileId = 257,
- DESC_TYPE_AllocationExtent = 258,
- DESC_TYPE_Indirect = 259,
- DESC_TYPE_Terminal = 260,
- DESC_TYPE_File = 261,
- DESC_TYPE_ExtendedAttrHeader = 262,
- DESC_TYPE_UnallocatedSpace = 263,
- DESC_TYPE_SpaceBitmap = 264,
- DESC_TYPE_PartitionIntegrity = 265,
- DESC_TYPE_ExtendedFile = 266
-};
-
-
-void CLogBlockAddr::Parse(const Byte *buf)
-{
- Pos = Get32(buf);
- PartitionRef = Get16(buf + 4);
-}
-
-void CShortAllocDesc::Parse(const Byte *buf)
-{
- Len = Get32(buf);
- Pos = Get32(buf + 4);
-}
-
-/*
-void CADImpUse::Parse(const Byte *buf)
-{
- Flags = Get16(buf);
- UdfUniqueId = Get32(buf + 2);
-}
-*/
-
-void CLongAllocDesc::Parse(const Byte *buf)
-{
- Len = Get32(buf);
- Location.Parse(buf + 4);
- // memcpy(ImplUse, buf + 10, sizeof(ImplUse));
- // adImpUse.Parse(ImplUse);
-}
-
-bool CInArchive::CheckExtent(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len) const
-{
- const CLogVol &vol = LogVols[volIndex];
- const CPartition &partition = Partitions[vol.PartitionMaps[partitionRef].PartitionIndex];
- UInt64 offset = ((UInt64)partition.Pos << SecLogSize) + (UInt64)blockPos * vol.BlockSize;
- return (offset + len) <= (((UInt64)partition.Pos + partition.Len) << SecLogSize);
-}
-
-bool CInArchive::CheckItemExtents(int volIndex, const CItem &item) const
-{
- for (int i = 0; i < item.Extents.Size(); i++)
- {
- const CMyExtent &e = item.Extents[i];
- if (!CheckExtent(volIndex, e.PartitionRef, e.Pos, e.GetLen()))
- return false;
- }
- return true;
-}
-
-HRESULT CInArchive::Read(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len, Byte *buf)
-{
- if (!CheckExtent(volIndex, partitionRef, blockPos, len))
- return S_FALSE;
- const CLogVol &vol = LogVols[volIndex];
- const CPartition &partition = Partitions[vol.PartitionMaps[partitionRef].PartitionIndex];
- RINOK(_stream->Seek(((UInt64)partition.Pos << SecLogSize) +
- (UInt64)blockPos * vol.BlockSize, STREAM_SEEK_SET, NULL));
- return ReadStream_FALSE(_stream, buf, len);
-}
-
-HRESULT CInArchive::Read(int volIndex, const CLongAllocDesc &lad, Byte *buf)
-{
- return Read(volIndex, lad.Location.PartitionRef, lad.Location.Pos, lad.GetLen(), (Byte *)buf);
-}
-
-HRESULT CInArchive::ReadFromFile(int volIndex, const CItem &item, CByteBuffer &buf)
-{
- if (item.Size >= (UInt32)1 << 30)
- return S_FALSE;
- if (item.IsInline)
- {
- buf = item.InlineData;
- return S_OK;
- }
- buf.SetCapacity((size_t)item.Size);
- size_t pos = 0;
- for (int i = 0; i < item.Extents.Size(); i++)
- {
- const CMyExtent &e = item.Extents[i];
- UInt32 len = e.GetLen();
- RINOK(Read(volIndex, e.PartitionRef, e.Pos, len, (Byte *)buf + pos));
- pos += len;
- }
- return S_OK;
-}
-
-
-void CIcbTag::Parse(const Byte *p)
-{
- // PriorDirectNum = Get32(p);
- // StrategyType = Get16(p + 4);
- // StrategyParam = Get16(p + 6);
- // MaxNumOfEntries = Get16(p + 8);
- FileType = p[11];
- // ParentIcb.Parse(p + 12);
- Flags = Get16(p + 18);
-}
-
-void CItem::Parse(const Byte *p)
-{
- // Uid = Get32(p + 36);
- // Gid = Get32(p + 40);
- // Permissions = Get32(p + 44);
- // FileLinkCount = Get16(p + 48);
- // RecordFormat = p[50];
- // RecordDisplayAttr = p[51];
- // RecordLen = Get32(p + 52);
- Size = Get64(p + 56);
- NumLogBlockRecorded = Get64(p + 64);
- ATime.Parse(p + 72);
- MTime.Parse(p + 84);
- // AttrtTime.Parse(p + 96);
- // CheckPoint = Get32(p + 108);
- // ExtendedAttrIcb.Parse(p + 112);
- // ImplId.Parse(p + 128);
- // UniqueId = Get64(p + 160);
-}
-
-// 4/14.4
-struct CFileId
-{
- // UInt16 FileVersion;
- Byte FileCharacteristics;
- // CByteBuffer ImplUse;
- CDString Id;
- CLongAllocDesc Icb;
-
- bool IsItLinkParent() const { return (FileCharacteristics & FILEID_CHARACS_Parent) != 0; }
- HRESULT Parse(const Byte *p, size_t size, size_t &processed);
-};
-
-HRESULT CFileId::Parse(const Byte *p, size_t size, size_t &processed)
-{
- processed = 0;
- if (size < 38)
- return S_FALSE;
- CTag tag;
- RINOK(tag.Parse(p, size));
- if (tag.Id != DESC_TYPE_FileId)
- return S_FALSE;
- // FileVersion = Get16(p + 16);
- FileCharacteristics = p[18];
- unsigned idLen = p[19];
- Icb.Parse(p + 20);
- unsigned impLen = Get16(p + 36);
- if (size < 38 + idLen + impLen)
- return S_FALSE;
- // ImplUse.SetCapacity(impLen);
- processed = 38;
- // memcpy(ImplUse, p + processed, impLen);
- processed += impLen;
- Id.Parse(p + processed, idLen);
- processed += idLen;
- for (;(processed & 3) != 0; processed++)
- if (p[processed] != 0)
- return S_FALSE;
- return (processed <= size) ? S_OK : S_FALSE;
-}
-
-HRESULT CInArchive::ReadFileItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed)
-{
- if (Files.Size() % 100 == 0)
- RINOK(_progress->SetCompleted(Files.Size(), _processedProgressBytes));
- if (numRecurseAllowed-- == 0)
- return S_FALSE;
- CFile &file = Files.Back();
- const CLogVol &vol = LogVols[volIndex];
- CPartition &partition = Partitions[vol.PartitionMaps[lad.Location.PartitionRef].PartitionIndex];
-
- UInt32 key = lad.Location.Pos;
- UInt32 value;
- const UInt32 kRecursedErrorValue = (UInt32)(Int32)-1;
- if (partition.Map.Find(key, value))
- {
- if (value == kRecursedErrorValue)
- return S_FALSE;
- file.ItemIndex = value;
- }
- else
- {
- value = Items.Size();
- file.ItemIndex = (int)value;
- if (partition.Map.Set(key, kRecursedErrorValue))
- return S_FALSE;
- RINOK(ReadItem(volIndex, fsIndex, lad, numRecurseAllowed));
- if (!partition.Map.Set(key, value))
- return S_FALSE;
- }
- return S_OK;
-}
-
-HRESULT CInArchive::ReadItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed)
-{
- if (Items.Size() > kNumItemsMax)
- return S_FALSE;
- Items.Add(CItem());
- CItem &item = Items.Back();
-
- const CLogVol &vol = LogVols[volIndex];
-
- if (lad.GetLen() != vol.BlockSize)
- return S_FALSE;
-
- CByteBuffer buf;
- size_t size = lad.GetLen();
- buf.SetCapacity(size);
- RINOK(Read(volIndex, lad, buf));
-
- CTag tag;
- const Byte *p = buf;
- RINOK(tag.Parse(p, size));
- if (tag.Id != DESC_TYPE_File)
- return S_FALSE;
-
- item.IcbTag.Parse(p + 16);
- if (item.IcbTag.FileType != ICB_FILE_TYPE_DIR &&
- item.IcbTag.FileType != ICB_FILE_TYPE_FILE)
- return S_FALSE;
-
- item.Parse(p);
-
- _processedProgressBytes += (UInt64)item.NumLogBlockRecorded * vol.BlockSize + size;
-
- UInt32 extendedAttrLen = Get32(p + 168);
- UInt32 allocDescriptorsLen = Get32(p + 172);
-
- if ((extendedAttrLen & 3) != 0)
- return S_FALSE;
- int pos = 176;
- if (extendedAttrLen > size - pos)
- return S_FALSE;
- /*
- if (extendedAttrLen != 16)
- {
- if (extendedAttrLen < 24)
- return S_FALSE;
- CTag attrTag;
- RINOK(attrTag.Parse(p + pos, size));
- if (attrTag.Id != DESC_TYPE_ExtendedAttrHeader)
- return S_FALSE;
- // UInt32 implAttrLocation = Get32(p + pos + 16);
- // UInt32 applicationlAttrLocation = Get32(p + pos + 20);
- }
- */
- pos += extendedAttrLen;
-
- int desctType = item.IcbTag.GetDescriptorType();
- if (allocDescriptorsLen > size - pos)
- return S_FALSE;
- if (desctType == ICB_DESC_TYPE_INLINE)
- {
- item.IsInline = true;
- item.InlineData.SetCapacity(allocDescriptorsLen);
- memcpy(item.InlineData, p + pos, allocDescriptorsLen);
- }
- else
- {
- item.IsInline = false;
- if (desctType != ICB_DESC_TYPE_SHORT && desctType != ICB_DESC_TYPE_LONG)
- return S_FALSE;
- for (UInt32 i = 0; i < allocDescriptorsLen;)
- {
- CMyExtent e;
- if (desctType == ICB_DESC_TYPE_SHORT)
- {
- if (i + 8 > allocDescriptorsLen)
- return S_FALSE;
- CShortAllocDesc sad;
- sad.Parse(p + pos + i);
- e.Pos = sad.Pos;
- e.Len = sad.Len;
- e.PartitionRef = lad.Location.PartitionRef;
- i += 8;
- }
- else
- {
- if (i + 16 > allocDescriptorsLen)
- return S_FALSE;
- CLongAllocDesc ladNew;
- ladNew.Parse(p + pos + i);
- e.Pos = ladNew.Location.Pos;
- e.PartitionRef = ladNew.Location.PartitionRef;
- e.Len = ladNew.Len;
- i += 16;
- }
- item.Extents.Add(e);
- }
- }
-
- if (item.IcbTag.IsDir())
- {
- if (!item.CheckChunkSizes() || !CheckItemExtents(volIndex, item))
- return S_FALSE;
- CByteBuffer buf;
- RINOK(ReadFromFile(volIndex, item, buf));
- item.Size = 0;
- item.Extents.ClearAndFree();
- item.InlineData.Free();
-
- const Byte *p = buf;
- size = buf.GetCapacity();
- size_t processedTotal = 0;
- for (; processedTotal < size;)
- {
- size_t processedCur;
- CFileId fileId;
- RINOK(fileId.Parse(p + processedTotal, size - processedTotal, processedCur));
- if (!fileId.IsItLinkParent())
- {
- CFile file;
- // file.FileVersion = fileId.FileVersion;
- // file.FileCharacteristics = fileId.FileCharacteristics;
- // file.ImplUse = fileId.ImplUse;
- file.Id = fileId.Id;
-
- _fileNameLengthTotal += file.Id.Data.GetCapacity();
- if (_fileNameLengthTotal > kFileNameLengthTotalMax)
- return S_FALSE;
-
- item.SubFiles.Add(Files.Size());
- if (Files.Size() > kNumFilesMax)
- return S_FALSE;
- Files.Add(file);
- RINOK(ReadFileItem(volIndex, fsIndex, fileId.Icb, numRecurseAllowed));
- }
- processedTotal += processedCur;
- }
- }
- else
- {
- if ((UInt32)item.Extents.Size() > kNumExtentsMax - _numExtents)
- return S_FALSE;
- _numExtents += item.Extents.Size();
-
- if (item.InlineData.GetCapacity() > kInlineExtentsSizeMax - _inlineExtentsSize)
- return S_FALSE;
- _inlineExtentsSize += item.InlineData.GetCapacity();
- }
-
- return S_OK;
-}
-
-HRESULT CInArchive::FillRefs(CFileSet &fs, int fileIndex, int parent, int numRecurseAllowed)
-{
- if (_numRefs % 10000 == 0)
- {
- RINOK(_progress->SetCompleted());
- }
- if (numRecurseAllowed-- == 0)
- return S_FALSE;
- if (_numRefs >= kNumRefsMax)
- return S_FALSE;
- _numRefs++;
- CRef ref;
- ref.FileIndex = fileIndex;
- ref.Parent = parent;
- parent = fs.Refs.Size();
- fs.Refs.Add(ref);
- const CItem &item = Items[Files[fileIndex].ItemIndex];
- for (int i = 0; i < item.SubFiles.Size(); i++)
- {
- RINOK(FillRefs(fs, item.SubFiles[i], parent, numRecurseAllowed));
- }
- return S_OK;
-}
-
-HRESULT CInArchive::Open2()
-{
- Clear();
-
- UInt64 fileSize;
- RINOK(_stream->Seek(0, STREAM_SEEK_END, &fileSize));
-
- // Some UDFs contain additional 2 KB of zeros, so we also check 12, corrected to 11.
- const int kSecLogSizeMax = 12;
- Byte buf[1 << kSecLogSizeMax];
- Byte kSizesLog[] = { 11, 8, 12 };
-
- for (int i = 0;; i++)
- {
- if (i == sizeof(kSizesLog) / sizeof(kSizesLog[0]))
- return S_FALSE;
- SecLogSize = kSizesLog[i];
- Int32 bufSize = 1 << SecLogSize;
- if (bufSize > fileSize)
- return S_FALSE;
- RINOK(_stream->Seek(-bufSize, STREAM_SEEK_END, NULL));
- RINOK(ReadStream_FALSE(_stream, buf, bufSize));
- CTag tag;
- if (tag.Parse(buf, bufSize) == S_OK)
- if (tag.Id == DESC_TYPE_AnchorVolPtr)
- break;
- }
- if (SecLogSize == 12)
- SecLogSize = 11;
-
- CExtent extentVDS;
- extentVDS.Parse(buf + 16);
-
- for (UInt32 location = extentVDS.Pos; ; location++)
- {
- size_t bufSize = 1 << SecLogSize;
- size_t pos = 0;
- RINOK(_stream->Seek((UInt64)location << SecLogSize, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(_stream, buf, bufSize));
- CTag tag;
- RINOK(tag.Parse(buf + pos, bufSize - pos));
- if (tag.Id == DESC_TYPE_Terminating)
- break;
- if (tag.Id == DESC_TYPE_Partition)
- {
- if (Partitions.Size() >= kNumPartitionsMax)
- return S_FALSE;
- CPartition partition;
- // UInt32 volDescSeqNumer = Get32(buf + 16);
- // partition.Flags = Get16(buf + 20);
- partition.Number = Get16(buf + 22);
- // partition.ContentsId.Parse(buf + 24);
-
- // memcpy(partition.ContentsUse, buf + 56, sizeof(partition.ContentsUse));
- // ContentsUse is Partition Header Description.
-
- // partition.AccessType = Get32(buf + 184);
- partition.Pos = Get32(buf + 188);
- partition.Len = Get32(buf + 192);
- // partition.ImplId.Parse(buf + 196);
- // memcpy(partition.ImplUse, buf + 228, sizeof(partition.ImplUse));
-
- Partitions.Add(partition);
- }
- else if (tag.Id == DESC_TYPE_LogicalVol)
- {
- if (LogVols.Size() >= kNumLogVolumesMax)
- return S_FALSE;
- CLogVol vol;
- vol.Id.Parse(buf + 84);
- vol.BlockSize = Get32(buf + 212);
- // vol.DomainId.Parse(buf + 216);
-
- if (vol.BlockSize < 512 || vol.BlockSize > ((UInt32)1 << 30))
- return S_FALSE;
-
- // memcpy(vol.ContentsUse, buf + 248, sizeof(vol.ContentsUse));
- vol.FileSetLocation.Parse(buf + 248);
-
- // UInt32 mapTableLength = Get32(buf + 264);
- UInt32 numPartitionMaps = Get32(buf + 268);
- if (numPartitionMaps > kNumPartitionsMax)
- return S_FALSE;
- // vol.ImplId.Parse(buf + 272);
- // memcpy(vol.ImplUse, buf + 128, sizeof(vol.ImplUse));
- size_t pos = 440;
- for (UInt32 i = 0; i < numPartitionMaps; i++)
- {
- if (pos + 2 > bufSize)
- return S_FALSE;
- CPartitionMap pm;
- pm.Type = buf[pos];
- // pm.Length = buf[pos + 1];
- Byte len = buf[pos + 1];
-
- if (pos + len > bufSize)
- return S_FALSE;
-
- // memcpy(pm.Data, buf + pos + 2, pm.Length - 2);
- if (pm.Type == 1)
- {
- if (pos + 6 > bufSize)
- return S_FALSE;
- // pm.VolSeqNumber = Get16(buf + pos + 2);
- pm.PartitionNumber = Get16(buf + pos + 4);
- }
- else
- return S_FALSE;
- pos += len;
- vol.PartitionMaps.Add(pm);
- }
- LogVols.Add(vol);
- }
- }
-
- UInt64 totalSize = 0;
-
- int volIndex;
- for (volIndex = 0; volIndex < LogVols.Size(); volIndex++)
- {
- CLogVol &vol = LogVols[volIndex];
- for (int pmIndex = 0; pmIndex < vol.PartitionMaps.Size(); pmIndex++)
- {
- CPartitionMap &pm = vol.PartitionMaps[pmIndex];
- int i;
- for (i = 0; i < Partitions.Size(); i++)
- {
- CPartition &part = Partitions[i];
- if (part.Number == pm.PartitionNumber)
- {
- if (part.VolIndex >= 0)
- return S_FALSE;
- pm.PartitionIndex = i;
- part.VolIndex = volIndex;
-
- totalSize += (UInt64)part.Len << SecLogSize;
- break;
- }
- }
- if (i == Partitions.Size())
- return S_FALSE;
- }
- }
-
- RINOK(_progress->SetTotal(totalSize));
-
- for (volIndex = 0; volIndex < LogVols.Size(); volIndex++)
- {
- CLogVol &vol = LogVols[volIndex];
-
- CLongAllocDesc nextExtent = vol.FileSetLocation;
- // while (nextExtent.ExtentLen != 0)
- // for (int i = 0; i < 1; i++)
- {
- if (nextExtent.GetLen() < 512)
- return S_FALSE;
- CByteBuffer buf;
- buf.SetCapacity(nextExtent.GetLen());
- RINOK(Read(volIndex, nextExtent, buf));
- const Byte *p = buf;
- size_t size = nextExtent.GetLen();
-
- CTag tag;
- RINOK(tag.Parse(p, size));
- if (tag.Id != DESC_TYPE_FileSet)
- return S_FALSE;
-
- CFileSet fs;
- fs.RecodringTime.Parse(p + 16);
- // fs.InterchangeLevel = Get16(p + 18);
- // fs.MaxInterchangeLevel = Get16(p + 20);
- // fs.FileSetNumber = Get32(p + 40);
- // fs.FileSetDescNumber = Get32(p + 44);
-
- // fs.Id.Parse(p + 304);
- // fs.CopyrightId.Parse(p + 336);
- // fs.AbstractId.Parse(p + 368);
-
- fs.RootDirICB.Parse(p + 400);
- // fs.DomainId.Parse(p + 416);
-
- // fs.SystemStreamDirICB.Parse(p + 464);
-
- vol.FileSets.Add(fs);
-
- // nextExtent.Parse(p + 448);
- }
-
- for (int fsIndex = 0; fsIndex < vol.FileSets.Size(); fsIndex++)
- {
- CFileSet &fs = vol.FileSets[fsIndex];
- int fileIndex = Files.Size();
- Files.Add(CFile());
- RINOK(ReadFileItem(volIndex, fsIndex, fs.RootDirICB, kNumRecureseLevelsMax));
- RINOK(FillRefs(fs, fileIndex, -1, kNumRecureseLevelsMax));
- }
- }
-
- return S_OK;
-}
-
-HRESULT CInArchive::Open(IInStream *inStream, CProgressVirt *progress)
-{
- _progress = progress;
- _stream = inStream;
- HRESULT res;
- try { res = Open2(); }
- catch(...) { Clear(); res = S_FALSE; }
- _stream.Release();
- return res;
-}
-
-void CInArchive::Clear()
-{
- Partitions.Clear();
- LogVols.Clear();
- Items.Clear();
- Files.Clear();
- _fileNameLengthTotal = 0;
- _numRefs = 0;
- _numExtents = 0;
- _inlineExtentsSize = 0;
- _processedProgressBytes = 0;
-}
-
-UString CInArchive::GetComment() const
-{
- UString res;
- for (int i = 0; i < LogVols.Size(); i++)
- {
- if (i > 0)
- res += L" ";
- res += LogVols[i].GetName();
- }
- return res;
-}
-
-static UString GetSpecName(const UString &name)
-{
- UString name2 = name;
- name2.Trim();
- if (name2.IsEmpty())
- {
- /*
- wchar_t s[32];
- ConvertUInt64ToString(id, s);
- return L"[" + (UString)s + L"]";
- */
- return L"[]";
- }
- return name;
-}
-
-static void UpdateWithName(UString &res, const UString &addString)
-{
- if (res.IsEmpty())
- res = addString;
- else
- res = addString + WCHAR_PATH_SEPARATOR + res;
-}
-
-UString CInArchive::GetItemPath(int volIndex, int fsIndex, int refIndex,
- bool showVolName, bool showFsName) const
-{
- // showVolName = true;
- const CLogVol &vol = LogVols[volIndex];
- const CFileSet &fs = vol.FileSets[fsIndex];
-
- UString name;
-
- for (;;)
- {
- const CRef &ref = fs.Refs[refIndex];
- refIndex = ref.Parent;
- if (refIndex < 0)
- break;
- UpdateWithName(name, GetSpecName(Files[ref.FileIndex].GetName()));
- }
-
- if (showFsName)
- {
- wchar_t s[32];
- ConvertUInt64ToString(fsIndex, s);
- UString newName = L"File Set ";
- newName += s;
- UpdateWithName(name, newName);
- }
-
- if (showVolName)
- {
- wchar_t s[32];
- ConvertUInt64ToString(volIndex, s);
- UString newName = s;
- UString newName2 = vol.GetName();
- if (newName2.IsEmpty())
- newName2 = L"Volume";
- newName += L'-';
- newName += newName2;
- UpdateWithName(name, newName);
- }
- return name;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfIn.h b/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfIn.h
deleted file mode 100644
index 46b9a7e85..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfIn.h
+++ /dev/null
@@ -1,375 +0,0 @@
-// Archive/UdfIn.h -- UDF / ECMA-167
-
-#ifndef __ARCHIVE_UDF_IN_H
-#define __ARCHIVE_UDF_IN_H
-
-#include "Common/MyCom.h"
-#include "Common/IntToString.h"
-#include "Common/Buffer.h"
-#include "Common/MyString.h"
-#include "Common/MyMap.h"
-
-#include "../../IStream.h"
-
-namespace NArchive {
-namespace NUdf {
-
-// ---------- ECMA Part 1 ----------
-
-// ECMA 1/7.2.12
-
-/*
-struct CDString32
-{
- Byte Data[32];
- void Parse(const Byte *buf);
- // UString GetString() const;
-};
-*/
-
-struct CDString128
-{
- Byte Data[128];
- void Parse(const Byte *buf);
- UString GetString() const;
-};
-
-struct CDString
-{
- CByteBuffer Data;
- void Parse(const Byte *p, unsigned size);
- UString GetString() const;
-};
-
-
-// ECMA 1/7.3
-
-struct CTime
-{
- Byte Data[12];
-
- unsigned GetType() const { return Data[1] >> 4; }
- bool IsLocal() const { return GetType() == 1; }
- int GetMinutesOffset() const
- {
- int t = (Data[0] | ((UInt16)Data[1] << 8)) & 0xFFF;
- if ((t >> 11) != 0)
- t -= (1 << 12);
- return (t > (60 * 24) || t < -(60 * 24)) ? 0 : t;
- }
- unsigned GetYear() const { return (Data[2] | ((UInt16)Data[3] << 8)); }
- void Parse(const Byte *buf);
-};
-
-
-// ECMA 1/7.4
-
-/*
-struct CRegId
-{
- Byte Flags;
- char Id[23];
- char Suffix[8];
-
- void Parse(const Byte *buf);
-};
-*/
-
-// ---------- ECMA Part 3: Volume Structure ----------
-
-// ECMA 3/10.5
-
-struct CPartition
-{
- // UInt16 Flags;
- UInt16 Number;
- // CRegId ContentsId;
- // Byte ContentsUse[128];
- // UInt32 AccessType;
-
- UInt32 Pos;
- UInt32 Len;
-
- // CRegId ImplId;
- // Byte ImplUse[128];
-
- int VolIndex;
- CMap32 Map;
-
- CPartition(): VolIndex(-1) {}
-
- // bool IsNsr() const { return (strncmp(ContentsId.Id, "+NSR0", 5) == 0); }
- // bool IsAllocated() const { return ((Flags & 1) != 0); }
-};
-
-struct CLogBlockAddr
-{
- UInt32 Pos;
- UInt16 PartitionRef;
-
- void Parse(const Byte *buf);
-};
-
-enum EShortAllocDescType
-{
- SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated = 0,
- SHORT_ALLOC_DESC_TYPE_NotRecordedButAllocated = 1,
- SHORT_ALLOC_DESC_TYPE_NotRecordedAndNotAllocated = 2,
- SHORT_ALLOC_DESC_TYPE_NextExtent = 3
-};
-
-struct CShortAllocDesc
-{
- UInt32 Len;
- UInt32 Pos;
-
- // 4/14.14.1
- // UInt32 GetLen() const { return Len & 0x3FFFFFFF; }
- // UInt32 GetType() const { return Len >> 30; }
- // bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }
- void Parse(const Byte *buf);
-};
-
-/*
-struct CADImpUse
-{
- UInt16 Flags;
- UInt32 UdfUniqueId;
- void Parse(const Byte *buf);
-};
-*/
-
-struct CLongAllocDesc
-{
- UInt32 Len;
- CLogBlockAddr Location;
-
- // Byte ImplUse[6];
- // CADImpUse adImpUse; // UDF
-
- UInt32 GetLen() const { return Len & 0x3FFFFFFF; }
- UInt32 GetType() const { return Len >> 30; }
- bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }
- void Parse(const Byte *buf);
-};
-
-struct CPartitionMap
-{
- Byte Type;
- // Byte Len;
-
- // Type - 1
- // UInt16 VolSeqNumber;
- UInt16 PartitionNumber;
-
- // Byte Data[256];
-
- int PartitionIndex;
-};
-
-// ECMA 4/14.6
-
-enum EIcbFileType
-{
- ICB_FILE_TYPE_DIR = 4,
- ICB_FILE_TYPE_FILE = 5
-};
-
-enum EIcbDescriptorType
-{
- ICB_DESC_TYPE_SHORT = 0,
- ICB_DESC_TYPE_LONG = 1,
- ICB_DESC_TYPE_EXTENDED = 2,
- ICB_DESC_TYPE_INLINE = 3
-};
-
-struct CIcbTag
-{
- // UInt32 PriorDirectNum;
- // UInt16 StrategyType;
- // UInt16 StrategyParam;
- // UInt16 MaxNumOfEntries;
- Byte FileType;
- // CLogBlockAddr ParentIcb;
- UInt16 Flags;
-
- bool IsDir() const { return FileType == ICB_FILE_TYPE_DIR; }
- int GetDescriptorType() const { return Flags & 3; }
- void Parse(const Byte *p);
-};
-
-// const Byte FILEID_CHARACS_Existance = (1 << 0);
-const Byte FILEID_CHARACS_Parent = (1 << 3);
-
-struct CFile
-{
- // UInt16 FileVersion;
- // Byte FileCharacteristics;
- // CByteBuffer ImplUse;
- CDString Id;
-
- CFile(): /* FileVersion(0), FileCharacteristics(0), */ ItemIndex(-1) {}
- int ItemIndex;
- UString GetName() const { return Id.GetString(); }
-};
-
-struct CMyExtent
-{
- UInt32 Pos;
- UInt32 Len;
- int PartitionRef;
-
- UInt32 GetLen() const { return Len & 0x3FFFFFFF; }
- UInt32 GetType() const { return Len >> 30; }
- bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }
-};
-
-struct CItem
-{
- CIcbTag IcbTag;
-
- // UInt32 Uid;
- // UInt32 Gid;
- // UInt32 Permissions;
- // UInt16 FileLinkCount;
- // Byte RecordFormat;
- // Byte RecordDisplayAttr;
- // UInt32 RecordLen;
- UInt64 Size;
- UInt64 NumLogBlockRecorded;
- CTime ATime;
- CTime MTime;
- // CTime AttrtTime;
- // UInt32 CheckPoint;
- // CLongAllocDesc ExtendedAttrIcb;
- // CRegId ImplId;
- // UInt64 UniqueId;
-
- bool IsInline;
- CByteBuffer InlineData;
- CRecordVector<CMyExtent> Extents;
- CRecordVector<int> SubFiles;
-
- void Parse(const Byte *buf);
-
- bool IsRecAndAlloc() const
- {
- for (int i = 0; i < Extents.Size(); i++)
- if (!Extents[i].IsRecAndAlloc())
- return false;
- return true;
- }
-
- UInt64 GetChunksSumSize() const
- {
- if (IsInline)
- return InlineData.GetCapacity();
- UInt64 size = 0;
- for (int i = 0; i < Extents.Size(); i++)
- size += Extents[i].GetLen();
- return size;
- }
-
- bool CheckChunkSizes() const { return GetChunksSumSize() == Size; }
-
- bool IsDir() const { return IcbTag.IsDir(); }
-};
-
-struct CRef
-{
- int Parent;
- int FileIndex;
-};
-
-
-// ECMA 4 / 14.1
-struct CFileSet
-{
- CTime RecodringTime;
- // UInt16 InterchangeLevel;
- // UInt16 MaxInterchangeLevel;
- // UInt32 FileSetNumber;
- // UInt32 FileSetDescNumber;
- // CDString32 Id;
- // CDString32 CopyrightId;
- // CDString32 AbstractId;
-
- CLongAllocDesc RootDirICB;
- // CRegId DomainId;
- // CLongAllocDesc SystemStreamDirICB;
-
- CRecordVector<CRef> Refs;
-};
-
-
-// ECMA 3/10.6
-
-struct CLogVol
-{
- CDString128 Id;
- UInt32 BlockSize;
- // CRegId DomainId;
-
- // Byte ContentsUse[16];
- CLongAllocDesc FileSetLocation; // UDF
-
- // CRegId ImplId;
- // Byte ImplUse[128];
-
- CObjectVector<CPartitionMap> PartitionMaps;
- CObjectVector<CFileSet> FileSets;
-
- UString GetName() const { return Id.GetString(); }
-};
-
-struct CProgressVirt
-{
- virtual HRESULT SetTotal(UInt64 numBytes) PURE;
- virtual HRESULT SetCompleted(UInt64 numFiles, UInt64 numBytes) PURE;
- virtual HRESULT SetCompleted() PURE;
-};
-
-class CInArchive
-{
- CMyComPtr<IInStream> _stream;
- CProgressVirt *_progress;
-
- HRESULT Read(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len, Byte *buf);
- HRESULT Read(int volIndex, const CLongAllocDesc &lad, Byte *buf);
- HRESULT ReadFromFile(int volIndex, const CItem &item, CByteBuffer &buf);
-
- HRESULT ReadFileItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed);
- HRESULT ReadItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed);
-
- HRESULT Open2();
- HRESULT FillRefs(CFileSet &fs, int fileIndex, int parent, int numRecurseAllowed);
-
- UInt64 _processedProgressBytes;
-
- UInt64 _fileNameLengthTotal;
- int _numRefs;
- UInt32 _numExtents;
- UInt64 _inlineExtentsSize;
- bool CheckExtent(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len) const;
-public:
- HRESULT Open(IInStream *inStream, CProgressVirt *progress);
- void Clear();
-
- CObjectVector<CPartition> Partitions;
- CObjectVector<CLogVol> LogVols;
-
- CObjectVector<CItem> Items;
- CObjectVector<CFile> Files;
-
- int SecLogSize;
-
- UString GetComment() const;
- UString GetItemPath(int volIndex, int fsIndex, int refIndex,
- bool showVolName, bool showFsName) const;
-
- bool CheckItemExtents(int volIndex, const CItem &item) const;
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfRegister.cpp
deleted file mode 100644
index 1b08d120b..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Udf/UdfRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// UdfRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "UdfHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NUdf::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Udf", L"iso img", 0, 0xE0, { 0, 'N', 'S', 'R', '0' }, 5, false, CreateArc, 0 };
-
-REGISTER_ARC(Udf)
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/VhdHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/VhdHandler.cpp
deleted file mode 100644
index 9d1c928e6..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/VhdHandler.cpp
+++ /dev/null
@@ -1,734 +0,0 @@
-// VhdHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#define Get16(p) GetBe16(p)
-#define Get32(p) GetBe32(p)
-#define Get64(p) GetBe64(p)
-
-#define G32(p, dest) dest = Get32(p);
-#define G64(p, dest) dest = Get64(p);
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NVhd {
-
-static const UInt32 kUnusedBlock = 0xFFFFFFFF;
-
-static const UInt32 kDiskType_Fixed = 2;
-static const UInt32 kDiskType_Dynamic = 3;
-static const UInt32 kDiskType_Diff = 4;
-
-static const char *kDiskTypes[] =
-{
- "0",
- "1",
- "Fixed",
- "Dynamic",
- "Differencing"
-};
-
-struct CFooter
-{
- // UInt32 Features;
- // UInt32 FormatVersion;
- UInt64 DataOffset;
- UInt32 CTime;
- UInt32 CreatorApp;
- UInt32 CreatorVersion;
- UInt32 CreatorHostOS;
- // UInt64 OriginalSize;
- UInt64 CurrentSize;
- UInt32 DiskGeometry;
- UInt32 Type;
- Byte Id[16];
- Byte SavedState;
-
- bool IsFixed() const { return Type == kDiskType_Fixed; }
- bool ThereIsDynamic() const { return Type == kDiskType_Dynamic || Type == kDiskType_Diff; }
- // bool IsSupported() const { return Type == kDiskType_Fixed || Type == kDiskType_Dynamic || Type == kDiskType_Diff; }
- UInt32 NumCyls() const { return DiskGeometry >> 16; }
- UInt32 NumHeads() const { return (DiskGeometry >> 8) & 0xFF; }
- UInt32 NumSectorsPerTrack() const { return DiskGeometry & 0xFF; }
- AString GetTypeString() const;
- bool Parse(const Byte *p);
-};
-
-AString CFooter::GetTypeString() const
-{
- if (Type < sizeof(kDiskTypes) / sizeof(kDiskTypes[0]))
- return kDiskTypes[Type];
- char s[16];
- ConvertUInt32ToString(Type, s);
- return s;
-}
-
-static bool CheckBlock(const Byte *p, unsigned size, unsigned checkSumOffset, unsigned zeroOffset)
-{
- UInt32 sum = 0;
- unsigned i;
- for (i = 0; i < checkSumOffset; i++)
- sum += p[i];
- for (i = checkSumOffset + 4; i < size; i++)
- sum += p[i];
- if (~sum != Get32(p + checkSumOffset))
- return false;
- for (i = zeroOffset; i < size; i++)
- if (p[i] != 0)
- return false;
- return true;
-}
-
-bool CFooter::Parse(const Byte *p)
-{
- if (memcmp(p, "conectix", 8) != 0)
- return false;
- // G32(p + 0x08, Features);
- // G32(p + 0x0C, FormatVersion);
- G64(p + 0x10, DataOffset);
- G32(p + 0x18, CTime);
- G32(p + 0x1C, CreatorApp);
- G32(p + 0x20, CreatorVersion);
- G32(p + 0x24, CreatorHostOS);
- // G64(p + 0x28, OriginalSize);
- G64(p + 0x30, CurrentSize);
- G32(p + 0x38, DiskGeometry);
- G32(p + 0x3C, Type);
- memcpy(Id, p + 0x44, 16);
- SavedState = p[0x54];
- return CheckBlock(p, 512, 0x40, 0x55);
-}
-
-/*
-struct CParentLocatorEntry
-{
- UInt32 Code;
- UInt32 DataSpace;
- UInt32 DataLen;
- UInt64 DataOffset;
-
- bool Parse(const Byte *p);
-};
-bool CParentLocatorEntry::Parse(const Byte *p)
-{
- G32(p + 0x00, Code);
- G32(p + 0x04, DataSpace);
- G32(p + 0x08, DataLen);
- G32(p + 0x10, DataOffset);
- return (Get32(p + 0x0C) == 0); // Resrved
-}
-*/
-
-struct CDynHeader
-{
- // UInt64 DataOffset;
- UInt64 TableOffset;
- // UInt32 HeaderVersion;
- UInt32 NumBlocks;
- int BlockSizeLog;
- UInt32 ParentTime;
- Byte ParentId[16];
- UString ParentName;
- // CParentLocatorEntry ParentLocators[8];
-
- bool Parse(const Byte *p);
- UInt32 NumBitMapSectors() const
- {
- UInt32 numSectorsInBlock = (1 << (BlockSizeLog - 9));
- return (numSectorsInBlock + 512 * 8 - 1) / (512 * 8);
- }
-};
-
-static int GetLog(UInt32 num)
-{
- for (int i = 0; i < 31; i++)
- if (((UInt32)1 << i) == num)
- return i;
- return -1;
-}
-
-bool CDynHeader::Parse(const Byte *p)
-{
- if (memcmp(p, "cxsparse", 8) != 0)
- return false;
- // G64(p + 0x08, DataOffset);
- G64(p + 0x10, TableOffset);
- // G32(p + 0x18, HeaderVersion);
- G32(p + 0x1C, NumBlocks);
- BlockSizeLog = GetLog(Get32(p + 0x20));
- if (BlockSizeLog < 9 || BlockSizeLog > 30)
- return false;
- G32(p + 0x38, ParentTime);
- if (Get32(p + 0x3C) != 0) // reserved
- return false;
- memcpy(ParentId, p + 0x28, 16);
- {
- const int kNameLength = 256;
- wchar_t *s = ParentName.GetBuffer(kNameLength);
- for (unsigned i = 0; i < kNameLength; i++)
- s[i] = Get16(p + 0x40 + i * 2);
- s[kNameLength] = 0;
- ParentName.ReleaseBuffer();
- }
- /*
- for (int i = 0; i < 8; i++)
- if (!ParentLocators[i].Parse(p + 0x240 + i * 24))
- return false;
- */
- return CheckBlock(p, 1024, 0x24, 0x240 + 8 * 24);
-}
-
-class CHandler:
- public IInStream,
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- UInt64 _virtPos;
- UInt64 _phyPos;
- UInt64 _phyLimit;
-
- CFooter Footer;
- CDynHeader Dyn;
- CRecordVector<UInt32> Bat;
- CByteBuffer BitMap;
- UInt32 BitMapTag;
- UInt32 NumUsedBlocks;
- CMyComPtr<IInStream> Stream;
- CMyComPtr<IInStream> ParentStream;
- CHandler *Parent;
-
- HRESULT Seek(UInt64 offset);
- HRESULT InitAndSeek();
- HRESULT ReadPhy(UInt64 offset, void *data, UInt32 size);
-
- bool NeedParent() const { return Footer.Type == kDiskType_Diff; }
- UInt64 GetPackSize() const
- { return Footer.ThereIsDynamic() ? ((UInt64)NumUsedBlocks << Dyn.BlockSizeLog) : Footer.CurrentSize; }
-
- UString GetParentName() const
- {
- const CHandler *p = this;
- UString res;
- while (p && p->NeedParent())
- {
- if (!res.IsEmpty())
- res += L" -> ";
- res += p->Dyn.ParentName;
- p = p->Parent;
- }
- return res;
- }
-
- bool IsOK() const
- {
- const CHandler *p = this;
- while (p->NeedParent())
- {
- p = p->Parent;
- if (p == 0)
- return false;
- }
- return true;
- }
-
- HRESULT Open3();
- HRESULT Open2(IInStream *stream, CHandler *child, IArchiveOpenCallback *openArchiveCallback, int level);
-
-public:
- MY_UNKNOWN_IMP3(IInArchive, IInArchiveGetStream, IInStream)
-
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-
-HRESULT CHandler::Seek(UInt64 offset) { return Stream->Seek(offset, STREAM_SEEK_SET, NULL); }
-
-HRESULT CHandler::InitAndSeek()
-{
- if (ParentStream)
- {
- RINOK(Parent->InitAndSeek());
- }
- _virtPos = _phyPos = 0;
- BitMapTag = kUnusedBlock;
- BitMap.SetCapacity(Dyn.NumBitMapSectors() << 9);
- return Seek(0);
-}
-
-HRESULT CHandler::ReadPhy(UInt64 offset, void *data, UInt32 size)
-{
- if (offset + size > _phyLimit)
- return S_FALSE;
- if (offset != _phyPos)
- {
- _phyPos = offset;
- RINOK(Seek(offset));
- }
- HRESULT res = ReadStream_FALSE(Stream, data, size);
- _phyPos += size;
- return res;
-}
-
-HRESULT CHandler::Open3()
-{
- RINOK(Stream->Seek(0, STREAM_SEEK_END, &_phyPos));
- if (_phyPos < 512)
- return S_FALSE;
- const UInt32 kDynSize = 1024;
- Byte buf[kDynSize];
-
- _phyLimit = _phyPos;
- RINOK(ReadPhy(_phyLimit - 512, buf, 512));
- if (!Footer.Parse(buf))
- return S_FALSE;
- _phyLimit -= 512;
-
- if (!Footer.ThereIsDynamic())
- return S_OK;
-
- RINOK(ReadPhy(0, buf + 512, 512));
- if (memcmp(buf, buf + 512, 512) != 0)
- return S_FALSE;
-
- RINOK(ReadPhy(Footer.DataOffset, buf, kDynSize));
- if (!Dyn.Parse(buf))
- return S_FALSE;
-
- if (Dyn.NumBlocks >= (UInt32)1 << 31)
- return S_FALSE;
- if (Footer.CurrentSize == 0)
- {
- if (Dyn.NumBlocks != 0)
- return S_FALSE;
- }
- else if (((Footer.CurrentSize - 1) >> Dyn.BlockSizeLog) + 1 != Dyn.NumBlocks)
- return S_FALSE;
-
- Bat.Reserve(Dyn.NumBlocks);
- while ((UInt32)Bat.Size() < Dyn.NumBlocks)
- {
- RINOK(ReadPhy(Dyn.TableOffset + (UInt64)Bat.Size() * 4, buf, 512));
- for (UInt32 j = 0; j < 512; j += 4)
- {
- UInt32 v = Get32(buf + j);
- if (v != kUnusedBlock)
- NumUsedBlocks++;
- Bat.Add(v);
- if ((UInt32)Bat.Size() >= Dyn.NumBlocks)
- break;
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- if (_virtPos >= Footer.CurrentSize)
- return (Footer.CurrentSize == _virtPos) ? S_OK: E_FAIL;
- UInt64 rem = Footer.CurrentSize - _virtPos;
- if (size > rem)
- size = (UInt32)rem;
- if (size == 0)
- return S_OK;
- UInt32 blockIndex = (UInt32)(_virtPos >> Dyn.BlockSizeLog);
- UInt32 blockSectIndex = Bat[blockIndex];
- UInt32 blockSize = (UInt32)1 << Dyn.BlockSizeLog;
- UInt32 offsetInBlock = (UInt32)_virtPos & (blockSize - 1);
- size = MyMin(blockSize - offsetInBlock, size);
-
- HRESULT res = S_OK;
- if (blockSectIndex == kUnusedBlock)
- {
- if (ParentStream)
- {
- RINOK(ParentStream->Seek(_virtPos, STREAM_SEEK_SET, NULL));
- res = ParentStream->Read(data, size, &size);
- }
- else
- memset(data, 0, size);
- }
- else
- {
- UInt64 newPos = (UInt64)blockSectIndex << 9;
- if (BitMapTag != blockIndex)
- {
- RINOK(ReadPhy(newPos, BitMap, (UInt32)BitMap.GetCapacity()));
- BitMapTag = blockIndex;
- }
- RINOK(ReadPhy(newPos + BitMap.GetCapacity() + offsetInBlock, data, size));
- for (UInt32 cur = 0; cur < size;)
- {
- UInt32 rem = MyMin(0x200 - (offsetInBlock & 0x1FF), size - cur);
- UInt32 bmi = offsetInBlock >> 9;
- if (((BitMap[bmi >> 3] >> (7 - (bmi & 7))) & 1) == 0)
- {
- if (ParentStream)
- {
- RINOK(ParentStream->Seek(_virtPos + cur, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(ParentStream, (Byte *)data + cur, rem));
- }
- else
- {
- const Byte *p = (const Byte *)data + cur;
- for (UInt32 i = 0; i < rem; i++)
- if (p[i] != 0)
- return S_FALSE;
- }
- }
- offsetInBlock += rem;
- cur += rem;
- }
- }
- if (processedSize != NULL)
- *processedSize = size;
- _virtPos += size;
- return res;
-}
-
-STDMETHODIMP CHandler::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch(seekOrigin)
- {
- case STREAM_SEEK_SET: _virtPos = offset; break;
- case STREAM_SEEK_CUR: _virtPos += offset; break;
- case STREAM_SEEK_END: _virtPos = Footer.CurrentSize + offset; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
-}
-
-enum
-{
- kpidParent = kpidUserDefined,
- kpidSavedState
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidClusterSize, VT_UI8},
- { NULL, kpidMethod, VT_BSTR},
- { L"Parent", kpidParent, VT_BSTR},
- { NULL, kpidCreatorApp, VT_BSTR},
- { NULL, kpidHostOS, VT_BSTR},
- { L"Saved State", kpidSavedState, VT_BOOL},
- { NULL, kpidId, VT_BSTR}
- };
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME}
-
- /*
- { NULL, kpidNumCyls, VT_UI4},
- { NULL, kpidNumHeads, VT_UI4},
- { NULL, kpidSectorsPerTrack, VT_UI4}
- */
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_WITH_NAME
-
-// VHD start time: 2000-01-01
-static const UInt64 kVhdTimeStartValue = (UInt64)3600 * 24 * (399 * 365 + 24 * 4);
-
-static void VhdTimeToFileTime(UInt32 vhdTime, NCOM::CPropVariant &prop)
-{
- FILETIME ft, utc;
- UInt64 v = (kVhdTimeStartValue + vhdTime) * 10000000;
- ft.dwLowDateTime = (DWORD)v;
- ft.dwHighDateTime = (DWORD)(v >> 32);
- // specification says that it's UTC time, but Virtual PC 6 writes local time. Why?
- LocalFileTimeToFileTime(&ft, &utc);
- prop = utc;
-}
-
-static void StringToAString(char *dest, UInt32 s)
-{
- for (int i = 24; i >= 0; i -= 8)
- {
- Byte b = (Byte)((s >> i) & 0xFF);
- if (b < 0x20 || b > 0x7F)
- break;
- *dest++ = b;
- }
- *dest = 0;
-}
-
-static void ConvertByteToHex(unsigned value, char *s)
-{
- for (int i = 0; i < 2; i++)
- {
- unsigned t = value & 0xF;
- value >>= 4;
- s[1 - i] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10)));
- }
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMainSubfile: prop = (UInt32)0; break;
- case kpidCTime: VhdTimeToFileTime(Footer.CTime, prop); break;
- case kpidClusterSize: if (Footer.ThereIsDynamic()) prop = (UInt32)1 << Dyn.BlockSizeLog; break;
- case kpidMethod:
- {
- AString s = Footer.GetTypeString();
- if (NeedParent())
- {
- s += " -> ";
- const CHandler *p = this;
- while (p != 0 && p->NeedParent())
- p = p->Parent;
- if (p == 0)
- s += '?';
- else
- s += p->Footer.GetTypeString();
- }
- prop = s;
- break;
- }
- case kpidCreatorApp:
- {
- char s[16];
- StringToAString(s, Footer.CreatorApp);
- AString res = s;
- res.Trim();
- ConvertUInt32ToString(Footer.CreatorVersion >> 16, s);
- res += ' ';
- res += s;
- res += '.';
- ConvertUInt32ToString(Footer.CreatorVersion & 0xFFFF, s);
- res += s;
- prop = res;
- break;
- }
- case kpidHostOS:
- {
- if (Footer.CreatorHostOS == 0x5769326b)
- prop = "Windows";
- else
- {
- char s[16];
- StringToAString(s, Footer.CreatorHostOS);
- prop = s;
- }
- break;
- }
- case kpidId:
- {
- char s[32 + 4];
- for (int i = 0; i < 16; i++)
- ConvertByteToHex(Footer.Id[i], s + i * 2);
- s[32] = 0;
- prop = s;
- break;
- }
- case kpidSavedState: prop = Footer.SavedState ? true : false; break;
- case kpidParent: if (NeedParent()) prop = GetParentName(); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::Open2(IInStream *stream, CHandler *child, IArchiveOpenCallback *openArchiveCallback, int level)
-{
- Close();
- Stream = stream;
- if (level > 32)
- return S_FALSE;
- RINOK(Open3());
- if (child && memcmp(child->Dyn.ParentId, Footer.Id, 16) != 0)
- return S_FALSE;
- if (Footer.Type != kDiskType_Diff)
- return S_OK;
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
- if (openArchiveCallback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback) != S_OK)
- return S_FALSE;
- CMyComPtr<IInStream> nextStream;
- HRESULT res = openVolumeCallback->GetStream(Dyn.ParentName, &nextStream);
- if (res == S_FALSE)
- return S_OK;
- RINOK(res);
-
- Parent = new CHandler;
- ParentStream = Parent;
- return Parent->Open2(nextStream, this, openArchiveCallback, level + 1);
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * openArchiveCallback)
-{
- COM_TRY_BEGIN
- {
- HRESULT res;
- try
- {
- res = Open2(stream, NULL, openArchiveCallback, 0);
- if (res == S_OK)
- return S_OK;
- }
- catch(...)
- {
- Close();
- throw;
- }
- Close();
- return res;
- }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- Bat.Clear();
- NumUsedBlocks = 0;
- Parent = 0;
- Stream.Release();
- ParentStream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- switch(propID)
- {
- case kpidSize: prop = Footer.CurrentSize; break;
- case kpidPackSize: prop = GetPackSize(); break;
- case kpidCTime: VhdTimeToFileTime(Footer.CTime, prop); break;
- /*
- case kpidNumCyls: prop = Footer.NumCyls(); break;
- case kpidNumHeads: prop = Footer.NumHeads(); break;
- case kpidSectorsPerTrack: prop = Footer.NumSectorsPerTrack(); break;
- */
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- RINOK(extractCallback->SetTotal(Footer.CurrentSize));
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &outStream, askMode));
- if (!testMode && !outStream)
- return S_OK;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- int res = NExtract::NOperationResult::kDataError;
- CMyComPtr<ISequentialInStream> inStream;
- HRESULT hres = GetStream(0, &inStream);
- if (hres == S_FALSE)
- res = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- RINOK(hres);
- HRESULT hres = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (hres == S_OK)
- {
- if (copyCoderSpec->TotalSize == Footer.CurrentSize)
- res = NExtract::NOperationResult::kOK;
- }
- else
- {
- if (hres != S_FALSE)
- {
- RINOK(hres);
- }
- }
- }
- outStream.Release();
- return extractCallback->SetOperationResult(res);
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 /* index */, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
- if (Footer.IsFixed())
- {
- CLimitedInStream *streamSpec = new CLimitedInStream;
- CMyComPtr<ISequentialInStream> streamTemp = streamSpec;
- streamSpec->SetStream(Stream);
- streamSpec->InitAndSeek(0, Footer.CurrentSize);
- RINOK(streamSpec->SeekToStart());
- *stream = streamTemp.Detach();
- return S_OK;
- }
- if (!Footer.ThereIsDynamic() || !IsOK())
- return S_FALSE;
- CMyComPtr<ISequentialInStream> streamTemp = this;
- RINOK(InitAndSeek());
- *stream = streamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"VHD", L"vhd", L".mbr", 0xDC, { 'c', 'o', 'n', 'e', 'c', 't', 'i', 'x', 0, 0 }, 10, false, CreateArc, 0 };
-
-REGISTER_ARC(Vhd)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandler.cpp
deleted file mode 100644
index eaad1e7ca..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandler.cpp
+++ /dev/null
@@ -1,660 +0,0 @@
-// WimHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringToInt.h"
-#include "Common/UTFConvert.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamUtils.h"
-
-#include "WimHandler.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NWim {
-
-#define WIM_DETAILS
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidShortName, VT_BSTR}
-
- #ifdef WIM_DETAILS
- , { NULL, kpidVolume, VT_UI4}
- , { NULL, kpidOffset, VT_UI8}
- , { NULL, kpidLinks, VT_UI4}
- #endif
-};
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidUnpackVer, VT_BSTR},
- { NULL, kpidIsVolume, VT_BOOL},
- { NULL, kpidVolume, VT_UI4},
- { NULL, kpidNumVolumes, VT_UI4}
-};
-
-static bool ParseNumber64(const AString &s, UInt64 &res)
-{
- const char *end;
- if (s.Left(2) == "0x")
- {
- if (s.Length() == 2)
- return false;
- res = ConvertHexStringToUInt64((const char *)s + 2, &end);
- }
- else
- {
- if (s.IsEmpty())
- return false;
- res = ConvertStringToUInt64(s, &end);
- }
- return *end == 0;
-}
-
-static bool ParseNumber32(const AString &s, UInt32 &res)
-{
- UInt64 res64;
- if (!ParseNumber64(s, res64) || res64 >= ((UInt64)1 << 32))
- return false;
- res = (UInt32)res64;
- return true;
-}
-
-bool ParseTime(const CXmlItem &item, FILETIME &ft, const char *tag)
-{
- int index = item.FindSubTag(tag);
- if (index >= 0)
- {
- const CXmlItem &timeItem = item.SubItems[index];
- UInt32 low = 0, high = 0;
- if (ParseNumber32(timeItem.GetSubStringForTag("LOWPART"), low) &&
- ParseNumber32(timeItem.GetSubStringForTag("HIGHPART"), high))
- {
- ft.dwLowDateTime = low;
- ft.dwHighDateTime = high;
- return true;
- }
- }
- return false;
-}
-
-void CImageInfo::Parse(const CXmlItem &item)
-{
- CTimeDefined = ParseTime(item, CTime, "CREATIONTIME");
- MTimeDefined = ParseTime(item, MTime, "LASTMODIFICATIONTIME");
- NameDefined = ConvertUTF8ToUnicode(item.GetSubStringForTag("NAME"), Name);
- // IndexDefined = ParseNumber32(item.GetPropertyValue("INDEX"), Index);
-}
-
-void CXml::ToUnicode(UString &s)
-{
- size_t size = Data.GetCapacity();
- if (size < 2 || (size & 1) != 0 || size > (1 << 24))
- return;
- const Byte *p = Data;
- if (Get16(p) != 0xFEFF)
- return;
- wchar_t *chars = s.GetBuffer((int)size / 2);
- for (size_t i = 2; i < size; i += 2)
- *chars++ = (wchar_t)Get16(p + i);
- *chars = 0;
- s.ReleaseBuffer();
-}
-
-void CXml::Parse()
-{
- UString s;
- ToUnicode(s);
- AString utf;
- if (!ConvertUnicodeToUTF8(s, utf))
- return;
- ::CXml xml;
- if (!xml.Parse(utf))
- return;
- if (xml.Root.Name != "WIM")
- return;
-
- for (int i = 0; i < xml.Root.SubItems.Size(); i++)
- {
- const CXmlItem &item = xml.Root.SubItems[i];
- if (item.IsTagged("IMAGE"))
- {
- CImageInfo imageInfo;
- imageInfo.Parse(item);
- Images.Add(imageInfo);
- }
- }
-}
-
-static const char *kMethodLZX = "LZX";
-static const char *kMethodXpress = "XPress";
-static const char *kMethodCopy = "Copy";
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- const CImageInfo *image = NULL;
- if (_xmls.Size() == 1)
- {
- const CXml &xml = _xmls[0];
- if (xml.Images.Size() == 1)
- image = &xml.Images[0];
- }
-
- switch(propID)
- {
- case kpidSize: prop = _db.GetUnpackSize(); break;
- case kpidPackSize: prop = _db.GetPackSize(); break;
-
- case kpidCTime:
- if (_xmls.Size() == 1)
- {
- const CXml &xml = _xmls[0];
- int index = -1;
- for (int i = 0; i < xml.Images.Size(); i++)
- {
- const CImageInfo &image = xml.Images[i];
- if (image.CTimeDefined)
- if (index < 0 || ::CompareFileTime(&image.CTime, &xml.Images[index].CTime) < 0)
- index = i;
- }
- if (index >= 0)
- prop = xml.Images[index].CTime;
- }
- break;
-
- case kpidMTime:
- if (_xmls.Size() == 1)
- {
- const CXml &xml = _xmls[0];
- int index = -1;
- for (int i = 0; i < xml.Images.Size(); i++)
- {
- const CImageInfo &image = xml.Images[i];
- if (image.MTimeDefined)
- if (index < 0 || ::CompareFileTime(&image.MTime, &xml.Images[index].MTime) > 0)
- index = i;
- }
- if (index >= 0)
- prop = xml.Images[index].MTime;
- }
- break;
-
- case kpidComment:
- if (image != NULL)
- {
- if (_xmlInComments)
- {
- UString s;
- _xmls[0].ToUnicode(s);
- prop = s;
- }
- else if (image->NameDefined)
- prop = image->Name;
- }
- break;
-
- case kpidUnpackVer:
- {
- UInt32 ver1 = _version >> 16;
- UInt32 ver2 = (_version >> 8) & 0xFF;
- UInt32 ver3 = (_version) & 0xFF;
-
- char s[16];
- ConvertUInt32ToString(ver1, s);
- AString res = s;
- res += '.';
- ConvertUInt32ToString(ver2, s);
- res += s;
- if (ver3 != 0)
- {
- res += '.';
- ConvertUInt32ToString(ver3, s);
- res += s;
- }
- prop = res;
- break;
- }
-
- case kpidIsVolume:
- if (_xmls.Size() > 0)
- {
- UInt16 volIndex = _xmls[0].VolIndex;
- if (volIndex < _volumes.Size())
- prop = (_volumes[volIndex].Header.NumParts > 1);
- }
- break;
- case kpidVolume:
- if (_xmls.Size() > 0)
- {
- UInt16 volIndex = _xmls[0].VolIndex;
- if (volIndex < _volumes.Size())
- prop = (UInt32)_volumes[volIndex].Header.PartNumber;
- }
- break;
- case kpidNumVolumes: if (_volumes.Size() > 0) prop = (UInt32)(_volumes.Size() - 1); break;
- case kpidMethod:
- {
- bool lzx = false, xpress = false, copy = false;
- for (int i = 0; i < _xmls.Size(); i++)
- {
- const CHeader &header = _volumes[_xmls[i].VolIndex].Header;
- if (header.IsCompressed())
- if (header.IsLzxMode())
- lzx = true;
- else
- xpress = true;
- else
- copy = true;
- }
- AString res;
- if (lzx)
- res = kMethodLZX;
- if (xpress)
- {
- if (!res.IsEmpty())
- res += ' ';
- res += kMethodXpress;
- }
- if (copy)
- {
- if (!res.IsEmpty())
- res += ' ';
- res += kMethodCopy;
- }
- prop = res;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- if (index < (UInt32)_db.SortedItems.Size())
- {
- int realIndex = _db.SortedItems[index];
- const CItem &item = _db.Items[realIndex];
- const CStreamInfo *si = NULL;
- const CVolume *vol = NULL;
- if (item.StreamIndex >= 0)
- {
- si = &_db.Streams[item.StreamIndex];
- vol = &_volumes[si->PartNumber];
- }
-
- switch(propID)
- {
- case kpidPath:
- if (item.HasMetadata)
- prop = _db.GetItemPath(realIndex);
- else
- {
- char sz[16];
- ConvertUInt32ToString(item.StreamIndex, sz);
- AString s = sz;
- while (s.Length() < _nameLenForStreams)
- s = '0' + s;
- /*
- if (si->Resource.IsFree())
- prefix = "[Free]";
- */
- s = "[Files]" STRING_PATH_SEPARATOR + s;
- prop = s;
- }
- break;
- case kpidShortName: if (item.HasMetadata) prop = item.ShortName; break;
-
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidAttrib: if (item.HasMetadata) prop = item.Attrib; break;
- case kpidCTime: if (item.HasMetadata) prop = item.CTime; break;
- case kpidATime: if (item.HasMetadata) prop = item.ATime; break;
- case kpidMTime: if (item.HasMetadata) prop = item.MTime; break;
- case kpidPackSize: prop = si ? si->Resource.PackSize : (UInt64)0; break;
- case kpidSize: prop = si ? si->Resource.UnpackSize : (UInt64)0; break;
- case kpidMethod: if (si) prop = si->Resource.IsCompressed() ?
- (vol->Header.IsLzxMode() ? kMethodLZX : kMethodXpress) : kMethodCopy; break;
- #ifdef WIM_DETAILS
- case kpidVolume: if (si) prop = (UInt32)si->PartNumber; break;
- case kpidOffset: if (si) prop = (UInt64)si->Resource.Offset; break;
- case kpidLinks: prop = si ? (UInt32)si->RefCount : (UInt32)0; break;
- #endif
- }
- }
- else
- {
- index -= _db.SortedItems.Size();
- {
- switch(propID)
- {
- case kpidPath:
- {
- char sz[16];
- ConvertUInt32ToString(_xmls[index].VolIndex, sz);
- prop = (AString)"[" + (AString)sz + "].xml";
- break;
- }
- case kpidIsDir: prop = false; break;
- case kpidPackSize:
- case kpidSize: prop = (UInt64)_xmls[index].Data.GetCapacity(); break;
- case kpidMethod: prop = kMethodCopy; break;
- }
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CVolumeName
-{
- // UInt32 _volIndex;
- UString _before;
- UString _after;
-public:
- CVolumeName() {};
-
- void InitName(const UString &name)
- {
- // _volIndex = 1;
- int dotPos = name.ReverseFind('.');
- if (dotPos < 0)
- dotPos = name.Length();
- _before = name.Left(dotPos);
- _after = name.Mid(dotPos);
- }
-
- UString GetNextName(UInt32 index)
- {
- wchar_t s[16];
- ConvertUInt32ToString(index, s);
- return _before + (UString)s + _after;
- }
-};
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback *openArchiveCallback)
-{
- COM_TRY_BEGIN
- Close();
- {
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
-
- CVolumeName seqName;
- if (openArchiveCallback != NULL)
- openArchiveCallback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback);
-
- UInt32 numVolumes = 1;
- int firstVolumeIndex = -1;
- for (UInt32 i = 1; i <= numVolumes; i++)
- {
- CMyComPtr<IInStream> curStream;
- if (i != 1)
- {
- UString fullName = seqName.GetNextName(i);
- HRESULT result = openVolumeCallback->GetStream(fullName, &curStream);
- if (result == S_FALSE)
- continue;
- if (result != S_OK)
- return result;
- if (!curStream)
- break;
- }
- else
- curStream = inStream;
- CHeader header;
- HRESULT res = NWim::ReadHeader(curStream, header);
- if (res != S_OK)
- {
- if (i == 1)
- return res;
- if (res == S_FALSE)
- continue;
- return res;
- }
- _version = header.Version;
- _isOldVersion = header.IsOldVersion();
- if (firstVolumeIndex >= 0)
- if (!header.AreFromOnArchive(_volumes[firstVolumeIndex].Header))
- break;
- if (_volumes.Size() > header.PartNumber && _volumes[header.PartNumber].Stream)
- break;
- CXml xml;
- xml.VolIndex = header.PartNumber;
- res = _db.Open(curStream, header, xml.Data, openArchiveCallback);
- if (res != S_OK)
- {
- if (i == 1)
- return res;
- if (res == S_FALSE)
- continue;
- return res;
- }
-
- while (_volumes.Size() <= header.PartNumber)
- _volumes.Add(CVolume());
- CVolume &volume = _volumes[header.PartNumber];
- volume.Header = header;
- volume.Stream = curStream;
-
- firstVolumeIndex = header.PartNumber;
-
- bool needAddXml = true;
- if (_xmls.Size() != 0)
- if (xml.Data == _xmls[0].Data)
- needAddXml = false;
- if (needAddXml)
- {
- xml.Parse();
- _xmls.Add(xml);
- }
-
- if (i == 1)
- {
- if (header.PartNumber != 1)
- break;
- if (!openVolumeCallback)
- break;
- numVolumes = header.NumParts;
- {
- NCOM::CPropVariant prop;
- RINOK(openVolumeCallback->GetProperty(kpidName, &prop));
- if (prop.vt != VT_BSTR)
- break;
- seqName.InitName(prop.bstrVal);
- }
- }
- }
-
- _db.DetectPathMode();
- RINOK(_db.Sort(_db.SkipRoot));
-
- wchar_t sz[16];
- ConvertUInt32ToString(_db.Streams.Size(), sz);
- _nameLenForStreams = MyStringLen(sz);
-
- _xmlInComments = (_xmls.Size() == 1 && !_db.ShowImageNumber);
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _db.Clear();
- _volumes.Clear();
- _xmls.Clear();
- _nameLenForStreams = 0;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
-
- if (allFilesMode)
- numItems = _db.SortedItems.Size() + _xmls.Size();
- if (numItems == 0)
- return S_OK;
-
- UInt32 i;
- UInt64 totalSize = 0;
- for (i = 0; i < numItems; i++)
- {
- UInt32 index = allFilesMode ? i : indices[i];
- if (index < (UInt32)_db.SortedItems.Size())
- {
- int streamIndex = _db.Items[_db.SortedItems[index]].StreamIndex;
- if (streamIndex >= 0)
- {
- const CStreamInfo &si = _db.Streams[streamIndex];
- totalSize += si.Resource.UnpackSize;
- }
- }
- else
- totalSize += _xmls[index - (UInt32)_db.SortedItems.Size()].Data.GetCapacity();
- }
-
- RINOK(extractCallback->SetTotal(totalSize));
-
- UInt64 currentTotalPacked = 0;
- UInt64 currentTotalUnPacked = 0;
- UInt64 currentItemUnPacked, currentItemPacked;
-
- int prevSuccessStreamIndex = -1;
-
- CUnpacker unpacker;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- for (i = 0; i < numItems; currentTotalUnPacked += currentItemUnPacked,
- currentTotalPacked += currentItemPacked)
- {
- currentItemUnPacked = 0;
- currentItemPacked = 0;
-
- lps->InSize = currentTotalPacked;
- lps->OutSize = currentTotalUnPacked;
-
- RINOK(lps->SetCur());
- UInt32 index = allFilesMode ? i : indices[i];
- i++;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- if (index >= (UInt32)_db.SortedItems.Size())
- {
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- const CByteBuffer &data = _xmls[index - (UInt32)_db.SortedItems.Size()].Data;
- currentItemUnPacked = data.GetCapacity();
- if (realOutStream)
- {
- RINOK(WriteStream(realOutStream, (const Byte *)data, data.GetCapacity()));
- realOutStream.Release();
- }
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- const CItem &item = _db.Items[_db.SortedItems[index]];
- int streamIndex = item.StreamIndex;
- if (streamIndex < 0)
- {
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(item.HasStream() ?
- NExtract::NOperationResult::kDataError :
- NExtract::NOperationResult::kOK));
- continue;
- }
-
- const CStreamInfo &si = _db.Streams[streamIndex];
- currentItemUnPacked = si.Resource.UnpackSize;
- currentItemPacked = si.Resource.PackSize;
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- Int32 opRes = NExtract::NOperationResult::kOK;
- if (streamIndex != prevSuccessStreamIndex || realOutStream)
- {
- Byte digest[20];
- const CVolume &vol = _volumes[si.PartNumber];
- HRESULT res = unpacker.Unpack(vol.Stream, si.Resource, vol.Header.IsLzxMode(),
- realOutStream, progress, digest);
- if (res == S_OK)
- {
- if (memcmp(digest, si.Hash, kHashSize) == 0)
- prevSuccessStreamIndex = streamIndex;
- else
- opRes = NExtract::NOperationResult::kCRCError;
- }
- else if (res == S_FALSE)
- opRes = NExtract::NOperationResult::kDataError;
- else
- return res;
- }
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _db.SortedItems.Size();
- if (!_xmlInComments)
- *numItems += _xmls.Size();
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandler.h b/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandler.h
deleted file mode 100644
index aa92069a5..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandler.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// WimHandler.h
-
-#ifndef __ARCHIVE_WIM_HANDLER_H
-#define __ARCHIVE_WIM_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "Common/MyXml.h"
-
-#include "WimIn.h"
-
-namespace NArchive {
-namespace NWim {
-
-struct CVolume
-{
- CHeader Header;
- CMyComPtr<IInStream> Stream;
-};
-
-struct CImageInfo
-{
- bool CTimeDefined;
- bool MTimeDefined;
- bool NameDefined;
- // bool IndexDefined;
-
- FILETIME CTime;
- FILETIME MTime;
- UString Name;
- // UInt32 Index;
-
- CImageInfo(): CTimeDefined(false), MTimeDefined(false), NameDefined(false)
- // , IndexDefined(false)
- {}
- void Parse(const CXmlItem &item);
-};
-
-struct CXml
-{
- CByteBuffer Data;
- UInt16 VolIndex;
- CObjectVector<CImageInfo> Images;
-
- void ToUnicode(UString &s);
- void Parse();
-};
-
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CDatabase _db;
- UInt32 _version;
- bool _isOldVersion;
- CObjectVector<CVolume> _volumes;
- CObjectVector<CXml> _xmls;
- int _nameLenForStreams;
- bool _xmlInComments;
-
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-class COutHandler:
- public IOutArchive,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP1(IOutArchive)
- INTERFACE_IOutArchive(;)
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandlerOut.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandlerOut.cpp
deleted file mode 100644
index 50b879e79..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimHandlerOut.cpp
+++ /dev/null
@@ -1,639 +0,0 @@
-// WimHandlerOut.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Crypto/RandGen.h"
-#include "../../Crypto/Sha1.h"
-
-#include "WimHandler.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NWim {
-
-struct CSha1Hash
-{
- Byte Hash[kHashSize];
-};
-
-struct CHashList
-{
- CRecordVector<CSha1Hash> Digests;
- CIntVector Sorted;
-
- int AddUnique(const CSha1Hash &h);
-};
-
-int CHashList::AddUnique(const CSha1Hash &h)
-{
- int left = 0, right = Sorted.Size();
- while (left != right)
- {
- int mid = (left + right) / 2;
- int index = Sorted[mid];
- UInt32 i;
- const Byte *hash2 = Digests[index].Hash;
- for (i = 0; i < kHashSize; i++)
- if (h.Hash[i] != hash2[i])
- break;
- if (i == kHashSize)
- return index;
- if (h.Hash[i] < hash2[i])
- right = mid;
- else
- left = mid + 1;
- }
- Sorted.Insert(left, Digests.Add(h));
- return -1;
-}
-
-struct CUpdateItem
-{
- UString Name;
- UInt64 Size;
- FILETIME CTime;
- FILETIME ATime;
- FILETIME MTime;
- UInt32 Attrib;
- bool IsDir;
- int HashIndex;
-
- CUpdateItem(): HashIndex(-1) {}
-};
-
-struct CDir
-{
- int Index;
- UString Name;
- CObjectVector<CDir> Dirs;
- CIntVector Files;
-
- CDir(): Index(-1) {}
- bool IsLeaf() const { return Index >= 0; }
- UInt64 GetNumDirs() const;
- UInt64 GetNumFiles() const;
- CDir* AddDir(CObjectVector<CUpdateItem> &items, const UString &name, int index);
-};
-
-UInt64 CDir::GetNumDirs() const
-{
- UInt64 num = Dirs.Size();
- for (int i = 0; i < Dirs.Size(); i++)
- num += Dirs[i].GetNumDirs();
- return num;
-}
-
-UInt64 CDir::GetNumFiles() const
-{
- UInt64 num = Files.Size();
- for (int i = 0; i < Dirs.Size(); i++)
- num += Dirs[i].GetNumFiles();
- return num;
-}
-
-CDir* CDir::AddDir(CObjectVector<CUpdateItem> &items, const UString &name, int index)
-{
- int left = 0, right = Dirs.Size();
- while (left != right)
- {
- int mid = (left + right) / 2;
- CDir &d = Dirs[mid];
- int compare = name.CompareNoCase(d.IsLeaf() ? items[Dirs[mid].Index].Name : d.Name);
- if (compare == 0)
- {
- if (index >= 0)
- d.Index = index;
- return &d;
- }
- if (compare < 0)
- right = mid;
- else
- left = mid + 1;
- }
- Dirs.Insert(left, CDir());
- CDir &d = Dirs[left];
- d.Index = index;
- if (index < 0)
- d.Name = name;
- return &d;
-}
-
-
-STDMETHODIMP COutHandler::GetFileTimeType(UInt32 *type)
-{
- *type = NFileTimeType::kWindows;
- return S_OK;
-}
-
-static HRESULT GetTime(IArchiveUpdateCallback *callback, int index, PROPID propID, FILETIME &ft)
-{
- ft.dwLowDateTime = ft.dwHighDateTime = 0;
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(index, propID, &prop));
- if (prop.vt == VT_FILETIME)
- ft = prop.filetime;
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- return S_OK;
-}
-
-#define Set16(p, d) SetUi16(p, d)
-#define Set32(p, d) SetUi32(p, d)
-#define Set64(p, d) SetUi64(p, d)
-
-void CResource::WriteTo(Byte *p) const
-{
- Set64(p, PackSize);
- p[7] = Flags;
- Set64(p + 8, Offset);
- Set64(p + 16, UnpackSize);
-}
-
-void CHeader::WriteTo(Byte *p) const
-{
- memcpy(p, kSignature, kSignatureSize);
- Set32(p + 8, kHeaderSizeMax);
- Set32(p + 0xC, Version);
- Set32(p + 0x10, Flags);
- Set32(p + 0x14, ChunkSize);
- memcpy(p + 0x18, Guid, 16);
- Set16(p + 0x28, PartNumber);
- Set16(p + 0x2A, NumParts);
- Set32(p + 0x2C, NumImages);
- OffsetResource.WriteTo(p + 0x30);
- XmlResource.WriteTo(p + 0x48);
- MetadataResource.WriteTo(p + 0x60);
- IntegrityResource.WriteTo(p + 0x7C);
- Set32(p + 0x78, BootIndex);
- memset(p + 0x94, 0, 60);
-}
-
-void CStreamInfo::WriteTo(Byte *p) const
-{
- Resource.WriteTo(p);
- Set16(p + 0x18, PartNumber);
- Set32(p + 0x1A, RefCount);
- memcpy(p + 0x1E, Hash, kHashSize);
-}
-
-class CInStreamWithSha1:
- public ISequentialInStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialInStream> _stream;
- UInt64 _size;
- NCrypto::NSha1::CContext _sha;
-public:
- MY_UNKNOWN_IMP1(IInStream)
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-
- void SetStream(ISequentialInStream *stream) { _stream = stream; }
- void Init()
- {
- _size = 0;
- _sha.Init();
- }
- void ReleaseStream() { _stream.Release(); }
- UInt64 GetSize() const { return _size; }
- void Final(Byte *digest) { _sha.Final(digest); }
-};
-
-STDMETHODIMP CInStreamWithSha1::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize;
- HRESULT result = _stream->Read(data, size, &realProcessedSize);
- _size += realProcessedSize;
- _sha.Update((const Byte *)data, realProcessedSize);
- if (processedSize != NULL)
- *processedSize = realProcessedSize;
- return result;
-}
-
-static void SetFileTimeToMem(Byte *p, const FILETIME &ft)
-{
- Set32(p, ft.dwLowDateTime);
- Set32(p + 4, ft.dwHighDateTime);
-}
-
-static size_t WriteItem(const CUpdateItem &item, Byte *p, const Byte *hash)
-{
- int fileNameLen = item.Name.Length() * 2;
- int fileNameLen2 = (fileNameLen == 0 ? fileNameLen : fileNameLen + 2);
-
- size_t totalLen = ((kDirRecordSize + fileNameLen2 + 6) & ~7);
- if (p)
- {
- memset(p, 0, totalLen);
- Set64(p, totalLen);
- Set64(p + 8, item.Attrib);
- Set32(p + 0xC, (UInt32)(Int32)-1); // item.SecurityId
- // Set64(p + 0x10, 0); // subdirOffset
- SetFileTimeToMem(p + 0x28, item.CTime);
- SetFileTimeToMem(p + 0x30, item.ATime);
- SetFileTimeToMem(p + 0x38, item.MTime);
- if (hash)
- memcpy(p + 0x40, hash, kHashSize);
- /*
- else
- memset(p + 0x40, 0, kHashSize);
- */
- // Set16(p + 98, 0); // shortNameLen
- Set16(p + 100, (UInt16)fileNameLen);
- for (int i = 0; i * 2 < fileNameLen; i++)
- Set16(p + kDirRecordSize + i * 2, item.Name[i]);
- }
- return totalLen;
-}
-
-static void WriteTree(const CDir &tree, CRecordVector<CSha1Hash> &digests,
- CUpdateItem &defaultDirItem,
- CObjectVector<CUpdateItem> &updateItems, Byte *dest, size_t &pos)
-{
- int i;
- for (i = 0; i < tree.Files.Size(); i++)
- {
- const CUpdateItem &ui = updateItems[tree.Files[i]];
- pos += WriteItem(ui, dest ? dest + pos : NULL,
- ui.HashIndex >= 0 ? digests[ui.HashIndex].Hash : NULL);
- }
-
- size_t posStart = pos;
- for (i = 0; i < tree.Dirs.Size(); i++)
- {
- const CDir &subfolder = tree.Dirs[i];
- CUpdateItem *item = &defaultDirItem;
- if (subfolder.IsLeaf())
- item = &updateItems[subfolder.Index];
- else
- defaultDirItem.Name = subfolder.Name;
- pos += WriteItem(*item, NULL, NULL);
- }
-
- if (dest)
- Set64(dest + pos, 0);
-
- pos += 8;
-
- for (i = 0; i < tree.Dirs.Size(); i++)
- {
- const CDir &subfolder = tree.Dirs[i];
- if (dest)
- {
- CUpdateItem *item = &defaultDirItem;
- if (subfolder.IsLeaf())
- item = &updateItems[subfolder.Index];
- else
- defaultDirItem.Name = subfolder.Name;
- size_t len = WriteItem(*item, dest + posStart, NULL);
- Set64(dest + posStart + 0x10, pos);
- posStart += len;
- }
- WriteTree(subfolder, digests, defaultDirItem, updateItems, dest, pos);
- }
-}
-
-static void AddTag(AString &s, const char *name, const AString &value)
-{
- s += "<";
- s += name;
- s += ">";
- s += value;
- s += "</";
- s += name;
- s += ">";
-}
-
-static void AddTagUInt64(AString &s, const char *name, UInt64 value)
-{
- char temp[32];
- ConvertUInt64ToString(value, temp);
- AddTag(s, name, temp);
-}
-
-static AString TimeToXml(FILETIME &ft)
-{
- AString res;
- char temp[16] = { '0', 'x' };
- ConvertUInt32ToHexWithZeros(ft.dwHighDateTime, temp + 2);
- AddTag(res, "HIGHPART", temp);
- ConvertUInt32ToHexWithZeros(ft.dwLowDateTime, temp + 2);
- AddTag(res, "LOWPART", temp);
- return res;
-}
-
-void CHeader::SetDefaultFields(bool useLZX)
-{
- Version = kWimVersion;
- Flags = NHeaderFlags::kRpFix;
- ChunkSize = 0;
- if (useLZX)
- {
- Flags |= NHeaderFlags::kCompression | NHeaderFlags::kLZX;
- ChunkSize = kChunkSize;
- }
- g_RandomGenerator.Generate(Guid, 16);
- PartNumber = 1;
- NumParts = 1;
- NumImages = 1;
- BootIndex = 0;
- OffsetResource.Clear();
- XmlResource.Clear();
- MetadataResource.Clear();
- IntegrityResource.Clear();
-}
-
-static HRESULT UpdateArchive(ISequentialOutStream *seqOutStream,
- CDir &rootFolder,
- CObjectVector<CUpdateItem> &updateItems,
- IArchiveUpdateCallback *callback)
-{
- CMyComPtr<IOutStream> outStream;
- RINOK(seqOutStream->QueryInterface(IID_IOutStream, (void **)&outStream));
- if (!outStream)
- return E_NOTIMPL;
-
- UInt64 complexity = 0;
-
- int i;
- for (i = 0; i < updateItems.Size(); i++)
- complexity += updateItems[i].Size;
-
- RINOK(callback->SetTotal(complexity));
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(callback, true);
-
- complexity = 0;
-
- bool useCompression = false;
-
- CHeader header;
- header.SetDefaultFields(useCompression);
- Byte buf[kHeaderSizeMax];
- header.WriteTo(buf);
- RINOK(WriteStream(outStream, buf, kHeaderSizeMax));
-
- CHashList hashes;
- CObjectVector<CStreamInfo> streams;
-
- UInt64 curPos = kHeaderSizeMax;
- UInt64 unpackTotalSize = 0;
- for (i = 0; i < updateItems.Size(); i++)
- {
- lps->InSize = lps->OutSize = complexity;
- RINOK(lps->SetCur());
-
- CUpdateItem &ui = updateItems[i];
- if (ui.IsDir || ui.Size == 0)
- continue;
-
- CInStreamWithSha1 *inShaStreamSpec = new CInStreamWithSha1;
- CMyComPtr<ISequentialInStream> inShaStream = inShaStreamSpec;
-
- {
- CMyComPtr<ISequentialInStream> fileInStream;
- HRESULT res = callback->GetStream(i, &fileInStream);
- if (res != S_FALSE)
- {
- RINOK(res);
- inShaStreamSpec->SetStream(fileInStream);
- fileInStream.Release();
- inShaStreamSpec->Init();
- UInt64 offsetBlockSize = 0;
- if (useCompression)
- {
- for (UInt64 t = kChunkSize; t < ui.Size; t += kChunkSize)
- {
- Byte buf[8];
- SetUi32(buf, (UInt32)t);
- RINOK(WriteStream(outStream, buf, 4));
- offsetBlockSize += 4;
- }
- }
-
- RINOK(copyCoder->Code(inShaStream, outStream, NULL, NULL, progress));
- ui.Size = copyCoderSpec->TotalSize;
-
- CSha1Hash hash;
- unpackTotalSize += ui.Size;
- UInt64 packSize = offsetBlockSize + ui.Size;
- inShaStreamSpec->Final(hash.Hash);
- int index = hashes.AddUnique(hash);
- if (index >= 0)
- {
- ui.HashIndex = index;
- streams[index].RefCount++;
- outStream->Seek(-(Int64)packSize, STREAM_SEEK_CUR, &curPos);
- outStream->SetSize(curPos);
- }
- else
- {
- ui.HashIndex = hashes.Digests.Size() - 1;
- CStreamInfo s;
- s.Resource.PackSize = packSize;
- s.Resource.Offset = curPos;
- s.Resource.UnpackSize = ui.Size;
- s.Resource.Flags = 0;
- if (useCompression)
- s.Resource.Flags = NResourceFlags::Compressed;
- s.PartNumber = 1;
- s.RefCount = 1;
- memcpy(s.Hash, hash.Hash, kHashSize);
- streams.Add(s);
- curPos += packSize;
- }
- }
- fileInStream.Release();
- complexity += ui.Size;
- RINOK(callback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- }
- }
-
-
- CUpdateItem ri;
- FILETIME ft;
- NTime::GetCurUtcFileTime(ft);
- ri.MTime = ri.ATime = ri.CTime = ft;
- ri.Attrib = FILE_ATTRIBUTE_DIRECTORY;
-
- const UInt32 kSecuritySize = 8;
- size_t pos = kSecuritySize;
- WriteTree(rootFolder, hashes.Digests, ri, updateItems, NULL, pos);
-
- CByteBuffer meta;
- meta.SetCapacity(pos);
-
- // we can write 0 here only if there is no security data, imageX does it,
- // but some programs expect size = 8
- Set32((Byte *)meta, 8); // size of security data
- Set32((Byte *)meta + 4, 0); // num security entries
-
- pos = kSecuritySize;
- WriteTree(rootFolder, hashes.Digests, ri, updateItems, (Byte *)meta, pos);
-
- {
- NCrypto::NSha1::CContext sha;
- sha.Init();
- sha.Update((const Byte *)meta, pos);
- CSha1Hash digest;
- sha.Final(digest.Hash);
-
- CStreamInfo s;
- s.Resource.PackSize = pos;
- s.Resource.Offset = curPos;
- s.Resource.UnpackSize = pos;
- s.Resource.Flags = NResourceFlags::kMetadata;
- s.PartNumber = 1;
- s.RefCount = 1;
- memcpy(s.Hash, digest.Hash, kHashSize);
- streams.Add(s);
- RINOK(WriteStream(outStream, (const Byte *)meta, pos));
- meta.Free();
- curPos += pos;
- }
-
-
- header.OffsetResource.UnpackSize = header.OffsetResource.PackSize = (UInt64)streams.Size() * kStreamInfoSize;
- header.OffsetResource.Offset = curPos;
- header.OffsetResource.Flags = NResourceFlags::kMetadata;
-
- for (i = 0; i < streams.Size(); i++)
- {
- Byte buf[kStreamInfoSize];
- streams[i].WriteTo(buf);
- RINOK(WriteStream(outStream, buf, kStreamInfoSize));
- curPos += kStreamInfoSize;
- }
-
- AString xml = "<WIM>";
- AddTagUInt64(xml, "TOTALBYTES", curPos);
- xml += "<IMAGE INDEX=\"1\"><NAME>1</NAME>";
- AddTagUInt64(xml, "DIRCOUNT", rootFolder.GetNumDirs());
- AddTagUInt64(xml, "FILECOUNT", rootFolder.GetNumFiles());
- AddTagUInt64(xml, "TOTALBYTES", unpackTotalSize);
- NTime::GetCurUtcFileTime(ft);
- AddTag(xml, "CREATIONTIME", TimeToXml(ft));
- AddTag(xml, "LASTMODIFICATIONTIME", TimeToXml(ft));
- xml += "</IMAGE></WIM>";
-
- size_t xmlSize = (xml.Length() + 1) * 2;
- meta.SetCapacity(xmlSize);
- Set16((Byte *)meta, 0xFEFF);
- for (i = 0; i < xml.Length(); i++)
- Set16((Byte *)meta + 2 + i * 2, xml[i]);
- RINOK(WriteStream(outStream, (const Byte *)meta, xmlSize));
- meta.Free();
-
- header.XmlResource.UnpackSize = header.XmlResource.PackSize = xmlSize;
- header.XmlResource.Offset = curPos;
- header.XmlResource.Flags = NResourceFlags::kMetadata;
-
- outStream->Seek(0, STREAM_SEEK_SET, NULL);
- header.WriteTo(buf);
- return WriteStream(outStream, buf, kHeaderSizeMax);
-}
-
-STDMETHODIMP COutHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *callback)
-{
- COM_TRY_BEGIN
- CObjectVector<CUpdateItem> updateItems;
- CDir tree;
- tree.Dirs.Add(CDir());
- CDir &rootFolder = tree.Dirs.Back();
-
- for (UInt32 i = 0; i < numItems; i++)
- {
- CUpdateItem ui;
- Int32 newData, newProps;
- UInt32 indexInArchive;
- if (!callback)
- return E_FAIL;
- RINOK(callback->GetUpdateItemInfo(i, &newData, &newProps, &indexInArchive));
-
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidIsDir, &prop));
- if (prop.vt == VT_EMPTY)
- ui.IsDir = false;
- else if (prop.vt != VT_BOOL)
- return E_INVALIDARG;
- else
- ui.IsDir = (prop.boolVal != VARIANT_FALSE);
- }
-
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidAttrib, &prop));
- if (prop.vt == VT_EMPTY)
- ui.Attrib = (ui.IsDir ? FILE_ATTRIBUTE_DIRECTORY : 0);
- else if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- else
- ui.Attrib = prop.ulVal;
- }
-
- RINOK(GetTime(callback, i, kpidCTime, ui.CTime));
- RINOK(GetTime(callback, i, kpidATime, ui.ATime));
- RINOK(GetTime(callback, i, kpidMTime, ui.MTime));
-
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- ui.Size = prop.uhVal.QuadPart;
- }
-
- UString path;
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidPath, &prop));
- if (prop.vt == VT_BSTR)
- path = prop.bstrVal;
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
-
- CDir *curItem = &rootFolder;
- int len = path.Length();
- UString fileName;
- for (int j = 0; j < len; j++)
- {
- wchar_t c = path[j];
- if (c == WCHAR_PATH_SEPARATOR || c == L'/')
- {
- curItem = curItem->AddDir(updateItems, fileName, -1);
- fileName.Empty();
- }
- else
- fileName += c;
- }
-
- ui.Name = fileName;
- updateItems.Add(ui);
- if (ui.IsDir)
- curItem->AddDir(updateItems, fileName, (int)i);
- else
- curItem->Files.Add(i);
- }
- return UpdateArchive(outStream, tree, updateItems, callback);
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimIn.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimIn.cpp
deleted file mode 100644
index c210804df..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimIn.cpp
+++ /dev/null
@@ -1,855 +0,0 @@
-// Archive/WimIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/IntToString.h"
-
-#include "../../Common/StreamUtils.h"
-#include "../../Common/StreamObjects.h"
-#include "../../Common/LimitedStreams.h"
-
-#include "../Common/OutStreamWithSha1.h"
-
-#include "WimIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-namespace NArchive {
-namespace NWim {
-
-namespace NXpress {
-
-class CDecoderFlusher
-{
- CDecoder *m_Decoder;
-public:
- bool NeedFlush;
- CDecoderFlusher(CDecoder *decoder): m_Decoder(decoder), NeedFlush(true) {}
- ~CDecoderFlusher()
- {
- if (NeedFlush)
- m_Decoder->Flush();
- m_Decoder->ReleaseStreams();
- }
-};
-
-HRESULT CDecoder::CodeSpec(UInt32 outSize)
-{
- {
- Byte levels[kMainTableSize];
- for (unsigned i = 0; i < kMainTableSize; i += 2)
- {
- Byte b = m_InBitStream.DirectReadByte();
- levels[i] = b & 0xF;
- levels[i + 1] = b >> 4;
- }
- if (!m_MainDecoder.SetCodeLengths(levels))
- return S_FALSE;
- }
-
- while (outSize > 0)
- {
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
- if (number < 256)
- {
- m_OutWindowStream.PutByte((Byte)number);
- outSize--;
- }
- else
- {
- if (number >= kMainTableSize)
- return S_FALSE;
- UInt32 posLenSlot = number - 256;
- UInt32 posSlot = posLenSlot / kNumLenSlots;
- UInt32 len = posLenSlot % kNumLenSlots;
- UInt32 distance = (1 << posSlot) - 1 + m_InBitStream.ReadBits(posSlot);
-
- if (len == kNumLenSlots - 1)
- {
- len = m_InBitStream.DirectReadByte();
- if (len == 0xFF)
- {
- len = m_InBitStream.DirectReadByte();
- len |= (UInt32)m_InBitStream.DirectReadByte() << 8;
- }
- else
- len += kNumLenSlots - 1;
- }
-
- len += kMatchMinLen;
- UInt32 locLen = (len <= outSize ? len : outSize);
-
- if (!m_OutWindowStream.CopyBlock(distance, locLen))
- return S_FALSE;
-
- len -= locLen;
- outSize -= locLen;
- if (len != 0)
- return S_FALSE;
- }
- }
- return S_OK;
-}
-
-const UInt32 kDictSize = (1 << kNumPosSlots);
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize)
-{
- if (!m_OutWindowStream.Create(kDictSize) || !m_InBitStream.Create(1 << 16))
- return E_OUTOFMEMORY;
-
- CDecoderFlusher flusher(this);
-
- m_InBitStream.SetStream(inStream);
- m_OutWindowStream.SetStream(outStream);
- m_InBitStream.Init();
- m_OutWindowStream.Init(false);
-
- RINOK(CodeSpec(outSize));
-
- flusher.NeedFlush = false;
- return Flush();
-}
-
-HRESULT CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize)
-{
- try { return CodeReal(inStream, outStream, outSize); }
- catch(const CInBufferException &e) { return e.ErrorCode; } \
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}
-
-HRESULT CUnpacker::Unpack(IInStream *inStream, const CResource &resource, bool lzxMode,
- ISequentialOutStream *outStream, ICompressProgressInfo *progress)
-{
- RINOK(inStream->Seek(resource.Offset, STREAM_SEEK_SET, NULL));
-
- CLimitedSequentialInStream *limitedStreamSpec = new CLimitedSequentialInStream();
- CMyComPtr<ISequentialInStream> limitedStream = limitedStreamSpec;
- limitedStreamSpec->SetStream(inStream);
-
- if (!copyCoder)
- {
- copyCoderSpec = new NCompress::CCopyCoder;
- copyCoder = copyCoderSpec;
- }
- if (!resource.IsCompressed())
- {
- if (resource.PackSize != resource.UnpackSize)
- return S_FALSE;
- limitedStreamSpec->Init(resource.PackSize);
- return copyCoder->Code(limitedStreamSpec, outStream, NULL, NULL, progress);
- }
- if (resource.UnpackSize == 0)
- return S_OK;
- UInt64 numChunks = (resource.UnpackSize + kChunkSize - 1) >> kChunkSizeBits;
- unsigned entrySize = ((resource.UnpackSize > (UInt64)1 << 32) ? 8 : 4);
- UInt64 sizesBufSize64 = entrySize * (numChunks - 1);
- size_t sizesBufSize = (size_t)sizesBufSize64;
- if (sizesBufSize != sizesBufSize64)
- return E_OUTOFMEMORY;
- if (sizesBufSize > sizesBuf.GetCapacity())
- {
- sizesBuf.Free();
- sizesBuf.SetCapacity(sizesBufSize);
- }
- RINOK(ReadStream_FALSE(inStream, (Byte *)sizesBuf, sizesBufSize));
- const Byte *p = (const Byte *)sizesBuf;
-
- if (lzxMode && !lzxDecoder)
- {
- lzxDecoderSpec = new NCompress::NLzx::CDecoder(true);
- lzxDecoder = lzxDecoderSpec;
- RINOK(lzxDecoderSpec->SetParams(kChunkSizeBits));
- }
-
- UInt64 baseOffset = resource.Offset + sizesBufSize64;
- UInt64 outProcessed = 0;
- for (UInt32 i = 0; i < (UInt32)numChunks; i++)
- {
- UInt64 offset = 0;
- if (i > 0)
- {
- offset = (entrySize == 4) ? Get32(p): Get64(p);
- p += entrySize;
- }
- UInt64 nextOffset = resource.PackSize - sizesBufSize64;
- if (i + 1 < (UInt32)numChunks)
- nextOffset = (entrySize == 4) ? Get32(p): Get64(p);
- if (nextOffset < offset)
- return S_FALSE;
-
- RINOK(inStream->Seek(baseOffset + offset, STREAM_SEEK_SET, NULL));
- UInt64 inSize = nextOffset - offset;
- limitedStreamSpec->Init(inSize);
-
- if (progress)
- {
- RINOK(progress->SetRatioInfo(&offset, &outProcessed));
- }
-
- UInt32 outSize = kChunkSize;
- if (outProcessed + outSize > resource.UnpackSize)
- outSize = (UInt32)(resource.UnpackSize - outProcessed);
- UInt64 outSize64 = outSize;
- if (inSize == outSize)
- {
- RINOK(copyCoder->Code(limitedStreamSpec, outStream, NULL, &outSize64, NULL));
- }
- else
- {
- if (lzxMode)
- {
- lzxDecoderSpec->SetKeepHistory(false);
- RINOK(lzxDecoder->Code(limitedStreamSpec, outStream, NULL, &outSize64, NULL));
- }
- else
- {
- RINOK(xpressDecoder.Code(limitedStreamSpec, outStream, outSize));
- }
- }
- outProcessed += outSize;
- }
- return S_OK;
-}
-
-HRESULT CUnpacker::Unpack(IInStream *inStream, const CResource &resource, bool lzxMode,
- ISequentialOutStream *outStream, ICompressProgressInfo *progress, Byte *digest)
-{
- COutStreamWithSha1 *shaStreamSpec = new COutStreamWithSha1();
- CMyComPtr<ISequentialOutStream> shaStream = shaStreamSpec;
- shaStreamSpec->SetStream(outStream);
- shaStreamSpec->Init(digest != NULL);
- HRESULT result = Unpack(inStream, resource, lzxMode, shaStream, progress);
- if (digest)
- shaStreamSpec->Final(digest);
- return result;
-}
-
-static HRESULT UnpackData(IInStream *inStream, const CResource &resource, bool lzxMode, CByteBuffer &buf, Byte *digest)
-{
- size_t size = (size_t)resource.UnpackSize;
- if (size != resource.UnpackSize)
- return E_OUTOFMEMORY;
- buf.Free();
- buf.SetCapacity(size);
-
- CBufPtrSeqOutStream *outStreamSpec = new CBufPtrSeqOutStream();
- CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;
- outStreamSpec->Init((Byte *)buf, size);
-
- CUnpacker unpacker;
- return unpacker.Unpack(inStream, resource, lzxMode, outStream, NULL, digest);
-}
-
-void CResource::Parse(const Byte *p)
-{
- Flags = p[7];
- PackSize = Get64(p) & (((UInt64)1 << 56) - 1);
- Offset = Get64(p + 8);
- UnpackSize = Get64(p + 16);
-}
-
-#define GetResource(p, res) res.Parse(p)
-
-static void GetStream(bool oldVersion, const Byte *p, CStreamInfo &s)
-{
- s.Resource.Parse(p);
- if (oldVersion)
- {
- s.PartNumber = 1;
- s.Id = Get32(p + 24);
- s.RefCount = Get32(p + 28);
- memcpy(s.Hash, p + 32, kHashSize);
- }
- else
- {
- s.PartNumber = Get16(p + 24);
- s.RefCount = Get32(p + 26);
- memcpy(s.Hash, p + 30, kHashSize);
- }
-}
-
-static const wchar_t *kLongPath = L"[LongPath]";
-
-UString CDatabase::GetItemPath(const int index1) const
-{
- int size = 0;
- int index = index1;
- int newLevel;
- for (newLevel = 0;; newLevel = 1)
- {
- const CItem &item = Items[index];
- index = item.Parent;
- if (index >= 0 || !SkipRoot)
- size += item.Name.Length() + newLevel;
- if (index < 0)
- break;
- if ((UInt32)size >= ((UInt32)1 << 16))
- return kLongPath;
- }
-
- wchar_t temp[16];
- int imageLen = 0;
- if (ShowImageNumber)
- {
- ConvertUInt32ToString(-1 - index, temp);
- imageLen = MyStringLen(temp);
- size += imageLen + 1;
- }
- if ((UInt32)size >= ((UInt32)1 << 16))
- return kLongPath;
-
- UString path;
- wchar_t *s = path.GetBuffer(size);
- s[size] = 0;
- if (ShowImageNumber)
- {
- memcpy(s, temp, imageLen * sizeof(wchar_t));
- s[imageLen] = WCHAR_PATH_SEPARATOR;
- }
-
- index = index1;
-
- for (newLevel = 0;; newLevel = 1)
- {
- const CItem &item = Items[index];
- index = item.Parent;
- if (index >= 0 || !SkipRoot)
- {
- if (newLevel)
- s[--size] = WCHAR_PATH_SEPARATOR;
- size -= item.Name.Length();
- memcpy(s + size, item.Name, sizeof(wchar_t) * item.Name.Length());
- }
- if (index < 0)
- {
- path.ReleaseBuffer();
- return path;
- }
- }
-}
-
-static void GetFileTimeFromMem(const Byte *p, FILETIME *ft)
-{
- ft->dwLowDateTime = Get32(p);
- ft->dwHighDateTime = Get32(p + 4);
-}
-
-static HRESULT ReadName(const Byte *p, int size, UString &dest)
-{
- if (size == 0)
- return S_OK;
- if (Get16(p + size) != 0)
- return S_FALSE;
- wchar_t *s = dest.GetBuffer(size / 2);
- for (int i = 0; i <= size; i += 2)
- *s++ = Get16(p + i);
- dest.ReleaseBuffer();
- return S_OK;
-}
-
-HRESULT CDatabase::ParseDirItem(size_t pos, int parent)
-{
- if ((pos & 7) != 0)
- return S_FALSE;
-
- int prevIndex = -1;
- for (int numItems = 0;; numItems++)
- {
- if (OpenCallback)
- {
- UInt64 numFiles = Items.Size();
- if ((numFiles & 0x3FF) == 0)
- {
- RINOK(OpenCallback->SetCompleted(&numFiles, NULL));
- }
- }
- size_t rem = DirSize - pos;
- if (pos < DirStartOffset || pos > DirSize || rem < 8)
- return S_FALSE;
- const Byte *p = DirData + pos;
- UInt64 len = Get64(p);
- if (len == 0)
- {
- if (parent < 0 && numItems != 1)
- SkipRoot = false;
- DirProcessed += 8;
- return S_OK;
- }
- if ((len & 7) != 0 || rem < len)
- return S_FALSE;
- if (!IsOldVersion)
- if (len < 0x28)
- return S_FALSE;
- DirProcessed += (size_t)len;
- if (DirProcessed > DirSize)
- return S_FALSE;
- int extraOffset = 0;
- if (IsOldVersion)
- {
- if (len < 0x40 || (/* Get32(p + 12) == 0 && */ Get32(p + 0x14) != 0))
- {
- extraOffset = 0x10;
- }
- }
- else if (Get64(p + 8) == 0)
- extraOffset = 0x24;
- if (extraOffset)
- {
- if (prevIndex == -1)
- return S_FALSE;
- UInt32 fileNameLen = Get16(p + extraOffset);
- if ((fileNameLen & 1) != 0)
- return S_FALSE;
- /* Probably different versions of ImageX can use different number of
- additional ZEROs. So we don't use exact check. */
- UInt32 fileNameLen2 = (fileNameLen == 0 ? fileNameLen : fileNameLen + 2);
- if (((extraOffset + 2 + fileNameLen2 + 6) & ~7) > len)
- return S_FALSE;
-
- UString name;
- RINOK(ReadName(p + extraOffset + 2, fileNameLen, name));
-
- CItem &prevItem = Items[prevIndex];
- if (name.IsEmpty() && !prevItem.HasStream())
- {
- if (IsOldVersion)
- prevItem.Id = Get32(p + 8);
- else
- memcpy(prevItem.Hash, p + 0x10, kHashSize);
- }
- else
- {
- CItem item;
- item.Name = prevItem.Name + L':' + name;
- item.CTime = prevItem.CTime;
- item.ATime = prevItem.ATime;
- item.MTime = prevItem.MTime;
- if (IsOldVersion)
- {
- item.Id = Get32(p + 8);
- memset(item.Hash, 0, kHashSize);
- }
- else
- memcpy(item.Hash, p + 0x10, kHashSize);
- item.Attrib = 0;
- item.Order = Order++;
- item.Parent = parent;
- Items.Add(item);
- }
- pos += (size_t)len;
- continue;
- }
-
- UInt32 dirRecordSize = IsOldVersion ? kDirRecordSizeOld : kDirRecordSize;
- if (len < dirRecordSize)
- return S_FALSE;
-
- CItem item;
- item.Attrib = Get32(p + 8);
- // item.SecurityId = Get32(p + 0xC);
- UInt64 subdirOffset = Get64(p + 0x10);
- UInt32 timeOffset = IsOldVersion ? 0x18: 0x28;
- GetFileTimeFromMem(p + timeOffset, &item.CTime);
- GetFileTimeFromMem(p + timeOffset + 8, &item.ATime);
- GetFileTimeFromMem(p + timeOffset + 16, &item.MTime);
- if (IsOldVersion)
- {
- item.Id = Get32(p + 0x10);
- memset(item.Hash, 0, kHashSize);
- }
- else
- {
- memcpy(item.Hash, p + 0x40, kHashSize);
- }
- // UInt32 numStreams = Get16(p + dirRecordSize - 6);
- UInt32 shortNameLen = Get16(p + dirRecordSize - 4);
- UInt32 fileNameLen = Get16(p + dirRecordSize - 2);
-
- if ((shortNameLen & 1) != 0 || (fileNameLen & 1) != 0)
- return S_FALSE;
-
- UInt32 shortNameLen2 = (shortNameLen == 0 ? shortNameLen : shortNameLen + 2);
- UInt32 fileNameLen2 = (fileNameLen == 0 ? fileNameLen : fileNameLen + 2);
-
- if (((dirRecordSize + fileNameLen2 + shortNameLen2 + 6) & ~7) > len)
- return S_FALSE;
- p += dirRecordSize;
-
- RINOK(ReadName(p, fileNameLen, item.Name));
- RINOK(ReadName(p + fileNameLen2, shortNameLen, item.ShortName));
-
- if (parent < 0 && (shortNameLen || fileNameLen || !item.IsDir()))
- SkipRoot = false;
-
- /*
- // there are some extra data for some files.
- p -= dirRecordSize;
- p += ((dirRecordSize + fileNameLen2 + shortNameLen2 + 6) & ~7);
- if (((dirRecordSize + fileNameLen2 + shortNameLen2 + 6) & ~7) != len)
- p = p;
- */
-
- /*
- if (parent >= 0)
- {
- UString s = GetItemPath(parent) + L"\\" + item.Name;
- printf("\n%s %8x %S", item.IsDir() ? "D" : " ", (int)subdirOffset, (const wchar_t *)s);
- }
- */
-
- if (fileNameLen == 0 && item.IsDir() && !item.HasStream())
- item.Attrib = 0x10; // some swm archives have system/hidden attributes for root
-
- item.Parent = parent;
- prevIndex = Items.Add(item);
- if (item.IsDir() && subdirOffset != 0)
- {
- RINOK(ParseDirItem((size_t)subdirOffset, prevIndex));
- }
- Items[prevIndex].Order = Order++;
- pos += (size_t)len;
- }
-}
-
-HRESULT CDatabase::ParseImageDirs(const CByteBuffer &buf, int parent)
-{
- DirData = buf;
- DirSize = buf.GetCapacity();
-
- size_t pos = 0;
- if (DirSize < 8)
- return S_FALSE;
- const Byte *p = DirData;
- UInt32 totalLength = Get32(p);
- if (IsOldVersion)
- {
- for (pos = 4;; pos += 8)
- {
- if (pos + 4 > DirSize)
- return S_FALSE;
- UInt32 n = Get32(p + pos);
- if (n == 0)
- break;
- if (pos + 8 > DirSize)
- return S_FALSE;
- totalLength += Get32(p + pos + 4);
- if (totalLength > DirSize)
- return S_FALSE;
- }
- pos += totalLength + 4;
- pos = (pos + 7) & ~(size_t)7;
- if (pos > DirSize)
- return S_FALSE;
- }
- else
- {
-
- // UInt32 numEntries = Get32(p + 4);
- pos += 8;
- {
- /*
- CRecordVector<UInt64> entryLens;
- UInt64 sum = 0;
- for (UInt32 i = 0; i < numEntries; i++)
- {
- if (pos + 8 > DirSize)
- return S_FALSE;
- UInt64 len = Get64(p + pos);
- entryLens.Add(len);
- sum += len;
- pos += 8;
- }
- pos += (size_t)sum; // skip security descriptors
- while ((pos & 7) != 0)
- pos++;
- if (pos != totalLength)
- return S_FALSE;
- */
- if (totalLength == 0)
- pos = 8;
- else if (totalLength < 8)
- return S_FALSE;
- else
- pos = totalLength;
- }
- }
- DirStartOffset = DirProcessed = pos;
- RINOK(ParseDirItem(pos, parent));
- if (DirProcessed == DirSize)
- return S_OK;
- /* Original program writes additional 8 bytes (END_OF_ROOT_FOLDER), but
- reference to that folder is empty */
- if (DirProcessed == DirSize - 8 && DirProcessed - DirStartOffset == 112 &&
- Get64(p + DirSize - 8) == 0)
- return S_OK;
- return S_FALSE;
-}
-
-HRESULT CHeader::Parse(const Byte *p)
-{
- UInt32 headerSize = Get32(p + 8);
- Version = Get32(p + 0x0C);
- Flags = Get32(p + 0x10);
- if (!IsSupported())
- return S_FALSE;
- ChunkSize = Get32(p + 0x14);
- if (ChunkSize != kChunkSize && ChunkSize != 0)
- return S_FALSE;
- int offset;
- if (IsOldVersion())
- {
- if (headerSize != 0x60)
- return S_FALSE;
- memset(Guid, 0, 16);
- offset = 0x18;
- PartNumber = 1;
- NumParts = 1;
- }
- else
- {
- if (headerSize < 0x74)
- return S_FALSE;
- memcpy(Guid, p + 0x18, 16);
- PartNumber = Get16(p + 0x28);
- NumParts = Get16(p + 0x2A);
- offset = 0x2C;
- if (IsNewVersion())
- {
- NumImages = Get32(p + offset);
- offset += 4;
- }
- }
- GetResource(p + offset, OffsetResource);
- GetResource(p + offset + 0x18, XmlResource);
- GetResource(p + offset + 0x30, MetadataResource);
- if (IsNewVersion())
- {
- if (headerSize < 0xD0)
- return S_FALSE;
- BootIndex = Get32(p + 0x48);
- IntegrityResource.Parse(p + offset + 0x4C);
- }
- return S_OK;
-}
-
-const Byte kSignature[kSignatureSize] = { 'M', 'S', 'W', 'I', 'M', 0, 0, 0 };
-
-HRESULT ReadHeader(IInStream *inStream, CHeader &h)
-{
- Byte p[kHeaderSizeMax];
- RINOK(ReadStream_FALSE(inStream, p, kHeaderSizeMax));
- if (memcmp(p, kSignature, kSignatureSize) != 0)
- return S_FALSE;
- return h.Parse(p);
-}
-
-static HRESULT ReadStreams(bool oldVersion, IInStream *inStream, const CHeader &h, CDatabase &db)
-{
- CByteBuffer offsetBuf;
- RINOK(UnpackData(inStream, h.OffsetResource, h.IsLzxMode(), offsetBuf, NULL));
- size_t i;
- size_t streamInfoSize = oldVersion ? kStreamInfoSize + 2 : kStreamInfoSize;
- for (i = 0; offsetBuf.GetCapacity() - i >= streamInfoSize; i += streamInfoSize)
- {
- CStreamInfo s;
- GetStream(oldVersion, (const Byte *)offsetBuf + i, s);
- if (s.PartNumber == h.PartNumber)
- db.Streams.Add(s);
- }
- return (i == offsetBuf.GetCapacity()) ? S_OK : S_FALSE;
-}
-
-static bool IsEmptySha(const Byte *data)
-{
- for (int i = 0; i < kHashSize; i++)
- if (data[i] != 0)
- return false;
- return true;
-}
-
-HRESULT CDatabase::Open(IInStream *inStream, const CHeader &h, CByteBuffer &xml, IArchiveOpenCallback *openCallback)
-{
- OpenCallback = openCallback;
- IsOldVersion = h.IsOldVersion();
- RINOK(UnpackData(inStream, h.XmlResource, h.IsLzxMode(), xml, NULL));
- RINOK(ReadStreams(h.IsOldVersion(), inStream, h, *this));
- bool needBootMetadata = !h.MetadataResource.IsEmpty();
- Order = 0;
- if (h.PartNumber == 1)
- {
- int imageIndex = 1;
- for (int i = 0; i < Streams.Size(); i++)
- {
- // if (imageIndex > 1) break;
- const CStreamInfo &si = Streams[i];
- if (!si.Resource.IsMetadata() || si.PartNumber != h.PartNumber)
- continue;
- Byte hash[kHashSize];
- CByteBuffer metadata;
- RINOK(UnpackData(inStream, si.Resource, h.IsLzxMode(), metadata, hash));
- if (memcmp(hash, si.Hash, kHashSize) != 0 &&
- !(h.IsOldVersion() && IsEmptySha(si.Hash)))
- return S_FALSE;
- NumImages++;
- RINOK(ParseImageDirs(metadata, -(int)(++imageIndex)));
- if (needBootMetadata)
- if (h.MetadataResource.Offset == si.Resource.Offset)
- needBootMetadata = false;
- }
- }
-
- if (needBootMetadata)
- {
- CByteBuffer metadata;
- RINOK(UnpackData(inStream, h.MetadataResource, h.IsLzxMode(), metadata, NULL));
- RINOK(ParseImageDirs(metadata, -1));
- NumImages++;
- }
- return S_OK;
-}
-
-
-static int CompareStreamsByPos(const CStreamInfo *p1, const CStreamInfo *p2, void * /* param */)
-{
- int res = MyCompare(p1->PartNumber, p2->PartNumber);
- if (res != 0)
- return res;
- return MyCompare(p1->Resource.Offset, p2->Resource.Offset);
-}
-
-static int CompareIDs(const int *p1, const int *p2, void *param)
-{
- const CRecordVector<CStreamInfo> &streams = *(const CRecordVector<CStreamInfo> *)param;
- return MyCompare(streams[*p1].Id, streams[*p2].Id);
-}
-
-static int CompareHashRefs(const int *p1, const int *p2, void *param)
-{
- const CRecordVector<CStreamInfo> &streams = *(const CRecordVector<CStreamInfo> *)param;
- return memcmp(streams[*p1].Hash, streams[*p2].Hash, kHashSize);
-}
-
-static int FindId(const CRecordVector<CStreamInfo> &streams,
- const CIntVector &sortedByHash, UInt32 id)
-{
- int left = 0, right = streams.Size();
- while (left != right)
- {
- int mid = (left + right) / 2;
- int streamIndex = sortedByHash[mid];
- UInt32 id2 = streams[streamIndex].Id;
- if (id == id2)
- return streamIndex;
- if (id < id2)
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
-}
-
-static int FindHash(const CRecordVector<CStreamInfo> &streams,
- const CIntVector &sortedByHash, const Byte *hash)
-{
- int left = 0, right = streams.Size();
- while (left != right)
- {
- int mid = (left + right) / 2;
- int streamIndex = sortedByHash[mid];
- UInt32 i;
- const Byte *hash2 = streams[streamIndex].Hash;
- for (i = 0; i < kHashSize; i++)
- if (hash[i] != hash2[i])
- break;
- if (i == kHashSize)
- return streamIndex;
- if (hash[i] < hash2[i])
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
-}
-
-static int CompareItems(const int *a1, const int *a2, void *param)
-{
- const CObjectVector<CItem> &items = ((CDatabase *)param)->Items;
- const CItem &i1 = items[*a1];
- const CItem &i2 = items[*a2];
-
- if (i1.IsDir() != i2.IsDir())
- return i1.IsDir() ? 1 : -1;
- int res = MyCompare(i1.StreamIndex, i2.StreamIndex);
- if (res != 0)
- return res;
- return MyCompare(i1.Order, i2.Order);
-}
-
-HRESULT CDatabase::Sort(bool skipRootDir)
-{
- Streams.Sort(CompareStreamsByPos, NULL);
-
- {
- CIntVector sortedByHash;
- {
- for (int i = 0; i < Streams.Size(); i++)
- sortedByHash.Add(i);
- if (IsOldVersion)
- sortedByHash.Sort(CompareIDs, &Streams);
- else
- sortedByHash.Sort(CompareHashRefs, &Streams);
- }
-
- for (int i = 0; i < Items.Size(); i++)
- {
- CItem &item = Items[i];
- item.StreamIndex = -1;
- if (item.HasStream())
- if (IsOldVersion)
- item.StreamIndex = FindId(Streams, sortedByHash, item.Id);
- else
- item.StreamIndex = FindHash(Streams, sortedByHash, item.Hash);
- }
- }
-
- {
- CRecordVector<bool> used;
- int i;
- for (i = 0; i < Streams.Size(); i++)
- {
- const CStreamInfo &s = Streams[i];
- used.Add(s.Resource.IsMetadata() && s.PartNumber == 1);
- // used.Add(false);
- }
- for (i = 0; i < Items.Size(); i++)
- {
- CItem &item = Items[i];
- if (item.StreamIndex >= 0)
- used[item.StreamIndex] = true;
- }
- for (i = 0; i < Streams.Size(); i++)
- if (!used[i])
- {
- CItem item;
- item.StreamIndex = i;
- item.HasMetadata = false;
- Items.Add(item);
- }
- }
-
- SortedItems.Reserve(Items.Size());
- for (int i = (skipRootDir ? 1 : 0); i < Items.Size(); i++)
- SortedItems.Add(i);
- SortedItems.Sort(CompareItems, this);
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimIn.h b/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimIn.h
deleted file mode 100644
index da3e28a56..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimIn.h
+++ /dev/null
@@ -1,297 +0,0 @@
-// Archive/WimIn.h
-
-#ifndef __ARCHIVE_WIM_IN_H
-#define __ARCHIVE_WIM_IN_H
-
-#include "Common/Buffer.h"
-#include "Common/MyString.h"
-
-#include "../../Compress/CopyCoder.h"
-#include "../../Compress/LzxDecoder.h"
-
-#include "../IArchive.h"
-
-namespace NArchive {
-namespace NWim {
-
-namespace NXpress {
-
-class CBitStream
-{
- CInBuffer m_Stream;
- UInt32 m_Value;
- unsigned m_BitPos;
-public:
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *s) { m_Stream.SetStream(s); }
- void ReleaseStream() { m_Stream.ReleaseStream(); }
-
- void Init() { m_Stream.Init(); m_BitPos = 0; }
- // UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - m_BitPos / 8; }
- Byte DirectReadByte() { return m_Stream.ReadByte(); }
-
- void Normalize()
- {
- if (m_BitPos < 16)
- {
- Byte b0 = m_Stream.ReadByte();
- Byte b1 = m_Stream.ReadByte();
- m_Value = (m_Value << 8) | b1;
- m_Value = (m_Value << 8) | b0;
- m_BitPos += 16;
- }
- }
-
- UInt32 GetValue(unsigned numBits)
- {
- Normalize();
- return (m_Value >> (m_BitPos - numBits)) & ((1 << numBits) - 1);
- }
-
- void MovePos(unsigned numBits) { m_BitPos -= numBits; }
-
- UInt32 ReadBits(unsigned numBits)
- {
- UInt32 res = GetValue(numBits);
- m_BitPos -= numBits;
- return res;
- }
-};
-
-const unsigned kNumHuffmanBits = 16;
-const UInt32 kMatchMinLen = 3;
-const UInt32 kNumLenSlots = 16;
-const UInt32 kNumPosSlots = 16;
-const UInt32 kNumPosLenSlots = kNumPosSlots * kNumLenSlots;
-const UInt32 kMainTableSize = 256 + kNumPosLenSlots;
-
-class CDecoder
-{
- CBitStream m_InBitStream;
- CLzOutWindow m_OutWindowStream;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
-
- HRESULT CodeSpec(UInt32 size);
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize);
-public:
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
- HRESULT Flush() { return m_OutWindowStream.Flush(); }
- HRESULT Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize);
-};
-
-}
-
-namespace NResourceFlags
-{
- const Byte kFree = 1;
- const Byte kMetadata = 2;
- const Byte Compressed = 4;
- const Byte Spanned = 4;
-}
-
-struct CResource
-{
- UInt64 PackSize;
- UInt64 Offset;
- UInt64 UnpackSize;
- Byte Flags;
-
- void Clear()
- {
- PackSize = 0;
- Offset = 0;
- UnpackSize = 0;
- Flags = 0;
- }
- void Parse(const Byte *p);
- void WriteTo(Byte *p) const;
- bool IsFree() const { return (Flags & NResourceFlags::kFree) != 0; }
- bool IsMetadata() const { return (Flags & NResourceFlags::kMetadata) != 0; }
- bool IsCompressed() const { return (Flags & NResourceFlags::Compressed) != 0; }
- bool IsEmpty() const { return (UnpackSize == 0); }
-};
-
-namespace NHeaderFlags
-{
- const UInt32 kCompression = 2;
- const UInt32 kSpanned = 8;
- const UInt32 kRpFix = 0x80;
- const UInt32 kXPRESS = 0x20000;
- const UInt32 kLZX = 0x40000;
-}
-
-const UInt32 kWimVersion = 0x010D00;
-const UInt32 kHeaderSizeMax = 0xD0;
-const UInt32 kSignatureSize = 8;
-extern const Byte kSignature[kSignatureSize];
-const unsigned kChunkSizeBits = 15;
-const UInt32 kChunkSize = (1 << kChunkSizeBits);
-
-struct CHeader
-{
- UInt32 Version;
- UInt32 Flags;
- UInt32 ChunkSize;
- Byte Guid[16];
- UInt16 PartNumber;
- UInt16 NumParts;
- UInt32 NumImages;
-
- CResource OffsetResource;
- CResource XmlResource;
- CResource MetadataResource;
- CResource IntegrityResource;
- UInt32 BootIndex;
-
- void SetDefaultFields(bool useLZX);
-
- void WriteTo(Byte *p) const;
- HRESULT Parse(const Byte *p);
- bool IsCompressed() const { return (Flags & NHeaderFlags::kCompression) != 0; }
- bool IsSupported() const { return (!IsCompressed() || (Flags & NHeaderFlags::kLZX) != 0 || (Flags & NHeaderFlags::kXPRESS) != 0 ) ; }
- bool IsLzxMode() const { return (Flags & NHeaderFlags::kLZX) != 0; }
- bool IsSpanned() const { return (!IsCompressed() || (Flags & NHeaderFlags::kSpanned) != 0); }
- bool IsOldVersion() const { return (Version <= 0x010A00); }
- bool IsNewVersion() const { return (Version > 0x010C00); }
-
- bool AreFromOnArchive(const CHeader &h)
- {
- return (memcmp(Guid, h.Guid, sizeof(Guid)) == 0) && (h.NumParts == NumParts);
- }
-};
-
-const UInt32 kHashSize = 20;
-const UInt32 kStreamInfoSize = 24 + 2 + 4 + kHashSize;
-
-struct CStreamInfo
-{
- CResource Resource;
- UInt16 PartNumber;
- UInt32 RefCount;
- UInt32 Id;
- BYTE Hash[kHashSize];
-
- void WriteTo(Byte *p) const;
-};
-
-const UInt32 kDirRecordSizeOld = 62;
-const UInt32 kDirRecordSize = 102;
-
-struct CItem
-{
- UString Name;
- UString ShortName;
- UInt32 Attrib;
- // UInt32 SecurityId;
- BYTE Hash[kHashSize];
- UInt32 Id;
- FILETIME CTime;
- FILETIME ATime;
- FILETIME MTime;
- // UInt32 ReparseTag;
- // UInt64 HardLink;
- // UInt16 NumStreams;
- int StreamIndex;
- int Parent;
- unsigned Order;
- bool HasMetadata;
- CItem(): HasMetadata(true), StreamIndex(-1), Id(0) {}
- bool IsDir() const { return HasMetadata && ((Attrib & 0x10) != 0); }
- bool HasStream() const
- {
- for (unsigned i = 0; i < kHashSize; i++)
- if (Hash[i] != 0)
- return true;
- return Id != 0;
- }
-};
-
-class CDatabase
-{
- const Byte *DirData;
- size_t DirSize;
- size_t DirProcessed;
- size_t DirStartOffset;
- int Order;
- IArchiveOpenCallback *OpenCallback;
-
- HRESULT ParseDirItem(size_t pos, int parent);
- HRESULT ParseImageDirs(const CByteBuffer &buf, int parent);
-
-public:
- CRecordVector<CStreamInfo> Streams;
- CObjectVector<CItem> Items;
- CIntVector SortedItems;
- int NumImages;
- bool SkipRoot;
- bool ShowImageNumber;
-
- bool IsOldVersion;
-
- UInt64 GetUnpackSize() const
- {
- UInt64 res = 0;
- for (int i = 0; i < Streams.Size(); i++)
- res += Streams[i].Resource.UnpackSize;
- return res;
- }
-
- UInt64 GetPackSize() const
- {
- UInt64 res = 0;
- for (int i = 0; i < Streams.Size(); i++)
- res += Streams[i].Resource.PackSize;
- return res;
- }
-
- void Clear()
- {
- Streams.Clear();
- Items.Clear();
- SortedItems.Clear();
- NumImages = 0;
-
- SkipRoot = true;
- ShowImageNumber = true;
- IsOldVersion = false;
- }
-
- UString GetItemPath(int index) const;
-
- HRESULT Open(IInStream *inStream, const CHeader &h, CByteBuffer &xml, IArchiveOpenCallback *openCallback);
-
- void DetectPathMode()
- {
- ShowImageNumber = (NumImages != 1);
- }
-
- HRESULT Sort(bool skipRootDir);
-};
-
-HRESULT ReadHeader(IInStream *inStream, CHeader &header);
-
-class CUnpacker
-{
- NCompress::CCopyCoder *copyCoderSpec;
- CMyComPtr<ICompressCoder> copyCoder;
-
- NCompress::NLzx::CDecoder *lzxDecoderSpec;
- CMyComPtr<ICompressCoder> lzxDecoder;
-
- NXpress::CDecoder xpressDecoder;
-
- CByteBuffer sizesBuf;
- HRESULT Unpack(IInStream *inStream, const CResource &res, bool lzxMode,
- ISequentialOutStream *outStream, ICompressProgressInfo *progress);
-public:
- HRESULT Unpack(IInStream *inStream, const CResource &res, bool lzxMode,
- ISequentialOutStream *outStream, ICompressProgressInfo *progress, Byte *digest);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimRegister.cpp
deleted file mode 100644
index 8da914360..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Wim/WimRegister.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// WimRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "WimHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NWim::CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new NArchive::NWim::COutHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
- { L"wim", L"wim swm", 0, 0xE6, { 'M', 'S', 'W', 'I', 'M', 0, 0, 0 }, 8, false, CreateArc, CreateArcOut };
-
-REGISTER_ARC(Wim)
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/XarHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/XarHandler.cpp
deleted file mode 100644
index e7d88b6c7..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/XarHandler.cpp
+++ /dev/null
@@ -1,588 +0,0 @@
-// XarHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/MyXml.h"
-#include "Common/StringToInt.h"
-#include "Common/UTFConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/BZip2Decoder.h"
-#include "../Compress/CopyCoder.h"
-#include "../Compress/ZlibDecoder.h"
-
-#include "Common/OutStreamWithSha1.h"
-
-#define XAR_SHOW_RAW
-
-#define Get16(p) GetBe16(p)
-#define Get32(p) GetBe32(p)
-#define Get64(p) GetBe64(p)
-
-namespace NArchive {
-namespace NXar {
-
-struct CFile
-{
- AString Name;
- AString Method;
- UInt64 Size;
- UInt64 PackSize;
- UInt64 Offset;
-
- // UInt32 mode;
- UInt64 CTime;
- UInt64 MTime;
- UInt64 ATime;
-
- bool IsDir;
- bool HasData;
-
- bool Sha1IsDefined;
- Byte Sha1[20];
- // bool packSha1IsDefined;
- // Byte packSha1[20];
-
- int Parent;
-
- CFile(): IsDir(false), HasData(false), Sha1IsDefined(false),
- /* packSha1IsDefined(false), */
- Parent(-1), Size(0), PackSize(0), CTime(0), MTime(0), ATime(0) {}
-};
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- UInt64 _dataStartPos;
- CMyComPtr<IInStream> _inStream;
- AString _xml;
- CObjectVector<CFile> _files;
-
- HRESULT Open2(IInStream *stream);
- HRESULT Extract(IInStream *stream);
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-const UInt32 kXmlSizeMax = ((UInt32)1 << 30) - (1 << 14);
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidMethod, VT_BSTR}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-static bool ParseNumber(const char *s, int size, UInt32 &res)
-{
- const char *end;
- res = (UInt32)ConvertStringToUInt64(s, &end);
- return (end - s == size);
-}
-
-static bool ParseUInt64(const CXmlItem &item, const char *name, UInt64 &res)
-{
- AString s = item.GetSubStringForTag(name);
- const char *end;
- res = ConvertStringToUInt64(s, &end);
- return (end - (const char *)s == s.Length());
-}
-
-static UInt64 ParseTime(const CXmlItem &item, const char *name)
-{
- AString s = item.GetSubStringForTag(name);
- if (s.Length() < 20)
- return 0;
- const char *p = s;
- if (p[ 4] != '-' || p[ 7] != '-' || p[10] != 'T' ||
- p[13] != ':' || p[16] != ':' || p[19] != 'Z')
- return 0;
- UInt32 year, month, day, hour, min, sec;
- if (!ParseNumber(p, 4, year )) return 0;
- if (!ParseNumber(p + 5, 2, month)) return 0;
- if (!ParseNumber(p + 8, 2, day )) return 0;
- if (!ParseNumber(p + 11, 2, hour )) return 0;
- if (!ParseNumber(p + 14, 2, min )) return 0;
- if (!ParseNumber(p + 17, 2, sec )) return 0;
-
- UInt64 numSecs;
- if (!NWindows::NTime::GetSecondsSince1601(year, month, day, hour, min, sec, numSecs))
- return 0;
- return numSecs * 10000000;
-}
-
-static bool HexToByte(char c, Byte &res)
-{
- if (c >= '0' && c <= '9') res = c - '0';
- else if (c >= 'A' && c <= 'F') res = c - 'A' + 10;
- else if (c >= 'a' && c <= 'f') res = c - 'a' + 10;
- else return false;
- return true;
-}
-
-#define METHOD_NAME_ZLIB "zlib"
-
-static bool ParseSha1(const CXmlItem &item, const char *name, Byte *digest)
-{
- int index = item.FindSubTag(name);
- if (index < 0)
- return false;
- const CXmlItem &checkItem = item.SubItems[index];
- AString style = checkItem.GetPropertyValue("style");
- if (style == "SHA1")
- {
- AString s = checkItem.GetSubString();
- if (s.Length() != 40)
- return false;
- for (int i = 0; i < s.Length(); i += 2)
- {
- Byte b0, b1;
- if (!HexToByte(s[i], b0) || !HexToByte(s[i + 1], b1))
- return false;
- digest[i / 2] = (b0 << 4) | b1;
- }
- return true;
- }
- return false;
-}
-
-static bool AddItem(const CXmlItem &item, CObjectVector<CFile> &files, int parent)
-{
- if (!item.IsTag)
- return true;
- if (item.Name == "file")
- {
- CFile file;
- file.Parent = parent;
- parent = files.Size();
- file.Name = item.GetSubStringForTag("name");
- AString type = item.GetSubStringForTag("type");
- if (type == "directory")
- file.IsDir = true;
- else if (type == "file")
- file.IsDir = false;
- else
- return false;
-
- int dataIndex = item.FindSubTag("data");
- if (dataIndex >= 0 && !file.IsDir)
- {
- file.HasData = true;
- const CXmlItem &dataItem = item.SubItems[dataIndex];
- if (!ParseUInt64(dataItem, "size", file.Size))
- return false;
- if (!ParseUInt64(dataItem, "length", file.PackSize))
- return false;
- if (!ParseUInt64(dataItem, "offset", file.Offset))
- return false;
- file.Sha1IsDefined = ParseSha1(dataItem, "extracted-checksum", file.Sha1);
- // file.packSha1IsDefined = ParseSha1(dataItem, "archived-checksum", file.packSha1);
- int encodingIndex = dataItem.FindSubTag("encoding");
- if (encodingIndex >= 0)
- {
- const CXmlItem &encodingItem = dataItem.SubItems[encodingIndex];
- if (encodingItem.IsTag)
- {
- AString s = encodingItem.GetPropertyValue("style");
- if (s.Length() >= 0)
- {
- AString appl = "application/";
- if (s.Left(appl.Length()) == appl)
- {
- s = s.Mid(appl.Length());
- AString xx = "x-";
- if (s.Left(xx.Length()) == xx)
- {
- s = s.Mid(xx.Length());
- if (s == "gzip")
- s = METHOD_NAME_ZLIB;
- }
- }
- file.Method = s;
- }
- }
- }
- }
-
- file.CTime = ParseTime(item, "ctime");
- file.MTime = ParseTime(item, "mtime");
- file.ATime = ParseTime(item, "atime");
- files.Add(file);
- }
- for (int i = 0; i < item.SubItems.Size(); i++)
- if (!AddItem(item.SubItems[i], files, parent))
- return false;
- return true;
-}
-
-HRESULT CHandler::Open2(IInStream *stream)
-{
- UInt64 archiveStartPos;
- RINOK(stream->Seek(0, STREAM_SEEK_SET, &archiveStartPos));
-
- const UInt32 kHeaderSize = 0x1C;
- Byte buf[kHeaderSize];
- RINOK(ReadStream_FALSE(stream, buf, kHeaderSize));
-
- UInt32 size = Get16(buf + 4);
- // UInt32 ver = Get16(buf + 6); // == 0
- if (Get32(buf) != 0x78617221 || size != kHeaderSize)
- return S_FALSE;
-
- UInt64 packSize = Get64(buf + 8);
- UInt64 unpackSize = Get64(buf + 0x10);
- // UInt32 checkSumAlogo = Get32(buf + 0x18);
-
- if (unpackSize >= kXmlSizeMax)
- return S_FALSE;
-
- _dataStartPos = archiveStartPos + kHeaderSize + packSize;
-
- char *ss = _xml.GetBuffer((int)unpackSize + 1);
-
- NCompress::NZlib::CDecoder *zlibCoderSpec = new NCompress::NZlib::CDecoder();
- CMyComPtr<ICompressCoder> zlibCoder = zlibCoderSpec;
-
- CLimitedSequentialInStream *inStreamLimSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStreamLim(inStreamLimSpec);
- inStreamLimSpec->SetStream(stream);
- inStreamLimSpec->Init(packSize);
-
- CBufPtrSeqOutStream *outStreamLimSpec = new CBufPtrSeqOutStream;
- CMyComPtr<ISequentialOutStream> outStreamLim(outStreamLimSpec);
- outStreamLimSpec->Init((Byte *)ss, (size_t)unpackSize);
-
- RINOK(zlibCoder->Code(inStreamLim, outStreamLim, NULL, NULL, NULL));
-
- if (outStreamLimSpec->GetPos() != (size_t)unpackSize)
- return S_FALSE;
-
- ss[(size_t)unpackSize] = 0;
- _xml.ReleaseBuffer();
-
- CXml xml;
- if (!xml.Parse(_xml))
- return S_FALSE;
-
- if (!xml.Root.IsTagged("xar") || xml.Root.SubItems.Size() != 1)
- return S_FALSE;
- const CXmlItem &toc = xml.Root.SubItems[0];
- if (!toc.IsTagged("toc"))
- return S_FALSE;
- if (!AddItem(toc, _files, -1))
- return S_FALSE;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- {
- Close();
- if (Open2(stream) != S_OK)
- return S_FALSE;
- _inStream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _inStream.Release();
- _files.Clear();
- _xml.Empty();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _files.Size()
- #ifdef XAR_SHOW_RAW
- + 1
- #endif
- ;
- return S_OK;
-}
-
-static void TimeToProp(UInt64 t, NWindows::NCOM::CPropVariant &prop)
-{
- if (t != 0)
- {
- FILETIME ft;
- ft.dwLowDateTime = (UInt32)(t);
- ft.dwHighDateTime = (UInt32)(t >> 32);
- prop = ft;
- }
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- #ifdef XAR_SHOW_RAW
- if ((int)index == _files.Size())
- {
- switch(propID)
- {
- case kpidPath: prop = L"[TOC].xml"; break;
- case kpidSize:
- case kpidPackSize: prop = (UInt64)_xml.Length(); break;
- }
- }
- else
- #endif
- {
- const CFile &item = _files[index];
- switch(propID)
- {
- case kpidMethod:
- {
- UString name;
- if (!item.Method.IsEmpty() && ConvertUTF8ToUnicode(item.Method, name))
- prop = name;
- break;
- }
- case kpidPath:
- {
- AString path;
- int cur = index;
- do
- {
- const CFile &item = _files[cur];
- AString s = item.Name;
- if (s.IsEmpty())
- s = "unknown";
- if (path.IsEmpty())
- path = s;
- else
- path = s + CHAR_PATH_SEPARATOR + path;
- cur = item.Parent;
- }
- while (cur >= 0);
-
- UString name;
- if (ConvertUTF8ToUnicode(path, name))
- prop = name;
- break;
- }
-
- case kpidIsDir: prop = item.IsDir; break;
- case kpidSize: if (!item.IsDir) prop = item.Size; break;
- case kpidPackSize: if (!item.IsDir) prop = item.PackSize; break;
-
- case kpidMTime: TimeToProp(item.MTime, prop); break;
- case kpidCTime: TimeToProp(item.CTime, prop); break;
- case kpidATime: TimeToProp(item.ATime, prop); break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _files.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- int index = (int)(allFilesMode ? i : indices[i]);
- #ifdef XAR_SHOW_RAW
- if (index == _files.Size())
- totalSize += _xml.Length();
- else
- #endif
- totalSize += _files[index].Size;
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentPackTotal = 0;
- UInt64 currentUnpTotal = 0;
- UInt64 currentPackSize = 0;
- UInt64 currentUnpSize = 0;
-
- const UInt32 kZeroBufSize = (1 << 14);
- CByteBuffer zeroBuf;
- zeroBuf.SetCapacity(kZeroBufSize);
- memset(zeroBuf, 0, kZeroBufSize);
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- NCompress::NZlib::CDecoder *zlibCoderSpec = new NCompress::NZlib::CDecoder();
- CMyComPtr<ICompressCoder> zlibCoder = zlibCoderSpec;
-
- NCompress::NBZip2::CDecoder *bzip2CoderSpec = new NCompress::NBZip2::CDecoder();
- CMyComPtr<ICompressCoder> bzip2Coder = bzip2CoderSpec;
-
- NCompress::NDeflate::NDecoder::CCOMCoder *deflateCoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder();
- CMyComPtr<ICompressCoder> deflateCoder = deflateCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *inStreamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(inStreamSpec);
- inStreamSpec->SetStream(_inStream);
-
-
- CLimitedSequentialOutStream *outStreamLimSpec = new CLimitedSequentialOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamLimSpec);
-
- COutStreamWithSha1 *outStreamSha1Spec = new COutStreamWithSha1;
- {
- CMyComPtr<ISequentialOutStream> outStreamSha1(outStreamSha1Spec);
- outStreamLimSpec->SetStream(outStreamSha1);
- }
-
- for (i = 0; i < numItems; i++, currentPackTotal += currentPackSize, currentUnpTotal += currentUnpSize)
- {
- lps->InSize = currentPackTotal;
- lps->OutSize = currentUnpTotal;
- currentPackSize = 0;
- currentUnpSize = 0;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (index < _files.Size())
- {
- const CFile &item = _files[index];
- if (item.IsDir)
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- }
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- outStreamSha1Spec->SetStream(realOutStream);
- realOutStream.Release();
-
- Int32 opRes = NExtract::NOperationResult::kOK;
- #ifdef XAR_SHOW_RAW
- if (index == _files.Size())
- {
- outStreamSha1Spec->Init(false);
- outStreamLimSpec->Init(_xml.Length());
- RINOK(WriteStream(outStream, (const char *)_xml, _xml.Length()));
- currentPackSize = currentUnpSize = _xml.Length();
- }
- else
- #endif
- {
- const CFile &item = _files[index];
- if (item.HasData)
- {
- currentPackSize = item.PackSize;
- currentUnpSize = item.Size;
-
- RINOK(_inStream->Seek(_dataStartPos + item.Offset, STREAM_SEEK_SET, NULL));
- inStreamSpec->Init(item.PackSize);
- outStreamSha1Spec->Init(item.Sha1IsDefined);
- outStreamLimSpec->Init(item.Size);
- HRESULT res = S_OK;
-
- ICompressCoder *coder = NULL;
- if (item.Method.IsEmpty() || item.Method == "octet-stream")
- if (item.PackSize == item.Size)
- coder = copyCoder;
- else
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- else if (item.Method == METHOD_NAME_ZLIB)
- coder = zlibCoder;
- else if (item.Method == "bzip2")
- coder = bzip2Coder;
- else
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
-
- if (coder)
- res = coder->Code(inStream, outStream, NULL, NULL, progress);
-
- if (res != S_OK)
- {
- if (!outStreamLimSpec->IsFinishedOK())
- opRes = NExtract::NOperationResult::kDataError;
- else if (res != S_FALSE)
- return res;
- if (opRes == NExtract::NOperationResult::kOK)
- opRes = NExtract::NOperationResult::kDataError;
- }
-
- if (opRes == NExtract::NOperationResult::kOK)
- {
- if (outStreamLimSpec->IsFinishedOK() &&
- outStreamSha1Spec->GetSize() == item.Size)
- {
- if (!outStreamLimSpec->IsFinishedOK())
- {
- opRes = NExtract::NOperationResult::kDataError;
- }
- else if (item.Sha1IsDefined)
- {
- Byte digest[NCrypto::NSha1::kDigestSize];
- outStreamSha1Spec->Final(digest);
- if (memcmp(digest, item.Sha1, NCrypto::NSha1::kDigestSize) != 0)
- opRes = NExtract::NOperationResult::kCRCError;
- }
- }
- else
- opRes = NExtract::NOperationResult::kDataError;
- }
- }
- }
- outStreamSha1Spec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NXar::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Xar", L"xar", 0, 0xE1, { 'x', 'a', 'r', '!', 0, 0x1C }, 6, false, CreateArc, 0 };
-
-REGISTER_ARC(Xar)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/ZHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/ZHandler.cpp
deleted file mode 100644
index 49b76a116..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/ZHandler.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-// ZHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/ZDecoder.h"
-
-#include "Common/DummyOutStream.h"
-
-namespace NArchive {
-namespace NZ {
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- UInt64 _streamStartPosition;
- UInt64 _packSize;
- Byte _properties;
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPackSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPackSize: prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-static const int kSignatureSize = 3;
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- {
- RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_streamStartPosition));
- Byte buffer[kSignatureSize];
- RINOK(ReadStream_FALSE(stream, buffer, kSignatureSize));
- if (buffer[0] != 0x1F || buffer[1] != 0x9D)
- return S_FALSE;
- _properties = buffer[2];
-
- UInt64 endPosition;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPosition));
- _packSize = endPosition - _streamStartPosition - kSignatureSize;
-
- _stream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- extractCallback->SetTotal(_packSize);
-
- UInt64 currentTotalPacked = 0;
-
- RINOK(extractCallback->SetCompleted(&currentTotalPacked));
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
-
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
-
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
- realOutStream.Release();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, true);
-
- RINOK(_stream->Seek(_streamStartPosition + kSignatureSize, STREAM_SEEK_SET, NULL));
-
- CMyComPtr<ICompressCoder> decoder;
- NCompress::NZ::CDecoder *decoderSpec = new NCompress::NZ::CDecoder;
- decoder = decoderSpec;
-
- HRESULT result = decoderSpec->SetDecoderProperties2(&_properties, 1);
-
- int opResult;
- if (result != S_OK)
- opResult = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- result = decoder->Code(_stream, outStream, NULL, NULL, progress);
- if (result == S_FALSE)
- opResult = NExtract::NOperationResult::kDataError;
- else
- {
- RINOK(result);
- opResult = NExtract::NOperationResult::kOK;
- }
- }
- outStream.Release();
- return extractCallback->SetOperationResult(opResult);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Z", L"z taz", L"* .tar", 5, { 0x1F, 0x9D }, 2, false, CreateArc, 0 };
-
-REGISTER_ARC(Z)
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipAddCommon.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipAddCommon.cpp
deleted file mode 100644
index 4c5fd38d1..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipAddCommon.cpp
+++ /dev/null
@@ -1,379 +0,0 @@
-// ZipAddCommon.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/7zCrc.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../../ICoder.h"
-#include "../../IPassword.h"
-#include "../../MyVersion.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/StreamObjects.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/LzmaEncoder.h"
-#include "../../Compress/PpmdZip.h"
-
-#include "../Common/InStreamWithCRC.h"
-
-#include "ZipAddCommon.h"
-#include "ZipHeader.h"
-
-namespace NArchive {
-namespace NZip {
-
-static const CMethodId kMethodId_ZipBase = 0x040100;
-static const CMethodId kMethodId_BZip2 = 0x040202;
-
-static const UInt32 kLzmaPropsSize = 5;
-static const UInt32 kLzmaHeaderSize = 4 + kLzmaPropsSize;
-
-class CLzmaEncoder:
- public ICompressCoder,
- public CMyUnknownImp
-{
- NCompress::NLzma::CEncoder *EncoderSpec;
- CMyComPtr<ICompressCoder> Encoder;
- Byte Header[kLzmaHeaderSize];
-public:
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- HRESULT SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
-
- MY_UNKNOWN_IMP
-};
-
-HRESULT CLzmaEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
-{
- if (!Encoder)
- {
- EncoderSpec = new NCompress::NLzma::CEncoder;
- Encoder = EncoderSpec;
- }
- CBufPtrSeqOutStream *outStreamSpec = new CBufPtrSeqOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->Init(Header + 4, kLzmaPropsSize);
- RINOK(EncoderSpec->SetCoderProperties(propIDs, props, numProps));
- RINOK(EncoderSpec->WriteCoderProperties(outStream));
- if (outStreamSpec->GetPos() != kLzmaPropsSize)
- return E_FAIL;
- Header[0] = MY_VER_MAJOR;
- Header[1] = MY_VER_MINOR;
- Header[2] = kLzmaPropsSize;
- Header[3] = 0;
- return S_OK;
-}
-
-HRESULT CLzmaEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- RINOK(WriteStream(outStream, Header, kLzmaHeaderSize));
- return Encoder->Code(inStream, outStream, inSize, outSize, progress);
-}
-
-
-CAddCommon::CAddCommon(const CCompressionMethodMode &options):
- _options(options),
- _copyCoderSpec(NULL),
- _cryptoStreamSpec(0)
- {}
-
-static HRESULT GetStreamCRC(ISequentialInStream *inStream, UInt32 &resultCRC)
-{
- UInt32 crc = CRC_INIT_VAL;
- const UInt32 kBufferSize = (1 << 14);
- Byte buffer[kBufferSize];
- for (;;)
- {
- UInt32 realProcessedSize;
- RINOK(inStream->Read(buffer, kBufferSize, &realProcessedSize));
- if (realProcessedSize == 0)
- {
- resultCRC = CRC_GET_DIGEST(crc);
- return S_OK;
- }
- crc = CrcUpdate(crc, buffer, (size_t)realProcessedSize);
- }
-}
-
-HRESULT CAddCommon::Compress(
- DECL_EXTERNAL_CODECS_LOC_VARS
- ISequentialInStream *inStream, IOutStream *outStream,
- ICompressProgressInfo *progress, CCompressingResult &opRes)
-{
- CSequentialInStreamWithCRC *inSecCrcStreamSpec = 0;
- CInStreamWithCRC *inCrcStreamSpec = 0;
- CMyComPtr<ISequentialInStream> inCrcStream;
- {
- CMyComPtr<IInStream> inStream2;
- // we don't support stdin, since stream from stdin can require 64-bit size header
- RINOK(inStream->QueryInterface(IID_IInStream, (void **)&inStream2));
- if (inStream2)
- {
- inCrcStreamSpec = new CInStreamWithCRC;
- inCrcStream = inCrcStreamSpec;
- inCrcStreamSpec->SetStream(inStream2);
- inCrcStreamSpec->Init();
- }
- else
- {
- inSecCrcStreamSpec = new CSequentialInStreamWithCRC;
- inCrcStream = inSecCrcStreamSpec;
- inSecCrcStreamSpec->SetStream(inStream);
- inSecCrcStreamSpec->Init();
- }
- }
-
- int numTestMethods = _options.MethodSequence.Size();
- if (numTestMethods > 1 || _options.PasswordIsDefined)
- {
- if (inCrcStreamSpec == 0)
- {
- if (_options.PasswordIsDefined)
- return E_NOTIMPL;
- numTestMethods = 1;
- }
- }
- Byte method = 0;
- COutStreamReleaser outStreamReleaser;
- opRes.ExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_Default;
- for (int i = 0; i < numTestMethods; i++)
- {
- opRes.ExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_Default;
- if (inCrcStreamSpec != 0)
- RINOK(inCrcStreamSpec->Seek(0, STREAM_SEEK_SET, NULL));
- RINOK(outStream->SetSize(0));
- RINOK(outStream->Seek(0, STREAM_SEEK_SET, NULL));
- if (_options.PasswordIsDefined)
- {
- opRes.ExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_ZipCrypto;
-
- if (!_cryptoStream)
- {
- _cryptoStreamSpec = new CFilterCoder;
- _cryptoStream = _cryptoStreamSpec;
- }
- if (_options.IsAesMode)
- {
- opRes.ExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_Aes;
- if (!_cryptoStreamSpec->Filter)
- {
- _cryptoStreamSpec->Filter = _filterAesSpec = new NCrypto::NWzAes::CEncoder;
- _filterAesSpec->SetKeyMode(_options.AesKeyMode);
- RINOK(_filterAesSpec->CryptoSetPassword((const Byte *)(const char *)_options.Password, _options.Password.Length()));
- }
- RINOK(_filterAesSpec->WriteHeader(outStream));
- }
- else
- {
- if (!_cryptoStreamSpec->Filter)
- {
- _cryptoStreamSpec->Filter = _filterSpec = new NCrypto::NZip::CEncoder;
- _filterSpec->CryptoSetPassword((const Byte *)(const char *)_options.Password, _options.Password.Length());
- }
- UInt32 crc = 0;
- RINOK(GetStreamCRC(inStream, crc));
- RINOK(inCrcStreamSpec->Seek(0, STREAM_SEEK_SET, NULL));
- RINOK(_filterSpec->WriteHeader(outStream, crc));
- }
- RINOK(_cryptoStreamSpec->SetOutStream(outStream));
- outStreamReleaser.FilterCoder = _cryptoStreamSpec;
- }
-
- method = _options.MethodSequence[i];
- switch(method)
- {
- case NFileHeader::NCompressionMethod::kStored:
- {
- if (_copyCoderSpec == NULL)
- {
- _copyCoderSpec = new NCompress::CCopyCoder;
- _copyCoder = _copyCoderSpec;
- }
- CMyComPtr<ISequentialOutStream> outStreamNew;
- if (_options.PasswordIsDefined)
- outStreamNew = _cryptoStream;
- else
- outStreamNew = outStream;
- RINOK(_copyCoder->Code(inCrcStream, outStreamNew, NULL, NULL, progress));
- break;
- }
- default:
- {
- if (!_compressEncoder)
- {
- if (method == NFileHeader::NCompressionMethod::kLZMA)
- {
- _compressExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_LZMA;
- CLzmaEncoder *_lzmaEncoder = new CLzmaEncoder();
- _compressEncoder = _lzmaEncoder;
- NWindows::NCOM::CPropVariant props[] =
- {
- #ifndef _7ZIP_ST
- _options.NumThreads,
- #endif
- _options.Algo,
- _options.DicSize,
- _options.NumFastBytes,
- const_cast<BSTR>((const wchar_t *)_options.MatchFinder),
- _options.NumMatchFinderCycles
- };
- PROPID propIDs[] =
- {
- #ifndef _7ZIP_ST
- NCoderPropID::kNumThreads,
- #endif
- NCoderPropID::kAlgorithm,
- NCoderPropID::kDictionarySize,
- NCoderPropID::kNumFastBytes,
- NCoderPropID::kMatchFinder,
- NCoderPropID::kMatchFinderCycles
- };
- int numProps = sizeof(propIDs) / sizeof(propIDs[0]);
- if (!_options.NumMatchFinderCyclesDefined)
- numProps--;
- RINOK(_lzmaEncoder->SetCoderProperties(propIDs, props, numProps));
- }
- else if (method == NFileHeader::NCompressionMethod::kPPMd)
- {
- _compressExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_PPMd;
- NCompress::NPpmdZip::CEncoder *encoder = new NCompress::NPpmdZip::CEncoder();
- _compressEncoder = encoder;
- NWindows::NCOM::CPropVariant props[] =
- {
- _options.Algo,
- _options.MemSize,
- _options.Order
-
- };
- PROPID propIDs[] =
- {
- NCoderPropID::kAlgorithm,
- NCoderPropID::kUsedMemorySize,
- NCoderPropID::kOrder
- };
- RINOK(encoder->SetCoderProperties(propIDs, props, sizeof(propIDs) / sizeof(propIDs[0])));
- }
- else
- {
- CMethodId methodId;
- switch(method)
- {
- case NFileHeader::NCompressionMethod::kBZip2:
- methodId = kMethodId_BZip2;
- _compressExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_BZip2;
- break;
- default:
- _compressExtractVersion = ((method == NFileHeader::NCompressionMethod::kDeflated64) ?
- NFileHeader::NCompressionMethod::kExtractVersion_Deflate64 :
- NFileHeader::NCompressionMethod::kExtractVersion_Deflate);
- methodId = kMethodId_ZipBase + method;
- break;
- }
- RINOK(CreateCoder(
- EXTERNAL_CODECS_LOC_VARS
- methodId, _compressEncoder, true));
- if (!_compressEncoder)
- return E_NOTIMPL;
-
- if (method == NFileHeader::NCompressionMethod::kDeflated ||
- method == NFileHeader::NCompressionMethod::kDeflated64)
- {
- NWindows::NCOM::CPropVariant props[] =
- {
- _options.Algo,
- _options.NumPasses,
- _options.NumFastBytes,
- _options.NumMatchFinderCycles
- };
- PROPID propIDs[] =
- {
- NCoderPropID::kAlgorithm,
- NCoderPropID::kNumPasses,
- NCoderPropID::kNumFastBytes,
- NCoderPropID::kMatchFinderCycles
- };
- int numProps = sizeof(propIDs) / sizeof(propIDs[0]);
- if (!_options.NumMatchFinderCyclesDefined)
- numProps--;
- CMyComPtr<ICompressSetCoderProperties> setCoderProperties;
- _compressEncoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties);
- if (setCoderProperties)
- {
- RINOK(setCoderProperties->SetCoderProperties(propIDs, props, numProps));
- }
- }
- else if (method == NFileHeader::NCompressionMethod::kBZip2)
- {
- NWindows::NCOM::CPropVariant props[] =
- {
- _options.DicSize,
- _options.NumPasses
- #ifndef _7ZIP_ST
- , _options.NumThreads
- #endif
- };
- PROPID propIDs[] =
- {
- NCoderPropID::kDictionarySize,
- NCoderPropID::kNumPasses
- #ifndef _7ZIP_ST
- , NCoderPropID::kNumThreads
- #endif
- };
- CMyComPtr<ICompressSetCoderProperties> setCoderProperties;
- _compressEncoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties);
- if (setCoderProperties)
- {
- RINOK(setCoderProperties->SetCoderProperties(propIDs, props, sizeof(propIDs) / sizeof(propIDs[0])));
- }
- }
- }
- }
- CMyComPtr<ISequentialOutStream> outStreamNew;
- if (_options.PasswordIsDefined)
- outStreamNew = _cryptoStream;
- else
- outStreamNew = outStream;
- if (_compressExtractVersion > opRes.ExtractVersion)
- opRes.ExtractVersion = _compressExtractVersion;
- RINOK(_compressEncoder->Code(inCrcStream, outStreamNew, NULL, NULL, progress));
- break;
- }
- }
-
- RINOK(outStream->Seek(0, STREAM_SEEK_CUR, &opRes.PackSize));
-
- if (inCrcStreamSpec != 0)
- {
- opRes.CRC = inCrcStreamSpec->GetCRC();
- opRes.UnpackSize = inCrcStreamSpec->GetSize();
- }
- else
- {
- opRes.CRC = inSecCrcStreamSpec->GetCRC();
- opRes.UnpackSize = inSecCrcStreamSpec->GetSize();
- }
-
- if (_options.PasswordIsDefined)
- {
- if (opRes.PackSize < opRes.UnpackSize +
- (_options.IsAesMode ? _filterAesSpec->GetHeaderSize() : NCrypto::NZip::kHeaderSize))
- break;
- }
- else if (opRes.PackSize < opRes.UnpackSize)
- break;
- }
- if (_options.IsAesMode)
- {
- RINOK(_filterAesSpec->WriteFooter(outStream));
- RINOK(outStream->Seek(0, STREAM_SEEK_CUR, &opRes.PackSize));
- }
- opRes.Method = method;
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipAddCommon.h b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipAddCommon.h
deleted file mode 100644
index e4c02db3f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipAddCommon.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// ZipAddCommon.h
-
-#ifndef __ZIP_ADD_COMMON_H
-#define __ZIP_ADD_COMMON_H
-
-#include "../../ICoder.h"
-#include "../../IProgress.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/FilterCoder.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "../../Crypto/ZipCrypto.h"
-#include "../../Crypto/WzAes.h"
-
-#include "ZipCompressionMode.h"
-
-namespace NArchive {
-namespace NZip {
-
-struct CCompressingResult
-{
- UInt64 UnpackSize;
- UInt64 PackSize;
- UInt32 CRC;
- UInt16 Method;
- Byte ExtractVersion;
-};
-
-class CAddCommon
-{
- CCompressionMethodMode _options;
- NCompress::CCopyCoder *_copyCoderSpec;
- CMyComPtr<ICompressCoder> _copyCoder;
-
- CMyComPtr<ICompressCoder> _compressEncoder;
- Byte _compressExtractVersion;
-
- CFilterCoder *_cryptoStreamSpec;
- CMyComPtr<ISequentialOutStream> _cryptoStream;
-
- NCrypto::NZip::CEncoder *_filterSpec;
- NCrypto::NWzAes::CEncoder *_filterAesSpec;
-
-public:
- CAddCommon(const CCompressionMethodMode &options);
- HRESULT Compress(
- DECL_EXTERNAL_CODECS_LOC_VARS
- ISequentialInStream *inStream, IOutStream *outStream,
- ICompressProgressInfo *progress, CCompressingResult &operationResult);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipCompressionMode.h b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipCompressionMode.h
deleted file mode 100644
index 7ef7cfb28..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipCompressionMode.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// CompressionMode.h
-
-#ifndef __ZIP_COMPRESSION_MODE_H
-#define __ZIP_COMPRESSION_MODE_H
-
-#include "Common/MyString.h"
-
-namespace NArchive {
-namespace NZip {
-
-struct CCompressionMethodMode
-{
- CRecordVector<Byte> MethodSequence;
- UString MatchFinder;
- UInt32 Algo;
- UInt32 NumPasses;
- UInt32 NumFastBytes;
- bool NumMatchFinderCyclesDefined;
- UInt32 NumMatchFinderCycles;
- UInt32 DicSize;
- UInt32 MemSize;
- UInt32 Order;
-
- #ifndef _7ZIP_ST
- UInt32 NumThreads;
- #endif
- bool PasswordIsDefined;
- AString Password;
- bool IsAesMode;
- Byte AesKeyMode;
-
- CCompressionMethodMode():
- NumMatchFinderCyclesDefined(false),
- PasswordIsDefined(false),
- IsAesMode(false),
- AesKeyMode(3)
- {}
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandler.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandler.cpp
deleted file mode 100644
index bd1563226..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandler.cpp
+++ /dev/null
@@ -1,822 +0,0 @@
-// ZipHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../IPassword.h"
-
-#include "../../Common/FilterCoder.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamObjects.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-#include "../../Compress/LzmaDecoder.h"
-#include "../../Compress/ImplodeDecoder.h"
-#include "../../Compress/PpmdZip.h"
-#include "../../Compress/ShrinkDecoder.h"
-
-#include "../../Crypto/WzAes.h"
-#include "../../Crypto/ZipCrypto.h"
-#include "../../Crypto/ZipStrong.h"
-
-#include "../Common/ItemNameUtils.h"
-#include "../Common/OutStreamWithCRC.h"
-
-#include "ZipHandler.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NZip {
-
-static const CMethodId kMethodId_ZipBase = 0x040100;
-static const CMethodId kMethodId_BZip2 = 0x040202;
-
-static const char *kHostOS[] =
-{
- "FAT",
- "AMIGA",
- "VMS",
- "Unix",
- "VM/CMS",
- "Atari",
- "HPFS",
- "Macintosh",
- "Z-System",
- "CP/M",
- "TOPS-20",
- "NTFS",
- "SMS/QDOS",
- "Acorn",
- "VFAT",
- "MVS",
- "BeOS",
- "Tandem",
- "OS/400",
- "OS/X"
-};
-
-static const char *kUnknownOS = "Unknown";
-
-static const char *kMethods[] =
-{
- "Store",
- "Shrink",
- "Reduced1",
- "Reduced2",
- "Reduced3",
- "Reduced4",
- "Implode",
- "Tokenizing",
- "Deflate",
- "Deflate64",
- "PKImploding"
-};
-
-static const char *kBZip2Method = "BZip2";
-static const char *kLZMAMethod = "LZMA";
-static const char *kJpegMethod = "Jpeg";
-static const char *kWavPackMethod = "WavPack";
-static const char *kPPMdMethod = "PPMd";
-static const char *kAESMethod = "AES";
-static const char *kZipCryptoMethod = "ZipCrypto";
-static const char *kStrongCryptoMethod = "StrongCrypto";
-
-static struct CStrongCryptoPair
-{
- UInt16 Id;
- const char *Name;
-} g_StrongCryptoPairs[] =
-{
- { NStrongCryptoFlags::kDES, "DES" },
- { NStrongCryptoFlags::kRC2old, "RC2a" },
- { NStrongCryptoFlags::k3DES168, "3DES-168" },
- { NStrongCryptoFlags::k3DES112, "3DES-112" },
- { NStrongCryptoFlags::kAES128, "pkAES-128" },
- { NStrongCryptoFlags::kAES192, "pkAES-192" },
- { NStrongCryptoFlags::kAES256, "pkAES-256" },
- { NStrongCryptoFlags::kRC2, "RC2" },
- { NStrongCryptoFlags::kBlowfish, "Blowfish" },
- { NStrongCryptoFlags::kTwofish, "Twofish" },
- { NStrongCryptoFlags::kRC4, "RC4" }
-};
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidEncrypted, VT_BOOL},
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidCRC, VT_UI4},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidUnpackVer, VT_UI4}
-};
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidBit64, VT_BOOL},
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidOffset, VT_UI8}
-};
-
-CHandler::CHandler()
-{
- InitMethodProperties();
-}
-
-static AString BytesToString(const CByteBuffer &data)
-{
- AString s;
- int size = (int)data.GetCapacity();
- if (size > 0)
- {
- char *p = s.GetBuffer(size + 1);
- memcpy(p, (const Byte *)data, size);
- p[size] = '\0';
- s.ReleaseBuffer();
- }
- return s;
-}
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidBit64: if (m_Archive.IsZip64) prop = m_Archive.IsZip64; break;
- case kpidComment: prop = MultiByteToUnicodeString(BytesToString(m_Archive.ArcInfo.Comment), CP_ACP); break;
- case kpidPhySize: prop = m_Archive.ArcInfo.GetPhySize(); break;
- case kpidOffset: if (m_Archive.ArcInfo.StartPosition != 0) prop = m_Archive.ArcInfo.StartPosition; break;
- }
- prop.Detach(value);
- COM_TRY_END
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = m_Items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItemEx &item = m_Items[index];
- switch(propID)
- {
- case kpidPath: prop = NItemName::GetOSName2(item.GetUnicodeString(item.Name)); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.UnPackSize; break;
- case kpidPackSize: prop = item.PackSize; break;
- case kpidTimeType:
- {
- FILETIME ft;
- UInt32 unixTime;
- if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kMTime, ft))
- prop = (UInt32)NFileTimeType::kWindows;
- else if (item.CentralExtra.GetUnixTime(NFileHeader::NUnixTime::kMTime, unixTime))
- prop = (UInt32)NFileTimeType::kUnix;
- else
- prop = (UInt32)NFileTimeType::kDOS;
- break;
- }
- case kpidCTime:
- {
- FILETIME ft;
- if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kCTime, ft))
- prop = ft;
- break;
- }
- case kpidATime:
- {
- FILETIME ft;
- if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kATime, ft))
- prop = ft;
- break;
- }
- case kpidMTime:
- {
- FILETIME utc;
- if (!item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kMTime, utc))
- {
- UInt32 unixTime;
- if (item.CentralExtra.GetUnixTime(NFileHeader::NUnixTime::kMTime, unixTime))
- NTime::UnixTimeToFileTime(unixTime, utc);
- else
- {
- FILETIME localFileTime;
- if (!NTime::DosTimeToFileTime(item.Time, localFileTime) ||
- !LocalFileTimeToFileTime(&localFileTime, &utc))
- utc.dwHighDateTime = utc.dwLowDateTime = 0;
- }
- }
- prop = utc;
- break;
- }
- case kpidAttrib: prop = item.GetWinAttributes(); break;
- case kpidEncrypted: prop = item.IsEncrypted(); break;
- case kpidComment: prop = item.GetUnicodeString(BytesToString(item.Comment)); break;
- case kpidCRC: if (item.IsThereCrc()) prop = item.FileCRC; break;
- case kpidMethod:
- {
- UInt16 methodId = item.CompressionMethod;
- AString method;
- if (item.IsEncrypted())
- {
- if (methodId == NFileHeader::NCompressionMethod::kWzAES)
- {
- method = kAESMethod;
- CWzAesExtraField aesField;
- if (item.CentralExtra.GetWzAesField(aesField))
- {
- method += '-';
- char s[32];
- ConvertUInt64ToString((aesField.Strength + 1) * 64 , s);
- method += s;
- method += ' ';
- methodId = aesField.Method;
- }
- }
- else
- {
- if (item.IsStrongEncrypted())
- {
- CStrongCryptoField f;
- bool finded = false;
- if (item.CentralExtra.GetStrongCryptoField(f))
- {
- for (int i = 0; i < sizeof(g_StrongCryptoPairs) / sizeof(g_StrongCryptoPairs[0]); i++)
- {
- const CStrongCryptoPair &pair = g_StrongCryptoPairs[i];
- if (f.AlgId == pair.Id)
- {
- method += pair.Name;
- finded = true;
- break;
- }
- }
- }
- if (!finded)
- method += kStrongCryptoMethod;
- }
- else
- method += kZipCryptoMethod;
- method += ' ';
- }
- }
- if (methodId < sizeof(kMethods) / sizeof(kMethods[0]))
- method += kMethods[methodId];
- else switch (methodId)
- {
- case NFileHeader::NCompressionMethod::kLZMA:
- method += kLZMAMethod;
- if (item.IsLzmaEOS())
- method += ":EOS";
- break;
- case NFileHeader::NCompressionMethod::kBZip2: method += kBZip2Method; break;
- case NFileHeader::NCompressionMethod::kJpeg: method += kJpegMethod; break;
- case NFileHeader::NCompressionMethod::kWavPack: method += kWavPackMethod; break;
- case NFileHeader::NCompressionMethod::kPPMd: method += kPPMdMethod; break;
- default:
- {
- char s[32];
- ConvertUInt64ToString(methodId, s);
- method += s;
- }
- }
- prop = method;
- break;
- }
- case kpidHostOS:
- prop = (item.MadeByVersion.HostOS < sizeof(kHostOS) / sizeof(kHostOS[0])) ?
- (kHostOS[item.MadeByVersion.HostOS]) : kUnknownOS;
- break;
- case kpidUnpackVer:
- prop = (UInt32)item.ExtractVersion.Version;
- break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CProgressImp: public CProgressVirt
-{
- CMyComPtr<IArchiveOpenCallback> _callback;
-public:
- STDMETHOD(SetTotal)(UInt64 numFiles);
- STDMETHOD(SetCompleted)(UInt64 numFiles);
- CProgressImp(IArchiveOpenCallback *callback): _callback(callback) {}
-};
-
-STDMETHODIMP CProgressImp::SetTotal(UInt64 numFiles)
-{
- if (_callback)
- return _callback->SetTotal(&numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CProgressImp::SetCompleted(UInt64 numFiles)
-{
- if (_callback)
- return _callback->SetCompleted(&numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- try
- {
- Close();
- RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));
- RINOK(m_Archive.Open(inStream, maxCheckStartPosition));
- CProgressImp progressImp(callback);
- return m_Archive.ReadHeaders(m_Items, &progressImp);
- }
- catch(const CInArchiveException &) { Close(); return S_FALSE; }
- catch(...) { Close(); throw; }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- m_Items.Clear();
- m_Archive.Close();
- return S_OK;
-}
-
-//////////////////////////////////////
-// CHandler::DecompressItems
-
-class CLzmaDecoder:
- public ICompressCoder,
- public CMyUnknownImp
-{
- NCompress::NLzma::CDecoder *DecoderSpec;
- CMyComPtr<ICompressCoder> Decoder;
-public:
- CLzmaDecoder();
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- MY_UNKNOWN_IMP
-};
-
-CLzmaDecoder::CLzmaDecoder()
-{
- DecoderSpec = new NCompress::NLzma::CDecoder;
- Decoder = DecoderSpec;
-}
-
-HRESULT CLzmaDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- Byte buf[9];
- RINOK(ReadStream_FALSE(inStream, buf, 9));
- if (buf[2] != 5 || buf[3] != 0)
- return E_NOTIMPL;
- RINOK(DecoderSpec->SetDecoderProperties2(buf + 4, 5));
- return Decoder->Code(inStream, outStream, NULL, outSize, progress);
-}
-
-struct CMethodItem
-{
- UInt16 ZipMethod;
- CMyComPtr<ICompressCoder> Coder;
-};
-
-class CZipDecoder
-{
- NCrypto::NZip::CDecoder *_zipCryptoDecoderSpec;
- NCrypto::NZipStrong::CDecoder *_pkAesDecoderSpec;
- NCrypto::NWzAes::CDecoder *_wzAesDecoderSpec;
-
- CMyComPtr<ICompressFilter> _zipCryptoDecoder;
- CMyComPtr<ICompressFilter> _pkAesDecoder;
- CMyComPtr<ICompressFilter> _wzAesDecoder;
-
- CFilterCoder *filterStreamSpec;
- CMyComPtr<ISequentialInStream> filterStream;
- CMyComPtr<ICryptoGetTextPassword> getTextPassword;
- CObjectVector<CMethodItem> methodItems;
-
-public:
- CZipDecoder():
- _zipCryptoDecoderSpec(0),
- _pkAesDecoderSpec(0),
- _wzAesDecoderSpec(0),
- filterStreamSpec(0) {}
-
- HRESULT Decode(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CInArchive &archive, const CItemEx &item,
- ISequentialOutStream *realOutStream,
- IArchiveExtractCallback *extractCallback,
- ICompressProgressInfo *compressProgress,
- UInt32 numThreads, Int32 &res);
-};
-
-HRESULT CZipDecoder::Decode(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CInArchive &archive, const CItemEx &item,
- ISequentialOutStream *realOutStream,
- IArchiveExtractCallback *extractCallback,
- ICompressProgressInfo *compressProgress,
- UInt32 numThreads, Int32 &res)
-{
- res = NExtract::NOperationResult::kDataError;
- CInStreamReleaser inStreamReleaser;
-
- bool needCRC = true;
- bool wzAesMode = false;
- bool pkAesMode = false;
- UInt16 methodId = item.CompressionMethod;
- if (item.IsEncrypted())
- {
- if (item.IsStrongEncrypted())
- {
- CStrongCryptoField f;
- if (item.CentralExtra.GetStrongCryptoField(f))
- {
- pkAesMode = true;
- }
- if (!pkAesMode)
- {
- res = NExtract::NOperationResult::kUnSupportedMethod;
- return S_OK;
- }
- }
- if (methodId == NFileHeader::NCompressionMethod::kWzAES)
- {
- CWzAesExtraField aesField;
- if (item.CentralExtra.GetWzAesField(aesField))
- {
- wzAesMode = true;
- needCRC = aesField.NeedCrc();
- }
- }
- }
-
- COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;
- CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init(needCRC);
-
- UInt64 authenticationPos;
-
- CMyComPtr<ISequentialInStream> inStream;
- {
- UInt64 packSize = item.PackSize;
- if (wzAesMode)
- {
- if (packSize < NCrypto::NWzAes::kMacSize)
- return S_OK;
- packSize -= NCrypto::NWzAes::kMacSize;
- }
- UInt64 dataPos = item.GetDataPosition();
- inStream.Attach(archive.CreateLimitedStream(dataPos, packSize));
- authenticationPos = dataPos + packSize;
- }
-
- CMyComPtr<ICompressFilter> cryptoFilter;
- if (item.IsEncrypted())
- {
- if (wzAesMode)
- {
- CWzAesExtraField aesField;
- if (!item.CentralExtra.GetWzAesField(aesField))
- return S_OK;
- methodId = aesField.Method;
- if (!_wzAesDecoder)
- {
- _wzAesDecoderSpec = new NCrypto::NWzAes::CDecoder;
- _wzAesDecoder = _wzAesDecoderSpec;
- }
- cryptoFilter = _wzAesDecoder;
- Byte properties = aesField.Strength;
- RINOK(_wzAesDecoderSpec->SetDecoderProperties2(&properties, 1));
- }
- else if (pkAesMode)
- {
- if (!_pkAesDecoder)
- {
- _pkAesDecoderSpec = new NCrypto::NZipStrong::CDecoder;
- _pkAesDecoder = _pkAesDecoderSpec;
- }
- cryptoFilter = _pkAesDecoder;
- }
- else
- {
- if (!_zipCryptoDecoder)
- {
- _zipCryptoDecoderSpec = new NCrypto::NZip::CDecoder;
- _zipCryptoDecoder = _zipCryptoDecoderSpec;
- }
- cryptoFilter = _zipCryptoDecoder;
- }
- CMyComPtr<ICryptoSetPassword> cryptoSetPassword;
- RINOK(cryptoFilter.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword));
-
- if (!getTextPassword)
- extractCallback->QueryInterface(IID_ICryptoGetTextPassword, (void **)&getTextPassword);
-
- if (getTextPassword)
- {
- CMyComBSTR password;
- RINOK(getTextPassword->CryptoGetTextPassword(&password));
- AString charPassword;
- if (wzAesMode || pkAesMode)
- {
- charPassword = UnicodeStringToMultiByte((const wchar_t *)password, CP_ACP);
- /*
- for (int i = 0;; i++)
- {
- wchar_t c = password[i];
- if (c == 0)
- break;
- if (c >= 0x80)
- {
- res = NExtract::NOperationResult::kDataError;
- return S_OK;
- }
- charPassword += (char)c;
- }
- */
- }
- else
- {
- // we use OEM. WinZip/Windows probably use ANSI for some files
- charPassword = UnicodeStringToMultiByte((const wchar_t *)password, CP_OEMCP);
- }
- HRESULT result = cryptoSetPassword->CryptoSetPassword(
- (const Byte *)(const char *)charPassword, charPassword.Length());
- if (result != S_OK)
- return S_OK;
- }
- else
- {
- RINOK(cryptoSetPassword->CryptoSetPassword(0, 0));
- }
- }
-
- int m;
- for (m = 0; m < methodItems.Size(); m++)
- if (methodItems[m].ZipMethod == methodId)
- break;
-
- if (m == methodItems.Size())
- {
- CMethodItem mi;
- mi.ZipMethod = methodId;
- if (methodId == NFileHeader::NCompressionMethod::kStored)
- mi.Coder = new NCompress::CCopyCoder;
- else if (methodId == NFileHeader::NCompressionMethod::kShrunk)
- mi.Coder = new NCompress::NShrink::CDecoder;
- else if (methodId == NFileHeader::NCompressionMethod::kImploded)
- mi.Coder = new NCompress::NImplode::NDecoder::CCoder;
- else if (methodId == NFileHeader::NCompressionMethod::kLZMA)
- mi.Coder = new CLzmaDecoder;
- else if (methodId == NFileHeader::NCompressionMethod::kPPMd)
- mi.Coder = new NCompress::NPpmdZip::CDecoder(true);
- else
- {
- CMethodId szMethodID;
- if (methodId == NFileHeader::NCompressionMethod::kBZip2)
- szMethodID = kMethodId_BZip2;
- else
- {
- if (methodId > 0xFF)
- {
- res = NExtract::NOperationResult::kUnSupportedMethod;
- return S_OK;
- }
- szMethodID = kMethodId_ZipBase + (Byte)methodId;
- }
-
- RINOK(CreateCoder(EXTERNAL_CODECS_LOC_VARS szMethodID, mi.Coder, false));
-
- if (mi.Coder == 0)
- {
- res = NExtract::NOperationResult::kUnSupportedMethod;
- return S_OK;
- }
- }
- m = methodItems.Add(mi);
- }
- ICompressCoder *coder = methodItems[m].Coder;
-
- {
- CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;
- coder->QueryInterface(IID_ICompressSetDecoderProperties2, (void **)&setDecoderProperties);
- if (setDecoderProperties)
- {
- Byte properties = (Byte)item.Flags;
- RINOK(setDecoderProperties->SetDecoderProperties2(&properties, 1));
- }
- }
-
- #ifndef _7ZIP_ST
- {
- CMyComPtr<ICompressSetCoderMt> setCoderMt;
- coder->QueryInterface(IID_ICompressSetCoderMt, (void **)&setCoderMt);
- if (setCoderMt)
- {
- RINOK(setCoderMt->SetNumberOfThreads(numThreads));
- }
- }
- #endif
-
- {
- HRESULT result = S_OK;
- CMyComPtr<ISequentialInStream> inStreamNew;
- if (item.IsEncrypted())
- {
- if (!filterStream)
- {
- filterStreamSpec = new CFilterCoder;
- filterStream = filterStreamSpec;
- }
- filterStreamSpec->Filter = cryptoFilter;
- if (wzAesMode)
- {
- result = _wzAesDecoderSpec->ReadHeader(inStream);
- }
- else if (pkAesMode)
- {
- result =_pkAesDecoderSpec->ReadHeader(inStream, item.FileCRC, item.UnPackSize);
- if (result == S_OK)
- {
- bool passwOK;
- result = _pkAesDecoderSpec->CheckPassword(passwOK);
- if (result == S_OK && !passwOK)
- result = S_FALSE;
- }
- }
- else
- {
- result = _zipCryptoDecoderSpec->ReadHeader(inStream);
- }
-
- if (result == S_OK)
- {
- RINOK(filterStreamSpec->SetInStream(inStream));
- inStreamReleaser.FilterCoder = filterStreamSpec;
- inStreamNew = filterStream;
- if (wzAesMode)
- {
- if (!_wzAesDecoderSpec->CheckPasswordVerifyCode())
- result = S_FALSE;
- }
- }
- }
- else
- inStreamNew = inStream;
- if (result == S_OK)
- result = coder->Code(inStreamNew, outStream, NULL, &item.UnPackSize, compressProgress);
- if (result == S_FALSE)
- return S_OK;
- if (result == E_NOTIMPL)
- {
- res = NExtract::NOperationResult::kUnSupportedMethod;
- return S_OK;
- }
-
- RINOK(result);
- }
- bool crcOK = true;
- bool authOk = true;
- if (needCRC)
- crcOK = (outStreamSpec->GetCRC() == item.FileCRC);
- if (wzAesMode)
- {
- inStream.Attach(archive.CreateLimitedStream(authenticationPos, NCrypto::NWzAes::kMacSize));
- if (_wzAesDecoderSpec->CheckMac(inStream, authOk) != S_OK)
- authOk = false;
- }
-
- res = ((crcOK && authOk) ?
- NExtract::NOperationResult::kOK :
- NExtract::NOperationResult::kCRCError);
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- CZipDecoder myDecoder;
- UInt64 totalUnPacked = 0, totalPacked = 0;
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = m_Items.Size();
- if(numItems == 0)
- return S_OK;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const CItemEx &item = m_Items[allFilesMode ? i : indices[i]];
- totalUnPacked += item.UnPackSize;
- totalPacked += item.PackSize;
- }
- RINOK(extractCallback->SetTotal(totalUnPacked));
-
- UInt64 currentTotalUnPacked = 0, currentTotalPacked = 0;
- UInt64 currentItemUnPacked, currentItemPacked;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- for (i = 0; i < numItems; i++, currentTotalUnPacked += currentItemUnPacked,
- currentTotalPacked += currentItemPacked)
- {
- currentItemUnPacked = 0;
- currentItemPacked = 0;
-
- lps->InSize = currentTotalPacked;
- lps->OutSize = currentTotalUnPacked;
- RINOK(lps->SetCur());
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- CItemEx item = m_Items[index];
- if (!item.FromLocal)
- {
- HRESULT res = m_Archive.ReadLocalItemAfterCdItem(item);
- if (res == S_FALSE)
- {
- if (item.IsDir() || realOutStream || testMode)
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- }
- continue;
- }
- RINOK(res);
- }
-
- if (item.IsDir() || item.IgnoreItem())
- {
- // if (!testMode)
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- continue;
- }
-
- currentItemUnPacked = item.UnPackSize;
- currentItemPacked = item.PackSize;
-
- if (!testMode && !realOutStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
-
- Int32 res;
- RINOK(myDecoder.Decode(
- EXTERNAL_CODECS_VARS
- m_Archive, item, realOutStream, extractCallback,
- progress, _numThreads, res));
- realOutStream.Release();
-
- RINOK(extractCallback->SetOperationResult(res))
- }
- return S_OK;
- COM_TRY_END
-}
-
-IMPL_ISetCompressCodecsInfo
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandler.h b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandler.h
deleted file mode 100644
index 04cede84e..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandler.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Zip/Handler.h
-
-#ifndef __ZIP_HANDLER_H
-#define __ZIP_HANDLER_H
-
-#include "Common/DynamicBuffer.h"
-#include "../../ICoder.h"
-#include "../IArchive.h"
-
-#include "../../Common/CreateCoder.h"
-
-#include "ZipIn.h"
-#include "ZipCompressionMode.h"
-
-#ifndef _7ZIP_ST
-#include "../../../Windows/System.h"
-#endif
-
-namespace NArchive {
-namespace NZip {
-
-class CHandler:
- public IInArchive,
- public IOutArchive,
- public ISetProperties,
- PUBLIC_ISetCompressCodecsInfo
- public CMyUnknownImp
-{
-public:
- MY_QUERYINTERFACE_BEGIN2(IInArchive)
- MY_QUERYINTERFACE_ENTRY(IOutArchive)
- MY_QUERYINTERFACE_ENTRY(ISetProperties)
- QUERY_ENTRY_ISetCompressCodecsInfo
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- INTERFACE_IInArchive(;)
- INTERFACE_IOutArchive(;)
-
- STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties);
-
- DECL_ISetCompressCodecsInfo
-
- CHandler();
-private:
- CObjectVector<CItemEx> m_Items;
- CInArchive m_Archive;
-
- int m_Level;
- int m_MainMethod;
- UInt32 m_DicSize;
- UInt32 m_Algo;
- UInt32 m_NumPasses;
- UInt32 m_NumFastBytes;
- UInt32 m_NumMatchFinderCycles;
- UInt32 m_MemSize;
- UInt32 m_Order;
-
- bool m_NumMatchFinderCyclesDefined;
-
- bool m_ForceAesMode;
- bool m_IsAesMode;
- Byte m_AesKeyMode;
-
- bool m_WriteNtfsTimeExtra;
- bool m_ForceLocal;
- bool m_ForceUtf8;
-
- #ifndef _7ZIP_ST
- UInt32 _numThreads;
- #endif
-
- DECL_EXTERNAL_CODECS_VARS
-
- void InitMethodProperties()
- {
- m_Level = -1;
- m_MainMethod = -1;
- m_Algo =
- m_DicSize =
- m_NumPasses =
- m_NumFastBytes =
- m_Order =
- m_MemSize =
- m_NumMatchFinderCycles = 0xFFFFFFFF;
- m_NumMatchFinderCyclesDefined = false;
- m_ForceAesMode = false;
- m_IsAesMode = false;
- m_AesKeyMode = 3; // aes-256
- m_WriteNtfsTimeExtra = false;
- m_ForceLocal = false;
- m_ForceUtf8 = false;
- #ifndef _7ZIP_ST
- _numThreads = NWindows::NSystem::GetNumberOfProcessors();;
- #endif
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp
deleted file mode 100644
index 428e4349a..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp
+++ /dev/null
@@ -1,537 +0,0 @@
-// ZipHandlerOut.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-#include "Common/StringToInt.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../IPassword.h"
-
-#include "../../Common/OutBuffer.h"
-
-#include "../../Crypto/WzAes.h"
-
-#include "../Common/ItemNameUtils.h"
-#include "../Common/ParseProperties.h"
-
-#include "ZipHandler.h"
-#include "ZipUpdate.h"
-
-using namespace NWindows;
-using namespace NCOM;
-using namespace NTime;
-
-namespace NArchive {
-namespace NZip {
-
-static const UInt32 kLzAlgoX1 = 0;
-static const UInt32 kLzAlgoX5 = 1;
-
-static const UInt32 kDeflateNumPassesX1 = 1;
-static const UInt32 kDeflateNumPassesX7 = 3;
-static const UInt32 kDeflateNumPassesX9 = 10;
-
-static const UInt32 kDeflateNumFastBytesX1 = 32;
-static const UInt32 kDeflateNumFastBytesX7 = 64;
-static const UInt32 kDeflateNumFastBytesX9 = 128;
-
-static const wchar_t *kLzmaMatchFinderX1 = L"HC4";
-static const wchar_t *kLzmaMatchFinderX5 = L"BT4";
-
-static const UInt32 kLzmaNumFastBytesX1 = 32;
-static const UInt32 kLzmaNumFastBytesX7 = 64;
-
-static const UInt32 kLzmaDicSizeX1 = 1 << 16;
-static const UInt32 kLzmaDicSizeX3 = 1 << 20;
-static const UInt32 kLzmaDicSizeX5 = 1 << 24;
-static const UInt32 kLzmaDicSizeX7 = 1 << 25;
-static const UInt32 kLzmaDicSizeX9 = 1 << 26;
-
-static const UInt32 kBZip2NumPassesX1 = 1;
-static const UInt32 kBZip2NumPassesX7 = 2;
-static const UInt32 kBZip2NumPassesX9 = 7;
-
-static const UInt32 kBZip2DicSizeX1 = 100000;
-static const UInt32 kBZip2DicSizeX3 = 500000;
-static const UInt32 kBZip2DicSizeX5 = 900000;
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *timeType)
-{
- *timeType = NFileTimeType::kDOS;
- return S_OK;
-}
-
-static bool IsAsciiString(const UString &s)
-{
- for (int i = 0; i < s.Length(); i++)
- {
- wchar_t c = s[i];
- if (c < 0x20 || c > 0x7F)
- return false;
- }
- return true;
-}
-
-#define COM_TRY_BEGIN2 try {
-#define COM_TRY_END2 } \
-catch(const CSystemException &e) { return e.ErrorCode; } \
-catch(...) { return E_OUTOFMEMORY; }
-
-static HRESULT GetTime(IArchiveUpdateCallback *callback, int index, PROPID propID, FILETIME &filetime)
-{
- filetime.dwHighDateTime = filetime.dwLowDateTime = 0;
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(index, propID, &prop));
- if (prop.vt == VT_FILETIME)
- filetime = prop.filetime;
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *callback)
-{
- COM_TRY_BEGIN2
- CObjectVector<CUpdateItem> updateItems;
- bool thereAreAesUpdates = false;
- for (UInt32 i = 0; i < numItems; i++)
- {
- CUpdateItem ui;
- Int32 newData;
- Int32 newProperties;
- UInt32 indexInArchive;
- if (!callback)
- return E_FAIL;
- RINOK(callback->GetUpdateItemInfo(i, &newData, &newProperties, &indexInArchive));
- ui.NewProperties = IntToBool(newProperties);
- ui.NewData = IntToBool(newData);
- ui.IndexInArchive = indexInArchive;
- ui.IndexInClient = i;
- bool existInArchive = (indexInArchive != (UInt32)-1);
- if (existInArchive && newData)
- if (m_Items[indexInArchive].IsAesEncrypted())
- thereAreAesUpdates = true;
-
- if (IntToBool(newProperties))
- {
- UString name;
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidAttrib, &prop));
- if (prop.vt == VT_EMPTY)
- ui.Attributes = 0;
- else if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- else
- ui.Attributes = prop.ulVal;
- }
-
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidPath, &prop));
- if (prop.vt == VT_EMPTY)
- name.Empty();
- else if (prop.vt != VT_BSTR)
- return E_INVALIDARG;
- else
- name = prop.bstrVal;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidIsDir, &prop));
- if (prop.vt == VT_EMPTY)
- ui.IsDir = false;
- else if (prop.vt != VT_BOOL)
- return E_INVALIDARG;
- else
- ui.IsDir = (prop.boolVal != VARIANT_FALSE);
- }
-
- {
- CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidTimeType, &prop));
- if (prop.vt == VT_UI4)
- ui.NtfsTimeIsDefined = (prop.ulVal == NFileTimeType::kWindows);
- else
- ui.NtfsTimeIsDefined = m_WriteNtfsTimeExtra;
- }
- RINOK(GetTime(callback, i, kpidMTime, ui.NtfsMTime));
- RINOK(GetTime(callback, i, kpidATime, ui.NtfsATime));
- RINOK(GetTime(callback, i, kpidCTime, ui.NtfsCTime));
-
- {
- FILETIME localFileTime = { 0, 0 };
- if (ui.NtfsMTime.dwHighDateTime != 0 ||
- ui.NtfsMTime.dwLowDateTime != 0)
- if (!FileTimeToLocalFileTime(&ui.NtfsMTime, &localFileTime))
- return E_INVALIDARG;
- FileTimeToDosTime(localFileTime, ui.Time);
- }
-
- name = NItemName::MakeLegalName(name);
- bool needSlash = ui.IsDir;
- const wchar_t kSlash = L'/';
- if (!name.IsEmpty())
- {
- if (name[name.Length() - 1] == kSlash)
- {
- if (!ui.IsDir)
- return E_INVALIDARG;
- needSlash = false;
- }
- }
- if (needSlash)
- name += kSlash;
-
- bool tryUtf8 = true;
- if (m_ForceLocal || !m_ForceUtf8)
- {
-#ifdef _WIN32
- bool defaultCharWasUsed;
- ui.Name = UnicodeStringToMultiByte(name, CP_OEMCP, '_', defaultCharWasUsed);
- tryUtf8 = (!m_ForceLocal && (defaultCharWasUsed ||
- MultiByteToUnicodeString(ui.Name, CP_OEMCP) != name));
-#else
- // FIXME
- ui.Name = UnicodeStringToMultiByte(name, CP_OEMCP);
- tryUtf8 = (!m_ForceLocal);
-#endif
- }
-
- if (tryUtf8)
- {
- int i;
- for (i = 0; i < name.Length() && (unsigned)name[i] < 0x80; i++) {}
- ui.IsUtf8 = (i != name.Length());
- if (!ConvertUnicodeToUTF8(name, ui.Name))
- return E_INVALIDARG;
- }
-
- if (ui.Name.Length() >= (1 << 16))
- return E_INVALIDARG;
-
- ui.IndexInClient = i;
- /*
- if (existInArchive)
- {
- const CItemEx &itemInfo = m_Items[indexInArchive];
- // ui.Commented = itemInfo.IsCommented();
- ui.Commented = false;
- if (ui.Commented)
- {
- ui.CommentRange.Position = itemInfo.GetCommentPosition();
- ui.CommentRange.Size = itemInfo.CommentSize;
- }
- }
- else
- ui.Commented = false;
- */
- }
- if (IntToBool(newData))
- {
- UInt64 size;
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- size = prop.uhVal.QuadPart;
- }
- ui.Size = size;
- }
- updateItems.Add(ui);
- }
-
- CMyComPtr<ICryptoGetTextPassword2> getTextPassword;
- {
- CMyComPtr<IArchiveUpdateCallback> udateCallBack2(callback);
- udateCallBack2.QueryInterface(IID_ICryptoGetTextPassword2, &getTextPassword);
- }
- CCompressionMethodMode options;
-
- if (getTextPassword)
- {
- CMyComBSTR password;
- Int32 passwordIsDefined;
- RINOK(getTextPassword->CryptoGetTextPassword2(&passwordIsDefined, &password));
- options.PasswordIsDefined = IntToBool(passwordIsDefined);
- if (options.PasswordIsDefined)
- {
- options.IsAesMode = (m_ForceAesMode ? m_IsAesMode : thereAreAesUpdates);
- options.AesKeyMode = m_AesKeyMode;
-
- if (!IsAsciiString((const wchar_t *)password))
- return E_INVALIDARG;
- if (options.IsAesMode)
- {
- if (options.Password.Length() > NCrypto::NWzAes::kPasswordSizeMax)
- return E_INVALIDARG;
- }
- options.Password = UnicodeStringToMultiByte((const wchar_t *)password, CP_OEMCP);
- }
- }
- else
- options.PasswordIsDefined = false;
-
- int level = m_Level;
- if (level < 0)
- level = 5;
-
- Byte mainMethod;
- if (m_MainMethod < 0)
- mainMethod = (Byte)(((level == 0) ?
- NFileHeader::NCompressionMethod::kStored :
- NFileHeader::NCompressionMethod::kDeflated));
- else
- mainMethod = (Byte)m_MainMethod;
- options.MethodSequence.Add(mainMethod);
- if (mainMethod != NFileHeader::NCompressionMethod::kStored)
- options.MethodSequence.Add(NFileHeader::NCompressionMethod::kStored);
- bool isDeflate = (mainMethod == NFileHeader::NCompressionMethod::kDeflated) ||
- (mainMethod == NFileHeader::NCompressionMethod::kDeflated64);
- bool isLZMA = (mainMethod == NFileHeader::NCompressionMethod::kLZMA);
- bool isLz = (isLZMA || isDeflate);
- options.NumPasses = m_NumPasses;
- options.DicSize = m_DicSize;
- options.NumFastBytes = m_NumFastBytes;
- options.NumMatchFinderCycles = m_NumMatchFinderCycles;
- options.NumMatchFinderCyclesDefined = m_NumMatchFinderCyclesDefined;
- options.Algo = m_Algo;
- options.MemSize = m_MemSize;
- options.Order = m_Order;
- #ifndef _7ZIP_ST
- options.NumThreads = _numThreads;
- #endif
- if (isLz)
- {
- if (isDeflate)
- {
- if (options.NumPasses == 0xFFFFFFFF)
- options.NumPasses = (level >= 9 ? kDeflateNumPassesX9 :
- (level >= 7 ? kDeflateNumPassesX7 :
- kDeflateNumPassesX1));
- if (options.NumFastBytes == 0xFFFFFFFF)
- options.NumFastBytes = (level >= 9 ? kDeflateNumFastBytesX9 :
- (level >= 7 ? kDeflateNumFastBytesX7 :
- kDeflateNumFastBytesX1));
- }
- else if (isLZMA)
- {
- if (options.DicSize == 0xFFFFFFFF)
- options.DicSize =
- (level >= 9 ? kLzmaDicSizeX9 :
- (level >= 7 ? kLzmaDicSizeX7 :
- (level >= 5 ? kLzmaDicSizeX5 :
- (level >= 3 ? kLzmaDicSizeX3 :
- kLzmaDicSizeX1))));
-
- if (options.NumFastBytes == 0xFFFFFFFF)
- options.NumFastBytes = (level >= 7 ? kLzmaNumFastBytesX7 :
- kLzmaNumFastBytesX1);
-
- options.MatchFinder =
- (level >= 5 ? kLzmaMatchFinderX5 :
- kLzmaMatchFinderX1);
- }
-
- if (options.Algo == 0xFFFFFFFF)
- options.Algo = (level >= 5 ? kLzAlgoX5 :
- kLzAlgoX1);
- }
- if (mainMethod == NFileHeader::NCompressionMethod::kBZip2)
- {
- if (options.NumPasses == 0xFFFFFFFF)
- options.NumPasses = (level >= 9 ? kBZip2NumPassesX9 :
- (level >= 7 ? kBZip2NumPassesX7 :
- kBZip2NumPassesX1));
- if (options.DicSize == 0xFFFFFFFF)
- options.DicSize = (level >= 5 ? kBZip2DicSizeX5 :
- (level >= 3 ? kBZip2DicSizeX3 :
- kBZip2DicSizeX1));
- }
- if (mainMethod == NFileHeader::NCompressionMethod::kPPMd)
- {
- int level2 = level;
- if (level2 < 1) level2 = 1;
- if (level2 > 9) level2 = 9;
-
- if (options.MemSize == 0xFFFFFFFF)
- options.MemSize = (1 << (19 + (level2 > 8 ? 8 : level2)));
-
- if (options.Order == 0xFFFFFFFF)
- options.Order = 3 + level2;
-
- if (options.Algo == 0xFFFFFFFF)
- options.Algo = (level2 >= 7 ? 1 : 0);
- }
-
- return Update(
- EXTERNAL_CODECS_VARS
- m_Items, updateItems, outStream,
- m_Archive.IsOpen() ? &m_Archive : NULL, &options, callback);
- COM_TRY_END2
-}
-
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties)
-{
- #ifndef _7ZIP_ST
- const UInt32 numProcessors = NSystem::GetNumberOfProcessors();
- _numThreads = numProcessors;
- #endif
- InitMethodProperties();
- for (int i = 0; i < numProperties; i++)
- {
- UString name = UString(names[i]);
- name.MakeUpper();
- if (name.IsEmpty())
- return E_INVALIDARG;
-
- const PROPVARIANT &prop = values[i];
-
- if (name[0] == L'X')
- {
- UInt32 level = 9;
- RINOK(ParsePropValue(name.Mid(1), prop, level));
- m_Level = level;
- continue;
- }
- else if (name == L"M")
- {
- if (prop.vt == VT_BSTR)
- {
- UString m = prop.bstrVal;
- m.MakeUpper();
- if (m == L"COPY") m_MainMethod = NFileHeader::NCompressionMethod::kStored;
- else if (m == L"DEFLATE") m_MainMethod = NFileHeader::NCompressionMethod::kDeflated;
- else if (m == L"DEFLATE64") m_MainMethod = NFileHeader::NCompressionMethod::kDeflated64;
- else if (m == L"BZIP2") m_MainMethod = NFileHeader::NCompressionMethod::kBZip2;
- else if (m == L"LZMA") m_MainMethod = NFileHeader::NCompressionMethod::kLZMA;
- else if (m == L"PPMD") m_MainMethod = NFileHeader::NCompressionMethod::kPPMd;
- else return E_INVALIDARG;
- }
- else if (prop.vt == VT_UI4)
- {
- switch(prop.ulVal)
- {
- case NFileHeader::NCompressionMethod::kStored:
- case NFileHeader::NCompressionMethod::kDeflated:
- case NFileHeader::NCompressionMethod::kDeflated64:
- case NFileHeader::NCompressionMethod::kBZip2:
- case NFileHeader::NCompressionMethod::kLZMA:
- m_MainMethod = (Byte)prop.ulVal;
- break;
- default:
- return E_INVALIDARG;
- }
- }
- else
- return E_INVALIDARG;
- }
- else if (name.Left(2) == L"EM")
- {
- if (prop.vt == VT_BSTR)
- {
- UString valueString = prop.bstrVal;
- valueString.MakeUpper();
- if (valueString.Left(3) == L"AES")
- {
- valueString = valueString.Mid(3);
- if (valueString == L"128")
- m_AesKeyMode = 1;
- else if (valueString == L"192")
- m_AesKeyMode = 2;
- else if (valueString == L"256" || valueString.IsEmpty())
- m_AesKeyMode = 3;
- else
- return E_INVALIDARG;
- m_IsAesMode = true;
- m_ForceAesMode = true;
- }
- else if (valueString == L"ZIPCRYPTO")
- {
- m_IsAesMode = false;
- m_ForceAesMode = true;
- }
- else
- return E_INVALIDARG;
- }
- else
- return E_INVALIDARG;
- }
- else if (name[0] == L'D')
- {
- UInt32 dicSize = kBZip2DicSizeX5;
- RINOK(ParsePropDictionaryValue(name.Mid(1), prop, dicSize));
- m_DicSize = dicSize;
- }
- else if (name.Left(3) == L"MEM")
- {
- UInt32 memSize = 1 << 24;
- RINOK(ParsePropDictionaryValue(name.Mid(3), prop, memSize));
- m_MemSize = memSize;
- }
- else if (name[0] == L'O')
- {
- UInt32 order = 8;
- RINOK(ParsePropValue(name.Mid(1), prop, order));
- m_Order = order;
- }
- else if (name.Left(4) == L"PASS")
- {
- UInt32 num = kDeflateNumPassesX9;
- RINOK(ParsePropValue(name.Mid(4), prop, num));
- m_NumPasses = num;
- }
- else if (name.Left(2) == L"FB")
- {
- UInt32 num = kDeflateNumFastBytesX9;
- RINOK(ParsePropValue(name.Mid(2), prop, num));
- m_NumFastBytes = num;
- }
- else if (name.Left(2) == L"MC")
- {
- UInt32 num = 0xFFFFFFFF;
- RINOK(ParsePropValue(name.Mid(2), prop, num));
- m_NumMatchFinderCycles = num;
- m_NumMatchFinderCyclesDefined = true;
- }
- else if (name.Left(2) == L"MT")
- {
- #ifndef _7ZIP_ST
- RINOK(ParseMtProp(name.Mid(2), prop, numProcessors, _numThreads));
- #endif
- }
- else if (name.Left(1) == L"A")
- {
- UInt32 num = kLzAlgoX5;
- RINOK(ParsePropValue(name.Mid(1), prop, num));
- m_Algo = num;
- }
- else if (name.CompareNoCase(L"TC") == 0)
- {
- RINOK(SetBoolProperty(m_WriteNtfsTimeExtra, prop));
- }
- else if (name.CompareNoCase(L"CL") == 0)
- {
- RINOK(SetBoolProperty(m_ForceLocal, prop));
- if (m_ForceLocal)
- m_ForceUtf8 = false;
- }
- else if (name.CompareNoCase(L"CU") == 0)
- {
- RINOK(SetBoolProperty(m_ForceUtf8, prop));
- if (m_ForceUtf8)
- m_ForceLocal = false;
- }
- else
- return E_INVALIDARG;
- }
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHeader.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHeader.cpp
deleted file mode 100644
index 582187b51..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHeader.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-// Archive/Zip/Header.h
-
-#include "StdAfx.h"
-
-#include "ZipHeader.h"
-
-namespace NArchive {
-namespace NZip {
-
-namespace NSignature
-{
- UInt32 kLocalFileHeader = 0x04034B50 + 1;
- UInt32 kDataDescriptor = 0x08074B50 + 1;
- UInt32 kCentralFileHeader = 0x02014B50 + 1;
- UInt32 kEndOfCentralDir = 0x06054B50 + 1;
- UInt32 kZip64EndOfCentralDir = 0x06064B50 + 1;
- UInt32 kZip64EndOfCentralDirLocator = 0x07064B50 + 1;
-
- class CMarkersInitializer
- {
- public:
- CMarkersInitializer()
- {
- kLocalFileHeader--;
- kDataDescriptor--;
- kCentralFileHeader--;
- kEndOfCentralDir--;
- kZip64EndOfCentralDir--;
- kZip64EndOfCentralDirLocator--;
- }
- };
- static CMarkersInitializer g_MarkerInitializer;
-}
-
-}}
-
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHeader.h b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHeader.h
deleted file mode 100644
index ce8c1e4f7..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipHeader.h
+++ /dev/null
@@ -1,284 +0,0 @@
-// Archive/Zip/Header.h
-
-#ifndef __ARCHIVE_ZIP_HEADER_H
-#define __ARCHIVE_ZIP_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NZip {
-
-namespace NSignature
-{
- extern UInt32 kLocalFileHeader;
- extern UInt32 kDataDescriptor;
- extern UInt32 kCentralFileHeader;
- extern UInt32 kEndOfCentralDir;
- extern UInt32 kZip64EndOfCentralDir;
- extern UInt32 kZip64EndOfCentralDirLocator;
-
- static const UInt32 kMarkerSize = 4;
-}
-
-const UInt32 kEcdSize = 22;
-const UInt32 kZip64EcdSize = 44;
-const UInt32 kZip64EcdLocatorSize = 20;
-/*
-struct CEndOfCentralDirectoryRecord
-{
- UInt16 ThisDiskNumber;
- UInt16 StartCentralDirectoryDiskNumber;
- UInt16 NumEntriesInCentaralDirectoryOnThisDisk;
- UInt16 NumEntriesInCentaralDirectory;
- UInt32 CentralDirectorySize;
- UInt32 CentralDirectoryStartOffset;
- UInt16 CommentSize;
-};
-
-struct CEndOfCentralDirectoryRecordFull
-{
- UInt32 Signature;
- CEndOfCentralDirectoryRecord Header;
-};
-*/
-
-namespace NFileHeader
-{
- /*
- struct CVersion
- {
- Byte Version;
- Byte HostOS;
- };
- */
-
- namespace NCompressionMethod
- {
- enum EType
- {
- kStored = 0,
- kShrunk = 1,
- kReduced1 = 2,
- kReduced2 = 3,
- kReduced3 = 4,
- kReduced4 = 5,
- kImploded = 6,
- kReservedTokenizing = 7, // reserved for tokenizing
- kDeflated = 8,
- kDeflated64 = 9,
- kPKImploding = 10,
-
- kBZip2 = 12,
- kLZMA = 14,
- kTerse = 18,
- kLz77 = 19,
- kJpeg = 0x60,
- kWavPack = 0x61,
- kPPMd = 0x62,
- kWzAES = 0x63
- };
- const int kNumCompressionMethods = 11;
- const Byte kMadeByProgramVersion = 63;
-
- const Byte kExtractVersion_Default = 10;
- const Byte kExtractVersion_Dir = 20;
- const Byte kExtractVersion_ZipCrypto = 20;
- const Byte kExtractVersion_Deflate = 20;
- const Byte kExtractVersion_Deflate64 = 21;
- const Byte kExtractVersion_Zip64 = 45;
- const Byte kExtractVersion_BZip2 = 46;
- const Byte kExtractVersion_Aes = 51;
- const Byte kExtractVersion_LZMA = 63;
- const Byte kExtractVersion_PPMd = 63;
-
- // const Byte kSupportedVersion = 20;
- }
-
- namespace NExtraID
- {
- enum
- {
- kZip64 = 0x01,
- kNTFS = 0x0A,
- kStrongEncrypt = 0x17,
- kUnixTime = 0x5455,
- kWzAES = 0x9901
- };
- }
-
- namespace NNtfsExtra
- {
- const UInt16 kTagTime = 1;
- enum
- {
- kMTime = 0,
- kATime,
- kCTime
- };
- }
-
- namespace NUnixTime
- {
- enum
- {
- kMTime = 0,
- kATime,
- kCTime
- };
- }
-
- const UInt32 kLocalBlockSize = 26;
- /*
- struct CLocalBlock
- {
- CVersion ExtractVersion;
-
- UInt16 Flags;
- UInt16 CompressionMethod;
- UInt32 Time;
- UInt32 FileCRC;
- UInt32 PackSize;
- UInt32 UnPackSize;
- UInt16 NameSize;
- UInt16 ExtraSize;
- };
- */
-
- const UInt32 kDataDescriptorSize = 16;
- // const UInt32 kDataDescriptor64Size = 16 + 8;
- /*
- struct CDataDescriptor
- {
- UInt32 Signature;
- UInt32 FileCRC;
- UInt32 PackSize;
- UInt32 UnPackSize;
- };
-
- struct CLocalBlockFull
- {
- UInt32 Signature;
- CLocalBlock Header;
- };
- */
-
- const UInt32 kCentralBlockSize = 42;
- /*
- struct CBlock
- {
- CVersion MadeByVersion;
- CVersion ExtractVersion;
- UInt16 Flags;
- UInt16 CompressionMethod;
- UInt32 Time;
- UInt32 FileCRC;
- UInt32 PackSize;
- UInt32 UnPackSize;
- UInt16 NameSize;
- UInt16 ExtraSize;
- UInt16 CommentSize;
- UInt16 DiskNumberStart;
- UInt16 InternalAttributes;
- UInt32 ExternalAttributes;
- UInt32 LocalHeaderOffset;
- };
-
- struct CBlockFull
- {
- UInt32 Signature;
- CBlock Header;
- };
- */
-
- namespace NFlags
- {
- const int kEncrypted = 1 << 0;
- const int kLzmaEOS = 1 << 1;
- const int kDescriptorUsedMask = 1 << 3;
- const int kStrongEncrypted = 1 << 6;
- const int kUtf8 = 1 << 11;
-
- const int kImplodeDictionarySizeMask = 1 << 1;
- const int kImplodeLiteralsOnMask = 1 << 2;
-
- const int kDeflateTypeBitStart = 1;
- const int kNumDeflateTypeBits = 2;
- const int kNumDeflateTypes = (1 << kNumDeflateTypeBits);
- const int kDeflateTypeMask = (1 << kNumDeflateTypeBits) - 1;
- }
-
- namespace NHostOS
- {
- enum EEnum
- {
- kFAT = 0,
- kAMIGA = 1,
- kVMS = 2, // VAX/VMS
- kUnix = 3,
- kVM_CMS = 4,
- kAtari = 5, // what if it's a minix filesystem? [cjh]
- kHPFS = 6, // filesystem used by OS/2 (and NT 3.x)
- kMac = 7,
- kZ_System = 8,
- kCPM = 9,
- kTOPS20 = 10, // pkzip 2.50 NTFS
- kNTFS = 11, // filesystem used by Windows NT
- kQDOS = 12, // SMS/QDOS
- kAcorn = 13, // Archimedes Acorn RISC OS
- kVFAT = 14, // filesystem used by Windows 95, NT
- kMVS = 15,
- kBeOS = 16, // hybrid POSIX/database filesystem
- kTandem = 17,
- kOS400 = 18,
- kOSX = 19
- };
- }
- namespace NUnixAttribute
- {
- const UInt32 kIFMT = 0170000; /* Unix file type mask */
-
- const UInt32 kIFDIR = 0040000; /* Unix directory */
- const UInt32 kIFREG = 0100000; /* Unix regular file */
- const UInt32 kIFSOCK = 0140000; /* Unix socket (BSD, not SysV or Amiga) */
- const UInt32 kIFLNK = 0120000; /* Unix symbolic link (not SysV, Amiga) */
- const UInt32 kIFBLK = 0060000; /* Unix block special (not Amiga) */
- const UInt32 kIFCHR = 0020000; /* Unix character special (not Amiga) */
- const UInt32 kIFIFO = 0010000; /* Unix fifo (BCC, not MSC or Amiga) */
-
- const UInt32 kISUID = 04000; /* Unix set user id on execution */
- const UInt32 kISGID = 02000; /* Unix set group id on execution */
- const UInt32 kISVTX = 01000; /* Unix directory permissions control */
- const UInt32 kENFMT = kISGID; /* Unix record locking enforcement flag */
- const UInt32 kIRWXU = 00700; /* Unix read, write, execute: owner */
- const UInt32 kIRUSR = 00400; /* Unix read permission: owner */
- const UInt32 kIWUSR = 00200; /* Unix write permission: owner */
- const UInt32 kIXUSR = 00100; /* Unix execute permission: owner */
- const UInt32 kIRWXG = 00070; /* Unix read, write, execute: group */
- const UInt32 kIRGRP = 00040; /* Unix read permission: group */
- const UInt32 kIWGRP = 00020; /* Unix write permission: group */
- const UInt32 kIXGRP = 00010; /* Unix execute permission: group */
- const UInt32 kIRWXO = 00007; /* Unix read, write, execute: other */
- const UInt32 kIROTH = 00004; /* Unix read permission: other */
- const UInt32 kIWOTH = 00002; /* Unix write permission: other */
- const UInt32 kIXOTH = 00001; /* Unix execute permission: other */
- }
-
- namespace NAmigaAttribute
- {
- const UInt32 kIFMT = 06000; /* Amiga file type mask */
- const UInt32 kIFDIR = 04000; /* Amiga directory */
- const UInt32 kIFREG = 02000; /* Amiga regular file */
- const UInt32 kIHIDDEN = 00200; /* to be supported in AmigaDOS 3.x */
- const UInt32 kISCRIPT = 00100; /* executable script (text command file) */
- const UInt32 kIPURE = 00040; /* allow loading into resident memory */
- const UInt32 kIARCHIVE = 00020; /* not modified since bit was last set */
- const UInt32 kIREAD = 00010; /* can be opened for reading */
- const UInt32 kIWRITE = 00004; /* can be opened for writing */
- const UInt32 kIEXECUTE = 00002; /* executable image, a loadable runfile */
- const UInt32 kIDELETE = 00001; /* can be deleted */
- }
-}
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipIn.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipIn.cpp
deleted file mode 100644
index b36b61be7..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipIn.cpp
+++ /dev/null
@@ -1,893 +0,0 @@
-// Archive/ZipIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/DynamicBuffer.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/StreamUtils.h"
-
-#include "ZipIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-namespace NArchive {
-namespace NZip {
-
-HRESULT CInArchive::Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit)
-{
- _inBufMode = false;
- Close();
- RINOK(stream->Seek(0, STREAM_SEEK_CUR, &m_StreamStartPosition));
- m_Position = m_StreamStartPosition;
- RINOK(FindAndReadMarker(stream, searchHeaderSizeLimit));
- RINOK(stream->Seek(m_Position, STREAM_SEEK_SET, NULL));
- m_Stream = stream;
- return S_OK;
-}
-
-void CInArchive::Close()
-{
- _inBuffer.ReleaseStream();
- m_Stream.Release();
-}
-
-HRESULT CInArchive::Seek(UInt64 offset)
-{
- return m_Stream->Seek(offset, STREAM_SEEK_SET, NULL);
-}
-
-//////////////////////////////////////
-// Markers
-
-static inline bool TestMarkerCandidate(const Byte *p, UInt32 &value)
-{
- value = Get32(p);
- return
- (value == NSignature::kLocalFileHeader) ||
- (value == NSignature::kEndOfCentralDir);
-}
-
-static const UInt32 kNumMarkerAddtionalBytes = 2;
-static inline bool TestMarkerCandidate2(const Byte *p, UInt32 &value)
-{
- value = Get32(p);
- if (value == NSignature::kEndOfCentralDir)
- return (Get16(p + 4) == 0);
- return (value == NSignature::kLocalFileHeader && p[4] < 128);
-}
-
-HRESULT CInArchive::FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit)
-{
- ArcInfo.Clear();
- m_Position = m_StreamStartPosition;
-
- Byte marker[NSignature::kMarkerSize];
- RINOK(ReadStream_FALSE(stream, marker, NSignature::kMarkerSize));
- m_Position += NSignature::kMarkerSize;
- if (TestMarkerCandidate(marker, m_Signature))
- return S_OK;
-
- CByteDynamicBuffer dynamicBuffer;
- const UInt32 kSearchMarkerBufferSize = 0x10000;
- dynamicBuffer.EnsureCapacity(kSearchMarkerBufferSize);
- Byte *buffer = dynamicBuffer;
- UInt32 numBytesPrev = NSignature::kMarkerSize - 1;
- memcpy(buffer, marker + 1, numBytesPrev);
- UInt64 curTestPos = m_StreamStartPosition + 1;
- for (;;)
- {
- if (searchHeaderSizeLimit != NULL)
- if (curTestPos - m_StreamStartPosition > *searchHeaderSizeLimit)
- break;
- size_t numReadBytes = kSearchMarkerBufferSize - numBytesPrev;
- RINOK(ReadStream(stream, buffer + numBytesPrev, &numReadBytes));
- m_Position += numReadBytes;
- UInt32 numBytesInBuffer = numBytesPrev + (UInt32)numReadBytes;
- const UInt32 kMarker2Size = NSignature::kMarkerSize + kNumMarkerAddtionalBytes;
- if (numBytesInBuffer < kMarker2Size)
- break;
- UInt32 numTests = numBytesInBuffer - kMarker2Size + 1;
- for (UInt32 pos = 0; pos < numTests; pos++)
- {
- if (buffer[pos] != 0x50)
- continue;
- if (TestMarkerCandidate2(buffer + pos, m_Signature))
- {
- curTestPos += pos;
- ArcInfo.StartPosition = curTestPos;
- m_Position = curTestPos + NSignature::kMarkerSize;
- return S_OK;
- }
- }
- curTestPos += numTests;
- numBytesPrev = numBytesInBuffer - numTests;
- memmove(buffer, buffer + numTests, numBytesPrev);
- }
- return S_FALSE;
-}
-
-HRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 *processedSize)
-{
- size_t realProcessedSize = size;
- HRESULT result = S_OK;
- if (_inBufMode)
- {
- try { realProcessedSize = _inBuffer.ReadBytes((Byte *)data, size); }
- catch (const CInBufferException &e) { return e.ErrorCode; }
- }
- else
- result = ReadStream(m_Stream, data, &realProcessedSize);
- if (processedSize != NULL)
- *processedSize = (UInt32)realProcessedSize;
- m_Position += realProcessedSize;
- return result;
-}
-
-void CInArchive::Skip(UInt64 num)
-{
- for (UInt64 i = 0; i < num; i++)
- ReadByte();
-}
-
-void CInArchive::IncreaseRealPosition(UInt64 addValue)
-{
- if (m_Stream->Seek(addValue, STREAM_SEEK_CUR, &m_Position) != S_OK)
- throw CInArchiveException(CInArchiveException::kSeekStreamError);
-}
-
-bool CInArchive::ReadBytesAndTestSize(void *data, UInt32 size)
-{
- UInt32 realProcessedSize;
- if (ReadBytes(data, size, &realProcessedSize) != S_OK)
- throw CInArchiveException(CInArchiveException::kReadStreamError);
- return (realProcessedSize == size);
-}
-
-void CInArchive::SafeReadBytes(void *data, UInt32 size)
-{
- if (!ReadBytesAndTestSize(data, size))
- throw CInArchiveException(CInArchiveException::kUnexpectedEndOfArchive);
-}
-
-void CInArchive::ReadBuffer(CByteBuffer &buffer, UInt32 size)
-{
- buffer.SetCapacity(size);
- if (size > 0)
- SafeReadBytes(buffer, size);
-}
-
-Byte CInArchive::ReadByte()
-{
- Byte b;
- SafeReadBytes(&b, 1);
- return b;
-}
-
-UInt16 CInArchive::ReadUInt16()
-{
- Byte buf[2];
- SafeReadBytes(buf, 2);
- return Get16(buf);
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- Byte buf[4];
- SafeReadBytes(buf, 4);
- return Get32(buf);
-}
-
-UInt64 CInArchive::ReadUInt64()
-{
- Byte buf[8];
- SafeReadBytes(buf, 8);
- return Get64(buf);
-}
-
-bool CInArchive::ReadUInt32(UInt32 &value)
-{
- Byte buf[4];
- if (!ReadBytesAndTestSize(buf, 4))
- return false;
- value = Get32(buf);
- return true;
-}
-
-void CInArchive::ReadFileName(UInt32 nameSize, AString &dest)
-{
- if (nameSize == 0)
- dest.Empty();
- char *p = dest.GetBuffer((int)nameSize);
- SafeReadBytes(p, nameSize);
- p[nameSize] = 0;
- dest.ReleaseBuffer();
-}
-
-void CInArchive::ReadExtra(UInt32 extraSize, CExtraBlock &extraBlock,
- UInt64 &unpackSize, UInt64 &packSize, UInt64 &localHeaderOffset, UInt32 &diskStartNumber)
-{
- extraBlock.Clear();
- UInt32 remain = extraSize;
- while(remain >= 4)
- {
- CExtraSubBlock subBlock;
- subBlock.ID = ReadUInt16();
- UInt32 dataSize = ReadUInt16();
- remain -= 4;
- if (dataSize > remain) // it's bug
- dataSize = remain;
- if (subBlock.ID == NFileHeader::NExtraID::kZip64)
- {
- if (unpackSize == 0xFFFFFFFF)
- {
- if (dataSize < 8)
- break;
- unpackSize = ReadUInt64();
- remain -= 8;
- dataSize -= 8;
- }
- if (packSize == 0xFFFFFFFF)
- {
- if (dataSize < 8)
- break;
- packSize = ReadUInt64();
- remain -= 8;
- dataSize -= 8;
- }
- if (localHeaderOffset == 0xFFFFFFFF)
- {
- if (dataSize < 8)
- break;
- localHeaderOffset = ReadUInt64();
- remain -= 8;
- dataSize -= 8;
- }
- if (diskStartNumber == 0xFFFF)
- {
- if (dataSize < 4)
- break;
- diskStartNumber = ReadUInt32();
- remain -= 4;
- dataSize -= 4;
- }
- for (UInt32 i = 0; i < dataSize; i++)
- ReadByte();
- }
- else
- {
- ReadBuffer(subBlock.Data, dataSize);
- extraBlock.SubBlocks.Add(subBlock);
- }
- remain -= dataSize;
- }
- Skip(remain);
-}
-
-HRESULT CInArchive::ReadLocalItem(CItemEx &item)
-{
- const int kBufSize = 26;
- Byte p[kBufSize];
- SafeReadBytes(p, kBufSize);
-
- item.ExtractVersion.Version = p[0];
- item.ExtractVersion.HostOS = p[1];
- item.Flags = Get16(p + 2);
- item.CompressionMethod = Get16(p + 4);
- item.Time = Get32(p + 6);
- item.FileCRC = Get32(p + 10);
- item.PackSize = Get32(p + 14);
- item.UnPackSize = Get32(p + 18);
- UInt32 fileNameSize = Get16(p + 22);
- item.LocalExtraSize = Get16(p + 24);
- ReadFileName(fileNameSize, item.Name);
- item.FileHeaderWithNameSize = 4 + NFileHeader::kLocalBlockSize + fileNameSize;
- if (item.LocalExtraSize > 0)
- {
- UInt64 localHeaderOffset = 0;
- UInt32 diskStartNumber = 0;
- ReadExtra(item.LocalExtraSize, item.LocalExtra, item.UnPackSize, item.PackSize,
- localHeaderOffset, diskStartNumber);
- }
- /*
- if (item.IsDir())
- item.UnPackSize = 0; // check It
- */
- return S_OK;
-}
-
-static bool FlagsAreSame(CItem &i1, CItem &i2)
-{
- if (i1.CompressionMethod != i2.CompressionMethod)
- return false;
- // i1.Time
-
- if (i1.Flags == i2.Flags)
- return true;
- UInt32 mask = 0xFFFF;
- switch(i1.CompressionMethod)
- {
- case NFileHeader::NCompressionMethod::kDeflated:
- mask = 0x7FF9;
- break;
- default:
- if (i1.CompressionMethod <= NFileHeader::NCompressionMethod::kImploded)
- mask = 0x7FFF;
- }
- return ((i1.Flags & mask) == (i2.Flags & mask));
-}
-
-HRESULT CInArchive::ReadLocalItemAfterCdItem(CItemEx &item)
-{
- if (item.FromLocal)
- return S_OK;
- try
- {
- RINOK(Seek(ArcInfo.Base + item.LocalHeaderPosition));
- CItemEx localItem;
- if (ReadUInt32() != NSignature::kLocalFileHeader)
- return S_FALSE;
- RINOK(ReadLocalItem(localItem));
- if (!FlagsAreSame(item, localItem))
- return S_FALSE;
-
- if ((!localItem.HasDescriptor() &&
- (
- item.FileCRC != localItem.FileCRC ||
- item.PackSize != localItem.PackSize ||
- item.UnPackSize != localItem.UnPackSize
- )
- ) ||
- item.Name.Length() != localItem.Name.Length()
- )
- return S_FALSE;
- item.FileHeaderWithNameSize = localItem.FileHeaderWithNameSize;
- item.LocalExtraSize = localItem.LocalExtraSize;
- item.LocalExtra = localItem.LocalExtra;
- item.FromLocal = true;
- }
- catch(...) { return S_FALSE; }
- return S_OK;
-}
-
-HRESULT CInArchive::ReadLocalItemDescriptor(CItemEx &item)
-{
- if (item.HasDescriptor())
- {
- const int kBufferSize = (1 << 12);
- Byte buffer[kBufferSize];
-
- UInt32 numBytesInBuffer = 0;
- UInt32 packedSize = 0;
-
- bool descriptorWasFound = false;
- for (;;)
- {
- UInt32 processedSize;
- RINOK(ReadBytes(buffer + numBytesInBuffer, kBufferSize - numBytesInBuffer, &processedSize));
- numBytesInBuffer += processedSize;
- if (numBytesInBuffer < NFileHeader::kDataDescriptorSize)
- return S_FALSE;
- UInt32 i;
- for (i = 0; i <= numBytesInBuffer - NFileHeader::kDataDescriptorSize; i++)
- {
- // descriptorSignature field is Info-ZIP's extension
- // to Zip specification.
- UInt32 descriptorSignature = Get32(buffer + i);
-
- // !!!! It must be fixed for Zip64 archives
- UInt32 descriptorPackSize = Get32(buffer + i + 8);
- if (descriptorSignature== NSignature::kDataDescriptor && descriptorPackSize == packedSize + i)
- {
- descriptorWasFound = true;
- item.FileCRC = Get32(buffer + i + 4);
- item.PackSize = descriptorPackSize;
- item.UnPackSize = Get32(buffer + i + 12);
- IncreaseRealPosition(Int64(Int32(0 - (numBytesInBuffer - i - NFileHeader::kDataDescriptorSize))));
- break;
- }
- }
- if (descriptorWasFound)
- break;
- packedSize += i;
- int j;
- for (j = 0; i < numBytesInBuffer; i++, j++)
- buffer[j] = buffer[i];
- numBytesInBuffer = j;
- }
- }
- else
- IncreaseRealPosition(item.PackSize);
- return S_OK;
-}
-
-HRESULT CInArchive::ReadLocalItemAfterCdItemFull(CItemEx &item)
-{
- if (item.FromLocal)
- return S_OK;
- try
- {
- RINOK(ReadLocalItemAfterCdItem(item));
- if (item.HasDescriptor())
- {
- RINOK(Seek(ArcInfo.Base + item.GetDataPosition() + item.PackSize));
- if (ReadUInt32() != NSignature::kDataDescriptor)
- return S_FALSE;
- UInt32 crc = ReadUInt32();
- UInt64 packSize, unpackSize;
-
- /*
- if (IsZip64)
- {
- packSize = ReadUInt64();
- unpackSize = ReadUInt64();
- }
- else
- */
- {
- packSize = ReadUInt32();
- unpackSize = ReadUInt32();
- }
-
- if (crc != item.FileCRC || item.PackSize != packSize || item.UnPackSize != unpackSize)
- return S_FALSE;
- }
- }
- catch(...) { return S_FALSE; }
- return S_OK;
-}
-
-HRESULT CInArchive::ReadCdItem(CItemEx &item)
-{
- item.FromCentral = true;
- const int kBufSize = 42;
- Byte p[kBufSize];
- SafeReadBytes(p, kBufSize);
- item.MadeByVersion.Version = p[0];
- item.MadeByVersion.HostOS = p[1];
- item.ExtractVersion.Version = p[2];
- item.ExtractVersion.HostOS = p[3];
- item.Flags = Get16(p + 4);
- item.CompressionMethod = Get16(p + 6);
- item.Time = Get32(p + 8);
- item.FileCRC = Get32(p + 12);
- item.PackSize = Get32(p + 16);
- item.UnPackSize = Get32(p + 20);
- UInt16 headerNameSize = Get16(p + 24);
- UInt16 headerExtraSize = Get16(p + 26);
- UInt16 headerCommentSize = Get16(p + 28);
- UInt32 headerDiskNumberStart = Get16(p + 30);
- item.InternalAttributes = Get16(p + 32);
- item.ExternalAttributes = Get32(p + 34);
- item.LocalHeaderPosition = Get32(p + 38);
- ReadFileName(headerNameSize, item.Name);
-
- if (headerExtraSize > 0)
- {
- ReadExtra(headerExtraSize, item.CentralExtra, item.UnPackSize, item.PackSize,
- item.LocalHeaderPosition, headerDiskNumberStart);
- }
-
- if (headerDiskNumberStart != 0)
- throw CInArchiveException(CInArchiveException::kMultiVolumeArchiveAreNotSupported);
-
- // May be these strings must be deleted
- /*
- if (item.IsDir())
- item.UnPackSize = 0;
- */
-
- ReadBuffer(item.Comment, headerCommentSize);
- return S_OK;
-}
-
-HRESULT CInArchive::TryEcd64(UInt64 offset, CCdInfo &cdInfo)
-{
- RINOK(Seek(offset));
- const UInt32 kEcd64Size = 56;
- Byte buf[kEcd64Size];
- if (!ReadBytesAndTestSize(buf, kEcd64Size))
- return S_FALSE;
- if (Get32(buf) != NSignature::kZip64EndOfCentralDir)
- return S_FALSE;
- // cdInfo.NumEntries = Get64(buf + 24);
- cdInfo.Size = Get64(buf + 40);
- cdInfo.Offset = Get64(buf + 48);
- return S_OK;
-}
-
-HRESULT CInArchive::FindCd(CCdInfo &cdInfo)
-{
- UInt64 endPosition;
- RINOK(m_Stream->Seek(0, STREAM_SEEK_END, &endPosition));
- const UInt32 kBufSizeMax = (1 << 16) + kEcdSize + kZip64EcdLocatorSize;
- CByteBuffer byteBuffer;
- byteBuffer.SetCapacity(kBufSizeMax);
- Byte *buf = byteBuffer;
- UInt32 bufSize = (endPosition < kBufSizeMax) ? (UInt32)endPosition : kBufSizeMax;
- if (bufSize < kEcdSize)
- return S_FALSE;
- UInt64 startPosition = endPosition - bufSize;
- RINOK(m_Stream->Seek(startPosition, STREAM_SEEK_SET, &m_Position));
- if (m_Position != startPosition)
- return S_FALSE;
- if (!ReadBytesAndTestSize(buf, bufSize))
- return S_FALSE;
- for (int i = (int)(bufSize - kEcdSize); i >= 0; i--)
- {
- if (Get32(buf + i) == NSignature::kEndOfCentralDir)
- {
- if (i >= kZip64EcdLocatorSize)
- {
- const Byte *locator = buf + i - kZip64EcdLocatorSize;
- if (Get32(locator) == NSignature::kZip64EndOfCentralDirLocator)
- {
- UInt64 ecd64Offset = Get64(locator + 8);
- if (TryEcd64(ecd64Offset, cdInfo) == S_OK)
- return S_OK;
- if (TryEcd64(ArcInfo.StartPosition + ecd64Offset, cdInfo) == S_OK)
- {
- ArcInfo.Base = ArcInfo.StartPosition;
- return S_OK;
- }
- }
- }
- if (Get32(buf + i + 4) == 0)
- {
- // cdInfo.NumEntries = GetUInt16(buf + i + 10);
- cdInfo.Size = Get32(buf + i + 12);
- cdInfo.Offset = Get32(buf + i + 16);
- UInt64 curPos = endPosition - bufSize + i;
- UInt64 cdEnd = cdInfo.Size + cdInfo.Offset;
- if (curPos != cdEnd)
- {
- /*
- if (cdInfo.Offset <= 16 && cdInfo.Size != 0)
- {
- // here we support some rare ZIP files with Central directory at the start
- ArcInfo.Base = 0;
- }
- else
- */
- ArcInfo.Base = curPos - cdEnd;
- }
- return S_OK;
- }
- }
- }
- return S_FALSE;
-}
-
-HRESULT CInArchive::TryReadCd(CObjectVector<CItemEx> &items, UInt64 cdOffset, UInt64 cdSize, CProgressVirt *progress)
-{
- items.Clear();
- RINOK(m_Stream->Seek(cdOffset, STREAM_SEEK_SET, &m_Position));
- if (m_Position != cdOffset)
- return S_FALSE;
-
- if (!_inBuffer.Create(1 << 15))
- return E_OUTOFMEMORY;
- _inBuffer.SetStream(m_Stream);
- _inBuffer.Init();
- _inBufMode = true;
-
- while(m_Position - cdOffset < cdSize)
- {
- if (ReadUInt32() != NSignature::kCentralFileHeader)
- return S_FALSE;
- CItemEx cdItem;
- RINOK(ReadCdItem(cdItem));
- items.Add(cdItem);
- if (progress && items.Size() % 1000 == 0)
- RINOK(progress->SetCompleted(items.Size()));
- }
- return (m_Position - cdOffset == cdSize) ? S_OK : S_FALSE;
-}
-
-HRESULT CInArchive::ReadCd(CObjectVector<CItemEx> &items, UInt64 &cdOffset, UInt64 &cdSize, CProgressVirt *progress)
-{
- ArcInfo.Base = 0;
- CCdInfo cdInfo;
- RINOK(FindCd(cdInfo));
- HRESULT res = S_FALSE;
- cdSize = cdInfo.Size;
- cdOffset = cdInfo.Offset;
- res = TryReadCd(items, ArcInfo.Base + cdOffset, cdSize, progress);
- if (res == S_FALSE && ArcInfo.Base == 0)
- {
- res = TryReadCd(items, cdInfo.Offset + ArcInfo.StartPosition, cdSize, progress);
- if (res == S_OK)
- ArcInfo.Base = ArcInfo.StartPosition;
- }
- if (!ReadUInt32(m_Signature))
- return S_FALSE;
- return res;
-}
-
-HRESULT CInArchive::ReadLocalsAndCd(CObjectVector<CItemEx> &items, CProgressVirt *progress, UInt64 &cdOffset, int &numCdItems)
-{
- items.Clear();
- numCdItems = 0;
- while (m_Signature == NSignature::kLocalFileHeader)
- {
- // FSeek points to next byte after signature
- // NFileHeader::CLocalBlock localHeader;
- CItemEx item;
- item.LocalHeaderPosition = m_Position - m_StreamStartPosition - 4; // points to signature;
- RINOK(ReadLocalItem(item));
- item.FromLocal = true;
- ReadLocalItemDescriptor(item);
- items.Add(item);
- if (progress && items.Size() % 100 == 0)
- RINOK(progress->SetCompleted(items.Size()));
- if (!ReadUInt32(m_Signature))
- break;
- }
- cdOffset = m_Position - 4;
- int i;
- for (i = 0; i < items.Size(); i++, numCdItems++)
- {
- if (progress && i % 1000 == 0)
- RINOK(progress->SetCompleted(items.Size()));
- if (m_Signature == NSignature::kEndOfCentralDir)
- break;
-
- if (m_Signature != NSignature::kCentralFileHeader)
- return S_FALSE;
-
- CItemEx cdItem;
- RINOK(ReadCdItem(cdItem));
-
- if (i == 0)
- {
- int j;
- for (j = 0; j < items.Size(); j++)
- {
- CItemEx &item = items[j];
- if (item.Name == cdItem.Name)
- {
- ArcInfo.Base = item.LocalHeaderPosition - cdItem.LocalHeaderPosition;
- break;
- }
- }
- if (j == items.Size())
- return S_FALSE;
- }
-
- int index;
- int left = 0, right = items.Size();
- for (;;)
- {
- if (left >= right)
- return S_FALSE;
- index = (left + right) / 2;
- UInt64 position = items[index].LocalHeaderPosition - ArcInfo.Base;
- if (cdItem.LocalHeaderPosition == position)
- break;
- if (cdItem.LocalHeaderPosition < position)
- right = index;
- else
- left = index + 1;
- }
- CItemEx &item = items[index];
- // item.LocalHeaderPosition = cdItem.LocalHeaderPosition;
- item.MadeByVersion = cdItem.MadeByVersion;
- item.CentralExtra = cdItem.CentralExtra;
-
- if (
- // item.ExtractVersion != cdItem.ExtractVersion ||
- !FlagsAreSame(item, cdItem) ||
- item.FileCRC != cdItem.FileCRC)
- return S_FALSE;
-
- if (item.Name.Length() != cdItem.Name.Length() ||
- item.PackSize != cdItem.PackSize ||
- item.UnPackSize != cdItem.UnPackSize
- )
- return S_FALSE;
- item.Name = cdItem.Name;
- item.InternalAttributes = cdItem.InternalAttributes;
- item.ExternalAttributes = cdItem.ExternalAttributes;
- item.Comment = cdItem.Comment;
- item.FromCentral = cdItem.FromCentral;
- if (!ReadUInt32(m_Signature))
- return S_FALSE;
- }
- for (i = 0; i < items.Size(); i++)
- items[i].LocalHeaderPosition -= ArcInfo.Base;
- return S_OK;
-}
-
-struct CEcd
-{
- UInt16 thisDiskNumber;
- UInt16 startCDDiskNumber;
- UInt16 numEntriesInCDOnThisDisk;
- UInt16 numEntriesInCD;
- UInt32 cdSize;
- UInt32 cdStartOffset;
- UInt16 commentSize;
- void Parse(const Byte *p);
-};
-
-void CEcd::Parse(const Byte *p)
-{
- thisDiskNumber = Get16(p);
- startCDDiskNumber = Get16(p + 2);
- numEntriesInCDOnThisDisk = Get16(p + 4);
- numEntriesInCD = Get16(p + 6);
- cdSize = Get32(p + 8);
- cdStartOffset = Get32(p + 12);
- commentSize = Get16(p + 16);
-}
-
-struct CEcd64
-{
- UInt16 versionMade;
- UInt16 versionNeedExtract;
- UInt32 thisDiskNumber;
- UInt32 startCDDiskNumber;
- UInt64 numEntriesInCDOnThisDisk;
- UInt64 numEntriesInCD;
- UInt64 cdSize;
- UInt64 cdStartOffset;
- void Parse(const Byte *p);
- CEcd64() { memset(this, 0, sizeof(*this)); }
-};
-
-void CEcd64::Parse(const Byte *p)
-{
- versionMade = Get16(p);
- versionNeedExtract = Get16(p + 2);
- thisDiskNumber = Get32(p + 4);
- startCDDiskNumber = Get32(p + 8);
- numEntriesInCDOnThisDisk = Get64(p + 12);
- numEntriesInCD = Get64(p + 20);
- cdSize = Get64(p + 28);
- cdStartOffset = Get64(p + 36);
-}
-
-#define COPY_ECD_ITEM_16(n) if (!isZip64 || ecd. n != 0xFFFF) ecd64. n = ecd. n;
-#define COPY_ECD_ITEM_32(n) if (!isZip64 || ecd. n != 0xFFFFFFFF) ecd64. n = ecd. n;
-
-HRESULT CInArchive::ReadHeaders(CObjectVector<CItemEx> &items, CProgressVirt *progress)
-{
- // m_Signature must be kLocalFileHeaderSignature or
- // kEndOfCentralDirSignature
- // m_Position points to next byte after signature
-
- IsZip64 = false;
- items.Clear();
-
- UInt64 cdSize, cdStartOffset;
- HRESULT res;
- try
- {
- res = ReadCd(items, cdStartOffset, cdSize, progress);
- }
- catch(CInArchiveException &)
- {
- res = S_FALSE;
- }
- if (res != S_FALSE && res != S_OK)
- return res;
-
- /*
- if (res != S_OK)
- return res;
- res = S_FALSE;
- */
-
- int numCdItems = items.Size();
- if (res == S_FALSE)
- {
- _inBufMode = false;
- ArcInfo.Base = 0;
- RINOK(m_Stream->Seek(ArcInfo.StartPosition, STREAM_SEEK_SET, &m_Position));
- if (m_Position != ArcInfo.StartPosition)
- return S_FALSE;
- if (!ReadUInt32(m_Signature))
- return S_FALSE;
- RINOK(ReadLocalsAndCd(items, progress, cdStartOffset, numCdItems));
- cdSize = (m_Position - 4) - cdStartOffset;
- cdStartOffset -= ArcInfo.Base;
- }
-
- CEcd64 ecd64;
- bool isZip64 = false;
- UInt64 zip64EcdStartOffset = m_Position - 4 - ArcInfo.Base;
- if (m_Signature == NSignature::kZip64EndOfCentralDir)
- {
- IsZip64 = isZip64 = true;
- UInt64 recordSize = ReadUInt64();
-
- const int kBufSize = kZip64EcdSize;
- Byte buf[kBufSize];
- SafeReadBytes(buf, kBufSize);
- ecd64.Parse(buf);
-
- Skip(recordSize - kZip64EcdSize);
- if (!ReadUInt32(m_Signature))
- return S_FALSE;
- if (ecd64.thisDiskNumber != 0 || ecd64.startCDDiskNumber != 0)
- throw CInArchiveException(CInArchiveException::kMultiVolumeArchiveAreNotSupported);
- if (ecd64.numEntriesInCDOnThisDisk != numCdItems ||
- ecd64.numEntriesInCD != numCdItems ||
- ecd64.cdSize != cdSize ||
- (ecd64.cdStartOffset != cdStartOffset &&
- (!items.IsEmpty())))
- return S_FALSE;
- }
- if (m_Signature == NSignature::kZip64EndOfCentralDirLocator)
- {
- /* UInt32 startEndCDDiskNumber = */ ReadUInt32();
- UInt64 endCDStartOffset = ReadUInt64();
- /* UInt32 numberOfDisks = */ ReadUInt32();
- if (zip64EcdStartOffset != endCDStartOffset)
- return S_FALSE;
- if (!ReadUInt32(m_Signature))
- return S_FALSE;
- }
- if (m_Signature != NSignature::kEndOfCentralDir)
- return S_FALSE;
-
- const int kBufSize = kEcdSize - 4;
- Byte buf[kBufSize];
- SafeReadBytes(buf, kBufSize);
- CEcd ecd;
- ecd.Parse(buf);
-
- COPY_ECD_ITEM_16(thisDiskNumber);
- COPY_ECD_ITEM_16(startCDDiskNumber);
- COPY_ECD_ITEM_16(numEntriesInCDOnThisDisk);
- COPY_ECD_ITEM_16(numEntriesInCD);
- COPY_ECD_ITEM_32(cdSize);
- COPY_ECD_ITEM_32(cdStartOffset);
-
- ReadBuffer(ArcInfo.Comment, ecd.commentSize);
-
- if (ecd64.thisDiskNumber != 0 || ecd64.startCDDiskNumber != 0)
- throw CInArchiveException(CInArchiveException::kMultiVolumeArchiveAreNotSupported);
- if ((UInt16)ecd64.numEntriesInCDOnThisDisk != ((UInt16)numCdItems) ||
- (UInt16)ecd64.numEntriesInCD != ((UInt16)numCdItems) ||
- (UInt32)ecd64.cdSize != (UInt32)cdSize ||
- ((UInt32)(ecd64.cdStartOffset) != (UInt32)cdStartOffset &&
- (!items.IsEmpty())))
- return S_FALSE;
-
- _inBufMode = false;
- _inBuffer.Free();
- IsOkHeaders = (numCdItems == items.Size());
- ArcInfo.FinishPosition = m_Position;
- return S_OK;
-}
-
-ISequentialInStream* CInArchive::CreateLimitedStream(UInt64 position, UInt64 size)
-{
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> stream(streamSpec);
- SeekInArchive(ArcInfo.Base + position);
- streamSpec->SetStream(m_Stream);
- streamSpec->Init(size);
- return stream.Detach();
-}
-
-IInStream* CInArchive::CreateStream()
-{
- CMyComPtr<IInStream> stream = m_Stream;
- return stream.Detach();
-}
-
-bool CInArchive::SeekInArchive(UInt64 position)
-{
- UInt64 newPosition;
- if (m_Stream->Seek(position, STREAM_SEEK_SET, &newPosition) != S_OK)
- return false;
- return (newPosition == position);
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipIn.h b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipIn.h
deleted file mode 100644
index 0565339a0..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipIn.h
+++ /dev/null
@@ -1,125 +0,0 @@
-// Archive/ZipIn.h
-
-#ifndef __ZIP_IN_H
-#define __ZIP_IN_H
-
-#include "Common/MyCom.h"
-
-#include "../../IStream.h"
-
-#include "../../Common/InBuffer.h"
-
-#include "ZipHeader.h"
-#include "ZipItemEx.h"
-
-namespace NArchive {
-namespace NZip {
-
-class CInArchiveException
-{
-public:
- enum ECauseType
- {
- kUnexpectedEndOfArchive = 0,
- kArchiceHeaderCRCError,
- kFileHeaderCRCError,
- kIncorrectArchive,
- kDataDescroptorsAreNotSupported,
- kMultiVolumeArchiveAreNotSupported,
- kReadStreamError,
- kSeekStreamError
- }
- Cause;
- CInArchiveException(ECauseType cause): Cause(cause) {}
-};
-
-class CInArchiveInfo
-{
-public:
- UInt64 Base;
- UInt64 StartPosition;
- UInt64 FinishPosition;
- CByteBuffer Comment;
-
- CInArchiveInfo(): Base(0), StartPosition(0) {}
- UInt64 GetPhySize() const { return FinishPosition - StartPosition; }
- void Clear()
- {
- Base = 0;
- StartPosition = 0;
- Comment.SetCapacity(0);
- }
-};
-
-class CProgressVirt
-{
-public:
- STDMETHOD(SetTotal)(UInt64 numFiles) PURE;
- STDMETHOD(SetCompleted)(UInt64 numFiles) PURE;
-};
-
-struct CCdInfo
-{
- // UInt64 NumEntries;
- UInt64 Size;
- UInt64 Offset;
-};
-
-class CInArchive
-{
- CMyComPtr<IInStream> m_Stream;
- UInt32 m_Signature;
- UInt64 m_StreamStartPosition;
- UInt64 m_Position;
-
- bool _inBufMode;
- CInBuffer _inBuffer;
-
- HRESULT Seek(UInt64 offset);
-
- HRESULT FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
- void ReadFileName(UInt32 nameSize, AString &dest);
-
- HRESULT ReadBytes(void *data, UInt32 size, UInt32 *processedSize);
- bool ReadBytesAndTestSize(void *data, UInt32 size);
- void SafeReadBytes(void *data, UInt32 size);
- void ReadBuffer(CByteBuffer &buffer, UInt32 size);
- Byte ReadByte();
- UInt16 ReadUInt16();
- UInt32 ReadUInt32();
- UInt64 ReadUInt64();
- bool ReadUInt32(UInt32 &signature);
-
- void Skip(UInt64 num);
- void IncreaseRealPosition(UInt64 addValue);
-
- void ReadExtra(UInt32 extraSize, CExtraBlock &extraBlock,
- UInt64 &unpackSize, UInt64 &packSize, UInt64 &localHeaderOffset, UInt32 &diskStartNumber);
- HRESULT ReadLocalItem(CItemEx &item);
- HRESULT ReadLocalItemDescriptor(CItemEx &item);
- HRESULT ReadCdItem(CItemEx &item);
- HRESULT TryEcd64(UInt64 offset, CCdInfo &cdInfo);
- HRESULT FindCd(CCdInfo &cdInfo);
- HRESULT TryReadCd(CObjectVector<CItemEx> &items, UInt64 cdOffset, UInt64 cdSize, CProgressVirt *progress);
- HRESULT ReadCd(CObjectVector<CItemEx> &items, UInt64 &cdOffset, UInt64 &cdSize, CProgressVirt *progress);
- HRESULT ReadLocalsAndCd(CObjectVector<CItemEx> &items, CProgressVirt *progress, UInt64 &cdOffset, int &numCdItems);
-public:
- CInArchiveInfo ArcInfo;
- bool IsZip64;
- bool IsOkHeaders;
-
- HRESULT ReadHeaders(CObjectVector<CItemEx> &items, CProgressVirt *progress);
- HRESULT ReadLocalItemAfterCdItem(CItemEx &item);
- HRESULT ReadLocalItemAfterCdItemFull(CItemEx &item);
- HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
- void Close();
- bool SeekInArchive(UInt64 position);
- ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);
- IInStream* CreateStream();
-
- bool IsOpen() const { return m_Stream != NULL; }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItem.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItem.cpp
deleted file mode 100644
index 4dd58f7d6..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItem.cpp
+++ /dev/null
@@ -1,181 +0,0 @@
-// Archive/ZipItem.cpp
-
-#include "StdAfx.h"
-
-#include "ZipHeader.h"
-#include "ZipItem.h"
-#include "../Common/ItemNameUtils.h"
-#include "../../../../C/CpuArch.h"
-
-namespace NArchive {
-namespace NZip {
-
-bool operator==(const CVersion &v1, const CVersion &v2)
-{
- return (v1.Version == v2.Version) && (v1.HostOS == v2.HostOS);
-}
-
-bool operator!=(const CVersion &v1, const CVersion &v2)
-{
- return !(v1 == v2);
-}
-
-bool CExtraSubBlock::ExtractNtfsTime(int index, FILETIME &ft) const
-{
- ft.dwHighDateTime = ft.dwLowDateTime = 0;
- UInt32 size = (UInt32)Data.GetCapacity();
- if (ID != NFileHeader::NExtraID::kNTFS || size < 32)
- return false;
- const Byte *p = (const Byte *)Data;
- p += 4; // for reserved
- size -= 4;
- while (size > 4)
- {
- UInt16 tag = GetUi16(p);
- UInt32 attrSize = GetUi16(p + 2);
- p += 4;
- size -= 4;
- if (attrSize > size)
- attrSize = size;
-
- if (tag == NFileHeader::NNtfsExtra::kTagTime && attrSize >= 24)
- {
- p += 8 * index;
- ft.dwLowDateTime = GetUi32(p);
- ft.dwHighDateTime = GetUi32(p + 4);
- return true;
- }
- p += attrSize;
- size -= attrSize;
- }
- return false;
-}
-
-bool CExtraSubBlock::ExtractUnixTime(int index, UInt32 &res) const
-{
- res = 0;
- UInt32 size = (UInt32)Data.GetCapacity();
- if (ID != NFileHeader::NExtraID::kUnixTime || size < 5)
- return false;
- const Byte *p = (const Byte *)Data;
- Byte flags = *p++;
- size--;
- for (int i = 0; i < 3; i++)
- if ((flags & (1 << i)) != 0)
- {
- if (size < 4)
- return false;
- if (index == i)
- {
- res = GetUi32(p);
- return true;
- }
- p += 4;
- size -= 4;
- }
- return false;
-}
-
-bool CLocalItem::IsDir() const
-{
- return NItemName::HasTailSlash(Name, GetCodePage());
-}
-
-bool CItem::IsDir() const
-{
- if (NItemName::HasTailSlash(Name, GetCodePage()))
- return true;
- if (!FromCentral)
- return false;
- WORD highAttributes = WORD((ExternalAttributes >> 16 ) & 0xFFFF);
- switch(MadeByVersion.HostOS)
- {
- case NFileHeader::NHostOS::kAMIGA:
- switch (highAttributes & NFileHeader::NAmigaAttribute::kIFMT)
- {
- case NFileHeader::NAmigaAttribute::kIFDIR: return true;
- case NFileHeader::NAmigaAttribute::kIFREG: return false;
- default: return false; // change it throw kUnknownAttributes;
- }
- case NFileHeader::NHostOS::kFAT:
- case NFileHeader::NHostOS::kNTFS:
- case NFileHeader::NHostOS::kHPFS:
- case NFileHeader::NHostOS::kVFAT:
- return ((ExternalAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0);
- case NFileHeader::NHostOS::kAtari:
- case NFileHeader::NHostOS::kMac:
- case NFileHeader::NHostOS::kVMS:
- case NFileHeader::NHostOS::kVM_CMS:
- case NFileHeader::NHostOS::kAcorn:
- case NFileHeader::NHostOS::kMVS:
- return false; // change it throw kUnknownAttributes;
- default:
- /*
- switch (highAttributes & NFileHeader::NUnixAttribute::kIFMT)
- {
- case NFileHeader::NUnixAttribute::kIFDIR:
- return true;
- default:
- return false;
- }
- */
- return false;
- }
-}
-
-#ifndef FILE_ATTRIBUTE_UNIX_EXTENSION
-UInt32 CLocalItem::GetWinAttributes() const
-{
- DWORD winAttributes = 0;
- if (IsDir())
- winAttributes |= FILE_ATTRIBUTE_DIRECTORY;
- return winAttributes;
-}
-#endif
-
-UInt32 CItem::GetWinAttributes() const
-{
- DWORD winAttributes = 0;
- switch(MadeByVersion.HostOS)
- {
- case NFileHeader::NHostOS::kFAT:
- case NFileHeader::NHostOS::kNTFS:
- if (FromCentral)
- winAttributes = ExternalAttributes;
- break;
-#ifdef FILE_ATTRIBUTE_UNIX_EXTENSION
- case NFileHeader::NHostOS::kUnix:
- winAttributes = (ExternalAttributes & 0xFFFF0000) | FILE_ATTRIBUTE_UNIX_EXTENSION;
- if (winAttributes & (NFileHeader::NUnixAttribute::kIFDIR << 16))
- winAttributes |= FILE_ATTRIBUTE_DIRECTORY;
- return winAttributes;
-#endif
- default:
- winAttributes = 0; // must be converted from unix value;
- }
- if (IsDir()) // test it;
- winAttributes |= FILE_ATTRIBUTE_DIRECTORY;
- return winAttributes;
-}
-
-void CLocalItem::SetFlagBits(int startBitNumber, int numBits, int value)
-{
- UInt16 mask = (UInt16)(((1 << numBits) - 1) << startBitNumber);
- Flags &= ~mask;
- Flags |= value << startBitNumber;
-}
-
-void CLocalItem::SetBitMask(int bitMask, bool enable)
-{
- if(enable)
- Flags |= bitMask;
- else
- Flags &= ~bitMask;
-}
-
-void CLocalItem::SetEncrypted(bool encrypted)
- { SetBitMask(NFileHeader::NFlags::kEncrypted, encrypted); }
-void CLocalItem::SetUtf8(bool isUtf8)
- { SetBitMask(NFileHeader::NFlags::kUtf8, isUtf8); }
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItem.h b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItem.h
deleted file mode 100644
index 31f2de732..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItem.h
+++ /dev/null
@@ -1,281 +0,0 @@
-// Archive/ZipItem.h
-
-#ifndef __ARCHIVE_ZIP_ITEM_H
-#define __ARCHIVE_ZIP_ITEM_H
-
-#include "Common/Types.h"
-#include "Common/MyString.h"
-#include "Common/Buffer.h"
-#include "Common/UTFConvert.h"
-#include "Common/StringConvert.h"
-
-#include "ZipHeader.h"
-
-namespace NArchive {
-namespace NZip {
-
-struct CVersion
-{
- Byte Version;
- Byte HostOS;
-};
-
-bool operator==(const CVersion &v1, const CVersion &v2);
-bool operator!=(const CVersion &v1, const CVersion &v2);
-
-struct CExtraSubBlock
-{
- UInt16 ID;
- CByteBuffer Data;
- bool ExtractNtfsTime(int index, FILETIME &ft) const;
- bool ExtractUnixTime(int index, UInt32 &res) const;
-};
-
-struct CWzAesExtraField
-{
- UInt16 VendorVersion; // 0x0001 - AE-1, 0x0002 - AE-2,
- // UInt16 VendorId; // "AE"
- Byte Strength; // 1 - 128-bit , 2 - 192-bit , 3 - 256-bit
- UInt16 Method;
-
- CWzAesExtraField(): VendorVersion(2), Strength(3), Method(0) {}
-
- bool NeedCrc() const { return (VendorVersion == 1); }
-
- bool ParseFromSubBlock(const CExtraSubBlock &sb)
- {
- if (sb.ID != NFileHeader::NExtraID::kWzAES)
- return false;
- if (sb.Data.GetCapacity() < 7)
- return false;
- const Byte *p = (const Byte *)sb.Data;
- VendorVersion = (((UInt16)p[1]) << 8) | p[0];
- if (p[2] != 'A' || p[3] != 'E')
- return false;
- Strength = p[4];
- Method = (((UInt16)p[6]) << 16) | p[5];
- return true;
- }
- void SetSubBlock(CExtraSubBlock &sb) const
- {
- sb.Data.SetCapacity(7);
- sb.ID = NFileHeader::NExtraID::kWzAES;
- Byte *p = (Byte *)sb.Data;
- p[0] = (Byte)VendorVersion;
- p[1] = (Byte)(VendorVersion >> 8);
- p[2] = 'A';
- p[3] = 'E';
- p[4] = Strength;
- p[5] = (Byte)Method;
- p[6] = (Byte)(Method >> 8);
- }
-};
-
-namespace NStrongCryptoFlags
-{
- const UInt16 kDES = 0x6601;
- const UInt16 kRC2old = 0x6602;
- const UInt16 k3DES168 = 0x6603;
- const UInt16 k3DES112 = 0x6609;
- const UInt16 kAES128 = 0x660E;
- const UInt16 kAES192 = 0x660F;
- const UInt16 kAES256 = 0x6610;
- const UInt16 kRC2 = 0x6702;
- const UInt16 kBlowfish = 0x6720;
- const UInt16 kTwofish = 0x6721;
- const UInt16 kRC4 = 0x6801;
-}
-
-struct CStrongCryptoField
-{
- UInt16 Format;
- UInt16 AlgId;
- UInt16 BitLen;
- UInt16 Flags;
-
- bool ParseFromSubBlock(const CExtraSubBlock &sb)
- {
- if (sb.ID != NFileHeader::NExtraID::kStrongEncrypt)
- return false;
- const Byte *p = (const Byte *)sb.Data;
- if (sb.Data.GetCapacity() < 8)
- return false;
- Format = (((UInt16)p[1]) << 8) | p[0];
- AlgId = (((UInt16)p[3]) << 8) | p[2];
- BitLen = (((UInt16)p[5]) << 8) | p[4];
- Flags = (((UInt16)p[7]) << 8) | p[6];
- return (Format == 2);
- }
-};
-
-struct CExtraBlock
-{
- CObjectVector<CExtraSubBlock> SubBlocks;
- void Clear() { SubBlocks.Clear(); }
- size_t GetSize() const
- {
- size_t res = 0;
- for (int i = 0; i < SubBlocks.Size(); i++)
- res += SubBlocks[i].Data.GetCapacity() + 2 + 2;
- return res;
- }
- bool GetWzAesField(CWzAesExtraField &aesField) const
- {
- for (int i = 0; i < SubBlocks.Size(); i++)
- if (aesField.ParseFromSubBlock(SubBlocks[i]))
- return true;
- return false;
- }
-
- bool GetStrongCryptoField(CStrongCryptoField &f) const
- {
- for (int i = 0; i < SubBlocks.Size(); i++)
- if (f.ParseFromSubBlock(SubBlocks[i]))
- return true;
- return false;
- }
-
- bool HasWzAesField() const
- {
- CWzAesExtraField aesField;
- return GetWzAesField(aesField);
- }
-
- bool GetNtfsTime(int index, FILETIME &ft) const
- {
- for (int i = 0; i < SubBlocks.Size(); i++)
- {
- const CExtraSubBlock &sb = SubBlocks[i];
- if (sb.ID == NFileHeader::NExtraID::kNTFS)
- return sb.ExtractNtfsTime(index, ft);
- }
- return false;
- }
-
- bool GetUnixTime(int index, UInt32 &res) const
- {
- for (int i = 0; i < SubBlocks.Size(); i++)
- {
- const CExtraSubBlock &sb = SubBlocks[i];
- if (sb.ID == NFileHeader::NExtraID::kUnixTime)
- return sb.ExtractUnixTime(index, res);
- }
- return false;
- }
-
- /*
- bool HasStrongCryptoField() const
- {
- CStrongCryptoField f;
- return GetStrongCryptoField(f);
- }
- */
-
- void RemoveUnknownSubBlocks()
- {
- for (int i = SubBlocks.Size() - 1; i >= 0; i--)
- if (SubBlocks[i].ID != NFileHeader::NExtraID::kWzAES)
- SubBlocks.Delete(i);
- }
-};
-
-
-class CLocalItem
-{
-public:
- CVersion ExtractVersion;
- UInt16 Flags;
- UInt16 CompressionMethod;
- UInt32 Time;
- UInt32 FileCRC;
- UInt64 PackSize;
- UInt64 UnPackSize;
-
- AString Name;
-
- CExtraBlock LocalExtra;
-
- bool IsUtf8() const { return (Flags & NFileHeader::NFlags::kUtf8) != 0; }
-
- bool IsEncrypted() const { return (Flags & NFileHeader::NFlags::kEncrypted) != 0; }
- bool IsStrongEncrypted() const { return IsEncrypted() && (Flags & NFileHeader::NFlags::kStrongEncrypted) != 0; };
- bool IsAesEncrypted() const { return IsEncrypted() && (IsStrongEncrypted() || CompressionMethod == NFileHeader::NCompressionMethod::kWzAES); };
-
- bool IsLzmaEOS() const { return (Flags & NFileHeader::NFlags::kLzmaEOS) != 0; }
-
- bool IsDir() const;
- bool IgnoreItem() const { return false; }
- UInt32 GetWinAttributes() const;
-
- bool HasDescriptor() const { return (Flags & NFileHeader::NFlags::kDescriptorUsedMask) != 0; }
-
- UString GetUnicodeString(const AString &s) const
- {
- UString res;
- if (IsUtf8())
- if (!ConvertUTF8ToUnicode(s, res))
- res.Empty();
- if (res.IsEmpty())
- res = MultiByteToUnicodeString(s, GetCodePage());
- return res;
- }
-
-private:
- void SetFlagBits(int startBitNumber, int numBits, int value);
- void SetBitMask(int bitMask, bool enable);
-public:
- void ClearFlags() { Flags = 0; }
- void SetEncrypted(bool encrypted);
- void SetUtf8(bool isUtf8);
-
- WORD GetCodePage() const { return CP_OEMCP; }
-};
-
-class CItem: public CLocalItem
-{
-public:
- CVersion MadeByVersion;
- UInt16 InternalAttributes;
- UInt32 ExternalAttributes;
-
- UInt64 LocalHeaderPosition;
-
- FILETIME NtfsMTime;
- FILETIME NtfsATime;
- FILETIME NtfsCTime;
-
- CExtraBlock CentralExtra;
- CByteBuffer Comment;
-
- bool FromLocal;
- bool FromCentral;
- bool NtfsTimeIsDefined;
-
- bool IsDir() const;
- UInt32 GetWinAttributes() const;
-
- bool IsThereCrc() const
- {
- if (CompressionMethod == NFileHeader::NCompressionMethod::kWzAES)
- {
- CWzAesExtraField aesField;
- if (CentralExtra.GetWzAesField(aesField))
- return aesField.NeedCrc();
- }
- return (FileCRC != 0 || !IsDir());
- }
-
- WORD GetCodePage() const
- {
- return (WORD)((MadeByVersion.HostOS == NFileHeader::NHostOS::kFAT
- || MadeByVersion.HostOS == NFileHeader::NHostOS::kNTFS
- ) ? CP_OEMCP : CP_ACP);
- }
- CItem() : FromLocal(false), FromCentral(false), NtfsTimeIsDefined(false) {}
-};
-
-}}
-
-#endif
-
-
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItemEx.h b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItemEx.h
deleted file mode 100644
index ab62cdbb4..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipItemEx.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Archive/ZipItemEx.h
-
-#ifndef __ARCHIVE_ZIP_ITEMEX_H
-#define __ARCHIVE_ZIP_ITEMEX_H
-
-#include "ZipHeader.h"
-#include "ZipItem.h"
-
-namespace NArchive {
-namespace NZip {
-
-class CItemEx: public CItem
-{
-public:
- UInt32 FileHeaderWithNameSize;
- UInt16 LocalExtraSize;
-
- UInt64 GetLocalFullSize() const
- { return FileHeaderWithNameSize + LocalExtraSize + PackSize +
- (HasDescriptor() ? NFileHeader::kDataDescriptorSize : 0); };
- /*
- UInt64 GetLocalFullSize(bool isZip64) const
- { return FileHeaderWithNameSize + LocalExtraSize + PackSize +
- (HasDescriptor() ? (isZip64 ? NFileHeader::kDataDescriptor64Size : NFileHeader::kDataDescriptorSize) : 0); };
- */
- UInt64 GetLocalExtraPosition() const
- { return LocalHeaderPosition + FileHeaderWithNameSize; };
- UInt64 GetDataPosition() const
- { return GetLocalExtraPosition() + LocalExtraSize; };
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipOut.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipOut.cpp
deleted file mode 100644
index aa82143e3..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipOut.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-// ZipOut.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/OffsetStream.h"
-
-#include "ZipOut.h"
-
-namespace NArchive {
-namespace NZip {
-
-void COutArchive::Create(IOutStream *outStream)
-{
- if (!m_OutBuffer.Create(1 << 16))
- throw CSystemException(E_OUTOFMEMORY);
- m_Stream = outStream;
- m_OutBuffer.SetStream(outStream);
- m_OutBuffer.Init();
- m_BasePosition = 0;
-}
-
-void COutArchive::MoveBasePosition(UInt64 distanceToMove)
-{
- m_BasePosition += distanceToMove; // test overflow
-}
-
-void COutArchive::PrepareWriteCompressedDataZip64(UInt16 fileNameLength, bool isZip64, bool aesEncryption)
-{
- m_IsZip64 = isZip64;
- m_ExtraSize = isZip64 ? (4 + 8 + 8) : 0;
- if (aesEncryption)
- m_ExtraSize += 4 + 7;
- m_LocalFileHeaderSize = 4 + NFileHeader::kLocalBlockSize + fileNameLength + m_ExtraSize;
-}
-
-void COutArchive::PrepareWriteCompressedData(UInt16 fileNameLength, UInt64 unPackSize, bool aesEncryption)
-{
- // We test it to 0xF8000000 to support case when compressed size
- // can be larger than uncompressed size.
- PrepareWriteCompressedDataZip64(fileNameLength, unPackSize >= 0xF8000000, aesEncryption);
-}
-
-void COutArchive::PrepareWriteCompressedData2(UInt16 fileNameLength, UInt64 unPackSize, UInt64 packSize, bool aesEncryption)
-{
- bool isUnPack64 = unPackSize >= 0xFFFFFFFF;
- bool isPack64 = packSize >= 0xFFFFFFFF;
- bool isZip64 = isPack64 || isUnPack64;
- PrepareWriteCompressedDataZip64(fileNameLength, isZip64, aesEncryption);
-}
-
-void COutArchive::WriteBytes(const void *buffer, UInt32 size)
-{
- m_OutBuffer.WriteBytes(buffer, size);
- m_BasePosition += size;
-}
-
-void COutArchive::WriteByte(Byte b)
-{
- WriteBytes(&b, 1);
-}
-
-void COutArchive::WriteUInt16(UInt16 value)
-{
- for (int i = 0; i < 2; i++)
- {
- WriteByte((Byte)value);
- value >>= 8;
- }
-}
-
-void COutArchive::WriteUInt32(UInt32 value)
-{
- for (int i = 0; i < 4; i++)
- {
- WriteByte((Byte)value);
- value >>= 8;
- }
-}
-
-void COutArchive::WriteUInt64(UInt64 value)
-{
- for (int i = 0; i < 8; i++)
- {
- WriteByte((Byte)value);
- value >>= 8;
- }
-}
-
-void COutArchive::WriteExtra(const CExtraBlock &extra)
-{
- if (extra.SubBlocks.Size() != 0)
- {
- for (int i = 0; i < extra.SubBlocks.Size(); i++)
- {
- const CExtraSubBlock &subBlock = extra.SubBlocks[i];
- WriteUInt16(subBlock.ID);
- WriteUInt16((UInt16)subBlock.Data.GetCapacity());
- WriteBytes(subBlock.Data, (UInt32)subBlock.Data.GetCapacity());
- }
- }
-}
-
-void COutArchive::SeekTo(UInt64 offset)
-{
- HRESULT res = m_Stream->Seek(offset, STREAM_SEEK_SET, NULL);
- if (res != S_OK)
- throw CSystemException(res);
-}
-
-void COutArchive::WriteLocalHeader(const CLocalItem &item)
-{
- SeekTo(m_BasePosition);
-
- bool isZip64 = m_IsZip64 || item.PackSize >= 0xFFFFFFFF || item.UnPackSize >= 0xFFFFFFFF;
-
- WriteUInt32(NSignature::kLocalFileHeader);
- {
- Byte ver = item.ExtractVersion.Version;
- if (isZip64 && ver < NFileHeader::NCompressionMethod::kExtractVersion_Zip64)
- ver = NFileHeader::NCompressionMethod::kExtractVersion_Zip64;
- WriteByte(ver);
- }
- WriteByte(item.ExtractVersion.HostOS);
- WriteUInt16(item.Flags);
- WriteUInt16(item.CompressionMethod);
- WriteUInt32(item.Time);
- WriteUInt32(item.FileCRC);
- WriteUInt32(isZip64 ? 0xFFFFFFFF: (UInt32)item.PackSize);
- WriteUInt32(isZip64 ? 0xFFFFFFFF: (UInt32)item.UnPackSize);
- WriteUInt16((UInt16)item.Name.Length());
- {
- UInt16 localExtraSize = (UInt16)((isZip64 ? (4 + 16): 0) + item.LocalExtra.GetSize());
- if (localExtraSize > m_ExtraSize)
- throw CSystemException(E_FAIL);
- }
- WriteUInt16((UInt16)m_ExtraSize); // test it;
- WriteBytes((const char *)item.Name, item.Name.Length());
-
- UInt32 extraPos = 0;
- if (isZip64)
- {
- extraPos += 4 + 16;
- WriteUInt16(NFileHeader::NExtraID::kZip64);
- WriteUInt16(16);
- WriteUInt64(item.UnPackSize);
- WriteUInt64(item.PackSize);
- }
-
- WriteExtra(item.LocalExtra);
- extraPos += (UInt32)item.LocalExtra.GetSize();
- for (; extraPos < m_ExtraSize; extraPos++)
- WriteByte(0);
-
- m_OutBuffer.FlushWithCheck();
- MoveBasePosition(item.PackSize);
- SeekTo(m_BasePosition);
-}
-
-void COutArchive::WriteCentralHeader(const CItem &item)
-{
- bool isUnPack64 = item.UnPackSize >= 0xFFFFFFFF;
- bool isPack64 = item.PackSize >= 0xFFFFFFFF;
- bool isPosition64 = item.LocalHeaderPosition >= 0xFFFFFFFF;
- bool isZip64 = isPack64 || isUnPack64 || isPosition64;
-
- WriteUInt32(NSignature::kCentralFileHeader);
- WriteByte(item.MadeByVersion.Version);
- WriteByte(item.MadeByVersion.HostOS);
- {
- Byte ver = item.ExtractVersion.Version;
- if (isZip64 && ver < NFileHeader::NCompressionMethod::kExtractVersion_Zip64)
- ver = NFileHeader::NCompressionMethod::kExtractVersion_Zip64;
- WriteByte(ver);
- }
- WriteByte(item.ExtractVersion.HostOS);
- WriteUInt16(item.Flags);
- WriteUInt16(item.CompressionMethod);
- WriteUInt32(item.Time);
- WriteUInt32(item.FileCRC);
- WriteUInt32(isPack64 ? 0xFFFFFFFF: (UInt32)item.PackSize);
- WriteUInt32(isUnPack64 ? 0xFFFFFFFF: (UInt32)item.UnPackSize);
- WriteUInt16((UInt16)item.Name.Length());
- UInt16 zip64ExtraSize = (UInt16)((isUnPack64 ? 8: 0) + (isPack64 ? 8: 0) + (isPosition64 ? 8: 0));
- const UInt16 kNtfsExtraSize = 4 + 2 + 2 + (3 * 8);
- UInt16 centralExtraSize = (UInt16)(isZip64 ? (4 + zip64ExtraSize) : 0) + (item.NtfsTimeIsDefined ? (4 + kNtfsExtraSize) : 0);
- centralExtraSize = (UInt16)(centralExtraSize + item.CentralExtra.GetSize());
- WriteUInt16(centralExtraSize); // test it;
- WriteUInt16((UInt16)item.Comment.GetCapacity());
- WriteUInt16(0); // DiskNumberStart;
- WriteUInt16(item.InternalAttributes);
- WriteUInt32(item.ExternalAttributes);
- WriteUInt32(isPosition64 ? 0xFFFFFFFF: (UInt32)item.LocalHeaderPosition);
- WriteBytes((const char *)item.Name, item.Name.Length());
- if (isZip64)
- {
- WriteUInt16(NFileHeader::NExtraID::kZip64);
- WriteUInt16(zip64ExtraSize);
- if(isUnPack64)
- WriteUInt64(item.UnPackSize);
- if(isPack64)
- WriteUInt64(item.PackSize);
- if(isPosition64)
- WriteUInt64(item.LocalHeaderPosition);
- }
- if (item.NtfsTimeIsDefined)
- {
- WriteUInt16(NFileHeader::NExtraID::kNTFS);
- WriteUInt16(kNtfsExtraSize);
- WriteUInt32(0); // reserved
- WriteUInt16(NFileHeader::NNtfsExtra::kTagTime);
- WriteUInt16(8 * 3);
- WriteUInt32(item.NtfsMTime.dwLowDateTime);
- WriteUInt32(item.NtfsMTime.dwHighDateTime);
- WriteUInt32(item.NtfsATime.dwLowDateTime);
- WriteUInt32(item.NtfsATime.dwHighDateTime);
- WriteUInt32(item.NtfsCTime.dwLowDateTime);
- WriteUInt32(item.NtfsCTime.dwHighDateTime);
- }
- WriteExtra(item.CentralExtra);
- if (item.Comment.GetCapacity() > 0)
- WriteBytes(item.Comment, (UInt32)item.Comment.GetCapacity());
-}
-
-void COutArchive::WriteCentralDir(const CObjectVector<CItem> &items, const CByteBuffer *comment)
-{
- SeekTo(m_BasePosition);
-
- UInt64 cdOffset = GetCurrentPosition();
- for(int i = 0; i < items.Size(); i++)
- WriteCentralHeader(items[i]);
- UInt64 cd64EndOffset = GetCurrentPosition();
- UInt64 cdSize = cd64EndOffset - cdOffset;
- bool cdOffset64 = cdOffset >= 0xFFFFFFFF;
- bool cdSize64 = cdSize >= 0xFFFFFFFF;
- bool items64 = items.Size() >= 0xFFFF;
- bool isZip64 = (cdOffset64 || cdSize64 || items64);
-
- if (isZip64)
- {
- WriteUInt32(NSignature::kZip64EndOfCentralDir);
- WriteUInt64(kZip64EcdSize); // ThisDiskNumber = 0;
- WriteUInt16(45); // version
- WriteUInt16(45); // version
- WriteUInt32(0); // ThisDiskNumber = 0;
- WriteUInt32(0); // StartCentralDirectoryDiskNumber;;
- WriteUInt64((UInt64)items.Size());
- WriteUInt64((UInt64)items.Size());
- WriteUInt64((UInt64)cdSize);
- WriteUInt64((UInt64)cdOffset);
-
- WriteUInt32(NSignature::kZip64EndOfCentralDirLocator);
- WriteUInt32(0); // number of the disk with the start of the zip64 end of central directory
- WriteUInt64(cd64EndOffset);
- WriteUInt32(1); // total number of disks
- }
- WriteUInt32(NSignature::kEndOfCentralDir);
- WriteUInt16(0); // ThisDiskNumber = 0;
- WriteUInt16(0); // StartCentralDirectoryDiskNumber;
- WriteUInt16((UInt16)(items64 ? 0xFFFF: items.Size()));
- WriteUInt16((UInt16)(items64 ? 0xFFFF: items.Size()));
- WriteUInt32(cdSize64 ? 0xFFFFFFFF: (UInt32)cdSize);
- WriteUInt32(cdOffset64 ? 0xFFFFFFFF: (UInt32)cdOffset);
- UInt32 commentSize = (UInt32)(comment ? comment->GetCapacity() : 0);
- WriteUInt16((UInt16)commentSize);
- if (commentSize > 0)
- WriteBytes((const Byte *)*comment, commentSize);
- m_OutBuffer.FlushWithCheck();
-}
-
-void COutArchive::CreateStreamForCompressing(IOutStream **outStream)
-{
- COffsetOutStream *streamSpec = new COffsetOutStream;
- CMyComPtr<IOutStream> tempStream(streamSpec);
- streamSpec->Init(m_Stream, m_BasePosition + m_LocalFileHeaderSize);
- *outStream = tempStream.Detach();
-}
-
-void COutArchive::SeekToPackedDataPosition()
-{
- SeekTo(m_BasePosition + m_LocalFileHeaderSize);
-}
-
-void COutArchive::CreateStreamForCopying(ISequentialOutStream **outStream)
-{
- CMyComPtr<ISequentialOutStream> tempStream(m_Stream);
- *outStream = tempStream.Detach();
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipOut.h b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipOut.h
deleted file mode 100644
index 2f6349e5c..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipOut.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// ZipOut.h
-
-#ifndef __ZIP_OUT_H
-#define __ZIP_OUT_H
-
-#include "Common/MyCom.h"
-
-#include "../../IStream.h"
-#include "../../Common/OutBuffer.h"
-
-#include "ZipItem.h"
-
-namespace NArchive {
-namespace NZip {
-
-// can throw CSystemException and COutBufferException
-
-class COutArchive
-{
- CMyComPtr<IOutStream> m_Stream;
- COutBuffer m_OutBuffer;
-
- UInt64 m_BasePosition;
- UInt32 m_LocalFileHeaderSize;
- UInt32 m_ExtraSize;
- bool m_IsZip64;
-
- void WriteBytes(const void *buffer, UInt32 size);
- void WriteByte(Byte b);
- void WriteUInt16(UInt16 value);
- void WriteUInt32(UInt32 value);
- void WriteUInt64(UInt64 value);
-
- void WriteExtraHeader(const CItem &item);
- void WriteCentralHeader(const CItem &item);
- void WriteExtra(const CExtraBlock &extra);
- void SeekTo(UInt64 offset);
-public:
- void Create(IOutStream *outStream);
- void MoveBasePosition(UInt64 distanceToMove);
- UInt64 GetCurrentPosition() const { return m_BasePosition; };
- void PrepareWriteCompressedDataZip64(UInt16 fileNameLength, bool isZip64, bool aesEncryption);
- void PrepareWriteCompressedData(UInt16 fileNameLength, UInt64 unPackSize, bool aesEncryption);
- void PrepareWriteCompressedData2(UInt16 fileNameLength, UInt64 unPackSize, UInt64 packSize, bool aesEncryption);
- void WriteLocalHeader(const CLocalItem &item);
-
- void WriteCentralDir(const CObjectVector<CItem> &items, const CByteBuffer *comment);
-
- void CreateStreamForCompressing(IOutStream **outStream);
- void CreateStreamForCopying(ISequentialOutStream **outStream);
- void SeekToPackedDataPosition();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipRegister.cpp
deleted file mode 100644
index 3e7aade85..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipRegister.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// ZipRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "ZipHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NZip::CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new NArchive::NZip::CHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
- { L"zip", L"zip jar xpi odt ods docx xlsx", 0, 1, { 0x50, 0x4B, 0x03, 0x04 }, 4, false, CreateArc, CreateArcOut };
-
-REGISTER_ARC(Zip)
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipUpdate.cpp b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipUpdate.cpp
deleted file mode 100644
index bd0c8221d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipUpdate.cpp
+++ /dev/null
@@ -1,1076 +0,0 @@
-// ZipUpdate.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/Alloc.h"
-
-#include "Common/AutoPtr.h"
-#include "Common/Defs.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/Defs.h"
-#include "Windows/Thread.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/OutMemStream.h"
-#include "../../Common/ProgressUtils.h"
-#ifndef _7ZIP_ST
-#include "../../Common/ProgressMt.h"
-#endif
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "ZipAddCommon.h"
-#include "ZipOut.h"
-#include "ZipUpdate.h"
-
-using namespace NWindows;
-using namespace NSynchronization;
-
-namespace NArchive {
-namespace NZip {
-
-static const Byte kHostOS =
- #ifdef _WIN32
- NFileHeader::NHostOS::kFAT;
- #else
- NFileHeader::NHostOS::kUnix;
- #endif
-
-static const Byte kMadeByHostOS = kHostOS;
-static const Byte kExtractHostOS = kHostOS;
-
-static const Byte kMethodForDirectory = NFileHeader::NCompressionMethod::kStored;
-
-static HRESULT CopyBlockToArchive(ISequentialInStream *inStream,
- COutArchive &outArchive, ICompressProgressInfo *progress)
-{
- CMyComPtr<ISequentialOutStream> outStream;
- outArchive.CreateStreamForCopying(&outStream);
- return NCompress::CopyStream(inStream, outStream, progress);
-}
-
-static HRESULT WriteRange(IInStream *inStream, COutArchive &outArchive,
- const CUpdateRange &range, ICompressProgressInfo *progress)
-{
- UInt64 position;
- RINOK(inStream->Seek(range.Position, STREAM_SEEK_SET, &position));
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<CLimitedSequentialInStream> inStreamLimited(streamSpec);
- streamSpec->SetStream(inStream);
- streamSpec->Init(range.Size);
-
- RINOK(CopyBlockToArchive(inStreamLimited, outArchive, progress));
- return progress->SetRatioInfo(&range.Size, &range.Size);
-}
-
-static void SetFileHeader(
- COutArchive &archive,
- const CCompressionMethodMode &options,
- const CUpdateItem &ui,
- CItem &item)
-{
- item.UnPackSize = ui.Size;
- bool isDir;
-
- item.ClearFlags();
-
- if (ui.NewProperties)
- {
- isDir = ui.IsDir;
- item.Name = ui.Name;
- item.SetUtf8(ui.IsUtf8);
- item.ExternalAttributes = ui.Attributes;
- item.Time = ui.Time;
- item.NtfsMTime = ui.NtfsMTime;
- item.NtfsATime = ui.NtfsATime;
- item.NtfsCTime = ui.NtfsCTime;
- item.NtfsTimeIsDefined = ui.NtfsTimeIsDefined;
- }
- else
- isDir = item.IsDir();
-
- item.LocalHeaderPosition = archive.GetCurrentPosition();
- item.MadeByVersion.HostOS = kMadeByHostOS;
- item.MadeByVersion.Version = NFileHeader::NCompressionMethod::kMadeByProgramVersion;
-
- item.ExtractVersion.HostOS = kExtractHostOS;
-
- item.InternalAttributes = 0; // test it
- item.SetEncrypted(!isDir && options.PasswordIsDefined);
- if (isDir)
- {
- item.ExtractVersion.Version = NFileHeader::NCompressionMethod::kExtractVersion_Dir;
- item.CompressionMethod = kMethodForDirectory;
- item.PackSize = 0;
- item.FileCRC = 0; // test it
- }
-}
-
-static void SetItemInfoFromCompressingResult(const CCompressingResult &compressingResult,
- bool isAesMode, Byte aesKeyMode, CItem &item)
-{
- item.ExtractVersion.Version = compressingResult.ExtractVersion;
- item.CompressionMethod = compressingResult.Method;
- item.FileCRC = compressingResult.CRC;
- item.UnPackSize = compressingResult.UnpackSize;
- item.PackSize = compressingResult.PackSize;
-
- item.LocalExtra.Clear();
- item.CentralExtra.Clear();
-
- if (isAesMode)
- {
- CWzAesExtraField wzAesField;
- wzAesField.Strength = aesKeyMode;
- wzAesField.Method = compressingResult.Method;
- item.CompressionMethod = NFileHeader::NCompressionMethod::kWzAES;
- item.FileCRC = 0;
- CExtraSubBlock sb;
- wzAesField.SetSubBlock(sb);
- item.LocalExtra.SubBlocks.Add(sb);
- item.CentralExtra.SubBlocks.Add(sb);
- }
-}
-
-#ifndef _7ZIP_ST
-
-static THREAD_FUNC_DECL CoderThread(void *threadCoderInfo);
-
-struct CThreadInfo
-{
- #ifdef EXTERNAL_CODECS
- CMyComPtr<ICompressCodecsInfo> _codecsInfo;
- const CObjectVector<CCodecInfoEx> *_externalCodecs;
- #endif
-
- NWindows::CThread Thread;
- NWindows::NSynchronization::CAutoResetEvent CompressEvent;
- NWindows::NSynchronization::CAutoResetEventWFMO CompressionCompletedEvent;
- bool ExitThread;
-
- CMtCompressProgress *ProgressSpec;
- CMyComPtr<ICompressProgressInfo> Progress;
-
- COutMemStream *OutStreamSpec;
- CMyComPtr<IOutStream> OutStream;
- CMyComPtr<ISequentialInStream> InStream;
-
- CAddCommon Coder;
- HRESULT Result;
- CCompressingResult CompressingResult;
-
- bool IsFree;
- UInt32 UpdateIndex;
-
- CThreadInfo(const CCompressionMethodMode &options):
- ExitThread(false),
- ProgressSpec(0),
- OutStreamSpec(0),
- Coder(options)
- {}
-
- HRESULT CreateEvents(CSynchro *sync)
- {
- RINOK(CompressEvent.CreateIfNotCreated());
- return CompressionCompletedEvent.CreateIfNotCreated(sync);
- }
- HRes CreateThread() { return Thread.Create(CoderThread, this); }
-
- void WaitAndCode();
- void StopWaitClose()
- {
- ExitThread = true;
- if (OutStreamSpec != 0)
- OutStreamSpec->StopWriting(E_ABORT);
- if (CompressEvent.IsCreated())
- CompressEvent.Set();
- Thread.Wait();
- Thread.Close();
- }
-
-};
-
-void CThreadInfo::WaitAndCode()
-{
- for (;;)
- {
- CompressEvent.Lock();
- if (ExitThread)
- return;
- Result = Coder.Compress(
- #ifdef EXTERNAL_CODECS
- _codecsInfo, _externalCodecs,
- #endif
- InStream, OutStream, Progress, CompressingResult);
- if (Result == S_OK && Progress)
- Result = Progress->SetRatioInfo(&CompressingResult.UnpackSize, &CompressingResult.PackSize);
- CompressionCompletedEvent.Set();
- }
-}
-
-static THREAD_FUNC_DECL CoderThread(void *threadCoderInfo)
-{
- ((CThreadInfo *)threadCoderInfo)->WaitAndCode();
- return 0;
-}
-
-class CThreads
-{
-public:
- CObjectVector<CThreadInfo> Threads;
- ~CThreads()
- {
- for (int i = 0; i < Threads.Size(); i++)
- Threads[i].StopWaitClose();
- }
-};
-
-struct CMemBlocks2: public CMemLockBlocks
-{
- CCompressingResult CompressingResult;
- bool Defined;
- bool Skip;
- CMemBlocks2(): Defined(false), Skip(false) {}
-};
-
-class CMemRefs
-{
-public:
- CMemBlockManagerMt *Manager;
- CObjectVector<CMemBlocks2> Refs;
- CMemRefs(CMemBlockManagerMt *manager): Manager(manager) {} ;
- ~CMemRefs()
- {
- for (int i = 0; i < Refs.Size(); i++)
- Refs[i].FreeOpt(Manager);
- }
-};
-
-class CMtProgressMixer2:
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
- UInt64 ProgressOffset;
- UInt64 InSizes[2];
- UInt64 OutSizes[2];
- CMyComPtr<IProgress> Progress;
- CMyComPtr<ICompressProgressInfo> RatioProgress;
- bool _inSizeIsMain;
-public:
- NWindows::NSynchronization::CCriticalSection CriticalSection;
- MY_UNKNOWN_IMP
- void Create(IProgress *progress, bool inSizeIsMain);
- void SetProgressOffset(UInt64 progressOffset);
- HRESULT SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize);
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
-};
-
-void CMtProgressMixer2::Create(IProgress *progress, bool inSizeIsMain)
-{
- Progress = progress;
- Progress.QueryInterface(IID_ICompressProgressInfo, &RatioProgress);
- _inSizeIsMain = inSizeIsMain;
- ProgressOffset = InSizes[0] = InSizes[1] = OutSizes[0] = OutSizes[1] = 0;
-}
-
-void CMtProgressMixer2::SetProgressOffset(UInt64 progressOffset)
-{
- CriticalSection.Enter();
- InSizes[1] = OutSizes[1] = 0;
- ProgressOffset = progressOffset;
- CriticalSection.Leave();
-}
-
-HRESULT CMtProgressMixer2::SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize)
-{
- NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);
- if (index == 0 && RatioProgress)
- {
- RINOK(RatioProgress->SetRatioInfo(inSize, outSize));
- }
- if (inSize != 0)
- InSizes[index] = *inSize;
- if (outSize != 0)
- OutSizes[index] = *outSize;
- UInt64 v = ProgressOffset + (_inSizeIsMain ?
- (InSizes[0] + InSizes[1]) :
- (OutSizes[0] + OutSizes[1]));
- return Progress->SetCompleted(&v);
-}
-
-STDMETHODIMP CMtProgressMixer2::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
-{
- return SetRatioInfo(0, inSize, outSize);
-}
-
-class CMtProgressMixer:
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
-public:
- CMtProgressMixer2 *Mixer2;
- CMyComPtr<ICompressProgressInfo> RatioProgress;
- void Create(IProgress *progress, bool inSizeIsMain);
- MY_UNKNOWN_IMP
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
-};
-
-void CMtProgressMixer::Create(IProgress *progress, bool inSizeIsMain)
-{
- Mixer2 = new CMtProgressMixer2;
- RatioProgress = Mixer2;
- Mixer2->Create(progress, inSizeIsMain);
-}
-
-STDMETHODIMP CMtProgressMixer::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
-{
- return Mixer2->SetRatioInfo(1, inSize, outSize);
-}
-
-
-#endif
-
-
-static HRESULT UpdateItemOldData(COutArchive &archive,
- IInStream *inStream,
- const CUpdateItem &ui, CItemEx &item,
- /* bool izZip64, */
- ICompressProgressInfo *progress,
- UInt64 &complexity)
-{
- if (ui.NewProperties)
- {
- if (item.HasDescriptor())
- return E_NOTIMPL;
-
- // use old name size.
- // CUpdateRange range(item.GetLocalExtraPosition(), item.LocalExtraSize + item.PackSize);
- CUpdateRange range(item.GetDataPosition(), item.PackSize);
-
- // item.ExternalAttributes = ui.Attributes;
- // Test it
- item.Name = ui.Name;
- item.SetUtf8(ui.IsUtf8);
- item.Time = ui.Time;
- item.NtfsMTime = ui.NtfsMTime;
- item.NtfsATime = ui.NtfsATime;
- item.NtfsCTime = ui.NtfsCTime;
- item.NtfsTimeIsDefined = ui.NtfsTimeIsDefined;
-
- item.CentralExtra.RemoveUnknownSubBlocks();
- item.LocalExtra.RemoveUnknownSubBlocks();
-
- archive.PrepareWriteCompressedData2((UInt16)item.Name.Length(), item.UnPackSize, item.PackSize, item.LocalExtra.HasWzAesField());
- item.LocalHeaderPosition = archive.GetCurrentPosition();
- archive.SeekToPackedDataPosition();
- RINOK(WriteRange(inStream, archive, range, progress));
- complexity += range.Size;
- archive.WriteLocalHeader(item);
- }
- else
- {
- CUpdateRange range(item.LocalHeaderPosition, item.GetLocalFullSize());
-
- // set new header position
- item.LocalHeaderPosition = archive.GetCurrentPosition();
-
- RINOK(WriteRange(inStream, archive, range, progress));
- complexity += range.Size;
- archive.MoveBasePosition(range.Size);
- }
- return S_OK;
-}
-
-static void WriteDirHeader(COutArchive &archive, const CCompressionMethodMode *options,
- const CUpdateItem &ui, CItemEx &item)
-{
- SetFileHeader(archive, *options, ui, item);
- archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);
- archive.WriteLocalHeader(item);
-}
-
-static HRESULT Update2St(
- DECL_EXTERNAL_CODECS_LOC_VARS
- COutArchive &archive,
- CInArchive *inArchive,
- IInStream *inStream,
- const CObjectVector<CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- const CCompressionMethodMode *options,
- const CByteBuffer *comment,
- IArchiveUpdateCallback *updateCallback)
-{
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(updateCallback, true);
-
- CAddCommon compressor(*options);
-
- CObjectVector<CItem> items;
- UInt64 unpackSizeTotal = 0, packSizeTotal = 0;
-
- for (int itemIndex = 0; itemIndex < updateItems.Size(); itemIndex++)
- {
- lps->InSize = unpackSizeTotal;
- lps->OutSize = packSizeTotal;
- RINOK(lps->SetCur());
- const CUpdateItem &ui = updateItems[itemIndex];
- CItemEx item;
- if (!ui.NewProperties || !ui.NewData)
- {
- item = inputItems[ui.IndexInArchive];
- if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)
- return E_NOTIMPL;
- }
-
- if (ui.NewData)
- {
- bool isDir = ((ui.NewProperties) ? ui.IsDir : item.IsDir());
- if (isDir)
- {
- WriteDirHeader(archive, options, ui, item);
- }
- else
- {
- CMyComPtr<ISequentialInStream> fileInStream;
- HRESULT res = updateCallback->GetStream(ui.IndexInClient, &fileInStream);
- if (res == S_FALSE)
- {
- lps->ProgressOffset += ui.Size;
- RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- continue;
- }
- RINOK(res);
-
- // file Size can be 64-bit !!!
- SetFileHeader(archive, *options, ui, item);
- archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);
- CCompressingResult compressingResult;
- CMyComPtr<IOutStream> outStream;
- archive.CreateStreamForCompressing(&outStream);
- RINOK(compressor.Compress(
- EXTERNAL_CODECS_LOC_VARS
- fileInStream, outStream, progress, compressingResult));
- SetItemInfoFromCompressingResult(compressingResult, options->IsAesMode, options->AesKeyMode, item);
- archive.WriteLocalHeader(item);
- RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- unpackSizeTotal += item.UnPackSize;
- packSizeTotal += item.PackSize;
- }
- }
- else
- {
- UInt64 complexity = 0;
- lps->SendRatio = false;
- RINOK(UpdateItemOldData(archive, inStream, ui, item, progress, complexity));
- lps->SendRatio = true;
- lps->ProgressOffset += complexity;
- }
- items.Add(item);
- lps->ProgressOffset += NFileHeader::kLocalBlockSize;
- }
- archive.WriteCentralDir(items, comment);
- return S_OK;
-}
-
-static HRESULT Update2(
- DECL_EXTERNAL_CODECS_LOC_VARS
- COutArchive &archive,
- CInArchive *inArchive,
- IInStream *inStream,
- const CObjectVector<CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- const CCompressionMethodMode *options,
- const CByteBuffer *comment,
- IArchiveUpdateCallback *updateCallback)
-{
- UInt64 complexity = 0;
- UInt64 numFilesToCompress = 0;
- UInt64 numBytesToCompress = 0;
-
- int i;
- for(i = 0; i < updateItems.Size(); i++)
- {
- const CUpdateItem &ui = updateItems[i];
- if (ui.NewData)
- {
- complexity += ui.Size;
- numBytesToCompress += ui.Size;
- numFilesToCompress++;
- /*
- if (ui.Commented)
- complexity += ui.CommentRange.Size;
- */
- }
- else
- {
- CItemEx inputItem = inputItems[ui.IndexInArchive];
- if (inArchive->ReadLocalItemAfterCdItemFull(inputItem) != S_OK)
- return E_NOTIMPL;
- complexity += inputItem.GetLocalFullSize();
- // complexity += inputItem.GetCentralExtraPlusCommentSize();
- }
- complexity += NFileHeader::kLocalBlockSize;
- complexity += NFileHeader::kCentralBlockSize;
- }
-
- if (comment)
- complexity += comment->GetCapacity();
- complexity++; // end of central
- updateCallback->SetTotal(complexity);
-
- CAddCommon compressor(*options);
-
- complexity = 0;
-
- #ifndef _7ZIP_ST
-
- const size_t kNumMaxThreads = (1 << 10);
- UInt32 numThreads = options->NumThreads;
- if (numThreads > kNumMaxThreads)
- numThreads = kNumMaxThreads;
-
- const size_t kMemPerThread = (1 << 25);
- const size_t kBlockSize = 1 << 16;
-
- CCompressionMethodMode options2;
- if (options != 0)
- options2 = *options;
-
- bool mtMode = ((options != 0) && (numThreads > 1));
-
- if (numFilesToCompress <= 1)
- mtMode = false;
-
- if (mtMode)
- {
- Byte method = options->MethodSequence.Front();
- if (method == NFileHeader::NCompressionMethod::kStored && !options->PasswordIsDefined)
- mtMode = false;
- if (method == NFileHeader::NCompressionMethod::kBZip2)
- {
- UInt64 averageSize = numBytesToCompress / numFilesToCompress;
- UInt32 blockSize = options->DicSize;
- if (blockSize == 0)
- blockSize = 1;
- UInt64 averageNumberOfBlocks = averageSize / blockSize;
- UInt32 numBZip2Threads = 32;
- if (averageNumberOfBlocks < numBZip2Threads)
- numBZip2Threads = (UInt32)averageNumberOfBlocks;
- if (numBZip2Threads < 1)
- numBZip2Threads = 1;
- numThreads = numThreads / numBZip2Threads;
- options2.NumThreads = numBZip2Threads;
- if (numThreads <= 1)
- mtMode = false;
- }
- if (method == NFileHeader::NCompressionMethod::kLZMA)
- {
- UInt32 numLZMAThreads = (options->Algo > 0 ? 2 : 1);
- numThreads /= numLZMAThreads;
- options2.NumThreads = numLZMAThreads;
- if (numThreads <= 1)
- mtMode = false;
- }
- }
-
- if (!mtMode)
- #endif
- return Update2St(
- EXTERNAL_CODECS_LOC_VARS
- archive, inArchive,inStream,
- inputItems, updateItems, options, comment, updateCallback);
-
-
- #ifndef _7ZIP_ST
-
- // Warning : before memManager, threads and compressingCompletedEvents
- // in order to have a "good" order for the destructor
- NWindows::NSynchronization::CSynchro synchroForCompressingCompletedEvents;
- synchroForCompressingCompletedEvents.Create();
- NWindows::NSynchronization::CSynchro synchroForOutStreamSpec;
- synchroForOutStreamSpec.Create();
-
-
- CObjectVector<CItem> items;
-
- CMtProgressMixer *mtProgressMixerSpec = new CMtProgressMixer;
- CMyComPtr<ICompressProgressInfo> progress = mtProgressMixerSpec;
- mtProgressMixerSpec->Create(updateCallback, true);
-
- CMtCompressProgressMixer mtCompressProgressMixer;
- mtCompressProgressMixer.Init(numThreads, mtProgressMixerSpec->RatioProgress);
-
- CMemBlockManagerMt memManager(kBlockSize);
- CMemRefs refs(&memManager);
-
- CThreads threads;
- CRecordVector<HANDLE> compressingCompletedEvents;
- CRecordVector<int> threadIndices; // list threads in order of updateItems
-
- {
- RINOK(memManager.AllocateSpaceAlways(&synchroForOutStreamSpec,(size_t)numThreads * (kMemPerThread / kBlockSize)));
- for(i = 0; i < updateItems.Size(); i++)
- refs.Refs.Add(CMemBlocks2());
-
- UInt32 i;
- for (i = 0; i < numThreads; i++)
- threads.Threads.Add(CThreadInfo(options2));
-
- for (i = 0; i < numThreads; i++)
- {
- CThreadInfo &threadInfo = threads.Threads[i];
- #ifdef EXTERNAL_CODECS
- threadInfo._codecsInfo = codecsInfo;
- threadInfo._externalCodecs = externalCodecs;
- #endif
- RINOK(threadInfo.CreateEvents(&synchroForCompressingCompletedEvents));
- threadInfo.OutStreamSpec = new COutMemStream(&memManager);
- RINOK(threadInfo.OutStreamSpec->CreateEvents(&synchroForOutStreamSpec));
- threadInfo.OutStream = threadInfo.OutStreamSpec;
- threadInfo.IsFree = true;
- threadInfo.ProgressSpec = new CMtCompressProgress();
- threadInfo.Progress = threadInfo.ProgressSpec;
- threadInfo.ProgressSpec->Init(&mtCompressProgressMixer, (int)i);
- RINOK(threadInfo.CreateThread());
- }
- }
- int mtItemIndex = 0;
-
- int itemIndex = 0;
- int lastRealStreamItemIndex = -1;
-
- while (itemIndex < updateItems.Size())
- {
- if ((UInt32)threadIndices.Size() < numThreads && mtItemIndex < updateItems.Size())
- {
- const CUpdateItem &ui = updateItems[mtItemIndex++];
- if (!ui.NewData)
- continue;
- CItemEx item;
- if (ui.NewProperties)
- {
- if (ui.IsDir)
- continue;
- }
- else
- {
- item = inputItems[ui.IndexInArchive];
- if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)
- return E_NOTIMPL;
- if (item.IsDir())
- continue;
- }
- CMyComPtr<ISequentialInStream> fileInStream;
- {
- NWindows::NSynchronization::CCriticalSectionLock lock(mtProgressMixerSpec->Mixer2->CriticalSection);
- HRESULT res = updateCallback->GetStream(ui.IndexInClient, &fileInStream);
- if (res == S_FALSE)
- {
- complexity += ui.Size;
- complexity += NFileHeader::kLocalBlockSize;
- mtProgressMixerSpec->Mixer2->SetProgressOffset(complexity);
- RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- refs.Refs[mtItemIndex - 1].Skip = true;
- continue;
- }
- RINOK(res);
- RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- }
-
- for (UInt32 i = 0; i < numThreads; i++)
- {
- CThreadInfo &threadInfo = threads.Threads[i];
- if (threadInfo.IsFree)
- {
- threadInfo.IsFree = false;
- threadInfo.InStream = fileInStream;
-
- // !!!!! we must release ref before sending event
- // BUG was here in v4.43 and v4.44. It could change ref counter in two threads in same time
- fileInStream.Release();
-
- threadInfo.OutStreamSpec->Init();
- threadInfo.ProgressSpec->Reinit();
- threadInfo.CompressEvent.Set();
- threadInfo.UpdateIndex = mtItemIndex - 1;
-
- compressingCompletedEvents.Add(threadInfo.CompressionCompletedEvent);
- threadIndices.Add(i);
- break;
- }
- }
- continue;
- }
-
- if (refs.Refs[itemIndex].Skip)
- {
- itemIndex++;
- continue;
- }
-
- const CUpdateItem &ui = updateItems[itemIndex];
-
- CItemEx item;
- if (!ui.NewProperties || !ui.NewData)
- {
- item = inputItems[ui.IndexInArchive];
- if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)
- return E_NOTIMPL;
- }
-
- if (ui.NewData)
- {
- bool isDir = ((ui.NewProperties) ? ui.IsDir : item.IsDir());
- if (isDir)
- {
- WriteDirHeader(archive, options, ui, item);
- }
- else
- {
- if (lastRealStreamItemIndex < itemIndex)
- {
- lastRealStreamItemIndex = itemIndex;
- SetFileHeader(archive, *options, ui, item);
- // file Size can be 64-bit !!!
- archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);
- }
-
- CMemBlocks2 &memRef = refs.Refs[itemIndex];
- if (memRef.Defined)
- {
- CMyComPtr<IOutStream> outStream;
- archive.CreateStreamForCompressing(&outStream);
- memRef.WriteToStream(memManager.GetBlockSize(), outStream);
- SetItemInfoFromCompressingResult(memRef.CompressingResult,
- options->IsAesMode, options->AesKeyMode, item);
- SetFileHeader(archive, *options, ui, item);
- archive.WriteLocalHeader(item);
- // RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- memRef.FreeOpt(&memManager);
- }
- else
- {
- {
- CThreadInfo &thread = threads.Threads[threadIndices.Front()];
- if (!thread.OutStreamSpec->WasUnlockEventSent())
- {
- CMyComPtr<IOutStream> outStream;
- archive.CreateStreamForCompressing(&outStream);
- thread.OutStreamSpec->SetOutStream(outStream);
- thread.OutStreamSpec->SetRealStreamMode();
- }
- }
-
- DWORD result = ::WaitForMultipleObjects(compressingCompletedEvents.Size(),
- &compressingCompletedEvents.Front(), FALSE, INFINITE);
- int t = (int)(result - WAIT_OBJECT_0);
- CThreadInfo &threadInfo = threads.Threads[threadIndices[t]];
- threadInfo.InStream.Release();
- threadInfo.IsFree = true;
- RINOK(threadInfo.Result);
- threadIndices.Delete(t);
- compressingCompletedEvents.Delete(t);
- if (t == 0)
- {
- RINOK(threadInfo.OutStreamSpec->WriteToRealStream());
- threadInfo.OutStreamSpec->ReleaseOutStream();
- SetItemInfoFromCompressingResult(threadInfo.CompressingResult,
- options->IsAesMode, options->AesKeyMode, item);
- SetFileHeader(archive, *options, ui, item);
- archive.WriteLocalHeader(item);
- }
- else
- {
- CMemBlocks2 &memRef = refs.Refs[threadInfo.UpdateIndex];
- threadInfo.OutStreamSpec->DetachData(memRef);
- memRef.CompressingResult = threadInfo.CompressingResult;
- memRef.Defined = true;
- continue;
- }
- }
- }
- }
- else
- {
- RINOK(UpdateItemOldData(archive, inStream, ui, item, progress, complexity));
- }
- items.Add(item);
- complexity += NFileHeader::kLocalBlockSize;
- mtProgressMixerSpec->Mixer2->SetProgressOffset(complexity);
- itemIndex++;
- }
- archive.WriteCentralDir(items, comment);
- return S_OK;
- #endif
-}
-
-static const size_t kCacheBlockSize = (1 << 20);
-static const size_t kCacheSize = (kCacheBlockSize << 2);
-static const size_t kCacheMask = (kCacheSize - 1);
-
-class CCacheOutStream:
- public IOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<IOutStream> _stream;
- Byte *_cache;
- UInt64 _virtPos;
- UInt64 _virtSize;
- UInt64 _phyPos;
- UInt64 _phySize; // <= _virtSize
- UInt64 _cachedPos; // (_cachedPos + _cachedSize) <= _virtSize
- size_t _cachedSize;
-
- HRESULT MyWrite(size_t size);
- HRESULT MyWriteBlock()
- {
- return MyWrite(kCacheBlockSize - ((size_t)_cachedPos & (kCacheBlockSize - 1)));
- }
- HRESULT FlushCache();
-public:
- CCacheOutStream(): _cache(0) {}
- ~CCacheOutStream();
- bool Allocate();
- HRESULT Init(IOutStream *stream);
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
- STDMETHOD(SetSize)(UInt64 newSize);
-};
-
-bool CCacheOutStream::Allocate()
-{
- if (!_cache)
- _cache = (Byte *)::MidAlloc(kCacheSize);
- return (_cache != NULL);
-}
-
-HRESULT CCacheOutStream::Init(IOutStream *stream)
-{
- _virtPos = _phyPos = 0;
- _stream = stream;
- RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &_virtPos));
- RINOK(_stream->Seek(0, STREAM_SEEK_END, &_virtSize));
- RINOK(_stream->Seek(_virtPos, STREAM_SEEK_SET, &_virtPos));
- _phyPos = _virtPos;
- _phySize = _virtSize;
- _cachedPos = 0;
- _cachedSize = 0;
- return S_OK;
-}
-
-HRESULT CCacheOutStream::MyWrite(size_t size)
-{
- while (size != 0 && _cachedSize != 0)
- {
- if (_phyPos != _cachedPos)
- {
- RINOK(_stream->Seek(_cachedPos, STREAM_SEEK_SET, &_phyPos));
- }
- size_t pos = (size_t)_cachedPos & kCacheMask;
- size_t curSize = MyMin(kCacheSize - pos, _cachedSize);
- curSize = MyMin(curSize, size);
- RINOK(WriteStream(_stream, _cache + pos, curSize));
- _phyPos += curSize;
- if (_phySize < _phyPos)
- _phySize = _phyPos;
- _cachedPos += curSize;
- _cachedSize -= curSize;
- size -= curSize;
- }
- return S_OK;
-}
-
-HRESULT CCacheOutStream::FlushCache()
-{
- return MyWrite(_cachedSize);
-}
-
-CCacheOutStream::~CCacheOutStream()
-{
- FlushCache();
- if (_virtSize != _phySize)
- _stream->SetSize(_virtSize);
- if (_virtPos != _phyPos)
- _stream->Seek(_virtPos, STREAM_SEEK_SET, NULL);
- ::MidFree(_cache);
-}
-
-STDMETHODIMP CCacheOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (size == 0)
- return S_OK;
-
- UInt64 zerosStart = _virtPos;
- if (_cachedSize != 0)
- {
- if (_virtPos < _cachedPos)
- {
- RINOK(FlushCache());
- }
- else
- {
- UInt64 cachedEnd = _cachedPos + _cachedSize;
- if (cachedEnd < _virtPos)
- {
- if (cachedEnd < _phySize)
- {
- RINOK(FlushCache());
- }
- else
- zerosStart = cachedEnd;
- }
- }
- }
-
- if (_cachedSize == 0 && _phySize < _virtPos)
- _cachedPos = zerosStart = _phySize;
-
- if (zerosStart != _virtPos)
- {
- // write zeros to [cachedEnd ... _virtPos)
-
- for (;;)
- {
- UInt64 cachedEnd = _cachedPos + _cachedSize;
- size_t endPos = (size_t)cachedEnd & kCacheMask;
- size_t curSize = kCacheSize - endPos;
- if (curSize > _virtPos - cachedEnd)
- curSize = (size_t)(_virtPos - cachedEnd);
- if (curSize == 0)
- break;
- while (curSize > (kCacheSize - _cachedSize))
- {
- RINOK(MyWriteBlock());
- }
- memset(_cache + endPos, 0, curSize);
- _cachedSize += curSize;
- }
- }
-
- if (_cachedSize == 0)
- _cachedPos = _virtPos;
-
- size_t pos = (size_t)_virtPos & kCacheMask;
- size = (UInt32)MyMin((size_t)size, kCacheSize - pos);
- UInt64 cachedEnd = _cachedPos + _cachedSize;
- if (_virtPos != cachedEnd) // _virtPos < cachedEnd
- size = (UInt32)MyMin((size_t)size, (size_t)(cachedEnd - _virtPos));
- else
- {
- // _virtPos == cachedEnd
- if (_cachedSize == kCacheSize)
- {
- RINOK(MyWriteBlock());
- }
- size_t startPos = (size_t)_cachedPos & kCacheMask;
- if (startPos > pos)
- size = (UInt32)MyMin((size_t)size, (size_t)(startPos - pos));
- _cachedSize += size;
- }
- memcpy(_cache + pos, data, size);
- if (processedSize)
- *processedSize = size;
- _virtPos += size;
- if (_virtSize < _virtPos)
- _virtSize = _virtPos;
- return S_OK;
-}
-
-STDMETHODIMP CCacheOutStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch(seekOrigin)
- {
- case STREAM_SEEK_SET: _virtPos = offset; break;
- case STREAM_SEEK_CUR: _virtPos += offset; break;
- case STREAM_SEEK_END: _virtPos = _virtSize + offset; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
-}
-
-STDMETHODIMP CCacheOutStream::SetSize(UInt64 newSize)
-{
- _virtSize = newSize;
- if (newSize < _phySize)
- {
- RINOK(_stream->SetSize(newSize));
- _phySize = newSize;
- }
- if (newSize <= _cachedPos)
- {
- _cachedSize = 0;
- _cachedPos = newSize;
- }
- if (newSize < _cachedPos + _cachedSize)
- _cachedSize = (size_t)(newSize - _cachedPos);
- return S_OK;
-}
-
-
-HRESULT Update(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const CObjectVector<CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- ISequentialOutStream *seqOutStream,
- CInArchive *inArchive,
- CCompressionMethodMode *compressionMethodMode,
- IArchiveUpdateCallback *updateCallback)
-{
- CMyComPtr<IOutStream> outStream;
- {
- CMyComPtr<IOutStream> outStreamReal;
- seqOutStream->QueryInterface(IID_IOutStream, (void **)&outStreamReal);
- if (!outStreamReal)
- return E_NOTIMPL;
- CCacheOutStream *cacheStream = new CCacheOutStream();
- outStream = cacheStream;
- if (!cacheStream->Allocate())
- return E_OUTOFMEMORY;
- RINOK(cacheStream->Init(outStreamReal));
- }
-
- if (inArchive)
- {
- if (inArchive->ArcInfo.Base != 0 ||
- inArchive->ArcInfo.StartPosition != 0 ||
- !inArchive->IsOkHeaders)
- return E_NOTIMPL;
- }
-
- COutArchive outArchive;
- outArchive.Create(outStream);
- /*
- if (inArchive && inArchive->ArcInfo.StartPosition > 0)
- {
- CMyComPtr<ISequentialInStream> inStream;
- inStream.Attach(inArchive->CreateLimitedStream(0, inArchive->ArcInfo.StartPosition));
- RINOK(CopyBlockToArchive(inStream, outArchive, NULL));
- outArchive.MoveBasePosition(inArchive->ArcInfo.StartPosition);
- }
- */
- CMyComPtr<IInStream> inStream;
- if (inArchive)
- inStream.Attach(inArchive->CreateStream());
-
- return Update2(
- EXTERNAL_CODECS_LOC_VARS
- outArchive, inArchive, inStream,
- inputItems, updateItems,
- compressionMethodMode,
- inArchive ? &inArchive->ArcInfo.Comment : NULL,
- updateCallback);
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipUpdate.h b/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipUpdate.h
deleted file mode 100644
index eee16738c..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Archive/Zip/ZipUpdate.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Zip/Update.h
-
-#ifndef __ZIP_UPDATE_H
-#define __ZIP_UPDATE_H
-
-#include "../../ICoder.h"
-#include "../IArchive.h"
-
-#include "../../Common/CreateCoder.h"
-
-#include "ZipCompressionMode.h"
-#include "ZipIn.h"
-
-namespace NArchive {
-namespace NZip {
-
-struct CUpdateRange
-{
- UInt64 Position;
- UInt64 Size;
- CUpdateRange() {};
- CUpdateRange(UInt64 position, UInt64 size): Position(position), Size(size) {};
-};
-
-struct CUpdateItem
-{
- bool NewData;
- bool NewProperties;
- bool IsDir;
- bool NtfsTimeIsDefined;
- bool IsUtf8;
- int IndexInArchive;
- int IndexInClient;
- UInt32 Attributes;
- UInt32 Time;
- UInt64 Size;
- AString Name;
- // bool Commented;
- // CUpdateRange CommentRange;
- FILETIME NtfsMTime;
- FILETIME NtfsATime;
- FILETIME NtfsCTime;
-
- CUpdateItem(): NtfsTimeIsDefined(false), IsUtf8(false), Size(0) {}
-};
-
-HRESULT Update(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const CObjectVector<CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- ISequentialOutStream *seqOutStream,
- CInArchive *inArchive,
- CCompressionMethodMode *compressionMethodMode,
- IArchiveUpdateCallback *updateCallback);
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Common/MemBlocks.cpp b/src/libs/7zip/unix/CPP/7zip/Common/MemBlocks.cpp
deleted file mode 100644
index 67192b402..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Common/MemBlocks.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-// MemBlocks.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "MemBlocks.h"
-#include "StreamUtils.h"
-
-bool CMemBlockManager::AllocateSpace(size_t numBlocks)
-{
- FreeSpace();
- if (_blockSize < sizeof(void *) || numBlocks < 1)
- return false;
- size_t totalSize = numBlocks * _blockSize;
- if (totalSize / _blockSize != numBlocks)
- return false;
- _data = ::MidAlloc(totalSize);
- if (_data == 0)
- return false;
- Byte *p = (Byte *)_data;
- for (size_t i = 0; i + 1 < numBlocks; i++, p += _blockSize)
- *(Byte **)p = (p + _blockSize);
- *(Byte **)p = 0;
- _headFree = _data;
- return true;
-}
-
-void CMemBlockManager::FreeSpace()
-{
- ::MidFree(_data);
- _data = 0;
- _headFree= 0;
-}
-
-void *CMemBlockManager::AllocateBlock()
-{
- if (_headFree == 0)
- return 0;
- void *p = _headFree;
- _headFree = *(void **)_headFree;
- return p;
-}
-
-void CMemBlockManager::FreeBlock(void *p)
-{
- if (p == 0)
- return;
- *(void **)p = _headFree;
- _headFree = p;
-}
-
-
-HRes CMemBlockManagerMt::AllocateSpace(NWindows::NSynchronization::CSynchro *sync,size_t numBlocks, size_t numNoLockBlocks)
-{
- if (numNoLockBlocks > numBlocks)
- return E_INVALIDARG;
- if (!CMemBlockManager::AllocateSpace(numBlocks))
- return E_OUTOFMEMORY;
- size_t numLockBlocks = numBlocks - numNoLockBlocks;
- Semaphore.Close();
- return Semaphore.Create(sync,(LONG)numLockBlocks, (LONG)numLockBlocks);
-}
-
-HRes CMemBlockManagerMt::AllocateSpaceAlways(NWindows::NSynchronization::CSynchro *sync,size_t desiredNumberOfBlocks, size_t numNoLockBlocks)
-{
- if (numNoLockBlocks > desiredNumberOfBlocks)
- return E_INVALIDARG;
- for (;;)
- {
- if (AllocateSpace(sync,desiredNumberOfBlocks, numNoLockBlocks) == 0)
- return 0;
- if (desiredNumberOfBlocks == numNoLockBlocks)
- return E_OUTOFMEMORY;
- desiredNumberOfBlocks = numNoLockBlocks + ((desiredNumberOfBlocks - numNoLockBlocks) >> 1);
- }
-}
-
-void CMemBlockManagerMt::FreeSpace()
-{
- Semaphore.Close();
- CMemBlockManager::FreeSpace();
-}
-
-void *CMemBlockManagerMt::AllocateBlock()
-{
- // Semaphore.Lock();
- NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
- return CMemBlockManager::AllocateBlock();
-}
-
-void CMemBlockManagerMt::FreeBlock(void *p, bool lockMode)
-{
- if (p == 0)
- return;
- {
- NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
- CMemBlockManager::FreeBlock(p);
- }
- if (lockMode)
- Semaphore.Release();
-}
-
-void CMemBlocks::Free(CMemBlockManagerMt *manager)
-{
- while(Blocks.Size() > 0)
- {
- manager->FreeBlock(Blocks.Back());
- Blocks.DeleteBack();
- }
- TotalSize = 0;
-}
-
-void CMemBlocks::FreeOpt(CMemBlockManagerMt *manager)
-{
- Free(manager);
- Blocks.ClearAndFree();
-}
-
-HRESULT CMemBlocks::WriteToStream(size_t blockSize, ISequentialOutStream *outStream) const
-{
- UInt64 totalSize = TotalSize;
- for (int blockIndex = 0; totalSize > 0; blockIndex++)
- {
- UInt32 curSize = (UInt32)blockSize;
- if (totalSize < curSize)
- curSize = (UInt32)totalSize;
- if (blockIndex >= Blocks.Size())
- return E_FAIL;
- RINOK(WriteStream(outStream, Blocks[blockIndex], curSize));
- totalSize -= curSize;
- }
- return S_OK;
-}
-
-
-void CMemLockBlocks::FreeBlock(int index, CMemBlockManagerMt *memManager)
-{
- memManager->FreeBlock(Blocks[index], LockMode);
- Blocks[index] = 0;
-}
-
-void CMemLockBlocks::Free(CMemBlockManagerMt *memManager)
-{
- while (Blocks.Size() > 0)
- {
- FreeBlock(Blocks.Size() - 1, memManager);
- Blocks.DeleteBack();
- }
- TotalSize = 0;
-}
-
-HRes CMemLockBlocks::SwitchToNoLockMode(CMemBlockManagerMt *memManager)
-{
- if (LockMode)
- {
- if (Blocks.Size() > 0)
- {
- RINOK(memManager->ReleaseLockedBlocks(Blocks.Size()));
- }
- LockMode = false;
- }
- return 0;
-}
-
-void CMemLockBlocks::Detach(CMemLockBlocks &blocks, CMemBlockManagerMt *memManager)
-{
- blocks.Free(memManager);
- blocks.LockMode = LockMode;
- UInt64 totalSize = 0;
- size_t blockSize = memManager->GetBlockSize();
- for (int i = 0; i < Blocks.Size(); i++)
- {
- if (totalSize < TotalSize)
- blocks.Blocks.Add(Blocks[i]);
- else
- FreeBlock(i, memManager);
- Blocks[i] = 0;
- totalSize += blockSize;
- }
- blocks.TotalSize = TotalSize;
- Free(memManager);
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Common/MemBlocks.h b/src/libs/7zip/unix/CPP/7zip/Common/MemBlocks.h
deleted file mode 100644
index f23852fbd..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Common/MemBlocks.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// MemBlocks.h
-
-#ifndef __MEM_BLOCKS_H
-#define __MEM_BLOCKS_H
-
-#include "Common/MyVector.h"
-
-#include "Windows/Synchronization.h"
-
-#include "../IStream.h"
-
-class CMemBlockManager
-{
- void *_data;
- size_t _blockSize;
- void *_headFree;
-public:
- CMemBlockManager(size_t blockSize = (1 << 20)): _data(0), _blockSize(blockSize), _headFree(0) {}
- ~CMemBlockManager() { FreeSpace(); }
-
- bool AllocateSpace(size_t numBlocks);
- void FreeSpace();
- size_t GetBlockSize() const { return _blockSize; }
- void *AllocateBlock();
- void FreeBlock(void *p);
-};
-
-
-class CMemBlockManagerMt: public CMemBlockManager
-{
- NWindows::NSynchronization::CCriticalSection _criticalSection;
-public:
- NWindows::NSynchronization::CSemaphoreWFMO Semaphore;
-
- CMemBlockManagerMt(size_t blockSize = (1 << 20)): CMemBlockManager(blockSize) {}
- ~CMemBlockManagerMt() { FreeSpace(); }
-
- HRes AllocateSpace(NWindows::NSynchronization::CSynchro *sync, size_t numBlocks, size_t numNoLockBlocks = 0);
- HRes AllocateSpaceAlways(NWindows::NSynchronization::CSynchro *sync, size_t desiredNumberOfBlocks, size_t numNoLockBlocks = 0);
- void FreeSpace();
- void *AllocateBlock();
- void FreeBlock(void *p, bool lockMode = true);
- HRes ReleaseLockedBlocks(int number) { return Semaphore.Release(number); }
-};
-
-
-class CMemBlocks
-{
- void Free(CMemBlockManagerMt *manager);
-public:
- CRecordVector<void *> Blocks;
- UInt64 TotalSize;
-
- CMemBlocks(): TotalSize(0) {}
-
- void FreeOpt(CMemBlockManagerMt *manager);
- HRESULT WriteToStream(size_t blockSize, ISequentialOutStream *outStream) const;
-};
-
-struct CMemLockBlocks: public CMemBlocks
-{
- bool LockMode;
-
- CMemLockBlocks(): LockMode(true) {};
- void Free(CMemBlockManagerMt *memManager);
- void FreeBlock(int index, CMemBlockManagerMt *memManager);
- HRes SwitchToNoLockMode(CMemBlockManagerMt *memManager);
- void Detach(CMemLockBlocks &blocks, CMemBlockManagerMt *memManager);
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Common/OutMemStream.cpp b/src/libs/7zip/unix/CPP/7zip/Common/OutMemStream.cpp
deleted file mode 100644
index 2e92886b8..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Common/OutMemStream.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-// OutMemStream.cpp
-
-#include "StdAfx.h"
-
-#include "OutMemStream.h"
-
-void COutMemStream::Free()
-{
- Blocks.Free(_memManager);
- Blocks.LockMode = true;
-}
-
-void COutMemStream::Init()
-{
- WriteToRealStreamEvent.Reset();
- _unlockEventWasSent = false;
- _realStreamMode = false;
- Free();
- _curBlockPos = 0;
- _curBlockIndex = 0;
-}
-
-void COutMemStream::DetachData(CMemLockBlocks &blocks)
-{
- Blocks.Detach(blocks, _memManager);
- Free();
-}
-
-
-HRESULT COutMemStream::WriteToRealStream()
-{
- RINOK(Blocks.WriteToStream(_memManager->GetBlockSize(), OutSeqStream));
- Blocks.Free(_memManager);
- return S_OK;
-}
-
-STDMETHODIMP COutMemStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (_realStreamMode)
- return OutSeqStream->Write(data, size, processedSize);
- if (processedSize != 0)
- *processedSize = 0;
- while(size != 0)
- {
- if ((int)_curBlockIndex < Blocks.Blocks.Size())
- {
- Byte *p = (Byte *)Blocks.Blocks[(int)_curBlockIndex] + _curBlockPos;
- size_t curSize = _memManager->GetBlockSize() - _curBlockPos;
- if (size < curSize)
- curSize = size;
- memmove(p, data, curSize);
- if (processedSize != 0)
- *processedSize += (UInt32)curSize;
- data = (const void *)((const Byte *)data + curSize);
- size -= (UInt32)curSize;
- _curBlockPos += curSize;
-
- UInt64 pos64 = GetPos();
- if (pos64 > Blocks.TotalSize)
- Blocks.TotalSize = pos64;
- if (_curBlockPos == _memManager->GetBlockSize())
- {
- _curBlockIndex++;
- _curBlockPos = 0;
- }
- continue;
- }
- HANDLE events[3] = { StopWritingEvent, WriteToRealStreamEvent, /* NoLockEvent, */ _memManager->Semaphore };
- DWORD waitResult = ::WaitForMultipleObjects((Blocks.LockMode ? 3 : 2), events, FALSE, INFINITE);
- switch (waitResult)
- {
- case (WAIT_OBJECT_0 + 0):
- return StopWriteResult;
- case (WAIT_OBJECT_0 + 1):
- {
- _realStreamMode = true;
- RINOK(WriteToRealStream());
- UInt32 processedSize2;
- HRESULT res = OutSeqStream->Write(data, size, &processedSize2);
- if (processedSize != 0)
- *processedSize += processedSize2;
- return res;
- }
- /*
- case (WAIT_OBJECT_0 + 2):
- {
- // it has bug: no write.
- if (!Blocks.SwitchToNoLockMode(_memManager))
- return E_FAIL;
- break;
- }
- */
- case (WAIT_OBJECT_0 + 2):
- break;
- default:
- return E_FAIL;
- }
- Blocks.Blocks.Add(_memManager->AllocateBlock());
- if (Blocks.Blocks.Back() == 0)
- return E_FAIL;
- }
- return S_OK;
-}
-
-STDMETHODIMP COutMemStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- if (_realStreamMode)
- {
- if (!OutStream)
- return E_FAIL;
- return OutStream->Seek(offset, seekOrigin, newPosition);
- }
- if (seekOrigin == STREAM_SEEK_CUR)
- {
- if (offset != 0)
- return E_NOTIMPL;
- }
- else if (seekOrigin == STREAM_SEEK_SET)
- {
- if (offset != 0)
- return E_NOTIMPL;
- _curBlockIndex = 0;
- _curBlockPos = 0;
- }
- else
- return E_NOTIMPL;
- if (newPosition != 0)
- *newPosition = GetPos();
- return S_OK;
-}
-
-STDMETHODIMP COutMemStream::SetSize(UInt64 newSize)
-{
- if (_realStreamMode)
- {
- if (!OutStream)
- return E_FAIL;
- return OutStream->SetSize(newSize);
- }
- Blocks.TotalSize = newSize;
- return S_OK;
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Common/OutMemStream.h b/src/libs/7zip/unix/CPP/7zip/Common/OutMemStream.h
deleted file mode 100644
index b512f7dc9..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Common/OutMemStream.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// OutMemStream.h
-
-#ifndef __OUTMEMSTREAM_H
-#define __OUTMEMSTREAM_H
-
-#include "Common/MyCom.h"
-#include "MemBlocks.h"
-
-class COutMemStream:
- public IOutStream,
- public CMyUnknownImp
-{
- CMemBlockManagerMt *_memManager;
- size_t _curBlockIndex;
- size_t _curBlockPos;
- bool _realStreamMode;
-
- bool _unlockEventWasSent;
- NWindows::NSynchronization::CAutoResetEventWFMO StopWritingEvent;
- NWindows::NSynchronization::CAutoResetEventWFMO WriteToRealStreamEvent;
- // NWindows::NSynchronization::CAutoResetEvent NoLockEvent;
-
- HRESULT StopWriteResult;
- CMemLockBlocks Blocks;
-
- UInt64 GetPos() const { return (UInt64)_curBlockIndex * _memManager->GetBlockSize() + _curBlockPos; }
-
- CMyComPtr<ISequentialOutStream> OutSeqStream;
- CMyComPtr<IOutStream> OutStream;
-
-public:
-
- HRes CreateEvents(NWindows::NSynchronization::CSynchro *sync)
- {
- RINOK(StopWritingEvent.CreateIfNotCreated(sync));
- return WriteToRealStreamEvent.CreateIfNotCreated(sync);
- }
-
- void SetOutStream(IOutStream *outStream)
- {
- OutStream = outStream;
- OutSeqStream = outStream;
- }
-
- void SetSeqOutStream(ISequentialOutStream *outStream)
- {
- OutStream = NULL;
- OutSeqStream = outStream;
- }
-
- void ReleaseOutStream()
- {
- OutStream.Release();
- OutSeqStream.Release();
- }
-
- COutMemStream(CMemBlockManagerMt *memManager): _memManager(memManager) { }
-
- ~COutMemStream() { Free(); }
- void Free();
-
- void Init();
- HRESULT WriteToRealStream();
-
- void DetachData(CMemLockBlocks &blocks);
-
- bool WasUnlockEventSent() const { return _unlockEventWasSent; }
-
- void SetRealStreamMode()
- {
- _unlockEventWasSent = true;
- WriteToRealStreamEvent.Set();
- }
-
- /*
- void SetNoLockMode()
- {
- _unlockEventWasSent = true;
- NoLockEvent.Set();
- }
- */
-
- void StopWriting(HRESULT res)
- {
- StopWriteResult = res;
- StopWritingEvent.Set();
- }
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
- STDMETHOD(SetSize)(UInt64 newSize);
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Common/ProgressMt.cpp b/src/libs/7zip/unix/CPP/7zip/Common/ProgressMt.cpp
deleted file mode 100644
index 319bd241b..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Common/ProgressMt.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-// ProgressMt.h
-
-#include "StdAfx.h"
-
-#include "ProgressMt.h"
-
-void CMtCompressProgressMixer::Init(int numItems, ICompressProgressInfo *progress)
-{
- NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);
- InSizes.Clear();
- OutSizes.Clear();
- for (int i = 0; i < numItems; i++)
- {
- InSizes.Add(0);
- OutSizes.Add(0);
- }
- TotalInSize = 0;
- TotalOutSize = 0;
- _progress = progress;
-}
-
-void CMtCompressProgressMixer::Reinit(int index)
-{
- NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);
- InSizes[index] = 0;
- OutSizes[index] = 0;
-}
-
-HRESULT CMtCompressProgressMixer::SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize)
-{
- NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);
- if (inSize != 0)
- {
- UInt64 diff = *inSize - InSizes[index];
- InSizes[index] = *inSize;
- TotalInSize += diff;
- }
- if (outSize != 0)
- {
- UInt64 diff = *outSize - OutSizes[index];
- OutSizes[index] = *outSize;
- TotalOutSize += diff;
- }
- if (_progress)
- return _progress->SetRatioInfo(&TotalInSize, &TotalOutSize);
- return S_OK;
-}
-
-
-STDMETHODIMP CMtCompressProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
-{
- return _progress->SetRatioInfo(_index, inSize, outSize);
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Common/ProgressMt.h b/src/libs/7zip/unix/CPP/7zip/Common/ProgressMt.h
deleted file mode 100644
index 26079d4e9..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Common/ProgressMt.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// ProgressMt.h
-
-#ifndef __PROGRESSMT_H
-#define __PROGRESSMT_H
-
-#include "../../Common/MyCom.h"
-#include "../../Common/MyVector.h"
-#include "../../Windows/Synchronization.h"
-
-#include "../ICoder.h"
-#include "../IProgress.h"
-
-class CMtCompressProgressMixer
-{
- CMyComPtr<ICompressProgressInfo> _progress;
- CRecordVector<UInt64> InSizes;
- CRecordVector<UInt64> OutSizes;
- UInt64 TotalInSize;
- UInt64 TotalOutSize;
-public:
- NWindows::NSynchronization::CCriticalSection CriticalSection;
- void Init(int numItems, ICompressProgressInfo *progress);
- void Reinit(int index);
- HRESULT SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize);
-};
-
-class CMtCompressProgress:
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
- CMtCompressProgressMixer *_progress;
- int _index;
-public:
- void Init(CMtCompressProgressMixer *progress, int index)
- {
- _progress = progress;
- _index = index;
- }
- void Reinit() { _progress->Reinit(_index); }
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Common/StreamObjects.h b/src/libs/7zip/unix/CPP/7zip/Common/StreamObjects.h
index 8cd95c700..5c8b5e51b 100644
--- a/src/libs/7zip/unix/CPP/7zip/Common/StreamObjects.h
+++ b/src/libs/7zip/unix/CPP/7zip/Common/StreamObjects.h
@@ -48,7 +48,7 @@ public:
~CByteDynBuffer() { Free(); }
void Free();
size_t GetCapacity() const { return _capacity; }
- operator Byte*() const { return _buf; };
+ operator Byte*() { return _buf; };
operator const Byte*() const { return _buf; };
bool EnsureCapacity(size_t capacity);
};
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder1.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder1.cpp
deleted file mode 100644
index 2c354e1eb..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder1.cpp
+++ /dev/null
@@ -1,309 +0,0 @@
-// ArjDecoder1.cpp
-
-#include "StdAfx.h"
-
-#include "ArjDecoder1.h"
-
-namespace NCompress{
-namespace NArj {
-namespace NDecoder1 {
-
-static const UInt32 kHistorySize = 26624;
-static const UInt32 kMatchMinLen = 3;
-static const UInt32 kMatchMaxLen = 256;
-
-// static const UInt32 kNC = 255 + kMatchMaxLen + 2 - kMatchMinLen;
-
-void CCoder::MakeTable(int nchar, Byte *bitlen, int tablebits,
- UInt32 *table, int tablesize)
-{
- UInt32 count[17], weight[17], start[18], *p;
- UInt32 i, k, len, ch, jutbits, avail, nextcode, mask;
-
- for (i = 1; i <= 16; i++)
- count[i] = 0;
- for (i = 0; (int)i < nchar; i++)
- count[bitlen[i]]++;
-
- start[1] = 0;
- for (i = 1; i <= 16; i++)
- start[i + 1] = start[i] + (count[i] << (16 - i));
- if (start[17] != (UInt32) (1 << 16))
- throw "Data error";
-
- jutbits = 16 - tablebits;
- for (i = 1; (int)i <= tablebits; i++)
- {
- start[i] >>= jutbits;
- weight[i] = 1 << (tablebits - i);
- }
- while (i <= 16)
- {
- weight[i] = 1 << (16 - i);
- i++;
- }
-
- i = start[tablebits + 1] >> jutbits;
- if (i != (UInt32) (1 << 16))
- {
- k = 1 << tablebits;
- while (i != k)
- table[i++] = 0;
- }
-
- avail = nchar;
- mask = 1 << (15 - tablebits);
- for (ch = 0; (int)ch < nchar; ch++)
- {
- if ((len = bitlen[ch]) == 0)
- continue;
- k = start[len];
- nextcode = k + weight[len];
- if ((int)len <= tablebits)
- {
- if (nextcode > (UInt32)tablesize)
- throw "Data error";
- for (i = start[len]; i < nextcode; i++)
- table[i] = ch;
- }
- else
- {
- p = &table[k >> jutbits];
- i = len - tablebits;
- while (i != 0)
- {
- if (*p == 0)
- {
- right[avail] = left[avail] = 0;
- *p = avail++;
- }
- if (k & mask)
- p = &right[*p];
- else
- p = &left[*p];
- k <<= 1;
- i--;
- }
- *p = ch;
- }
- start[len] = nextcode;
- }
-}
-
-void CCoder::read_pt_len(int nn, int nbit, int i_special)
-{
- UInt32 n = m_InBitStream.ReadBits(nbit);
- if (n == 0)
- {
- UInt32 c = m_InBitStream.ReadBits(nbit);
- int i;
- for (i = 0; i < nn; i++)
- pt_len[i] = 0;
- for (i = 0; i < 256; i++)
- pt_table[i] = c;
- }
- else
- {
- UInt32 i = 0;
- while (i < n)
- {
- UInt32 bitBuf = m_InBitStream.GetValue(16);
- int c = bitBuf >> 13;
- if (c == 7)
- {
- UInt32 mask = 1 << (12);
- while (mask & bitBuf)
- {
- mask >>= 1;
- c++;
- }
- }
- m_InBitStream.MovePos((c < 7) ? 3 : (int)(c - 3));
- pt_len[i++] = (Byte)c;
- if (i == (UInt32)i_special)
- {
- c = m_InBitStream.ReadBits(2);
- while (--c >= 0)
- pt_len[i++] = 0;
- }
- }
- while (i < (UInt32)nn)
- pt_len[i++] = 0;
- MakeTable(nn, pt_len, 8, pt_table, PTABLESIZE);
- }
-}
-
-void CCoder::read_c_len()
-{
- int i, c, n;
- UInt32 mask;
-
- n = m_InBitStream.ReadBits(CBIT);
- if (n == 0)
- {
- c = m_InBitStream.ReadBits(CBIT);
- for (i = 0; i < NC; i++)
- c_len[i] = 0;
- for (i = 0; i < CTABLESIZE; i++)
- c_table[i] = c;
- }
- else
- {
- i = 0;
- while (i < n)
- {
- UInt32 bitBuf = m_InBitStream.GetValue(16);
- c = pt_table[bitBuf >> (8)];
- if (c >= NT)
- {
- mask = 1 << (7);
- do
- {
- if (bitBuf & mask)
- c = right[c];
- else
- c = left[c];
- mask >>= 1;
- } while (c >= NT);
- }
- m_InBitStream.MovePos((int)(pt_len[c]));
- if (c <= 2)
- {
- if (c == 0)
- c = 1;
- else if (c == 1)
- c = m_InBitStream.ReadBits(4) + 3;
- else
- c = m_InBitStream.ReadBits(CBIT) + 20;
- while (--c >= 0)
- c_len[i++] = 0;
- }
- else
- c_len[i++] = (Byte)(c - 2);
- }
- while (i < NC)
- c_len[i++] = 0;
- MakeTable(NC, c_len, 12, c_table, CTABLESIZE);
- }
-}
-
-UInt32 CCoder::decode_c()
-{
- UInt32 j, mask;
- UInt32 bitbuf = m_InBitStream.GetValue(16);
- j = c_table[bitbuf >> 4];
- if (j >= NC)
- {
- mask = 1 << (3);
- do
- {
- if (bitbuf & mask)
- j = right[j];
- else
- j = left[j];
- mask >>= 1;
- } while (j >= NC);
- }
- m_InBitStream.MovePos((int)(c_len[j]));
- return j;
-}
-
-UInt32 CCoder::decode_p()
-{
- UInt32 j, mask;
- UInt32 bitbuf = m_InBitStream.GetValue(16);
- j = pt_table[bitbuf >> (8)];
- if (j >= NP)
- {
- mask = 1 << (7);
- do
- {
- if (bitbuf & mask)
- j = right[j];
- else
- j = left[j];
- mask >>= 1;
- } while (j >= NP);
- }
- m_InBitStream.MovePos((int)(pt_len[j]));
- if (j != 0)
- {
- j--;
- j = (1 << j) + m_InBitStream.ReadBits((int)j);
- }
- return j;
-}
-
-
-HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (outSize == NULL)
- return E_INVALIDARG;
-
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
-
- // check it
- for (int i = 0; i < CTABLESIZE; i++)
- c_table[i] = 0;
-
- UInt64 pos = 0;
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(false);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
-
- CCoderReleaser coderReleaser(this);
-
- UInt32 blockSize = 0;
-
- while(pos < *outSize)
- {
- if (blockSize == 0)
- {
- if (progress != NULL)
- {
- UInt64 packSize = m_InBitStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &pos));
- }
- blockSize = m_InBitStream.ReadBits(16);
- read_pt_len(NT, TBIT, 3);
- read_c_len();
- read_pt_len(NP, PBIT, -1);
- }
- blockSize--;
-
- UInt32 number = decode_c();
- if (number < 256)
- {
- m_OutWindowStream.PutByte((Byte)number);
- pos++;
- continue;
- }
- else
- {
- UInt32 len = number - 256 + kMatchMinLen;
- UInt32 distance = decode_p();
- if (distance >= pos)
- return S_FALSE;
- m_OutWindowStream.CopyBlock(distance, len);
- pos += len;
- }
- }
- coderReleaser.NeedFlush = false;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress);}
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder1.h b/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder1.h
deleted file mode 100644
index 17939dafb..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder1.h
+++ /dev/null
@@ -1,98 +0,0 @@
-// ArjDecoder1.h
-
-#ifndef __COMPRESS_ARJ_DECODER1_H
-#define __COMPRESS_ARJ_DECODER1_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NArj {
-namespace NDecoder1 {
-
-#define CODE_BIT 16
-
-#define THRESHOLD 3
-#define DDICSIZ 26624
-#define MAXDICBIT 16
-#define MATCHBIT 8
-#define MAXMATCH 256
-#define NC (0xFF + MAXMATCH + 2 - THRESHOLD)
-#define NP (MAXDICBIT + 1)
-#define CBIT 9
-#define NT (CODE_BIT + 3)
-#define PBIT 5
-#define TBIT 5
-
-#if NT > NP
-#define NPT NT
-#else
-#define NPT NP
-#endif
-
-#define CTABLESIZE 4096
-#define PTABLESIZE 256
-
-
-class CCoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- NBitm::CDecoder<CInBuffer> m_InBitStream;
-
- UInt32 left[2 * NC - 1];
- UInt32 right[2 * NC - 1];
- Byte c_len[NC];
- Byte pt_len[NPT];
-
- UInt32 c_table[CTABLESIZE];
- UInt32 pt_table[PTABLESIZE];
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
-
- class CCoderReleaser
- {
- CCoder *m_Coder;
- public:
- bool NeedFlush;
- CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}
- ~CCoderReleaser()
- {
- if (NeedFlush)
- m_Coder->m_OutWindowStream.Flush();
- m_Coder->ReleaseStreams();
- }
- };
- friend class CCoderReleaser;
-
- void MakeTable(int nchar, Byte *bitlen, int tablebits, UInt32 *table, int tablesize);
-
- void read_c_len();
- void read_pt_len(int nn, int nbit, int i_special);
- UInt32 decode_c();
- UInt32 decode_p();
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder2.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder2.cpp
deleted file mode 100644
index 365993bc5..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder2.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-// ArjDecoder2.cpp
-
-#include "StdAfx.h"
-
-#include "ArjDecoder2.h"
-
-namespace NCompress{
-namespace NArj {
-namespace NDecoder2 {
-
-static const UInt32 kHistorySize = 26624;
-static const UInt32 kMatchMinLen = 3;
-
-HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo * /* progress */)
-{
- if (outSize == NULL)
- return E_INVALIDARG;
-
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
-
- UInt64 pos = 0;
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(false);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
- CCoderReleaser coderReleaser(this);
-
- while(pos < *outSize)
- {
- const UInt32 kStartWidth = 0;
- const UInt32 kStopWidth = 7;
- UInt32 power = 1 << kStartWidth;
- UInt32 width;
- UInt32 len = 0;
- for (width = kStartWidth; width < kStopWidth; width++)
- {
- if (m_InBitStream.ReadBits(1) == 0)
- break;
- len += power;
- power <<= 1;
- }
- if (width != 0)
- len += m_InBitStream.ReadBits(width);
- if (len == 0)
- {
- m_OutWindowStream.PutByte((Byte)m_InBitStream.ReadBits(8));
- pos++;
- continue;
- }
- else
- {
- len = len - 1 + kMatchMinLen;
- const UInt32 kStartWidth = 9;
- const UInt32 kStopWidth = 13;
- UInt32 power = 1 << kStartWidth;
- UInt32 width;
- UInt32 distance = 0;
- for (width = kStartWidth; width < kStopWidth; width++)
- {
- if (m_InBitStream.ReadBits(1) == 0)
- break;
- distance += power;
- power <<= 1;
- }
- if (width != 0)
- distance += m_InBitStream.ReadBits(width);
- if (distance >= pos)
- return S_FALSE;
- m_OutWindowStream.CopyBlock(distance, len);
- pos += len;
- }
- }
- coderReleaser.NeedFlush = false;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress);}
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder2.h b/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder2.h
deleted file mode 100644
index cf00975da..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ArjDecoder2.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// ArjDecoder2.h
-
-#ifndef __COMPRESS_ARJ_DECODER2_H
-#define __COMPRESS_ARJ_DECODER2_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NArj {
-namespace NDecoder2 {
-
-class CCoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- NBitm::CDecoder<CInBuffer> m_InBitStream;
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
-
- class CCoderReleaser
- {
- CCoder *m_Coder;
- public:
- bool NeedFlush;
- CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}
- ~CCoderReleaser()
- {
- if (NeedFlush)
- m_Coder->m_OutWindowStream.Flush();
- m_Coder->ReleaseStreams();
- }
- };
- friend class CCoderReleaser;
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Const.h b/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Const.h
deleted file mode 100644
index 62427aa68..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Const.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Compress/BZip2Const.h
-
-#ifndef __COMPRESS_BZIP2_CONST_H
-#define __COMPRESS_BZIP2_CONST_H
-
-namespace NCompress {
-namespace NBZip2 {
-
-const Byte kArSig0 = 'B';
-const Byte kArSig1 = 'Z';
-const Byte kArSig2 = 'h';
-const Byte kArSig3 = '0';
-
-const Byte kFinSig0 = 0x17;
-const Byte kFinSig1 = 0x72;
-const Byte kFinSig2 = 0x45;
-const Byte kFinSig3 = 0x38;
-const Byte kFinSig4 = 0x50;
-const Byte kFinSig5 = 0x90;
-
-const Byte kBlockSig0 = 0x31;
-const Byte kBlockSig1 = 0x41;
-const Byte kBlockSig2 = 0x59;
-const Byte kBlockSig3 = 0x26;
-const Byte kBlockSig4 = 0x53;
-const Byte kBlockSig5 = 0x59;
-
-const int kNumOrigBits = 24;
-
-const int kNumTablesBits = 3;
-const int kNumTablesMin = 2;
-const int kNumTablesMax = 6;
-
-const int kNumLevelsBits = 5;
-
-const int kMaxHuffmanLen = 20; // Check it
-
-const int kMaxAlphaSize = 258;
-
-const int kGroupSize = 50;
-
-const int kBlockSizeMultMin = 1;
-const int kBlockSizeMultMax = 9;
-const UInt32 kBlockSizeStep = 100000;
-const UInt32 kBlockSizeMax = kBlockSizeMultMax * kBlockSizeStep;
-
-const int kNumSelectorsBits = 15;
-const UInt32 kNumSelectorsMax = (2 + (kBlockSizeMax / kGroupSize));
-
-const int kRleModeRepSize = 4;
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Crc.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Crc.cpp
deleted file mode 100644
index 4e4741f40..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Crc.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// BZip2Crc.cpp
-
-#include "StdAfx.h"
-
-#include "BZip2Crc.h"
-
-UInt32 CBZip2Crc::Table[256];
-
-static const UInt32 kBZip2CrcPoly = 0x04c11db7; /* AUTODIN II, Ethernet, & FDDI */
-
-void CBZip2Crc::InitTable()
-{
- for (UInt32 i = 0; i < 256; i++)
- {
- UInt32 r = (i << 24);
- for (int j = 8; j > 0; j--)
- r = (r & 0x80000000) ? ((r << 1) ^ kBZip2CrcPoly) : (r << 1);
- Table[i] = r;
- }
-}
-
-class CBZip2CrcTableInit
-{
-public:
- CBZip2CrcTableInit() { CBZip2Crc::InitTable(); }
-} g_BZip2CrcTableInit;
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Crc.h b/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Crc.h
deleted file mode 100644
index 876945b5f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Crc.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// BZip2Crc.h
-
-#ifndef __BZIP2_CRC_H
-#define __BZIP2_CRC_H
-
-#include "Common/Types.h"
-
-class CBZip2Crc
-{
- UInt32 _value;
- static UInt32 Table[256];
-public:
- static void InitTable();
- CBZip2Crc(): _value(0xFFFFFFFF) {};
- void Init() { _value = 0xFFFFFFFF; }
- void UpdateByte(Byte b) { _value = Table[(_value >> 24) ^ b] ^ (_value << 8); }
- void UpdateByte(unsigned int b) { _value = Table[(_value >> 24) ^ b] ^ (_value << 8); }
- UInt32 GetDigest() const { return _value ^ 0xFFFFFFFF; }
-};
-
-class CBZip2CombinedCrc
-{
- UInt32 _value;
-public:
- CBZip2CombinedCrc(): _value(0){};
- void Init() { _value = 0; }
- void Update(UInt32 v) { _value = ((_value << 1) | (_value >> 31)) ^ v; }
- UInt32 GetDigest() const { return _value ; }
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Decoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Decoder.cpp
deleted file mode 100644
index cb1f981a7..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Decoder.cpp
+++ /dev/null
@@ -1,943 +0,0 @@
-// BZip2Decoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "BZip2Decoder.h"
-#include "Mtf8.h"
-
-namespace NCompress {
-namespace NBZip2 {
-
-#undef NO_INLINE
-#define NO_INLINE
-
-static const UInt32 kNumThreadsMax = 4;
-
-static const UInt32 kBufferSize = (1 << 17);
-
-static const UInt16 kRandNums[512] = {
- 619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
- 985, 724, 205, 454, 863, 491, 741, 242, 949, 214,
- 733, 859, 335, 708, 621, 574, 73, 654, 730, 472,
- 419, 436, 278, 496, 867, 210, 399, 680, 480, 51,
- 878, 465, 811, 169, 869, 675, 611, 697, 867, 561,
- 862, 687, 507, 283, 482, 129, 807, 591, 733, 623,
- 150, 238, 59, 379, 684, 877, 625, 169, 643, 105,
- 170, 607, 520, 932, 727, 476, 693, 425, 174, 647,
- 73, 122, 335, 530, 442, 853, 695, 249, 445, 515,
- 909, 545, 703, 919, 874, 474, 882, 500, 594, 612,
- 641, 801, 220, 162, 819, 984, 589, 513, 495, 799,
- 161, 604, 958, 533, 221, 400, 386, 867, 600, 782,
- 382, 596, 414, 171, 516, 375, 682, 485, 911, 276,
- 98, 553, 163, 354, 666, 933, 424, 341, 533, 870,
- 227, 730, 475, 186, 263, 647, 537, 686, 600, 224,
- 469, 68, 770, 919, 190, 373, 294, 822, 808, 206,
- 184, 943, 795, 384, 383, 461, 404, 758, 839, 887,
- 715, 67, 618, 276, 204, 918, 873, 777, 604, 560,
- 951, 160, 578, 722, 79, 804, 96, 409, 713, 940,
- 652, 934, 970, 447, 318, 353, 859, 672, 112, 785,
- 645, 863, 803, 350, 139, 93, 354, 99, 820, 908,
- 609, 772, 154, 274, 580, 184, 79, 626, 630, 742,
- 653, 282, 762, 623, 680, 81, 927, 626, 789, 125,
- 411, 521, 938, 300, 821, 78, 343, 175, 128, 250,
- 170, 774, 972, 275, 999, 639, 495, 78, 352, 126,
- 857, 956, 358, 619, 580, 124, 737, 594, 701, 612,
- 669, 112, 134, 694, 363, 992, 809, 743, 168, 974,
- 944, 375, 748, 52, 600, 747, 642, 182, 862, 81,
- 344, 805, 988, 739, 511, 655, 814, 334, 249, 515,
- 897, 955, 664, 981, 649, 113, 974, 459, 893, 228,
- 433, 837, 553, 268, 926, 240, 102, 654, 459, 51,
- 686, 754, 806, 760, 493, 403, 415, 394, 687, 700,
- 946, 670, 656, 610, 738, 392, 760, 799, 887, 653,
- 978, 321, 576, 617, 626, 502, 894, 679, 243, 440,
- 680, 879, 194, 572, 640, 724, 926, 56, 204, 700,
- 707, 151, 457, 449, 797, 195, 791, 558, 945, 679,
- 297, 59, 87, 824, 713, 663, 412, 693, 342, 606,
- 134, 108, 571, 364, 631, 212, 174, 643, 304, 329,
- 343, 97, 430, 751, 497, 314, 983, 374, 822, 928,
- 140, 206, 73, 263, 980, 736, 876, 478, 430, 305,
- 170, 514, 364, 692, 829, 82, 855, 953, 676, 246,
- 369, 970, 294, 750, 807, 827, 150, 790, 288, 923,
- 804, 378, 215, 828, 592, 281, 565, 555, 710, 82,
- 896, 831, 547, 261, 524, 462, 293, 465, 502, 56,
- 661, 821, 976, 991, 658, 869, 905, 758, 745, 193,
- 768, 550, 608, 933, 378, 286, 215, 979, 792, 961,
- 61, 688, 793, 644, 986, 403, 106, 366, 905, 644,
- 372, 567, 466, 434, 645, 210, 389, 550, 919, 135,
- 780, 773, 635, 389, 707, 100, 626, 958, 165, 504,
- 920, 176, 193, 713, 857, 265, 203, 50, 668, 108,
- 645, 990, 626, 197, 510, 357, 358, 850, 858, 364,
- 936, 638
-};
-
-bool CState::Alloc()
-{
- if (!Counters)
- Counters = (UInt32 *)::BigAlloc((256 + kBlockSizeMax) * sizeof(UInt32));
- return (Counters != 0);
-}
-
-void CState::Free()
-{
- ::BigFree(Counters);
- Counters = 0;
-}
-
-UInt32 CDecoder::ReadBits(unsigned numBits) { return m_InStream.ReadBits(numBits); }
-Byte CDecoder::ReadByte() {return (Byte)ReadBits(8); }
-bool CDecoder::ReadBit() { return ReadBits(1) != 0; }
-
-UInt32 CDecoder::ReadCrc()
-{
- UInt32 crc = 0;
- for (int i = 0; i < 4; i++)
- {
- crc <<= 8;
- crc |= ReadByte();
- }
- return crc;
-}
-
-static UInt32 NO_INLINE ReadBits(NBitm::CDecoder<CInBuffer> *m_InStream, unsigned num)
-{
- return m_InStream->ReadBits(num);
-}
-
-static UInt32 NO_INLINE ReadBit(NBitm::CDecoder<CInBuffer> *m_InStream)
-{
- return m_InStream->ReadBits(1);
-}
-
-static HRESULT NO_INLINE ReadBlock(NBitm::CDecoder<CInBuffer> *m_InStream,
- UInt32 *CharCounters, UInt32 blockSizeMax, Byte *m_Selectors, CHuffmanDecoder *m_HuffmanDecoders,
- UInt32 *blockSizeRes, UInt32 *origPtrRes, bool *randRes)
-{
- if (randRes)
- *randRes = ReadBit(m_InStream) ? true : false;
- *origPtrRes = ReadBits(m_InStream, kNumOrigBits);
-
- // in original code it compares OrigPtr to (UInt32)(10 + blockSizeMax)) : why ?
- if (*origPtrRes >= blockSizeMax)
- return S_FALSE;
-
- CMtf8Decoder mtf;
- mtf.StartInit();
-
- int numInUse = 0;
- {
- Byte inUse16[16];
- int i;
- for (i = 0; i < 16; i++)
- inUse16[i] = (Byte)ReadBit(m_InStream);
- for (i = 0; i < 256; i++)
- if (inUse16[i >> 4])
- {
- if (ReadBit(m_InStream))
- mtf.Add(numInUse++, (Byte)i);
- }
- if (numInUse == 0)
- return S_FALSE;
- // mtf.Init(numInUse);
- }
- int alphaSize = numInUse + 2;
-
- int numTables = ReadBits(m_InStream, kNumTablesBits);
- if (numTables < kNumTablesMin || numTables > kNumTablesMax)
- return S_FALSE;
-
- UInt32 numSelectors = ReadBits(m_InStream, kNumSelectorsBits);
- if (numSelectors < 1 || numSelectors > kNumSelectorsMax)
- return S_FALSE;
-
- {
- Byte mtfPos[kNumTablesMax];
- int t = 0;
- do
- mtfPos[t] = (Byte)t;
- while(++t < numTables);
- UInt32 i = 0;
- do
- {
- int j = 0;
- while (ReadBit(m_InStream))
- if (++j >= numTables)
- return S_FALSE;
- Byte tmp = mtfPos[j];
- for (;j > 0; j--)
- mtfPos[j] = mtfPos[j - 1];
- m_Selectors[i] = mtfPos[0] = tmp;
- }
- while(++i < numSelectors);
- }
-
- int t = 0;
- do
- {
- Byte lens[kMaxAlphaSize];
- int len = (int)ReadBits(m_InStream, kNumLevelsBits);
- int i;
- for (i = 0; i < alphaSize; i++)
- {
- for (;;)
- {
- if (len < 1 || len > kMaxHuffmanLen)
- return S_FALSE;
- if (!ReadBit(m_InStream))
- break;
- len += 1 - (int)(ReadBit(m_InStream) << 1);
- }
- lens[i] = (Byte)len;
- }
- for (; i < kMaxAlphaSize; i++)
- lens[i] = 0;
- if(!m_HuffmanDecoders[t].SetCodeLengths(lens))
- return S_FALSE;
- }
- while(++t < numTables);
-
- {
- for (int i = 0; i < 256; i++)
- CharCounters[i] = 0;
- }
-
- UInt32 blockSize = 0;
- {
- UInt32 groupIndex = 0;
- UInt32 groupSize = 0;
- CHuffmanDecoder *huffmanDecoder = 0;
- int runPower = 0;
- UInt32 runCounter = 0;
-
- for (;;)
- {
- if (groupSize == 0)
- {
- if (groupIndex >= numSelectors)
- return S_FALSE;
- groupSize = kGroupSize;
- huffmanDecoder = &m_HuffmanDecoders[m_Selectors[groupIndex++]];
- }
- groupSize--;
-
- UInt32 nextSym = huffmanDecoder->DecodeSymbol(m_InStream);
-
- if (nextSym < 2)
- {
- runCounter += ((UInt32)(nextSym + 1) << runPower++);
- if (blockSizeMax - blockSize < runCounter)
- return S_FALSE;
- continue;
- }
- if (runCounter != 0)
- {
- UInt32 b = (UInt32)mtf.GetHead();
- CharCounters[b] += runCounter;
- do
- CharCounters[256 + blockSize++] = b;
- while(--runCounter != 0);
- runPower = 0;
- }
- if (nextSym <= (UInt32)numInUse)
- {
- UInt32 b = (UInt32)mtf.GetAndMove((int)nextSym - 1);
- if (blockSize >= blockSizeMax)
- return S_FALSE;
- CharCounters[b]++;
- CharCounters[256 + blockSize++] = b;
- }
- else if (nextSym == (UInt32)numInUse + 1)
- break;
- else
- return S_FALSE;
- }
- }
- *blockSizeRes = blockSize;
- return (*origPtrRes < blockSize) ? S_OK : S_FALSE;
-}
-
-static void NO_INLINE DecodeBlock1(UInt32 *charCounters, UInt32 blockSize)
-{
- {
- UInt32 sum = 0;
- for (UInt32 i = 0; i < 256; i++)
- {
- sum += charCounters[i];
- charCounters[i] = sum - charCounters[i];
- }
- }
-
- UInt32 *tt = charCounters + 256;
- // Compute the T^(-1) vector
- UInt32 i = 0;
- do
- tt[charCounters[tt[i] & 0xFF]++] |= (i << 8);
- while(++i < blockSize);
-}
-
-static UInt32 NO_INLINE DecodeBlock2(const UInt32 *tt, UInt32 blockSize, UInt32 OrigPtr, COutBuffer &m_OutStream)
-{
- CBZip2Crc crc;
-
- // it's for speed optimization: prefetch & prevByte_init;
- UInt32 tPos = tt[tt[OrigPtr] >> 8];
- unsigned prevByte = (unsigned)(tPos & 0xFF);
-
- unsigned numReps = 0;
-
- do
- {
- unsigned b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
-
- if (numReps == kRleModeRepSize)
- {
- for (; b > 0; b--)
- {
- crc.UpdateByte(prevByte);
- m_OutStream.WriteByte((Byte)prevByte);
- }
- numReps = 0;
- continue;
- }
- if (b != prevByte)
- numReps = 0;
- numReps++;
- prevByte = b;
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
-
- /*
- prevByte = b;
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
- for (; --blockSize != 0;)
- {
- b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
- if (b != prevByte)
- {
- prevByte = b;
- continue;
- }
- if (--blockSize == 0)
- break;
-
- b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
- if (b != prevByte)
- {
- prevByte = b;
- continue;
- }
- if (--blockSize == 0)
- break;
-
- b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
- if (b != prevByte)
- {
- prevByte = b;
- continue;
- }
- --blockSize;
- break;
- }
- if (blockSize == 0)
- break;
-
- b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
-
- for (; b > 0; b--)
- {
- crc.UpdateByte(prevByte);
- m_OutStream.WriteByte((Byte)prevByte);
- }
- */
- }
- while(--blockSize != 0);
- return crc.GetDigest();
-}
-
-static UInt32 NO_INLINE DecodeBlock2Rand(const UInt32 *tt, UInt32 blockSize, UInt32 OrigPtr, COutBuffer &m_OutStream)
-{
- CBZip2Crc crc;
-
- UInt32 randIndex = 1;
- UInt32 randToGo = kRandNums[0] - 2;
-
- unsigned numReps = 0;
-
- // it's for speed optimization: prefetch & prevByte_init;
- UInt32 tPos = tt[tt[OrigPtr] >> 8];
- unsigned prevByte = (unsigned)(tPos & 0xFF);
-
- do
- {
- unsigned b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
-
- {
- if (randToGo == 0)
- {
- b ^= 1;
- randToGo = kRandNums[randIndex++];
- randIndex &= 0x1FF;
- }
- randToGo--;
- }
-
- if (numReps == kRleModeRepSize)
- {
- for (; b > 0; b--)
- {
- crc.UpdateByte(prevByte);
- m_OutStream.WriteByte((Byte)prevByte);
- }
- numReps = 0;
- continue;
- }
- if (b != prevByte)
- numReps = 0;
- numReps++;
- prevByte = b;
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
- }
- while(--blockSize != 0);
- return crc.GetDigest();
-}
-
-
-CDecoder::CDecoder()
-{
- #ifndef _7ZIP_ST
- m_States = 0;
- m_NumThreadsPrev = 0;
- NumThreads = 1;
- #endif
- _needInStreamInit = true;
-}
-
-#ifndef _7ZIP_ST
-
-CDecoder::~CDecoder()
-{
- Free();
-}
-
-#define RINOK_THREAD(x) { WRes __result_ = (x); if(__result_ != 0) return __result_; }
-
-HRESULT CDecoder::Create()
-{
- RINOK_THREAD(CanProcessEvent.CreateIfNotCreated());
- RINOK_THREAD(CanStartWaitingEvent.CreateIfNotCreated());
- if (m_States != 0 && m_NumThreadsPrev == NumThreads)
- return S_OK;
- Free();
- MtMode = (NumThreads > 1);
- m_NumThreadsPrev = NumThreads;
- try
- {
- m_States = new CState[NumThreads];
- if (!m_States)
- return E_OUTOFMEMORY;
- }
- catch(...) { return E_OUTOFMEMORY; }
- for (UInt32 t = 0; t < NumThreads; t++)
- {
- CState &ti = m_States[t];
- ti.Decoder = this;
- if (MtMode)
- {
- HRESULT res = ti.Create();
- if (res != S_OK)
- {
- NumThreads = t;
- Free();
- return res;
- }
- }
- }
- return S_OK;
-}
-
-void CDecoder::Free()
-{
- if (!m_States)
- return;
- CloseThreads = true;
- CanProcessEvent.Set();
- for (UInt32 t = 0; t < NumThreads; t++)
- {
- CState &s = m_States[t];
- if (MtMode)
- s.Thread.Wait();
- s.Free();
- }
- delete []m_States;
- m_States = 0;
-}
-
-#endif
-
-HRESULT CDecoder::ReadSignatures(bool &wasFinished, UInt32 &crc)
-{
- wasFinished = false;
- Byte s[6];
- for (int i = 0; i < 6; i++)
- s[i] = ReadByte();
- crc = ReadCrc();
- if (s[0] == kFinSig0)
- {
- if (s[1] != kFinSig1 ||
- s[2] != kFinSig2 ||
- s[3] != kFinSig3 ||
- s[4] != kFinSig4 ||
- s[5] != kFinSig5)
- return S_FALSE;
-
- wasFinished = true;
- return (crc == CombinedCrc.GetDigest()) ? S_OK : S_FALSE;
- }
- if (s[0] != kBlockSig0 ||
- s[1] != kBlockSig1 ||
- s[2] != kBlockSig2 ||
- s[3] != kBlockSig3 ||
- s[4] != kBlockSig4 ||
- s[5] != kBlockSig5)
- return S_FALSE;
- CombinedCrc.Update(crc);
- return S_OK;
-}
-
-HRESULT CDecoder::DecodeFile(bool &isBZ, ICompressProgressInfo *progress)
-{
- Progress = progress;
- #ifndef _7ZIP_ST
- RINOK(Create());
- for (UInt32 t = 0; t < NumThreads; t++)
- {
- CState &s = m_States[t];
- if (!s.Alloc())
- return E_OUTOFMEMORY;
- if (MtMode)
- {
- RINOK(s.StreamWasFinishedEvent.Reset());
- RINOK(s.WaitingWasStartedEvent.Reset());
- RINOK(s.CanWriteEvent.Reset());
- }
- }
- #else
- if (!m_States[0].Alloc())
- return E_OUTOFMEMORY;
- #endif
-
- isBZ = false;
- Byte s[6];
- int i;
- for (i = 0; i < 4; i++)
- s[i] = ReadByte();
- if (s[0] != kArSig0 ||
- s[1] != kArSig1 ||
- s[2] != kArSig2 ||
- s[3] <= kArSig3 ||
- s[3] > kArSig3 + kBlockSizeMultMax)
- return S_OK;
- isBZ = true;
- UInt32 dicSize = (UInt32)(s[3] - kArSig3) * kBlockSizeStep;
-
- CombinedCrc.Init();
- #ifndef _7ZIP_ST
- if (MtMode)
- {
- NextBlockIndex = 0;
- StreamWasFinished1 = StreamWasFinished2 = false;
- CloseThreads = false;
- CanStartWaitingEvent.Reset();
- m_States[0].CanWriteEvent.Set();
- BlockSizeMax = dicSize;
- Result1 = Result2 = S_OK;
- CanProcessEvent.Set();
- UInt32 t;
- for (t = 0; t < NumThreads; t++)
- m_States[t].StreamWasFinishedEvent.Lock();
- CanProcessEvent.Reset();
- CanStartWaitingEvent.Set();
- for (t = 0; t < NumThreads; t++)
- m_States[t].WaitingWasStartedEvent.Lock();
- CanStartWaitingEvent.Reset();
- RINOK(Result2);
- RINOK(Result1);
- }
- else
- #endif
- {
- CState &state = m_States[0];
- for (;;)
- {
- RINOK(SetRatioProgress(m_InStream.GetProcessedSize()));
- bool wasFinished;
- UInt32 crc;
- RINOK(ReadSignatures(wasFinished, crc));
- if (wasFinished)
- return S_OK;
-
- UInt32 blockSize, origPtr;
- bool randMode;
- RINOK(ReadBlock(&m_InStream, state.Counters, dicSize,
- m_Selectors, m_HuffmanDecoders,
- &blockSize, &origPtr, &randMode));
- DecodeBlock1(state.Counters, blockSize);
- if ((randMode ?
- DecodeBlock2Rand(state.Counters + 256, blockSize, origPtr, m_OutStream) :
- DecodeBlock2(state.Counters + 256, blockSize, origPtr, m_OutStream)) != crc)
- return S_FALSE;
- }
- }
- return SetRatioProgress(m_InStream.GetProcessedSize());
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- bool &isBZ, ICompressProgressInfo *progress)
-{
- isBZ = false;
- try
- {
-
- if (!m_InStream.Create(kBufferSize))
- return E_OUTOFMEMORY;
- if (!m_OutStream.Create(kBufferSize))
- return E_OUTOFMEMORY;
-
- if (inStream)
- m_InStream.SetStream(inStream);
-
- CDecoderFlusher flusher(this, inStream != NULL);
-
- if (_needInStreamInit)
- {
- m_InStream.Init();
- _needInStreamInit = false;
- }
- _inStart = m_InStream.GetProcessedSize();
-
- m_InStream.AlignToByte();
-
- m_OutStream.SetStream(outStream);
- m_OutStream.Init();
-
- RINOK(DecodeFile(isBZ, progress));
- flusher.NeedFlush = false;
- return Flush();
-
- }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const COutBufferException &e) { return e.ErrorCode; }
- catch(...) { return E_FAIL; }
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- _needInStreamInit = true;
- bool isBZ;
- RINOK(CodeReal(inStream, outStream, isBZ, progress));
- return isBZ ? S_OK : S_FALSE;
-}
-
-HRESULT CDecoder::CodeResume(ISequentialOutStream *outStream, bool &isBZ, ICompressProgressInfo *progress)
-{
- return CodeReal(NULL, outStream, isBZ, progress);
-}
-
-STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) { m_InStream.SetStream(inStream); return S_OK; }
-STDMETHODIMP CDecoder::ReleaseInStream() { m_InStream.ReleaseStream(); return S_OK; }
-
-#ifndef _7ZIP_ST
-
-static THREAD_FUNC_DECL MFThread(void *p) { ((CState *)p)->ThreadFunc(); return 0; }
-
-HRESULT CState::Create()
-{
- RINOK_THREAD(StreamWasFinishedEvent.CreateIfNotCreated());
- RINOK_THREAD(WaitingWasStartedEvent.CreateIfNotCreated());
- RINOK_THREAD(CanWriteEvent.CreateIfNotCreated());
- RINOK_THREAD(Thread.Create(MFThread, this));
- return S_OK;
-}
-
-void CState::FinishStream()
-{
- Decoder->StreamWasFinished1 = true;
- StreamWasFinishedEvent.Set();
- Decoder->CS.Leave();
- Decoder->CanStartWaitingEvent.Lock();
- WaitingWasStartedEvent.Set();
-}
-
-void CState::ThreadFunc()
-{
- for (;;)
- {
- Decoder->CanProcessEvent.Lock();
- Decoder->CS.Enter();
- if (Decoder->CloseThreads)
- {
- Decoder->CS.Leave();
- return;
- }
- if (Decoder->StreamWasFinished1)
- {
- FinishStream();
- continue;
- }
- HRESULT res = S_OK;
-
- UInt32 blockIndex = Decoder->NextBlockIndex;
- UInt32 nextBlockIndex = blockIndex + 1;
- if (nextBlockIndex == Decoder->NumThreads)
- nextBlockIndex = 0;
- Decoder->NextBlockIndex = nextBlockIndex;
- UInt32 crc;
- UInt64 packSize = 0;
- UInt32 blockSize = 0, origPtr = 0;
- bool randMode = false;
-
- try
- {
- bool wasFinished;
- res = Decoder->ReadSignatures(wasFinished, crc);
- if (res != S_OK)
- {
- Decoder->Result1 = res;
- FinishStream();
- continue;
- }
- if (wasFinished)
- {
- Decoder->Result1 = res;
- FinishStream();
- continue;
- }
-
- res = ReadBlock(&Decoder->m_InStream, Counters, Decoder->BlockSizeMax,
- Decoder->m_Selectors, Decoder->m_HuffmanDecoders,
- &blockSize, &origPtr, &randMode);
- if (res != S_OK)
- {
- Decoder->Result1 = res;
- FinishStream();
- continue;
- }
- packSize = Decoder->m_InStream.GetProcessedSize();
- }
- catch(const CInBufferException &e) { res = e.ErrorCode; if (res != S_OK) res = E_FAIL; }
- catch(...) { res = E_FAIL; }
- if (res != S_OK)
- {
- Decoder->Result1 = res;
- FinishStream();
- continue;
- }
-
- Decoder->CS.Leave();
-
- DecodeBlock1(Counters, blockSize);
-
- bool needFinish = true;
- try
- {
- Decoder->m_States[blockIndex].CanWriteEvent.Lock();
- needFinish = Decoder->StreamWasFinished2;
- if (!needFinish)
- {
- if ((randMode ?
- DecodeBlock2Rand(Counters + 256, blockSize, origPtr, Decoder->m_OutStream) :
- DecodeBlock2(Counters + 256, blockSize, origPtr, Decoder->m_OutStream)) == crc)
- res = Decoder->SetRatioProgress(packSize);
- else
- res = S_FALSE;
- }
- }
- catch(const COutBufferException &e) { res = e.ErrorCode; if (res != S_OK) res = E_FAIL; }
- catch(...) { res = E_FAIL; }
- if (res != S_OK)
- {
- Decoder->Result2 = res;
- Decoder->StreamWasFinished2 = true;
- }
- Decoder->m_States[nextBlockIndex].CanWriteEvent.Set();
- if (res != S_OK || needFinish)
- {
- StreamWasFinishedEvent.Set();
- Decoder->CanStartWaitingEvent.Lock();
- WaitingWasStartedEvent.Set();
- }
- }
-}
-
-STDMETHODIMP CDecoder::SetNumberOfThreads(UInt32 numThreads)
-{
- NumThreads = numThreads;
- if (NumThreads < 1)
- NumThreads = 1;
- if (NumThreads > kNumThreadsMax)
- NumThreads = kNumThreadsMax;
- return S_OK;
-}
-
-#endif
-
-HRESULT CDecoder::SetRatioProgress(UInt64 packSize)
-{
- if (!Progress)
- return S_OK;
- packSize -= _inStart;
- UInt64 unpackSize = m_OutStream.GetProcessedSize();
- return Progress->SetRatioInfo(&packSize, &unpackSize);
-}
-
-
-// ---------- NSIS ----------
-
-enum
-{
- NSIS_STATE_INIT,
- NSIS_STATE_NEW_BLOCK,
- NSIS_STATE_DATA,
- NSIS_STATE_FINISHED,
- NSIS_STATE_ERROR
-};
-
-STDMETHODIMP CNsisDecoder::SetInStream(ISequentialInStream *inStream) { m_InStream.SetStream(inStream); return S_OK; }
-STDMETHODIMP CNsisDecoder::ReleaseInStream() { m_InStream.ReleaseStream(); return S_OK; }
-
-STDMETHODIMP CNsisDecoder::SetOutStreamSize(const UInt64 * /* outSize */)
-{
- _nsisState = NSIS_STATE_INIT;
- return S_OK;
-}
-
-STDMETHODIMP CNsisDecoder::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- try {
-
- *processedSize = 0;
- if (_nsisState == NSIS_STATE_FINISHED)
- return S_OK;
- if (_nsisState == NSIS_STATE_ERROR)
- return S_FALSE;
- if (size == 0)
- return S_OK;
-
- CState &state = m_State;
-
- if (_nsisState == NSIS_STATE_INIT)
- {
- if (!m_InStream.Create(kBufferSize))
- return E_OUTOFMEMORY;
- if (!state.Alloc())
- return E_OUTOFMEMORY;
- m_InStream.Init();
- _nsisState = NSIS_STATE_NEW_BLOCK;
- }
-
- if (_nsisState == NSIS_STATE_NEW_BLOCK)
- {
- Byte b = (Byte)m_InStream.ReadBits(8);
- if (b == kFinSig0)
- {
- _nsisState = NSIS_STATE_FINISHED;
- return S_OK;
- }
- if (b != kBlockSig0)
- {
- _nsisState = NSIS_STATE_ERROR;
- return S_FALSE;
- }
- UInt32 origPtr;
- RINOK(ReadBlock(&m_InStream, state.Counters, 9 * kBlockSizeStep,
- m_Selectors, m_HuffmanDecoders, &_blockSize, &origPtr, NULL));
- DecodeBlock1(state.Counters, _blockSize);
- const UInt32 *tt = state.Counters + 256;
- _tPos = tt[tt[origPtr] >> 8];
- _prevByte = (unsigned)(_tPos & 0xFF);
- _numReps = 0;
- _repRem = 0;
- _nsisState = NSIS_STATE_DATA;
- }
-
- UInt32 tPos = _tPos;
- unsigned prevByte = _prevByte;
- unsigned numReps = _numReps;
- UInt32 blockSize = _blockSize;
- const UInt32 *tt = state.Counters + 256;
-
- while (_repRem)
- {
- _repRem--;
- *(Byte *)data = (Byte)prevByte;
- data = (Byte *)data + 1;
- (*processedSize)++;
- if (--size == 0)
- return S_OK;
- }
-
- if (blockSize == 0)
- {
- _nsisState = NSIS_STATE_NEW_BLOCK;
- return S_OK;
- }
-
- do
- {
- unsigned b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
- blockSize--;
-
- if (numReps == kRleModeRepSize)
- {
- numReps = 0;
- while (b)
- {
- b--;
- *(Byte *)data = (Byte)prevByte;
- data = (Byte *)data + 1;
- (*processedSize)++;
- if (--size == 0)
- break;
- }
- _repRem = b;
- continue;
- }
- if (b != prevByte)
- numReps = 0;
- numReps++;
- prevByte = b;
- *(Byte *)data = (Byte)b;
- data = (Byte *)data + 1;
- (*processedSize)++;
- size--;
- }
- while (size && blockSize);
- _tPos = tPos;
- _prevByte = prevByte;
- _numReps = numReps;
- _blockSize = blockSize;
- return S_OK;
-
- }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Decoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Decoder.h
deleted file mode 100644
index e6dec1eaa..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Decoder.h
+++ /dev/null
@@ -1,205 +0,0 @@
-// Compress/BZip2Decoder.h
-
-#ifndef __COMPRESS_BZIP2_DECODER_H
-#define __COMPRESS_BZIP2_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#ifndef _7ZIP_ST
-#include "../../Windows/Synchronization.h"
-#include "../../Windows/Thread.h"
-#endif
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/OutBuffer.h"
-
-#include "BitmDecoder.h"
-#include "BZip2Const.h"
-#include "BZip2Crc.h"
-#include "HuffmanDecoder.h"
-
-namespace NCompress {
-namespace NBZip2 {
-
-typedef NCompress::NHuffman::CDecoder<kMaxHuffmanLen, kMaxAlphaSize> CHuffmanDecoder;
-
-class CDecoder;
-
-struct CState
-{
- UInt32 *Counters;
-
- #ifndef _7ZIP_ST
-
- CDecoder *Decoder;
- NWindows::CThread Thread;
- bool m_OptimizeNumTables;
-
- NWindows::NSynchronization::CAutoResetEvent StreamWasFinishedEvent;
- NWindows::NSynchronization::CAutoResetEvent WaitingWasStartedEvent;
-
- // it's not member of this thread. We just need one event per thread
- NWindows::NSynchronization::CAutoResetEvent CanWriteEvent;
-
- Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
-
- HRESULT Create();
- void FinishStream();
- void ThreadFunc();
-
- #endif
-
- CState(): Counters(0) {}
- ~CState() { Free(); }
- bool Alloc();
- void Free();
-};
-
-class CDecoder :
- public ICompressCoder,
- #ifndef _7ZIP_ST
- public ICompressSetCoderMt,
- #endif
- public CMyUnknownImp
-{
-public:
- COutBuffer m_OutStream;
- Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
- NBitm::CDecoder<CInBuffer> m_InStream;
- Byte m_Selectors[kNumSelectorsMax];
- CHuffmanDecoder m_HuffmanDecoders[kNumTablesMax];
- UInt64 _inStart;
-
-private:
-
- bool _needInStreamInit;
-
- UInt32 ReadBits(unsigned numBits);
- Byte ReadByte();
- bool ReadBit();
- UInt32 ReadCrc();
- HRESULT DecodeFile(bool &isBZ, ICompressProgressInfo *progress);
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- bool &isBZ, ICompressProgressInfo *progress);
- class CDecoderFlusher
- {
- CDecoder *_decoder;
- public:
- bool NeedFlush;
- bool ReleaseInStream;
- CDecoderFlusher(CDecoder *decoder, bool releaseInStream):
- _decoder(decoder),
- ReleaseInStream(releaseInStream),
- NeedFlush(true) {}
- ~CDecoderFlusher()
- {
- if (NeedFlush)
- _decoder->Flush();
- _decoder->ReleaseStreams(ReleaseInStream);
- }
- };
-
-public:
- CBZip2CombinedCrc CombinedCrc;
- ICompressProgressInfo *Progress;
-
- #ifndef _7ZIP_ST
- CState *m_States;
- UInt32 m_NumThreadsPrev;
-
- NWindows::NSynchronization::CManualResetEvent CanProcessEvent;
- NWindows::NSynchronization::CCriticalSection CS;
- UInt32 NumThreads;
- bool MtMode;
- UInt32 NextBlockIndex;
- bool CloseThreads;
- bool StreamWasFinished1;
- bool StreamWasFinished2;
- NWindows::NSynchronization::CManualResetEvent CanStartWaitingEvent;
-
- HRESULT Result1;
- HRESULT Result2;
-
- UInt32 BlockSizeMax;
- ~CDecoder();
- HRESULT Create();
- void Free();
-
- #else
- CState m_States[1];
- #endif
-
- CDecoder();
-
- HRESULT SetRatioProgress(UInt64 packSize);
- HRESULT ReadSignatures(bool &wasFinished, UInt32 &crc);
-
- HRESULT Flush() { return m_OutStream.Flush(); }
- void ReleaseStreams(bool releaseInStream)
- {
- if (releaseInStream)
- m_InStream.ReleaseStream();
- m_OutStream.ReleaseStream();
- }
-
- MY_QUERYINTERFACE_BEGIN2(ICompressCoder)
- #ifndef _7ZIP_ST
- MY_QUERYINTERFACE_ENTRY(ICompressSetCoderMt)
- #endif
-
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
-
- HRESULT CodeResume(ISequentialOutStream *outStream, bool &isBZ, ICompressProgressInfo *progress);
- UInt64 GetInputProcessedSize() const { return m_InStream.GetProcessedSize(); }
-
- #ifndef _7ZIP_ST
- STDMETHOD(SetNumberOfThreads)(UInt32 numThreads);
- #endif
-};
-
-
-class CNsisDecoder :
- public ISequentialInStream,
- public ICompressSetInStream,
- public ICompressSetOutStreamSize,
- public CMyUnknownImp
-{
- NBitm::CDecoder<CInBuffer> m_InStream;
- Byte m_Selectors[kNumSelectorsMax];
- CHuffmanDecoder m_HuffmanDecoders[kNumTablesMax];
- CState m_State;
-
- int _nsisState;
- UInt32 _tPos;
- unsigned _prevByte;
- unsigned _repRem;
- unsigned _numReps;
- UInt32 _blockSize;
-
-public:
-
- MY_QUERYINTERFACE_BEGIN2(ISequentialInStream)
- MY_QUERYINTERFACE_ENTRY(ICompressSetInStream)
- MY_QUERYINTERFACE_ENTRY(ICompressSetOutStreamSize)
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Encoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Encoder.cpp
deleted file mode 100644
index 1986aea63..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Encoder.cpp
+++ /dev/null
@@ -1,895 +0,0 @@
-// BZip2Encoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-#include "../../../C/BwtSort.h"
-#include "../../../C/HuffEnc.h"
-
-#include "BZip2Crc.h"
-#include "BZip2Encoder.h"
-#include "Mtf8.h"
-
-namespace NCompress {
-namespace NBZip2 {
-
-const int kMaxHuffmanLenForEncoding = 16; // it must be < kMaxHuffmanLen = 20
-
-static const UInt32 kBufferSize = (1 << 17);
-static const int kNumHuffPasses = 4;
-
-bool CThreadInfo::Alloc()
-{
- if (m_BlockSorterIndex == 0)
- {
- m_BlockSorterIndex = (UInt32 *)::BigAlloc(BLOCK_SORT_BUF_SIZE(kBlockSizeMax) * sizeof(UInt32));
- if (m_BlockSorterIndex == 0)
- return false;
- }
-
- if (m_Block == 0)
- {
- m_Block = (Byte *)::MidAlloc(kBlockSizeMax * 5 + kBlockSizeMax / 10 + (20 << 10));
- if (m_Block == 0)
- return false;
- m_MtfArray = m_Block + kBlockSizeMax;
- m_TempArray = m_MtfArray + kBlockSizeMax * 2 + 2;
- }
- return true;
-}
-
-void CThreadInfo::Free()
-{
- ::BigFree(m_BlockSorterIndex);
- m_BlockSorterIndex = 0;
- ::MidFree(m_Block);
- m_Block = 0;
-}
-
-#ifndef _7ZIP_ST
-
-static THREAD_FUNC_DECL MFThread(void *threadCoderInfo)
-{
- return ((CThreadInfo *)threadCoderInfo)->ThreadFunc();
-}
-
-#define RINOK_THREAD(x) { WRes __result_ = (x); if(__result_ != 0) return __result_; }
-
-HRESULT CThreadInfo::Create()
-{
- RINOK_THREAD(StreamWasFinishedEvent.Create());
- RINOK_THREAD(WaitingWasStartedEvent.Create());
- RINOK_THREAD(CanWriteEvent.Create());
- RINOK_THREAD(Thread.Create(MFThread, this));
- return S_OK;
-}
-
-void CThreadInfo::FinishStream(bool needLeave)
-{
- Encoder->StreamWasFinished = true;
- StreamWasFinishedEvent.Set();
- if (needLeave)
- Encoder->CS.Leave();
- Encoder->CanStartWaitingEvent.Lock();
- WaitingWasStartedEvent.Set();
-}
-
-DWORD CThreadInfo::ThreadFunc()
-{
- for (;;)
- {
- Encoder->CanProcessEvent.Lock();
- Encoder->CS.Enter();
- if (Encoder->CloseThreads)
- {
- Encoder->CS.Leave();
- return 0;
- }
- if (Encoder->StreamWasFinished)
- {
- FinishStream(true);
- continue;
- }
- HRESULT res = S_OK;
- bool needLeave = true;
- try
- {
- UInt32 blockSize = Encoder->ReadRleBlock(m_Block);
- m_PackSize = Encoder->m_InStream.GetProcessedSize();
- m_BlockIndex = Encoder->NextBlockIndex;
- if (++Encoder->NextBlockIndex == Encoder->NumThreads)
- Encoder->NextBlockIndex = 0;
- if (blockSize == 0)
- {
- FinishStream(true);
- continue;
- }
- Encoder->CS.Leave();
- needLeave = false;
- res = EncodeBlock3(blockSize);
- }
- catch(const CInBufferException &e) { res = e.ErrorCode; }
- catch(const COutBufferException &e) { res = e.ErrorCode; }
- catch(...) { res = E_FAIL; }
- if (res != S_OK)
- {
- Encoder->Result = res;
- FinishStream(needLeave);
- continue;
- }
- }
-}
-
-#endif
-
-CEncoder::CEncoder():
- NumPasses(1),
- m_OptimizeNumTables(false),
- m_BlockSizeMult(kBlockSizeMultMax)
-{
- #ifndef _7ZIP_ST
- ThreadsInfo = 0;
- m_NumThreadsPrev = 0;
- NumThreads = 1;
- #endif
-}
-
-#ifndef _7ZIP_ST
-CEncoder::~CEncoder()
-{
- Free();
-}
-
-HRESULT CEncoder::Create()
-{
- RINOK_THREAD(CanProcessEvent.CreateIfNotCreated());
- RINOK_THREAD(CanStartWaitingEvent.CreateIfNotCreated());
- if (ThreadsInfo != 0 && m_NumThreadsPrev == NumThreads)
- return S_OK;
- try
- {
- Free();
- MtMode = (NumThreads > 1);
- m_NumThreadsPrev = NumThreads;
- ThreadsInfo = new CThreadInfo[NumThreads];
- if (ThreadsInfo == 0)
- return E_OUTOFMEMORY;
- }
- catch(...) { return E_OUTOFMEMORY; }
- for (UInt32 t = 0; t < NumThreads; t++)
- {
- CThreadInfo &ti = ThreadsInfo[t];
- ti.Encoder = this;
- if (MtMode)
- {
- HRESULT res = ti.Create();
- if (res != S_OK)
- {
- NumThreads = t;
- Free();
- return res;
- }
- }
- }
- return S_OK;
-}
-
-void CEncoder::Free()
-{
- if (!ThreadsInfo)
- return;
- CloseThreads = true;
- CanProcessEvent.Set();
- for (UInt32 t = 0; t < NumThreads; t++)
- {
- CThreadInfo &ti = ThreadsInfo[t];
- if (MtMode)
- ti.Thread.Wait();
- ti.Free();
- }
- delete []ThreadsInfo;
- ThreadsInfo = 0;
-}
-#endif
-
-UInt32 CEncoder::ReadRleBlock(Byte *buffer)
-{
- UInt32 i = 0;
- Byte prevByte;
- if (m_InStream.ReadByte(prevByte))
- {
- UInt32 blockSize = m_BlockSizeMult * kBlockSizeStep - 1;
- int numReps = 1;
- buffer[i++] = prevByte;
- while (i < blockSize) // "- 1" to support RLE
- {
- Byte b;
- if (!m_InStream.ReadByte(b))
- break;
- if (b != prevByte)
- {
- if (numReps >= kRleModeRepSize)
- buffer[i++] = (Byte)(numReps - kRleModeRepSize);
- buffer[i++] = b;
- numReps = 1;
- prevByte = b;
- continue;
- }
- numReps++;
- if (numReps <= kRleModeRepSize)
- buffer[i++] = b;
- else if (numReps == kRleModeRepSize + 255)
- {
- buffer[i++] = (Byte)(numReps - kRleModeRepSize);
- numReps = 0;
- }
- }
- // it's to support original BZip2 decoder
- if (numReps >= kRleModeRepSize)
- buffer[i++] = (Byte)(numReps - kRleModeRepSize);
- }
- return i;
-}
-
-void CThreadInfo::WriteBits2(UInt32 value, UInt32 numBits)
- { m_OutStreamCurrent->WriteBits(value, numBits); }
-void CThreadInfo::WriteByte2(Byte b) { WriteBits2(b , 8); }
-void CThreadInfo::WriteBit2(bool v) { WriteBits2((v ? 1 : 0), 1); }
-void CThreadInfo::WriteCrc2(UInt32 v)
-{
- for (int i = 0; i < 4; i++)
- WriteByte2(((Byte)(v >> (24 - i * 8))));
-}
-
-void CEncoder::WriteBits(UInt32 value, UInt32 numBits)
- { m_OutStream.WriteBits(value, numBits); }
-void CEncoder::WriteByte(Byte b) { WriteBits(b , 8); }
-void CEncoder::WriteBit(bool v) { WriteBits((v ? 1 : 0), 1); }
-void CEncoder::WriteCrc(UInt32 v)
-{
- for (int i = 0; i < 4; i++)
- WriteByte(((Byte)(v >> (24 - i * 8))));
-}
-
-
-// blockSize > 0
-void CThreadInfo::EncodeBlock(const Byte *block, UInt32 blockSize)
-{
- WriteBit2(false); // Randomised = false
-
- {
- UInt32 origPtr = BlockSort(m_BlockSorterIndex, block, blockSize);
- // if (m_BlockSorterIndex[origPtr] != 0) throw 1;
- m_BlockSorterIndex[origPtr] = blockSize;
- WriteBits2(origPtr, kNumOrigBits);
- }
-
- CMtf8Encoder mtf;
- int numInUse = 0;
- {
- bool inUse[256];
- bool inUse16[16];
- UInt32 i;
- for (i = 0; i < 256; i++)
- inUse[i] = false;
- for (i = 0; i < 16; i++)
- inUse16[i] = false;
- for (i = 0; i < blockSize; i++)
- inUse[block[i]] = true;
- for (i = 0; i < 256; i++)
- if (inUse[i])
- {
- inUse16[i >> 4] = true;
- mtf.Buf[numInUse++] = (Byte)i;
- }
- for (i = 0; i < 16; i++)
- WriteBit2(inUse16[i]);
- for (i = 0; i < 256; i++)
- if (inUse16[i >> 4])
- WriteBit2(inUse[i]);
- }
- int alphaSize = numInUse + 2;
-
- Byte *mtfs = m_MtfArray;
- UInt32 mtfArraySize = 0;
- UInt32 symbolCounts[kMaxAlphaSize];
- {
- for (int i = 0; i < kMaxAlphaSize; i++)
- symbolCounts[i] = 0;
- }
-
- {
- UInt32 rleSize = 0;
- UInt32 i = 0;
- const UInt32 *bsIndex = m_BlockSorterIndex;
- block--;
- do
- {
- int pos = mtf.FindAndMove(block[bsIndex[i]]);
- if (pos == 0)
- rleSize++;
- else
- {
- while (rleSize != 0)
- {
- rleSize--;
- mtfs[mtfArraySize++] = (Byte)(rleSize & 1);
- symbolCounts[rleSize & 1]++;
- rleSize >>= 1;
- }
- if (pos >= 0xFE)
- {
- mtfs[mtfArraySize++] = 0xFF;
- mtfs[mtfArraySize++] = (Byte)(pos - 0xFE);
- }
- else
- mtfs[mtfArraySize++] = (Byte)(pos + 1);
- symbolCounts[pos + 1]++;
- }
- }
- while (++i < blockSize);
-
- while (rleSize != 0)
- {
- rleSize--;
- mtfs[mtfArraySize++] = (Byte)(rleSize & 1);
- symbolCounts[rleSize & 1]++;
- rleSize >>= 1;
- }
-
- if (alphaSize < 256)
- mtfs[mtfArraySize++] = (Byte)(alphaSize - 1);
- else
- {
- mtfs[mtfArraySize++] = 0xFF;
- mtfs[mtfArraySize++] = (Byte)(alphaSize - 256);
- }
- symbolCounts[alphaSize - 1]++;
- }
-
- UInt32 numSymbols = 0;
- {
- for (int i = 0; i < kMaxAlphaSize; i++)
- numSymbols += symbolCounts[i];
- }
-
- int bestNumTables = kNumTablesMin;
- UInt32 bestPrice = 0xFFFFFFFF;
- UInt32 startPos = m_OutStreamCurrent->GetPos();
- Byte startCurByte = m_OutStreamCurrent->GetCurByte();
- for (int nt = kNumTablesMin; nt <= kNumTablesMax + 1; nt++)
- {
- int numTables;
-
- if(m_OptimizeNumTables)
- {
- m_OutStreamCurrent->SetPos(startPos);
- m_OutStreamCurrent->SetCurState((startPos & 7), startCurByte);
- if (nt <= kNumTablesMax)
- numTables = nt;
- else
- numTables = bestNumTables;
- }
- else
- {
- if (numSymbols < 200) numTables = 2;
- else if (numSymbols < 600) numTables = 3;
- else if (numSymbols < 1200) numTables = 4;
- else if (numSymbols < 2400) numTables = 5;
- else numTables = 6;
- }
-
- WriteBits2(numTables, kNumTablesBits);
-
- UInt32 numSelectors = (numSymbols + kGroupSize - 1) / kGroupSize;
- WriteBits2(numSelectors, kNumSelectorsBits);
-
- {
- UInt32 remFreq = numSymbols;
- int gs = 0;
- int t = numTables;
- do
- {
- UInt32 tFreq = remFreq / t;
- int ge = gs;
- UInt32 aFreq = 0;
- while (aFreq < tFreq) // && ge < alphaSize)
- aFreq += symbolCounts[ge++];
-
- if (ge - 1 > gs && t != numTables && t != 1 && (((numTables - t) & 1) == 1))
- aFreq -= symbolCounts[--ge];
-
- Byte *lens = Lens[t - 1];
- int i = 0;
- do
- lens[i] = (i >= gs && i < ge) ? 0 : 1;
- while (++i < alphaSize);
- gs = ge;
- remFreq -= aFreq;
- }
- while(--t != 0);
- }
-
-
- for (int pass = 0; pass < kNumHuffPasses; pass++)
- {
- {
- int t = 0;
- do
- memset(Freqs[t], 0, sizeof(Freqs[t]));
- while(++t < numTables);
- }
-
- {
- UInt32 mtfPos = 0;
- UInt32 g = 0;
- do
- {
- UInt32 symbols[kGroupSize];
- int i = 0;
- do
- {
- UInt32 symbol = mtfs[mtfPos++];
- if (symbol >= 0xFF)
- symbol += mtfs[mtfPos++];
- symbols[i] = symbol;
- }
- while (++i < kGroupSize && mtfPos < mtfArraySize);
-
- UInt32 bestPrice = 0xFFFFFFFF;
- int t = 0;
- do
- {
- const Byte *lens = Lens[t];
- UInt32 price = 0;
- int j = 0;
- do
- price += lens[symbols[j]];
- while (++j < i);
- if (price < bestPrice)
- {
- m_Selectors[g] = (Byte)t;
- bestPrice = price;
- }
- }
- while(++t < numTables);
- UInt32 *freqs = Freqs[m_Selectors[g++]];
- int j = 0;
- do
- freqs[symbols[j]]++;
- while (++j < i);
- }
- while (mtfPos < mtfArraySize);
- }
-
- int t = 0;
- do
- {
- UInt32 *freqs = Freqs[t];
- int i = 0;
- do
- if (freqs[i] == 0)
- freqs[i] = 1;
- while(++i < alphaSize);
- Huffman_Generate(freqs, Codes[t], Lens[t], kMaxAlphaSize, kMaxHuffmanLenForEncoding);
- }
- while(++t < numTables);
- }
-
- {
- Byte mtfSel[kNumTablesMax];
- {
- int t = 0;
- do
- mtfSel[t] = (Byte)t;
- while(++t < numTables);
- }
-
- UInt32 i = 0;
- do
- {
- Byte sel = m_Selectors[i];
- int pos;
- for (pos = 0; mtfSel[pos] != sel; pos++)
- WriteBit2(true);
- WriteBit2(false);
- for (; pos > 0; pos--)
- mtfSel[pos] = mtfSel[pos - 1];
- mtfSel[0] = sel;
- }
- while(++i < numSelectors);
- }
-
- {
- int t = 0;
- do
- {
- const Byte *lens = Lens[t];
- UInt32 len = lens[0];
- WriteBits2(len, kNumLevelsBits);
- int i = 0;
- do
- {
- UInt32 level = lens[i];
- while (len != level)
- {
- WriteBit2(true);
- if (len < level)
- {
- WriteBit2(false);
- len++;
- }
- else
- {
- WriteBit2(true);
- len--;
- }
- }
- WriteBit2(false);
- }
- while (++i < alphaSize);
- }
- while(++t < numTables);
- }
-
- {
- UInt32 groupSize = 0;
- UInt32 groupIndex = 0;
- const Byte *lens = 0;
- const UInt32 *codes = 0;
- UInt32 mtfPos = 0;
- do
- {
- UInt32 symbol = mtfs[mtfPos++];
- if (symbol >= 0xFF)
- symbol += mtfs[mtfPos++];
- if (groupSize == 0)
- {
- groupSize = kGroupSize;
- int t = m_Selectors[groupIndex++];
- lens = Lens[t];
- codes = Codes[t];
- }
- groupSize--;
- m_OutStreamCurrent->WriteBits(codes[symbol], lens[symbol]);
- }
- while (mtfPos < mtfArraySize);
- }
-
- if (!m_OptimizeNumTables)
- break;
- UInt32 price = m_OutStreamCurrent->GetPos() - startPos;
- if (price <= bestPrice)
- {
- if (nt == kNumTablesMax)
- break;
- bestPrice = price;
- bestNumTables = nt;
- }
- }
-}
-
-// blockSize > 0
-UInt32 CThreadInfo::EncodeBlockWithHeaders(const Byte *block, UInt32 blockSize)
-{
- WriteByte2(kBlockSig0);
- WriteByte2(kBlockSig1);
- WriteByte2(kBlockSig2);
- WriteByte2(kBlockSig3);
- WriteByte2(kBlockSig4);
- WriteByte2(kBlockSig5);
-
- CBZip2Crc crc;
- int numReps = 0;
- Byte prevByte = block[0];
- UInt32 i = 0;
- do
- {
- Byte b = block[i];
- if (numReps == kRleModeRepSize)
- {
- for (; b > 0; b--)
- crc.UpdateByte(prevByte);
- numReps = 0;
- continue;
- }
- if (prevByte == b)
- numReps++;
- else
- {
- numReps = 1;
- prevByte = b;
- }
- crc.UpdateByte(b);
- }
- while (++i < blockSize);
- UInt32 crcRes = crc.GetDigest();
- WriteCrc2(crcRes);
- EncodeBlock(block, blockSize);
- return crcRes;
-}
-
-void CThreadInfo::EncodeBlock2(const Byte *block, UInt32 blockSize, UInt32 numPasses)
-{
- UInt32 numCrcs = m_NumCrcs;
- bool needCompare = false;
-
- UInt32 startBytePos = m_OutStreamCurrent->GetBytePos();
- UInt32 startPos = m_OutStreamCurrent->GetPos();
- Byte startCurByte = m_OutStreamCurrent->GetCurByte();
- Byte endCurByte = 0;
- UInt32 endPos = 0;
- if (numPasses > 1 && blockSize >= (1 << 10))
- {
- UInt32 blockSize0 = blockSize / 2;
- for (;(block[blockSize0] == block[blockSize0 - 1] ||
- block[blockSize0 - 1] == block[blockSize0 - 2]) &&
- blockSize0 < blockSize; blockSize0++) {}
- if (blockSize0 < blockSize)
- {
- EncodeBlock2(block, blockSize0, numPasses - 1);
- EncodeBlock2(block + blockSize0, blockSize - blockSize0, numPasses - 1);
- endPos = m_OutStreamCurrent->GetPos();
- endCurByte = m_OutStreamCurrent->GetCurByte();
- if ((endPos & 7) > 0)
- WriteBits2(0, 8 - (endPos & 7));
- m_OutStreamCurrent->SetCurState((startPos & 7), startCurByte);
- needCompare = true;
- }
- }
-
- UInt32 startBytePos2 = m_OutStreamCurrent->GetBytePos();
- UInt32 startPos2 = m_OutStreamCurrent->GetPos();
- UInt32 crcVal = EncodeBlockWithHeaders(block, blockSize);
- UInt32 endPos2 = m_OutStreamCurrent->GetPos();
-
- if (needCompare)
- {
- UInt32 size2 = endPos2 - startPos2;
- if (size2 < endPos - startPos)
- {
- UInt32 numBytes = m_OutStreamCurrent->GetBytePos() - startBytePos2;
- Byte *buffer = m_OutStreamCurrent->GetStream();
- for (UInt32 i = 0; i < numBytes; i++)
- buffer[startBytePos + i] = buffer[startBytePos2 + i];
- m_OutStreamCurrent->SetPos(startPos + endPos2 - startPos2);
- m_NumCrcs = numCrcs;
- m_CRCs[m_NumCrcs++] = crcVal;
- }
- else
- {
- m_OutStreamCurrent->SetPos(endPos);
- m_OutStreamCurrent->SetCurState((endPos & 7), endCurByte);
- }
- }
- else
- {
- m_NumCrcs = numCrcs;
- m_CRCs[m_NumCrcs++] = crcVal;
- }
-}
-
-HRESULT CThreadInfo::EncodeBlock3(UInt32 blockSize)
-{
- CMsbfEncoderTemp outStreamTemp;
- outStreamTemp.SetStream(m_TempArray);
- outStreamTemp.Init();
- m_OutStreamCurrent = &outStreamTemp;
-
- m_NumCrcs = 0;
-
- EncodeBlock2(m_Block, blockSize, Encoder->NumPasses);
-
- #ifndef _7ZIP_ST
- if (Encoder->MtMode)
- Encoder->ThreadsInfo[m_BlockIndex].CanWriteEvent.Lock();
- #endif
- for (UInt32 i = 0; i < m_NumCrcs; i++)
- Encoder->CombinedCrc.Update(m_CRCs[i]);
- Encoder->WriteBytes(m_TempArray, outStreamTemp.GetPos(), outStreamTemp.GetCurByte());
- HRESULT res = S_OK;
- #ifndef _7ZIP_ST
- if (Encoder->MtMode)
- {
- UInt32 blockIndex = m_BlockIndex + 1;
- if (blockIndex == Encoder->NumThreads)
- blockIndex = 0;
-
- if (Encoder->Progress)
- {
- UInt64 unpackSize = Encoder->m_OutStream.GetProcessedSize();
- res = Encoder->Progress->SetRatioInfo(&m_PackSize, &unpackSize);
- }
-
- Encoder->ThreadsInfo[blockIndex].CanWriteEvent.Set();
- }
- #endif
- return res;
-}
-
-void CEncoder::WriteBytes(const Byte *data, UInt32 sizeInBits, Byte lastByte)
-{
- UInt32 bytesSize = (sizeInBits / 8);
- for (UInt32 i = 0; i < bytesSize; i++)
- m_OutStream.WriteBits(data[i], 8);
- WriteBits(lastByte, (sizeInBits & 7));
-}
-
-
-HRESULT CEncoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- #ifndef _7ZIP_ST
- Progress = progress;
- RINOK(Create());
- for (UInt32 t = 0; t < NumThreads; t++)
- #endif
- {
- #ifndef _7ZIP_ST
- CThreadInfo &ti = ThreadsInfo[t];
- if (MtMode)
- {
- RINOK(ti.StreamWasFinishedEvent.Reset());
- RINOK(ti.WaitingWasStartedEvent.Reset());
- RINOK(ti.CanWriteEvent.Reset());
- }
- #else
- CThreadInfo &ti = ThreadsInfo;
- ti.Encoder = this;
- #endif
-
- ti.m_OptimizeNumTables = m_OptimizeNumTables;
-
- if (!ti.Alloc())
- return E_OUTOFMEMORY;
- }
-
-
- if (!m_InStream.Create(kBufferSize))
- return E_OUTOFMEMORY;
- if (!m_OutStream.Create(kBufferSize))
- return E_OUTOFMEMORY;
-
-
- m_InStream.SetStream(inStream);
- m_InStream.Init();
-
- m_OutStream.SetStream(outStream);
- m_OutStream.Init();
-
- CFlusher flusher(this);
-
- CombinedCrc.Init();
- #ifndef _7ZIP_ST
- NextBlockIndex = 0;
- StreamWasFinished = false;
- CloseThreads = false;
- CanStartWaitingEvent.Reset();
- #endif
-
- WriteByte(kArSig0);
- WriteByte(kArSig1);
- WriteByte(kArSig2);
- WriteByte((Byte)(kArSig3 + m_BlockSizeMult));
-
- #ifndef _7ZIP_ST
-
- if (MtMode)
- {
- ThreadsInfo[0].CanWriteEvent.Set();
- Result = S_OK;
- CanProcessEvent.Set();
- UInt32 t;
- for (t = 0; t < NumThreads; t++)
- ThreadsInfo[t].StreamWasFinishedEvent.Lock();
- CanProcessEvent.Reset();
- CanStartWaitingEvent.Set();
- for (t = 0; t < NumThreads; t++)
- ThreadsInfo[t].WaitingWasStartedEvent.Lock();
- CanStartWaitingEvent.Reset();
- RINOK(Result);
- }
- else
- #endif
- {
- for (;;)
- {
- CThreadInfo &ti =
- #ifndef _7ZIP_ST
- ThreadsInfo[0];
- #else
- ThreadsInfo;
- #endif
- UInt32 blockSize = ReadRleBlock(ti.m_Block);
- if (blockSize == 0)
- break;
- RINOK(ti.EncodeBlock3(blockSize));
- if (progress)
- {
- UInt64 packSize = m_InStream.GetProcessedSize();
- UInt64 unpackSize = m_OutStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &unpackSize));
- }
- }
- }
- WriteByte(kFinSig0);
- WriteByte(kFinSig1);
- WriteByte(kFinSig2);
- WriteByte(kFinSig3);
- WriteByte(kFinSig4);
- WriteByte(kFinSig5);
-
- WriteCrc(CombinedCrc.GetDigest());
- return Flush();
-}
-
-STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const COutBufferException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-HRESULT CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
-{
- for(UInt32 i = 0; i < numProps; i++)
- {
- const PROPVARIANT &prop = props[i];
- switch(propIDs[i])
- {
- case NCoderPropID::kNumPasses:
- {
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- UInt32 numPasses = prop.ulVal;
- if (numPasses == 0)
- numPasses = 1;
- if (numPasses > kNumPassesMax)
- numPasses = kNumPassesMax;
- NumPasses = numPasses;
- m_OptimizeNumTables = (NumPasses > 1);
- break;
- }
- case NCoderPropID::kDictionarySize:
- {
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- UInt32 dictionary = prop.ulVal / kBlockSizeStep;
- if (dictionary < kBlockSizeMultMin)
- dictionary = kBlockSizeMultMin;
- else if (dictionary > kBlockSizeMultMax)
- dictionary = kBlockSizeMultMax;
- m_BlockSizeMult = dictionary;
- break;
- }
- case NCoderPropID::kNumThreads:
- {
- #ifndef _7ZIP_ST
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- NumThreads = prop.ulVal;
- if (NumThreads < 1)
- NumThreads = 1;
- #endif
- break;
- }
- default:
- return E_INVALIDARG;
- }
- }
- return S_OK;
-}
-
-#ifndef _7ZIP_ST
-STDMETHODIMP CEncoder::SetNumberOfThreads(UInt32 numThreads)
-{
- NumThreads = numThreads;
- if (NumThreads < 1)
- NumThreads = 1;
- return S_OK;
-}
-#endif
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Encoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Encoder.h
deleted file mode 100644
index a863172fe..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Encoder.h
+++ /dev/null
@@ -1,245 +0,0 @@
-// BZip2Encoder.h
-
-#ifndef __COMPRESS_BZIP2_ENCODER_H
-#define __COMPRESS_BZIP2_ENCODER_H
-
-#include "../../Common/Defs.h"
-#include "../../Common/MyCom.h"
-
-#ifndef _7ZIP_ST
-#include "../../Windows/Synchronization.h"
-#include "../../Windows/Thread.h"
-#endif
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/OutBuffer.h"
-
-#include "BitmEncoder.h"
-#include "BZip2Const.h"
-#include "BZip2Crc.h"
-
-namespace NCompress {
-namespace NBZip2 {
-
-class CMsbfEncoderTemp
-{
- UInt32 m_Pos;
- int m_BitPos;
- Byte m_CurByte;
- Byte *Buffer;
-public:
- void SetStream(Byte *buffer) { Buffer = buffer; }
- Byte *GetStream() const { return Buffer; }
-
- void Init()
- {
- m_Pos = 0;
- m_BitPos = 8;
- m_CurByte = 0;
- }
-
- void Flush()
- {
- if (m_BitPos < 8)
- WriteBits(0, m_BitPos);
- }
-
- void WriteBits(UInt32 value, int numBits)
- {
- while (numBits > 0)
- {
- int numNewBits = MyMin(numBits, m_BitPos);
- numBits -= numNewBits;
-
- m_CurByte <<= numNewBits;
- UInt32 newBits = value >> numBits;
- m_CurByte |= Byte(newBits);
- value -= (newBits << numBits);
-
- m_BitPos -= numNewBits;
-
- if (m_BitPos == 0)
- {
- Buffer[m_Pos++] = m_CurByte;
- m_BitPos = 8;
- }
- }
- }
-
- UInt32 GetBytePos() const { return m_Pos ; }
- UInt32 GetPos() const { return m_Pos * 8 + (8 - m_BitPos); }
- Byte GetCurByte() const { return m_CurByte; }
- void SetPos(UInt32 bitPos)
- {
- m_Pos = bitPos / 8;
- m_BitPos = 8 - ((int)bitPos & 7);
- }
- void SetCurState(int bitPos, Byte curByte)
- {
- m_BitPos = 8 - bitPos;
- m_CurByte = curByte;
- }
-};
-
-class CEncoder;
-
-const int kNumPassesMax = 10;
-
-class CThreadInfo
-{
-public:
- Byte *m_Block;
-private:
- Byte *m_MtfArray;
- Byte *m_TempArray;
- UInt32 *m_BlockSorterIndex;
-
- CMsbfEncoderTemp *m_OutStreamCurrent;
-
- Byte Lens[kNumTablesMax][kMaxAlphaSize];
- UInt32 Freqs[kNumTablesMax][kMaxAlphaSize];
- UInt32 Codes[kNumTablesMax][kMaxAlphaSize];
-
- Byte m_Selectors[kNumSelectorsMax];
-
- UInt32 m_CRCs[1 << kNumPassesMax];
- UInt32 m_NumCrcs;
-
- UInt32 m_BlockIndex;
-
- void WriteBits2(UInt32 value, UInt32 numBits);
- void WriteByte2(Byte b);
- void WriteBit2(bool v);
- void WriteCrc2(UInt32 v);
-
- void EncodeBlock(const Byte *block, UInt32 blockSize);
- UInt32 EncodeBlockWithHeaders(const Byte *block, UInt32 blockSize);
- void EncodeBlock2(const Byte *block, UInt32 blockSize, UInt32 numPasses);
-public:
- bool m_OptimizeNumTables;
- CEncoder *Encoder;
- #ifndef _7ZIP_ST
- NWindows::CThread Thread;
-
- NWindows::NSynchronization::CAutoResetEvent StreamWasFinishedEvent;
- NWindows::NSynchronization::CAutoResetEvent WaitingWasStartedEvent;
-
- // it's not member of this thread. We just need one event per thread
- NWindows::NSynchronization::CAutoResetEvent CanWriteEvent;
-
- UInt64 m_PackSize;
-
- Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
- HRESULT Create();
- void FinishStream(bool needLeave);
- DWORD ThreadFunc();
- #endif
-
- CThreadInfo(): m_BlockSorterIndex(0), m_Block(0) {}
- ~CThreadInfo() { Free(); }
- bool Alloc();
- void Free();
-
- HRESULT EncodeBlock3(UInt32 blockSize);
-};
-
-class CEncoder :
- public ICompressCoder,
- public ICompressSetCoderProperties,
- #ifndef _7ZIP_ST
- public ICompressSetCoderMt,
- #endif
- public CMyUnknownImp
-{
- UInt32 m_BlockSizeMult;
- bool m_OptimizeNumTables;
-
- UInt32 m_NumPassesPrev;
-
- UInt32 m_NumThreadsPrev;
-public:
- CInBuffer m_InStream;
- Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
- CBitmEncoder<COutBuffer> m_OutStream;
- UInt32 NumPasses;
- CBZip2CombinedCrc CombinedCrc;
-
- #ifndef _7ZIP_ST
- CThreadInfo *ThreadsInfo;
- NWindows::NSynchronization::CManualResetEvent CanProcessEvent;
- NWindows::NSynchronization::CCriticalSection CS;
- UInt32 NumThreads;
- bool MtMode;
- UInt32 NextBlockIndex;
-
- bool CloseThreads;
- bool StreamWasFinished;
- NWindows::NSynchronization::CManualResetEvent CanStartWaitingEvent;
-
- HRESULT Result;
- ICompressProgressInfo *Progress;
- #else
- CThreadInfo ThreadsInfo;
- #endif
-
- UInt32 ReadRleBlock(Byte *buffer);
- void WriteBytes(const Byte *data, UInt32 sizeInBits, Byte lastByte);
-
- void WriteBits(UInt32 value, UInt32 numBits);
- void WriteByte(Byte b);
- void WriteBit(bool v);
- void WriteCrc(UInt32 v);
-
- #ifndef _7ZIP_ST
- HRESULT Create();
- void Free();
- #endif
-
-public:
- CEncoder();
- #ifndef _7ZIP_ST
- ~CEncoder();
- #endif
-
- HRESULT Flush() { return m_OutStream.Flush(); }
-
- void ReleaseStreams()
- {
- m_InStream.ReleaseStream();
- m_OutStream.ReleaseStream();
- }
-
- class CFlusher
- {
- CEncoder *_coder;
- public:
- CFlusher(CEncoder *coder): _coder(coder) {}
- ~CFlusher()
- {
- _coder->ReleaseStreams();
- }
- };
-
- #ifndef _7ZIP_ST
- MY_UNKNOWN_IMP2(ICompressSetCoderMt, ICompressSetCoderProperties)
- #else
- MY_UNKNOWN_IMP1(ICompressSetCoderProperties)
- #endif
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
-
- #ifndef _7ZIP_ST
- STDMETHOD(SetNumberOfThreads)(UInt32 numThreads);
- #endif
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Register.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Register.cpp
deleted file mode 100644
index ef14204b0..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BZip2Register.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// BZip2Register.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "BZip2Decoder.h"
-
-static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NBZip2::CDecoder); }
-#if !defined(EXTRACT_ONLY) && !defined(BZIP2_EXTRACT_ONLY)
-#include "BZip2Encoder.h"
-static void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NBZip2::CEncoder); }
-#else
-#define CreateCodecOut 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodec, CreateCodecOut, 0x040202, L"BZip2", 1, false };
-
-REGISTER_CODEC(BZip2)
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BitlDecoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/BitlDecoder.cpp
deleted file mode 100644
index 78665be8f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BitlDecoder.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-// BitlDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "BitlDecoder.h"
-
-namespace NBitl {
-
-Byte kInvertTable[256];
-
-struct CInverterTableInitializer
-{
- CInverterTableInitializer()
- {
- for (int i = 0; i < 256; i++)
- {
- int x = ((i & 0x55) << 1) | ((i & 0xAA) >> 1);
- x = ((x & 0x33) << 2) | ((x & 0xCC) >> 2);
- kInvertTable[i] = (Byte)(((x & 0x0F) << 4) | ((x & 0xF0) >> 4));
- }
- }
-} g_InverterTableInitializer;
-
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BitlDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/BitlDecoder.h
deleted file mode 100644
index ff373bac6..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BitlDecoder.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// BitlDecoder.h -- the Least Significant Bit of byte is First
-
-#ifndef __BITL_DECODER_H
-#define __BITL_DECODER_H
-
-#include "../IStream.h"
-
-namespace NBitl {
-
-const unsigned kNumBigValueBits = 8 * 4;
-const unsigned kNumValueBytes = 3;
-const unsigned kNumValueBits = 8 * kNumValueBytes;
-
-const UInt32 kMask = (1 << kNumValueBits) - 1;
-
-extern Byte kInvertTable[256];
-
-template<class TInByte>
-class CBaseDecoder
-{
-protected:
- unsigned m_BitPos;
- UInt32 m_Value;
- TInByte m_Stream;
-public:
- UInt32 NumExtraBytes;
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream); }
- void ReleaseStream() { m_Stream.ReleaseStream(); }
- void Init()
- {
- m_Stream.Init();
- m_BitPos = kNumBigValueBits;
- m_Value = 0;
- NumExtraBytes = 0;
- }
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() + NumExtraBytes - (kNumBigValueBits - m_BitPos) / 8; }
-
- void Normalize()
- {
- for (; m_BitPos >= 8; m_BitPos -= 8)
- {
- Byte b = 0;
- if (!m_Stream.ReadByte(b))
- {
- b = 0xFF; // check it
- NumExtraBytes++;
- }
- m_Value = (b << (kNumBigValueBits - m_BitPos)) | m_Value;
- }
- }
-
- UInt32 ReadBits(unsigned numBits)
- {
- Normalize();
- UInt32 res = m_Value & ((1 << numBits) - 1);
- m_BitPos += numBits;
- m_Value >>= numBits;
- return res;
- }
-
- bool ExtraBitsWereRead() const
- {
- if (NumExtraBytes == 0)
- return false;
- return ((UInt32)(kNumBigValueBits - m_BitPos) < (NumExtraBytes << 3));
- }
-};
-
-template<class TInByte>
-class CDecoder: public CBaseDecoder<TInByte>
-{
- UInt32 m_NormalValue;
-
-public:
- void Init()
- {
- CBaseDecoder<TInByte>::Init();
- m_NormalValue = 0;
- }
-
- void Normalize()
- {
- for (; this->m_BitPos >= 8; this->m_BitPos -= 8)
- {
- Byte b = 0;
- if (!this->m_Stream.ReadByte(b))
- {
- b = 0xFF; // check it
- this->NumExtraBytes++;
- }
- m_NormalValue = (b << (kNumBigValueBits - this->m_BitPos)) | m_NormalValue;
- this->m_Value = (this->m_Value << 8) | kInvertTable[b];
- }
- }
-
- UInt32 GetValue(unsigned numBits)
- {
- Normalize();
- return ((this->m_Value >> (8 - this->m_BitPos)) & kMask) >> (kNumValueBits - numBits);
- }
-
- void MovePos(unsigned numBits)
- {
- this->m_BitPos += numBits;
- m_NormalValue >>= numBits;
- }
-
- UInt32 ReadBits(unsigned numBits)
- {
- Normalize();
- UInt32 res = m_NormalValue & ((1 << numBits) - 1);
- MovePos(numBits);
- return res;
- }
-
- void AlignToByte() { MovePos((32 - this->m_BitPos) & 7); }
-
- Byte ReadByte()
- {
- if (this->m_BitPos == kNumBigValueBits)
- {
- Byte b = 0;
- if (!this->m_Stream.ReadByte(b))
- {
- b = 0xFF;
- this->NumExtraBytes++;
- }
- return b;
- }
- {
- Byte b = (Byte)(m_NormalValue & 0xFF);
- MovePos(8);
- return b;
- }
- }
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BitlEncoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/BitlEncoder.h
deleted file mode 100644
index 7de575456..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BitlEncoder.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// BitlEncoder.h -- the Least Significant Bit of byte is First
-
-#ifndef __BITL_ENCODER_H
-#define __BITL_ENCODER_H
-
-#include "../Common/OutBuffer.h"
-
-class CBitlEncoder
-{
- COutBuffer m_Stream;
- unsigned m_BitPos;
- Byte m_CurByte;
-public:
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialOutStream *outStream) { m_Stream.SetStream(outStream); }
- void ReleaseStream() { m_Stream.ReleaseStream(); }
- UInt32 GetBitPosition() const { return (8 - m_BitPos); }
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() + (8 - m_BitPos + 7) /8; }
- void Init()
- {
- m_Stream.Init();
- m_BitPos = 8;
- m_CurByte = 0;
- }
- HRESULT Flush()
- {
- FlushByte();
- return m_Stream.Flush();
- }
- void FlushByte()
- {
- if (m_BitPos < 8)
- m_Stream.WriteByte(m_CurByte);
- m_BitPos = 8;
- m_CurByte = 0;
- }
- void WriteBits(UInt32 value, unsigned numBits)
- {
- while (numBits > 0)
- {
- if (numBits < m_BitPos)
- {
- m_CurByte |= (value & ((1 << numBits) - 1)) << (8 - m_BitPos);
- m_BitPos -= numBits;
- return;
- }
- numBits -= m_BitPos;
- m_Stream.WriteByte((Byte)(m_CurByte | (value << (8 - m_BitPos))));
- value >>= m_BitPos;
- m_BitPos = 8;
- m_CurByte = 0;
- }
- }
- void WriteByte(Byte b) { m_Stream.WriteByte(b);}
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BitmDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/BitmDecoder.h
deleted file mode 100644
index 4369b4524..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BitmDecoder.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// BitmDecoder.h -- the Most Significant Bit of byte is First
-
-#ifndef __BITM_DECODER_H
-#define __BITM_DECODER_H
-
-#include "../IStream.h"
-
-namespace NBitm {
-
-const unsigned kNumBigValueBits = 8 * 4;
-const unsigned kNumValueBytes = 3;
-const unsigned kNumValueBits = 8 * kNumValueBytes;
-
-const UInt32 kMask = (1 << kNumValueBits) - 1;
-
-template<class TInByte>
-class CDecoder
-{
- unsigned m_BitPos;
- UInt32 m_Value;
-public:
- TInByte m_Stream;
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream);}
- void ReleaseStream() { m_Stream.ReleaseStream();}
-
- void Init()
- {
- m_Stream.Init();
- m_BitPos = kNumBigValueBits;
- Normalize();
- }
-
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - (kNumBigValueBits - m_BitPos) / 8; }
-
- void Normalize()
- {
- for (;m_BitPos >= 8; m_BitPos -= 8)
- m_Value = (m_Value << 8) | m_Stream.ReadByte();
- }
-
- UInt32 GetValue(unsigned numBits) const
- {
- // return (m_Value << m_BitPos) >> (kNumBigValueBits - numBits);
- return ((m_Value >> (8 - m_BitPos)) & kMask) >> (kNumValueBits - numBits);
- }
-
- void MovePos(unsigned numBits)
- {
- m_BitPos += numBits;
- Normalize();
- }
-
- UInt32 ReadBits(unsigned numBits)
- {
- UInt32 res = GetValue(numBits);
- MovePos(numBits);
- return res;
- }
-
- void AlignToByte() { MovePos((32 - m_BitPos) & 7); }
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/BitmEncoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/BitmEncoder.h
deleted file mode 100644
index a85dbff89..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/BitmEncoder.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// BitmEncoder.h -- the Most Significant Bit of byte is First
-
-#ifndef __BITM_ENCODER_H
-#define __BITM_ENCODER_H
-
-#include "../IStream.h"
-
-template<class TOutByte>
-class CBitmEncoder
-{
- TOutByte m_Stream;
- unsigned m_BitPos;
- Byte m_CurByte;
-public:
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialOutStream *outStream) { m_Stream.SetStream(outStream);}
- void ReleaseStream() { m_Stream.ReleaseStream(); }
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() + (8 - m_BitPos + 7) / 8; }
- void Init()
- {
- m_Stream.Init();
- m_BitPos = 8;
- m_CurByte = 0;
- }
- HRESULT Flush()
- {
- if (m_BitPos < 8)
- WriteBits(0, m_BitPos);
- return m_Stream.Flush();
- }
- void WriteBits(UInt32 value, unsigned numBits)
- {
- while (numBits > 0)
- {
- if (numBits < m_BitPos)
- {
- m_CurByte |= ((Byte)value << (m_BitPos -= numBits));
- return;
- }
- numBits -= m_BitPos;
- UInt32 newBits = (value >> numBits);
- value -= (newBits << numBits);
- m_Stream.WriteByte((Byte)(m_CurByte | newBits));
- m_BitPos = 8;
- m_CurByte = 0;
- }
- }
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Deflate64Register.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/Deflate64Register.cpp
deleted file mode 100644
index 509e675a5..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Deflate64Register.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// Deflate64Register.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "DeflateDecoder.h"
-
-static void *CreateCodecDeflate64() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NDecoder::CCOMCoder64); }
-#if !defined(EXTRACT_ONLY) && !defined(DEFLATE_EXTRACT_ONLY)
-#include "DeflateEncoder.h"
-static void *CreateCodecOutDeflate64() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NEncoder::CCOMCoder64); }
-#else
-#define CreateCodecOutDeflate64 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodecDeflate64, CreateCodecOutDeflate64, 0x040109, L"Deflate64", 1, false };
-
-REGISTER_CODEC(Deflate64)
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateConst.h b/src/libs/7zip/unix/CPP/7zip/Compress/DeflateConst.h
deleted file mode 100644
index 00e5ab8bf..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateConst.h
+++ /dev/null
@@ -1,134 +0,0 @@
-// DeflateConst.h
-
-#ifndef __DEFLATE_CONST_H
-#define __DEFLATE_CONST_H
-
-namespace NCompress {
-namespace NDeflate {
-
-const int kNumHuffmanBits = 15;
-
-const UInt32 kHistorySize32 = (1 << 15);
-const UInt32 kHistorySize64 = (1 << 16);
-
-const UInt32 kDistTableSize32 = 30;
-const UInt32 kDistTableSize64 = 32;
-
-const UInt32 kNumLenSymbols32 = 256;
-const UInt32 kNumLenSymbols64 = 255; // don't change it. It must be <= 255.
-const UInt32 kNumLenSymbolsMax = kNumLenSymbols32;
-
-const UInt32 kNumLenSlots = 29;
-
-const UInt32 kFixedDistTableSize = 32;
-const UInt32 kFixedLenTableSize = 31;
-
-const UInt32 kSymbolEndOfBlock = 0x100;
-const UInt32 kSymbolMatch = kSymbolEndOfBlock + 1;
-
-const UInt32 kMainTableSize = kSymbolMatch + kNumLenSlots;
-const UInt32 kFixedMainTableSize = kSymbolMatch + kFixedLenTableSize;
-
-const UInt32 kLevelTableSize = 19;
-
-const UInt32 kTableDirectLevels = 16;
-const UInt32 kTableLevelRepNumber = kTableDirectLevels;
-const UInt32 kTableLevel0Number = kTableLevelRepNumber + 1;
-const UInt32 kTableLevel0Number2 = kTableLevel0Number + 1;
-
-const UInt32 kLevelMask = 0xF;
-
-const Byte kLenStart32[kFixedLenTableSize] =
- {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 255, 0, 0};
-const Byte kLenStart64[kFixedLenTableSize] =
- {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 0, 0, 0};
-
-const Byte kLenDirectBits32[kFixedLenTableSize] =
- {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0};
-const Byte kLenDirectBits64[kFixedLenTableSize] =
- {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 16, 0, 0};
-
-const UInt32 kDistStart[kDistTableSize64] =
- {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,
- 1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768,49152};
-const Byte kDistDirectBits[kDistTableSize64] =
- {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14};
-
-const Byte kLevelDirectBits[3] = {2, 3, 7};
-
-const Byte kCodeLengthAlphabetOrder[kLevelTableSize] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
-
-const UInt32 kMatchMinLen = 3;
-const UInt32 kMatchMaxLen32 = kNumLenSymbols32 + kMatchMinLen - 1; //256 + 2
-const UInt32 kMatchMaxLen64 = kNumLenSymbols64 + kMatchMinLen - 1; //255 + 2
-const UInt32 kMatchMaxLen = kMatchMaxLen32;
-
-const int kFinalBlockFieldSize = 1;
-
-namespace NFinalBlockField
-{
- enum
- {
- kNotFinalBlock = 0,
- kFinalBlock = 1
- };
-}
-
-const int kBlockTypeFieldSize = 2;
-
-namespace NBlockType
-{
- enum
- {
- kStored = 0,
- kFixedHuffman = 1,
- kDynamicHuffman = 2
- };
-}
-
-const int kNumLenCodesFieldSize = 5;
-const int kNumDistCodesFieldSize = 5;
-const int kNumLevelCodesFieldSize = 4;
-
-const UInt32 kNumLitLenCodesMin = 257;
-const UInt32 kNumDistCodesMin = 1;
-const UInt32 kNumLevelCodesMin = 4;
-
-const int kLevelFieldSize = 3;
-
-const int kStoredBlockLengthFieldSize = 16;
-
-struct CLevels
-{
- Byte litLenLevels[kFixedMainTableSize];
- Byte distLevels[kFixedDistTableSize];
-
- void SubClear()
- {
- UInt32 i;
- for(i = kNumLitLenCodesMin; i < kFixedMainTableSize; i++)
- litLenLevels[i] = 0;
- for(i = 0; i < kFixedDistTableSize; i++)
- distLevels[i] = 0;
- }
-
- void SetFixedLevels()
- {
- int i;
-
- for (i = 0; i < 144; i++)
- litLenLevels[i] = 8;
- for (; i < 256; i++)
- litLenLevels[i] = 9;
- for (; i < 280; i++)
- litLenLevels[i] = 7;
- for (; i < 288; i++)
- litLenLevels[i] = 8;
- for (i = 0; i < kFixedDistTableSize; i++) // test it: InfoZip only uses kDistTableSize
- distLevels[i] = 5;
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateDecoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/DeflateDecoder.cpp
deleted file mode 100644
index 2848cd812..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateDecoder.cpp
+++ /dev/null
@@ -1,353 +0,0 @@
-// DeflateDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "DeflateDecoder.h"
-
-namespace NCompress {
-namespace NDeflate {
-namespace NDecoder {
-
-static const int kLenIdFinished = -1;
-static const int kLenIdNeedInit = -2;
-
-CCoder::CCoder(bool deflate64Mode, bool deflateNSIS):
- _deflate64Mode(deflate64Mode),
- _deflateNSIS(deflateNSIS),
- _keepHistory(false),
- _needInitInStream(true),
- ZlibMode(false) {}
-
-UInt32 CCoder::ReadBits(int numBits)
-{
- return m_InBitStream.ReadBits(numBits);
-}
-
-bool CCoder::DeCodeLevelTable(Byte *values, int numSymbols)
-{
- int i = 0;
- do
- {
- UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);
- if (number < kTableDirectLevels)
- values[i++] = (Byte)number;
- else if (number < kLevelTableSize)
- {
- if (number == kTableLevelRepNumber)
- {
- if (i == 0)
- return false;
- int num = ReadBits(2) + 3;
- for (; num > 0 && i < numSymbols; num--, i++)
- values[i] = values[i - 1];
- }
- else
- {
- int num;
- if (number == kTableLevel0Number)
- num = ReadBits(3) + 3;
- else
- num = ReadBits(7) + 11;
- for (;num > 0 && i < numSymbols; num--)
- values[i++] = 0;
- }
- }
- else
- return false;
- }
- while(i < numSymbols);
- return true;
-}
-
-#define RIF(x) { if (!(x)) return false; }
-
-bool CCoder::ReadTables(void)
-{
- m_FinalBlock = (ReadBits(kFinalBlockFieldSize) == NFinalBlockField::kFinalBlock);
- UInt32 blockType = ReadBits(kBlockTypeFieldSize);
- if (blockType > NBlockType::kDynamicHuffman)
- return false;
-
- if (blockType == NBlockType::kStored)
- {
- m_StoredMode = true;
- m_InBitStream.AlignToByte();
- m_StoredBlockSize = ReadBits(kStoredBlockLengthFieldSize);
- if (_deflateNSIS)
- return true;
- return (m_StoredBlockSize == (UInt16)~ReadBits(kStoredBlockLengthFieldSize));
- }
-
- m_StoredMode = false;
-
- CLevels levels;
- if (blockType == NBlockType::kFixedHuffman)
- {
- levels.SetFixedLevels();
- _numDistLevels = _deflate64Mode ? kDistTableSize64 : kDistTableSize32;
- }
- else
- {
- int numLitLenLevels = ReadBits(kNumLenCodesFieldSize) + kNumLitLenCodesMin;
- _numDistLevels = ReadBits(kNumDistCodesFieldSize) + kNumDistCodesMin;
- int numLevelCodes = ReadBits(kNumLevelCodesFieldSize) + kNumLevelCodesMin;
-
- if (!_deflate64Mode)
- if (_numDistLevels > kDistTableSize32)
- return false;
-
- Byte levelLevels[kLevelTableSize];
- for (int i = 0; i < kLevelTableSize; i++)
- {
- int position = kCodeLengthAlphabetOrder[i];
- if(i < numLevelCodes)
- levelLevels[position] = (Byte)ReadBits(kLevelFieldSize);
- else
- levelLevels[position] = 0;
- }
-
- RIF(m_LevelDecoder.SetCodeLengths(levelLevels));
-
- Byte tmpLevels[kFixedMainTableSize + kFixedDistTableSize];
- if (!DeCodeLevelTable(tmpLevels, numLitLenLevels + _numDistLevels))
- return false;
-
- levels.SubClear();
- memcpy(levels.litLenLevels, tmpLevels, numLitLenLevels);
- memcpy(levels.distLevels, tmpLevels + numLitLenLevels, _numDistLevels);
- }
- RIF(m_MainDecoder.SetCodeLengths(levels.litLenLevels));
- return m_DistDecoder.SetCodeLengths(levels.distLevels);
-}
-
-HRESULT CCoder::CodeSpec(UInt32 curSize)
-{
- if (_remainLen == kLenIdFinished)
- return S_OK;
- if (_remainLen == kLenIdNeedInit)
- {
- if (!_keepHistory)
- if (!m_OutWindowStream.Create(_deflate64Mode ? kHistorySize64: kHistorySize32))
- return E_OUTOFMEMORY;
- RINOK(InitInStream(_needInitInStream));
- m_OutWindowStream.Init(_keepHistory);
- m_FinalBlock = false;
- _remainLen = 0;
- _needReadTable = true;
- }
-
- if (curSize == 0)
- return S_OK;
-
- while(_remainLen > 0 && curSize > 0)
- {
- _remainLen--;
- Byte b = m_OutWindowStream.GetByte(_rep0);
- m_OutWindowStream.PutByte(b);
- curSize--;
- }
-
- while(curSize > 0)
- {
- if (_needReadTable)
- {
- if (m_FinalBlock)
- {
- _remainLen = kLenIdFinished;
- break;
- }
- if (!ReadTables())
- return S_FALSE;
- _needReadTable = false;
- }
-
- if(m_StoredMode)
- {
- for (; m_StoredBlockSize > 0 && curSize > 0; m_StoredBlockSize--, curSize--)
- m_OutWindowStream.PutByte(m_InBitStream.ReadByte());
- _needReadTable = (m_StoredBlockSize == 0);
- continue;
- }
- while(curSize > 0)
- {
- if (m_InBitStream.NumExtraBytes > 4)
- return S_FALSE;
-
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
- if (number < 0x100)
- {
- m_OutWindowStream.PutByte((Byte)number);
- curSize--;
- continue;
- }
- else if (number == kSymbolEndOfBlock)
- {
- _needReadTable = true;
- break;
- }
- else if (number < kMainTableSize)
- {
- number -= kSymbolMatch;
- UInt32 len;
- {
- int numBits;
- if (_deflate64Mode)
- {
- len = kLenStart64[number];
- numBits = kLenDirectBits64[number];
- }
- else
- {
- len = kLenStart32[number];
- numBits = kLenDirectBits32[number];
- }
- len += kMatchMinLen + m_InBitStream.ReadBits(numBits);
- }
- UInt32 locLen = len;
- if (locLen > curSize)
- locLen = (UInt32)curSize;
- number = m_DistDecoder.DecodeSymbol(&m_InBitStream);
- if (number >= _numDistLevels)
- return S_FALSE;
- UInt32 distance = kDistStart[number] + m_InBitStream.ReadBits(kDistDirectBits[number]);
- if (!m_OutWindowStream.CopyBlock(distance, locLen))
- return S_FALSE;
- curSize -= locLen;
- len -= locLen;
- if (len != 0)
- {
- _remainLen = (Int32)len;
- _rep0 = distance;
- break;
- }
- }
- else
- return S_FALSE;
- }
- }
- return S_OK;
-}
-
-#ifdef _NO_EXCEPTIONS
-
-#define DEFLATE_TRY_BEGIN
-#define DEFLATE_TRY_END
-
-#else
-
-#define DEFLATE_TRY_BEGIN try {
-#define DEFLATE_TRY_END } \
- catch(const CInBufferException &e) { return e.ErrorCode; } \
- catch(const CLzOutWindowException &e) { return e.ErrorCode; } \
- catch(...) { return S_FALSE; }
-
-#endif
-
-HRESULT CCoder::CodeReal(ISequentialOutStream *outStream,
- const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- DEFLATE_TRY_BEGIN
- m_OutWindowStream.SetStream(outStream);
- CCoderReleaser flusher(this);
-
- const UInt64 inStart = _needInitInStream ? 0 : m_InBitStream.GetProcessedSize();
- const UInt64 start = m_OutWindowStream.GetProcessedSize();
- for (;;)
- {
- UInt32 curSize = 1 << 18;
- if (outSize != 0)
- {
- const UInt64 rem = *outSize - (m_OutWindowStream.GetProcessedSize() - start);
- if (curSize > rem)
- curSize = (UInt32)rem;
- }
- if (curSize == 0)
- break;
- RINOK(CodeSpec(curSize));
- if (_remainLen == kLenIdFinished)
- break;
- if (progress != NULL)
- {
- const UInt64 inSize = m_InBitStream.GetProcessedSize() - inStart;
- const UInt64 nowPos64 = m_OutWindowStream.GetProcessedSize() - start;
- RINOK(progress->SetRatioInfo(&inSize, &nowPos64));
- }
- }
- if (_remainLen == kLenIdFinished && ZlibMode)
- {
- m_InBitStream.AlignToByte();
- for (int i = 0; i < 4; i++)
- ZlibFooter[i] = m_InBitStream.ReadByte();
- }
- flusher.NeedFlush = false;
- HRESULT res = Flush();
- if (res == S_OK && InputEofError())
- return S_FALSE;
- return res;
- DEFLATE_TRY_END
-}
-
-HRESULT CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- SetInStream(inStream);
- SetOutStreamSize(outSize);
- HRESULT res = CodeReal(outStream, outSize, progress);
- ReleaseInStream();
- return res;
-}
-
-STDMETHODIMP CCoder::GetInStreamProcessedSize(UInt64 *value)
-{
- if (value == NULL)
- return E_INVALIDARG;
- *value = m_InBitStream.GetProcessedSize();
- return S_OK;
-}
-
-STDMETHODIMP CCoder::SetInStream(ISequentialInStream *inStream)
-{
- m_InBitStream.SetStream(inStream);
- return S_OK;
-}
-
-STDMETHODIMP CCoder::ReleaseInStream()
-{
- m_InBitStream.ReleaseStream();
- return S_OK;
-}
-
-STDMETHODIMP CCoder::SetOutStreamSize(const UInt64 * /* outSize */)
-{
- _remainLen = kLenIdNeedInit;
- _needInitInStream = true;
- m_OutWindowStream.Init(_keepHistory);
- return S_OK;
-}
-
-#ifndef NO_READ_FROM_CODER
-
-STDMETHODIMP CCoder::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- DEFLATE_TRY_BEGIN
- if (processedSize)
- *processedSize = 0;
- const UInt64 startPos = m_OutWindowStream.GetProcessedSize();
- m_OutWindowStream.SetMemStream((Byte *)data);
- RINOK(CodeSpec(size));
- if (processedSize)
- *processedSize = (UInt32)(m_OutWindowStream.GetProcessedSize() - startPos);
- return Flush();
- DEFLATE_TRY_END
-}
-
-#endif
-
-STDMETHODIMP CCoder::CodeResume(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- _remainLen = kLenIdNeedInit;
- m_OutWindowStream.Init(_keepHistory);
- return CodeReal(outStream, outSize, progress);
-}
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/DeflateDecoder.h
deleted file mode 100644
index 56ab2bea2..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateDecoder.h
+++ /dev/null
@@ -1,157 +0,0 @@
-// DeflateDecoder.h
-
-#ifndef __DEFLATE_DECODER_H
-#define __DEFLATE_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitlDecoder.h"
-#include "DeflateConst.h"
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NDeflate {
-namespace NDecoder {
-
-class CCoder:
- public ICompressCoder,
- public ICompressGetInStreamProcessedSize,
- #ifndef NO_READ_FROM_CODER
- public ICompressSetInStream,
- public ICompressSetOutStreamSize,
- public ISequentialInStream,
- #endif
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- NBitl::CDecoder<CInBuffer> m_InBitStream;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kFixedMainTableSize> m_MainDecoder;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kFixedDistTableSize> m_DistDecoder;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
-
- UInt32 m_StoredBlockSize;
-
- bool m_FinalBlock;
- bool m_StoredMode;
- UInt32 _numDistLevels;
-
-
- bool _deflateNSIS;
- bool _deflate64Mode;
- bool _keepHistory;
- bool _needInitInStream;
- Int32 _remainLen;
- UInt32 _rep0;
- bool _needReadTable;
-
- UInt32 ReadBits(int numBits);
-
- bool DeCodeLevelTable(Byte *values, int numSymbols);
- bool ReadTables();
-
- HRESULT Flush() { return m_OutWindowStream.Flush(); }
- class CCoderReleaser
- {
- CCoder *_coder;
- public:
- bool NeedFlush;
- CCoderReleaser(CCoder *coder): _coder(coder), NeedFlush(true) {}
- ~CCoderReleaser()
- {
- if (NeedFlush)
- _coder->Flush();
- _coder->ReleaseOutStream();
- }
- };
- friend class CCoderReleaser;
-
- HRESULT CodeSpec(UInt32 curSize);
-public:
- bool ZlibMode;
- Byte ZlibFooter[4];
-
- CCoder(bool deflate64Mode, bool deflateNSIS = false);
- virtual ~CCoder() {};
-
- void SetKeepHistory(bool keepHistory) { _keepHistory = keepHistory; }
-
- void ReleaseOutStream()
- {
- m_OutWindowStream.ReleaseStream();
- }
-
- HRESULT CodeReal(ISequentialOutStream *outStream,
- const UInt64 *outSize, ICompressProgressInfo *progress);
-
- #ifndef NO_READ_FROM_CODER
- MY_UNKNOWN_IMP4(
- ICompressGetInStreamProcessedSize,
- ICompressSetInStream,
- ICompressSetOutStreamSize,
- ISequentialInStream
- )
- #else
- MY_UNKNOWN_IMP1(
- ICompressGetInStreamProcessedSize)
- #endif
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
-
- #ifndef NO_READ_FROM_CODER
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- #endif
-
- STDMETHOD(CodeResume)(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- HRESULT InitInStream(bool needInit)
- {
- if (!m_InBitStream.Create(1 << 17))
- return E_OUTOFMEMORY;
- if (needInit)
- {
- m_InBitStream.Init();
- _needInitInStream = false;
- }
- return S_OK;
- }
-
- void AlignToByte() { m_InBitStream.AlignToByte(); }
- Byte ReadByte() { return (Byte)m_InBitStream.ReadBits(8); }
- bool InputEofError() const { return m_InBitStream.ExtraBitsWereRead(); }
- UInt64 GetInputProcessedSize() const { return m_InBitStream.GetProcessedSize(); }
-
- // IGetInStreamProcessedSize
- STDMETHOD(GetInStreamProcessedSize)(UInt64 *value);
-};
-
-class CCOMCoder : public CCoder
-{
-public:
- CCOMCoder(): CCoder(false) {}
-};
-
-class CNsisCOMCoder : public CCoder
-{
-public:
- CNsisCOMCoder(): CCoder(false, true) {}
-};
-
-class CCOMCoder64 : public CCoder
-{
-public:
- CCOMCoder64(): CCoder(true) {}
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateEncoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/DeflateEncoder.cpp
deleted file mode 100644
index 761714a24..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateEncoder.cpp
+++ /dev/null
@@ -1,986 +0,0 @@
-// DeflateEncoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-#include "../../../C/HuffEnc.h"
-
-#include "Common/ComTry.h"
-
-#include "DeflateEncoder.h"
-
-#undef NO_INLINE
-
-#ifdef _MSC_VER
-#define NO_INLINE MY_NO_INLINE
-#else
-#define NO_INLINE
-#endif
-
-namespace NCompress {
-namespace NDeflate {
-namespace NEncoder {
-
-const int kNumDivPassesMax = 10; // [0, 16); ratio/speed/ram tradeoff; use big value for better compression ratio.
-const UInt32 kNumTables = (1 << kNumDivPassesMax);
-
-static UInt32 kFixedHuffmanCodeBlockSizeMax = (1 << 8); // [0, (1 << 32)); ratio/speed tradeoff; use big value for better compression ratio.
-static UInt32 kDivideCodeBlockSizeMin = (1 << 7); // [1, (1 << 32)); ratio/speed tradeoff; use small value for better compression ratio.
-static UInt32 kDivideBlockSizeMin = (1 << 6); // [1, (1 << 32)); ratio/speed tradeoff; use small value for better compression ratio.
-
-static const UInt32 kMaxUncompressedBlockSize = ((1 << 16) - 1) * 1; // [1, (1 << 32))
-static const UInt32 kMatchArraySize = kMaxUncompressedBlockSize * 10; // [kMatchMaxLen * 2, (1 << 32))
-static const UInt32 kMatchArrayLimit = kMatchArraySize - kMatchMaxLen * 4 * sizeof(UInt16);
-static const UInt32 kBlockUncompressedSizeThreshold = kMaxUncompressedBlockSize -
- kMatchMaxLen - kNumOpts;
-
-static const int kMaxCodeBitLength = 11;
-static const int kMaxLevelBitLength = 7;
-
-static Byte kNoLiteralStatPrice = 11;
-static Byte kNoLenStatPrice = 11;
-static Byte kNoPosStatPrice = 6;
-
-static Byte g_LenSlots[kNumLenSymbolsMax];
-static Byte g_FastPos[1 << 9];
-
-class CFastPosInit
-{
-public:
- CFastPosInit()
- {
- int i;
- for(i = 0; i < kNumLenSlots; i++)
- {
- int c = kLenStart32[i];
- int j = 1 << kLenDirectBits32[i];
- for(int k = 0; k < j; k++, c++)
- g_LenSlots[c] = (Byte)i;
- }
-
- const int kFastSlots = 18;
- int c = 0;
- for (Byte slotFast = 0; slotFast < kFastSlots; slotFast++)
- {
- UInt32 k = (1 << kDistDirectBits[slotFast]);
- for (UInt32 j = 0; j < k; j++, c++)
- g_FastPos[c] = slotFast;
- }
- }
-};
-
-static CFastPosInit g_FastPosInit;
-
-
-inline UInt32 GetPosSlot(UInt32 pos)
-{
- if (pos < 0x200)
- return g_FastPos[pos];
- return g_FastPos[pos >> 8] + 16;
-}
-
-static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
-static void SzFree(void *p, void *address) { p = p; MyFree(address); }
-static ISzAlloc g_Alloc = { SzAlloc, SzFree };
-
-CCoder::CCoder(bool deflate64Mode):
- m_Deflate64Mode(deflate64Mode),
- m_NumPasses(1),
- m_NumDivPasses(1),
- m_NumFastBytes(32),
- _fastMode(false),
- _btMode(true),
- m_OnePosMatchesMemory(0),
- m_DistanceMemory(0),
- m_Created(false),
- m_Values(0),
- m_Tables(0),
- m_MatchFinderCycles(0)
- // m_SetMfPasses(0)
-{
- m_MatchMaxLen = deflate64Mode ? kMatchMaxLen64 : kMatchMaxLen32;
- m_NumLenCombinations = deflate64Mode ? kNumLenSymbols64 : kNumLenSymbols32;
- m_LenStart = deflate64Mode ? kLenStart64 : kLenStart32;
- m_LenDirectBits = deflate64Mode ? kLenDirectBits64 : kLenDirectBits32;
- MatchFinder_Construct(&_lzInWindow);
-}
-
-HRESULT CCoder::Create()
-{
- COM_TRY_BEGIN
- if (m_Values == 0)
- {
- m_Values = (CCodeValue *)MyAlloc((kMaxUncompressedBlockSize) * sizeof(CCodeValue));
- if (m_Values == 0)
- return E_OUTOFMEMORY;
- }
- if (m_Tables == 0)
- {
- m_Tables = (CTables *)MyAlloc((kNumTables) * sizeof(CTables));
- if (m_Tables == 0)
- return E_OUTOFMEMORY;
- }
-
- if (m_IsMultiPass)
- {
- if (m_OnePosMatchesMemory == 0)
- {
- m_OnePosMatchesMemory = (UInt16 *)::MidAlloc(kMatchArraySize * sizeof(UInt16));
- if (m_OnePosMatchesMemory == 0)
- return E_OUTOFMEMORY;
- }
- }
- else
- {
- if (m_DistanceMemory == 0)
- {
- m_DistanceMemory = (UInt16 *)MyAlloc((kMatchMaxLen + 2) * 2 * sizeof(UInt16));
- if (m_DistanceMemory == 0)
- return E_OUTOFMEMORY;
- m_MatchDistances = m_DistanceMemory;
- }
- }
-
- if (!m_Created)
- {
- _lzInWindow.btMode = _btMode ? 1 : 0;
- _lzInWindow.numHashBytes = 3;
- if (!MatchFinder_Create(&_lzInWindow,
- m_Deflate64Mode ? kHistorySize64 : kHistorySize32,
- kNumOpts + kMaxUncompressedBlockSize,
- m_NumFastBytes, m_MatchMaxLen - m_NumFastBytes, &g_Alloc))
- return E_OUTOFMEMORY;
- if (!m_OutStream.Create(1 << 20))
- return E_OUTOFMEMORY;
- }
- if (m_MatchFinderCycles != 0)
- _lzInWindow.cutValue = m_MatchFinderCycles;
- m_Created = true;
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CCoder::BaseSetEncoderProperties2(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
-{
- for (UInt32 i = 0; i < numProps; i++)
- {
- const PROPVARIANT &prop = props[i];
- switch(propIDs[i])
- {
- case NCoderPropID::kNumPasses:
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- m_NumDivPasses = prop.ulVal;
- if (m_NumDivPasses == 0)
- m_NumDivPasses = 1;
- if (m_NumDivPasses == 1)
- m_NumPasses = 1;
- else if (m_NumDivPasses <= kNumDivPassesMax)
- m_NumPasses = 2;
- else
- {
- m_NumPasses = 2 + (m_NumDivPasses - kNumDivPassesMax);
- m_NumDivPasses = kNumDivPassesMax;
- }
- break;
- case NCoderPropID::kNumFastBytes:
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- m_NumFastBytes = prop.ulVal;
- if(m_NumFastBytes < kMatchMinLen || m_NumFastBytes > m_MatchMaxLen)
- return E_INVALIDARG;
- break;
- case NCoderPropID::kMatchFinderCycles:
- {
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- m_MatchFinderCycles = prop.ulVal;
- break;
- }
- case NCoderPropID::kAlgorithm:
- {
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- UInt32 maximize = prop.ulVal;
- _fastMode = (maximize == 0);
- _btMode = !_fastMode;
- break;
- }
- default:
- return E_INVALIDARG;
- }
- }
- return S_OK;
-}
-
-void CCoder::Free()
-{
- ::MidFree(m_OnePosMatchesMemory); m_OnePosMatchesMemory = 0;
- ::MyFree(m_DistanceMemory); m_DistanceMemory = 0;
- ::MyFree(m_Values); m_Values = 0;
- ::MyFree(m_Tables); m_Tables = 0;
-}
-
-CCoder::~CCoder()
-{
- Free();
- MatchFinder_Free(&_lzInWindow, &g_Alloc);
-}
-
-NO_INLINE void CCoder::GetMatches()
-{
- if (m_IsMultiPass)
- {
- m_MatchDistances = m_OnePosMatchesMemory + m_Pos;
- if (m_SecondPass)
- {
- m_Pos += *m_MatchDistances + 1;
- return;
- }
- }
-
- UInt32 distanceTmp[kMatchMaxLen * 2 + 3];
-
- UInt32 numPairs = (_btMode) ?
- Bt3Zip_MatchFinder_GetMatches(&_lzInWindow, distanceTmp):
- Hc3Zip_MatchFinder_GetMatches(&_lzInWindow, distanceTmp);
-
- *m_MatchDistances = (UInt16)numPairs;
-
- if (numPairs > 0)
- {
- UInt32 i;
- for(i = 0; i < numPairs; i += 2)
- {
- m_MatchDistances[i + 1] = (UInt16)distanceTmp[i];
- m_MatchDistances[i + 2] = (UInt16)distanceTmp[i + 1];
- }
- UInt32 len = distanceTmp[numPairs - 2];
- if (len == m_NumFastBytes && m_NumFastBytes != m_MatchMaxLen)
- {
- UInt32 numAvail = Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) + 1;
- const Byte *pby = Inline_MatchFinder_GetPointerToCurrentPos(&_lzInWindow) - 1;
- const Byte *pby2 = pby - (distanceTmp[numPairs - 1] + 1);
- if (numAvail > m_MatchMaxLen)
- numAvail = m_MatchMaxLen;
- for (; len < numAvail && pby[len] == pby2[len]; len++) {}
- m_MatchDistances[i - 1] = (UInt16)len;
- }
- }
- if (m_IsMultiPass)
- m_Pos += numPairs + 1;
- if (!m_SecondPass)
- m_AdditionalOffset++;
-}
-
-void CCoder::MovePos(UInt32 num)
-{
- if (!m_SecondPass && num > 0)
- {
- if (_btMode)
- Bt3Zip_MatchFinder_Skip(&_lzInWindow, num);
- else
- Hc3Zip_MatchFinder_Skip(&_lzInWindow, num);
- m_AdditionalOffset += num;
- }
-}
-
-static const UInt32 kIfinityPrice = 0xFFFFFFF;
-
-NO_INLINE UInt32 CCoder::Backward(UInt32 &backRes, UInt32 cur)
-{
- m_OptimumEndIndex = cur;
- UInt32 posMem = m_Optimum[cur].PosPrev;
- UInt16 backMem = m_Optimum[cur].BackPrev;
- do
- {
- UInt32 posPrev = posMem;
- UInt16 backCur = backMem;
- backMem = m_Optimum[posPrev].BackPrev;
- posMem = m_Optimum[posPrev].PosPrev;
- m_Optimum[posPrev].BackPrev = backCur;
- m_Optimum[posPrev].PosPrev = (UInt16)cur;
- cur = posPrev;
- }
- while(cur > 0);
- backRes = m_Optimum[0].BackPrev;
- m_OptimumCurrentIndex = m_Optimum[0].PosPrev;
- return m_OptimumCurrentIndex;
-}
-
-NO_INLINE UInt32 CCoder::GetOptimal(UInt32 &backRes)
-{
- if(m_OptimumEndIndex != m_OptimumCurrentIndex)
- {
- UInt32 len = m_Optimum[m_OptimumCurrentIndex].PosPrev - m_OptimumCurrentIndex;
- backRes = m_Optimum[m_OptimumCurrentIndex].BackPrev;
- m_OptimumCurrentIndex = m_Optimum[m_OptimumCurrentIndex].PosPrev;
- return len;
- }
- m_OptimumCurrentIndex = m_OptimumEndIndex = 0;
-
- GetMatches();
-
- UInt32 numDistancePairs = m_MatchDistances[0];
- if(numDistancePairs == 0)
- return 1;
-
- const UInt16 *matchDistances = m_MatchDistances + 1;
- UInt32 lenMain = matchDistances[numDistancePairs - 2];
-
- if(lenMain > m_NumFastBytes)
- {
- backRes = matchDistances[numDistancePairs - 1];
- MovePos(lenMain - 1);
- return lenMain;
- }
- m_Optimum[1].Price = m_LiteralPrices[Inline_MatchFinder_GetIndexByte(&_lzInWindow, 0 - m_AdditionalOffset)];
- m_Optimum[1].PosPrev = 0;
-
- m_Optimum[2].Price = kIfinityPrice;
- m_Optimum[2].PosPrev = 1;
-
-
- UInt32 offs = 0;
- for(UInt32 i = kMatchMinLen; i <= lenMain; i++)
- {
- UInt32 distance = matchDistances[offs + 1];
- m_Optimum[i].PosPrev = 0;
- m_Optimum[i].BackPrev = (UInt16)distance;
- m_Optimum[i].Price = m_LenPrices[i - kMatchMinLen] + m_PosPrices[GetPosSlot(distance)];
- if (i == matchDistances[offs])
- offs += 2;
- }
-
- UInt32 cur = 0;
- UInt32 lenEnd = lenMain;
- for (;;)
- {
- ++cur;
- if(cur == lenEnd || cur == kNumOptsBase || m_Pos >= kMatchArrayLimit)
- return Backward(backRes, cur);
- GetMatches();
- matchDistances = m_MatchDistances + 1;
-
- UInt32 numDistancePairs = m_MatchDistances[0];
- UInt32 newLen = 0;
- if(numDistancePairs != 0)
- {
- newLen = matchDistances[numDistancePairs - 2];
- if(newLen > m_NumFastBytes)
- {
- UInt32 len = Backward(backRes, cur);
- m_Optimum[cur].BackPrev = matchDistances[numDistancePairs - 1];
- m_OptimumEndIndex = cur + newLen;
- m_Optimum[cur].PosPrev = (UInt16)m_OptimumEndIndex;
- MovePos(newLen - 1);
- return len;
- }
- }
- UInt32 curPrice = m_Optimum[cur].Price;
- UInt32 curAnd1Price = curPrice + m_LiteralPrices[Inline_MatchFinder_GetIndexByte(&_lzInWindow, cur - m_AdditionalOffset)];
- COptimal &optimum = m_Optimum[cur + 1];
- if (curAnd1Price < optimum.Price)
- {
- optimum.Price = curAnd1Price;
- optimum.PosPrev = (UInt16)cur;
- }
- if(numDistancePairs == 0)
- continue;
- while(lenEnd < cur + newLen)
- m_Optimum[++lenEnd].Price = kIfinityPrice;
- offs = 0;
- UInt32 distance = matchDistances[offs + 1];
- curPrice += m_PosPrices[GetPosSlot(distance)];
- for(UInt32 lenTest = kMatchMinLen; ; lenTest++)
- {
- UInt32 curAndLenPrice = curPrice + m_LenPrices[lenTest - kMatchMinLen];
- COptimal &optimum = m_Optimum[cur + lenTest];
- if (curAndLenPrice < optimum.Price)
- {
- optimum.Price = curAndLenPrice;
- optimum.PosPrev = (UInt16)cur;
- optimum.BackPrev = (UInt16)distance;
- }
- if (lenTest == matchDistances[offs])
- {
- offs += 2;
- if (offs == numDistancePairs)
- break;
- curPrice -= m_PosPrices[GetPosSlot(distance)];
- distance = matchDistances[offs + 1];
- curPrice += m_PosPrices[GetPosSlot(distance)];
- }
- }
- }
-}
-
-UInt32 CCoder::GetOptimalFast(UInt32 &backRes)
-{
- GetMatches();
- UInt32 numDistancePairs = m_MatchDistances[0];
- if (numDistancePairs == 0)
- return 1;
- UInt32 lenMain = m_MatchDistances[numDistancePairs - 1];
- backRes = m_MatchDistances[numDistancePairs];
- MovePos(lenMain - 1);
- return lenMain;
-}
-
-void CTables::InitStructures()
-{
- UInt32 i;
- for(i = 0; i < 256; i++)
- litLenLevels[i] = 8;
- litLenLevels[i++] = 13;
- for(;i < kFixedMainTableSize; i++)
- litLenLevels[i] = 5;
- for(i = 0; i < kFixedDistTableSize; i++)
- distLevels[i] = 5;
-}
-
-NO_INLINE void CCoder::LevelTableDummy(const Byte *levels, int numLevels, UInt32 *freqs)
-{
- int prevLen = 0xFF;
- int nextLen = levels[0];
- int count = 0;
- int maxCount = 7;
- int minCount = 4;
- if (nextLen == 0)
- {
- maxCount = 138;
- minCount = 3;
- }
- for (int n = 0; n < numLevels; n++)
- {
- int curLen = nextLen;
- nextLen = (n < numLevels - 1) ? levels[n + 1] : 0xFF;
- count++;
- if (count < maxCount && curLen == nextLen)
- continue;
-
- if (count < minCount)
- freqs[curLen] += (UInt32)count;
- else if (curLen != 0)
- {
- if (curLen != prevLen)
- {
- freqs[curLen]++;
- count--;
- }
- freqs[kTableLevelRepNumber]++;
- }
- else if (count <= 10)
- freqs[kTableLevel0Number]++;
- else
- freqs[kTableLevel0Number2]++;
-
- count = 0;
- prevLen = curLen;
-
- if (nextLen == 0)
- {
- maxCount = 138;
- minCount = 3;
- }
- else if (curLen == nextLen)
- {
- maxCount = 6;
- minCount = 3;
- }
- else
- {
- maxCount = 7;
- minCount = 4;
- }
- }
-}
-
-NO_INLINE void CCoder::WriteBits(UInt32 value, int numBits)
-{
- m_OutStream.WriteBits(value, numBits);
-}
-
-#define WRITE_HF2(codes, lens, i) m_OutStream.WriteBits(codes[i], lens[i])
-#define WRITE_HF(i) WriteBits(codes[i], lens[i])
-
-NO_INLINE void CCoder::LevelTableCode(const Byte *levels, int numLevels, const Byte *lens, const UInt32 *codes)
-{
- int prevLen = 0xFF;
- int nextLen = levels[0];
- int count = 0;
- int maxCount = 7;
- int minCount = 4;
- if (nextLen == 0)
- {
- maxCount = 138;
- minCount = 3;
- }
- for (int n = 0; n < numLevels; n++)
- {
- int curLen = nextLen;
- nextLen = (n < numLevels - 1) ? levels[n + 1] : 0xFF;
- count++;
- if (count < maxCount && curLen == nextLen)
- continue;
-
- if (count < minCount)
- for(int i = 0; i < count; i++)
- WRITE_HF(curLen);
- else if (curLen != 0)
- {
- if (curLen != prevLen)
- {
- WRITE_HF(curLen);
- count--;
- }
- WRITE_HF(kTableLevelRepNumber);
- WriteBits(count - 3, 2);
- }
- else if (count <= 10)
- {
- WRITE_HF(kTableLevel0Number);
- WriteBits(count - 3, 3);
- }
- else
- {
- WRITE_HF(kTableLevel0Number2);
- WriteBits(count - 11, 7);
- }
-
- count = 0;
- prevLen = curLen;
-
- if (nextLen == 0)
- {
- maxCount = 138;
- minCount = 3;
- }
- else if (curLen == nextLen)
- {
- maxCount = 6;
- minCount = 3;
- }
- else
- {
- maxCount = 7;
- minCount = 4;
- }
- }
-}
-
-NO_INLINE void CCoder::MakeTables(unsigned maxHuffLen)
-{
- Huffman_Generate(mainFreqs, mainCodes, m_NewLevels.litLenLevels, kFixedMainTableSize, maxHuffLen);
- Huffman_Generate(distFreqs, distCodes, m_NewLevels.distLevels, kDistTableSize64, maxHuffLen);
-}
-
-NO_INLINE UInt32 Huffman_GetPrice(const UInt32 *freqs, const Byte *lens, UInt32 num)
-{
- UInt32 price = 0;
- UInt32 i;
- for (i = 0; i < num; i++)
- price += lens[i] * freqs[i];
- return price;
-}
-
-NO_INLINE UInt32 Huffman_GetPrice_Spec(const UInt32 *freqs, const Byte *lens, UInt32 num, const Byte *extraBits, UInt32 extraBase)
-{
- return Huffman_GetPrice(freqs, lens, num) +
- Huffman_GetPrice(freqs + extraBase, extraBits, num - extraBase);
-}
-
-NO_INLINE UInt32 CCoder::GetLzBlockPrice() const
-{
- return
- Huffman_GetPrice_Spec(mainFreqs, m_NewLevels.litLenLevels, kFixedMainTableSize, m_LenDirectBits, kSymbolMatch) +
- Huffman_GetPrice_Spec(distFreqs, m_NewLevels.distLevels, kDistTableSize64, kDistDirectBits, 0);
-}
-
-NO_INLINE void CCoder::TryBlock()
-{
- memset(mainFreqs, 0, sizeof(mainFreqs));
- memset(distFreqs, 0, sizeof(distFreqs));
-
- m_ValueIndex = 0;
- UInt32 blockSize = BlockSizeRes;
- BlockSizeRes = 0;
- for (;;)
- {
- if (m_OptimumCurrentIndex == m_OptimumEndIndex)
- {
- if (m_Pos >= kMatchArrayLimit || BlockSizeRes >= blockSize || !m_SecondPass &&
- ((Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) == 0) || m_ValueIndex >= m_ValueBlockSize))
- break;
- }
- UInt32 pos;
- UInt32 len;
- if (_fastMode)
- len = GetOptimalFast(pos);
- else
- len = GetOptimal(pos);
- CCodeValue &codeValue = m_Values[m_ValueIndex++];
- if (len >= kMatchMinLen)
- {
- UInt32 newLen = len - kMatchMinLen;
- codeValue.Len = (UInt16)newLen;
- mainFreqs[kSymbolMatch + g_LenSlots[newLen]]++;
- codeValue.Pos = (UInt16)pos;
- distFreqs[GetPosSlot(pos)]++;
- }
- else
- {
- Byte b = Inline_MatchFinder_GetIndexByte(&_lzInWindow, 0 - m_AdditionalOffset);
- mainFreqs[b]++;
- codeValue.SetAsLiteral();
- codeValue.Pos = b;
- }
- m_AdditionalOffset -= len;
- BlockSizeRes += len;
- }
- mainFreqs[kSymbolEndOfBlock]++;
- m_AdditionalOffset += BlockSizeRes;
- m_SecondPass = true;
-}
-
-NO_INLINE void CCoder::SetPrices(const CLevels &levels)
-{
- if (_fastMode)
- return;
- UInt32 i;
- for(i = 0; i < 256; i++)
- {
- Byte price = levels.litLenLevels[i];
- m_LiteralPrices[i] = ((price != 0) ? price : kNoLiteralStatPrice);
- }
-
- for(i = 0; i < m_NumLenCombinations; i++)
- {
- UInt32 slot = g_LenSlots[i];
- Byte price = levels.litLenLevels[kSymbolMatch + slot];
- m_LenPrices[i] = (Byte)(((price != 0) ? price : kNoLenStatPrice) + m_LenDirectBits[slot]);
- }
-
- for(i = 0; i < kDistTableSize64; i++)
- {
- Byte price = levels.distLevels[i];
- m_PosPrices[i] = (Byte)(((price != 0) ? price: kNoPosStatPrice) + kDistDirectBits[i]);
- }
-}
-
-NO_INLINE void Huffman_ReverseBits(UInt32 *codes, const Byte *lens, UInt32 num)
-{
- for (UInt32 i = 0; i < num; i++)
- {
- UInt32 x = codes[i];
- x = ((x & 0x5555) << 1) | ((x & 0xAAAA) >> 1);
- x = ((x & 0x3333) << 2) | ((x & 0xCCCC) >> 2);
- x = ((x & 0x0F0F) << 4) | ((x & 0xF0F0) >> 4);
- codes[i] = (((x & 0x00FF) << 8) | ((x & 0xFF00) >> 8)) >> (16 - lens[i]);
- }
-}
-
-NO_INLINE void CCoder::WriteBlock()
-{
- Huffman_ReverseBits(mainCodes, m_NewLevels.litLenLevels, kFixedMainTableSize);
- Huffman_ReverseBits(distCodes, m_NewLevels.distLevels, kDistTableSize64);
-
- for (UInt32 i = 0; i < m_ValueIndex; i++)
- {
- const CCodeValue &codeValue = m_Values[i];
- if (codeValue.IsLiteral())
- WRITE_HF2(mainCodes, m_NewLevels.litLenLevels, codeValue.Pos);
- else
- {
- UInt32 len = codeValue.Len;
- UInt32 lenSlot = g_LenSlots[len];
- WRITE_HF2(mainCodes, m_NewLevels.litLenLevels, kSymbolMatch + lenSlot);
- m_OutStream.WriteBits(len - m_LenStart[lenSlot], m_LenDirectBits[lenSlot]);
- UInt32 dist = codeValue.Pos;
- UInt32 posSlot = GetPosSlot(dist);
- WRITE_HF2(distCodes, m_NewLevels.distLevels, posSlot);
- m_OutStream.WriteBits(dist - kDistStart[posSlot], kDistDirectBits[posSlot]);
- }
- }
- WRITE_HF2(mainCodes, m_NewLevels.litLenLevels, kSymbolEndOfBlock);
-}
-
-static UInt32 GetStorePrice(UInt32 blockSize, int bitPosition)
-{
- UInt32 price = 0;
- do
- {
- UInt32 nextBitPosition = (bitPosition + kFinalBlockFieldSize + kBlockTypeFieldSize) & 7;
- int numBitsForAlign = nextBitPosition > 0 ? (8 - nextBitPosition): 0;
- UInt32 curBlockSize = (blockSize < (1 << 16)) ? blockSize : (1 << 16) - 1;
- price += kFinalBlockFieldSize + kBlockTypeFieldSize + numBitsForAlign + (2 + 2) * 8 + curBlockSize * 8;
- bitPosition = 0;
- blockSize -= curBlockSize;
- }
- while(blockSize != 0);
- return price;
-}
-
-void CCoder::WriteStoreBlock(UInt32 blockSize, UInt32 additionalOffset, bool finalBlock)
-{
- do
- {
- UInt32 curBlockSize = (blockSize < (1 << 16)) ? blockSize : (1 << 16) - 1;
- blockSize -= curBlockSize;
- WriteBits((finalBlock && (blockSize == 0) ? NFinalBlockField::kFinalBlock: NFinalBlockField::kNotFinalBlock), kFinalBlockFieldSize);
- WriteBits(NBlockType::kStored, kBlockTypeFieldSize);
- m_OutStream.FlushByte();
- WriteBits((UInt16)curBlockSize, kStoredBlockLengthFieldSize);
- WriteBits((UInt16)~curBlockSize, kStoredBlockLengthFieldSize);
- const Byte *data = Inline_MatchFinder_GetPointerToCurrentPos(&_lzInWindow)- additionalOffset;
- for(UInt32 i = 0; i < curBlockSize; i++)
- m_OutStream.WriteByte(data[i]);
- additionalOffset -= curBlockSize;
- }
- while(blockSize != 0);
-}
-
-NO_INLINE UInt32 CCoder::TryDynBlock(int tableIndex, UInt32 numPasses)
-{
- CTables &t = m_Tables[tableIndex];
- BlockSizeRes = t.BlockSizeRes;
- UInt32 posTemp = t.m_Pos;
- SetPrices(t);
-
- for (UInt32 p = 0; p < numPasses; p++)
- {
- m_Pos = posTemp;
- TryBlock();
- unsigned numHuffBits =
- (m_ValueIndex > 18000 ? 12 :
- (m_ValueIndex > 7000 ? 11 :
- (m_ValueIndex > 2000 ? 10 : 9)));
- MakeTables(numHuffBits);
- SetPrices(m_NewLevels);
- }
-
- (CLevels &)t = m_NewLevels;
-
- m_NumLitLenLevels = kMainTableSize;
- while(m_NumLitLenLevels > kNumLitLenCodesMin && m_NewLevels.litLenLevels[m_NumLitLenLevels - 1] == 0)
- m_NumLitLenLevels--;
-
- m_NumDistLevels = kDistTableSize64;
- while(m_NumDistLevels > kNumDistCodesMin && m_NewLevels.distLevels[m_NumDistLevels - 1] == 0)
- m_NumDistLevels--;
-
- UInt32 levelFreqs[kLevelTableSize];
- memset(levelFreqs, 0, sizeof(levelFreqs));
-
- LevelTableDummy(m_NewLevels.litLenLevels, m_NumLitLenLevels, levelFreqs);
- LevelTableDummy(m_NewLevels.distLevels, m_NumDistLevels, levelFreqs);
-
- Huffman_Generate(levelFreqs, levelCodes, levelLens, kLevelTableSize, kMaxLevelBitLength);
-
- m_NumLevelCodes = kNumLevelCodesMin;
- for (UInt32 i = 0; i < kLevelTableSize; i++)
- {
- Byte level = levelLens[kCodeLengthAlphabetOrder[i]];
- if (level > 0 && i >= m_NumLevelCodes)
- m_NumLevelCodes = i + 1;
- m_LevelLevels[i] = level;
- }
-
- return GetLzBlockPrice() +
- Huffman_GetPrice_Spec(levelFreqs, levelLens, kLevelTableSize, kLevelDirectBits, kTableDirectLevels) +
- kNumLenCodesFieldSize + kNumDistCodesFieldSize + kNumLevelCodesFieldSize +
- m_NumLevelCodes * kLevelFieldSize + kFinalBlockFieldSize + kBlockTypeFieldSize;
-}
-
-NO_INLINE UInt32 CCoder::TryFixedBlock(int tableIndex)
-{
- CTables &t = m_Tables[tableIndex];
- BlockSizeRes = t.BlockSizeRes;
- m_Pos = t.m_Pos;
- m_NewLevels.SetFixedLevels();
- SetPrices(m_NewLevels);
- TryBlock();
- return kFinalBlockFieldSize + kBlockTypeFieldSize + GetLzBlockPrice();
-}
-
-NO_INLINE UInt32 CCoder::GetBlockPrice(int tableIndex, int numDivPasses)
-{
- CTables &t = m_Tables[tableIndex];
- t.StaticMode = false;
- UInt32 price = TryDynBlock(tableIndex, m_NumPasses);
- t.BlockSizeRes = BlockSizeRes;
- UInt32 numValues = m_ValueIndex;
- UInt32 posTemp = m_Pos;
- UInt32 additionalOffsetEnd = m_AdditionalOffset;
-
- if (m_CheckStatic && m_ValueIndex <= kFixedHuffmanCodeBlockSizeMax)
- {
- const UInt32 fixedPrice = TryFixedBlock(tableIndex);
- t.StaticMode = (fixedPrice < price);
- if (t.StaticMode)
- price = fixedPrice;
- }
-
- const UInt32 storePrice = GetStorePrice(BlockSizeRes, 0); // bitPosition
- t.StoreMode = (storePrice <= price);
- if (t.StoreMode)
- price = storePrice;
-
- t.UseSubBlocks = false;
-
- if (numDivPasses > 1 && numValues >= kDivideCodeBlockSizeMin)
- {
- CTables &t0 = m_Tables[(tableIndex << 1)];
- (CLevels &)t0 = t;
- t0.BlockSizeRes = t.BlockSizeRes >> 1;
- t0.m_Pos = t.m_Pos;
- UInt32 subPrice = GetBlockPrice((tableIndex << 1), numDivPasses - 1);
-
- UInt32 blockSize2 = t.BlockSizeRes - t0.BlockSizeRes;
- if (t0.BlockSizeRes >= kDivideBlockSizeMin && blockSize2 >= kDivideBlockSizeMin)
- {
- CTables &t1 = m_Tables[(tableIndex << 1) + 1];
- (CLevels &)t1 = t;
- t1.BlockSizeRes = blockSize2;
- t1.m_Pos = m_Pos;
- m_AdditionalOffset -= t0.BlockSizeRes;
- subPrice += GetBlockPrice((tableIndex << 1) + 1, numDivPasses - 1);
- t.UseSubBlocks = (subPrice < price);
- if (t.UseSubBlocks)
- price = subPrice;
- }
- }
- m_AdditionalOffset = additionalOffsetEnd;
- m_Pos = posTemp;
- return price;
-}
-
-void CCoder::CodeBlock(int tableIndex, bool finalBlock)
-{
- CTables &t = m_Tables[tableIndex];
- if (t.UseSubBlocks)
- {
- CodeBlock((tableIndex << 1), false);
- CodeBlock((tableIndex << 1) + 1, finalBlock);
- }
- else
- {
- if (t.StoreMode)
- WriteStoreBlock(t.BlockSizeRes, m_AdditionalOffset, finalBlock);
- else
- {
- WriteBits((finalBlock ? NFinalBlockField::kFinalBlock: NFinalBlockField::kNotFinalBlock), kFinalBlockFieldSize);
- if (t.StaticMode)
- {
- WriteBits(NBlockType::kFixedHuffman, kBlockTypeFieldSize);
- TryFixedBlock(tableIndex);
- int i;
- const int kMaxStaticHuffLen = 9;
- for (i = 0; i < kFixedMainTableSize; i++)
- mainFreqs[i] = (UInt32)1 << (kMaxStaticHuffLen - m_NewLevels.litLenLevels[i]);
- for (i = 0; i < kFixedDistTableSize; i++)
- distFreqs[i] = (UInt32)1 << (kMaxStaticHuffLen - m_NewLevels.distLevels[i]);
- MakeTables(kMaxStaticHuffLen);
- }
- else
- {
- if (m_NumDivPasses > 1 || m_CheckStatic)
- TryDynBlock(tableIndex, 1);
- WriteBits(NBlockType::kDynamicHuffman, kBlockTypeFieldSize);
- WriteBits(m_NumLitLenLevels - kNumLitLenCodesMin, kNumLenCodesFieldSize);
- WriteBits(m_NumDistLevels - kNumDistCodesMin, kNumDistCodesFieldSize);
- WriteBits(m_NumLevelCodes - kNumLevelCodesMin, kNumLevelCodesFieldSize);
-
- for (UInt32 i = 0; i < m_NumLevelCodes; i++)
- WriteBits(m_LevelLevels[i], kLevelFieldSize);
-
- Huffman_ReverseBits(levelCodes, levelLens, kLevelTableSize);
- LevelTableCode(m_NewLevels.litLenLevels, m_NumLitLenLevels, levelLens, levelCodes);
- LevelTableCode(m_NewLevels.distLevels, m_NumDistLevels, levelLens, levelCodes);
- }
- WriteBlock();
- }
- m_AdditionalOffset -= t.BlockSizeRes;
- }
-}
-
-SRes Read(void *object, void *data, size_t *size)
-{
- const UInt32 kStepSize = (UInt32)1 << 31;
- UInt32 curSize = ((*size < kStepSize) ? (UInt32)*size : kStepSize);
- HRESULT res = ((CSeqInStream *)object)->RealStream->Read(data, curSize, &curSize);
- *size = curSize;
- return (SRes)res;
-}
-
-HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */ , const UInt64 * /* outSize */ , ICompressProgressInfo *progress)
-{
- m_CheckStatic = (m_NumPasses != 1 || m_NumDivPasses != 1);
- m_IsMultiPass = (m_CheckStatic || (m_NumPasses != 1 || m_NumDivPasses != 1));
-
- RINOK(Create());
-
- m_ValueBlockSize = (7 << 10) + (1 << 12) * m_NumDivPasses;
-
- UInt64 nowPos = 0;
-
- _seqInStream.RealStream = inStream;
- _seqInStream.SeqInStream.Read = Read;
- _lzInWindow.stream = &_seqInStream.SeqInStream;
-
- MatchFinder_Init(&_lzInWindow);
- m_OutStream.SetStream(outStream);
- m_OutStream.Init();
-
- CCoderReleaser coderReleaser(this);
-
- m_OptimumEndIndex = m_OptimumCurrentIndex = 0;
-
- CTables &t = m_Tables[1];
- t.m_Pos = 0;
- t.InitStructures();
-
- m_AdditionalOffset = 0;
- do
- {
- t.BlockSizeRes = kBlockUncompressedSizeThreshold;
- m_SecondPass = false;
- GetBlockPrice(1, m_NumDivPasses);
- CodeBlock(1, Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) == 0);
- nowPos += m_Tables[1].BlockSizeRes;
- if (progress != NULL)
- {
- UInt64 packSize = m_OutStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&nowPos, &packSize));
- }
- }
- while (Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) != 0);
- if (_lzInWindow.result != SZ_OK)
- return _lzInWindow.result;
- return m_OutStream.Flush();
-}
-
-HRESULT CCoder::BaseCode(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const COutBufferException &e) { return e.ErrorCode; }
- catch(...) { return E_FAIL; }
-}
-
-STDMETHODIMP CCOMCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
- { return BaseCode(inStream, outStream, inSize, outSize, progress); }
-
-STDMETHODIMP CCOMCoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
- { return BaseSetEncoderProperties2(propIDs, props, numProps); }
-
-STDMETHODIMP CCOMCoder64::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
- { return BaseCode(inStream, outStream, inSize, outSize, progress); }
-
-STDMETHODIMP CCOMCoder64::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
- { return BaseSetEncoderProperties2(propIDs, props, numProps); }
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateEncoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/DeflateEncoder.h
deleted file mode 100644
index 71c39e4e5..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateEncoder.h
+++ /dev/null
@@ -1,211 +0,0 @@
-// DeflateEncoder.h
-
-#ifndef __DEFLATE_ENCODER_H
-#define __DEFLATE_ENCODER_H
-
-#include "../../../C/LzFind.h"
-
-#include "Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "BitlEncoder.h"
-#include "DeflateConst.h"
-
-namespace NCompress {
-namespace NDeflate {
-namespace NEncoder {
-
-struct CCodeValue
-{
- UInt16 Len;
- UInt16 Pos;
- void SetAsLiteral() { Len = (1 << 15); }
- bool IsLiteral() const { return (Len >= (1 << 15)); }
-};
-
-struct COptimal
-{
- UInt32 Price;
- UInt16 PosPrev;
- UInt16 BackPrev;
-};
-
-const UInt32 kNumOptsBase = 1 << 12;
-const UInt32 kNumOpts = kNumOptsBase + kMatchMaxLen;
-
-class CCoder;
-
-struct CTables: public CLevels
-{
- bool UseSubBlocks;
- bool StoreMode;
- bool StaticMode;
- UInt32 BlockSizeRes;
- UInt32 m_Pos;
- void InitStructures();
-};
-
-typedef struct _CSeqInStream
-{
- ISeqInStream SeqInStream;
- CMyComPtr<ISequentialInStream> RealStream;
-} CSeqInStream;
-
-class CCoder
-{
- CMatchFinder _lzInWindow;
- CBitlEncoder m_OutStream;
-
- CSeqInStream _seqInStream;
-
-public:
- CCodeValue *m_Values;
-
- UInt16 *m_MatchDistances;
- UInt32 m_NumFastBytes;
- bool _fastMode;
- bool _btMode;
-
- UInt16 *m_OnePosMatchesMemory;
- UInt16 *m_DistanceMemory;
-
- UInt32 m_Pos;
-
- int m_NumPasses;
- int m_NumDivPasses;
- bool m_CheckStatic;
- bool m_IsMultiPass;
- UInt32 m_ValueBlockSize;
-
- UInt32 m_NumLenCombinations;
- UInt32 m_MatchMaxLen;
- const Byte *m_LenStart;
- const Byte *m_LenDirectBits;
-
- bool m_Created;
- bool m_Deflate64Mode;
-
- Byte m_LevelLevels[kLevelTableSize];
- int m_NumLitLenLevels;
- int m_NumDistLevels;
- UInt32 m_NumLevelCodes;
- UInt32 m_ValueIndex;
-
- bool m_SecondPass;
- UInt32 m_AdditionalOffset;
-
- UInt32 m_OptimumEndIndex;
- UInt32 m_OptimumCurrentIndex;
-
- Byte m_LiteralPrices[256];
- Byte m_LenPrices[kNumLenSymbolsMax];
- Byte m_PosPrices[kDistTableSize64];
-
- CLevels m_NewLevels;
- UInt32 mainFreqs[kFixedMainTableSize];
- UInt32 distFreqs[kDistTableSize64];
- UInt32 mainCodes[kFixedMainTableSize];
- UInt32 distCodes[kDistTableSize64];
- UInt32 levelCodes[kLevelTableSize];
- Byte levelLens[kLevelTableSize];
-
- UInt32 BlockSizeRes;
-
- CTables *m_Tables;
- COptimal m_Optimum[kNumOpts];
-
- UInt32 m_MatchFinderCycles;
- // IMatchFinderSetNumPasses *m_SetMfPasses;
-
- void GetMatches();
- void MovePos(UInt32 num);
- UInt32 Backward(UInt32 &backRes, UInt32 cur);
- UInt32 GetOptimal(UInt32 &backRes);
- UInt32 GetOptimalFast(UInt32 &backRes);
-
- void LevelTableDummy(const Byte *levels, int numLevels, UInt32 *freqs);
-
- void WriteBits(UInt32 value, int numBits);
- void LevelTableCode(const Byte *levels, int numLevels, const Byte *lens, const UInt32 *codes);
-
- void MakeTables(unsigned maxHuffLen);
- UInt32 GetLzBlockPrice() const;
- void TryBlock();
- UInt32 TryDynBlock(int tableIndex, UInt32 numPasses);
-
- UInt32 TryFixedBlock(int tableIndex);
-
- void SetPrices(const CLevels &levels);
- void WriteBlock();
-
- HRESULT Create();
- void Free();
-
- void WriteStoreBlock(UInt32 blockSize, UInt32 additionalOffset, bool finalBlock);
- void WriteTables(bool writeMode, bool finalBlock);
-
- void WriteBlockData(bool writeMode, bool finalBlock);
-
- void ReleaseStreams()
- {
- _seqInStream.RealStream.Release();
- m_OutStream.ReleaseStream();
- }
- class CCoderReleaser
- {
- CCoder *m_Coder;
- public:
- CCoderReleaser(CCoder *coder): m_Coder(coder) {}
- ~CCoderReleaser() { m_Coder->ReleaseStreams(); }
- };
- friend class CCoderReleaser;
-
- UInt32 GetBlockPrice(int tableIndex, int numDivPasses);
- void CodeBlock(int tableIndex, bool finalBlock);
-
-public:
- CCoder(bool deflate64Mode = false);
- ~CCoder();
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- HRESULT BaseCode(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- HRESULT BaseSetEncoderProperties2(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
-};
-
-
-class CCOMCoder :
- public ICompressCoder,
- public ICompressSetCoderProperties,
- public CMyUnknownImp,
- public CCoder
-{
-public:
- MY_UNKNOWN_IMP1(ICompressSetCoderProperties)
- CCOMCoder(): CCoder(false) {};
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
-};
-
-class CCOMCoder64 :
- public ICompressCoder,
- public ICompressSetCoderProperties,
- public CMyUnknownImp,
- public CCoder
-{
-public:
- MY_UNKNOWN_IMP1(ICompressSetCoderProperties)
- CCOMCoder64(): CCoder(true) {};
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateNsisRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/DeflateNsisRegister.cpp
deleted file mode 100644
index ffad96c21..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateNsisRegister.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-// DeflateNsisRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "DeflateDecoder.h"
-
-static void *CreateCodecDeflateNsis() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NDecoder::CNsisCOMCoder); }
-
-static CCodecInfo g_CodecInfo =
- { CreateCodecDeflateNsis, 0, 0x040901, L"DeflateNSIS", 1, false };
-
-REGISTER_CODEC(DeflateNsis)
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/DeflateRegister.cpp
deleted file mode 100644
index 45f55219e..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/DeflateRegister.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// DeflateRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "DeflateDecoder.h"
-
-static void *CreateCodecDeflate() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NDecoder::CCOMCoder); }
-
-#if !defined(EXTRACT_ONLY) && !defined(DEFLATE_EXTRACT_ONLY)
-#include "DeflateEncoder.h"
-static void *CreateCodecOutDeflate() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NEncoder::CCOMCoder); }
-#else
-#define CreateCodecOutDeflate 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodecDeflate, CreateCodecOutDeflate, 0x040108, L"Deflate", 1, false };
-
-REGISTER_CODEC(Deflate)
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/DllExports.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/DllExports.cpp
deleted file mode 100644
index a7ec90270..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/DllExports.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-// DllExports.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/MyInitGuid.h"
-
-#include "../ICoder.h"
-
-#include "../Common/RegisterCodec.h"
-
-static const unsigned int kNumCodecsMax = 32;
-unsigned int g_NumCodecs = 0;
-const CCodecInfo *g_Codecs[kNumCodecsMax];
-void RegisterCodec(const CCodecInfo *codecInfo)
-{
- if (g_NumCodecs < kNumCodecsMax)
- g_Codecs[g_NumCodecs++] = codecInfo;
-}
-
-#ifdef _WIN32
-extern "C"
-BOOL WINAPI DllMain(HINSTANCE /* hInstance */, DWORD /* dwReason */, LPVOID /*lpReserved*/)
-{
- return TRUE;
-}
-#endif
-
-static const UInt16 kDecodeId = 0x2790;
-
-DEFINE_GUID(CLSID_CCodec,
-0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
-
-STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject);
-
-STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject)
-{
- return CreateCoder(clsid, iid, outObject);
-}
-
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/DllExports2.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/DllExports2.cpp
deleted file mode 100644
index 836f3fa42..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/DllExports2.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-// DllExports.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/MyInitGuid.h"
-
-#include "../ICoder.h"
-
-#include "../Common/RegisterCodec.h"
-
-extern "C"
-BOOL WINAPI DllMain(HINSTANCE /* hInstance */, DWORD /* dwReason */, LPVOID /*lpReserved*/)
-{
- return TRUE;
-}
-
-static const UInt16 kDecodeId = 0x2790;
-
-DEFINE_GUID(CLSID_CCodec,
-0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
-
-STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject);
-
-STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject)
-{
- return CreateCoder(clsid, iid, outObject);
-}
-
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/HuffmanDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/HuffmanDecoder.h
deleted file mode 100644
index 74a389a16..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/HuffmanDecoder.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// Compress/HuffmanDecoder.h
-
-#ifndef __COMPRESS_HUFFMAN_DECODER_H
-#define __COMPRESS_HUFFMAN_DECODER_H
-
-#include "../../Common/Types.h"
-
-namespace NCompress {
-namespace NHuffman {
-
-const int kNumTableBits = 9;
-
-template <int kNumBitsMax, UInt32 m_NumSymbols>
-class CDecoder
-{
- UInt32 m_Limits[kNumBitsMax + 1]; // m_Limits[i] = value limit for symbols with length = i
- UInt32 m_Positions[kNumBitsMax + 1]; // m_Positions[i] = index in m_Symbols[] of first symbol with length = i
- UInt32 m_Symbols[m_NumSymbols];
- Byte m_Lengths[1 << kNumTableBits]; // Table oh length for short codes.
-
-public:
-
- bool SetCodeLengths(const Byte *codeLengths)
- {
- int lenCounts[kNumBitsMax + 1];
- UInt32 tmpPositions[kNumBitsMax + 1];
- int i;
- for(i = 1; i <= kNumBitsMax; i++)
- lenCounts[i] = 0;
- UInt32 symbol;
- for (symbol = 0; symbol < m_NumSymbols; symbol++)
- {
- int len = codeLengths[symbol];
- if (len > kNumBitsMax)
- return false;
- lenCounts[len]++;
- m_Symbols[symbol] = 0xFFFFFFFF;
- }
- lenCounts[0] = 0;
- m_Positions[0] = m_Limits[0] = 0;
- UInt32 startPos = 0;
- UInt32 index = 0;
- const UInt32 kMaxValue = (1 << kNumBitsMax);
- for (i = 1; i <= kNumBitsMax; i++)
- {
- startPos += lenCounts[i] << (kNumBitsMax - i);
- if (startPos > kMaxValue)
- return false;
- m_Limits[i] = (i == kNumBitsMax) ? kMaxValue : startPos;
- m_Positions[i] = m_Positions[i - 1] + lenCounts[i - 1];
- tmpPositions[i] = m_Positions[i];
- if(i <= kNumTableBits)
- {
- UInt32 limit = (m_Limits[i] >> (kNumBitsMax - kNumTableBits));
- for (; index < limit; index++)
- m_Lengths[index] = (Byte)i;
- }
- }
- for (symbol = 0; symbol < m_NumSymbols; symbol++)
- {
- int len = codeLengths[symbol];
- if (len != 0)
- m_Symbols[tmpPositions[len]++] = symbol;
- }
- return true;
- }
-
- template <class TBitDecoder>
- UInt32 DecodeSymbol(TBitDecoder *bitStream)
- {
- int numBits;
- UInt32 value = bitStream->GetValue(kNumBitsMax);
- if (value < m_Limits[kNumTableBits])
- numBits = m_Lengths[value >> (kNumBitsMax - kNumTableBits)];
- else
- for (numBits = kNumTableBits + 1; value >= m_Limits[numBits]; numBits++) {}
- bitStream->MovePos(numBits);
- UInt32 index = m_Positions[numBits] +
- ((value - m_Limits[numBits - 1]) >> (kNumBitsMax - numBits));
- if (index >= m_NumSymbols)
- // throw CDecoderException(); // test it
- return 0xFFFFFFFF;
- return m_Symbols[index];
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeDecoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeDecoder.cpp
deleted file mode 100644
index f84a013c2..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeDecoder.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-// Implode/Decoder.cpp
-
-#include "StdAfx.h"
-
-#include "ImplodeDecoder.h"
-#include "Common/Defs.h"
-
-namespace NCompress {
-namespace NImplode {
-namespace NDecoder {
-
-class CException
-{
-public:
- enum ECauseType
- {
- kData
- } m_Cause;
- CException(ECauseType cause): m_Cause(cause) {}
-};
-
-static const int kNumDistanceLowDirectBitsForBigDict = 7;
-static const int kNumDistanceLowDirectBitsForSmallDict = 6;
-
-static const int kNumBitsInByte = 8;
-
-// static const int kLevelStructuresNumberFieldSize = kNumBitsInByte;
-static const int kLevelStructuresNumberAdditionalValue = 1;
-
-static const int kNumLevelStructureLevelBits = 4;
-static const int kLevelStructureLevelAdditionalValue = 1;
-
-static const int kNumLevelStructureRepNumberBits = 4;
-static const int kLevelStructureRepNumberAdditionalValue = 1;
-
-
-static const int kLiteralTableSize = (1 << kNumBitsInByte);
-static const int kDistanceTableSize = 64;
-static const int kLengthTableSize = 64;
-
-static const UInt32 kHistorySize =
- (1 << MyMax(kNumDistanceLowDirectBitsForBigDict,
- kNumDistanceLowDirectBitsForSmallDict)) *
- kDistanceTableSize; // = 8 KB;
-
-static const int kNumAdditionalLengthBits = 8;
-
-static const UInt32 kMatchMinLenWhenLiteralsOn = 3;
-static const UInt32 kMatchMinLenWhenLiteralsOff = 2;
-
-static const UInt32 kMatchMinLenMax = MyMax(kMatchMinLenWhenLiteralsOn,
- kMatchMinLenWhenLiteralsOff); // 3
-
-// static const UInt32 kMatchMaxLenMax = kMatchMinLenMax + (kLengthTableSize - 1) + (1 << kNumAdditionalLengthBits) - 1; // or 2
-
-enum
-{
- kMatchId = 0,
- kLiteralId = 1
-};
-
-
-CCoder::CCoder():
- m_LiteralDecoder(kLiteralTableSize),
- m_LengthDecoder(kLengthTableSize),
- m_DistanceDecoder(kDistanceTableSize)
-{
-}
-
-void CCoder::ReleaseStreams()
-{
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
-}
-
-bool CCoder::ReadLevelItems(NImplode::NHuffman::CDecoder &decoder,
- Byte *levels, int numLevelItems)
-{
- int numCodedStructures = m_InBitStream.ReadBits(kNumBitsInByte) +
- kLevelStructuresNumberAdditionalValue;
- int currentIndex = 0;
- for(int i = 0; i < numCodedStructures; i++)
- {
- int level = m_InBitStream.ReadBits(kNumLevelStructureLevelBits) +
- kLevelStructureLevelAdditionalValue;
- int rep = m_InBitStream.ReadBits(kNumLevelStructureRepNumberBits) +
- kLevelStructureRepNumberAdditionalValue;
- if (currentIndex + rep > numLevelItems)
- throw CException(CException::kData);
- for(int j = 0; j < rep; j++)
- levels[currentIndex++] = (Byte)level;
- }
- if (currentIndex != numLevelItems)
- return false;
- return decoder.SetCodeLengths(levels);
-}
-
-
-bool CCoder::ReadTables(void)
-{
- if (m_LiteralsOn)
- {
- Byte literalLevels[kLiteralTableSize];
- if (!ReadLevelItems(m_LiteralDecoder, literalLevels, kLiteralTableSize))
- return false;
- }
-
- Byte lengthLevels[kLengthTableSize];
- if (!ReadLevelItems(m_LengthDecoder, lengthLevels, kLengthTableSize))
- return false;
-
- Byte distanceLevels[kDistanceTableSize];
- return ReadLevelItems(m_DistanceDecoder, distanceLevels, kDistanceTableSize);
-}
-
-class CCoderReleaser
-{
- CCoder *m_Coder;
-public:
- CCoderReleaser(CCoder *coder): m_Coder(coder) {}
- ~CCoderReleaser() { m_Coder->ReleaseStreams(); }
-};
-
-HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (outSize == NULL)
- return E_INVALIDARG;
- UInt64 pos = 0, unPackSize = *outSize;
-
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(false);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
- CCoderReleaser coderReleaser(this);
-
- if (!ReadTables())
- return S_FALSE;
-
- while(pos < unPackSize)
- {
- if (progress != NULL && pos % (1 << 16) == 0)
- {
- UInt64 packSize = m_InBitStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &pos));
- }
- if(m_InBitStream.ReadBits(1) == kMatchId) // match
- {
- UInt32 lowDistBits = m_InBitStream.ReadBits(m_NumDistanceLowDirectBits);
- UInt32 distance = m_DistanceDecoder.DecodeSymbol(&m_InBitStream);
- if (distance >= kDistanceTableSize)
- return S_FALSE;
- distance = (distance << m_NumDistanceLowDirectBits) + lowDistBits;
- UInt32 lengthSymbol = m_LengthDecoder.DecodeSymbol(&m_InBitStream);
- if (lengthSymbol >= kLengthTableSize)
- return S_FALSE;
- UInt32 length = lengthSymbol + m_MinMatchLength;
- if (lengthSymbol == kLengthTableSize - 1) // special symbol = 63
- length += m_InBitStream.ReadBits(kNumAdditionalLengthBits);
- while(distance >= pos && length > 0)
- {
- m_OutWindowStream.PutByte(0);
- pos++;
- length--;
- }
- if (length > 0)
- m_OutWindowStream.CopyBlock(distance, length);
- pos += length;
- }
- else
- {
- Byte b;
- if (m_LiteralsOn)
- {
- UInt32 temp = m_LiteralDecoder.DecodeSymbol(&m_InBitStream);
- if (temp >= kLiteralTableSize)
- return S_FALSE;
- b = (Byte)temp;
- }
- else
- b = (Byte)m_InBitStream.ReadBits(kNumBitsInByte);
- m_OutWindowStream.PutByte(b);
- pos++;
- }
- }
- if (pos > unPackSize)
- return S_FALSE;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CCoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size < 1)
- return E_INVALIDARG;
- Byte flag = data[0];
- m_BigDictionaryOn = ((flag & 2) != 0);
- m_NumDistanceLowDirectBits = m_BigDictionaryOn ?
- kNumDistanceLowDirectBitsForBigDict:
- kNumDistanceLowDirectBitsForSmallDict;
- m_LiteralsOn = ((flag & 4) != 0);
- m_MinMatchLength = m_LiteralsOn ?
- kMatchMinLenWhenLiteralsOn :
- kMatchMinLenWhenLiteralsOff;
- return S_OK;
-}
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeDecoder.h
deleted file mode 100644
index 7ea1553ee..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeDecoder.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// ImplodeDecoder.h
-
-#ifndef __COMPRESS_IMPLODE_DECODER_H
-#define __COMPRESS_IMPLODE_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "ImplodeHuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NImplode {
-namespace NDecoder {
-
-class CCoder:
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- NBitl::CDecoder<CInBuffer> m_InBitStream;
-
- NImplode::NHuffman::CDecoder m_LiteralDecoder;
- NImplode::NHuffman::CDecoder m_LengthDecoder;
- NImplode::NHuffman::CDecoder m_DistanceDecoder;
-
- bool m_BigDictionaryOn;
- bool m_LiteralsOn;
-
- int m_NumDistanceLowDirectBits;
- UInt32 m_MinMatchLength;
-
- bool ReadLevelItems(NImplode::NHuffman::CDecoder &table, Byte *levels, int numLevelItems);
- bool ReadTables();
- void DeCodeLevelTable(Byte *newLevels, int numLevels);
-public:
- CCoder();
-
- MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
- void ReleaseStreams();
- HRESULT Flush() { return m_OutWindowStream.Flush(); }
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp
deleted file mode 100644
index 64345e08b..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-// ImplodeHuffmanDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "ImplodeHuffmanDecoder.h"
-
-namespace NCompress {
-namespace NImplode {
-namespace NHuffman {
-
-CDecoder::CDecoder(UInt32 numSymbols):
- m_NumSymbols(numSymbols)
-{
- m_Symbols = new UInt32[m_NumSymbols];
-}
-
-CDecoder::~CDecoder()
-{
- delete []m_Symbols;
-}
-
-bool CDecoder::SetCodeLengths(const Byte *codeLengths)
-{
- // int lenCounts[kNumBitsInLongestCode + 1], tmpPositions[kNumBitsInLongestCode + 1];
- int lenCounts[kNumBitsInLongestCode + 2], tmpPositions[kNumBitsInLongestCode + 1];
- int i;
- for(i = 0; i <= kNumBitsInLongestCode; i++)
- lenCounts[i] = 0;
- UInt32 symbolIndex;
- for (symbolIndex = 0; symbolIndex < m_NumSymbols; symbolIndex++)
- lenCounts[codeLengths[symbolIndex]]++;
- // lenCounts[0] = 0;
-
- // tmpPositions[0] = m_Positions[0] = m_Limitits[0] = 0;
- m_Limitits[kNumBitsInLongestCode + 1] = 0;
- m_Positions[kNumBitsInLongestCode + 1] = 0;
- lenCounts[kNumBitsInLongestCode + 1] = 0;
-
-
- UInt32 startPos = 0;
- static const UInt32 kMaxValue = (1 << kNumBitsInLongestCode);
-
- for (i = kNumBitsInLongestCode; i > 0; i--)
- {
- startPos += lenCounts[i] << (kNumBitsInLongestCode - i);
- if (startPos > kMaxValue)
- return false;
- m_Limitits[i] = startPos;
- m_Positions[i] = m_Positions[i + 1] + lenCounts[i + 1];
- tmpPositions[i] = m_Positions[i] + lenCounts[i];
-
- }
-
- // if _ZIP_MODE do not throw exception for trees containing only one node
- // #ifndef _ZIP_MODE
- if (startPos != kMaxValue)
- return false;
- // #endif
-
- for (symbolIndex = 0; symbolIndex < m_NumSymbols; symbolIndex++)
- if (codeLengths[symbolIndex] != 0)
- m_Symbols[--tmpPositions[codeLengths[symbolIndex]]] = symbolIndex;
- return true;
-}
-
-UInt32 CDecoder::DecodeSymbol(CInBit *inStream)
-{
- UInt32 numBits = 0;
- UInt32 value = inStream->GetValue(kNumBitsInLongestCode);
- int i;
- for(i = kNumBitsInLongestCode; i > 0; i--)
- {
- if (value < m_Limitits[i])
- {
- numBits = i;
- break;
- }
- }
- if (i == 0)
- return 0xFFFFFFFF;
- inStream->MovePos(numBits);
- UInt32 index = m_Positions[numBits] +
- ((value - m_Limitits[numBits + 1]) >> (kNumBitsInLongestCode - numBits));
- if (index >= m_NumSymbols)
- return 0xFFFFFFFF;
- return m_Symbols[index];
-}
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeHuffmanDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeHuffmanDecoder.h
deleted file mode 100644
index 6120a35ab..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ImplodeHuffmanDecoder.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// ImplodeHuffmanDecoder.h
-
-#ifndef __IMPLODE_HUFFMAN_DECODER_H
-#define __IMPLODE_HUFFMAN_DECODER_H
-
-#include "../Common/InBuffer.h"
-
-#include "BitlDecoder.h"
-
-namespace NCompress {
-namespace NImplode {
-namespace NHuffman {
-
-const int kNumBitsInLongestCode = 16;
-
-typedef NBitl::CDecoder<CInBuffer> CInBit;
-
-class CDecoder
-{
- UInt32 m_Limitits[kNumBitsInLongestCode + 2]; // m_Limitits[i] = value limit for symbols with length = i
- UInt32 m_Positions[kNumBitsInLongestCode + 2]; // m_Positions[i] = index in m_Symbols[] of first symbol with length = i
- UInt32 m_NumSymbols; // number of symbols in m_Symbols
- UInt32 *m_Symbols; // symbols: at first with len=1 then 2, ... 15.
-public:
- CDecoder(UInt32 numSymbols);
- ~CDecoder();
-
- bool SetCodeLengths(const Byte *codeLengths);
- UInt32 DecodeSymbol(CInBit *inStream);
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp
deleted file mode 100644
index e34e2ed72..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp
+++ /dev/null
@@ -1,531 +0,0 @@
-// LzmaAlone.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/MyWindows.h"
-#include "../../../Common/MyInitGuid.h"
-
-#include <stdio.h>
-
-#if defined(_WIN32) || defined(OS2) || defined(MSDOS)
-#include <fcntl.h>
-#include <io.h>
-#define MY_SET_BINARY_MODE(file) _setmode(_fileno(file), O_BINARY)
-#else
-#define MY_SET_BINARY_MODE(file)
-#endif
-
-#include "../../../Common/CommandLineParser.h"
-#include "../../../Common/StringConvert.h"
-#include "../../../Common/StringToInt.h"
-
-#include "../../Common/FileStreams.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../LzmaDecoder.h"
-#include "../LzmaEncoder.h"
-
-#include "LzmaBenchCon.h"
-
-#ifndef _7ZIP_ST
-#include "../../../Windows/System.h"
-#endif
-
-#include "../../../../C/7zVersion.h"
-#include "../../../../C/Alloc.h"
-#include "../../../../C/LzmaUtil/Lzma86Dec.h"
-#include "../../../../C/LzmaUtil/Lzma86Enc.h"
-
-using namespace NCommandLineParser;
-
-#ifdef _WIN32
-bool g_IsNT = false;
-static inline bool IsItWindowsNT()
-{
- OSVERSIONINFO versionInfo;
- versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
- if (!::GetVersionEx(&versionInfo))
- return false;
- return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);
-}
-#endif
-
-static const char *kCantAllocate = "Can not allocate memory";
-static const char *kReadError = "Read error";
-static const char *kWriteError = "Write error";
-
-namespace NKey {
-enum Enum
-{
- kHelp1 = 0,
- kHelp2,
- kAlgo,
- kDict,
- kFb,
- kMc,
- kLc,
- kLp,
- kPb,
- kMatchFinder,
- kMultiThread,
- kEOS,
- kStdIn,
- kStdOut,
- kFilter86
-};
-}
-
-static const CSwitchForm kSwitchForms[] =
-{
- { L"?", NSwitchType::kSimple, false },
- { L"H", NSwitchType::kSimple, false },
- { L"A", NSwitchType::kUnLimitedPostString, false, 1 },
- { L"D", NSwitchType::kUnLimitedPostString, false, 1 },
- { L"FB", NSwitchType::kUnLimitedPostString, false, 1 },
- { L"MC", NSwitchType::kUnLimitedPostString, false, 1 },
- { L"LC", NSwitchType::kUnLimitedPostString, false, 1 },
- { L"LP", NSwitchType::kUnLimitedPostString, false, 1 },
- { L"PB", NSwitchType::kUnLimitedPostString, false, 1 },
- { L"MF", NSwitchType::kUnLimitedPostString, false, 1 },
- { L"MT", NSwitchType::kUnLimitedPostString, false, 0 },
- { L"EOS", NSwitchType::kSimple, false },
- { L"SI", NSwitchType::kSimple, false },
- { L"SO", NSwitchType::kSimple, false },
- { L"F86", NSwitchType::kPostChar, false, 0, 0, L"+" }
-};
-
-static const int kNumSwitches = sizeof(kSwitchForms) / sizeof(kSwitchForms[0]);
-
-static void PrintHelp()
-{
- fprintf(stderr, "\nUsage: LZMA <e|d> inputFile outputFile [<switches>...]\n"
- " e: encode file\n"
- " d: decode file\n"
- " b: Benchmark\n"
- "<Switches>\n"
- " -a{N}: set compression mode - [0, 1], default: 1 (max)\n"
- " -d{N}: set dictionary size - [12, 30], default: 23 (8MB)\n"
- " -fb{N}: set number of fast bytes - [5, 273], default: 128\n"
- " -mc{N}: set number of cycles for match finder\n"
- " -lc{N}: set number of literal context bits - [0, 8], default: 3\n"
- " -lp{N}: set number of literal pos bits - [0, 4], default: 0\n"
- " -pb{N}: set number of pos bits - [0, 4], default: 2\n"
- " -mf{MF_ID}: set Match Finder: [bt2, bt3, bt4, hc4], default: bt4\n"
- " -mt{N}: set number of CPU threads\n"
- " -eos: write End Of Stream marker\n"
- " -si: read data from stdin\n"
- " -so: write data to stdout\n"
- );
-}
-
-static void PrintHelpAndExit(const char *s)
-{
- fprintf(stderr, "\nError: %s\n\n", s);
- PrintHelp();
- throw -1;
-}
-
-static void IncorrectCommand()
-{
- PrintHelpAndExit("Incorrect command");
-}
-
-static void WriteArgumentsToStringList(int numArguments, const char *arguments[],
- UStringVector &strings)
-{
- for(int i = 1; i < numArguments; i++)
- strings.Add(MultiByteToUnicodeString(arguments[i]));
-}
-
-static bool GetNumber(const wchar_t *s, UInt32 &value)
-{
- value = 0;
- if (MyStringLen(s) == 0)
- return false;
- const wchar_t *end;
- UInt64 res = ConvertStringToUInt64(s, &end);
- if (*end != L'\0')
- return false;
- if (res > 0xFFFFFFFF)
- return false;
- value = UInt32(res);
- return true;
-}
-
-static void ParseUInt32(const CParser &parser, int index, UInt32 &res)
-{
- if (parser[index].ThereIs)
- if (!GetNumber(parser[index].PostStrings[0], res))
- IncorrectCommand();
-}
-
-int main2(int n, const char *args[])
-{
- #ifdef _WIN32
- g_IsNT = IsItWindowsNT();
- #endif
-
- fprintf(stderr, "\nLZMA " MY_VERSION_COPYRIGHT_DATE "\n");
-
- if (n == 1)
- {
- PrintHelp();
- return 0;
- }
-
- bool unsupportedTypes = (sizeof(Byte) != 1 || sizeof(UInt32) < 4 || sizeof(UInt64) < 4);
- if (unsupportedTypes)
- {
- fprintf(stderr, "Unsupported base types. Edit Common/Types.h and recompile");
- return 1;
- }
-
- UStringVector commandStrings;
- WriteArgumentsToStringList(n, args, commandStrings);
- CParser parser(kNumSwitches);
- try
- {
- parser.ParseStrings(kSwitchForms, commandStrings);
- }
- catch(...)
- {
- IncorrectCommand();
- }
-
- if(parser[NKey::kHelp1].ThereIs || parser[NKey::kHelp2].ThereIs)
- {
- PrintHelp();
- return 0;
- }
- const UStringVector &nonSwitchStrings = parser.NonSwitchStrings;
-
- int paramIndex = 0;
- if (paramIndex >= nonSwitchStrings.Size())
- IncorrectCommand();
- const UString &command = nonSwitchStrings[paramIndex++];
-
- bool dictDefined = false;
- UInt32 dict = (UInt32)-1;
- if(parser[NKey::kDict].ThereIs)
- {
- UInt32 dicLog;
- if (!GetNumber(parser[NKey::kDict].PostStrings[0], dicLog))
- IncorrectCommand();
- dict = 1 << dicLog;
- dictDefined = true;
- }
- UString mf = L"BT4";
- if (parser[NKey::kMatchFinder].ThereIs)
- mf = parser[NKey::kMatchFinder].PostStrings[0];
-
- UInt32 numThreads = (UInt32)-1;
-
- #ifndef _7ZIP_ST
- if (parser[NKey::kMultiThread].ThereIs)
- {
- UInt32 numCPUs = NWindows::NSystem::GetNumberOfProcessors();
- const UString &s = parser[NKey::kMultiThread].PostStrings[0];
- if (s.IsEmpty())
- numThreads = numCPUs;
- else
- if (!GetNumber(s, numThreads))
- IncorrectCommand();
- }
- #endif
-
- if (command.CompareNoCase(L"b") == 0)
- {
- const UInt32 kNumDefaultItereations = 1;
- UInt32 numIterations = kNumDefaultItereations;
- {
- if (paramIndex < nonSwitchStrings.Size())
- if (!GetNumber(nonSwitchStrings[paramIndex++], numIterations))
- numIterations = kNumDefaultItereations;
- }
- return LzmaBenchCon(stderr, numIterations, numThreads, dict);
- }
-
- if (numThreads == (UInt32)-1)
- numThreads = 1;
-
- bool encodeMode = false;
- if (command.CompareNoCase(L"e") == 0)
- encodeMode = true;
- else if (command.CompareNoCase(L"d") == 0)
- encodeMode = false;
- else
- IncorrectCommand();
-
- bool stdInMode = parser[NKey::kStdIn].ThereIs;
- bool stdOutMode = parser[NKey::kStdOut].ThereIs;
-
- CMyComPtr<ISequentialInStream> inStream;
- CInFileStream *inStreamSpec = 0;
- if (stdInMode)
- {
- inStream = new CStdInFileStream;
- MY_SET_BINARY_MODE(stdin);
- }
- else
- {
- if (paramIndex >= nonSwitchStrings.Size())
- IncorrectCommand();
- const UString &inputName = nonSwitchStrings[paramIndex++];
- inStreamSpec = new CInFileStream;
- inStream = inStreamSpec;
- if (!inStreamSpec->Open(GetSystemString(inputName)))
- {
- fprintf(stderr, "\nError: can not open input file %s\n",
- (const char *)GetOemString(inputName));
- return 1;
- }
- }
-
- CMyComPtr<ISequentialOutStream> outStream;
- COutFileStream *outStreamSpec = NULL;
- if (stdOutMode)
- {
- outStream = new CStdOutFileStream;
- MY_SET_BINARY_MODE(stdout);
- }
- else
- {
- if (paramIndex >= nonSwitchStrings.Size())
- IncorrectCommand();
- const UString &outputName = nonSwitchStrings[paramIndex++];
- outStreamSpec = new COutFileStream;
- outStream = outStreamSpec;
- if (!outStreamSpec->Create(GetSystemString(outputName), true))
- {
- fprintf(stderr, "\nError: can not open output file %s\n",
- (const char *)GetOemString(outputName));
- return 1;
- }
- }
-
- if (parser[NKey::kFilter86].ThereIs)
- {
- // -f86 switch is for x86 filtered mode: BCJ + LZMA.
- if (parser[NKey::kEOS].ThereIs || stdInMode)
- throw "Can not use stdin in this mode";
- UInt64 fileSize;
- inStreamSpec->File.GetLength(fileSize);
- if (fileSize > 0xF0000000)
- throw "File is too big";
- size_t inSize = (size_t)fileSize;
- Byte *inBuffer = 0;
- if (inSize != 0)
- {
- inBuffer = (Byte *)MyAlloc((size_t)inSize);
- if (inBuffer == 0)
- throw kCantAllocate;
- }
-
- if (ReadStream_FAIL(inStream, inBuffer, inSize) != S_OK)
- throw "Can not read";
-
- Byte *outBuffer = 0;
- size_t outSize;
- if (encodeMode)
- {
- // we allocate 105% of original size for output buffer
- outSize = (size_t)fileSize / 20 * 21 + (1 << 16);
- if (outSize != 0)
- {
- outBuffer = (Byte *)MyAlloc((size_t)outSize);
- if (outBuffer == 0)
- throw kCantAllocate;
- }
- if (!dictDefined)
- dict = 1 << 23;
- int res = Lzma86_Encode(outBuffer, &outSize, inBuffer, inSize,
- 5, dict, parser[NKey::kFilter86].PostCharIndex == 0 ? SZ_FILTER_YES : SZ_FILTER_AUTO);
- if (res != 0)
- {
- fprintf(stderr, "\nEncoder error = %d\n", (int)res);
- return 1;
- }
- }
- else
- {
- UInt64 outSize64;
- if (Lzma86_GetUnpackSize(inBuffer, inSize, &outSize64) != 0)
- throw "data error";
- outSize = (size_t)outSize64;
- if (outSize != outSize64)
- throw "too big";
- if (outSize != 0)
- {
- outBuffer = (Byte *)MyAlloc(outSize);
- if (outBuffer == 0)
- throw kCantAllocate;
- }
- int res = Lzma86_Decode(outBuffer, &outSize, inBuffer, &inSize);
- if (inSize != (size_t)fileSize)
- throw "incorrect processed size";
- if (res != 0)
- throw "LzmaDecoder error";
- }
- if (WriteStream(outStream, outBuffer, outSize) != S_OK)
- throw kWriteError;
- MyFree(outBuffer);
- MyFree(inBuffer);
- return 0;
- }
-
-
- UInt64 fileSize;
- if (encodeMode)
- {
- NCompress::NLzma::CEncoder *encoderSpec = new NCompress::NLzma::CEncoder;
- CMyComPtr<ICompressCoder> encoder = encoderSpec;
-
- if (!dictDefined)
- dict = 1 << 23;
-
- UInt32 pb = 2;
- UInt32 lc = 3; // = 0; for 32-bit data
- UInt32 lp = 0; // = 2; for 32-bit data
- UInt32 algo = 1;
- UInt32 fb = 128;
- UInt32 mc = 16 + fb / 2;
- bool mcDefined = false;
-
- bool eos = parser[NKey::kEOS].ThereIs || stdInMode;
-
- ParseUInt32(parser, NKey::kAlgo, algo);
- ParseUInt32(parser, NKey::kFb, fb);
- ParseUInt32(parser, NKey::kLc, lc);
- ParseUInt32(parser, NKey::kLp, lp);
- ParseUInt32(parser, NKey::kPb, pb);
-
- mcDefined = parser[NKey::kMc].ThereIs;
- if (mcDefined)
- if (!GetNumber(parser[NKey::kMc].PostStrings[0], mc))
- IncorrectCommand();
-
- PROPID propIDs[] =
- {
- NCoderPropID::kDictionarySize,
- NCoderPropID::kPosStateBits,
- NCoderPropID::kLitContextBits,
- NCoderPropID::kLitPosBits,
- NCoderPropID::kAlgorithm,
- NCoderPropID::kNumFastBytes,
- NCoderPropID::kMatchFinder,
- NCoderPropID::kEndMarker,
- NCoderPropID::kNumThreads,
- NCoderPropID::kMatchFinderCycles,
- };
- const int kNumPropsMax = sizeof(propIDs) / sizeof(propIDs[0]);
-
- PROPVARIANT props[kNumPropsMax];
- for (int p = 0; p < 6; p++)
- props[p].vt = VT_UI4;
-
- props[0].ulVal = (UInt32)dict;
- props[1].ulVal = (UInt32)pb;
- props[2].ulVal = (UInt32)lc;
- props[3].ulVal = (UInt32)lp;
- props[4].ulVal = (UInt32)algo;
- props[5].ulVal = (UInt32)fb;
-
- props[6].vt = VT_BSTR;
- props[6].bstrVal = (BSTR)(const wchar_t *)mf;
-
- props[7].vt = VT_BOOL;
- props[7].boolVal = eos ? VARIANT_TRUE : VARIANT_FALSE;
-
- props[8].vt = VT_UI4;
- props[8].ulVal = (UInt32)numThreads;
-
- // it must be last in property list
- props[9].vt = VT_UI4;
- props[9].ulVal = (UInt32)mc;
-
- int numProps = kNumPropsMax;
- if (!mcDefined)
- numProps--;
-
- if (encoderSpec->SetCoderProperties(propIDs, props, numProps) != S_OK)
- IncorrectCommand();
- encoderSpec->WriteCoderProperties(outStream);
-
- if (eos || stdInMode)
- fileSize = (UInt64)(Int64)-1;
- else
- inStreamSpec->File.GetLength(fileSize);
-
- for (int i = 0; i < 8; i++)
- {
- Byte b = Byte(fileSize >> (8 * i));
- if (outStream->Write(&b, 1, 0) != S_OK)
- {
- fprintf(stderr, kWriteError);
- return 1;
- }
- }
- HRESULT result = encoder->Code(inStream, outStream, 0, 0, 0);
- if (result == E_OUTOFMEMORY)
- {
- fprintf(stderr, "\nError: Can not allocate memory\n");
- return 1;
- }
- else if (result != S_OK)
- {
- fprintf(stderr, "\nEncoder error = %X\n", (unsigned int)result);
- return 1;
- }
- }
- else
- {
- NCompress::NLzma::CDecoder *decoderSpec = new NCompress::NLzma::CDecoder;
- CMyComPtr<ICompressCoder> decoder = decoderSpec;
- decoderSpec->FinishStream = true;
- const UInt32 kPropertiesSize = 5;
- Byte header[kPropertiesSize + 8];
- if (ReadStream_FALSE(inStream, header, kPropertiesSize + 8) != S_OK)
- {
- fprintf(stderr, kReadError);
- return 1;
- }
- if (decoderSpec->SetDecoderProperties2(header, kPropertiesSize) != S_OK)
- {
- fprintf(stderr, "SetDecoderProperties error");
- return 1;
- }
- fileSize = 0;
- for (int i = 0; i < 8; i++)
- fileSize |= ((UInt64)header[kPropertiesSize + i]) << (8 * i);
-
- if (decoder->Code(inStream, outStream, 0, (fileSize == (UInt64)(Int64)-1) ? 0 : &fileSize, 0) != S_OK)
- {
- fprintf(stderr, "Decoder error");
- return 1;
- }
- }
- if (outStreamSpec != NULL)
- {
- if (outStreamSpec->Close() != S_OK)
- {
- fprintf(stderr, "File closing error");
- return 1;
- }
- }
- return 0;
-}
-
-int MY_CDECL main(int n, const char *args[])
-{
- try { return main2(n, args); }
- catch(const char *s)
- {
- fprintf(stderr, "\nError: %s\n", s);
- return 1;
- }
- catch(...)
- {
- fprintf(stderr, "\nError\n");
- return 1;
- }
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp
deleted file mode 100644
index 6a325fe06..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp
+++ /dev/null
@@ -1,1018 +0,0 @@
-// LzmaBench.cpp
-
-#include "StdAfx.h"
-
-#include "LzmaBench.h"
-
-#ifndef _WIN32
-#define USE_POSIX_TIME
-#define USE_POSIX_TIME2
-#endif
-
-#ifdef USE_POSIX_TIME
-#include <time.h>
-#ifdef USE_POSIX_TIME2
-#include <sys/time.h>
-#endif
-#endif
-
-#ifdef _WIN32
-#define USE_ALLOCA
-#endif
-
-#ifdef USE_ALLOCA
-#ifdef _WIN32
-#include <malloc.h>
-#else
-#include <stdlib.h>
-#endif
-#endif
-
-#include "../../../../C/7zCrc.h"
-#include "../../../../C/Alloc.h"
-
-#include "../../../Common/MyCom.h"
-
-#ifdef BENCH_MT
-#include "../../../Windows/Synchronization.h"
-#include "../../../Windows/Thread.h"
-#endif
-
-#ifdef EXTERNAL_LZMA
-#include "../../../Windows/PropVariant.h"
-#include "../../ICoder.h"
-#else
-#include "../LzmaDecoder.h"
-#include "../LzmaEncoder.h"
-#endif
-
-static const UInt32 kUncompressMinBlockSize = 1 << 26;
-static const UInt32 kAdditionalSize = (1 << 16);
-static const UInt32 kCompressedAdditionalSize = (1 << 10);
-static const UInt32 kMaxLzmaPropSize = 5;
-
-class CBaseRandomGenerator
-{
- UInt32 A1;
- UInt32 A2;
-public:
- CBaseRandomGenerator() { Init(); }
- void Init() { A1 = 362436069; A2 = 521288629;}
- UInt32 GetRnd()
- {
- return
- ((A1 = 36969 * (A1 & 0xffff) + (A1 >> 16)) << 16) +
- ((A2 = 18000 * (A2 & 0xffff) + (A2 >> 16)) );
- }
-};
-
-class CBenchBuffer
-{
-public:
- size_t BufferSize;
- Byte *Buffer;
- CBenchBuffer(): Buffer(0) {}
- virtual ~CBenchBuffer() { Free(); }
- void Free()
- {
- ::MidFree(Buffer);
- Buffer = 0;
- }
- bool Alloc(size_t bufferSize)
- {
- if (Buffer != 0 && BufferSize == bufferSize)
- return true;
- Free();
- Buffer = (Byte *)::MidAlloc(bufferSize);
- BufferSize = bufferSize;
- return (Buffer != 0);
- }
-};
-
-class CBenchRandomGenerator: public CBenchBuffer
-{
- CBaseRandomGenerator *RG;
-public:
- void Set(CBaseRandomGenerator *rg) { RG = rg; }
- UInt32 GetVal(UInt32 &res, int numBits)
- {
- UInt32 val = res & (((UInt32)1 << numBits) - 1);
- res >>= numBits;
- return val;
- }
- UInt32 GetLen(UInt32 &res)
- {
- UInt32 len = GetVal(res, 2);
- return GetVal(res, 1 + len);
- }
- void Generate()
- {
- UInt32 pos = 0;
- UInt32 rep0 = 1;
- while (pos < BufferSize)
- {
- UInt32 res = RG->GetRnd();
- res >>= 1;
- if (GetVal(res, 1) == 0 || pos < 1024)
- Buffer[pos++] = (Byte)(res & 0xFF);
- else
- {
- UInt32 len;
- len = 1 + GetLen(res);
- if (GetVal(res, 3) != 0)
- {
- len += GetLen(res);
- do
- {
- UInt32 ppp = GetVal(res, 5) + 6;
- res = RG->GetRnd();
- if (ppp > 30)
- continue;
- rep0 = /* (1 << ppp) +*/ GetVal(res, ppp);
- res = RG->GetRnd();
- }
- while (rep0 >= pos);
- rep0++;
- }
-
- for (UInt32 i = 0; i < len && pos < BufferSize; i++, pos++)
- Buffer[pos] = Buffer[pos - rep0];
- }
- }
- }
-};
-
-
-class CBenchmarkInStream:
- public ISequentialInStream,
- public CMyUnknownImp
-{
- const Byte *Data;
- size_t Pos;
- size_t Size;
-public:
- MY_UNKNOWN_IMP
- void Init(const Byte *data, size_t size)
- {
- Data = data;
- Size = size;
- Pos = 0;
- }
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-};
-
-STDMETHODIMP CBenchmarkInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- size_t remain = Size - Pos;
- UInt32 kMaxBlockSize = (1 << 20);
- if (size > kMaxBlockSize)
- size = kMaxBlockSize;
- if (size > remain)
- size = (UInt32)remain;
- for (UInt32 i = 0; i < size; i++)
- ((Byte *)data)[i] = Data[Pos + i];
- Pos += size;
- if(processedSize != NULL)
- *processedSize = size;
- return S_OK;
-}
-
-class CBenchmarkOutStream:
- public ISequentialOutStream,
- public CBenchBuffer,
- public CMyUnknownImp
-{
- // bool _overflow;
-public:
- UInt32 Pos;
- // CBenchmarkOutStream(): _overflow(false) {}
- void Init()
- {
- // _overflow = false;
- Pos = 0;
- }
- MY_UNKNOWN_IMP
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-STDMETHODIMP CBenchmarkOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- size_t curSize = BufferSize - Pos;
- if (curSize > size)
- curSize = size;
- memcpy(Buffer + Pos, data, curSize);
- Pos += (UInt32)curSize;
- if(processedSize != NULL)
- *processedSize = (UInt32)curSize;
- if (curSize != size)
- {
- // _overflow = true;
- return E_FAIL;
- }
- return S_OK;
-}
-
-class CCrcOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
-public:
- UInt32 Crc;
- MY_UNKNOWN_IMP
- void Init() { Crc = CRC_INIT_VAL; }
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-STDMETHODIMP CCrcOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- Crc = CrcUpdate(Crc, data, size);
- if (processedSize != NULL)
- *processedSize = size;
- return S_OK;
-}
-
-static UInt64 GetTimeCount()
-{
- #ifdef USE_POSIX_TIME
- #ifdef USE_POSIX_TIME2
- timeval v;
- if (gettimeofday(&v, 0) == 0)
- return (UInt64)(v.tv_sec) * 1000000 + v.tv_usec;
- return (UInt64)time(NULL) * 1000000;
- #else
- return time(NULL);
- #endif
- #else
- /*
- LARGE_INTEGER value;
- if (::QueryPerformanceCounter(&value))
- return value.QuadPart;
- */
- return GetTickCount();
- #endif
-}
-
-static UInt64 GetFreq()
-{
- #ifdef USE_POSIX_TIME
- #ifdef USE_POSIX_TIME2
- return 1000000;
- #else
- return 1;
- #endif
- #else
- /*
- LARGE_INTEGER value;
- if (::QueryPerformanceFrequency(&value))
- return value.QuadPart;
- */
- return 1000;
- #endif
-}
-
-#ifndef USE_POSIX_TIME
-static inline UInt64 GetTime64(const FILETIME &t) { return ((UInt64)t.dwHighDateTime << 32) | t.dwLowDateTime; }
-#endif
-static UInt64 GetUserTime()
-{
- #ifdef USE_POSIX_TIME
- return clock();
- #else
- FILETIME creationTime, exitTime, kernelTime, userTime;
- if (::GetProcessTimes(::GetCurrentProcess(), &creationTime, &exitTime, &kernelTime, &userTime) != 0)
- return GetTime64(userTime) + GetTime64(kernelTime);
- return (UInt64)GetTickCount() * 10000;
- #endif
-}
-
-static UInt64 GetUserFreq()
-{
- #ifdef USE_POSIX_TIME
- return CLOCKS_PER_SEC;
- #else
- return 10000000;
- #endif
-}
-
-class CBenchProgressStatus
-{
- #ifdef BENCH_MT
- NWindows::NSynchronization::CCriticalSection CS;
- #endif
-public:
- HRESULT Res;
- bool EncodeMode;
- void SetResult(HRESULT res)
- {
- #ifdef BENCH_MT
- NWindows::NSynchronization::CCriticalSectionLock lock(CS);
- #endif
- Res = res;
- }
- HRESULT GetResult()
- {
- #ifdef BENCH_MT
- NWindows::NSynchronization::CCriticalSectionLock lock(CS);
- #endif
- return Res;
- }
-};
-
-class CBenchProgressInfo:
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
-public:
- CBenchProgressStatus *Status;
- CBenchInfo BenchInfo;
- HRESULT Res;
- IBenchCallback *callback;
- CBenchProgressInfo(): callback(0) {}
- MY_UNKNOWN_IMP
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
-};
-
-void SetStartTime(CBenchInfo &bi)
-{
- bi.GlobalFreq = GetFreq();
- bi.UserFreq = GetUserFreq();
- bi.GlobalTime = ::GetTimeCount();
- bi.UserTime = ::GetUserTime();
-}
-
-void SetFinishTime(const CBenchInfo &biStart, CBenchInfo &dest)
-{
- dest.GlobalFreq = GetFreq();
- dest.UserFreq = GetUserFreq();
- dest.GlobalTime = ::GetTimeCount() - biStart.GlobalTime;
- dest.UserTime = ::GetUserTime() - biStart.UserTime;
-}
-
-STDMETHODIMP CBenchProgressInfo::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
-{
- HRESULT res = Status->GetResult();
- if (res != S_OK)
- return res;
- if (!callback)
- return res;
- CBenchInfo info = BenchInfo;
- SetFinishTime(BenchInfo, info);
- if (Status->EncodeMode)
- {
- info.UnpackSize = *inSize;
- info.PackSize = *outSize;
- res = callback->SetEncodeResult(info, false);
- }
- else
- {
- info.PackSize = BenchInfo.PackSize + *inSize;
- info.UnpackSize = BenchInfo.UnpackSize + *outSize;
- res = callback->SetDecodeResult(info, false);
- }
- if (res != S_OK)
- Status->SetResult(res);
- return res;
-}
-
-static const int kSubBits = 8;
-
-static UInt32 GetLogSize(UInt32 size)
-{
- for (int i = kSubBits; i < 32; i++)
- for (UInt32 j = 0; j < (1 << kSubBits); j++)
- if (size <= (((UInt32)1) << i) + (j << (i - kSubBits)))
- return (i << kSubBits) + j;
- return (32 << kSubBits);
-}
-
-static void NormalizeVals(UInt64 &v1, UInt64 &v2)
-{
- while (v1 > 1000000)
- {
- v1 >>= 1;
- v2 >>= 1;
- }
-}
-
-UInt64 GetUsage(const CBenchInfo &info)
-{
- UInt64 userTime = info.UserTime;
- UInt64 userFreq = info.UserFreq;
- UInt64 globalTime = info.GlobalTime;
- UInt64 globalFreq = info.GlobalFreq;
- NormalizeVals(userTime, userFreq);
- NormalizeVals(globalFreq, globalTime);
- if (userFreq == 0)
- userFreq = 1;
- if (globalTime == 0)
- globalTime = 1;
- return userTime * globalFreq * 1000000 / userFreq / globalTime;
-}
-
-UInt64 GetRatingPerUsage(const CBenchInfo &info, UInt64 rating)
-{
- UInt64 userTime = info.UserTime;
- UInt64 userFreq = info.UserFreq;
- UInt64 globalTime = info.GlobalTime;
- UInt64 globalFreq = info.GlobalFreq;
- NormalizeVals(userFreq, userTime);
- NormalizeVals(globalTime, globalFreq);
- if (globalFreq == 0)
- globalFreq = 1;
- if (userTime == 0)
- userTime = 1;
- return userFreq * globalTime / globalFreq * rating / userTime;
-}
-
-static UInt64 MyMultDiv64(UInt64 value, UInt64 elapsedTime, UInt64 freq)
-{
- UInt64 elTime = elapsedTime;
- NormalizeVals(freq, elTime);
- if (elTime == 0)
- elTime = 1;
- return value * freq / elTime;
-}
-
-UInt64 GetCompressRating(UInt32 dictionarySize, UInt64 elapsedTime, UInt64 freq, UInt64 size)
-{
- UInt64 t = GetLogSize(dictionarySize) - (kBenchMinDicLogSize << kSubBits);
- UInt64 numCommandsForOne = 870 + ((t * t * 5) >> (2 * kSubBits));
- UInt64 numCommands = (UInt64)(size) * numCommandsForOne;
- return MyMultDiv64(numCommands, elapsedTime, freq);
-}
-
-UInt64 GetDecompressRating(UInt64 elapsedTime, UInt64 freq, UInt64 outSize, UInt64 inSize, UInt32 numIterations)
-{
- UInt64 numCommands = (inSize * 200 + outSize * 4) * numIterations;
- return MyMultDiv64(numCommands, elapsedTime, freq);
-}
-
-#ifdef EXTERNAL_LZMA
-typedef UInt32 (WINAPI * CreateObjectPointer)(const GUID *clsID,
- const GUID *interfaceID, void **outObject);
-#endif
-
-struct CEncoderInfo;
-
-struct CEncoderInfo
-{
- #ifdef BENCH_MT
- NWindows::CThread thread[2];
- #endif
- CMyComPtr<ICompressCoder> encoder;
- CBenchProgressInfo *progressInfoSpec[2];
- CMyComPtr<ICompressProgressInfo> progressInfo[2];
- UInt32 NumIterations;
- #ifdef USE_ALLOCA
- size_t AllocaSize;
- #endif
-
- struct CDecoderInfo
- {
- CEncoderInfo *Encoder;
- UInt32 DecoderIndex;
- #ifdef USE_ALLOCA
- size_t AllocaSize;
- #endif
- bool CallbackMode;
- };
- CDecoderInfo decodersInfo[2];
-
- CMyComPtr<ICompressCoder> decoders[2];
- HRESULT Results[2];
- CBenchmarkOutStream *outStreamSpec;
- CMyComPtr<ISequentialOutStream> outStream;
- IBenchCallback *callback;
- UInt32 crc;
- UInt32 kBufferSize;
- UInt32 compressedSize;
- CBenchRandomGenerator rg;
- CBenchmarkOutStream *propStreamSpec;
- CMyComPtr<ISequentialOutStream> propStream;
- HRESULT Init(UInt32 dictionarySize, UInt32 numThreads, CBaseRandomGenerator *rg);
- HRESULT Encode();
- HRESULT Decode(UInt32 decoderIndex);
-
- CEncoderInfo(): outStreamSpec(0), callback(0), propStreamSpec(0) {}
-
- #ifdef BENCH_MT
- static THREAD_FUNC_DECL EncodeThreadFunction(void *param)
- {
- CEncoderInfo *encoder = (CEncoderInfo *)param;
- #ifdef USE_ALLOCA
- alloca(encoder->AllocaSize);
- #endif
- HRESULT res = encoder->Encode();
- encoder->Results[0] = res;
- if (res != S_OK)
- encoder->progressInfoSpec[0]->Status->SetResult(res);
-
- return 0;
- }
- static THREAD_FUNC_DECL DecodeThreadFunction(void *param)
- {
- CDecoderInfo *decoder = (CDecoderInfo *)param;
- #ifdef USE_ALLOCA
- alloca(decoder->AllocaSize);
- #endif
- CEncoderInfo *encoder = decoder->Encoder;
- encoder->Results[decoder->DecoderIndex] = encoder->Decode(decoder->DecoderIndex);
- return 0;
- }
-
- HRESULT CreateEncoderThread()
- {
- return thread[0].Create(EncodeThreadFunction, this);
- }
-
- HRESULT CreateDecoderThread(int index, bool callbackMode
- #ifdef USE_ALLOCA
- , size_t allocaSize
- #endif
- )
- {
- CDecoderInfo &decoder = decodersInfo[index];
- decoder.DecoderIndex = index;
- decoder.Encoder = this;
- #ifdef USE_ALLOCA
- decoder.AllocaSize = allocaSize;
- #endif
- decoder.CallbackMode = callbackMode;
- return thread[index].Create(DecodeThreadFunction, &decoder);
- }
- #endif
-};
-
-HRESULT CEncoderInfo::Init(UInt32 dictionarySize, UInt32 numThreads, CBaseRandomGenerator *rgLoc)
-{
- rg.Set(rgLoc);
- kBufferSize = dictionarySize + kAdditionalSize;
- UInt32 kCompressedBufferSize = (kBufferSize / 2) + kCompressedAdditionalSize;
- if (!rg.Alloc(kBufferSize))
- return E_OUTOFMEMORY;
- rg.Generate();
- crc = CrcCalc(rg.Buffer, rg.BufferSize);
-
- outStreamSpec = new CBenchmarkOutStream;
- if (!outStreamSpec->Alloc(kCompressedBufferSize))
- return E_OUTOFMEMORY;
-
- outStream = outStreamSpec;
-
- propStreamSpec = 0;
- if (!propStream)
- {
- propStreamSpec = new CBenchmarkOutStream;
- propStream = propStreamSpec;
- }
- if (!propStreamSpec->Alloc(kMaxLzmaPropSize))
- return E_OUTOFMEMORY;
- propStreamSpec->Init();
-
- PROPID propIDs[] =
- {
- NCoderPropID::kDictionarySize,
- NCoderPropID::kNumThreads
- };
- const int kNumProps = sizeof(propIDs) / sizeof(propIDs[0]);
- PROPVARIANT props[kNumProps];
- props[0].vt = VT_UI4;
- props[0].ulVal = dictionarySize;
-
- props[1].vt = VT_UI4;
- props[1].ulVal = numThreads;
-
- {
- CMyComPtr<ICompressSetCoderProperties> setCoderProperties;
- RINOK(encoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties));
- if (!setCoderProperties)
- return E_FAIL;
- RINOK(setCoderProperties->SetCoderProperties(propIDs, props, kNumProps));
-
- CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties;
- encoder.QueryInterface(IID_ICompressWriteCoderProperties, &writeCoderProperties);
- if (writeCoderProperties)
- {
- RINOK(writeCoderProperties->WriteCoderProperties(propStream));
- }
- }
- return S_OK;
-}
-
-HRESULT CEncoderInfo::Encode()
-{
- CBenchmarkInStream *inStreamSpec = new CBenchmarkInStream;
- CMyComPtr<ISequentialInStream> inStream = inStreamSpec;
- inStreamSpec->Init(rg.Buffer, rg.BufferSize);
- outStreamSpec->Init();
-
- RINOK(encoder->Code(inStream, outStream, 0, 0, progressInfo[0]));
- compressedSize = outStreamSpec->Pos;
- encoder.Release();
- return S_OK;
-}
-
-HRESULT CEncoderInfo::Decode(UInt32 decoderIndex)
-{
- CBenchmarkInStream *inStreamSpec = new CBenchmarkInStream;
- CMyComPtr<ISequentialInStream> inStream = inStreamSpec;
- CMyComPtr<ICompressCoder> &decoder = decoders[decoderIndex];
-
- CMyComPtr<ICompressSetDecoderProperties2> compressSetDecoderProperties;
- decoder.QueryInterface(IID_ICompressSetDecoderProperties2, &compressSetDecoderProperties);
- if (!compressSetDecoderProperties)
- return E_FAIL;
-
- CCrcOutStream *crcOutStreamSpec = new CCrcOutStream;
- CMyComPtr<ISequentialOutStream> crcOutStream = crcOutStreamSpec;
-
- CBenchProgressInfo *pi = progressInfoSpec[decoderIndex];
- pi->BenchInfo.UnpackSize = 0;
- pi->BenchInfo.PackSize = 0;
-
- for (UInt32 j = 0; j < NumIterations; j++)
- {
- inStreamSpec->Init(outStreamSpec->Buffer, compressedSize);
- crcOutStreamSpec->Init();
-
- RINOK(compressSetDecoderProperties->SetDecoderProperties2(propStreamSpec->Buffer, propStreamSpec->Pos));
- UInt64 outSize = kBufferSize;
- RINOK(decoder->Code(inStream, crcOutStream, 0, &outSize, progressInfo[decoderIndex]));
- if (CRC_GET_DIGEST(crcOutStreamSpec->Crc) != crc)
- return S_FALSE;
- pi->BenchInfo.UnpackSize += kBufferSize;
- pi->BenchInfo.PackSize += compressedSize;
- }
- decoder.Release();
- return S_OK;
-}
-
-static const UInt32 kNumThreadsMax = (1 << 16);
-
-struct CBenchEncoders
-{
- CEncoderInfo *encoders;
- CBenchEncoders(UInt32 num): encoders(0) { encoders = new CEncoderInfo[num]; }
- ~CBenchEncoders() { delete []encoders; }
-};
-
-HRESULT LzmaBench(
- #ifdef EXTERNAL_LZMA
- CCodecs *codecs,
- #endif
- UInt32 numThreads, UInt32 dictionarySize, IBenchCallback *callback)
-{
- UInt32 numEncoderThreads =
- #ifdef BENCH_MT
- (numThreads > 1 ? numThreads / 2 : 1);
- #else
- 1;
- #endif
- UInt32 numSubDecoderThreads =
- #ifdef BENCH_MT
- (numThreads > 1 ? 2 : 1);
- #else
- 1;
- #endif
- if (dictionarySize < (1 << kBenchMinDicLogSize) || numThreads < 1 || numEncoderThreads > kNumThreadsMax)
- {
- return E_INVALIDARG;
- }
-
- CBenchEncoders encodersSpec(numEncoderThreads);
- CEncoderInfo *encoders = encodersSpec.encoders;
-
- #ifdef EXTERNAL_LZMA
- UString name = L"LZMA";
- #endif
-
- UInt32 i;
- for (i = 0; i < numEncoderThreads; i++)
- {
- CEncoderInfo &encoder = encoders[i];
- encoder.callback = (i == 0) ? callback : 0;
-
- #ifdef EXTERNAL_LZMA
- RINOK(codecs->CreateCoder(name, true, encoder.encoder));
- #else
- encoder.encoder = new NCompress::NLzma::CEncoder;
- #endif
- for (UInt32 j = 0; j < numSubDecoderThreads; j++)
- {
- #ifdef EXTERNAL_LZMA
- RINOK(codecs->CreateCoder(name, false, encoder.decoders[j]));
- #else
- encoder.decoders[j] = new NCompress::NLzma::CDecoder;
- #endif
- }
- }
-
- CBaseRandomGenerator rg;
- rg.Init();
- for (i = 0; i < numEncoderThreads; i++)
- {
- RINOK(encoders[i].Init(dictionarySize, numThreads, &rg));
- }
-
- CBenchProgressStatus status;
- status.Res = S_OK;
- status.EncodeMode = true;
-
- for (i = 0; i < numEncoderThreads; i++)
- {
- CEncoderInfo &encoder = encoders[i];
- for (int j = 0; j < 2; j++)
- {
- encoder.progressInfo[j] = encoder.progressInfoSpec[j] = new CBenchProgressInfo;
- encoder.progressInfoSpec[j]->Status = &status;
- }
- if (i == 0)
- {
- encoder.progressInfoSpec[0]->callback = callback;
- encoder.progressInfoSpec[0]->BenchInfo.NumIterations = numEncoderThreads;
- SetStartTime(encoder.progressInfoSpec[0]->BenchInfo);
- }
-
- #ifdef BENCH_MT
- if (numEncoderThreads > 1)
- {
- #ifdef USE_ALLOCA
- encoder.AllocaSize = (i * 16 * 21) & 0x7FF;
- #endif
- RINOK(encoder.CreateEncoderThread())
- }
- else
- #endif
- {
- RINOK(encoder.Encode());
- }
- }
- #ifdef BENCH_MT
- if (numEncoderThreads > 1)
- for (i = 0; i < numEncoderThreads; i++)
- encoders[i].thread[0].Wait();
- #endif
-
- RINOK(status.Res);
-
- CBenchInfo info;
-
- SetFinishTime(encoders[0].progressInfoSpec[0]->BenchInfo, info);
- info.UnpackSize = 0;
- info.PackSize = 0;
- info.NumIterations = 1; // progressInfoSpec->NumIterations;
- for (i = 0; i < numEncoderThreads; i++)
- {
- CEncoderInfo &encoder = encoders[i];
- info.UnpackSize += encoder.kBufferSize;
- info.PackSize += encoder.compressedSize;
- }
- RINOK(callback->SetEncodeResult(info, true));
-
-
- status.Res = S_OK;
- status.EncodeMode = false;
-
- UInt32 numDecoderThreads = numEncoderThreads * numSubDecoderThreads;
- for (i = 0; i < numEncoderThreads; i++)
- {
- CEncoderInfo &encoder = encoders[i];
- encoder.NumIterations = 2 + kUncompressMinBlockSize / encoder.kBufferSize;
-
- if (i == 0)
- {
- encoder.progressInfoSpec[0]->callback = callback;
- encoder.progressInfoSpec[0]->BenchInfo.NumIterations = numDecoderThreads;
- SetStartTime(encoder.progressInfoSpec[0]->BenchInfo);
- }
-
- #ifdef BENCH_MT
- if (numDecoderThreads > 1)
- {
- for (UInt32 j = 0; j < numSubDecoderThreads; j++)
- {
- HRESULT res = encoder.CreateDecoderThread(j, (i == 0 && j == 0)
- #ifdef USE_ALLOCA
- , ((i * numSubDecoderThreads + j) * 16 * 21) & 0x7FF
- #endif
- );
- RINOK(res);
- }
- }
- else
- #endif
- {
- RINOK(encoder.Decode(0));
- }
- }
- #ifdef BENCH_MT
- HRESULT res = S_OK;
- if (numDecoderThreads > 1)
- for (i = 0; i < numEncoderThreads; i++)
- for (UInt32 j = 0; j < numSubDecoderThreads; j++)
- {
- CEncoderInfo &encoder = encoders[i];
- encoder.thread[j].Wait();
- if (encoder.Results[j] != S_OK)
- res = encoder.Results[j];
- }
- RINOK(res);
- #endif
- RINOK(status.Res);
- SetFinishTime(encoders[0].progressInfoSpec[0]->BenchInfo, info);
- info.UnpackSize = 0;
- info.PackSize = 0;
- info.NumIterations = numSubDecoderThreads * encoders[0].NumIterations;
- for (i = 0; i < numEncoderThreads; i++)
- {
- CEncoderInfo &encoder = encoders[i];
- info.UnpackSize += encoder.kBufferSize;
- info.PackSize += encoder.compressedSize;
- }
- RINOK(callback->SetDecodeResult(info, false));
- RINOK(callback->SetDecodeResult(info, true));
- return S_OK;
-}
-
-
-inline UInt64 GetLZMAUsage(bool multiThread, UInt32 dictionary)
-{
- UInt32 hs = dictionary - 1;
- hs |= (hs >> 1);
- hs |= (hs >> 2);
- hs |= (hs >> 4);
- hs |= (hs >> 8);
- hs >>= 1;
- hs |= 0xFFFF;
- if (hs > (1 << 24))
- hs >>= 1;
- hs++;
- return ((hs + (1 << 16)) + (UInt64)dictionary * 2) * 4 + (UInt64)dictionary * 3 / 2 +
- (1 << 20) + (multiThread ? (6 << 20) : 0);
-}
-
-UInt64 GetBenchMemoryUsage(UInt32 numThreads, UInt32 dictionary)
-{
- const UInt32 kBufferSize = dictionary;
- const UInt32 kCompressedBufferSize = (kBufferSize / 2);
- UInt32 numSubThreads = (numThreads > 1) ? 2 : 1;
- UInt32 numBigThreads = numThreads / numSubThreads;
- return (kBufferSize + kCompressedBufferSize +
- GetLZMAUsage((numThreads > 1), dictionary) + (2 << 20)) * numBigThreads;
-}
-
-static bool CrcBig(const void *data, UInt32 size, UInt32 numCycles, UInt32 crcBase)
-{
- for (UInt32 i = 0; i < numCycles; i++)
- if (CrcCalc(data, size) != crcBase)
- return false;
- return true;
-}
-
-#ifdef BENCH_MT
-struct CCrcInfo
-{
- NWindows::CThread Thread;
- const Byte *Data;
- UInt32 Size;
- UInt32 NumCycles;
- UInt32 Crc;
- bool Res;
- void Wait()
- {
- Thread.Wait();
- Thread.Close();
- }
-};
-
-static THREAD_FUNC_DECL CrcThreadFunction(void *param)
-{
- CCrcInfo *p = (CCrcInfo *)param;
- p->Res = CrcBig(p->Data, p->Size, p->NumCycles, p->Crc);
- return 0;
-}
-
-struct CCrcThreads
-{
- UInt32 NumThreads;
- CCrcInfo *Items;
- CCrcThreads(): Items(0), NumThreads(0) {}
- void WaitAll()
- {
- for (UInt32 i = 0; i < NumThreads; i++)
- Items[i].Wait();
- NumThreads = 0;
- }
- ~CCrcThreads()
- {
- WaitAll();
- delete []Items;
- }
-};
-#endif
-
-static UInt32 CrcCalc1(const Byte *buf, UInt32 size)
-{
- UInt32 crc = CRC_INIT_VAL;;
- for (UInt32 i = 0; i < size; i++)
- crc = CRC_UPDATE_BYTE(crc, buf[i]);
- return CRC_GET_DIGEST(crc);
-}
-
-static void RandGen(Byte *buf, UInt32 size, CBaseRandomGenerator &RG)
-{
- for (UInt32 i = 0; i < size; i++)
- buf[i] = (Byte)RG.GetRnd();
-}
-
-static UInt32 RandGenCrc(Byte *buf, UInt32 size, CBaseRandomGenerator &RG)
-{
- RandGen(buf, size, RG);
- return CrcCalc1(buf, size);
-}
-
-bool CrcInternalTest()
-{
- CBenchBuffer buffer;
- const UInt32 kBufferSize0 = (1 << 8);
- const UInt32 kBufferSize1 = (1 << 10);
- const UInt32 kCheckSize = (1 << 5);
- if (!buffer.Alloc(kBufferSize0 + kBufferSize1))
- return false;
- Byte *buf = buffer.Buffer;
- UInt32 i;
- for (i = 0; i < kBufferSize0; i++)
- buf[i] = (Byte)i;
- UInt32 crc1 = CrcCalc1(buf, kBufferSize0);
- if (crc1 != 0x29058C73)
- return false;
- CBaseRandomGenerator RG;
- RandGen(buf + kBufferSize0, kBufferSize1, RG);
- for (i = 0; i < kBufferSize0 + kBufferSize1 - kCheckSize; i++)
- for (UInt32 j = 0; j < kCheckSize; j++)
- if (CrcCalc1(buf + i, j) != CrcCalc(buf + i, j))
- return false;
- return true;
-}
-
-HRESULT CrcBench(UInt32 numThreads, UInt32 bufferSize, UInt64 &speed)
-{
- if (numThreads == 0)
- numThreads = 1;
-
- CBenchBuffer buffer;
- size_t totalSize = (size_t)bufferSize * numThreads;
- if (totalSize / numThreads != bufferSize)
- return E_OUTOFMEMORY;
- if (!buffer.Alloc(totalSize))
- return E_OUTOFMEMORY;
-
- Byte *buf = buffer.Buffer;
- CBaseRandomGenerator RG;
- UInt32 numCycles = ((UInt32)1 << 30) / ((bufferSize >> 2) + 1) + 1;
-
- UInt64 timeVal;
- #ifdef BENCH_MT
- CCrcThreads threads;
- if (numThreads > 1)
- {
- threads.Items = new CCrcInfo[numThreads];
- UInt32 i;
- for (i = 0; i < numThreads; i++)
- {
- CCrcInfo &info = threads.Items[i];
- Byte *data = buf + (size_t)bufferSize * i;
- info.Data = data;
- info.NumCycles = numCycles;
- info.Size = bufferSize;
- info.Crc = RandGenCrc(data, bufferSize, RG);
- }
- timeVal = GetTimeCount();
- for (i = 0; i < numThreads; i++)
- {
- CCrcInfo &info = threads.Items[i];
- RINOK(info.Thread.Create(CrcThreadFunction, &info));
- threads.NumThreads++;
- }
- threads.WaitAll();
- for (i = 0; i < numThreads; i++)
- if (!threads.Items[i].Res)
- return S_FALSE;
- }
- else
- #endif
- {
- UInt32 crc = RandGenCrc(buf, bufferSize, RG);
- timeVal = GetTimeCount();
- if (!CrcBig(buf, bufferSize, numCycles, crc))
- return S_FALSE;
- }
- timeVal = GetTimeCount() - timeVal;
- if (timeVal == 0)
- timeVal = 1;
-
- UInt64 size = (UInt64)numCycles * totalSize;
- speed = MyMultDiv64(size, timeVal, GetFreq());
- return S_OK;
-}
-
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h b/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h
deleted file mode 100644
index f8aeb6be3..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// LzmaBench.h
-
-#ifndef __LZMABENCH_H
-#define __LZMABENCH_H
-
-#include <stdio.h>
-#include "../../../Common/Types.h"
-#ifdef EXTERNAL_LZMA
-#include "../../UI/Common/LoadCodecs.h"
-#endif
-
-struct CBenchInfo
-{
- UInt64 GlobalTime;
- UInt64 GlobalFreq;
- UInt64 UserTime;
- UInt64 UserFreq;
- UInt64 UnpackSize;
- UInt64 PackSize;
- UInt32 NumIterations;
- CBenchInfo(): NumIterations(0) {}
-};
-
-struct IBenchCallback
-{
- virtual HRESULT SetEncodeResult(const CBenchInfo &info, bool final) = 0;
- virtual HRESULT SetDecodeResult(const CBenchInfo &info, bool final) = 0;
-};
-
-UInt64 GetUsage(const CBenchInfo &benchOnfo);
-UInt64 GetRatingPerUsage(const CBenchInfo &info, UInt64 rating);
-UInt64 GetCompressRating(UInt32 dictionarySize, UInt64 elapsedTime, UInt64 freq, UInt64 size);
-UInt64 GetDecompressRating(UInt64 elapsedTime, UInt64 freq, UInt64 outSize, UInt64 inSize, UInt32 numIterations);
-
-HRESULT LzmaBench(
- #ifdef EXTERNAL_LZMA
- CCodecs *codecs,
- #endif
- UInt32 numThreads, UInt32 dictionarySize, IBenchCallback *callback);
-
-const int kBenchMinDicLogSize = 18;
-
-UInt64 GetBenchMemoryUsage(UInt32 numThreads, UInt32 dictionary);
-
-bool CrcInternalTest();
-HRESULT CrcBench(UInt32 numThreads, UInt32 bufferSize, UInt64 &speed);
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp
deleted file mode 100644
index b1c455e97..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp
+++ /dev/null
@@ -1,311 +0,0 @@
-// LzmaBenchCon.cpp
-
-#include "StdAfx.h"
-
-#include <stdio.h>
-
-#include "LzmaBench.h"
-#include "LzmaBenchCon.h"
-#include "../../../Common/IntToString.h"
-
-#if defined(BENCH_MT) || defined(_WIN32)
-#include "../../../Windows/System.h"
-#endif
-
-#ifdef BREAK_HANDLER
-#include "../../UI/Console/ConsoleClose.h"
-#endif
-#include "../../../Common/MyCom.h"
-
-struct CTotalBenchRes
-{
- UInt64 NumIterations;
- UInt64 Rating;
- UInt64 Usage;
- UInt64 RPU;
- void Init() { NumIterations = 0; Rating = 0; Usage = 0; RPU = 0; }
- void Normalize()
- {
- if (NumIterations == 0)
- return;
- Rating /= NumIterations;
- Usage /= NumIterations;
- RPU /= NumIterations;
- NumIterations = 1;
- }
- void SetMid(const CTotalBenchRes &r1, const CTotalBenchRes &r2)
- {
- Rating = (r1.Rating + r2.Rating) / 2;
- Usage = (r1.Usage + r2.Usage) / 2;
- RPU = (r1.RPU + r2.RPU) / 2;
- NumIterations = (r1.NumIterations + r2.NumIterations) / 2;
- }
-};
-
-struct CBenchCallback: public IBenchCallback
-{
- CTotalBenchRes EncodeRes;
- CTotalBenchRes DecodeRes;
- FILE *f;
- void Init() { EncodeRes.Init(); DecodeRes.Init(); }
- void Normalize() { EncodeRes.Normalize(); DecodeRes.Normalize(); }
- UInt32 dictionarySize;
- HRESULT SetEncodeResult(const CBenchInfo &info, bool final);
- HRESULT SetDecodeResult(const CBenchInfo &info, bool final);
-};
-
-static void NormalizeVals(UInt64 &v1, UInt64 &v2)
-{
- while (v1 > 1000000)
- {
- v1 >>= 1;
- v2 >>= 1;
- }
-}
-
-static UInt64 MyMultDiv64(UInt64 value, UInt64 elapsedTime, UInt64 freq)
-{
- UInt64 elTime = elapsedTime;
- NormalizeVals(freq, elTime);
- if (elTime == 0)
- elTime = 1;
- return value * freq / elTime;
-}
-
-static void PrintNumber(FILE *f, UInt64 value, int size)
-{
- char s[32];
- ConvertUInt64ToString(value, s);
- fprintf(f, " ");
- for (int len = (int)strlen(s); len < size; len++)
- fprintf(f, " ");
- fprintf(f, "%s", s);
-}
-
-static void PrintRating(FILE *f, UInt64 rating)
-{
- PrintNumber(f, rating / 1000000, 6);
-}
-
-static void PrintResults(FILE *f, UInt64 usage, UInt64 rpu, UInt64 rating)
-{
- PrintNumber(f, (usage + 5000) / 10000, 5);
- PrintRating(f, rpu);
- PrintRating(f, rating);
-}
-
-
-static void PrintResults(FILE *f, const CBenchInfo &info, UInt64 rating, CTotalBenchRes &res)
-{
- UInt64 speed = MyMultDiv64(info.UnpackSize, info.GlobalTime, info.GlobalFreq);
- PrintNumber(f, speed / 1024, 7);
- UInt64 usage = GetUsage(info);
- UInt64 rpu = GetRatingPerUsage(info, rating);
- PrintResults(f, usage, rpu, rating);
- res.NumIterations++;
- res.RPU += rpu;
- res.Rating += rating;
- res.Usage += usage;
-}
-
-static void PrintTotals(FILE *f, const CTotalBenchRes &res)
-{
- fprintf(f, " ");
- PrintResults(f, res.Usage, res.RPU, res.Rating);
-}
-
-
-HRESULT CBenchCallback::SetEncodeResult(const CBenchInfo &info, bool final)
-{
- #ifdef BREAK_HANDLER
- if (NConsoleClose::TestBreakSignal())
- return E_ABORT;
- #endif
-
- if (final)
- {
- UInt64 rating = GetCompressRating(dictionarySize, info.GlobalTime, info.GlobalFreq, info.UnpackSize);
- PrintResults(f, info, rating, EncodeRes);
- }
- return S_OK;
-}
-
-static const char *kSep = " | ";
-
-
-HRESULT CBenchCallback::SetDecodeResult(const CBenchInfo &info, bool final)
-{
- #ifdef BREAK_HANDLER
- if (NConsoleClose::TestBreakSignal())
- return E_ABORT;
- #endif
- if (final)
- {
- UInt64 rating = GetDecompressRating(info.GlobalTime, info.GlobalFreq, info.UnpackSize, info.PackSize, info.NumIterations);
- fprintf(f, kSep);
- CBenchInfo info2 = info;
- info2.UnpackSize *= info2.NumIterations;
- info2.PackSize *= info2.NumIterations;
- info2.NumIterations = 1;
- PrintResults(f, info2, rating, DecodeRes);
- }
- return S_OK;
-}
-
-static void PrintRequirements(FILE *f, const char *sizeString, UInt64 size, const char *threadsString, UInt32 numThreads)
-{
- fprintf(f, "\nRAM %s ", sizeString);
- PrintNumber(f, (size >> 20), 5);
- fprintf(f, " MB, # %s %3d", threadsString, (unsigned int)numThreads);
-}
-
-HRESULT LzmaBenchCon(
- #ifdef EXTERNAL_LZMA
- CCodecs *codecs,
- #endif
- FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary)
-{
- if (!CrcInternalTest())
- return S_FALSE;
- #ifdef BENCH_MT
- UInt64 ramSize = NWindows::NSystem::GetRamSize(); //
- UInt32 numCPUs = NWindows::NSystem::GetNumberOfProcessors();
- PrintRequirements(f, "size: ", ramSize, "CPU hardware threads:", numCPUs);
- if (numThreads == (UInt32)-1)
- numThreads = numCPUs;
- if (numThreads > 1)
- numThreads &= ~1;
- if (dictionary == (UInt32)-1)
- {
- int dicSizeLog;
- for (dicSizeLog = 25; dicSizeLog > kBenchMinDicLogSize; dicSizeLog--)
- if (GetBenchMemoryUsage(numThreads, ((UInt32)1 << dicSizeLog)) + (8 << 20) <= ramSize)
- break;
- dictionary = (1 << dicSizeLog);
- }
- #else
- if (dictionary == (UInt32)-1)
- dictionary = (1 << 22);
- numThreads = 1;
- #endif
-
- PrintRequirements(f, "usage:", GetBenchMemoryUsage(numThreads, dictionary), "Benchmark threads: ", numThreads);
-
- CBenchCallback callback;
- callback.Init();
- callback.f = f;
-
- fprintf(f, "\n\nDict Compressing | Decompressing\n ");
- int j;
- for (j = 0; j < 2; j++)
- {
- fprintf(f, " Speed Usage R/U Rating");
- if (j == 0)
- fprintf(f, kSep);
- }
- fprintf(f, "\n ");
- for (j = 0; j < 2; j++)
- {
- fprintf(f, " KB/s %% MIPS MIPS");
- if (j == 0)
- fprintf(f, kSep);
- }
- fprintf(f, "\n\n");
- for (UInt32 i = 0; i < numIterations; i++)
- {
- const int kStartDicLog = 22;
- int pow = (dictionary < ((UInt32)1 << kStartDicLog)) ? kBenchMinDicLogSize : kStartDicLog;
- while (((UInt32)1 << pow) > dictionary)
- pow--;
- for (; ((UInt32)1 << pow) <= dictionary; pow++)
- {
- fprintf(f, "%2d:", pow);
- callback.dictionarySize = (UInt32)1 << pow;
- HRESULT res = LzmaBench(
- #ifdef EXTERNAL_LZMA
- codecs,
- #endif
- numThreads, callback.dictionarySize, &callback);
- fprintf(f, "\n");
- RINOK(res);
- }
- }
- callback.Normalize();
- fprintf(f, "----------------------------------------------------------------\nAvr:");
- PrintTotals(f, callback.EncodeRes);
- fprintf(f, " ");
- PrintTotals(f, callback.DecodeRes);
- fprintf(f, "\nTot:");
- CTotalBenchRes midRes;
- midRes.SetMid(callback.EncodeRes, callback.DecodeRes);
- PrintTotals(f, midRes);
- fprintf(f, "\n");
- return S_OK;
-}
-
-struct CTempValues
-{
- UInt64 *Values;
- CTempValues(UInt32 num) { Values = new UInt64[num]; }
- ~CTempValues() { delete []Values; }
-};
-
-HRESULT CrcBenchCon(FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary)
-{
- if (!CrcInternalTest())
- return S_FALSE;
-
- #ifdef BENCH_MT
- UInt64 ramSize = NWindows::NSystem::GetRamSize();
- UInt32 numCPUs = NWindows::NSystem::GetNumberOfProcessors();
- PrintRequirements(f, "size: ", ramSize, "CPU hardware threads:", numCPUs);
- if (numThreads == (UInt32)-1)
- numThreads = numCPUs;
- #else
- numThreads = 1;
- #endif
- if (dictionary == (UInt32)-1)
- dictionary = (1 << 24);
-
- CTempValues speedTotals(numThreads);
- fprintf(f, "\n\nSize");
- for (UInt32 ti = 0; ti < numThreads; ti++)
- {
- fprintf(f, " %5d", ti + 1);
- speedTotals.Values[ti] = 0;
- }
- fprintf(f, "\n\n");
-
- UInt64 numSteps = 0;
- for (UInt32 i = 0; i < numIterations; i++)
- {
- for (int pow = 10; pow < 32; pow++)
- {
- UInt32 bufSize = (UInt32)1 << pow;
- if (bufSize > dictionary)
- break;
- fprintf(f, "%2d: ", pow);
- UInt64 speed;
- for (UInt32 ti = 0; ti < numThreads; ti++)
- {
- #ifdef BREAK_HANDLER
- if (NConsoleClose::TestBreakSignal())
- return E_ABORT;
- #endif
- RINOK(CrcBench(ti + 1, bufSize, speed));
- PrintNumber(f, (speed >> 20), 5);
- speedTotals.Values[ti] += speed;
- }
- fprintf(f, "\n");
- numSteps++;
- }
- }
- if (numSteps != 0)
- {
- fprintf(f, "\nAvg:");
- for (UInt32 ti = 0; ti < numThreads; ti++)
- PrintNumber(f, ((speedTotals.Values[ti] / numSteps) >> 20), 5);
- fprintf(f, "\n");
- }
- return S_OK;
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h b/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h
deleted file mode 100644
index ea8539d19..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// LzmaBenchCon.h
-
-#ifndef __LZMABENCHCON_H
-#define __LZMABENCHCON_H
-
-#include <stdio.h>
-#include "../../../Common/Types.h"
-#ifdef EXTERNAL_LZMA
-#include "../../UI/Common/LoadCodecs.h"
-#endif
-HRESULT LzmaBenchCon(
- #ifdef EXTERNAL_LZMA
- CCodecs *codecs,
- #endif
- FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary);
-
-HRESULT CrcBenchCon(FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary);
-
-#endif
-
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/LzOutWindow.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/LzOutWindow.cpp
deleted file mode 100644
index df46295bd..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/LzOutWindow.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-// LzOutWindow.cpp
-
-#include "StdAfx.h"
-
-#include "LzOutWindow.h"
-
-void CLzOutWindow::Init(bool solid)
-{
- if (!solid)
- COutBuffer::Init();
- #ifdef _NO_EXCEPTIONS
- ErrorCode = S_OK;
- #endif
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/LzOutWindow.h b/src/libs/7zip/unix/CPP/7zip/Compress/LzOutWindow.h
deleted file mode 100644
index d8d13c225..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/LzOutWindow.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// LzOutWindow.h
-
-#ifndef __LZ_OUT_WINDOW_H
-#define __LZ_OUT_WINDOW_H
-
-#include "../IStream.h"
-
-#include "../Common/OutBuffer.h"
-
-#ifndef _NO_EXCEPTIONS
-typedef COutBufferException CLzOutWindowException;
-#endif
-
-class CLzOutWindow: public COutBuffer
-{
-public:
- void Init(bool solid = false);
-
- // distance >= 0, len > 0,
- bool CopyBlock(UInt32 distance, UInt32 len)
- {
- UInt32 pos = _pos - distance - 1;
- if (distance >= _pos)
- {
- if (!_overDict || distance >= _bufferSize)
- return false;
- pos += _bufferSize;
- }
- if (_limitPos - _pos > len && _bufferSize - pos > len)
- {
- const Byte *src = _buffer + pos;
- Byte *dest = _buffer + _pos;
- _pos += len;
- do
- *dest++ = *src++;
- while(--len != 0);
- }
- else do
- {
- if (pos == _bufferSize)
- pos = 0;
- _buffer[_pos++] = _buffer[pos++];
- if (_pos == _limitPos)
- FlushWithCheck();
- }
- while(--len != 0);
- return true;
- }
-
- void PutByte(Byte b)
- {
- _buffer[_pos++] = b;
- if (_pos == _limitPos)
- FlushWithCheck();
- }
-
- Byte GetByte(UInt32 distance) const
- {
- UInt32 pos = _pos - distance - 1;
- if (pos >= _bufferSize)
- pos += _bufferSize;
- return _buffer[pos];
- }
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/LzhDecoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/LzhDecoder.cpp
deleted file mode 100644
index 6f9b5065e..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/LzhDecoder.cpp
+++ /dev/null
@@ -1,220 +0,0 @@
-// LzhDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "LzhDecoder.h"
-
-#include "Windows/Defs.h"
-
-namespace NCompress{
-namespace NLzh {
-namespace NDecoder {
-
-static const UInt32 kHistorySize = (1 << 16);
-
-static const int kBlockSizeBits = 16;
-static const int kNumCBits = 9;
-static const int kNumLevelBits = 5; // smallest integer such that (1 << kNumLevelBits) > kNumLevelSymbols/
-
-UInt32 CCoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }
-
-HRESULT CCoder::ReadLevelTable()
-{
- int n = ReadBits(kNumLevelBits);
- if (n == 0)
- {
- m_LevelHuffman.Symbol = ReadBits(kNumLevelBits);
- if (m_LevelHuffman.Symbol >= kNumLevelSymbols)
- return S_FALSE;
- }
- else
- {
- if (n > kNumLevelSymbols)
- return S_FALSE;
- m_LevelHuffman.Symbol = -1;
- Byte lens[kNumLevelSymbols];
- int i = 0;
- while (i < n)
- {
- int c = m_InBitStream.ReadBits(3);
- if (c == 7)
- while (ReadBits(1))
- if (c++ > kMaxHuffmanLen)
- return S_FALSE;
- lens[i++] = (Byte)c;
- if (i == kNumSpecLevelSymbols)
- {
- c = ReadBits(2);
- while (--c >= 0)
- lens[i++] = 0;
- }
- }
- while (i < kNumLevelSymbols)
- lens[i++] = 0;
- m_LevelHuffman.SetCodeLengths(lens);
- }
- return S_OK;
-}
-
-HRESULT CCoder::ReadPTable(int numBits)
-{
- int n = ReadBits(numBits);
- if (n == 0)
- {
- m_PHuffmanDecoder.Symbol = ReadBits(numBits);
- if (m_PHuffmanDecoder.Symbol >= kNumDistanceSymbols)
- return S_FALSE;
- }
- else
- {
- if (n > kNumDistanceSymbols)
- return S_FALSE;
- m_PHuffmanDecoder.Symbol = -1;
- Byte lens[kNumDistanceSymbols];
- int i = 0;
- while (i < n)
- {
- int c = m_InBitStream.ReadBits(3);
- if (c == 7)
- while (ReadBits(1))
- {
- if (c > kMaxHuffmanLen)
- return S_FALSE;
- c++;
- }
- lens[i++] = (Byte)c;
- }
- while (i < kNumDistanceSymbols)
- lens[i++] = 0;
- m_PHuffmanDecoder.SetCodeLengths(lens);
- }
- return S_OK;
-}
-
-HRESULT CCoder::ReadCTable()
-{
- int n = ReadBits(kNumCBits);
- if (n == 0)
- {
- m_CHuffmanDecoder.Symbol = ReadBits(kNumCBits);
- if (m_CHuffmanDecoder.Symbol >= kNumCSymbols)
- return S_FALSE;
- }
- else
- {
- if (n > kNumCSymbols)
- return S_FALSE;
- m_CHuffmanDecoder.Symbol = -1;
- Byte lens[kNumCSymbols];
- int i = 0;
- while (i < n)
- {
- int c = m_LevelHuffman.Decode(&m_InBitStream);
- if (c < kNumSpecLevelSymbols)
- {
- if (c == 0)
- c = 1;
- else if (c == 1)
- c = ReadBits(4) + 3;
- else
- c = ReadBits(kNumCBits) + 20;
- while (--c >= 0)
- {
- if (i > kNumCSymbols)
- return S_FALSE;
- lens[i++] = 0;
- }
- }
- else
- lens[i++] = (Byte)(c - 2);
- }
- while (i < kNumCSymbols)
- lens[i++] = 0;
- m_CHuffmanDecoder.SetCodeLengths(lens);
- }
- return S_OK;
-}
-
-STDMETHODIMP CCoder::CodeReal(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 * /* inSize */, const UInt64 *outSize,
- ICompressProgressInfo *progress)
-{
- if (outSize == NULL)
- return E_INVALIDARG;
-
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
-
- UInt64 pos = 0;
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(false);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
-
- CCoderReleaser coderReleaser(this);
-
- int pbit;
- if (m_NumDictBits <= 13)
- pbit = 4;
- else
- pbit = 5;
-
- UInt32 blockSize = 0;
-
- while(pos < *outSize)
- {
- // for (i = 0; i < dictSize; i++) dtext[i] = 0x20;
-
- if (blockSize == 0)
- {
- if (progress != NULL)
- {
- UInt64 packSize = m_InBitStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &pos));
- }
- blockSize = ReadBits(kBlockSizeBits);
- ReadLevelTable();
- ReadCTable();
- RINOK(ReadPTable(pbit));
- }
- blockSize--;
- UInt32 c = m_CHuffmanDecoder.Decode(&m_InBitStream);
- if (c < 256)
- {
- m_OutWindowStream.PutByte((Byte)c);
- pos++;
- }
- else if (c >= kNumCSymbols)
- return S_FALSE;
- else
- {
- // offset = (interface->method == LARC_METHOD_NUM) ? 0x100 - 2 : 0x100 - 3;
- UInt32 len = c - 256 + kMinMatch;
- UInt32 distance = m_PHuffmanDecoder.Decode(&m_InBitStream);
- if (distance != 0)
- distance = (1 << (distance - 1)) + ReadBits(distance - 1);
- if (distance >= pos)
- return S_FALSE;
- if (pos + len > *outSize)
- len = (UInt32)(*outSize - pos);
- pos += len;
- m_OutWindowStream.CopyBlock(distance, len);
- }
- }
- coderReleaser.NeedFlush = false;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CCoder::Code(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress);}
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/LzhDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/LzhDecoder.h
deleted file mode 100644
index 4c32d63da..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/LzhDecoder.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// LzhDecoder.h
-
-#ifndef __COMPRESS_LZH_DECODER_H
-#define __COMPRESS_LZH_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NLzh {
-namespace NDecoder {
-
-const int kMaxHuffmanLen = 16; // Check it
-
-const int kNumSpecLevelSymbols = 3;
-const int kNumLevelSymbols = kNumSpecLevelSymbols + kMaxHuffmanLen;
-
-const int kDictBitsMax = 16;
-const int kNumDistanceSymbols = kDictBitsMax + 1;
-
-const int kMaxMatch = 256;
-const int kMinMatch = 3;
-const int kNumCSymbols = 256 + kMaxMatch + 2 - kMinMatch;
-
-template <UInt32 m_NumSymbols>
-class CHuffmanDecoder:public NCompress::NHuffman::CDecoder<kMaxHuffmanLen, m_NumSymbols>
-{
-public:
- int Symbol;
- template <class TBitDecoder>
- UInt32 Decode(TBitDecoder *bitStream)
- {
- if (Symbol >= 0)
- return (UInt32)Symbol;
- return this->DecodeSymbol(bitStream);
- }
-};
-
-class CCoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- NBitm::CDecoder<CInBuffer> m_InBitStream;
-
- int m_NumDictBits;
-
- CHuffmanDecoder<kNumLevelSymbols> m_LevelHuffman;
- CHuffmanDecoder<kNumDistanceSymbols> m_PHuffmanDecoder;
- CHuffmanDecoder<kNumCSymbols> m_CHuffmanDecoder;
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
-
- class CCoderReleaser
- {
- CCoder *m_Coder;
- public:
- bool NeedFlush;
- CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}
- ~CCoderReleaser()
- {
- if (NeedFlush)
- m_Coder->m_OutWindowStream.Flush();
- m_Coder->ReleaseStreams();
- }
- };
- friend class CCoderReleaser;
-
- void MakeTable(int nchar, Byte *bitlen, int tablebits,
- UInt32 *table, int tablesize);
-
- UInt32 ReadBits(int numBits);
- HRESULT ReadLevelTable();
- HRESULT ReadPTable(int numBits);
- HRESULT ReadCTable();
-
-public:
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(CodeReal)(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress);
-
- void SetDictionary(int numDictBits) { m_NumDictBits = numDictBits; }
- CCoder(): m_NumDictBits(0) {}
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Lzx.h b/src/libs/7zip/unix/CPP/7zip/Compress/Lzx.h
deleted file mode 100644
index 09ab7f075..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Lzx.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Lzx.h
-
-#ifndef __COMPRESS_LZX_H
-#define __COMPRESS_LZX_H
-
-namespace NCompress {
-namespace NLzx {
-
-const unsigned kNumHuffmanBits = 16;
-const UInt32 kNumRepDistances = 3;
-
-const UInt32 kNumLenSlots = 8;
-const UInt32 kMatchMinLen = 2;
-const UInt32 kNumLenSymbols = 249;
-const UInt32 kMatchMaxLen = kMatchMinLen + (kNumLenSlots - 1) + kNumLenSymbols - 1;
-
-const unsigned kNumAlignBits = 3;
-const UInt32 kAlignTableSize = 1 << kNumAlignBits;
-
-const UInt32 kNumPosSlots = 50;
-const UInt32 kNumPosLenSlots = kNumPosSlots * kNumLenSlots;
-
-const UInt32 kMainTableSize = 256 + kNumPosLenSlots;
-const UInt32 kLevelTableSize = 20;
-const UInt32 kMaxTableSize = kMainTableSize;
-
-const unsigned kNumBlockTypeBits = 3;
-const unsigned kBlockTypeVerbatim = 1;
-const unsigned kBlockTypeAligned = 2;
-const unsigned kBlockTypeUncompressed = 3;
-
-const unsigned kUncompressedBlockSizeNumBits = 24;
-
-const unsigned kNumBitsForPreTreeLevel = 4;
-
-const unsigned kLevelSymbolZeros = 17;
-const unsigned kLevelSymbolZerosBig = 18;
-const unsigned kLevelSymbolSame = 19;
-
-const unsigned kLevelSymbolZerosStartValue = 4;
-const unsigned kLevelSymbolZerosNumBits = 4;
-
-const unsigned kLevelSymbolZerosBigStartValue = kLevelSymbolZerosStartValue +
- (1 << kLevelSymbolZerosNumBits);
-const unsigned kLevelSymbolZerosBigNumBits = 5;
-
-const unsigned kLevelSymbolSameNumBits = 1;
-const unsigned kLevelSymbolSameStartValue = 4;
-
-const unsigned kNumBitsForAlignLevel = 3;
-
-const unsigned kNumDictionaryBitsMin = 15;
-const unsigned kNumDictionaryBitsMax = 21;
-const UInt32 kDictionarySizeMax = (1 << kNumDictionaryBitsMax);
-
-const unsigned kNumLinearPosSlotBits = 17;
-const UInt32 kNumPowerPosSlots = 0x26;
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Lzx86Converter.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/Lzx86Converter.cpp
deleted file mode 100644
index 9e53f18a9..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Lzx86Converter.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-// Lzx86Converter.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/Defs.h"
-
-#include "Lzx86Converter.h"
-
-namespace NCompress {
-namespace NLzx {
-
-static const int kResidue = 6 + 4;
-
-void Cx86ConvertOutStream::MakeTranslation()
-{
- if (m_Pos <= kResidue)
- return;
- UInt32 numBytes = m_Pos - kResidue;
- Byte *buffer = m_Buffer;
- for (UInt32 i = 0; i < numBytes;)
- {
- if (buffer[i++] == 0xE8)
- {
- Int32 absValue = 0;
- int j;
- for(j = 0; j < 4; j++)
- absValue += (UInt32)buffer[i + j] << (j * 8);
- Int32 pos = (Int32)(m_ProcessedSize + i - 1);
- if (absValue >= -pos && absValue < (Int32)m_TranslationSize)
- {
- UInt32 offset = (absValue >= 0) ?
- absValue - pos :
- absValue + m_TranslationSize;
- for(j = 0; j < 4; j++)
- {
- buffer[i + j] = (Byte)(offset & 0xFF);
- offset >>= 8;
- }
- }
- i += 4;
- }
- }
-}
-
-STDMETHODIMP Cx86ConvertOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- if (!m_TranslationMode)
- return m_Stream->Write(data, size, processedSize);
- UInt32 realProcessedSize = 0;
- while (realProcessedSize < size)
- {
- UInt32 writeSize = MyMin(size - realProcessedSize, kUncompressedBlockSize - m_Pos);
- memmove(m_Buffer + m_Pos, (const Byte *)data + realProcessedSize, writeSize);
- m_Pos += writeSize;
- realProcessedSize += writeSize;
- if (m_Pos == kUncompressedBlockSize)
- {
- RINOK(Flush());
- }
- }
- if (processedSize != NULL)
- *processedSize = realProcessedSize;
- return S_OK;
-}
-
-HRESULT Cx86ConvertOutStream::Flush()
-{
- if (m_Pos == 0)
- return S_OK;
- if (m_TranslationMode)
- MakeTranslation();
- UInt32 pos = 0;
- do
- {
- UInt32 processed;
- RINOK(m_Stream->Write(m_Buffer + pos, m_Pos - pos, &processed));
- if (processed == 0)
- return E_FAIL;
- pos += processed;
- }
- while(pos < m_Pos);
- m_ProcessedSize += m_Pos;
- m_Pos = 0;
- m_TranslationMode = (m_TranslationMode && (m_ProcessedSize < (1 << 30)));
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Lzx86Converter.h b/src/libs/7zip/unix/CPP/7zip/Compress/Lzx86Converter.h
deleted file mode 100644
index 9f110c29b..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Lzx86Converter.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Lzx86Converter.h
-
-#ifndef __LZX_86_CONVERTER_H
-#define __LZX_86_CONVERTER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../IStream.h"
-
-namespace NCompress {
-namespace NLzx {
-
-const int kUncompressedBlockSize = 1 << 15;
-
-class Cx86ConvertOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialOutStream> m_Stream;
- UInt32 m_ProcessedSize;
- UInt32 m_Pos;
- UInt32 m_TranslationSize;
- bool m_TranslationMode;
- Byte m_Buffer[kUncompressedBlockSize];
-
- void MakeTranslation();
-public:
- void SetStream(ISequentialOutStream *outStream) { m_Stream = outStream; }
- void ReleaseStream() { m_Stream.Release(); }
- void Init(bool translationMode, UInt32 translationSize)
- {
- m_TranslationMode = translationMode;
- m_TranslationSize = translationSize;
- m_ProcessedSize = 0;
- m_Pos = 0;
- }
- HRESULT Flush();
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/LzxDecoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/LzxDecoder.cpp
deleted file mode 100644
index d1027f1f3..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/LzxDecoder.cpp
+++ /dev/null
@@ -1,387 +0,0 @@
-// LzxDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/Defs.h"
-
-#include "LzxDecoder.h"
-
-namespace NCompress {
-namespace NLzx {
-
-const int kLenIdNeedInit = -2;
-
-CDecoder::CDecoder(bool wimMode):
- _keepHistory(false),
- _skipByte(false),
- _wimMode(wimMode)
-{
- m_x86ConvertOutStreamSpec = new Cx86ConvertOutStream;
- m_x86ConvertOutStream = m_x86ConvertOutStreamSpec;
-}
-
-void CDecoder::ReleaseStreams()
-{
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- m_x86ConvertOutStreamSpec->ReleaseStream();
-}
-
-STDMETHODIMP CDecoder::Flush()
-{
- RINOK(m_OutWindowStream.Flush());
- return m_x86ConvertOutStreamSpec->Flush();
-}
-
-UInt32 CDecoder::ReadBits(unsigned numBits) { return m_InBitStream.ReadBits(numBits); }
-
-#define RIF(x) { if (!(x)) return false; }
-
-bool CDecoder::ReadTable(Byte *lastLevels, Byte *newLevels, UInt32 numSymbols)
-{
- Byte levelLevels[kLevelTableSize];
- UInt32 i;
- for (i = 0; i < kLevelTableSize; i++)
- levelLevels[i] = (Byte)ReadBits(kNumBitsForPreTreeLevel);
- RIF(m_LevelDecoder.SetCodeLengths(levelLevels));
- unsigned num = 0;
- Byte symbol = 0;
- for (i = 0; i < numSymbols;)
- {
- if (num != 0)
- {
- lastLevels[i] = newLevels[i] = symbol;
- i++;
- num--;
- continue;
- }
- UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);
- if (number == kLevelSymbolZeros)
- {
- num = kLevelSymbolZerosStartValue + (unsigned)ReadBits(kLevelSymbolZerosNumBits);
- symbol = 0;
- }
- else if (number == kLevelSymbolZerosBig)
- {
- num = kLevelSymbolZerosBigStartValue + (unsigned)ReadBits(kLevelSymbolZerosBigNumBits);
- symbol = 0;
- }
- else if (number == kLevelSymbolSame || number <= kNumHuffmanBits)
- {
- if (number <= kNumHuffmanBits)
- num = 1;
- else
- {
- num = kLevelSymbolSameStartValue + (unsigned)ReadBits(kLevelSymbolSameNumBits);
- number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);
- if (number > kNumHuffmanBits)
- return false;
- }
- symbol = Byte((17 + lastLevels[i] - number) % (kNumHuffmanBits + 1));
- }
- else
- return false;
- }
- return true;
-}
-
-bool CDecoder::ReadTables(void)
-{
- Byte newLevels[kMaxTableSize];
- {
- if (_skipByte)
- m_InBitStream.DirectReadByte();
- m_InBitStream.Normalize();
-
- unsigned blockType = (unsigned)ReadBits(kNumBlockTypeBits);
- if (blockType > kBlockTypeUncompressed)
- return false;
- if (_wimMode)
- if (ReadBits(1) == 1)
- m_UnCompressedBlockSize = (1 << 15);
- else
- m_UnCompressedBlockSize = ReadBits(16);
- else
- m_UnCompressedBlockSize = m_InBitStream.ReadBitsBig(kUncompressedBlockSizeNumBits);
-
- m_IsUncompressedBlock = (blockType == kBlockTypeUncompressed);
-
- _skipByte = (m_IsUncompressedBlock && ((m_UnCompressedBlockSize & 1) != 0));
-
- if (m_IsUncompressedBlock)
- {
- ReadBits(16 - m_InBitStream.GetBitPosition());
- if (!m_InBitStream.ReadUInt32(m_RepDistances[0]))
- return false;
- m_RepDistances[0]--;
- for (unsigned i = 1; i < kNumRepDistances; i++)
- {
- UInt32 rep = 0;
- for (unsigned j = 0; j < 4; j++)
- rep |= (UInt32)m_InBitStream.DirectReadByte() << (8 * j);
- m_RepDistances[i] = rep - 1;
- }
- return true;
- }
- m_AlignIsUsed = (blockType == kBlockTypeAligned);
- if (m_AlignIsUsed)
- {
- for (unsigned i = 0; i < kAlignTableSize; i++)
- newLevels[i] = (Byte)ReadBits(kNumBitsForAlignLevel);
- RIF(m_AlignDecoder.SetCodeLengths(newLevels));
- }
- }
-
- RIF(ReadTable(m_LastMainLevels, newLevels, 256));
- RIF(ReadTable(m_LastMainLevels + 256, newLevels + 256, m_NumPosLenSlots));
- for (UInt32 i = 256 + m_NumPosLenSlots; i < kMainTableSize; i++)
- newLevels[i] = 0;
- RIF(m_MainDecoder.SetCodeLengths(newLevels));
-
- RIF(ReadTable(m_LastLenLevels, newLevels, kNumLenSymbols));
- return m_LenDecoder.SetCodeLengths(newLevels);
-}
-
-class CDecoderFlusher
-{
- CDecoder *m_Decoder;
-public:
- bool NeedFlush;
- CDecoderFlusher(CDecoder *decoder): m_Decoder(decoder), NeedFlush(true) {}
- ~CDecoderFlusher()
- {
- if (NeedFlush)
- m_Decoder->Flush();
- m_Decoder->ReleaseStreams();
- }
-};
-
-
-void CDecoder::ClearPrevLevels()
-{
- unsigned i;
- for (i = 0; i < kMainTableSize; i++)
- m_LastMainLevels[i] = 0;
- for (i = 0; i < kNumLenSymbols; i++)
- m_LastLenLevels[i] = 0;
-}
-
-
-HRESULT CDecoder::CodeSpec(UInt32 curSize)
-{
- if (_remainLen == kLenIdNeedInit)
- {
- _remainLen = 0;
- m_InBitStream.Init();
- if (!_keepHistory || !m_IsUncompressedBlock)
- m_InBitStream.Normalize();
- if (!_keepHistory)
- {
- _skipByte = false;
- m_UnCompressedBlockSize = 0;
- ClearPrevLevels();
- UInt32 i86TranslationSize = 12000000;
- bool translationMode = true;
- if (!_wimMode)
- {
- translationMode = (ReadBits(1) != 0);
- if (translationMode)
- {
- i86TranslationSize = ReadBits(16) << 16;
- i86TranslationSize |= ReadBits(16);
- }
- }
- m_x86ConvertOutStreamSpec->Init(translationMode, i86TranslationSize);
-
- for (unsigned i = 0 ; i < kNumRepDistances; i++)
- m_RepDistances[i] = 0;
- }
- }
-
- while (_remainLen > 0 && curSize > 0)
- {
- m_OutWindowStream.PutByte(m_OutWindowStream.GetByte(m_RepDistances[0]));
- _remainLen--;
- curSize--;
- }
-
- while (curSize > 0)
- {
- if (m_UnCompressedBlockSize == 0)
- if (!ReadTables())
- return S_FALSE;
- UInt32 next = (Int32)MyMin(m_UnCompressedBlockSize, curSize);
- curSize -= next;
- m_UnCompressedBlockSize -= next;
- if (m_IsUncompressedBlock)
- {
- while (next > 0)
- {
- m_OutWindowStream.PutByte(m_InBitStream.DirectReadByte());
- next--;
- }
- }
- else while (next > 0)
- {
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
- if (number < 256)
- {
- m_OutWindowStream.PutByte((Byte)number);
- next--;
- }
- else
- {
- UInt32 posLenSlot = number - 256;
- if (posLenSlot >= m_NumPosLenSlots)
- return S_FALSE;
- UInt32 posSlot = posLenSlot / kNumLenSlots;
- UInt32 lenSlot = posLenSlot % kNumLenSlots;
- UInt32 len = kMatchMinLen + lenSlot;
- if (lenSlot == kNumLenSlots - 1)
- {
- UInt32 lenTemp = m_LenDecoder.DecodeSymbol(&m_InBitStream);
- if (lenTemp >= kNumLenSymbols)
- return S_FALSE;
- len += lenTemp;
- }
-
- if (posSlot < kNumRepDistances)
- {
- UInt32 distance = m_RepDistances[posSlot];
- m_RepDistances[posSlot] = m_RepDistances[0];
- m_RepDistances[0] = distance;
- }
- else
- {
- UInt32 distance;
- unsigned numDirectBits;
- if (posSlot < kNumPowerPosSlots)
- {
- numDirectBits = (unsigned)(posSlot >> 1) - 1;
- distance = ((2 | (posSlot & 1)) << numDirectBits);
- }
- else
- {
- numDirectBits = kNumLinearPosSlotBits;
- distance = ((posSlot - 0x22) << kNumLinearPosSlotBits);
- }
-
- if (m_AlignIsUsed && numDirectBits >= kNumAlignBits)
- {
- distance += (m_InBitStream.ReadBits(numDirectBits - kNumAlignBits) << kNumAlignBits);
- UInt32 alignTemp = m_AlignDecoder.DecodeSymbol(&m_InBitStream);
- if (alignTemp >= kAlignTableSize)
- return S_FALSE;
- distance += alignTemp;
- }
- else
- distance += m_InBitStream.ReadBits(numDirectBits);
- m_RepDistances[2] = m_RepDistances[1];
- m_RepDistances[1] = m_RepDistances[0];
- m_RepDistances[0] = distance - kNumRepDistances;
- }
-
- UInt32 locLen = len;
- if (locLen > next)
- locLen = next;
-
- if (!m_OutWindowStream.CopyBlock(m_RepDistances[0], locLen))
- return S_FALSE;
-
- len -= locLen;
- next -= locLen;
- if (len != 0)
- {
- _remainLen = (int)len;
- return S_OK;
- }
- }
- }
- }
- return S_OK;
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (outSize == NULL)
- return E_INVALIDARG;
- UInt64 size = *outSize;
-
- RINOK(SetInStream(inStream));
- m_x86ConvertOutStreamSpec->SetStream(outStream);
- m_OutWindowStream.SetStream(m_x86ConvertOutStream);
- RINOK(SetOutStreamSize(outSize));
-
- CDecoderFlusher flusher(this);
-
- const UInt64 start = m_OutWindowStream.GetProcessedSize();
- for (;;)
- {
- UInt32 curSize = 1 << 18;
- UInt64 rem = size - (m_OutWindowStream.GetProcessedSize() - start);
- if (curSize > rem)
- curSize = (UInt32)rem;
- if (curSize == 0)
- break;
- RINOK(CodeSpec(curSize));
- if (progress != NULL)
- {
- UInt64 inSize = m_InBitStream.GetProcessedSize();
- UInt64 nowPos64 = m_OutWindowStream.GetProcessedSize() - start;
- RINOK(progress->SetRatioInfo(&inSize, &nowPos64));
- }
- }
- flusher.NeedFlush = false;
- return Flush();
-}
-
-HRESULT CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream)
-{
- m_InBitStream.SetStream(inStream);
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::ReleaseInStream()
-{
- m_InBitStream.ReleaseStream();
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)
-{
- if (outSize == NULL)
- return E_FAIL;
- _remainLen = kLenIdNeedInit;
- m_OutWindowStream.Init(_keepHistory);
- return S_OK;
-}
-
-HRESULT CDecoder::SetParams(unsigned numDictBits)
-{
- if (numDictBits < kNumDictionaryBitsMin || numDictBits > kNumDictionaryBitsMax)
- return E_INVALIDARG;
- UInt32 numPosSlots;
- if (numDictBits < 20)
- numPosSlots = 30 + (numDictBits - 15) * 2;
- else if (numDictBits == 20)
- numPosSlots = 42;
- else
- numPosSlots = 50;
- m_NumPosLenSlots = numPosSlots * kNumLenSlots;
- if (!m_OutWindowStream.Create(kDictionarySizeMax))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 16))
- return E_OUTOFMEMORY;
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/LzxDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/LzxDecoder.h
deleted file mode 100644
index 73a050619..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/LzxDecoder.h
+++ /dev/null
@@ -1,159 +0,0 @@
-// LzxDecoder.h
-
-#ifndef __LZX_DECODER_H
-#define __LZX_DECODER_H
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-#include "Lzx.h"
-#include "Lzx86Converter.h"
-
-namespace NCompress {
-namespace NLzx {
-
-namespace NBitStream {
-
-const unsigned kNumBigValueBits = 8 * 4;
-const unsigned kNumValueBits = 17;
-const UInt32 kBitDecoderValueMask = (1 << kNumValueBits) - 1;
-
-class CDecoder
-{
- CInBuffer m_Stream;
- UInt32 m_Value;
- unsigned m_BitPos;
-public:
- CDecoder() {}
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
-
- void SetStream(ISequentialInStream *s) { m_Stream.SetStream(s); }
- void ReleaseStream() { m_Stream.ReleaseStream(); }
-
- void Init()
- {
- m_Stream.Init();
- m_BitPos = kNumBigValueBits;
- }
-
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - (kNumBigValueBits - m_BitPos) / 8; }
-
- unsigned GetBitPosition() const { return m_BitPos & 0xF; }
-
- void Normalize()
- {
- for (; m_BitPos >= 16; m_BitPos -= 16)
- {
- Byte b0 = m_Stream.ReadByte();
- Byte b1 = m_Stream.ReadByte();
- m_Value = (m_Value << 8) | b1;
- m_Value = (m_Value << 8) | b0;
- }
- }
-
- UInt32 GetValue(unsigned numBits) const
- {
- return ((m_Value >> ((32 - kNumValueBits) - m_BitPos)) & kBitDecoderValueMask) >> (kNumValueBits - numBits);
- }
-
- void MovePos(unsigned numBits)
- {
- m_BitPos += numBits;
- Normalize();
- }
-
- UInt32 ReadBits(unsigned numBits)
- {
- UInt32 res = GetValue(numBits);
- MovePos(numBits);
- return res;
- }
-
- UInt32 ReadBitsBig(unsigned numBits)
- {
- unsigned numBits0 = numBits / 2;
- unsigned numBits1 = numBits - numBits0;
- UInt32 res = ReadBits(numBits0) << numBits1;
- return res + ReadBits(numBits1);
- }
-
- bool ReadUInt32(UInt32 &v)
- {
- if (m_BitPos != 0)
- return false;
- v = ((m_Value >> 16) & 0xFFFF) | ((m_Value << 16) & 0xFFFF0000);
- m_BitPos = kNumBigValueBits;
- return true;
- }
-
- Byte DirectReadByte() { return m_Stream.ReadByte(); }
-
-};
-}
-
-class CDecoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- NBitStream::CDecoder m_InBitStream;
- CLzOutWindow m_OutWindowStream;
-
- UInt32 m_RepDistances[kNumRepDistances];
- UInt32 m_NumPosLenSlots;
-
- bool m_IsUncompressedBlock;
- bool m_AlignIsUsed;
-
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kNumLenSymbols> m_LenDecoder;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kAlignTableSize> m_AlignDecoder;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
-
- Byte m_LastMainLevels[kMainTableSize];
- Byte m_LastLenLevels[kNumLenSymbols];
-
- Cx86ConvertOutStream *m_x86ConvertOutStreamSpec;
- CMyComPtr<ISequentialOutStream> m_x86ConvertOutStream;
-
- UInt32 m_UnCompressedBlockSize;
-
- bool _keepHistory;
- int _remainLen;
- bool _skipByte;
-
- bool _wimMode;
-
- UInt32 ReadBits(unsigned numBits);
- bool ReadTable(Byte *lastLevels, Byte *newLevels, UInt32 numSymbols);
- bool ReadTables();
- void ClearPrevLevels();
-
- HRESULT CodeSpec(UInt32 size);
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-public:
- CDecoder(bool wimMode = false);
-
- MY_UNKNOWN_IMP
-
- void ReleaseStreams();
- STDMETHOD(Flush)();
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
-
- HRESULT SetParams(unsigned numDictBits);
- void SetKeepHistory(bool keepHistory) { _keepHistory = keepHistory; }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Mtf8.h b/src/libs/7zip/unix/CPP/7zip/Compress/Mtf8.h
deleted file mode 100644
index e0264189b..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Mtf8.h
+++ /dev/null
@@ -1,193 +0,0 @@
-// Mtf8.h
-
-#ifndef __COMPRESS_MTF8_H
-#define __COMPRESS_MTF8_H
-
-#include "../../../C/CpuArch.h"
-
-#include "../../Common/Types.h"
-
-namespace NCompress {
-
-struct CMtf8Encoder
-{
- Byte Buf[256];
-
- int FindAndMove(Byte v)
- {
- int pos;
- for (pos = 0; Buf[pos] != v; pos++) {}
- int resPos = pos;
- for (; pos >= 8; pos -= 8)
- {
- Buf[pos] = Buf[pos - 1];
- Buf[pos - 1] = Buf[pos - 2];
- Buf[pos - 2] = Buf[pos - 3];
- Buf[pos - 3] = Buf[pos - 4];
- Buf[pos - 4] = Buf[pos - 5];
- Buf[pos - 5] = Buf[pos - 6];
- Buf[pos - 6] = Buf[pos - 7];
- Buf[pos - 7] = Buf[pos - 8];
- }
- for (; pos > 0; pos--)
- Buf[pos] = Buf[pos - 1];
- Buf[0] = v;
- return resPos;
- }
-};
-
-/*
-struct CMtf8Decoder
-{
- Byte Buf[256];
-
- void Init(int) {};
- Byte GetHead() const { return Buf[0]; }
- Byte GetAndMove(int pos)
- {
- Byte res = Buf[pos];
- for (; pos >= 8; pos -= 8)
- {
- Buf[pos] = Buf[pos - 1];
- Buf[pos - 1] = Buf[pos - 2];
- Buf[pos - 2] = Buf[pos - 3];
- Buf[pos - 3] = Buf[pos - 4];
- Buf[pos - 4] = Buf[pos - 5];
- Buf[pos - 5] = Buf[pos - 6];
- Buf[pos - 6] = Buf[pos - 7];
- Buf[pos - 7] = Buf[pos - 8];
- }
- for (; pos > 0; pos--)
- Buf[pos] = Buf[pos - 1];
- Buf[0] = res;
- return res;
- }
-};
-*/
-
-#ifdef MY_CPU_64BIT
-typedef UInt64 CMtfVar;
-#define MTF_MOVS 3
-#else
-typedef UInt32 CMtfVar;
-#define MTF_MOVS 2
-#endif
-
-#define MTF_MASK ((1 << MTF_MOVS) - 1)
-
-
-struct CMtf8Decoder
-{
- CMtfVar Buf[256 >> MTF_MOVS];
-
- void StartInit() { memset(Buf, 0, sizeof(Buf)); }
- void Add(unsigned int pos, Byte val) { Buf[pos >> MTF_MOVS] |= ((CMtfVar)val << ((pos & MTF_MASK) << 3)); }
- Byte GetHead() const { return (Byte)Buf[0]; }
- Byte GetAndMove(unsigned int pos)
- {
- UInt32 lim = ((UInt32)pos >> MTF_MOVS);
- pos = (pos & MTF_MASK) << 3;
- CMtfVar prev = (Buf[lim] >> pos) & 0xFF;
-
- UInt32 i = 0;
- if ((lim & 1) != 0)
- {
- CMtfVar next = Buf[0];
- Buf[0] = (next << 8) | prev;
- prev = (next >> (MTF_MASK << 3));
- i = 1;
- lim -= 1;
- }
- for (; i < lim; i += 2)
- {
- CMtfVar n0 = Buf[i];
- CMtfVar n1 = Buf[i + 1];
- Buf[i ] = (n0 << 8) | prev;
- Buf[i + 1] = (n1 << 8) | (n0 >> (MTF_MASK << 3));
- prev = (n1 >> (MTF_MASK << 3));
- }
- CMtfVar next = Buf[i];
- CMtfVar mask = (((CMtfVar)0x100 << pos) - 1);
- Buf[i] = (next & ~mask) | (((next << 8) | prev) & mask);
- return (Byte)Buf[0];
- }
-};
-
-/*
-const int kSmallSize = 64;
-class CMtf8Decoder
-{
- Byte SmallBuffer[kSmallSize];
- int SmallSize;
- Byte Counts[16];
- int Size;
-public:
- Byte Buf[256];
-
- Byte GetHead() const
- {
- if (SmallSize > 0)
- return SmallBuffer[kSmallSize - SmallSize];
- return Buf[0];
- }
-
- void Init(int size)
- {
- Size = size;
- SmallSize = 0;
- for (int i = 0; i < 16; i++)
- {
- Counts[i] = ((size >= 16) ? 16 : size);
- size -= Counts[i];
- }
- }
-
- Byte GetAndMove(int pos)
- {
- if (pos < SmallSize)
- {
- Byte *p = SmallBuffer + kSmallSize - SmallSize;
- Byte res = p[pos];
- for (; pos > 0; pos--)
- p[pos] = p[pos - 1];
- SmallBuffer[kSmallSize - SmallSize] = res;
- return res;
- }
- if (SmallSize == kSmallSize)
- {
- int i = Size - 1;
- int g = 16;
- do
- {
- g--;
- int offset = (g << 4);
- for (int t = Counts[g] - 1; t >= 0; t--, i--)
- Buf[i] = Buf[offset + t];
- }
- while(g != 0);
-
- for (i = kSmallSize - 1; i >= 0; i--)
- Buf[i] = SmallBuffer[i];
- Init(Size);
- }
- pos -= SmallSize;
- int g;
- for (g = 0; pos >= Counts[g]; g++)
- pos -= Counts[g];
- int offset = (g << 4);
- Byte res = Buf[offset + pos];
- for (pos; pos < 16 - 1; pos++)
- Buf[offset + pos] = Buf[offset + pos + 1];
-
- SmallSize++;
- SmallBuffer[kSmallSize - SmallSize] = res;
-
- Counts[g]--;
- return res;
- }
-};
-*/
-
-}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PPMD_Alone/PpmdAlone.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/PPMD_Alone/PpmdAlone.cpp
deleted file mode 100644
index 25df0a0d0..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PPMD_Alone/PpmdAlone.cpp
+++ /dev/null
@@ -1,348 +0,0 @@
-// PpmdAlone.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/MyWindows.h"
-#include "../../../Common/MyInitGuid.h"
-
-#include <stdio.h>
-
-#if defined(_WIN32) || defined(OS2) || defined(MSDOS)
-#include <fcntl.h>
-#include <io.h>
-#define MY_SET_BINARY_MODE(file) _setmode(_fileno(file), O_BINARY)
-#else
-#define MY_SET_BINARY_MODE(file)
-#endif
-
-#include "../../../Common/CommandLineParser.h"
-#include "../../../Common/StringConvert.h"
-#include "../../../Common/StringToInt.h"
-
-#include "../../Common/FileStreams.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../PpmdDecoder.h"
-#include "../PpmdEncoder.h"
-
-using namespace NCommandLineParser;
-
-#ifdef _WIN32
-bool g_IsNT = false;
-static inline bool IsItWindowsNT()
-{
- OSVERSIONINFO versionInfo;
- versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
- if (!::GetVersionEx(&versionInfo))
- return false;
- return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);
-}
-#endif
-
-static const char *kCantAllocate = "Can not allocate memory";
-static const char *kReadError = "Read error";
-static const char *kWriteError = "Write error";
-
-namespace NKey {
-enum Enum
-{
- kHelp1 = 0,
- kHelp2,
- kOrder,
- kUsedMemorySize,
- kStdIn,
- kStdOut
-};
-}
-
-static const CSwitchForm kSwitchForms[] =
-{
- { L"?", NSwitchType::kSimple, false },
- { L"H", NSwitchType::kSimple, false },
- { L"O", NSwitchType::kUnLimitedPostString, false, 1 },
- { L"M", NSwitchType::kUnLimitedPostString, false, 1 },
- { L"SI", NSwitchType::kSimple, false },
- { L"SO", NSwitchType::kSimple, false }
-};
-
-static const int kNumSwitches = sizeof(kSwitchForms) / sizeof(kSwitchForms[0]);
-
-static void PrintHelp()
-{
- fprintf(stderr, "\nUsage: PPMD <e|d> inputFile outputFile [<switches>...]\n"
- " e: encode file\n"
- " d: decode file\n"
-/*
- " b: Benchmark\n"
-*/
- "<Switches>\n"
- " -o{N}: set order - [4, 32], default: 4\n"
- " -m{N}: set memory size - [4,512], default: 4 (4 MB)\n"
- " -si: read data from stdin (only with d)\n"
- " -so: write data to stdout\n"
- );
-}
-
-static void PrintHelpAndExit(const char *s)
-{
- fprintf(stderr, "\nError: %s\n\n", s);
- PrintHelp();
- throw -1;
-}
-
-static void IncorrectCommand()
-{
- PrintHelpAndExit("Incorrect command");
-}
-
-static void WriteArgumentsToStringList(int numArguments, const char *arguments[],
- UStringVector &strings)
-{
- for(int i = 1; i < numArguments; i++)
- strings.Add(MultiByteToUnicodeString(arguments[i]));
-}
-
-static bool GetNumber(const wchar_t *s, UInt32 &value)
-{
- value = 0;
- if (MyStringLen(s) == 0)
- return false;
- const wchar_t *end;
- UInt64 res = ConvertStringToUInt64(s, &end);
- if (*end != L'\0')
- return false;
- if (res > 0xFFFFFFFF)
- return false;
- value = UInt32(res);
- return true;
-}
-
-int main2(int n, const char *args[])
-{
- #ifdef _WIN32
- g_IsNT = IsItWindowsNT();
- #endif
-
- fprintf(stderr, "\nPPMD 4.49 Copyright (c) 1999-2007 Igor Pavlov 2007-07-05\n");
-
- if (n == 1)
- {
- PrintHelp();
- return 0;
- }
-
- bool unsupportedTypes = (sizeof(Byte) != 1 || sizeof(UInt32) < 4 || sizeof(UInt64) < 4);
- if (unsupportedTypes)
- {
- fprintf(stderr, "Unsupported base types. Edit Common/Types.h and recompile");
- return 1;
- }
-
- UStringVector commandStrings;
- WriteArgumentsToStringList(n, args, commandStrings);
- CParser parser(kNumSwitches);
- try
- {
- parser.ParseStrings(kSwitchForms, commandStrings);
- }
- catch(...)
- {
- IncorrectCommand();
- }
-
- if(parser[NKey::kHelp1].ThereIs || parser[NKey::kHelp2].ThereIs)
- {
- PrintHelp();
- return 0;
- }
- const UStringVector &nonSwitchStrings = parser.NonSwitchStrings;
-
- int paramIndex = 0;
- if (paramIndex >= nonSwitchStrings.Size())
- IncorrectCommand();
- const UString &command = nonSwitchStrings[paramIndex++];
-
-/* FIXME
- if (command.CompareNoCase(L"b") == 0)
- {
- const UInt32 kNumDefaultItereations = 1;
- UInt32 numIterations = kNumDefaultItereations;
- {
- if (paramIndex < nonSwitchStrings.Size())
- if (!GetNumber(nonSwitchStrings[paramIndex++], numIterations))
- numIterations = kNumDefaultItereations;
- }
- return LzmaBenchCon(stderr, numIterations, numThreads, dictionary);
- }
-*/
-
- bool encodeMode = false;
- if (command.CompareNoCase(L"e") == 0)
- encodeMode = true;
- else if (command.CompareNoCase(L"d") == 0)
- encodeMode = false;
- else
- IncorrectCommand();
-
- bool stdInMode = parser[NKey::kStdIn].ThereIs;
- bool stdOutMode = parser[NKey::kStdOut].ThereIs;
-
- CMyComPtr<ISequentialInStream> inStream;
- CInFileStream *inStreamSpec = 0;
- if (stdInMode)
- {
- inStream = new CStdInFileStream;
- MY_SET_BINARY_MODE(stdin);
- }
- else
- {
- if (paramIndex >= nonSwitchStrings.Size())
- IncorrectCommand();
- const UString &inputName = nonSwitchStrings[paramIndex++];
- inStreamSpec = new CInFileStream;
- inStream = inStreamSpec;
- if (!inStreamSpec->Open(GetSystemString(inputName)))
- {
- fprintf(stderr, "\nError: can not open input file %s\n",
- (const char *)GetOemString(inputName));
- return 1;
- }
- }
-
- CMyComPtr<ISequentialOutStream> outStream;
- if (stdOutMode)
- {
- outStream = new CStdOutFileStream;
- MY_SET_BINARY_MODE(stdout);
- }
- else
- {
- if (paramIndex >= nonSwitchStrings.Size())
- IncorrectCommand();
- const UString &outputName = nonSwitchStrings[paramIndex++];
- COutFileStream *outStreamSpec = new COutFileStream;
- outStream = outStreamSpec;
- if (!outStreamSpec->Create(GetSystemString(outputName), true))
- {
- fprintf(stderr, "\nError: can not open output file %s\n",
- (const char *)GetOemString(outputName));
- return 1;
- }
- }
-
- UInt64 fileSize;
- if (encodeMode)
- {
- // NCompress::NLZMA::CEncoder *encoderSpec = new NCompress::NLZMA::CEncoder;
- NCompress::NPpmd::CEncoder *encoderSpec = new NCompress::NPpmd::CEncoder;
- CMyComPtr<ICompressCoder> encoder = encoderSpec;
-
- if (stdInMode)
- IncorrectCommand();
-
- UInt32 order = 4;
- if(parser[NKey::kOrder].ThereIs)
- if (!GetNumber(parser[NKey::kOrder].PostStrings[0], order))
- IncorrectCommand();
- if (order < 4) order = 4;
-
- UInt32 memSize = 4;
- if(parser[NKey::kUsedMemorySize].ThereIs)
- if (!GetNumber(parser[NKey::kUsedMemorySize].PostStrings[0], memSize))
- IncorrectCommand();
- if (memSize < 4 ) memSize = 4;
-
-
- PROPID propIDs[] =
-
- {
- NCoderPropID::kUsedMemorySize,
- NCoderPropID::kOrder
- };
- const int kNumPropsMax = sizeof(propIDs) / sizeof(propIDs[0]);
-
- PROPVARIANT properties[kNumPropsMax];
- for (int p = 0; p < kNumPropsMax; p++)
- properties[p].vt = VT_UI4;
-
- properties[0].ulVal = memSize * 1024 * 1024; // memory
- properties[1].ulVal = order;
-
- int numProps = kNumPropsMax;
-
- if (encoderSpec->SetCoderProperties(propIDs, properties, numProps) != S_OK)
- IncorrectCommand();
- encoderSpec->WriteCoderProperties(outStream);
-
-/*
- if (eos || stdInMode)
- fileSize = (UInt64)(Int64)-1;
- else
-*/
- inStreamSpec->File.GetLength(fileSize);
-
- for (int i = 0; i < 8; i++)
- {
- Byte b = Byte(fileSize >> (8 * i));
- if (outStream->Write(&b, 1, 0) != S_OK)
- {
- fprintf(stderr, kWriteError);
- return 1;
- }
- }
- HRESULT result = encoder->Code(inStream, outStream, 0, 0, 0);
- if (result == E_OUTOFMEMORY)
- {
- fprintf(stderr, "\nError: Can not allocate memory\n");
- return 1;
- }
- else if (result != S_OK)
- {
- fprintf(stderr, "\nEncoder error = %X\n", (unsigned int)result);
- return 1;
- }
- }
- else
- {
- // NCompress::NLZMA::CDecoder *decoderSpec = new NCompress::NLZMA::CDecoder;
- NCompress::NPpmd::CDecoder *decoderSpec = new NCompress::NPpmd::CDecoder;
- CMyComPtr<ICompressCoder> decoder = decoderSpec;
- const UInt32 kPropertiesSize = 5;
- Byte header[kPropertiesSize + 8];
- if (ReadStream_FALSE(inStream, header, kPropertiesSize + 8) != S_OK)
- {
- fprintf(stderr, kReadError);
- return 1;
- }
- if (decoderSpec->SetDecoderProperties2(header, kPropertiesSize) != S_OK)
- {
- fprintf(stderr, "SetDecoderProperties error");
- return 1;
- }
- fileSize = 0;
- for (int i = 0; i < 8; i++)
- fileSize |= ((UInt64)header[kPropertiesSize + i]) << (8 * i);
-
- if (decoder->Code(inStream, outStream, 0, &fileSize, 0) != S_OK)
- {
- fprintf(stderr, "Decoder error");
- return 1;
- }
- }
- return 0;
-}
-
-int main(int n, const char *args[])
-{
- try { return main2(n, args); }
- catch(const char *s)
- {
- fprintf(stderr, "\nError: %s\n", s);
- return 1;
- }
- catch(...)
- {
- fprintf(stderr, "\nError\n");
- return 1;
- }
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdContext.h b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdContext.h
deleted file mode 100644
index cfff53eda..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdContext.h
+++ /dev/null
@@ -1,490 +0,0 @@
-// PpmdContext.h
-// 2009-05-30 : Igor Pavlov : Public domain
-// This code is based on Dmitry Shkarin's PPMdH code (public domain)
-
-#ifndef __COMPRESS_PPMD_CONTEXT_H
-#define __COMPRESS_PPMD_CONTEXT_H
-
-#include "../../Common/Types.h"
-
-#include "PpmdSubAlloc.h"
-#include "RangeCoder.h"
-
-namespace NCompress {
-namespace NPpmd {
-
-const int INT_BITS=7, PERIOD_BITS=7, TOT_BITS=INT_BITS+PERIOD_BITS,
- INTERVAL=1 << INT_BITS, BIN_SCALE=1 << TOT_BITS, MAX_FREQ=124;
-
-struct SEE2_CONTEXT
-{
- // SEE-contexts for PPM-contexts with masked symbols
- UInt16 Summ;
- Byte Shift, Count;
- void init(int InitVal) { Summ = (UInt16)(InitVal << (Shift=PERIOD_BITS-4)); Count=4; }
- unsigned int getMean()
- {
- unsigned int RetVal=(Summ >> Shift);
- Summ = (UInt16)(Summ - RetVal);
- return RetVal+(RetVal == 0);
- }
- void update()
- {
- if (Shift < PERIOD_BITS && --Count == 0)
- {
- Summ <<= 1;
- Count = (Byte)(3 << Shift++);
- }
- }
-};
-
-struct PPM_CONTEXT
-{
- UInt16 NumStats; // sizeof(UInt16) > sizeof(Byte)
- UInt16 SummFreq;
-
- struct STATE
- {
- Byte Symbol, Freq;
- UInt16 SuccessorLow;
- UInt16 SuccessorHigh;
-
- UInt32 GetSuccessor() const { return SuccessorLow | ((UInt32)SuccessorHigh << 16); }
- void SetSuccessor(UInt32 v)
- {
- SuccessorLow = (UInt16)(v & 0xFFFF);
- SuccessorHigh = (UInt16)((v >> 16) & 0xFFFF);
- }
- };
-
- UInt32 Stats;
- UInt32 Suffix;
-
- PPM_CONTEXT* createChild(CSubAllocator &subAllocator, STATE* pStats, STATE& FirstState)
- {
- PPM_CONTEXT* pc = (PPM_CONTEXT*) subAllocator.AllocContext();
- if (pc)
- {
- pc->NumStats = 1;
- pc->oneState() = FirstState;
- pc->Suffix = subAllocator.GetOffset(this);
- pStats->SetSuccessor(subAllocator.GetOffsetNoCheck(pc));
- }
- return pc;
- }
-
- STATE& oneState() const { return (STATE&) SummFreq; }
-};
-
-/////////////////////////////////
-
-const UInt16 InitBinEsc[] =
- {0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051};
-
-struct CInfo
-{
- CSubAllocator SubAllocator;
- SEE2_CONTEXT SEE2Cont[25][16], DummySEE2Cont;
- PPM_CONTEXT * MinContext, * MaxContext;
-
- PPM_CONTEXT::STATE* FoundState; // found next state transition
- int NumMasked, InitEsc, OrderFall, RunLength, InitRL, MaxOrder;
- Byte CharMask[256], NS2Indx[256], NS2BSIndx[256], HB2Flag[256];
- Byte EscCount, PrintCount, PrevSuccess, HiBitsFlag;
- UInt16 BinSumm[128][64]; // binary SEE-contexts
-
- UInt16 &GetBinSumm(const PPM_CONTEXT::STATE &rs, int numStates)
- {
- HiBitsFlag = HB2Flag[FoundState->Symbol];
- return BinSumm[rs.Freq - 1][
- PrevSuccess + NS2BSIndx[numStates - 1] +
- HiBitsFlag + 2 * HB2Flag[rs.Symbol] +
- ((RunLength >> 26) & 0x20)];
- }
-
- PPM_CONTEXT *GetContext(UInt32 offset) const { return (PPM_CONTEXT *)SubAllocator.GetPtr(offset); }
- PPM_CONTEXT *GetContextNoCheck(UInt32 offset) const { return (PPM_CONTEXT *)SubAllocator.GetPtrNoCheck(offset); }
- PPM_CONTEXT::STATE *GetState(UInt32 offset) const { return (PPM_CONTEXT::STATE *)SubAllocator.GetPtr(offset); }
- PPM_CONTEXT::STATE *GetStateNoCheck(UInt32 offset) const { return (PPM_CONTEXT::STATE *)SubAllocator.GetPtr(offset); }
-
- void RestartModelRare()
- {
- int i, k, m;
- memset(CharMask,0,sizeof(CharMask));
- SubAllocator.InitSubAllocator();
- InitRL = -((MaxOrder < 12) ? MaxOrder : 12) - 1;
- MinContext = MaxContext = (PPM_CONTEXT*) SubAllocator.AllocContext();
- MinContext->Suffix = 0;
- OrderFall = MaxOrder;
- MinContext->SummFreq = (UInt16)((MinContext->NumStats = 256) + 1);
- FoundState = (PPM_CONTEXT::STATE*)SubAllocator.AllocUnits(256 / 2);
- MinContext->Stats = SubAllocator.GetOffsetNoCheck(FoundState);
- PrevSuccess = 0;
- for (RunLength = InitRL, i = 0; i < 256; i++)
- {
- PPM_CONTEXT::STATE &state = FoundState[i];
- state.Symbol = (Byte)i;
- state.Freq = 1;
- state.SetSuccessor(0);
- }
- for (i = 0; i < 128; i++)
- for (k = 0; k < 8; k++)
- for ( m=0; m < 64; m += 8)
- BinSumm[i][k + m] = (UInt16)(BIN_SCALE - InitBinEsc[k] / (i + 2));
- for (i = 0; i < 25; i++)
- for (k = 0; k < 16; k++)
- SEE2Cont[i][k].init(5*i+10);
- }
-
- void StartModelRare(int maxOrder)
- {
- int i, k, m ,Step;
- EscCount=PrintCount=1;
- if (maxOrder < 2)
- {
- memset(CharMask,0,sizeof(CharMask));
- OrderFall = MaxOrder;
- MinContext = MaxContext;
- while (MinContext->Suffix != 0)
- {
- MinContext = GetContextNoCheck(MinContext->Suffix);
- OrderFall--;
- }
- FoundState = GetState(MinContext->Stats);
- MinContext = MaxContext;
- }
- else
- {
- MaxOrder = maxOrder;
- RestartModelRare();
- NS2BSIndx[0] = 2 * 0;
- NS2BSIndx[1] = 2 * 1;
- memset(NS2BSIndx + 2, 2 * 2, 9);
- memset(NS2BSIndx + 11, 2 * 3, 256 - 11);
- for (i = 0; i < 3; i++)
- NS2Indx[i] = (Byte)i;
- for (m = i, k = Step = 1; i < 256; i++)
- {
- NS2Indx[i] = (Byte)m;
- if ( !--k )
- {
- k = ++Step;
- m++;
- }
- }
- memset(HB2Flag, 0, 0x40);
- memset(HB2Flag + 0x40, 0x08, 0x100 - 0x40);
- DummySEE2Cont.Shift = PERIOD_BITS;
- }
- }
-
- PPM_CONTEXT* CreateSuccessors(bool skip, PPM_CONTEXT::STATE* p1)
- {
- // static UpState declaration bypasses IntelC bug
- // static PPM_CONTEXT::STATE UpState;
- PPM_CONTEXT::STATE UpState;
-
- PPM_CONTEXT *pc = MinContext;
- PPM_CONTEXT *UpBranch = GetContext(FoundState->GetSuccessor());
- PPM_CONTEXT::STATE * p, * ps[MAX_O], ** pps = ps;
- if ( !skip )
- {
- *pps++ = FoundState;
- if ( !pc->Suffix )
- goto NO_LOOP;
- }
- if ( p1 )
- {
- p = p1;
- pc = GetContext(pc->Suffix);
- goto LOOP_ENTRY;
- }
- do
- {
- pc = GetContext(pc->Suffix);
- if (pc->NumStats != 1)
- {
- if ((p = GetStateNoCheck(pc->Stats))->Symbol != FoundState->Symbol)
- do { p++; } while (p->Symbol != FoundState->Symbol);
- }
- else
- p = &(pc->oneState());
-LOOP_ENTRY:
- if (GetContext(p->GetSuccessor()) != UpBranch)
- {
- pc = GetContext(p->GetSuccessor());
- break;
- }
- *pps++ = p;
- }
- while ( pc->Suffix );
-NO_LOOP:
- if (pps == ps)
- return pc;
- UpState.Symbol = *(Byte*) UpBranch;
- UpState.SetSuccessor(SubAllocator.GetOffset(UpBranch) + 1);
- if (pc->NumStats != 1)
- {
- if ((p = GetStateNoCheck(pc->Stats))->Symbol != UpState.Symbol)
- do { p++; } while (p->Symbol != UpState.Symbol);
- unsigned int cf = p->Freq-1;
- unsigned int s0 = pc->SummFreq - pc->NumStats - cf;
- UpState.Freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) :
- ((2 * cf + 3 * s0 - 1) / (2 * s0))));
- }
- else
- UpState.Freq = pc->oneState().Freq;
- do
- {
- pc = pc->createChild(SubAllocator, *--pps, UpState);
- if ( !pc )
- return NULL;
- }
- while (pps != ps);
- return pc;
- }
-
- void UpdateModel()
- {
- PPM_CONTEXT::STATE fs = *FoundState, * p = NULL;
- PPM_CONTEXT* pc, * Successor;
- unsigned int ns1, ns, cf, sf, s0;
- if (fs.Freq < MAX_FREQ / 4 && MinContext->Suffix != 0)
- {
- pc = GetContextNoCheck(MinContext->Suffix);
-
- if (pc->NumStats != 1)
- {
- if ((p = GetStateNoCheck(pc->Stats))->Symbol != fs.Symbol)
- {
- do { p++; } while (p->Symbol != fs.Symbol);
- if (p[0].Freq >= p[-1].Freq)
- {
- _PPMD_SWAP(p[0],p[-1]);
- p--;
- }
- }
- if (p->Freq < MAX_FREQ-9)
- {
- p->Freq += 2;
- pc->SummFreq += 2;
- }
- }
- else
- {
- p = &(pc->oneState());
- p->Freq = (Byte)(p->Freq + ((p->Freq < 32) ? 1 : 0));
- }
- }
- if ( !OrderFall )
- {
- MinContext = MaxContext = CreateSuccessors(true, p);
- FoundState->SetSuccessor(SubAllocator.GetOffset(MinContext));
- if (MinContext == 0)
- goto RESTART_MODEL;
- return;
- }
- *SubAllocator.pText++ = fs.Symbol;
- Successor = (PPM_CONTEXT*) SubAllocator.pText;
- if (SubAllocator.pText >= SubAllocator.UnitsStart)
- goto RESTART_MODEL;
- if (fs.GetSuccessor() != 0)
- {
- if ((Byte *)GetContext(fs.GetSuccessor()) <= SubAllocator.pText)
- {
- PPM_CONTEXT* cs = CreateSuccessors(false, p);
- fs.SetSuccessor(SubAllocator.GetOffset(cs));
- if (cs == NULL)
- goto RESTART_MODEL;
- }
- if ( !--OrderFall )
- {
- Successor = GetContext(fs.GetSuccessor());
- SubAllocator.pText -= (MaxContext != MinContext);
- }
- }
- else
- {
- FoundState->SetSuccessor(SubAllocator.GetOffsetNoCheck(Successor));
- fs.SetSuccessor(SubAllocator.GetOffsetNoCheck(MinContext));
- }
- s0 = MinContext->SummFreq - (ns = MinContext->NumStats) - (fs.Freq - 1);
- for (pc = MaxContext; pc != MinContext; pc = GetContext(pc->Suffix))
- {
- if ((ns1 = pc->NumStats) != 1)
- {
- if ((ns1 & 1) == 0)
- {
- void *ppp = SubAllocator.ExpandUnits(GetState(pc->Stats), ns1 >> 1);
- pc->Stats = SubAllocator.GetOffset(ppp);
- if (!ppp)
- goto RESTART_MODEL;
- }
- pc->SummFreq = (UInt16)(pc->SummFreq + (2 * ns1 < ns) + 2 * ((4 * ns1 <= ns) &
- (pc->SummFreq <= 8 * ns1)));
- }
- else
- {
- p = (PPM_CONTEXT::STATE*) SubAllocator.AllocUnits(1);
- if ( !p )
- goto RESTART_MODEL;
- *p = pc->oneState();
- pc->Stats = SubAllocator.GetOffsetNoCheck(p);
- if (p->Freq < MAX_FREQ / 4 - 1)
- p->Freq <<= 1;
- else
- p->Freq = MAX_FREQ - 4;
- pc->SummFreq = (UInt16)(p->Freq + InitEsc + (ns > 3));
- }
- cf = 2 * fs.Freq * (pc->SummFreq+6);
- sf = s0 + pc->SummFreq;
- if (cf < 6 * sf)
- {
- cf = 1 + (cf > sf)+(cf >= 4 * sf);
- pc->SummFreq += 3;
- }
- else
- {
- cf = 4 + (cf >= 9 * sf) + (cf >= 12 * sf) + (cf >= 15 * sf);
- pc->SummFreq = (UInt16)(pc->SummFreq + cf);
- }
- p = GetState(pc->Stats) + ns1;
- p->SetSuccessor(SubAllocator.GetOffset(Successor));
- p->Symbol = fs.Symbol;
- p->Freq = (Byte)cf;
- pc->NumStats = (UInt16)++ns1;
- }
- MaxContext = MinContext = GetContext(fs.GetSuccessor());
- return;
-RESTART_MODEL:
- RestartModelRare();
- EscCount = 0;
- PrintCount = 0xFF;
- }
-
- void ClearMask()
- {
- EscCount = 1;
- memset(CharMask, 0, sizeof(CharMask));
- // if (++PrintCount == 0)
- // PrintInfo(DecodedFile,EncodedFile);
- }
-
- void update1(PPM_CONTEXT::STATE* p)
- {
- (FoundState = p)->Freq += 4;
- MinContext->SummFreq += 4;
- if (p[0].Freq > p[-1].Freq)
- {
- _PPMD_SWAP(p[0],p[-1]);
- FoundState = --p;
- if (p->Freq > MAX_FREQ)
- rescale();
- }
- }
-
-
- void update2(PPM_CONTEXT::STATE* p)
- {
- (FoundState = p)->Freq += 4;
- MinContext->SummFreq += 4;
- if (p->Freq > MAX_FREQ)
- rescale();
- EscCount++;
- RunLength = InitRL;
- }
-
- SEE2_CONTEXT* makeEscFreq2(int Diff, UInt32 &scale)
- {
- SEE2_CONTEXT* psee2c;
- if (MinContext->NumStats != 256)
- {
- psee2c = SEE2Cont[NS2Indx[Diff-1]] +
- (Diff < (GetContext(MinContext->Suffix))->NumStats - MinContext->NumStats) +
- 2 * (MinContext->SummFreq < 11 * MinContext->NumStats) +
- 4 * (NumMasked > Diff) +
- HiBitsFlag;
- scale = psee2c->getMean();
- }
- else
- {
- psee2c = &DummySEE2Cont;
- scale = 1;
- }
- return psee2c;
- }
-
-
-
- void rescale()
- {
- int OldNS = MinContext->NumStats, i = MinContext->NumStats - 1, Adder, EscFreq;
- PPM_CONTEXT::STATE* p1, * p;
- PPM_CONTEXT::STATE *stats = GetStateNoCheck(MinContext->Stats);
- for (p = FoundState; p != stats; p--)
- _PPMD_SWAP(p[0], p[-1]);
- stats->Freq += 4;
- MinContext->SummFreq += 4;
- EscFreq = MinContext->SummFreq - p->Freq;
- Adder = (OrderFall != 0);
- p->Freq = (Byte)((p->Freq + Adder) >> 1);
- MinContext->SummFreq = p->Freq;
- do
- {
- EscFreq -= (++p)->Freq;
- p->Freq = (Byte)((p->Freq + Adder) >> 1);
- MinContext->SummFreq = (UInt16)(MinContext->SummFreq + p->Freq);
- if (p[0].Freq > p[-1].Freq)
- {
- PPM_CONTEXT::STATE tmp = *(p1 = p);
- do
- {
- p1[0] = p1[-1];
- }
- while (--p1 != stats && tmp.Freq > p1[-1].Freq);
- *p1 = tmp;
- }
- }
- while ( --i );
- if (p->Freq == 0)
- {
- do { i++; } while ((--p)->Freq == 0);
- EscFreq += i;
- MinContext->NumStats = (UInt16)(MinContext->NumStats - i);
- if (MinContext->NumStats == 1)
- {
- PPM_CONTEXT::STATE tmp = *stats;
- do { tmp.Freq = (Byte)(tmp.Freq - (tmp.Freq >> 1)); EscFreq >>= 1; } while (EscFreq > 1);
- SubAllocator.FreeUnits(stats, (OldNS+1) >> 1);
- *(FoundState = &MinContext->oneState()) = tmp; return;
- }
- }
- EscFreq -= (EscFreq >> 1);
- MinContext->SummFreq = (UInt16)(MinContext->SummFreq + EscFreq);
- int n0 = (OldNS+1) >> 1, n1 = (MinContext->NumStats + 1) >> 1;
- if (n0 != n1)
- MinContext->Stats = SubAllocator.GetOffset(SubAllocator.ShrinkUnits(stats, n0, n1));
- FoundState = GetState(MinContext->Stats);
- }
-
- void NextContext()
- {
- PPM_CONTEXT *c = GetContext(FoundState->GetSuccessor());
- if (!OrderFall && (Byte *)c > SubAllocator.pText)
- MinContext = MaxContext = c;
- else
- {
- UpdateModel();
- if (EscCount == 0)
- ClearMask();
- }
- }
-};
-
-// Tabulated escapes for exponential symbol distribution
-const Byte ExpEscape[16]={ 25,14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 };
-#define GET_MEAN(SUMM,SHIFT,ROUND) ((SUMM+(1 << (SHIFT-ROUND))) >> (SHIFT))
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecode.h b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecode.h
deleted file mode 100644
index fe6927bf8..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecode.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// PpmdDecode.h
-// 2009-05-30 : Igor Pavlov : Public domain
-// This code is based on Dmitry Shkarin's PPMdH code (public domain)
-
-#ifndef __COMPRESS_PPMD_DECODE_H
-#define __COMPRESS_PPMD_DECODE_H
-
-#include "PpmdContext.h"
-
-namespace NCompress {
-namespace NPpmd {
-
-class CRangeDecoderVirt
-{
-public:
- virtual ~CRangeDecoderVirt() {}
- virtual UInt32 GetThreshold(UInt32 total) = 0;
- virtual void Decode(UInt32 start, UInt32 size) = 0;
- virtual UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits) = 0;
-};
-
-typedef NRangeCoder::CDecoder CRangeDecoderMy;
-
-class CRangeDecoder:public CRangeDecoderVirt, public CRangeDecoderMy
-{
- UInt32 GetThreshold(UInt32 total) { return CRangeDecoderMy::GetThreshold(total); }
- void Decode(UInt32 start, UInt32 size) { CRangeDecoderMy::Decode(start, size); }
- UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits) { return CRangeDecoderMy::DecodeBit(size0, numTotalBits); }
-};
-
-struct CDecodeInfo: public CInfo
-{
- void DecodeBinSymbol(CRangeDecoderVirt *rangeDecoder)
- {
- PPM_CONTEXT::STATE& rs = MinContext->oneState();
- UInt16& bs = GetBinSumm(rs, GetContextNoCheck(MinContext->Suffix)->NumStats);
- if (rangeDecoder->DecodeBit(bs, TOT_BITS) == 0)
- {
- FoundState = &rs;
- rs.Freq = (Byte)(rs.Freq + (rs.Freq < 128 ? 1: 0));
- bs = (UInt16)(bs + INTERVAL - GET_MEAN(bs, PERIOD_BITS, 2));
- PrevSuccess = 1;
- RunLength++;
- }
- else
- {
- bs = (UInt16)(bs - GET_MEAN(bs, PERIOD_BITS, 2));
- InitEsc = ExpEscape[bs >> 10];
- NumMasked = 1;
- CharMask[rs.Symbol] = EscCount;
- PrevSuccess = 0;
- FoundState = NULL;
- }
- }
-
- void DecodeSymbol1(CRangeDecoderVirt *rangeDecoder)
- {
- PPM_CONTEXT::STATE* p = GetStateNoCheck(MinContext->Stats);
- int i, count, hiCnt;
- if ((count = rangeDecoder->GetThreshold(MinContext->SummFreq)) < (hiCnt = p->Freq))
- {
- PrevSuccess = (2 * hiCnt > MinContext->SummFreq);
- RunLength += PrevSuccess;
- rangeDecoder->Decode(0, p->Freq); // MinContext->SummFreq);
- (FoundState = p)->Freq = (Byte)(hiCnt += 4);
- MinContext->SummFreq += 4;
- if (hiCnt > MAX_FREQ)
- rescale();
- return;
- }
- PrevSuccess = 0;
- i = MinContext->NumStats - 1;
- while ((hiCnt += (++p)->Freq) <= count)
- if (--i == 0)
- {
- HiBitsFlag = HB2Flag[FoundState->Symbol];
- rangeDecoder->Decode(hiCnt, MinContext->SummFreq - hiCnt); // , MinContext->SummFreq);
- CharMask[p->Symbol] = EscCount;
- i = (NumMasked = MinContext->NumStats)-1;
- FoundState = NULL;
- do { CharMask[(--p)->Symbol] = EscCount; } while ( --i );
- return;
- }
- rangeDecoder->Decode(hiCnt - p->Freq, p->Freq); // , MinContext->SummFreq);
- update1(p);
- }
-
-
- void DecodeSymbol2(CRangeDecoderVirt *rangeDecoder)
- {
- int count, hiCnt, i = MinContext->NumStats - NumMasked;
- UInt32 freqSum;
- SEE2_CONTEXT* psee2c = makeEscFreq2(i, freqSum);
- PPM_CONTEXT::STATE* ps[256], ** pps = ps, * p = GetStateNoCheck(MinContext->Stats)-1;
- hiCnt = 0;
- do
- {
- do { p++; } while (CharMask[p->Symbol] == EscCount);
- hiCnt += p->Freq;
- *pps++ = p;
- }
- while ( --i );
-
- freqSum += hiCnt;
- count = rangeDecoder->GetThreshold(freqSum);
-
- p = *(pps = ps);
- if (count < hiCnt)
- {
- hiCnt = 0;
- while ((hiCnt += p->Freq) <= count)
- p=*++pps;
- rangeDecoder->Decode(hiCnt - p->Freq, p->Freq); // , freqSum);
-
- psee2c->update();
- update2(p);
- }
- else
- {
- rangeDecoder->Decode(hiCnt, freqSum - hiCnt); // , freqSum);
-
- i = MinContext->NumStats - NumMasked;
- pps--;
- do { CharMask[(*++pps)->Symbol] = EscCount; } while ( --i );
- psee2c->Summ = (UInt16)(psee2c->Summ + freqSum);
- NumMasked = MinContext->NumStats;
- }
- }
-
- int DecodeSymbol(CRangeDecoderVirt *rangeDecoder)
- {
- if (MinContext->NumStats != 1)
- DecodeSymbol1(rangeDecoder);
- else
- DecodeBinSymbol(rangeDecoder);
- while ( !FoundState )
- {
- do
- {
- OrderFall++;
- MinContext = GetContext(MinContext->Suffix);
- if (MinContext == 0)
- return -1;
- }
- while (MinContext->NumStats == NumMasked);
- DecodeSymbol2(rangeDecoder);
- }
- Byte symbol = FoundState->Symbol;
- NextContext();
- return symbol;
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecoder.cpp
deleted file mode 100644
index c02f44f16..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecoder.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-// PpmdDecoder.cpp
-// 2009-03-11 : Igor Pavlov : Public domain
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-#include "../../../C/CpuArch.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "PpmdDecoder.h"
-
-namespace NCompress {
-namespace NPpmd {
-
-static const UInt32 kBufSize = (1 << 20);
-
-enum
-{
- kStatus_NeedInit,
- kStatus_Normal,
- kStatus_Finished,
- kStatus_Error
-};
-
-static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
-static void SzBigFree(void *, void *address) { BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-CDecoder::~CDecoder()
-{
- ::MidFree(_outBuf);
- Ppmd7_Free(&_ppmd, &g_BigAlloc);
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *props, UInt32 size)
-{
- if (size < 5)
- return E_INVALIDARG;
- _order = props[0];
- UInt32 memSize = GetUi32(props + 1);
- if (_order < PPMD7_MIN_ORDER ||
- _order > PPMD7_MAX_ORDER ||
- memSize < PPMD7_MIN_MEM_SIZE ||
- memSize > PPMD7_MAX_MEM_SIZE)
- return E_NOTIMPL;
- if (!_inStream.Alloc(1 << 20))
- return E_OUTOFMEMORY;
- if (!Ppmd7_Alloc(&_ppmd, memSize, &g_BigAlloc))
- return E_OUTOFMEMORY;
- return S_OK;
-}
-
-HRESULT CDecoder::CodeSpec(Byte *memStream, UInt32 size)
-{
- switch(_status)
- {
- case kStatus_Finished: return S_OK;
- case kStatus_Error: return S_FALSE;
- case kStatus_NeedInit:
- _inStream.Init();
- if (!Ppmd7z_RangeDec_Init(&_rangeDec))
- {
- _status = kStatus_Error;
- return S_FALSE;
- }
- _status = kStatus_Normal;
- Ppmd7_Init(&_ppmd, _order);
- break;
- }
- if (_outSizeDefined)
- {
- const UInt64 rem = _outSize - _processedSize;
- if (size > rem)
- size = (UInt32)rem;
- }
-
- UInt32 i;
- int sym = 0;
- for (i = 0; i != size; i++)
- {
- sym = Ppmd7_DecodeSymbol(&_ppmd, &_rangeDec.p);
- if (_inStream.Extra || sym < 0)
- break;
- memStream[i] = (Byte)sym;
- }
-
- _processedSize += i;
- if (_inStream.Extra)
- {
- _status = kStatus_Error;
- return _inStream.Res;
- }
- if (sym < 0)
- _status = (sym < -1) ? kStatus_Error : kStatus_Finished;
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (!_outBuf)
- {
- _outBuf = (Byte *)::MidAlloc(kBufSize);
- if (!_outBuf)
- return E_OUTOFMEMORY;
- }
-
- _inStream.Stream = inStream;
- SetOutStreamSize(outSize);
-
- do
- {
- const UInt64 startPos = _processedSize;
- HRESULT res = CodeSpec(_outBuf, kBufSize);
- size_t processed = (size_t)(_processedSize - startPos);
- RINOK(WriteStream(outStream, _outBuf, processed));
- RINOK(res);
- if (_status == kStatus_Finished)
- break;
- if (progress)
- {
- UInt64 inSize = _inStream.GetProcessed();
- RINOK(progress->SetRatioInfo(&inSize, &_processedSize));
- }
- }
- while (!_outSizeDefined || _processedSize < _outSize);
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)
-{
- _outSizeDefined = (outSize != NULL);
- if (_outSizeDefined)
- _outSize = *outSize;
- _processedSize = 0;
- _status = kStatus_NeedInit;
- return S_OK;
-}
-
-#ifndef NO_READ_FROM_CODER
-
-STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream)
-{
- InSeqStream = inStream;
- _inStream.Stream = inStream;
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::ReleaseInStream()
-{
- InSeqStream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- const UInt64 startPos = _processedSize;
- HRESULT res = CodeSpec((Byte *)data, size);
- if (processedSize)
- *processedSize = (UInt32)(_processedSize - startPos);
- return res;
-}
-
-#endif
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecoder.h
deleted file mode 100644
index 8ebcd700c..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdDecoder.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// PpmdDecoder.h
-// 2009-03-11 : Igor Pavlov : Public domain
-
-#ifndef __COMPRESS_PPMD_DECODER_H
-#define __COMPRESS_PPMD_DECODER_H
-
-#include "../../../C/Ppmd7.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../Common/CWrappers.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NPpmd {
-
-class CDecoder :
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- #ifndef NO_READ_FROM_CODER
- public ICompressSetInStream,
- public ICompressSetOutStreamSize,
- public ISequentialInStream,
- #endif
- public CMyUnknownImp
-{
- Byte *_outBuf;
- CPpmd7z_RangeDec _rangeDec;
- CByteInBufWrap _inStream;
- CPpmd7 _ppmd;
-
- Byte _order;
- bool _outSizeDefined;
- int _status;
- UInt64 _outSize;
- UInt64 _processedSize;
-
- HRESULT CodeSpec(Byte *memStream, UInt32 size);
-
-public:
-
- #ifndef NO_READ_FROM_CODER
- CMyComPtr<ISequentialInStream> InSeqStream;
- MY_UNKNOWN_IMP4(
- ICompressSetDecoderProperties2,
- ICompressSetInStream,
- ICompressSetOutStreamSize,
- ISequentialInStream)
- #else
- MY_UNKNOWN_IMP1(
- ICompressSetDecoderProperties2)
- #endif
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
- STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
-
- #ifndef NO_READ_FROM_CODER
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- #endif
-
- CDecoder(): _outBuf(NULL), _outSizeDefined(false)
- {
- Ppmd7z_RangeDec_CreateVTable(&_rangeDec);
- _rangeDec.Stream = &_inStream.p;
- Ppmd7_Construct(&_ppmd);
- }
-
- ~CDecoder();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncode.h b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncode.h
deleted file mode 100644
index 012f859c8..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncode.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// PpmdEncode.h
-// 2009-05-30 : Igor Pavlov : Public domain
-// This code is based on Dmitry Shkarin's PPMdH code (public domain)
-
-#ifndef __COMPRESS_PPMD_ENCODE_H
-#define __COMPRESS_PPMD_ENCODE_H
-
-#include "PpmdContext.h"
-
-namespace NCompress {
-namespace NPpmd {
-
-struct CEncodeInfo: public CInfo
-{
- void EncodeBinSymbol(int symbol, NRangeCoder::CEncoder *rangeEncoder)
- {
- PPM_CONTEXT::STATE& rs = MinContext->oneState();
- UInt16 &bs = GetBinSumm(rs, GetContextNoCheck(MinContext->Suffix)->NumStats);
- if (rs.Symbol == symbol)
- {
- FoundState = &rs;
- rs.Freq = (Byte)(rs.Freq + (rs.Freq < 128 ? 1: 0));
- rangeEncoder->EncodeBit(bs, TOT_BITS, 0);
- bs = (UInt16)(bs + INTERVAL - GET_MEAN(bs, PERIOD_BITS, 2));
- PrevSuccess = 1;
- RunLength++;
- }
- else
- {
- rangeEncoder->EncodeBit(bs, TOT_BITS, 1);
- bs = (UInt16)(bs - GET_MEAN(bs, PERIOD_BITS, 2));
- InitEsc = ExpEscape[bs >> 10];
- NumMasked = 1;
- CharMask[rs.Symbol] = EscCount;
- PrevSuccess = 0;
- FoundState = NULL;
- }
- }
-
- void EncodeSymbol1(int symbol, NRangeCoder::CEncoder *rangeEncoder)
- {
- PPM_CONTEXT::STATE* p = GetStateNoCheck(MinContext->Stats);
- if (p->Symbol == symbol)
- {
- PrevSuccess = (2 * (p->Freq) > MinContext->SummFreq);
- RunLength += PrevSuccess;
- rangeEncoder->Encode(0, p->Freq, MinContext->SummFreq);
- (FoundState = p)->Freq += 4;
- MinContext->SummFreq += 4;
- if (p->Freq > MAX_FREQ)
- rescale();
- return;
- }
- PrevSuccess = 0;
- int LoCnt = p->Freq, i = MinContext->NumStats - 1;
- while ((++p)->Symbol != symbol)
- {
- LoCnt += p->Freq;
- if (--i == 0)
- {
- HiBitsFlag = HB2Flag[FoundState->Symbol];
- CharMask[p->Symbol] = EscCount;
- i=(NumMasked = MinContext->NumStats)-1;
- FoundState = NULL;
- do { CharMask[(--p)->Symbol] = EscCount; } while ( --i );
- rangeEncoder->Encode(LoCnt, MinContext->SummFreq - LoCnt, MinContext->SummFreq);
- return;
- }
- }
- rangeEncoder->Encode(LoCnt, p->Freq, MinContext->SummFreq);
- update1(p);
- }
-
- void EncodeSymbol2(int symbol, NRangeCoder::CEncoder *rangeEncoder)
- {
- int hiCnt, i = MinContext->NumStats - NumMasked;
- UInt32 scale;
- SEE2_CONTEXT* psee2c = makeEscFreq2(i, scale);
- PPM_CONTEXT::STATE* p = GetStateNoCheck(MinContext->Stats) - 1;
- hiCnt = 0;
- do
- {
- do { p++; } while (CharMask[p->Symbol] == EscCount);
- hiCnt += p->Freq;
- if (p->Symbol == symbol)
- goto SYMBOL_FOUND;
- CharMask[p->Symbol] = EscCount;
- }
- while ( --i );
-
- rangeEncoder->Encode(hiCnt, scale, hiCnt + scale);
- scale += hiCnt;
-
- psee2c->Summ = (UInt16)(psee2c->Summ + scale);
- NumMasked = MinContext->NumStats;
- return;
-SYMBOL_FOUND:
-
- UInt32 highCount = hiCnt;
- UInt32 lowCount = highCount - p->Freq;
- if ( --i )
- {
- PPM_CONTEXT::STATE* p1 = p;
- do
- {
- do { p1++; } while (CharMask[p1->Symbol] == EscCount);
- hiCnt += p1->Freq;
- }
- while ( --i );
- }
- // SubRange.scale += hiCnt;
- scale += hiCnt;
- rangeEncoder->Encode(lowCount, highCount - lowCount, scale);
- psee2c->update();
- update2(p);
- }
-
- void EncodeSymbol(int c, NRangeCoder::CEncoder *rangeEncoder)
- {
- if (MinContext->NumStats != 1)
- EncodeSymbol1(c, rangeEncoder);
- else
- EncodeBinSymbol(c, rangeEncoder);
- while ( !FoundState )
- {
- do
- {
- OrderFall++;
- MinContext = GetContext(MinContext->Suffix);
- if (MinContext == 0)
- return; // S_OK;
- }
- while (MinContext->NumStats == NumMasked);
- EncodeSymbol2(c, rangeEncoder);
- }
- NextContext();
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncoder.cpp
deleted file mode 100644
index d823ffe85..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncoder.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-// PpmdEncoder.cpp
-// 2009-03-11 : Igor Pavlov : Public domain
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-#include "../../../C/CpuArch.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "PpmdEncoder.h"
-
-namespace NCompress {
-namespace NPpmd {
-
-static const UInt32 kBufSize = (1 << 20);
-
-static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
-static void SzBigFree(void *, void *address) { BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-CEncoder::CEncoder():
- _inBuf(NULL),
- _usedMemSize(1 << 24),
- _order(6)
-{
- _rangeEnc.Stream = &_outStream.p;
- Ppmd7_Construct(&_ppmd);
-}
-
-CEncoder::~CEncoder()
-{
- ::MidFree(_inBuf);
- Ppmd7_Free(&_ppmd, &g_BigAlloc);
-}
-
-STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
-{
- for (UInt32 i = 0; i < numProps; i++)
- {
- const PROPVARIANT &prop = props[i];
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- UInt32 v = (UInt32)prop.ulVal;
- switch(propIDs[i])
- {
- case NCoderPropID::kUsedMemorySize:
- if (v < (1 << 16) || v > PPMD7_MAX_MEM_SIZE || (v & 3) != 0)
- return E_INVALIDARG;
- _usedMemSize = v;
- break;
- case NCoderPropID::kOrder:
- if (v < 2 || v > 32)
- return E_INVALIDARG;
- _order = (Byte)v;
- break;
- default:
- return E_INVALIDARG;
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
-{
- const UInt32 kPropSize = 5;
- Byte props[kPropSize];
- props[0] = _order;
- SetUi32(props + 1, _usedMemSize);
- return WriteStream(outStream, props, kPropSize);
-}
-
-HRESULT CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- if (!_inBuf)
- {
- _inBuf = (Byte *)::MidAlloc(kBufSize);
- if (!_inBuf)
- return E_OUTOFMEMORY;
- }
- if (!_outStream.Alloc(1 << 20))
- return E_OUTOFMEMORY;
- if (!Ppmd7_Alloc(&_ppmd, _usedMemSize, &g_BigAlloc))
- return E_OUTOFMEMORY;
-
- _outStream.Stream = outStream;
- _outStream.Init();
-
- Ppmd7z_RangeEnc_Init(&_rangeEnc);
- Ppmd7_Init(&_ppmd, _order);
-
- UInt64 processed = 0;
- for (;;)
- {
- UInt32 size;
- RINOK(inStream->Read(_inBuf, kBufSize, &size));
- if (size == 0)
- {
- // We don't write EndMark in PPMD-7z.
- // Ppmd7_EncodeSymbol(&_ppmd, &_rangeEnc, -1);
- Ppmd7z_RangeEnc_FlushData(&_rangeEnc);
- return _outStream.Flush();
- }
- for (UInt32 i = 0; i < size; i++)
- {
- Ppmd7_EncodeSymbol(&_ppmd, &_rangeEnc, _inBuf[i]);
- RINOK(_outStream.Res);
- }
- processed += size;
- if (progress)
- {
- UInt64 outSize = _outStream.GetProcessed();
- RINOK(progress->SetRatioInfo(&processed, &outSize));
- }
- }
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncoder.h
deleted file mode 100644
index ed8b37131..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdEncoder.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// PpmdEncoder.h
-// 2009-03-11 : Igor Pavlov : Public domain
-
-#ifndef __COMPRESS_PPMD_ENCODER_H
-#define __COMPRESS_PPMD_ENCODER_H
-
-#include "../../../C/Ppmd7.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/CWrappers.h"
-
-namespace NCompress {
-namespace NPpmd {
-
-class CEncoder :
- public ICompressCoder,
- public ICompressSetCoderProperties,
- public ICompressWriteCoderProperties,
- public CMyUnknownImp
-{
- Byte *_inBuf;
- CByteOutBufWrap _outStream;
- CPpmd7z_RangeEnc _rangeEnc;
- CPpmd7 _ppmd;
-
- UInt32 _usedMemSize;
- Byte _order;
-
-public:
- MY_UNKNOWN_IMP2(
- ICompressSetCoderProperties,
- ICompressWriteCoderProperties)
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
- STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);
-
- CEncoder();
- ~CEncoder();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdRegister.cpp
deleted file mode 100644
index 9f59fcdd3..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdRegister.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// PpmdRegister.cpp
-// 2009-05-30 : Igor Pavlov : Public domain
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "PpmdDecoder.h"
-
-static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NPpmd::CDecoder); }
-#ifndef EXTRACT_ONLY
-#include "PpmdEncoder.h"
-static void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NPpmd::CEncoder); }
-#else
-#define CreateCodecOut 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodec, CreateCodecOut, 0x030401, L"PPMD", 1, false };
-
-REGISTER_CODEC(PPMD)
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdSubAlloc.h b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdSubAlloc.h
deleted file mode 100644
index f264f6376..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdSubAlloc.h
+++ /dev/null
@@ -1,293 +0,0 @@
-// PpmdSubAlloc.h
-// 2009-05-30 : Igor Pavlov : Public domain
-// This code is based on Dmitry Shkarin's PPMdH code (public domain)
-
-#ifndef __COMPRESS_PPMD_SUB_ALLOC_H
-#define __COMPRESS_PPMD_SUB_ALLOC_H
-
-#include "../../../C/Alloc.h"
-
-#include "PpmdType.h"
-
-const UINT N1=4, N2=4, N3=4, N4=(128+3-1*N1-2*N2-3*N3)/4;
-const UINT UNIT_SIZE=12, N_INDEXES=N1+N2+N3+N4;
-
-// Extra 1 * UNIT_SIZE for NULL support
-// Extra 2 * UNIT_SIZE for s0 in GlueFreeBlocks()
-const UInt32 kExtraSize = (UNIT_SIZE * 3);
-const UInt32 kMaxMemBlockSize = 0xFFFFFFFF - kExtraSize;
-
-struct MEM_BLK
-{
- UInt16 Stamp, NU;
- UInt32 Next, Prev;
- void InsertAt(Byte *Base, UInt32 p)
- {
- Prev = p;
- MEM_BLK *pp = (MEM_BLK *)(Base + p);
- Next = pp->Next;
- pp->Next = ((MEM_BLK *)(Base + Next))->Prev = (UInt32)((Byte *)this - Base);
- }
- void Remove(Byte *Base)
- {
- ((MEM_BLK *)(Base + Prev))->Next = Next;
- ((MEM_BLK *)(Base + Next))->Prev = Prev;
- }
-};
-
-
-class CSubAllocator
-{
- UInt32 SubAllocatorSize;
- Byte Indx2Units[N_INDEXES], Units2Indx[128], GlueCount;
- UInt32 FreeList[N_INDEXES];
-
- Byte *Base;
- Byte *HeapStart, *LoUnit, *HiUnit;
-public:
- Byte *pText, *UnitsStart;
- CSubAllocator():
- SubAllocatorSize(0),
- GlueCount(0),
- LoUnit(0),
- HiUnit(0),
- pText(0),
- UnitsStart(0)
- {
- memset(Indx2Units, 0, sizeof(Indx2Units));
- memset(FreeList, 0, sizeof(FreeList));
- }
- ~CSubAllocator()
- {
- StopSubAllocator();
- };
-
- void *GetPtr(UInt32 offset) const { return (offset == 0) ? 0 : (void *)(Base + offset); }
- void *GetPtrNoCheck(UInt32 offset) const { return (void *)(Base + offset); }
- UInt32 GetOffset(void *ptr) const { return (ptr == 0) ? 0 : (UInt32)((Byte *)ptr - Base); }
- UInt32 GetOffsetNoCheck(void *ptr) const { return (UInt32)((Byte *)ptr - Base); }
- MEM_BLK *GetBlk(UInt32 offset) const { return (MEM_BLK *)(Base + offset); }
- UInt32 *GetNode(UInt32 offset) const { return (UInt32 *)(Base + offset); }
-
- void InsertNode(void* p, int indx)
- {
- *(UInt32 *)p = FreeList[indx];
- FreeList[indx] = GetOffsetNoCheck(p);
- }
-
- void* RemoveNode(int indx)
- {
- UInt32 offset = FreeList[indx];
- UInt32 *p = GetNode(offset);
- FreeList[indx] = *p;
- return (void *)p;
- }
-
- UINT U2B(int NU) const { return (UINT)(NU) * UNIT_SIZE; }
-
- void SplitBlock(void* pv, int oldIndx, int newIndx)
- {
- int i, UDiff = Indx2Units[oldIndx] - Indx2Units[newIndx];
- Byte* p = ((Byte*)pv) + U2B(Indx2Units[newIndx]);
- if (Indx2Units[i = Units2Indx[UDiff-1]] != UDiff)
- {
- InsertNode(p, --i);
- p += U2B(i = Indx2Units[i]);
- UDiff -= i;
- }
- InsertNode(p, Units2Indx[UDiff - 1]);
- }
-
- UInt32 GetUsedMemory() const
- {
- UInt32 RetVal = SubAllocatorSize - (UInt32)(HiUnit - LoUnit) - (UInt32)(UnitsStart - pText);
- for (UInt32 i = 0; i < N_INDEXES; i++)
- for (UInt32 pn = FreeList[i]; pn != 0; RetVal -= (UInt32)Indx2Units[i] * UNIT_SIZE)
- pn = *GetNode(pn);
- return (RetVal >> 2);
- }
-
- UInt32 GetSubAllocatorSize() const { return SubAllocatorSize; }
-
- void StopSubAllocator()
- {
- if (SubAllocatorSize != 0)
- {
- BigFree(Base);
- SubAllocatorSize = 0;
- Base = 0;
- }
- }
-
- bool StartSubAllocator(UInt32 size)
- {
- if (SubAllocatorSize == size)
- return true;
- StopSubAllocator();
- if (size == 0)
- Base = 0;
- else
- {
- if ((Base = (Byte *)::BigAlloc(size + kExtraSize)) == 0)
- return false;
- HeapStart = Base + UNIT_SIZE; // we need such code to support NULL;
- }
- SubAllocatorSize = size;
- return true;
- }
-
- void InitSubAllocator()
- {
- unsigned int i, k;
- memset(FreeList, 0, sizeof(FreeList));
- HiUnit = (pText = HeapStart) + SubAllocatorSize;
- UINT Diff = UNIT_SIZE * (SubAllocatorSize / 8 / UNIT_SIZE * 7);
- LoUnit = UnitsStart = HiUnit - Diff;
- for (i = 0, k=1; i < N1 ; i++, k += 1) Indx2Units[i] = (Byte)k;
- for (k++; i < N1 + N2 ;i++, k += 2) Indx2Units[i] = (Byte)k;
- for (k++; i < N1 + N2 + N3 ;i++,k += 3) Indx2Units[i] = (Byte)k;
- for (k++; i < N1 + N2 + N3 + N4; i++, k += 4) Indx2Units[i] = (Byte)k;
- GlueCount = 0;
- for (k = i = 0; k < 128; k++)
- {
- i += (Indx2Units[i] < k+1);
- Units2Indx[k] = (Byte)i;
- }
- }
-
- void GlueFreeBlocks()
- {
- UInt32 s0 = (UInt32)(HeapStart + SubAllocatorSize - Base);
-
- // We need add exta MEM_BLK with Stamp=0
- GetBlk(s0)->Stamp = 0;
- s0 += UNIT_SIZE;
- MEM_BLK *ps0 = GetBlk(s0);
-
- UInt32 p;
- unsigned int i;
- if (LoUnit != HiUnit)
- *LoUnit=0;
- ps0->Next = ps0->Prev = s0;
-
- for (i = 0; i < N_INDEXES; i++)
- while (FreeList[i] != 0)
- {
- MEM_BLK *pp = (MEM_BLK *)RemoveNode(i);
- pp->InsertAt(Base, s0);
- pp->Stamp = 0xFFFF;
- pp->NU = Indx2Units[i];
- }
- for (p = ps0->Next; p != s0; p = GetBlk(p)->Next)
- {
- for (;;)
- {
- MEM_BLK *pp = GetBlk(p);
- MEM_BLK *pp1 = GetBlk(p + pp->NU * UNIT_SIZE);
- if (pp1->Stamp != 0xFFFF || int(pp->NU) + pp1->NU >= 0x10000)
- break;
- pp1->Remove(Base);
- pp->NU = (UInt16)(pp->NU + pp1->NU);
- }
- }
- while ((p = ps0->Next) != s0)
- {
- MEM_BLK *pp = GetBlk(p);
- pp->Remove(Base);
- int sz;
- for (sz = pp->NU; sz > 128; sz -= 128, p += 128 * UNIT_SIZE)
- InsertNode(Base + p, N_INDEXES - 1);
- if (Indx2Units[i = Units2Indx[sz-1]] != sz)
- {
- int k = sz - Indx2Units[--i];
- InsertNode(Base + p + (sz - k) * UNIT_SIZE, k - 1);
- }
- InsertNode(Base + p, i);
- }
- }
- void* AllocUnitsRare(int indx)
- {
- if ( !GlueCount )
- {
- GlueCount = 255;
- GlueFreeBlocks();
- if (FreeList[indx] != 0)
- return RemoveNode(indx);
- }
- int i = indx;
- do
- {
- if (++i == static_cast< int >( N_INDEXES) )
- {
- GlueCount--;
- i = U2B(Indx2Units[indx]);
- return (UnitsStart - pText > i) ? (UnitsStart -= i) : (NULL);
- }
- } while (FreeList[i] == 0);
- void* RetVal = RemoveNode(i);
- SplitBlock(RetVal, i, indx);
- return RetVal;
- }
-
- void* AllocUnits(int NU)
- {
- int indx = Units2Indx[NU - 1];
- if (FreeList[indx] != 0)
- return RemoveNode(indx);
- void* RetVal = LoUnit;
- LoUnit += U2B(Indx2Units[indx]);
- if (LoUnit <= HiUnit)
- return RetVal;
- LoUnit -= U2B(Indx2Units[indx]);
- return AllocUnitsRare(indx);
- }
-
- void* AllocContext()
- {
- if (HiUnit != LoUnit)
- return (HiUnit -= UNIT_SIZE);
- if (FreeList[0] != 0)
- return RemoveNode(0);
- return AllocUnitsRare(0);
- }
-
- void* ExpandUnits(void* oldPtr, int oldNU)
- {
- int i0=Units2Indx[oldNU - 1], i1=Units2Indx[oldNU - 1 + 1];
- if (i0 == i1)
- return oldPtr;
- void* ptr = AllocUnits(oldNU + 1);
- if (ptr)
- {
- memcpy(ptr, oldPtr, U2B(oldNU));
- InsertNode(oldPtr, i0);
- }
- return ptr;
- }
-
- void* ShrinkUnits(void* oldPtr, int oldNU, int newNU)
- {
- int i0 = Units2Indx[oldNU - 1], i1 = Units2Indx[newNU - 1];
- if (i0 == i1)
- return oldPtr;
- if (FreeList[i1] != 0)
- {
- void* ptr = RemoveNode(i1);
- memcpy(ptr, oldPtr, U2B(newNU));
- InsertNode(oldPtr,i0);
- return ptr;
- }
- else
- {
- SplitBlock(oldPtr, i0, i1);
- return oldPtr;
- }
- }
-
- void FreeUnits(void* ptr, int oldNU)
- {
- InsertNode(ptr, Units2Indx[oldNU - 1]);
- }
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdType.h b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdType.h
deleted file mode 100644
index e4b0203c0..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdType.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// PpmdType.h
-// 2009-05-30 : Igor Pavlov : Public domain
-// This code is based on Dmitry Shkarin's PPMdH code (public domain)
-
-#ifndef __COMPRESS_PPMD_TYPE_H
-#define __COMPRESS_PPMD_TYPE_H
-
-const int kMaxOrderCompress = 32;
-const int MAX_O = 255; /* maximum allowed model order */
-
-template <class T>
-inline void _PPMD_SWAP(T& t1,T& t2) { T tmp = t1; t1 = t2; t2 = tmp; }
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdZip.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdZip.cpp
deleted file mode 100644
index e83d979c3..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdZip.cpp
+++ /dev/null
@@ -1,223 +0,0 @@
-// PpmdZip.cpp
-// 2010-03-24 : Igor Pavlov : Public domain
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "PpmdZip.h"
-
-namespace NCompress {
-namespace NPpmdZip {
-
-static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
-static void SzBigFree(void *, void *address) { BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-CDecoder::CDecoder(bool fullFileMode):
- _fullFileMode(fullFileMode)
-{
- _ppmd.Stream.In = &_inStream.p;
- Ppmd8_Construct(&_ppmd);
-}
-
-CDecoder::~CDecoder()
-{
- Ppmd8_Free(&_ppmd, &g_BigAlloc);
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (!_outStream.Alloc())
- return E_OUTOFMEMORY;
- if (!_inStream.Alloc(1 << 20))
- return E_OUTOFMEMORY;
-
- _inStream.Stream = inStream;
- _inStream.Init();
-
- {
- Byte buf[2];
- for (int i = 0; i < 2; i++)
- buf[i] = _inStream.ReadByte();
- if (_inStream.Extra)
- return S_FALSE;
-
- UInt32 val = GetUi16(buf);
- UInt32 order = (val & 0xF) + 1;
- UInt32 mem = ((val >> 4) & 0xFF) + 1;
- UInt32 restor = (val >> 12);
- if (order < 2 || restor > 2)
- return S_FALSE;
-
- #ifndef PPMD8_FREEZE_SUPPORT
- if (restor == 2)
- return E_NOTIMPL;
- #endif
-
- if (!Ppmd8_Alloc(&_ppmd, mem << 20, &g_BigAlloc))
- return E_OUTOFMEMORY;
-
- if (!Ppmd8_RangeDec_Init(&_ppmd))
- return S_FALSE;
- Ppmd8_Init(&_ppmd, order, restor);
- }
-
- bool wasFinished = false;
- UInt64 processedSize = 0;
- while (!outSize || processedSize < *outSize)
- {
- size_t size = kBufSize;
- if (outSize != NULL)
- {
- const UInt64 rem = *outSize - processedSize;
- if (size > rem)
- size = (size_t)rem;
- }
- Byte *data = _outStream.Buf;
- size_t i = 0;
- int sym = 0;
- do
- {
- sym = Ppmd8_DecodeSymbol(&_ppmd);
- if (_inStream.Extra || sym < 0)
- break;
- data[i] = (Byte)sym;
- }
- while (++i != size);
- processedSize += i;
-
- RINOK(WriteStream(outStream, _outStream.Buf, i));
-
- RINOK(_inStream.Res);
- if (_inStream.Extra)
- return S_FALSE;
-
- if (sym < 0)
- {
- if (sym != -1)
- return S_FALSE;
- wasFinished = true;
- break;
- }
- if (progress)
- {
- UInt64 inSize = _inStream.GetProcessed();
- RINOK(progress->SetRatioInfo(&inSize, &processedSize));
- }
- }
- RINOK(_inStream.Res);
- if (_fullFileMode)
- {
- if (!wasFinished)
- {
- int res = Ppmd8_DecodeSymbol(&_ppmd);
- RINOK(_inStream.Res);
- if (_inStream.Extra || res != -1)
- return S_FALSE;
- }
- if (!Ppmd8_RangeDec_IsFinishedOK(&_ppmd))
- return S_FALSE;
- }
- return S_OK;
-}
-
-
-// ---------- Encoder ----------
-
-CEncoder::~CEncoder()
-{
- Ppmd8_Free(&_ppmd, &g_BigAlloc);
-}
-
-HRESULT CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
-{
- for (UInt32 i = 0; i < numProps; i++)
- {
- const PROPVARIANT &prop = props[i];
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- UInt32 v = (UInt32)prop.ulVal;
- switch(propIDs[i])
- {
- case NCoderPropID::kAlgorithm:
- if (v > 1)
- return E_INVALIDARG;
- _restor = v;
- break;
- case NCoderPropID::kUsedMemorySize:
- if (v < (1 << 20) || v > (1 << 28))
- return E_INVALIDARG;
- _usedMemInMB = v >> 20;
- break;
- case NCoderPropID::kOrder:
- if (v < PPMD8_MIN_ORDER || v > PPMD8_MAX_ORDER)
- return E_INVALIDARG;
- _order = (Byte)v;
- break;
- default:
- return E_INVALIDARG;
- }
- }
- return S_OK;
-}
-
-CEncoder::CEncoder():
- _usedMemInMB(16),
- _order(6),
- _restor(PPMD8_RESTORE_METHOD_RESTART)
-{
- _ppmd.Stream.Out = &_outStream.p;
- Ppmd8_Construct(&_ppmd);
-}
-
-HRESULT CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- if (!_inStream.Alloc())
- return E_OUTOFMEMORY;
- if (!_outStream.Alloc(1 << 20))
- return E_OUTOFMEMORY;
- if (!Ppmd8_Alloc(&_ppmd, _usedMemInMB << 20, &g_BigAlloc))
- return E_OUTOFMEMORY;
-
- _outStream.Stream = outStream;
- _outStream.Init();
-
- Ppmd8_RangeEnc_Init(&_ppmd);
- Ppmd8_Init(&_ppmd, _order, _restor);
-
- UInt32 val = (UInt32)((_order - 1) + ((_usedMemInMB - 1) << 4) + (_restor << 12));
- _outStream.WriteByte((Byte)(val & 0xFF));
- _outStream.WriteByte((Byte)(val >> 8));
- RINOK(_outStream.Res);
-
- UInt64 processed = 0;
- for (;;)
- {
- UInt32 size;
- RINOK(inStream->Read(_inStream.Buf, kBufSize, &size));
- if (size == 0)
- {
- Ppmd8_EncodeSymbol(&_ppmd, -1);
- Ppmd8_RangeEnc_FlushData(&_ppmd);
- return _outStream.Flush();
- }
- for (UInt32 i = 0; i < size; i++)
- {
- Ppmd8_EncodeSymbol(&_ppmd, _inStream.Buf[i]);
- RINOK(_outStream.Res);
- }
- processed += size;
- if (progress != NULL)
- {
- UInt64 outSize = _outStream.GetProcessed();
- RINOK(progress->SetRatioInfo(&processed, &outSize));
- }
- }
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdZip.h b/src/libs/7zip/unix/CPP/7zip/Compress/PpmdZip.h
deleted file mode 100644
index c2288b5af..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/PpmdZip.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// PpmdZip.h
-// 2010-03-11 : Igor Pavlov : Public domain
-
-#ifndef __COMPRESS_PPMD_ZIP_H
-#define __COMPRESS_PPMD_ZIP_H
-
-#include "../../../C/Alloc.h"
-#include "../../../C/Ppmd8.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../Common/CWrappers.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NPpmdZip {
-
-static const UInt32 kBufSize = (1 << 20);
-
-struct CBuf
-{
- Byte *Buf;
-
- CBuf(): Buf(0) {}
- ~CBuf() { ::MidFree(Buf); }
- bool Alloc()
- {
- if (!Buf)
- Buf = (Byte *)::MidAlloc(kBufSize);
- return (Buf != 0);
- }
-};
-
-class CDecoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- CByteInBufWrap _inStream;
- CBuf _outStream;
- CPpmd8 _ppmd;
- bool _fullFileMode;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- CDecoder(bool fullFileMode);
- ~CDecoder();
-};
-
-class CEncoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- CByteOutBufWrap _outStream;
- CBuf _inStream;
- CPpmd8 _ppmd;
- UInt32 _usedMemInMB;
- unsigned _order;
- unsigned _restor;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- HRESULT SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
- CEncoder();
- ~CEncoder();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/QuantumDecoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/QuantumDecoder.cpp
deleted file mode 100644
index 501bd0e1f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/QuantumDecoder.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-// QuantumDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/Defs.h"
-
-#include "QuantumDecoder.h"
-
-namespace NCompress {
-namespace NQuantum {
-
-static const int kLenIdNeedInit = -2;
-
-static const unsigned kNumLenSymbols = 27;
-static const unsigned kMatchMinLen = 3;
-static const unsigned kNumSimplePosSlots = 4;
-static const unsigned kNumSimpleLenSlots = 6;
-
-void CDecoder::Init()
-{
- m_Selector.Init(kNumSelectors);
- unsigned i;
- for (i = 0; i < kNumLitSelectors; i++)
- m_Literals[i].Init(kNumLitSymbols);
- unsigned numItems = (_numDictBits == 0 ? 1 : (_numDictBits << 1));
- const unsigned kNumPosSymbolsMax[kNumMatchSelectors] = { 24, 36, 42 };
- for (i = 0; i < kNumMatchSelectors; i++)
- m_PosSlot[i].Init(MyMin(numItems, kNumPosSymbolsMax[i]));
- m_LenSlot.Init(kNumLenSymbols);
-}
-
-HRESULT CDecoder::CodeSpec(UInt32 curSize)
-{
- if (_remainLen == kLenIdNeedInit)
- {
- if (!_keepHistory)
- {
- if (!_outWindowStream.Create((UInt32)1 << _numDictBits))
- return E_OUTOFMEMORY;
- Init();
- }
- if (!_rangeDecoder.Create(1 << 20))
- return E_OUTOFMEMORY;
- _rangeDecoder.Init();
- _remainLen = 0;
- }
- if (curSize == 0)
- return S_OK;
-
- while (_remainLen > 0 && curSize > 0)
- {
- _remainLen--;
- Byte b = _outWindowStream.GetByte(_rep0);
- _outWindowStream.PutByte(b);
- curSize--;
- }
-
- while (curSize > 0)
- {
- if (_rangeDecoder.Stream.WasFinished())
- return S_FALSE;
-
- unsigned selector = m_Selector.Decode(&_rangeDecoder);
- if (selector < kNumLitSelectors)
- {
- Byte b = (Byte)((selector << (8 - kNumLitSelectorBits)) + m_Literals[selector].Decode(&_rangeDecoder));
- _outWindowStream.PutByte(b);
- curSize--;
- }
- else
- {
- selector -= kNumLitSelectors;
- unsigned len = selector + kMatchMinLen;
- if (selector == 2)
- {
- unsigned lenSlot = m_LenSlot.Decode(&_rangeDecoder);
- if (lenSlot >= kNumSimpleLenSlots)
- {
- lenSlot -= 2;
- int numDirectBits = (int)(lenSlot >> 2);
- len += ((4 | (lenSlot & 3)) << numDirectBits) - 2;
- if (numDirectBits < 6)
- len += _rangeDecoder.Stream.ReadBits(numDirectBits);
- }
- else
- len += lenSlot;
- }
- UInt32 rep0 = m_PosSlot[selector].Decode(&_rangeDecoder);
- if (rep0 >= kNumSimplePosSlots)
- {
- int numDirectBits = (int)((rep0 >> 1) - 1);
- rep0 = ((2 | (rep0 & 1)) << numDirectBits) + _rangeDecoder.Stream.ReadBits(numDirectBits);
- }
- unsigned locLen = len;
- if (len > curSize)
- locLen = (unsigned)curSize;
- if (!_outWindowStream.CopyBlock(rep0, locLen))
- return S_FALSE;
- curSize -= locLen;
- len -= locLen;
- if (len != 0)
- {
- _remainLen = (int)len;
- _rep0 = rep0;
- break;
- }
- }
- }
- return _rangeDecoder.Stream.WasFinished() ? S_FALSE : S_OK;
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (outSize == NULL)
- return E_INVALIDARG;
- UInt64 size = *outSize;
-
- SetInStream(inStream);
- _outWindowStream.SetStream(outStream);
- SetOutStreamSize(outSize);
- CDecoderFlusher flusher(this);
-
- const UInt64 start = _outWindowStream.GetProcessedSize();
- for (;;)
- {
- UInt32 curSize = 1 << 18;
- UInt64 rem = size - (_outWindowStream.GetProcessedSize() - start);
- if (curSize > rem)
- curSize = (UInt32)rem;
- if (curSize == 0)
- break;
- RINOK(CodeSpec(curSize));
- if (progress != NULL)
- {
- UInt64 inSize = _rangeDecoder.GetProcessedSize();
- UInt64 nowPos64 = _outWindowStream.GetProcessedSize() - start;
- RINOK(progress->SetRatioInfo(&inSize, &nowPos64));
- }
- }
- flusher.NeedFlush = false;
- return Flush();
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream)
-{
- _rangeDecoder.SetStream(inStream);
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::ReleaseInStream()
-{
- _rangeDecoder.ReleaseStream();
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)
-{
- if (outSize == NULL)
- return E_FAIL;
- _remainLen = kLenIdNeedInit;
- _outWindowStream.Init(_keepHistory);
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/QuantumDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/QuantumDecoder.h
deleted file mode 100644
index 6f1159658..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/QuantumDecoder.h
+++ /dev/null
@@ -1,264 +0,0 @@
-// QuantumDecoder.h
-
-#ifndef __COMPRESS_QUANTUM_DECODER_H
-#define __COMPRESS_QUANTUM_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NQuantum {
-
-class CStreamBitDecoder
-{
- UInt32 Value;
- CInBuffer Stream;
-public:
- bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *stream) { Stream.SetStream(stream); }
- void ReleaseStream() { Stream.ReleaseStream(); }
-
- void Finish() { Value = 0x10000; }
-
- void Init()
- {
- Stream.Init();
- Value = 0x10000;
- }
-
- UInt64 GetProcessedSize() const { return Stream.GetProcessedSize(); }
- bool WasFinished() const { return Stream.WasFinished(); }
-
- UInt32 ReadBit()
- {
- if (Value >= 0x10000)
- Value = 0x100 | Stream.ReadByte();
- UInt32 res = (Value >> 7) & 1;
- Value <<= 1;
- return res;
- }
-
- UInt32 ReadBits(int numBits) // numBits > 0
- {
- UInt32 res = 0;
- do
- res = (res << 1) | ReadBit();
- while (--numBits != 0);
- return res;
- }
-};
-
-const unsigned kNumLitSelectorBits = 2;
-const unsigned kNumLitSelectors = (1 << kNumLitSelectorBits);
-const unsigned kNumLitSymbols = 1 << (8 - kNumLitSelectorBits);
-const unsigned kNumMatchSelectors = 3;
-const unsigned kNumSelectors = kNumLitSelectors + kNumMatchSelectors;
-const unsigned kNumSymbolsMax = kNumLitSymbols; // 64
-
-namespace NRangeCoder {
-
-class CDecoder
-{
- UInt32 Low;
- UInt32 Range;
- UInt32 Code;
-public:
- CStreamBitDecoder Stream;
- bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *stream) { Stream.SetStream(stream); }
- void ReleaseStream() { Stream.ReleaseStream(); }
-
- void Init()
- {
- Stream.Init();
- Low = 0;
- Range = 0x10000;
- Code = Stream.ReadBits(16);
- }
-
- void Finish()
- {
- // we need these extra two Bit_reads
- Stream.ReadBit();
- Stream.ReadBit();
- Stream.Finish();
- }
-
- UInt64 GetProcessedSize() const { return Stream.GetProcessedSize(); }
-
- UInt32 GetThreshold(UInt32 total) const
- {
- return ((Code + 1) * total - 1) / Range; // & 0xFFFF is not required;
- }
-
- void Decode(UInt32 start, UInt32 end, UInt32 total)
- {
- UInt32 high = Low + end * Range / total - 1;
- UInt32 offset = start * Range / total;
- Code -= offset;
- Low += offset;
- for (;;)
- {
- if ((Low & 0x8000) != (high & 0x8000))
- {
- if ((Low & 0x4000) == 0 || (high & 0x4000) != 0)
- break;
- Low &= 0x3FFF;
- high |= 0x4000;
- }
- Low = (Low << 1) & 0xFFFF;
- high = ((high << 1) | 1) & 0xFFFF;
- Code = ((Code << 1) | Stream.ReadBit());
- }
- Range = high - Low + 1;
- }
-};
-
-const UInt16 kUpdateStep = 8;
-const UInt16 kFreqSumMax = 3800;
-const UInt16 kReorderCountStart = 4;
-const UInt16 kReorderCount = 50;
-
-class CModelDecoder
-{
- unsigned NumItems;
- unsigned ReorderCount;
- UInt16 Freqs[kNumSymbolsMax + 1];
- Byte Values[kNumSymbolsMax];
-public:
- void Init(unsigned numItems)
- {
- NumItems = numItems;
- ReorderCount = kReorderCountStart;
- for (unsigned i = 0; i < numItems; i++)
- {
- Freqs[i] = (UInt16)(numItems - i);
- Values[i] = (Byte)i;
- }
- Freqs[numItems] = 0;
- }
-
- unsigned Decode(CDecoder *rangeDecoder)
- {
- UInt32 threshold = rangeDecoder->GetThreshold(Freqs[0]);
- unsigned i;
- for (i = 1; Freqs[i] > threshold; i++) {}
- rangeDecoder->Decode(Freqs[i], Freqs[i - 1], Freqs[0]);
- unsigned res = Values[--i];
- do
- Freqs[i] += kUpdateStep;
- while (i-- != 0);
-
- if (Freqs[0] > kFreqSumMax)
- {
- if (--ReorderCount == 0)
- {
- ReorderCount = kReorderCount;
- for (i = 0; i < NumItems; i++)
- Freqs[i] = (UInt16)(((Freqs[i] - Freqs[i + 1]) + 1) >> 1);
- for (i = 0; i < NumItems - 1; i++)
- for (unsigned j = i + 1; j < NumItems; j++)
- if (Freqs[i] < Freqs[j])
- {
- UInt16 tmpFreq = Freqs[i];
- Byte tmpVal = Values[i];
- Freqs[i] = Freqs[j];
- Values[i] = Values[j];
- Freqs[j] = tmpFreq;
- Values[j] = tmpVal;
- }
- do
- Freqs[i] = (UInt16)(Freqs[i] + Freqs[i + 1]);
- while (i-- != 0);
- }
- else
- {
- i = NumItems - 1;
- do
- {
- Freqs[i] >>= 1;
- if (Freqs[i] <= Freqs[i + 1])
- Freqs[i] = (UInt16)(Freqs[i + 1] + 1);
- }
- while (i-- != 0);
- }
- }
- return res;
- }
-};
-
-}
-
-class CDecoder:
- public ICompressCoder,
- public ICompressSetInStream,
- public ICompressSetOutStreamSize,
- public CMyUnknownImp
-{
- CLzOutWindow _outWindowStream;
- NRangeCoder::CDecoder _rangeDecoder;
-
- UInt64 _outSize;
- int _remainLen; // -1 means end of stream. // -2 means need Init
- UInt32 _rep0;
-
- int _numDictBits;
- bool _keepHistory;
-
- NRangeCoder::CModelDecoder m_Selector;
- NRangeCoder::CModelDecoder m_Literals[kNumLitSelectors];
- NRangeCoder::CModelDecoder m_PosSlot[kNumMatchSelectors];
- NRangeCoder::CModelDecoder m_LenSlot;
- void Init();
- HRESULT CodeSpec(UInt32 size);
-public:
- MY_UNKNOWN_IMP2(
- ICompressSetInStream,
- ICompressSetOutStreamSize)
-
- void ReleaseStreams()
- {
- _outWindowStream.ReleaseStream();
- ReleaseInStream();
- }
-
- class CDecoderFlusher
- {
- CDecoder *_decoder;
- public:
- bool NeedFlush;
- CDecoderFlusher(CDecoder *decoder): _decoder(decoder), NeedFlush(true) {}
- ~CDecoderFlusher()
- {
- if (NeedFlush)
- _decoder->Flush();
- _decoder->ReleaseStreams();
- }
- };
-
- HRESULT Flush() { return _outWindowStream.Flush(); }
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
-
- void SetParams(int numDictBits) { _numDictBits = numDictBits; }
- void SetKeepHistory(bool keepHistory) { _keepHistory = keepHistory; }
- CDecoder(): _keepHistory(false) {}
- virtual ~CDecoder() {}
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Rar1Decoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/Rar1Decoder.cpp
deleted file mode 100644
index eadca7b3d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Rar1Decoder.cpp
+++ /dev/null
@@ -1,480 +0,0 @@
-// Rar1Decoder.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#include "StdAfx.h"
-
-#include "Rar1Decoder.h"
-
-namespace NCompress {
-namespace NRar1 {
-
-static UInt32 PosL1[]={0,0,0,2,3,5,7,11,16,20,24,32,32, 256};
-static UInt32 PosL2[]={0,0,0,0,5,7,9,13,18,22,26,34,36, 256};
-static UInt32 PosHf0[]={0,0,0,0,0,8,16,24,33,33,33,33,33, 257};
-static UInt32 PosHf1[]={0,0,0,0,0,0,4,44,60,76,80,80,127, 257};
-static UInt32 PosHf2[]={0,0,0,0,0,0,2,7,53,117,233, 257,0};
-static UInt32 PosHf3[]={0,0,0,0,0,0,0,2,16,218,251, 257,0};
-static UInt32 PosHf4[]={0,0,0,0,0,0,0,0,0,255, 257,0,0};
-
-static const UInt32 kHistorySize = (1 << 16);
-
-class CCoderReleaser
-{
- CDecoder *m_Coder;
-public:
- CCoderReleaser(CDecoder *coder): m_Coder(coder) {}
- ~CCoderReleaser() { m_Coder->ReleaseStreams(); }
-};
-
-CDecoder::CDecoder(): m_IsSolid(false) { }
-
-void CDecoder::InitStructures()
-{
- for(int i = 0; i < kNumRepDists; i++)
- m_RepDists[i] = 0;
- m_RepDistPtr = 0;
- LastLength = 0;
- LastDist = 0;
-}
-
-UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }
-
-HRESULT CDecoder::CopyBlock(UInt32 distance, UInt32 len)
-{
- if (len == 0)
- return S_FALSE;
- m_UnpackSize -= len;
- return m_OutWindowStream.CopyBlock(distance, len) ? S_OK : S_FALSE;
-}
-
-
-UInt32 CDecoder::DecodeNum(const UInt32 *posTab)
-{
- UInt32 startPos = 2;
- UInt32 num = m_InBitStream.GetValue(12);
- for (;;)
- {
- UInt32 cur = (posTab[startPos + 1] - posTab[startPos]) << (12 - startPos);
- if (num < cur)
- break;
- startPos++;
- num -= cur;
- }
- m_InBitStream.MovePos(startPos);
- return((num >> (12 - startPos)) + posTab[startPos]);
-}
-
-static Byte kShortLen1[] = {1,3,4,4,5,6,7,8,8,4,4,5,6,6 };
-static Byte kShortLen1a[] = {1,4,4,4,5,6,7,8,8,4,4,5,6,6,4 };
-static Byte kShortLen2[] = {2,3,3,3,4,4,5,6,6,4,4,5,6,6 };
-static Byte kShortLen2a[] = {2,3,3,4,4,4,5,6,6,4,4,5,6,6,4 };
-static UInt32 kShortXor1[] = {0,0xa0,0xd0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xc0,0x80,0x90,0x98,0x9c,0xb0};
-static UInt32 kShortXor2[] = {0,0x40,0x60,0xa0,0xd0,0xe0,0xf0,0xf8,0xfc,0xc0,0x80,0x90,0x98,0x9c,0xb0};
-
-HRESULT CDecoder::ShortLZ()
-{
- UInt32 len, saveLen, dist;
- int distancePlace;
- Byte *kShortLen;
- const UInt32 *kShortXor;
- NumHuf = 0;
-
- if (LCount == 2)
- {
- if (ReadBits(1))
- return CopyBlock(LastDist, LastLength);
- LCount = 0;
- }
-
- UInt32 bitField = m_InBitStream.GetValue(8);
-
- if (AvrLn1 < 37)
- {
- kShortLen = Buf60 ? kShortLen1a : kShortLen1;
- kShortXor = kShortXor1;
- }
- else
- {
- kShortLen = Buf60 ? kShortLen2a : kShortLen2;
- kShortXor = kShortXor2;
- }
-
- for (len = 0; ((bitField ^ kShortXor[len]) & (~(0xff >> kShortLen[len]))) != 0; len++);
- m_InBitStream.MovePos(kShortLen[len]);
-
- if (len >= 9)
- {
- if (len == 9)
- {
- LCount++;
- return CopyBlock(LastDist, LastLength);
- }
- if (len == 14)
- {
- LCount = 0;
- len = DecodeNum(PosL2) + 5;
- dist = 0x8000 + ReadBits(15) - 1;
- LastLength = len;
- LastDist = dist;
- return CopyBlock(dist, len);
- }
-
- LCount = 0;
- saveLen = len;
- dist = m_RepDists[(m_RepDistPtr - (len - 9)) & 3];
- len = DecodeNum(PosL1) + 2;
- if (len == 0x101 && saveLen == 10)
- {
- Buf60 ^= 1;
- return S_OK;
- }
- if (dist >= 256)
- len++;
- if (dist >= MaxDist3 - 1)
- len++;
- }
- else
- {
- LCount = 0;
- AvrLn1 += len;
- AvrLn1 -= AvrLn1 >> 4;
-
- distancePlace = DecodeNum(PosHf2) & 0xff;
- dist = ChSetA[distancePlace];
- if (--distancePlace != -1)
- {
- PlaceA[dist]--;
- UInt32 lastDistance = ChSetA[distancePlace];
- PlaceA[lastDistance]++;
- ChSetA[distancePlace + 1] = lastDistance;
- ChSetA[distancePlace] = dist;
- }
- len += 2;
- }
- m_RepDists[m_RepDistPtr++] = dist;
- m_RepDistPtr &= 3;
- LastLength = len;
- LastDist = dist;
- return CopyBlock(dist, len);
-}
-
-
-HRESULT CDecoder::LongLZ()
-{
- UInt32 len;
- UInt32 dist;
- UInt32 distancePlace, newDistancePlace;
- UInt32 oldAvr2, oldAvr3;
-
- NumHuf = 0;
- Nlzb += 16;
- if (Nlzb > 0xff)
- {
- Nlzb = 0x90;
- Nhfb >>= 1;
- }
- oldAvr2=AvrLn2;
-
- if (AvrLn2 >= 122)
- len = DecodeNum(PosL2);
- else if (AvrLn2 >= 64)
- len = DecodeNum(PosL1);
- else
- {
- UInt32 bitField = m_InBitStream.GetValue(16);
- if (bitField < 0x100)
- {
- len = bitField;
- m_InBitStream.MovePos(16);
- }
- else
- {
- for (len = 0; ((bitField << len) & 0x8000) == 0; len++)
- ;
- m_InBitStream.MovePos(len + 1);
- }
- }
-
- AvrLn2 += len;
- AvrLn2 -= AvrLn2 >> 5;
-
- if (AvrPlcB > 0x28ff)
- distancePlace = DecodeNum(PosHf2);
- else if (AvrPlcB > 0x6ff)
- distancePlace = DecodeNum(PosHf1);
- else
- distancePlace = DecodeNum(PosHf0);
-
- AvrPlcB += distancePlace;
- AvrPlcB -= AvrPlcB >> 8;
- for (;;)
- {
- dist = ChSetB[distancePlace & 0xff];
- newDistancePlace = NToPlB[dist++ & 0xff]++;
- if (!(dist & 0xff))
- CorrHuff(ChSetB,NToPlB);
- else
- break;
- }
-
- ChSetB[distancePlace] = ChSetB[newDistancePlace];
- ChSetB[newDistancePlace] = dist;
-
- dist = ((dist & 0xff00) >> 1) | ReadBits(7);
-
- oldAvr3 = AvrLn3;
- if (len != 1 && len != 4)
- if (len == 0 && dist <= MaxDist3)
- {
- AvrLn3++;
- AvrLn3 -= AvrLn3 >> 8;
- }
- else
- if (AvrLn3 > 0)
- AvrLn3--;
- len += 3;
- if (dist >= MaxDist3)
- len++;
- if (dist <= 256)
- len += 8;
- if (oldAvr3 > 0xb0 || AvrPlc >= 0x2a00 && oldAvr2 < 0x40)
- MaxDist3 = 0x7f00;
- else
- MaxDist3 = 0x2001;
- m_RepDists[m_RepDistPtr++] = --dist;
- m_RepDistPtr &= 3;
- LastLength = len;
- LastDist = dist;
- return CopyBlock(dist, len);
-}
-
-
-HRESULT CDecoder::HuffDecode()
-{
- UInt32 curByte, newBytePlace;
- UInt32 len;
- UInt32 dist;
- int bytePlace;
-
- if (AvrPlc > 0x75ff) bytePlace = DecodeNum(PosHf4);
- else if (AvrPlc > 0x5dff) bytePlace = DecodeNum(PosHf3);
- else if (AvrPlc > 0x35ff) bytePlace = DecodeNum(PosHf2);
- else if (AvrPlc > 0x0dff) bytePlace = DecodeNum(PosHf1);
- else bytePlace = DecodeNum(PosHf0);
- if (StMode)
- {
- if (--bytePlace == -1)
- {
- if (ReadBits(1))
- {
- NumHuf = StMode = 0;
- return S_OK;
- }
- else
- {
- len = (ReadBits(1)) ? 4 : 3;
- dist = DecodeNum(PosHf2);
- dist = (dist << 5) | ReadBits(5);
- return CopyBlock(dist - 1, len);
- }
- }
- }
- else if (NumHuf++ >= 16 && FlagsCnt == 0)
- StMode = 1;
- bytePlace &= 0xff;
- AvrPlc += bytePlace;
- AvrPlc -= AvrPlc >> 8;
- Nhfb+=16;
- if (Nhfb > 0xff)
- {
- Nhfb=0x90;
- Nlzb >>= 1;
- }
-
- m_UnpackSize --;
- m_OutWindowStream.PutByte((Byte)(ChSet[bytePlace] >> 8));
-
- for (;;)
- {
- curByte = ChSet[bytePlace];
- newBytePlace = NToPl[curByte++ & 0xff]++;
- if ((curByte & 0xff) > 0xa1)
- CorrHuff(ChSet, NToPl);
- else
- break;
- }
-
- ChSet[bytePlace] = ChSet[newBytePlace];
- ChSet[newBytePlace] = curByte;
- return S_OK;
-}
-
-
-void CDecoder::GetFlagsBuf()
-{
- UInt32 flags, newFlagsPlace;
- UInt32 flagsPlace = DecodeNum(PosHf2);
-
- for (;;)
- {
- flags = ChSetC[flagsPlace];
- FlagBuf = flags >> 8;
- newFlagsPlace = NToPlC[flags++ & 0xff]++;
- if ((flags & 0xff) != 0)
- break;
- CorrHuff(ChSetC, NToPlC);
- }
-
- ChSetC[flagsPlace] = ChSetC[newFlagsPlace];
- ChSetC[newFlagsPlace] = flags;
-}
-
-void CDecoder::InitData()
-{
- if (!m_IsSolid)
- {
- AvrPlcB = AvrLn1 = AvrLn2 = AvrLn3 = NumHuf = Buf60 = 0;
- AvrPlc = 0x3500;
- MaxDist3 = 0x2001;
- Nhfb = Nlzb = 0x80;
- }
- FlagsCnt = 0;
- FlagBuf = 0;
- StMode = 0;
- LCount = 0;
-}
-
-void CDecoder::CorrHuff(UInt32 *CharSet,UInt32 *NumToPlace)
-{
- int i;
- for (i = 7; i >= 0; i--)
- for (int j = 0; j < 32; j++, CharSet++)
- *CharSet = (*CharSet & ~0xff) | i;
- memset(NumToPlace, 0, sizeof(NToPl));
- for (i = 6; i >= 0; i--)
- NumToPlace[i] = (7 - i) * 32;
-}
-
-void CDecoder::InitHuff()
-{
- for (UInt32 i = 0; i < 256; i++)
- {
- Place[i] = PlaceA[i] = PlaceB[i] = i;
- PlaceC[i] = (~i + 1) & 0xff;
- ChSet[i] = ChSetB[i] = i << 8;
- ChSetA[i] = i;
- ChSetC[i] = ((~i + 1) & 0xff) << 8;
- }
- memset(NToPl, 0, sizeof(NToPl));
- memset(NToPlB, 0, sizeof(NToPlB));
- memset(NToPlC, 0, sizeof(NToPlC));
- CorrHuff(ChSetB, NToPlB);
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo * /* progress */)
-{
- if (inSize == NULL || outSize == NULL)
- return E_INVALIDARG;
-
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
-
- m_UnpackSize = (Int64)*outSize;
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(m_IsSolid);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
-
- CCoderReleaser coderReleaser(this);
- InitData();
- if (!m_IsSolid)
- {
- InitStructures();
- InitHuff();
- }
- if (m_UnpackSize > 0)
- {
- GetFlagsBuf();
- FlagsCnt = 8;
- }
-
- while (m_UnpackSize > 0)
- {
- if (StMode)
- {
- RINOK(HuffDecode());
- continue;
- }
-
- if (--FlagsCnt < 0)
- {
- GetFlagsBuf();
- FlagsCnt=7;
- }
-
- if (FlagBuf & 0x80)
- {
- FlagBuf <<= 1;
- if (Nlzb > Nhfb)
- {
- RINOK(LongLZ());
- }
- else
- {
- RINOK(HuffDecode());
- }
- }
- else
- {
- FlagBuf <<= 1;
- if (--FlagsCnt < 0)
- {
- GetFlagsBuf();
- FlagsCnt = 7;
- }
- if (FlagBuf & 0x80)
- {
- FlagBuf <<= 1;
- if (Nlzb > Nhfb)
- {
- RINOK(HuffDecode());
- }
- else
- {
- RINOK(LongLZ());
- }
- }
- else
- {
- FlagBuf <<= 1;
- RINOK(ShortLZ());
- }
- }
- }
- if (m_UnpackSize < 0)
- return S_FALSE;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size < 1)
- return E_INVALIDARG;
- m_IsSolid = (data[0] != 0);
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Rar1Decoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/Rar1Decoder.h
deleted file mode 100644
index f7c08b386..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Rar1Decoder.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Rar1Decoder.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#ifndef __COMPRESS_RAR1_DECODER_H
-#define __COMPRESS_RAR1_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NRar1 {
-
-const UInt32 kNumRepDists = 4;
-
-typedef NBitm::CDecoder<CInBuffer> CBitDecoder;
-
-class CDecoder :
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public CMyUnknownImp
-{
-public:
- CLzOutWindow m_OutWindowStream;
- CBitDecoder m_InBitStream;
-
- UInt32 m_RepDists[kNumRepDists];
- UInt32 m_RepDistPtr;
-
- UInt32 LastDist;
- UInt32 LastLength;
-
- Int64 m_UnpackSize;
- bool m_IsSolid;
-
- UInt32 ReadBits(int numBits);
- HRESULT CopyBlock(UInt32 distance, UInt32 len);
-
- UInt32 DecodeNum(const UInt32 *posTab);
- HRESULT ShortLZ();
- HRESULT LongLZ();
- HRESULT HuffDecode();
- void GetFlagsBuf();
- void InitData();
- void InitHuff();
- void CorrHuff(UInt32 *CharSet, UInt32 *NumToPlace);
- void OldUnpWriteBuf();
-
- UInt32 ChSet[256],ChSetA[256],ChSetB[256],ChSetC[256];
- UInt32 Place[256],PlaceA[256],PlaceB[256],PlaceC[256];
- UInt32 NToPl[256],NToPlB[256],NToPlC[256];
- UInt32 FlagBuf,AvrPlc,AvrPlcB,AvrLn1,AvrLn2,AvrLn3;
- int Buf60,NumHuf,StMode,LCount,FlagsCnt;
- UInt32 Nhfb,Nlzb,MaxDist3;
-
- void InitStructures();
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-public:
- CDecoder();
-
- MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Rar2Decoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/Rar2Decoder.cpp
deleted file mode 100644
index 4e669bd64..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Rar2Decoder.cpp
+++ /dev/null
@@ -1,391 +0,0 @@
-// Rar2Decoder.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#include "StdAfx.h"
-
-#include "Rar2Decoder.h"
-
-namespace NCompress {
-namespace NRar2 {
-
-namespace NMultimedia {
-
-Byte CFilter::Decode(int &channelDelta, Byte deltaByte)
-{
- D4 = D3;
- D3 = D2;
- D2 = LastDelta - D1;
- D1 = LastDelta;
- int predictedValue = ((8 * LastChar + K1 * D1 + K2 * D2 + K3 * D3 + K4 * D4 + K5 * channelDelta) >> 3);
-
- Byte realValue = (Byte)(predictedValue - deltaByte);
- int i = ((int)(signed char)deltaByte) << 3;
-
- Dif[0] += abs(i);
- Dif[1] += abs(i - D1);
- Dif[2] += abs(i + D1);
- Dif[3] += abs(i - D2);
- Dif[4] += abs(i + D2);
- Dif[5] += abs(i - D3);
- Dif[6] += abs(i + D3);
- Dif[7] += abs(i - D4);
- Dif[8] += abs(i + D4);
- Dif[9] += abs(i - channelDelta);
- Dif[10] += abs(i + channelDelta);
-
- channelDelta = LastDelta = (signed char)(realValue - LastChar);
- LastChar = realValue;
-
- if (((++ByteCount) & 0x1F) == 0)
- {
- UInt32 minDif = Dif[0];
- UInt32 numMinDif = 0;
- Dif[0] = 0;
- for (i = 1; i < sizeof(Dif) / sizeof(Dif[0]); i++)
- {
- if (Dif[i] < minDif)
- {
- minDif = Dif[i];
- numMinDif = i;
- }
- Dif[i] = 0;
- }
- switch(numMinDif)
- {
- case 1: if (K1 >= -16) K1--; break;
- case 2: if (K1 < 16) K1++; break;
- case 3: if (K2 >= -16) K2--; break;
- case 4: if (K2 < 16) K2++; break;
- case 5: if (K3 >= -16) K3--; break;
- case 6: if (K3 < 16) K3++; break;
- case 7: if (K4 >= -16) K4--; break;
- case 8: if (K4 < 16) K4++; break;
- case 9: if (K5 >= -16) K5--; break;
- case 10:if (K5 < 16) K5++; break;
- }
- }
- return realValue;
-}
-}
-
-static const char *kNumberErrorMessage = "Number error";
-
-static const UInt32 kHistorySize = 1 << 20;
-
-static const int kNumStats = 11;
-
-static const UInt32 kWindowReservSize = (1 << 22) + 256;
-
-CDecoder::CDecoder():
- m_IsSolid(false)
-{
-}
-
-void CDecoder::InitStructures()
-{
- m_MmFilter.Init();
- for(int i = 0; i < kNumRepDists; i++)
- m_RepDists[i] = 0;
- m_RepDistPtr = 0;
- m_LastLength = 0;
- memset(m_LastLevels, 0, kMaxTableSize);
-}
-
-UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }
-
-#define RIF(x) { if (!(x)) return false; }
-
-bool CDecoder::ReadTables(void)
-{
- Byte levelLevels[kLevelTableSize];
- Byte newLevels[kMaxTableSize];
- m_AudioMode = (ReadBits(1) == 1);
-
- if (ReadBits(1) == 0)
- memset(m_LastLevels, 0, kMaxTableSize);
- int numLevels;
- if (m_AudioMode)
- {
- m_NumChannels = ReadBits(2) + 1;
- if (m_MmFilter.CurrentChannel >= m_NumChannels)
- m_MmFilter.CurrentChannel = 0;
- numLevels = m_NumChannels * kMMTableSize;
- }
- else
- numLevels = kHeapTablesSizesSum;
-
- int i;
- for (i = 0; i < kLevelTableSize; i++)
- levelLevels[i] = (Byte)ReadBits(4);
- RIF(m_LevelDecoder.SetCodeLengths(levelLevels));
- i = 0;
- while (i < numLevels)
- {
- UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);
- if (number < kTableDirectLevels)
- {
- newLevels[i] = (Byte)((number + m_LastLevels[i]) & kLevelMask);
- i++;
- }
- else
- {
- if (number == kTableLevelRepNumber)
- {
- int t = ReadBits(2) + 3;
- for (int reps = t; reps > 0 && i < numLevels ; reps--, i++)
- newLevels[i] = newLevels[i - 1];
- }
- else
- {
- int num;
- if (number == kTableLevel0Number)
- num = ReadBits(3) + 3;
- else if (number == kTableLevel0Number2)
- num = ReadBits(7) + 11;
- else
- return false;
- for (;num > 0 && i < numLevels; num--)
- newLevels[i++] = 0;
- }
- }
- }
- if (m_AudioMode)
- for (i = 0; i < m_NumChannels; i++)
- {
- RIF(m_MMDecoders[i].SetCodeLengths(&newLevels[i * kMMTableSize]));
- }
- else
- {
- RIF(m_MainDecoder.SetCodeLengths(&newLevels[0]));
- RIF(m_DistDecoder.SetCodeLengths(&newLevels[kMainTableSize]));
- RIF(m_LenDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize]));
- }
- memcpy(m_LastLevels, newLevels, kMaxTableSize);
- return true;
-}
-
-bool CDecoder::ReadLastTables()
-{
- // it differs a little from pure RAR sources;
- // UInt64 ttt = m_InBitStream.GetProcessedSize() + 2;
- // + 2 works for: return 0xFF; in CInBuffer::ReadByte.
- if (m_InBitStream.GetProcessedSize() + 7 <= m_PackSize) // test it: probably incorrect;
- // if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect;
- if (m_AudioMode)
- {
- UInt32 symbol = m_MMDecoders[m_MmFilter.CurrentChannel].DecodeSymbol(&m_InBitStream);
- if (symbol == 256)
- return ReadTables();
- if (symbol >= kMMTableSize)
- return false;
- }
- else
- {
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
- if (number == kReadTableNumber)
- return ReadTables();
- if (number >= kMainTableSize)
- return false;
- }
- return true;
-}
-
-class CCoderReleaser
-{
- CDecoder *m_Coder;
-public:
- CCoderReleaser(CDecoder *coder): m_Coder(coder) {}
- ~CCoderReleaser()
- {
- m_Coder->ReleaseStreams();
- }
-};
-
-bool CDecoder::DecodeMm(UInt32 pos)
-{
- while (pos-- > 0)
- {
- UInt32 symbol = m_MMDecoders[m_MmFilter.CurrentChannel].DecodeSymbol(&m_InBitStream);
- if (symbol == 256)
- return true;
- if (symbol >= kMMTableSize)
- return false;
- /*
- Byte byPredict = m_Predictor.Predict();
- Byte byReal = (Byte)(byPredict - (Byte)symbol);
- m_Predictor.Update(byReal, byPredict);
- */
- Byte byReal = m_MmFilter.Decode((Byte)symbol);
- m_OutWindowStream.PutByte(byReal);
- if (++m_MmFilter.CurrentChannel == m_NumChannels)
- m_MmFilter.CurrentChannel = 0;
- }
- return true;
-}
-
-bool CDecoder::DecodeLz(Int32 pos)
-{
- while (pos > 0)
- {
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
- UInt32 length, distance;
- if (number < 256)
- {
- m_OutWindowStream.PutByte(Byte(number));
- pos--;
- continue;
- }
- else if (number >= kMatchNumber)
- {
- number -= kMatchNumber;
- length = kNormalMatchMinLen + UInt32(kLenStart[number]) +
- m_InBitStream.ReadBits(kLenDirectBits[number]);
- number = m_DistDecoder.DecodeSymbol(&m_InBitStream);
- if (number >= kDistTableSize)
- return false;
- distance = kDistStart[number] + m_InBitStream.ReadBits(kDistDirectBits[number]);
- if (distance >= kDistLimit3)
- {
- length += 2 - ((distance - kDistLimit4) >> 31);
- // length++;
- // if (distance >= kDistLimit4)
- // length++;
- }
- }
- else if (number == kRepBothNumber)
- {
- length = m_LastLength;
- if (length == 0)
- return false;
- distance = m_RepDists[(m_RepDistPtr + 4 - 1) & 3];
- }
- else if (number < kLen2Number)
- {
- distance = m_RepDists[(m_RepDistPtr - (number - kRepNumber + 1)) & 3];
- number = m_LenDecoder.DecodeSymbol(&m_InBitStream);
- if (number >= kLenTableSize)
- return false;
- length = 2 + kLenStart[number] + m_InBitStream.ReadBits(kLenDirectBits[number]);
- if (distance >= kDistLimit2)
- {
- length++;
- if (distance >= kDistLimit3)
- {
- length += 2 - ((distance - kDistLimit4) >> 31);
- // length++;
- // if (distance >= kDistLimit4)
- // length++;
- }
- }
- }
- else if (number < kReadTableNumber)
- {
- number -= kLen2Number;
- distance = kLen2DistStarts[number] +
- m_InBitStream.ReadBits(kLen2DistDirectBits[number]);
- length = 2;
- }
- else if (number == kReadTableNumber)
- return true;
- else
- return false;
- m_RepDists[m_RepDistPtr++ & 3] = distance;
- m_LastLength = length;
- if (!m_OutWindowStream.CopyBlock(distance, length))
- return false;
- pos -= length;
- }
- return true;
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (inSize == NULL || outSize == NULL)
- return E_INVALIDARG;
-
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
-
- m_PackSize = *inSize;
-
- UInt64 pos = 0, unPackSize = *outSize;
-
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(m_IsSolid);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
-
- CCoderReleaser coderReleaser(this);
- if (!m_IsSolid)
- {
- InitStructures();
- if (unPackSize == 0)
- {
- if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect;
- if (!ReadTables())
- return S_FALSE;
- return S_OK;
- }
- if (!ReadTables())
- return S_FALSE;
- }
-
- UInt64 startPos = m_OutWindowStream.GetProcessedSize();
- while(pos < unPackSize)
- {
- UInt32 blockSize = 1 << 20;
- if (blockSize > unPackSize - pos)
- blockSize = (UInt32)(unPackSize - pos);
- UInt64 blockStartPos = m_OutWindowStream.GetProcessedSize();
- if (m_AudioMode)
- {
- if (!DecodeMm(blockSize))
- return S_FALSE;
- }
- else
- {
- if (!DecodeLz((Int32)blockSize))
- return S_FALSE;
- }
- UInt64 globalPos = m_OutWindowStream.GetProcessedSize();
- pos = globalPos - blockStartPos;
- if (pos < blockSize)
- if (!ReadTables())
- return S_FALSE;
- pos = globalPos - startPos;
- if (progress != 0)
- {
- UInt64 packSize = m_InBitStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &pos));
- }
- }
- if (pos > unPackSize)
- return S_FALSE;
-
- if (!ReadLastTables())
- return S_FALSE;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size < 1)
- return E_INVALIDARG;
- m_IsSolid = (data[0] != 0);
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Rar2Decoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/Rar2Decoder.h
deleted file mode 100644
index 61a8b4dab..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Rar2Decoder.h
+++ /dev/null
@@ -1,174 +0,0 @@
-// Rar2Decoder.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#ifndef __COMPRESS_RAR2_DECODER_H
-#define __COMPRESS_RAR2_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NRar2 {
-
-const UInt32 kNumRepDists = 4;
-const UInt32 kDistTableSize = 48;
-
-const int kMMTableSize = 256 + 1;
-
-const UInt32 kMainTableSize = 298;
-const UInt32 kLenTableSize = 28;
-
-const UInt32 kDistTableStart = kMainTableSize;
-const UInt32 kLenTableStart = kDistTableStart + kDistTableSize;
-
-const UInt32 kHeapTablesSizesSum = kMainTableSize + kDistTableSize + kLenTableSize;
-
-const UInt32 kLevelTableSize = 19;
-
-const UInt32 kMMTablesSizesSum = kMMTableSize * 4;
-
-const UInt32 kMaxTableSize = kMMTablesSizesSum;
-
-const UInt32 kTableDirectLevels = 16;
-const UInt32 kTableLevelRepNumber = kTableDirectLevels;
-const UInt32 kTableLevel0Number = kTableLevelRepNumber + 1;
-const UInt32 kTableLevel0Number2 = kTableLevel0Number + 1;
-
-const UInt32 kLevelMask = 0xF;
-
-
-const UInt32 kRepBothNumber = 256;
-const UInt32 kRepNumber = kRepBothNumber + 1;
-const UInt32 kLen2Number = kRepNumber + 4;
-
-const UInt32 kLen2NumNumbers = 8;
-const UInt32 kReadTableNumber = kLen2Number + kLen2NumNumbers;
-const UInt32 kMatchNumber = kReadTableNumber + 1;
-
-const Byte kLenStart[kLenTableSize] = {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224};
-const Byte kLenDirectBits[kLenTableSize] = {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5};
-
-const UInt32 kDistStart[kDistTableSize] = {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768U,49152U,65536,98304,131072,196608,262144,327680,393216,458752,524288,589824,655360,720896,786432,851968,917504,983040};
-const Byte kDistDirectBits[kDistTableSize] = {0,0,0,0,1,1,2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16};
-
-const Byte kLevelDirectBits[kLevelTableSize] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7};
-
-const Byte kLen2DistStarts[kLen2NumNumbers]={0,4,8,16,32,64,128,192};
-const Byte kLen2DistDirectBits[kLen2NumNumbers]={2,2,3, 4, 5, 6, 6, 6};
-
-const UInt32 kDistLimit2 = 0x101 - 1;
-const UInt32 kDistLimit3 = 0x2000 - 1;
-const UInt32 kDistLimit4 = 0x40000 - 1;
-
-const UInt32 kMatchMaxLen = 255 + 2;
-const UInt32 kMatchMaxLenMax = 255 + 5;
-const UInt32 kNormalMatchMinLen = 3;
-
-namespace NMultimedia {
-
-struct CFilter
-{
- int K1,K2,K3,K4,K5;
- int D1,D2,D3,D4;
- int LastDelta;
- UInt32 Dif[11];
- UInt32 ByteCount;
- int LastChar;
-
- Byte Decode(int &channelDelta, Byte delta);
-
- void Init() { memset(this, 0, sizeof(*this)); }
-
-};
-
-const int kNumChanelsMax = 4;
-
-class CFilter2
-{
-public:
- CFilter m_Filters[kNumChanelsMax];
- int m_ChannelDelta;
- int CurrentChannel;
-
- void Init() { memset(this, 0, sizeof(*this)); }
- Byte Decode(Byte delta)
- {
- return m_Filters[CurrentChannel].Decode(m_ChannelDelta, delta);
- }
-
-};
-
-}
-
-typedef NBitm::CDecoder<CInBuffer> CBitDecoder;
-
-const int kNumHuffmanBits = 15;
-
-class CDecoder :
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- CBitDecoder m_InBitStream;
- NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kDistTableSize> m_DistDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kLenTableSize> m_LenDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kMMTableSize> m_MMDecoders[NMultimedia::kNumChanelsMax];
- NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
-
- bool m_AudioMode;
-
- NMultimedia::CFilter2 m_MmFilter;
- int m_NumChannels;
-
- UInt32 m_RepDists[kNumRepDists];
- UInt32 m_RepDistPtr;
-
- UInt32 m_LastLength;
-
- Byte m_LastLevels[kMaxTableSize];
-
- UInt64 m_PackSize;
- bool m_IsSolid;
-
- void InitStructures();
- UInt32 ReadBits(int numBits);
- bool ReadTables();
- bool ReadLastTables();
-
- bool DecodeMm(UInt32 pos);
- bool DecodeLz(Int32 pos);
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-public:
- CDecoder();
-
- MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Decoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Decoder.cpp
deleted file mode 100644
index dde7c6de3..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Decoder.cpp
+++ /dev/null
@@ -1,897 +0,0 @@
-// Rar3Decoder.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-/* This code uses Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "Rar3Decoder.h"
-
-namespace NCompress {
-namespace NRar3 {
-
-static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
-static void SzBigFree(void *, void *address) { BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-static const UInt32 kNumAlignReps = 15;
-
-static const UInt32 kSymbolReadTable = 256;
-static const UInt32 kSymbolRep = 259;
-static const UInt32 kSymbolLen2 = kSymbolRep + kNumReps;
-
-static const Byte kLenStart[kLenTableSize] = {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224};
-static const Byte kLenDirectBits[kLenTableSize] = {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5};
-
-static const Byte kDistDirectBits[kDistTableSize] =
- {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 18,18,18,18,18,18,18,18,18,18,18,18};
-
-static const Byte kLevelDirectBits[kLevelTableSize] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
-
-static const Byte kLen2DistStarts[kNumLen2Symbols]={0,4,8,16,32,64,128,192};
-static const Byte kLen2DistDirectBits[kNumLen2Symbols]={2,2,3, 4, 5, 6, 6, 6};
-
-static const UInt32 kDistLimit3 = 0x2000 - 2;
-static const UInt32 kDistLimit4 = 0x40000 - 2;
-
-static const UInt32 kNormalMatchMinLen = 3;
-
-static const UInt32 kVmDataSizeMax = 1 << 16;
-static const UInt32 kVmCodeSizeMax = 1 << 16;
-
-extern "C" {
-
-static UInt32 Range_GetThreshold(void *pp, UInt32 total)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- return p->Code / (p->Range /= total);
-}
-
-static void Range_Decode(void *pp, UInt32 start, UInt32 size)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- start *= p->Range;
- p->Low += start;
- p->Code -= start;
- p->Range *= size;
- p->Normalize();
-}
-
-static UInt32 Range_DecodeBit(void *pp, UInt32 size0)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- if (p->Code / (p->Range >>= 14) < size0)
- {
- Range_Decode(p, 0, size0);
- return 0;
- }
- else
- {
- Range_Decode(p, size0, (1 << 14) - size0);
- return 1;
- }
-}
-
-}
-
-CRangeDecoder::CRangeDecoder()
-{
- s.GetThreshold = Range_GetThreshold;
- s.Decode = Range_Decode;
- s.DecodeBit = Range_DecodeBit;
-}
-
-CDecoder::CDecoder():
- _window(0),
- _winPos(0),
- _wrPtr(0),
- _lzSize(0),
- _writtenFileSize(0),
- _vmData(0),
- _vmCode(0),
- m_IsSolid(false)
-{
- Ppmd7_Construct(&_ppmd);
-}
-
-CDecoder::~CDecoder()
-{
- InitFilters();
- ::MidFree(_vmData);
- ::MidFree(_window);
- Ppmd7_Free(&_ppmd, &g_BigAlloc);
-}
-
-HRESULT CDecoder::WriteDataToStream(const Byte *data, UInt32 size)
-{
- return WriteStream(_outStream, data, size);
-}
-
-HRESULT CDecoder::WriteData(const Byte *data, UInt32 size)
-{
- HRESULT res = S_OK;
- if (_writtenFileSize < _unpackSize)
- {
- UInt32 curSize = size;
- UInt64 remain = _unpackSize - _writtenFileSize;
- if (remain < curSize)
- curSize = (UInt32)remain;
- res = WriteDataToStream(data, curSize);
- }
- _writtenFileSize += size;
- return res;
-}
-
-HRESULT CDecoder::WriteArea(UInt32 startPtr, UInt32 endPtr)
-{
- if (startPtr <= endPtr)
- return WriteData(_window + startPtr, endPtr - startPtr);
- RINOK(WriteData(_window + startPtr, kWindowSize - startPtr));
- return WriteData(_window, endPtr);
-}
-
-void CDecoder::ExecuteFilter(int tempFilterIndex, NVm::CBlockRef &outBlockRef)
-{
- CTempFilter *tempFilter = _tempFilters[tempFilterIndex];
- tempFilter->InitR[6] = (UInt32)_writtenFileSize;
- NVm::SetValue32(&tempFilter->GlobalData[0x24], (UInt32)_writtenFileSize);
- NVm::SetValue32(&tempFilter->GlobalData[0x28], (UInt32)(_writtenFileSize >> 32));
- CFilter *filter = _filters[tempFilter->FilterIndex];
- _vm.Execute(filter, tempFilter, outBlockRef, filter->GlobalData);
- delete tempFilter;
- _tempFilters[tempFilterIndex] = 0;
-}
-
-HRESULT CDecoder::WriteBuf()
-{
- UInt32 writtenBorder = _wrPtr;
- UInt32 writeSize = (_winPos - writtenBorder) & kWindowMask;
- for (int i = 0; i < _tempFilters.Size(); i++)
- {
- CTempFilter *filter = _tempFilters[i];
- if (filter == NULL)
- continue;
- if (filter->NextWindow)
- {
- filter->NextWindow = false;
- continue;
- }
- UInt32 blockStart = filter->BlockStart;
- UInt32 blockSize = filter->BlockSize;
- if (((blockStart - writtenBorder) & kWindowMask) < writeSize)
- {
- if (writtenBorder != blockStart)
- {
- RINOK(WriteArea(writtenBorder, blockStart));
- writtenBorder = blockStart;
- writeSize = (_winPos - writtenBorder) & kWindowMask;
- }
- if (blockSize <= writeSize)
- {
- UInt32 blockEnd = (blockStart + blockSize) & kWindowMask;
- if (blockStart < blockEnd || blockEnd == 0)
- _vm.SetMemory(0, _window + blockStart, blockSize);
- else
- {
- UInt32 tailSize = kWindowSize - blockStart;
- _vm.SetMemory(0, _window + blockStart, tailSize);
- _vm.SetMemory(tailSize, _window, blockEnd);
- }
- NVm::CBlockRef outBlockRef;
- ExecuteFilter(i, outBlockRef);
- while (i + 1 < _tempFilters.Size())
- {
- CTempFilter *nextFilter = _tempFilters[i + 1];
- if (nextFilter == NULL || nextFilter->BlockStart != blockStart ||
- nextFilter->BlockSize != outBlockRef.Size || nextFilter->NextWindow)
- break;
- _vm.SetMemory(0, _vm.GetDataPointer(outBlockRef.Offset), outBlockRef.Size);
- ExecuteFilter(++i, outBlockRef);
- }
- WriteDataToStream(_vm.GetDataPointer(outBlockRef.Offset), outBlockRef.Size);
- _writtenFileSize += outBlockRef.Size;
- writtenBorder = blockEnd;
- writeSize = (_winPos - writtenBorder) & kWindowMask;
- }
- else
- {
- for (int j = i; j < _tempFilters.Size(); j++)
- {
- CTempFilter *filter = _tempFilters[j];
- if (filter != NULL && filter->NextWindow)
- filter->NextWindow = false;
- }
- _wrPtr = writtenBorder;
- return S_OK; // check it
- }
- }
- }
-
- _wrPtr = _winPos;
- return WriteArea(writtenBorder, _winPos);
-}
-
-void CDecoder::InitFilters()
-{
- _lastFilter = 0;
- int i;
- for (i = 0; i < _tempFilters.Size(); i++)
- delete _tempFilters[i];
- _tempFilters.Clear();
- for (i = 0; i < _filters.Size(); i++)
- delete _filters[i];
- _filters.Clear();
-}
-
-bool CDecoder::AddVmCode(UInt32 firstByte, UInt32 codeSize)
-{
- CMemBitDecoder inp;
- inp.Init(_vmData, codeSize);
-
- UInt32 filterIndex;
- if (firstByte & 0x80)
- {
- filterIndex = NVm::ReadEncodedUInt32(inp);
- if (filterIndex == 0)
- InitFilters();
- else
- filterIndex--;
- }
- else
- filterIndex = _lastFilter;
- if (filterIndex > (UInt32)_filters.Size())
- return false;
- _lastFilter = filterIndex;
- bool newFilter = (filterIndex == (UInt32)_filters.Size());
-
- CFilter *filter;
- if (newFilter)
- {
- // check if too many filters
- if (filterIndex > 1024)
- return false;
- filter = new CFilter;
- _filters.Add(filter);
- }
- else
- {
- filter = _filters[filterIndex];
- filter->ExecCount++;
- }
-
- int numEmptyItems = 0;
- int i;
- for (i = 0; i < _tempFilters.Size(); i++)
- {
- _tempFilters[i - numEmptyItems] = _tempFilters[i];
- if (_tempFilters[i] == NULL)
- numEmptyItems++;
- if (numEmptyItems > 0)
- _tempFilters[i] = NULL;
- }
- if (numEmptyItems == 0)
- {
- _tempFilters.Add(NULL);
- numEmptyItems = 1;
- }
- CTempFilter *tempFilter = new CTempFilter;
- _tempFilters[_tempFilters.Size() - numEmptyItems] = tempFilter;
- tempFilter->FilterIndex = filterIndex;
- tempFilter->ExecCount = filter->ExecCount;
-
- UInt32 blockStart = NVm::ReadEncodedUInt32(inp);
- if (firstByte & 0x40)
- blockStart += 258;
- tempFilter->BlockStart = (blockStart + _winPos) & kWindowMask;
- if (firstByte & 0x20)
- filter->BlockSize = NVm::ReadEncodedUInt32(inp);
- tempFilter->BlockSize = filter->BlockSize;
- tempFilter->NextWindow = _wrPtr != _winPos && ((_wrPtr - _winPos) & kWindowMask) <= blockStart;
-
- memset(tempFilter->InitR, 0, sizeof(tempFilter->InitR));
- tempFilter->InitR[3] = NVm::kGlobalOffset;
- tempFilter->InitR[4] = tempFilter->BlockSize;
- tempFilter->InitR[5] = tempFilter->ExecCount;
- if (firstByte & 0x10)
- {
- UInt32 initMask = inp.ReadBits(NVm::kNumGpRegs);
- for (int i = 0; i < NVm::kNumGpRegs; i++)
- if (initMask & (1 << i))
- tempFilter->InitR[i] = NVm::ReadEncodedUInt32(inp);
- }
- if (newFilter)
- {
- UInt32 vmCodeSize = NVm::ReadEncodedUInt32(inp);
- if (vmCodeSize >= kVmCodeSizeMax || vmCodeSize == 0)
- return false;
- for (UInt32 i = 0; i < vmCodeSize; i++)
- _vmCode[i] = (Byte)inp.ReadBits(8);
- _vm.PrepareProgram(_vmCode, vmCodeSize, filter);
- }
-
- tempFilter->AllocateEmptyFixedGlobal();
-
- Byte *globalData = &tempFilter->GlobalData[0];
- for (i = 0; i < NVm::kNumGpRegs; i++)
- NVm::SetValue32(&globalData[i * 4], tempFilter->InitR[i]);
- NVm::SetValue32(&globalData[NVm::NGlobalOffset::kBlockSize], tempFilter->BlockSize);
- NVm::SetValue32(&globalData[NVm::NGlobalOffset::kBlockPos], 0); // It was commented. why?
- NVm::SetValue32(&globalData[NVm::NGlobalOffset::kExecCount], tempFilter->ExecCount);
-
- if (firstByte & 8)
- {
- UInt32 dataSize = NVm::ReadEncodedUInt32(inp);
- if (dataSize > NVm::kGlobalSize - NVm::kFixedGlobalSize)
- return false;
- CRecordVector<Byte> &globalData = tempFilter->GlobalData;
- int requredSize = (int)(dataSize + NVm::kFixedGlobalSize);
- if (globalData.Size() < requredSize)
- {
- globalData.Reserve(requredSize);
- for (; globalData.Size() < requredSize; i++)
- globalData.Add(0);
- }
- for (UInt32 i = 0; i < dataSize; i++)
- globalData[NVm::kFixedGlobalSize + i] = (Byte)inp.ReadBits(8);
- }
- return true;
-}
-
-bool CDecoder::ReadVmCodeLZ()
-{
- UInt32 firstByte = ReadBits(8);
- UInt32 length = (firstByte & 7) + 1;
- if (length == 7)
- length = ReadBits(8) + 7;
- else if (length == 8)
- length = ReadBits(16);
- if (length > kVmDataSizeMax)
- return false;
- for (UInt32 i = 0; i < length; i++)
- _vmData[i] = (Byte)ReadBits(8);
- return AddVmCode(firstByte, length);
-}
-
-bool CDecoder::ReadVmCodePPM()
-{
- int firstByte = DecodePpmSymbol();
- if (firstByte < 0)
- return false;
- UInt32 length = (firstByte & 7) + 1;
- if (length == 7)
- {
- int b1 = DecodePpmSymbol();
- if (b1 < 0)
- return false;
- length = b1 + 7;
- }
- else if (length == 8)
- {
- int b1 = DecodePpmSymbol();
- if (b1 < 0)
- return false;
- int b2 = DecodePpmSymbol();
- if (b2 < 0)
- return false;
- length = b1 * 256 + b2;
- }
- if (length > kVmDataSizeMax)
- return false;
- for (UInt32 i = 0; i < length; i++)
- {
- int b = DecodePpmSymbol();
- if (b < 0)
- return false;
- _vmData[i] = (Byte)b;
- }
- return AddVmCode(firstByte, length);
-}
-
-#define RIF(x) { if (!(x)) return S_FALSE; }
-
-UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.bitDecoder.ReadBits(numBits); }
-
-/////////////////////////////////////////////////
-// PPM
-
-HRESULT CDecoder::InitPPM()
-{
- Byte maxOrder = (Byte)ReadBits(7);
-
- bool reset = ((maxOrder & 0x20) != 0);
- int maxMB = 0;
- if (reset)
- maxMB = (Byte)ReadBits(8);
- else
- {
- if (PpmError || !Ppmd7_WasAllocated(&_ppmd))
- return S_FALSE;
- }
- if (maxOrder & 0x40)
- PpmEscChar = (Byte)ReadBits(8);
- m_InBitStream.InitRangeCoder();
- /*
- if (m_InBitStream.m_BitPos != 0)
- return S_FALSE;
- */
- if (reset)
- {
- PpmError = true;
- maxOrder = (maxOrder & 0x1F) + 1;
- if (maxOrder > 16)
- maxOrder = 16 + (maxOrder - 16) * 3;
- if (maxOrder == 1)
- {
- Ppmd7_Free(&_ppmd, &g_BigAlloc);
- return S_FALSE;
- }
- if (!Ppmd7_Alloc(&_ppmd, (maxMB + 1) << 20, &g_BigAlloc))
- return E_OUTOFMEMORY;
- Ppmd7_Init(&_ppmd, maxOrder);
- PpmError = false;
- }
- return S_OK;
-}
-
-int CDecoder::DecodePpmSymbol() { return Ppmd7_DecodeSymbol(&_ppmd, &m_InBitStream.s); }
-
-HRESULT CDecoder::DecodePPM(Int32 num, bool &keepDecompressing)
-{
- keepDecompressing = false;
- if (PpmError)
- return S_FALSE;
- do
- {
- if (((_wrPtr - _winPos) & kWindowMask) < 260 && _wrPtr != _winPos)
- {
- RINOK(WriteBuf());
- if (_writtenFileSize > _unpackSize)
- {
- keepDecompressing = false;
- return S_OK;
- }
- }
- int c = DecodePpmSymbol();
- if (c < 0)
- {
- PpmError = true;
- return S_FALSE;
- }
- if (c == PpmEscChar)
- {
- int nextCh = DecodePpmSymbol();
- if (nextCh < 0)
- {
- PpmError = true;
- return S_FALSE;
- }
- if (nextCh == 0)
- return ReadTables(keepDecompressing);
- if (nextCh == 2 || nextCh == -1)
- return S_OK;
- if (nextCh == 3)
- {
- if (!ReadVmCodePPM())
- {
- PpmError = true;
- return S_FALSE;
- }
- continue;
- }
- if (nextCh == 4 || nextCh == 5)
- {
- UInt32 distance = 0;
- UInt32 length = 4;
- if (nextCh == 4)
- {
- for (int i = 0; i < 3; i++)
- {
- int c = DecodePpmSymbol();
- if (c < 0)
- {
- PpmError = true;
- return S_FALSE;
- }
- distance = (distance << 8) + (Byte)c;
- }
- distance++;
- length += 28;
- }
- int c = DecodePpmSymbol();
- if (c < 0)
- {
- PpmError = true;
- return S_FALSE;
- }
- length += c;
- if (distance >= _lzSize)
- return S_FALSE;
- CopyBlock(distance, length);
- num -= (Int32)length;
- continue;
- }
- }
- PutByte((Byte)c);
- num--;
- }
- while (num >= 0);
- keepDecompressing = true;
- return S_OK;
-}
-
-/////////////////////////////////////////////////
-// LZ
-
-HRESULT CDecoder::ReadTables(bool &keepDecompressing)
-{
- keepDecompressing = true;
- ReadBits((8 - m_InBitStream.bitDecoder.GetBitPosition()) & 7);
- if (ReadBits(1) != 0)
- {
- _lzMode = false;
- return InitPPM();
- }
-
- _lzMode = true;
- PrevAlignBits = 0;
- PrevAlignCount = 0;
-
- Byte levelLevels[kLevelTableSize];
- Byte newLevels[kTablesSizesSum];
-
- if (ReadBits(1) == 0)
- memset(m_LastLevels, 0, kTablesSizesSum);
-
- int i;
- for (i = 0; i < kLevelTableSize; i++)
- {
- UInt32 length = ReadBits(4);
- if (length == 15)
- {
- UInt32 zeroCount = ReadBits(4);
- if (zeroCount != 0)
- {
- zeroCount += 2;
- while (zeroCount-- > 0 && i < kLevelTableSize)
- levelLevels[i++]=0;
- i--;
- continue;
- }
- }
- levelLevels[i] = (Byte)length;
- }
- RIF(m_LevelDecoder.SetCodeLengths(levelLevels));
- i = 0;
- while (i < kTablesSizesSum)
- {
- UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
- if (number < 16)
- {
- newLevels[i] = Byte((number + m_LastLevels[i]) & 15);
- i++;
- }
- else if (number > kLevelTableSize)
- return S_FALSE;
- else
- {
- int num;
- if (((number - 16) & 1) == 0)
- num = ReadBits(3) + 3;
- else
- num = ReadBits(7) + 11;
- if (number < 18)
- {
- if (i == 0)
- return S_FALSE;
- for (; num > 0 && i < kTablesSizesSum; num--, i++)
- newLevels[i] = newLevels[i - 1];
- }
- else
- {
- for (; num > 0 && i < kTablesSizesSum; num--)
- newLevels[i++] = 0;
- }
- }
- }
- TablesRead = true;
-
- // original code has check here:
- /*
- if (InAddr > ReadTop)
- {
- keepDecompressing = false;
- return true;
- }
- */
-
- RIF(m_MainDecoder.SetCodeLengths(&newLevels[0]));
- RIF(m_DistDecoder.SetCodeLengths(&newLevels[kMainTableSize]));
- RIF(m_AlignDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize]));
- RIF(m_LenDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize + kAlignTableSize]));
-
- memcpy(m_LastLevels, newLevels, kTablesSizesSum);
- return S_OK;
-}
-
-class CCoderReleaser
-{
- CDecoder *m_Coder;
-public:
- CCoderReleaser(CDecoder *coder): m_Coder(coder) {}
- ~CCoderReleaser()
- {
- m_Coder->ReleaseStreams();
- }
-};
-
-HRESULT CDecoder::ReadEndOfBlock(bool &keepDecompressing)
-{
- if (ReadBits(1) != 0)
- {
- // old file
- TablesRead = false;
- return ReadTables(keepDecompressing);
- }
- // new file
- keepDecompressing = false;
- TablesRead = (ReadBits(1) == 0);
- return S_OK;
-}
-
-UInt32 kDistStart[kDistTableSize];
-
-class CDistInit
-{
-public:
- CDistInit() { Init(); }
- void Init()
- {
- UInt32 start = 0;
- for (UInt32 i = 0; i < kDistTableSize; i++)
- {
- kDistStart[i] = start;
- start += (1 << kDistDirectBits[i]);
- }
- }
-} g_DistInit;
-
-HRESULT CDecoder::DecodeLZ(bool &keepDecompressing)
-{
- UInt32 rep0 = _reps[0];
- UInt32 rep1 = _reps[1];
- UInt32 rep2 = _reps[2];
- UInt32 rep3 = _reps[3];
- UInt32 length = _lastLength;
- for (;;)
- {
- if (((_wrPtr - _winPos) & kWindowMask) < 260 && _wrPtr != _winPos)
- {
- RINOK(WriteBuf());
- if (_writtenFileSize > _unpackSize)
- {
- keepDecompressing = false;
- return S_OK;
- }
- }
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
- if (number < 256)
- {
- PutByte((Byte)number);
- continue;
- }
- else if (number == kSymbolReadTable)
- {
- RINOK(ReadEndOfBlock(keepDecompressing));
- break;
- }
- else if (number == 257)
- {
- if (!ReadVmCodeLZ())
- return S_FALSE;
- continue;
- }
- else if (number == 258)
- {
- if (length == 0)
- return S_FALSE;
- }
- else if (number < kSymbolRep + 4)
- {
- if (number != kSymbolRep)
- {
- UInt32 distance;
- if (number == kSymbolRep + 1)
- distance = rep1;
- else
- {
- if (number == kSymbolRep + 2)
- distance = rep2;
- else
- {
- distance = rep3;
- rep3 = rep2;
- }
- rep2 = rep1;
- }
- rep1 = rep0;
- rep0 = distance;
- }
-
- UInt32 number = m_LenDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
- if (number >= kLenTableSize)
- return S_FALSE;
- length = 2 + kLenStart[number] + m_InBitStream.bitDecoder.ReadBits(kLenDirectBits[number]);
- }
- else
- {
- rep3 = rep2;
- rep2 = rep1;
- rep1 = rep0;
- if (number < 271)
- {
- number -= 263;
- rep0 = kLen2DistStarts[number] + m_InBitStream.bitDecoder.ReadBits(kLen2DistDirectBits[number]);
- length = 2;
- }
- else if (number < 299)
- {
- number -= 271;
- length = kNormalMatchMinLen + (UInt32)kLenStart[number] + m_InBitStream.bitDecoder.ReadBits(kLenDirectBits[number]);
- UInt32 number = m_DistDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
- if (number >= kDistTableSize)
- return S_FALSE;
- rep0 = kDistStart[number];
- int numBits = kDistDirectBits[number];
- if (number >= (kNumAlignBits * 2) + 2)
- {
- if (numBits > kNumAlignBits)
- rep0 += (m_InBitStream.bitDecoder.ReadBits(numBits - kNumAlignBits) << kNumAlignBits);
- if (PrevAlignCount > 0)
- {
- PrevAlignCount--;
- rep0 += PrevAlignBits;
- }
- else
- {
- UInt32 number = m_AlignDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
- if (number < (1 << kNumAlignBits))
- {
- rep0 += number;
- PrevAlignBits = number;
- }
- else if (number == (1 << kNumAlignBits))
- {
- PrevAlignCount = kNumAlignReps;
- rep0 += PrevAlignBits;
- }
- else
- return S_FALSE;
- }
- }
- else
- rep0 += m_InBitStream.bitDecoder.ReadBits(numBits);
- length += ((kDistLimit4 - rep0) >> 31) + ((kDistLimit3 - rep0) >> 31);
- }
- else
- return S_FALSE;
- }
- if (rep0 >= _lzSize)
- return S_FALSE;
- CopyBlock(rep0, length);
- }
- _reps[0] = rep0;
- _reps[1] = rep1;
- _reps[2] = rep2;
- _reps[3] = rep3;
- _lastLength = length;
-
- return S_OK;
-}
-
-HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress)
-{
- _writtenFileSize = 0;
- if (!m_IsSolid)
- {
- _lzSize = 0;
- _winPos = 0;
- _wrPtr = 0;
- for (int i = 0; i < kNumReps; i++)
- _reps[i] = 0;
- _lastLength = 0;
- memset(m_LastLevels, 0, kTablesSizesSum);
- TablesRead = false;
- PpmEscChar = 2;
- PpmError = true;
- InitFilters();
- }
- if (!m_IsSolid || !TablesRead)
- {
- bool keepDecompressing;
- RINOK(ReadTables(keepDecompressing));
- if (!keepDecompressing)
- return S_OK;
- }
-
- for (;;)
- {
- bool keepDecompressing;
- if (_lzMode)
- {
- RINOK(DecodeLZ(keepDecompressing))
- }
- else
- {
- RINOK(DecodePPM(1 << 18, keepDecompressing))
- }
- UInt64 packSize = m_InBitStream.bitDecoder.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &_writtenFileSize));
- if (!keepDecompressing)
- break;
- }
- RINOK(WriteBuf());
- UInt64 packSize = m_InBitStream.bitDecoder.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &_writtenFileSize));
- if (_writtenFileSize < _unpackSize)
- return S_FALSE;
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try
- {
- if (inSize == NULL || outSize == NULL)
- return E_INVALIDARG;
-
- if (_vmData == 0)
- {
- _vmData = (Byte *)::MidAlloc(kVmDataSizeMax + kVmCodeSizeMax);
- if (_vmData == 0)
- return E_OUTOFMEMORY;
- _vmCode = _vmData + kVmDataSizeMax;
- }
-
- if (_window == 0)
- {
- _window = (Byte *)::MidAlloc(kWindowSize);
- if (_window == 0)
- return E_OUTOFMEMORY;
- }
- if (!m_InBitStream.bitDecoder.Create(1 << 20))
- return E_OUTOFMEMORY;
- if (!_vm.Create())
- return E_OUTOFMEMORY;
-
-
- m_InBitStream.bitDecoder.SetStream(inStream);
- m_InBitStream.bitDecoder.Init();
- _outStream = outStream;
-
- CCoderReleaser coderReleaser(this);
- _unpackSize = *outSize;
- return CodeReal(progress);
- }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
- // CNewException is possible here. But probably CNewException is caused
- // by error in data stream.
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size < 1)
- return E_INVALIDARG;
- m_IsSolid = (data[0] != 0);
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Decoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Decoder.h
deleted file mode 100644
index 99b647dc7..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Decoder.h
+++ /dev/null
@@ -1,267 +0,0 @@
-// Rar3Decoder.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-/* This code uses Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#ifndef __COMPRESS_RAR3_DECODER_H
-#define __COMPRESS_RAR3_DECODER_H
-
-#include "../../../C/Ppmd7.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "HuffmanDecoder.h"
-#include "Rar3Vm.h"
-
-namespace NCompress {
-namespace NRar3 {
-
-const UInt32 kWindowSize = 1 << 22;
-const UInt32 kWindowMask = (kWindowSize - 1);
-
-const UInt32 kNumReps = 4;
-const UInt32 kNumLen2Symbols = 8;
-const UInt32 kLenTableSize = 28;
-const UInt32 kMainTableSize = 256 + 1 + 1 + 1 + kNumReps + kNumLen2Symbols + kLenTableSize;
-const UInt32 kDistTableSize = 60;
-
-const int kNumAlignBits = 4;
-const UInt32 kAlignTableSize = (1 << kNumAlignBits) + 1;
-
-const UInt32 kLevelTableSize = 20;
-
-const UInt32 kTablesSizesSum = kMainTableSize + kDistTableSize + kAlignTableSize + kLenTableSize;
-
-class CBitDecoder
-{
- UInt32 m_Value;
- unsigned m_BitPos;
-public:
- CInBuffer m_Stream;
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream);}
- void ReleaseStream() { m_Stream.ReleaseStream();}
-
- void Init()
- {
- m_Stream.Init();
- m_BitPos = 0;
- m_Value = 0;
- }
-
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - (m_BitPos) / 8; }
- UInt32 GetBitPosition() const { return ((8 - m_BitPos) & 7); }
-
- UInt32 GetValue(unsigned numBits)
- {
- if (m_BitPos < numBits)
- {
- m_BitPos += 8;
- m_Value = (m_Value << 8) | m_Stream.ReadByte();
- if (m_BitPos < numBits)
- {
- m_BitPos += 8;
- m_Value = (m_Value << 8) | m_Stream.ReadByte();
- }
- }
- return m_Value >> (m_BitPos - numBits);
- }
-
- void MovePos(unsigned numBits)
- {
- m_BitPos -= numBits;
- m_Value = m_Value & ((1 << m_BitPos) - 1);
- }
-
- UInt32 ReadBits(unsigned numBits)
- {
- UInt32 res = GetValue(numBits);
- MovePos(numBits);
- return res;
- }
-};
-
-const UInt32 kTopValue = (1 << 24);
-const UInt32 kBot = (1 << 15);
-
-struct CRangeDecoder
-{
- IPpmd7_RangeDec s;
- UInt32 Range;
- UInt32 Code;
- UInt32 Low;
- CBitDecoder bitDecoder;
- SRes Res;
-
-public:
- void InitRangeCoder()
- {
- Code = 0;
- Low = 0;
- Range = 0xFFFFFFFF;
- for (int i = 0; i < 4; i++)
- Code = (Code << 8) | bitDecoder.ReadBits(8);
- }
-
- void Normalize()
- {
- while ((Low ^ (Low + Range)) < kTopValue ||
- Range < kBot && ((Range = (0 - Low) & (kBot - 1)), 1))
- {
- Code = (Code << 8) | bitDecoder.m_Stream.ReadByte();
- Range <<= 8;
- Low <<= 8;
- }
- }
-
- CRangeDecoder();
-};
-
-struct CFilter: public NVm::CProgram
-{
- CRecordVector<Byte> GlobalData;
- UInt32 BlockStart;
- UInt32 BlockSize;
- UInt32 ExecCount;
- CFilter(): BlockStart(0), BlockSize(0), ExecCount(0) {}
-};
-
-struct CTempFilter: public NVm::CProgramInitState
-{
- UInt32 BlockStart;
- UInt32 BlockSize;
- UInt32 ExecCount;
- bool NextWindow;
-
- UInt32 FilterIndex;
-};
-
-const int kNumHuffmanBits = 15;
-
-class CDecoder:
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public CMyUnknownImp
-{
- CRangeDecoder m_InBitStream;
- Byte *_window;
- UInt32 _winPos;
- UInt32 _wrPtr;
- UInt64 _lzSize;
- UInt64 _unpackSize;
- UInt64 _writtenFileSize; // if it's > _unpackSize, then _unpackSize only written
- CMyComPtr<ISequentialOutStream> _outStream;
- NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kDistTableSize> m_DistDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kAlignTableSize> m_AlignDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kLenTableSize> m_LenDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
-
- UInt32 _reps[kNumReps];
- UInt32 _lastLength;
-
- Byte m_LastLevels[kTablesSizesSum];
-
- Byte *_vmData;
- Byte *_vmCode;
- NVm::CVm _vm;
- CRecordVector<CFilter *> _filters;
- CRecordVector<CTempFilter *> _tempFilters;
- UInt32 _lastFilter;
-
- bool m_IsSolid;
-
- bool _lzMode;
-
- UInt32 PrevAlignBits;
- UInt32 PrevAlignCount;
-
- bool TablesRead;
-
- CPpmd7 _ppmd;
- int PpmEscChar;
- bool PpmError;
-
- HRESULT WriteDataToStream(const Byte *data, UInt32 size);
- HRESULT WriteData(const Byte *data, UInt32 size);
- HRESULT WriteArea(UInt32 startPtr, UInt32 endPtr);
- void ExecuteFilter(int tempFilterIndex, NVm::CBlockRef &outBlockRef);
- HRESULT WriteBuf();
-
- void InitFilters();
- bool AddVmCode(UInt32 firstByte, UInt32 codeSize);
- bool ReadVmCodeLZ();
- bool ReadVmCodePPM();
-
- UInt32 ReadBits(int numBits);
-
- HRESULT InitPPM();
- int DecodePpmSymbol();
- HRESULT DecodePPM(Int32 num, bool &keepDecompressing);
-
- HRESULT ReadTables(bool &keepDecompressing);
- HRESULT ReadEndOfBlock(bool &keepDecompressing);
- HRESULT DecodeLZ(bool &keepDecompressing);
- HRESULT CodeReal(ICompressProgressInfo *progress);
-public:
- CDecoder();
- ~CDecoder();
-
- MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
- void ReleaseStreams()
- {
- _outStream.Release();
- m_InBitStream.bitDecoder.ReleaseStream();
- }
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
- void CopyBlock(UInt32 distance, UInt32 len)
- {
- _lzSize += len;
- UInt32 pos = (_winPos - distance - 1) & kWindowMask;
- Byte *window = _window;
- UInt32 winPos = _winPos;
- if (kWindowSize - winPos > len && kWindowSize - pos > len)
- {
- const Byte *src = window + pos;
- Byte *dest = window + winPos;
- _winPos += len;
- do
- *dest++ = *src++;
- while(--len != 0);
- return;
- }
- do
- {
- window[winPos] = window[pos];
- winPos = (winPos + 1) & kWindowMask;
- pos = (pos + 1) & kWindowMask;
- }
- while(--len != 0);
- _winPos = winPos;
- }
-
- void PutByte(Byte b)
- {
- _window[_winPos] = b;
- _winPos = (_winPos + 1) & kWindowMask;
- _lzSize++;
- }
-
-
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Vm.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Vm.cpp
deleted file mode 100644
index 74051dd79..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Vm.cpp
+++ /dev/null
@@ -1,1091 +0,0 @@
-// Rar3Vm.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-/*
-Note:
- Due to performance considerations Rar VM may set Flags C incorrectly
- for some operands (SHL x, 0, ... ).
- Check implementation of concrete VM command
- to see if it sets flags right.
-*/
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/Alloc.h"
-
-#include "Rar3Vm.h"
-
-namespace NCompress {
-namespace NRar3 {
-
-UInt32 CMemBitDecoder::ReadBits(int numBits)
-{
- UInt32 res = 0;
- for (;;)
- {
- Byte b = _bitPos < _bitSize ? _data[_bitPos >> 3] : 0;
- int avail = (int)(8 - (_bitPos & 7));
- if (numBits <= avail)
- {
- _bitPos += numBits;
- return res | (b >> (avail - numBits)) & ((1 << numBits) - 1);
- }
- numBits -= avail;
- res |= (UInt32)(b & ((1 << avail) - 1)) << numBits;
- _bitPos += avail;
- }
-}
-
-UInt32 CMemBitDecoder::ReadBit() { return ReadBits(1); }
-
-namespace NVm {
-
-static const UInt32 kStackRegIndex = kNumRegs - 1;
-
-static const UInt32 FLAG_C = 1;
-static const UInt32 FLAG_Z = 2;
-static const UInt32 FLAG_S = 0x80000000;
-
-static const Byte CF_OP0 = 0;
-static const Byte CF_OP1 = 1;
-static const Byte CF_OP2 = 2;
-static const Byte CF_OPMASK = 3;
-static const Byte CF_BYTEMODE = 4;
-static const Byte CF_JUMP = 8;
-static const Byte CF_PROC = 16;
-static const Byte CF_USEFLAGS = 32;
-static const Byte CF_CHFLAGS = 64;
-
-static Byte kCmdFlags[]=
-{
- /* CMD_MOV */ CF_OP2 | CF_BYTEMODE,
- /* CMD_CMP */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_ADD */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_SUB */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_JZ */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JNZ */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_INC */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_DEC */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_JMP */ CF_OP1 | CF_JUMP,
- /* CMD_XOR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_AND */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_OR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_TEST */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_JS */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JNS */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JB */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JBE */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JA */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JAE */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_PUSH */ CF_OP1,
- /* CMD_POP */ CF_OP1,
- /* CMD_CALL */ CF_OP1 | CF_PROC,
- /* CMD_RET */ CF_OP0 | CF_PROC,
- /* CMD_NOT */ CF_OP1 | CF_BYTEMODE,
- /* CMD_SHL */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_SHR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_SAR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_NEG */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_PUSHA */ CF_OP0,
- /* CMD_POPA */ CF_OP0,
- /* CMD_PUSHF */ CF_OP0 | CF_USEFLAGS,
- /* CMD_POPF */ CF_OP0 | CF_CHFLAGS,
- /* CMD_MOVZX */ CF_OP2,
- /* CMD_MOVSX */ CF_OP2,
- /* CMD_XCHG */ CF_OP2 | CF_BYTEMODE,
- /* CMD_MUL */ CF_OP2 | CF_BYTEMODE,
- /* CMD_DIV */ CF_OP2 | CF_BYTEMODE,
- /* CMD_ADC */ CF_OP2 | CF_BYTEMODE | CF_USEFLAGS | CF_CHFLAGS ,
- /* CMD_SBB */ CF_OP2 | CF_BYTEMODE | CF_USEFLAGS | CF_CHFLAGS ,
- /* CMD_PRINT */ CF_OP0
-};
-
-CVm::CVm(): Mem(NULL) {}
-
-bool CVm::Create()
-{
- if (Mem == NULL)
- Mem = (Byte *)::MyAlloc(kSpaceSize + 4);
- return (Mem != NULL);
-}
-
-CVm::~CVm()
-{
- ::MyFree(Mem);
-}
-
-// CVm::Execute can change CProgram object: it clears progarm if VM returns error.
-
-bool CVm::Execute(CProgram *prg, const CProgramInitState *initState,
- CBlockRef &outBlockRef, CRecordVector<Byte> &outGlobalData)
-{
- memcpy(R, initState->InitR, sizeof(initState->InitR));
- R[kStackRegIndex] = kSpaceSize;
- R[kNumRegs] = 0;
- Flags = 0;
-
- UInt32 globalSize = MyMin((UInt32)initState->GlobalData.Size(), kGlobalSize);
- if (globalSize != 0)
- memcpy(Mem + kGlobalOffset, &initState->GlobalData[0], globalSize);
- UInt32 staticSize = MyMin((UInt32)prg->StaticData.Size(), kGlobalSize - globalSize);
- if (staticSize != 0)
- memcpy(Mem + kGlobalOffset + globalSize, &prg->StaticData[0], staticSize);
-
- bool res = true;
- #ifdef RARVM_STANDARD_FILTERS
- if (prg->StandardFilterIndex >= 0)
- ExecuteStandardFilter(prg->StandardFilterIndex);
- else
- #endif
- {
- res = ExecuteCode(prg);
- if (!res)
- prg->Commands[0].OpCode = CMD_RET;
- }
- UInt32 newBlockPos = GetFixedGlobalValue32(NGlobalOffset::kBlockPos) & kSpaceMask;
- UInt32 newBlockSize = GetFixedGlobalValue32(NGlobalOffset::kBlockSize) & kSpaceMask;
- if (newBlockPos + newBlockSize >= kSpaceSize)
- newBlockPos = newBlockSize = 0;
- outBlockRef.Offset = newBlockPos;
- outBlockRef.Size = newBlockSize;
-
- outGlobalData.Clear();
- UInt32 dataSize = GetFixedGlobalValue32(NGlobalOffset::kGlobalMemOutSize);
- dataSize = MyMin(dataSize, kGlobalSize - kFixedGlobalSize);
- if (dataSize != 0)
- {
- dataSize += kFixedGlobalSize;
- outGlobalData.Reserve(dataSize);
- for (UInt32 i = 0; i < dataSize; i++)
- outGlobalData.Add(Mem[kGlobalOffset + i]);
- }
- return res;
-}
-
-
-#define SET_IP(IP) \
- if ((IP) >= numCommands) return true; \
- if (--maxOpCount <= 0) return false; \
- cmd = commands + (IP);
-
-#define GET_FLAG_S_B(res) (((res) & 0x80) ? FLAG_S : 0)
-#define SET_IP_OP1 { UInt32 val = GetOperand32(&cmd->Op1); SET_IP(val); }
-#define FLAGS_UPDATE_SZ Flags = res == 0 ? FLAG_Z : res & FLAG_S
-#define FLAGS_UPDATE_SZ_B Flags = (res & 0xFF) == 0 ? FLAG_Z : GET_FLAG_S_B(res)
-
-UInt32 CVm::GetOperand32(const COperand *op) const
-{
- switch(op->Type)
- {
- case OP_TYPE_REG: return R[op->Data];
- case OP_TYPE_REGMEM: return GetValue32(&Mem[(op->Base + R[op->Data]) & kSpaceMask]);
- default: return op->Data;
- }
-}
-
-void CVm::SetOperand32(const COperand *op, UInt32 val)
-{
- switch(op->Type)
- {
- case OP_TYPE_REG: R[op->Data] = val; return;
- case OP_TYPE_REGMEM: SetValue32(&Mem[(op->Base + R[op->Data]) & kSpaceMask], val); return;
- }
-}
-
-Byte CVm::GetOperand8(const COperand *op) const
-{
- switch(op->Type)
- {
- case OP_TYPE_REG: return (Byte)R[op->Data];
- case OP_TYPE_REGMEM: return Mem[(op->Base + R[op->Data]) & kSpaceMask];;
- default: return (Byte)op->Data;
- }
-}
-
-void CVm::SetOperand8(const COperand *op, Byte val)
-{
- switch(op->Type)
- {
- case OP_TYPE_REG: R[op->Data] = (R[op->Data] & 0xFFFFFF00) | val; return;
- case OP_TYPE_REGMEM: Mem[(op->Base + R[op->Data]) & kSpaceMask] = val; return;
- }
-}
-
-UInt32 CVm::GetOperand(bool byteMode, const COperand *op) const
-{
- if (byteMode)
- return GetOperand8(op);
- return GetOperand32(op);
-}
-
-void CVm::SetOperand(bool byteMode, const COperand *op, UInt32 val)
-{
- if (byteMode)
- SetOperand8(op, (Byte)(val & 0xFF));
- else
- SetOperand32(op, val);
-}
-
-bool CVm::ExecuteCode(const CProgram *prg)
-{
- Int32 maxOpCount = 25000000;
- const CCommand *commands = &prg->Commands[0];
- const CCommand *cmd = commands;
- UInt32 numCommands = prg->Commands.Size();
- for (;;)
- {
- switch(cmd->OpCode)
- {
- #ifndef RARVM_NO_VM
-
- case CMD_MOV:
- SetOperand32(&cmd->Op1, GetOperand32(&cmd->Op2));
- break;
- case CMD_MOVB:
- SetOperand8(&cmd->Op1, GetOperand8(&cmd->Op2));
- break;
- case CMD_CMP:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- UInt32 res = v1 - GetOperand32(&cmd->Op2);
- Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);
- }
- break;
- case CMD_CMPB:
- {
- Byte v1 = GetOperand8(&cmd->Op1);
- Byte res = v1 - GetOperand8(&cmd->Op2);
- res &= 0xFF;
- Flags = res == 0 ? FLAG_Z : (res > v1) | GET_FLAG_S_B(res);
- }
- break;
- case CMD_ADD:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- UInt32 res = v1 + GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- Flags = (res < v1) | (res == 0 ? FLAG_Z : (res & FLAG_S));
- }
- break;
- case CMD_ADDB:
- {
- Byte v1 = GetOperand8(&cmd->Op1);
- Byte res = v1 + GetOperand8(&cmd->Op2);
- res &= 0xFF;
- SetOperand8(&cmd->Op1, (Byte)res);
- Flags = (res < v1) | (res == 0 ? FLAG_Z : GET_FLAG_S_B(res));
- }
- break;
- case CMD_ADC:
- {
- UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);
- UInt32 FC = (Flags & FLAG_C);
- UInt32 res = v1 + GetOperand(cmd->ByteMode, &cmd->Op2) + FC;
- if (cmd->ByteMode)
- res &= 0xFF;
- SetOperand(cmd->ByteMode, &cmd->Op1, res);
- Flags = (res < v1 || res == v1 && FC) | (res == 0 ? FLAG_Z : (res & FLAG_S));
- }
- break;
- case CMD_SUB:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- UInt32 res = v1 - GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);
- }
- break;
- case CMD_SUBB:
- {
- UInt32 v1 = GetOperand8(&cmd->Op1);
- UInt32 res = v1 - GetOperand8(&cmd->Op2);
- SetOperand8(&cmd->Op1, (Byte)res);
- Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);
- }
- break;
- case CMD_SBB:
- {
- UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);
- UInt32 FC = (Flags & FLAG_C);
- UInt32 res = v1 - GetOperand(cmd->ByteMode, &cmd->Op2) - FC;
- // Flags = res == 0 ? FLAG_Z : (res > v1 || res == v1 && FC) | (res & FLAG_S);
- if (cmd->ByteMode)
- res &= 0xFF;
- SetOperand(cmd->ByteMode, &cmd->Op1, res);
- Flags = (res > v1 || res == v1 && FC) | (res == 0 ? FLAG_Z : (res & FLAG_S));
- }
- break;
- case CMD_INC:
- {
- UInt32 res = GetOperand32(&cmd->Op1) + 1;
- SetOperand32(&cmd->Op1, res);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_INCB:
- {
- Byte res = GetOperand8(&cmd->Op1) + 1;
- SetOperand8(&cmd->Op1, res);;
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_DEC:
- {
- UInt32 res = GetOperand32(&cmd->Op1) - 1;
- SetOperand32(&cmd->Op1, res);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_DECB:
- {
- Byte res = GetOperand8(&cmd->Op1) - 1;
- SetOperand8(&cmd->Op1, res);;
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_XOR:
- {
- UInt32 res = GetOperand32(&cmd->Op1) ^ GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_XORB:
- {
- Byte res = GetOperand8(&cmd->Op1) ^ GetOperand8(&cmd->Op2);
- SetOperand8(&cmd->Op1, res);
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_AND:
- {
- UInt32 res = GetOperand32(&cmd->Op1) & GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_ANDB:
- {
- Byte res = GetOperand8(&cmd->Op1) & GetOperand8(&cmd->Op2);
- SetOperand8(&cmd->Op1, res);
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_OR:
- {
- UInt32 res = GetOperand32(&cmd->Op1) | GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_ORB:
- {
- Byte res = GetOperand8(&cmd->Op1) | GetOperand8(&cmd->Op2);
- SetOperand8(&cmd->Op1, res);
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_TEST:
- {
- UInt32 res = GetOperand32(&cmd->Op1) & GetOperand32(&cmd->Op2);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_TESTB:
- {
- Byte res = GetOperand8(&cmd->Op1) & GetOperand8(&cmd->Op2);
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_NOT:
- SetOperand(cmd->ByteMode, &cmd->Op1, ~GetOperand(cmd->ByteMode, &cmd->Op1));
- break;
- case CMD_NEG:
- {
- UInt32 res = 0 - GetOperand32(&cmd->Op1);
- SetOperand32(&cmd->Op1, res);
- Flags = res == 0 ? FLAG_Z : FLAG_C | (res & FLAG_S);
- }
- break;
- case CMD_NEGB:
- {
- Byte res = (Byte)(0 - GetOperand8(&cmd->Op1));
- SetOperand8(&cmd->Op1, res);
- Flags = res == 0 ? FLAG_Z : FLAG_C | GET_FLAG_S_B(res);
- }
- break;
-
- case CMD_SHL:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- int v2 = (int)GetOperand32(&cmd->Op2);
- UInt32 res = v1 << v2;
- SetOperand32(&cmd->Op1, res);
- Flags = (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 << (v2 - 1)) & 0x80000000 ? FLAG_C : 0);
- }
- break;
- case CMD_SHLB:
- {
- Byte v1 = GetOperand8(&cmd->Op1);
- int v2 = (int)GetOperand8(&cmd->Op2);
- Byte res = (Byte)(v1 << v2);
- SetOperand8(&cmd->Op1, res);
- Flags = (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 << (v2 - 1)) & 0x80 ? FLAG_C : 0);
- }
- break;
- case CMD_SHR:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- int v2 = (int)GetOperand32(&cmd->Op2);
- UInt32 res = v1 >> v2;
- SetOperand32(&cmd->Op1, res);
- Flags = (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 >> (v2 - 1)) & FLAG_C);
- }
- break;
- case CMD_SHRB:
- {
- Byte v1 = GetOperand8(&cmd->Op1);
- int v2 = (int)GetOperand8(&cmd->Op2);
- Byte res = (Byte)(v1 >> v2);
- SetOperand8(&cmd->Op1, res);
- Flags = (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 >> (v2 - 1)) & FLAG_C);
- }
- break;
- case CMD_SAR:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- int v2 = (int)GetOperand32(&cmd->Op2);
- UInt32 res = UInt32(((Int32)v1) >> v2);
- SetOperand32(&cmd->Op1, res);
- Flags= (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 >> (v2 - 1)) & FLAG_C);
- }
- break;
- case CMD_SARB:
- {
- Byte v1 = GetOperand8(&cmd->Op1);
- int v2 = (int)GetOperand8(&cmd->Op2);
- Byte res = (Byte)(((signed char)v1) >> v2);
- SetOperand8(&cmd->Op1, res);
- Flags= (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 >> (v2 - 1)) & FLAG_C);
- }
- break;
-
- case CMD_JMP:
- SET_IP_OP1;
- continue;
- case CMD_JZ:
- if ((Flags & FLAG_Z) != 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JNZ:
- if ((Flags & FLAG_Z) == 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JS:
- if ((Flags & FLAG_S) != 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JNS:
- if ((Flags & FLAG_S) == 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JB:
- if ((Flags & FLAG_C) != 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JBE:
- if ((Flags & (FLAG_C | FLAG_Z)) != 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JA:
- if ((Flags & (FLAG_C | FLAG_Z)) == 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JAE:
- if ((Flags & FLAG_C) == 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
-
- case CMD_PUSH:
- R[kStackRegIndex] -= 4;
- SetValue32(&Mem[R[kStackRegIndex] & kSpaceMask], GetOperand32(&cmd->Op1));
- break;
- case CMD_POP:
- SetOperand32(&cmd->Op1, GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]));
- R[kStackRegIndex] += 4;
- break;
- case CMD_CALL:
- R[kStackRegIndex] -= 4;
- SetValue32(&Mem[R[kStackRegIndex] & kSpaceMask], (UInt32)(cmd - commands + 1));
- SET_IP_OP1;
- continue;
-
- case CMD_PUSHA:
- {
- for (UInt32 i = 0, SP = R[kStackRegIndex] - 4; i < kNumRegs; i++, SP -= 4)
- SetValue32(&Mem[SP & kSpaceMask], R[i]);
- R[kStackRegIndex] -= kNumRegs * 4;
- }
- break;
- case CMD_POPA:
- {
- for (UInt32 i = 0, SP = R[kStackRegIndex]; i < kNumRegs; i++, SP += 4)
- R[kStackRegIndex - i] = GetValue32(&Mem[SP & kSpaceMask]);
- }
- break;
- case CMD_PUSHF:
- R[kStackRegIndex] -= 4;
- SetValue32(&Mem[R[kStackRegIndex]&kSpaceMask], Flags);
- break;
- case CMD_POPF:
- Flags = GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]);
- R[kStackRegIndex] += 4;
- break;
-
- case CMD_MOVZX:
- SetOperand32(&cmd->Op1, GetOperand8(&cmd->Op2));
- break;
- case CMD_MOVSX:
- SetOperand32(&cmd->Op1, (UInt32)(Int32)(signed char)GetOperand8(&cmd->Op2));
- break;
- case CMD_XCHG:
- {
- UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);
- SetOperand(cmd->ByteMode, &cmd->Op1, GetOperand(cmd->ByteMode, &cmd->Op2));
- SetOperand(cmd->ByteMode, &cmd->Op2, v1);
- }
- break;
- case CMD_MUL:
- {
- UInt32 res = GetOperand32(&cmd->Op1) * GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- }
- break;
- case CMD_MULB:
- {
- Byte res = GetOperand8(&cmd->Op1) * GetOperand8(&cmd->Op2);
- SetOperand8(&cmd->Op1, res);
- }
- break;
- case CMD_DIV:
- {
- UInt32 divider = GetOperand(cmd->ByteMode, &cmd->Op2);
- if (divider != 0)
- {
- UInt32 res = GetOperand(cmd->ByteMode, &cmd->Op1) / divider;
- SetOperand(cmd->ByteMode, &cmd->Op1, res);
- }
- }
- break;
-
- #endif
-
- case CMD_RET:
- {
- if (R[kStackRegIndex] >= kSpaceSize)
- return true;
- UInt32 ip = GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]);
- SET_IP(ip);
- R[kStackRegIndex] += 4;
- continue;
- }
- case CMD_PRINT:
- break;
- }
- cmd++;
- --maxOpCount;
- }
-}
-
-
-//////////////////////////////////////////////////////
-// Read program
-
-UInt32 ReadEncodedUInt32(CMemBitDecoder &inp)
-{
- switch(inp.ReadBits(2))
- {
- case 0:
- return inp.ReadBits(4);
- case 1:
- {
- UInt32 v = inp.ReadBits(4);
- if (v == 0)
- return 0xFFFFFF00 | inp.ReadBits(8);
- else
- return (v << 4) | inp.ReadBits(4);
- }
- case 2:
- return inp.ReadBits(16);
- default:
- return inp.ReadBits(32);
- }
-}
-
-void CVm::DecodeArg(CMemBitDecoder &inp, COperand &op, bool byteMode)
-{
- if (inp.ReadBit())
- {
- op.Type = OP_TYPE_REG;
- op.Data = inp.ReadBits(kNumRegBits);
- }
- else if (inp.ReadBit() == 0)
- {
- op.Type = OP_TYPE_INT;
- if (byteMode)
- op.Data = inp.ReadBits(8);
- else
- op.Data = ReadEncodedUInt32(inp);
- }
- else
- {
- op.Type = OP_TYPE_REGMEM;
- if (inp.ReadBit() == 0)
- {
- op.Data = inp.ReadBits(kNumRegBits);
- op.Base = 0;
- }
- else
- {
- if (inp.ReadBit() == 0)
- op.Data = inp.ReadBits(kNumRegBits);
- else
- op.Data = kNumRegs;
- op.Base = ReadEncodedUInt32(inp);
- }
- }
-}
-
-void CVm::ReadVmProgram(const Byte *code, UInt32 codeSize, CProgram *prg)
-{
- CMemBitDecoder inp;
- inp.Init(code, codeSize);
-
- prg->StaticData.Clear();
- if (inp.ReadBit())
- {
- UInt32 dataSize = ReadEncodedUInt32(inp) + 1;
- for (UInt32 i = 0; inp.Avail() && i < dataSize; i++)
- prg->StaticData.Add((Byte)inp.ReadBits(8));
- }
- while (inp.Avail())
- {
- prg->Commands.Add(CCommand());
- CCommand *cmd = &prg->Commands.Back();
- if (inp.ReadBit() == 0)
- cmd->OpCode = (ECommand)inp.ReadBits(3);
- else
- cmd->OpCode = (ECommand)(8 + inp.ReadBits(5));
- if (kCmdFlags[cmd->OpCode] & CF_BYTEMODE)
- cmd->ByteMode = (inp.ReadBit()) ? true : false;
- else
- cmd->ByteMode = 0;
- int opNum = (kCmdFlags[cmd->OpCode] & CF_OPMASK);
- if (opNum > 0)
- {
- DecodeArg(inp, cmd->Op1, cmd->ByteMode);
- if (opNum == 2)
- DecodeArg(inp, cmd->Op2, cmd->ByteMode);
- else
- {
- if (cmd->Op1.Type == OP_TYPE_INT && (kCmdFlags[cmd->OpCode] & (CF_JUMP | CF_PROC)))
- {
- int Distance = cmd->Op1.Data;
- if (Distance >= 256)
- Distance -= 256;
- else
- {
- if (Distance >= 136)
- Distance -= 264;
- else if (Distance >= 16)
- Distance -= 8;
- else if (Distance >= 8)
- Distance -= 16;
- Distance += prg->Commands.Size() - 1;
- }
- cmd->Op1.Data = Distance;
- }
- }
- }
- if (cmd->ByteMode)
- {
- switch (cmd->OpCode)
- {
- case CMD_MOV: cmd->OpCode = CMD_MOVB; break;
- case CMD_CMP: cmd->OpCode = CMD_CMPB; break;
- case CMD_ADD: cmd->OpCode = CMD_ADDB; break;
- case CMD_SUB: cmd->OpCode = CMD_SUBB; break;
- case CMD_INC: cmd->OpCode = CMD_INCB; break;
- case CMD_DEC: cmd->OpCode = CMD_DECB; break;
- case CMD_XOR: cmd->OpCode = CMD_XORB; break;
- case CMD_AND: cmd->OpCode = CMD_ANDB; break;
- case CMD_OR: cmd->OpCode = CMD_ORB; break;
- case CMD_TEST: cmd->OpCode = CMD_TESTB; break;
- case CMD_NEG: cmd->OpCode = CMD_NEGB; break;
- case CMD_SHL: cmd->OpCode = CMD_SHLB; break;
- case CMD_SHR: cmd->OpCode = CMD_SHRB; break;
- case CMD_SAR: cmd->OpCode = CMD_SARB; break;
- case CMD_MUL: cmd->OpCode = CMD_MULB; break;
- }
- }
- }
-}
-
-#ifdef RARVM_STANDARD_FILTERS
-
-enum EStandardFilter
-{
- SF_E8,
- SF_E8E9,
- SF_ITANIUM,
- SF_RGB,
- SF_AUDIO,
- SF_DELTA,
- SF_UPCASE
-};
-
-struct StandardFilterSignature
-{
- UInt32 Length;
- UInt32 CRC;
- EStandardFilter Type;
-}
-kStdFilters[]=
-{
- { 53, 0xad576887, SF_E8 },
- { 57, 0x3cd7e57e, SF_E8E9 },
- { 120, 0x3769893f, SF_ITANIUM },
- { 29, 0x0e06077d, SF_DELTA },
- { 149, 0x1c2c5dc8, SF_RGB },
- { 216, 0xbc85e701, SF_AUDIO },
- { 40, 0x46b9c560, SF_UPCASE }
-};
-
-static int FindStandardFilter(const Byte *code, UInt32 codeSize)
-{
- UInt32 crc = CrcCalc(code, codeSize);
- for (int i = 0; i < sizeof(kStdFilters) / sizeof(kStdFilters[0]); i++)
- {
- StandardFilterSignature &sfs = kStdFilters[i];
- if (sfs.CRC == crc && sfs.Length == codeSize)
- return i;
- }
- return -1;
-}
-
-#endif
-
-void CVm::PrepareProgram(const Byte *code, UInt32 codeSize, CProgram *prg)
-{
- Byte xorSum = 0;
- for (UInt32 i = 1; i < codeSize; i++)
- xorSum ^= code[i];
-
- prg->Commands.Clear();
- #ifdef RARVM_STANDARD_FILTERS
- prg->StandardFilterIndex = -1;
- #endif
-
- if (xorSum == code[0] && codeSize > 0)
- {
- #ifdef RARVM_STANDARD_FILTERS
- prg->StandardFilterIndex = FindStandardFilter(code, codeSize);
- if (prg->StandardFilterIndex >= 0)
- return;
- #endif
- // 1 byte for checksum
- ReadVmProgram(code + 1, codeSize - 1, prg);
- }
- prg->Commands.Add(CCommand());
- CCommand *cmd = &prg->Commands.Back();
- cmd->OpCode = CMD_RET;
-}
-
-void CVm::SetMemory(UInt32 pos, const Byte *data, UInt32 dataSize)
-{
- if (pos < kSpaceSize && data != Mem + pos)
- memmove(Mem + pos, data, MyMin(dataSize, kSpaceSize - pos));
-}
-
-#ifdef RARVM_STANDARD_FILTERS
-
-static void E8E9Decode(Byte *data, UInt32 dataSize, UInt32 fileOffset, bool e9)
-{
- if (dataSize <= 4)
- return;
- dataSize -= 4;
- const UInt32 kFileSize = 0x1000000;
- Byte cmpByte2 = (e9 ? 0xE9 : 0xE8);
- for (UInt32 curPos = 0; curPos < dataSize;)
- {
- Byte curByte = *(data++);
- curPos++;
- if (curByte == 0xE8 || curByte == cmpByte2)
- {
- UInt32 offset = curPos + fileOffset;
- UInt32 addr = (Int32)GetValue32(data);
- if (addr < kFileSize)
- SetValue32(data, addr - offset);
- else if ((Int32)addr < 0 && (Int32)(addr + offset) >= 0)
- SetValue32(data, addr + kFileSize);
- data += 4;
- curPos += 4;
- }
- }
-}
-
-static inline UInt32 ItaniumGetOpType(const Byte *data, int bitPos)
-{
- return (data[(unsigned int)bitPos >> 3] >> (bitPos & 7)) & 0xF;
-}
-
-
-static void ItaniumDecode(Byte *data, UInt32 dataSize, UInt32 fileOffset)
-{
- UInt32 curPos = 0;
- fileOffset >>= 4;
- while (curPos < dataSize - 21)
- {
- int b = (data[0] & 0x1F) - 0x10;
- if (b >= 0)
- {
- static Byte kCmdMasks[16] = {4,4,6,6,0,0,7,7,4,4,0,0,4,4,0,0};
- Byte cmdMask = kCmdMasks[b];
- if (cmdMask != 0)
- for (int i = 0; i < 3; i++)
- if (cmdMask & (1 << i))
- {
- int startPos = i * 41 + 18;
- if (ItaniumGetOpType(data, startPos + 24) == 5)
- {
- const UInt32 kMask = 0xFFFFF;
- Byte *p = data + ((unsigned int)startPos >> 3);
- UInt32 bitField = ((UInt32)p[0]) | ((UInt32)p[1] << 8) | ((UInt32)p[2] << 16);
- int inBit = (startPos & 7);
- UInt32 offset = (bitField >> inBit) & kMask;
- UInt32 andMask = ~(kMask << inBit);
- bitField = ((offset - fileOffset) & kMask) << inBit;
- for (int j = 0; j < 3; j++)
- {
- p[j] &= andMask;
- p[j] |= bitField;
- andMask >>= 8;
- bitField >>= 8;
- }
- }
- }
- }
- data += 16;
- curPos += 16;
- fileOffset++;
- }
-}
-
-static void DeltaDecode(Byte *data, UInt32 dataSize, UInt32 numChannels)
-{
- UInt32 srcPos = 0;
- UInt32 border = dataSize * 2;
- for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)
- {
- Byte prevByte = 0;
- for (UInt32 destPos = dataSize + curChannel; destPos < border; destPos += numChannels)
- data[destPos] = (prevByte = prevByte - data[srcPos++]);
- }
-}
-
-static void RgbDecode(Byte *srcData, UInt32 dataSize, UInt32 width, UInt32 posR)
-{
- Byte *destData = srcData + dataSize;
- const UInt32 numChannels = 3;
- for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)
- {
- Byte prevByte = 0;
-
- for (UInt32 i = curChannel; i < dataSize; i+= numChannels)
- {
- unsigned int predicted;
- if (i < width)
- predicted = prevByte;
- else
- {
- unsigned int upperLeftByte = destData[i - width];
- unsigned int upperByte = destData[i - width + 3];
- predicted = prevByte + upperByte - upperLeftByte;
- int pa = abs((int)(predicted - prevByte));
- int pb = abs((int)(predicted - upperByte));
- int pc = abs((int)(predicted - upperLeftByte));
- if (pa <= pb && pa <= pc)
- predicted = prevByte;
- else
- if (pb <= pc)
- predicted = upperByte;
- else
- predicted = upperLeftByte;
- }
- destData[i] = prevByte = (Byte)(predicted - *(srcData++));
- }
- }
- if (dataSize < 3)
- return;
- for (UInt32 i = posR, border = dataSize - 2; i < border; i += 3)
- {
- Byte g = destData[i + 1];
- destData[i] = destData[i] + g;
- destData[i + 2] = destData[i + 2] + g;
- }
-}
-
-static void AudioDecode(Byte *srcData, UInt32 dataSize, UInt32 numChannels)
-{
- Byte *destData = srcData + dataSize;
- for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)
- {
- UInt32 prevByte = 0, prevDelta = 0, dif[7];
- Int32 D1 = 0, D2 = 0, D3;
- Int32 K1 = 0, K2 = 0, K3 = 0;
- memset(dif, 0, sizeof(dif));
-
- for (UInt32 i = curChannel, byteCount = 0; i < dataSize; i += numChannels, byteCount++)
- {
- D3 = D2;
- D2 = prevDelta - D1;
- D1 = prevDelta;
-
- UInt32 predicted = 8 * prevByte + K1 * D1 + K2 * D2 + K3 * D3;
- predicted = (predicted >> 3) & 0xFF;
-
- UInt32 curByte = *(srcData++);
-
- predicted -= curByte;
- destData[i] = (Byte)predicted;
- prevDelta = (UInt32)(Int32)(signed char)(predicted - prevByte);
- prevByte = predicted;
-
- Int32 D = ((Int32)(signed char)curByte) << 3;
-
- dif[0] += abs(D);
- dif[1] += abs(D - D1);
- dif[2] += abs(D + D1);
- dif[3] += abs(D - D2);
- dif[4] += abs(D + D2);
- dif[5] += abs(D - D3);
- dif[6] += abs(D + D3);
-
- if ((byteCount & 0x1F) == 0)
- {
- UInt32 minDif = dif[0], numMinDif = 0;
- dif[0] = 0;
- for (int j = 1; j < sizeof(dif) / sizeof(dif[0]); j++)
- {
- if (dif[j] < minDif)
- {
- minDif = dif[j];
- numMinDif = j;
- }
- dif[j] = 0;
- }
- switch (numMinDif)
- {
- case 1: if (K1 >= -16) K1--; break;
- case 2: if (K1 < 16) K1++; break;
- case 3: if (K2 >= -16) K2--; break;
- case 4: if (K2 < 16) K2++; break;
- case 5: if (K3 >= -16) K3--; break;
- case 6: if (K3 < 16) K3++; break;
- }
- }
- }
- }
-}
-
-static UInt32 UpCaseDecode(Byte *data, UInt32 dataSize)
-{
- UInt32 srcPos = 0, destPos = dataSize;
- while (srcPos < dataSize)
- {
- Byte curByte = data[srcPos++];
- if (curByte == 2 && (curByte = data[srcPos++]) != 2)
- curByte -= 32;
- data[destPos++] = curByte;
- }
- return destPos - dataSize;
-}
-
-void CVm::ExecuteStandardFilter(int filterIndex)
-{
- UInt32 dataSize = R[4];
- if (dataSize >= kGlobalOffset)
- return;
- EStandardFilter filterType = kStdFilters[filterIndex].Type;
-
- switch (filterType)
- {
- case SF_E8:
- case SF_E8E9:
- E8E9Decode(Mem, dataSize, R[6], (filterType == SF_E8E9));
- break;
- case SF_ITANIUM:
- ItaniumDecode(Mem, dataSize, R[6]);
- break;
- case SF_DELTA:
- if (dataSize >= kGlobalOffset / 2)
- break;
- SetBlockPos(dataSize);
- DeltaDecode(Mem, dataSize, R[0]);
- break;
- case SF_RGB:
- if (dataSize >= kGlobalOffset / 2)
- break;
- {
- UInt32 width = R[0];
- if (width <= 3)
- break;
- SetBlockPos(dataSize);
- RgbDecode(Mem, dataSize, width, R[1]);
- }
- break;
- case SF_AUDIO:
- if (dataSize >= kGlobalOffset / 2)
- break;
- SetBlockPos(dataSize);
- AudioDecode(Mem, dataSize, R[0]);
- break;
- case SF_UPCASE:
- if (dataSize >= kGlobalOffset / 2)
- break;
- UInt32 destSize = UpCaseDecode(Mem, dataSize);
- SetBlockSize(destSize);
- SetBlockPos(dataSize);
- break;
- }
-}
-
-#endif
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Vm.h b/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Vm.h
deleted file mode 100644
index c02534c61..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/Rar3Vm.h
+++ /dev/null
@@ -1,179 +0,0 @@
-// Rar3Vm.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#ifndef __COMPRESS_RAR3_VM_H
-#define __COMPRESS_RAR3_VM_H
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/MyVector.h"
-#include "Common/Types.h"
-
-#define RARVM_STANDARD_FILTERS
-
-namespace NCompress {
-namespace NRar3 {
-
-class CMemBitDecoder
-{
- const Byte *_data;
- UInt32 _bitSize;
- UInt32 _bitPos;
-public:
- void Init(const Byte *data, UInt32 byteSize)
- {
- _data = data;
- _bitSize = (byteSize << 3);
- _bitPos = 0;
- }
- UInt32 ReadBits(int numBits);
- UInt32 ReadBit();
- bool Avail() const { return (_bitPos < _bitSize); }
-};
-
-namespace NVm {
-
-inline UInt32 GetValue32(const void *addr) { return GetUi32(addr); }
-inline void SetValue32(void *addr, UInt32 value) { SetUi32(addr, value); }
-
-UInt32 ReadEncodedUInt32(CMemBitDecoder &inp);
-
-const int kNumRegBits = 3;
-const UInt32 kNumRegs = 1 << kNumRegBits;
-const UInt32 kNumGpRegs = kNumRegs - 1;
-
-const UInt32 kSpaceSize = 0x40000;
-const UInt32 kSpaceMask = kSpaceSize -1;
-const UInt32 kGlobalOffset = 0x3C000;
-const UInt32 kGlobalSize = 0x2000;
-const UInt32 kFixedGlobalSize = 64;
-
-namespace NGlobalOffset
-{
- const UInt32 kBlockSize = 0x1C;
- const UInt32 kBlockPos = 0x20;
- const UInt32 kExecCount = 0x2C;
- const UInt32 kGlobalMemOutSize = 0x30;
-}
-
-enum ECommand
-{
- CMD_MOV, CMD_CMP, CMD_ADD, CMD_SUB, CMD_JZ, CMD_JNZ, CMD_INC, CMD_DEC,
- CMD_JMP, CMD_XOR, CMD_AND, CMD_OR, CMD_TEST, CMD_JS, CMD_JNS, CMD_JB,
- CMD_JBE, CMD_JA, CMD_JAE, CMD_PUSH, CMD_POP, CMD_CALL, CMD_RET, CMD_NOT,
- CMD_SHL, CMD_SHR, CMD_SAR, CMD_NEG, CMD_PUSHA,CMD_POPA, CMD_PUSHF,CMD_POPF,
- CMD_MOVZX,CMD_MOVSX,CMD_XCHG, CMD_MUL, CMD_DIV, CMD_ADC, CMD_SBB, CMD_PRINT,
-
- CMD_MOVB, CMD_CMPB, CMD_ADDB, CMD_SUBB, CMD_INCB, CMD_DECB,
- CMD_XORB, CMD_ANDB, CMD_ORB, CMD_TESTB,CMD_NEGB,
- CMD_SHLB, CMD_SHRB, CMD_SARB, CMD_MULB
-};
-
-enum EOpType {OP_TYPE_REG, OP_TYPE_INT, OP_TYPE_REGMEM, OP_TYPE_NONE};
-
-// Addr in COperand object can link (point) to CVm object!!!
-
-struct COperand
-{
- EOpType Type;
- UInt32 Data;
- UInt32 Base;
- COperand(): Type(OP_TYPE_NONE), Data(0), Base(0) {}
-};
-
-struct CCommand
-{
- ECommand OpCode;
- bool ByteMode;
- COperand Op1, Op2;
-};
-
-struct CBlockRef
-{
- UInt32 Offset;
- UInt32 Size;
-};
-
-struct CProgram
-{
- CRecordVector<CCommand> Commands;
- #ifdef RARVM_STANDARD_FILTERS
- int StandardFilterIndex;
- #endif
- CRecordVector<Byte> StaticData;
-};
-
-struct CProgramInitState
-{
- UInt32 InitR[kNumGpRegs];
- CRecordVector<Byte> GlobalData;
-
- void AllocateEmptyFixedGlobal()
- {
- GlobalData.Clear();
- GlobalData.Reserve(NVm::kFixedGlobalSize);
- for (UInt32 i = 0; i < NVm::kFixedGlobalSize; i++)
- GlobalData.Add(0);
- }
-};
-
-class CVm
-{
- static UInt32 GetValue(bool byteMode, const void *addr)
- {
- if (byteMode)
- return(*(const Byte *)addr);
- else
- return GetUi32(addr);
- }
-
- static void SetValue(bool byteMode, void *addr, UInt32 value)
- {
- if (byteMode)
- *(Byte *)addr = (Byte)value;
- else
- SetUi32(addr, value);
- }
-
- UInt32 GetFixedGlobalValue32(UInt32 globalOffset) { return GetValue(false, &Mem[kGlobalOffset + globalOffset]); }
-
- void SetBlockSize(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockSize], v); }
- void SetBlockPos(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockPos], v); }
-public:
- static void SetValue(void *addr, UInt32 value) { SetValue(false, addr, value); }
-private:
- UInt32 GetOperand32(const COperand *op) const;
- void SetOperand32(const COperand *op, UInt32 val);
- Byte GetOperand8(const COperand *op) const;
- void SetOperand8(const COperand *op, Byte val);
- UInt32 GetOperand(bool byteMode, const COperand *op) const;
- void SetOperand(bool byteMode, const COperand *op, UInt32 val);
-
- void DecodeArg(CMemBitDecoder &inp, COperand &op, bool byteMode);
-
- bool ExecuteCode(const CProgram *prg);
-
- #ifdef RARVM_STANDARD_FILTERS
- void ExecuteStandardFilter(int filterIndex);
- #endif
-
- Byte *Mem;
- UInt32 R[kNumRegs + 1]; // R[kNumRegs] = 0 always (speed optimization)
- UInt32 Flags;
- void ReadVmProgram(const Byte *code, UInt32 codeSize, CProgram *prg);
-public:
- CVm();
- ~CVm();
- bool Create();
- void PrepareProgram(const Byte *code, UInt32 codeSize, CProgram *prg);
- void SetMemory(UInt32 pos, const Byte *data, UInt32 dataSize);
- bool Execute(CProgram *prg, const CProgramInitState *initState,
- CBlockRef &outBlockRef, CRecordVector<Byte> &outGlobalData);
- const Byte *GetDataPointer(UInt32 offset) const { return Mem + offset; }
-
-};
-
-#endif
-
-}}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/RarCodecsRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/RarCodecsRegister.cpp
deleted file mode 100644
index e3f6a05c4..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/RarCodecsRegister.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// RarCodecsRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "Rar1Decoder.h"
-#include "Rar2Decoder.h"
-#include "Rar3Decoder.h"
-
-#define CREATE_CODEC(x) static void *CreateCodec ## x() { return (void *)(ICompressCoder *)(new NCompress::NRar ## x::CDecoder); }
-
-CREATE_CODEC(1)
-CREATE_CODEC(2)
-CREATE_CODEC(3)
-
-#define RAR_CODEC(x, name) { CreateCodec ## x, 0, 0x040300 + x, L"Rar" name, 1, false }
-
-static CCodecInfo g_CodecsInfo[] =
-{
- RAR_CODEC(1, L"1"),
- RAR_CODEC(2, L"2"),
- RAR_CODEC(3, L"3"),
-};
-
-REGISTER_CODECS(Rar)
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ShrinkDecoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/ShrinkDecoder.cpp
deleted file mode 100644
index a89d323c6..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ShrinkDecoder.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-// ShrinkDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/OutBuffer.h"
-
-#include "BitlDecoder.h"
-#include "ShrinkDecoder.h"
-
-namespace NCompress {
-namespace NShrink {
-
-static const UInt32 kBufferSize = (1 << 20);
-static const int kNumMinBits = 9;
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- NBitl::CBaseDecoder<CInBuffer> inBuffer;
- COutBuffer outBuffer;
-
- if (!inBuffer.Create(kBufferSize))
- return E_OUTOFMEMORY;
- inBuffer.SetStream(inStream);
- inBuffer.Init();
-
- if (!outBuffer.Create(kBufferSize))
- return E_OUTOFMEMORY;
- outBuffer.SetStream(outStream);
- outBuffer.Init();
-
- UInt64 prevPos = 0;
- int numBits = kNumMinBits;
- UInt32 head = 257;
- bool needPrev = false;
- UInt32 lastSymbol = 0;
-
- int i;
- for (i = 0; i < kNumItems; i++)
- _parents[i] = 0;
- for (i = 0; i < kNumItems; i++)
- _suffixes[i] = 0;
- for (i = 0; i < 257; i++)
- _isFree[i] = false;
- for (; i < kNumItems; i++)
- _isFree[i] = true;
-
- for (;;)
- {
- UInt32 symbol = inBuffer.ReadBits(numBits);
- if (inBuffer.ExtraBitsWereRead())
- break;
- if (_isFree[symbol])
- return S_FALSE;
- if (symbol == 256)
- {
- UInt32 symbol = inBuffer.ReadBits(numBits);
- if (symbol == 1)
- {
- if (numBits < kNumMaxBits)
- numBits++;
- }
- else if (symbol == 2)
- {
- if (needPrev)
- _isFree[head - 1] = true;
- for (i = 257; i < kNumItems; i++)
- _isParent[i] = false;
- for (i = 257; i < kNumItems; i++)
- if (!_isFree[i])
- _isParent[_parents[i]] = true;
- for (i = 257; i < kNumItems; i++)
- if (!_isParent[i])
- _isFree[i] = true;
- head = 257;
- while (head < kNumItems && !_isFree[head])
- head++;
- if (head < kNumItems)
- {
- needPrev = true;
- _isFree[head] = false;
- _parents[head] = (UInt16)lastSymbol;
- head++;
- }
- }
- else
- return S_FALSE;
- continue;
- }
- UInt32 cur = symbol;
- i = 0;
- int corectionIndex = -1;
- while (cur >= 256)
- {
- if (cur == head - 1)
- corectionIndex = i;
- _stack[i++] = _suffixes[cur];
- cur = _parents[cur];
- }
- _stack[i++] = (Byte)cur;
- if (needPrev)
- {
- _suffixes[head - 1] = (Byte)cur;
- if (corectionIndex >= 0)
- _stack[corectionIndex] = (Byte)cur;
- }
- while (i > 0)
- outBuffer.WriteByte((_stack[--i]));
- while (head < kNumItems && !_isFree[head])
- head++;
- if (head < kNumItems)
- {
- needPrev = true;
- _isFree[head] = false;
- _parents[head] = (UInt16)symbol;
- head++;
- }
- else
- needPrev = false;
- lastSymbol = symbol;
-
- UInt64 nowPos = outBuffer.GetProcessedSize();
- if (progress != NULL && nowPos - prevPos > (1 << 18))
- {
- prevPos = nowPos;
- UInt64 packSize = inBuffer.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &nowPos));
- }
- }
- return outBuffer.Flush();
-}
-
-STDMETHODIMP CDecoder ::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const COutBufferException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ShrinkDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/ShrinkDecoder.h
deleted file mode 100644
index 9bbecd41b..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ShrinkDecoder.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// ShrinkDecoder.h
-
-#ifndef __COMPRESS_SHRINK_DECODER_H
-#define __COMPRESS_SHRINK_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NShrink {
-
-const int kNumMaxBits = 13;
-const UInt32 kNumItems = 1 << kNumMaxBits;
-
-class CDecoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- UInt16 _parents[kNumItems];
- Byte _suffixes[kNumItems];
- Byte _stack[kNumItems];
- bool _isFree[kNumItems];
- bool _isParent[kNumItems];
-
-public:
- MY_UNKNOWN_IMP
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ZDecoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/ZDecoder.cpp
deleted file mode 100644
index e28c64518..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ZDecoder.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-// ZDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/OutBuffer.h"
-
-#include "ZDecoder.h"
-
-namespace NCompress {
-namespace NZ {
-
-static const UInt32 kBufferSize = (1 << 20);
-static const Byte kNumBitsMask = 0x1F;
-static const Byte kBlockModeMask = 0x80;
-static const int kNumMinBits = 9;
-static const int kNumMaxBits = 16;
-
-void CDecoder::Free()
-{
- MyFree(_parents); _parents = 0;
- MyFree(_suffixes); _suffixes = 0;
- MyFree(_stack); _stack = 0;
-}
-
-CDecoder::~CDecoder() { Free(); }
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- CInBuffer inBuffer;
- COutBuffer outBuffer;
-
- if (!inBuffer.Create(kBufferSize))
- return E_OUTOFMEMORY;
- inBuffer.SetStream(inStream);
- inBuffer.Init();
-
- if (!outBuffer.Create(kBufferSize))
- return E_OUTOFMEMORY;
- outBuffer.SetStream(outStream);
- outBuffer.Init();
-
- int maxbits = _properties & kNumBitsMask;
- if (maxbits < kNumMinBits || maxbits > kNumMaxBits)
- return S_FALSE;
- UInt32 numItems = 1 << maxbits;
- bool blockMode = ((_properties & kBlockModeMask) != 0);
-
- if (maxbits != _numMaxBits || _parents == 0 || _suffixes == 0 || _stack == 0)
- {
- Free();
- _parents = (UInt16 *)MyAlloc(numItems * sizeof(UInt16)); if (_parents == 0) return E_OUTOFMEMORY;
- _suffixes = (Byte *)MyAlloc(numItems * sizeof(Byte)); if (_suffixes == 0) return E_OUTOFMEMORY;
- _stack = (Byte *)MyAlloc(numItems * sizeof(Byte)); if (_stack == 0) return E_OUTOFMEMORY;
- _numMaxBits = maxbits;
- }
-
- UInt64 prevPos = 0;
- int numBits = kNumMinBits;
- UInt32 head = blockMode ? 257 : 256;
-
- bool needPrev = false;
-
- unsigned bitPos = 0;
- unsigned numBufBits = 0;
-
- Byte buf[kNumMaxBits + 4];
-
- _parents[256] = 0; // virus protection
- _suffixes[256] = 0;
-
- for (;;)
- {
- if (numBufBits == bitPos)
- {
- numBufBits = (unsigned)inBuffer.ReadBytes(buf, numBits) * 8;
- bitPos = 0;
- UInt64 nowPos = outBuffer.GetProcessedSize();
- if (progress != NULL && nowPos - prevPos >= (1 << 18))
- {
- prevPos = nowPos;
- UInt64 packSize = inBuffer.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &nowPos));
- }
- }
- unsigned bytePos = bitPos >> 3;
- UInt32 symbol = buf[bytePos] | ((UInt32)buf[bytePos + 1] << 8) | ((UInt32)buf[bytePos + 2] << 16);
- symbol >>= (bitPos & 7);
- symbol &= (1 << numBits) - 1;
- bitPos += numBits;
- if (bitPos > numBufBits)
- break;
- if (symbol >= head)
- return S_FALSE;
- if (blockMode && symbol == 256)
- {
- numBufBits = bitPos = 0;
- numBits = kNumMinBits;
- head = 257;
- needPrev = false;
- continue;
- }
- UInt32 cur = symbol;
- int i = 0;
- while (cur >= 256)
- {
- _stack[i++] = _suffixes[cur];
- cur = _parents[cur];
- }
- _stack[i++] = (Byte)cur;
- if (needPrev)
- {
- _suffixes[head - 1] = (Byte)cur;
- if (symbol == head - 1)
- _stack[0] = (Byte)cur;
- }
- do
- outBuffer.WriteByte((_stack[--i]));
- while (i > 0);
- if (head < numItems)
- {
- needPrev = true;
- _parents[head++] = (UInt16)symbol;
- if (head > ((UInt32)1 << numBits))
- {
- if (numBits < maxbits)
- {
- numBufBits = bitPos = 0;
- numBits++;
- }
- }
- }
- else
- needPrev = false;
- }
- return outBuffer.Flush();
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const COutBufferException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size < 1)
- return E_INVALIDARG;
- _properties = data[0];
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ZDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/ZDecoder.h
deleted file mode 100644
index 2bd83a177..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ZDecoder.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// ZDecoder.h
-
-#ifndef __COMPRESS_Z_DECODER_H
-#define __COMPRESS_Z_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NZ {
-
-class CDecoder:
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public CMyUnknownImp
-{
- UInt16 *_parents;
- Byte *_suffixes;
- Byte *_stack;
- Byte _properties;
- int _numMaxBits;
-
-public:
- CDecoder(): _parents(0), _suffixes(0), _stack(0), _properties(0), _numMaxBits(0) {};
- ~CDecoder();
- void Free();
-
- MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ZlibDecoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/ZlibDecoder.cpp
deleted file mode 100644
index 90d6715db..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ZlibDecoder.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-// ZlibDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "ZlibDecoder.h"
-
-namespace NCompress {
-namespace NZlib {
-
-#define DEFLATE_TRY_BEGIN try {
-#define DEFLATE_TRY_END } catch(...) { return S_FALSE; }
-
-#define ADLER_MOD 65521
-#define ADLER_LOOP_MAX 5550
-
-UInt32 Adler32_Update(UInt32 adler, const Byte *buf, size_t size)
-{
- UInt32 a = adler & 0xFFFF;
- UInt32 b = (adler >> 16) & 0xFFFF;
- while (size > 0)
- {
- unsigned curSize = (size > ADLER_LOOP_MAX) ? ADLER_LOOP_MAX : (unsigned )size;
- unsigned i;
- for (i = 0; i < curSize; i++)
- {
- a += buf[i];
- b += a;
- }
- buf += curSize;
- size -= curSize;
- a %= ADLER_MOD;
- b %= ADLER_MOD;
- }
- return (b << 16) + a;
-}
-
-STDMETHODIMP COutStreamWithAdler::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- HRESULT result = _stream->Write(data, size, &size);
- _adler = Adler32_Update(_adler, (const Byte *)data, size);
- if (processedSize != NULL)
- *processedSize = size;
- return result;
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- DEFLATE_TRY_BEGIN
- if (!AdlerStream)
- AdlerStream = AdlerSpec = new COutStreamWithAdler;
- if (!DeflateDecoder)
- {
- DeflateDecoderSpec = new NDeflate::NDecoder::CCOMCoder;
- DeflateDecoderSpec->ZlibMode = true;
- DeflateDecoder = DeflateDecoderSpec;
- }
-
- Byte buf[2];
- RINOK(ReadStream_FALSE(inStream, buf, 2));
- int method = buf[0] & 0xF;
- if (method != 8)
- return S_FALSE;
- // int dicSize = buf[0] >> 4;
- if ((((UInt32)buf[0] << 8) + buf[1]) % 31 != 0)
- return S_FALSE;
- if ((buf[1] & 0x20) != 0) // dictPresent
- return S_FALSE;
- // int level = (buf[1] >> 6);
-
- AdlerSpec->SetStream(outStream);
- AdlerSpec->Init();
- HRESULT res = DeflateDecoder->Code(inStream, AdlerStream, inSize, outSize, progress);
- AdlerSpec->ReleaseStream();
-
- if (res == S_OK)
- {
- const Byte *p = DeflateDecoderSpec->ZlibFooter;
- UInt32 adler = ((UInt32)p[0] << 24) | ((UInt32)p[1] << 16) | ((UInt32)p[2] << 8) | p[3];
- if (adler != AdlerSpec->GetAdler())
- return S_FALSE;
- }
- return res;
- DEFLATE_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ZlibDecoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/ZlibDecoder.h
deleted file mode 100644
index 95c110022..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ZlibDecoder.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// ZlibDecoder.h
-
-#ifndef __ZLIB_DECODER_H
-#define __ZLIB_DECODER_H
-
-#include "DeflateDecoder.h"
-
-namespace NCompress {
-namespace NZlib {
-
-const UInt32 ADLER_INIT_VAL = 1;
-
-class COutStreamWithAdler:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialOutStream> _stream;
- UInt32 _adler;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- void SetStream(ISequentialOutStream *stream) { _stream = stream; }
- void ReleaseStream() { _stream.Release(); }
- void Init() { _adler = ADLER_INIT_VAL; }
- UInt32 GetAdler() const { return _adler; }
-};
-
-class CDecoder:
- public ICompressCoder,
- public CMyUnknownImp
-{
- COutStreamWithAdler *AdlerSpec;
- CMyComPtr<ISequentialOutStream> AdlerStream;
-
- NCompress::NDeflate::NDecoder::CCOMCoder *DeflateDecoderSpec;
- CMyComPtr<ICompressCoder> DeflateDecoder;
-public:
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- UInt64 GetInputProcessedSize() const { return DeflateDecoderSpec->GetInputProcessedSize() + 2; }
-
- MY_UNKNOWN_IMP
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ZlibEncoder.cpp b/src/libs/7zip/unix/CPP/7zip/Compress/ZlibEncoder.cpp
deleted file mode 100644
index 09235c337..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ZlibEncoder.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-// ZlibEncoder.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "ZlibEncoder.h"
-
-namespace NCompress {
-namespace NZlib {
-
-#define DEFLATE_TRY_BEGIN try {
-#define DEFLATE_TRY_END } catch(...) { return S_FALSE; }
-
-UInt32 Adler32_Update(UInt32 adler, const Byte *buf, size_t size);
-
-STDMETHODIMP CInStreamWithAdler::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- HRESULT result = _stream->Read(data, size, &size);
- _adler = Adler32_Update(_adler, (const Byte *)data, size);
- _size += size;
- if (processedSize != NULL)
- *processedSize = size;
- return result;
-}
-
-void CEncoder::Create()
-{
- if (!DeflateEncoder)
- DeflateEncoder = DeflateEncoderSpec = new NDeflate::NEncoder::CCOMCoder;
-}
-
-STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- DEFLATE_TRY_BEGIN
- if (!AdlerStream)
- AdlerStream = AdlerSpec = new CInStreamWithAdler;
- Create();
-
- {
- Byte buf[2] = { 0x78, 0xDA };
- RINOK(WriteStream(outStream, buf, 2));
- }
-
- AdlerSpec->SetStream(inStream);
- AdlerSpec->Init();
- HRESULT res = DeflateEncoder->Code(AdlerStream, outStream, inSize, NULL, progress);
- AdlerSpec->ReleaseStream();
-
- RINOK(res);
-
- {
- UInt32 a = AdlerSpec->GetAdler();
- Byte buf[4] = { (Byte)(a >> 24), (Byte)(a >> 16), (Byte)(a >> 8), (Byte)(a) };
- return WriteStream(outStream, buf, 4);
- }
- DEFLATE_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Compress/ZlibEncoder.h b/src/libs/7zip/unix/CPP/7zip/Compress/ZlibEncoder.h
deleted file mode 100644
index 621cc1d08..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Compress/ZlibEncoder.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// ZlibEncoder.h
-
-#ifndef __ZLIB_ENCODER_H
-#define __ZLIB_ENCODER_H
-
-#include "DeflateEncoder.h"
-
-namespace NCompress {
-namespace NZlib {
-
-class CInStreamWithAdler:
- public ISequentialInStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialInStream> _stream;
- UInt32 _adler;
- UInt64 _size;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- void SetStream(ISequentialInStream *stream) { _stream = stream; }
- void ReleaseStream() { _stream.Release(); }
- void Init() { _adler = 1; _size = 0; } // ADLER_INIT_VAL
- UInt32 GetAdler() const { return _adler; }
- UInt64 GetSize() const { return _size; }
-};
-
-class CEncoder:
- public ICompressCoder,
- public CMyUnknownImp
-{
- CInStreamWithAdler *AdlerSpec;
- CMyComPtr<ISequentialInStream> AdlerStream;
- CMyComPtr<ICompressCoder> DeflateEncoder;
-public:
- NCompress::NDeflate::NEncoder::CCOMCoder *DeflateEncoderSpec;
-
- void Create();
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- UInt64 GetInputProcessedSize() const { return AdlerSpec->GetSize(); }
-
- MY_UNKNOWN_IMP
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/7zAes.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/7zAes.cpp
deleted file mode 100644
index b686fb61f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/7zAes.cpp
+++ /dev/null
@@ -1,244 +0,0 @@
-// 7zAes.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Sha256.h"
-
-#include "Windows/Synchronization.h"
-
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "7zAes.h"
-#include "MyAes.h"
-
-#ifndef EXTRACT_ONLY
-#include "RandGen.h"
-#endif
-
-using namespace NWindows;
-
-namespace NCrypto {
-namespace NSevenZ {
-
-bool CKeyInfo::IsEqualTo(const CKeyInfo &a) const
-{
- if (SaltSize != a.SaltSize || NumCyclesPower != a.NumCyclesPower)
- return false;
- for (UInt32 i = 0; i < SaltSize; i++)
- if (Salt[i] != a.Salt[i])
- return false;
- return (Password == a.Password);
-}
-
-void CKeyInfo::CalculateDigest()
-{
- if (NumCyclesPower == 0x3F)
- {
- UInt32 pos;
- for (pos = 0; pos < SaltSize; pos++)
- Key[pos] = Salt[pos];
- for (UInt32 i = 0; i < Password.GetCapacity() && pos < kKeySize; i++)
- Key[pos++] = Password[i];
- for (; pos < kKeySize; pos++)
- Key[pos] = 0;
- }
- else
- {
- CSha256 sha;
- Sha256_Init(&sha);
- const UInt64 numRounds = (UInt64)1 << NumCyclesPower;
- Byte temp[8] = { 0,0,0,0,0,0,0,0 };
- for (UInt64 round = 0; round < numRounds; round++)
- {
- Sha256_Update(&sha, Salt, (size_t)SaltSize);
- Sha256_Update(&sha, Password, Password.GetCapacity());
- Sha256_Update(&sha, temp, 8);
- for (int i = 0; i < 8; i++)
- if (++(temp[i]) != 0)
- break;
- }
- Sha256_Final(&sha, Key);
- }
-}
-
-bool CKeyInfoCache::Find(CKeyInfo &key)
-{
- for (int i = 0; i < Keys.Size(); i++)
- {
- const CKeyInfo &cached = Keys[i];
- if (key.IsEqualTo(cached))
- {
- for (int j = 0; j < kKeySize; j++)
- key.Key[j] = cached.Key[j];
- if (i != 0)
- {
- Keys.Insert(0, cached);
- Keys.Delete(i+1);
- }
- return true;
- }
- }
- return false;
-}
-
-void CKeyInfoCache::Add(CKeyInfo &key)
-{
- if (Find(key))
- return;
- if (Keys.Size() >= Size)
- Keys.DeleteBack();
- Keys.Insert(0, key);
-}
-
-static CKeyInfoCache g_GlobalKeyCache(32);
-static NSynchronization::CCriticalSection g_GlobalKeyCacheCriticalSection;
-
-CBase::CBase():
- _cachedKeys(16),
- _ivSize(0)
-{
- for (int i = 0; i < sizeof(_iv); i++)
- _iv[i] = 0;
-}
-
-void CBase::CalculateDigest()
-{
- NSynchronization::CCriticalSectionLock lock(g_GlobalKeyCacheCriticalSection);
- if (_cachedKeys.Find(_key))
- g_GlobalKeyCache.Add(_key);
- else
- {
- if (!g_GlobalKeyCache.Find(_key))
- {
- _key.CalculateDigest();
- g_GlobalKeyCache.Add(_key);
- }
- _cachedKeys.Add(_key);
- }
-}
-
-#ifndef EXTRACT_ONLY
-
-/*
-STDMETHODIMP CEncoder::ResetSalt()
-{
- _key.SaltSize = 4;
- g_RandomGenerator.Generate(_key.Salt, _key.SaltSize);
- return S_OK;
-}
-*/
-
-STDMETHODIMP CEncoder::ResetInitVector()
-{
- _ivSize = 8;
- g_RandomGenerator.Generate(_iv, (unsigned)_ivSize);
- return S_OK;
-}
-
-STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
-{
- // _key.Init();
- for (UInt32 i = _ivSize; i < sizeof(_iv); i++)
- _iv[i] = 0;
-
- UInt32 ivSize = _ivSize;
-
- // _key.NumCyclesPower = 0x3F;
- _key.NumCyclesPower = 19;
-
- Byte firstByte = (Byte)(_key.NumCyclesPower |
- (((_key.SaltSize == 0) ? 0 : 1) << 7) |
- (((ivSize == 0) ? 0 : 1) << 6));
- RINOK(outStream->Write(&firstByte, 1, NULL));
- if (_key.SaltSize == 0 && ivSize == 0)
- return S_OK;
- Byte saltSizeSpec = (Byte)((_key.SaltSize == 0) ? 0 : (_key.SaltSize - 1));
- Byte ivSizeSpec = (Byte)((ivSize == 0) ? 0 : (ivSize - 1));
- Byte secondByte = (Byte)(((saltSizeSpec) << 4) | ivSizeSpec);
- RINOK(outStream->Write(&secondByte, 1, NULL));
- if (_key.SaltSize > 0)
- {
- RINOK(WriteStream(outStream, _key.Salt, _key.SaltSize));
- }
- if (ivSize > 0)
- {
- RINOK(WriteStream(outStream, _iv, ivSize));
- }
- return S_OK;
-}
-
-HRESULT CEncoder::CreateFilter()
-{
- _aesFilter = new CAesCbcEncoder;
- return S_OK;
-}
-
-#endif
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- _key.Init();
- UInt32 i;
- for (i = 0; i < sizeof(_iv); i++)
- _iv[i] = 0;
- if (size == 0)
- return S_OK;
- UInt32 pos = 0;
- Byte firstByte = data[pos++];
-
- _key.NumCyclesPower = firstByte & 0x3F;
- if ((firstByte & 0xC0) == 0)
- return S_OK;
- _key.SaltSize = (firstByte >> 7) & 1;
- UInt32 ivSize = (firstByte >> 6) & 1;
-
- if (pos >= size)
- return E_INVALIDARG;
- Byte secondByte = data[pos++];
-
- _key.SaltSize += (secondByte >> 4);
- ivSize += (secondByte & 0x0F);
-
- if (pos + _key.SaltSize + ivSize > size)
- return E_INVALIDARG;
- for (i = 0; i < _key.SaltSize; i++)
- _key.Salt[i] = data[pos++];
- for (i = 0; i < ivSize; i++)
- _iv[i] = data[pos++];
- return (_key.NumCyclesPower <= 24) ? S_OK : E_NOTIMPL;
-}
-
-STDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
- _key.Password.SetCapacity((size_t)size);
- memcpy(_key.Password, data, (size_t)size);
- return S_OK;
-}
-
-STDMETHODIMP CBaseCoder::Init()
-{
- CalculateDigest();
- if (_aesFilter == 0)
- {
- RINOK(CreateFilter());
- }
- CMyComPtr<ICryptoProperties> cp;
- RINOK(_aesFilter.QueryInterface(IID_ICryptoProperties, &cp));
- RINOK(cp->SetKey(_key.Key, sizeof(_key.Key)));
- RINOK(cp->SetInitVector(_iv, sizeof(_iv)));
- return S_OK;
-}
-
-STDMETHODIMP_(UInt32) CBaseCoder::Filter(Byte *data, UInt32 size)
-{
- return _aesFilter->Filter(data, size);
-}
-
-HRESULT CDecoder::CreateFilter()
-{
- _aesFilter = new CAesCbcDecoder;
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/7zAes.h b/src/libs/7zip/unix/CPP/7zip/Crypto/7zAes.h
deleted file mode 100644
index 79d723fae..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/7zAes.h
+++ /dev/null
@@ -1,117 +0,0 @@
-// 7zAes.h
-
-#ifndef __CRYPTO_7Z_AES_H
-#define __CRYPTO_7Z_AES_H
-
-#include "Common/Buffer.h"
-#include "Common/MyCom.h"
-#include "Common/MyVector.h"
-
-#include "../ICoder.h"
-#include "../IPassword.h"
-
-namespace NCrypto {
-namespace NSevenZ {
-
-const int kKeySize = 32;
-
-class CKeyInfo
-{
-public:
- int NumCyclesPower;
- UInt32 SaltSize;
- Byte Salt[16];
- CByteBuffer Password;
- Byte Key[kKeySize];
-
- bool IsEqualTo(const CKeyInfo &a) const;
- void CalculateDigest();
-
- CKeyInfo() { Init(); }
- void Init()
- {
- NumCyclesPower = 0;
- SaltSize = 0;
- for (int i = 0; i < sizeof(Salt); i++)
- Salt[i] = 0;
- }
-};
-
-class CKeyInfoCache
-{
- int Size;
- CObjectVector<CKeyInfo> Keys;
-public:
- CKeyInfoCache(int size): Size(size) {}
- bool Find(CKeyInfo &key);
- // HRESULT Calculate(CKeyInfo &key);
- void Add(CKeyInfo &key);
-};
-
-class CBase
-{
- CKeyInfoCache _cachedKeys;
-protected:
- CKeyInfo _key;
- Byte _iv[16];
- UInt32 _ivSize;
- void CalculateDigest();
- CBase();
-};
-
-class CBaseCoder:
- public ICompressFilter,
- public ICryptoSetPassword,
- public CMyUnknownImp,
- public CBase
-{
-protected:
- CMyComPtr<ICompressFilter> _aesFilter;
-
- virtual HRESULT CreateFilter() = 0;
- #ifndef CRYPTO_AES
- HRESULT CreateFilterFromDLL(REFCLSID clsID);
- #endif
-public:
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
-
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-};
-
-#ifndef EXTRACT_ONLY
-
-class CEncoder:
- public CBaseCoder,
- public ICompressWriteCoderProperties,
- // public ICryptoResetSalt,
- public ICryptoResetInitVector
-{
- virtual HRESULT CreateFilter();
-public:
- MY_UNKNOWN_IMP3(
- ICryptoSetPassword,
- ICompressWriteCoderProperties,
- // ICryptoResetSalt,
- ICryptoResetInitVector)
- STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);
- // STDMETHOD(ResetSalt)();
- STDMETHOD(ResetInitVector)();
-};
-#endif
-
-class CDecoder:
- public CBaseCoder,
- public ICompressSetDecoderProperties2
-{
- virtual HRESULT CreateFilter();
-public:
- MY_UNKNOWN_IMP2(
- ICryptoSetPassword,
- ICompressSetDecoderProperties2)
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/7zAesRegister.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/7zAesRegister.cpp
deleted file mode 100644
index 5e57748f5..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/7zAesRegister.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// 7zAesRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-#include "7zAes.h"
-
-static void *CreateCodec() { return (void *)(ICompressFilter *)(new NCrypto::NSevenZ::CDecoder()); }
-#ifndef EXTRACT_ONLY
-static void *CreateCodecOut() { return (void *)(ICompressFilter *)(new NCrypto::NSevenZ::CEncoder()); }
-#else
-#define CreateCodecOut 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodec, CreateCodecOut, 0x06F10701, L"7zAES", 1, true };
-
-REGISTER_CODEC(7zAES)
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/HmacSha1.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/HmacSha1.cpp
deleted file mode 100644
index a66d62711..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/HmacSha1.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-// HmacSha1.cpp
-
-#include "StdAfx.h"
-
-#include "HmacSha1.h"
-
-namespace NCrypto {
-namespace NSha1 {
-
-void CHmac::SetKey(const Byte *key, size_t keySize)
-{
- Byte keyTemp[kBlockSize];
- size_t i;
- for (i = 0; i < kBlockSize; i++)
- keyTemp[i] = 0;
- if(keySize > kBlockSize)
- {
- _sha.Init();
- _sha.Update(key, keySize);
- _sha.Final(keyTemp);
- keySize = kDigestSize;
- }
- else
- for (i = 0; i < keySize; i++)
- keyTemp[i] = key[i];
- for (i = 0; i < kBlockSize; i++)
- keyTemp[i] ^= 0x36;
- _sha.Init();
- _sha.Update(keyTemp, kBlockSize);
- for (i = 0; i < kBlockSize; i++)
- keyTemp[i] ^= 0x36 ^ 0x5C;
- _sha2.Init();
- _sha2.Update(keyTemp, kBlockSize);
-}
-
-void CHmac::Final(Byte *mac, size_t macSize)
-{
- Byte digest[kDigestSize];
- _sha.Final(digest);
- _sha2.Update(digest, kDigestSize);
- _sha2.Final(digest);
- for(size_t i = 0; i < macSize; i++)
- mac[i] = digest[i];
-}
-
-
-void CHmac32::SetKey(const Byte *key, size_t keySize)
-{
- UInt32 keyTemp[kBlockSizeInWords];
- size_t i;
- for (i = 0; i < kBlockSizeInWords; i++)
- keyTemp[i] = 0;
- if(keySize > kBlockSize)
- {
- CContext sha;
- sha.Init();
- sha.Update(key, keySize);
- Byte digest[kDigestSize];
- sha.Final(digest);
-
- for (int i = 0 ; i < kDigestSizeInWords; i++)
- keyTemp[i] =
- ((UInt32)(digest[i * 4 + 0]) << 24) |
- ((UInt32)(digest[i * 4 + 1]) << 16) |
- ((UInt32)(digest[i * 4 + 2]) << 8) |
- ((UInt32)(digest[i * 4 + 3]));
- keySize = kDigestSizeInWords;
- }
- else
- for (size_t i = 0; i < keySize; i++)
- keyTemp[i / 4] |= (key[i] << (24 - 8 * (i & 3)));
- for (i = 0; i < kBlockSizeInWords; i++)
- keyTemp[i] ^= 0x36363636;
- _sha.Init();
- _sha.Update(keyTemp, kBlockSizeInWords);
- for (i = 0; i < kBlockSizeInWords; i++)
- keyTemp[i] ^= 0x36363636 ^ 0x5C5C5C5C;
- _sha2.Init();
- _sha2.Update(keyTemp, kBlockSizeInWords);
-}
-
-void CHmac32::Final(UInt32 *mac, size_t macSize)
-{
- UInt32 digest[kDigestSizeInWords];
- _sha.Final(digest);
- _sha2.Update(digest, kDigestSizeInWords);
- _sha2.Final(digest);
- for(size_t i = 0; i < macSize; i++)
- mac[i] = digest[i];
-}
-
-void CHmac32::GetLoopXorDigest(UInt32 *mac, UInt32 numIteration)
-{
- UInt32 block[kBlockSizeInWords];
- UInt32 block2[kBlockSizeInWords];
- _sha.PrepareBlock(block, kDigestSizeInWords);
- _sha2.PrepareBlock(block2, kDigestSizeInWords);
- for(unsigned int s = 0; s < kDigestSizeInWords; s++)
- block[s] = mac[s];
- for(UInt32 i = 0; i < numIteration; i++)
- {
- _sha.GetBlockDigest(block, block2);
- _sha2.GetBlockDigest(block2, block);
- for (unsigned int s = 0; s < kDigestSizeInWords; s++)
- mac[s] ^= block[s];
- }
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/HmacSha1.h b/src/libs/7zip/unix/CPP/7zip/Crypto/HmacSha1.h
deleted file mode 100644
index d7181329c..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/HmacSha1.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// HmacSha1.h
-// Implements HMAC-SHA-1 (RFC2104, FIPS-198)
-
-#ifndef __CRYPTO_HMAC_SHA1_H
-#define __CRYPTO_HMAC_SHA1_H
-
-#include "Sha1.h"
-
-namespace NCrypto {
-namespace NSha1 {
-
-// Use: SetKey(key, keySize); for () Update(data, size); Final(mac, macSize);
-
-class CHmac
-{
- CContext _sha;
- CContext _sha2;
-public:
- void SetKey(const Byte *key, size_t keySize);
- void Update(const Byte *data, size_t dataSize) { _sha.Update(data, dataSize); }
- void Final(Byte *mac, size_t macSize = kDigestSize);
-};
-
-class CHmac32
-{
- CContext32 _sha;
- CContext32 _sha2;
-public:
- void SetKey(const Byte *key, size_t keySize);
- void Update(const UInt32 *data, size_t dataSize) { _sha.Update(data, dataSize); }
- void Final(UInt32 *mac, size_t macSize = kDigestSizeInWords);
-
- // It'sa for hmac function. in,out: mac[kDigestSizeInWords].
- void GetLoopXorDigest(UInt32 *mac, UInt32 numIteration);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/MyAes.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/MyAes.cpp
deleted file mode 100644
index 70a7dccff..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/MyAes.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-// Crypto/MyAes.cpp
-
-#include "StdAfx.h"
-
-#include "MyAes.h"
-
-namespace NCrypto {
-
-struct CAesTabInit { CAesTabInit() { AesGenTables();} } g_AesTabInit;
-
-CAesCbcCoder::CAesCbcCoder()
-{
- _offset = ((0 - (unsigned)(ptrdiff_t)_aes) & 0xF) / sizeof(UInt32);
-}
-
-STDMETHODIMP CAesCbcCoder::Init() { return S_OK; }
-
-STDMETHODIMP_(UInt32) CAesCbcCoder::Filter(Byte *data, UInt32 size)
-{
- if (size == 0)
- return 0;
- if (size < AES_BLOCK_SIZE)
- return AES_BLOCK_SIZE;
- size >>= 4;
- _codeFunc(_aes + _offset, data, size);
- return size << 4;
-}
-
-STDMETHODIMP CAesCbcCoder::SetKey(const Byte *data, UInt32 size)
-{
- if ((size & 0x7) != 0 || size < 16 || size > 32)
- return E_INVALIDARG;
- _setKeyFunc(_aes + _offset + 4, data, size);
- return S_OK;
-}
-
-STDMETHODIMP CAesCbcCoder::SetInitVector(const Byte *data, UInt32 size)
-{
- if (size != AES_BLOCK_SIZE)
- return E_INVALIDARG;
- AesCbc_Init(_aes + _offset, data);
- return S_OK;
-}
-
-CAesCbcEncoder::CAesCbcEncoder() { _codeFunc = g_AesCbc_Encode; _setKeyFunc = Aes_SetKey_Enc; }
-CAesCbcDecoder::CAesCbcDecoder() { _codeFunc = g_AesCbc_Decode; _setKeyFunc = Aes_SetKey_Dec; }
-
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/MyAes.h b/src/libs/7zip/unix/CPP/7zip/Crypto/MyAes.h
deleted file mode 100644
index 60b13845f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/MyAes.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Crypto/MyAes.h
-
-#ifndef __CRYPTO_MY_AES_H
-#define __CRYPTO_MY_AES_H
-
-#include "../../../C/Aes.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-namespace NCrypto {
-
-class CAesCbcCoder:
- public ICompressFilter,
- public ICryptoProperties,
- public CMyUnknownImp
-{
-protected:
- AES_CODE_FUNC _codeFunc;
- AES_SET_KEY_FUNC _setKeyFunc;
- unsigned _offset;
- UInt32 _aes[AES_NUM_IVMRK_WORDS + 3];
-public:
- CAesCbcCoder();
- MY_UNKNOWN_IMP1(ICryptoProperties)
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- STDMETHOD(SetKey)(const Byte *data, UInt32 size);
- STDMETHOD(SetInitVector)(const Byte *data, UInt32 size);
-};
-
-struct CAesCbcEncoder: public CAesCbcCoder { CAesCbcEncoder(); };
-struct CAesCbcDecoder: public CAesCbcCoder { CAesCbcDecoder(); };
-
-}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp
deleted file mode 100644
index cbbdec89d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-// Pbkdf2HmacSha1.cpp
-
-#include "StdAfx.h"
-
-#include "HmacSha1.h"
-
-namespace NCrypto {
-namespace NSha1 {
-
-void Pbkdf2Hmac(const Byte *pwd, size_t pwdSize, const Byte *salt, size_t saltSize,
- UInt32 numIterations, Byte *key, size_t keySize)
-{
- CHmac baseCtx;
- baseCtx.SetKey(pwd, pwdSize);
- for (UInt32 i = 1; keySize > 0; i++)
- {
- CHmac ctx = baseCtx;
- ctx.Update(salt, saltSize);
- Byte u[kDigestSize] = { (Byte)(i >> 24), (Byte)(i >> 16), (Byte)(i >> 8), (Byte)(i) };
- const unsigned int curSize = (keySize < kDigestSize) ? (unsigned int)keySize : kDigestSize;
- ctx.Update(u, 4);
- ctx.Final(u, kDigestSize);
-
- unsigned int s;
- for (s = 0; s < curSize; s++)
- key[s] = u[s];
-
- for (UInt32 j = numIterations; j > 1; j--)
- {
- ctx = baseCtx;
- ctx.Update(u, kDigestSize);
- ctx.Final(u, kDigestSize);
- for (s = 0; s < curSize; s++)
- key[s] ^= u[s];
- }
-
- key += curSize;
- keySize -= curSize;
- }
-}
-
-void Pbkdf2Hmac32(const Byte *pwd, size_t pwdSize, const UInt32 *salt, size_t saltSize,
- UInt32 numIterations, UInt32 *key, size_t keySize)
-{
- CHmac32 baseCtx;
- baseCtx.SetKey(pwd, pwdSize);
- for (UInt32 i = 1; keySize > 0; i++)
- {
- CHmac32 ctx = baseCtx;
- ctx.Update(salt, saltSize);
- UInt32 u[kDigestSizeInWords] = { i };
- const unsigned int curSize = (keySize < kDigestSizeInWords) ? (unsigned int)keySize : kDigestSizeInWords;
- ctx.Update(u, 1);
- ctx.Final(u, kDigestSizeInWords);
-
- // Speed-optimized code start
- ctx = baseCtx;
- ctx.GetLoopXorDigest(u, numIterations - 1);
- // Speed-optimized code end
-
- unsigned int s;
- for (s = 0; s < curSize; s++)
- key[s] = u[s];
-
- /*
- // Default code start
- for (UInt32 j = numIterations; j > 1; j--)
- {
- ctx = baseCtx;
- ctx.Update(u, kDigestSizeInWords);
- ctx.Final(u, kDigestSizeInWords);
- for (s = 0; s < curSize; s++)
- key[s] ^= u[s];
- }
- // Default code end
- */
-
- key += curSize;
- keySize -= curSize;
- }
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/Pbkdf2HmacSha1.h b/src/libs/7zip/unix/CPP/7zip/Crypto/Pbkdf2HmacSha1.h
deleted file mode 100644
index bb90e1214..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/Pbkdf2HmacSha1.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Pbkdf2HmacSha1.h
-// Password-Based Key Derivation Function (RFC 2898, PKCS #5) based on HMAC-SHA-1
-
-#ifndef __CRYPTO_PBKDF2_HMAC_SHA1_H
-#define __CRYPTO_PBKDF2_HMAC_SHA1_H
-
-#include <stddef.h>
-#include "../../Common/Types.h"
-
-namespace NCrypto {
-namespace NSha1 {
-
-void Pbkdf2Hmac(const Byte *pwd, size_t pwdSize, const Byte *salt, size_t saltSize,
- UInt32 numIterations, Byte *key, size_t keySize);
-
-void Pbkdf2Hmac32(const Byte *pwd, size_t pwdSize, const UInt32 *salt, size_t saltSize,
- UInt32 numIterations, UInt32 *key, size_t keySize);
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/RandGen.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/RandGen.cpp
deleted file mode 100644
index e0e2e3abd..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/RandGen.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-// RandGen.cpp
-
-#include "StdAfx.h"
-
-#include <stdio.h>
-#include "Windows/Synchronization.h"
-#include "RandGen.h"
-
-#ifndef _WIN32
-#include <unistd.h>
-#define USE_POSIX_TIME
-#define USE_POSIX_TIME2
-#endif
-
-#ifdef USE_POSIX_TIME
-#include <time.h>
-#ifdef USE_POSIX_TIME2
-#include <sys/time.h>
-#endif
-#endif
-
-// This is not very good random number generator.
-// Please use it only for salt.
-// First generated data block depends from timer and processID.
-// Other generated data blocks depend from previous state
-// Maybe it's possible to restore original timer value from generated value.
-
-void CRandomGenerator::Init()
-{
- NCrypto::NSha1::CContext hash;
- hash.Init();
-
- #ifdef _WIN32
- DWORD w = ::GetCurrentProcessId();
- hash.Update((const Byte *)&w, sizeof(w));
- w = ::GetCurrentThreadId();
- hash.Update((const Byte *)&w, sizeof(w));
- #else
- pid_t pid = getpid();
- hash.Update((const Byte *)&pid, sizeof(pid));
- pid = getppid();
- hash.Update((const Byte *)&pid, sizeof(pid));
- #endif
-
- for (int i = 0; i < 1000; i++)
- {
- #ifdef _WIN32
- LARGE_INTEGER v;
- if (::QueryPerformanceCounter(&v))
- hash.Update((const Byte *)&v.QuadPart, sizeof(v.QuadPart));
- #endif
-
- #ifdef USE_POSIX_TIME
- #ifdef USE_POSIX_TIME2
- timeval v;
- if (gettimeofday(&v, 0) == 0)
- {
- hash.Update((const Byte *)&v.tv_sec, sizeof(v.tv_sec));
- hash.Update((const Byte *)&v.tv_usec, sizeof(v.tv_usec));
- }
- #endif
- time_t v2 = time(NULL);
- hash.Update((const Byte *)&v2, sizeof(v2));
- #endif
-
- DWORD tickCount = ::GetTickCount();
- hash.Update((const Byte *)&tickCount, sizeof(tickCount));
-
- for (int j = 0; j < 100; j++)
- {
- hash.Final(_buff);
- hash.Init();
- hash.Update(_buff, NCrypto::NSha1::kDigestSize);
- }
- }
- hash.Final(_buff);
- _needInit = false;
-}
-
-static NWindows::NSynchronization::CCriticalSection g_CriticalSection;
-
-void CRandomGenerator::Generate(Byte *data, unsigned int size)
-{
- g_CriticalSection.Enter();
- if (_needInit)
- Init();
- while (size > 0)
- {
- NCrypto::NSha1::CContext hash;
-
- hash.Init();
- hash.Update(_buff, NCrypto::NSha1::kDigestSize);
- hash.Final(_buff);
-
- hash.Init();
- UInt32 salt = 0xF672ABD1;
- hash.Update((const Byte *)&salt, sizeof(salt));
- hash.Update(_buff, NCrypto::NSha1::kDigestSize);
- Byte buff[NCrypto::NSha1::kDigestSize];
- hash.Final(buff);
- for (unsigned int i = 0; i < NCrypto::NSha1::kDigestSize && size > 0; i++, size--)
- *data++ = buff[i];
- }
- g_CriticalSection.Leave();
-}
-
-CRandomGenerator g_RandomGenerator;
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/RandGen.h b/src/libs/7zip/unix/CPP/7zip/Crypto/RandGen.h
deleted file mode 100644
index 209445c43..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/RandGen.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// RandGen.h
-
-#ifndef __CRYPTO_RAND_GEN_H
-#define __CRYPTO_RAND_GEN_H
-
-#include "Sha1.h"
-
-class CRandomGenerator
-{
- Byte _buff[NCrypto::NSha1::kDigestSize];
- bool _needInit;
-
- void Init();
-public:
- CRandomGenerator(): _needInit(true) {};
- void Generate(Byte *data, unsigned size);
-};
-
-extern CRandomGenerator g_RandomGenerator;
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/Rar20Crypto.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/Rar20Crypto.cpp
deleted file mode 100644
index c2df0e527..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/Rar20Crypto.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-// Crypto/Rar20Crypto.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/CpuArch.h"
-#include "../../../C/RotateDefs.h"
-
-#include "Rar20Crypto.h"
-
-namespace NCrypto {
-namespace NRar20 {
-
-static const int kNumRounds = 32;
-
-static const Byte InitSubstTable[256] = {
- 215, 19,149, 35, 73,197,192,205,249, 28, 16,119, 48,221, 2, 42,
- 232, 1,177,233, 14, 88,219, 25,223,195,244, 90, 87,239,153,137,
- 255,199,147, 70, 92, 66,246, 13,216, 40, 62, 29,217,230, 86, 6,
- 71, 24,171,196,101,113,218,123, 93, 91,163,178,202, 67, 44,235,
- 107,250, 75,234, 49,167,125,211, 83,114,157,144, 32,193,143, 36,
- 158,124,247,187, 89,214,141, 47,121,228, 61,130,213,194,174,251,
- 97,110, 54,229,115, 57,152, 94,105,243,212, 55,209,245, 63, 11,
- 164,200, 31,156, 81,176,227, 21, 76, 99,139,188,127, 17,248, 51,
- 207,120,189,210, 8,226, 41, 72,183,203,135,165,166, 60, 98, 7,
- 122, 38,155,170, 69,172,252,238, 39,134, 59,128,236, 27,240, 80,
- 131, 3, 85,206,145, 79,154,142,159,220,201,133, 74, 64, 20,129,
- 224,185,138,103,173,182, 43, 34,254, 82,198,151,231,180, 58, 10,
- 118, 26,102, 12, 50,132, 22,191,136,111,162,179, 45, 4,148,108,
- 161, 56, 78,126,242,222, 15,175,146, 23, 33,241,181,190, 77,225,
- 0, 46,169,186, 68, 95,237, 65, 53,208,253,168, 9, 18,100, 52,
- 116,184,160, 96,109, 37, 30,106,140,104,150, 5,204,117,112, 84
-};
-
-void CData::UpdateKeys(const Byte *data)
-{
- for (int i = 0; i < 16; i += 4)
- for (int j = 0; j < 4; j++)
- Keys[j] ^= g_CrcTable[data[i + j]];
-}
-
-static void Swap(Byte *b1, Byte *b2)
-{
- Byte b = *b1;
- *b1 = *b2;
- *b2 = b;
-}
-
-void CData::SetPassword(const Byte *password, UInt32 passwordLen)
-{
- Keys[0] = 0xD3A3B879L;
- Keys[1] = 0x3F6D12F7L;
- Keys[2] = 0x7515A235L;
- Keys[3] = 0xA4E7F123L;
-
- Byte psw[256];
- memset(psw, 0, sizeof(psw));
- memcpy(psw, password, passwordLen);
- memcpy(SubstTable, InitSubstTable, sizeof(SubstTable));
-
- for (UInt32 j = 0; j < 256; j++)
- for (UInt32 i = 0; i < passwordLen; i += 2)
- {
- UInt32 n2 = (Byte)g_CrcTable[(psw[i + 1] + j) & 0xFF];
- UInt32 n1 = (Byte)g_CrcTable[(psw[i] - j) & 0xFF];
- for (UInt32 k = 1; (n1 & 0xFF) != n2; n1++, k++)
- Swap(&SubstTable[n1 & 0xFF], &SubstTable[(n1 + i + k) & 0xFF]);
- }
- for (UInt32 i = 0; i < passwordLen; i+= 16)
- EncryptBlock(&psw[i]);
-}
-
-void CData::CryptBlock(Byte *buf, bool encrypt)
-{
- Byte inBuf[16];
- UInt32 A, B, C, D, T, TA, TB;
-
- A = GetUi32(buf + 0) ^ Keys[0];
- B = GetUi32(buf + 4) ^ Keys[1];
- C = GetUi32(buf + 8) ^ Keys[2];
- D = GetUi32(buf + 12) ^ Keys[3];
-
- if (!encrypt)
- memcpy(inBuf, buf, sizeof(inBuf));
-
- for (int i = 0; i < kNumRounds; i++)
- {
- UInt32 key = Keys[(encrypt ? i : (kNumRounds - 1 - i)) & 3];
- T = ((C + rotlFixed(D, 11)) ^ key);
- TA = A ^ SubstLong(T);
- T = ((D ^ rotlFixed(C, 17)) + key);
- TB = B ^ SubstLong(T);
- A = C;
- B = D;
- C = TA;
- D = TB;
- }
-
- SetUi32(buf + 0, C ^ Keys[0]);
- SetUi32(buf + 4, D ^ Keys[1]);
- SetUi32(buf + 8, A ^ Keys[2]);
- SetUi32(buf + 12, B ^ Keys[3]);
-
- UpdateKeys(encrypt ? buf : inBuf);
-}
-
-STDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
- _cipher.SetPassword(data, size);
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::Init()
-{
- return S_OK;
-}
-
-static const UInt32 kBlockSize = 16;
-
-STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)
-{
- if (size == 0)
- return 0;
- if (size < kBlockSize)
- return kBlockSize;
- UInt32 i;
- size -= kBlockSize;
- for (i = 0; i <= size; i += kBlockSize)
- _cipher.DecryptBlock(data + i);
- return i;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/Rar20Crypto.h b/src/libs/7zip/unix/CPP/7zip/Crypto/Rar20Crypto.h
deleted file mode 100644
index b9648f59d..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/Rar20Crypto.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Crypto/Rar20Crypto.h
-
-#ifndef __CRYPTO_RAR20_CRYPTO_H
-#define __CRYPTO_RAR20_CRYPTO_H
-
-#include "Common/MyCom.h"
-
-#include "../ICoder.h"
-#include "../IPassword.h"
-
-namespace NCrypto {
-namespace NRar20 {
-
-class CData
-{
- Byte SubstTable[256];
- UInt32 Keys[4];
-
- UInt32 SubstLong(UInt32 t)
- {
- return (UInt32)SubstTable[(int)t & 255] |
- ((UInt32)SubstTable[(int)(t >> 8) & 255] << 8) |
- ((UInt32)SubstTable[(int)(t >> 16) & 255] << 16) |
- ((UInt32)SubstTable[(int)(t >> 24) & 255] << 24);
- }
- void UpdateKeys(const Byte *data);
- void CryptBlock(Byte *buf, bool encrypt);
-public:
- void EncryptBlock(Byte *buf) { CryptBlock(buf, true); }
- void DecryptBlock(Byte *buf) { CryptBlock(buf, false); }
- void SetPassword(const Byte *password, UInt32 passwordLen);
-};
-
-class CDecoder:
- public ICompressFilter,
- public ICryptoSetPassword,
- public CMyUnknownImp
-{
- CData _cipher;
-public:
- MY_UNKNOWN_IMP1(ICryptoSetPassword)
-
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/RarAes.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/RarAes.cpp
deleted file mode 100644
index b0f00ea85..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/RarAes.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-// Crypto/RarAes.cpp
-// Note: you must include MyAes.cpp to project to initialize AES tables
-
-#include "StdAfx.h"
-
-#include "RarAes.h"
-#include "Sha1.h"
-
-namespace NCrypto {
-namespace NRar29 {
-
-CDecoder::CDecoder():
- _thereIsSalt(false),
- _needCalculate(true),
- _rar350Mode(false)
-{
- for (int i = 0; i < sizeof(_salt); i++)
- _salt[i] = 0;
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- bool thereIsSaltPrev = _thereIsSalt;
- _thereIsSalt = false;
- if (size == 0)
- return S_OK;
- if (size < 8)
- return E_INVALIDARG;
- _thereIsSalt = true;
- bool same = false;
- if (_thereIsSalt == thereIsSaltPrev)
- {
- same = true;
- if (_thereIsSalt)
- {
- for (unsigned i = 0; i < sizeof(_salt); i++)
- if (_salt[i] != data[i])
- {
- same = false;
- break;
- }
- }
- }
- for (unsigned i = 0; i < sizeof(_salt); i++)
- _salt[i] = data[i];
- if (!_needCalculate && !same)
- _needCalculate = true;
- return S_OK;
-}
-
-static const unsigned kMaxPasswordLength = 127 * 2;
-
-STDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
- if (size > kMaxPasswordLength)
- size = kMaxPasswordLength;
- bool same = false;
- if (size == buffer.GetCapacity())
- {
- same = true;
- for (UInt32 i = 0; i < size; i++)
- if (data[i] != buffer[i])
- {
- same = false;
- break;
- }
- }
- if (!_needCalculate && !same)
- _needCalculate = true;
- buffer.SetCapacity(size);
- memcpy(buffer, data, size);
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::Init()
-{
- Calculate();
- SetKey(aesKey, kRarAesKeySize);
- AesCbc_Init(_aes + _offset, _aesInit);
- return S_OK;
-}
-
-void CDecoder::Calculate()
-{
- if (_needCalculate)
- {
- const unsigned kSaltSize = 8;
-
- Byte rawPassword[kMaxPasswordLength + kSaltSize];
-
- memcpy(rawPassword, buffer, buffer.GetCapacity());
-
- size_t rawLength = buffer.GetCapacity();
-
- if (_thereIsSalt)
- {
- memcpy(rawPassword + rawLength, _salt, kSaltSize);
- rawLength += kSaltSize;
- }
-
- NSha1::CContext sha;
- sha.Init();
-
- // rar reverts hash for sha.
- const unsigned kNumRounds = (1 << 18);
- unsigned i;
- for (i = 0; i < kNumRounds; i++)
- {
- sha.UpdateRar(rawPassword, rawLength, _rar350Mode);
- Byte pswNum[3] = { (Byte)i, (Byte)(i >> 8), (Byte)(i >> 16) };
- sha.UpdateRar(pswNum, 3, _rar350Mode);
- if (i % (kNumRounds / 16) == 0)
- {
- NSha1::CContext shaTemp = sha;
- Byte digest[NSha1::kDigestSize];
- shaTemp.Final(digest);
- _aesInit[i / (kNumRounds / 16)] = (Byte)digest[4 * 4 + 3];
- }
- }
- /*
- // it's test message for sha
- const char *message = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
- sha.Update((const Byte *)message, strlen(message));
- */
- Byte digest[20];
- sha.Final(digest);
- for (i = 0; i < 4; i++)
- for (unsigned j = 0; j < 4; j++)
- aesKey[i * 4 + j] = (digest[i * 4 + 3 - j]);
- }
- _needCalculate = false;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/RarAes.h b/src/libs/7zip/unix/CPP/7zip/Crypto/RarAes.h
deleted file mode 100644
index 119cc2336..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/RarAes.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Crypto/RarAes.h
-
-#ifndef __CRYPTO_RAR_AES_H
-#define __CRYPTO_RAR_AES_H
-
-#include "../../../C/Aes.h"
-
-#include "Common/Buffer.h"
-
-#include "../IPassword.h"
-
-#include "MyAes.h"
-
-namespace NCrypto {
-namespace NRar29 {
-
-const UInt32 kRarAesKeySize = 16;
-
-class CDecoder:
- public CAesCbcDecoder,
- public ICompressSetDecoderProperties2,
- public ICryptoSetPassword
-{
- Byte _salt[8];
- bool _thereIsSalt;
- CByteBuffer buffer;
- Byte aesKey[kRarAesKeySize];
- Byte _aesInit[AES_BLOCK_SIZE];
- bool _needCalculate;
- bool _rar350Mode;
-
- void Calculate();
-public:
- MY_UNKNOWN_IMP2(
- ICryptoSetPassword,
- ICompressSetDecoderProperties2)
- STDMETHOD(Init)();
- STDMETHOD(CryptoSetPassword)(const Byte *aData, UInt32 aSize);
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
- CDecoder();
- void SetRar350Mode(bool rar350Mode) { _rar350Mode = rar350Mode; }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/Sha1.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/Sha1.cpp
deleted file mode 100644
index 82ca986c7..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/Sha1.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-// Crypto/Sha1.cpp
-// This file is based on public domain
-// Steve Reid and Wei Dai's code from Crypto++
-
-#include "StdAfx.h"
-
-#include "../../../C/RotateDefs.h"
-
-#include "Sha1.h"
-
-namespace NCrypto {
-namespace NSha1 {
-
-// define it for speed optimization
-// #define _SHA1_UNROLL
-
-static const unsigned kNumW =
- #ifdef _SHA1_UNROLL
- 16;
- #else
- 80;
- #endif
-
-
-#define w0(i) (W[(i)] = data[(i)])
-
-#ifdef _SHA1_UNROLL
-#define w1(i) (W[(i)&15] = rotlFixed(W[((i)-3)&15] ^ W[((i)-8)&15] ^ W[((i)-14)&15] ^ W[((i)-16)&15], 1))
-#else
-#define w1(i) (W[(i)] = rotlFixed(W[(i)-3] ^ W[(i)-8] ^ W[(i)-14] ^ W[(i)-16], 1))
-#endif
-
-#define f1(x,y,z) (z^(x&(y^z)))
-#define f2(x,y,z) (x^y^z)
-#define f3(x,y,z) ((x&y)|(z&(x|y)))
-#define f4(x,y,z) (x^y^z)
-
-#define RK1(a,b,c,d,e,i, f, w, k) e += f(b,c,d) + w(i) + k + rotlFixed(a,5); b = rotlFixed(b,30);
-
-#define R0(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f1, w0, 0x5A827999)
-#define R1(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f1, w1, 0x5A827999)
-#define R2(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f2, w1, 0x6ED9EBA1)
-#define R3(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f3, w1, 0x8F1BBCDC)
-#define R4(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f4, w1, 0xCA62C1D6)
-
-#define RX_1_4(rx1, rx4, i) rx1(a,b,c,d,e,i); rx4(e,a,b,c,d,i+1); rx4(d,e,a,b,c,i+2); rx4(c,d,e,a,b,i+3); rx4(b,c,d,e,a,i+4);
-#define RX_5(rx, i) RX_1_4(rx, rx, i);
-
-void CContextBase::Init()
-{
- _state[0] = 0x67452301;
- _state[1] = 0xEFCDAB89;
- _state[2] = 0x98BADCFE;
- _state[3] = 0x10325476;
- _state[4] = 0xC3D2E1F0;
- _count = 0;
-}
-
-void CContextBase::GetBlockDigest(UInt32 *data, UInt32 *destDigest, bool returnRes)
-{
- UInt32 a, b, c, d, e;
- UInt32 W[kNumW];
-
- a = _state[0];
- b = _state[1];
- c = _state[2];
- d = _state[3];
- e = _state[4];
- #ifdef _SHA1_UNROLL
- RX_5(R0, 0); RX_5(R0, 5); RX_5(R0, 10);
- #else
- int i;
- for (i = 0; i < 15; i += 5) { RX_5(R0, i); }
- #endif
-
- RX_1_4(R0, R1, 15);
-
-
- #ifdef _SHA1_UNROLL
- RX_5(R2, 20); RX_5(R2, 25); RX_5(R2, 30); RX_5(R2, 35);
- RX_5(R3, 40); RX_5(R3, 45); RX_5(R3, 50); RX_5(R3, 55);
- RX_5(R4, 60); RX_5(R4, 65); RX_5(R4, 70); RX_5(R4, 75);
- #else
- i = 20;
- for (; i < 40; i += 5) { RX_5(R2, i); }
- for (; i < 60; i += 5) { RX_5(R3, i); }
- for (; i < 80; i += 5) { RX_5(R4, i); }
- #endif
-
- destDigest[0] = _state[0] + a;
- destDigest[1] = _state[1] + b;
- destDigest[2] = _state[2] + c;
- destDigest[3] = _state[3] + d;
- destDigest[4] = _state[4] + e;
-
- if (returnRes)
- for (int i = 0 ; i < 16; i++)
- data[i] = W[kNumW - 16 + i];
-
- // Wipe variables
- // a = b = c = d = e = 0;
-}
-
-void CContextBase::PrepareBlock(UInt32 *block, unsigned size) const
-{
- unsigned curBufferPos = size & 0xF;
- block[curBufferPos++] = 0x80000000;
- while (curBufferPos != (16 - 2))
- block[curBufferPos++] = 0;
- const UInt64 lenInBits = (_count << 9) + ((UInt64)size << 5);
- block[curBufferPos++] = (UInt32)(lenInBits >> 32);
- block[curBufferPos++] = (UInt32)(lenInBits);
-}
-
-void CContext::Update(const Byte *data, size_t size)
-{
- unsigned curBufferPos = _count2;
- while (size--)
- {
- int pos = (int)(curBufferPos & 3);
- if (pos == 0)
- _buffer[curBufferPos >> 2] = 0;
- _buffer[curBufferPos >> 2] |= ((UInt32)*data++) << (8 * (3 - pos));
- if (++curBufferPos == kBlockSize)
- {
- curBufferPos = 0;
- CContextBase::UpdateBlock(_buffer, false);
- }
- }
- _count2 = curBufferPos;
-}
-
-void CContext::UpdateRar(Byte *data, size_t size, bool rar350Mode)
-{
- bool returnRes = false;
- unsigned curBufferPos = _count2;
- while (size--)
- {
- int pos = (int)(curBufferPos & 3);
- if (pos == 0)
- _buffer[curBufferPos >> 2] = 0;
- _buffer[curBufferPos >> 2] |= ((UInt32)*data++) << (8 * (3 - pos));
- if (++curBufferPos == kBlockSize)
- {
- curBufferPos = 0;
- CContextBase::UpdateBlock(_buffer, returnRes);
- if (returnRes)
- for (int i = 0; i < kBlockSizeInWords; i++)
- {
- UInt32 d = _buffer[i];
- data[i * 4 + 0 - kBlockSize] = (Byte)(d);
- data[i * 4 + 1 - kBlockSize] = (Byte)(d >> 8);
- data[i * 4 + 2 - kBlockSize] = (Byte)(d >> 16);
- data[i * 4 + 3 - kBlockSize] = (Byte)(d >> 24);
- }
- returnRes = rar350Mode;
- }
- }
- _count2 = curBufferPos;
-}
-
-void CContext::Final(Byte *digest)
-{
- const UInt64 lenInBits = (_count << 9) + ((UInt64)_count2 << 3);
- unsigned curBufferPos = _count2;
- int pos = (int)(curBufferPos & 3);
- curBufferPos >>= 2;
- if (pos == 0)
- _buffer[curBufferPos] = 0;
- _buffer[curBufferPos++] |= ((UInt32)0x80) << (8 * (3 - pos));
-
- while (curBufferPos != (16 - 2))
- {
- curBufferPos &= 0xF;
- if (curBufferPos == 0)
- UpdateBlock();
- _buffer[curBufferPos++] = 0;
- }
- _buffer[curBufferPos++] = (UInt32)(lenInBits >> 32);
- _buffer[curBufferPos++] = (UInt32)(lenInBits);
- UpdateBlock();
-
- int i;
- for (i = 0; i < kDigestSizeInWords; i++)
- {
- UInt32 state = _state[i] & 0xFFFFFFFF;
- *digest++ = (Byte)(state >> 24);
- *digest++ = (Byte)(state >> 16);
- *digest++ = (Byte)(state >> 8);
- *digest++ = (Byte)(state);
- }
- Init();
-}
-
-///////////////////////////
-// Words version
-
-void CContext32::Update(const UInt32 *data, size_t size)
-{
- while (size--)
- {
- _buffer[_count2++] = *data++;
- if (_count2 == kBlockSizeInWords)
- {
- _count2 = 0;
- UpdateBlock();
- }
- }
-}
-
-void CContext32::Final(UInt32 *digest)
-{
- const UInt64 lenInBits = (_count << 9) + ((UInt64)_count2 << 5);
- unsigned curBufferPos = _count2;
- _buffer[curBufferPos++] = 0x80000000;
- while (curBufferPos != (16 - 2))
- {
- curBufferPos &= 0xF;
- if (curBufferPos == 0)
- UpdateBlock();
- _buffer[curBufferPos++] = 0;
- }
- _buffer[curBufferPos++] = (UInt32)(lenInBits >> 32);
- _buffer[curBufferPos++] = (UInt32)(lenInBits);
- GetBlockDigest(_buffer, digest);
- Init();
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/Sha1.h b/src/libs/7zip/unix/CPP/7zip/Crypto/Sha1.h
deleted file mode 100644
index 1bad1f91f..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/Sha1.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Crypto/Sha1.h
-// This file is based on public domain
-// Steve Reid and Wei Dai's code from Crypto++
-
-#ifndef __CRYPTO_SHA1_H
-#define __CRYPTO_SHA1_H
-
-#include <stddef.h>
-#include "../../Common/Types.h"
-
-// Sha1 implementation in RAR before version 3.60 has bug:
-// it changes data bytes in some cases.
-// So this class supports both versions: normal_SHA and rar3Mode
-
-namespace NCrypto {
-namespace NSha1 {
-
-const unsigned kBlockSize = 64;
-const unsigned kDigestSize = 20;
-
-const unsigned kBlockSizeInWords = (kBlockSize >> 2);
-const unsigned kDigestSizeInWords = (kDigestSize >> 2);
-
-class CContextBase
-{
-protected:
- UInt32 _state[5];
- UInt64 _count;
- void UpdateBlock(UInt32 *data, bool returnRes = false)
- {
- GetBlockDigest(data, _state, returnRes);
- _count++;
- }
-public:
- void Init();
- void GetBlockDigest(UInt32 *blockData, UInt32 *destDigest, bool returnRes = false);
- // PrepareBlock can be used only when size <= 13. size in Words
- void PrepareBlock(UInt32 *block, unsigned int size) const;
-};
-
-class CContextBase2: public CContextBase
-{
-protected:
- unsigned _count2;
- UInt32 _buffer[kBlockSizeInWords];
- void UpdateBlock() { CContextBase::UpdateBlock(_buffer); }
-public:
- void Init() { CContextBase::Init(); _count2 = 0; }
-};
-
-class CContext: public CContextBase2
-{
-public:
- void Update(const Byte *data, size_t size);
- void UpdateRar(Byte *data, size_t size, bool rar350Mode);
- void Final(Byte *digest);
-};
-
-class CContext32: public CContextBase2
-{
-public:
- void Update(const UInt32 *data, size_t size);
- void Final(UInt32 *digest);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/WzAes.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/WzAes.cpp
deleted file mode 100644
index 08a1818c0..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/WzAes.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-// Crypto/WzAes.cpp
-/*
-This code implements Brian Gladman's scheme
-specified in password Based File Encryption Utility.
-
-Note: you must include MyAes.cpp to project to initialize AES tables
-*/
-
-#include "StdAfx.h"
-
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "Pbkdf2HmacSha1.h"
-#include "RandGen.h"
-#include "WzAes.h"
-
-// define it if you don't want to use speed-optimized version of Pbkdf2HmacSha1
-// #define _NO_WZAES_OPTIMIZATIONS
-
-namespace NCrypto {
-namespace NWzAes {
-
-const unsigned kAesKeySizeMax = 32;
-
-static const UInt32 kNumKeyGenIterations = 1000;
-
-STDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
- if(size > kPasswordSizeMax)
- return E_INVALIDARG;
- _key.Password.SetCapacity(size);
- memcpy(_key.Password, data, size);
- return S_OK;
-}
-
-#ifndef _NO_WZAES_OPTIMIZATIONS
-
-static void BytesToBeUInt32s(const Byte *src, UInt32 *dest, unsigned destSize)
-{
- for (unsigned i = 0; i < destSize; i++)
- dest[i] =
- ((UInt32)(src[i * 4 + 0]) << 24) |
- ((UInt32)(src[i * 4 + 1]) << 16) |
- ((UInt32)(src[i * 4 + 2]) << 8) |
- ((UInt32)(src[i * 4 + 3]));
-}
-
-#endif
-
-STDMETHODIMP CBaseCoder::Init()
-{
- UInt32 keySize = _key.GetKeySize();
- UInt32 keysTotalSize = 2 * keySize + kPwdVerifCodeSize;
- Byte buf[2 * kAesKeySizeMax + kPwdVerifCodeSize];
-
- // for (unsigned ii = 0; ii < 1000; ii++)
- {
- #ifdef _NO_WZAES_OPTIMIZATIONS
-
- NSha1::Pbkdf2Hmac(
- _key.Password, _key.Password.GetCapacity(),
- _key.Salt, _key.GetSaltSize(),
- kNumKeyGenIterations,
- buf, keysTotalSize);
-
- #else
-
- UInt32 buf32[(2 * kAesKeySizeMax + kPwdVerifCodeSize + 3) / 4];
- UInt32 key32SizeTotal = (keysTotalSize + 3) / 4;
- UInt32 salt[kSaltSizeMax * 4];
- UInt32 saltSizeInWords = _key.GetSaltSize() / 4;
- BytesToBeUInt32s(_key.Salt, salt, saltSizeInWords);
- NSha1::Pbkdf2Hmac32(
- _key.Password, _key.Password.GetCapacity(),
- salt, saltSizeInWords,
- kNumKeyGenIterations,
- buf32, key32SizeTotal);
- for (UInt32 j = 0; j < keysTotalSize; j++)
- buf[j] = (Byte)(buf32[j / 4] >> (24 - 8 * (j & 3)));
-
- #endif
- }
-
- _hmac.SetKey(buf + keySize, keySize);
- memcpy(_key.PwdVerifComputed, buf + 2 * keySize, kPwdVerifCodeSize);
-
- AesCtr2_Init(&_aes);
- Aes_SetKey_Enc(_aes.aes + _aes.offset + 8, buf, keySize);
- return S_OK;
-}
-
-HRESULT CEncoder::WriteHeader(ISequentialOutStream *outStream)
-{
- UInt32 saltSize = _key.GetSaltSize();
- g_RandomGenerator.Generate(_key.Salt, saltSize);
- Init();
- RINOK(WriteStream(outStream, _key.Salt, saltSize));
- return WriteStream(outStream, _key.PwdVerifComputed, kPwdVerifCodeSize);
-}
-
-HRESULT CEncoder::WriteFooter(ISequentialOutStream *outStream)
-{
- Byte mac[kMacSize];
- _hmac.Final(mac, kMacSize);
- return WriteStream(outStream, mac, kMacSize);
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size != 1)
- return E_INVALIDARG;
- _key.Init();
- return SetKeyMode(data[0]) ? S_OK : E_INVALIDARG;
-}
-
-HRESULT CDecoder::ReadHeader(ISequentialInStream *inStream)
-{
- UInt32 saltSize = _key.GetSaltSize();
- UInt32 extraSize = saltSize + kPwdVerifCodeSize;
- Byte temp[kSaltSizeMax + kPwdVerifCodeSize];
- RINOK(ReadStream_FAIL(inStream, temp, extraSize));
- UInt32 i;
- for (i = 0; i < saltSize; i++)
- _key.Salt[i] = temp[i];
- for (i = 0; i < kPwdVerifCodeSize; i++)
- _pwdVerifFromArchive[i] = temp[saltSize + i];
- return S_OK;
-}
-
-static bool CompareArrays(const Byte *p1, const Byte *p2, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- if (p1[i] != p2[i])
- return false;
- return true;
-}
-
-bool CDecoder::CheckPasswordVerifyCode()
-{
- return CompareArrays(_key.PwdVerifComputed, _pwdVerifFromArchive, kPwdVerifCodeSize);
-}
-
-HRESULT CDecoder::CheckMac(ISequentialInStream *inStream, bool &isOK)
-{
- isOK = false;
- Byte mac1[kMacSize];
- RINOK(ReadStream_FAIL(inStream, mac1, kMacSize));
- Byte mac2[kMacSize];
- _hmac.Final(mac2, kMacSize);
- isOK = CompareArrays(mac1, mac2, kMacSize);
- return S_OK;
-}
-
-CAesCtr2::CAesCtr2()
-{
- offset = ((0 - (unsigned)(ptrdiff_t)aes) & 0xF) / sizeof(UInt32);
-}
-
-void AesCtr2_Init(CAesCtr2 *p)
-{
- UInt32 *ctr = p->aes + p->offset + 4;
- unsigned i;
- for (i = 0; i < 4; i++)
- ctr[i] = 0;
- p->pos = AES_BLOCK_SIZE;
-}
-
-void AesCtr2_Code(CAesCtr2 *p, Byte *data, SizeT size)
-{
- unsigned pos = p->pos;
- UInt32 *buf32 = p->aes + p->offset;
- if (size == 0)
- return;
- if (pos != AES_BLOCK_SIZE)
- {
- const Byte *buf = (const Byte *)buf32;
- do
- *data++ ^= buf[pos++];
- while (--size != 0 && pos != AES_BLOCK_SIZE);
- }
- if (size >= 16)
- {
- SizeT size2 = size >> 4;
- g_AesCtr_Code(buf32 + 4, data, size2);
- size2 <<= 4;
- data += size2;
- size -= size2;
- pos = AES_BLOCK_SIZE;
- }
- if (size != 0)
- {
- unsigned j;
- const Byte *buf;
- for (j = 0; j < 4; j++)
- buf32[j] = 0;
- g_AesCtr_Code(buf32 + 4, (Byte *)buf32, 1);
- buf = (const Byte *)buf32;
- pos = 0;
- do
- *data++ ^= buf[pos++];
- while (--size != 0 && pos != AES_BLOCK_SIZE);
- }
- p->pos = pos;
-}
-
-STDMETHODIMP_(UInt32) CEncoder::Filter(Byte *data, UInt32 size)
-{
- AesCtr2_Code(&_aes, data, size);
- _hmac.Update(data, size);
- return size;
-}
-
-STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)
-{
- _hmac.Update(data, size);
- AesCtr2_Code(&_aes, data, size);
- return size;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/WzAes.h b/src/libs/7zip/unix/CPP/7zip/Crypto/WzAes.h
deleted file mode 100644
index f37fe6440..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/WzAes.h
+++ /dev/null
@@ -1,125 +0,0 @@
-// Crypto/WzAes.h
-/*
-This code implements Brian Gladman's scheme
-specified in password Based File Encryption Utility:
- - AES encryption (128,192,256-bit) in Counter (CTR) mode.
- - HMAC-SHA1 authentication for encrypted data (10 bytes)
- - Keys are derived by PPKDF2(RFC2898)-HMAC-SHA1 from ASCII password and
- Salt (saltSize = aesKeySize / 2).
- - 2 bytes contain Password Verifier's Code
-*/
-
-#ifndef __CRYPTO_WZ_AES_H
-#define __CRYPTO_WZ_AES_H
-
-#include "../../../C/Aes.h"
-
-#include "Common/Buffer.h"
-#include "Common/MyCom.h"
-#include "Common/MyVector.h"
-
-#include "../ICoder.h"
-#include "../IPassword.h"
-
-#include "HmacSha1.h"
-
-namespace NCrypto {
-namespace NWzAes {
-
-const unsigned kSaltSizeMax = 16;
-const unsigned kMacSize = 10;
-
-const UInt32 kPasswordSizeMax = 99; // 128;
-
-// Password Verification Code Size
-const unsigned kPwdVerifCodeSize = 2;
-
-enum EKeySizeMode
-{
- kKeySizeMode_AES128 = 1,
- kKeySizeMode_AES192 = 2,
- kKeySizeMode_AES256 = 3
-};
-
-class CKeyInfo
-{
-public:
- EKeySizeMode KeySizeMode;
- Byte Salt[kSaltSizeMax];
- Byte PwdVerifComputed[kPwdVerifCodeSize];
-
- CByteBuffer Password;
-
- UInt32 GetKeySize() const { return (8 * (KeySizeMode & 3) + 8); }
- UInt32 GetSaltSize() const { return (4 * (KeySizeMode & 3) + 4); }
-
- CKeyInfo() { Init(); }
- void Init() { KeySizeMode = kKeySizeMode_AES256; }
-};
-
-struct CAesCtr2
-{
- unsigned pos;
- unsigned offset;
- UInt32 aes[4 + AES_NUM_IVMRK_WORDS + 3];
- CAesCtr2();
-};
-
-void AesCtr2_Init(CAesCtr2 *p);
-void AesCtr2_Code(CAesCtr2 *p, Byte *data, SizeT size);
-
-class CBaseCoder:
- public ICompressFilter,
- public ICryptoSetPassword,
- public CMyUnknownImp
-{
-protected:
- CKeyInfo _key;
- NSha1::CHmac _hmac;
- Byte _pwdVerifFromArchive[kPwdVerifCodeSize];
- CAesCtr2 _aes;
-
-public:
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) = 0;
-
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-
- UInt32 GetHeaderSize() const { return _key.GetSaltSize() + kPwdVerifCodeSize; }
- bool SetKeyMode(unsigned mode)
- {
- if (mode < kKeySizeMode_AES128 || mode > kKeySizeMode_AES256)
- return false;
- _key.KeySizeMode = (EKeySizeMode)mode;
- return true;
- }
-};
-
-class CEncoder:
- public CBaseCoder
-{
-public:
- MY_UNKNOWN_IMP1(ICryptoSetPassword)
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- HRESULT WriteHeader(ISequentialOutStream *outStream);
- HRESULT WriteFooter(ISequentialOutStream *outStream);
-};
-
-class CDecoder:
- public CBaseCoder,
- public ICompressSetDecoderProperties2
-{
-public:
- MY_UNKNOWN_IMP2(
- ICryptoSetPassword,
- ICompressSetDecoderProperties2)
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
- HRESULT ReadHeader(ISequentialInStream *inStream);
- bool CheckPasswordVerifyCode();
- HRESULT CheckMac(ISequentialInStream *inStream, bool &isOK);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/ZipCrypto.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/ZipCrypto.cpp
deleted file mode 100644
index baaaf98e3..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/ZipCrypto.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-// Crypto/ZipCrypto.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "RandGen.h"
-#include "ZipCrypto.h"
-
-namespace NCrypto {
-namespace NZip {
-
-void CCipher::UpdateKeys(Byte b)
-{
- Keys[0] = CRC_UPDATE_BYTE(Keys[0], b);
- Keys[1] = (Keys[1] + (Keys[0] & 0xFF)) * 0x8088405 + 1;
- Keys[2] = CRC_UPDATE_BYTE(Keys[2], (Byte)(Keys[1] >> 24));
-}
-
-STDMETHODIMP CCipher::CryptoSetPassword(const Byte *password, UInt32 passwordLen)
-{
- Keys[0] = 0x12345678;
- Keys[1] = 0x23456789;
- Keys[2] = 0x34567890;
- UInt32 i;
- for (i = 0; i < passwordLen; i++)
- UpdateKeys(password[i]);
- for (i = 0; i < 3; i++)
- Keys2[i] = Keys[i];
- return S_OK;
-}
-
-STDMETHODIMP CCipher::Init()
-{
- return S_OK;
-}
-
-Byte CCipher::DecryptByteSpec()
-{
- UInt32 temp = Keys[2] | 2;
- return (Byte)((temp * (temp ^ 1)) >> 8);
-}
-
-HRESULT CEncoder::WriteHeader(ISequentialOutStream *outStream, UInt32 crc)
-{
- Byte h[kHeaderSize];
- g_RandomGenerator.Generate(h, kHeaderSize - 2);
- h[kHeaderSize - 1] = (Byte)(crc >> 24);
- h[kHeaderSize - 2] = (Byte)(crc >> 16);
- RestoreKeys();
- Filter(h, kHeaderSize);
- return WriteStream(outStream, h, kHeaderSize);
-}
-
-STDMETHODIMP_(UInt32) CEncoder::Filter(Byte *data, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- {
- Byte b = data[i];
- data[i] = (Byte)(b ^ DecryptByteSpec());;
- UpdateKeys(b);
- }
- return size;
-}
-
-HRESULT CDecoder::ReadHeader(ISequentialInStream *inStream)
-{
- Byte h[kHeaderSize];
- RINOK(ReadStream_FAIL(inStream, h, kHeaderSize));
- RestoreKeys();
- Filter(h, kHeaderSize);
- return S_OK;
-}
-
-STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- {
- Byte c = (Byte)(data[i] ^ DecryptByteSpec());
- UpdateKeys(c);
- data[i] = c;
- }
- return size;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/ZipCrypto.h b/src/libs/7zip/unix/CPP/7zip/Crypto/ZipCrypto.h
deleted file mode 100644
index 6f104beb4..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/ZipCrypto.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Crypto/ZipCrypto.h
-
-#ifndef __CRYPTO_ZIP_CRYPTO_H
-#define __CRYPTO_ZIP_CRYPTO_H
-
-#include "Common/MyCom.h"
-
-#include "../ICoder.h"
-#include "../IPassword.h"
-
-namespace NCrypto {
-namespace NZip {
-
-const unsigned kHeaderSize = 12;
-
-class CCipher:
- public ICompressFilter,
- public ICryptoSetPassword,
- public CMyUnknownImp
-{
- UInt32 Keys[3];
- UInt32 Keys2[3];
-
-protected:
- void UpdateKeys(Byte b);
- Byte DecryptByteSpec();
- void RestoreKeys()
- {
- for (int i = 0; i < 3; i++)
- Keys[i] = Keys2[i];
- }
-
-public:
- STDMETHOD(Init)();
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-};
-
-class CEncoder: public CCipher
-{
-public:
- MY_UNKNOWN_IMP1(ICryptoSetPassword)
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- HRESULT WriteHeader(ISequentialOutStream *outStream, UInt32 crc);
-};
-
-class CDecoder: public CCipher
-{
-public:
- MY_UNKNOWN_IMP1(ICryptoSetPassword)
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- HRESULT ReadHeader(ISequentialInStream *inStream);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/ZipStrong.cpp b/src/libs/7zip/unix/CPP/7zip/Crypto/ZipStrong.cpp
deleted file mode 100644
index 1554b3489..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/ZipStrong.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-// Crypto/ZipStrong.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/CpuArch.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "MyAes.h"
-#include "Sha1.h"
-#include "ZipStrong.h"
-
-namespace NCrypto {
-namespace NZipStrong {
-
-static const UInt16 kAES128 = 0x660E;
-
-// DeriveKey* function is similar to CryptDeriveKey() from Windows.
-// But MSDN tells that we need such scheme only if
-// "the required key length is longer than the hash value"
-// but ZipStrong uses it always.
-
-static void DeriveKey2(const Byte *digest, Byte c, Byte *dest)
-{
- Byte buf[64];
- memset(buf, c, 64);
- for (unsigned i = 0; i < NSha1::kDigestSize; i++)
- buf[i] ^= digest[i];
- NSha1::CContext sha;
- sha.Init();
- sha.Update(buf, 64);
- sha.Final(dest);
-}
-
-static void DeriveKey(NSha1::CContext &sha, Byte *key)
-{
- Byte digest[NSha1::kDigestSize];
- sha.Final(digest);
- Byte temp[NSha1::kDigestSize * 2];
- DeriveKey2(digest, 0x36, temp);
- DeriveKey2(digest, 0x5C, temp + NSha1::kDigestSize);
- memcpy(key, temp, 32);
-}
-
-void CKeyInfo::SetPassword(const Byte *data, UInt32 size)
-{
- NSha1::CContext sha;
- sha.Init();
- sha.Update(data, size);
- DeriveKey(sha, MasterKey);
-}
-
-STDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
- _key.SetPassword(data, size);
- return S_OK;
-}
-
-HRESULT CDecoder::ReadHeader(ISequentialInStream *inStream, UInt32 /* crc */, UInt64 /* unpackSize */)
-{
- Byte temp[4];
- RINOK(ReadStream_FALSE(inStream, temp, 2));
- _ivSize = GetUi16(temp);
- if (_ivSize == 0)
- {
- return E_NOTIMPL;
- /*
- SetUi32(_iv, crc);
- for (int i = 0; i < 8; i++)
- _iv[4 + i] = (Byte)(unpackSize >> (8 * i));
- SetUi32(_iv + 12, 0);
- */
- }
- else if (_ivSize == 16)
- {
- RINOK(ReadStream_FALSE(inStream, _iv, _ivSize));
- }
- else
- return E_NOTIMPL;
- RINOK(ReadStream_FALSE(inStream, temp, 4));
- _remSize = GetUi32(temp);
- const UInt32 kAlign = 16;
- if (_remSize < 16 || _remSize > (1 << 18))
- return E_NOTIMPL;
- if (_remSize + kAlign > _buf.GetCapacity())
- {
- _buf.Free();
- _buf.SetCapacity(_remSize + kAlign);
- _bufAligned = (Byte *)((ptrdiff_t)((Byte *)_buf + kAlign - 1) & ~(ptrdiff_t)(kAlign - 1));
- }
- return ReadStream_FALSE(inStream, _bufAligned, _remSize);
-}
-
-HRESULT CDecoder::CheckPassword(bool &passwOK)
-{
- passwOK = false;
- if (_remSize < 16)
- return E_NOTIMPL;
- Byte *p = _bufAligned;
- UInt16 format = GetUi16(p);
- if (format != 3)
- return E_NOTIMPL;
- UInt16 algId = GetUi16(p + 2);
- if (algId < kAES128)
- return E_NOTIMPL;
- algId -= kAES128;
- if (algId > 2)
- return E_NOTIMPL;
- UInt16 bitLen = GetUi16(p + 4);
- UInt16 flags = GetUi16(p + 6);
- if (algId * 64 + 128 != bitLen)
- return E_NOTIMPL;
- _key.KeySize = 16 + algId * 8;
- if ((flags & 1) == 0)
- return E_NOTIMPL;
- if ((flags & 0x4000) != 0)
- {
- // Use 3DES
- return E_NOTIMPL;
- }
-
- UInt32 rdSize = GetUi16(p + 8);
- if ((rdSize & 0xF) != 0 || rdSize + 16 > _remSize)
- return E_NOTIMPL;
- memmove(p, p + 10, rdSize);
- Byte *validData = p + rdSize + 16;
- if (GetUi32(validData - 6) != 0) // reserved
- return E_NOTIMPL;
- UInt32 validSize = GetUi16(validData - 2);
- if ((validSize & 0xF) != 0 || 16 + rdSize + validSize != _remSize)
- return E_NOTIMPL;
-
-
- {
- RINOK(SetKey(_key.MasterKey, _key.KeySize));
- RINOK(SetInitVector(_iv, 16));
- Init();
- Filter(p, rdSize);
- }
-
- Byte fileKey[32];
- NSha1::CContext sha;
- sha.Init();
- sha.Update(_iv, 16);
- sha.Update(p, rdSize - 16); // we don't use last 16 bytes (PAD bytes)
- DeriveKey(sha, fileKey);
-
- RINOK(SetKey(fileKey, _key.KeySize));
- RINOK(SetInitVector(_iv, 16));
- Init();
- Filter(validData, validSize);
-
- if (validSize < 4)
- return E_NOTIMPL;
- validSize -= 4;
- if (GetUi32(validData + validSize) != CrcCalc(validData, validSize))
- return S_OK;
- passwOK = true;
- Init();
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/7zip/Crypto/ZipStrong.h b/src/libs/7zip/unix/CPP/7zip/Crypto/ZipStrong.h
deleted file mode 100644
index 151677ea6..000000000
--- a/src/libs/7zip/unix/CPP/7zip/Crypto/ZipStrong.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Crypto/ZipStrong.h
-
-#ifndef __CRYPTO_ZIP_STRONG_H
-#define __CRYPTO_ZIP_STRONG_H
-
-#include "Common/Buffer.h"
-
-#include "../IPassword.h"
-
-#include "MyAes.h"
-
-namespace NCrypto {
-namespace NZipStrong {
-
-struct CKeyInfo
-{
- Byte MasterKey[32];
- UInt32 KeySize;
- void SetPassword(const Byte *data, UInt32 size);
-};
-
-class CBaseCoder:
- public CAesCbcDecoder,
- public ICryptoSetPassword
-{
-protected:
- CKeyInfo _key;
- CByteBuffer _buf;
- Byte *_bufAligned;
-public:
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-};
-
-class CDecoder: public CBaseCoder
-{
- UInt32 _ivSize;
- Byte _iv[16];
- UInt32 _remSize;
-public:
- MY_UNKNOWN_IMP1(ICryptoSetPassword)
- HRESULT ReadHeader(ISequentialInStream *inStream, UInt32 crc, UInt64 unpackSize);
- HRESULT CheckPassword(bool &passwOK);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/UI/Common/CompressCall.cpp b/src/libs/7zip/unix/CPP/7zip/UI/Common/CompressCall.cpp
deleted file mode 100644
index fdc6c66f1..000000000
--- a/src/libs/7zip/unix/CPP/7zip/UI/Common/CompressCall.cpp
+++ /dev/null
@@ -1,470 +0,0 @@
-// CompressCall.cpp
-
-#include "StdAfx.h"
-
-// For compilers that support precompilation, includes "wx/wx.h".
-#include "wx/wxprec.h"
-
-#ifdef __BORLANDC__
-#pragma hdrstop
-#endif
-
-#ifndef WX_PRECOMP
-#include "wx/wx.h"
-#endif
-
-#undef _WIN32
-
-#include "CompressCall.h"
-
-// FIXME #include "Common/Random.h"
-#include "Common/IntToString.h"
-#include "Common/MyCom.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/Synchronization.h"
-// FIXME #include "Windows/FileMapping.h"
-#include "Windows/FileDir.h"
-
-#include "../FileManager/ProgramLocation.h"
-#include "../FileManager/RegistryUtils.h"
-
-#define NEED_NAME_WINDOWS_TO_UNIX
-#include "myPrivate.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif // _UNICODE
-
-using namespace NWindows;
-
-static LPCWSTR kShowDialogSwitch = L" -ad";
-static LPCWSTR kEmailSwitch = L" -seml.";
-static LPCWSTR kMapSwitch = L" -i#";
-static LPCWSTR kArchiveNoNameSwitch = L" -an";
-static LPCWSTR kArchiveTypeSwitch = L" -t";
-static LPCWSTR kArchiveMapSwitch = L" -ai#";
-static LPCWSTR kStopSwitchParsing = L" --";
-static LPCWSTR kLargePagesDisable = L" -slp-";
-
-static void AddLagePagesSwitch(UString &params)
-{
-#ifdef _WIN32
- if (!ReadLockMemoryEnable())
- params += kLargePagesDisable;
-#endif
-}
-
-HRESULT MyCreateProcess(const UString &params,
- LPCWSTR curDir, bool waitFinish,
- NWindows::NSynchronization::CBaseEvent *event)
-{
- printf("MyCreateProcess: waitFinish=%d event=%p\n",(unsigned)waitFinish,event);
- printf("\tparams : %ls\n",(const wchar_t*)params);
- printf("\tcurDir : %ls\n",(const wchar_t*)curDir);
-
- wxString cmd(params);
- wxString memoCurDir = wxGetCwd();
-
- if (curDir) { // FIXME
- wxSetWorkingDirectory(wxString(curDir));
-
-
- // under MacOSX, a bundle does not keep the current directory
- // between 7zFM and 7zG ...
- // So, try to use the environment variable P7ZIP_CURRENT_DIR
-
- char p7zip_current_dir[MAX_PATH];
-
- AString aCurPath = GetAnsiString(curDir);
-
- const char *dir2 = nameWindowToUnix((const char *)aCurPath);
-
- snprintf(p7zip_current_dir,sizeof(p7zip_current_dir),"P7ZIP_CURRENT_DIR=%s/",dir2);
-
- p7zip_current_dir[sizeof(p7zip_current_dir)-1] = 0;
-
- putenv(p7zip_current_dir);
-
- printf("putenv(%s)\n",p7zip_current_dir);
-
- }
-
-
- printf("MyCreateProcess: cmd='%ls'\n",(const wchar_t *)cmd);
- long pid = 0;
- if (waitFinish) pid = wxExecute(cmd, wxEXEC_SYNC); // FIXME process never ends and stays zombie ...
- else pid = wxExecute(cmd, wxEXEC_ASYNC);
-
- if (curDir) wxSetWorkingDirectory(memoCurDir);
-
-
- // FIXME if (pid == 0) return E_FAIL;
-
- return S_OK;
-#ifdef _WIN32 // FIXME
- const UString params2 = params;
- BOOL result;
- {
- STARTUPINFOW startupInfo;
- startupInfo.cb = sizeof(startupInfo);
- startupInfo.lpReserved = 0;
- startupInfo.lpDesktop = 0;
- startupInfo.lpTitle = 0;
- startupInfo.dwFlags = 0;
- startupInfo.cbReserved2 = 0;
- startupInfo.lpReserved2 = 0;
-
- result = ::CreateProcessW(NULL, (LPWSTR)(LPCWSTR)params,
- NULL, NULL, FALSE, 0, NULL,
- curDir,
- &startupInfo, &processInformation);
- }
- if (result == 0)
- return ::GetLastError();
- else
- {
- ::CloseHandle(processInformation.hThread);
- if (waitFinish)
- WaitForSingleObject(processInformation.hProcess, INFINITE);
- else if (event != NULL)
- {
- HANDLE handles[] = {processInformation.hProcess, *event };
- ::WaitForMultipleObjects(sizeof(handles) / sizeof(handles[0]),
- handles, FALSE, INFINITE);
- }
- ::CloseHandle(processInformation.hProcess);
- }
- return S_OK;
-#endif
-}
-
-UString GetQuotedString(const UString &s)
-{
- return UString(L"\"") + s + UString(L"\"");
-}
-
-static UString Get7zGuiPath()
-{
- UString path;
- UString folder;
- if (GetProgramFolderPath(folder))
- path += folder;
-#ifdef _WIN32
- path += L"7zG.exe";
-#else
- path += L"7zG";
-#endif
- return GetQuotedString(path);
-}
-
-#ifdef _WIN32
-static HRESULT CreateTempEvent(const wchar_t *name,
- NSynchronization::CManualResetEvent &event, UString &eventName)
-{
- CRandom random;
- random.Init(GetTickCount());
- for (;;)
- {
- int number = random.Generate();
- wchar_t temp[32];
- ConvertUInt64ToString((UInt32)number, temp);
- eventName = name;
- eventName += temp;
- RINOK(event.CreateWithName(false, GetSystemString(eventName)));
- if (::GetLastError() != ERROR_ALREADY_EXISTS)
- return S_OK;
- event.Close();
- }
-}
-
-static HRESULT CreateMap(const UStringVector &names,
- const UString &id,
- CFileMapping &fileMapping, NSynchronization::CManualResetEvent &event,
- UString &params)
-{
- UInt32 extraSize = 2;
- UInt32 dataSize = 0;
- for (int i = 0; i < names.Size(); i++)
- dataSize += (names[i].Length() + 1) * sizeof(wchar_t);
- UInt32 totalSize = extraSize + dataSize;
-
- UString mappingName;
-
- CRandom random;
- random.Init(GetTickCount());
- for (;;)
- {
- int number = random.Generate();
- wchar_t temp[32];
- ConvertUInt64ToString(UInt32(number), temp);
- mappingName = id;
- mappingName += L"Mapping";
- mappingName += temp;
- if (!fileMapping.Create(INVALID_HANDLE_VALUE, NULL,
- PAGE_READWRITE, totalSize, GetSystemString(mappingName)))
- return E_FAIL;
- if (::GetLastError() != ERROR_ALREADY_EXISTS)
- break;
- fileMapping.Close();
- }
-
- UString eventName;
- RINOK(CreateTempEvent(id + L"MappingEndEvent", event, eventName));
-
- params += mappingName;
- params += L":";
- wchar_t string[10];
- ConvertUInt64ToString(totalSize, string);
- params += string;
-
- params += L":";
- params += eventName;
-
- LPVOID data = fileMapping.MapViewOfFile(FILE_MAP_WRITE, 0, totalSize);
- if (data == NULL)
- return E_FAIL;
- {
- wchar_t *curData = (wchar_t *)data;
- *curData = 0;
- curData++;
- for (int i = 0; i < names.Size(); i++)
- {
- const UString &s = names[i];
- memcpy(curData, (const wchar_t *)s, s.Length() * sizeof(wchar_t));
- curData += s.Length();
- *curData++ = L'\0';
- }
- }
- return S_OK;
-}
-#endif
-
-HRESULT CompressFiles(
- const UString &curDir,
- const UString &archiveName,
- const UString &archiveType,
- const UStringVector &names,
- // const UString &outFolder,
- bool email,
- bool showDialog,
- bool waitFinish)
-{
- /*
- UString curDir;
- if (names.Size() > 0)
- {
- NFile::NDirectory::GetOnlyDirPrefix(names[0], curDir);
- }
- */
- UString params;
- params = Get7zGuiPath();
- params += L" a";
-#ifdef _WIN32
- params += kMapSwitch;
- // params += _fileNames[0];
-
- UInt32 extraSize = 2;
- UInt32 dataSize = 0;
- for (int i = 0; i < names.Size(); i++)
- dataSize += (names[i].Length() + 1) * sizeof(wchar_t);
- UInt32 totalSize = extraSize + dataSize;
-
- UString mappingName;
-
- CFileMapping fileMapping;
- CRandom random;
- random.Init(GetTickCount());
- for (;;)
- {
- int number = random.Generate();
- wchar_t temp[32];
- ConvertUInt64ToString(UInt32(number), temp);
- mappingName = L"7zCompressMapping";
- mappingName += temp;
- if (!fileMapping.Create(INVALID_HANDLE_VALUE, NULL,
- PAGE_READWRITE, totalSize, GetSystemString(mappingName)))
- {
- // MyMessageBox(IDS_ERROR, 0x02000605);
- return E_FAIL;
- }
- if (::GetLastError() != ERROR_ALREADY_EXISTS)
- break;
- fileMapping.Close();
- }
-
- NSynchronization::CManualResetEvent event;
- UString eventName;
- RINOK(CreateTempEvent(L"7zCompressMappingEndEvent", event, eventName));
-
- params += mappingName;
- params += L":";
- wchar_t string[10];
- ConvertUInt64ToString(totalSize, string);
- params += string;
-
- params += L":";
- params += eventName;
-#else
- char tempFile[256];
- static int count = 1000;
-
- sprintf(tempFile,"/tmp/7zCompress_%d_%d.tmp",(int)getpid(),count++);
-
- FILE * file = fopen(tempFile,"w");
- if (file)
- {
- for (int i = 0; i < names.Size(); i++) {
- fprintf(file,"%ls\n",(const wchar_t *)names[i]);
- printf(" TMP_%d : '%ls'\n",i,(const wchar_t *)names[i]);
- }
-
- fclose(file);
- }
- params += L" -i@";
- params += GetUnicodeString(tempFile);
-#endif
-
- if (!archiveType.IsEmpty())
- {
- params += kArchiveTypeSwitch;
- params += archiveType;
- }
-
- if (email)
- params += kEmailSwitch;
-
- if (showDialog)
- params += kShowDialogSwitch;
-
- AddLagePagesSwitch(params);
-
- params += kStopSwitchParsing;
- params += L" ";
-
- params += GetQuotedString(archiveName);
-
-#ifdef _WIN32
- LPVOID data = fileMapping.MapViewOfFile(FILE_MAP_WRITE, 0, totalSize);
- if (data == NULL)
- {
- // MyMessageBox(IDS_ERROR, 0x02000605);
- return E_FAIL;
- }
- try
- {
- wchar_t *curData = (wchar_t *)data;
- *curData = 0;
- curData++;
- for (int i = 0; i < names.Size(); i++)
- {
- const UString &unicodeString = names[i];
- memcpy(curData, (const wchar_t *)unicodeString ,
- unicodeString .Length() * sizeof(wchar_t));
- curData += unicodeString.Length();
- *curData++ = L'\0';
- }
- // MessageBox(0, params, 0, 0);
- RINOK(MyCreateProcess(params,
- (curDir.IsEmpty()? 0: (LPCWSTR)curDir),
- waitFinish, &event));
- }
- catch(...)
- {
- UnmapViewOfFile(data);
- throw;
- }
- UnmapViewOfFile(data);
-
-
- /*
- CThreadCompressMain *compressor = new CThreadCompressMain();;
- compressor->FileNames = _fileNames;
- CThread thread;
- if (!thread.Create(CThreadCompressMain::MyThreadFunction, compressor))
- throw 271824;
- */
-#else
- printf("CompressFiles : -%ls-\n",(const wchar_t *)params);
- HRESULT res = MyCreateProcess(params,
- (curDir.IsEmpty()? 0: (LPCWSTR)curDir),
- true, /* &event FIXME */ 0);
- printf("CompressFiles : END\n");
-
- remove(tempFile);
-#endif
- return S_OK;
-}
-
-static HRESULT ExtractGroupCommand(const UStringVector &archivePaths,
- const UString &params)
-{
- UString params2 = params;
- AddLagePagesSwitch(params2);
- params2 += kArchiveNoNameSwitch;
-#ifdef _WIN32
- params2 += kArchiveMapSwitch;
- CFileMapping fileMapping;
- NSynchronization::CManualResetEvent event;
- RINOK(CreateMap(archivePaths, L"7zExtract", fileMapping, event, params2));
- return MyCreateProcess(params2, 0, false, &event);
-#else
- char tempFile[256];
- static int count = 1000;
-
- sprintf(tempFile,"/tmp/7zExtract_%d_%d.tmp",(int)getpid(),count++);
-
- FILE * file = fopen(tempFile,"w");
- if (file)
- {
- for (int i = 0; i < archivePaths.Size(); i++) {
- fprintf(file,"%ls\n",(const wchar_t *)archivePaths[i]);
- printf(" TMP_%d : '%ls'\n",i,(const wchar_t *)archivePaths[i]);
- }
-
- fclose(file);
- }
- params2 += L" -ai@";
- params2 += GetUnicodeString(tempFile);
- printf("ExtractGroupCommand : -%ls-\n",(const wchar_t *)params2);
- HRESULT res = MyCreateProcess(params2, 0, true, /* &event FIXME */ 0);
- printf("ExtractGroupCommand : END\n");
-
- remove(tempFile);
-
- return res;
-#endif
-}
-
-HRESULT ExtractArchives(const UStringVector &archivePaths,
- const UString &outFolder, bool showDialog)
-{
- UString params;
- params = Get7zGuiPath();
- params += L" x";
- if (!outFolder.IsEmpty())
- {
- params += L" \"-o";
- params += outFolder;
- params += L"\"";
- }
- if (showDialog)
- params += kShowDialogSwitch;
- return ExtractGroupCommand(archivePaths, params);
-}
-
-HRESULT TestArchives(const UStringVector &archivePaths)
-{
- UString params;
- params = Get7zGuiPath();
- params += L" t";
- return ExtractGroupCommand(archivePaths, params);
-}
-
-HRESULT Benchmark()
-{
- UString params;
- params = Get7zGuiPath();
- params += L" b";
- return MyCreateProcess(params, 0, false, NULL);
-}
diff --git a/src/libs/7zip/unix/CPP/7zip/UI/Common/CompressCall.h b/src/libs/7zip/unix/CPP/7zip/UI/Common/CompressCall.h
deleted file mode 100644
index fc18df57c..000000000
--- a/src/libs/7zip/unix/CPP/7zip/UI/Common/CompressCall.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// CompressCall.h
-
-#ifndef __COMPRESS_CALL_H
-#define __COMPRESS_CALL_H
-
-#include "Common/MyString.h"
-
-UString GetQuotedString(const UString &s);
-
-extern HWND g_HWND;
-UString HResultToMessage(HRESULT errorCode);
-
-HRESULT CompressFiles(
- const UString &arcPathPrefix,
- const UString &arcName,
- const UString &arcType,
- const UStringVector &names,
- bool email, bool showDialog, bool waitFinish);
-
-HRESULT ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog);
-HRESULT TestArchives(const UStringVector &arcPaths);
-HRESULT Benchmark();
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/UI/Common/HandlerLoader.h b/src/libs/7zip/unix/CPP/7zip/UI/Common/HandlerLoader.h
deleted file mode 100644
index 4c7e1a8f4..000000000
--- a/src/libs/7zip/unix/CPP/7zip/UI/Common/HandlerLoader.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// HandlerLoader.h
-
-#ifndef __HANDLERLOADER_H
-#define __HANDLERLOADER_H
-
-#include "../../ICoder.h"
-#include "Windows/DLL.h"
-
-typedef UInt32 (WINAPI * CreateObjectFunc)(
- const GUID *clsID,
- const GUID *interfaceID,
- void **outObject);
-
-class CHandlerLoader: public NWindows::NDLL::CLibrary
-{
-public:
- HRESULT CreateHandler(LPCWSTR filepath, REFGUID clsID,
- void **archive, bool outHandler)
- {
- if (!Load(filepath))
- return GetLastError();
- CreateObjectFunc createObject = (CreateObjectFunc)
- GetProcAddress("CreateObject");
- if (createObject == NULL)
- {
- HRESULT res = ::GetLastError();
- Free();
- return res;
- }
- HRESULT res = createObject(&clsID,
- outHandler ? &IID_IOutArchive : &IID_IInArchive, (void **)archive);
- if (res != 0)
- Free();
- return res;
- }
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/7zip/UI/Common/UpdatePair.cpp b/src/libs/7zip/unix/CPP/7zip/UI/Common/UpdatePair.cpp
index a43a9e770..d9396a583 100644
--- a/src/libs/7zip/unix/CPP/7zip/UI/Common/UpdatePair.cpp
+++ b/src/libs/7zip/unix/CPP/7zip/UI/Common/UpdatePair.cpp
@@ -28,13 +28,6 @@ static int MyCompareTime(NFileTimeType::EEnum fileTimeType, const FILETIME &time
FileTimeToUnixTime(time2, unixTime2);
return MyCompare(unixTime1, unixTime2);
}
- case NFileTimeType::kDOS:
- {
- UInt32 dosTime1, dosTime2;
- FileTimeToDosTime(time1, dosTime1);
- FileTimeToDosTime(time2, dosTime2);
- return MyCompare(dosTime1, dosTime2);
- }
}
throw 4191618;
}
diff --git a/src/libs/7zip/unix/CPP/7zip/UI/Common/ZipRegistry.cpp b/src/libs/7zip/unix/CPP/7zip/UI/Common/ZipRegistry.cpp
deleted file mode 100644
index ac178078a..000000000
--- a/src/libs/7zip/unix/CPP/7zip/UI/Common/ZipRegistry.cpp
+++ /dev/null
@@ -1,293 +0,0 @@
-// ZipRegistry.cpp
-
-#include "StdAfx.h"
-
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/FileDir.h"
-#include "Windows/Registry.h"
-#include "Windows/Synchronization.h"
-
-#include "ZipRegistry.h"
-
-using namespace NWindows;
-using namespace NRegistry;
-
-static NSynchronization::CCriticalSection g_CS;
-#define CS_LOCK NSynchronization::CCriticalSectionLock lock(g_CS);
-
-static const TCHAR *kCuPrefix = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-Zip") TEXT(STRING_PATH_SEPARATOR);
-
-static CSysString GetKeyPath(const CSysString &path) { return kCuPrefix + path; }
-
-static LONG OpenMainKey(CKey &key, LPCTSTR keyName)
-{
- return key.Open(HKEY_CURRENT_USER, GetKeyPath(keyName), KEY_READ);
-}
-
-static LONG CreateMainKey(CKey &key, LPCTSTR keyName)
-{
- return key.Create(HKEY_CURRENT_USER, GetKeyPath(keyName));
-}
-
-namespace NExtract
-{
-
-static const TCHAR *kKeyName = TEXT("Extraction");
-
-static const TCHAR *kExtractMode = TEXT("ExtractMode");
-static const TCHAR *kOverwriteMode = TEXT("OverwriteMode");
-static const TCHAR *kShowPassword = TEXT("ShowPassword");
-static const TCHAR *kPathHistory = TEXT("PathHistory");
-
-void CInfo::Save() const
-{
- CS_LOCK
- CKey key;
- CreateMainKey(key, kKeyName);
- key.SetValue(kExtractMode, (UInt32)PathMode);
- key.SetValue(kOverwriteMode, (UInt32)OverwriteMode);
- key.SetValue(kShowPassword, ShowPassword);
- key.RecurseDeleteKey(kPathHistory);
- key.SetValue_Strings(kPathHistory, Paths);
-}
-
-
-void CInfo::Load()
-{
- PathMode = NPathMode::kCurrentPathnames;
- OverwriteMode = NOverwriteMode::kAskBefore;
- ShowPassword = false;
- Paths.Clear();
-
- CS_LOCK
- CKey key;
- if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)
- return;
-
- key.GetValue_Strings(kPathHistory, Paths);
- UInt32 v;
- if (key.QueryValue(kExtractMode, v) == ERROR_SUCCESS && v <= NPathMode::kNoPathnames)
- PathMode = (NPathMode::EEnum)v;
- if (key.QueryValue(kOverwriteMode, v) == ERROR_SUCCESS && v <= NOverwriteMode::kAutoRenameExisting)
- OverwriteMode = (NOverwriteMode::EEnum)v;
- key.GetValue_IfOk(kShowPassword, ShowPassword);
-}
-
-}
-
-namespace NCompression
-{
-
-static const TCHAR *kKeyName = TEXT("Compression");
-
-static const TCHAR *kArcHistory = TEXT("ArcHistory");
-static const WCHAR *kArchiver = L"Archiver";
-static const TCHAR *kShowPassword = TEXT("ShowPassword");
-static const TCHAR *kEncryptHeaders = TEXT("EncryptHeaders");
-
-static const TCHAR *kOptionsKeyName = TEXT("Options");
-
-static const TCHAR *kLevel = TEXT("Level");
-static const TCHAR *kDictionary = TEXT("Dictionary");
-static const TCHAR *kOrder = TEXT("Order");
-static const TCHAR *kBlockSize = TEXT("BlockSize");
-static const TCHAR *kNumThreads = TEXT("NumThreads");
-static const WCHAR *kMethod = L"Method";
-static const WCHAR *kOptions = L"Options";
-static const WCHAR *kEncryptionMethod = L"EncryptionMethod";
-
-static void SetRegString(CKey &key, const WCHAR *name, const UString &value)
-{
- if (value.IsEmpty())
- key.DeleteValue(name);
- else
- key.SetValue(name, value);
-}
-
-static void SetRegUInt32(CKey &key, const TCHAR *name, UInt32 value)
-{
- if (value == (UInt32)-1)
- key.DeleteValue(name);
- else
- key.SetValue(name, value);
-}
-
-static void GetRegString(CKey &key, const WCHAR *name, UString &value)
-{
- if (key.QueryValue(name, value) != ERROR_SUCCESS)
- value.Empty();
-}
-
-static void GetRegUInt32(CKey &key, const TCHAR *name, UInt32 &value)
-{
- if (key.QueryValue(name, value) != ERROR_SUCCESS)
- value = (UInt32)-1;
-}
-
-void CInfo::Save() const
-{
- CS_LOCK
-
- CKey key;
- CreateMainKey(key, kKeyName);
- key.SetValue(kLevel, (UInt32)Level);
- key.SetValue(kArchiver, ArcType);
- key.SetValue(kShowPassword, ShowPassword);
- key.SetValue(kEncryptHeaders, EncryptHeaders);
- key.RecurseDeleteKey(kArcHistory);
- key.SetValue_Strings(kArcHistory, ArcPaths);
-
- key.RecurseDeleteKey(kOptionsKeyName);
- {
- CKey optionsKey;
- optionsKey.Create(key, kOptionsKeyName);
- for (int i = 0; i < Formats.Size(); i++)
- {
- const CFormatOptions &fo = Formats[i];
- CKey fk;
- fk.Create(optionsKey, fo.FormatID);
-
- SetRegUInt32(fk, kLevel, fo.Level);
- SetRegUInt32(fk, kDictionary, fo.Dictionary);
- SetRegUInt32(fk, kOrder, fo.Order);
- SetRegUInt32(fk, kBlockSize, fo.BlockLogSize);
- SetRegUInt32(fk, kNumThreads, fo.NumThreads);
-
- SetRegString(fk, kMethod, fo.Method);
- SetRegString(fk, kOptions, fo.Options);
- SetRegString(fk, kEncryptionMethod, fo.EncryptionMethod);
- }
- }
-}
-
-void CInfo::Load()
-{
- ArcPaths.Clear();
- Formats.Clear();
-
- Level = 5;
- ArcType = L"7z";
- ShowPassword = false;
- EncryptHeaders = false;
-
- CS_LOCK
- CKey key;
-
- if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)
- return;
-
- key.GetValue_Strings(kArcHistory, ArcPaths);
-
- {
- CKey optionsKey;
- if (optionsKey.Open(key, kOptionsKeyName, KEY_READ) == ERROR_SUCCESS)
- {
- CSysStringVector formatIDs;
- optionsKey.EnumKeys(formatIDs);
- for (int i = 0; i < formatIDs.Size(); i++)
- {
- CKey fk;
- CFormatOptions fo;
- fo.FormatID = formatIDs[i];
- if (fk.Open(optionsKey, fo.FormatID, KEY_READ) == ERROR_SUCCESS)
- {
- GetRegString(fk, kOptions, fo.Options);
- GetRegString(fk, kMethod, fo.Method);
- GetRegString(fk, kEncryptionMethod, fo.EncryptionMethod);
-
- GetRegUInt32(fk, kLevel, fo.Level);
- GetRegUInt32(fk, kDictionary, fo.Dictionary);
- GetRegUInt32(fk, kOrder, fo.Order);
- GetRegUInt32(fk, kBlockSize, fo.BlockLogSize);
- GetRegUInt32(fk, kNumThreads, fo.NumThreads);
-
- Formats.Add(fo);
- }
- }
- }
- }
-
- UString a;
- if (key.QueryValue(kArchiver, a) == ERROR_SUCCESS)
- ArcType = a;
- key.GetValue_IfOk(kLevel, Level);
- key.GetValue_IfOk(kShowPassword, ShowPassword);
- key.GetValue_IfOk(kEncryptHeaders, EncryptHeaders);
-}
-
-}
-
-static const TCHAR *kOptionsInfoKeyName = TEXT("Options");
-
-namespace NWorkDir
-{
-static const TCHAR *kWorkDirType = TEXT("WorkDirType");
-static const WCHAR *kWorkDirPath = L"WorkDirPath";
-static const TCHAR *kTempRemovableOnly = TEXT("TempRemovableOnly");
-
-
-void CInfo::Save()const
-{
- CS_LOCK
- CKey key;
- CreateMainKey(key, kOptionsInfoKeyName);
- key.SetValue(kWorkDirType, (UInt32)Mode);
- key.SetValue(kWorkDirPath, Path);
- key.SetValue(kTempRemovableOnly, ForRemovableOnly);
-}
-
-void CInfo::Load()
-{
- SetDefault();
-
- CS_LOCK
- CKey key;
- if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS)
- return;
-
- UInt32 dirType;
- if (key.QueryValue(kWorkDirType, dirType) != ERROR_SUCCESS)
- return;
- switch (dirType)
- {
- case NMode::kSystem:
- case NMode::kCurrent:
- case NMode::kSpecified:
- Mode = (NMode::EEnum)dirType;
- }
- if (key.QueryValue(kWorkDirPath, Path) != ERROR_SUCCESS)
- {
- Path.Empty();
- if (Mode == NMode::kSpecified)
- Mode = NMode::kSystem;
- }
- key.GetValue_IfOk(kTempRemovableOnly, ForRemovableOnly);
-}
-
-}
-
-static const TCHAR *kCascadedMenu = TEXT("CascadedMenu");
-static const TCHAR *kContextMenu = TEXT("ContextMenu");
-
-void CContextMenuInfo::Save() const
-{
- CS_LOCK
- CKey key;
- CreateMainKey(key, kOptionsInfoKeyName);
- key.SetValue(kCascadedMenu, Cascaded);
- key.SetValue(kContextMenu, Flags);
-}
-
-void CContextMenuInfo::Load()
-{
- Cascaded = true;
- Flags = (UInt32)-1;
- CS_LOCK
- CKey key;
- if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS)
- return;
- key.GetValue_IfOk(kCascadedMenu, Cascaded);
- key.GetValue_IfOk(kContextMenu, Flags);
-}
diff --git a/src/libs/7zip/unix/CPP/Common/DynamicBuffer.h b/src/libs/7zip/unix/CPP/Common/DynamicBuffer.h
index b5fd97823..eaac123e1 100644
--- a/src/libs/7zip/unix/CPP/Common/DynamicBuffer.h
+++ b/src/libs/7zip/unix/CPP/Common/DynamicBuffer.h
@@ -31,7 +31,7 @@ public:
this->Free();
if (buffer._capacity > 0)
{
- SetCapacity(buffer._capacity);
+ this->SetCapacity(buffer._capacity);
memmove(this->_items, buffer._items, buffer._capacity * sizeof(T));
}
return *this;
diff --git a/src/libs/7zip/unix/CPP/Common/Lang.cpp b/src/libs/7zip/unix/CPP/Common/Lang.cpp
deleted file mode 100644
index 75dfed426..000000000
--- a/src/libs/7zip/unix/CPP/Common/Lang.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-// Common/Lang.cpp
-
-#include "StdAfx.h"
-
-#include "Lang.h"
-#include "TextConfig.h"
-
-#include "../Windows/FileIO.h"
-#include "UTFConvert.h"
-#include "Defs.h"
-
-static bool HexStringToNumber(const UString &s, UInt32 &value)
-{
- value = 0;
- if (s.IsEmpty())
- return false;
- for (int i = 0; i < s.Length(); i++)
- {
- wchar_t c = s[i];
- int a;
- if (c >= L'0' && c <= L'9')
- a = c - L'0';
- else if (c >= L'A' && c <= L'F')
- a = 10 + c - L'A';
- else if (c >= L'a' && c <= L'f')
- a = 10 + c - L'a';
- else
- return false;
- value *= 0x10;
- value += a;
- }
- return true;
-}
-
-
-static bool WaitNextLine(const AString &s, int &pos)
-{
- for (; pos < s.Length(); pos++)
- if (s[pos] == 0x0A)
- return true;
- return false;
-}
-
-static int CompareLangItems(void *const *elem1, void *const *elem2, void *)
-{
- const CLangPair &langPair1 = *(*((const CLangPair **)elem1));
- const CLangPair &langPair2 = *(*((const CLangPair **)elem2));
- return MyCompare(langPair1.Value, langPair2.Value);
-}
-
-bool CLang::Open(LPCWSTR fileName)
-{
- _langPairs.Clear();
- NWindows::NFile::NIO::CInFile file;
- if (!file.Open(fileName))
- return false;
- UInt64 length;
- if (!file.GetLength(length))
- return false;
- if (length > (1 << 20))
- return false;
- AString s;
- char *p = s.GetBuffer((int)length + 1);
- UInt32 processed;
- if (!file.Read(p, (UInt32)length, processed))
- return false;
- p[(UInt32)length] = 0;
- s.ReleaseBuffer();
- file.Close();
- int pos = 0;
- if (s.Length() >= 3)
- {
- if (Byte(s[0]) == 0xEF && Byte(s[1]) == 0xBB && Byte(s[2]) == 0xBF)
- pos += 3;
- }
-
- /////////////////////
- // read header
-
- AString stringID = ";!@Lang@!UTF-8!";
- if (s.Mid(pos, stringID.Length()) != stringID)
- return false;
- pos += stringID.Length();
-
- if (!WaitNextLine(s, pos))
- return false;
-
- CObjectVector<CTextConfigPair> pairs;
- if (!GetTextConfig(s.Mid(pos), pairs))
- return false;
-
- _langPairs.Reserve(_langPairs.Size());
- for (int i = 0; i < pairs.Size(); i++)
- {
- CTextConfigPair textConfigPair = pairs[i];
- CLangPair langPair;
- if (!HexStringToNumber(textConfigPair.ID, langPair.Value))
- return false;
- langPair.String = textConfigPair.String;
- _langPairs.Add(langPair);
- }
- _langPairs.Sort(CompareLangItems, NULL);
- return true;
-}
-
-int CLang::FindItem(UInt32 value) const
-{
- int left = 0, right = _langPairs.Size();
- while (left != right)
- {
- UInt32 mid = (left + right) / 2;
- UInt32 midValue = _langPairs[mid].Value;
- if (value == midValue)
- return mid;
- if (value < midValue)
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
-}
-
-bool CLang::GetMessage(UInt32 value, UString &message) const
-{
- int index = FindItem(value);
- if (index < 0)
- return false;
- message = _langPairs[index].String;
- return true;
-}
diff --git a/src/libs/7zip/unix/CPP/Common/Lang.h b/src/libs/7zip/unix/CPP/Common/Lang.h
deleted file mode 100644
index cf978758e..000000000
--- a/src/libs/7zip/unix/CPP/Common/Lang.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Common/Lang.h
-
-#ifndef __COMMON_LANG_H
-#define __COMMON_LANG_H
-
-#include "MyVector.h"
-#include "MyString.h"
-#include "Types.h"
-
-struct CLangPair
-{
- UInt32 Value;
- UString String;
-};
-
-class CLang
-{
- CObjectVector<CLangPair> _langPairs;
-public:
- bool Open(LPCWSTR fileName);
- void Clear() { _langPairs.Clear(); }
- int FindItem(UInt32 value) const;
- bool GetMessage(UInt32 value, UString &message) const;
-};
-
-#endif
-
-
diff --git a/src/libs/7zip/unix/CPP/Common/MyMap.cpp b/src/libs/7zip/unix/CPP/Common/MyMap.cpp
deleted file mode 100644
index 0ee11e8cd..000000000
--- a/src/libs/7zip/unix/CPP/Common/MyMap.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-// MyMap.cpp
-
-#include "StdAfx.h"
-
-#include "MyMap.h"
-
-static const unsigned kNumBitsMax = sizeof(UInt32) * 8;
-
-static UInt32 GetSubBits(UInt32 value, unsigned startPos, unsigned numBits)
-{
- if (startPos == sizeof(value) * 8)
- return 0;
- value >>= startPos;
- if (numBits == sizeof(value) * 8)
- return value;
- return value & (((UInt32)1 << numBits) - 1);
-}
-
-static inline unsigned GetSubBit(UInt32 v, unsigned n) { return (unsigned)(v >> n) & 1; }
-
-bool CMap32::Find(UInt32 key, UInt32 &valueRes) const
-{
- valueRes = (UInt32)(Int32)-1;
- if (Nodes.Size() == 0)
- return false;
- if (Nodes.Size() == 1)
- {
- const CNode &n = Nodes[0];
- if (n.Len == kNumBitsMax)
- {
- valueRes = n.Values[0];
- return (key == n.Key);
- }
- }
-
- int cur = 0;
- unsigned bitPos = kNumBitsMax;
- for (;;)
- {
- const CNode &n = Nodes[cur];
- bitPos -= n.Len;
- if (GetSubBits(key, bitPos, n.Len) != GetSubBits(n.Key, bitPos, n.Len))
- return false;
- unsigned bit = GetSubBit(key, --bitPos);
- if (n.IsLeaf[bit])
- {
- valueRes = n.Values[bit];
- return (key == n.Keys[bit]);
- }
- cur = (int)n.Keys[bit];
- }
-}
-
-bool CMap32::Set(UInt32 key, UInt32 value)
-{
- if (Nodes.Size() == 0)
- {
- CNode n;
- n.Key = n.Keys[0] = n.Keys[1] = key;
- n.Values[0] = n.Values[1] = value;
- n.IsLeaf[0] = n.IsLeaf[1] = 1;
- n.Len = kNumBitsMax;
- Nodes.Add(n);
- return false;
- }
- if (Nodes.Size() == 1)
- {
- CNode &n = Nodes[0];
- if (n.Len == kNumBitsMax)
- {
- if (key == n.Key)
- {
- n.Values[0] = n.Values[1] = value;
- return true;
- }
- unsigned i = kNumBitsMax - 1;
- for (;GetSubBit(key, i) == GetSubBit(n.Key, i); i--);
- n.Len = (UInt16)(kNumBitsMax - (1 + i));
- unsigned newBit = GetSubBit(key, i);
- n.Values[newBit] = value;
- n.Keys[newBit] = key;
- return false;
- }
- }
-
- int cur = 0;
- unsigned bitPos = kNumBitsMax;
- for (;;)
- {
- CNode &n = Nodes[cur];
- bitPos -= n.Len;
- if (GetSubBits(key, bitPos, n.Len) != GetSubBits(n.Key, bitPos, n.Len))
- {
- unsigned i = n.Len - 1;
- for (; GetSubBit(key, bitPos + i) == GetSubBit(n.Key, bitPos + i); i--);
-
- CNode e2(n);
- e2.Len = (UInt16)i;
-
- n.Len = (UInt16)(n.Len - (1 + i));
- unsigned newBit = GetSubBit(key, bitPos + i);
- n.Values[newBit] = value;
- n.IsLeaf[newBit] = 1;
- n.IsLeaf[1 - newBit] = 0;
- n.Keys[newBit] = key;
- n.Keys[1 - newBit] = Nodes.Size();
- Nodes.Add(e2);
- return false;
- }
- unsigned bit = GetSubBit(key, --bitPos);
-
- if (n.IsLeaf[bit])
- {
- if (key == n.Keys[bit])
- {
- n.Values[bit] = value;
- return true;
- }
- unsigned i = bitPos - 1;
- for (;GetSubBit(key, i) == GetSubBit(n.Keys[bit], i); i--);
-
- CNode e2;
-
- unsigned newBit = GetSubBit(key, i);
- e2.Values[newBit] = value;
- e2.Values[1 - newBit] = n.Values[bit];
- e2.IsLeaf[newBit] = e2.IsLeaf[1 - newBit] = 1;
- e2.Keys[newBit] = key;
- e2.Keys[1 - newBit] = e2.Key = n.Keys[bit];
- e2.Len = (UInt16)(bitPos - (1 + i));
-
- n.IsLeaf[bit] = 0;
- n.Keys[bit] = Nodes.Size();
-
- Nodes.Add(e2);
- return false;
- }
- cur = (int)n.Keys[bit];
- }
-}
diff --git a/src/libs/7zip/unix/CPP/Common/MyMap.h b/src/libs/7zip/unix/CPP/Common/MyMap.h
deleted file mode 100644
index d0dd43f53..000000000
--- a/src/libs/7zip/unix/CPP/Common/MyMap.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// MyMap.h
-
-#ifndef __COMMON_MYMAP_H
-#define __COMMON_MYMAP_H
-
-#include "MyVector.h"
-#include "Types.h"
-
-class CMap32
-{
- struct CNode
- {
- UInt32 Key;
- UInt32 Keys[2];
- UInt32 Values[2];
- UInt16 Len;
- Byte IsLeaf[2];
- };
- CRecordVector<CNode> Nodes;
-
-public:
-
- void Clear() { Nodes.Clear(); }
- bool Find(UInt32 key, UInt32 &valueRes) const;
- bool Set(UInt32 key, UInt32 value); // returns true, if there is such key already
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/Common/MyXml.cpp b/src/libs/7zip/unix/CPP/Common/MyXml.cpp
deleted file mode 100644
index 8aa9ce8cd..000000000
--- a/src/libs/7zip/unix/CPP/Common/MyXml.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-// MyXml.cpp
-
-#include "StdAfx.h"
-
-#include "MyXml.h"
-
-static bool IsValidChar(char c)
-{
- return
- c >= 'a' && c <= 'z' ||
- c >= 'A' && c <= 'Z' ||
- c >= '0' && c <= '9' ||
- c == '-';
-}
-
-static bool IsSpaceChar(char c)
-{
- return (c == ' ' || c == '\t' || c == 0x0D || c == 0x0A);
-}
-
-#define SKIP_SPACES(s, pos) while (IsSpaceChar(s[pos])) pos++;
-
-static bool ReadProperty(const AString &s, int &pos, CXmlProp &prop)
-{
- prop.Name.Empty();
- prop.Value.Empty();
- for (; pos < s.Length(); pos++)
- {
- char c = s[pos];
- if (!IsValidChar(c))
- break;
- prop.Name += c;
- }
-
- if (prop.Name.IsEmpty())
- return false;
-
- SKIP_SPACES(s, pos);
- if (s[pos++] != '=')
- return false;
-
- SKIP_SPACES(s, pos);
- if (s[pos++] != '\"')
- return false;
-
- while (pos < s.Length())
- {
- char c = s[pos++];
- if (c == '\"')
- return true;
- prop.Value += c;
- }
- return false;
-}
-
-int CXmlItem::FindProperty(const AString &propName) const
-{
- for (int i = 0; i < Props.Size(); i++)
- if (Props[i].Name == propName)
- return i;
- return -1;
-}
-
-AString CXmlItem::GetPropertyValue(const AString &propName) const
-{
- int index = FindProperty(propName);
- if (index >= 0)
- return Props[index].Value;
- return AString();
-}
-
-bool CXmlItem::IsTagged(const AString &tag) const
-{
- return (IsTag && Name == tag);
-}
-
-int CXmlItem::FindSubTag(const AString &tag) const
-{
- for (int i = 0; i < SubItems.Size(); i++)
- if (SubItems[i].IsTagged(tag))
- return i;
- return -1;
-}
-
-AString CXmlItem::GetSubString() const
-{
- if (SubItems.Size() == 1)
- {
- const CXmlItem &item = SubItems[0];
- if (!item.IsTag)
- return item.Name;
- }
- return AString();
-}
-
-AString CXmlItem::GetSubStringForTag(const AString &tag) const
-{
- int index = FindSubTag(tag);
- if (index >= 0)
- return SubItems[index].GetSubString();
- return AString();
-}
-
-bool CXmlItem::ParseItems(const AString &s, int &pos, int numAllowedLevels)
-{
- if (numAllowedLevels == 0)
- return false;
- SubItems.Clear();
- AString finishString = "</";
- for (;;)
- {
- SKIP_SPACES(s, pos);
-
- if (s.Mid(pos, finishString.Length()) == finishString)
- return true;
-
- CXmlItem item;
- if (!item.ParseItem(s, pos, numAllowedLevels - 1))
- return false;
- SubItems.Add(item);
- }
-}
-
-bool CXmlItem::ParseItem(const AString &s, int &pos, int numAllowedLevels)
-{
- SKIP_SPACES(s, pos);
-
- int pos2 = s.Find('<', pos);
- if (pos2 < 0)
- return false;
- if (pos2 != pos)
- {
- IsTag = false;
- Name += s.Mid(pos, pos2 - pos);
- pos = pos2;
- return true;
- }
- IsTag = true;
-
- pos++;
- SKIP_SPACES(s, pos);
-
- for (; pos < s.Length(); pos++)
- {
- char c = s[pos];
- if (!IsValidChar(c))
- break;
- Name += c;
- }
- if (Name.IsEmpty() || pos == s.Length())
- return false;
-
- int posTemp = pos;
- for (;;)
- {
- SKIP_SPACES(s, pos);
- if (s[pos] == '/')
- {
- pos++;
- // SKIP_SPACES(s, pos);
- return (s[pos++] == '>');
- }
- if (s[pos] == '>')
- {
- if (!ParseItems(s, ++pos, numAllowedLevels))
- return false;
- AString finishString = AString("</") + Name + AString(">");
- if (s.Mid(pos, finishString.Length()) != finishString)
- return false;
- pos += finishString.Length();
- return true;
- }
- if (posTemp == pos)
- return false;
-
- CXmlProp prop;
- if (!ReadProperty(s, pos, prop))
- return false;
- Props.Add(prop);
- posTemp = pos;
- }
-}
-
-static bool SkipHeader(const AString &s, int &pos, const AString &startString, const AString &endString)
-{
- SKIP_SPACES(s, pos);
- if (s.Mid(pos, startString.Length()) == startString)
- {
- pos = s.Find(endString, pos);
- if (pos < 0)
- return false;
- pos += endString.Length();
- SKIP_SPACES(s, pos);
- }
- return true;
-}
-
-bool CXml::Parse(const AString &s)
-{
- int pos = 0;
- if (!SkipHeader(s, pos, "<?xml", "?>"))
- return false;
- if (!SkipHeader(s, pos, "<!DOCTYPE", ">"))
- return false;
- if (!Root.ParseItem(s, pos, 1000))
- return false;
- SKIP_SPACES(s, pos);
- return (pos == s.Length() && Root.IsTag);
-}
diff --git a/src/libs/7zip/unix/CPP/Common/MyXml.h b/src/libs/7zip/unix/CPP/Common/MyXml.h
deleted file mode 100644
index c6e8829ad..000000000
--- a/src/libs/7zip/unix/CPP/Common/MyXml.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// MyXml.h
-
-#ifndef __MYXML_H
-#define __MYXML_H
-
-#include "MyString.h"
-
-struct CXmlProp
-{
- AString Name;
- AString Value;
-};
-
-class CXmlItem
-{
- bool ParseItems(const AString &s, int &pos, int numAllowedLevels);
-
-public:
- AString Name;
- bool IsTag;
- CObjectVector<CXmlProp> Props;
- CObjectVector<CXmlItem> SubItems;
-
- bool ParseItem(const AString &s, int &pos, int numAllowedLevels);
-
- bool IsTagged(const AString &tag) const;
- int FindProperty(const AString &propName) const;
- AString GetPropertyValue(const AString &propName) const;
- AString GetSubString() const;
- int FindSubTag(const AString &tag) const;
- AString GetSubStringForTag(const AString &tag) const;
-};
-
-struct CXml
-{
- CXmlItem Root;
- bool Parse(const AString &s);
-};
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/Common/TextConfig.cpp b/src/libs/7zip/unix/CPP/Common/TextConfig.cpp
deleted file mode 100644
index 6a55012c3..000000000
--- a/src/libs/7zip/unix/CPP/Common/TextConfig.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-// Common/TextConfig.cpp
-
-#include "StdAfx.h"
-
-#include "TextConfig.h"
-
-#include "Defs.h"
-#include "UTFConvert.h"
-
-static bool IsDelimitChar(char c)
-{
- return (c == ' ' || c == 0x0A || c == 0x0D ||
- c == '\0' || c == '\t');
-}
-
-static AString GetIDString(const char *string, int &finishPos)
-{
- AString result;
- for (finishPos = 0; ; finishPos++)
- {
- char c = string[finishPos];
- if (IsDelimitChar(c) || c == '=')
- break;
- result += c;
- }
- return result;
-}
-
-static bool WaitNextLine(const AString &string, int &pos)
-{
- for (;pos < string.Length(); pos++)
- if (string[pos] == 0x0A)
- return true;
- return false;
-}
-
-static bool SkipSpaces(const AString &string, int &pos)
-{
- for (;pos < string.Length(); pos++)
- {
- char c = string[pos];
- if (!IsDelimitChar(c))
- {
- if (c != ';')
- return true;
- if (!WaitNextLine(string, pos))
- return false;
- }
- }
- return false;
-}
-
-bool GetTextConfig(const AString &string, CObjectVector<CTextConfigPair> &pairs)
-{
- pairs.Clear();
- int pos = 0;
-
- /////////////////////
- // read strings
-
- for (;;)
- {
- if (!SkipSpaces(string, pos))
- break;
- CTextConfigPair pair;
- int finishPos;
- AString temp = GetIDString(((const char *)string) + pos, finishPos);
- if (!ConvertUTF8ToUnicode(temp, pair.ID))
- return false;
- if (finishPos == 0)
- return false;
- pos += finishPos;
- if (!SkipSpaces(string, pos))
- return false;
- if (string[pos] != '=')
- return false;
- pos++;
- if (!SkipSpaces(string, pos))
- return false;
- if (string[pos] != '\"')
- return false;
- pos++;
- AString message;
- for (;;)
- {
- if (pos >= string.Length())
- return false;
- char c = string[pos++];
- if (c == '\"')
- break;
- if (c == '\\') // FIXME ?
- {
- char c = string[pos++];
- switch(c)
- {
- case 'n':
- message += '\n';
- break;
- case 't':
- message += '\t';
- break;
- case '\\': // FIXME ?
- message += '\\';
- break;
- case '\"':
- message += '\"';
- break;
- default:
- message += '\\'; // FIXME ?
- message += c;
- break;
- }
- }
- else
- message += c;
- }
- if (!ConvertUTF8ToUnicode(message, pair.String))
- return false;
- pairs.Add(pair);
- }
- return true;
-}
-
-int FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const UString &id)
-{
- for (int i = 0; i < pairs.Size(); i++)
- if (pairs[i].ID.Compare(id) == 0)
- return i;
- return -1;
-}
-
-UString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const UString &id)
-{
- int index = FindTextConfigItem(pairs, id);
- if (index < 0)
- return UString();
- return pairs[index].String;
-}
diff --git a/src/libs/7zip/unix/CPP/Common/TextConfig.h b/src/libs/7zip/unix/CPP/Common/TextConfig.h
deleted file mode 100644
index a25142a70..000000000
--- a/src/libs/7zip/unix/CPP/Common/TextConfig.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Common/TextConfig.h
-
-#ifndef __COMMON_TEXTCONFIG_H
-#define __COMMON_TEXTCONFIG_H
-
-#include "MyVector.h"
-#include "MyString.h"
-
-struct CTextConfigPair
-{
- UString ID;
- UString String;
-};
-
-bool GetTextConfig(const AString &text, CObjectVector<CTextConfigPair> &pairs);
-
-int FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const UString &id);
-UString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const UString &id);
-
-#endif
-
-
diff --git a/src/libs/7zip/unix/CPP/Windows/COM.cpp b/src/libs/7zip/unix/CPP/Windows/COM.cpp
deleted file mode 100644
index a746de12b..000000000
--- a/src/libs/7zip/unix/CPP/Windows/COM.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-// Windows/COM.cpp
-
-#include "StdAfx.h"
-
-#include "Windows/COM.h"
-#include "Common/StringConvert.h"
-
-namespace NWindows {
-namespace NCOM {
-
-// CoInitialize (NULL); must be called!
-
-UString GUIDToStringW(REFGUID guid)
-{
- UString string;
- const int kStringSize = 48;
- StringFromGUID2(guid, string.GetBuffer(kStringSize), kStringSize);
- string.ReleaseBuffer();
- return string;
-}
-
-AString GUIDToStringA(REFGUID guid)
-{
- return UnicodeStringToMultiByte(GUIDToStringW(guid));
-}
-
-HRESULT StringToGUIDW(const wchar_t *string, GUID &classID)
-{
- return CLSIDFromString((wchar_t *)string, &classID);
-}
-
-HRESULT StringToGUIDA(const char *string, GUID &classID)
-{
- return StringToGUIDW(MultiByteToUnicodeString(string), classID);
-}
-
-}}
diff --git a/src/libs/7zip/unix/CPP/Windows/COM.h b/src/libs/7zip/unix/CPP/Windows/COM.h
deleted file mode 100644
index 506bbbc64..000000000
--- a/src/libs/7zip/unix/CPP/Windows/COM.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Windows/COM.h
-
-#ifndef __WINDOWS_COM_H
-#define __WINDOWS_COM_H
-
-#include "Common/MyString.h"
-
-namespace NWindows {
-namespace NCOM {
-
-#ifdef _WIN32
-
-class CComInitializer
-{
-public:
- CComInitializer()
- {
- #ifdef UNDER_CE
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
- #else
- // it's single thread. Do we need multithread?
- CoInitialize(NULL);
- #endif
- };
- ~CComInitializer() { CoUninitialize(); };
-};
-
-class CStgMedium
-{
- STGMEDIUM _object;
-public:
- bool _mustBeReleased;
- CStgMedium(): _mustBeReleased(false) {}
- ~CStgMedium() { Free(); }
- void Free()
- {
- if (_mustBeReleased)
- ReleaseStgMedium(&_object);
- _mustBeReleased = false;
- }
- const STGMEDIUM* operator->() const { return &_object;}
- STGMEDIUM* operator->() { return &_object;}
- STGMEDIUM* operator&() { return &_object; }
-};
-
-#endif
-
-//////////////////////////////////
-// GUID <--> String Conversions
-UString GUIDToStringW(REFGUID guid);
-AString GUIDToStringA(REFGUID guid);
-#ifdef UNICODE
- #define GUIDToString GUIDToStringW
-#else
- #define GUIDToString GUIDToStringA
-#endif
-
-HRESULT StringToGUIDW(const wchar_t *string, GUID &classID);
-HRESULT StringToGUIDA(const char *string, GUID &classID);
-#ifdef UNICODE
- #define StringToGUID StringToGUIDW
-#else
- #define StringToGUID StringToGUIDA
-#endif
-
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/Windows/Clipboard.cpp b/src/libs/7zip/unix/CPP/Windows/Clipboard.cpp
deleted file mode 100644
index bb081e153..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Clipboard.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-// Windows/Clipboard.cpp
-
-#include "StdAfx.h"
-
-
-#include "Windows/Clipboard.h"
-#include "Windows/Defs.h"
-#ifdef _WIN32
-#include "Windows/Memory.h"
-#include "Windows/Shell.h"
-#include "Windows/Memory.h"
-#else
-#include <wx/clipbrd.h>
-#include <wx/dataobj.h>
-#undef _WIN32
-#endif
-
-#include "Common/StringConvert.h"
-
-namespace NWindows {
-
-bool CClipboard::Open(HWND wndNewOwner)
-{
-#ifdef _WIN32
- m_Open = BOOLToBool(::OpenClipboard(wndNewOwner));
-#else
- m_Open = wxTheClipboard->Open();
-#endif
- return m_Open;
-}
-
-CClipboard::~CClipboard()
-{
- Close();
-}
-
-bool CClipboard::Close()
-{
- if (!m_Open)
- return true;
-#ifdef _WIN32
- m_Open = !BOOLToBool(CloseClipboard());
-#else
- wxTheClipboard->Close();
- m_Open = false;
-#endif
- return !m_Open;
-}
-
-#ifdef _WIN32
-bool ClipboardIsFormatAvailableHDROP()
-{
- return BOOLToBool(IsClipboardFormatAvailable(CF_HDROP));
-}
-#endif
-
-/*
-bool ClipboardGetTextString(AString &s)
-{
- s.Empty();
- if (!IsClipboardFormatAvailable(CF_TEXT))
- return false;
- CClipboard clipboard;
-
- if (!clipboard.Open(NULL))
- return false;
-
- HGLOBAL h = ::GetClipboardData(CF_TEXT);
- if (h != NULL)
- {
- NMemory::CGlobalLock globalLock(h);
- const char *p = (const char *)globalLock.GetPointer();
- if (p != NULL)
- {
- s = p;
- return true;
- }
- }
- return false;
-}
-*/
-
-/*
-bool ClipboardGetFileNames(UStringVector &names)
-{
- names.Clear();
- if (!IsClipboardFormatAvailable(CF_HDROP))
- return false;
- CClipboard clipboard;
-
- if (!clipboard.Open(NULL))
- return false;
-
- HGLOBAL h = ::GetClipboardData(CF_HDROP);
- if (h != NULL)
- {
- NMemory::CGlobalLock globalLock(h);
- void *p = (void *)globalLock.GetPointer();
- if (p != NULL)
- {
- NShell::CDrop drop(false);
- drop.Attach((HDROP)p);
- drop.QueryFileNames(names);
- return true;
- }
- }
- return false;
-}
-*/
-
-#ifdef _WIN32
-static bool ClipboardSetData(UINT uFormat, const void *data, size_t size)
-{
- NMemory::CGlobal global;
- if (!global.Alloc(GMEM_DDESHARE | GMEM_MOVEABLE, size))
- return false;
- {
- NMemory::CGlobalLock globalLock(global);
- LPVOID p = globalLock.GetPointer();
- if (p == NULL)
- return false;
- memcpy(p, data, size);
- }
- if (::SetClipboardData(uFormat, global) == NULL)
- return false;
- global.Detach();
- return true;
-}
-#endif
-
-bool ClipboardSetText(HWND owner, const UString &s)
-{
- CClipboard clipboard;
- if (!clipboard.Open(owner))
- return false;
-#ifdef _WIN32
- if (!::EmptyClipboard())
- return false;
-
- bool res;
- res = ClipboardSetData(CF_UNICODETEXT, (const wchar_t *)s, (s.Length() + 1) * sizeof(wchar_t));
- #ifndef _UNICODE
- AString a;
- a = UnicodeStringToMultiByte(s, CP_ACP);
- res |= ClipboardSetData(CF_TEXT, (const char *)a, (a.Length() + 1) * sizeof(char));
- a = UnicodeStringToMultiByte(s, CP_OEMCP);
- res |= ClipboardSetData(CF_OEMTEXT, (const char *)a, (a.Length() + 1) * sizeof(char));
- #endif
- return res;
-#else
- wxTheClipboard->Clear();
- // This data objects are held by the clipboard,
- // so do not delete them in the app.
- wxString ws(s);
- wxTheClipboard->SetData( new wxTextDataObject(ws) );
- return true;
-#endif
-}
-
-}
diff --git a/src/libs/7zip/unix/CPP/Windows/Clipboard.h b/src/libs/7zip/unix/CPP/Windows/Clipboard.h
deleted file mode 100644
index c80ba5ea7..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Clipboard.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Windows/Clipboard.h
-
-#ifndef __CLIPBOARD_H
-#define __CLIPBOARD_H
-
-#include "Common/MyString.h"
-
-namespace NWindows {
-
-class CClipboard
-{
- bool m_Open;
-public:
- CClipboard(): m_Open(false) {};
- ~CClipboard();
- bool Open(HWND wndNewOwner);
- bool Close();
-};
-
-bool ClipboardIsFormatAvailableHDROP();
-
-// bool ClipboardGetFileNames(UStringVector &names);
-// bool ClipboardGetTextString(AString &s);
-bool ClipboardSetText(HWND owner, const UString &s);
-
-}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/Windows/CommonDialog.h b/src/libs/7zip/unix/CPP/Windows/CommonDialog.h
deleted file mode 100644
index f24bb5b24..000000000
--- a/src/libs/7zip/unix/CPP/Windows/CommonDialog.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Windows/CommonDialog.h
-
-#ifndef __WINDOWS_COMMON_DIALOG_H
-#define __WINDOWS_COMMON_DIALOG_H
-
-#include "Common/MyString.h"
-
-namespace NWindows{
-
-bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName,
- LPCWSTR s, UString &resPath
- #ifdef UNDER_CE
- , bool openFolder = false
- #endif
-);
-
-}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/ComboBox.h b/src/libs/7zip/unix/CPP/Windows/Control/ComboBox.h
deleted file mode 100644
index 8717b4867..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/ComboBox.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Windows/Control/ComboBox.h
-
-#ifndef __WINDOWS_WX_CONTROL_COMBOBOX_H
-#define __WINDOWS_WX_CONTROL_COMBOBOX_H
-
-#include "Windows/Window.h"
-#include "Windows/Defs.h"
-
-
-#include "Windows/Control/Window2.h" // NMHDR
-
-#ifndef _WIN32
-#define CB_ERR (-1) // wxNOT_FOUND
-#endif
-
-typedef struct
-{
- NMHDR hdr;
-#define CBENF_ESCAPE 1
-#define CBENF_RETURN 2
- int iWhy;
-} NMCBEENDEDITW;
-
-typedef NMCBEENDEDITW * PNMCBEENDEDITW;
-
-
-class wxComboBox;
-
-namespace NWindows {
- namespace NControl {
-
- class CComboBox // : public CWindow
- {
- wxComboBox* _choice;
- public:
- CComboBox() : _choice(0) {}
-
- void Attach(wxWindow * newWindow);
- wxWindow * Detach();
- operator HWND() const;
-
- int AddString(const TCHAR * txt);
-
- void SetText(LPCTSTR s);
-
- void GetText(CSysString &s);
-
- int GetCount() const ;
- void GetLBText(int index, CSysString &s);
-
- void SetCurSel(int index);
- int GetCurSel();
-
- void SetItemData(int index, int val);
-
- int GetItemData(int index);
-
- void Enable(bool state);
-
- void ResetContent();
- };
-
- class CComboBoxEx : public CComboBox // : public CWindow
- {
- public:
- /* FIXME
- LRESULT DeleteItem(int index)
- { return SendMessage(CBEM_DELETEITEM, index, 0); }
- LRESULT InsertItem(COMBOBOXEXITEM *item)
- { return SendMessage(CBEM_INSERTITEM, 0, (LPARAM)item); }
- DWORD SetExtendedStyle(DWORD exMask, DWORD exStyle)
- { return (DWORD)SendMessage(CBEM_SETEXTENDEDSTYLE, exMask, exStyle); }
- HWND GetEditControl()
- { return (HWND)SendMessage(CBEM_GETEDITCONTROL, 0, 0); }
- */
- };
-
-
- }
-}
-
-#endif // __WINDOWS_WX_CONTROL_COMBOBOX_H
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Controls.cpp b/src/libs/7zip/unix/CPP/Windows/Control/Controls.cpp
deleted file mode 100644
index 2191d8009..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/Controls.cpp
+++ /dev/null
@@ -1,515 +0,0 @@
-// Dialog.cpp
-
-#include "StdAfx.h"
-
-// For compilers that support precompilation, includes "wx/wx.h".
-#include "wx/wxprec.h"
-
-#ifdef __BORLANDC__
- #pragma hdrstop
-#endif
-
-// for all others, include the necessary headers (this file is usually all you
-// need because it includes almost all "standard" wxWidgets headers)
-#ifndef WX_PRECOMP
- #include "wx/wx.h"
- #include "wx/imaglist.h"
- #include "wx/listctrl.h"
-#endif
-
-#undef _WIN32
-
-#include "Windows/Control/Dialog.h"
-
-void verify_main_thread(void);
-
-class LockGUI
-{
- bool _IsMain;
- public:
- LockGUI() {
- verify_main_thread();
- _IsMain = wxThread::IsMain();
- if (!_IsMain) {
- // DEBUG
- printf("GuiEnter-Controls(0x%lx)\n",wxThread::GetCurrentId());
- abort(); // FIXME wxMutexGuiEnter();
- }
- }
- ~LockGUI() {
- if (!_IsMain) {
- wxMutexGuiLeave();
- // DEBUG printf("GuiLeave(0x%lx)\n",wxThread::GetCurrentId());
- }
- }
-};
-/////////////////////////
-
-static const wxString CLASS_NAME_wxStaticText = wxT("wxStaticText");
-static const wxString CLASS_NAME_wxTextCtrl = wxT("wxTextCtrl");
-
-namespace NWindows {
- namespace NControl {
-
- void CDialogChildControl::SetText(LPCWSTR s)
- {
- LockGUI lock;
- const wxChar * class_name = _window->GetClassInfo()->GetClassName ();
-
- if ( CLASS_NAME_wxStaticText == class_name) {
- ((wxStaticText *)_window)->SetLabel(s);
- } else if ( CLASS_NAME_wxTextCtrl == class_name) {
- ((wxTextCtrl *)_window)->SetLabel(s);
- } else {
- // ((wxControl *)_window)->SetValue(s); // FIXME
- printf("INTERNAL ERROR - CDialogChildControl::SetText(class=%ls) not implemented\n",class_name);
- exit(-1);
- }
- }
-
- bool CDialogChildControl::GetText(CSysString &s)
- {
- wxString str;
- {
- LockGUI lock;
- const wxChar * class_name = _window->GetClassInfo()->GetClassName ();
- if ( CLASS_NAME_wxStaticText == class_name) {
- str = ((wxStaticText *)_window)->GetLabel();
- } else if ( CLASS_NAME_wxTextCtrl == class_name) {
- str = ((wxTextCtrl *)_window)->GetLabel();
- } else {
- // FIXME str = ((wxTextCtrl *)_window)->GetValue();
- printf("INTERNAL ERROR - CDialogChildControl::GetText(class=%ls) not implemented\n",class_name);
- exit(-1);
- }
- }
- s = str;
- return true;
- }
- }
-}
-
-///////////////////////// Windows/Control/ComboBox.cpp
-#include "Windows/Control/ComboBox.h"
-
-namespace NWindows {
- namespace NControl {
-
- void CComboBox::Attach(wxWindow * newWindow) { _choice = (wxComboBox*)newWindow; }
-
- wxWindow * CComboBox::Detach()
- {
- wxWindow * window = _choice;
- _choice = NULL;
- return window;
- }
-
- CComboBox::operator HWND() const { return (HWND)_choice; }
-
-
- int CComboBox::AddString(const TCHAR * txt) {
- LockGUI lock;
- wxString item(txt);
- return _choice->Append(item);
- }
-
- void CComboBox::SetText(LPCTSTR s) {
- LockGUI lock;
- wxString str(s);
- _choice->SetValue(str);
- }
-
- void CComboBox::GetText(CSysString &s) {
- LockGUI lock;
- wxString str = _choice->GetValue();
- s = str;
- }
-
- int CComboBox::GetCount() const {
- LockGUI lock;
- return _choice->GetCount();
- }
-
- void CComboBox::GetLBText(int index, CSysString &s) {
- LockGUI lock;
- wxString str = _choice->GetString(index);
- s = str;
- }
-
- void CComboBox::SetCurSel(int index) {
- LockGUI lock;
- _choice->SetSelection(index);
- }
-
- int CComboBox::GetCurSel() {
- LockGUI lock;
- return _choice->GetSelection();
- }
-
- void CComboBox::SetItemData(int index, int val) {
- LockGUI lock;
- _choice->SetClientData( index, (void *)(((char *)0) + val));
- }
-
- int CComboBox::GetItemData(int index)
- {
- LockGUI lock;
- void * data = _choice->GetClientData(index);
- int ret = (int)(((char *)data) - ((char *)0));
- return ret;
- }
-
- void CComboBox::Enable(bool state) {
- LockGUI lock;
- _choice->Enable(state);
- }
-
- void CComboBox::ResetContent() {
- LockGUI lock;
- _choice->Clear();
- }
- }
-}
-
-///////////////////////// Windows/Control/Edit.cpp
-#include "Windows/Control/Edit.h"
-
-namespace NWindows {
- namespace NControl {
-
- void CEdit::SetPasswordChar(WPARAM c) // Warning : does not work for wxMSW
- {
- LockGUI lock;
- long style = _window->GetWindowStyle();
- if ( c == 0 ) style &= ~(wxTE_PASSWORD);
- else style |= wxTE_PASSWORD;
- _window->SetWindowStyle(style);
- _window->Refresh();
- }
-
-
- void CEdit::Show(int cmdShow)
- {
- LockGUI lock;
- // FIXME _window->Show(cmdShow != SW_HIDE);
- _window->Enable(cmdShow != SW_HIDE);
- }
-
- void CEdit::SetText(LPCWSTR s)
- {
- LockGUI lock;
- ((wxTextCtrl *)_window)->SetValue(s);
- }
-
- bool CEdit::GetText(CSysString &s)
- {
- wxString str;
- {
- LockGUI lock;
- str = ((wxTextCtrl *)_window)->GetValue();
- }
- s = str;
- return true;
- }
-
- }
-}
-
-///////////////////////// Windows/Control/ProgressBar.cpp
-#include "Windows/Control/ProgressBar.h"
-
-namespace NWindows {
- namespace NControl {
-
- CProgressBar::CProgressBar(wxWindow* newWindow):
- _window((wxGauge *)newWindow) , _minValue(0), _range(0) { }
-
- void CProgressBar::Attach(wxWindow* newWindow) {
- _window = (wxGauge *)newWindow;
- _minValue = 0;
- _range = 0;
- }
-
- void CProgressBar::SetRange32(int minValue, int maxValue) {
- int range = maxValue - minValue;
- if (range >= 1)
- {
- LockGUI lock;
- _minValue = minValue;
- _range = range;
- _window->SetRange(_range);
- }
- }
-
- void CProgressBar::SetPos(int pos) {
- if (_range >= 1)
- {
- LockGUI lock;
- int value = pos - _minValue;
- if ((value >= 0) && (value <= _range)) _window->SetValue(value);
- }
- }
-
- }
-}
-
-///////////////////////// Windows/Control/StatusBar.cpp
-#include "Windows/Control/StatusBar.h"
-
-namespace NWindows {
- namespace NControl {
-
- void CStatusBar::Attach(wxWindow * newWindow) { _statusBar = (wxStatusBar*)newWindow; }
-
- wxWindow * CStatusBar::Detach()
- {
- wxWindow * window = _statusBar;
- _statusBar = NULL;
- return window;
- }
-
- void CStatusBar::SetText(int index, LPCTSTR text)
- {
- _statusBar->SetStatusText(text,index);
- }
-
- }
-
-}
-
-///////////////////////// Windows/Control/ListView.cpp
-#include "Windows/Control/ListView.h"
-
-namespace NWindows {
-namespace NControl {
-
- void CListView::Attach(wxWindow * newWindow) {
- _list = (wxListCtrl *)newWindow;
- }
-
- CListView::operator HWND() const { return (HWND)_list; }
-
- int CListView::GetItemCount() const {return _list->GetItemCount(); }
-
- int CListView::InsertItem(int index, LPCTSTR text) {
- return _list->InsertItem(index, text);
- }
- int CListView::InsertItem(const LVITEM* item) {
- /*
- int col = item->iSubItem;
- wxString text;
- if (item->mask & LVIF_TEXT) text = item->pszText;
-
- // printf("%p->InsertItem(id=%d,%ls)\n",_list,item->iItem, (const wchar_t *)text);
- return _list->InsertItem(item->iItem, text);
- */
- wxListItem info;
- long mask = 0;
- info.SetId(item->iItem);
- if (item->mask & LVIF_TEXT)
- {
- info.SetText(item->pszText);
- mask |= wxLIST_MASK_TEXT;
- }
- if (item->mask & LVIF_PARAM)
- {
- info.SetData(item->lParam);
- mask |= wxLIST_MASK_DATA;
- }
- if (item->mask & LVIF_STATE)
- {
- info.SetState(item->state);
- mask |= wxLIST_MASK_STATE;
- }
- // FIXME if (item->mask & LVIF_IMAGE)
-
- info.SetMask(mask);
-
- return _list->InsertItem(info);
- }
-
- void CListView::SetItem(const LVITEM* item) {
- int col = item->iSubItem;
- wxString text;
- if (item->mask & LVIF_TEXT) text = item->pszText;
- // printf("%p->SetItem(id=%d,col=%d,%ls)\n",_list,item->iItem, col,(const wchar_t *)text);
- _list->SetItem(item->iItem, col, text);
- }
-
- int CListView::SetSubItem(int index, int subIndex, LPCTSTR text)
- {
- return _list->SetItem(index, subIndex, text);
- }
-
- void SetUnicodeFormat(bool fUnicode) { return ; }
-
- void CListView::InsertColumn(int columnIndex, LPCTSTR text, int width)
- {
- _list->InsertColumn(columnIndex, text, wxLIST_FORMAT_LEFT, width);
- }
-
- void CListView::InsertColumn(int columnIndex, const LVCOLUMNW *columnInfo)
- {
- wxString text;
- int format = wxLIST_FORMAT_LEFT;
- int width = -1;
- if (columnInfo->mask & LVCF_FMT)
- {
- if (columnInfo->fmt == LVCFMT_LEFT) format = wxLIST_FORMAT_LEFT;
- if (columnInfo->fmt == LVCFMT_RIGHT) format = wxLIST_FORMAT_RIGHT;
- }
- if (columnInfo->mask & LVCF_TEXT) text = columnInfo->pszText;
- if (columnInfo->mask & LVCF_WIDTH) width = columnInfo->cx;
- // FIXME LVCF_SUBITEM
- // printf("%p->InsertColumn(%d,%ls)\n",_list,columnIndex,(const wchar_t *)heading);
- _list->InsertColumn(columnIndex, text, format, width);
- }
-
- void CListView::DeleteAllItems() {
- _list->DeleteAllItems();
- printf("%p->DeleteAllItems()\n",_list);
- }
-
- void CListView::SetRedraw(bool b) {
- if (b) _list->Thaw();
- else _list->Freeze();
- printf(" %p->SetRedraw()\n",_list);
- }
-
- void CListView::SetItemCount(int count) {
- // ONLY IF VIRTUAL REPORT -- _list->SetItemCount(count);
- printf(" %p->SetItemCount(%d)\n",_list,count);
- }
-
- void CListView::InvalidateRect(void *, bool) {
- printf("FIXME %p->InvalidateRect()\n",_list);/* FIXME */
- }
-
- int CListView::GetSelectedCount() const {
- int nb = _list->GetSelectedItemCount();
- printf(" %p->GetSelectedCount()=>%d\n",_list,nb);
- return nb;
- }
-
- void /* bool */ CListView::EnsureVisible(int index, bool partialOK) {
-
- printf(" %p->EnsureVisible(%d)\n",_list,index);
-
- if (index == -1) index = 0;
- _list->EnsureVisible(index);
-
- // return true;
- }
-
- void CListView::SetItemState(int index, UINT state, UINT mask) {
- // don't work _list->SetItemState(index, state, mask); !?
- // try SetItem ...
- /*
- wxListItem info;
-
- info.m_mask = wxLIST_MASK_STATE;
- info.m_itemId = index;
- info.m_col = 0;
- info.m_state = state;
- info.m_mask = mask;
-
- _list->SetItem(info);
- */
-
- printf(" %p->EnsureVisible(%d)\n",_list,index);
-
- if (index == -1) return;
-
- if (mask & LVIS_FOCUSED) {
- _list->SetItemState(index, state & LVIS_FOCUSED, mask & LVIS_FOCUSED);
- }
-
- if (mask & LVIS_SELECTED) {
- _list->SetItemState(index, state & LVIS_SELECTED, mask & LVIS_SELECTED);
- }
-
- }
-
- UINT CListView::GetItemState(int index, UINT mask) const
- {
- UINT state = _list->GetItemState(index, mask);
- printf("FIXME %p->GetItemState(index=%d,mask=0x%x)=0x%x\n",_list,index,(unsigned)mask,(unsigned)state); /* FIXME */
-
- return state;
- }
-
- void /* bool */ CListView::Update() {
- printf("FIXME %p->Update()\n",_list); /* FIXME */
- }
-
- bool CListView::DeleteColumn(int columnIndex) {
- // printf("%p->DeleteColumn()\n",_list);
- if (_list->GetColumnCount() < 1) return false;
- return _list->DeleteColumn(columnIndex); // always return true !?
- }
-
- bool CListView::GetItemParam(int itemIndex, LPARAM &param) const
- {
- param = _list->GetItemData(itemIndex);
-
- // printf(" %p->GetItemParam(%d) => %ld\n",_list,itemIndex,(long)param);
-
- return true;
- }
-
- int CListView::GetNextItem(int startIndex, UINT flags) const
- {
- int item = _list->GetNextItem(startIndex, wxLIST_NEXT_ALL, flags);
- printf(" %p->GetNextItem(%d) => %d\n",_list,startIndex,item);
- return item;
-
- }
-
- int CListView::GetFocusedItem() const
- {
- int item = _list->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED);
- printf(" %p->GetFocusedItem() => %d\n",_list,item);
- return item;
- }
-
- void CListView::RedrawAllItems()
- {
- printf("FIXME %p->RedrawAllItems()\n",_list);
- }
-
- // FIXME added
- int CListView::GetColumnCount()
- {
- return _list->GetColumnCount();
- }
-
- void CListView::SetFocus() { /* FIXME */ }
-
- void CListView::RedrawItem(int item) { /* FIXME */ }
-
- bool CListView::SortItems(PFNLVCOMPARE compareFunction, LPARAM dataParam) {
- printf(" %p->SortItems()\n",_list);
- return _list->SortItems(compareFunction, dataParam);
- }
-
- bool CListView::GetColumn(int columnIndex, LVCOLUMN* columnInfo)
- {
- columnInfo->cx = _list->GetColumnWidth(columnIndex);// FIXME
-
- bool ret = false;
-
- if (columnInfo->cx >= 1) ret = true;
-
- // printf("CListView::GetColumn(%d) cx=%d\n",columnIndex,(int)columnInfo->cx);
-
- return ret;
- }
-
- // HWND EditLabel(int itemIndex)
- void CListView::EditLabel(int itemIndex)
- {
- /* FIXME */
- }
-
-}}
-
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Dialog.cpp b/src/libs/7zip/unix/CPP/Windows/Control/Dialog.cpp
deleted file mode 100644
index 464ae302c..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/Dialog.cpp
+++ /dev/null
@@ -1,560 +0,0 @@
-// Dialog.cpp
-
-#include "StdAfx.h"
-
-// For compilers that support precompilation, includes "wx/wx.h".
-#include "wx/wxprec.h"
-
-#ifdef __BORLANDC__
- #pragma hdrstop
-#endif
-
-// for all others, include the necessary headers (this file is usually all you
-// need because it includes almost all "standard" wxWidgets headers)
-#ifndef WX_PRECOMP
- #include "wx/wx.h"
-#endif
-
-#include <wx/filename.h>
-
-
-#undef _WIN32
-
-#include "Windows/Control/DialogImpl.h"
-#include "Windows/Synchronization.h"
-
-
-// FIXME
-class MyApp : public wxApp
-{
-public:
- virtual bool OnInit();
-};
-
-DECLARE_APP(MyApp)
-
-// #include "../GUI/p7zip_32.xpm"
-extern const char * p7zip_32_xpm[];
-
-const TCHAR * nameWindowToUnix(const TCHAR * lpFileName) {
- if ((lpFileName[0] == wxT('c')) && (lpFileName[1] == wxT(':'))) return lpFileName+2;
- return lpFileName;
-}
-
-
-extern time_t g_T0; // FIXME
-
-#define DIALOG_ID_MESSAGEBOX 8100
-#define DIALOG_ID_DIR_DIALOG 8101
-#define DIALOG_ID_FILE_DIALOG 8102
-#define DIALOG_ID_POST_DIALOG 8190
-#define DIALOG_ID_END_DIALOG 8199
-
-static struct
-{
- bool busy;
-
- int id;
- wxWindow *parentWindow;
-
- // CreateDialog
- NWindows::NControl::CModalDialog * dialog;
-
- // EndModal
- int value;
- NWindows::NControl::CModalDialogImpl * window;
-
- // MessageBox
- const TCHAR * msg;
- const TCHAR * title;
- int flag;
-
- //
- LPCWSTR initialFolderOrFile;
-
- wxSemaphore * sem;
- int ret;
-
- UString resultPath;
-
-#define MAX_CREATE 16
-} g_tabCreate[MAX_CREATE];
-
-static int myCreateHandle2(int n);
-
-static int findFreeInd()
-{
-static NWindows::NSynchronization::CCriticalSection g_CriticalSection;
-
- g_CriticalSection.Enter();
- int ind = 0;
- while (ind < MAX_CREATE)
- {
- if (g_tabCreate[ind].busy == false)
- {
- g_tabCreate[ind].busy = true;
- break;
- }
- ind++;
- }
- g_CriticalSection.Leave();
-
- return ind;
-}
-
-static int WaitInd(wxWindow * destWindow, int ind,int id,wxWindow * parent,UString &resultPath)
-{
- int ret = 0;
-
- g_tabCreate[ind].id = id;
- g_tabCreate[ind].parentWindow = parent;
- g_tabCreate[ind].ret = 0;
- g_tabCreate[ind].resultPath = wxEmptyString;
-
- if (wxThread::IsMain())
- {
- ret = myCreateHandle2(ind);
- resultPath = g_tabCreate[ind].resultPath;
- }
- else
- {
- if (destWindow == 0) {
- extern wxWindow * g_window;
- if (g_window == 0)
- {
- printf("INTERNAL ERROR : g_window and destWindow == NULL\n"); abort();
- }
- destWindow = g_window;
- }
- g_tabCreate[ind].sem = new wxSemaphore(0);
-
- // create any type of command event here
- wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, WORKER_EVENT );
- event.SetInt( ind );
-
- // send in a thread-safe way
- // DEBUG printf("T=0x%lx - %d : WaitInd(%d,%p): BEGIN\n", wxThread::GetCurrentId(),time(0)-g_T0,g_tabCreate[ind].id,g_tabCreate[ind].parentWindow);
- wxPostEvent( destWindow, event );
-
- g_tabCreate[ind].sem->Wait();
-
- ret = g_tabCreate[ind].ret;
- resultPath = g_tabCreate[ind].resultPath;
- // DEBUG printf("T=0x%lx - %d : WaitInd(%d,%p): ret=%d\n", wxThread::GetCurrentId(),time(0)-g_T0,g_tabCreate[ind].id,g_tabCreate[ind].parentWindow,ret);
- delete g_tabCreate[ind].sem;
- g_tabCreate[ind].sem = 0;
- }
-
- g_tabCreate[ind].busy = false;
-
- return ret;
-}
-
-static int WaitInd(wxWindow * destWindow,int ind,int id,wxWindow * parent)
-{
- UString resultPath;
- return WaitInd(destWindow,ind,id,parent,resultPath);
-}
-
-void verify_main_thread(void);
-
-class LockGUI
-{
- bool _IsMain;
- public:
- LockGUI() {
-
- verify_main_thread();
-
- _IsMain = wxThread::IsMain();
- if (!_IsMain) {
- // DEBUG
- printf("GuiEnter-Dialog(0x%lx)\n",wxThread::GetCurrentId());
- abort(); // FIXME wxMutexGuiEnter();
- }
- }
- ~LockGUI() {
- if (!_IsMain) {
- wxMutexGuiLeave();
- // DEBUG printf("GuiLeave(0x%lx)\n",wxThread::GetCurrentId());
- }
- }
-};
-
-static const unsigned int kNumDialogsMax = 32;
-static unsigned int g_NumDialogs = 0;
-static const CDialogInfo *g_Dialogs[kNumDialogsMax];
-
-void RegisterDialog(const CDialogInfo *dialogInfo)
-{
- // DEBUG printf("RegisterDialog : %d\n",dialogInfo->id);
- if (g_NumDialogs < kNumDialogsMax)
- g_Dialogs[g_NumDialogs++] = dialogInfo;
-}
-
-namespace NWindows {
-
- CSysString MyLoadString(unsigned int resourceID)
- {
- for(unsigned i=0; i < g_NumDialogs; i++) {
- if (g_Dialogs[i]->stringTable) {
- int j = 0;
- while(g_Dialogs[i]->stringTable[j].str) {
- if (resourceID == g_Dialogs[i]->stringTable[j].id) {
- return g_Dialogs[i]->stringTable[j].str;
- }
-
- j++;
- }
- }
- }
- return L"FIXME-MyLoadStringW-";
- }
-
- namespace NControl {
-
-/////////////////////////////////////////// CModalDialog //////////////////////////////////
-
- bool CModalDialog::CheckButton(int buttonID, UINT checkState)
- {
- LockGUI lock;
- wxCheckBox* w = (wxCheckBox*)_window->FindWindow(buttonID);
- if (w)
- {
- w->SetValue(checkState == BST_CHECKED);
- return true;
- }
- return false;
- }
-
- UINT CModalDialog::IsButtonChecked(int buttonID) const
- {
- LockGUI lock;
- wxCheckBox* w = (wxCheckBox*)_window->FindWindow(buttonID);
- if (w)
- {
- bool bret = w->GetValue();
- if (bret) return BST_CHECKED;
- }
- return BST_UNCHECKED;
- }
-
- void CModalDialog::EnableItem(int id, bool state)
- {
- LockGUI lock;
- wxWindow* w = _window->FindWindow(id);
- if (w) w->Enable(state);
- }
-
- void CModalDialog::SetItemText(int id, const TCHAR *txt)
- {
- LockGUI lock;
- wxWindow* w = _window->FindWindow(id);
- if (w)
- {
- wxString label(txt);
- w->SetLabel(label);
- }
- }
-
- wxWindow * CModalDialog::GetItem(long id) const
- {
- LockGUI lock;
- return _window->FindWindow(id);
- }
-
- void CModalDialog::ShowItem(int itemID, int cmdShow) const
- {
- LockGUI lock;
- // cmdShow = SW_HIDE or SW_SHOW (sometimes false or true !)
- wxWindow* w = _window->FindWindow(itemID);
- if (w)
- {
-// FIXME w->Show(cmdShow != SW_HIDE);
- w->Enable(cmdShow != SW_HIDE);
- }
- }
-
- UINT_PTR CModalDialog::SetTimer(UINT_PTR idEvent , unsigned milliseconds)
- {
- LockGUI lock;
- return _window->SetTimer(idEvent , milliseconds);
- }
-
- void CModalDialog::KillTimer(UINT_PTR idEvent)
- {
- LockGUI lock;
- _window->KillTimer(idEvent);
- }
-
- void CModalDialog::SetText(const TCHAR *_title) {
- LockGUI lock;
- _window->SetTitle(_title);
- }
-
-
- bool CModalDialog::GetText(CSysString &s) {
- wxString str;
- {
- LockGUI lock;
- str = _window->GetTitle();
- }
- s = str;
- return true;
- }
-
- INT_PTR CModalDialog::Create(int id , HWND parentWindow)
- {
- int ind = findFreeInd();
-
- g_tabCreate[ind].dialog = this;
-
- return WaitInd(0, ind,id,parentWindow);
- }
-
- void CModalDialog::End(int result)
- {
- int ind = findFreeInd();
-
- g_tabCreate[ind].window = _window;
- g_tabCreate[ind].value = result;
-
- WaitInd(this->_window,ind,DIALOG_ID_END_DIALOG,0);
- }
-
- void CModalDialog::PostMessage(UINT message)
- {
- int ind = findFreeInd();
-
- g_tabCreate[ind].dialog = this;
- g_tabCreate[ind].value = message;
-
- WaitInd(this->_window,ind,DIALOG_ID_POST_DIALOG,0);
- }
-
-/////////////////////////////////////////// CModalDialogImpl ///////////////////////////////////////
-
- CModalDialogImpl::CModalDialogImpl(CDialog *dialog, wxWindow* parent, wxWindowID id,
- const wxString& title, const wxPoint& pos,
- const wxSize& size, long style) :
- wxDialog(parent, id, title , pos , size, style /* | wxDIALOG_NO_PARENT */ ) ,
- _timer(this, TIMER_ID_IMPL), _dialog(dialog)
- {
- // set the frame icon
- this->SetIcon(wxICON(p7zip_32));
- }
-
- void CModalDialogImpl::OnAnyButton(wxCommandEvent& event)
- {
- int id = event.GetId();
- if (id == wxID_OK)
- {
- if (_dialog) _dialog->OnOK();
- // event.Skip(true);
- }
- else if (id == wxID_CANCEL)
- {
- if (_dialog) _dialog->OnCancel();
- // event.Skip(true);
- }
- else if (id == wxID_HELP)
- {
- if (_dialog) _dialog->OnHelp();
- }
- else
- {
- if (_dialog)
- {
- /* bool bret = */ _dialog->OnButtonClicked(id, FindWindow(id) );
- }
- }
- }
-
- void CModalDialogImpl::OnAnyChoice(wxCommandEvent &event)
- {
- int itemID = event.GetId();
- if (_dialog) _dialog->OnCommand(CBN_SELCHANGE, itemID, 0);
- }
-
- void CModalDialogImpl::OnAnyTimer(wxTimerEvent &event)
- {
- int timerID = event.GetId();
- if (_dialog) _dialog->OnTimer(timerID , 0);
- }
- }
-}
-
-///////////////////////// myCreateHandle
-
-
-static int myCreateHandle2(int n)
-{
- unsigned int id = g_tabCreate[n].id;
- wxWindow * parentWindow = g_tabCreate[n].parentWindow;
- NWindows::NControl::CModalDialogImpl * window = 0;
-
- // DEBUG printf("T=0x%lx - %d : myCreateHandle(%d): BEGIN\n", wxThread::GetCurrentId(),time(0)-g_T0,n);
-
- if (id == DIALOG_ID_END_DIALOG)
- {
- /* FIXME : the dialog must be shown before ending it ?
- while (!g_tabCreate[n].window->IsShownOnScreen()) Sleep(200);
- Sleep(200);
- */
- g_tabCreate[n].window->EndModal(g_tabCreate[n].value);
- return 0;
- }
-
- if (id == DIALOG_ID_POST_DIALOG)
- {
- g_tabCreate[n].dialog->OnMessage(g_tabCreate[n].value, 0, 0);
- return 0;
- }
-
- if (id == DIALOG_ID_MESSAGEBOX)
- {
- long style = g_tabCreate[n].flag;
- long decorated_style = style;
- if ( ( style & ( wxICON_EXCLAMATION | wxICON_HAND | wxICON_INFORMATION |
- wxICON_QUESTION ) ) == 0 )
- {
- decorated_style |= ( style & wxYES ) ? wxICON_QUESTION : wxICON_INFORMATION ;
- }
- wxMessageDialog dialog(parentWindow, g_tabCreate[n].msg, g_tabCreate[n].title, decorated_style);
- dialog.SetIcon(wxICON(p7zip_32));
- int ret = dialog.ShowModal();
-
- return ret;
- }
-
- if (id == DIALOG_ID_DIR_DIALOG)
- {
- wxString defaultDir = g_tabCreate[n].initialFolderOrFile;
- wxDirDialog dirDialog(g_tabCreate[n].parentWindow,
- g_tabCreate[n].title, defaultDir);
- dirDialog.SetIcon(wxICON(p7zip_32));
- int ret = dirDialog.ShowModal();
- if (ret == wxID_OK) g_tabCreate[n].resultPath = dirDialog.GetPath();
- return ret;
- }
-
- if (id == DIALOG_ID_FILE_DIALOG)
- {
- wxString defaultFilename = g_tabCreate[n].initialFolderOrFile;
-
- wxFileName filename(defaultFilename);
-
- wxString dir = filename.GetPath();
- wxString name = filename.GetFullName();
-
-
- // printf("DIALOG_ID_FILE_DIALOG = '%ls' => '%ls' '%ls'\n",&defaultFilename[0],&dir[0],&name[0]);
-
-
- wxFileDialog fileDialog(g_tabCreate[n].parentWindow, g_tabCreate[n].title,
- dir, name, wxT("All Files (*.*)|*.*"), wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
- fileDialog.SetIcon(wxICON(p7zip_32));
- int ret = fileDialog.ShowModal();
- if (ret == wxID_OK) g_tabCreate[n].resultPath = fileDialog.GetPath();
- return ret;
- }
-
- for(unsigned i=0; i < g_NumDialogs; i++) {
- if (id == g_Dialogs[i]->id) {
- // DEBUG printf("%d : Create(%d,%p): CreateDialog-1\n",time(0)-g_T0,id,parentWindow);
- window = (g_Dialogs[i]->createDialog)(g_tabCreate[n].dialog,g_tabCreate[n].parentWindow);
- // DEBUG printf("%d : Create(%d,%p): CreateDialog-2\n",time(0)-g_T0,id,parentWindow);
- break;
- }
- }
-
- if (window) {
-
- // DEBUG printf("%d : Create(%d,%p): %p->ShowModal()\n",time(0)-g_T0,id,parentWindow,window);
-
- // window->Show(true);
- // wxGetApp().ProcessPendingEvents();
-
- INT_PTR ret = window->ShowModal();
-
- // DEBUG printf("%d : Create(%d,%p): %p->ShowModal() - ret=%d\n",time(0)-g_T0,id,parentWindow,window,ret);
- window->Detach();
- window->Destroy();
-
- // DEBUG printf("%d : Create(%d,%p): END\n",time(0)-g_T0,id,parentWindow,window);
-
- return ret;
- }
-
- // FIXME
- printf("INTERNAL ERROR : cannot find dialog %d\n",id);
-
- return 0;
-}
-
-void myCreateHandle(int n)
-{
- int ret = myCreateHandle2(n);
- g_tabCreate[n].ret = ret;
- g_tabCreate[n].sem->Post();
-}
-
-int MessageBoxW(wxWindow * parent, const TCHAR * msg, const TCHAR * title,int flag)
-{
- int ind = findFreeInd();
-
- g_tabCreate[ind].msg = msg;
- g_tabCreate[ind].title = title;
- g_tabCreate[ind].flag = flag;
-
- return WaitInd(parent,ind,DIALOG_ID_MESSAGEBOX,parent); // FIXME
-}
-
-
-
-// FIXME : should be in Windows/Shell.cpp
-
-namespace NWindows{
-namespace NShell{
-
-bool BrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString &resultPath)
-{
- int ind = findFreeInd();
-
- g_tabCreate[ind].title = title;
- g_tabCreate[ind].initialFolderOrFile = nameWindowToUnix(initialFolder);
-
- UString resTmp;
- int ret = WaitInd(0,ind,DIALOG_ID_DIR_DIALOG,owner,resTmp); // FIXME
- if(ret == wxID_OK)
- {
- resultPath = resTmp;
- return true;
- }
- return false;
-}
-
-}}
-
-/////////////////////////// CPP/Windows/CommonDialog.cpp
-namespace NWindows
-{
-
- bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName, LPCWSTR s, UString &resPath)
- {
- int ind = findFreeInd();
-
- g_tabCreate[ind].title = title;
- g_tabCreate[ind].initialFolderOrFile = nameWindowToUnix(fullFileName);
-
- UString resTmp;
- int ret = WaitInd(0,ind,DIALOG_ID_FILE_DIALOG,hwnd,resTmp); // FIXME
- if(ret == wxID_OK)
- {
- resPath = resTmp;
- return true;
- }
- return false;
- }
-}
-
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Dialog.h b/src/libs/7zip/unix/CPP/Windows/Control/Dialog.h
deleted file mode 100644
index 54899a104..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/Dialog.h
+++ /dev/null
@@ -1,179 +0,0 @@
-// Windows/Control/Dialog.h
-
-#ifndef __WINDOWS_CONTROL_DIALOG_H
-#define __WINDOWS_CONTROL_DIALOG_H
-
-#include "Windows/Window.h"
-
-#ifndef _WIN32
-#define SW_HIDE 0
-#define SW_SHOW 5
-
-#define WM_SETTEXT (6000) // wxID_HIGHEST + 1
-#define WM_USER (6999) // wxID_HIGHEST + 1000
-
-#endif
-
-#ifndef _WIN32
-#define CBN_SELCHANGE 1
-#endif
-
-// FIXME
-#define IDCLOSE (5001) // wxID_CLOSE
-#define IDEXIT (5006) // wxID_EXIT
-#define IDOK (5100) // wxID_OK
-#define IDCANCEL (5101) // wxID_CANCEL
-#define IDABORT (5115) // wxID_ABORT
-#define IDYES (5103) // wxID_YES
-#define IDNO (5104) // wxID_NO
-#define IDHELP (5009) // wxID_HELP
-
-#define BST_CHECKED 1
-#define BST_UNCHECKED 0
-// #define BST_INDETERMINATE 0x0002
-
-#define wsprintf(a,b,c,d,e) swprintf(a,9999,b,c,d,e) // FIXME
-
-namespace NWindows {
- namespace NControl {
-
- class CModalDialogImpl;
-
- class CDialog
- {
- protected:
- CModalDialogImpl * _window;
- public:
- operator HWND() const { return HWND(_window); }
-
- bool OnInit(CModalDialogImpl * window) {
- _window = window;
- return OnInit();
- }
- virtual bool OnInit() { return false; }
- virtual void OnOK() {}
- virtual void OnCancel() {}
- virtual void OnHelp() {}
- virtual bool OnButtonClicked(int buttonID, wxWindow * buttonHWND) { return false; }
- virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { return false; }
- virtual bool OnCommand(int code, int itemID, LPARAM lParam) { return false; }
- virtual bool OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { return false; }
-
- void NormalizeSize(bool fullNormalize = false) { /* FIXME */ }
- void NormalizePosition() { /* FIXME */ }
- };
-
- class CModalDialog : public CDialog
- {
- public:
-
-
- ////////////////// COMPATIBILITY
-
- bool CheckRadioButton(int firstButtonID, int lastButtonID, int checkButtonID)
- {
-/*
- for(int id = firstButtonID; id <= lastButtonID; id++)
- {
- CheckButton(id,id == checkButtonID);
- }
-*/
- this->CheckButton(checkButtonID,true);
-
- return true;
- }
-
-
- bool CheckButton(int buttonID, UINT checkState);
- bool CheckButton(int buttonID, bool checkState)
- {
- return CheckButton(buttonID, UINT(checkState ? BST_CHECKED : BST_UNCHECKED));
- }
-
-
- UINT IsButtonChecked(int buttonID) const;
-
- bool IsButtonCheckedBool(long buttonID) const
- { return (IsButtonChecked(buttonID) == BST_CHECKED); }
-
- void EnableItem(int id, bool state);
-
- void SetItemText(int id, const TCHAR *txt);
-
- wxWindow * GetItem(long id) const ;
-
- void ShowItem(int itemID, int cmdShow) const;
-
- void HideItem(int itemID) const { ShowItem(itemID, SW_HIDE); }
-
- void End(int result);
-
- void SetText(const TCHAR *_title); // { _dialog->SetTitle(_title); }
-
- bool GetText(CSysString &s);
-
- INT_PTR Create(int id , HWND parentWindow);
-
- void PostMessage(UINT message);
-
- virtual void OnHelp() {}
-
- UINT_PTR SetTimer(UINT_PTR idEvent , unsigned milliseconds);
-
- void KillTimer(UINT_PTR idEvent);
-
- virtual void OnOK() { End(IDOK); }
- virtual void OnCancel() { End(IDCANCEL); }
- };
-
-class CDialogChildControl : public NWindows::CWindow
-{
-public:
- CDialogChildControl() {}
-
- int m_ID;
- void Init(const NWindows::NControl::CModalDialog &parentDialog, int id)
- {
- m_ID = id;
- this->Attach(parentDialog.GetItem(id));
- }
- virtual void SetText(LPCWSTR s);
- virtual bool GetText(CSysString &s);
-};
-
-}
-}
-
-struct CStringTable
-{
- unsigned int id;
- const wchar_t *str;
-};
-
-struct CDialogInfo
-{
- unsigned int id;
- NWindows::NControl::CModalDialogImpl * (*createDialog)(NWindows::NControl::CModalDialog * dialog, HWND parentWindow);
- CStringTable * stringTable;
-};
-
-void RegisterDialog(const CDialogInfo *dialogInfo);
-
-#define REGISTER_DIALOG_NAME(x) CRegister ## x
-
-#define REGISTER_DIALOG(id,x,stringTable) \
- static NWindows::NControl::CModalDialogImpl * myCreate##x(NWindows::NControl::CModalDialog * dialog,HWND parentWindow) \
- { return new x##Impl(dialog,parentWindow,id); } \
- static struct CDialogInfo g_DialogInfo = { id , myCreate##x, stringTable }; \
- struct REGISTER_DIALOG_NAME(x) { \
- REGISTER_DIALOG_NAME(x)() { RegisterDialog(&g_DialogInfo); }}; \
- static REGISTER_DIALOG_NAME(x) g_RegisterDialog;
-
-#define REGISTER_STRINGTABLE(stringTable) \
- static struct CDialogInfo g_DialogInfo = { -1 , 0 , stringTable }; \
- struct REGISTER_DIALOG_NAME(x) { \
- REGISTER_DIALOG_NAME(x)() { RegisterDialog(&g_DialogInfo); }}; \
- static REGISTER_DIALOG_NAME(x) g_RegisterDialog;
-
-#endif
-
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/DialogImpl.h b/src/libs/7zip/unix/CPP/Windows/Control/DialogImpl.h
deleted file mode 100644
index a9720b778..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/DialogImpl.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Windows/Control/DialogImpl.h
-
-#ifndef __WINDOWS_CONTROL_DIALOGIMPL_H
-#define __WINDOWS_CONTROL_DIALOGIMPL_H
-
-#include "Windows/Window.h"
-#include "Windows/Control/Dialog.h"
-
-void myCreateHandle(int n); // FIXME - duplicate
-
-enum {
- WORKER_EVENT=100 // this one gets sent from the worker thread
-};
-
-namespace NWindows {
- namespace NControl {
-
-#define TIMER_ID_IMPL (1234)
-
- class CModalDialogImpl : public wxDialog
- {
- wxTimer _timer;
-
- CDialog *_dialog;
- public:
- CModalDialogImpl(CDialog *dialog, wxWindow* parent, wxWindowID id, const wxString& title,
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
- long style = wxDEFAULT_DIALOG_STYLE );
-
- CDialog * Detach()
- {
- CDialog * oldDialog = _dialog;
- _dialog = NULL;
- return oldDialog;
- }
-
- void OnInit()
- {
- if (_dialog) _dialog->OnInit(this);
- }
-
- void OnAnyButton(wxCommandEvent& event);
- void OnAnyChoice(wxCommandEvent &event);
- void OnAnyTimer(wxTimerEvent &event);
-
-/* FIXME virtual void SetLabel(const wxString &title)
- {
- // Why we must do this "alias" ?
- this->SetTitle(title);
- }
-*/
- //////////////////
- UINT_PTR SetTimer(UINT_PTR /* FIXME idEvent */, unsigned milliseconds)
- {
- _timer.Start(milliseconds);
- return TIMER_ID_IMPL;
- }
- void KillTimer(UINT_PTR idEvent)
- {
- if (idEvent == TIMER_ID_IMPL) _timer.Stop();
- }
- void OnWorkerEvent(wxCommandEvent& event)
- {
- int n = event.GetInt();
- // printf("CModalDialogImpl::OnWorkerEvent(n=%d)\n",n);
- myCreateHandle(n);
- }
- };
-}
-}
-
-#endif
-
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Edit.h b/src/libs/7zip/unix/CPP/Windows/Control/Edit.h
deleted file mode 100644
index e6930e5d4..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/Edit.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Windows/Control/Edit.h
-
-#ifndef __WINDOWS_CONTROL_EDIT_H
-#define __WINDOWS_CONTROL_EDIT_H
-
-#include "Windows/Window.h"
-#include "Windows/Defs.h"
-
-namespace NWindows {
-namespace NControl {
-
-class CEdit: public CWindow
-{
-public:
- void SetPasswordChar(WPARAM c);
- void Show(int cmdShow);
- virtual void SetText(LPCWSTR s);
- virtual bool GetText(CSysString &s);
-};
-
-}}
-
-#endif
-
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/ListView.h b/src/libs/7zip/unix/CPP/Windows/Control/ListView.h
deleted file mode 100644
index 149f4a450..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/ListView.h
+++ /dev/null
@@ -1,164 +0,0 @@
-// Windows/Control/ListView.h
-
-#ifndef __WINDOWS_CONTROL_LISTVIEW_H
-#define __WINDOWS_CONTROL_LISTVIEW_H
-
-#include "Windows/Window.h"
-#include "Windows/Defs.h"
-
-/*
-#include <commctrl.h>
-*/
-
-#ifndef _WIN32
-
-#define LVCF_FMT 0x0001
-#define LVCF_WIDTH 0x0002
-#define LVCF_TEXT 0x0004
-#define LVCF_SUBITEM 0x0008
-#define LVCF_IMAGE 0x0010
-#define LVCF_ORDER 0x0020
-
-#define LVCFMT_LEFT 0x0000
-#define LVCFMT_RIGHT 0x0001
-#define LVCFMT_CENTER 0x0002
-#define LVCFMT_JUSTIFYMASK 0x0003
-
-
-// state
-#define LVIS_FOCUSED 0x0002 /* wxLIST_STATE_FOCUSED */
-#define LVIS_SELECTED 0x0004 /* wxLIST_STATE_SELECTED */
-
-#define LVNI_SELECTED 0x0004 /* wxLIST_STATE_SELECTED */
-
-typedef INT (CALLBACK *PFNLVCOMPARE)(LPARAM, LPARAM, LPARAM);
-
-typedef struct tagLVCOLUMNW
-{
- UINT mask;
- int fmt;
- int cx;
- LPWSTR pszText;
- int cchTextMax;
- int iSubItem;
- int iOrder; // FIXME
-} LVCOLUMNW;
-
-#define LVCOLUMN LVCOLUMNW
-#define LV_COLUMNW LVCOLUMNW /* FIXME */
-
-
-
-typedef struct tagLVITEMW
-{
- UINT mask;
- int iItem;
- int iSubItem;
- UINT state;
- UINT stateMask;
- LPWSTR pszText;
- int cchTextMax;
- int iImage;
- LPARAM lParam;
-#if (_WIN32_IE >= 0x0300)
- int iIndent;
-#endif
-#if (_WIN32_WINNT >= 0x501)
- int iGroupId;
- UINT cColumns; // tile view columns
- PUINT puColumns;
-#endif
-} LVITEMW;
-
-#define LVITEM LVITEMW
-
-#define LVIF_TEXT 0x0001
-// FIXME - mask
-#define LVIF_PARAM 2
-#define LVIF_IMAGE 4
-#define LVIF_STATE 8
-
-#endif
-
-class wxListCtrl;
-
-namespace NWindows {
-namespace NControl {
-
-class CListView // : public NWindows::CWindow
-{
- wxListCtrl *_list;
-public:
- CListView() : _list(0) {}
- void Attach(wxWindow * newWindow);
-
- operator HWND() const;
-
- int GetItemCount() const;
-
- int InsertItem(int index, LPCTSTR text);
- int InsertItem(const LVITEM* item);
-
- void SetItem(const LVITEM* item);
-
- int SetSubItem(int index, int subIndex, LPCTSTR text);
-
- void SetUnicodeFormat(bool fUnicode) { return ; }
-
- void InsertColumn(int columnIndex, LPCTSTR text, int width);
-
- void InsertColumn(int columnIndex, const LVCOLUMNW *columnInfo);
-
- void DeleteAllItems();
-
- void SetRedraw(bool);
-
- void SetItemCount(int );
-
- void InvalidateRect(void *, bool);
-
- int GetSelectedCount() const;
-
- void /* bool */ EnsureVisible(int index, bool partialOK);
-
- void SetItemState(int index, UINT state, UINT mask);
-
- void SetItemState_FocusedSelected(int index) { SetItemState(index, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); }
-
- UINT GetItemState(int index, UINT mask) const;
-
- void /* bool */ Update();
-
- bool DeleteColumn(int columnIndex);
-
- bool GetItemParam(int itemIndex, LPARAM &param) const;
-
- int GetNextItem(int startIndex, UINT flags) const;
-
- int GetFocusedItem() const;
-
- void RedrawAllItems();
- // FIXME added
- int GetColumnCount();
-
- void SetFocus();
-
- void RedrawItem(int item);
-
- bool SortItems(PFNLVCOMPARE compareFunction, LPARAM dataParam);
-
- bool GetColumn(int columnIndex, LVCOLUMN* columnInfo);
-
- // HWND EditLabel(int itemIndex)
- void EditLabel(int itemIndex);
-
- bool SetColumnWidthAuto(int iCol) {
- return true; // FIXME SetColumnWidth(iCol, LVSCW_AUTOSIZE);
- }
-
-
-};
-
-}}
-#endif
-
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/ProgressBar.h b/src/libs/7zip/unix/CPP/Windows/Control/ProgressBar.h
deleted file mode 100644
index c7bfa8e8d..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/ProgressBar.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Windows/Control/ProgressBar.h
-
-#ifndef __WINDOWS_CONTROL_PROGRESSBAR_H
-#define __WINDOWS_CONTROL_PROGRESSBAR_H
-
-#include "Windows/Window.h"
-#include "Windows/Defs.h"
-
-class wxGauge;
-
-namespace NWindows {
-namespace NControl {
-
-
-class CProgressBar : public CWindow
-{
-protected:
- wxGauge* _window;
- int _minValue;
- int _range;
-public:
- CProgressBar(wxWindow* newWindow = NULL);
-
- void Attach(wxWindow* newWindow);
-
- void SetRange32(int minValue, int maxValue);
-
- void SetPos(int pos);
-};
-
-}}
-
-#endif
-
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Static.h b/src/libs/7zip/unix/CPP/Windows/Control/Static.h
deleted file mode 100644
index 36469c18f..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/Static.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Windows/Control/Static.h
-
-#ifndef __WINDOWS_CONTROL_STATIC_H
-#define __WINDOWS_CONTROL_STATIC_H
-
-#include "Windows/Window.h"
-#include "Windows/Defs.h"
-
-typedef void * HICON;
-
-namespace NWindows {
-namespace NControl {
-
-class CStatic : public CWindow
-{
-public:
-
- HICON SetIcon(HICON icon) { return 0; } // FIXME
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/StatusBar.h b/src/libs/7zip/unix/CPP/Windows/Control/StatusBar.h
deleted file mode 100644
index 6b4417d10..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/StatusBar.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Windows/Control/StatusBar.h
-
-#ifndef __WINDOWS_CONTROL_STATUSBAR_H
-#define __WINDOWS_CONTROL_STATUSBAR_H
-
-#include "Windows/Window.h"
-#include "Windows/Defs.h"
-
-class wxStatusBar;
-
-namespace NWindows {
-namespace NControl {
-
-class CStatusBar // : public NWindows::CWindow
-{
- wxStatusBar * _statusBar;
-public:
- CStatusBar() : _statusBar(0) {}
-
- void Attach(wxWindow * newWindow);
- wxWindow * Detach();
-
- void SetText(int index, LPCTSTR text);
-
-/* FIXME
- bool Create(LONG style, LPCTSTR text, HWND hwndParent, UINT id)
- { return (_window = ::CreateStatusWindow(style, text, hwndParent, id)) != 0; }
- bool SetParts(int numParts, const int *edgePostions)
- { return LRESULTToBool(SendMessage(SB_SETPARTS, numParts, (LPARAM)edgePostions)); }
- bool SetText(LPCTSTR text)
- { return CWindow::SetText(text); }
-
- bool SetText(int index, LPCTSTR text, UINT type)
- { return LRESULTToBool(SendMessage(SB_SETTEXT, index | type, (LPARAM)text)); }
- bool SetText(int index, LPCTSTR text)
- { return SetText(index, text, 0); }
- void Simple(bool simple)
- { SendMessage(SB_SIMPLE, BoolToBOOL(simple), 0); }
-
- #ifndef _UNICODE
- bool Create(LONG style, LPCWSTR text, HWND hwndParent, UINT id)
- { return (_window = ::CreateStatusWindowW(style, text, hwndParent, id)) != 0; }
- bool SetText(LPCWSTR text)
- { return CWindow::SetText(text); }
- bool SetText(int index, LPCWSTR text, UINT type)
- { return LRESULTToBool(SendMessage(SB_SETTEXTW, index | type, (LPARAM)text)); }
- bool SetText(int index, LPCWSTR text)
- { return SetText(index, text, 0); }
- #endif
-*/
-};
-
-}}
-
-#endif
-
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Window2.cpp b/src/libs/7zip/unix/CPP/Windows/Control/Window2.cpp
deleted file mode 100644
index dda1da090..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/Window2.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-// Windows/Control/Window2.cpp
-
-#include "StdAfx.h"
-
-#ifndef _UNICODE
-#include "Common/StringConvert.h"
-#endif
-#include "Windows/Control/Window2.h"
-
-// extern HINSTANCE g_hInstance;
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-namespace NWindows {
-
-#ifndef _UNICODE
-ATOM MyRegisterClass(CONST WNDCLASSW *wndClass);
-#endif
-
-namespace NControl {
-
-#ifdef _WIN32
-static LRESULT CALLBACK WindowProcedure(HWND aHWND, UINT message,
- WPARAM wParam, LPARAM lParam)
-{
- CWindow tempWindow(aHWND);
- if (message == WM_NCCREATE)
- tempWindow.SetUserDataLongPtr(
- LONG_PTR(((LPCREATESTRUCT)lParam)->lpCreateParams));
- CWindow2 *window = (CWindow2*)(tempWindow.GetUserDataLongPtr());
- if (window != NULL && message == WM_NCCREATE)
- window->Attach(aHWND);
- if (window == 0)
- {
- #ifndef _UNICODE
- if (g_IsNT)
- return DefWindowProcW(aHWND, message, wParam, lParam);
- else
- #endif
- return DefWindowProc(aHWND, message, wParam, lParam);
- }
- return window->OnMessage(message, wParam, lParam);
-}
-
-bool CWindow2::CreateEx(DWORD exStyle, LPCTSTR className,
- LPCTSTR windowName, DWORD style,
- int x, int y, int width, int height,
- HWND parentWindow, HMENU idOrHMenu,
- HINSTANCE instance)
-{
- WNDCLASS windowClass;
- if(!::GetClassInfo(instance, className, &windowClass))
- {
- // windowClass.style = CS_HREDRAW | CS_VREDRAW;
- windowClass.style = 0;
-
- windowClass.lpfnWndProc = WindowProcedure;
- windowClass.cbClsExtra = NULL;
- windowClass.cbWndExtra = NULL;
- windowClass.hInstance = instance;
- windowClass.hIcon = NULL;
- windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
- windowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
- windowClass.lpszMenuName = NULL;
- windowClass.lpszClassName = className;
- if (::RegisterClass(&windowClass) == 0)
- return false;
- }
- return CWindow::CreateEx(exStyle, className, windowName,
- style, x, y, width, height, parentWindow,
- idOrHMenu, instance, this);
-}
-
-#ifndef _UNICODE
-
-bool CWindow2::CreateEx(DWORD exStyle, LPCWSTR className,
- LPCWSTR windowName, DWORD style,
- int x, int y, int width, int height,
- HWND parentWindow, HMENU idOrHMenu,
- HINSTANCE instance)
-{
- bool needRegister;
- if(g_IsNT)
- {
- WNDCLASSW windowClass;
- needRegister = ::GetClassInfoW(instance, className, &windowClass) == 0;
- }
- else
- {
- WNDCLASSA windowClassA;
- AString classNameA;
- LPCSTR classNameP;
- if (IS_INTRESOURCE(className))
- classNameP = (LPCSTR)className;
- else
- {
- classNameA = GetSystemString(className);
- classNameP = classNameA;
- }
- needRegister = ::GetClassInfoA(instance, classNameP, &windowClassA) == 0;
- }
- if (needRegister)
- {
- WNDCLASSW windowClass;
- // windowClass.style = CS_HREDRAW | CS_VREDRAW;
- windowClass.style = 0;
- windowClass.lpfnWndProc = WindowProcedure;
- windowClass.cbClsExtra = NULL;
- windowClass.cbWndExtra = NULL;
- windowClass.hInstance = instance;
- windowClass.hIcon = NULL;
- windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
- windowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
- windowClass.lpszMenuName = NULL;
- windowClass.lpszClassName = className;
- if (MyRegisterClass(&windowClass) == 0)
- return false;
- }
- return CWindow::CreateEx(exStyle, className, windowName,
- style, x, y, width, height, parentWindow,
- idOrHMenu, instance, this);
-
-}
-#endif
-
-LRESULT CWindow2::DefProc(UINT message, WPARAM wParam, LPARAM lParam)
-{
- #ifndef _UNICODE
- if (g_IsNT)
- return DefWindowProcW(_window, message, wParam, lParam);
- else
- #endif
- return DefWindowProc(_window, message, wParam, lParam);
-}
-#endif
-
-LRESULT CWindow2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
-{
- LRESULT result;
- switch (message)
- {
- case WM_CREATE:
- if (!OnCreate((CREATESTRUCT *)lParam))
- return -1;
- break;
- case WM_COMMAND:
- if (OnCommand(wParam, lParam, result))
- return result;
- break;
- case WM_NOTIFY:
- if (OnNotify((UINT)wParam, (LPNMHDR) lParam, result))
- return result;
- break;
- case WM_DESTROY:
- OnDestroy();
- break;
- case WM_CLOSE:
- OnClose();
- return 0;
-#ifdef _WIN32
- case WM_SIZE:
- if (OnSize(wParam, LOWORD(lParam), HIWORD(lParam)))
- return 0;
-#endif
- }
-#ifdef _WIN32
- return DefProc(message, wParam, lParam);
-#else
- return 0;
-#endif
-}
-
-bool CWindow2::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result)
-{
- return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam, result);
-}
-
-bool CWindow2::OnCommand(int /* code */, int /* itemID */, LPARAM /* lParam */, LRESULT & /* result */)
-{
- return false;
- // return DefProc(message, wParam, lParam);
- /*
- if (code == BN_CLICKED)
- return OnButtonClicked(itemID, (HWND)lParam);
- */
-}
-
-/*
-bool CDialog::OnButtonClicked(int buttonID, HWND buttonHWND)
-{
- switch(aButtonID)
- {
- case IDOK:
- OnOK();
- break;
- case IDCANCEL:
- OnCancel();
- break;
- case IDHELP:
- OnHelp();
- break;
- default:
- return false;
- }
- return true;
-}
-
-*/
-
-}}
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Window2.h b/src/libs/7zip/unix/CPP/Windows/Control/Window2.h
deleted file mode 100644
index 48c890640..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Control/Window2.h
+++ /dev/null
@@ -1,111 +0,0 @@
-// Windows/Control/Window2.h
-
-#ifndef __WINDOWS_CONTROL_WINDOW2_H
-#define __WINDOWS_CONTROL_WINDOW2_H
-
-#include "Windows/Window.h"
-#include "Windows/Defs.h"
-
-#ifndef _WIN32
-typedef void * WNDPROC;
-typedef void * CREATESTRUCT;
-typedef struct
-{
- HWND hwndFrom;
-
- UINT code;
-#define NM_DBLCLK 1
-#define LVN_ITEMCHANGED 2
-#define LVN_COLUMNCLICK 3
-#define CBEN_BEGINEDIT 10
-#define CBEN_ENDEDITW 11
-
-
-} NMHDR;
-typedef NMHDR * LPNMHDR;
-
-typedef struct tagNMLISTVIEW
-{
- NMHDR hdr;
- INT iItem;
- INT iSubItem;
- UINT uNewState;
- UINT uOldState;
- // UINT uChanged;
- // POINT ptAction;
- LPARAM lParam;
-} NMLISTVIEW, *LPNMLISTVIEW;
-
-typedef void * LPNMITEMACTIVATE;
-
-#define NM_RCLICK 1234 /* FIXME */
-
-// FIXME
-#define WM_CREATE 1
-#define WM_COMMAND 2
-#define WM_NOTIFY 3
-#define WM_DESTROY 4
-#define WM_CLOSE 5
-
-#define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16))
-#define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xFFFF))
-
-
-#endif
-
-namespace NWindows {
-namespace NControl {
-
-class CWindow2 // : public CWindow
-{
- // LRESULT DefProc(UINT message, WPARAM wParam, LPARAM lParam);
-public:
- // CWindow2(HWND newWindow = NULL): CWindow(newWindow){};
- CWindow2() {}
- virtual ~CWindow2() {}
-
-#ifdef _WIN32
- bool CreateEx(DWORD exStyle, LPCTSTR className,
- LPCTSTR windowName, DWORD style,
- int x, int y, int width, int height,
- HWND parentWindow, HMENU idOrHMenu,
- HINSTANCE instance);
-
- #ifndef _UNICODE
- bool CreateEx(DWORD exStyle, LPCWSTR className,
- LPCWSTR windowName, DWORD style,
- int x, int y, int width, int height,
- HWND parentWindow, HMENU idOrHMenu,
- HINSTANCE instance);
- #endif
-#endif
-
- virtual LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam);
- virtual bool OnCreate(CREATESTRUCT * /* createStruct */) { return true; }
- // virtual LRESULT OnCommand(WPARAM wParam, LPARAM lParam);
- virtual bool OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result);
- virtual bool OnCommand(int code, int itemID, LPARAM lParam, LRESULT &result);
- virtual bool OnSize(WPARAM /* wParam */, int /* xSize */, int /* ySize */) { return false; }
- virtual bool OnNotify(UINT /* controlID */, LPNMHDR /* lParam */, LRESULT & /* result */) { return false; }
- virtual void OnDestroy() { /* FIXME PostQuitMessage(0); */ }
- virtual void OnClose() { /* FIXME Destroy(); */ }
- /*
- virtual LRESULT OnHelp(LPHELPINFO helpInfo) { OnHelp(); };
- virtual LRESULT OnHelp() {};
- virtual bool OnButtonClicked(int buttonID, HWND buttonHWND);
- virtual void OnOK() {};
- virtual void OnCancel() {};
- */
-
-#ifdef _WIN32
- LONG_PTR SetMsgResult(LONG_PTR newLongPtr )
- { return SetLongPtr(DWLP_MSGRESULT, newLongPtr); }
- LONG_PTR GetMsgResult() const
- { return GetLongPtr(DWLP_MSGRESULT); }
-#endif
-};
-
-}}
-
-#endif
-
diff --git a/src/libs/7zip/unix/CPP/Windows/Menu.h b/src/libs/7zip/unix/CPP/Windows/Menu.h
deleted file mode 100644
index 2f753c237..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Menu.h
+++ /dev/null
@@ -1,4 +0,0 @@
-
-/* TODO */
-
-
diff --git a/src/libs/7zip/unix/CPP/Windows/PropVariantConversions.cpp b/src/libs/7zip/unix/CPP/Windows/PropVariantConversions.cpp
index 61d524d07..abd5b46c4 100644
--- a/src/libs/7zip/unix/CPP/Windows/PropVariantConversions.cpp
+++ b/src/libs/7zip/unix/CPP/Windows/PropVariantConversions.cpp
@@ -76,13 +76,10 @@ bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime, bool
#else
BOOLEAN WINAPI RtlTimeToSecondsSince1970( const LARGE_INTEGER *Time, DWORD *Seconds );
- FILETIME filetime;
- LocalFileTimeToFileTime(&ft, &filetime);
-
LARGE_INTEGER ltime;
- ltime.QuadPart = filetime.dwHighDateTime;
- ltime.QuadPart = (ltime.QuadPart << 32) | filetime.dwLowDateTime;
+ ltime.QuadPart = ft.dwHighDateTime;
+ ltime.QuadPart = (ltime.QuadPart << 32) | ft.dwLowDateTime;
DWORD dw;
RtlTimeToSecondsSince1970(&ltime, &dw );
diff --git a/src/libs/7zip/unix/CPP/Windows/PropVariantUtils.cpp b/src/libs/7zip/unix/CPP/Windows/PropVariantUtils.cpp
deleted file mode 100644
index 0a9cfab7f..000000000
--- a/src/libs/7zip/unix/CPP/Windows/PropVariantUtils.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-// PropVariantUtils.cpp
-
-#include "StdAfx.h"
-
-#include "PropVariantUtils.h"
-#include "Common/StringConvert.h"
-#include "Common/IntToString.h"
-
-using namespace NWindows;
-
-static AString GetHex(UInt32 v)
-{
- char sz[32] = { '0', 'x' };
- ConvertUInt64ToString(v, sz + 2, 16);
- return sz;
-}
-
-void StringToProp(const AString &s, NCOM::CPropVariant &prop)
-{
- prop = MultiByteToUnicodeString(s);
-}
-
-void PairToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 value, NCOM::CPropVariant &prop)
-{
- AString s;
- for (unsigned i = 0; i < num; i++)
- {
- const CUInt32PCharPair &p = pairs[i];
- if (p.Value == value)
- s = p.Name;
- }
- if (s.IsEmpty())
- s = GetHex(value);
- StringToProp(s, prop);
-}
-
-AString TypeToString(const char *table[], unsigned num, UInt32 value)
-{
- if (value < num)
- return table[value];
- return GetHex(value);
-}
-
-void TypeToProp(const char *table[], unsigned num, UInt32 value, NCOM::CPropVariant &prop)
-{
- StringToProp(TypeToString(table, num, value), prop);
-}
-
-
-AString FlagsToString(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags)
-{
- AString s;
- for (unsigned i = 0; i < num; i++)
- {
- const CUInt32PCharPair &p = pairs[i];
- UInt32 flag = (UInt32)1 << (unsigned)p.Value;
- if ((flags & flag) != 0)
- {
- if (!s.IsEmpty())
- s += ' ';
- s += p.Name;
- }
- flags &= ~flag;
- }
- if (flags != 0)
- {
- if (!s.IsEmpty())
- s += ' ';
- s += GetHex(flags);
- }
- return s;
-}
-
-void FlagsToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags, NCOM::CPropVariant &prop)
-{
- StringToProp(FlagsToString(pairs, num, flags), prop);
-}
-
diff --git a/src/libs/7zip/unix/CPP/Windows/PropVariantUtils.h b/src/libs/7zip/unix/CPP/Windows/PropVariantUtils.h
deleted file mode 100644
index 5aaf65cb9..000000000
--- a/src/libs/7zip/unix/CPP/Windows/PropVariantUtils.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Windows/PropVariantUtils.h
-
-#ifndef __PROP_VARIANT_UTILS_H
-#define __PROP_VARIANT_UTILS_H
-
-#include "Common/MyString.h"
-#include "PropVariant.h"
-
-struct CUInt32PCharPair
-{
- UInt32 Value;
- const char *Name;
-};
-
-void StringToProp(const AString &s, NWindows::NCOM::CPropVariant &prop);
-void PairToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 value, NWindows::NCOM::CPropVariant &prop);
-
-AString FlagsToString(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags);
-void FlagsToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags, NWindows::NCOM::CPropVariant &prop);
-
-AString TypeToString(const char *table[], unsigned num, UInt32 value);
-void TypeToProp(const char *table[], unsigned num, UInt32 value, NWindows::NCOM::CPropVariant &prop);
-
-#define PAIR_TO_PROP(pairs, value, prop) PairToProp(pairs, sizeof(pairs) / sizeof(pairs[0]), value, prop)
-#define FLAGS_TO_PROP(pairs, value, prop) FlagsToProp(pairs, sizeof(pairs) / sizeof(pairs[0]), value, prop)
-#define TYPE_TO_PROP(table, value, prop) TypeToProp(table, sizeof(table) / sizeof(table[0]), value, prop)
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/Windows/ResourceString.h b/src/libs/7zip/unix/CPP/Windows/ResourceString.h
deleted file mode 100644
index ac9c5cd5d..000000000
--- a/src/libs/7zip/unix/CPP/Windows/ResourceString.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Windows/ResourceString.h
-
-#ifndef __WINDOWS_RESOURCESTRING_H
-#define __WINDOWS_RESOURCESTRING_H
-
-#include "Common/MyString.h"
-
-namespace NWindows {
-
-CSysString MyLoadString(HINSTANCE hInstance, UINT resourceID);
-CSysString MyLoadString(UINT resourceID);
-#ifdef _UNICODE
-inline UString MyLoadStringW(HINSTANCE hInstance, UINT resourceID) { return MyLoadString(hInstance, resourceID); }
-inline UString MyLoadStringW(UINT resourceID) { return MyLoadString(resourceID); }
-#else
-UString MyLoadStringW(HINSTANCE hInstance, UINT resourceID);
-UString MyLoadStringW(UINT resourceID);
-#endif
-
-}
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/Windows/Shell.h b/src/libs/7zip/unix/CPP/Windows/Shell.h
deleted file mode 100644
index f116b772b..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Shell.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Windows/Shell.h
-
-#ifndef __WINDOWS_SHELL_H
-#define __WINDOWS_SHELL_H
-
-#include <windows.h>
-// #include <shlobj.h>
-
-#include "Common/MyString.h"
-#include "Windows/Defs.h"
-
-
-namespace NWindows{
-namespace NShell{
-
-bool BrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString &resultPath);
-
-}}
-
-
-#endif
diff --git a/src/libs/7zip/unix/CPP/Windows/Time.cpp b/src/libs/7zip/unix/CPP/Windows/Time.cpp
index dfa0938b5..b58de6fe1 100644
--- a/src/libs/7zip/unix/CPP/Windows/Time.cpp
+++ b/src/libs/7zip/unix/CPP/Windows/Time.cpp
@@ -10,26 +10,6 @@ namespace NTime {
static const UInt32 kFileTimeStartYear = 1601;
-bool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime)
-{
- return BOOLToBool(::DosDateTimeToFileTime((UInt16)(dosTime >> 16), (UInt16)(dosTime & 0xFFFF), &fileTime));
-}
-
-static const UInt32 kHighDosTime = 0xFF9FBF7D;
-static const UInt32 kLowDosTime = 0x210000;
-
-bool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime)
-{
- WORD datePart, timePart;
- if (!::FileTimeToDosDateTime(&fileTime, &datePart, &timePart))
- {
- dosTime = (fileTime.dwHighDateTime >= 0x01C00000) ? kHighDosTime : kLowDosTime;
- return false;
- }
- dosTime = (((UInt32)datePart) << 16) + timePart;
- return true;
-}
-
static const UInt32 kNumTimeQuantumsInSecond = 10000000;
static const UInt64 kUnixTimeStartValue = ((UInt64)kNumTimeQuantumsInSecond) * 60 * 60 * 24 * 134774;
diff --git a/src/libs/7zip/unix/CPP/Windows/Window.cpp b/src/libs/7zip/unix/CPP/Windows/Window.cpp
deleted file mode 100644
index e92228c70..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Window.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-// Windows/Window.cpp
-
-#include "StdAfx.h"
-
-// For compilers that support precompilation, includes "wx/wx.h".
-#include "wx/wxprec.h"
-
-#ifdef __BORLANDC__
- #pragma hdrstop
-#endif
-
-// for all others, include the necessary headers (this file is usually all you
-// need because it includes almost all "standard" wxWidgets headers)
-#ifndef WX_PRECOMP
- #include "wx/wx.h"
-#endif
-
-#undef _WIN32
-
-#ifndef _UNICODE
-#include "Common/StringConvert.h"
-#endif
-#include "Windows/Window.h"
-
-void verify_main_thread(void);
-
-class LockGUI
-{
- bool _IsMain;
- public:
- LockGUI() {
- verify_main_thread();
-
- _IsMain = wxThread::IsMain();
- if (!_IsMain) {
- printf("LockGUI-Windows\n");
- abort(); // FIXME wxMutexGuiEnter();
- }
- }
- ~LockGUI() { if (!_IsMain) wxMutexGuiLeave(); }
-};
-
-namespace NWindows {
-
-HWND GetDlgItem(HWND dialogWindow, int ControlID)
-{
- LockGUI lock;
- if (dialogWindow) return dialogWindow->FindWindow(ControlID);
- return 0;
-}
-
-void MySetWindowText(HWND wnd, LPCWSTR s)
-{
- if (wnd == 0) return;
-
- LockGUI lock;
-
- wxString str = s;
- /*
- int id = wnd->GetId();
- if ( (id != wxID_OK) && (id != wxID_CANCEL) && (id != wxID_HELP) && (id != wxID_YES) && (id != wxID_NO))
- */
- {
- wnd->SetLabel(str);
- }
-}
-
- bool CWindow::GetText(CSysString &s)
- {
- wxString str;
- {
- LockGUI lock;
- str = _window->GetLabel();
- }
- s = str;
- return true;
- }
-
- bool CWindow::IsEnabled()
- {
- LockGUI lock;
- return _window->IsEnabled();
- }
-}
-
-////////////////////////////////// Windows Compatibility
-#include <sys/resource.h>
-
-void Sleep(unsigned millisec)
-{
- wxMilliSleep(millisec);
-}
-
-t_processID GetCurrentProcess(void) {
- return getpid();
-}
-
-void SetPriorityClass(t_processID pid , int priority) {
- setpriority(PRIO_PROCESS,pid,priority);
-}
-
diff --git a/src/libs/7zip/unix/CPP/Windows/Window.h b/src/libs/7zip/unix/CPP/Windows/Window.h
deleted file mode 100644
index 1970fe62d..000000000
--- a/src/libs/7zip/unix/CPP/Windows/Window.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Windows/Window.h
-
-#ifndef __WINDOWS_WINDOW_H
-#define __WINDOWS_WINDOW_H
-
-#include "Windows/Defs.h"
-#include "Common/MyString.h"
-
-namespace NWindows {
-
-HWND GetDlgItem(HWND dialogWindow, int ControlID);
-void MySetWindowText(HWND wnd, LPCWSTR s);
-
-class CWindow
-{
-private:
- // bool ModifyStyleBase(int styleOffset, DWORD remove, DWORD add, UINT flags);
-protected:
- HWND _window;
-public:
- CWindow(HWND newWindow = NULL): _window(newWindow){};
- CWindow& operator=(HWND newWindow)
- {
- _window = newWindow;
- return *this;
- }
- operator HWND() const { return _window; }
- void Attach(HWND newWindow) { _window = newWindow; }
- HWND Detach()
- {
- HWND window = _window;
- _window = NULL;
- return window;
- }
- virtual void SetText(LPCWSTR s) { MySetWindowText(_window, s); }
- virtual bool GetText(CSysString &s);
- bool IsEnabled();
-};
-
-}
-
-#endif
-
diff --git a/src/libs/7zip/unix/CPP/include_windows/windows.h b/src/libs/7zip/unix/CPP/include_windows/windows.h
index ef0ca3d19..5223e81ac 100644
--- a/src/libs/7zip/unix/CPP/include_windows/windows.h
+++ b/src/libs/7zip/unix/CPP/include_windows/windows.h
@@ -142,11 +142,9 @@ typedef struct _SYSTEMTIME {
extern "C" {
#endif
-BOOL WINAPI DosDateTimeToFileTime(WORD,WORD,FILETIME *);
-BOOL WINAPI FileTimeToDosDateTime(CONST FILETIME *,WORD *, WORD *);
BOOL WINAPI FileTimeToLocalFileTime(CONST FILETIME *,FILETIME *);
+//BOOL WINAPI LocalFileTimeToFileTime(CONST FILETIME *,FILETIME *);
BOOL WINAPI FileTimeToSystemTime(CONST FILETIME *,SYSTEMTIME *);
-BOOL WINAPI LocalFileTimeToFileTime(CONST FILETIME *,FILETIME *);
VOID WINAPI GetSystemTime(SYSTEMTIME *);
BOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME*,FILETIME *);
diff --git a/src/libs/7zip/unix/CPP/myWindows/myAddExeFlag.cpp b/src/libs/7zip/unix/CPP/myWindows/myAddExeFlag.cpp
deleted file mode 100644
index 6bdc34ac3..000000000
--- a/src/libs/7zip/unix/CPP/myWindows/myAddExeFlag.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "StdAfx.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <windows.h>
-
-#define NEED_NAME_WINDOWS_TO_UNIX
-#include "myPrivate.h"
-
-#include "Common/StringConvert.h"
-
-void myAddExeFlag(const UString &u_name)
-{
- AString filename = UnicodeStringToMultiByte(u_name, CP_ACP); // FIXME
- const char * name = nameWindowToUnix(filename);
- // printf("myAddExeFlag(%s)\n",name);
- chmod(name,0700);
-}
-
diff --git a/src/libs/7zip/unix/CPP/myWindows/myDateAndTime.cpp b/src/libs/7zip/unix/CPP/myWindows/myDateAndTime.cpp
new file mode 100644
index 000000000..1773feb86
--- /dev/null
+++ b/src/libs/7zip/unix/CPP/myWindows/myDateAndTime.cpp
@@ -0,0 +1,146 @@
+/**************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
+
+#include <QDebug>
+#include <QDateTime>
+#include "windows.h"
+
+void FileTimeToDateTime(const FILETIME *source, QDateTime *target)
+{
+ ULARGE_INTEGER store;
+ QDateTime tempDateTime(QDate(1601, 1, 1));
+
+ store.QuadPart = source->dwHighDateTime;
+ store.QuadPart = store.QuadPart << 32;
+ store.QuadPart += source->dwLowDateTime;
+
+ *target = tempDateTime.addMSecs(store.QuadPart / 10000);
+}
+
+void DateTimeToSystemTime(const QDateTime *source, SYSTEMTIME *target)
+{
+ target->wYear = source->date().year();
+ target->wMonth = source->date().month();
+ target->wDayOfWeek = source->date().dayOfWeek();
+ target->wDay = source->date().day();
+ target->wHour = source->time().hour();
+ target->wMinute = source->time().minute();
+ target->wSecond = source->time().second();
+ target->wMilliseconds = source->time().msec();
+}
+
+
+BOOL WINAPI FileTimeToSystemTime(CONST FILETIME *source,SYSTEMTIME *target)
+{
+ QDateTime tempDateTime;
+ FileTimeToDateTime(source, &tempDateTime);
+ DateTimeToSystemTime(&tempDateTime, target);
+
+ return TRUE;
+}
+
+BOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME *source,FILETIME *target)
+{
+ // TODO: Implementation!
+ // This doesn't seem to be called at all
+
+ qDebug() << "SystemTimeToFileTime";
+
+ target->dwHighDateTime = 0;
+ target->dwLowDateTime = 0;
+
+ qWarning() << Q_FUNC_INFO;
+
+ return TRUE;
+}
+
+BOOL WINAPI FileTimeToLocalFileTime(CONST FILETIME *source,FILETIME *target)
+{
+ target->dwHighDateTime = source->dwHighDateTime;
+ target->dwLowDateTime = source->dwLowDateTime;
+
+ QDateTime tempDateTime;
+ FileTimeToDateTime(source, &tempDateTime);
+
+ tempDateTime = tempDateTime.toLocalTime();
+
+ return TRUE;
+}
+
+BOOLEAN WINAPI RtlTimeToSecondsSince1970(const LARGE_INTEGER *Time, DWORD *Seconds)
+{
+ SYSTEMTIME tempSystemTime;
+ FILETIME fileTime;
+
+ fileTime.dwLowDateTime = Time->QuadPart;
+ fileTime.dwHighDateTime = Time->QuadPart >> 32;
+
+ FileTimeToSystemTime(&fileTime, &tempSystemTime);
+
+ QDate targetDate(tempSystemTime.wYear, tempSystemTime.wMonth, tempSystemTime.wDay);
+ QTime targetTime(tempSystemTime.wHour, tempSystemTime.wMinute, tempSystemTime.wSecond, tempSystemTime.wMilliseconds);
+ QDateTime targetDateTime(targetDate, targetTime, Qt::UTC);
+
+ quint64 secsSince1970 = targetDateTime.toMSecsSinceEpoch() / 1000;
+
+ *Seconds = secsSince1970;
+
+ return TRUE;
+}
+
+void WINAPI RtlSecondsSince1970ToFileTime(DWORD Seconds, FILETIME *ft)
+{
+ QDateTime fileTimeStartDate(QDate(1601, 1, 1));
+ quint64 hnseconds = Seconds;
+ QDateTime sourceDateTime = QDateTime::fromMSecsSinceEpoch(hnseconds * 1000);
+
+ hnseconds = fileTimeStartDate.msecsTo(sourceDateTime);
+ hnseconds *= 10000;
+
+ ft->dwLowDateTime = hnseconds;
+ ft->dwHighDateTime = hnseconds >> 32;
+}
+
+VOID WINAPI GetSystemTime(SYSTEMTIME *st)
+{
+ QDateTime nowDateTime = QDateTime::currentDateTimeUtc();
+ DateTimeToSystemTime(&nowDateTime, st);
+}
diff --git a/src/libs/7zip/unix/CPP/myWindows/myGetTickCount.cpp b/src/libs/7zip/unix/CPP/myWindows/myGetTickCount.cpp
deleted file mode 100644
index 6a6080b35..000000000
--- a/src/libs/7zip/unix/CPP/myWindows/myGetTickCount.cpp
+++ /dev/null
@@ -1,8 +0,0 @@
-#include "StdAfx.h"
-
-#include <time.h>
-
-DWORD WINAPI GetTickCount(VOID) {
- return (DWORD)time(0); // FIXME : but only for the seed of the random generator
-}
-
diff --git a/src/libs/7zip/unix/CPP/myWindows/mySplitCommandLine.cpp b/src/libs/7zip/unix/CPP/myWindows/mySplitCommandLine.cpp
deleted file mode 100644
index 9e0791992..000000000
--- a/src/libs/7zip/unix/CPP/myWindows/mySplitCommandLine.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-#include "StdAfx.h"
-
-#include "../Common/StringConvert.h"
-
-#include "myPrivate.h"
-
-#ifdef ENV_HAVE_LOCALE
-#include <locale.h>
-#endif
-
-extern void my_windows_split_path(const AString &p_path, AString &dir , AString &base);
-
-void mySplitCommandLine(int numArguments,const char *arguments[],UStringVector &parts) {
-
- { // define P7ZIP_HOME_DIR
- static char p7zip_home_dir[MAX_PATH];
- AString dir,name;
- my_windows_split_path(arguments[0],dir,name);
- snprintf(p7zip_home_dir,sizeof(p7zip_home_dir),"P7ZIP_HOME_DIR=%s/",(const char *)dir);
- p7zip_home_dir[sizeof(p7zip_home_dir)-1] = 0;
- putenv(p7zip_home_dir);
- }
-
-#ifdef ENV_HAVE_LOCALE
- // set the program's current locale from the user's environment variables
- setlocale(LC_ALL,"");
-
-
- // auto-detect which conversion p7zip should use
- char *locale = setlocale(LC_CTYPE,0);
- if (locale) {
- size_t len = strlen(locale);
- char *locale_upper = (char *)malloc(len+1);
- if (locale_upper) {
- strcpy(locale_upper,locale);
-
- for(size_t i=0;i<len;i++)
- locale_upper[i] = toupper(locale_upper[i] & 255);
-
- if ( (strcmp(locale_upper,"") != 0)
- && (strcmp(locale_upper,"C") != 0)
- && (strcmp(locale_upper,"POSIX") != 0) ) {
- global_use_utf16_conversion = 1;
- }
- free(locale_upper);
- }
- }
-#elif defined(LOCALE_IS_UTF8)
- global_use_utf16_conversion = 1; // assume LC_CTYPE="utf8"
-#else
- global_use_utf16_conversion = 0; // assume LC_CTYPE="C"
-#endif
-
- parts.Clear();
- for(int ind=0;ind < numArguments; ind++) {
- if ((ind <= 2) && (strcmp(arguments[ind],"-no-utf16") == 0)) {
- global_use_utf16_conversion = 0;
- } else if ((ind <= 2) && (strcmp(arguments[ind],"-utf16") == 0)) {
- global_use_utf16_conversion = 1;
- } else {
- UString tmp = MultiByteToUnicodeString(arguments[ind]);
- // tmp.Trim(); " " is a valid filename ...
- if (!tmp.IsEmpty()) {
- parts.Add(tmp);
- }
- }
- }
-}
-
-const char *my_getlocale(void) {
-#ifdef ENV_HAVE_LOCALE
- const char* ret = setlocale(LC_CTYPE,0);
- if (ret == 0)
- ret ="C";
- return ret;
-#elif defined(LOCALE_IS_UTF8)
- return "utf8";
-#else
- return "C";
-#endif
-}
-
diff --git a/src/libs/7zip/unix/CPP/myWindows/test_emul.cpp b/src/libs/7zip/unix/CPP/myWindows/test_emul.cpp
deleted file mode 100644
index 1c8d3261d..000000000
--- a/src/libs/7zip/unix/CPP/myWindows/test_emul.cpp
+++ /dev/null
@@ -1,745 +0,0 @@
-#undef BIG_ENDIAN
-#undef LITTLE_ENDIAN
-
-#include "StdAfx.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <unistd.h>
-
-#ifdef __APPLE_CC__
-#define UInt32 macUIn32
-#include <CoreFoundation/CoreFoundation.h>
-#undef UInt32
-#endif
-
-#ifdef ENV_HAVE_WCHAR__H
-#include <wchar.h>
-#endif
-#ifdef ENV_HAVE_LOCALE
-#include <locale.h>
-#endif
-
-#include <windows.h>
-
-#define NEED_NAME_WINDOWS_TO_UNIX
-// #include "myPrivate.h"
-
-#include "Common/StringConvert.h"
-#include "Common/StdOutStream.h"
-
-#undef NDEBUG
-#include <assert.h>
-
-#include "Common/StringConvert.cpp"
-#include "Common/StdOutStream.cpp"
-#include "Common/IntToString.cpp"
-
-#include "Windows/Synchronization.cpp"
-#include "Windows/FileFind.cpp"
-#include "Windows/Time.cpp"
-#include "../C/Threads.c"
-#include "../../C/Ppmd.h"
-
-using namespace NWindows;
-
-#if defined(ENV_HAVE_WCHAR__H) && defined(ENV_HAVE_MBSTOWCS) && defined(ENV_HAVE_WCSTOMBS)
-void test_mbs(void) {
- wchar_t wstr1[256] = {
- L'e',
- 0xE8, // latin small letter e with grave
- 0xE9, // latin small letter e with acute
- L'a',
- 0xE0, // latin small letter a with grave
- 0x20AC, // euro sign
- L'b',
- 0 };
- wchar_t wstr2[256];
- char astr[256];
-
- global_use_utf16_conversion = 1;
-
- size_t len1 = wcslen(wstr1);
-
- printf("wstr1 - %d - '%ls'\n",(int)len1,wstr1);
-
- size_t len0 = wcstombs(astr,wstr1,sizeof(astr));
- printf("astr - %d - '%s'\n",(int)len0,astr);
-
- size_t len2 = mbstowcs(wstr2,astr,sizeof(wstr2)/sizeof(*wstr2));
- printf("wstr - %d - '%ls'\n",(int)len2,wstr2);
-
- if (wcscmp(wstr1,wstr2) != 0) {
- printf("ERROR during conversions wcs -> mbs -> wcs\n");
- exit(EXIT_FAILURE);
- }
-
- char *ptr = astr;
- size_t len = 0;
- while (*ptr) {
- ptr = CharNextA(ptr);
- len += 1;
- }
- if ((len != len1) && (len != 12)) { // 12 = when locale is UTF8 instead of ISO8859-15
- printf("ERROR CharNextA : len=%d, len1=%d\n",(int)len,(int)len1);
- exit(EXIT_FAILURE);
- }
-
- UString ustr(wstr1);
- assert(ustr.Length() == (int)len1);
-
- AString ansistr(astr);
- assert(ansistr.Length() == (int)len0);
-
- ansistr = UnicodeStringToMultiByte(ustr);
- assert(ansistr.Length() == (int)len0);
-
- assert(strcmp(ansistr,astr) == 0);
- assert(wcscmp(ustr,wstr1) == 0);
-
- UString ustr2 = MultiByteToUnicodeString(astr);
- assert(ustr2.Length() == (int)len1);
- assert(wcscmp(ustr2,wstr1) == 0);
-}
-#endif
-
-static void test_astring(int num) {
- AString strResult;
-
- strResult = "first part : ";
- char number[256];
- sprintf(number,"%d",num);
- strResult += AString(number);
-
- strResult += " : last part";
-
- printf("strResult -%s-\n",(const char *)strResult);
-
-}
-
-
-extern void my_windows_split_path(const AString &p_path, AString &dir , AString &base);
-
-static struct {
- const char *path;
- const char *dir;
- const char *base;
-}
-tabSplit[]=
- {
- { "",".","." },
- { "/","/","/" },
- { ".",".","." },
- { "//","/","/" },
- { "///","/","/" },
- { "dir",".","dir" },
- { "/dir","/","dir" },
- { "/dir/","/","dir" },
- { "/dir/base","/dir","base" },
- { "/dir//base","/dir","base" },
- { "/dir///base","/dir","base" },
- { "//dir/base","//dir","base" },
- { "///dir/base","///dir","base" },
- { "/dir/base/","/dir","base" },
- { 0,0,0 }
- };
-
-static void test_split_astring() {
- int ind = 0;
- while (tabSplit[ind].path) {
- AString path(tabSplit[ind].path);
- AString dir;
- AString base;
-
- my_windows_split_path(path,dir,base);
-
- if ((dir != tabSplit[ind].dir) || (base != tabSplit[ind].base)) {
- printf("ERROR : '%s' '%s' '%s'\n",(const char *)path,(const char *)dir,(const char *)base);
- }
- ind++;
- }
- printf("test_split_astring : done\n");
-}
-
- // Number of 100 nanosecond units from 1/1/1601 to 1/1/1970
-#define EPOCH_BIAS 116444736000000000LL
-static LARGE_INTEGER UnixTimeToUL(time_t tps_unx)
-{
- LARGE_INTEGER ul;
- ul.QuadPart = tps_unx * 10000000LL + EPOCH_BIAS;
- return ul;
-}
-
-static LARGE_INTEGER FileTimeToUL(FILETIME fileTime)
-{
- LARGE_INTEGER lFileTime;
- lFileTime.QuadPart = fileTime.dwHighDateTime;
- lFileTime.QuadPart = (lFileTime.QuadPart << 32) | fileTime.dwLowDateTime;
- return lFileTime;
-}
-
-static void display(const char *txt,SYSTEMTIME systime)
-{
- FILETIME fileTime;
- BOOL ret = SystemTimeToFileTime(&systime,&fileTime);
- assert(ret == TRUE);
- LARGE_INTEGER ulFileTime = FileTimeToUL(fileTime);
-
- const char * day="";
- switch (systime.wDayOfWeek)
- {
- case 0:day = "Sunday";break;
- case 1:day = "Monday";break;
- case 2:day = "Tuesday";break;
- case 3:day = "Wednesday";break;
- case 4:day = "Thursday";break;
- case 5:day = "Friday";break;
- case 6:day = "Saturday";break;
- }
- g_StdOut<< txt << day << " "
- << (int)systime.wYear << "/" << (int)systime.wMonth << "/" << (int)systime.wDay << " "
- << (int)systime.wHour << ":" << (int)systime.wMinute << ":" << (int)systime.wSecond << ":"
- << (int)systime.wMilliseconds
- << " (" << (UInt64)ulFileTime.QuadPart << ")\n";
-}
-
-static void test_time()
-{
- time_t tps_unx = time(0);
-
- printf("Test Time (1):\n");
- printf("===========\n");
- SYSTEMTIME systimeGM;
- GetSystemTime(&systimeGM);
-
- LARGE_INTEGER ul = UnixTimeToUL(tps_unx);
- g_StdOut<<" unix time = " << (UInt64)tps_unx << " (" << (UInt64)ul.QuadPart << ")\n";
-
- g_StdOut<<" gmtime : " << asctime(gmtime(&tps_unx))<<"\n";
- g_StdOut<<" localtime : " << asctime(localtime(&tps_unx))<<"\n";
-
- display(" GetSystemTime : ", systimeGM);
-}
-
-static void test_time2()
-{
- UInt32 dosTime = 0x30d0094C;
- FILETIME utcFileTime;
- FILETIME localFileTime;
- FILETIME localFileTime2;
- UInt32 dosTime2 = 0;
-
- printf("Test Time (2):\n");
- printf("===========\n");
- NTime::DosTimeToFileTime(dosTime, localFileTime);
- NTime::FileTimeToDosTime(localFileTime, dosTime2);
- assert(dosTime == dosTime2);
-
- printf("Test Time (3):\n");
- printf("===========\n");
- /* DosTime To utcFileTime */
-
- if (NTime::DosTimeToFileTime(dosTime, localFileTime)) /* DosDateTimeToFileTime */
- {
- if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))
- utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
- }
-
- printf(" - 0x%x => 0x%x 0x%x => 0x%x 0x%x\n",(unsigned)dosTime,
- (unsigned)localFileTime.dwHighDateTime,(unsigned)localFileTime.dwLowDateTime,
- (unsigned)utcFileTime.dwHighDateTime,(unsigned)utcFileTime.dwLowDateTime);
-
-
- /* utcFileTime to DosTime */
-
- FileTimeToLocalFileTime(&utcFileTime, &localFileTime2);
- NTime::FileTimeToDosTime(localFileTime2, dosTime2); /* FileTimeToDosDateTime */
-
- printf(" - 0x%x <= 0x%x 0x%x <= 0x%x 0x%x\n",(unsigned)dosTime2,
- (unsigned)localFileTime2.dwHighDateTime,(unsigned)localFileTime2.dwLowDateTime,
- (unsigned)utcFileTime.dwHighDateTime,(unsigned)utcFileTime.dwLowDateTime);
-
- assert(dosTime == dosTime2);
- assert(localFileTime.dwHighDateTime == localFileTime2.dwHighDateTime);
- assert(localFileTime.dwLowDateTime == localFileTime2.dwLowDateTime);
-}
-
-static void test_semaphore()
-{
- g_StdOut << "\nTEST SEMAPHORE :\n";
-
- NWindows::NSynchronization::CSynchro sync;
- NWindows::NSynchronization::CSemaphoreWFMO sema;
- bool bres;
- DWORD waitResult;
- int i;
-
- sync.Create();
- sema.Create(&sync,2,10);
-
- g_StdOut << " - Release(1)\n";
- for(i = 0 ;i < 8;i++)
- {
- // g_StdOut << " - Release(1) : "<< i << "\n";
- bres = sema.Release(1);
- assert(bres == S_OK);
- }
- // g_StdOut << " - Release(1) : done\n";
- bres = sema.Release(1);
- assert(bres == S_FALSE);
-
- g_StdOut << " - WaitForMultipleObjects(INFINITE)\n";
- HANDLE events[1] = { sema };
- for(i=0;i<10;i++)
- {
- waitResult = ::WaitForMultipleObjects(1, events, FALSE, INFINITE);
- assert(waitResult == WAIT_OBJECT_0);
- }
-
- g_StdOut << " Done\n";
-}
-
-
-/****************************************************************************************/
-
-
-static int threads_count = 0;
-
-static THREAD_FUNC_RET_TYPE thread_fct(void * /* param */ ) {
- threads_count++;
- return 0;
-}
-
-#define MAX_THREADS 100000
-
-int test_thread(void) {
- ::CThread thread;
-
- Thread_Construct(&thread);
-
- threads_count = 0;
-
- printf("test_thread : %d threads\n",MAX_THREADS);
-
- for(int i=0;i<MAX_THREADS;i++) {
- Thread_Create(&thread, thread_fct, 0);
-
- Thread_Wait(&thread);
-
- Thread_Close(&thread);
- }
-
- assert(threads_count == MAX_THREADS);
-
- return 0;
-}
-
-
-void dumpStr(const char *title,const char *txt)
-{
- size_t i,len = strlen(txt);
-
- printf("%s - %d :",title,(int)len);
-
- for(i = 0 ; i<len;i++) {
- printf(" 0x%02x",(unsigned)(txt[i] & 255));
- }
-
- printf("\n");
-}
-
-
-void dumpWStr(const char *title,const wchar_t *txt)
-{
- size_t i,len = wcslen(txt);
-
- printf("%s - %d :",title,(int)len);
-
- for(i = 0 ; i<len;i++) {
- printf(" 0x%02x",(unsigned)(txt[i]));
- }
-
- printf("\n");
-}
-
-#ifdef __APPLE_CC__
-
-void testMaxOSX_stringConvert()
-{
-/*
- 0xE8, // latin small letter e with grave
- 0xE9, // latin small letter e with acute
- L'a',
- 0xE0, // latin small letter a with grave
- 0x20AC, // euro sign
-*/
- struct
- {
- char astr [256];
- wchar_t ustr [256];
- }
- tab [] =
- {
- {
- // 'a' , 'e with acute' , 'e with grave' , 'a with grave' , 'u with grave' , 'b' , '.' , 't' , 'x' , 't'
- { 0x61, 0x65, 0xcc, 0x81 , 0x65, 0xcc, 0x80, 0x61, 0xcc, 0x80, 0x75, 0xcc, 0x80, 0x62, 0x2e, 0x74, 0x78, 0x74, 0 },
- { 0x61, 0xe9, 0xe8, 0xe0, 0xf9, 0x62, 0x2e, 0x74, 0x78, 0x74, 0 }
- },
- {
- // 'a' , 'euro sign' , 'b' , '.' , 't' , 'x' , 't' , '\n'
- { 0x61, 0xe2, 0x82, 0xac, 0x62, 0x2e, 0x74, 0x78, 0x74, 0x0a, 0 },
- { 0x61, 0x20AC, 0x62, 0x2e, 0x74, 0x78, 0x74, 0x0a, 0 }
- },
- {
- { 0 },
- { 0 }
- }
- };
-
- int i;
-
- printf("testMaxOSX_stringConvert : \n");
-
- i = 0;
- while (tab[i].astr[0])
- {
- printf(" %s\n",tab[i].astr);
-
- UString ustr = GetUnicodeString(tab[i].astr);
-
- // dumpWStr("1",&ustr[0]);
-
- assert(MyStringCompare(&ustr[0],tab[i].ustr) == 0);
- assert(ustr.Length() == wcslen(tab[i].ustr) );
-
-
- AString astr = GetAnsiString(ustr);
- assert(MyStringCompare(&astr[0],tab[i].astr) == 0);
- assert(astr.Length() == strlen(tab[i].astr) );
-
- i++;
- }
-}
-
-void testMacOSX()
-{
-// char texte1[]= { 0xc3 , 0xa9 , 0xc3, 0xa0, 0};
-
- wchar_t wpath1[4096] = {
- 0xE9, // latin small letter e with acute
- 0xE0,
- 0xc7,
- 0x25cc,
- 0x327,
- 0xe4,
- 0xe2,
- 0xc2,
- 0xc3,
- 0x2e,
- 0x74,
- 0x78,
- 0x74,
-/*
- L'e',
- 0xE8, // latin small letter e with grave
- 0xE9, // latin small letter e with acute
- L'a',
- 0xE0, // latin small letter a with grave
- 0x20AC, // euro sign
- L'b',
-*/
- 0 };
-
- char utf8[4096];
- wchar_t wpath2[4096];
-
-
-
- // dumpStr("UTF8 standart",texte1);
-
- dumpWStr("UCS32 standard",wpath1);
-
-// Translate into FS pathname
- {
- const wchar_t * wcs = wpath1;
-
- UniChar unipath[4096];
-
- long n = wcslen(wcs);
-
- for(long i = 0 ; i<= n ;i++) {
- unipath[i] = wcs[i];
- }
-
- CFStringRef cfpath = CFStringCreateWithCharacters(NULL,unipath,n);
-
- CFMutableStringRef cfpath2 = CFStringCreateMutableCopy(NULL,0,cfpath);
- CFRelease(cfpath);
- CFStringNormalize(cfpath2,kCFStringNormalizationFormD);
-
- CFStringGetCString(cfpath2,(char *)utf8,4096,kCFStringEncodingUTF8);
-
- CFRelease(cfpath2);
- }
-
- dumpStr("UTF8 MacOSX",utf8);
-
-// Translate from FS pathname
- {
- const char * path = utf8;
-
- long n = strlen(path);
-
- CFStringRef cfpath = CFStringCreateWithCString(NULL,path,kCFStringEncodingUTF8);
-
- if (cfpath)
- {
-
- CFMutableStringRef cfpath2 = CFStringCreateMutableCopy(NULL,0,cfpath);
- CFRelease(cfpath);
- CFStringNormalize(cfpath2,kCFStringNormalizationFormC);
-
- n = CFStringGetLength(cfpath2);
- for(long i = 0 ; i<= n ;i++) {
- wpath2[i] = CFStringGetCharacterAtIndex(cfpath2,i);
- }
- wpath2[n] = 0;
-
- CFRelease(cfpath2);
- }
- else
- {
- wpath2[0] = 0;
- }
- }
-
- dumpWStr("UCS32 standard (2)",wpath2);
-
-/*
- {
- CFStringRef cfpath;
-
- cfpath = CFStringCreateWithCString(kCFAllocatorDefault, texte1, kCFStringEncodingUTF8);
-
- // TODO str = null ?
-
- CFMutableStringRef cfpath2 = CFStringCreateMutableCopy(NULL,0,cfpaht);
- CFRealease(cfpath);
-
-
-
-
- }
-*/
-
-
-}
-#endif // __APPLE_CC__
-
-
-static const TCHAR *kMainDll = TEXT("7z.dll");
-
-static CSysString ConvertUInt32ToString(UInt32 value)
-{
- TCHAR buffer[32];
- ConvertUInt32ToString(value, buffer);
- return buffer;
-}
-
-
-void test_csystring(void)
-{
- {
- const CSysString baseFolder = TEXT("bin/");
- const CSysString b2 = baseFolder + kMainDll;
-
- assert(MyStringCompare(&b2[0],TEXT("bin/7z.dll")) == 0);
- }
-
- {
- LPCTSTR dirPath=TEXT("/tmp/");
- LPCTSTR prefix=TEXT("foo");
- CSysString resultPath;
-
- UINT number = 12345;
- UInt32 count = 6789;
-
-/*
- TCHAR * buf = resultPath.GetBuffer(MAX_PATH);
- ::swprintf(buf,MAX_PATH,L"%ls%ls#%d@%d.tmp",dirPath,prefix,(unsigned)number,count);
- buf[MAX_PATH-1]=0;
- resultPath.ReleaseBuffer();
-*/
- resultPath = dirPath;
- resultPath += prefix;
- resultPath += TEXT('#');
- resultPath += ConvertUInt32ToString(number);
- resultPath += TEXT('@');
- resultPath += ConvertUInt32ToString(count);
- resultPath += TEXT(".tmp");
-
- // printf("##%ls##\n",&resultPath[0]);
-
- assert(MyStringCompare(&resultPath[0],TEXT("/tmp/foo#12345@6789.tmp")) == 0);
- }
-
-}
-
-static void test_AString()
-{
- AString a;
-
- a = "abc";
- assert(MyStringCompare(&a[0],"abc") == 0);
- assert(a.Length() == 3);
-
- a = GetAnsiString(L"abc");
- assert(MyStringCompare(&a[0],"abc") == 0);
- assert(a.Length() == 3);
-}
-
-
-const TCHAR kAnyStringWildcard = '*';
-
-static void test_UString2(const UString &phyPrefix)
-{
- UString tmp = phyPrefix + wchar_t(kAnyStringWildcard);
- printf("Enum(%ls-%ls-%lc)\n",&tmp[0],&phyPrefix[0],wchar_t(kAnyStringWildcard));
-}
-
-
-
-static void test_UString()
-{
- UString us = L"7za433_tar";
-
- test_UString2(L"7za433_tar");
-
- UString u1(us);
- test_UString2(u1);
- u1 = L"";
- test_UString2(u1);
- u1 = us;
- test_UString2(u1);
-
- UString u2 = us;
- test_UString2(u2);
- u2 = L"";
- test_UString2(u2);
- u2 = u1;
- test_UString2(u2);
-
- u1 = L"abc";
- assert(MyStringCompare(&u1[0],L"abc") == 0);
- assert(u1.Length() == 3);
-
- u1 = GetUnicodeString("abc");
- assert(MyStringCompare(&u1[0],L"abc") == 0);
- assert(u1.Length() == 3);
-}
-
-/****************************************************************************************/
-int main() {
-
- // return test_thread();
-
-
-#ifdef ENV_HAVE_LOCALE
- setlocale(LC_ALL,"");
-#endif
-
-#if defined(BIG_ENDIAN)
- printf("BIG_ENDIAN : %d\n",(int)BIG_ENDIAN);
-#endif
-#if defined(LITTLE_ENDIAN)
- printf("LITTLE_ENDIAN : %d\n",(int)LITTLE_ENDIAN);
-#endif
-
- printf("sizeof(Byte) : %d\n",(int)sizeof(Byte));
- printf("sizeof(UInt16) : %d\n",(int)sizeof(UInt16));
- printf("sizeof(UInt32) : %d\n",(int)sizeof(UInt32));
- printf("sizeof(UINT32) : %d\n",(int)sizeof(UINT32));
- printf("sizeof(UInt64) : %d\n",(int)sizeof(UInt64));
- printf("sizeof(UINT64) : %d\n",(int)sizeof(UINT64));
- printf("sizeof(void *) : %d\n",(int)sizeof(void *));
- printf("sizeof(size_t) : %d\n",(int)sizeof(size_t));
- printf("sizeof(ptrdiff_t) : %d\n",(int)sizeof(ptrdiff_t));
- printf("sizeof(off_t) : %d\n",(int)sizeof(off_t));
- printf("sizeof(wchar_t) : %d\n",(int)sizeof(wchar_t));
-#ifdef __APPLE_CC__
- printf("sizeof(UniChar) : %d\n",(int)sizeof(UniChar));
-#endif
- printf("sizeof(CPpmd_See) : %d\n",(int)sizeof(CPpmd_See));
- printf("sizeof(CPpmd_State) : %d\n",(int)sizeof(CPpmd_State));
-
- // size tests
- assert(sizeof(Byte)==1);
- assert(sizeof(UInt16)==2);
- assert(sizeof(UInt32)==4);
- assert(sizeof(UINT32)==4);
- assert(sizeof(UInt64)==8);
- assert(sizeof(UINT64)==8);
-
- // alignement tests
- assert(sizeof(CPpmd_See)==4);
- assert(sizeof(CPpmd_State)==6);
-
- union {
- Byte b[2];
- UInt16 s;
- } u;
- u.s = 0x1234;
-
- if ((u.b[0] == 0x12) && (u.b[1] == 0x34)) {
- printf("CPU : big endian\n");
- } else if ((u.b[0] == 0x34) && (u.b[1] == 0x12)) {
- printf("CPU : little endian\n");
- } else {
- printf("CPU : unknown endianess\n");
- }
-
-#if defined(ENV_HAVE_WCHAR__H) && defined(ENV_HAVE_MBSTOWCS) && defined(ENV_HAVE_WCSTOMBS)
- test_mbs();
-#endif
-
- test_astring(12345);
- test_split_astring();
-
- test_csystring();
- test_AString();
- test_UString();
-
- test_time();
-
- test_time2();
-
- test_semaphore();
-
-#ifdef __APPLE_CC__
- testMacOSX();
- testMaxOSX_stringConvert();
-#endif
-
-
-{
- LANGID langID;
- WORD primLang;
- WORD subLang;
-
- langID = GetUserDefaultLangID();
- printf("langID=0x%x\n",langID);
-
- primLang = (WORD)(PRIMARYLANGID(langID));
- subLang = (WORD)(SUBLANGID(langID));
-
- printf("primLang=%d subLang=%d\n",(unsigned)primLang,(unsigned)subLang);
-}
-
- printf("\n### All Done ###\n\n");
-
- return 0;
-}
-
diff --git a/src/libs/7zip/unix/CPP/myWindows/wine_GetXXXDefaultLangID.cpp b/src/libs/7zip/unix/CPP/myWindows/wine_GetXXXDefaultLangID.cpp
deleted file mode 100644
index 918c4372c..000000000
--- a/src/libs/7zip/unix/CPP/myWindows/wine_GetXXXDefaultLangID.cpp
+++ /dev/null
@@ -1,741 +0,0 @@
-
-#include "StdAfx.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <locale.h>
-#include <wchar.h>
-#include <ctype.h>
-#include <string.h>
-
-#ifdef __APPLE__
-#define UInt32 mac_UInt32
-#include <CoreFoundation/CoreFoundation.h>
-#undef UInt32
-#endif // __APPLE__
-
-
-// #define TRACE printf
-
-typedef DWORD LCID;
-typedef void * ULONG_PTR; /* typedef unsigned long ULONG_PTR; */
-
-#define SORT_DEFAULT 0x0
-
-#define LANG_NEUTRAL 0x00
-#define LANG_ENGLISH 0x09
-
-#define SUBLANG_DEFAULT 0x01 /* user default */
-
-#define MAKELCID(l, s) ( (l & 0xFFFF) | ((s & 0xFFFF)<<16))
-#define MAKELANGID(p, s) ((((WORD)(s))<<10) | (WORD)(p))
-
-#define LANGIDFROMLCID(lcid) ((WORD)(lcid))
-
-static LCID lcid_LC_MESSAGES = 0;
-static LCID lcid_LC_CTYPE = 0;
-
-struct locale_name
-{
- WCHAR win_name[128]; /* Windows name ("en-US") */
- WCHAR lang[128]; /* language ("en") (note: buffer contains the other strings too) */
- WCHAR *country; /* country ("US") */
- WCHAR *charset; /* charset ("UTF-8") for Unix format only */
- WCHAR *script; /* script ("Latn") for Windows format only */
- WCHAR *modifier; /* modifier or sort order */
- LCID lcid; /* corresponding LCID */
- int matches; /* number of elements matching LCID (0..4) */
- UINT codepage; /* codepage corresponding to charset */
-};
-#define WINE_UNICODE_INLINE static
-
-/***********************************************************/
-typedef struct {
- const WCHAR * LOCALE_SNAME;
- const WCHAR * LOCALE_SISO639LANGNAME;
- const WCHAR * LOCALE_SISO3166CTRYNAME;
- unsigned int LOCALE_IDEFAULTUNIXCODEPAGE;
- unsigned int LOCALE_ILANGUAGE;
-} t_info;
-
-static t_info g_langInfo[] = {
- { L"af-ZA" , L"af" , L"ZA" , 28591 , 0x0436 }, /* afk.nls */
- { L"ar-SA" , L"ar" , L"SA" , 28596 , 0x0401 }, /* ara.nls */
- { L"ar-LB" , L"ar" , L"LB" , 28596 , 0x3001 }, /* arb.nls */
- { L"ar-EG" , L"ar" , L"EG" , 28596 , 0x0c01 }, /* are.nls */
- { L"ar-DZ" , L"ar" , L"DZ" , 28596 , 0x1401 }, /* arg.nls */
- { L"ar-BH" , L"ar" , L"BH" , 28596 , 0x3c01 }, /* arh.nls */
- { L"ar-IQ" , L"ar" , L"IQ" , 28596 , 0x0801 }, /* ari.nls */
- { L"ar-JO" , L"ar" , L"JO" , 28596 , 0x2c01 }, /* arj.nls */
- { L"ar-KW" , L"ar" , L"KW" , 28596 , 0x3401 }, /* ark.nls */
- { L"ar-LY" , L"ar" , L"LY" , 28596 , 0x1001 }, /* arl.nls */
- { L"ar-MA" , L"ar" , L"MA" , 28596 , 0x1801 }, /* arm.nls */
- { L"ar-OM" , L"ar" , L"OM" , 28596 , 0x2001 }, /* aro.nls */
- { L"ar-QA" , L"ar" , L"QA" , 28596 , 0x4001 }, /* arq.nls */
- { L"ar-SY" , L"ar" , L"SY" , 28596 , 0x2801 }, /* ars.nls */
- { L"ar-TN" , L"ar" , L"TN" , 28596 , 0x1c01 }, /* art.nls */
- { L"ar-AE" , L"ar" , L"AE" , 28596 , 0x3801 }, /* aru.nls */
- { L"ar-YE" , L"ar" , L"YE" , 28596 , 0x2401 }, /* ary.nls */
- { L"az-AZ" , L"az" , L"AZ" , 28595 , 0x082c }, /* aze.nls */
- { L"az-Latn-AZ" , L"az" , L"AZ" , 28599 , 0x042c }, /* azl.nls */
- { L"be-BY" , L"be" , L"BY" , 1251 , 0x0423 }, /* bel.nls */
- { L"bg-BG" , L"bg" , L"BG" , 1251 , 0x0402 }, /* bgr.nls */
- { L"br-FR" , L"br" , L"FR" , 28605 , 0x0493 }, /* brf.nls */
- { L"ca-ES" , L"ca" , L"ES" , 28605 , 0x0403 }, /* cat.nls */
- { L"zh-CN" , L"zh" , L"CN" , 936 , 0x0804 }, /* chs.nls */
- { L"zh-TW" , L"zh" , L"TW" , 950 , 0x0404 }, /* cht.nls */
- { L"kw-GB" , L"kw" , L"GB" , 28605 , 0x04891 }, /* cor.nls */
- { L"cs-CZ" , L"cs" , L"CZ" , 28592 , 0x0405 }, /* csy.nls */
- { L"cy-GB" , L"cy" , L"GB" , 28604 , 0x0492 }, /* cym.nls */
- { L"da-DK" , L"da" , L"DK" , 28605 , 0x0406 }, /* dan.nls */
- { L"de-AT" , L"de" , L"AT" , 28605 , 0x0c07 }, /* dea.nls */
- { L"de-LI" , L"de" , L"LI" , 28605 , 0x1407 }, /* dec.nls */
- { L"de-LU" , L"de" , L"LU" , 28605 , 0x1007 }, /* del.nls */
- { L"de-CH" , L"de" , L"CH" , 28605 , 0x0807 }, /* des.nls */
- { L"de-DE" , L"de" , L"DE" , 28605 , 0x0407 }, /* deu.nls */
- { L"dv-MV" , L"dv" , L"MV" , 65001 , 0x0465 }, /* div.nls */
- { L"el-GR" , L"el" , L"GR" , 28597 , 0x0408 }, /* ell.nls */
- { L"en-AU" , L"en" , L"AU" , 28591 , 0x0c09 }, /* ena.nls */
- { L"en-CB" , L"en" , L"CB" , 28591 , 0x2409 }, /* enb.nls */
- { L"en-CA" , L"en" , L"CA" , 28591 , 0x1009 }, /* enc.nls */
- { L"en-GB" , L"en" , L"GB" , 28605 , 0x0809 }, /* eng.nls */
- { L"en-IE" , L"en" , L"IE" , 28605 , 0x1809 }, /* eni.nls */
- { L"en-JM" , L"en" , L"JM" , 28591 , 0x2009 }, /* enj.nls */
- { L"en-BZ" , L"en" , L"BZ" , 28591 , 0x2809 }, /* enl.nls */
- { L"en-PH" , L"en" , L"PH" , 28591 , 0x3409 }, /* enp.nls */
- { L"en-ZA" , L"en" , L"ZA" , 28591 , 0x1c09 }, /* ens.nls */
- { L"en-TT" , L"en" , L"TT" , 28591 , 0x2c09 }, /* ent.nls */
- { L"en-US" , L"en" , L"US" , 28591 , 0x0409 }, /* enu.nls */
- { L"en-ZW" , L"en" , L"ZW" , 28591 , 0x3009 }, /* enw.nls */
- { L"en-NZ" , L"en" , L"NZ" , 28591 , 0x1409 }, /* enz.nls */
- { L"eo" , L"eo" , L"" , 65001 , 0x048f }, /* eox.nls */
- { L"es-PA" , L"es" , L"PA" , 28591 , 0x180a }, /* esa.nls */
- { L"es-BO" , L"es" , L"BO" , 28591 , 0x400a }, /* esb.nls */
- { L"es-CR" , L"es" , L"CR" , 28591 , 0x140a }, /* esc.nls */
- { L"es-DO" , L"es" , L"DO" , 28591 , 0x1c0a }, /* esd.nls */
- { L"es-SV" , L"es" , L"SV" , 28591 , 0x440a }, /* ese.nls */
- { L"es-EC" , L"es" , L"EC" , 28591 , 0x300a }, /* esf.nls */
- { L"es-GT" , L"es" , L"GT" , 28591 , 0x100a }, /* esg.nls */
- { L"es-HN" , L"es" , L"HN" , 28591 , 0x480a }, /* esh.nls */
- { L"es-NI" , L"es" , L"NI" , 28591 , 0x4c0a }, /* esi.nls */
- { L"es-C" , L"es" , L"C" , 28591 , 0x340a }, /* esl.nls */
- { L"es-MX" , L"es" , L"MX" , 28591 , 0x080a }, /* esm.nls */
- { L"es-ES_modern" , L"es" , L"ES" , 28605 , 0x0c0a }, /* esn.nls */
- { L"es-CO" , L"es" , L"CO" , 28591 , 0x240a }, /* eso.nls */
- { L"es-ES" , L"es" , L"ES" , 28605 , 0x040a }, /* esp.nls */
- { L"es-PE" , L"es" , L"PE" , 28591 , 0x280a }, /* esr.nls */
- { L"es-AR" , L"es" , L"AR" , 28591 , 0x2c0a }, /* ess.nls */
- { L"es-PR" , L"es" , L"PR" , 28591 , 0x500a }, /* esu.nls */
- { L"es-VE" , L"es" , L"VE" , 28591 , 0x200a }, /* esv.nls */
- { L"es-UY" , L"es" , L"UY" , 28591 , 0x380a }, /* esy.nls */
- { L"es-PY" , L"es" , L"PY" , 28591 , 0x3c0a }, /* esz.nls */
- { L"et-EE" , L"et" , L"EE" , 28605 , 0x0425 }, /* eti.nls */
- { L"eu-ES" , L"eu" , L"ES" , 28605 , 0x042d }, /* euq.nls */
- { L"fa-IR" , L"fa" , L"IR" , 65001 , 0x0429 }, /* far.nls */
- { L"fi-FI" , L"fi" , L"FI" , 28605 , 0x040b }, /* fin.nls */
- { L"fo-FO" , L"fo" , L"FO" , 28605 , 0x0438 }, /* fos.nls */
- { L"fr-FR" , L"fr" , L"FR" , 28605 , 0x040c }, /* fra.nls */
- { L"fr-BE" , L"fr" , L"BE" , 28605 , 0x080c }, /* frb.nls */
- { L"fr-CA" , L"fr" , L"CA" , 28591 , 0x0c0c }, /* frc.nls */
- { L"fr-LU" , L"fr" , L"LU" , 28605 , 0x140c }, /* frl.nls */
- { L"fr-MC" , L"fr" , L"MC" , 28605 , 0x180c }, /* frm.nls */
- { L"fr-CH" , L"fr" , L"CH" , 28605 , 0x100c }, /* frs.nls */
- { L"ga-IE" , L"ga" , L"IE" , 28605 , 0x043c }, /* gae.nls */
- { L"gd-GB" , L"gd" , L"GB" , 28605 , 0x083c }, /* gdh.nls */
- { L"gv-GB" , L"gv" , L"GB" , 28605 , 0x0c3c }, /* gdv.nls */
- { L"gl-ES" , L"gl" , L"ES" , 28605 , 0x0456 }, /* glc.nls */
- { L"gu-IN" , L"gu" , L"IN" , 65001 , 0x0447 }, /* guj.nls */
- { L"he-I" , L"he" , L"I" , 28598 , 0x040d }, /* heb.nls */
- { L"hi-IN" , L"hi" , L"IN" , 65001 , 0x0439 }, /* hin.nls */
- { L"hr-HR" , L"hr" , L"HR" , 28592 , 0x041a }, /* hrv.nls */
- { L"hu-HU" , L"hu" , L"HU" , 28592 , 0x040e }, /* hun.nls */
- { L"hy-AM" , L"hy" , L"AM" , 65001 , 0x042b }, /* hye.nls */
- { L"id-ID" , L"id" , L"ID" , 28591 , 0x0421 }, /* ind.nls */
- { L"is-IS" , L"is" , L"IS" , 28605 , 0x040f }, /* isl.nls */
- { L"it-IT" , L"it" , L"IT" , 28605 , 0x0410 }, /* ita.nls */
- { L"it-CH" , L"it" , L"CH" , 28605 , 0x0810 }, /* its.nls */
- { L"ja-JP" , L"ja" , L"JP" , 20932 , 0x0411 }, /* jpn.nls */
- { L"kn-IN" , L"kn" , L"IN" , 65001 , 0x044b }, /* kan.nls */
- { L"ka-GE" , L"ka" , L"GE" , 65001 , 0x0437 }, /* kat.nls */
- { L"kk-KZ" , L"kk" , L"KZ" , 28595 , 0x043f }, /* kkz.nls */
- { L"kok-IN" , L"kok" , L"IN" , 65001 , 0x0457 }, /* knk.nls */
- { L"ko-KR" , L"ko" , L"KR" , 949 , 0x0412 }, /* kor.nls */
- { L"ky-KG" , L"ky" , L"KG" , 28595 , 0x0440 }, /* kyr.nls */
- { L"lt-LT" , L"lt" , L"LT" , 28603 , 0x0427 }, /* lth.nls */
- { L"lv-LV" , L"lv" , L"LV" , 28603 , 0x0426 }, /* lvi.nls */
- { L"mr-IN" , L"mr" , L"IN" , 65001 , 0x044e }, /* mar.nls */
- { L"mk-MK" , L"mk" , L"MK" , 28595 , 0x042f }, /* mki.nls */
- { L"mn-MN" , L"mn" , L"MN" , 28595 , 0x0450 }, /* mon.nls */
- { L"ms-BN" , L"ms" , L"BN" , 28591 , 0x083e }, /* msb.nls */
- { L"ms-MY" , L"ms" , L"MY" , 28591 , 0x043e }, /* msl.nls */
- { L"nl-BE" , L"nl" , L"BE" , 28605 , 0x0813 }, /* nlb.nls */
- { L"nl-N" , L"nl" , L"N" , 28605 , 0x0413 }, /* nld.nls */
- { L"nl-SR" , L"nl" , L"SR" , 28605 , 0x0c13 }, /* nls.nls */
- { L"nn-NO" , L"nn" , L"NO" , 28605 , 0x0814 }, /* non.nls */
- { L"nb-NO" , L"nb" , L"NO" , 28605 , 0x0414 }, /* nor.nls */
- { L"pa-IN" , L"pa" , L"IN" , 65001 , 0x0446 }, /* pan.nls */
- { L"pl-P" , L"pl" , L"P" , 28592 , 0x0415 }, /* plk.nls */
- { L"pt-BR" , L"pt" , L"BR" , 28591 , 0x0416 }, /* ptb.nls */
- { L"pt-PT" , L"pt" , L"PT" , 28605 , 0x0816 }, /* ptg.nls */
- { L"rm-CH" , L"rm" , L"CH" , 28605 , 0x0417 }, /* rmc.nls */
- { L"ro-RO" , L"ro" , L"RO" , 28592 , 0x0418 }, /* rom.nls */
- { L"ru-RU" , L"ru" , L"RU" , 20866 , 0x0419 }, /* rus.nls */
- { L"sa-IN" , L"sa" , L"IN" , 65001 , 0x044f }, /* san.nls */
- { L"sk-SK" , L"sk" , L"SK" , 28592 , 0x041b }, /* sky.nls */
- { L"sl-SI" , L"sl" , L"SI" , 28592 , 0x0424 }, /* slv.nls */
- { L"sq-A" , L"sq" , L"A" , 28592 , 0x041c }, /* sqi.nls */
- { L"sr-SP" , L"sr" , L"SP" , 28595 , 0x0c1a }, /* srb.nls */
- { L"sr-Latn-SP" , L"sr" , L"SP" , 28592 , 0x081a }, /* srl.nls */
- { L"sv-SE" , L"sv" , L"SE" , 28605 , 0x041d }, /* sve.nls */
- { L"sv-FI" , L"sv" , L"FI" , 28605 , 0x081d }, /* svf.nls */
- { L"sw-KE" , L"sw" , L"KE" , 28591 , 0x0441 }, /* swk.nls */
- { L"syr-SY" , L"syr" , L"SY" , 65001 , 0x045a }, /* syr.nls */
- { L"ta-IN" , L"ta" , L"IN" , 65001 , 0x0449 }, /* tam.nls */
- { L"te-IN" , L"te" , L"IN" , 65001 , 0x044a }, /* tel.nls */
- { L"th-TH" , L"th" , L"TH" , 874 , 0x041e }, /* tha.nls */
- { L"tr-TR" , L"tr" , L"TR" , 28599 , 0x041f }, /* trk.nls */
- { L"tt-TA" , L"tt" , L"TA" , 28595 , 0x0444 }, /* ttt.nls */
- { L"uk-UA" , L"uk" , L"UA" , 21866 , 0x0422 }, /* ukr.nls */
- { L"ur-PK" , L"ur" , L"PK" , 1256 , 0x0420 }, /* urd.nls */
- { L"uz-UZ" , L"uz" , L"UZ" , 28595 , 0x0843 }, /* uzb.nls */
- { L"uz-Latn-UZ" , L"uz" , L"UZ" , 28605 , 0x0443 }, /* uzl.nls */
- { L"vi-VN" , L"vi" , L"VN" , 1258 , 0x042a }, /* vit.nls */
- { L"wa-BE" , L"wa" , L"BE" , 28605 , 0x0490 }, /* wal.nls */
- { L"zh-HK" , L"zh" , L"HK" , 950 , 0x0c04 }, /* zhh.nls */
- { L"zh-SG" , L"zh" , L"SG" , 936 , 0x1004 }, /* zhi.nls */
- { L"zh-MO" , L"zh" , L"MO" , 950 , 0x1404 }, /* zhm.nls */
- { 0 , 0 , 0 , 0, 0 }
-};
-
-/***********************************************************/
-WINE_UNICODE_INLINE WCHAR *strchrW( const WCHAR *str, WCHAR ch )
-{
- do { if (*str == ch) return (WCHAR *)(ULONG_PTR)str; } while (*str++);
- return NULL;
-}
-
-WINE_UNICODE_INLINE WCHAR *strpbrkW( const WCHAR *str, const WCHAR *accept )
-{
- for ( ; *str; str++) if (strchrW( accept, *str )) return (WCHAR *)(ULONG_PTR)str;
- return NULL;
-}
-
-
-/***********************************************************/
-
-WINE_UNICODE_INLINE unsigned int strlenW( const WCHAR *str )
-{
- const WCHAR *s = str;
- while (*s) s++;
- return s - str;
-}
-
-WINE_UNICODE_INLINE WCHAR *strcpyW( WCHAR *dst, const WCHAR *src )
-{
- WCHAR *p = dst;
- while ((*p++ = *src++));
- return dst;
-}
-
-WINE_UNICODE_INLINE WCHAR *strcatW( WCHAR *dst, const WCHAR *src )
-{
- strcpyW( dst + strlenW(dst), src );
- return dst;
-}
-
-WINE_UNICODE_INLINE int strcmpW( const WCHAR *str1, const WCHAR *str2 )
-{
- while (*str1 && (*str1 == *str2)) { str1++; str2++; }
- return *str1 - *str2;
-}
-
-
-WINE_UNICODE_INLINE LPWSTR lstrcpynW( LPWSTR dst, LPCWSTR src, int n )
-{
- {
- LPWSTR d = dst;
- LPCWSTR s = src;
- UINT count = n;
-
- while ((count > 1) && *s)
- {
- count--;
- *d++ = *s++;
- }
- if (count) *d = 0;
- }
- return dst;
-}
-
-/* Copy Ascii string to Unicode without using codepages */
-static inline void strcpynAtoW( WCHAR *dst, const char *src, size_t n )
-{
- while (n > 1 && *src)
- {
- *dst++ = (unsigned char)*src++;
- n--;
- }
- if (n) *dst = 0;
-}
-
-/*******************************************************/
-
-/* Charset to codepage map, sorted by name. */
-static const struct charset_entry
-{
- const char *charset_name;
- UINT codepage;
-} charset_names[] =
-{
- { "BIG5", 950 },
- { "CP1250", 1250 },
- { "CP1251", 1251 },
- { "CP1252", 1252 },
- { "CP1253", 1253 },
- { "CP1254", 1254 },
- { "CP1255", 1255 },
- { "CP1256", 1256 },
- { "CP1257", 1257 },
- { "CP1258", 1258 },
- { "CP932", 932 },
- { "CP936", 936 },
- { "CP949", 949 },
- { "CP950", 950 },
- { "EUCJP", 20932 },
- { "GB2312", 936 },
- { "IBM037", 37 },
- { "IBM1026", 1026 },
- { "IBM424", 424 },
- { "IBM437", 437 },
- { "IBM500", 500 },
- { "IBM850", 850 },
- { "IBM852", 852 },
- { "IBM855", 855 },
- { "IBM857", 857 },
- { "IBM860", 860 },
- { "IBM861", 861 },
- { "IBM862", 862 },
- { "IBM863", 863 },
- { "IBM864", 864 },
- { "IBM865", 865 },
- { "IBM866", 866 },
- { "IBM869", 869 },
- { "IBM874", 874 },
- { "IBM875", 875 },
- { "ISO88591", 28591 },
- { "ISO885910", 28600 },
- { "ISO885913", 28603 },
- { "ISO885914", 28604 },
- { "ISO885915", 28605 },
- { "ISO885916", 28606 },
- { "ISO88592", 28592 },
- { "ISO88593", 28593 },
- { "ISO88594", 28594 },
- { "ISO88595", 28595 },
- { "ISO88596", 28596 },
- { "ISO88597", 28597 },
- { "ISO88598", 28598 },
- { "ISO88599", 28599 },
- { "KOI8R", 20866 },
- { "KOI8U", 21866 },
- { "UTF8", CP_UTF8 }
-};
-
-static int charset_cmp( const void *name, const void *entry )
-{
- const struct charset_entry *charset = (const struct charset_entry *)entry;
- return strcasecmp( (const char *)name, charset->charset_name );
-}
-
-static UINT find_charset( const WCHAR *name )
-{
- const struct charset_entry *entry;
- char charset_name[16];
- size_t i, j;
-
- /* remove punctuation characters from charset name */
- for (i = j = 0; name[i] && j < sizeof(charset_name)-1; i++)
- if (isalnum((unsigned char)name[i])) charset_name[j++] = name[i];
- charset_name[j] = 0;
-
- entry = (const struct charset_entry *)bsearch( charset_name, charset_names,
- sizeof(charset_names)/sizeof(charset_names[0]),
- sizeof(charset_names[0]), charset_cmp );
- if (entry) return entry->codepage;
-
- return 0;
-}
-/*******************************************************/
-
-static BOOL find_locale_id_callback(/* LPCWSTR name, ? */ const t_info * tab, struct locale_name *data)
-{
- // WCHAR buffer[128];
- int matches = 0;
- WORD LangID = tab->LOCALE_ILANGUAGE & 0xFFFF; /* FIXME */
- LCID lcid = MAKELCID( LangID, SORT_DEFAULT ); /* FIXME: handle sort order */
-
- if (PRIMARYLANGID(LangID) == LANG_NEUTRAL) return TRUE; /* continue search */
-
- /* first check exact name */
- if (data->win_name[0] && tab->LOCALE_SNAME[0])
- /* GetLocaleInfoW( lcid, LOCALE_SNAME | LOCALE_NOUSEROVERRIDE,
- buffer, sizeof(buffer)/sizeof(WCHAR) )) */
- {
- if (!strcmpW( data->win_name, tab->LOCALE_SNAME ))
- {
- matches = 4; /* everything matches */
- goto done;
- }
- }
-
- /*if (!GetLocaleInfoW( lcid, LOCALE_SISO639LANGNAME | LOCALE_NOUSEROVERRIDE,
- buffer, sizeof(buffer)/sizeof(WCHAR) )) */
- if (tab->LOCALE_SISO639LANGNAME[0] == 0)
- return TRUE;
-
- if (strcmpW( tab->LOCALE_SISO639LANGNAME , data->lang )) return TRUE;
- matches++; /* language name matched */
-
- if (data->country)
- {
- /* if (GetLocaleInfoW( lcid, LOCALE_SISO3166CTRYNAME|LOCALE_NOUSEROVERRIDE,
- buffer, sizeof(buffer)/sizeof(WCHAR) )) */
- if (tab->LOCALE_SISO3166CTRYNAME[0])
- {
- if (strcmpW(tab->LOCALE_SISO3166CTRYNAME , data->country )) goto done;
- matches++; /* country name matched */
- }
- }
- else /* match default language */
- {
- if (SUBLANGID(LangID) == SUBLANG_DEFAULT) matches++;
- }
-
- if (data->codepage)
- {
- UINT unix_cp;
- /* if (GetLocaleInfoW( lcid, LOCALE_IDEFAULTUNIXCODEPAGE | LOCALE_RETURN_NUMBER,
- (LPWSTR)&unix_cp, sizeof(unix_cp)/sizeof(WCHAR) )) */
- unix_cp = tab->LOCALE_IDEFAULTUNIXCODEPAGE;
- {
- if (unix_cp == data->codepage) matches++;
- }
- }
-
- /* FIXME: check sort order */
-
-done:
- if (matches > data->matches)
- {
- data->lcid = lcid;
- data->matches = matches;
- }
- return (data->matches < 4); /* no need to continue for perfect match */
-}
-
-
-/***********************************************************************
- * parse_locale_name
- *
- * Parse a locale name into a struct locale_name, handling both Windows and Unix formats.
- * Unix format is: lang[_country][.charset][@modifier]
- * Windows format is: lang[-script][-country][_modifier]
- */
-static void parse_locale_name( const WCHAR *str, struct locale_name *name )
-{
- static const WCHAR sepW[] = {'-','_','.','@',0};
- static const WCHAR winsepW[] = {'-','_',0};
- static const WCHAR posixW[] = {'P','O','S','I','X',0};
- static const WCHAR cW[] = {'C',0};
- static const WCHAR latinW[] = {'l','a','t','i','n',0};
- static const WCHAR latnW[] = {'-','L','a','t','n',0};
- WCHAR *p;
- int ind;
-
- // TRACE("%s\n", debugstr_w(str));
-
- name->country = name->charset = name->script = name->modifier = NULL;
- name->lcid = MAKELCID( MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT), SORT_DEFAULT );
- name->matches = 0;
- name->codepage = 0;
- name->win_name[0] = 0;
- lstrcpynW( name->lang, str, sizeof(name->lang)/sizeof(WCHAR) );
-
- if (!(p = strpbrkW( name->lang, sepW )))
- {
- if (!strcmpW( name->lang, posixW ) || !strcmpW( name->lang, cW ))
- {
- name->matches = 4; /* perfect match for default English lcid */
- return;
- }
- strcpyW( name->win_name, name->lang );
- }
- else if (*p == '-') /* Windows format */
- {
- strcpyW( name->win_name, name->lang );
- *p++ = 0;
- name->country = p;
- if (!(p = strpbrkW( p, winsepW ))) goto done;
- if (*p == '-')
- {
- *p++ = 0;
- name->script = name->country;
- name->country = p;
- if (!(p = strpbrkW( p, winsepW ))) goto done;
- }
- *p++ = 0;
- name->modifier = p;
- }
- else /* Unix format */
- {
- if (*p == '_')
- {
- *p++ = 0;
- name->country = p;
- p = strpbrkW( p, sepW + 2 );
- }
- if (p && *p == '.')
- {
- *p++ = 0;
- name->charset = p;
- p = strchrW( p, '@' );
- }
- if (p)
- {
- *p++ = 0;
- name->modifier = p;
- }
-
- if (name->charset)
- name->codepage = find_charset( name->charset );
-
- /* rebuild a Windows name if possible */
-
- if (name->charset) goto done; /* can't specify charset in Windows format */
- if (name->modifier && strcmpW( name->modifier, latinW ))
- goto done; /* only Latn script supported for now */
- strcpyW( name->win_name, name->lang );
- if (name->modifier) strcatW( name->win_name, latnW );
- if (name->country)
- {
- p = name->win_name + strlenW(name->win_name);
- *p++ = '-';
- strcpyW( p, name->country );
- }
- }
-done:
- ;
-
-/* DEBUG
- printf("EnumResourceLanguagesW(...):\n");
- printf(" name->win_name=%ls\n", name->win_name);
- printf(" name->lang=%ls\n", name->lang);
- printf(" name->country=%ls\n", name->country);
- printf(" name->codepage=%d\n", name->codepage);
-*/
-// EnumResourceLanguagesW( kernel32_handle, (LPCWSTR)RT_STRING, (LPCWSTR)LOCALE_ILANGUAGE,
-// find_locale_id_callback, (LPARAM)name );
-
- ind = 0;
- while (g_langInfo[ind].LOCALE_SNAME)
- {
- BOOL ret = find_locale_id_callback(&g_langInfo[ind],name);
- if (ret == FALSE)
- break;
-
- ind++;
- }
-}
-
-
-
-
-/********************************/
-
-static UINT setup_unix_locales(void)
-{
- struct locale_name locale_name;
- // WCHAR buffer[128];
- WCHAR ctype_buff[128];
- char *locale;
- UINT unix_cp = 0;
-
- if ((locale = setlocale( LC_CTYPE, NULL )))
- {
- strcpynAtoW( ctype_buff, locale, sizeof(ctype_buff)/sizeof(WCHAR) );
- parse_locale_name( ctype_buff, &locale_name );
- lcid_LC_CTYPE = locale_name.lcid;
- unix_cp = locale_name.codepage;
- }
- if (!lcid_LC_CTYPE) /* this one needs a default value */
- lcid_LC_CTYPE = MAKELCID( MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT), SORT_DEFAULT );
-
-#if 0
- TRACE( "got lcid %04x (%d matches) for LC_CTYPE=%s\n",
- locale_name.lcid, locale_name.matches, debugstr_a(locale) );
-
-#define GET_UNIX_LOCALE(cat) do \
- if ((locale = setlocale( cat, NULL ))) \
- { \
- strcpynAtoW( buffer, locale, sizeof(buffer)/sizeof(WCHAR) ); \
- if (!strcmpW( buffer, ctype_buff )) lcid_##cat = lcid_LC_CTYPE; \
- else { \
- parse_locale_name( buffer, &locale_name ); \
- lcid_##cat = locale_name.lcid; \
- TRACE( "got lcid %04x (%d matches) for " #cat "=%s\n", \
- locale_name.lcid, locale_name.matches, debugstr_a(locale) ); \
- } \
- } while (0)
-
- GET_UNIX_LOCALE( LC_COLLATE );
- GET_UNIX_LOCALE( LC_MESSAGES );
- GET_UNIX_LOCALE( LC_MONETARY );
- GET_UNIX_LOCALE( LC_NUMERIC );
- GET_UNIX_LOCALE( LC_TIME );
-#ifdef LC_PAPER
- GET_UNIX_LOCALE( LC_PAPER );
-#endif
-#ifdef LC_MEASUREMENT
- GET_UNIX_LOCALE( LC_MEASUREMENT );
-#endif
-#ifdef LC_TELEPHONE
- GET_UNIX_LOCALE( LC_TELEPHONE );
-#endif
-
-#undef GET_UNIX_LOCALE
-
-#endif // #if 0
-
- return unix_cp;
-}
-
-/********************************/
-
-static void LOCALE_Init(void)
-{
- /*
- extern void __wine_init_codepages( const union cptable *ansi_cp, const union cptable *oem_cp,
- const union cptable *unix_cp );
- */
-
- // UINT ansi_cp = 1252, oem_cp = 437, mac_cp = 10000, unix_cp;
- UINT unix_cp = 0;
-
-#ifdef __APPLE__
- /* MacOS doesn't set the locale environment variables so we have to do it ourselves */
- CFArrayRef preferred_locales, all_locales;
- CFStringRef user_language_string_ref = NULL;
- char user_locale[50];
-
- CFLocaleRef user_locale_ref = CFLocaleCopyCurrent();
- CFStringRef user_locale_string_ref = CFLocaleGetIdentifier( user_locale_ref );
-
- CFStringGetCString( user_locale_string_ref, user_locale, sizeof(user_locale), kCFStringEncodingUTF8 );
- CFRelease( user_locale_ref );
- if (!strchr( user_locale, '.' )) strcat( user_locale, ".UTF-8" );
- unix_cp = CP_UTF8; /* default to utf-8 even if we don't get a valid locale */
- setenv( "LANG", user_locale, 0 );
- // TRACE( "setting locale to '%s'\n", user_locale );
-
- /* We still want to set the retrieve the preferred language as chosen in
- System Preferences.app, because it can differ from CFLocaleCopyCurrent().
- */
- all_locales = CFLocaleCopyAvailableLocaleIdentifiers();
- preferred_locales = CFBundleCopyLocalizationsForPreferences( all_locales, NULL );
- if (preferred_locales && CFArrayGetCount( preferred_locales ))
- user_language_string_ref = (CFStringRef)CFArrayGetValueAtIndex( preferred_locales, 0 ); // FIXME
- CFRelease( all_locales );
-#endif /* __APPLE__ */
-
- // FIXME setlocale( LC_ALL, "" );
-
- unix_cp = setup_unix_locales();
- if (!lcid_LC_MESSAGES) lcid_LC_MESSAGES = lcid_LC_CTYPE;
-
-#ifdef __APPLE__
- /* Override lcid_LC_MESSAGES with user_language if LC_MESSAGES is set to default */
- if (lcid_LC_MESSAGES == lcid_LC_CTYPE && user_language_string_ref)
- {
- struct locale_name locale_name;
- WCHAR buffer[128];
- CFStringGetCString( user_language_string_ref, user_locale, sizeof(user_locale), kCFStringEncodingUTF8 );
- strcpynAtoW( buffer, user_locale, sizeof(buffer)/sizeof(WCHAR) );
- parse_locale_name( buffer, &locale_name );
- lcid_LC_MESSAGES = locale_name.lcid;
- // TRACE( "setting lcid_LC_MESSAGES to '%s'\n", user_locale );
- }
- if (preferred_locales)
- CFRelease( preferred_locales );
-#endif
-
-#if 0 // FIXME
- NtSetDefaultUILanguage( LANGIDFROMLCID(lcid_LC_MESSAGES) );
- NtSetDefaultLocale( TRUE, lcid_LC_MESSAGES );
- NtSetDefaultLocale( FALSE, lcid_LC_CTYPE );
-
- ansi_cp = get_lcid_codepage( LOCALE_USER_DEFAULT );
- GetLocaleInfoW( LOCALE_USER_DEFAULT, LOCALE_IDEFAULTMACCODEPAGE | LOCALE_RETURN_NUMBER,
- (LPWSTR)&mac_cp, sizeof(mac_cp)/sizeof(WCHAR) );
- GetLocaleInfoW( LOCALE_USER_DEFAULT, LOCALE_IDEFAULTCODEPAGE | LOCALE_RETURN_NUMBER,
- (LPWSTR)&oem_cp, sizeof(oem_cp)/sizeof(WCHAR) );
- if (!unix_cp)
- GetLocaleInfoW( LOCALE_USER_DEFAULT, LOCALE_IDEFAULTUNIXCODEPAGE | LOCALE_RETURN_NUMBER,
- (LPWSTR)&unix_cp, sizeof(unix_cp)/sizeof(WCHAR) );
-
- if (!(ansi_cptable = wine_cp_get_table( ansi_cp )))
- ansi_cptable = wine_cp_get_table( 1252 );
- if (!(oem_cptable = wine_cp_get_table( oem_cp )))
- oem_cptable = wine_cp_get_table( 437 );
- if (!(mac_cptable = wine_cp_get_table( mac_cp )))
- mac_cptable = wine_cp_get_table( 10000 );
- if (unix_cp != CP_UTF8)
- {
- if (!(unix_cptable = wine_cp_get_table( unix_cp )))
- unix_cptable = wine_cp_get_table( 28591 );
- }
-
- __wine_init_codepages( ansi_cptable, oem_cptable, unix_cptable );
-
- TRACE( "ansi=%03d oem=%03d mac=%03d unix=%03d\n",
- ansi_cptable->info.codepage, oem_cptable->info.codepage,
- mac_cptable->info.codepage, unix_cp );
-
- setlocale(LC_NUMERIC, "C"); /* FIXME: oleaut32 depends on this */
-#endif
-}
-
-LANGID GetUserDefaultLangID(void)
-{
- // return LANGIDFROMLCID(GetUserDefaultLCID());
- if (lcid_LC_MESSAGES == 0) LOCALE_Init();
- return LANGIDFROMLCID(lcid_LC_MESSAGES);
-}
-
-LANGID GetSystemDefaultLangID(void)
-{
- // return LANGIDFROMLCID(GetSystemDefaultLCID());
- if (lcid_LC_MESSAGES == 0) LOCALE_Init();
- return LANGIDFROMLCID(lcid_LC_MESSAGES);
-}
-
-#ifdef TEST
-int main()
-{
- LANGID langID;
- WORD primLang;
- WORD subLang;
-
- setlocale( LC_ALL, "" );
-
- langID = GetUserDefaultLangID();
- printf("langID=0x%x\n",langID);
-
- primLang = (WORD)(PRIMARYLANGID(langID));
- subLang = (WORD)(SUBLANGID(langID));
-
- printf("primLang=%d subLang=%d\n",(unsigned)primLang,(unsigned)subLang);
-
- return 0;
-}
-#endif
-
diff --git a/src/libs/7zip/unix/CPP/myWindows/wine_date_and_time.cpp b/src/libs/7zip/unix/CPP/myWindows/wine_date_and_time.cpp
deleted file mode 100644
index 6d7f83a0c..000000000
--- a/src/libs/7zip/unix/CPP/myWindows/wine_date_and_time.cpp
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * 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
- *
- */
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h> /* gettimeofday */
-#include <dirent.h>
-#include <unistd.h>
-#include <time.h>
-
-#include <windows.h>
-
-// #define TRACEN(u) u;
-#define TRACEN(u) /* */
-
-typedef LONG NTSTATUS;
-#define STATUS_SUCCESS 0x00000000
-
-#define TICKSPERSEC 10000000
-#define TICKSPERMSEC 10000
-#define SECSPERDAY 86400
-#define SECSPERHOUR 3600
-#define SECSPERMIN 60
-#define MINSPERHOUR 60
-#define HOURSPERDAY 24
-#define EPOCHWEEKDAY 1 /* Jan 1, 1601 was Monday */
-#define DAYSPERWEEK 7
-#define EPOCHYEAR 1601
-#define DAYSPERNORMALYEAR 365
-#define DAYSPERLEAPYEAR 366
-#define MONSPERYEAR 12
-#define DAYSPERQUADRICENTENNIUM (365 * 400 + 97)
-#define DAYSPERNORMALCENTURY (365 * 100 + 24)
-#define DAYSPERNORMALQUADRENNIUM (365 * 4 + 1)
-
-/* 1601 to 1970 is 369 years plus 89 leap days */
-#define SECS_1601_TO_1970 ((369 * 365 + 89) * (ULONGLONG)SECSPERDAY)
-#define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKSPERSEC)
-/* 1601 to 1980 is 379 years plus 91 leap days */
-#define SECS_1601_TO_1980 ((379 * 365 + 91) * (ULONGLONG)SECSPERDAY)
-#define TICKS_1601_TO_1980 (SECS_1601_TO_1980 * TICKSPERSEC)
-typedef short CSHORT;
-
-static LONG TIME_GetBias() {
- time_t utc = time(NULL);
- struct tm *ptm = localtime(&utc);
- int localdaylight = ptm->tm_isdst; /* daylight for local timezone */
- ptm = gmtime(&utc);
- ptm->tm_isdst = localdaylight; /* use local daylight, not that of Greenwich */
- LONG bias = (int)(mktime(ptm)-utc);
- TRACEN((printf("TIME_GetBias %ld\n",(long)bias)))
- return bias;
-}
-
-static inline void RtlSystemTimeToLocalTime( const LARGE_INTEGER *SystemTime,
- LARGE_INTEGER *LocalTime ) {
- LONG bias = TIME_GetBias();
- LocalTime->QuadPart = SystemTime->QuadPart - bias * (LONGLONG)TICKSPERSEC;
-}
-
-void WINAPI RtlSecondsSince1970ToFileTime( DWORD Seconds, FILETIME * ft ) {
- ULONGLONG secs = Seconds * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970;
- ft->dwLowDateTime = (DWORD)secs;
- ft->dwHighDateTime = (DWORD)(secs >> 32);
- TRACEN((printf("RtlSecondsSince1970ToFileTime %lx => %lx %lx\n",(long)Seconds,(long)ft->dwHighDateTime,(long)ft->dwLowDateTime)))
-}
-
-/*
-void WINAPI RtlSecondsSince1970ToTime( DWORD Seconds, LARGE_INTEGER *Time )
-{
- ULONGLONG secs = Seconds * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970;
- // Time->u.LowPart = (DWORD)secs; Time->u.HighPart = (DWORD)(secs >> 32);
- Time->QuadPart = secs;
-}
- */
-
-BOOL WINAPI DosDateTimeToFileTime( WORD fatdate, WORD fattime, FILETIME * ft)
-{
- struct tm newtm;
-#ifndef ENV_HAVE_TIMEGM
- struct tm *gtm;
- time_t time1, time2;
-#endif
-
- TRACEN((printf("DosDateTimeToFileTime\n")))
-
- newtm.tm_sec = (fattime & 0x1f) * 2;
- newtm.tm_min = (fattime >> 5) & 0x3f;
- newtm.tm_hour = (fattime >> 11);
- newtm.tm_mday = (fatdate & 0x1f);
- newtm.tm_mon = ((fatdate >> 5) & 0x0f) - 1;
- newtm.tm_year = (fatdate >> 9) + 80;
- newtm.tm_isdst = -1;
-#ifdef ENV_HAVE_TIMEGM
- RtlSecondsSince1970ToFileTime( timegm(&newtm), ft );
-#else
- newtm.tm_isdst = 0;
- time1 = mktime(&newtm);
- gtm = gmtime(&time1);
- time2 = mktime(gtm);
- RtlSecondsSince1970ToFileTime( 2*time1-time2, ft );
-#endif
- TRACEN((printf("DosDateTimeToFileTime(%ld,%ld) => %lx %lx\n",
- (long)fatdate,(long)fattime,
- (long)ft->dwHighDateTime,(long)ft->dwLowDateTime)))
-
- return TRUE;
-}
-
-/*
-BOOL WINAPI DosDateTimeToFileTime( WORD fatdate, WORD fattime, FILETIME * ft) {
- struct tm newtm;
-
- TRACEN((printf("DosDateTimeToFileTime\n")))
-
- memset(&newtm,0,sizeof(newtm));
- newtm.tm_sec = (fattime & 0x1f) * 2;
- newtm.tm_min = (fattime >> 5) & 0x3f;
- newtm.tm_hour = (fattime >> 11);
- newtm.tm_mday = (fatdate & 0x1f);
- newtm.tm_mon = ((fatdate >> 5) & 0x0f) - 1;
- newtm.tm_year = (fatdate >> 9) + 80;
- newtm.tm_isdst = -1;
-
- time_t time1 = mktime(&newtm);
- LONG bias = TIME_GetBias();
- RtlSecondsSince1970ToFileTime( time1 - bias, ft );
-
-
- TRACEN((printf("DosDateTimeToFileTime(%ld,%ld) t1=%ld => %lx %lx\n",
- (long)fatdate,(long)fattime,(long)time1,
- (long)ft->dwHighDateTime,(long)ft->dwLowDateTime)))
-
- return TRUE;
-}
-*/
-
-BOOLEAN WINAPI RtlTimeToSecondsSince1970( const LARGE_INTEGER *Time, DWORD *Seconds ) {
- ULONGLONG tmp = Time->QuadPart;
- TRACEN((printf("RtlTimeToSecondsSince1970-1 %llx\n",tmp)))
- tmp /= TICKSPERSEC;
- tmp -= SECS_1601_TO_1970;
- TRACEN((printf("RtlTimeToSecondsSince1970-2 %llx\n",tmp)))
- if (tmp > 0xffffffff) return FALSE;
- *Seconds = (DWORD)tmp;
- return TRUE;
-}
-
-BOOL WINAPI FileTimeToDosDateTime( const FILETIME *ft, WORD *fatdate, WORD *fattime ) {
- LARGE_INTEGER li;
- ULONG t;
- time_t unixtime;
- struct tm* tm;
- WORD fat_d,fat_t;
-
- TRACEN((printf("FileTimeToDosDateTime\n")))
- li.QuadPart = ft->dwHighDateTime;
- li.QuadPart = (li.QuadPart << 32) | ft->dwLowDateTime;
- RtlTimeToSecondsSince1970( &li, &t );
- unixtime = t; /* unixtime = t; * FIXME unixtime = t - TIME_GetBias(); */
-
- tm = gmtime( &unixtime );
-
- fat_t = (tm->tm_hour << 11) + (tm->tm_min << 5) + (tm->tm_sec / 2);
- fat_d = ((tm->tm_year - 80) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday;
- if (fattime)
- *fattime = fat_t;
- if (fatdate)
- *fatdate = fat_d;
-
- TRACEN((printf("FileTimeToDosDateTime : %lx %lx => %d %d\n",
- (long)ft->dwHighDateTime,(long)ft->dwLowDateTime,(unsigned)fat_d,(unsigned)fat_t)))
-
- return TRUE;
-}
-
-BOOL WINAPI FileTimeToLocalFileTime( const FILETIME *utcft, FILETIME * localft ) {
- LARGE_INTEGER local, utc;
-
- TRACEN((printf("FileTimeToLocalFileTime\n")))
- utc.QuadPart = utcft->dwHighDateTime;
- utc.QuadPart = (utc.QuadPart << 32) | utcft->dwLowDateTime;
- RtlSystemTimeToLocalTime( &utc, &local );
- localft->dwLowDateTime = (DWORD)local.QuadPart;
- localft->dwHighDateTime = (DWORD)(local.QuadPart >> 32);
-
- return TRUE;
-}
-
-typedef struct _TIME_FIELDS {
- CSHORT Year;
- CSHORT Month;
- CSHORT Day;
- CSHORT Hour;
- CSHORT Minute;
- CSHORT Second;
- CSHORT Milliseconds;
- CSHORT Weekday;
-} TIME_FIELDS;
-
-static const int MonthLengths[2][MONSPERYEAR] =
-{
- { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
- { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
-};
-
-static inline int IsLeapYear(int Year) {
- return Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) ? 1 : 0;
-}
-
-static inline VOID WINAPI RtlTimeToTimeFields(
- const LARGE_INTEGER *liTime,
- TIME_FIELDS * TimeFields) {
- int SecondsInDay;
- long int cleaps, years, yearday, months;
- long int Days;
- LONGLONG Time;
-
- /* Extract millisecond from time and convert time into seconds */
- TimeFields->Milliseconds =
- (CSHORT) (( liTime->QuadPart % TICKSPERSEC) / TICKSPERMSEC);
- Time = liTime->QuadPart / TICKSPERSEC;
-
- /* The native version of RtlTimeToTimeFields does not take leap seconds
- * into account */
-
- /* Split the time into days and seconds within the day */
- Days = Time / SECSPERDAY;
- SecondsInDay = Time % SECSPERDAY;
-
- /* compute time of day */
- TimeFields->Hour = (CSHORT) (SecondsInDay / SECSPERHOUR);
- SecondsInDay = SecondsInDay % SECSPERHOUR;
- TimeFields->Minute = (CSHORT) (SecondsInDay / SECSPERMIN);
- TimeFields->Second = (CSHORT) (SecondsInDay % SECSPERMIN);
-
- /* compute day of week */
- TimeFields->Weekday = (CSHORT) ((EPOCHWEEKDAY + Days) % DAYSPERWEEK);
-
- /* compute year, month and day of month. */
- cleaps=( 3 * ((4 * Days + 1227) / DAYSPERQUADRICENTENNIUM) + 3 ) / 4;
- Days += 28188 + cleaps;
- years = (20 * Days - 2442) / (5 * DAYSPERNORMALQUADRENNIUM);
- yearday = Days - (years * DAYSPERNORMALQUADRENNIUM)/4;
- months = (64 * yearday) / 1959;
- /* the result is based on a year starting on March.
- * To convert take 12 from Januari and Februari and
- * increase the year by one. */
- if( months < 14 ) {
- TimeFields->Month = months - 1;
- TimeFields->Year = years + 1524;
- } else {
- TimeFields->Month = months - 13;
- TimeFields->Year = years + 1525;
- }
- /* calculation of day of month is based on the wonderful
- * sequence of INT( n * 30.6): it reproduces the
- * 31-30-31-30-31-31 month lengths exactly for small n's */
- TimeFields->Day = yearday - (1959 * months) / 64 ;
-}
-
-
-BOOL WINAPI FileTimeToSystemTime( const FILETIME *ft, SYSTEMTIME * syst ) {
- TIME_FIELDS tf;
- LARGE_INTEGER t;
-
- TRACEN((printf("FileTimeToSystemTime\n")))
- t.QuadPart = ft->dwHighDateTime;
- t.QuadPart = (t.QuadPart << 32) | ft->dwLowDateTime;
- RtlTimeToTimeFields(&t, &tf);
-
- syst->wYear = tf.Year;
- syst->wMonth = tf.Month;
- syst->wDay = tf.Day;
- syst->wHour = tf.Hour;
- syst->wMinute = tf.Minute;
- syst->wSecond = tf.Second;
- syst->wMilliseconds = tf.Milliseconds;
- syst->wDayOfWeek = tf.Weekday;
- return TRUE;
-}
-
-
-static inline NTSTATUS WINAPI RtlLocalTimeToSystemTime( const LARGE_INTEGER *LocalTime,
- LARGE_INTEGER *SystemTime) {
-
- TRACEN((printf("RtlLocalTimeToSystemTime\n")))
- LONG bias = TIME_GetBias();
- SystemTime->QuadPart = LocalTime->QuadPart + bias * (LONGLONG)TICKSPERSEC;
- return STATUS_SUCCESS;
-}
-
-BOOL WINAPI LocalFileTimeToFileTime( const FILETIME *localft, FILETIME * utcft ) {
- LARGE_INTEGER local, utc;
-
- TRACEN((printf("LocalFileTimeToFileTime\n")))
- local.QuadPart = localft->dwHighDateTime;
- local.QuadPart = (local.QuadPart << 32) | localft->dwLowDateTime;
- RtlLocalTimeToSystemTime( &local, &utc );
- utcft->dwLowDateTime = (DWORD)utc.QuadPart;
- utcft->dwHighDateTime = (DWORD)(utc.QuadPart >> 32);
-
- return TRUE;
-}
-
-/*********************************************************************
- * GetSystemTime (KERNEL32.@)
- *
- * Get the current system time.
- *
- * RETURNS
- * Nothing.
- */
-VOID WINAPI GetSystemTime(SYSTEMTIME * systime) /* [O] Destination for current time */
-{
- FILETIME ft;
- LARGE_INTEGER t;
-
- TRACEN((printf("GetSystemTime\n")))
-
- struct timeval now;
- gettimeofday( &now, 0 );
- t.QuadPart = now.tv_sec * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970;
- t.QuadPart += now.tv_usec * 10;
-
- ft.dwLowDateTime = (DWORD)(t.QuadPart);
- ft.dwHighDateTime = (DWORD)(t.QuadPart >> 32);
- FileTimeToSystemTime(&ft, systime);
-}
-
-/******************************************************************************
- * RtlTimeFieldsToTime [NTDLL.@]
- *
- * Convert a TIME_FIELDS structure into a time.
- *
- * PARAMS
- * ftTimeFields [I] TIME_FIELDS structure to convert.
- * Time [O] Destination for the converted time.
- *
- * RETURNS
- * Success: TRUE.
- * Failure: FALSE.
- */
-static BOOLEAN WINAPI RtlTimeFieldsToTime(
- TIME_FIELDS * tfTimeFields,
- LARGE_INTEGER *Time)
-{
- int month, year, cleaps, day;
-
- TRACEN((printf("RtlTimeFieldsToTime\n")))
-
- /* FIXME: normalize the TIME_FIELDS structure here */
- /* No, native just returns 0 (error) if the fields are not */
- if( tfTimeFields->Milliseconds< 0 || tfTimeFields->Milliseconds > 999 ||
- tfTimeFields->Second < 0 || tfTimeFields->Second > 59 ||
- tfTimeFields->Minute < 0 || tfTimeFields->Minute > 59 ||
- tfTimeFields->Hour < 0 || tfTimeFields->Hour > 23 ||
- tfTimeFields->Month < 1 || tfTimeFields->Month > 12 ||
- tfTimeFields->Day < 1 ||
- tfTimeFields->Day > MonthLengths
- [ tfTimeFields->Month ==2 || IsLeapYear(tfTimeFields->Year)]
- [ tfTimeFields->Month - 1] ||
- tfTimeFields->Year < 1601 )
- return FALSE;
-
- /* now calculate a day count from the date
- * First start counting years from March. This way the leap days
- * are added at the end of the year, not somewhere in the middle.
- * Formula's become so much less complicate that way.
- * To convert: add 12 to the month numbers of Jan and Feb, and
- * take 1 from the year */
- if(tfTimeFields->Month < 3) {
- month = tfTimeFields->Month + 13;
- year = tfTimeFields->Year - 1;
- } else {
- month = tfTimeFields->Month + 1;
- year = tfTimeFields->Year;
- }
- cleaps = (3 * (year / 100) + 3) / 4; /* nr of "century leap years"*/
- day = (36525 * year) / 100 - cleaps + /* year * dayperyr, corrected */
- (1959 * month) / 64 + /* months * daypermonth */
- tfTimeFields->Day - /* day of the month */
- 584817 ; /* zero that on 1601-01-01 */
- /* done */
-
- Time->QuadPart = (((((LONGLONG) day * HOURSPERDAY +
- tfTimeFields->Hour) * MINSPERHOUR +
- tfTimeFields->Minute) * SECSPERMIN +
- tfTimeFields->Second ) * 1000 +
- tfTimeFields->Milliseconds ) * TICKSPERMSEC;
-
- return TRUE;
-}
-
-/*********************************************************************
- * SystemTimeToFileTime (KERNEL32.@)
- */
-BOOL WINAPI SystemTimeToFileTime( const SYSTEMTIME *syst, FILETIME * ft ) {
- TIME_FIELDS tf;
- LARGE_INTEGER t;
-
- TRACEN((printf("SystemTimeToFileTime\n")))
-
- tf.Year = syst->wYear;
- tf.Month = syst->wMonth;
- tf.Day = syst->wDay;
- tf.Hour = syst->wHour;
- tf.Minute = syst->wMinute;
- tf.Second = syst->wSecond;
- tf.Milliseconds = syst->wMilliseconds;
-
- RtlTimeFieldsToTime(&tf, &t);
- ft->dwLowDateTime = (DWORD)t.QuadPart;
- ft->dwHighDateTime = (DWORD)(t.QuadPart>>32);
- return TRUE;
-}
-
diff --git a/src/libs/7zip/unix/ChangeLog b/src/libs/7zip/unix/ChangeLog
deleted file mode 100644
index 5887d43f1..000000000
--- a/src/libs/7zip/unix/ChangeLog
+++ /dev/null
@@ -1,914 +0,0 @@
-
-Version 9.20.1
-==============
-
- - #3211479 "p7zip 9.20 - "unsupported method" with RAR files - " fixed
- "install.sh" installs again "bin/Codecs/Rar29.so"
-
-Version 9.20
-============
-
- - From Windows version of 7-zip 9.20, What's new after 7-Zip 4.65 (2009-02-03):
- - 7-Zip now supports LZMA2 compression method.
- - 7-Zip now can update solid .7z archives.
- - 7-Zip now supports XZ archives.
- - 7-Zip now supports PPMd compression in ZIP archives.
- - 7-Zip now can unpack NTFS, FAT, VHD, MBR, APM, SquashFS, CramFS, MSLZ archives.
- - 7-Zip now can unpack GZip, BZip2, LZMA, XZ and TAR archives from stdin.
- - 7-Zip now can unpack some TAR and ISO archives with incorrect headers.
- - 7-Zip now supports files that are larger than 8 GB in TAR archives.
- - NSIS and WIM support was improved.
- - Partial parsing for EXE resources, SWF and FLV.
- - The support for archives in installers was improved.
- - 7-Zip now can stores NTFS file timestamps to ZIP archives.
- - Speed optimizations in PPMd codec.
- - Speed optimizations in CRC calculation code for Intel's Atom CPUs.
- - New -scrc switch to calculate total CRC-32 during extracting / testing.
- - 7-Zip File Manager now doesn't use temp files to open nested archives stored without compression.
- - Disk fragmentation problem for ZIP archives created by 7-Zip was fixed.
- - Some bugs were fixed.
- - New localizations: Hindi, Gujarati, Sanskrit, Tatar, Uyghur, Kazakh.
- - Not in p7zip : Speed optimizations in AES code for Intel's 32nm CPUs.
-
-
-
-
-Version 9.18
-============
- - From Windows version of 7-zip 9.17
- - Disk fragmentation problem for ZIP archives created by 7-Zip was fixed.
- Notes: 7-Zip now uses 4 MB RAM buffer as file cache, when you create ZIP archives.
- It reduces the number of Move_File_Position and Write_to_File operations.
-
- - From Windows version of 7-zip 9.18
- - 7-Zip now can unpack SquashFS and CramFS filesystem images.
- - 7-Zip now can unpack some TAR and ISO archives with incorrect headers.
- - Some bugs were fixed.
-
- - Some bugs were fixed in 7zG and 7zFM on MacOSX
-
-
-Version 9.16
-============
- - From Windows version of 7-zip 9.16
- - 7-Zip now supports files that are larger than 8 GB in TAR archives.
- - NSIS support was improved :
- - 7-Zip now supports BZip2 method in NSIS installers.
- - 7-Zip now can extract identical files from NSIS installers.
- - Some bugs were fixed.
- - New localizations: Hindi, Gujarati, Sanskrit.
-
- - From Windows version of 7-zip 9.15
- - Some bugs were fixed.
- - New localization: Tatar
-
- - From Windows version of 7-zip 9.14
- - WIM support was improved. 7-Zip now can create WIM archives without compression.
-
-
- - #3069545 "kSignatureDummy?" fixed
-
-
-
-
-Version 9.13
-============
- - From Windows version of 7-zip 9.12
- - Some bugs were fixed.
-
-
- - #2863580 "Crash in Rar decoder on a corrupted file" fixed
-
- - #2860898 "Dereferencing a zero pointer in cab handler" fixed
-
- - #2860679 "Division by zero in cab decoder" fixed
-
-
-
-Version 9.12
-============
- - From Windows version of 7-zip 9.12
- - ZIP / PPMd compression ratio was improved in Maximum and Ultra modes.
- - The BUG in 7-Zip 9.* beta was fixed: LZMA2 codec didn't work,
- if more than 10 threads were used (or more than 20 threads in some modes).
-
- - makefile.openbsd is now compatible with OpenBSD ports tree.
- (thanks to jggimi)
-
- - cmake projects added.
-
- - 7zFM and 7zG can be built on MacOSX but these ports are in very alpha stage.
- make app to build p7zip.app (p7zip for MacOSX)
-
-
-Version 9.11 (never published)
-============
- - From Windows version of 7-zip 9.11
- - 7-Zip now supports PPMd compression in .ZIP archives.
- - Speed optimizations in PPMd codec.
- - The support for archives in installers was improved.
- - Some bugs were fixed.
-
-
-Version 9.10 (never published)
-============
-
- - From Windows version of 7-zip 9.05 to 9.10
- - 7-Zip now can unpack Apple Partition Map (APM) disk images.
- - 7-Zip now can unpack MSLZ archives.
- - Partial parsing for EXE resources, SWF and FLV.
- - Some bugs were fixed.
-
- - p7zip can now use hugetlbfs on Linux (thank to Joachim Henke)
- Like with the Windows large pages, this gives a nice speedup,
- when running memory intensive operations.
-
- - p7zip now uses UTF8 (kCFStringNormalizationFormD) On MacOSX
- fixes #2831266 "p7zip can't find NFC Unicode filename in OSX Terminal"
- and #2976169 "German Umlauts Failure"
-
-
-Version 9.05 (never published)
-============
-
- - p7zip now uses precompiled header with gcc 4
-
-
-Version 9.04 (Major bugfixes and Major enhancements)
-============
-
- - From Windows version of 7-zip 9.04 :
- - 7-Zip now can update solid .7z archives.
- - 7-Zip now supports LZMA2 compression method.
- - 7-Zip now supports XZ archives.
- - 7-Zip now can unpack NTFS, FAT, VHD and MBR archives.
- - 7-Zip now can unpack GZip, BZip2, LZMA, XZ and TAR archives from stdin.
- - New -scrc switch to calculate total CRC-32 during extracting / testing.
- - Some bugs were fixed.
-
- - #2799966 " A newly created 7z archive (by p7zip 4.65) is broken and cannot be unpacked / listed / tested"
- Fixed : now "7za a -mx=9 archive.7z directory" creates a good archive even
- if there are a lot of executable files.
-
- - Fixed : the RAM size was reported incorrectly on MacOSX 64bits (with 2Gb+ RAM)
-
- - #2798023 "segfault handling very large multivolume .7z file"
- p7zip now displays the following error "Error: Too many open files"
- if you don't have enough rights to open all the splitted files
- ( on Linux : ulimit -n)
-
-
-Version 4.65
-============
- - From Windows version of 7-zip 4.62 to 4.65
- - The bug in 7-Zip 4.63 was fixed: 7-Zip could not decrypt .ZIP archives encrypted with WinZip-AES method.
- - 7-Zip now can unpack ZIP archives encrypted with PKWARE-AES.
- - Some bugs were fixed.
-
- - Fixed : the RAM size was reported incorrectly on MacOSX 64bits
-
- - Fixed : makefile.linux_amd64_asm_icc
-
- - DJGPP :
- makefile.djgpp becomes makefile.djgpp_old
- makefile.djgpp_watt added (thank to Rugxulo)
-
-
- - you can now compile 7za with a cmake project (see README)
- the cmake project can build a codeblock project ;)
- Remark : the kdevelop3 or Eclipse/CDT4 project don't work :(
-
-Version 4.61
-============
- - From Windows version of 7-zip 4.61 :
- - 7-Zip now supports LZMA compression for .ZIP archives.
- - Some bugs were fixed.
-
- - #2199036 : Ask for password twice when creating encrypted archive
-
- - 7zG added (read GUI/readme.txt)
-
-
-Version 4.60 (never published)
-============
-
- - From Windows version of 7-zip 4.60 :
- - Some bugs were fixed
-
- - p7zip didn't use the BCJ /BCJ2 filters for executables (:
- - makefile.linux_amd64_asm_icc added (tested with Intel Compiler 11 on Ubuntu 8.04 x64)
-
-
-Version 4.59 (never published)
-============
-
- - From Windows version of 7-zip 4.59 :
- - 7-Zip now can unpack UDF, XAR and DMG/HFS archives.
- - It's allowed to use -t switch for "list" and "extract" commands.
- - Some bugs were fixed.
-
- - Bug : wrong timestamp for files extracted from .zip or .rar archives
-
-
-Version 4.58
-============
- - From Windows version of 7-zip 4.58 :
- - Some speed optimizations.
- - 7-Zip now can unpack .lzma archives.
- - Unicode (UTF-8) support for filenames in .ZIP archives. Now there are 3 modes:
- 1) Default mode: 7-Zip uses UTF-8, if the local code page doesn't contain required symbols.
- 2) -mcu switch: 7-Zip uses UTF-8, if there are non-ASCII symbols.
- 3) -mcl switch: 7-Zip uses local code page.
- - Now it's possible to store file creation time in 7z and ZIP archives (-mtc switch).
- - 7-Zip now can unpack multivolume RAR archives created with
- "old style volume names" scheme and names *.001, *.002, ...
- - Now it's possible to use -mSW- and -mSW+ switches instead of -mSW=off and -mSW=on
- - Some bugs were fixed.
-
- - Bug #1898410 : Timestamp error in archive listing
- now "7za l .." and "ls -l just_extracted_file" give the same date and time.
-
- - Bug #1860938 : unix file rights only 600 instead of 644
-
- - Bug #1941574 : gzip files always marked as OS FAT, Now p7zip uses "Unix".
-
- - Bug #1947700 : file containing excluded files not read
- When using the -xr <filename> flag to list files not to be included in the
- archive the file <filename> is not read if it is a symbolic link.
-
- - Feature Requests #1868080 : add support to compile for NetWare (makefile.netware_asm_gcc_3.X)
-
- - Patch #1883893 : Incorrect path ref to docs in man pages (When using the last ($DEST_DIR) argument with install.sh)
-
- - now "install.sh" supports filenames with spaces.
-
- - some code cleanup (Synchronization)
-
- - some minor fix in the BZip2 codec.
-
- - fix with the define "__TEXT" for s390
-
-
-Version 4.57
-============
- - From Windows version of 7-zip 4.57 :
- - The BUG in command line version was fixed: -up3 switch could work incorrectly.
- - Minor improvement in ZIP compression.
-
-
-Version 4.56 (never published)
-============
- - From Windows version of 7-zip 4.56 :
- - Some bugs were fixed
-
- - On HPUX : fixed "Can't load '../bin/7z.dll'"
- (Unsatisfied data symbol '_ZTVN10__cxxabiv121__vmi_class_type_infoE' in load module '../bin/7z.so'.)
-
- - bug : p7zip used to build a zip file with an "FAT" header instead of "Unix" header
- If LANG was set, "unzip" tried to translate the filenames from "FAT" to locale ...
-
- - On AIX : fixed "HugeFiles=off" (thank kuriath)
-
- - bug #1800180 : LZMAlone compilation error in COutFile
-
- - Patch #1796569 : Fix FreeBSD FTBFS
-
- - Patch #1796575 : fix man1/7za.1 man1/7zr.1 man1/7z.1
-
-
-Version 4.55
-============
- - From Windows version of 7-zip 4.55 :
- - Some bugs were fixed
-
- - fixed #1783007 : when make p7-zip 4.51 under hp-ux 11.11 error
-
- - fixed #1789154 : 7z use default or -m0=LZMA runtime error under HP-UX IA11.23
-
- - support added for HPUX on Itanium.
- (makefile.hpux-acc and makefile.hpux-acc_64)
-
-
-Version 4.54 (never published)
-============
- - From Windows version of 7-zip 4.54 :
- - Decompression speed was increased
-
-Version 4.53
-============
- - From Windows version of 7-zip 4.53 :
- - The bug in 7-Zip 4.48 - 4.52 beta was fixed:
- 7-Zip could create .ZIP archives with broken files.
- - Some bugs were fixed.
-
-Version 4.52 (never published)
-============
- - From Windows version of 7-zip 4.52 :
- - 7z now can unpack Compound files (msi, doc, ...).
- - Some bugs were fixed (CAB decompressing)
-
- - lzma (CPP/7zip/Compress/LZMA_Alone) is now multi-threaded.
-
- - fixed #632912 : Extracting large directories takes quadratic time
- (this bug was not fully fixed ...)
-
- - fixed : "7za x -odirectory archive.7z" now works even if "directory" is a symbolic link.
-
- - makefile.linux_s390x added : support for Linux on IBM z/Series Mainframe with s390x CPU
- (thank y_stephen)
-
- - fixed crashes on BeOs with the flag "@filename"
-
- - cleanup in the makefile : defining LITTLE_ENDIAN or BIG_ENDIAN is not needed anymore
-
- - ppmd.exe added (CPP/7zip/Compress/PPMD_Alone)
-
-Version 4.51
-============
- - From Windows version of 7-zip 4.51 :
- - Bug was fixed: 7-Zip 4.50 beta could not open some .7z archives.
-
- - fix built of test_emul
-
-Version 4.50 (never published)
-============
- - From Windows version of 7-zip 4.50 :
- - New switch for command line version:
- -ssc[-] enables/disables case-sensitive mode for file names.
- - Speed optimizations for AES encryption.
- - Some bugs were fixed.
-
- - contrib/gzip-like_CLI_wrapper_for_7z/p7zip now supports commands like :
- p7zip -- -name
- p7zip "file name"
- p7zip file1 file2 file3
- p7zip -d file1.7z file2.7z file3.7z
-
- never published because this version does not pass my tests.
-
-Version 4.49
-============
- - From Windows version of 7-zip 4.49 :
- - 7-Zip (7z) now can unpack WIM archives
-
- - fixed : On Sparc Solaris, core dump during "7z a -sfx exe.x dir" with p7zip compiled with makefile.solaris_sparc_CC_32
-
- - some code cleanup
-
- - On HPUX, p7zip can get the number of CPU and the size of the memory.
-
-
-Version 4.48
-============
- - From Windows version of 7-zip 4.48 :
- - Encryption strength for .7z format was increased.
- Now it uses random initialization vectors.
- - Some bugs were fixed.
-
- - fixed #1729236 : Makefile infrastructure not safe for parallel compilation
- (if your make command understands -C and -j4, copy makefile.parallel_jobs over makefile)
-
- - Now the executables are not built with the PIC (position-independent code) flag.
- 7z.so are still built with the PIC flag.
- 7za and 7zr are now faster than 7z with 7z.so.
- 7za, 7zr and 7r are now smaller.
-
- - contrib/gzip-like_CLI_wrapper_for_7z/p7zip now supports spaces in filename
- and use 7za instead of 7z.
-
- - contrib/qnx630sp3 added to support QNX built (thank termterm)
-
-
-Version 4.47
-============
- - From Windows version of 7-zip 4.47 :
- - Bugs of 7-Zip 4.46 beta were fixed: BZip2 could work incorrectly
-
-Version 4.46 (never published)
-============
-
- - From Windows version of 7-zip 4.46 :
- - New fast compression mode for Deflate method in Zip and GZip.
- - Some bugs were fixed.
-
- - LZMA Benchmark :
- - cygwin : RAM size detection
- - computation of the CPU %
-
- - fixed #1721827 : install.sh now copies 7z.so
-
- - Client7z now uses 7z.so instead of 7za.so
-
- - new target : cygwin with asm
-
- - LZMA SDK added in the source package (CPP/7zip/Compress/LZMA_Alone)
-
- - fixed #1716987 : 7zr removed from 4.45 binary distribution
-
- - fixed #1706002 : make and install.sh use the same variables in the same order.
-
-
-Version 4.45
-============
-
- - From Windows version of 7-zip 4.45 :
- - Default dictionary size was increased: Normal: 16 MB, Max: 32 MB.
- - Speed optimizations.
- - Benchmark was improved (new "b" command in command line version).
- - The number of DLL files was reduced.
- - switch -mhcf=off is not supported now.
- - If -t{Type} switch is not specified, 7-Zip now uses extension of archive to detect the type of archive.
- - Some bugs were fixed (BZip2 in multithread)
- - x86 or x86_64 : ASM version of crc32 available
-
- - better detection of executable file (scripts do not need BCJ/BCJ2 filter)
-
- - default permissions are now :
- - for a file : -rw-------
- - for a directory : drwx------
-
- - on MacOSX, locale is always utf8 (because the MacOSX filesystem supports only utf8 filenames)
-
- - makefile.qnx_static and makefile.qnx_shared added (Thank to termterm)
-
-
-Version 4.44
-============
-
- - From Windows version of 7-zip 4.44 :
- - 7za : Cab support
- - Speed optimizations for LZMA, Deflate, BZip2 and unRAR.
- - fix : now, updating a crypted header archive keeps the crypted header
-
- - fixes in the help displayed by 7za/7z/7zr.
-
- - code cleanup
- - remove of mySetModuleFileNameA (and its memory leak), GetModuleFileName ...
-
- - fixed : p7zip for DJGPP can now update an archive (thank stranix)
-
- - fixed : in the plugins of 7z, the "Utf16" state was always off.
-
- - fixed : support for directory names that are not encoded with the current locale.
- (ex : directory name is in "iso 8859-15" whereas the locale is "utf8")
-
- - patch #1581907 : fix for FreeBSD in contrib/gzip-like_CLI_wrapper_for_7z/p7zip
-
- - fixed : p7zip can now restore a symbolic link from a Zip archive (archive.zip made with "zip -y")
- remark/todo : p7zip stores, in a zip archive, the linked file instead of the symbolic link
-
- - fixed #1630452 : small fix in the output of the script install.sh
-
- - fixed #632912 : Extracting large directories takes quadratic time
-
- - preliminary support of HP-UX : remove of RTLD_GROUP for dlopen in DLL.cpp
- makefile.hpux-acc should be able to build 7za for HP-UX (thank furiol)
-
- - Client7z added.
-
-Version 4.43
-============
- - From Windows version of 7-zip 4.43 :
- - 7-Zip now can use multi-threading mode for compressing to .ZIP archives.
- - ZIP format supporting was improved.
- - 7-Zip now supports WinZip-compatible AES-256 encryption for .ZIP archives.
- - 7-Zip now uses order list (list of extensions) for files sorting for compressing
- to .7z archives. It can slightly increase compression ratio in some cases.
- - 7-Zip now restores modification time of folders during .7z archives extracting.
- - Some bugs were fixed.
-
- - fixed : the user can now see the percentage indicator.
-
- - fix "Bugs item #1612285" : doesn't preserve directory timestamps
-
- - support added for Tru64 / OSF 5.1 (makefile.tru64)
-
- - small fix "Bugs item #1533765" in install.sh (7zr install)
-
- - fix "Bugs item #1507913" : "make all" now build 7za and 7zCon.sfx
- following the README.
-
- - manpage updated "bugs item #1509098" : exit codes added
-
- - manpage updated :-mhe=on (Header encryption) added
-
- - install.sh now can install the file README, ChangeLog and the directory DOCS
-
-
-Version 4.42
-============
- - From Windows version of 7-zip 4.42 :
- - Some bugs were fixed
-
- - the binaries provided by p7zip_4.XY_x86_linux_bin.tar.bz2
- can now run on Fedora x86_64,
- and should now run on any 64bits Linux.
-
- - patch #1473746 - gzip-like CLI wrapper (for 7z)
- see the directory "contrib/gzip-like_CLI_wrapper_for_7z".
-
- - patch #471478 - Support for OPTFLAGS
- This patch allows to use system specific opt flags.
- example : make OPTFLAGS="-O2 -march=athlon-xp"
-
- - the djgpp and cygwin makefile now build "7za" with case insensitive filenames
- (Windows filesystem is case insensitive).
-
-
-Version 4.41
-============
- - From Windows version of 7-zip 4.41 :
- - Some bugs were fixed
-
-
-Version 4.40
-============
-
- - From Windows version of 7-zip 4.40 :
- - 7-Zip now can unpack some installers created by NSIS
- - Some bugs were fixed
-
- - format LZH/LHA : fixed directory display during listing or extracting
- (a directory does not end with the path separator)
-
- - patch #1470817 - Handle 7zr in install.sh
-
- - code cleanup
-
-
-Version 4.39
-============
-
- - From Windows version of 7-zip 4.39 :
- - Bug in versions 4.33:4.38 was fixed:
- 7-Zip could not correctly compress files larger than 2 GB
- to 7z archive in fast/fastest modes (HC4 match finder).
-
-
-Version 4.38
-============
-
- - From Windows version of 7-zip 4.38 :
- - Some bugs were fixed.
-
- - new manpage : 7zr.1
- - update manpages : 7z.1 and 7za.1
- - new switch : --help
-
- - patch #1465026 - Patch for install.sh for packagers
-
- - DosDateTimeToFileTime fixed (rar format)
-
- - contrib/VirtualFileSystemForMidnightCommander/u7z updated
- (thank sgh_punk)
-
-
-Version 4.37
-============
- - From Windows version of 7-zip 4.37 :
- - Some bugs were fixed.
-
- - fix build for Solaris sparc with CC instead of g++.
-
- - fix build for Solaris 9 x86
- - fix build for Solaris 10 x86
- - fix build for OpenBSD
- - p7zip can now be build with djgpp.
- - new target : 7zr (light version of 7za)
- - new machine : IBM AIX
-
-Version 4.36
-============
- - From Windows version of 7-zip 4.36 :
- - 7-zip now can unpack ISO archives
-
- - GCC 4.X : add C++ visibility support to reduce the size of the *.so
- (see makefile.linux_x86_ppc_alpha__gcc_4.X)
-
- - cygwin now supports '-o/tmp'
-
-Version 4.35
-============
- - From Windows version of 7-zip 4.35 :
- - New switch : -slt ("l" (list) command with -slt shows technical information for archive).
- - Some bugs were fixed.
-
- - From Windows version of 7-zip 4.34 :
- - BZip2 compressing / decompressing now can work in multi-threading mode
- - Multi-threading mode now is default for multi-processor systems
-
-Version 4.33
-============
- - From Windows version of 7-zip 4.33 :
- - Compressing speed and Memory requirements were increased.
- Default dictionary size was increased: Fastest: 64 KB, Fast: 1 MB,
- Normal: 4 MB, Max: 16 MB, Ultra: 64 MB.
- - 64-bit version now supports 1 GB dictionary
- - 7z/LZMA now can use only these match finders: HC4, BT2, BT3, BT4
- - Compression ratio in Zip/GZip/Deflate in Ultra mode was increased
- - Some bugs were fixed
-
- - fix "Bugs item #1407358" : Passwords entered are not visible on command line
- if the target has the system function "getpass".
-
- - fix "BCJ2" : now p7zip uses the "BCJ2" filter when the file has execute permission
- (7-zip uses the "BCJ2" filter when the filename ends with ".dll", ".exe", ".ocx", ".sfx" or ".sys")
-
- - patch #1390722 : no new line at end of file
-
- - patch #1390716 : allow compiling with gcc-4.1
-
- - patch #1425862 : allow other make programs than GNU make
-
- - Testing framework added ("make test" and "make test_7z")
-
- - fix 'lstat' : p7zip can compile if 'lstat' is not available
-
-Version 4.30
-============
- - From Windows version of 7-zip 4.30 :
- - Speed optimizations in LZMA maximum/ultra compressing.
- - LZMA now supports word size up to 273
- - 7-Zip now reduces dictionary size for LZMA, if you compress files
- smaller than specified dictionary size.
- - Some bugs were fixed
-
- - fix minor build trouble with MacOS X
- - fix "Bugs item #1349229" : 7-zip now displays "e: Extract files from archive (without using directory names)"
-
-Version 4.29
-============
-
- - fix "Bugs item #1305781" : "7z a -sfx" sets the execute-flag
- and does not add ".exe" extension.
-
- - fix "Bugs item #1306783" : "7za a /tmp/t.7z /etc/passwd"
-
- - fix "Bugs item #1304797" : @lists don't handle files starting with ./
-
- - fix "Bugs item #1309287" : man 7za fails after install
-
-Version 4.27
-============
- - From Windows version of 7-zip 4.27 :
- - new plugin for 7z : 7-Zip can unpack CHM/HXS (MS HTML HELP) archives
- - cab plugin for 7z : 7-Zip can unpack multivolume CAB archives
- - Some bugs were fixed
- - better support for 64bits (PPMD coder/decoder)
-
-Version 4.26
-============
- - From Windows version of 7-zip 4.26 :
- - new plugin for 7z : LZH format support (extracting only)
-
- - fix (courtesy from Robert Millan) to make p7zip compile on GNU/kFreeBSD.
-
- - fix "Bug item #1273057", now "7z -so -t7z a dummy.7z file >output.7z" does not
- finish with a "Segmentation fault (core dumped)".
-
- - fix "Bug item #1221056", now, makefile for p7zip use the flag "-O" to
- support compilers that build invalid programs with the flag "-O2".
-
-Version 4.25
-============
- - From Windows version of 7-zip 4.25 :
- - Some bugs were fixed
- - DOCS/MANUAL/exit_codes.htm added
-
- - new plugin for 7z : RAR format support (extracting only)
-
- - better dependencies in makefile
-
-Version 4.23
-============
- - From Windows version of 7-zip 4.23 :
- - Some bugs were fixed
-
- - manpages for 7za and 7z updated by Mohammed Adnene Trojette.
-
- - little fix for the help message of 7za or 7z.
-
- - bug #1224304 : Files and directories with \ in name not handled properly.
-
- - fix for tar archives that have pax header.
-
-Version 4.20
-============
-
- - From Windows version of 7-zip 4.19 and 4.20 :
- - BZip2 code was rewritten. Now it supports 3 modes: Normal, Maximum and
- Ultra. In Normal mode it compresses almost as original BZip2 compressor.
- Compression ratio in Maximum and Ultra modes is 1-3% better for some files,
- but Maximum Mode is about 3 times slower and Ultra Mode is about 8 times
- slower than Normal mode.
- - Console version now prints all messages to stdout by default,
- and if -so switch is specified, 7-Zip prints messages to stderr.
- - Some bugs were fixed
-
- - Updating "contrib/VirtualFileSystemForMidnightCommander/" with u7z-4.16beta.tar.bz2
-
- - bug #1204993 (does not find broken filenames)
-
- - bug #1201244 (Missing files in p7zip_4.18_x86_linux_bin.tar.bz2)
-
- - makefile.linux_x86_ppc_alpha : flag "-fPIC" added
-
- - flag "-l" added.
- without : p7zip stores symlinks (like p7zip 4.18)
- with "-l" : p7zip stores the files/directories pointed by symlinks (like before p7zip 4.18)
- CAUTION : the scanning stage can never end because of symlinks like ".."
- (ex: ln -s .. ldir)
-
-Version 4.18
-============
-
- - From Windows version of 7-zip 4.18 and 4.17 :
- - minor fixes
-
- - p7zip can now store and restore :
- - symbolic links,
- - file permission bits
- Remark : for directory, restored_perm = stored_perm | 0700 .
-
- - fix in install.sh
-
- - On MacOSX, p7zip now restore times of a file.
-
- - more detailed errors during scanning stage.
-
-
-Version 4.16
-============
-
- - From Windows version of 7-zip 4.16 :
- - Speed optimization (5%) for 7z / LZMA
- - 7za now supports .Z archives
- - -r- switch in command line now is default for all commands
- - Some bugs were fixed
- - bug #1119193 (list mode output confusing/wrong)
-
- - From Windows version of 7-zip 4.15 :
- - Z format supporting (extracting only)
- - 7-Zip now can extract ZIP archives compressed with "Shrink" method
- - 7-Zip now doesn't interrupt the compressing when it can not open file.
- 7-Zip just skips that file and shows warning.
- - Some bugs were fixed
-
- - man pages added (thank Mohammed Adnene Trojette)
- - bug #1112167 fixed (Temporary directory must be on same partition as target)
- p7zip failed moving the temporary file at the end of
- compressing to target file if the directories don't reside
- on the same partition (or network path).
- - bug #1164659 fixed (Invalid file date for "big endian" machine)
- - p7zip now uses ".so" instead of ".dll"
- - p7zip now handles "ctrl-c" and "kill" to cleanup temporary files before exiting
- - p7zip now runs on BeOS.
- - better support of filenames with spaces.
- - some code cleanup
- - "myWindows/myFiles.cpp" is now in "Windows/FileIO.cpp"
- - "myWindows/myFindFile.cpp" is now in "Windows/FileFind.cpp"
- - "myWindows/myDirectoryAndPath.cpp" is now in "Windows/FileDir.cpp"
- - "myWindows/myEvents.cpp" is now in "Windows/Synchronization.cpp"
- - "myWindows/wine_strings.cpp" is now in "Windows/String.cpp"
-
-
-Version 4.14.01
-===============
- - huge speed up for multi CPUs machines (Thanks to loderunner - http://sourceforge.net/users/loderunner/).
- - some code cleanup
- - Fix problems with link files or directories.
- - "7z a dummy -tgzip -so Doc.txt > archive.gz" now works.
- - in the messages, the path separator is now '/' instead of '\'.
-
-Version 4.14
-============
-
- - From Windows version of 7-zip 4.14 :
- - STL using was reduced
- - 7za now supports Split(001) archives
- - "7za | more" now works
- - Bugs item #1093095 : Usage banner now says "7za" (instead of "7z") when the binary is "7za"
-
- - use of AString instead of std::string (no more need of #include <string>")
- - makefile.linux_gcc_2.95_no_need_for_libstdc added to build 7za for the
- p7zip*_bin.tar.bz2 package.
- 7za provided by p7zip*_bin.tar.bz2 is build on Debian 3.0 with gcc 2.95.4
- and should now find the locale on all kinds of Linux (Debian, Fedora, Mandrake, ...).
-
-Version 4.13
-============
- - new port of 7za from the source of 7za 4.13Beta for Windows
-
- - From Windows version of 7-zip 4.13 :
- - Switch "--" stops switches parsing
- - Some bugs were fixed
- - User's manual updated (DOCS/MANUAL/index.htm)
-
- - makefile.netbsd_x86 added [Bug #1069055].
-
- - new method to install 7z and its plugins (the "link" method do no work)
-
- - installer added (install.sh).
-
- - makefile.macosx_with_fink becomes makefile.macosx
- and makefile.macosx uses c++ instead of CC
- (on some MacOSX, CC is a link to gcc instead of g++)
-
- - new flag "-utf16" to enable "utf16" conversion [Bug #1075229].
-
- - new logic to automatically enable or disable "utf16" conversion :
- no locale, locale=="C" or locale=="POSIX" implies utf16=off
- else utf16=on
- uses "-utf16" or "-no-utf16" to change this behaviour.
- [Bug #1075229]
-
- - 7z (compiled with -O2) works now on Sparc Solaris.
-
-Version 4.12
-============
- - new port of 7za from the source of 7za 4.12Beta for Windows
-
- - From Windows version of 7-zip 4.11 and 4.12 :
- - 7-Zip now supports Zip64 extension of ZIP format. So now it's
- possible to compress files bigger than 4 GB to ZIP archives.
- - Some bugs were fixed
-
- - fix "7za a archive.7z file" that added all the files and directories
- with filename "file", "FILE", "File" ...
-
- - p7zip now displays the locale (ex : en_US.UTF-8) in the banner.
-
- - new flag "-no-utf16" to avoid lossly conversion in filenames.
- CAUTION : use this flag when you do not plan to export your archive.
-
- - support creation of self extracting archive.
-
- - better support of symbolic link (now, an invalid symbolic link
- do not stop archiving but displays a warning).
-
- - better support of files that the user cannot read.
- (now this kind of file is not added to the archive, and p7zip displays a warning).
-
- - return of 7z and its plugins.
-
- - support of listing/testing/extracting files from a splitted archive (only with 7z).
-
- - support of MacOX X 10.X.
-
- - creation of Gzip/Tar archives didn't work on Linux Alpha.
-
- - see "contrib/VirtualFileSystemForMidnightCommander/readme" to use 7za with "mc".
-
-Version 4.10
-============
- - new port of 7za from the source of 7za 4.10Beta for Windows
- => p7zip now work on big endian CPU.
-
- - 7z for Unix is not maintain anymore (because as the source of unrar plugin for 7z
- is not available, 7z is unless on Unix).
-
-Version 0.91
-============
- - add support for FreeBSD 5.2.1
- In Windows/Time.h add "#include <time.h>"
- and prototype change for FileTimeToUnixTime()
-
- - bug 990684 Corrected : support of filesystem
- that support case sensitive filenames.
- Example, since version 0.91 :
- "7z a glibc -r glibc-2.3.2"
- does not terminate with error :
- Duplicate filename:
- glibc-2.3.2\sysdeps\m88k\m88100\add_n.S
- glibc-2.3.2\sysdeps\m88k\m88100\add_n.s
-
-Version 0.90
-============
- - build of 7z.exe and its DLL.
- 7z.exe support more archive formats than 7za.exe
- thanks to DLL in Formats and Codecs directories
- - "#pragma once" is now in comments
- - mainly For OpenBSD :
- - add #include <wchar.h> in include_windows/winnt.h
- - remove stuff for GUID_SECTION and GUID_SECT in include_windows/basetyps.h
- and include_windows/initguid.h
- - some changes in 7zip/Crypto/aesopt.h because of endian.h
-
-Version 0.81
-============
- - add a copy of the help of 7-zip (see html directory)
- - "7z a -r tmp.7z directory" works as expected.
- no more need for commands like : 7z a -r tmp.7z "directory/*"
- - 7z restores the date of each files (but not directories)
- - 7z supports UNICODE filenames (version 0.80 supports only ASCII/Latin1 filenames)
- - support of gcc 2.95
- - support of gcc 3.4
- - 7z needs no more libgen.h (dirname() and basename())
- - less "Internal Error #7" during arguments parsing
- - minor change in class CThread
-
-Version 0.80
-============
- - First public release
- - support of gcc 3.2 and 3.3
-
diff --git a/src/libs/7zip/unix/DOCS/License.txt b/src/libs/7zip/unix/DOCS/License.txt
deleted file mode 100644
index a6a721853..000000000
--- a/src/libs/7zip/unix/DOCS/License.txt
+++ /dev/null
@@ -1,52 +0,0 @@
- 7-Zip source code
- ~~~~~~~~~~~~~~~~~
- License for use and distribution
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- 7-Zip Copyright (C) 1999-2010 Igor Pavlov.
-
- Licenses for files are:
-
- 1) CPP/7zip/Compress/Rar* files: GNU LGPL + unRAR restriction
- 2) All other files: GNU LGPL
-
- The GNU LGPL + unRAR restriction means that you must follow both
- GNU LGPL rules and unRAR restriction rules.
-
-
- 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.
-
-
- --
- Igor Pavlov
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/commands/add.htm b/src/libs/7zip/unix/DOCS/MANUAL/commands/add.htm
deleted file mode 100644
index 7bc5ea22f..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/commands/add.htm
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>a (Add) command</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>a (Add) command</H1>
-
-<P>Adds files to archive.</P>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z a archive1.zip subdir\
-</PRE>
-
-<P>adds all files and subfolders from folder <SPAN class="filename">subdir</SPAN> to archive
- <SPAN class="filename">archive1.zip</SPAN>.
- The filenames in archive will contain <SPAN class="filename">subdir\</SPAN> prefix.</P>
-
-<PRE class="example">
-7z a archive2.zip .\subdir\*
-</PRE>
-
-<P>adds all files and subfolders from folder <SPAN class="filename">subdir</SPAN> to archive
- <SPAN class="filename">archive2.zip</SPAN>.
- The filenames in archive will not contain <SPAN class="filename">subdir\</SPAN> prefix.</P>
-
-
-<PRE class="example">
-cd /D c:\dir1\
-7z a c:\archive3.zip dir2\dir3\
-</PRE>
-
-The filenames in archive <SPAN class="filename">c:\archive3.zip</SPAN>
-will contain <SPAN class="filename">dir2\dir3\</SPAN> prefix,
-but they will not contain <SPAN class="filename">c:\dir1\</SPAN> prefix.
-
-<PRE class="example">
-7z a Files.7z *.txt -r
-</PRE>
-
-<P>adds all *.txt files from current folder and its subfolders to archive
- <SPAN class="filename">Files.7z</SPAN>.</P>
-
-
-<H4>Notes</H4>
-
-<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't
-follow the archaic rule by which *.* means any file. 7-Zip treats
-*.* as matching the name of any file that has an extension. To process
-all files, you must use a * wildcard.</P>
-
-
-<H4>Switches that can be used with this command</H4>
-
-<P>
- <A href="../switches/include.htm">-i (Include)</A><BR>
- <A href="../switches/method.htm">-m (Method)</A><BR>
- <A href="../switches/password.htm">-p (Set Password)</A><BR>
- <A href="../switches/recurse.htm">-r (Recurse)</A><BR>
- <A href="../switches/sfx.htm">-sfx (create SFX)</A><BR>
- <A href="../switches/stdin.htm">-si (use StdIn)</A><BR>
- <A href="../switches/stdout.htm">-so (use StdOut)</A><BR>
- <A href="../switches/type.htm">-t (Type of archive)</A><BR>
- <A href="../switches/update.htm">-u (Update)</A><BR>
- <A href="../switches/volume.htm">-v (Volumes)</A><BR>
- <A href="../switches/working_dir.htm">-w (Working Dir)</A><BR>
- <A href="../switches/exclude.htm">-x (Exclude)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Commands:</B>
- <A href="delete.htm">d (Delete)</A>,
- <A href="update.htm">u (Update)</A><BR>
- <B>Switches:</B>
- <A href="../switches/update.htm">-u (Update)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/commands/bench.htm b/src/libs/7zip/unix/DOCS/MANUAL/commands/bench.htm
deleted file mode 100644
index 14f456cd3..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/commands/bench.htm
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>b (Benchmark) command</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>b (Benchmark) command</H1>
-
-<P>Measures speed of the CPU and checks RAM for errors.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
-b [number_of_iterations] [-mmt{N}] [-md{N}] [-mm={Method}]
-</PRE>
-
-<P>There are two tests:<P>
-<OL>
- <LI>Compressing with LZMA method
- <LI>Decompressing with LZMA method
-</OL>
-
-<P>The benchmark shows a rating in MIPS (million instructions per second).
-The rating value is calculated from the measured CPU speed and it
-is normalized with results of Intel Core 2 CPU with multi-threading option
-switched off. So if you have Intel Core 2 Duo,
-rating values must be close to real CPU frequency.</P>
-
-<P>You can change the upper dictionary size to increase memory usage by -md{N} switch.
-Also, you can change the number of threads by -mmt{N} switch.</P>
-
-<P>The <B>Dict</B> column shows dictionary size. For example, 21 means 2^21 = 2 MB.</P>
-
-<P>The <B>Usage</B> column shows the percentage of time the processor is working.
-It's normalized for a one-thread load. For example, 180% CPU Usage for 2 threads
-can mean that average CPU usage is about 90% for each thread.</P>
-
-<P>The <B>R / U</B> column shows the rating normalized for 100% of CPU usage.
-That column shows the performance of one average CPU thread.</P>
-
-<P><B>Avr</B> shows averages for different dictionary sizes.</P>
-<P><B>Tot</B> shows averages of the compression and decompression ratings.</P>
-
-<P>Compression speed and rating strongly depend on memory (RAM) latency.
-
-<P>Decompression speed and rating strongly depend on the integer performance of the CPU.
-For example, the Intel Pentium 4 has big branch
-misprediction penalty (which is an effect of its long pipeline) and pretty slow
-multiply and shift operations. So, the Pentium 4 has pretty low decompressing ratings.</P>
-
-<P>You can run a CRC calculation benchmark by specifying -mm=crc.
-That test shows the speed of CRC calculation in MB/s. The first column shows the size of the block.
-The next column shows the speed of CRC calculation for one thread. The other columns are results
-for multi-threaded CRC calculation.</P>
-
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z b
-</PRE>
-runs benchmarking.
-
-<PRE class="example">
-7z b -mmt1 -md26
-</PRE>
-runs benchmarking with one thread and 64 MB dictionary.
-
-<PRE class="example">
-7z b 30
-</PRE>
-<P>runs benchmarking with default settings for 30 iterations.</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/commands/delete.htm b/src/libs/7zip/unix/DOCS/MANUAL/commands/delete.htm
deleted file mode 100644
index 845b8d899..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/commands/delete.htm
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>d (Delete) command</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>d (Delete) command</H1>
-
-<P>Deletes files from archive.</P>
-
-<H4>Example</H4>
-
-<PRE class="example">
-7z d archive.zip *.bak -r
-</PRE>
-
-<P>deletes <SPAN class="filename">*.bak</SPAN> files from archive
- <SPAN class="filename">archive.zip</SPAN>.</P>
-
-
-<H4>Notes</H4>
-
-<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't
-follow the archaic rule by which *.* means any file. 7-Zip treats
-*.* as matching the name of any file that has an extension. To process
-all files, you must use a * wildcard.</P>
-
-
-<H4>Switches that can be used with this command</H4>
-
-<P>
- <A href="../switches/include.htm">-i (Include)</A><BR>
- <A href="../switches/method.htm">-m (Method)</A><BR>
- <A href="../switches/password.htm">-p (Set Password)</A><BR>
- <A href="../switches/recurse.htm">-r (Recurse)</A><BR>
- <A href="../switches/update.htm">-u (Update)</A><BR>
- <A href="../switches/working_dir.htm">-w (Working Dir)</A><BR>
- <A href="../switches/exclude.htm">-x (Exclude)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Commands:</B>
- <A href="add.htm">a (Add)</A>,
- <A href="update.htm">u (Update)</A>
-</P>
-
-<P>
- <B>Switches:</B>
- <A href="../switches/update.htm">-u (Update)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/commands/extract.htm b/src/libs/7zip/unix/DOCS/MANUAL/commands/extract.htm
deleted file mode 100644
index dad6b2b0b..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/commands/extract.htm
+++ /dev/null
@@ -1,91 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>e (Extract) command</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>e (Extract) command</H1>
-
-<P>Extracts files from an archive to the current
-directory or to the output directory. The output directory can be specified by
-<A href="../switches/output_dir.htm">-o (Set Output Directory)</A> switch.</P>
-
-<P>This command copies all extracted files to one directory.
-If you want extract files with full paths, you must use
-<A href="extract_full.htm">x (Extract with full paths)</A> command.
-
-<P>7-Zip will prompt the user before overwriting existing files unless
-the user specifies the <A href="../switches/yes.htm">-y (Assume Yes on all queries)</A>
-switch. If the user gives a <B>no</B> answer, 7-Zip will prompt for the file to be
-extracted to a new filename. Then a <B>no</B> answer skips that file; or, <B>yes</B>
-prompts for new filename.</P>
-
-<P>7-Zip accepts the following responses:</P>
-
-<TABLE>
- <TR> <TH>Answer</TH> <TH>Abbr.</TH> <TH>Action</TH> </TR>
- <TR> <TD>Yes</TD> <TD>y</TD> <TD>&nbsp;</TD> </TR>
- <TR> <TD>No</TD> <TD>n</TD> <TD>&nbsp;</TD> </TR>
- <TR> <TD>Always</TD> <TD>a</TD> <TD>Assume YES for ALL subsequent queries of the same class</TD> </TR>
- <TR> <TD>Skip</TD> <TD>s</TD> <TD>Assume NO for ALL subsequent queries of the same class</TD> </TR>
- <TR> <TD>Quit</TD> <TD>q</TD> <TD>Quit the program</TD> </TR>
-
-</TABLE>
-
-<P>Abbreviated responses are allowed.</P>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z e archive.zip
-</PRE>
-
-<P>extracts all files from archive
- <SPAN class="filename">archive.zip</SPAN> to the current directory.</P>
-
-<PRE class="example">
-7z e archive.zip -oc:\soft *.cpp -r
-</PRE>
-
-<P>extracts all <SPAN class="filename">*.cpp</SPAN> files from archive
- <SPAN class="filename">archive.zip</SPAN> to <SPAN class="filename">c:\soft</SPAN> folder.</P>
-
-
-<H4>Notes</H4>
-
-<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't
-follow the archaic rule by which *.* means any file. 7-Zip treats
-*.* as matching the name of any file that has an extension. To process
-all files, you must use a * wildcard.</P>
-
-
-<H4>Switches that can be used with this command</H4>
-
-<P>
- <A href="../switches/ar_include.htm">-ai (Include archives)</A><BR>
- <A href="../switches/ar_no.htm">-an (Disable parsing of archive_name)</A><BR>
- <A href="../switches/overwrite.htm">-ao (Overwrite mode)</A><BR>
- <A href="../switches/ar_exclude.htm">-ax (Exclude archives)</A><BR>
- <A href="../switches/include.htm">-i (Include)</A><BR>
- <A href="../switches/output_dir.htm">-o (Set Output Directory)</A><BR>
- <A href="../switches/password.htm">-p (Set Password)</A><BR>
- <A href="../switches/recurse.htm">-r (Recurse)</A><BR>
- <A href="../switches/stdout.htm">-so (use StdOut)</A><BR>
- <A href="../switches/type.htm">-t (Type of archive)</A><BR>
- <A href="../switches/exclude.htm">-x (Exclude)</A><BR>
- <A href="../switches/yes.htm">-y (Assume Yes on all queries)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Commands:</B>
- <A href="extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/commands/extract_full.htm b/src/libs/7zip/unix/DOCS/MANUAL/commands/extract_full.htm
deleted file mode 100644
index 3f857a6e4..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/commands/extract_full.htm
+++ /dev/null
@@ -1,68 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>x (Extract with full paths) command</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>x (Extract with full paths) command</H1>
-
-<P>Extracts files from an archive with their full
-paths in the current directory, or in an output directory if specified.</P>
-
-<P>See the <A href="extract.htm">e (Extract)</A> command description for more details.</P>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z x archive.zip
-</PRE>
-
-<P>extracts all files from the archive
- <SPAN class="filename">archive.zip</SPAN> to the current directory.</P>
-
-<PRE class="example">
-7z x archive.zip -oc:\soft *.cpp -r
-</PRE>
-
-<P>extracts all <SPAN class="filename">*.cpp</SPAN> files from the archive
- <SPAN class="filename">archive.zip</SPAN> to <SPAN class="filename">c:\soft</SPAN> folder.</P>
-
-
-<H4>Notes</H4>
-
-<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't
-follow the archaic rule by which *.* means any file. 7-Zip treats
-*.* as matching the name of any file that has an extension. To process
-all files, you must use a * wildcard.</P>
-
-
-<H4>Switches that can be used with this command</H4>
-
-<P>
- <A href="../switches/ar_include.htm">-ai (Include archives)</A><BR>
- <A href="../switches/ar_no.htm">-an (Disable parsing of archive_name)</A><BR>
- <A href="../switches/overwrite.htm">-ao (Overwrite mode)</A><BR>
- <A href="../switches/ar_exclude.htm">-ax (Exclude archives)</A><BR>
- <A href="../switches/include.htm">-i (Include)</A><BR>
- <A href="../switches/output_dir.htm">-o (Set Output Directory)</A><BR>
- <A href="../switches/password.htm">-p (Set Password)</A><BR>
- <A href="../switches/recurse.htm">-r (Recurse)</A><BR>
- <A href="../switches/stdout.htm">-so (use StdOut)</A><BR>
- <A href="../switches/type.htm">-t (Type of archive)</A><BR>
- <A href="../switches/exclude.htm">-x (Exclude)</A><BR>
- <A href="../switches/yes.htm">-y (Assume Yes on all queries)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Commands:</B>
- <A href="extract.htm">e (Extract)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/commands/index.htm b/src/libs/7zip/unix/DOCS/MANUAL/commands/index.htm
deleted file mode 100644
index 579ea2931..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/commands/index.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>Command Line Commands</TITLE>
- <LINK href="style.css" rel=stylesheet type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>Command Line Commands</H1>
-
-<P>The command is the first non-switch argument on the command line.</P>
-<P>Command names are not case sensitive.</P>
-<P>See also <A href ="../syntax.htm">Command Line Syntax</A> for more details about using the command line.</P>
-
-<H2>Commands quick reference</H2>
-
-<TABLE border="1" cellpadding="3" cellspacing="0">
-<TR><TH>Command</TH><TH>Description</TH></TR>
-<TR> <TD><A href="add.htm">a</A></TD> <TD><A href="add.htm">Add</A></TD></TR>
-<TR> <TD><A href="bench.htm">b</A></TD> <TD><A href="bench.htm">Benchmark</A></TD></TR>
-<TR> <TD><A href="delete.htm">d</A></TD> <TD><A href="delete.htm">Delete</A></TD></TR>
-<TR> <TD><A href="extract.htm">e</A></TD> <TD><A href="extract.htm">Extract</A></TD></TR>
-<TR> <TD><A href="list.htm">l</A></TD> <TD><A href="list.htm">List</A></TD></TR>
-<TR> <TD><A href="test.htm">t</A></TD> <TD><A href="test.htm">Test</A></TD></TR>
-<TR> <TD><A href="update.htm">u</A></TD> <TD><A href="update.htm">Update</A></TD></TR>
-<TR> <TD><A href="extract_full.htm">x</A></TD> <TD><A href="extract_full.htm">eXtract with full paths</A></TD></TR>
-</TABLE>
-
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/commands/list.htm b/src/libs/7zip/unix/DOCS/MANUAL/commands/list.htm
deleted file mode 100644
index 1eba758e9..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/commands/list.htm
+++ /dev/null
@@ -1,77 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>l (List contents of archive) command</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>l (List contents of archive) command</H1>
-
-
-
-<!--
-<H4>Syntax</H4>
-<P><PRE class="syntax">
-l[a | t][f]
-</PRE></P>
-
--->
-
-<P>Lists contents of archive.</P>
-
-<!--
-<P>The following options can be used:</P>
-<TABLE>
-<TR> <TH>Option</TH> <TH>Description</TH> </TR>
-<TR> <TD>a</TD> <TD>List with Additional fields</TD> </TR>
-<TR> <TD>t</TD> <TD>List with all fields, including Technical</TD> </TR>
-<TR> <TD>f</TD> <TD>List with Full pathnames</TD> </TR>
-</TABLE>
--->
-
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z l archive.zip
-</PRE>
-
-<P>lists all files from archive <SPAN class="filename">archive.zip</SPAN>.</P>
-
-<!--
-<PRE class="example">
-7z lf archive.zip *.txt
-</PRE>
-
-<P>lists <SPAN class="filename">*.txt</SPAN> files from archive
- <SPAN class="filename">archive.zip</SPAN> with full pathnames.</P>
--->
-
-
-<H4>Notes</H4>
-
-<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't
-follow the archaic rule by which *.* means any file. 7-Zip treats
-*.* as matching the name of any file that has an extension. To process
-all files, you must use a * wildcard.</P>
-
-
-<H4>Switches that can be used with this command</H4>
-
-<P>
- <A href="../switches/ar_include.htm">-ai (Include archives)</A><BR>
- <A href="../switches/ar_no.htm">-an (Disable parsing of archive_name)</A><BR>
- <A href="../switches/ar_exclude.htm">-ax (Exclude archives)</A><BR>
- <A href="../switches/include.htm">-i (Include)</A><BR>
- <A href="../switches/list_tech.htm">-slt (Show technical information)</A><BR>
- <A href="../switches/password.htm">-p (Set Password)</A><BR>
- <A href="../switches/recurse.htm">-r (Recurse)</A><BR>
- <A href="../switches/type.htm">-t (Type of archive)</A><BR>
- <A href="../switches/exclude.htm">-x (Exclude)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/commands/style.css b/src/libs/7zip/unix/DOCS/MANUAL/commands/style.css
deleted file mode 100644
index 13ebb79ce..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/commands/style.css
+++ /dev/null
@@ -1,232 +0,0 @@
-body
- {
- padding: 0px 0px 0px 26px;
- background: #ffffff;
- color: #000000;
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 80%;
- }
-
-div
- {
- width: 90%;
- border: 2px solid #999999;
- padding: 4px 8px;
- background: #cccccc;
- }
-
-h1, h2, h3, h4
- {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- margin-left: -26px;
- }
-
-h1
- {
- font-size: 145%;
- margin-top: .5em;
- margin-bottom: 1em;
- }
-
-h2
- {
- font-size: 130%;
- margin-top: 1.5em;
- margin-bottom: .6em;
- }
-
-h3
- {
- font-size: 115%;
- margin-top: 1.5em;
- margin-bottom: .6em;
- }
-
-h4
- {
- font-size: 100%;
- margin-top: 1.5em;
- margin-bottom: .6em;
- }
-
-ul p, ol p, dl p
- {
- margin-left: 0em;
- }
-
-p
- {
- margin-top: .6em;
- margin-bottom: .6em;
- }
-
-dl
- {
- /*margin-top: 0em; */
- }
-
-dt
- {
- margin-top: .76em;
- margin-bottom: .5em;
- font-weight: bold;
- }
-
-dd
- {
- margin-top: .5em;
- margin-bottom: .5em;
- margin-left: 1.9em;
- }
-
-
-ul, ol
- {
- margin-top: .6em;
- margin-bottom: 0em;
- }
-
-ol
- {
- margin-left: 3.6em;
- }
-
-ul
- {
- list-style-type: disc;
- margin-left: 1.9em;
- }
-
-li
- {
- margin-bottom: .6em;
- }
-
-ul ol, ol ol
- {
- list-style-type: lower-alpha;
- {
-
- /*
-pre
- {
- margin-top: .6em;
- margin-bottom: .6em;
- }
- */
-
-pre,code
- {
- font: 100% Courier New, Courier, mono;
- color: #000000;
- cursor: text;
- }
-
-pre.syntax
- {
- background: #dddddd;
- padding: 2pt,4pt
- }
-
-pre.syntax
- {
- color: #000000;
- }
-
-pre.example
- {
- margin-left: 2.0em;
- /*margin-top: 12.0em;*/
- /*margin-bottom: 1.0em;*/
- color: #C00000;
- /*padding: 10pt,20pt*/
- }
-
-table
- {
- /* width: 90%; */
- background: #999999;
- margin-top: .6em;
- margin-bottom: .3em;
- }
-
-th
- {
- padding: 4px 8px;
- background: #cccccc;
- text-align: left;
- font-size: 80%;
- vertical-align: bottom;
- }
-
-th.cc
- {
- text-align: center;
- vertical-align: middle;
- }
-
-td
- {
- padding: 4px 8px;
- background: #ffffff;
- vertical-align: top;
- font-size: 80%;
- }
-
-td.cc
- {
- text-align: center;
- vertical-align: middle;
- }
-
-
-blockquote
- {
- margin-left: 3.8em;
- margin-right: 3.8em;
- margin-top: .6em;
- margin-bottom: .6em;
- }
-
-a:link
- {
- color: #0066ff;
- }
-
-a:visited
- {
- color: #996600;
- }
-
-a:hover
- {
- color: #cc9900;
- }
-
-a.parameter:link
- {
- color: #0066ff;
- text-decoration:none;
- }
-
-a.parameter:visited
- {
- text-decoration:none;
- }
-
-div.footer
- {
- width: 100%;
- border: none;
- background: #ffffff;
- margin-top: 18pt;
- padding-bottom: 12pt;
- color: #228B22;
- text-align: center;
- font-size: 70%;
- }
-
-span.filename
-{
- color: #F00000;
-}
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/commands/test.htm b/src/libs/7zip/unix/DOCS/MANUAL/commands/test.htm
deleted file mode 100644
index b09f8a497..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/commands/test.htm
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>t (Test integrity of archive) command</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>t (Test integrity of archive) command</H1>
-
-<P>Tests archive files.</P>
-
-<H4>Example</H4>
-
-<PRE class="example">
-7z t archive.zip *.doc -r
-</PRE>
-
-<P>tests <SPAN class="filename">*.doc</SPAN> files in archive
- <SPAN class="filename">archive.zip</SPAN>.</P>
-
-
-<H4>Notes</H4>
-
-<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't
-follow the archaic rule by which *.* means any file. 7-Zip treats
-*.* as matching the name of any file that has an extension. To process
-all files, you must use a * wildcard.</P>
-
-
-<H4>Switches that can be used with this command</H4>
-
-<P>
- <A href="../switches/ar_include.htm">-ai (Include archives)</A><BR>
- <A href="../switches/ar_no.htm">-an (Disable parsing of archive_name)</A><BR>
- <A href="../switches/ar_exclude.htm">-ax (Exclude archives)</A><BR>
- <A href="../switches/include.htm">-i (Include)</A><BR>
- <A href="../switches/password.htm">-p (Set Password)</A><BR>
- <A href="../switches/recurse.htm">-r (Recurse)</A><BR>
- <A href="../switches/exclude.htm">-x (Exclude)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/commands/update.htm b/src/libs/7zip/unix/DOCS/MANUAL/commands/update.htm
deleted file mode 100644
index 860080109..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/commands/update.htm
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>u (Update) command</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>u (Update) command</H1>
-
-<P>Update older files in the archive and add files that are not already in the archive.</P>
-
-<P>Note: the updating of solid .7z archives can be slow, since it
-can require some recompression.</P>
-
-<H4>Example</H4>
-
-<PRE class="example">
-7z u archive.zip *.doc
-</PRE>
-
-<P>updates <SPAN class="filename">*.doc</SPAN> files to archive
- <SPAN class="filename">archive.zip</SPAN>.</P>
-
-
-<H4>Notes</H4>
-
-<P>7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't
-follow the archaic rule by which *.* means any file. 7-Zip treats
-*.* as matching the name of any file that has an extension. To process
-all files, you must use a * wildcard.</P>
-
-
-<H4>Switches that can be used with this command</H4>
-
-<P>
- <A href="../switches/include.htm">-i (Include)</A><BR>
- <A href="../switches/method.htm">-m (Method)</A><BR>
- <A href="../switches/password.htm">-p (Set Password)</A><BR>
- <A href="../switches/recurse.htm">-r (Recurse)</A><BR>
- <A href="../switches/sfx.htm">-sfx (create SFX)</A><BR>
- <A href="../switches/stdin.htm">-si (use StdIn)</A><BR>
- <A href="../switches/stdout.htm">-so (use StdOut)</A><BR>
- <A href="../switches/type.htm">-t (Type of archive)</A><BR>
- <A href="../switches/update.htm">-u (Update)</A><BR>
- <A href="../switches/working_dir.htm">-w (Working Dir)</A><BR>
- <A href="../switches/exclude.htm">-x (Exclude)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Commands:</B>
- <A href="add.htm">a (Add)</A>,
- <A href="delete.htm">d (Delete)</A>,
-</P>
-
-<P>
- <B>Switches:</B>
- <A href="../switches/update.htm">-u (Update)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/exit_codes.htm b/src/libs/7zip/unix/DOCS/MANUAL/exit_codes.htm
deleted file mode 100644
index 4cdc74a5b..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/exit_codes.htm
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>Exit Codes from 7-Zip</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>Exit Codes from 7-Zip</H1>
-
-<P>7-Zip returns the following exit codes:</P>
-
-<TABLE>
- <TR><TH>Code</TH><TH>Meaning</TH></TR>
- <TR><TD>0</TH><TD>No error</TD></TR>
- <TR><TD>1</TH><TD>Warning (Non fatal error(s)). For example, one or more files were
- locked by some other application, so they were not compressed.</TD></TR>
- <TR><TD>2</TH><TD>Fatal error</TD></TR>
- <TR><TD>7</TH><TD>Command line error</TD></TR>
- <TR><TD>8</TH><TD>Not enough memory for operation</TD></TR>
- <TR><TD>255</TH><TD>User stopped the process</TD></TR>
-</TABLE>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/index.htm b/src/libs/7zip/unix/DOCS/MANUAL/index.htm
deleted file mode 100644
index 5bf8aae61..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/index.htm
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>Command Line Version User's Guide</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>Command Line Version User's Guide</H1>
-
-
-<P>7z.exe is the command line version of 7-Zip. 7z.exe uses 7z.dll
-from the 7-Zip package. 7z.dll is used by the 7-Zip File Manager also.</LI>
-
-<P>7za.exe (a = alone) is a standalone version of 7-Zip.
-7za.exe supports only 7z, lzma, cab, zip, gzip, bzip2, Z and tar formats.
-7za.exe doesn't use external modules.</LI>
-
-<UL>
- <LI><A href = "syntax.htm">Command Line syntax</A></LI>
- <LI><A href = "exit_codes.htm">Exit Codes</A></LI>
- <LI><A href = "commands/index.htm">Commands</A></LI>
- <LI><A href = "switches/index.htm">Switches</A></LI>
-</UL>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/style.css b/src/libs/7zip/unix/DOCS/MANUAL/style.css
deleted file mode 100644
index 13ebb79ce..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/style.css
+++ /dev/null
@@ -1,232 +0,0 @@
-body
- {
- padding: 0px 0px 0px 26px;
- background: #ffffff;
- color: #000000;
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 80%;
- }
-
-div
- {
- width: 90%;
- border: 2px solid #999999;
- padding: 4px 8px;
- background: #cccccc;
- }
-
-h1, h2, h3, h4
- {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- margin-left: -26px;
- }
-
-h1
- {
- font-size: 145%;
- margin-top: .5em;
- margin-bottom: 1em;
- }
-
-h2
- {
- font-size: 130%;
- margin-top: 1.5em;
- margin-bottom: .6em;
- }
-
-h3
- {
- font-size: 115%;
- margin-top: 1.5em;
- margin-bottom: .6em;
- }
-
-h4
- {
- font-size: 100%;
- margin-top: 1.5em;
- margin-bottom: .6em;
- }
-
-ul p, ol p, dl p
- {
- margin-left: 0em;
- }
-
-p
- {
- margin-top: .6em;
- margin-bottom: .6em;
- }
-
-dl
- {
- /*margin-top: 0em; */
- }
-
-dt
- {
- margin-top: .76em;
- margin-bottom: .5em;
- font-weight: bold;
- }
-
-dd
- {
- margin-top: .5em;
- margin-bottom: .5em;
- margin-left: 1.9em;
- }
-
-
-ul, ol
- {
- margin-top: .6em;
- margin-bottom: 0em;
- }
-
-ol
- {
- margin-left: 3.6em;
- }
-
-ul
- {
- list-style-type: disc;
- margin-left: 1.9em;
- }
-
-li
- {
- margin-bottom: .6em;
- }
-
-ul ol, ol ol
- {
- list-style-type: lower-alpha;
- {
-
- /*
-pre
- {
- margin-top: .6em;
- margin-bottom: .6em;
- }
- */
-
-pre,code
- {
- font: 100% Courier New, Courier, mono;
- color: #000000;
- cursor: text;
- }
-
-pre.syntax
- {
- background: #dddddd;
- padding: 2pt,4pt
- }
-
-pre.syntax
- {
- color: #000000;
- }
-
-pre.example
- {
- margin-left: 2.0em;
- /*margin-top: 12.0em;*/
- /*margin-bottom: 1.0em;*/
- color: #C00000;
- /*padding: 10pt,20pt*/
- }
-
-table
- {
- /* width: 90%; */
- background: #999999;
- margin-top: .6em;
- margin-bottom: .3em;
- }
-
-th
- {
- padding: 4px 8px;
- background: #cccccc;
- text-align: left;
- font-size: 80%;
- vertical-align: bottom;
- }
-
-th.cc
- {
- text-align: center;
- vertical-align: middle;
- }
-
-td
- {
- padding: 4px 8px;
- background: #ffffff;
- vertical-align: top;
- font-size: 80%;
- }
-
-td.cc
- {
- text-align: center;
- vertical-align: middle;
- }
-
-
-blockquote
- {
- margin-left: 3.8em;
- margin-right: 3.8em;
- margin-top: .6em;
- margin-bottom: .6em;
- }
-
-a:link
- {
- color: #0066ff;
- }
-
-a:visited
- {
- color: #996600;
- }
-
-a:hover
- {
- color: #cc9900;
- }
-
-a.parameter:link
- {
- color: #0066ff;
- text-decoration:none;
- }
-
-a.parameter:visited
- {
- text-decoration:none;
- }
-
-div.footer
- {
- width: 100%;
- border: none;
- background: #ffffff;
- margin-top: 18pt;
- padding-bottom: 12pt;
- color: #228B22;
- text-align: center;
- font-size: 70%;
- }
-
-span.filename
-{
- color: #F00000;
-}
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/ar_exclude.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/ar_exclude.htm
deleted file mode 100644
index 697891880..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/ar_exclude.htm
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-ax (Exclude archive filenames) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-ax (Exclude archive filenames) switch</H1>
-
-<P>Specifies archives to be excluded from the operation.</P>
-<P>Multiple exclude archive switches are supported.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--ax[&lt;recurse_type>]&lt;file_ref>
-
-&lt;recurse_type> ::= r[- | 0]
-&lt;file_ref> ::= @{listfile} | !{wildcard}
-</PRE>
-
-<P>See <A href="include.htm">-xi (Include archive filenames)</A> switch description
-for information about option parameters.</P>
-
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z t -an -ai!*.7z -ax!a*.7z
-</PRE>
-
-<P>tests all <SPAN class="filename">*.7z</SPAN> archives,
- except <SPAN class="filename">a*.7z</SPAN> archives.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/list.htm">l (List)</A>,
- <A href="../commands/test.htm">t (Test)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Switches:</B>
- <A href="include.htm">-ai (Include archives)</A>
- <A href="ar_no.htm">-an (Disable parsing of archive_name)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/ar_include.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/ar_include.htm
deleted file mode 100644
index 30a5a9b69..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/ar_include.htm
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-ai (Include archive filenames) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-ai (Include archive filenames) switch</H1>
-
-<P>Specifies additional include archive filenames and wildcards.</P>
-<P>Multiple include switches are supported.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--ai[<A class="parameter" href="#recurse_type">&lt;recurse_type></A>]<A class="parameter" href="#file_ref">&lt;file_ref></A>
-
-<A class="parameter" href="#recurse_type">&lt;recurse_type></A> ::= r[- | 0]
-<A class="parameter" href="#file_ref">&lt;file_ref></A> ::= @{listfile} | !{wildcard}
-</PRE>
-
-<H4>Parameters</H4>
-
-<DL>
- <DT><A name="recurse_type"></A>&lt;recurse_type></DT>
- <DD><P>Specifies how wildcards and file names in this switch must
- be used. If this option is not given, recursion will be not used.
- For more details see specification of the
- <A href="recurse.htm">-r (Recurse)</A> switch.</P>
-<PRE class="syntax">
-&lt;recurse_type> ::= r[- | 0]
-</PRE>
-
- </DD>
- <DT><A name="file_ref"></A>&lt;file_ref></DT>
- <DD>
- <P>Specifies filenames and wildcards or list file that specify processed files.</P>
-<PRE class="syntax">
-&lt;file_ref> ::= @{listfile} | !{wildcard}
-</PRE>
- <TABLE>
- <TR> <TH width="120">Option</TH> <TH>Description</TH> </TR>
- <TR> <TD>{listfile}</TD> <TD>Specifies name of list file. See
- <A href = ../syntax.htm#ListFile>List file</A> description.</TD> </TR>
- <TR> <TD>{wildcard}</TD> <TD>Specifies wildcard or filename.</TD> </TR>
- </TABLE>
- </DD>
-</DL>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z t -an -air!*.7z
-</PRE>
-
-<P>tests <SPAN class="filename">*.7z</SPAN> archives in current directory and all it's
-subdirectories.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/list.htm">l (List)</A>,
- <A href="../commands/test.htm">t (Test)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Switches:</B>
- <A href="ar_exclude.htm">-ax (Exclude archives)</A>
- <A href="ar_no.htm">-an (Disable parsing of archive_name)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/ar_no.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/ar_no.htm
deleted file mode 100644
index d925f13d3..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/ar_no.htm
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-an (Disable parsing of archive_name) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-an (Disable parsing of archive_name) switch</H1>
-
-<P>Disables parsing of the archive_name field on the command line.
-This switch must be used with the
-<A href="include.htm">-ai (Include archives) switch</A>.
-If you use a file list for your archives, you specify it with the -ai switch,
-so you need to disable parsing of archive_name field from command line.
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--an
-</PRE>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z t -an -ai!*.7z -ax!a*.7z
-</PRE>
-
-<P>tests all <SPAN class="filename">*.7z</SPAN> archives,
- except <SPAN class="filename">a*.7z</SPAN> archives.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/list.htm">l (List)</A>,
- <A href="../commands/test.htm">t (Test)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Switches:</B>
- <A href="include.htm">-ai (Include archives)</A>
- <A href="exclude.htm">-ax (Exclude archives)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/charset.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/charset.htm
deleted file mode 100644
index e30802652..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/charset.htm
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-scs (Set charset for list files) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-scs (Set charset for list files) switch</H1>
-
-<P>Sets charset for list files.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--scs{UTF-8 | WIN | DOS}
-</PRE>
-
-<P>Default charset is UTF-8.</P>
-
-<DL>
- <DT>UTF-8</DT>
- <DD>Unicode UTF-8 character set.</DD>
- <DT>WIN</DT>
- <DD>Default character set of Windows.</DD>
- <DT>DOS</DT>
- <DD>Default DOS (OEM) character set of Windows.</DD>
-</DL>
-
-<H4>Example</H4>
-
-<PRE class="example">
-7z a archive.7z @listfile.txt -scsWIN
-</PRE>
-
-<P>compresses files from <SPAN class="filename">listfile.txt</SPAN> list, that contains
-list of files in default character set of Windows.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/update.htm">u (Update)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/exclude.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/exclude.htm
deleted file mode 100644
index faf8768e2..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/exclude.htm
+++ /dev/null
@@ -1,60 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-x (Exclude filenames) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-x (Exclude filenames) switch</H1>
-
-<P>Specifies which filenames or wildcarded names must be excluded from the operation.</P>
-<P>Multiple exclude switches are supported.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--x[&lt;recurse_type>]&lt;file_ref>
-
-&lt;recurse_type> ::= r[- | 0]
-&lt;file_ref> ::= @{listfile} | !{wildcard}
-</PRE>
-
-<P>See <A href="include.htm">-i (Include)</A> switch description for information about
- option parameters.</P>
-
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z a -tzip archive.zip *.txt -x!temp.*
-</PRE>
-
-<P>adds to the archive <SPAN class="filename">archive.zip</SPAN> all
- <SPAN class="filename">*.txt</SPAN> files,
- except <SPAN class="filename">temp.*</SPAN> files.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/list.htm">l (List)</A>,
- <A href="../commands/test.htm">t (Test)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Switches:</B>
- <A href="recurse.htm">-r (Recurse)</A>,
- <A href="include.htm">-i (Include)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/include.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/include.htm
deleted file mode 100644
index 009f5efcb..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/include.htm
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-i (Include filenames) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-i (Include filenames) switch</H1>
-
-<P>Specifies additional include filenames and wildcards.</P>
-<P>Multiple include switches are supported.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--i[<A class="parameter" href="#recurse_type">&lt;recurse_type></A>]<A class="parameter" href="#file_ref">&lt;file_ref></A>
-
-<A class="parameter" href="#recurse_type">&lt;recurse_type></A> ::= r[- | 0]
-<A class="parameter" href="#file_ref">&lt;file_ref></A> ::= @{listfile} | !{wildcard}
-</PRE>
-
-<H4>Parameters</H4>
-
-<DL>
- <DT><A name="recurse_type"></A>&lt;recurse_type></DT>
- <DD><P>Specifies how wildcards and file names in this switch must
- be used. If this option is not given, then the global value, assigned
- by the <A href="recurse.htm">-r (Recurse)</A> switch will be used. For
- more details see specification of the
- <A href="recurse.htm">-r (Recurse)</A> switch.</P>
-<PRE class="syntax">
-&lt;recurse_type> ::= r[- | 0]
-</PRE>
-
- </DD>
- <DT><A name="file_ref"></A>&lt;file_ref></DT>
- <DD>
- <P>Specifies filenames and wildcards, or a list file, for files to be processed.</P>
-<PRE class="syntax">
-&lt;file_ref> ::= @{listfile} | !{wildcard}
-</PRE>
- <TABLE>
- <TR> <TH width="120">Option</TH> <TH>Description</TH> </TR>
- <TR> <TD>{listfile}</TD> <TD>Specifies name of list file. See
- <A href = ../syntax.htm#ListFile>List file</A> description.</TD> </TR>
- <TR> <TD>{wildcard}</TD> <TD>Specifies wildcard or filename.</TD> </TR>
- </TABLE>
- </DD>
-</DL>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z a -tzip src.zip *.txt -ir!DIR1\*.cpp
-</PRE>
-
-<P>adds to <SPAN class="filename">src.zip</SPAN> archive all
- <SPAN class="filename">*.txt</SPAN> files from current directory
- and all <SPAN class="filename">*.cpp</SPAN>
- files from directory <SPAN class="filename">DIR1</SPAN>
- and from all it's subdirectories.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/list.htm">l (List)</A>,
- <A href="../commands/test.htm">t (Test)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Switches:</B>
- <A href="recurse.htm">-r (Recurse)</A>,
- <A href="exclude.htm">-x (Exclude)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/index.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/index.htm
deleted file mode 100644
index 65e335d49..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/index.htm
+++ /dev/null
@@ -1,64 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>Command Line Switches</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>Command Line Switches</H1>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
-&ltswitch>::= &lt;switch_symbol>&lt;switch_characters>[&lt;option>]
-&lt;switch_symbol> ::= '/' | '-'
-
-</PRE>
-<P>On the command line, a switch consists of a switch specifier,
-either a dash (-) or a forward slash (/), followed by the name of
-the switch. Switch names cannot be abbreviated.</P>
-
-<P>Some switches take an argument after the switch name.
-No spaces or tabs are allowed within a switch specification.
-Switch names are not case sensitive, but arguments can be case sensitive.
-</P>
-
-<P>Switch can be used in any place in command line.</B>
-
-<P>See also <A href ="../syntax.htm">Command Line Syntax</A> for more details
- about using the command line.</P>
-
-<H2>Switch quick reference</H2>
-
-<TABLE border="1" cellpadding="3" cellspacing="0">
-<TR><TH>Switch</TH><TH>Description</TH></TR>
-<TR> <TD><A href="stop_switch.htm">--</A></TD> <TD><A href="stop_switch.htm">Stop switches parsing</A></TD></TR>
-<TR> <TD><A href="ar_include.htm">-ai</A></TD> <TD><A href="ar_include.htm">Include archive filenames</A></TD></TR>
-<TR> <TD><A href="ar_no.htm">-an</A></TD> <TD><A href="ar_no.htm">Disable parsing of archive_name</A></TD></TR>
-<TR> <TD><A href="overwrite.htm">-ao</A></TD> <TD><A href="overwrite.htm">Overwrite mode</A></TD></TR>
-<TR> <TD><A href="ar_exclude.htm">-ax</A></TD> <TD><A href="ar_exclude.htm">Exclude archive filenames</A></TD></TR>
-<TR> <TD><A href="include.htm">-i</A></TD> <TD><A href="include.htm">Include filenames</A></TD></TR>
-<TR> <TD><A href="method.htm">-m</A></TD> <TD><A href="method.htm">Set Compression Method</A></TD></TR>
-<TR> <TD><A href="output_dir.htm">-o</A></TD> <TD><A href="output_dir.htm">Set Output directory</A></TD></TR>
-<TR> <TD><A href="password.htm">-p</A></TD> <TD><A href="password.htm">Set Password</A></TD></TR>
-<TR> <TD><A href="recurse.htm">-r</A></TD> <TD><A href="recurse.htm">Recurse subdirectories</A></TD></TR>
-<TR> <TD><A href="charset.htm">-scs</A></TD> <TD><A href="charset.htm">Set charset for list files</A></TD></TR>
-<TR> <TD><A href="large_pages.htm">-slp</A></TD> <TD><A href="large_pages.htm">Set Large Pages mode</A></TD></TR>
-<TR> <TD><A href="list_tech.htm">-slt</A></TD> <TD><A href="list_tech.htm">Show technical information</A></TD></TR>
-<TR> <TD><A href="sfx.htm">-sfx</A></TD> <TD><A href="sfx.htm">Create SFX archive</A></TD></TR>
-<TR> <TD><A href="stdin.htm">-si</A></TD> <TD><A href="stdin.htm">Read data from StdIn</A></TD></TR>
-<TR> <TD><A href="stdout.htm">-so</A></TD> <TD><A href="stdout.htm">Write data to StdOut</A></TD></TR>
-<TR> <TD><A href="ssc.htm">-ssc</A></TD> <TD><A href="ssc.htm">Set Sensitive Case mode</A></TD></TR>
-<TR> <TD><A href="type.htm">-t</A></TD> <TD><A href="type.htm">Type of archive</A></TD></TR>
-<TR> <TD><A href="update.htm">-u</A></TD> <TD><A href="update.htm">Update options</A></TD></TR>
-<TR> <TD><A href="volume.htm">-v</A></TD> <TD><A href="volume.htm">Create Volumes</A></TD></TR>
-<TR> <TD><A href="working_dir.htm">-w</A></TD> <TD><A href="working_dir.htm">Set Working directory</A></TD></TR>
-<TR> <TD><A href="exclude.htm">-x</A></TD> <TD><A href="exclude.htm">Exclude filenames</A></TD></TR>
-<TR> <TD><A href="yes.htm">-y</A></TD> <TD><A href="yes.htm">Assume Yes on all queries</A></TD></TR>
-</TABLE>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/large_pages.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/large_pages.htm
deleted file mode 100644
index 82fd5b77d..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/large_pages.htm
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-slp (Set Large Pages mode) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-slp (Set Large Pages mode) switch</H1>
-
-<P>Sets Large Pages mode.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--slp[-]
-</PRE>
-
-
-<TABLE>
- <TR><TH width="80">Switch</TH> <TH>Description</TH></TR>
- <TR><TD>-slp</TD> <TD>Enables Large Pages mode.</TD></TR>
- <TR><TD>-slp-</TD> <TD>Disables Large Pages mode. This option is default for all commands.</TD></TR>
-</TABLE>
-
-<P>Large Pages mode increases the speed of compression.
-However, there is a pause at the start of compression while 7-Zip allocates the large pages in memory.
-If 7-Zip can't allocate large pages, it allocates usual small pages.
-Also, the Windows Task Manager doesn't show the real memory usage of the program, if 7-Zip uses large pages.
-This feature works only on Windows 2003 / XP x64.
-Also, it requires administrator's rights for your system.
-The recommended size of RAM for this feature is 1 GB or more.
-To install this feature, you must run the 7-Zip File Manager at least once,
-close it, and then reboot the system.</P>
-<P>Your system can hang for several seconds at compressing starting, if you use -slp mode.
-So it's not recommended to use -slp mode to compress small data sets (less than 100 MB).</P>
-
-
-<H4>Example</H4>
-
-<PRE class="example">
-7z a archive.7z -slp a.iso
-</PRE>
-
-<P>compresses <SPAN class="filename">a.iso</SPAN> file with Large Pages mode switched on.</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/list_tech.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/list_tech.htm
deleted file mode 100644
index aa8e522da..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/list_tech.htm
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-slt (Show technical information) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-slt (Show technical information) switch</H1>
-
-<P>Sets technical mode for <A href="../commands/list.htm">l (List)</A> command.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--slt
-</PRE>
-
-<H4>Example</H4>
-
-<PRE class="example">
-7z l -slt archive.7z
-</PRE>
-
-<P>shows detailed technical information for the files in <SPAN class="filename">archive.7z</SPAN>.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/list.htm">l (List)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/method.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/method.htm
deleted file mode 100644
index 448dbdf59..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/method.htm
+++ /dev/null
@@ -1,625 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-m (Set compression Method) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-m (Set compression Method) switch</H1>
-
-<P>Specifies the compression method.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--m&lt;method_parameters>
-
-</PRE>
-
-<P>The format for this switch depends on the archive type.</P>
-
-<UL>
-<LI><TD><A class="parameter" href="#Zip">Zip</A></TD>
-<LI><TD><A class="parameter" href="#GZ">GZip</A></TD>
-<LI><TD><A class="parameter" href="#BZ2">BZip2</A></TD>
-<LI><TD><A class="parameter" href="#7Z">7z</A></TD>
-<LI><TD><A class="parameter" href="#XZ">XZ</A></TD>
-</UL>
-
-<H2><A name="Zip"></A>Zip</H2>
-<TABLE>
- <TR>
- <TH width="160">Parameter</TH>
- <TH align="center">Default</TH>
- <TH>Description</TH> </TR>
- <TR>
- <TD><A class="parameter" href="#ZipX">x=[0 | 1 | 3 | 5 | 7 | 9 ]</A></TD>
- <TD align="center">5</TD>
- <TD>Sets level of compression.</TD> </TR>
- <TR>
- <TD>m={MethodID}</TD>
- <TD align="center">Deflate</TD>
- <TD>Sets a method: Copy, Deflate, Deflate64, BZip2, LZMA, PPMd.</TD> </TR>
- <TR>
- <TD><A class="parameter" href="#Deflate_FastBytes">fb={NumFastBytes}</A></TD>
- <TD align="center">32</TD>
- <TD>Sets number of Fast Bytes for Deflate encoder.</TD> </TR>
- <TR>
- <TD><A class="parameter" href="#Zip_Pass">pass={NumPasses}</A></TD>
- <TD align="center">1</TD>
- <TD>Sets number of Passes for Deflate encoder.</TD></TR>
- <TR>
- <TD><A class="parameter" href="#ZipDictionarySize">d={Size}[b|k|m]</A></TD>
- <TD align="center">900000</TD>
- <TD>Sets Dictionary size for BZip2</TD></TR>
- <TR>
- <TD><A class="parameter" href="#ZipMemorySize">mem={Size}[b|k|m]</A></TD>
- <TD align="center">24</TD> <TD>Sets size of used memory for PPMd.</TD></TR>
- <TR>
- <TD><A class="parameter" href="#ZipOrder">o={Size}</A></TD>
- <TD align="center">8</TD> <TD>Sets model order for PPMd.</TD></TR>
- <TR>
- <TD><A class="parameter" href="#ZipMultiThread">mt=[off | on | {N}]</A></TD>
- <TD align="center">on</TD>
- <TD>Sets multithreading mode.</TD></TR>
- <TR>
- <TD>em={EncryptionMethodID}</TD>
- <TD align="center">ZipCrypto</TD>
- <TD>Sets a encryption method: ZipCrypto, AES128, AES192, AES256</TD> </TR>
- <TR> <TD><A class="parameter">tc=[off | on]</A></TD>
- <TD align="center">off</TD> <TD>Stores NTFS timestamps for files: Modification time, Creation time, Last access time.</TD> </TR>
- <TR> <TD><A class="parameter">cl=[off | on]</A></TD>
- <TD align="center">off</TD> <TD>7-Zip always uses local code page for file names.</TD> </TR>
- <TR> <TD><A class="parameter">cu=[off | on]</A></TD>
- <TD align="center">off</TD> <TD>7-Zip uses UTF-8 for file names that contain non-ASCII symbols.</TD> </TR>
-</TABLE>
-
-<P>By default (if <B>cl</B> and <B>cu</B> switches are not specified), 7-Zip uses UTF-8 encoding
-only for file names that contain symbols unsupported by local code page.</P>
-
-<DL>
- <DT><A name="ZipX"></A>x=[0 | 1 | 3 | 5 | 7 | 9 ]</DT>
- <DD>
- <P>Sets level of compression. x=0 means Copy mode (no compression).</P>
- <P>Deflate / Deflate64 settings:</P>
- <TABLE>
- <TR> <TH>Level</TH> <TH>NumFastBytes</TH> <TH>NumPasses</TH> <TH>Description</TH> </TR>
- <TR> <TD class="cc">1</TD> <TD class="cc" rowspan=3>32</TD> <TD class="cc" rowspan=3>1</TD> <TD>Fastest</TD> </TR>
- <TR> <TD class="cc">3</TD> <TD>Fast</TR>
- <TR> <TD class="cc">5</TD> <TD>Normal</TR>
- <TR> <TD class="cc">7</TD> <TD class="cc">64</TD> <TD class="cc">3</TD> <TD>Maximum</TD> </TR>
- <TR> <TD class="cc">9</TD> <TD class="cc">128</TD> <TD class="cc">10</TD> <TD>Ultra</TD> </TR>
- </TABLE>
-
- <P>x=1 and x=3 with Deflate method set fast mode for compression.</P>
-
- <P>BZip2 settings:</P>
- <TABLE>
- <TR> <TH>Level</TH> <TH>Dictionary</TH> <TH>NumPasses</TH> <TH>Description</TH> </TR>
- <TR> <TD class="cc">1</TD> <TD class="cc">100000</TD> <TD class="cc" rowspan=3>1</TD> <TD>Fastest</TD> </TR>
- <TR> <TD class="cc">3</TD> <TD class="cc">500000</TD> <TD>Fast</TD> </TR>
- <TR> <TD class="cc">5</TD> <TD class="cc" rowspan=3>900000</TD> <TD>Normal</TD> </TR>
- <TR> <TD class="cc">7</TD> <TD align="center">2</TD> <TD>Maximum</TD> </TR>
- <TR> <TD class="cc">9</TD> <TD align="center">7</TD> <TD>Ultra</TD> </TR>
- </TABLE>
- </DD>
-
- <DT><A name="Deflate_FastBytes"></A>fb={NumFastBytes}</DT>
- <DD>
- <P>Sets the number of fast bytes for the Deflate/Deflate64 encoder.
- It can be in the range from 3 to 258 (257 for Deflate64).
- Usually, a big number gives a little bit better
- compression ratio and a slower compression process.
- A large fast bytes parameter can significantly increase the compression ratio
- for files which contain long identical sequences of bytes.</P>
- </DD>
- <DT><A name="Zip_Pass"></A>pass={NumPasses}</DT>
- <DD>
- <P>Sets number of passes for Deflate encoder. It can be in the range from 1 to 15 for Deflate and
- from 1 to 10 for BZip2. Usually, a big number gives a little bit better
- compression ratio and a slower compression process.
- </P>
- </DD>
- <DT><A name="ZipDictionarySize"></A>d={Size}[b|k|m]</DT>
- <DD>
- <P> Sets the Dictionary size for BZip2. You must specify the size in bytes, kilobytes, or megabytes.
- The maximum value for the Dictionary size is 900000b. If you do not specify any symbol
- from set [b|k|m], dictionary size will be calculated as DictionarySize = 2^Size bytes.</P>
- </DD>
-
- <DT><A name="ZipMemorySize"></A>mem={Size}[b|k|m]</DT>
- <DD>
- <P> Sets the size of memory used for PPMd. You must specify the size in bytes, kilobytes, or megabytes.
- The maximum value is 256 MB = 2^28 bytes. The default value
- is 24 (16MB). If you do not specify any symbol from the set [b|k|m], the
- memory size will be calculated as (2^Size) bytes. PPMd uses the same
- amount of memory for compression and decompression.</P>
- </DD>
-
- <DT><A name="ZipOrder"></A>o={Size}</DT>
- <DD>
- <P>Sets the model order for PPMd. The size must be in the range [2,16]. The default value is 8.</P>
- </DD>
-
- <DT><A name="ZipMultiThread"></A>mt=[off | on | {N}]</DT>
- <DD>
- <P>Sets multithread mode. If you have a multiprocessor or multicore system,
- you can get a speed increase with
- this switch. This option affects only compression (with any method) and
- decompression of BZip2 streams.
- Each thread in the multithread mode uses 32 MB of RAM for buffering.
- If you specify {N}, 7-Zip tries to use N threads.</P>
- </DD>
-</DL>
-
-<H2><A name="GZ"></A>GZip</H2>
-GZip uses the same parameters as Zip, but GZip compresses only with Deflate method.
-So GZip supports only the following parameters: x, fb, pass.
-
-<H2><A name="BZ2"></A>BZip2</H2>
-<TABLE>
- <TR>
- <TH width="160">Parameter</TH>
- <TH align="center">Default</TH>
- <TH>Description</TH> </TR>
- <TR>
- <TD><A class="parameter" href="#BZip2X">x=[1 | 3 | 5 | 7 | 9 ]</A></TD>
- <TD align="center">5</TD>
- <TD>Sets level of compression.</TD> </TR>
- <TR>
- <TD><A class="parameter" href="#BZip2Pass">pass={NumPasses}</A></TD>
- <TD align="center">1</TD>
- <TD>Sets number of Passes for Bzip2 encoder.</TD></TR>
- <TR>
- <TD><A class="parameter" href="#BZip2DictionarySize">d={Size}[b|k|m]</A></TD>
- <TD align="center">900000</TD>
- <TD>Sets Dictionary size for BZip2</TD></TR>
- <TR>
- <TD><A class="parameter" href="#BZip2MultiThread">mt=[off | on | {N}]</A></TD>
- <TD align="center">on</TD>
- <TD>Sets multithreading mode.</TD></TR>
-</TABLE>
-
-<DL>
- <DT><A name="BZip2"></A>x=[1 | 3 | 5 | 7 | 9 ]</DT>
- <DD>
- <P>Sets level of compression</P>
- <TABLE>
- <TR> <TH>Level</TH> <TH>Dictionary</TH> <TH>NumPasses</TH> <TH>Description</TH> </TR>
- <TR> <TD class="cc">1</TD> <TD class="cc">100000</TD> <TD class="cc" rowspan=3>1</TD> <TD>Fastest</TD> </TR>
- <TR> <TD class="cc">3</TD> <TD class="cc">500000</TD> <TD>Fast</TD> </TR>
- <TR> <TD class="cc">5</TD> <TD class="cc" rowspan=3>900000</TD> <TD>Normal</TD> </TR>
- <TR> <TD class="cc">7</TD> <TD align="center">2</TD> <TD>Maximum</TD> </TR>
- <TR> <TD class="cc">9</TD> <TD align="center">7</TD> <TD>Ultra</TD> </TR>
- </TABLE>
- </DD>
-
- <DT><A name="BZip2DictionarySize"></A>d={Size}[b|k|m]</DT>
- <DD>
- <P> Sets the Dictionary size for BZip2. You must specify the size in bytes, kilobytes, or megabytes.
- The maximum value for the Dictionary size is 900000b. If you do not specify any symbol
- from set [b|k|m], dictionary size will be calculated as DictionarySize = 2^Size bytes.</P>
- </DD>
-
- <DT><A name="#BZip2Pass"></A>pass={NumPasses}</DT>
- <DD>
- <P>Sets the number of passes. It can be in the range from 1 to 10.
- The default value is 1 for normal mode, 2 for maximum mode and 7 for ultra mode.
- A bigger number can give a little bit better compression ratio and a slower compression process.
- </P>
- </DD>
- <DT><A name="BZip2MultiThread"></A>mt=[off | on | {N}]</DT>
- <DD>
- <P>Sets multithread mode. If you have a multiprocessor or multicore system,
- you can get a speed increase with
- this switch. If you specify {N}, for example mt=4, 7-Zip tries to use 4 threads.</P>
- </DD>
-</DL>
-
-<H2><A name="7Z"></A>7z</H2>
-<TABLE>
- <TR> <TH width="80">Parameter</TH> <TH align="center">Default</TH> <TH>Description</TH> </TR>
- <TR> <TD><A class="parameter" href="#SevenZipX">x=[0 | 1 | 3 | 5 | 7 | 9 ]</A></TD>
- <TD align="center">5</TD><TD>Sets level of compression.</TD> </TR>
- <TR> <TD><A class="parameter" href="#Solid">s=[off | on | [e] [{N}f] [{N}b | {N}k | {N}m | {N}g]</A></TD>
- <TD align="center">on</TD> <TD>Sets solid mode.</TD> </TR>
- <TR> <TD><A class="parameter" href="#Filter">f=[off | on]</A></TD>
- <TD align="center">on</TD> <TD>Enables or disables compression filters for executable files.</TD> </TR>
- <TR> <TD><A class="parameter" href="#HeaderCompress">hc=[off | on]</A></TD>
- <TD align="center">on</TD> <TD>Enables or disables archive header compressing.</TD> </TR>
- <TR> <TD><A class="parameter" href="#HeaderEncrypt">he=[off | on]</A></TD>
- <TD align="center">off</TD> <TD>Enables or disables archive header encryption.</TD> </TR>
- <TR> <TD><A class="parameter" href="#Bind">b{C1}[s{S1}]:{C2}[s{S2}]</A></TD>
- <TD align="center"> </TD> <TD>Sets binding beetwen coders.</TD> </TR>
- <TR> <TD><A class="parameter" href="#MethodID">{N}={MethodID}[:param1][:param2][..]</A></TD>
- <TD align="center">LZMA</TD> <TD>Sets a method: LZMA, LZMA2, PPMd, BZip2, Deflate, Delta, BCJ, BCJ2, Copy.</TD> </TR>
- <TR> <TD><A class="parameter" href="#MultiThread">mt=[off | on | {N}]</A></TD>
- <TD align="center">on</TD> <TD>Sets multithreading mode.</TD> </TR>
- <TR> <TD><A class="parameter">tc=[off | on]</A></TD>
- <TD align="center">off</TD> <TD>Stores file creation timestamps.</TD> </TR>
-</TABLE>
-
-<DL>
- <DT><A name="SevenZipX"></A>x=[0 | 1 | 3 | 5 | 7 | 9 ]</DT>
- <DD>
- <P>Sets level of compression</P>
- <TABLE>
- <TR> <TH>Level</TH> <TH>Method</TH> <TH>Dictionary</TH> <TH>FastBytes</TH> <TH>MatchFinder</TH> <TH>Filter</TH> <TH>Description</TH> </TR>
- <TR> <TD align="center">0</TD> <TD align="center">Copy</TD> <TD align="center"></TD> <TD align="center"></TD> <TD align="center"></TD> <TD align="center"></TD> <TD>No compression.</TD> </TR>
- <TR> <TD align="center">1</TD> <TD align="center">LZMA</TD> <TD align="center">64 KB</TD> <TD align="center">32</TD> <TD align="center">HC4</TD> <TD align="center">BCJ</TD> <TD>Fastest compressing</TD> </TR>
- <TR> <TD align="center">3</TD> <TD align="center">LZMA</TD> <TD align="center">1 MB</TD> <TD align="center">32</TD> <TD align="center">HC4</TD> <TD align="center">BCJ</TD> <TD>Fast compressing</TD> </TR>
- <TR> <TD align="center">5</TD> <TD align="center">LZMA</TD> <TD align="center">16 MB</TD> <TD align="center">32</TD> <TD align="center">BT4</TD> <TD align="center">BCJ</TD> <TD>Normal compressing</TD> </TR>
- <TR> <TD align="center">7</TD> <TD align="center">LZMA</TD> <TD align="center">32 MB</TD> <TD align="center">64</TD> <TD align="center">BT4</TD> <TD align="center">BCJ</TD> <TD>Maximum compressing</TD> </TR>
- <TR> <TD align="center">9</TD> <TD align="center">LZMA</TD> <TD align="center">64 MB</TD> <TD align="center">64</TD> <TD align="center">BT4</TD> <TD align="center">BCJ2</TD><TD>Ultra compressing</TD> </TR>
- </TABLE>
- <P>Note: "x" works as "x=9".</P>
- </DD>
-
- <DT><A name="Solid"></A>s=[off | on | [e] [{N}f] [{N}b | {N}k | {N}m | {N}g)]</DT>
- <DD>
- <P> Enables or disables solid mode. The default mode is s=on.
- In solid mode, files are grouped together. Usually, compressing in
- solid mode improves the compression ratio.</P>
-
- <TABLE>
- <TR> <TD>e</TD> <TD>Use a separate solid block for each new file extension</TD> </TR>
- <TR> <TD>{N}f</TD> <TD>Set the limit for number of files in one solid block</TD> </TR>
- <TR> <TD>{N}b | {N}k | {N}m | {N}g</TD> <TD>Set a limit for the total size of a solid block in bytes</TD> </TR>
- </TABLE>
-
- <P>These are the default limits for the solid block size:</P>
-
- <TABLE>
- <TR> <TH width="150">Compression Level</TH> <TH>Solid block size</TH> </TR>
- <TR> <TD>Store</TD> <TD>0 B</TD> </TR>
- <TR> <TD>Fastest</TD> <TD>16 MB</TD> </TR>
- <TR> <TD>Fast</TD> <TD>128 MB</TD> </TR>
- <TR> <TD>Normal</TD> <TD>2 GB</TD> </TR>
- <TR> <TD>Maximum</TD> <TD>4 GB</TD> </TR>
- <TR> <TD>Ultra</TD> <TD>4 GB</TD> </TR>
- </TABLE>
-
-
- <P>Limitation of the solid block size usually decreases compression ratio but gives the following advantages:</P>
- <UL>
- <LI>Decreases losses in case of future archive damage.
- <LI>Decreases extraction time of a group of files (or just one
- file), so long as the group doesn't contain the entire archive.</LI></LI>
- </UL>
- <P>The updating of solid .7z archives can be slow, since it
- can require some recompression.</P>
-
- <P>Example:</P>
- <PRE class="example">
- s=100f10m
- </PRE>
- <P>set solid mode with 100 files & 10 MB limits per one solid block.</P>
-
- <DT><A name="Filter"></A>f=[off | on]</DT>
- <DD>
- <P>Enables or disables compression filters for executable files:
- dll, exe, ocx, sfx, sys. It uses BCJ2 filter in Ultra mode and BCJ
- filter in other modes. The default mode is f=on.
- </P>
- <DT><A name="HeaderCompress"></A>hc=[off | on]</DT>
- <DD>
- <P> Enables or disables archive header compressing. The default mode is hc=on.
- If archive header compressing is enabled, some parts of archive header will
- be compressed with LZMA method.
- </P>
- <DT><A name="HeaderEncrypt"></A>he=[off | on]</DT>
- <DD>
- <P> Enables or disables archive header encryption. The default mode is he=off.
- </P>
- <DT>{N}</DT>
- <DD>
- <P>Sets order of methods. It is used also to associate parameters with
- methods. Numbers must begin from 0. Methods that have smaller numbers will be used
- before others.</P>
- </DD>
-
- <DT><A name="Bind"></A>b{C1}[s{S1}]:{C2}[s{S2}]</DT>
- <DD>
- <P> Binds output stream S1 in coder C1 with input stream S2 in coder C2.
- If stream number is not specified, stream with number 0 will be used.
- </P>
- <P> Usally coder has one input stream and
- one output stream. In 7z some coders can have multiple input and output streams.</P>
-
- <P>For example, <A class="parameter" href="#BCJ2">BCJ2</A> encoder has one
- input stream and four output streams.</P>
- </DD>
-
- <DT><A name="MultiThread"></A>mt=[off | on | {N}]</DT>
- <DD>
- <P>Sets multithread mode. If you have a multiprocessor or multicore system,
- you can get a increase with this switch.
- 7-Zip supports multithread mode only for LZMA / LZMA2 compression and
- BZip2 compression / decompression. If you specify {N}, for example mt=4,
- 7-Zip tries to use 4 threads. LZMA compression uses only 2 threads.
- </P>
- </DD>
-
- <DT><A name="MethodID"></A>{N}={MethodID}[:param1][:param2] ... [:paramN]</DT>
- <DD>
- <P>Sets compression method. You can use any number of methods.
- The default method is LZMA. </P>
- <P>Parameters must be in one of the following forms:</P>
- <UL>
- <LI>{ParamName}={ParamValue}.
- <LI>{ParamName}{ParamValue}, if {ParamValue}
- is number and {ParamName} doesn't contain numbers.
- </UL>
-
- <P>Supported methods:</P>
- <TABLE>
- <TR> <TH width="60">MethodID</TH> <TH>Description</TH> </TR>
- <TR> <TD><A class="parameter" href="#LZMA">LZMA</A></TD> <TD>LZ-based algorithm</TD> </TR>
- <TR> <TD><A class="parameter" href="#LZMA2">LZMA2</A></TD> <TD>LZMA-based algorithm</TD> </TR>
- <TR> <TD><A class="parameter" href="#PPMd">PPMd</A></TD> <TD>Dmitry Shkarin's PPMdH with small changes</TD> </TR>
- <TR> <TD>BZip2</TD> <TD>BWT algorithm</TD> </TR>
- <TR> <TD>Deflate</TD> <TD>LZ+Huffman</TD> </TR>
- <TR> <TD>Copy</TD> <TD>No compression</TD> </TR>
- </TABLE>
-
- <P>Supported filters:</P>
- <TABLE>
- <TR> <TH width="60">MethodID</TH> <TH>Description</TH> </TR>
- <TR> <TD><A class="parameter" href="#Delta">Delta</A></TD> <TD>Delta filter</TD> </TR>
- <TR> <TD>BCJ</TD> <TD>converter for x86 executables</TD> </TR>
- <TR> <TD><A class="parameter" href="#BCJ2">BCJ2</A></TD> <TD>converter for x86 executables (version 2)</TD> </TR>
- <TR> <TD>ARM</TD> <TD>converter for ARM (little endian) executables</TD> </TR>
- <TR> <TD>ARMT</TD> <TD>converter for ARM Thumb (little endian) executables</TD> </TR>
- <TR> <TD>IA64</TD> <TD>converter for IA-64 executables</TD> </TR>
- <TR> <TD>PPC</TD> <TD>converter for PowerPC (big endian) executables</TD> </TR>
- <TR> <TD>SPARC</TD> <TD>converter for SPARC executables</TD> </TR>
- </TABLE>
- <P>Filters increase the compression ratio for some types of files. Filters
- must be used with one of the compression method (for example, BCJ + LZMA).</P>
- </DD>
-
- <H4><A name="LZMA"></A>LZMA</H4>
- <P> LZMA is an algorithm based on Lempel-Ziv algorithm.
- It provides very fast decompression (about 10-20 times faster than compression).
- Memory requirements for compression and decompression also are different (see
- <A class="parameter" href="#DictionarySize">d={Size}[b|k|m]</A> switch for details).</P>
-
- <TABLE>
- <TR> <TH width="80">Parameter</TH> <TH align="center">Default</TH> <TH>Description</TH> </TR>
-
- <TR> <TD><A class="parameter" href="#LZMAMode">a=[0|1]</A></TD>
- <TD align="center">1</TD> <TD>Sets compressing mode</TD> </TR>
- <TR> <TD><A class="parameter" href="#DictionarySize">d={Size}[b|k|m]</A></TD>
- <TD align="center">24</TD> <TD>Sets Dictionary size</TD> </TR>
- <TR> <TD><A class="parameter" href="#MatchFinder">mf={MF_ID}</A></TD>
- <TD align="center">bt4</TD> <TD>Sets Match Finder</TD> </TR>
- <TR> <TD><A class="parameter" href="#FastBytes">fb={N}</A></TD>
- <TD align="center">32</TD> <TD>Sets number of Fast Bytes</TD></TR>
- <TR> <TD><A class="parameter" href="#MatchFinderCycles">mc={N}</A></TD>
- <TD align="center">32</TD><TD>Sets Number of Cycles for Match Finder</TD> </TR>
- <TR> <TD><A class="parameter" href="#LitContext">lc={N}</A></TD>
- <TD align="center">3</TD> <TD>Sets number of Literal Context bits - [0, 8]</TD></TR>
- <TR> <TD><A class="parameter" href="#LitPos">lp={N}</A></TD>
- <TD align="center">0</TD> <TD>Sets number of Literal Pos bits - [0, 4]</TD></TR>
- <TR> <TD><A class="parameter" href="#PosBits">pb={N}</A></TD>
- <TD align="center">2</TD> <TD>Set number of Pos Bits - [0, 4]</TD></TR>
- </TABLE>
-
-
- <DL>
- <DT><A name="#LZMAMode"></A>a=[0|1]</DT>
- <DD>
- <P> Sets compression mode: 0 = fast, 1 = normal.
- Default value is 1.</P>
- </DD>
- <DT><A name="DictionarySize"></A>d={Size}[b|k|m]</DT>
- <DD>
- <P> Sets Dictionary size for LZMA. You must specify the size in bytes, kilobytes, or megabytes.
- The maximum value for dictionary size is 1 GB = 2^30 bytes. Default values for LZMA
- are 24 (16 MB) in normal mode, 25 (32 MB) in maximum mode (-mx=7)
- and 26 (64 MB) in ultra mode (-mx=9).
- If you do not specify any symbol from the set [b|k|m], the
- dictionary size will be calculated as DictionarySize = 2^Size bytes.
- For decompressing a file compressed by LZMA method with dictionary size N, you need
- about N bytes of memory (RAM) available.
- </P>
- </DD>
- <DT><A name="MatchFinder"></A>mf={MF_ID}</DT>
- <DD>
- <P> Sets Match Finder for LZMA. Default method is bt4.
- Algorithms from hc* group don't provide a good compression ratio,
- but they often work pretty fast in combination with fast mode (a=0).
- Memory requirements depend on dictionary size (parameter "d" in table below).
- </P>
- <TABLE>
- <TR> <TH>MF_ID</TH> <TH class="cc">Dictionary</TH> <TH class="cc" colspan = 2>Memory Usage</TH> <TH class="cc" colspan = 2>Description</TH> </TR>
- <TR> <TD class="cc">bt2</TD> <TD></TD> <TD align="right"> 9.5 * d</TD> <TD class="cc" rowspan=6> + 4 MB</TD> <TD class="cc" rowspan=4>Binary Tree</TD> <TD>2 bytes hashing</TD> </TR>
- <TR> <TD class="cc">bt3</TD> <TD></TD> <TD align="right">11.5 * d</TD> <TD>3 bytes hashing</TD> </TR>
- <TR> <TD class="cc" rowspan=2>bt4</TD> <TD class="cc">64 KB ... 48 MB</TD> <TD align="right">11.5 * d</TD> <TD class="cc" rowspan=6>4 bytes hashing</TD> </TR>
- <TR> <TD class="cc">64 MB ... 1024 MB</TD> <TD align="right">10.5 * d</TD> </TR>
- <TR> <TD class="cc" rowspan=2>hc4</TD> <TD class="cc">64 KB ... 48 MB</TD> <TD align="right"> 7.5 * d</TD> <TD class="cc" rowspan=2>Hash Chain </TD></TR>
- <TR> <TD class="cc">64 MB ... 1024 MB</TD> <TD align="right"> 6.5 * d</TD> </TR>
- </TABLE>
- <P>Note: Your operation system also needs some amount of physical memory for internal purposes.
- So keep at least 32MB of physical memory unused.</P>
- </DD>
-
- <DT><A name="FastBytes"></A>fb={N}</DT>
- <DD>
- <P>Sets number of fast bytes for LZMA. It can be in the range from 5 to 273.
- The default value is 32 for normal mode and 64 for maximum and ultra modes.
- Usually, a big number gives a little bit better
- compression ratio and slower compression process.
- </P>
- </DD>
- <DT><A name="MatchFinderCycles"></A>mc={N}</DT>
- <DD>
- <P>Sets number of cycles (passes) for match finder. It can be in range from 0 to 1000000000.
- Default value is (16 + number_of_fast_bytes / 2) for BT* match finders and
- (8 + number_of_fast_bytes / 4) for HC4 match finder.
- If you specify mc=0, LZMA will use default value.
- Usually, a big number gives a little bit better compression ratio and slower
- compression process. For example, mf=HC4 and mc=10000 can provide almost the same
- compression ratio as mf=BT4.</P>
- </DD>
- <DT><A name="LitContext"></A>lc={N}</DT>
- <DD>
- <P>Sets the number of literal context bits (high bits of previous literal).
- It can be in range from 0 to 8.
- Default value is 3. Sometimes lc=4 gives gain for big files.</P>
- </DD>
- <DT><A name="LitPos"></A>lp={N}</DT>
- <DD>
- <P>Sets the number of literal pos bits (low bits of current position for literals).
- It can be in the range from 0 to 4.
- The default value is 0. The lp switch is intended for periodical data when the
- period is equal to 2^value (where lp=value). For example, for 32-bit (4 bytes)
- periodical data you can use lp=2. Often it's better to set lc=0,
- if you change lp switch.</P>
- </DD>
- <DT><A name="PosBits"></A>pb={N}</DT>
- <DD>
- <P>Sets the number of pos bits (low bits of current position).
- It can be in the range from 0 to 4.
- The default value is 2. The pb switch is intended for periodical data when the
- period is equal 2^value (where lp=value). </P>
- </DD>
-
- </DL>
-
- <H4><A name="LZMA2"></A>LZMA2</H4>
- <P>LZMA2 is modified version of LZMA. it provides the following advantages over LZMA:</P>
- <UL>
- <LI>Better compression ratio for data than can't be compressed. LZMA2 can store such
- blocks of data in uncompressed form. Also it decompresses such data faster.
- <LI>Better multithreading support. If you compress big file, LZMA2 can split
- that file to chunks and compress these chunks in multiple threads.
- </UL>
-
- <TABLE>
- <TR> <TH width="80">Parameter</TH> <TH align="center">Default</TH> <TH>Description</TH> </TR>
-
- <TR> <TD><A class="parameter" href="#ChunkSize">c={Size}[b|k|m]</A></TD>
- <TD align="center">dictSize * 4</TD> <TD>Sets Chunk size</TD> </TR>
- </TABLE>
-
- <P>If you don't specify ChunkSize, LZMA2 sets it to DictionarySize * 4.</P>
-
- <P>LZMA2 also supports all LZMA parameters, but lp+lc cannot be larger than 4.</P>
-
- <P>LZMA2 uses: 1 thread for each chunk in x1 and x3 modes; and
- 2 threads for each chunk in x5, x7 and x9 modes.
- If LZMA2 is set to use only such number of threads required for one chunk,
- it doesn't split stream to chunks. So you can get different compression
- ratio for different number of threads. You can get the best compression
- ratio, when you use 1 or 2 threads.</P>
-
- <H4><A name="PPMd"></A>PPMd</H4>
- <P> PPMd is a PPM-based algorithm. This algorithm is mostly based
- on Dmitry Shkarin's PPMdH source code. PPMd provides very good compression ratio for
- plain text files. There is no difference between compression speed and
- decompression speed. Memory requirements for compression and decompression
- also are the same.</P>
- <TABLE>
- <TR> <TH width="80">Parameter</TH> <TH align="center">Default</TH> <TH>Description</TH> </TR>
- <TR> <TD><A class="parameter" href="#MemorySize">mem={Size}[b|k|m]</A></TD>
- <TD align="center">24</TD> <TD>Sets size of used memory for PPMd.</TD> </TR>
- <TR> <TD><A class="parameter" href="#Order">o={Size}</A></TD>
- <TD align="center">6</TD> <TD>Sets model order for PPMd.</TD> </TR>
- </TABLE>
- <DL>
- <DT><A name="MemorySize"></A>mem={Size}[b|k|m]</DT>
- <DD>
- <P> Sets the size of memory used for PPMd. You must specify the size in bytes, kilobytes, or megabytes.
- The maximum value is 2GB = 2^31 bytes. The default value
- is 24 (16MB). If you do not specify any symbol from the set [b|k|m], the
- memory size will be calculated as (2^Size) bytes. PPMd uses the same
- amount of memory for compression and decompression.</P>
- </DD>
-
- <DT><A name="Order"></A>o={Size}</DT>
- <DD>
- <P>Sets the model order for PPMd. The size must be in the range [2,32]. The default value is 6.</P>
- </DD>
- </DL>
-
- <H4><A name="BCJ2"></A>BCJ2</H4>
- <P>BCJ2 is a Branch converter for 32-bit x86 executables (version 2).
- It converts some branch instructions for increasing further compression.</P>
- <P>A BCJ2 encoder has one input stream and four output streams:</P>
- <UL>
- <LI>s0: main stream. It requires further compression.</LI>
- <LI>s1: stream for converted CALL values. It requires further compression.</LI>
- <LI>s2: stream for converted JUMP values. It requires further compression.</LI>
- <LI>s3: service stream. It is already compressed.</LI>
- </UL>
- <P>If LZMA is used, the size of the dictionary for streams
- s1 and s2 can be much smaller (512 KB is enough for most cases)
- than the dictionary size for stream s0.</P>
-
- <H4><A name="Delta"></A>Delta</H4>
- <P>It's possible to set delta offset in bytes. For example, to compress 16-bit stereo
- WAV files, you can set "0=Delta:4". Default delta offset is 1.</P>
-</DL>
-
-<H2><A name="XZ"></A>XZ</H2>
-XZ supports only LZMA2 codec now. The switches are similar to switches for 7z format.
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z a -tzip archive.zip *.jpg -mx0
-</PRE>
-
-<P>adds <SPAN class="filename">*.jpg</SPAN> files to
- <SPAN class="filename">archive.zip</SPAN> archive without compression.</P>
-
-<PRE class="example">
-7z a -t7z archive.7z *.exe *.dll -m0=BCJ -m1=LZMA:d=21 -ms -mmt
-</PRE>
-
-<P>adds <SPAN class="filename">*.exe</SPAN> and <SPAN class="filename">*.dll</SPAN>
-files to solid archive <SPAN class="filename">archive.7z</SPAN> using LZMA method with
-2 MB dictionary and BCJ converter. Compression will use multithreading optimization.</P>
-
-<PRE class="example">
-7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19
- -mb0:1 -mb0s1:2 -mb0s2:3
-</PRE>
-
-<P>adds <SPAN class="filename">*.exe</SPAN> and <SPAN class="filename">*.dll</SPAN>
- files to archive <SPAN class="filename">archive.7z</SPAN> using BCJ2 converter,
- LZMA with 8 MB dictionary for main output stream (s0),
- and LZMA with 512 KB dictionary for s1 and s2 output streams of BCJ2.</P>
-
-
-<PRE class="example">
-7z a -t7z archive.7z *.txt -m0=PPMd
-</PRE>
-
-<P>adds <SPAN class="filename">*.txt</SPAN> files to archive
-<SPAN class="filename">archive.7z</SPAN> using PPMd method.</P>
-
-
-
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Switches:</B>
- <A href="type.htm">-t (set Type of archive)</A>,
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/output_dir.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/output_dir.htm
deleted file mode 100644
index b4523493b..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/output_dir.htm
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-o (set Output directory) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-o (set Output directory) switch</H1>
-
-<P>Specifies a destination directory where files are to be extracted.</P>
-<P>This switch can be used only with extraction commands.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--o{dir_path}
-</PRE>
-
-<DL>
- <DT>{dir_path}</DT>
- <DD>This is the destination directory path. It's not required to end with a backslash.
- If you specify <B>*</B> in {dir_path}, 7-Zip substitutes that * character to archive name.</DD>
-</DL>
-
-
-<H4>Example</H4>
-
-<PRE class="example">
-7z x archive.zip -oc:\Doc
-</PRE>
-
-<P>extracts all files from the <SPAN class="filename">archive.zip</SPAN> archive
-to the <SPAN class="filename">c:\Doc</SPAN> directory.</P>
-
-<PRE class="example">
-7z x *.zip -o*
-</PRE>
-
-<P>extracts all <SPAN class="filename">*.zip</SPAN> archives to subfolders
-with names of these archives.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/overwrite.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/overwrite.htm
deleted file mode 100644
index c71ae40d8..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/overwrite.htm
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-ao (Overwrite mode) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-ao (Overwrite mode) switch</H1>
-
-<P>Specifies the overwrite mode during extraction, to overwrite files already present on disk.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--ao[a | s | t | u ]
-</PRE>
-
-
-<TABLE>
- <TR> <TH width="80">Switch</TH> <TH>Description</TH> </TR>
- <TR> <TD>-aoa</TD> <TD>Overwrite All existing files without prompt.</TD> </TR>
- <TR> <TD>-aos</TD> <TD>Skip extracting of existing files.</TD> </TR>
- <TR> <TD>-aou</TD> <TD>aUto rename extracting file (for example, name.txt will
- be renamed to name_1.txt).</TD> </TR>
- <TR> <TD>-aot</TD> <TD>auto rename existing file (for example, name.txt will
- be renamed to name_1.txt).</TD> </TR>
-</TABLE>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z x test.zip -aoa
-</PRE>
-
-<P>extracts all files from <SPAN class="filename">test.zip</SPAN> archive and overwrites
-existing files without any prompt.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Switches:</B>
- <A href="yes.htm">-y (assume Yes on all queries)</A>,
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/password.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/password.htm
deleted file mode 100644
index 733dfc4a7..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/password.htm
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-p (set Password) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-p (set Password) switch</H1>
-
-<P>Specifies password.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--p{password}
-</PRE>
-
-<DL>
- <DT>{password}</DT>
- <DD>Specifies password.</DD>
-</DL>
-
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z a archive.7z -psecret -mhe *.txt
-</PRE>
-<P>compresses *.txt files to <SPAN class="filename">archive.7z</SPAN> using password
-"secret". Also it encrypts archive headers (-mhe switch), so filenames will be encrypted.
-</P>
-
-<PRE class="example">
-7z x archive.zip -psecret
-</PRE>
-<P>extracts all files from <SPAN class="filename">archive.zip</SPAN> using password
-"secret".</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/test.htm">t (Test)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/recurse.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/recurse.htm
deleted file mode 100644
index 08dba2a4a..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/recurse.htm
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-r (Recurse subdirectories) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-r (Recurse subdirectories) switch</H1>
-
-<P>Specifies the method of treating wildcards and filenames on the command line.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--r[- | 0]
-</PRE>
-
-
-<TABLE>
- <TR><TH width="80">Switch</TH> <TH>Description</TH></TR>
- <TR><TD>-r</TD> <TD>Enable recurse subdirectories.</TD></TR>
- <TR><TD>-r-</TD> <TD>Disable recurse subdirectories. This option is default for all commands.</TD></TR>
- <TR><TD>-r0</TD> <TD>Enable recurse subdirectories only for wildcard names.</TD></TR>
-</TABLE>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z l archive.zip *.doc -r-
-</PRE>
-
-<P>lists all <SPAN class="filename">*.doc</SPAN> files
- that belong to the archived root directory
- in the <SPAN class="filename">archive.zip</SPAN> archive.
- </P>
-
-<PRE class="example">
-7z a -tzip archive.zip -r src\*.cpp src\*.h
-</PRE>
-
-<P>adds all <SPAN class="filename">*.cpp</SPAN> and <SPAN class="filename">*.h</SPAN>
- files from directory <SPAN class="filename">src</SPAN> and all it's subdirectories
- to the <SPAN class="filename">archive.zip</SPAN> archive.</P>
-
-<PRE class="example">
-7z a archive.7z folder1\
-</PRE>
-
-<P>adds all files from directory <SPAN class="filename">folder1</SPAN> and all it's subdirectories
- to the <SPAN class="filename">archive.7z</SPAN> archive.</P>
-
-<PRE class="example">
-7z a archive.7z -r folder2\
-</PRE>
-
-<P>searches all <SPAN class="filename">folder2</SPAN> directories in all subdirectories,
- and adds them (including all subdirectories) to the <SPAN class="filename">archive.7z</SPAN> archive.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/list.htm">l (List)</A>,
- <A href="../commands/test.htm">t (Test)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Switches:</B>
- <A href="include.htm">-i (Include)</A>,
- <A href="exclude.htm">-x (Exclude)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/sfx.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/sfx.htm
deleted file mode 100644
index 126028963..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/sfx.htm
+++ /dev/null
@@ -1,156 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-sfx (Create SFX archive) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-sfx (Create SFX archive) switch</H1>
-
-<P>Creates self extracting archive.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--sfx[<A class="parameter" href="#SFX_Module">{SFX_Module}</A>]
-</PRE>
-
-<DL>
- <DT><A name="SFX_Module"></A>{SFX_Module}</DT>
- <DD>
- <P>Specifies the SFX module that will be combined with the archive.
- This module must be placed in the same directory as the 7z.exe.
- If {SFX_Module} is not assigned, 7-Zip will use standard console
- SFX module 7zCon.sfx.</P>
- <TABLE>
- <TR> <TH width="60">SFX_Module</TH> <TH>Description</TH> </TR>
- <TR> <TD>7z.sfx</TD> <TD>Windows version.</TD> </TR>
- <TR> <TD>7zCon.sfx</TD> <TD>Console version.</TD> </TR>
- <TR> <TD>7zS.sfx</TD> <TD>Windows version for installers.</TD> </TR>
- <TR> <TD>7zSD.sfx</TD> <TD>Windows version for installers (uses MSVCRT.dll).</TD> </TR>
- </TABLE>
- </DD>
-</DL>
-
-<P>
-All SFX modules are uncompressed. You can use UPX program
-(http://upx.sourceforge.net)
-to compresss such modules. After compressing by the UPX program, the size of the
-sfx module will be reduced to 40-50% of its original size.
-</P>
-
-<H4>SFX modules for installers</H4>
-<P>SFX modules for installers are included in an external package (7z_extra). You can download
-these modules from www.7-zip.org. SFX modules for installers (7zS.sfx and 7zSD.sfx)
-allow you to create your own installation program.
-Such a module extracts the archive to the user's temp folder, and runs a specified program,
-and removes the temp files after the program finishes.
-A self-extracting archive for installers must be created as joining 3 files:
-SFX_Module, Installer_Config, 7z_Archive.
-In addition, an optional file, Installer_Config, is allowed. You can use the following command to
-create an installer self-extracting archive:</P>
-<PRE class="example">
-copy /b 7zS.sfx + config.txt + archive.7z archive.exe
-</PRE>
-
-<P>An optimally small installation package size can be achieved,
-if the installation files are uncompressed before including them in the 7z archive.</P>
-
-<P><SPAN class="filename">-y</SPAN> switch for installer module specifies quiet mode extraction.</P>
-
-<H4>Installer Config file format</H4>
-<P>
-This config file contains commands for the Installer. The file begins with the string
-<B>;!@Install@!UTF-8!</B> and ends with <B>;!@InstallEnd@!</B>.
-The file must be written in UTF-8 encoding.
-The file contains any or all these string pairs:
-<P>ID_String="Value"</P>
-<P>
- <TABLE>
- <TR> <TH width="60">ID_String</TH> <TH>Description</TH> </TR>
- <TR> <TD>Title</TD> <TD>Title for messages</TD> </TR>
- <TR> <TD>BeginPrompt</TD> <TD>Begin Prompt message</TD> </TR>
- <TR> <TD>Progress</TD> <TD>Value can be "yes" or "no". Default value is "yes".</TD> </TR>
- <TR> <TD>RunProgram</TD> <TD>Command for executing. Default value is "setup.exe". Substring <B>%%T</B>
- will be replaced with path to temporary folder, where files were extracted</TD> </TR>
- <TR> <TD>Directory</TD> <TD>Directory prefix for "RunProgram". Default value is ".\\"</TD> </TR>
- <TR> <TD>ExecuteFile</TD> <TD>Name of file for executing</TD> </TR>
- <TR> <TD>ExecuteParameters</TD> <TD>Parameters for "ExecuteFile"</TD> </TR>
- </TABLE>
-</P>
-<P>You may omit any pair.</P>
-
-<P>There are two ways to run a installation program: <B>RunProgram</B> and <B>ExecuteFile</B>.
-Use <B>RunProgram</B>, if you want to run a program from the .7z archive.
-Use <B>ExecuteFile</B>, if you want to open a document from the .7z archive, or
-if you want to execute a command from Windows.</P>
-
-<P>If you use <B>RunProgram</B>, and if you specify empty directory prefix: <B>Directory</B>="",
-the system searches for the executable file in the following sequence:</P>
-<OL>
-<LI>The directory from which the application (installer) loaded.
-<LI>The temporary folder, where files were extracted.
-<LI>The Windows system directory.
-</OL>
-
-<H4>Config file Examples</H4>
-
-<PRE class="example">
-;!@Install@!UTF-8!
-Title="7-Zip 4.00"
-BeginPrompt="Do you want to install the 7-Zip 4.00?"
-RunProgram="setup.exe"
-;!@InstallEnd@!
-</PRE>
-
-<BR>
-
-
-<PRE class="example">
-;!@Install@!UTF-8!
-Title="7-Zip 4.00"
-BeginPrompt="Do you want to install the 7-Zip 4.00?"
-ExecuteFile="7zip.msi"
-;!@InstallEnd@!
-</PRE>
-
-<BR>
-
-<PRE class="example">
-;!@Install@!UTF-8!
-Title="7-Zip 4.01 Update"
-BeginPrompt="Do you want to install the 7-Zip 4.01 Update?"
-ExecuteFile="msiexec.exe"
-ExecuteParameters="/i 7zip.msi REINSTALL=ALL REINSTALLMODE=vomus"
-;!@InstallEnd@!
-</PRE>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z a -sfx a.exe *.txt
-</PRE>
-
-<P>adds <SPAN class="filename">*.txt</SPAN> files to self extracting
- archive <SPAN class="filename">a.exe</SPAN> using the default console SFX module.</P>
-
-<PRE class="example">
-7z a -sfx7z.sfx a.exe *
-</PRE>
-
-<P>adds all files to self extracting archive <SPAN class="filename">a.exe</SPAN>
-with module <SPAN class="filename">7z.sfx</SPAN> using windows version of SFX mudule.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/ssc.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/ssc.htm
deleted file mode 100644
index 023dbf88b..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/ssc.htm
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-ssc (Set Sensitive Case mode) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-ssc (Set Sensitive Case mode) switch</H1>
-
-<P>Sets sensitive case mode for file names.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--scs[-]
-</PRE>
-
-<TABLE>
- <TR><TH width="80">Switch</TH> <TH>Description</TH></TR>
- <TR><TD>-ssc</TD> <TD>Set case-sensitive mode. It's default for Posix/Linux systems.</TD></TR>
- <TR><TD>-ssc-</TD> <TD>Set case-insensitive mode. It's default for Windows systems.</TD></TR>
-</TABLE>
-
-<H4>Example</H4>
-
-<PRE class="example">
-7z a archive.7z A*.txt -ssc -r
-</PRE>
-
-<P>compresses all <SPAN class="filename">A*.txt</SPAN> files
- from current directory and all it's subdirectories. That command doesn't compress
- <SPAN class="filename">a*.txt</SPAN> files.
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/list.htm">l (List)</A>,
- <A href="../commands/test.htm">t (Test)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/stdin.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/stdin.htm
deleted file mode 100644
index f16b4ebe2..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/stdin.htm
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-si (read data from stdin) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-si (read data from stdin) switch</H1>
-
-<P>Causes 7-Zip to read data from stdin (standard input) instead of from disc files.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--si{file_name}
-</PRE>
-
-<DL>
- <DT>{file_name}</DT>
- <DD>Specifies a name that will be stored in the archive for the compressed data.
- If file_name is not specified, data will be stored without a name.</DD>
-</DL>
-
-<P>Note: The current version of 7-Zip support reading of archives from stdin only for xz, lzma, tar, gzip and bzip2 archives.</P>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z a archive.gz -tgzip -siDoc2.txt < Doc.txt
-</PRE>
-
-<P>compresses input stream from file Doc.txt to
-<SPAN class="filename">archive.gz</SPAN> archive
-using <SPAN class="filename">Doc2.txt</SPAN> file name.</P>
-
-<PRE class="example">
-7z x 7z905.tar.gz -so | 7z x -si -ttar
-</PRE>
-
-<P>decompresses <SPAN class="filename">tar.gz</SPAN> archive.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/stdout.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/stdout.htm
deleted file mode 100644
index 62e5a662a..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/stdout.htm
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-so (write data to stdout) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-so (write data to stdout) switch</H1>
-
-<P>Causes 7-Zip to write output data to stdout (standard output stream).</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--so
-</PRE>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z x archive.gz -so > Doc.txt
-</PRE>
-
-<P>decompresses <SPAN class="filename">archive.gz</SPAN>
-archive to output stream and then redirects that stream to
-<SPAN class="filename">Doc.txt</SPAN> file.</P>
-
-
-<PRE class="example">
-7z a dummy -tgzip -so Doc.txt > archive.gz
-</PRE>
-
-<P>compresses the <SPAN class="filename">Doc.txt</SPAN> file to the 7-Zip standard
-output stream and writes that stream to
-<SPAN class="filename">archive.gz</SPAN> file.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/stop_switch.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/stop_switch.htm
deleted file mode 100644
index 12383e507..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/stop_switch.htm
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-- (Stop switches parsing) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-- (Stop switches parsing) switch</H1>
-
-<P>Disables switch parsing after "--" on the command line.
-This is to allow 7-Zip to use file names that start with "-".
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
---
-</PRE>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z t -- -ArchiveName.7z
-</PRE>
-
-<P>tests <SPAN class="filename">-ArchiveName.7z</SPAN> archive.</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/style.css b/src/libs/7zip/unix/DOCS/MANUAL/switches/style.css
deleted file mode 100644
index 13ebb79ce..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/style.css
+++ /dev/null
@@ -1,232 +0,0 @@
-body
- {
- padding: 0px 0px 0px 26px;
- background: #ffffff;
- color: #000000;
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 80%;
- }
-
-div
- {
- width: 90%;
- border: 2px solid #999999;
- padding: 4px 8px;
- background: #cccccc;
- }
-
-h1, h2, h3, h4
- {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- margin-left: -26px;
- }
-
-h1
- {
- font-size: 145%;
- margin-top: .5em;
- margin-bottom: 1em;
- }
-
-h2
- {
- font-size: 130%;
- margin-top: 1.5em;
- margin-bottom: .6em;
- }
-
-h3
- {
- font-size: 115%;
- margin-top: 1.5em;
- margin-bottom: .6em;
- }
-
-h4
- {
- font-size: 100%;
- margin-top: 1.5em;
- margin-bottom: .6em;
- }
-
-ul p, ol p, dl p
- {
- margin-left: 0em;
- }
-
-p
- {
- margin-top: .6em;
- margin-bottom: .6em;
- }
-
-dl
- {
- /*margin-top: 0em; */
- }
-
-dt
- {
- margin-top: .76em;
- margin-bottom: .5em;
- font-weight: bold;
- }
-
-dd
- {
- margin-top: .5em;
- margin-bottom: .5em;
- margin-left: 1.9em;
- }
-
-
-ul, ol
- {
- margin-top: .6em;
- margin-bottom: 0em;
- }
-
-ol
- {
- margin-left: 3.6em;
- }
-
-ul
- {
- list-style-type: disc;
- margin-left: 1.9em;
- }
-
-li
- {
- margin-bottom: .6em;
- }
-
-ul ol, ol ol
- {
- list-style-type: lower-alpha;
- {
-
- /*
-pre
- {
- margin-top: .6em;
- margin-bottom: .6em;
- }
- */
-
-pre,code
- {
- font: 100% Courier New, Courier, mono;
- color: #000000;
- cursor: text;
- }
-
-pre.syntax
- {
- background: #dddddd;
- padding: 2pt,4pt
- }
-
-pre.syntax
- {
- color: #000000;
- }
-
-pre.example
- {
- margin-left: 2.0em;
- /*margin-top: 12.0em;*/
- /*margin-bottom: 1.0em;*/
- color: #C00000;
- /*padding: 10pt,20pt*/
- }
-
-table
- {
- /* width: 90%; */
- background: #999999;
- margin-top: .6em;
- margin-bottom: .3em;
- }
-
-th
- {
- padding: 4px 8px;
- background: #cccccc;
- text-align: left;
- font-size: 80%;
- vertical-align: bottom;
- }
-
-th.cc
- {
- text-align: center;
- vertical-align: middle;
- }
-
-td
- {
- padding: 4px 8px;
- background: #ffffff;
- vertical-align: top;
- font-size: 80%;
- }
-
-td.cc
- {
- text-align: center;
- vertical-align: middle;
- }
-
-
-blockquote
- {
- margin-left: 3.8em;
- margin-right: 3.8em;
- margin-top: .6em;
- margin-bottom: .6em;
- }
-
-a:link
- {
- color: #0066ff;
- }
-
-a:visited
- {
- color: #996600;
- }
-
-a:hover
- {
- color: #cc9900;
- }
-
-a.parameter:link
- {
- color: #0066ff;
- text-decoration:none;
- }
-
-a.parameter:visited
- {
- text-decoration:none;
- }
-
-div.footer
- {
- width: 100%;
- border: none;
- background: #ffffff;
- margin-top: 18pt;
- padding-bottom: 12pt;
- color: #228B22;
- text-align: center;
- font-size: 70%;
- }
-
-span.filename
-{
- color: #F00000;
-}
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/type.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/type.htm
deleted file mode 100644
index 73af4e1a9..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/type.htm
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-o (set Output directory) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-t (set Type of archive) switch</H1>
-
-<P>Specifies the type of archive.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--t{archive_type}
-</PRE>
-
-<DL>
- <DT>{archive_type}</DT>
- <DD>Specifies the type of archive. It can be: *, 7z, split, zip, gzip, bzip2, tar, ... , or
- combination of them, like: mbr.vhd
-</DD>
-</DL>
-
-<P>If -t{archive_type} switch is not specified, 7-Zip uses extension of archive filename to
- detect the type of archive. If you create new archive, -t{archive_type} switch is not
- specified and there is no extension of archive, 7-Zip will create .7z archive.</P>
-
-<P>When you extract archive of some types that contains another
-archive without compression (for example, MBR in VHD), 7-Zip can open both
-levels in one step. If you want to open/extract just top
-level archive, use <SPAN class="filename">-t*</SPAN> switch.</P>
-
-<P>Note: gzip or bzip2 formats support only one file per archive.
-If you want to compress more than one file to these formats,
-create a tar archive first, and then compress it with your selected format.</P>
-
-<H4>Example</H4>
-
-<PRE class="example">
-7z a -tzip archive.zip *.txt
-</PRE>
-
-<P>adds all <SPAN class="filename">*.txt</SPAN> files from current directory
-to zip archive <SPAN class="filename">archive.zip</SPAN>.</P>
-
-<PRE class="example">
-7z t -t7z.split archive.7z.001
-</PRE>
-
-<P>tests all files in <SPAN class="filename">archive.7z.001</SPAN>. It also checks
-that archive is multivolume .7z archive.</P>
-
-<PRE class="example">
-7z x -tiso archive.iso
-</PRE>
-
-<P>extracts files from <SPAN class="filename">archive.iso</SPAN> open as ISO archive.
-
-<PRE class="example">
-7z x -tudf archive.iso
-</PRE>
-
-<P>extracts files from <SPAN class="filename">archive.iso</SPAN> open as UDF archive.
-
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/list.htm">l (List)</A>,
- <A href="../commands/test.htm">t (Test)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/update.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/update.htm
deleted file mode 100644
index 3c707a784..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/update.htm
+++ /dev/null
@@ -1,176 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-u (Update options) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-u (Update options) switch</H1>
-
-<P>Specifies how to update files in an archive and (or) how to create new archives.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--u<A class="parameter" href="#disable_base_archive">[-]</A>&lt;action_set><A class="parameter" href="#new_archive_name">[!{new_archive_name}]</A>
-
- &lt;action_set> ::= &lt;state_action>...
-
- &lt;state_action> ::= <A class="parameter" href="#state">&lt;state></A><A class="parameter" href="#state">&lt;action></A>
-
- <A class="parameter" href="#action">&lt;state></A> ::= p | q | r | x | y | z | w
-
- <A class="parameter" href="#action">&lt;action></A> ::= 0 | 1 | 2 | 3
-</PRE>
-
-
-<H4>Parameters</H4>
-
-<DL>
- <DT><A name="disable_base_archive"></A>dash (-)</DT>
- <DD><P>Disables any updates in the base archive.</P>
-
- <P>The term <B>base archive</B> means the archive assigned by "base_archive_name"
- on the command line. See <A href="../syntax.htm">Command line syntax</A>
- for more details.</P>
- </DD>
- <DT><A name="new_archive_name"></A>{new_archive_name}</DT>
- <DD><P>Specifies the path name of the new archive to be created.
- All options in this switch will refer to this new archive.</P>
- <P>If not assigned, then all options in this switch will
- refer to the base archive of the command.</P>
- </DD>
- <DT><A name="state"></A>&lt;state></DT>
- <DD><P>Specifies the state of a particular file to be processed.</P>
- <PRE class="syntax">&lt;state> ::= p | q | r | x | y | z | w</PRE>
- <P>For each unique filename there are 6 variants of state:</P>
- <TABLE>
- <TR> <TH>&lt;state></TH> <TH>State condition</TH>
- <TH width="20%">File on Disk</TH> <TH width="20%">File in Archive</TH> </TR>
-
- <TR> <TD align="center">p</TD> <TD>File exists in archive, but is not matched with wildcard.</TD>
- <TD>&nbsp;</TD> <TD>Exists, but is not matched</TD> </TR>
-
- <TR> <TD align="center">q</TD> <TD>File exists in archive, but doesn't exist on disk.</TD>
- <TD>Doesn't exist</TD> <TD>Exists</TD> </TR>
-
- <TR> <TD align="center">r</TD> <TD>File doesn't exist in archive, but exists on disk.</TD>
- <TD>Exists</TD> <TD>Doesn't exist</TD> </TR>
-
- <TR> <TD align="center">x</TD> <TD>File in archive is newer than the file on disk.</TD>
- <TD>Older</TD> <TD>Newer</TD> </TR>
-
- <TR> <TD align="center">y</TD> <TD>File in archive is older than the file on disk.</TD>
- <TD>Newer</TD> <TD>Older</TD> </TR>
-
- <TR> <TD align="center">z</TD> <TD>File in archive is same as the file on disk</TD>
- <TD>Same</TD> <TD>Same</TD> </TR>
-
- <TR> <TD align="center">w</TD> <TD>Can not be detected what file is newer
- (times are the same, sizes are different)</TD>
- <TD>?</TD> <TD>?</TD> </TR>
- </TABLE>
- </DD>
-
- <DT><A name="action"></A>&lt;action></DT>
- <DD><P>Specifies the action for a given <A class="parameter" href="#state">&lt;state></A>.</P>
- <PRE class="syntax">&lt;action> ::= 0 | 1 | 2 | 3</PRE>
- <P>For each state you can specify one of the three variants of actions:</P>
- <TABLE>
- <TR> <TH>&lt;action></TH> <TH>Description</TH></TR>
- <TR> <TD align="center">0</TD> <TD>Ignore file (don't create item in new archive for this file)</TD></TR>
- <TR> <TD align="center">1</TD> <TD>Copy file (copy from old archive to new)</TD></TR>
- <TR> <TD align="center">2</TD> <TD>Compress (compress file from disk to new archive)</TD></TR>
- <TR> <TD align="center">3</TD> <TD>Create Anti-item (item that will delete file or directory during extracting). This feature is supported only in 7z format.</TD></TR>
- </TABLE>
- </DD>
-</DL>
-
-
-<H4>Remarks</H4>
-
-<P>Any update command (such as <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/update.htm">u (Update)</A>) can be assigned in these terms.</P>
-<P>The following table shows action sets for update commands.</P>
-
-<TABLE>
- <TR> <TH>command \ <A class="parameter" href="#state">&lt;state></A></TH>
- <TH>p</TH> <TH>q</TH> <TH>r</TH> <TH>x</TH> <TH>y</TH> <TH>z</TH> <TH>w</TH></TR>
- <TR> <TH><A href="../commands/delete.htm">d (Delete)</A></TH> <TD>1</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD> <TD>0</TD></TR>
- <TR> <TH><A href="../commands/add.htm">a (Add)</A></TH> <TD>1</TD> <TD>1</TD> <TD>2</TD> <TD>2</TD> <TD>2</TD> <TD>2</TD> <TD>2</TD></TR>
- <TR> <TH><A href="../commands/update.htm">u (Update)</A></TH> <TD>1</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD></TR>
- <TR> <TH>Freshen</TH> <TD>1</TD> <TD>1</TD> <TD>0</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD></TR>
- <TR> <TH>Synchronize</TH> <TD>1</TD> <TD>0</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD> <TD>1</TD> <TD>2</TD></TR>
-</TABLE>
-
-
-<P>If you don't specify a
-<A class="parameter" href="#new_archive_name"><I>!{new_archive_name}</I></A> option, then
-all options will refer to the main archive (the archive assigned on the command line after the 7z command).
-If you specify <A class="parameter" href="#new_archive_name"><I>!{new_archive_name}</I></A>
-option, then 7-Zip also will create a new archive with the specified name and all options
-will refer to that new archive.</P>
-
-<P>Multiple update switches are supported.
-7-Zip can create any number of new archives during one operation.</P>
-
-<P>By default, the action set for each new archive is assigned
-as the action set of the main command. There are 3 different
-action sets for commands: <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/update.htm">u (Update)</A>.
-You can overload any &lt;state_action> pair.</P>
-
-<H4>Time zone notes</H4>
-<P>If you change time zone (when you move your computer to another time zone
-or if there are clock changes for daylight saving in your zone), you can have some problems
-with update commands that depend from file's modification time. It's strongly recommended to use only
-file system that uses Coordinated Universal Time (UTC) and archive format that also uses UTC.
-In that case you will have no problems with time zone changes.
-Also it's recommended to use only UTC formats in other cases, for example, if you send files to
-someone in another time zone.</P>
-
-<P>Also in some cases there are no problems, if both file system and archive format use local time, for example, FAT file system and ZIP format.</P>
-<UL>
-<LI>UTC file systems: NTFS
-<LI>UTC archive formats: .zip with -mtc switch, 7z, tar, gzip2, iso, wim
-<LI>Local time file systems : FAT, FAT32
-<LI>Local time archive formats : rar, zip, cab
-</UL>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z u c:\1\exist.7z -u- -up0q3x2z0!c:\1\update.7z *
-</PRE>
-
-<P>creates a new archive <SPAN class="filename">update.7z</SPAN> and
-writes to this archive all files from current directory which differ from
-files in <SPAN class="filename">exist.7z</SPAN> archive.
-<SPAN class="filename">exist.7z</SPAN> archive will not be changed.</P>
-
-<PRE class="example">
-7z u c:\1\exist.7z -up0q3x2z0!c:\1\update.7z * -ms=off
-</PRE>
-
-<P>creates a new archive <SPAN class="filename">update.7z</SPAN> and
-writes to this archive all files from the current directory which differ from
-files in <SPAN class="filename">exist.7z</SPAN> archive.
-
-<P>Note: the updating of solid .7z archives can be slow, since it
-can require some recompression.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/volume.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/volume.htm
deleted file mode 100644
index 91ddc2924..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/volume.htm
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-v (Create Volumes) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-v (Create Volumes) switch</H1>
-
-<P>Specifies volume sizes.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--v{Size}[b | k | m | g]
-
-</PRE>
-<DL>
- <DT>{Size}[b | k | m | g]</DT>
- <DD>Specifies volume size in Bytes, Kilobytes (1 Kilobyte = 1024 bytes),
- Megabytes (1 Megabyte = 1024 Kilobytes) or Gigabytes (1 Gigabyte = 1024 Megabytes).
- if you specify only {Size}, 7-zip will treat it as bytes.</DD>
-</DL>
-
-<P>It's possible to specify several -v switches.</P>
-
-<P><B>NOTE:</B> Please don't use volumes (and don't copy volumes) before finishing archiving.
-7-Zip can change any volume (including first volume) at the end of archiving operation.</P>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z a a.7z *.txt -v10k -v15k -v2m
-</PRE>
-
-<P>creates multivolume <SPAN class="filename">a.7z</SPAN> archive.
-First volume will be 10 KB, second will be 15 KB, and all others will be 2 MB.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/working_dir.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/working_dir.htm
deleted file mode 100644
index 415c3971b..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/working_dir.htm
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-w (set Working directory) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-w (set Working directory) switch</H1>
-
-<P>Sets the working directory for the temporary base archive. By
-default, 7-Zip builds a new base archive file in the same directory as the
-old base archive file. By specifying this switch, you can set the
-working directory where the temporary base archive file will be built.
-After the temporary base archive file is built, it is copied over the
-original archive; then, the temporary file is deleted.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">
--w[<A class="parameter" href="#dir_path">{dir_path}</A>]
-</PRE>
-
-<DL>
- <DT><A name="dir_path"></A>{dir_path}</DT>
- <DD>
- <P>Specifies the destination directory path. It's not required that
- a path end with a backslash.</P>
- <P>If &lt;dir_path> is not assigned, then 7-Zip will use the Windows temporary directory.</P>
- </DD>
-</DL>
-
-
-<H4>Example</H4>
-
-<PRE class="example">
-7z a -tzip archive.zip *.cpp -wc:\temp
-</PRE>
-
-<P>adds <SPAN class="filename">*.cpp</SPAN> files to the
-<SPAN class="filename">archive.zip</SPAN> archive, creating a temporary archive
-in <SPAN class="filename">c:\temp</SPAN> folder.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/add.htm">a (Add)</A>,
- <A href="../commands/delete.htm">d (Delete)</A>,
- <A href="../commands/update.htm">u (Update)</A>,
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/switches/yes.htm b/src/libs/7zip/unix/DOCS/MANUAL/switches/yes.htm
deleted file mode 100644
index 142ffd20c..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/switches/yes.htm
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>-y (assume Yes on all queries) switch</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>-y (assume Yes on all queries) switch</H1>
-
-<P>Disables most of the normal user queries during 7-Zip
-execution. You can use this switch to suppress overwrite queries in the
-<A href="../commands/extract.htm">e (Extract)</A> and
-<A href="../commands/extract_full.htm">x (Extract with full paths)</A> commands.</P>
-
-<H4>Syntax</H4>
-
-<PRE class="syntax">-y</PRE>
-
-<H4>Examples</H4>
-
-<PRE class="example">
-7z x src.zip -y
-</PRE>
-
-<P>extracts all files from
- <SPAN class="filename">src.zip</SPAN> archive. All overwrite queries will be
-suppressed and files on disk with same filenames as in archive will be
-overwritten.</P>
-
-<H4>Commands that can be used with this switch</H4>
-
-<P>
- <A href="../commands/extract.htm">e (Extract)</A>,
- <A href="../commands/extract_full.htm">x (Extract with full paths)</A>
-</P>
-
-<H4>See also</H4>
-
-<P>
- <B>Switches:</B>
- <A href="overwrite.htm">-ao (Overwrite mode)</A>,
-</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/MANUAL/syntax.htm b/src/libs/7zip/unix/DOCS/MANUAL/syntax.htm
deleted file mode 100644
index 63822e03b..000000000
--- a/src/libs/7zip/unix/DOCS/MANUAL/syntax.htm
+++ /dev/null
@@ -1,120 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
- <META http-equiv="Content-Type" content="text/html; charset=Windows-1252">
- <TITLE>Command Line Syntax</TITLE>
- <LINK href="style.css" rel="stylesheet" type="text/css">
-</HEAD>
-
-<BODY>
-
-<H1>Command Line Syntax</H1>
-
-<PRE class = "syntax">
-7z <A href = "commands/index.htm">&lt;command></A> [<A href = "switches/index.htm">&lt;switch></A>...] &lt;base_archive_name> [&lt;arguments>...]
-</PRE>
-<PRE class = "syntax">
-&lt;arguments> ::= <A href = "switches/index.htm">&lt;switch></A> | &lt;wildcard> | &lt;filename> | &lt;list_file>
-<A href = "switches/index.htm">&lt;switch></A>::= &lt;switch_symbol>&lt;switch_characters>[&lt;option>]
-&lt;switch_symbol> ::= '/' | '-'
-&lt;list_file> ::= @{filename}
-</PRE>
-
-
-<P>Expressions in square brackets (between '[' and ']') are optional.</P>
-
-<P>Expressions in curly braces ('{' and '}') mean that instead of that
-Expression (including braces), the user must substitute some string.</P>
-
-<P>Expression</P>
-
-<PRE class = "syntax">
-expression1 | expression2 | ... | expressionN</DT>
-</PRE>
-
-<P>
-means that any (but only one) from these expressions must be specified.
-
-<P><A href = "commands/index.htm">Commands</A> and
-<A href = "switches/index.htm">switches</A> can be entered in upper or lower case.</P>
-
-<P>Command is the first non-switch argument.</P>
-
-<P>The "base_archive_name" must be the first filename on the command line
-after the command.</P>
-
-<P>The switches and other filenames can be in any order.</P>
-
-<P>Wildcards or filenames with spaces must be quoted:</P>
-
-<PRE>
- "Dir\Program files\*"
- Dir\"Program files"\*
-</PRE>
-
-<P>Switch options can be combined to save command line length. However, some
-switch options take optional string arguments and therefore, must be the
-last option in a combined argument token string because 7-Zip accepts the
-rest of the argument token as the optional argument.</P>
-
-<P>7-Zip uses wild name matching similar to Windows 95:</P>
-<UL>
- <LI><B>'*'</B> means a sequence of arbitrary characters.</LI>
- <LI><B>'?'</B> means any character.</LI>
-</UL>
-
-<P><B>
-7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't
-follow the archaic rule by which *.* means any file. 7-Zip treats
-*.* as matching the name of any file that has an extension. To process all files, you must
-use a * wildcard.</B></P>
-
-<P>Examples:</P>
-<TABLE border = "0">
- <TR><TD>*.txt</TD><TD>means all files with an extension of ".txt"</TD></TR>
- <TR><TD>?a*</TD><TD>means all files with a second character of "a"</TD></TR>
- <TR><TD>*1*</TD><TD>means all names that contains character "1"</TD></TR>
- <TR><TD>*.*.*</TD><TD>means all names that contain two at least "." characters</TD></TR>
-</TABLE>
-
-
-<P>The default wildcard "*" will be used if there is no filename/wildcard in the
-command line.</P>
-
-<P>Slash ('\') at the end of a path means a directory. Without a Slash ('\') at
-the end of the path, the path can refer either to a file or a directory.
-
-
-<H2><A name = "ListFile"></A>List file</H2>
-
-<P>You can supply one or more filenames or wildcards for special list files
-(files containing lists of files). The filenames in such list file must be
-separated by new line symbol(s).</P>
-
-<P>For list files, 7-Zip uses UTF-8 encoding by default. You can change encoding
-using <A href = "switches/charset.htm">-scs</A> switch.</P>
-
-<P>Multiple list files are supported.</P>
-
-<P>For example, if the file "listfile.txt" contains the following:</P>
-
-<PRE>
- My programs\*.cpp
- Src\*.cpp
-</PRE>
-<P>then the command</P>
-
-<PRE>
- 7z a -tzip archive.zip @listfile.txt
-</PRE>
-
-<P>adds to the archive "archive.zip" all "*.cpp" files from directories "My
-programs" and "Src".</P>
-
-<H2><A name = "ListFile"></A>Short and Long File Names</H2>
-
-<P>7-Zip supports short file names (like FILENA~1.TXT) in some cases.
-However, it's strongly recommended to use only the real (long) file names.</P>
-
-</BODY>
-</HTML>
diff --git a/src/libs/7zip/unix/DOCS/copying.txt b/src/libs/7zip/unix/DOCS/copying.txt
deleted file mode 100644
index 4c3890127..000000000
--- a/src/libs/7zip/unix/DOCS/copying.txt
+++ /dev/null
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/src/libs/7zip/unix/DOCS/history.txt b/src/libs/7zip/unix/DOCS/history.txt
deleted file mode 100644
index 05a9a2165..000000000
--- a/src/libs/7zip/unix/DOCS/history.txt
+++ /dev/null
@@ -1,456 +0,0 @@
-Sources history of the 7-Zip
-----------------------------
-
-9.18 2010-11-02
--------------------------
-- New small SFX module for installers (C/Util/SfxSetup).
-
-
-9.17 2010-10-04
--------------------------
-- IStream.h::IOutStream::
- STDMETHOD(SetSize)(Int64 newSize) PURE;
- was changed to
- STDMETHOD(SetSize)(UInt64 newSize) PURE;
-
-
-9.09 2009-12-12
--------------------------
-- The bug was fixed:
- Utf16_To_Utf8 funstions in UTFConvert.cpp and 7zMain.c
- incorrectly converted surrogate characters (the code >= 0x10000) to UTF-8.
-
-
-9.05 2009-07-05
--------------------------
-- FileMapping.h::CFileMapping now returns WRes
-
-
-9.04 2009-05-30
--------------------------
-- ICoder.h: NCoderPropID::EEnum values were changed
-
-
-9.02 2009-04-23
--------------------------
-- Bug was fixed: if swap2 filter was requests at compression,
- 7-zip used swap4 filter instead (but id was swap2), so archives were incorrect.
-
-4.61 2008-11-23
--------------------------
-- Bug in ver. 4.58+ was fixed:
- 7-Zip didn't use any -m* switch after -mtc, -mcl or -mcu for .zip archives.
-- Bug in .CAB code was fixed. 7-Zip didn't show some empty files,
- if .CAB archive contains more than one empty file.
-
-
-4.59 2008-07-27
--------------------------
-- Bug was fixed:
- LZMA Encoder in fast compression mode could access memory outside of
- allocated range in some rare cases.
-
-
-4.59 alpha 2008-05-30
--------------------------
-- BUGS was fixed:
- 7zOut.cpp: 7-Zip incorrectly wrote size of property records in some cases.
- 7zIn.cpp: 7-Zip incorrectly work with archive, containg archive properties.
-
-4.58 alpha 9 2008-04-29
--------------------------
-- BUG was fixed: 7-Zip showed incorrect timestamps in ISO files.
-
-
-4.58 alpha 8 2008-04-15
--------------------------
-- BUG in 4.58 alpha 5/6/7 was fixed:
- LZMA encoder worked incorrectly, if lp != 0.
-- Unicode (UTF-8) support for filenames in .ZIP archives. Now there are 3 modes:
- 1) Default mode: 7-Zip uses UTF-8, if the local code page doesn't contain required symbols.
- 2) -mcu switch: 7-Zip uses UTF-8, if there are non-ASCII symbols.
- 3) -mcl switch: 7-Zip uses local code page.
-- Now it's possible to use -mSW- and -mSW+ switches instead of -mSW=off and -mSW=on
-
-
-4.58 alpha 7 2008-04-08
--------------------------
-- BUG was fixed: BZip2Encoder and BZip2Decoder used CEvent objects without
- creating, when BZip2 code was called with one thread (with -mmt1 switch or with
- default switches on single thread CPU).
-- .lzma support.
-- RPM and NSIS support was improved.
-- LZMA now stores only (2 << n) or (3 << n) dictionary size value to LZMA properties.
-
-
-4.58 alpha 6 2008-03-27
--------------------------
-- NTFS time extra in ZIP.
-- New item property - kpidTimeType - VT_UI4 (0 - NTFS, 1 - Unix, 2 - DOS).
-- Static CRC table is not required now for Lzma Encoder (in Lz MatchFinder).
-
-
-4.58 alpha 5 2008-03-19
--------------------------
-- Creation time (-mtc switch) for .7z archives
-- LZMA encoder was converted to ANSI-C
-
-
-4.58 alpha 3 2008-02-25
--------------------------
-- Speed optimizations for LZMA decoding. Now it uses C code instead of C++.
-- 7-Zip now has 128 MB dictionary limit for 32-bit version:
- It's for speed optimization: kNumLogBits = 9 + sizeof(size_t) / 2;
-- TAR: 'D' link flag support.
-- 7-Zip now can unpack multivolume RAR archives created with
- "old style volume names" scheme (-vn switch) and names *.001, *.002, ...
-- Fixed bugs:
- - 7-Zip FM could not copy / move files to root network folders like \\COMPNAME\FOLDERNAME\
- In case of move it removed original files.
- - SFX-WIN: if there are errors, it still could return 0.
- - ZIP (.XPS file) isZip64 && thisDiskNumber16 == 0xFFFF.
- - ZIP name updating:
- If zip file contains extra field and you try to change properties of files,
- 7-zip tries to delete all extra fileds (except for WzAES).
- And that code could hang.
- - 7-Zip GUI didn't suggest BZip2 dictionary size used in previous run.
- - If creation time stamp was included in .RAR archive, 7-zip used creation time stamp
- as modification time stamp.
-
-4.58 alpha 2 2007-12-31
--------------------------
-- Small changes in Deflate and LZMA compression.
-- Some speed optimizations.
-
-
-4.57
-----
-- Bug was fixed:
- Anti item is created for wrong file:
- http://sourceforge.net/forum/forum.php?thread_id=1880366&forum_id=45798
-
-
-4.52 beta 2007-07-32
--------------------------
-- 7-Zip could not decompress some cab files
-- "." dir creating at FAT was fixed / long names
-
-
-4.50 beta 2007-07-24
--------------------------
-- 7-Zip now replaces unsupported filenames (like "nul", "com1") during extracting.
-- New switch for command line version:
- -ssc[-] enables/disables case-sensitive mode.
-- 7z.exe l shows archive comment for zip archives
-- Some bugs were fixed: long paths names shorter than 4.
-- Speed optimizations for AES encryption.
-
-
-
-4.56 beta 2007-09-13
--------------------------
-- some fixes in LZ encoder (LZMA and Deflate) code.
- size_t was replaces to ptrdiff_t.
- size_t version worked incorrectly with some compilers.
-
-
-4.46 beta 2007-05-25
--------------------------
-- CPP Synchronization objects now return HRes (error code) instead of bool.
-
-
-4.45 beta 2007-04-16
--------------------------
-- 7-Zip now uses C version of CRC, so you must call CrcGenerateTable at
- stratup code, or you must add CPP/Common/CRC.cpp to your project.
-- Method ID in .7z now is 63-bit integer (UInt64).
-- Open error messages
-- unRar 1.5 fixed
-- unShrink fixed
-- BUG of 4.43 beta and 4.44 beta was fixed.
- 7-Zip compressing to .zip in multi-threading mode didn't work in some cases.
-
-
-4.44 beta 2007-01-20
--------------------------
-
-- Bug was fixed: LZMAEncoder.cpp::CEncoder::GetOptimumFast
- it was:
- data++
- fixed version:
- data = _matchFinder.GetPointerToCurrentPos(_matchFinderObj) - 1;
- It could lead to very small cpmpression ratio decreasing when block needs move.
-
-
-4.30 beta 2005-11-18
--------------------------
-- Security.h::AddLockMemoryPrivilege - installs "Large pages" feature
-- MemoryLock.h::EnableLockMemoryPrivilege - enables "Large pages" feature
-- Alloc.h::SetLargePageSize - sets optimal LargePageSize size
-
-
-4.27 2005-09-21
--------------------------
-- Some GUIDs/interfaces were changed.
- IStream.h:
- ISequentialInStream::Read now works as old ReadPart
- ISequentialOutStream::Write now works as old WritePart
-
-
-4.26 beta 2005-08-05
--------------------------
-- MyAlloc(0)/BigAlloc(0) now return 0
-
-
-4.25 beta 2005-07-31
--------------------------
-- More 64-bit compatibilty
-
-
-4.24 beta 2005-07-06
--------------------------
-- Common\NewHandler.h: using throw() for code size optimization.
-
-
-4.23 2005-06-29
--------------------------
-- Bug was fixed: memory leak in Cab decoder.
-
-
-4.19 beta 2005-05-21
--------------------------
-- BZip2 code was rewritten. Now 7-Zip doesn't use original BZip2 code.
- Old (original) version was moved to folder 7zip/Compress/BZip2Original/
-
-
-4.14 beta 2005-01-11
--------------------------
-- STL using was reduced
-- 7za now supports Split(001) archves
-
-
-4.10 beta 2004-10-21
--------------------------
-- Codecs now use new interface: ICompressSetDecoderProperties2
-
-
-4.07 beta 2004-10-03
--------------------------
-- some interfaces were changed slightly to support
- -stdin -stdout mode.
-- FilterCoder for simple filters
-- Wildcard censor class was changed.
-- Bug was fixed: when encrypted stream was multiple 16,
- it used additional 16 empty bytes.
-
-
-3.11 2003-10-06
--------------------------
- File functions support unicode strings even
- on Windows 95/98/ME.
-
-
-3.08.02 2003-09-20
--------------------------
- More compatible with GCC.
-
-
-3.08.02 beta 2003-08-20
--------------------------
- Extracting bug in 7zExtract.cpp was fixed.
-
-
-3.08 beta 2003-08-19
--------------------------
- Big source code reconstruction.
-
-
-2.30 Beta 32 2003-05-15
--------------------------
- Small changes in Deflate decoder.
-
-
-2.30 Beta 31 2003-04-29
--------------------------
- Common/NewHandler.cpp
- HeapAlloc in (included to beta 30) was changed to malloc.
- HeapAlloc worked slower in Win95/98/Me.
-
-
-2.30 Beta 30 2003-04-21
--------------------------
- new file: Common/String.cpp
- Common/NewHandler.* were changed
-
-
-2.30 Beta 29 2003-04-07
--------------------------
- Small changes in LZMA code.
-
-
-2.30 Beta 28 2003-02-16
--------------------------
- Processing anti-files was corrected.
-
-
-2.30 Beta 27 2003-01-24
--------------------------
- Project/Archiver/Format/Common/ArchiveInterface.h:
- new IArchiveOpenVolumeCallback interface.
-
-
-2.30 Beta 26 2003-01-12
--------------------------
- SDK/Interface/PropID.h:
- kpidComment now is kpidCommented
-
-
-2.30 Beta 25 2003-01-02
--------------------------
- Main archive interfaces were changed.
-
-
-2.30 Beta 24 2002-11-01
--------------------------
- SDK/Windows/Synchronization.h
- SDK/Windows/Synchronization.cpp
- - some changes.
-
-
-2.30 Beta 23 2002-09-07
--------------------------
- Project/FileManager folder was added.
- Notation of some source files was changed.
-
-
-2.30 Beta 22 2002-08-28
--------------------------
- Project/FileManager folder was added.
- Notation of some source files was changed.
-
-
-
-2.30 Beta 21 2002-07-08
--------------------------
- Project/Compress/LZ/MatchFinder/BinTree/BinTree.h
- Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h
- Project/Compress/LZ/MatchFinder/BinTree/HC.h
- Project/Compress/LZ/MatchFinder/BinTree/HCMain.h
- - RAM requirements for LZMA (7z) compression were reduced.
-
-
-2.30 Beta 20 2002-07-01
--------------------------
-- SDK/Stream/WindowOut.h
- now it uses only required memory (dictionary size).
-- Project/Archiver/Resource
- contains common resurces
-
-
-2.30 Beta 19 2002-04-11
--------------------------
-- SDK/Archive/Rar/Handler.cpp
- supporting RAR29
-
-2.30 Beta 18 2002-03-25
--------------------------
-- SDK/Archive/Cab/MSZipDecoder.cpp
- SDK/Archive/Cab/LZXDecoder.cpp:
- bug with corrupted archives was fixed
-- Project/Compress/LZ/MatchFinder/BinTree/BinTree.h
-- Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h
- some speed optimization (using prefetching)
-
-
-2.30 Beta 17 2002-03-03
--------------------------
-- ARJ suppport.
-
-
-2.30 Beta 16 2002-02-24
--------------------------
-- Project/Compress/LZ/LZMA/Decoder.cpp:
- Bug was fixed: LZMA could not extract more than 4 GB.
-- RPM and CPIO formats.
-- Project/Compress/LZ/LZMA/Encoder.*
- Project/Archiver/Format/7z/OutHandler.cpp
- New fast compression mode for LZMA: -m0a=0.
-- New match finders for LZMA: bt4b, hc3, hc4.
-
-
-2.30 Beta 15 2002-02-17
--------------------------
-- Compression ratio in LZMA was slightly improved:
- Project/Compress/LZ/LZMA/Encoder.*
- Project/Archiver/Format/7z/OutHandler.cpp
-
-
-2.30 Beta 14 2002-02-10
--------------------------
-- Supporting multithreading for LZMA:
- Project/Compress/LZ/MatchFinder/MT
-- Common/String.h:
- CStringBase::Replace function was fixed.
-
-
-2.30 Beta 13 2002-01-27
--------------------------
-- Compress/LZ/MatchFinder/BinTree3.h:
- method
-- Compress/LZ/MatchFinder/BinTreemain.h:
- - one VirtualAlloc array was splitted to
- the for 3 arrays.
- - Hash-functions were changed.
-
-
-
-2.30 Beta 12 2002-01-16
--------------------------
-- Compress/LZ/MatchFinder/BinTreemain.h:
- Compress/LZ/MatchFinder/Patricia.h:
- Compress/PPM/PPMd/SubAlloc.h:
- Beta 11 bugs were fixed:
- - VirtualFree was used incorrectly
- - checking WIN32 instead _WINDOWS.
- Compress/LZ/MatchFinder/Patricia.h:
- Beta 11 bug with deleting m_Hash2Descendants was fixed.
-
-
-2.30 Beta 11 2002-01-15
--------------------------
-- Compress/LZ/MatchFinder/BinTreemain.h:
- Compress/LZ/MatchFinder/Patricia.h:
- Compress/PPM/PPMd/SubAlloc.h:
- using VirtualAlloc for memory allocating
-- Exlorer/ContextMenu.cpp:
- Testing supporting.
- CreateProcess instead WinExec
-- Format/Common/IArchiveHandler.h:
- Exlorer/ProxyHandler.cpp:
- FAR/Plugin.cpp:
- New properties names: Method, HostOS.
-- Exlorer/OverwriteDialog.cpp:
- FAR/OverwriteDialog.cpp:
- Windows/PropVariantConversions.h
- Using National time format was eliminated.
-
-
-
-2.30 Beta 10 2002-01-11
--------------------------
-- Exlorer/ContextMenu.cpp: bug with context menu on
- Windows NT4 in Unicode version was fixed.
-- Format/7z/UpdateArchiveEngine.cpp: bug was fixed -
- Updating in Beta 8 and 9 didn't work.
-- Exlorer/CCompressDialog.cpp: history growing bug was fixed.
-
-
-2.30 Beta 9 2002-01-08
--------------------------
-- SDK/Common/Vector.h: sopporting sorted object vectors .
-- Lang features.
-- Two new match finders: pat3h and pat4h.
-- SDK/Archive/Zip/InEngine.cpp: bug was fixed.
-- SDK/Windows/FileDir.cpp: function CreateComplexDirectory
- was changed.
-
diff --git a/src/libs/7zip/unix/DOCS/readme.txt b/src/libs/7zip/unix/DOCS/readme.txt
deleted file mode 100644
index aad462642..000000000
--- a/src/libs/7zip/unix/DOCS/readme.txt
+++ /dev/null
@@ -1,181 +0,0 @@
-7-Zip 9.20 Sources
-------------------
-
-7-Zip is a file archiver for Windows.
-
-7-Zip Copyright (C) 1999-2010 Igor Pavlov.
-
-
-License Info
-------------
-
-7-Zip is free software distributed under the GNU LGPL
-(except for unRar code).
-read License.txt for more infomation about license.
-
-Notes about unRAR license:
-
-Please check main restriction from unRar license:
-
- 2. The unRAR sources may be used in any software to handle RAR
- archives without limitations free of charge, but 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.
-
-In brief it means:
-1) You can compile and use compiled files under GNU LGPL rules, since
- unRAR license almost has no restrictions for compiled files.
- You can link these compiled files to LGPL programs.
-2) You can fix bugs in source code and use compiled fixed version.
-3) You can not use unRAR sources to re-create the RAR compression algorithm.
-
-
-LZMA SDK
---------
-
-Also this package contains files from LZMA SDK
-you can download LZMA SDK from this page:
-http://www.7-zip.org/sdk.html
-read about addtional licenses for LZMA SDK in file
-DOC/lzma.txt
-
-
-How to compile
---------------
-To compile sources you need Visual C++ 6.0.
-For compiling some files you also need
-new Platform SDK from Microsoft' Site:
-http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
-or
-http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm
-or
-http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
-
-If you use MSVC6, specify SDK directories at top of directories lists:
-Tools / Options / Directories
- - Include files
- - Library files
-
-
-To compile 7-Zip for AMD64 and IA64 you need:
- Windows Server 2003 SP1 Platform SDK from microsoft.com
-
-Also you need Microsoft Macro Assembler:
- - ml.exe for x86
- - ml64.exe for AMD64
-You can use ml.exe from Windows SDK for Windows Vista or some other version.
-
-
-Compiling under Unix/Linux
---------------------------
-Check this site for Posix/Linux version:
-http://sourceforge.net/projects/p7zip/
-
-
-Notes:
-------
-7-Zip consists of COM modules (DLL files).
-But 7-Zip doesn't use standard COM interfaces for creating objects.
-Look at
-7zip\UI\Client7z folder for example of using DLL files of 7-Zip.
-Some DLL files can use other DLL files from 7-Zip.
-If you don't like it, you must use standalone version of DLL.
-To compile standalone version of DLL you must include all used parts
-to project and define some defs.
-For example, 7zip\Bundles\Format7z is a standalone version of 7z.dll
-that works with 7z format. So you can use such DLL in your project
-without additional DLL files.
-
-
-Description of 7-Zip sources package
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-DOC Documentation
----
- 7zFormat.txt - 7z format description
- copying.txt - GNU LGPL license
- unRarLicense.txt - License for unRAR part of source code
- history.txt - Sources history
- Methods.txt - Compression method IDs
- readme.txt - Readme file
- lzma.txt - LZMA SDK description
- 7zip.nsi - installer script for NSIS
-
-
-C - Source code in C
-CPP - Source code in CPP
-
-Common Common modules
-Windows Win32 wrappers
-
-7zip
--------
- Common Common modules for 7-zip
-
- Archive 7-Zip Archive Format Plugins
- --------
- Common
- 7z
- Arj
- BZip2
- Cab
- Cpio
- GZip
- Rar
- Rpm
- Split
- Tar
- Zip
-
- Bundle Modules that are bundles of other modules
- ------
- Alone 7za.exe: Standalone version of 7z
- Alone7z 7zr.exe: Standalone version of 7z that supports only 7z/LZMA/BCJ/BCJ2
- SFXCon 7zCon.sfx: Console 7z SFX module
- SFXWin 7z.sfx: Windows 7z SFX module
- SFXSetup 7zS.sfx: Windows 7z SFX module for Installers
- Format7z 7za.dll: .7z support
- Format7zExtract 7zxa.dll: .7z support, extracting only
- Format7zR 7zr.dll: .7z support, LZMA/BCJ* only
- Format7zExtractR 7zxr.dll: .7z support, LZMA/BCJ* only, extracting only
- Format7zF 7z.dll: all formats
-
- UI
- --
- Agent Intermediary modules for FAR plugin and Explorer plugin
- Console 7z.exe Console version
- Explorer Explorer plugin
- Resource Resources
- Far FAR plugin
- Client7z Test application for 7za.dll
-
- Compress
- --------
- BZip2 BZip2 compressor
- Branch Branch converter
- ByteSwap Byte Swap converter
- Copy Copy coder
- Deflate
- Implode
- Arj
- LZMA
- PPMd Dmitry Shkarin's PPMdH with small changes.
- LZ Lempel - Ziv
-
- Crypto Crypto modules
- ------
- 7zAES Cipher for 7z
- AES AES Cipher
- Rar20 Cipher for Rar 2.0
- RarAES Cipher for Rar 3.0
- Zip Cipher for Zip
-
- FileManager File Manager
-
-
----
-Igor Pavlov
-http://www.7-zip.org
diff --git a/src/libs/7zip/unix/DOCS/unRarLicense.txt b/src/libs/7zip/unix/DOCS/unRarLicense.txt
deleted file mode 100644
index 5f78b728d..000000000
--- a/src/libs/7zip/unix/DOCS/unRarLicense.txt
+++ /dev/null
@@ -1,41 +0,0 @@
- ****** ***** ****** unRAR - free utility for RAR archives
- ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ****** ******* ****** License for use and distribution of
- ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ** ** ** ** ** ** FREE portable version
- ~~~~~~~~~~~~~~~~~~~~~
-
- The source code of unRAR utility is freeware. This means:
-
- 1. All copyrights to RAR and the utility unRAR are exclusively
- owned by the author - Alexander Roshal.
-
- 2. The unRAR sources may be used in any software to handle RAR
- archives without limitations free of charge, but 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.
-
- 3. The unRAR utility may be freely distributed. No person or company
- may charge a fee for the distribution of unRAR without written
- permission from the copyright holder.
-
- 4. THE RAR ARCHIVER AND THE UNRAR UTILITY ARE DISTRIBUTED "AS IS".
- NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. YOU USE AT
- YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS,
- DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING
- OR MISUSING THIS SOFTWARE.
-
- 5. Installing and using the unRAR utility signifies acceptance of
- these terms and conditions of the license.
-
- 6. If you don't agree with terms of the license you must remove
- unRAR files from your storage devices and cease to use the
- utility.
-
- Thank you for your interest in RAR and unRAR.
-
-
- Alexander L. Roshal \ No newline at end of file
diff --git a/src/libs/7zip/unix/DOCS/Methods.txt b/src/libs/7zip/unix/Methods.txt
index f52e7c315..f52e7c315 100644
--- a/src/libs/7zip/unix/DOCS/Methods.txt
+++ b/src/libs/7zip/unix/Methods.txt
diff --git a/src/libs/7zip/unix/README b/src/libs/7zip/unix/README
deleted file mode 100644
index f5cb312f4..000000000
--- a/src/libs/7zip/unix/README
+++ /dev/null
@@ -1,358 +0,0 @@
- p7zip 9.20
- ==========
-
-Homepage : http://p7zip.sourceforge.net/
-
-p7zip is a port of the Windows programs 7z.exe and 7za.exe provided by 7-zip.
-
-7-zip is a file archiver with the highest compression ratio.
-Homepage : www.7-zip.org
-
- 7z uses plugins (7z.so and Codecs/Rar29.so) to handle archives.
- 7za is a stand-alone executable.
- 7za handles less archive formats than 7z.exe.
- 7zr is a light stand-alone executable that supports only 7z/LZMA/BCJ/BCJ2.
-
-NEW:
- 7zG : see GUI/readme.txt
-
-CAUTION :
----------
-
-- FIRST : DO NOT USE the 7-zip format for backup purpose on Linux/Unix because :
- - 7-zip does not store the owner/group of the file
-
- On Linux/Unix, in order to backup directories you must use tar !
- to backup a directory : tar cf - directory | 7za a -si directory.tar.7z
- to restore your backup : 7za x -so directory.tar.7z | tar xf -
-
-- if you want to send files and directories (not the owner of file)
- to others Unix/MacOS/Windows users, you can use the 7-zip format.
-
- example : 7za a directory.7z directory
-
- do not use "-r" because this flag does not do what you think
- do not use directory/* because of ".*" files
- (example : "directory/*" does not match "directory/.profile")
-
-
-BUILD :
--------
-
- If you have downloaded the "bin" package,
- use directly the program bin/7za.
- (tested on Redhat 9.0, Fedora 2, Mandrake 10.0, Debian 3.0)
- As the program is statically linked, its should run on many x86 or amd64 linux.
-
- If you have downloaded the "source" package,
-
- According to your OS, copy makefile.linux,
- makefile.freebsd, makefile.cygwin, ...
- over makefile.machine
-
- Example : building 7za, 7z (with its plugins), 7zr and Client7z and passing the internal tests
- cp makefile.linux_x86_asm_gcc_4 makefile.linux
- make all_test
-
-
- If you want to make a parallel build on a 4 cpu machine : make -j 4 TARGET
-
- If you have trouble, try : make -f makefile.oldmake TARGET
-
- make depend : to rebuild the makefile.depend
- make clean : to clean all directories
- make : to build bin/7za
- make sfx : to build bin/7zCon.sfx (7za can now create SFX archive)
- make 7z : to build bin/7z and its plugins :
- - "bin/7z.so" (GNU LGPL + AES code license)
- - "bin/Codecs/Rar29.so" (GNU LGPL + unRAR restriction)
- make 7zr : to build bin/7zr
- make all : to build bin/7za and bin/7zCon.sfx
- make all2 : to build bin/7za, bin/7z (with its plugins) and bin/7zCon.sfx
- make all3 : to build bin/7za, bin/7z (with its plugins), bin/7zr and bin/7zCon.sfx
- make test : to test bin/7za (extracting, archiving, password ...)
- make test_7z : to test bin/7z (extracting, archiving, password ...)
- make test_7zr : to test bin/7zr (extracting, archiving, ...)
-
- make 7zG : to build bin/7zG and its plugins :
- - "bin/7z.so" (GNU LGPL + AES code license)
- - "bin/Codecs/Rar29.so" (GNU LGPL + unRAR restriction)
- make test_7zG : to test bin/7zG (extracting, archiving, ...)
-
-
- this procedure has been tested on :
- - x86 CPU :
- Linux - Debian 3.0 Stable
- Linux - Ubuntu 10.10
- MacOS 10.6.6
-
- - AMD64 CPU :
- Linux - Ubuntu 10.10
- MacOS 10.6.6
-
- - sparc CPU :
- Solaris 8 (sparc) with gcc 2.95.2
-
- - powerpc CPU :
- MacOS X 10.4 (ppc)
-
- Some older versions of p7zip were tested :
- - x86 CPU :
- DOS - (built with DJGPP, see http://blairdude.googlepages.com/p7zip )
- Linux - Redhat 9.0 Standart
- Linux - Fedora 2 (Redhat) (gcc 3.3.3 and gcc-3.4.1 with
- stack-smashing protector from www.trl.ibm.com/projects/security/ssp/)
- Linux - Mandrake 10.0 Official
- Linux - Ubuntu 8.04
- FreeBSD 5.2.1 (gcc 3.3.3)
- MacOS 10.4.8
- NetBSD
- CYGWIN_NT-5.1 1.5.9(0.112/4/2) 2004-03-18 23:05 i686 Cygwin
- Solaris 9 (x86) with gcc 3.3.2
- Solaris 10 (x86)
-
- - alpha CPU :
- Linux - Debian 3.0 (alpha) with gcc 2.95.4
-
- - AMD64 CPU :
- Linux - SuSE 8 ES (AMD64 Opteron) with gcc 3.2.2
- Linux - Fedora 4 (AMD64 Turion) with gcc 4.0.1
- Linux - Ubuntu 8.10
-
- - Itanium CPU :
- HP-UX B.11.31 U ia64 with aCC (HP C/aC++ B3910B A.06.14 [Feb 22 2007])
-
- - s390x CPU :
- Linux - SUSE Enterprise Linux 10 - with gcc 4.1.2
- ( only the 32bits built works, the 64bits built does not pass the tests )
-
- - sparc CPU :
- Solaris 9 (sparc) with gcc 3.3.2
-
- - powerpc CPU :
- MacOS X 10.1/darwin 5.5 with gcc 932.1 (gcc 2.95.2)
- MacOS X 10.3 with XCode 1.5
-
- - openpower CPU :
- Linux openpower-linux1 2.6.5-7.97-pseries64 (ppc64) with gcc 3.3.3
-
- - IBM :
- AIX 5.3 with gcc 4.1.0
-
- - Tru64 :
- OSF 5.1 with gcc 3.4.2
-
- - PA-RISC :
- HP-UX 11.11 with aCC (HP ANSI C++ B3910B A.03.73)
- HP-UX 11.11 with gcc 3.4.2 (7za and 7zr : OK, 7z : failed because of a buggy gcc for HP-UX,
- plugins don't work because C++ constructors are not called !)
-
-
-BUILD with cmake
-----------------
- You can only build 7za.
-
- cd CPP/7zip/CMAKE
-
- edit generate.sh to choose your target
-
- ./generate.sh
-
- the cmake project for the target is in "CPP/7zip/CMAKE/Alone".
-
- For the target "Unix Makefiles", use "make" to compile
-
- For others target, use the IDE (CodeBlocks, KDevelop3, Eclipse CDT4)
-
-INSTALL :
----------
-
- method 1
- --------
- - edit install.sh to change DEST_HOME
- - ./install.sh : to install
- Remark : you must be "root" to install 7za in the directory "/usr/local"
-
- method 2
- --------
- - 7za is a stand-alone program, you can put this program where you want.
- example : cp bin/7za /usr/local/bin/7za
-
- - 7z needs its plugins. You must copy the file 7z, 7z.so
- and the directory Codecs in the same destination directory.
-
- - if you want to be able to create SFX archive, copy bin/7zCon.sfx
- to the directory where 7za or 7z can be found.
-
-
-USAGE:
-------
- Remark : you can replace 7za with 7z.
-
- 7za t archive.7z : tests files in the archive archive.7z
- 7za l archive.7z : lists all files from archive archive.7z
- 7za x archive.7z : extracts all files from archive archive.7z
- to the current directory
-
- 7za a archive.7z file1 fileN : add files to the archive archive.7z
-
- 7za a archive.7z dir1 : add all files and subdirectories from directory "dir1" to archive archive.7z
-
- CAUTION : do not use the flag "-r" unless you know what you are doing ...
-
- 7za a -sfx archive.exe dir1 : add all files from directory "dir1" to SFX archive archive.exe
- (Remark : SFX archive MUST end with ".exe")
-
- You can also add or extract files to/from .zip or .tar archives.
- You can also compress/uncompress .gz or .bz2 files.
-
- 7za a -tzip archive.zip file file2 file3
- 7za a -ttar archive.tar file
- 7za a -tgzip file.gz file
- 7za a -tbzip2 archive.bz2 file
-
- You can use password for archives:
- 7za a -pmy_password archive.7z dir1
-
- For .7z archive only, you can enable archive header encryption with "-mhe"
- 7za a -mhe=on -pmy_password archive.7z dir1
-
- For more, see the documentation of 7za.exe in DOCS/MANUAL directory
- 7za a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1
- adds all files from directory "dir1" to archive archive.7z
- using "ultra settings".
- -t7z : 7z archive
- -m0=lzma : lzma method
- -mx=9 : level of compression = 9 (Ultra)
- -mfb=64 : number of fast bytes for LZMA = 64
- -md=32m : dictionary size = 32 megabytes
- -ms=on : solid archive = on
-
- To use the new codec "lzma2"
- 7za a -m0=lzma2 archive.7z directory
-
-
-BENCHMARKS :
-------------
- 7za b : bench LZMA codec
- 7z b -mm=crc : make internal crc check.
-
-
-hugetlbfs (large pages)
-------------
-
- Using huges pages in Linux requires some preparations.
- First, make sure your running kernel has support for hugetlbfs compiled in:
-
- ~$ grep hugetlbfs /proc/filesystems
- nodev hugetlbfs
-
- You can view your current huge page configuration like this:
-
- ~$ grep Huge /proc/meminfo
- HugePages_Total: 0
- HugePages_Free: 0
- HugePages_Rsvd: 0
- HugePages_Surp: 0
- Hugepagesize: 2048 kB
-
- In this case the size of a huge page is 2 MiB.
- So, if you have 2 GiB of RAM and want to reserve 512 MiB for huge pages,
- you would need 256 pages.
-
- Do the following as root:
-
- ~# echo 296 >/proc/sys/vm/nr_hugepages
- ~# grep Huge /proc/meminfo
- HugePages_Total: 296
- HugePages_Free: 296
- HugePages_Rsvd: 0
- HugePages_Surp: 0
- Hugepagesize: 2048 kB
-
- Finally, make access from user space possible:
-
- ~# mkdir /hugepages
- ~# mount -t hugetlbfs -o rw,nosuid,nodev,noexec,noatime none /hugepages
- ~# chmod 1777 /hugepages
-
- Option 1 : Now huge pages are configured.
- In your shell, set the environment variable HUGETLB_PATH to the mount point:
- ~$ export HUGETLB_PATH=/hugepages
- or
-
- Option 2 : Let p7zip find out the first directory with the type "hugetlbfs"
-
-
- To enable huge page use in p7zip, pass the '-slp' switch to it.
- Ex: 7za -slp a t.7z dir
-
-
-
- If you want this to be a permanent setup :
- - mkdir /hugepages
-
- - add an entry to your /etc/fstab so that when you reboot your computer,
- your hugetlbfs will mount automatically :
- hugetlbfs /hugepages hugetlbfs rw,nosuid,nodev,noexec,noatime 0 0
-
- - add this in your /etc/rc.local :
- chmod 1777 /hugepages
- echo 296 > /proc/sys/vm/nr_hugepages
-
- optional : export HUGETLB_PATH=/hugepages
-
- To enable huge page use in p7zip, pass the '-slp' switch to it : 7za -slp b
-
-
- Remark : with current CPU : "7za -slp b" is not faster than "7za b".
- If you want to see some speedup, compress at least 300MB
- Ex : 7za -slp -mx=9 -a big_file.tar.7z big_file.tar
-
-
-LICENSE :
----------
- please read DOCS/License.txt.
-
-LIMITATIONS from 7-zip :
-------------------------
-
- - does not support uid/gid for the .tar format (so, use tar on Unix)
-
-LIMITATIONS for Unix version only :
------------------------------------
-
- - can handle properly UNICODE filenames only if the environment is UTF-8.
- Example : export LANG=en_US.UTF-8 ; unset LC_CTYPE
- Remark : see the possible values for LANG in the directory
- - /usr/lib/locale : Fedora 2 / Solaris 8
- - /usr/share/locale : OpenBSD / Debian / FreeBSD / MacOS X / Mandrake 10.1 / NetBSD
-
- On Linux, to display the available locales : locale -a
-
- p7zip relies on LC_CTYPE and then on LANG to convert name to/from UNICODE.
- the command "locale" should display these environment variables.
- you can also do "echo $LC_CTYPE" and "echo $LANG".
-
- If you do not plan to export your archive, you can use the flag "-no-utf16".
- Usage :
- 7za a -no-utf16 archive.7z dirOrFile1 ... dirOrFileN
- 7za t -no-utf16 archive.7z
- 7za l -no-utf16 archive.7z
- 7za x -no-utf16 archive.7z
-
- - ignores Windows file access permissions (files are created with default permissions)
-
- see also TODO file.
-
-DEVELOPPER CORNER:
-------------------
-
- - WaitForMultipleObject has no equivalence on Unix.
- - Events don't exist.
- - sizeof(wchar_t) = 4 with GCC (2 with MS VC++)
- - "FIXME" in source code indicates that you should add codes to better handle all cases.
-
- - "FIXED" in source code indicates that the original code has been changed to work in Unix environment.
-
- see also TODO file.
diff --git a/src/libs/7zip/unix/TODO b/src/libs/7zip/unix/TODO
deleted file mode 100644
index 82f87d68b..000000000
--- a/src/libs/7zip/unix/TODO
+++ /dev/null
@@ -1,39 +0,0 @@
-
-7za/7z
-======
-- auto-generate config.h (use a configure script ...)
-
-- suppress all exit(EXIT_FAILURE), FIXME, ...
-
-- no chmod for TAR (should restore the rights set)
-
-- no chown(uid,gid) for TAR
-
-- Use a more portable "String.h"
-
-- UTF16 : try to test with Complex Unicode filenames
-
-- KNOWN BUGS
-
- - date (format arj/rar/chm) ?
-
- - absolute path ?
-
-- zip format : better support of symbolic links
-
-7zG / 7zFM
-==========================
-
-- better help displaying
-
-- better support for space in filenames
-
-
-7zG :
- - sfx: wants 7z.sfx instead of 7zCon.sfx ?
- - the dialogs are not on top of other windows => not visible ...
-
-
-7zFM :
- - the path "/" does not work (on OSX ?)
- - strange behaviour : selected/unselected items
diff --git a/src/libs/7zip/unix/history.txt b/src/libs/7zip/unix/history.txt
new file mode 100644
index 000000000..79abd9cea
--- /dev/null
+++ b/src/libs/7zip/unix/history.txt
@@ -0,0 +1,271 @@
+HISTORY of the LZMA SDK
+-----------------------
+
+9.18 beta 2010-11-02
+-------------------------
+- New small SFX module for installers (SfxSetup).
+
+
+9.12 beta 2010-03-24
+-------------------------
+- The BUG in LZMA SDK 9.* was fixed: LZMA2 codec didn't work,
+ if more than 10 threads were used (or more than 20 threads in some modes).
+
+
+9.11 beta 2010-03-15
+-------------------------
+- PPMd compression method support
+
+
+9.09 2009-12-12
+-------------------------
+- The bug was fixed:
+ Utf16_To_Utf8 funstions in UTFConvert.cpp and 7zMain.c
+ incorrectly converted surrogate characters (the code >= 0x10000) to UTF-8.
+- Some bugs were fixed
+
+
+9.06 2009-08-17
+-------------------------
+- Some changes in ANSI-C 7z Decoder interfaces.
+
+
+9.04 2009-05-30
+-------------------------
+- LZMA2 compression method support
+- xz format support
+
+
+4.65 2009-02-03
+-------------------------
+- Some minor fixes
+
+
+4.63 2008-12-31
+-------------------------
+- Some minor fixes
+
+
+4.61 beta 2008-11-23
+-------------------------
+- The bug in ANSI-C LZMA Decoder was fixed:
+ If encoded stream was corrupted, decoder could access memory
+ outside of allocated range.
+- Some changes in ANSI-C 7z Decoder interfaces.
+- LZMA SDK is placed in the public domain.
+
+
+4.60 beta 2008-08-19
+-------------------------
+- Some minor fixes.
+
+
+4.59 beta 2008-08-13
+-------------------------
+- The bug was fixed:
+ LZMA Encoder in fast compression mode could access memory outside of
+ allocated range in some rare cases.
+
+
+4.58 beta 2008-05-05
+-------------------------
+- ANSI-C LZMA Decoder was rewritten for speed optimizations.
+- ANSI-C LZMA Encoder was included to LZMA SDK.
+- C++ LZMA code now is just wrapper over ANSI-C code.
+
+
+4.57 2007-12-12
+-------------------------
+- Speed optimizations in Ñ++ LZMA Decoder.
+- Small changes for more compatibility with some C/C++ compilers.
+
+
+4.49 beta 2007-07-05
+-------------------------
+- .7z ANSI-C Decoder:
+ - now it supports BCJ and BCJ2 filters
+ - now it supports files larger than 4 GB.
+ - now it supports "Last Write Time" field for files.
+- C++ code for .7z archives compressing/decompressing from 7-zip
+ was included to LZMA SDK.
+
+
+4.43 2006-06-04
+-------------------------
+- Small changes for more compatibility with some C/C++ compilers.
+
+
+4.42 2006-05-15
+-------------------------
+- Small changes in .h files in ANSI-C version.
+
+
+4.39 beta 2006-04-14
+-------------------------
+- The bug in versions 4.33b:4.38b was fixed:
+ C++ version of LZMA encoder could not correctly compress
+ files larger than 2 GB with HC4 match finder (-mfhc4).
+
+
+4.37 beta 2005-04-06
+-------------------------
+- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined.
+
+
+4.35 beta 2005-03-02
+-------------------------
+- The bug was fixed in C++ version of LZMA Decoder:
+ If encoded stream was corrupted, decoder could access memory
+ outside of allocated range.
+
+
+4.34 beta 2006-02-27
+-------------------------
+- Compressing speed and memory requirements for compressing were increased
+- LZMA now can use only these match finders: HC4, BT2, BT3, BT4
+
+
+4.32 2005-12-09
+-------------------------
+- Java version of LZMA SDK was included
+
+
+4.30 2005-11-20
+-------------------------
+- Compression ratio was improved in -a2 mode
+- Speed optimizations for compressing in -a2 mode
+- -fb switch now supports values up to 273
+- The bug in 7z_C (7zIn.c) was fixed:
+ It used Alloc/Free functions from different memory pools.
+ So if program used two memory pools, it worked incorrectly.
+- 7z_C: .7z format supporting was improved
+- LZMA# SDK (C#.NET version) was included
+
+
+4.27 (Updated) 2005-09-21
+-------------------------
+- Some GUIDs/interfaces in C++ were changed.
+ IStream.h:
+ ISequentialInStream::Read now works as old ReadPart
+ ISequentialOutStream::Write now works as old WritePart
+
+
+4.27 2005-08-07
+-------------------------
+- The bug in LzmaDecodeSize.c was fixed:
+ if _LZMA_IN_CB and _LZMA_OUT_READ were defined,
+ decompressing worked incorrectly.
+
+
+4.26 2005-08-05
+-------------------------
+- Fixes in 7z_C code and LzmaTest.c:
+ previous versions could work incorrectly,
+ if malloc(0) returns 0
+
+
+4.23 2005-06-29
+-------------------------
+- Small fixes in C++ code
+
+
+4.22 2005-06-10
+-------------------------
+- Small fixes
+
+
+4.21 2005-06-08
+-------------------------
+- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed
+- New additional version of ANSI-C LZMA Decoder with zlib-like interface:
+ - LzmaStateDecode.h
+ - LzmaStateDecode.c
+ - LzmaStateTest.c
+- ANSI-C LZMA Decoder now can decompress files larger than 4 GB
+
+
+4.17 2005-04-18
+-------------------------
+- New example for RAM->RAM compressing/decompressing:
+ LZMA + BCJ (filter for x86 code):
+ - LzmaRam.h
+ - LzmaRam.cpp
+ - LzmaRamDecode.h
+ - LzmaRamDecode.c
+ - -f86 switch for lzma.exe
+
+
+4.16 2005-03-29
+-------------------------
+- The bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder):
+ If _LZMA_OUT_READ was defined, and if encoded stream was corrupted,
+ decoder could access memory outside of allocated range.
+- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster).
+ Old version of LZMA Decoder now is in file LzmaDecodeSize.c.
+ LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c
+- Small speed optimization in LZMA C++ code
+- filter for SPARC's code was added
+- Simplified version of .7z ANSI-C Decoder was included
+
+
+4.06 2004-09-05
+-------------------------
+- The bug in v4.05 was fixed:
+ LZMA-Encoder didn't release output stream in some cases.
+
+
+4.05 2004-08-25
+-------------------------
+- Source code of filters for x86, IA-64, ARM, ARM-Thumb
+ and PowerPC code was included to SDK
+- Some internal minor changes
+
+
+4.04 2004-07-28
+-------------------------
+- More compatibility with some C++ compilers
+
+
+4.03 2004-06-18
+-------------------------
+- "Benchmark" command was added. It measures compressing
+ and decompressing speed and shows rating values.
+ Also it checks hardware errors.
+
+
+4.02 2004-06-10
+-------------------------
+- C++ LZMA Encoder/Decoder code now is more portable
+ and it can be compiled by GCC on Linux.
+
+
+4.01 2004-02-15
+-------------------------
+- Some detection of data corruption was enabled.
+ LzmaDecode.c / RangeDecoderReadByte
+ .....
+ {
+ rd->ExtraBytes = 1;
+ return 0xFF;
+ }
+
+
+4.00 2004-02-13
+-------------------------
+- Original version of LZMA SDK
+
+
+
+HISTORY of the LZMA
+-------------------
+ 2001-2008: Improvements to LZMA compressing/decompressing code,
+ keeping compatibility with original LZMA format
+ 1996-2001: Development of LZMA compression format
+
+ Some milestones:
+
+ 2001-08-30: LZMA compression was added to 7-Zip
+ 1999-01-02: First version of 7-Zip was released
+
+
+End of document
diff --git a/src/libs/7zip/unix/installer_framework_changes.txt b/src/libs/7zip/unix/installer_framework_changes.txt
deleted file mode 100644
index b9e1616f2..000000000
--- a/src/libs/7zip/unix/installer_framework_changes.txt
+++ /dev/null
@@ -1,511 +0,0 @@
-There are deleted files and very small changes to get the integration process of new versions very simple.
---diff-filter=M means "modified" and
---diff-filter=D means "deleted" files
-
-=== output of: git diff --diff-filter=M ===
-
-diff --git a/C/AesOpt.c b/C/AesOpt.c
-index 60cfd86..c0bd8bc 100644
---- a/C/AesOpt.c
-+++ b/C/AesOpt.c
-@@ -5,7 +5,7 @@
-
- #ifdef MY_CPU_X86_OR_AMD64
- #if _MSC_VER >= 1500
--#define USE_INTEL_AES
-+//#define USE_INTEL_AES
- #endif
- #endif
-
-diff --git a/CPP/7zip/Common/RegisterArc.h b/CPP/7zip/Common/RegisterArc.h
-index bc2a034..9b8cbd3 100644
---- a/CPP/7zip/Common/RegisterArc.h
-+++ b/CPP/7zip/Common/RegisterArc.h
-@@ -27,6 +27,6 @@ void RegisterArc(const CArcInfo *arcInfo);
-
- #define REGISTER_ARC(x) struct REGISTER_ARC_NAME(x) { \
- REGISTER_ARC_NAME(x)() { RegisterArc(&g_ArcInfo); }}; \
-- static REGISTER_ARC_NAME(x) g_RegisterArc;
--
-+ static REGISTER_ARC_NAME(x) g_RegisterArc; \
-+ void registerArc##x() { static REGISTER_ARC_NAME(x) g_RegisterArc; }
- #endif
-diff --git a/CPP/7zip/Common/RegisterCodec.h b/CPP/7zip/Common/RegisterCodec.h
-index 786b4a4..d53c434 100644
---- a/CPP/7zip/Common/RegisterCodec.h
-+++ b/CPP/7zip/Common/RegisterCodec.h
-@@ -22,12 +22,13 @@ void RegisterCodec(const CCodecInfo *codecInfo);
-
- #define REGISTER_CODEC(x) struct REGISTER_CODEC_NAME(x) { \
- REGISTER_CODEC_NAME(x)() { RegisterCodec(&g_CodecInfo); }}; \
-- static REGISTER_CODEC_NAME(x) g_RegisterCodec;
-+ static REGISTER_CODEC_NAME(x) g_RegisterCodec; \
-+ void registerCodec##x() { static REGISTER_CODEC_NAME(x) g_RegisterCodecs; }
-
- #define REGISTER_CODECS_NAME(x) CRegisterCodecs ## x
- #define REGISTER_CODECS(x) struct REGISTER_CODECS_NAME(x) { \
- REGISTER_CODECS_NAME(x)() { for (int i = 0; i < sizeof(g_CodecsInfo) / sizeof(g_CodecsInfo[0]); i++) \
- RegisterCodec(&g_CodecsInfo[i]); }}; \
-- static REGISTER_CODECS_NAME(x) g_RegisterCodecs;
--
-+ static REGISTER_CODECS_NAME(x) g_RegisterCodecs; \
-+ void registerCodec##x() { static REGISTER_CODECS_NAME(x) g_RegisterCodecs; }
- #endif
-diff --git a/CPP/Common/MyString.h b/CPP/Common/MyString.h
-index eb3c52d..f483e39 100644
---- a/CPP/Common/MyString.h
-+++ b/CPP/Common/MyString.h
-@@ -7,6 +7,8 @@
-
- #include "MyVector.h"
-
-+#include <windows.h>
-+
- template <class T>
- inline int MyStringLen(const T *s)
- {
-
-=== output of: git diff --diff-filter=D --name-only ===
-Asm/x64/7zCrcT8U.asm
-Asm/x86/7zCrcT8U.asm
-CPP/7zip/Bundles/Alone/makefile
-CPP/7zip/Bundles/Alone/makefile.depend
-CPP/7zip/Bundles/Alone/makefile.list
-CPP/7zip/Bundles/Alone7z/makefile
-CPP/7zip/Bundles/Alone7z/makefile.depend
-CPP/7zip/Bundles/Alone7z/makefile.list
-CPP/7zip/Bundles/AloneGCOV/makefile
-CPP/7zip/Bundles/Format7zFree/makefile
-CPP/7zip/Bundles/Format7zFree/makefile.depend
-CPP/7zip/Bundles/Format7zFree/makefile.list
-CPP/7zip/Bundles/SFXCon/Main.cpp
-CPP/7zip/Bundles/SFXCon/makefile
-CPP/7zip/Bundles/SFXCon/makefile.depend
-CPP/7zip/Bundles/SFXCon/makefile.list
-CPP/7zip/CMAKE/CMakeLists_7zFM.txt
-CPP/7zip/CMAKE/CMakeLists_7zG.txt
-CPP/7zip/CMAKE/CMakeLists_7za.txt
-CPP/7zip/CMAKE/CMakeLists_ALL.txt
-CPP/7zip/CMAKE/CMakeLists_Format7zFree.txt
-CPP/7zip/CMAKE/generate.sh
-CPP/7zip/CMAKE/generate_xcode.sh
-CPP/7zip/Compress/LZMA_Alone/makefile
-CPP/7zip/Compress/Rar/makefile
-CPP/7zip/Compress/Rar/makefile.depend
-CPP/7zip/Compress/Rar/makefile.list
-CPP/7zip/PREMAKE/generate.sh
-CPP/7zip/PREMAKE/premake4.lua
-CPP/7zip/QMAKE/7ZA/7ZA.pro
-CPP/7zip/QMAKE/7ZA/7ZA_osx.pro
-CPP/7zip/QMAKE/test_emul/test_emul.pro
-CPP/7zip/TEST/TestUI/makefile
-CPP/7zip/TEST/TestUI/makefile.depend
-CPP/7zip/TEST/TestUI/makefile.list
-CPP/7zip/UI/Client7z/makefile
-CPP/7zip/UI/Client7z/makefile.depend
-CPP/7zip/UI/Client7z/makefile.list
-CPP/7zip/UI/ClientCodec/makefile
-CPP/7zip/UI/ClientCodec/makefile.depend
-CPP/7zip/UI/ClientCodec/makefile.list
-CPP/7zip/UI/Console/makefile
-CPP/7zip/UI/Console/makefile.depend
-CPP/7zip/UI/Console/makefile.list
-CPP/7zip/UI/Explorer/ContextMenu.h
-CPP/7zip/UI/Explorer/MyMessages.cpp
-CPP/7zip/UI/Explorer/MyMessages.h
-CPP/7zip/UI/FileManager/App.cpp
-CPP/7zip/UI/FileManager/App.h
-CPP/7zip/UI/FileManager/AppState.h
-CPP/7zip/UI/FileManager/BrowseDialog.h
-CPP/7zip/UI/FileManager/ClassDefs.cpp
-CPP/7zip/UI/FileManager/ComboDialog.cpp
-CPP/7zip/UI/FileManager/ComboDialog.h
-CPP/7zip/UI/FileManager/ComboDialogRes.h
-CPP/7zip/UI/FileManager/ComboDialog_rc.cpp
-CPP/7zip/UI/FileManager/CopyDialog.cpp
-CPP/7zip/UI/FileManager/CopyDialog.h
-CPP/7zip/UI/FileManager/CopyDialogRes.h
-CPP/7zip/UI/FileManager/CopyDialog_rc.cpp
-CPP/7zip/UI/FileManager/DialogSize.h
-CPP/7zip/UI/FileManager/ExtractCallback.cpp
-CPP/7zip/UI/FileManager/ExtractCallback.h
-CPP/7zip/UI/FileManager/FM.cpp
-CPP/7zip/UI/FileManager/FM_rc.cpp
-CPP/7zip/UI/FileManager/FSDrives.cpp
-CPP/7zip/UI/FileManager/FSDrives.h
-CPP/7zip/UI/FileManager/FSFolder.cpp
-CPP/7zip/UI/FileManager/FSFolder.h
-CPP/7zip/UI/FileManager/FSFolderCopy.cpp
-CPP/7zip/UI/FileManager/FileFolderPluginOpen.cpp
-CPP/7zip/UI/FileManager/FileFolderPluginOpen.h
-CPP/7zip/UI/FileManager/FormatUtils.cpp
-CPP/7zip/UI/FileManager/FormatUtils.h
-CPP/7zip/UI/FileManager/HelpUtils.h
-CPP/7zip/UI/FileManager/IFolder.h
-CPP/7zip/UI/FileManager/LangUtils.cpp
-CPP/7zip/UI/FileManager/LangUtils.h
-CPP/7zip/UI/FileManager/ListViewDialog.cpp
-CPP/7zip/UI/FileManager/ListViewDialog.h
-CPP/7zip/UI/FileManager/ListViewDialogRes.h
-CPP/7zip/UI/FileManager/ListViewDialog_rc.cpp
-CPP/7zip/UI/FileManager/MessagesDialog.cpp
-CPP/7zip/UI/FileManager/MessagesDialog.h
-CPP/7zip/UI/FileManager/MessagesDialogRes.h
-CPP/7zip/UI/FileManager/MessagesDialog_rc.cpp
-CPP/7zip/UI/FileManager/MyLoadMenu.cpp
-CPP/7zip/UI/FileManager/MyLoadMenu.h
-CPP/7zip/UI/FileManager/NetFolder.h.OUT
-CPP/7zip/UI/FileManager/OpenCallback.cpp
-CPP/7zip/UI/FileManager/OpenCallback.h
-CPP/7zip/UI/FileManager/OverwriteDialog.cpp
-CPP/7zip/UI/FileManager/OverwriteDialog.h
-CPP/7zip/UI/FileManager/OverwriteDialogRes.h
-CPP/7zip/UI/FileManager/OverwriteDialog_rc.cpp
-CPP/7zip/UI/FileManager/Panel.cpp
-CPP/7zip/UI/FileManager/Panel.h
-CPP/7zip/UI/FileManager/PanelCopy.cpp
-CPP/7zip/UI/FileManager/PanelCrc.cpp
-CPP/7zip/UI/FileManager/PanelCrc.cpp.back
-CPP/7zip/UI/FileManager/PanelFolderChange.cpp
-CPP/7zip/UI/FileManager/PanelItemOpen.cpp
-CPP/7zip/UI/FileManager/PanelItems.cpp
-CPP/7zip/UI/FileManager/PanelListNotify.cpp
-CPP/7zip/UI/FileManager/PanelMenu.cpp
-CPP/7zip/UI/FileManager/PanelOperations.cpp
-CPP/7zip/UI/FileManager/PanelSelect.cpp
-CPP/7zip/UI/FileManager/PanelSort.cpp
-CPP/7zip/UI/FileManager/PanelSplitFile.cpp
-CPP/7zip/UI/FileManager/PasswordDialog.cpp
-CPP/7zip/UI/FileManager/PasswordDialog.h
-CPP/7zip/UI/FileManager/PasswordDialogRes.h
-CPP/7zip/UI/FileManager/PasswordDialog_rc.cpp
-CPP/7zip/UI/FileManager/PluginInterface.h
-CPP/7zip/UI/FileManager/PluginLoader.h
-CPP/7zip/UI/FileManager/ProgramLocation.cpp
-CPP/7zip/UI/FileManager/ProgramLocation.h
-CPP/7zip/UI/FileManager/ProgressDialog2.cpp
-CPP/7zip/UI/FileManager/ProgressDialog2.h
-CPP/7zip/UI/FileManager/ProgressDialog2Res.h
-CPP/7zip/UI/FileManager/ProgressDialog2_rc.cpp
-CPP/7zip/UI/FileManager/ProgressDialogRes.h
-CPP/7zip/UI/FileManager/PropertyName.cpp
-CPP/7zip/UI/FileManager/PropertyName.h
-CPP/7zip/UI/FileManager/PropertyNameRes.h
-CPP/7zip/UI/FileManager/RegistryAssociations.cpp
-CPP/7zip/UI/FileManager/RegistryAssociations.h
-CPP/7zip/UI/FileManager/RegistryPlugins.h
-CPP/7zip/UI/FileManager/RegistryUtils.cpp
-CPP/7zip/UI/FileManager/RegistryUtils.h
-CPP/7zip/UI/FileManager/RootFolder.cpp
-CPP/7zip/UI/FileManager/RootFolder.h
-CPP/7zip/UI/FileManager/SplitDialog.cpp
-CPP/7zip/UI/FileManager/SplitDialog.h
-CPP/7zip/UI/FileManager/SplitDialogRes.h
-CPP/7zip/UI/FileManager/SplitDialog_rc.cpp
-CPP/7zip/UI/FileManager/SplitUtils.cpp
-CPP/7zip/UI/FileManager/SplitUtils.h
-CPP/7zip/UI/FileManager/StringUtils.cpp
-CPP/7zip/UI/FileManager/StringUtils.h
-CPP/7zip/UI/FileManager/SysIconUtils.cpp
-CPP/7zip/UI/FileManager/SysIconUtils.h
-CPP/7zip/UI/FileManager/TextPairs.cpp
-CPP/7zip/UI/FileManager/TextPairs.h
-CPP/7zip/UI/FileManager/UpdateCallback100.cpp
-CPP/7zip/UI/FileManager/UpdateCallback100.h
-CPP/7zip/UI/FileManager/ViewSettings.cpp
-CPP/7zip/UI/FileManager/ViewSettings.h
-CPP/7zip/UI/FileManager/err
-CPP/7zip/UI/FileManager/makefile
-CPP/7zip/UI/FileManager/makefile.depend
-CPP/7zip/UI/FileManager/makefile.list
-CPP/7zip/UI/FileManager/res/Add2PNG.h
-CPP/7zip/UI/FileManager/res/AddPNG.h
-CPP/7zip/UI/FileManager/res/Copy2PNG.h
-CPP/7zip/UI/FileManager/res/CopyPNG.h
-CPP/7zip/UI/FileManager/res/Delete2PNG.h
-CPP/7zip/UI/FileManager/res/DeletePNG.h
-CPP/7zip/UI/FileManager/res/Extract2PNG.h
-CPP/7zip/UI/FileManager/res/ExtractPNG.h
-CPP/7zip/UI/FileManager/res/Info2PNG.h
-CPP/7zip/UI/FileManager/res/InfoPNG.h
-CPP/7zip/UI/FileManager/res/Move2PNG.h
-CPP/7zip/UI/FileManager/res/MovePNG.h
-CPP/7zip/UI/FileManager/res/ParentFolder.h
-CPP/7zip/UI/FileManager/res/Test2PNG.h
-CPP/7zip/UI/FileManager/res/TestPNG.h
-CPP/7zip/UI/FileManager/resource.h
-CPP/7zip/UI/FileManager/resourceGui.h
-CPP/7zip/UI/FileManager/wxFM.cpp
-CPP/7zip/UI/GUI/makefile
-CPP/7zip/UI/GUI/makefile.depend
-CPP/7zip/UI/GUI/makefile.list
-CPP/7zip/UI/P7ZIP/FileDir.o
-CPP/7zip/UI/P7ZIP/FileFind.o
-CPP/7zip/UI/P7ZIP/IntToString.o
-CPP/7zip/UI/P7ZIP/MyString.o
-CPP/7zip/UI/P7ZIP/MyVector.o
-CPP/7zip/UI/P7ZIP/StringConvert.o
-CPP/7zip/UI/P7ZIP/Threads.o
-CPP/7zip/UI/P7ZIP/makefile
-CPP/7zip/UI/P7ZIP/makefile.depend
-CPP/7zip/UI/P7ZIP/makefile.list
-CPP/7zip/UI/P7ZIP/wine_date_and_time.o
-CPP/7zip/UI/P7ZIP/wxP7ZIP.o
-CPP/myWindows/makefile
-CPP/myWindows/makefile.depend
-CPP/myWindows/makefile.list
-GUI/Contents/Info.plist
-GUI/Contents/PkgInfo
-GUI/Contents/Resources/p7zip.icns
-GUI/Lang/af.txt
-GUI/Lang/ar.txt
-GUI/Lang/ast.txt
-GUI/Lang/az.txt
-GUI/Lang/ba.txt
-GUI/Lang/be.txt
-GUI/Lang/bg.txt
-GUI/Lang/bn.txt
-GUI/Lang/br.txt
-GUI/Lang/ca.txt
-GUI/Lang/cs.txt
-GUI/Lang/cy.txt
-GUI/Lang/da.txt
-GUI/Lang/de.txt
-GUI/Lang/el.txt
-GUI/Lang/en.ttt
-GUI/Lang/eo.txt
-GUI/Lang/es.txt
-GUI/Lang/et.txt
-GUI/Lang/eu.txt
-GUI/Lang/ext.txt
-GUI/Lang/fa.txt
-GUI/Lang/fi.txt
-GUI/Lang/fr.txt
-GUI/Lang/fur.txt
-GUI/Lang/fy.txt
-GUI/Lang/gl.txt
-GUI/Lang/gu.txt
-GUI/Lang/he.txt
-GUI/Lang/hi.txt
-GUI/Lang/hr.txt
-GUI/Lang/hu.txt
-GUI/Lang/hy.txt
-GUI/Lang/id.txt
-GUI/Lang/io.txt
-GUI/Lang/is.txt
-GUI/Lang/it.txt
-GUI/Lang/ja.txt
-GUI/Lang/ka.txt
-GUI/Lang/kk.txt
-GUI/Lang/ko.txt
-GUI/Lang/ku-ckb.txt
-GUI/Lang/ku.txt
-GUI/Lang/lt.txt
-GUI/Lang/lv.txt
-GUI/Lang/mk.txt
-GUI/Lang/mn.txt
-GUI/Lang/mr.txt
-GUI/Lang/ms.txt
-GUI/Lang/nb.txt
-GUI/Lang/ne.txt
-GUI/Lang/nl.txt
-GUI/Lang/nn.txt
-GUI/Lang/pa-in.txt
-GUI/Lang/pl.txt
-GUI/Lang/ps.txt
-GUI/Lang/pt-br.txt
-GUI/Lang/pt.txt
-GUI/Lang/ro.txt
-GUI/Lang/ru.txt
-GUI/Lang/sa.txt
-GUI/Lang/si.txt
-GUI/Lang/sk.txt
-GUI/Lang/sl.txt
-GUI/Lang/sq.txt
-GUI/Lang/sr-spc.txt
-GUI/Lang/sr-spl.txt
-GUI/Lang/sv.txt
-GUI/Lang/ta.txt
-GUI/Lang/th.txt
-GUI/Lang/tr.txt
-GUI/Lang/tt.txt
-GUI/Lang/ug.txt
-GUI/Lang/uk.txt
-GUI/Lang/uz.txt
-GUI/Lang/va.txt
-GUI/Lang/vi.txt
-GUI/Lang/zh-cn.txt
-GUI/Lang/zh-tw.txt
-GUI/help/7zip.hhc
-GUI/help/7zip.hhk
-GUI/help/cmdline/commands/add.htm
-GUI/help/cmdline/commands/bench.htm
-GUI/help/cmdline/commands/delete.htm
-GUI/help/cmdline/commands/extract.htm
-GUI/help/cmdline/commands/extract_full.htm
-GUI/help/cmdline/commands/index.htm
-GUI/help/cmdline/commands/list.htm
-GUI/help/cmdline/commands/style.css
-GUI/help/cmdline/commands/test.htm
-GUI/help/cmdline/commands/update.htm
-GUI/help/cmdline/exit_codes.htm
-GUI/help/cmdline/index.htm
-GUI/help/cmdline/style.css
-GUI/help/cmdline/switches/ar_exclude.htm
-GUI/help/cmdline/switches/ar_include.htm
-GUI/help/cmdline/switches/ar_no.htm
-GUI/help/cmdline/switches/charset.htm
-GUI/help/cmdline/switches/exclude.htm
-GUI/help/cmdline/switches/include.htm
-GUI/help/cmdline/switches/index.htm
-GUI/help/cmdline/switches/large_pages.htm
-GUI/help/cmdline/switches/list_tech.htm
-GUI/help/cmdline/switches/method.htm
-GUI/help/cmdline/switches/output_dir.htm
-GUI/help/cmdline/switches/overwrite.htm
-GUI/help/cmdline/switches/password.htm
-GUI/help/cmdline/switches/recurse.htm
-GUI/help/cmdline/switches/sfx.htm
-GUI/help/cmdline/switches/ssc.htm
-GUI/help/cmdline/switches/stdin.htm
-GUI/help/cmdline/switches/stdout.htm
-GUI/help/cmdline/switches/stop_switch.htm
-GUI/help/cmdline/switches/style.css
-GUI/help/cmdline/switches/type.htm
-GUI/help/cmdline/switches/update.htm
-GUI/help/cmdline/switches/volume.htm
-GUI/help/cmdline/switches/working_dir.htm
-GUI/help/cmdline/switches/yes.htm
-GUI/help/cmdline/syntax.htm
-GUI/help/fm/about.htm
-GUI/help/fm/benchmark.htm
-GUI/help/fm/index.htm
-GUI/help/fm/menu.htm
-GUI/help/fm/options.htm
-GUI/help/fm/plugins/7-zip/add.htm
-GUI/help/fm/plugins/7-zip/extract.htm
-GUI/help/fm/plugins/7-zip/index.htm
-GUI/help/fm/plugins/7-zip/style.css
-GUI/help/fm/plugins/index.htm
-GUI/help/fm/plugins/style.css
-GUI/help/fm/style.css
-GUI/help/general/7z.htm
-GUI/help/general/faq.htm
-GUI/help/general/formats.htm
-GUI/help/general/index.htm
-GUI/help/general/license.htm
-GUI/help/general/performance.htm
-GUI/help/general/style.css
-GUI/help/general/thanks.htm
-GUI/help/start.htm
-GUI/help/style.css
-GUI/kde3/p7zip_compress.desktop
-GUI/kde3/p7zip_compress2.desktop
-GUI/kde3/p7zip_extract.desktop
-GUI/kde3/p7zip_extract_subdir.desktop
-GUI/kde3/p7zip_extract_to.desktop
-GUI/kde3/p7zip_test.desktop
-GUI/kde3/readme.txt
-GUI/kde4/p7zip_compress.desktop
-GUI/kde4/p7zip_compress2.desktop
-GUI/kde4/p7zip_extract.desktop
-GUI/kde4/p7zip_extract_subdir.desktop
-GUI/kde4/p7zip_extract_to.desktop
-GUI/kde4/p7zip_test.desktop
-GUI/kde4/readme.txt
-GUI/p7zipForFilemanager
-GUI/p7zip_16.icns
-GUI/p7zip_16.png
-GUI/p7zip_16_ok.png
-GUI/p7zip_32.png
-GUI/p7zip_32.xpm
-check/check.sh
-check/check_7zr.sh
-check/check_Client7z.sh
-check/check_install.sh
-check/clean_all.sh
-check/my_86_filter/makefile
-check/my_86_filter/makefile.depend
-check/my_86_filter/makefile.list
-check/my_86_filter/my_86_filter.cpp
-check/test/7za.exe.lzma
-check/test/7za.exe.lzma86
-check/test/7za.exe.lzma_eos
-check/test/7za.exe.xz
-check/test/7za433_7zip_bzip2.7z
-check/test/7za433_7zip_lzma.7z
-check/test/7za433_7zip_lzma2.7z
-check/test/7za433_7zip_lzma2_bcj2.7z
-check/test/7za433_7zip_lzma2_crypto.7z
-check/test/7za433_7zip_lzma_bcj2.7z
-check/test/7za433_7zip_lzma_crypto.7z
-check/test/7za433_7zip_ppmd.7z
-check/test/7za433_7zip_ppmd_bcj2.7z
-check/test/7za433_tar.tar
-contrib/VirtualFileSystemForMidnightCommander/ChangeLog
-contrib/VirtualFileSystemForMidnightCommander/readme
-contrib/VirtualFileSystemForMidnightCommander/readme.u7z
-contrib/VirtualFileSystemForMidnightCommander/u7z
-contrib/gzip-like_CLI_wrapper_for_7z/README
-contrib/gzip-like_CLI_wrapper_for_7z/check/check.sh
-contrib/gzip-like_CLI_wrapper_for_7z/check/files.tar
-contrib/gzip-like_CLI_wrapper_for_7z/man1/p7zip.1
-contrib/gzip-like_CLI_wrapper_for_7z/p7zip
-contrib/qnx630sp3/qnx630sp3-shared
-contrib/qnx630sp3/qnx630sp3-static
-install.sh
-install_local_context_menu.sh
-integration_context_menu.txt
-makefile
-makefile.aix_gcc
-makefile.beos
-makefile.crc32
-makefile.cygwin
-makefile.cygwin_asm
-makefile.djgpp_old
-makefile.djgpp_watt
-makefile.freebsd5
-makefile.freebsd6
-makefile.glb
-makefile.gprof
-makefile.hpux-acc
-makefile.hpux-acc_64
-makefile.hpux-gcc
-makefile.linux_amd64
-makefile.linux_amd64_asm
-makefile.linux_amd64_asm_icc
-makefile.linux_any_cpu
-makefile.linux_any_cpu_gcc_4.X
-makefile.linux_clang_amd64
-makefile.linux_cross_arm
-makefile.linux_gcc_2.95_no_need_for_libstdc
-makefile.linux_other
-makefile.linux_s390x
-makefile.linux_x86_asm_gcc_4.X
-makefile.linux_x86_asm_gcc_4.X_fltk
-makefile.linux_x86_asm_gcc_mudflap_4.X
-makefile.linux_x86_asm_icc
-makefile.linux_x86_icc
-makefile.machine
-makefile.macosx_32bits
-makefile.macosx_32bits_asm
-makefile.macosx_32bits_ppc
-makefile.macosx_64bits
-makefile.macosx_llvm_64bits
-makefile.netbsd
-makefile.netware_asm_gcc_3.X
-makefile.oldmake
-makefile.openbsd
-makefile.openbsd_no_port
-makefile.qnx_shared.bin
-makefile.qnx_shared.so
-makefile.qnx_static
-makefile.rules
-makefile.solaris_sparc_CC_32
-makefile.solaris_sparc_CC_64
-makefile.solaris_sparc_gcc
-makefile.solaris_x86
-makefile.tru64
-man1/7z.1
-man1/7za.1
-man1/7zr.1
diff --git a/src/libs/7zip/unix/DOCS/lzma.txt b/src/libs/7zip/unix/lzma.txt
index 659323237..659323237 100644
--- a/src/libs/7zip/unix/DOCS/lzma.txt
+++ b/src/libs/7zip/unix/lzma.txt
diff --git a/src/libs/7zip/unix/unix.pri b/src/libs/7zip/unix/unix.pri
index 9c0f655bb..1758357f5 100644
--- a/src/libs/7zip/unix/unix.pri
+++ b/src/libs/7zip/unix/unix.pri
@@ -1,238 +1,132 @@
-SOURCES += \
-$$7ZIP_BASE/CPP/myWindows/myGetTickCount.cpp \
-$$7ZIP_BASE/CPP/myWindows/wine_date_and_time.cpp
-#$$7ZIP_BASE/CPP/myWindows/myAddExeFlag.cpp \
-#$$7ZIP_BASE/CPP/myWindows/mySplitCommandLine.cpp \
-
-#SOURCES += \
-#$$7ZIP_BASE/CPP/7zip/UI/Console/ConsoleClose.cpp \
-#$$7ZIP_BASE/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp \
-#$$7ZIP_BASE/CPP/7zip/UI/Console/List.cpp \
-#$$7ZIP_BASE/CPP/7zip/UI/Console/OpenCallbackConsole.cpp \
-#$$7ZIP_BASE/CPP/7zip/UI/Console/PercentPrinter.cpp \
-#$$7ZIP_BASE/CPP/7zip/UI/Console/UpdateCallbackConsole.cpp \
-#$$7ZIP_BASE/CPP/7zip/UI/Console/UserInputUtils.cpp
-
-SOURCES += \
-#$$7ZIP_BASE/CPP/Common/CommandLineParser.cpp \
-#$$7ZIP_BASE/CPP/Common/CRC.cpp \
-$$7ZIP_BASE/CPP/Common/IntToString.cpp \
-#$$7ZIP_BASE/CPP/Common/ListFileUtils.cpp \
-#$$7ZIP_BASE/CPP/Common/StdInStream.cpp \
-#$$7ZIP_BASE/CPP/Common/StdOutStream.cpp \
-$$7ZIP_BASE/CPP/Common/MyString.cpp \
-$$7ZIP_BASE/CPP/Common/StringToInt.cpp \
-$$7ZIP_BASE/CPP/Common/UTFConvert.cpp \
-$$7ZIP_BASE/CPP/Common/StringConvert.cpp \
-$$7ZIP_BASE/CPP/Common/MyWindows.cpp \
-$$7ZIP_BASE/CPP/Common/MyVector.cpp \
-$$7ZIP_BASE/CPP/Common/Wildcard.cpp
-
-SOURCES += \
-#$$7ZIP_BASE/CPP/Windows/Error.cpp \
-$$7ZIP_BASE/CPP/Windows/FileDir.cpp \
-$$7ZIP_BASE/CPP/Windows/FileFind.cpp \
-$$7ZIP_BASE/CPP/Windows/FileIO.cpp \
-$$7ZIP_BASE/CPP/Windows/FileName.cpp \
-$$7ZIP_BASE/CPP/Windows/PropVariant.cpp \
-$$7ZIP_BASE/CPP/Windows/PropVariantConversions.cpp \
-$$7ZIP_BASE/CPP/Windows/Synchronization.cpp \
-$$7ZIP_BASE/CPP/Windows/System.cpp \
-$$7ZIP_BASE/CPP/Windows/Time.cpp
-
-SOURCES += \
-$$7ZIP_BASE/CPP/7zip/Common/CreateCoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/CWrappers.cpp \
-#$$7ZIP_BASE/CPP/7zip/Common/FilePathAutoRename.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/FileStreams.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/FilterCoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/InBuffer.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/InOutTempBuffer.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/LimitedStreams.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/LockedStream.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/MemBlocks.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/MethodId.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/MethodProps.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/OffsetStream.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/OutBuffer.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/OutMemStream.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/ProgressMt.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/ProgressUtils.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/StreamBinder.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/StreamObjects.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/StreamUtils.cpp \
-$$7ZIP_BASE/CPP/7zip/Common/VirtThread.cpp
-
-SOURCES += \
-#$$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveCommandLine.cpp \
-#$$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/DefaultName.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/EnumDirItems.cpp \
-#$$7ZIP_BASE/CPP/7zip/UI/Common/Extract.cpp \
-#$$7ZIP_BASE/CPP/7zip/UI/Common/ExtractingFilePath.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/LoadCodecs.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/OpenArchive.cpp \
-#$$7ZIP_BASE/CPP/7zip/UI/Common/PropIDUtils.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/SetProperties.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/SortUtils.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/TempFiles.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/Update.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/UpdateAction.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/UpdateCallback.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/UpdatePair.cpp \
-$$7ZIP_BASE/CPP/7zip/UI/Common/UpdateProduce.cpp
+#$(COMMON_OBJS): ../../../Common/$(*B).cpp
+SOURCES += $$7ZIP_BASE/CPP/Common/IntToString.cpp
+SOURCES += $$7ZIP_BASE/CPP/Common/MyString.cpp
+SOURCES += $$7ZIP_BASE/CPP/Common/StringConvert.cpp
+SOURCES += $$7ZIP_BASE/CPP/Common/StringToInt.cpp
+SOURCES += $$7ZIP_BASE/CPP/Common/MyVector.cpp
+SOURCES += $$7ZIP_BASE/CPP/Common/Wildcard.cpp
+SOURCES += $$7ZIP_BASE/CPP/Common/MyWindows.cpp
-SOURCES += \
-$$7ZIP_BASE/CPP/7zip/Archive/DeflateProps.cpp \ #new
-$$7ZIP_BASE/CPP/7zip/Archive/Bz2Handler.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/GzHandler.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/LzmaHandler.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/SplitHandler.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/XzHandler.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/ZHandler.cpp
+#$(WIN_OBJS): ../../../Windows/$(*B).cpp
+SOURCES += $$7ZIP_BASE/CPP/Windows/FileDir.cpp
+SOURCES += $$7ZIP_BASE/CPP/Windows/FileFind.cpp
+SOURCES += $$7ZIP_BASE/CPP/Windows/FileName.cpp
+SOURCES += $$7ZIP_BASE/CPP/Windows/FileIO.cpp
+SOURCES += $$7ZIP_BASE/CPP/Windows/PropVariant.cpp
+SOURCES += $$7ZIP_BASE/CPP/Windows/PropVariantConversions.cpp
+SOURCES += $$7ZIP_BASE/CPP/Windows/Synchronization.cpp
+SOURCES += $$7ZIP_BASE/CPP/Windows/System.cpp
+SOURCES += $$7ZIP_BASE/CPP/Windows/Time.cpp
-SOURCES += \
-$$7ZIP_BASE/CPP/7zip/Archive/Common/CoderMixer2.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Common/CoderMixer2MT.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Common/CrossThreadProgress.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Common/DummyOutStream.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Common/FindSignature.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Common/HandlerOut.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Common/InStreamWithCRC.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Common/ItemNameUtils.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Common/MultiStream.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Common/ParseProperties.cpp
+#$(7ZIP_COMMON_OBJS): ../../Common/$(*B).cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/CreateCoder.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/CWrappers.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/InBuffer.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/InOutTempBuffer.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/FileStreams.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/FilterCoder.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/LimitedStreams.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/LockedStream.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/MethodId.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/MethodProps.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/OutBuffer.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/ProgressUtils.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/StreamBinder.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/StreamObjects.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/StreamUtils.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/VirtThread.cpp
-SOURCES += \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zCompressionMode.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zDecode.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zEncode.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zExtract.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zFolderInStream.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zFolderOutStream.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zHandler.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zHandlerOut.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zHeader.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zIn.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zOut.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zProperties.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zSpecStream.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zRegister.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/7z/7zUpdate.cpp
+#$(UI_COMMON_OBJS): ../../UI/Common/$(*B).cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/DefaultName.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/EnumDirItems.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/LoadCodecs.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/OpenArchive.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/SetProperties.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/SortUtils.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/TempFiles.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/Update.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/UpdateAction.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/UpdateCallback.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/UpdatePair.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/UpdateProduce.cpp
-SOURCES += \
-$$7ZIP_BASE/CPP/7zip/Archive/Cab/CabBlockInStream.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Cab/CabHandler.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Cab/CabHeader.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Cab/CabIn.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Cab/CabRegister.cpp
+#$(AR_OBJS): ../../Archive/$(*B).cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/LzmaHandler.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/SplitHandler.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/XzHandler.cpp
-SOURCES += \
-$$7ZIP_BASE/CPP/7zip/Archive/Tar/TarHandler.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Tar/TarHandlerOut.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Tar/TarHeader.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Tar/TarIn.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Tar/TarOut.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Tar/TarRegister.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Tar/TarUpdate.cpp
+#$(AR_COMMON_OBJS): ../../Archive/Common/$(*B).cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/CoderMixer2.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/CoderMixer2MT.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/HandlerOut.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/ItemNameUtils.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/ParseProperties.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/InStreamWithCRC.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/MultiStream.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/DummyOutStream.cpp
-SOURCES += \
-$$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipAddCommon.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipHandler.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipHeader.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipIn.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipItem.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipOut.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipRegister.cpp \
-$$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipUpdate.cpp
+#$(7Z_OBJS): ../../Archive/7z/$(*B).cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zCompressionMode.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zDecode.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zEncode.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zExtract.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zFolderInStream.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zFolderOutStream.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zHandler.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zHandlerOut.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zHeader.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zIn.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zOut.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zProperties.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zSpecStream.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zUpdate.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zRegister.cpp
-SOURCES += \
-$$7ZIP_BASE/CPP/7zip/Compress/BcjCoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/Bcj2Coder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/BitlDecoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/BranchCoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/BranchMisc.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/ByteSwap.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/BZip2Crc.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/BZip2Decoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/BZip2Encoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/CopyCoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/DeflateDecoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/DeflateEncoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/DeltaFilter.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/ImplodeDecoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/Lzma2Decoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/Lzma2Encoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/LzmaDecoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/LzmaEncoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/LzOutWindow.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/Lzx86Converter.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/LzxDecoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/PpmdDecoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/PpmdEncoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/PpmdZip.cpp \ #new
-$$7ZIP_BASE/CPP/7zip/Compress/QuantumDecoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/ShrinkDecoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/ZDecoder.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/Bcj2Register.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/BcjRegister.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/BranchRegister.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/BZip2Register.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/CopyRegister.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/Deflate64Register.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/DeflateRegister.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/Lzma2Register.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/LzmaRegister.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/PpmdRegister.cpp \
-$$7ZIP_BASE/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp
+#$(COMPRESS_OBJS): ../../Compress/$(*B).cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Bcj2Coder.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Bcj2Register.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BcjCoder.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BcjRegister.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BranchCoder.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BranchMisc.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BranchRegister.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/ByteSwap.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/CopyCoder.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/CopyRegister.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/DeltaFilter.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Lzma2Decoder.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Lzma2Encoder.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Lzma2Register.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/LzmaDecoder.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/LzmaEncoder.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/LzmaRegister.cpp
-SOURCES += \
-$$7ZIP_BASE/CPP/7zip/Crypto/7zAes.cpp \
-$$7ZIP_BASE/CPP/7zip/Crypto/7zAesRegister.cpp \
-$$7ZIP_BASE/CPP/7zip/Crypto/HmacSha1.cpp \
-$$7ZIP_BASE/CPP/7zip/Crypto/MyAes.cpp \
-$$7ZIP_BASE/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp \
-$$7ZIP_BASE/CPP/7zip/Crypto/RandGen.cpp \
-$$7ZIP_BASE/CPP/7zip/Crypto/Sha1.cpp \
-$$7ZIP_BASE/CPP/7zip/Crypto/WzAes.cpp \
-$$7ZIP_BASE/CPP/7zip/Crypto/ZipCrypto.cpp \
-$$7ZIP_BASE/CPP/7zip/Crypto/ZipStrong.cpp
+#$(C_OBJS): ../../../../C/$(*B).c
+SOURCES += $$7ZIP_BASE/C/Alloc.c
+SOURCES += $$7ZIP_BASE/C/Bra.c
+SOURCES += $$7ZIP_BASE/C/Bra86.c
+SOURCES += $$7ZIP_BASE/C/BraIA64.c
+SOURCES += $$7ZIP_BASE/C/CpuArch.c
+SOURCES += $$7ZIP_BASE/C/Delta.c
+SOURCES += $$7ZIP_BASE/C/LzFind.c
+SOURCES += $$7ZIP_BASE/C/LzFindMt.c
+SOURCES += $$7ZIP_BASE/C/Lzma2Dec.c
+SOURCES += $$7ZIP_BASE/C/Lzma2Enc.c
+SOURCES += $$7ZIP_BASE/C/LzmaDec.c
+SOURCES += $$7ZIP_BASE/C/LzmaEnc.c
+SOURCES += $$7ZIP_BASE/C/MtCoder.c
+SOURCES += $$7ZIP_BASE/C/Threads.c
+SOURCES += $$7ZIP_BASE/C/7zCrc.c
+SOURCES += $$7ZIP_BASE/C/7zCrcOpt.c
+SOURCES += $$7ZIP_BASE/C/7zStream.c
+SOURCES += $$7ZIP_BASE/C/Xz.c
+SOURCES += $$7ZIP_BASE/C/XzIn.c
+SOURCES += $$7ZIP_BASE/C/XzCrc64.c
+SOURCES += $$7ZIP_BASE/C/XzDec.c
+SOURCES += $$7ZIP_BASE/C/XzEnc.c
+SOURCES += $$7ZIP_BASE/C/Sha256.c
SOURCES += \
-$$7ZIP_BASE/C/7zStream.c \
-$$7ZIP_BASE/C/Aes.c \
-$$7ZIP_BASE/C/Bra.c \
-$$7ZIP_BASE/C/Bra86.c \
-$$7ZIP_BASE/C/BraIA64.c \
-$$7ZIP_BASE/C/BwtSort.c \
-$$7ZIP_BASE/C/Delta.c \
-$$7ZIP_BASE/C/HuffEnc.c \
-$$7ZIP_BASE/C/LzFind.c \
-$$7ZIP_BASE/C/LzFindMt.c \
-$$7ZIP_BASE/C/Lzma2Dec.c \
-$$7ZIP_BASE/C/Lzma2Enc.c \
-$$7ZIP_BASE/C/LzmaDec.c \
-$$7ZIP_BASE/C/LzmaEnc.c \
-$$7ZIP_BASE/C/MtCoder.c \
-$$7ZIP_BASE/C/Sha256.c \
-$$7ZIP_BASE/C/Sort.c \
-$$7ZIP_BASE/C/Threads.c \
-$$7ZIP_BASE/C/Xz.c \
-$$7ZIP_BASE/C/XzCrc64.c \
-$$7ZIP_BASE/C/XzDec.c \
-$$7ZIP_BASE/C/XzEnc.c \
-$$7ZIP_BASE/C/XzIn.c \
-$$7ZIP_BASE/C/7zCrc.c \
-$$7ZIP_BASE/C/Ppmd7Enc.c \ #new
-$$7ZIP_BASE/C/Ppmd7Dec.c \ #new
-$$7ZIP_BASE/C/Ppmd7.c \ #new
-$$7ZIP_BASE/C/Ppmd8.c \ #new
-$$7ZIP_BASE/C/Ppmd8Enc.c \ #new
-$$7ZIP_BASE/C/Ppmd8Dec.c \ #new
-$$7ZIP_BASE/C/Alloc.c \ #new
-$$7ZIP_BASE/C/7zCrcOpt.c #new
+$$7ZIP_BASE/CPP/myWindows/myDateAndTime.cpp
diff --git a/src/libs/7zip/win/DOC/7zC.txt b/src/libs/7zip/win/7zC.txt
index 5d5d06d7b..5d5d06d7b 100644
--- a/src/libs/7zip/win/DOC/7zC.txt
+++ b/src/libs/7zip/win/7zC.txt
diff --git a/src/libs/7zip/win/DOC/7zFormat.txt b/src/libs/7zip/win/7zFormat.txt
index 55b52b1b9..e1cf7380d 100644
--- a/src/libs/7zip/win/DOC/7zFormat.txt
+++ b/src/libs/7zip/win/7zFormat.txt
@@ -1,5 +1,5 @@
-7z Format description (4.59)
-----------------------------
+7z Format description (2.30 Beta 25)
+-----------------------------------
This file contains description of 7z archive format.
7z archive can contain files compressed with any method.
@@ -126,43 +126,40 @@ UINT64 means real UINT64 encoded with the following scheme:
Property IDs
------------
-0x00 = kEnd
+0x00 = kEnd,
-0x01 = kHeader
+0x01 = kHeader,
-0x02 = kArchiveProperties
+0x02 = kArchiveProperties,
-0x03 = kAdditionalStreamsInfo
-0x04 = kMainStreamsInfo
-0x05 = kFilesInfo
+0x03 = kAdditionalStreamsInfo,
+0x04 = kMainStreamsInfo,
+0x05 = kFilesInfo,
-0x06 = kPackInfo
-0x07 = kUnPackInfo
-0x08 = kSubStreamsInfo
+0x06 = kPackInfo,
+0x07 = kUnPackInfo,
+0x08 = kSubStreamsInfo,
-0x09 = kSize
-0x0A = kCRC
+0x09 = kSize,
+0x0A = kCRC,
-0x0B = kFolder
+0x0B = kFolder,
-0x0C = kCodersUnPackSize
-0x0D = kNumUnPackStream
+0x0C = kCodersUnPackSize,
+0x0D = kNumUnPackStream,
-0x0E = kEmptyStream
-0x0F = kEmptyFile
-0x10 = kAnti
+0x0E = kEmptyStream,
+0x0F = kEmptyFile,
+0x10 = kAnti,
-0x11 = kName
-0x12 = kCTime
-0x13 = kATime
-0x14 = kMTime
-0x15 = kWinAttributes
-0x16 = kComment
+0x11 = kName,
+0x12 = kCreationTime,
+0x13 = kLastAccessTime,
+0x14 = kLastWriteTime,
+0x15 = kWinAttributes,
+0x16 = kComment,
-0x17 = kEncodedHeader
-
-0x18 = kStartPos
-0x19 = kDummy
+0x17 = kEncodedHeader,
7z format headers
@@ -241,19 +238,24 @@ Folder
{
BYTE
{
- 0:3 CodecIdSize
- 4: Is Complex Coder
- 5: There Are Attributes
- 6: Reserved
- 7: There are more alternative methods. (Not used anymore, must be 0).
+ 0:3 DecompressionMethod.IDSize
+ 4:
+ 0 - IsSimple
+ 1 - Is not simple
+ 5:
+ 0 - No Attributes
+ 1 - There Are Attributes
+ 7:
+ 0 - Last Method in Alternative_Method_List
+ 1 - There are more alternative methods
}
- BYTE CodecId[CodecIdSize]
- if (Is Complex Coder)
+ BYTE DecompressionMethod.ID[DecompressionMethod.IDSize]
+ if (!IsSimple)
{
UINT64 NumInStreams;
UINT64 NumOutStreams;
}
- if (There Are Attributes)
+ if (DecompressionMethod[0] != 0)
{
UINT64 PropertiesSize
BYTE Properties[PropertiesSize]
@@ -385,9 +387,9 @@ FilesInfo
for(EmptyStreams)
BIT IsAntiFile
- case kCTime: (0x12)
- case kATime: (0x13)
- case kMTime: (0x14)
+ case kCreationTime: (0x12)
+ case kLastAccessTime: (0x13)
+ case kLastWriteTime: (0x14)
BYTE AllAreDefined
if (AllAreDefined == 0)
{
@@ -399,7 +401,7 @@ FilesInfo
UINT64 DataIndex
[]
for(Definded Items)
- UINT64 Time
+ UINT32 Time
[]
kNames: (0x11)
diff --git a/src/libs/7zip/win/C/Aes.c b/src/libs/7zip/win/C/Aes.c
deleted file mode 100644
index e7221cd2b..000000000
--- a/src/libs/7zip/win/C/Aes.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/* Aes.c -- AES encryption / decryption
-2009-11-23 : Igor Pavlov : Public domain */
-
-#include "Aes.h"
-#include "CpuArch.h"
-
-static UInt32 T[256 * 4];
-static Byte Sbox[256] = {
- 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
- 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
- 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
- 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
- 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
- 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
- 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
- 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
- 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
- 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
- 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
- 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
- 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
- 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
- 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
- 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16};
-
-void MY_FAST_CALL AesCbc_Encode(UInt32 *ivAes, Byte *data, size_t numBlocks);
-void MY_FAST_CALL AesCbc_Decode(UInt32 *ivAes, Byte *data, size_t numBlocks);
-void MY_FAST_CALL AesCtr_Code(UInt32 *ivAes, Byte *data, size_t numBlocks);
-
-void MY_FAST_CALL AesCbc_Encode_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks);
-void MY_FAST_CALL AesCbc_Decode_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks);
-void MY_FAST_CALL AesCtr_Code_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks);
-
-AES_CODE_FUNC g_AesCbc_Encode;
-AES_CODE_FUNC g_AesCbc_Decode;
-AES_CODE_FUNC g_AesCtr_Code;
-
-static UInt32 D[256 * 4];
-static Byte InvS[256];
-
-static Byte Rcon[11] = { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 };
-
-#define xtime(x) ((((x) << 1) ^ (((x) & 0x80) != 0 ? 0x1B : 0)) & 0xFF)
-
-#define Ui32(a0, a1, a2, a3) ((UInt32)(a0) | ((UInt32)(a1) << 8) | ((UInt32)(a2) << 16) | ((UInt32)(a3) << 24))
-
-#define gb0(x) ( (x) & 0xFF)
-#define gb1(x) (((x) >> ( 8)) & 0xFF)
-#define gb2(x) (((x) >> (16)) & 0xFF)
-#define gb3(x) (((x) >> (24)) & 0xFF)
-
-void AesGenTables(void)
-{
- unsigned i;
- for (i = 0; i < 256; i++)
- InvS[Sbox[i]] = (Byte)i;
- for (i = 0; i < 256; i++)
- {
- {
- UInt32 a1 = Sbox[i];
- UInt32 a2 = xtime(a1);
- UInt32 a3 = a2 ^ a1;
- T[ i] = Ui32(a2, a1, a1, a3);
- T[0x100 + i] = Ui32(a3, a2, a1, a1);
- T[0x200 + i] = Ui32(a1, a3, a2, a1);
- T[0x300 + i] = Ui32(a1, a1, a3, a2);
- }
- {
- UInt32 a1 = InvS[i];
- UInt32 a2 = xtime(a1);
- UInt32 a4 = xtime(a2);
- UInt32 a8 = xtime(a4);
- UInt32 a9 = a8 ^ a1;
- UInt32 aB = a8 ^ a2 ^ a1;
- UInt32 aD = a8 ^ a4 ^ a1;
- UInt32 aE = a8 ^ a4 ^ a2;
- D[ i] = Ui32(aE, a9, aD, aB);
- D[0x100 + i] = Ui32(aB, aE, a9, aD);
- D[0x200 + i] = Ui32(aD, aB, aE, a9);
- D[0x300 + i] = Ui32(a9, aD, aB, aE);
- }
- }
- g_AesCbc_Encode = AesCbc_Encode;
- g_AesCbc_Decode = AesCbc_Decode;
- g_AesCtr_Code = AesCtr_Code;
- #ifdef MY_CPU_X86_OR_AMD64
- if (CPU_Is_Aes_Supported())
- {
- g_AesCbc_Encode = AesCbc_Encode_Intel;
- g_AesCbc_Decode = AesCbc_Decode_Intel;
- g_AesCtr_Code = AesCtr_Code_Intel;
- }
- #endif
-}
-
-#define HT(i, x, s) (T + (x << 8))[gb ## x(s[(i + x) & 3])]
-#define HT4(m, i, s, p) m[i] = \
- HT(i, 0, s) ^ \
- HT(i, 1, s) ^ \
- HT(i, 2, s) ^ \
- HT(i, 3, s) ^ w[p + i]
-/* such order (2031) in HT16 is for VC6/K8 speed optimization) */
-#define HT16(m, s, p) \
- HT4(m, 2, s, p); \
- HT4(m, 0, s, p); \
- HT4(m, 3, s, p); \
- HT4(m, 1, s, p); \
-
-#define FT(i, x) Sbox[gb ## x(m[(i + x) & 3])]
-#define FT4(i) dest[i] = Ui32(FT(i, 0), FT(i, 1), FT(i, 2), FT(i, 3)) ^ w[i];
-
-#define HD(i, x, s) (D + (x << 8))[gb ## x(s[(i - x) & 3])]
-#define HD4(m, i, s, p) m[i] = \
- HD(i, 0, s) ^ \
- HD(i, 1, s) ^ \
- HD(i, 2, s) ^ \
- HD(i, 3, s) ^ w[p + i];
-/* such order (0231) in HD16 is for VC6/K8 speed optimization) */
-#define HD16(m, s, p) \
- HD4(m, 0, s, p); \
- HD4(m, 2, s, p); \
- HD4(m, 3, s, p); \
- HD4(m, 1, s, p); \
-
-#define FD(i, x) InvS[gb ## x(m[(i - x) & 3])]
-#define FD4(i) dest[i] = Ui32(FD(i, 0), FD(i, 1), FD(i, 2), FD(i, 3)) ^ w[i];
-
-void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *w, const Byte *key, unsigned keySize)
-{
- unsigned i, wSize;
- wSize = keySize + 28;
- keySize /= 4;
- w[0] = ((UInt32)keySize / 2) + 3;
- w += 4;
-
- for (i = 0; i < keySize; i++, key += 4)
- w[i] = GetUi32(key);
-
- for (; i < wSize; i++)
- {
- UInt32 t = w[i - 1];
- unsigned rem = i % keySize;
- if (rem == 0)
- t = Ui32(Sbox[gb1(t)] ^ Rcon[i / keySize], Sbox[gb2(t)], Sbox[gb3(t)], Sbox[gb0(t)]);
- else if (keySize > 6 && rem == 4)
- t = Ui32(Sbox[gb0(t)], Sbox[gb1(t)], Sbox[gb2(t)], Sbox[gb3(t)]);
- w[i] = w[i - keySize] ^ t;
- }
-}
-
-void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *w, const Byte *key, unsigned keySize)
-{
- unsigned i, num;
- Aes_SetKey_Enc(w, key, keySize);
- num = keySize + 20;
- w += 8;
- for (i = 0; i < num; i++)
- {
- UInt32 r = w[i];
- w[i] =
- D[ Sbox[gb0(r)]] ^
- D[0x100 + Sbox[gb1(r)]] ^
- D[0x200 + Sbox[gb2(r)]] ^
- D[0x300 + Sbox[gb3(r)]];
- }
-}
-
-/* Aes_Encode and Aes_Decode functions work with little-endian words.
- src and dest are pointers to 4 UInt32 words.
- arc and dest can point to same block */
-
-static void Aes_Encode(const UInt32 *w, UInt32 *dest, const UInt32 *src)
-{
- UInt32 s[4];
- UInt32 m[4];
- UInt32 numRounds2 = w[0];
- w += 4;
- s[0] = src[0] ^ w[0];
- s[1] = src[1] ^ w[1];
- s[2] = src[2] ^ w[2];
- s[3] = src[3] ^ w[3];
- w += 4;
- for (;;)
- {
- HT16(m, s, 0);
- if (--numRounds2 == 0)
- break;
- HT16(s, m, 4);
- w += 8;
- }
- w += 4;
- FT4(0); FT4(1); FT4(2); FT4(3);
-}
-
-static void Aes_Decode(const UInt32 *w, UInt32 *dest, const UInt32 *src)
-{
- UInt32 s[4];
- UInt32 m[4];
- UInt32 numRounds2 = w[0];
- w += 4 + numRounds2 * 8;
- s[0] = src[0] ^ w[0];
- s[1] = src[1] ^ w[1];
- s[2] = src[2] ^ w[2];
- s[3] = src[3] ^ w[3];
- for (;;)
- {
- w -= 8;
- HD16(m, s, 4);
- if (--numRounds2 == 0)
- break;
- HD16(s, m, 0);
- }
- FD4(0); FD4(1); FD4(2); FD4(3);
-}
-
-void AesCbc_Init(UInt32 *p, const Byte *iv)
-{
- unsigned i;
- for (i = 0; i < 4; i++)
- p[i] = GetUi32(iv + i * 4);
-}
-
-void MY_FAST_CALL AesCbc_Encode(UInt32 *p, Byte *data, size_t numBlocks)
-{
- for (; numBlocks != 0; numBlocks--, data += AES_BLOCK_SIZE)
- {
- p[0] ^= GetUi32(data);
- p[1] ^= GetUi32(data + 4);
- p[2] ^= GetUi32(data + 8);
- p[3] ^= GetUi32(data + 12);
-
- Aes_Encode(p + 4, p, p);
-
- SetUi32(data, p[0]);
- SetUi32(data + 4, p[1]);
- SetUi32(data + 8, p[2]);
- SetUi32(data + 12, p[3]);
- }
-}
-
-void MY_FAST_CALL AesCbc_Decode(UInt32 *p, Byte *data, size_t numBlocks)
-{
- UInt32 in[4], out[4];
- for (; numBlocks != 0; numBlocks--, data += AES_BLOCK_SIZE)
- {
- in[0] = GetUi32(data);
- in[1] = GetUi32(data + 4);
- in[2] = GetUi32(data + 8);
- in[3] = GetUi32(data + 12);
-
- Aes_Decode(p + 4, out, in);
-
- SetUi32(data, p[0] ^ out[0]);
- SetUi32(data + 4, p[1] ^ out[1]);
- SetUi32(data + 8, p[2] ^ out[2]);
- SetUi32(data + 12, p[3] ^ out[3]);
-
- p[0] = in[0];
- p[1] = in[1];
- p[2] = in[2];
- p[3] = in[3];
- }
-}
-
-void MY_FAST_CALL AesCtr_Code(UInt32 *p, Byte *data, size_t numBlocks)
-{
- for (; numBlocks != 0; numBlocks--)
- {
- UInt32 temp[4];
- Byte buf[16];
- int i;
- if (++p[0] == 0)
- p[1]++;
- Aes_Encode(p + 4, temp, p);
- SetUi32(buf, temp[0]);
- SetUi32(buf + 4, temp[1]);
- SetUi32(buf + 8, temp[2]);
- SetUi32(buf + 12, temp[3]);
- for (i = 0; i < 16; i++)
- *data++ ^= buf[i];
- }
-}
diff --git a/src/libs/7zip/win/C/Aes.h b/src/libs/7zip/win/C/Aes.h
deleted file mode 100644
index c9b0677c8..000000000
--- a/src/libs/7zip/win/C/Aes.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Aes.h -- AES encryption / decryption
-2009-11-23 : Igor Pavlov : Public domain */
-
-#ifndef __AES_H
-#define __AES_H
-
-#include "Types.h"
-
-EXTERN_C_BEGIN
-
-#define AES_BLOCK_SIZE 16
-
-/* Call AesGenTables one time before other AES functions */
-void AesGenTables(void);
-
-/* UInt32 pointers must be 16-byte aligned */
-
-/* 16-byte (4 * 32-bit words) blocks: 1 (IV) + 1 (keyMode) + 15 (AES-256 roundKeys) */
-#define AES_NUM_IVMRK_WORDS ((1 + 1 + 15) * 4)
-
-/* aes - 16-byte aligned pointer to keyMode+roundKeys sequence */
-/* keySize = 16 or 24 or 32 (bytes) */
-typedef void (MY_FAST_CALL *AES_SET_KEY_FUNC)(UInt32 *aes, const Byte *key, unsigned keySize);
-void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *aes, const Byte *key, unsigned keySize);
-void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *aes, const Byte *key, unsigned keySize);
-
-/* ivAes - 16-byte aligned pointer to iv+keyMode+roundKeys sequence: UInt32[AES_NUM_IVMRK_WORDS] */
-void AesCbc_Init(UInt32 *ivAes, const Byte *iv); /* iv size is AES_BLOCK_SIZE */
-/* data - 16-byte aligned pointer to data */
-/* numBlocks - the number of 16-byte blocks in data array */
-typedef void (MY_FAST_CALL *AES_CODE_FUNC)(UInt32 *ivAes, Byte *data, size_t numBlocks);
-extern AES_CODE_FUNC g_AesCbc_Encode;
-extern AES_CODE_FUNC g_AesCbc_Decode;
-extern AES_CODE_FUNC g_AesCtr_Code;
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/AesOpt.c b/src/libs/7zip/win/C/AesOpt.c
deleted file mode 100644
index c0bd8bc15..000000000
--- a/src/libs/7zip/win/C/AesOpt.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/* AesOpt.c -- Intel's AES
-2009-11-23 : Igor Pavlov : Public domain */
-
-#include "CpuArch.h"
-
-#ifdef MY_CPU_X86_OR_AMD64
-#if _MSC_VER >= 1500
-//#define USE_INTEL_AES
-#endif
-#endif
-
-#ifdef USE_INTEL_AES
-
-#include <wmmintrin.h>
-
-void MY_FAST_CALL AesCbc_Encode_Intel(__m128i *p, __m128i *data, size_t numBlocks)
-{
- __m128i m = *p;
- for (; numBlocks != 0; numBlocks--, data++)
- {
- UInt32 numRounds2 = *(const UInt32 *)(p + 1) - 1;
- const __m128i *w = p + 3;
- m = _mm_xor_si128(m, *data);
- m = _mm_xor_si128(m, p[2]);
- do
- {
- m = _mm_aesenc_si128(m, w[0]);
- m = _mm_aesenc_si128(m, w[1]);
- w += 2;
- }
- while (--numRounds2 != 0);
- m = _mm_aesenc_si128(m, w[0]);
- m = _mm_aesenclast_si128(m, w[1]);
- *data = m;
- }
- *p = m;
-}
-
-#define NUM_WAYS 3
-
-#define AES_OP_W(op, n) { \
- const __m128i t = w[n]; \
- m0 = op(m0, t); \
- m1 = op(m1, t); \
- m2 = op(m2, t); \
- }
-
-#define AES_DEC(n) AES_OP_W(_mm_aesdec_si128, n)
-#define AES_DEC_LAST(n) AES_OP_W(_mm_aesdeclast_si128, n)
-#define AES_ENC(n) AES_OP_W(_mm_aesenc_si128, n)
-#define AES_ENC_LAST(n) AES_OP_W(_mm_aesenclast_si128, n)
-
-void MY_FAST_CALL AesCbc_Decode_Intel(__m128i *p, __m128i *data, size_t numBlocks)
-{
- __m128i iv = *p;
- for (; numBlocks >= NUM_WAYS; numBlocks -= NUM_WAYS, data += NUM_WAYS)
- {
- UInt32 numRounds2 = *(const UInt32 *)(p + 1);
- const __m128i *w = p + numRounds2 * 2;
- __m128i m0, m1, m2;
- {
- const __m128i t = w[2];
- m0 = _mm_xor_si128(t, data[0]);
- m1 = _mm_xor_si128(t, data[1]);
- m2 = _mm_xor_si128(t, data[2]);
- }
- numRounds2--;
- do
- {
- AES_DEC(1)
- AES_DEC(0)
- w -= 2;
- }
- while (--numRounds2 != 0);
- AES_DEC(1)
- AES_DEC_LAST(0)
-
- {
- __m128i t;
- t = _mm_xor_si128(m0, iv); iv = data[0]; data[0] = t;
- t = _mm_xor_si128(m1, iv); iv = data[1]; data[1] = t;
- t = _mm_xor_si128(m2, iv); iv = data[2]; data[2] = t;
- }
- }
- for (; numBlocks != 0; numBlocks--, data++)
- {
- UInt32 numRounds2 = *(const UInt32 *)(p + 1);
- const __m128i *w = p + numRounds2 * 2;
- __m128i m = _mm_xor_si128(w[2], *data);
- numRounds2--;
- do
- {
- m = _mm_aesdec_si128(m, w[1]);
- m = _mm_aesdec_si128(m, w[0]);
- w -= 2;
- }
- while (--numRounds2 != 0);
- m = _mm_aesdec_si128(m, w[1]);
- m = _mm_aesdeclast_si128(m, w[0]);
-
- m = _mm_xor_si128(m, iv);
- iv = *data;
- *data = m;
- }
- *p = iv;
-}
-
-void MY_FAST_CALL AesCtr_Code_Intel(__m128i *p, __m128i *data, size_t numBlocks)
-{
- __m128i ctr = *p;
- __m128i one;
- one.m128i_u64[0] = 1;
- one.m128i_u64[1] = 0;
- for (; numBlocks >= NUM_WAYS; numBlocks -= NUM_WAYS, data += NUM_WAYS)
- {
- UInt32 numRounds2 = *(const UInt32 *)(p + 1) - 1;
- const __m128i *w = p;
- __m128i m0, m1, m2;
- {
- const __m128i t = w[2];
- ctr = _mm_add_epi64(ctr, one); m0 = _mm_xor_si128(ctr, t);
- ctr = _mm_add_epi64(ctr, one); m1 = _mm_xor_si128(ctr, t);
- ctr = _mm_add_epi64(ctr, one); m2 = _mm_xor_si128(ctr, t);
- }
- w += 3;
- do
- {
- AES_ENC(0)
- AES_ENC(1)
- w += 2;
- }
- while (--numRounds2 != 0);
- AES_ENC(0)
- AES_ENC_LAST(1)
- data[0] = _mm_xor_si128(data[0], m0);
- data[1] = _mm_xor_si128(data[1], m1);
- data[2] = _mm_xor_si128(data[2], m2);
- }
- for (; numBlocks != 0; numBlocks--, data++)
- {
- UInt32 numRounds2 = *(const UInt32 *)(p + 1) - 1;
- const __m128i *w = p;
- __m128i m;
- ctr = _mm_add_epi64(ctr, one);
- m = _mm_xor_si128(ctr, p[2]);
- w += 3;
- do
- {
- m = _mm_aesenc_si128(m, w[0]);
- m = _mm_aesenc_si128(m, w[1]);
- w += 2;
- }
- while (--numRounds2 != 0);
- m = _mm_aesenc_si128(m, w[0]);
- m = _mm_aesenclast_si128(m, w[1]);
- *data = _mm_xor_si128(*data, m);
- }
- *p = ctr;
-}
-
-#else
-
-void MY_FAST_CALL AesCbc_Encode(UInt32 *ivAes, Byte *data, size_t numBlocks);
-void MY_FAST_CALL AesCbc_Decode(UInt32 *ivAes, Byte *data, size_t numBlocks);
-void MY_FAST_CALL AesCtr_Code(UInt32 *ivAes, Byte *data, size_t numBlocks);
-
-void MY_FAST_CALL AesCbc_Encode_Intel(UInt32 *p, Byte *data, size_t numBlocks)
-{
- AesCbc_Encode(p, data, numBlocks);
-}
-
-void MY_FAST_CALL AesCbc_Decode_Intel(UInt32 *p, Byte *data, size_t numBlocks)
-{
- AesCbc_Decode(p, data, numBlocks);
-}
-
-void MY_FAST_CALL AesCtr_Code_Intel(UInt32 *p, Byte *data, size_t numBlocks)
-{
- AesCtr_Code(p, data, numBlocks);
-}
-
-#endif
diff --git a/src/libs/7zip/win/C/BwtSort.c b/src/libs/7zip/win/C/BwtSort.c
deleted file mode 100644
index 207305072..000000000
--- a/src/libs/7zip/win/C/BwtSort.c
+++ /dev/null
@@ -1,516 +0,0 @@
-/* BwtSort.c -- BWT block sorting
-2008-08-17
-Igor Pavlov
-Public domain */
-
-#include "BwtSort.h"
-#include "Sort.h"
-
-/* #define BLOCK_SORT_USE_HEAP_SORT */
-
-#define NO_INLINE MY_FAST_CALL
-
-/* Don't change it !!! */
-#define kNumHashBytes 2
-#define kNumHashValues (1 << (kNumHashBytes * 8))
-
-/* kNumRefBitsMax must be < (kNumHashBytes * 8) = 16 */
-#define kNumRefBitsMax 12
-
-#define BS_TEMP_SIZE kNumHashValues
-
-#ifdef BLOCK_SORT_EXTERNAL_FLAGS
-
-/* 32 Flags in UInt32 word */
-#define kNumFlagsBits 5
-#define kNumFlagsInWord (1 << kNumFlagsBits)
-#define kFlagsMask (kNumFlagsInWord - 1)
-#define kAllFlags 0xFFFFFFFF
-
-#else
-
-#define kNumBitsMax 20
-#define kIndexMask ((1 << kNumBitsMax) - 1)
-#define kNumExtraBits (32 - kNumBitsMax)
-#define kNumExtra0Bits (kNumExtraBits - 2)
-#define kNumExtra0Mask ((1 << kNumExtra0Bits) - 1)
-
-#define SetFinishedGroupSize(p, size) \
- { *(p) |= ((((size) - 1) & kNumExtra0Mask) << kNumBitsMax); \
- if ((size) > (1 << kNumExtra0Bits)) { \
- *(p) |= 0x40000000; *((p) + 1) |= ((((size) - 1)>> kNumExtra0Bits) << kNumBitsMax); } } \
-
-static void SetGroupSize(UInt32 *p, UInt32 size)
-{
- if (--size == 0)
- return;
- *p |= 0x80000000 | ((size & kNumExtra0Mask) << kNumBitsMax);
- if (size >= (1 << kNumExtra0Bits))
- {
- *p |= 0x40000000;
- p[1] |= ((size >> kNumExtra0Bits) << kNumBitsMax);
- }
-}
-
-#endif
-
-/*
-SortGroup - is recursive Range-Sort function with HeapSort optimization for small blocks
- "range" is not real range. It's only for optimization.
-returns: 1 - if there are groups, 0 - no more groups
-*/
-
-UInt32 NO_INLINE SortGroup(UInt32 BlockSize, UInt32 NumSortedBytes, UInt32 groupOffset, UInt32 groupSize, int NumRefBits, UInt32 *Indices
- #ifndef BLOCK_SORT_USE_HEAP_SORT
- , UInt32 left, UInt32 range
- #endif
- )
-{
- UInt32 *ind2 = Indices + groupOffset;
- UInt32 *Groups;
- if (groupSize <= 1)
- {
- /*
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetFinishedGroupSize(ind2, 1);
- #endif
- */
- return 0;
- }
- Groups = Indices + BlockSize + BS_TEMP_SIZE;
- if (groupSize <= ((UInt32)1 << NumRefBits)
- #ifndef BLOCK_SORT_USE_HEAP_SORT
- && groupSize <= range
- #endif
- )
- {
- UInt32 *temp = Indices + BlockSize;
- UInt32 j;
- UInt32 mask, thereAreGroups, group, cg;
- {
- UInt32 gPrev;
- UInt32 gRes = 0;
- {
- UInt32 sp = ind2[0] + NumSortedBytes;
- if (sp >= BlockSize) sp -= BlockSize;
- gPrev = Groups[sp];
- temp[0] = (gPrev << NumRefBits);
- }
-
- for (j = 1; j < groupSize; j++)
- {
- UInt32 sp = ind2[j] + NumSortedBytes;
- UInt32 g;
- if (sp >= BlockSize) sp -= BlockSize;
- g = Groups[sp];
- temp[j] = (g << NumRefBits) | j;
- gRes |= (gPrev ^ g);
- }
- if (gRes == 0)
- {
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetGroupSize(ind2, groupSize);
- #endif
- return 1;
- }
- }
-
- HeapSort(temp, groupSize);
- mask = ((1 << NumRefBits) - 1);
- thereAreGroups = 0;
-
- group = groupOffset;
- cg = (temp[0] >> NumRefBits);
- temp[0] = ind2[temp[0] & mask];
-
- {
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 *Flags = Groups + BlockSize;
- #else
- UInt32 prevGroupStart = 0;
- #endif
-
- for (j = 1; j < groupSize; j++)
- {
- UInt32 val = temp[j];
- UInt32 cgCur = (val >> NumRefBits);
-
- if (cgCur != cg)
- {
- cg = cgCur;
- group = groupOffset + j;
-
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- {
- UInt32 t = group - 1;
- Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));
- }
- #else
- SetGroupSize(temp + prevGroupStart, j - prevGroupStart);
- prevGroupStart = j;
- #endif
- }
- else
- thereAreGroups = 1;
- {
- UInt32 ind = ind2[val & mask];
- temp[j] = ind;
- Groups[ind] = group;
- }
- }
-
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetGroupSize(temp + prevGroupStart, j - prevGroupStart);
- #endif
- }
-
- for (j = 0; j < groupSize; j++)
- ind2[j] = temp[j];
- return thereAreGroups;
- }
-
- /* Check that all strings are in one group (cannot sort) */
- {
- UInt32 group, j;
- UInt32 sp = ind2[0] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;
- group = Groups[sp];
- for (j = 1; j < groupSize; j++)
- {
- sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;
- if (Groups[sp] != group)
- break;
- }
- if (j == groupSize)
- {
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetGroupSize(ind2, groupSize);
- #endif
- return 1;
- }
- }
-
- #ifndef BLOCK_SORT_USE_HEAP_SORT
- {
- /* ---------- Range Sort ---------- */
- UInt32 i;
- UInt32 mid;
- for (;;)
- {
- UInt32 j;
- if (range <= 1)
- {
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetGroupSize(ind2, groupSize);
- #endif
- return 1;
- }
- mid = left + ((range + 1) >> 1);
- j = groupSize;
- i = 0;
- do
- {
- UInt32 sp = ind2[i] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;
- if (Groups[sp] >= mid)
- {
- for (j--; j > i; j--)
- {
- sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;
- if (Groups[sp] < mid)
- {
- UInt32 temp = ind2[i]; ind2[i] = ind2[j]; ind2[j] = temp;
- break;
- }
- }
- if (i >= j)
- break;
- }
- }
- while (++i < j);
- if (i == 0)
- {
- range = range - (mid - left);
- left = mid;
- }
- else if (i == groupSize)
- range = (mid - left);
- else
- break;
- }
-
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- {
- UInt32 t = (groupOffset + i - 1);
- UInt32 *Flags = Groups + BlockSize;
- Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));
- }
- #endif
-
- {
- UInt32 j;
- for (j = i; j < groupSize; j++)
- Groups[ind2[j]] = groupOffset + i;
- }
-
- {
- UInt32 res = SortGroup(BlockSize, NumSortedBytes, groupOffset, i, NumRefBits, Indices, left, mid - left);
- return res | SortGroup(BlockSize, NumSortedBytes, groupOffset + i, groupSize - i, NumRefBits, Indices, mid, range - (mid - left));
- }
-
- }
-
- #else
-
- /* ---------- Heap Sort ---------- */
-
- {
- UInt32 j;
- for (j = 0; j < groupSize; j++)
- {
- UInt32 sp = ind2[j] + NumSortedBytes; if (sp >= BlockSize) sp -= BlockSize;
- ind2[j] = sp;
- }
-
- HeapSortRef(ind2, Groups, groupSize);
-
- /* Write Flags */
- {
- UInt32 sp = ind2[0];
- UInt32 group = Groups[sp];
-
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 *Flags = Groups + BlockSize;
- #else
- UInt32 prevGroupStart = 0;
- #endif
-
- for (j = 1; j < groupSize; j++)
- {
- sp = ind2[j];
- if (Groups[sp] != group)
- {
- group = Groups[sp];
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- {
- UInt32 t = groupOffset + j - 1;
- Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));
- }
- #else
- SetGroupSize(ind2 + prevGroupStart, j - prevGroupStart);
- prevGroupStart = j;
- #endif
- }
- }
-
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- SetGroupSize(ind2 + prevGroupStart, j - prevGroupStart);
- #endif
- }
- {
- /* Write new Groups values and Check that there are groups */
- UInt32 thereAreGroups = 0;
- for (j = 0; j < groupSize; j++)
- {
- UInt32 group = groupOffset + j;
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 subGroupSize = ((ind2[j] & ~0xC0000000) >> kNumBitsMax);
- if ((ind2[j] & 0x40000000) != 0)
- subGroupSize += ((ind2[j + 1] >> kNumBitsMax) << kNumExtra0Bits);
- subGroupSize++;
- for (;;)
- {
- UInt32 original = ind2[j];
- UInt32 sp = original & kIndexMask;
- if (sp < NumSortedBytes) sp += BlockSize; sp -= NumSortedBytes;
- ind2[j] = sp | (original & ~kIndexMask);
- Groups[sp] = group;
- if (--subGroupSize == 0)
- break;
- j++;
- thereAreGroups = 1;
- }
- #else
- UInt32 *Flags = Groups + BlockSize;
- for (;;)
- {
- UInt32 sp = ind2[j]; if (sp < NumSortedBytes) sp += BlockSize; sp -= NumSortedBytes;
- ind2[j] = sp;
- Groups[sp] = group;
- if ((Flags[(groupOffset + j) >> kNumFlagsBits] & (1 << ((groupOffset + j) & kFlagsMask))) == 0)
- break;
- j++;
- thereAreGroups = 1;
- }
- #endif
- }
- return thereAreGroups;
- }
- }
- #endif
-}
-
-/* conditions: blockSize > 0 */
-UInt32 BlockSort(UInt32 *Indices, const Byte *data, UInt32 blockSize)
-{
- UInt32 *counters = Indices + blockSize;
- UInt32 i;
- UInt32 *Groups;
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 *Flags;
- #endif
-
- /* Radix-Sort for 2 bytes */
- for (i = 0; i < kNumHashValues; i++)
- counters[i] = 0;
- for (i = 0; i < blockSize - 1; i++)
- counters[((UInt32)data[i] << 8) | data[i + 1]]++;
- counters[((UInt32)data[i] << 8) | data[0]]++;
-
- Groups = counters + BS_TEMP_SIZE;
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- Flags = Groups + blockSize;
- {
- UInt32 numWords = (blockSize + kFlagsMask) >> kNumFlagsBits;
- for (i = 0; i < numWords; i++)
- Flags[i] = kAllFlags;
- }
- #endif
-
- {
- UInt32 sum = 0;
- for (i = 0; i < kNumHashValues; i++)
- {
- UInt32 groupSize = counters[i];
- if (groupSize > 0)
- {
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 t = sum + groupSize - 1;
- Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask));
- #endif
- sum += groupSize;
- }
- counters[i] = sum - groupSize;
- }
-
- for (i = 0; i < blockSize - 1; i++)
- Groups[i] = counters[((UInt32)data[i] << 8) | data[i + 1]];
- Groups[i] = counters[((UInt32)data[i] << 8) | data[0]];
-
- for (i = 0; i < blockSize - 1; i++)
- Indices[counters[((UInt32)data[i] << 8) | data[i + 1]]++] = i;
- Indices[counters[((UInt32)data[i] << 8) | data[0]]++] = i;
-
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- {
- UInt32 prev = 0;
- for (i = 0; i < kNumHashValues; i++)
- {
- UInt32 prevGroupSize = counters[i] - prev;
- if (prevGroupSize == 0)
- continue;
- SetGroupSize(Indices + prev, prevGroupSize);
- prev = counters[i];
- }
- }
- #endif
- }
-
- {
- int NumRefBits;
- UInt32 NumSortedBytes;
- for (NumRefBits = 0; ((blockSize - 1) >> NumRefBits) != 0; NumRefBits++);
- NumRefBits = 32 - NumRefBits;
- if (NumRefBits > kNumRefBitsMax)
- NumRefBits = kNumRefBitsMax;
-
- for (NumSortedBytes = kNumHashBytes; ; NumSortedBytes <<= 1)
- {
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- UInt32 finishedGroupSize = 0;
- #endif
- UInt32 newLimit = 0;
- for (i = 0; i < blockSize;)
- {
- UInt32 groupSize;
- #ifdef BLOCK_SORT_EXTERNAL_FLAGS
-
- if ((Flags[i >> kNumFlagsBits] & (1 << (i & kFlagsMask))) == 0)
- {
- i++;
- continue;
- }
- for (groupSize = 1;
- (Flags[(i + groupSize) >> kNumFlagsBits] & (1 << ((i + groupSize) & kFlagsMask))) != 0;
- groupSize++);
-
- groupSize++;
-
- #else
-
- groupSize = ((Indices[i] & ~0xC0000000) >> kNumBitsMax);
- {
- Bool finishedGroup = ((Indices[i] & 0x80000000) == 0);
- if ((Indices[i] & 0x40000000) != 0)
- {
- groupSize += ((Indices[i + 1] >> kNumBitsMax) << kNumExtra0Bits);
- Indices[i + 1] &= kIndexMask;
- }
- Indices[i] &= kIndexMask;
- groupSize++;
- if (finishedGroup || groupSize == 1)
- {
- Indices[i - finishedGroupSize] &= kIndexMask;
- if (finishedGroupSize > 1)
- Indices[i - finishedGroupSize + 1] &= kIndexMask;
- {
- UInt32 newGroupSize = groupSize + finishedGroupSize;
- SetFinishedGroupSize(Indices + i - finishedGroupSize, newGroupSize);
- finishedGroupSize = newGroupSize;
- }
- i += groupSize;
- continue;
- }
- finishedGroupSize = 0;
- }
-
- #endif
-
- if (NumSortedBytes >= blockSize)
- {
- UInt32 j;
- for (j = 0; j < groupSize; j++)
- {
- UInt32 t = (i + j);
- /* Flags[t >> kNumFlagsBits] &= ~(1 << (t & kFlagsMask)); */
- Groups[Indices[t]] = t;
- }
- }
- else
- if (SortGroup(blockSize, NumSortedBytes, i, groupSize, NumRefBits, Indices
- #ifndef BLOCK_SORT_USE_HEAP_SORT
- , 0, blockSize
- #endif
- ) != 0)
- newLimit = i + groupSize;
- i += groupSize;
- }
- if (newLimit == 0)
- break;
- }
- }
- #ifndef BLOCK_SORT_EXTERNAL_FLAGS
- for (i = 0; i < blockSize;)
- {
- UInt32 groupSize = ((Indices[i] & ~0xC0000000) >> kNumBitsMax);
- if ((Indices[i] & 0x40000000) != 0)
- {
- groupSize += ((Indices[i + 1] >> kNumBitsMax) << kNumExtra0Bits);
- Indices[i + 1] &= kIndexMask;
- }
- Indices[i] &= kIndexMask;
- groupSize++;
- i += groupSize;
- }
- #endif
- return Groups[0];
-}
-
diff --git a/src/libs/7zip/win/C/BwtSort.h b/src/libs/7zip/win/C/BwtSort.h
deleted file mode 100644
index ce5598f0f..000000000
--- a/src/libs/7zip/win/C/BwtSort.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* BwtSort.h -- BWT block sorting
-2009-02-07 : Igor Pavlov : Public domain */
-
-#ifndef __BWT_SORT_H
-#define __BWT_SORT_H
-
-#include "Types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* use BLOCK_SORT_EXTERNAL_FLAGS if blockSize can be > 1M */
-/* #define BLOCK_SORT_EXTERNAL_FLAGS */
-
-#ifdef BLOCK_SORT_EXTERNAL_FLAGS
-#define BLOCK_SORT_EXTERNAL_SIZE(blockSize) ((((blockSize) + 31) >> 5))
-#else
-#define BLOCK_SORT_EXTERNAL_SIZE(blockSize) 0
-#endif
-
-#define BLOCK_SORT_BUF_SIZE(blockSize) ((blockSize) * 2 + BLOCK_SORT_EXTERNAL_SIZE(blockSize) + (1 << 16))
-
-UInt32 BlockSort(UInt32 *indices, const Byte *data, UInt32 blockSize);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/libs/7zip/win/C/HuffEnc.c b/src/libs/7zip/win/C/HuffEnc.c
deleted file mode 100644
index 561c7e5da..000000000
--- a/src/libs/7zip/win/C/HuffEnc.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/* HuffEnc.c -- functions for Huffman encoding
-2009-09-02 : Igor Pavlov : Public domain */
-
-#include "HuffEnc.h"
-#include "Sort.h"
-
-#define kMaxLen 16
-#define NUM_BITS 10
-#define MASK ((1 << NUM_BITS) - 1)
-
-#define NUM_COUNTERS 64
-
-#define HUFFMAN_SPEED_OPT
-
-void Huffman_Generate(const UInt32 *freqs, UInt32 *p, Byte *lens, UInt32 numSymbols, UInt32 maxLen)
-{
- UInt32 num = 0;
- /* if (maxLen > 10) maxLen = 10; */
- {
- UInt32 i;
-
- #ifdef HUFFMAN_SPEED_OPT
-
- UInt32 counters[NUM_COUNTERS];
- for (i = 0; i < NUM_COUNTERS; i++)
- counters[i] = 0;
- for (i = 0; i < numSymbols; i++)
- {
- UInt32 freq = freqs[i];
- counters[(freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1]++;
- }
-
- for (i = 1; i < NUM_COUNTERS; i++)
- {
- UInt32 temp = counters[i];
- counters[i] = num;
- num += temp;
- }
-
- for (i = 0; i < numSymbols; i++)
- {
- UInt32 freq = freqs[i];
- if (freq == 0)
- lens[i] = 0;
- else
- p[counters[((freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1)]++] = i | (freq << NUM_BITS);
- }
- counters[0] = 0;
- HeapSort(p + counters[NUM_COUNTERS - 2], counters[NUM_COUNTERS - 1] - counters[NUM_COUNTERS - 2]);
-
- #else
-
- for (i = 0; i < numSymbols; i++)
- {
- UInt32 freq = freqs[i];
- if (freq == 0)
- lens[i] = 0;
- else
- p[num++] = i | (freq << NUM_BITS);
- }
- HeapSort(p, num);
-
- #endif
- }
-
- if (num < 2)
- {
- unsigned minCode = 0;
- unsigned maxCode = 1;
- if (num == 1)
- {
- maxCode = (unsigned)p[0] & MASK;
- if (maxCode == 0)
- maxCode++;
- }
- p[minCode] = 0;
- p[maxCode] = 1;
- lens[minCode] = lens[maxCode] = 1;
- return;
- }
-
- {
- UInt32 b, e, i;
-
- i = b = e = 0;
- do
- {
- UInt32 n, m, freq;
- n = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++;
- freq = (p[n] & ~MASK);
- p[n] = (p[n] & MASK) | (e << NUM_BITS);
- m = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++;
- freq += (p[m] & ~MASK);
- p[m] = (p[m] & MASK) | (e << NUM_BITS);
- p[e] = (p[e] & MASK) | freq;
- e++;
- }
- while (num - e > 1);
-
- {
- UInt32 lenCounters[kMaxLen + 1];
- for (i = 0; i <= kMaxLen; i++)
- lenCounters[i] = 0;
-
- p[--e] &= MASK;
- lenCounters[1] = 2;
- while (e > 0)
- {
- UInt32 len = (p[p[--e] >> NUM_BITS] >> NUM_BITS) + 1;
- p[e] = (p[e] & MASK) | (len << NUM_BITS);
- if (len >= maxLen)
- for (len = maxLen - 1; lenCounters[len] == 0; len--);
- lenCounters[len]--;
- lenCounters[len + 1] += 2;
- }
-
- {
- UInt32 len;
- i = 0;
- for (len = maxLen; len != 0; len--)
- {
- UInt32 num;
- for (num = lenCounters[len]; num != 0; num--)
- lens[p[i++] & MASK] = (Byte)len;
- }
- }
-
- {
- UInt32 nextCodes[kMaxLen + 1];
- {
- UInt32 code = 0;
- UInt32 len;
- for (len = 1; len <= kMaxLen; len++)
- nextCodes[len] = code = (code + lenCounters[len - 1]) << 1;
- }
- /* if (code + lenCounters[kMaxLen] - 1 != (1 << kMaxLen) - 1) throw 1; */
-
- {
- UInt32 i;
- for (i = 0; i < numSymbols; i++)
- p[i] = nextCodes[lens[i]]++;
- }
- }
- }
- }
-}
diff --git a/src/libs/7zip/win/C/HuffEnc.h b/src/libs/7zip/win/C/HuffEnc.h
deleted file mode 100644
index 9cf4bfde8..000000000
--- a/src/libs/7zip/win/C/HuffEnc.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* HuffEnc.h -- Huffman encoding
-2009-02-07 : Igor Pavlov : Public domain */
-
-#ifndef __HUFF_ENC_H
-#define __HUFF_ENC_H
-
-#include "Types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-Conditions:
- num <= 1024 = 2 ^ NUM_BITS
- Sum(freqs) < 4M = 2 ^ (32 - NUM_BITS)
- maxLen <= 16 = kMaxLen
- Num_Items(p) >= HUFFMAN_TEMP_SIZE(num)
-*/
-
-void Huffman_Generate(const UInt32 *freqs, UInt32 *p, Byte *lens, UInt32 num, UInt32 maxLen);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/libs/7zip/win/C/Ppmd.h b/src/libs/7zip/win/C/Ppmd.h
deleted file mode 100644
index 72a1cc52f..000000000
--- a/src/libs/7zip/win/C/Ppmd.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Ppmd.h -- PPMD codec common code
-2010-03-12 : Igor Pavlov : Public domain
-This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
-
-#ifndef __PPMD_H
-#define __PPMD_H
-
-#include "Types.h"
-#include "CpuArch.h"
-
-EXTERN_C_BEGIN
-
-#ifdef MY_CPU_32BIT
- #define PPMD_32BIT
-#endif
-
-#define PPMD_INT_BITS 7
-#define PPMD_PERIOD_BITS 7
-#define PPMD_BIN_SCALE (1 << (PPMD_INT_BITS + PPMD_PERIOD_BITS))
-
-#define PPMD_GET_MEAN_SPEC(summ, shift, round) (((summ) + (1 << ((shift) - (round)))) >> (shift))
-#define PPMD_GET_MEAN(summ) PPMD_GET_MEAN_SPEC((summ), PPMD_PERIOD_BITS, 2)
-#define PPMD_UPDATE_PROB_0(prob) ((prob) + (1 << PPMD_INT_BITS) - PPMD_GET_MEAN(prob))
-#define PPMD_UPDATE_PROB_1(prob) ((prob) - PPMD_GET_MEAN(prob))
-
-#define PPMD_N1 4
-#define PPMD_N2 4
-#define PPMD_N3 4
-#define PPMD_N4 ((128 + 3 - 1 * PPMD_N1 - 2 * PPMD_N2 - 3 * PPMD_N3) / 4)
-#define PPMD_NUM_INDEXES (PPMD_N1 + PPMD_N2 + PPMD_N3 + PPMD_N4)
-
-/* SEE-contexts for PPM-contexts with masked symbols */
-typedef struct
-{
- UInt16 Summ; /* Freq */
- Byte Shift; /* Speed of Freq change; low Shift is for fast change */
- Byte Count; /* Count to next change of Shift */
-} CPpmd_See;
-
-#define Ppmd_See_Update(p) if ((p)->Shift < PPMD_PERIOD_BITS && --(p)->Count == 0) \
- { (p)->Summ <<= 1; (p)->Count = (Byte)(3 << (p)->Shift++); }
-
-typedef struct
-{
- Byte Symbol;
- Byte Freq;
- UInt16 SuccessorLow;
- UInt16 SuccessorHigh;
-} CPpmd_State;
-
-typedef
- #ifdef PPMD_32BIT
- CPpmd_State *
- #else
- UInt32
- #endif
- CPpmd_State_Ref;
-
-typedef
- #ifdef PPMD_32BIT
- void *
- #else
- UInt32
- #endif
- CPpmd_Void_Ref;
-
-typedef
- #ifdef PPMD_32BIT
- Byte *
- #else
- UInt32
- #endif
- CPpmd_Byte_Ref;
-
-#define PPMD_SetAllBitsIn256Bytes(p) \
- { unsigned i; for (i = 0; i < 256 / sizeof(p[0]); i += 8) { \
- p[i+7] = p[i+6] = p[i+5] = p[i+4] = p[i+3] = p[i+2] = p[i+1] = p[i+0] = ~(size_t)0; }}
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/Ppmd7.c b/src/libs/7zip/win/C/Ppmd7.c
deleted file mode 100644
index 060d86d2e..000000000
--- a/src/libs/7zip/win/C/Ppmd7.c
+++ /dev/null
@@ -1,708 +0,0 @@
-/* Ppmd7.c -- PPMdH codec
-2010-03-12 : Igor Pavlov : Public domain
-This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
-
-#include <memory.h>
-
-#include "Ppmd7.h"
-
-const Byte PPMD7_kExpEscape[16] = { 25, 14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 };
-static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051};
-
-#define MAX_FREQ 124
-#define UNIT_SIZE 12
-
-#define U2B(nu) ((UInt32)(nu) * UNIT_SIZE)
-#define U2I(nu) (p->Units2Indx[(nu) - 1])
-#define I2U(indx) (p->Indx2Units[indx])
-
-#ifdef PPMD_32BIT
- #define REF(ptr) (ptr)
-#else
- #define REF(ptr) ((UInt32)((Byte *)(ptr) - (p)->Base))
-#endif
-
-#define STATS_REF(ptr) ((CPpmd_State_Ref)REF(ptr))
-
-#define CTX(ref) ((CPpmd7_Context *)Ppmd7_GetContext(p, ref))
-#define STATS(ctx) Ppmd7_GetStats(p, ctx)
-#define ONE_STATE(ctx) Ppmd7Context_OneState(ctx)
-#define SUFFIX(ctx) CTX((ctx)->Suffix)
-
-typedef CPpmd7_Context * CTX_PTR;
-
-struct CPpmd7_Node_;
-
-typedef
- #ifdef PPMD_32BIT
- struct CPpmd7_Node_ *
- #else
- UInt32
- #endif
- CPpmd7_Node_Ref;
-
-typedef struct CPpmd7_Node_
-{
- UInt16 Stamp; /* must be at offset 0 as CPpmd7_Context::NumStats. Stamp=0 means free */
- UInt16 NU;
- CPpmd7_Node_Ref Next; /* must be at offset >= 4 */
- CPpmd7_Node_Ref Prev;
-} CPpmd7_Node;
-
-#ifdef PPMD_32BIT
- #define NODE(ptr) (ptr)
-#else
- #define NODE(offs) ((CPpmd7_Node *)(p->Base + (offs)))
-#endif
-
-void Ppmd7_Construct(CPpmd7 *p)
-{
- unsigned i, k, m;
-
- p->Base = 0;
-
- for (i = 0, k = 0; i < PPMD_NUM_INDEXES; i++)
- {
- unsigned step = (i >= 12 ? 4 : (i >> 2) + 1);
- do { p->Units2Indx[k++] = (Byte)i; } while(--step);
- p->Indx2Units[i] = (Byte)k;
- }
-
- p->NS2BSIndx[0] = (0 << 1);
- p->NS2BSIndx[1] = (1 << 1);
- memset(p->NS2BSIndx + 2, (2 << 1), 9);
- memset(p->NS2BSIndx + 11, (3 << 1), 256 - 11);
-
- for (i = 0; i < 3; i++)
- p->NS2Indx[i] = (Byte)i;
- for (m = i, k = 1; i < 256; i++)
- {
- p->NS2Indx[i] = (Byte)m;
- if (--k == 0)
- k = (++m) - 2;
- }
-
- memset(p->HB2Flag, 0, 0x40);
- memset(p->HB2Flag + 0x40, 8, 0x100 - 0x40);
-}
-
-void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc)
-{
- alloc->Free(alloc, p->Base);
- p->Size = 0;
- p->Base = 0;
-}
-
-Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc)
-{
- if (p->Base == 0 || p->Size != size)
- {
- Ppmd7_Free(p, alloc);
- p->AlignOffset =
- #ifdef PPMD_32BIT
- (4 - size) & 3;
- #else
- 4 - (size & 3);
- #endif
- if ((p->Base = (Byte *)alloc->Alloc(alloc, p->AlignOffset + size
- #ifndef PPMD_32BIT
- + UNIT_SIZE
- #endif
- )) == 0)
- return False;
- p->Size = size;
- }
- return True;
-}
-
-static void InsertNode(CPpmd7 *p, void *node, unsigned indx)
-{
- *((CPpmd_Void_Ref *)node) = p->FreeList[indx];
- p->FreeList[indx] = REF(node);
-}
-
-static void *RemoveNode(CPpmd7 *p, unsigned indx)
-{
- CPpmd_Void_Ref *node = (CPpmd_Void_Ref *)Ppmd7_GetPtr(p, p->FreeList[indx]);
- p->FreeList[indx] = *node;
- return node;
-}
-
-static void SplitBlock(CPpmd7 *p, void *ptr, unsigned oldIndx, unsigned newIndx)
-{
- unsigned i, nu = I2U(oldIndx) - I2U(newIndx);
- ptr = (Byte *)ptr + U2B(I2U(newIndx));
- if (I2U(i = U2I(nu)) != nu)
- {
- unsigned k = I2U(--i);
- InsertNode(p, ((Byte *)ptr) + U2B(k), nu - k - 1);
- }
- InsertNode(p, ptr, i);
-}
-
-static void GlueFreeBlocks(CPpmd7 *p)
-{
- #ifdef PPMD_32BIT
- CPpmd7_Node headItem;
- CPpmd7_Node_Ref head = &headItem;
- #else
- CPpmd7_Node_Ref head = p->AlignOffset + p->Size;
- #endif
-
- CPpmd7_Node_Ref n = head;
- unsigned i;
-
- p->GlueCount = 255;
-
- /* create doubly-linked list of free blocks */
- for (i = 0; i < PPMD_NUM_INDEXES; i++)
- {
- UInt16 nu = I2U(i);
- CPpmd7_Node_Ref next = (CPpmd7_Node_Ref)p->FreeList[i];
- p->FreeList[i] = 0;
- while (next != 0)
- {
- CPpmd7_Node *node = NODE(next);
- node->Next = n;
- n = NODE(n)->Prev = next;
- next = *(const CPpmd7_Node_Ref *)node;
- node->Stamp = 0;
- node->NU = (UInt16)nu;
- }
- }
- NODE(head)->Stamp = 1;
- NODE(head)->Next = n;
- NODE(n)->Prev = head;
- if (p->LoUnit != p->HiUnit)
- ((CPpmd7_Node *)p->LoUnit)->Stamp = 1;
-
- /* Glue free blocks */
- while (n != head)
- {
- CPpmd7_Node *node = NODE(n);
- UInt32 nu = (UInt32)node->NU;
- for (;;)
- {
- CPpmd7_Node *node2 = NODE(n) + nu;
- nu += node2->NU;
- if (node2->Stamp != 0 || nu >= 0x10000)
- break;
- NODE(node2->Prev)->Next = node2->Next;
- NODE(node2->Next)->Prev = node2->Prev;
- node->NU = (UInt16)nu;
- }
- n = node->Next;
- }
-
- /* Fill lists of free blocks */
- for (n = NODE(head)->Next; n != head;)
- {
- CPpmd7_Node *node = NODE(n);
- unsigned nu;
- CPpmd7_Node_Ref next = node->Next;
- for (nu = node->NU; nu > 128; nu -= 128, node += 128)
- InsertNode(p, node, PPMD_NUM_INDEXES - 1);
- if (I2U(i = U2I(nu)) != nu)
- {
- unsigned k = I2U(--i);
- InsertNode(p, node + k, nu - k - 1);
- }
- InsertNode(p, node, i);
- n = next;
- }
-}
-
-static void *AllocUnitsRare(CPpmd7 *p, unsigned indx)
-{
- unsigned i;
- void *retVal;
- if (p->GlueCount == 0)
- {
- GlueFreeBlocks(p);
- if (p->FreeList[indx] != 0)
- return RemoveNode(p, indx);
- }
- i = indx;
- do
- {
- if (++i == PPMD_NUM_INDEXES)
- {
- UInt32 numBytes = U2B(I2U(indx));
- p->GlueCount--;
- return ((UInt32)(p->UnitsStart - p->Text) > numBytes) ? (p->UnitsStart -= numBytes) : (NULL);
- }
- }
- while (p->FreeList[i] == 0);
- retVal = RemoveNode(p, i);
- SplitBlock(p, retVal, i, indx);
- return retVal;
-}
-
-static void *AllocUnits(CPpmd7 *p, unsigned indx)
-{
- UInt32 numBytes;
- if (p->FreeList[indx] != 0)
- return RemoveNode(p, indx);
- numBytes = U2B(I2U(indx));
- if (numBytes <= (UInt32)(p->HiUnit - p->LoUnit))
- {
- void *retVal = p->LoUnit;
- p->LoUnit += numBytes;
- return retVal;
- }
- return AllocUnitsRare(p, indx);
-}
-
-#define MyMem12Cpy(dest, src, num) \
- { UInt32 *d = (UInt32 *)dest; const UInt32 *s = (const UInt32 *)src; UInt32 n = num; \
- do { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; s += 3; d += 3; } while(--n); }
-
-static void *ShrinkUnits(CPpmd7 *p, void *oldPtr, unsigned oldNU, unsigned newNU)
-{
- unsigned i0 = U2I(oldNU);
- unsigned i1 = U2I(newNU);
- if (i0 == i1)
- return oldPtr;
- if (p->FreeList[i1] != 0)
- {
- void *ptr = RemoveNode(p, i1);
- MyMem12Cpy(ptr, oldPtr, newNU);
- InsertNode(p, oldPtr, i0);
- return ptr;
- }
- SplitBlock(p, oldPtr, i0, i1);
- return oldPtr;
-}
-
-#define SUCCESSOR(p) ((CPpmd_Void_Ref)((p)->SuccessorLow | ((UInt32)(p)->SuccessorHigh << 16)))
-
-static void SetSuccessor(CPpmd_State *p, CPpmd_Void_Ref v)
-{
- (p)->SuccessorLow = (UInt16)((UInt32)(v) & 0xFFFF);
- (p)->SuccessorHigh = (UInt16)(((UInt32)(v) >> 16) & 0xFFFF);
-}
-
-static void RestartModel(CPpmd7 *p)
-{
- unsigned i, k, m;
-
- memset(p->FreeList, 0, sizeof(p->FreeList));
- p->Text = p->Base + p->AlignOffset;
- p->HiUnit = p->Text + p->Size;
- p->LoUnit = p->UnitsStart = p->HiUnit - p->Size / 8 / UNIT_SIZE * 7 * UNIT_SIZE;
- p->GlueCount = 0;
-
- p->OrderFall = p->MaxOrder;
- p->RunLength = p->InitRL = -(Int32)((p->MaxOrder < 12) ? p->MaxOrder : 12) - 1;
- p->PrevSuccess = 0;
-
- p->MinContext = p->MaxContext = (CTX_PTR)(p->HiUnit -= UNIT_SIZE); /* AllocContext(p); */
- p->MinContext->Suffix = 0;
- p->MinContext->NumStats = 256;
- p->MinContext->SummFreq = 256 + 1;
- p->FoundState = (CPpmd_State *)p->LoUnit; /* AllocUnits(p, PPMD_NUM_INDEXES - 1); */
- p->LoUnit += U2B(256 / 2);
- p->MinContext->Stats = REF(p->FoundState);
- for (i = 0; i < 256; i++)
- {
- CPpmd_State *s = &p->FoundState[i];
- s->Symbol = (Byte)i;
- s->Freq = 1;
- SetSuccessor(s, 0);
- }
-
- for (i = 0; i < 128; i++)
- for (k = 0; k < 8; k++)
- {
- UInt16 *dest = p->BinSumm[i] + k;
- UInt16 val = (UInt16)(PPMD_BIN_SCALE - kInitBinEsc[k] / (i + 2));
- for (m = 0; m < 64; m += 8)
- dest[m] = val;
- }
-
- for (i = 0; i < 25; i++)
- for (k = 0; k < 16; k++)
- {
- CPpmd_See *s = &p->See[i][k];
- s->Summ = (UInt16)((5 * i + 10) << (s->Shift = PPMD_PERIOD_BITS - 4));
- s->Count = 4;
- }
-}
-
-void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder)
-{
- p->MaxOrder = maxOrder;
- RestartModel(p);
- p->DummySee.Shift = PPMD_PERIOD_BITS;
- p->DummySee.Summ = 0; /* unused */
- p->DummySee.Count = 64; /* unused */
-}
-
-static CTX_PTR CreateSuccessors(CPpmd7 *p, Bool skip)
-{
- CPpmd_State upState;
- CTX_PTR c = p->MinContext;
- CPpmd_Byte_Ref upBranch = (CPpmd_Byte_Ref)SUCCESSOR(p->FoundState);
- CPpmd_State *ps[PPMD7_MAX_ORDER];
- unsigned numPs = 0;
-
- if (!skip)
- ps[numPs++] = p->FoundState;
-
- while (c->Suffix)
- {
- CPpmd_Void_Ref successor;
- CPpmd_State *s;
- c = SUFFIX(c);
- if (c->NumStats != 1)
- {
- for (s = STATS(c); s->Symbol != p->FoundState->Symbol; s++);
- }
- else
- s = ONE_STATE(c);
- successor = SUCCESSOR(s);
- if (successor != upBranch)
- {
- c = CTX(successor);
- if (numPs == 0)
- return c;
- break;
- }
- ps[numPs++] = s;
- }
-
- upState.Symbol = *(const Byte *)Ppmd7_GetPtr(p, upBranch);
- SetSuccessor(&upState, upBranch + 1);
-
- if (c->NumStats == 1)
- upState.Freq = ONE_STATE(c)->Freq;
- else
- {
- UInt32 cf, s0;
- CPpmd_State *s;
- for (s = STATS(c); s->Symbol != upState.Symbol; s++);
- cf = s->Freq - 1;
- s0 = c->SummFreq - c->NumStats - cf;
- upState.Freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : ((2 * cf + 3 * s0 - 1) / (2 * s0))));
- }
-
- do
- {
- /* Create Child */
- CTX_PTR c1; /* = AllocContext(p); */
- if (p->HiUnit != p->LoUnit)
- c1 = (CTX_PTR)(p->HiUnit -= UNIT_SIZE);
- else if (p->FreeList[0] != 0)
- c1 = (CTX_PTR)RemoveNode(p, 0);
- else
- {
- c1 = (CTX_PTR)AllocUnitsRare(p, 0);
- if (!c1)
- return NULL;
- }
- c1->NumStats = 1;
- *ONE_STATE(c1) = upState;
- c1->Suffix = REF(c);
- SetSuccessor(ps[--numPs], REF(c1));
- c = c1;
- }
- while (numPs != 0);
-
- return c;
-}
-
-static void SwapStates(CPpmd_State *t1, CPpmd_State *t2)
-{
- CPpmd_State tmp = *t1;
- *t1 = *t2;
- *t2 = tmp;
-}
-
-static void UpdateModel(CPpmd7 *p)
-{
- CPpmd_Void_Ref successor, fSuccessor = SUCCESSOR(p->FoundState);
- CTX_PTR c;
- unsigned s0, ns;
-
- if (p->FoundState->Freq < MAX_FREQ / 4 && p->MinContext->Suffix != 0)
- {
- c = SUFFIX(p->MinContext);
-
- if (c->NumStats == 1)
- {
- CPpmd_State *s = ONE_STATE(c);
- if (s->Freq < 32)
- s->Freq++;
- }
- else
- {
- CPpmd_State *s = STATS(c);
- if (s->Symbol != p->FoundState->Symbol)
- {
- do { s++; } while (s->Symbol != p->FoundState->Symbol);
- if (s[0].Freq >= s[-1].Freq)
- {
- SwapStates(&s[0], &s[-1]);
- s--;
- }
- }
- if (s->Freq < MAX_FREQ - 9)
- {
- s->Freq += 2;
- c->SummFreq += 2;
- }
- }
- }
-
- if (p->OrderFall == 0)
- {
- p->MinContext = p->MaxContext = CreateSuccessors(p, True);
- if (p->MinContext == 0)
- {
- RestartModel(p);
- return;
- }
- SetSuccessor(p->FoundState, REF(p->MinContext));
- return;
- }
-
- *p->Text++ = p->FoundState->Symbol;
- successor = REF(p->Text);
- if (p->Text >= p->UnitsStart)
- {
- RestartModel(p);
- return;
- }
-
- if (fSuccessor)
- {
- if (fSuccessor <= successor)
- {
- CTX_PTR cs = CreateSuccessors(p, False);
- if (cs == NULL)
- {
- RestartModel(p);
- return;
- }
- fSuccessor = REF(cs);
- }
- if (--p->OrderFall == 0)
- {
- successor = fSuccessor;
- p->Text -= (p->MaxContext != p->MinContext);
- }
- }
- else
- {
- SetSuccessor(p->FoundState, successor);
- fSuccessor = REF(p->MinContext);
- }
-
- s0 = p->MinContext->SummFreq - (ns = p->MinContext->NumStats) - (p->FoundState->Freq - 1);
-
- for (c = p->MaxContext; c != p->MinContext; c = SUFFIX(c))
- {
- unsigned ns1;
- UInt32 cf, sf;
- if ((ns1 = c->NumStats) != 1)
- {
- if ((ns1 & 1) == 0)
- {
- /* Expand for one UNIT */
- unsigned oldNU = ns1 >> 1;
- unsigned i = U2I(oldNU);
- if (i != U2I(oldNU + 1))
- {
- void *ptr = AllocUnits(p, i + 1);
- void *oldPtr;
- if (!ptr)
- {
- RestartModel(p);
- return;
- }
- oldPtr = STATS(c);
- MyMem12Cpy(ptr, oldPtr, oldNU);
- InsertNode(p, oldPtr, i);
- c->Stats = STATS_REF(ptr);
- }
- }
- c->SummFreq = (UInt16)(c->SummFreq + (2 * ns1 < ns) + 2 * ((4 * ns1 <= ns) & (c->SummFreq <= 8 * ns1)));
- }
- else
- {
- CPpmd_State *s = (CPpmd_State*)AllocUnits(p, 0);
- if (!s)
- {
- RestartModel(p);
- return;
- }
- *s = *ONE_STATE(c);
- c->Stats = REF(s);
- if (s->Freq < MAX_FREQ / 4 - 1)
- s->Freq <<= 1;
- else
- s->Freq = MAX_FREQ - 4;
- c->SummFreq = (UInt16)(s->Freq + p->InitEsc + (ns > 3));
- }
- cf = 2 * (UInt32)p->FoundState->Freq * (c->SummFreq + 6);
- sf = (UInt32)s0 + c->SummFreq;
- if (cf < 6 * sf)
- {
- cf = 1 + (cf > sf) + (cf >= 4 * sf);
- c->SummFreq += 3;
- }
- else
- {
- cf = 4 + (cf >= 9 * sf) + (cf >= 12 * sf) + (cf >= 15 * sf);
- c->SummFreq = (UInt16)(c->SummFreq + cf);
- }
- {
- CPpmd_State *s = STATS(c) + ns1;
- SetSuccessor(s, successor);
- s->Symbol = p->FoundState->Symbol;
- s->Freq = (Byte)cf;
- c->NumStats = (UInt16)(ns1 + 1);
- }
- }
- p->MaxContext = p->MinContext = CTX(fSuccessor);
-}
-
-static void Rescale(CPpmd7 *p)
-{
- unsigned i, adder, sumFreq, escFreq;
- CPpmd_State *stats = STATS(p->MinContext);
- CPpmd_State *s = p->FoundState;
- {
- CPpmd_State tmp = *s;
- for (; s != stats; s--)
- s[0] = s[-1];
- *s = tmp;
- }
- escFreq = p->MinContext->SummFreq - s->Freq;
- s->Freq += 4;
- adder = (p->OrderFall != 0);
- s->Freq = (Byte)((s->Freq + adder) >> 1);
- sumFreq = s->Freq;
-
- i = p->MinContext->NumStats - 1;
- do
- {
- escFreq -= (++s)->Freq;
- s->Freq = (Byte)((s->Freq + adder) >> 1);
- sumFreq += s->Freq;
- if (s[0].Freq > s[-1].Freq)
- {
- CPpmd_State *s1 = s;
- CPpmd_State tmp = *s1;
- do
- s1[0] = s1[-1];
- while (--s1 != stats && tmp.Freq > s1[-1].Freq);
- *s1 = tmp;
- }
- }
- while (--i);
-
- if (s->Freq == 0)
- {
- unsigned numStats = p->MinContext->NumStats;
- unsigned n0, n1;
- do { i++; } while ((--s)->Freq == 0);
- escFreq += i;
- p->MinContext->NumStats = (UInt16)(p->MinContext->NumStats - i);
- if (p->MinContext->NumStats == 1)
- {
- CPpmd_State tmp = *stats;
- do
- {
- tmp.Freq = (Byte)(tmp.Freq - (tmp.Freq >> 1));
- escFreq >>= 1;
- }
- while (escFreq > 1);
- InsertNode(p, stats, U2I(((numStats + 1) >> 1)));
- *(p->FoundState = ONE_STATE(p->MinContext)) = tmp;
- return;
- }
- n0 = (numStats + 1) >> 1;
- n1 = (p->MinContext->NumStats + 1) >> 1;
- if (n0 != n1)
- p->MinContext->Stats = STATS_REF(ShrinkUnits(p, stats, n0, n1));
- }
- p->MinContext->SummFreq = (UInt16)(sumFreq + escFreq - (escFreq >> 1));
- p->FoundState = STATS(p->MinContext);
-}
-
-CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *escFreq)
-{
- CPpmd_See *see;
- unsigned nonMasked = p->MinContext->NumStats - numMasked;
- if (p->MinContext->NumStats != 256)
- {
- see = p->See[p->NS2Indx[nonMasked - 1]] +
- (nonMasked < (unsigned)SUFFIX(p->MinContext)->NumStats - p->MinContext->NumStats) +
- 2 * (p->MinContext->SummFreq < 11 * p->MinContext->NumStats) +
- 4 * (numMasked > nonMasked) +
- p->HiBitsFlag;
- {
- unsigned r = (see->Summ >> see->Shift);
- see->Summ = (UInt16)(see->Summ - r);
- *escFreq = r + (r == 0);
- }
- }
- else
- {
- see = &p->DummySee;
- *escFreq = 1;
- }
- return see;
-}
-
-static void NextContext(CPpmd7 *p)
-{
- CTX_PTR c = CTX(SUCCESSOR(p->FoundState));
- if (p->OrderFall == 0 && (Byte *)c > p->Text)
- p->MinContext = p->MaxContext = c;
- else
- UpdateModel(p);
-}
-
-void Ppmd7_Update1(CPpmd7 *p)
-{
- CPpmd_State *s = p->FoundState;
- s->Freq += 4;
- p->MinContext->SummFreq += 4;
- if (s[0].Freq > s[-1].Freq)
- {
- SwapStates(&s[0], &s[-1]);
- p->FoundState = --s;
- if (s->Freq > MAX_FREQ)
- Rescale(p);
- }
- NextContext(p);
-}
-
-void Ppmd7_Update1_0(CPpmd7 *p)
-{
- p->PrevSuccess = (2 * p->FoundState->Freq > p->MinContext->SummFreq);
- p->RunLength += p->PrevSuccess;
- p->MinContext->SummFreq += 4;
- if ((p->FoundState->Freq += 4) > MAX_FREQ)
- Rescale(p);
- NextContext(p);
-}
-
-void Ppmd7_UpdateBin(CPpmd7 *p)
-{
- p->FoundState->Freq = (Byte)(p->FoundState->Freq + (p->FoundState->Freq < 128 ? 1: 0));
- p->PrevSuccess = 1;
- p->RunLength++;
- NextContext(p);
-}
-
-void Ppmd7_Update2(CPpmd7 *p)
-{
- p->MinContext->SummFreq += 4;
- if ((p->FoundState->Freq += 4) > MAX_FREQ)
- Rescale(p);
- p->RunLength = p->InitRL;
- UpdateModel(p);
-}
diff --git a/src/libs/7zip/win/C/Ppmd7.h b/src/libs/7zip/win/C/Ppmd7.h
deleted file mode 100644
index 96521c31f..000000000
--- a/src/libs/7zip/win/C/Ppmd7.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/* Ppmd7.h -- PPMdH compression codec
-2010-03-12 : Igor Pavlov : Public domain
-This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
-
-/* This code supports virtual RangeDecoder and includes the implementation
-of RangeCoder from 7z, instead of RangeCoder from original PPMd var.H.
-If you need the compatibility with original PPMd var.H, you can use external RangeDecoder */
-
-#ifndef __PPMD7_H
-#define __PPMD7_H
-
-#include "Ppmd.h"
-
-EXTERN_C_BEGIN
-
-#define PPMD7_MIN_ORDER 2
-#define PPMD7_MAX_ORDER 64
-
-#define PPMD7_MIN_MEM_SIZE (1 << 11)
-#define PPMD7_MAX_MEM_SIZE (0xFFFFFFFF - 12 * 3)
-
-struct CPpmd7_Context_;
-
-typedef
- #ifdef PPMD_32BIT
- struct CPpmd7_Context_ *
- #else
- UInt32
- #endif
- CPpmd7_Context_Ref;
-
-typedef struct CPpmd7_Context_
-{
- UInt16 NumStats;
- UInt16 SummFreq;
- CPpmd_State_Ref Stats;
- CPpmd7_Context_Ref Suffix;
-} CPpmd7_Context;
-
-#define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->SummFreq)
-
-typedef struct
-{
- CPpmd7_Context *MinContext, *MaxContext;
- CPpmd_State *FoundState;
- unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag;
- Int32 RunLength, InitRL; /* must be 32-bit at least */
-
- UInt32 Size;
- UInt32 GlueCount;
- Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart;
- UInt32 AlignOffset;
-
- Byte Indx2Units[PPMD_NUM_INDEXES];
- Byte Units2Indx[128];
- CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES];
- Byte NS2Indx[256], NS2BSIndx[256], HB2Flag[256];
- CPpmd_See DummySee, See[25][16];
- UInt16 BinSumm[128][64];
-} CPpmd7;
-
-void Ppmd7_Construct(CPpmd7 *p);
-Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc);
-void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc);
-void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder);
-#define Ppmd7_WasAllocated(p) ((p)->Base != NULL)
-
-
-/* ---------- Internal Functions ---------- */
-
-extern const Byte PPMD7_kExpEscape[16];
-
-#ifdef PPMD_32BIT
- #define Ppmd7_GetPtr(p, ptr) (ptr)
- #define Ppmd7_GetContext(p, ptr) (ptr)
- #define Ppmd7_GetStats(p, ctx) ((ctx)->Stats)
-#else
- #define Ppmd7_GetPtr(p, offs) ((void *)((p)->Base + (offs)))
- #define Ppmd7_GetContext(p, offs) ((CPpmd7_Context *)Ppmd7_GetPtr((p), (offs)))
- #define Ppmd7_GetStats(p, ctx) ((CPpmd_State *)Ppmd7_GetPtr((p), ((ctx)->Stats)))
-#endif
-
-void Ppmd7_Update1(CPpmd7 *p);
-void Ppmd7_Update1_0(CPpmd7 *p);
-void Ppmd7_Update2(CPpmd7 *p);
-void Ppmd7_UpdateBin(CPpmd7 *p);
-
-#define Ppmd7_GetBinSumm(p) \
- &p->BinSumm[Ppmd7Context_OneState(p->MinContext)->Freq - 1][p->PrevSuccess + \
- p->NS2BSIndx[Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \
- (p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \
- 2 * p->HB2Flag[Ppmd7Context_OneState(p->MinContext)->Symbol] + \
- ((p->RunLength >> 26) & 0x20)]
-
-CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale);
-
-
-/* ---------- Decode ---------- */
-
-typedef struct
-{
- UInt32 (*GetThreshold)(void *p, UInt32 total);
- void (*Decode)(void *p, UInt32 start, UInt32 size);
- UInt32 (*DecodeBit)(void *p, UInt32 size0);
-} IPpmd7_RangeDec;
-
-typedef struct
-{
- IPpmd7_RangeDec p;
- UInt32 Range;
- UInt32 Code;
- IByteIn *Stream;
-} CPpmd7z_RangeDec;
-
-void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p);
-Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p);
-#define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0)
-
-int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc);
-
-
-/* ---------- Encode ---------- */
-
-typedef struct
-{
- UInt64 Low;
- UInt32 Range;
- Byte Cache;
- UInt64 CacheSize;
- IByteOut *Stream;
-} CPpmd7z_RangeEnc;
-
-void Ppmd7z_RangeEnc_Init(CPpmd7z_RangeEnc *p);
-void Ppmd7z_RangeEnc_FlushData(CPpmd7z_RangeEnc *p);
-
-void Ppmd7_EncodeSymbol(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/Ppmd7Dec.c b/src/libs/7zip/win/C/Ppmd7Dec.c
deleted file mode 100644
index 68438d5ce..000000000
--- a/src/libs/7zip/win/C/Ppmd7Dec.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* Ppmd7Dec.c -- PPMdH Decoder
-2010-03-12 : Igor Pavlov : Public domain
-This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
-
-#include "Ppmd7.h"
-
-#define kTopValue (1 << 24)
-
-Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p)
-{
- unsigned i;
- p->Code = 0;
- p->Range = 0xFFFFFFFF;
- if (p->Stream->Read((void *)p->Stream) != 0)
- return False;
- for (i = 0; i < 4; i++)
- p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
- return (p->Code < 0xFFFFFFFF);
-}
-
-static UInt32 Range_GetThreshold(void *pp, UInt32 total)
-{
- CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
- return (p->Code) / (p->Range /= total);
-}
-
-static void Range_Normalize(CPpmd7z_RangeDec *p)
-{
- if (p->Range < kTopValue)
- {
- p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
- p->Range <<= 8;
- if (p->Range < kTopValue)
- {
- p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
- p->Range <<= 8;
- }
- }
-}
-
-static void Range_Decode(void *pp, UInt32 start, UInt32 size)
-{
- CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
- p->Code -= start * p->Range;
- p->Range *= size;
- Range_Normalize(p);
-}
-
-static UInt32 Range_DecodeBit(void *pp, UInt32 size0)
-{
- CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
- UInt32 newBound = (p->Range >> 14) * size0;
- UInt32 symbol;
- if (p->Code < newBound)
- {
- symbol = 0;
- p->Range = newBound;
- }
- else
- {
- symbol = 1;
- p->Code -= newBound;
- p->Range -= newBound;
- }
- Range_Normalize(p);
- return symbol;
-}
-
-void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p)
-{
- p->p.GetThreshold = Range_GetThreshold;
- p->p.Decode = Range_Decode;
- p->p.DecodeBit = Range_DecodeBit;
-}
-
-
-#define MASK(sym) ((signed char *)charMask)[sym]
-
-int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc)
-{
- size_t charMask[256 / sizeof(size_t)];
- if (p->MinContext->NumStats != 1)
- {
- CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext);
- unsigned i;
- UInt32 count, hiCnt;
- if ((count = rc->GetThreshold(rc, p->MinContext->SummFreq)) < (hiCnt = s->Freq))
- {
- Byte symbol;
- rc->Decode(rc, 0, s->Freq);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd7_Update1_0(p);
- return symbol;
- }
- p->PrevSuccess = 0;
- i = p->MinContext->NumStats - 1;
- do
- {
- if ((hiCnt += (++s)->Freq) > count)
- {
- Byte symbol;
- rc->Decode(rc, hiCnt - s->Freq, s->Freq);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd7_Update1(p);
- return symbol;
- }
- }
- while (--i);
- if (count >= p->MinContext->SummFreq)
- return -2;
- p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol];
- rc->Decode(rc, hiCnt, p->MinContext->SummFreq - hiCnt);
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- i = p->MinContext->NumStats - 1;
- do { MASK((--s)->Symbol) = 0; } while (--i);
- }
- else
- {
- UInt16 *prob = Ppmd7_GetBinSumm(p);
- if (rc->DecodeBit(rc, *prob) == 0)
- {
- Byte symbol;
- *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob);
- symbol = (p->FoundState = Ppmd7Context_OneState(p->MinContext))->Symbol;
- Ppmd7_UpdateBin(p);
- return symbol;
- }
- *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob);
- p->InitEsc = PPMD7_kExpEscape[*prob >> 10];
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(Ppmd7Context_OneState(p->MinContext)->Symbol) = 0;
- p->PrevSuccess = 0;
- }
- for (;;)
- {
- CPpmd_State *ps[256], *s;
- UInt32 freqSum, count, hiCnt;
- CPpmd_See *see;
- unsigned i, num, numMasked = p->MinContext->NumStats;
- do
- {
- p->OrderFall++;
- if (!p->MinContext->Suffix)
- return -1;
- p->MinContext = Ppmd7_GetContext(p, p->MinContext->Suffix);
- }
- while (p->MinContext->NumStats == numMasked);
- hiCnt = 0;
- s = Ppmd7_GetStats(p, p->MinContext);
- i = 0;
- num = p->MinContext->NumStats - numMasked;
- do
- {
- int k = (int)(MASK(s->Symbol));
- hiCnt += (s->Freq & k);
- ps[i] = s++;
- i -= k;
- }
- while (i != num);
-
- see = Ppmd7_MakeEscFreq(p, numMasked, &freqSum);
- freqSum += hiCnt;
- count = rc->GetThreshold(rc, freqSum);
-
- if (count < hiCnt)
- {
- Byte symbol;
- CPpmd_State **pps = ps;
- for (hiCnt = 0; (hiCnt += (*pps)->Freq) <= count; pps++);
- s = *pps;
- rc->Decode(rc, hiCnt - s->Freq, s->Freq);
- Ppmd_See_Update(see);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd7_Update2(p);
- return symbol;
- }
- if (count >= freqSum)
- return -2;
- rc->Decode(rc, hiCnt, freqSum - hiCnt);
- see->Summ = (UInt16)(see->Summ + freqSum);
- do { MASK(ps[--i]->Symbol) = 0; } while (i != 0);
- }
-}
diff --git a/src/libs/7zip/win/C/Ppmd7Enc.c b/src/libs/7zip/win/C/Ppmd7Enc.c
deleted file mode 100644
index 8247757d0..000000000
--- a/src/libs/7zip/win/C/Ppmd7Enc.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/* Ppmd7Enc.c -- PPMdH Encoder
-2010-03-12 : Igor Pavlov : Public domain
-This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
-
-#include "Ppmd7.h"
-
-#define kTopValue (1 << 24)
-
-void Ppmd7z_RangeEnc_Init(CPpmd7z_RangeEnc *p)
-{
- p->Low = 0;
- p->Range = 0xFFFFFFFF;
- p->Cache = 0;
- p->CacheSize = 1;
-}
-
-static void RangeEnc_ShiftLow(CPpmd7z_RangeEnc *p)
-{
- if ((UInt32)p->Low < (UInt32)0xFF000000 || (unsigned)(p->Low >> 32) != 0)
- {
- Byte temp = p->Cache;
- do
- {
- p->Stream->Write(p->Stream, (Byte)(temp + (Byte)(p->Low >> 32)));
- temp = 0xFF;
- }
- while(--p->CacheSize != 0);
- p->Cache = (Byte)((UInt32)p->Low >> 24);
- }
- p->CacheSize++;
- p->Low = (UInt32)p->Low << 8;
-}
-
-static void RangeEnc_Encode(CPpmd7z_RangeEnc *p, UInt32 start, UInt32 size, UInt32 total)
-{
- p->Low += start * (p->Range /= total);
- p->Range *= size;
- while (p->Range < kTopValue)
- {
- p->Range <<= 8;
- RangeEnc_ShiftLow(p);
- }
-}
-
-static void RangeEnc_EncodeBit_0(CPpmd7z_RangeEnc *p, UInt32 size0)
-{
- p->Range = (p->Range >> 14) * size0;
- while (p->Range < kTopValue)
- {
- p->Range <<= 8;
- RangeEnc_ShiftLow(p);
- }
-}
-
-static void RangeEnc_EncodeBit_1(CPpmd7z_RangeEnc *p, UInt32 size0)
-{
- UInt32 newBound = (p->Range >> 14) * size0;
- p->Low += newBound;
- p->Range -= newBound;
- while (p->Range < kTopValue)
- {
- p->Range <<= 8;
- RangeEnc_ShiftLow(p);
- }
-}
-
-void Ppmd7z_RangeEnc_FlushData(CPpmd7z_RangeEnc *p)
-{
- unsigned i;
- for (i = 0; i < 5; i++)
- RangeEnc_ShiftLow(p);
-}
-
-
-#define MASK(sym) ((signed char *)charMask)[sym]
-
-void Ppmd7_EncodeSymbol(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol)
-{
- size_t charMask[256 / sizeof(size_t)];
- if (p->MinContext->NumStats != 1)
- {
- CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext);
- UInt32 sum;
- unsigned i;
- if (s->Symbol == symbol)
- {
- RangeEnc_Encode(rc, 0, s->Freq, p->MinContext->SummFreq);
- p->FoundState = s;
- Ppmd7_Update1_0(p);
- return;
- }
- p->PrevSuccess = 0;
- sum = s->Freq;
- i = p->MinContext->NumStats - 1;
- do
- {
- if ((++s)->Symbol == symbol)
- {
- RangeEnc_Encode(rc, sum, s->Freq, p->MinContext->SummFreq);
- p->FoundState = s;
- Ppmd7_Update1(p);
- return;
- }
- sum += s->Freq;
- }
- while (--i);
-
- p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol];
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- i = p->MinContext->NumStats - 1;
- do { MASK((--s)->Symbol) = 0; } while (--i);
- RangeEnc_Encode(rc, sum, p->MinContext->SummFreq - sum, p->MinContext->SummFreq);
- }
- else
- {
- UInt16 *prob = Ppmd7_GetBinSumm(p);
- CPpmd_State *s = Ppmd7Context_OneState(p->MinContext);
- if (s->Symbol == symbol)
- {
- RangeEnc_EncodeBit_0(rc, *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob);
- p->FoundState = s;
- Ppmd7_UpdateBin(p);
- return;
- }
- else
- {
- RangeEnc_EncodeBit_1(rc, *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob);
- p->InitEsc = PPMD7_kExpEscape[*prob >> 10];
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- p->PrevSuccess = 0;
- }
- }
- for (;;)
- {
- UInt32 escFreq;
- CPpmd_See *see;
- CPpmd_State *s;
- UInt32 sum;
- unsigned i, numMasked = p->MinContext->NumStats;
- do
- {
- p->OrderFall++;
- if (!p->MinContext->Suffix)
- return; /* EndMarker (symbol = -1) */
- p->MinContext = Ppmd7_GetContext(p, p->MinContext->Suffix);
- }
- while (p->MinContext->NumStats == numMasked);
-
- see = Ppmd7_MakeEscFreq(p, numMasked, &escFreq);
- s = Ppmd7_GetStats(p, p->MinContext);
- sum = 0;
- i = p->MinContext->NumStats;
- do
- {
- int cur = s->Symbol;
- if (cur == symbol)
- {
- UInt32 low = sum;
- CPpmd_State *s1 = s;
- do
- {
- sum += (s->Freq & (int)(MASK(s->Symbol)));
- s++;
- }
- while (--i);
- RangeEnc_Encode(rc, low, s1->Freq, sum + escFreq);
- Ppmd_See_Update(see);
- p->FoundState = s1;
- Ppmd7_Update2(p);
- return;
- }
- sum += (s->Freq & (int)(MASK(cur)));
- MASK(cur) = 0;
- s++;
- }
- while (--i);
-
- RangeEnc_Encode(rc, sum, escFreq, sum + escFreq);
- see->Summ = (UInt16)(see->Summ + sum + escFreq);
- }
-}
diff --git a/src/libs/7zip/win/C/Ppmd8.c b/src/libs/7zip/win/C/Ppmd8.c
deleted file mode 100644
index 9187a88ef..000000000
--- a/src/libs/7zip/win/C/Ppmd8.c
+++ /dev/null
@@ -1,1120 +0,0 @@
-/* Ppmd8.c -- PPMdI codec
-2010-03-24 : Igor Pavlov : Public domain
-This code is based on PPMd var.I (2002): Dmitry Shkarin : Public domain */
-
-#include <memory.h>
-
-#include "Ppmd8.h"
-
-const Byte PPMD8_kExpEscape[16] = { 25, 14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 };
-static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051};
-
-#define MAX_FREQ 124
-#define UNIT_SIZE 12
-
-#define U2B(nu) ((UInt32)(nu) * UNIT_SIZE)
-#define U2I(nu) (p->Units2Indx[(nu) - 1])
-#define I2U(indx) (p->Indx2Units[indx])
-
-#ifdef PPMD_32BIT
- #define REF(ptr) (ptr)
-#else
- #define REF(ptr) ((UInt32)((Byte *)(ptr) - (p)->Base))
-#endif
-
-#define STATS_REF(ptr) ((CPpmd_State_Ref)REF(ptr))
-
-#define CTX(ref) ((CPpmd8_Context *)Ppmd8_GetContext(p, ref))
-#define STATS(ctx) Ppmd8_GetStats(p, ctx)
-#define ONE_STATE(ctx) Ppmd8Context_OneState(ctx)
-#define SUFFIX(ctx) CTX((ctx)->Suffix)
-
-typedef CPpmd8_Context * CTX_PTR;
-
-struct CPpmd8_Node_;
-
-typedef
- #ifdef PPMD_32BIT
- struct CPpmd8_Node_ *
- #else
- UInt32
- #endif
- CPpmd8_Node_Ref;
-
-typedef struct CPpmd8_Node_
-{
- UInt32 Stamp;
- CPpmd8_Node_Ref Next;
- UInt32 NU;
-} CPpmd8_Node;
-
-#ifdef PPMD_32BIT
- #define NODE(ptr) (ptr)
-#else
- #define NODE(offs) ((CPpmd8_Node *)(p->Base + (offs)))
-#endif
-
-#define EMPTY_NODE 0xFFFFFFFF
-
-void Ppmd8_Construct(CPpmd8 *p)
-{
- unsigned i, k, m;
-
- p->Base = 0;
-
- for (i = 0, k = 0; i < PPMD_NUM_INDEXES; i++)
- {
- unsigned step = (i >= 12 ? 4 : (i >> 2) + 1);
- do { p->Units2Indx[k++] = (Byte)i; } while(--step);
- p->Indx2Units[i] = (Byte)k;
- }
-
- p->NS2BSIndx[0] = (0 << 1);
- p->NS2BSIndx[1] = (1 << 1);
- memset(p->NS2BSIndx + 2, (2 << 1), 9);
- memset(p->NS2BSIndx + 11, (3 << 1), 256 - 11);
-
- for (i = 0; i < 5; i++)
- p->NS2Indx[i] = (Byte)i;
- for (m = i, k = 1; i < 260; i++)
- {
- p->NS2Indx[i] = (Byte)m;
- if (--k == 0)
- k = (++m) - 4;
- }
-}
-
-void Ppmd8_Free(CPpmd8 *p, ISzAlloc *alloc)
-{
- alloc->Free(alloc, p->Base);
- p->Size = 0;
- p->Base = 0;
-}
-
-Bool Ppmd8_Alloc(CPpmd8 *p, UInt32 size, ISzAlloc *alloc)
-{
- if (p->Base == 0 || p->Size != size)
- {
- Ppmd8_Free(p, alloc);
- p->AlignOffset =
- #ifdef PPMD_32BIT
- (4 - size) & 3;
- #else
- 4 - (size & 3);
- #endif
- if ((p->Base = (Byte *)alloc->Alloc(alloc, p->AlignOffset + size)) == 0)
- return False;
- p->Size = size;
- }
- return True;
-}
-
-static void InsertNode(CPpmd8 *p, void *node, unsigned indx)
-{
- ((CPpmd8_Node *)node)->Stamp = EMPTY_NODE;
- ((CPpmd8_Node *)node)->Next = (CPpmd8_Node_Ref)p->FreeList[indx];
- ((CPpmd8_Node *)node)->NU = I2U(indx);
- p->FreeList[indx] = REF(node);
- p->Stamps[indx]++;
-}
-
-static void *RemoveNode(CPpmd8 *p, unsigned indx)
-{
- CPpmd8_Node *node = NODE((CPpmd8_Node_Ref)p->FreeList[indx]);
- p->FreeList[indx] = node->Next;
- p->Stamps[indx]--;
- return node;
-}
-
-static void SplitBlock(CPpmd8 *p, void *ptr, unsigned oldIndx, unsigned newIndx)
-{
- unsigned i, nu = I2U(oldIndx) - I2U(newIndx);
- ptr = (Byte *)ptr + U2B(I2U(newIndx));
- if (I2U(i = U2I(nu)) != nu)
- {
- unsigned k = I2U(--i);
- InsertNode(p, ((Byte *)ptr) + U2B(k), nu - k - 1);
- }
- InsertNode(p, ptr, i);
-}
-
-static void GlueFreeBlocks(CPpmd8 *p)
-{
- CPpmd8_Node_Ref head = 0;
- CPpmd8_Node_Ref *prev = &head;
- unsigned i;
-
- p->GlueCount = 1 << 13;
- memset(p->Stamps, 0, sizeof(p->Stamps));
-
- /* Order-0 context is always at top UNIT, so we don't need guard NODE at the end.
- All blocks up to p->LoUnit can be free, so we need guard NODE at LoUnit. */
- if (p->LoUnit != p->HiUnit)
- ((CPpmd8_Node *)p->LoUnit)->Stamp = 0;
-
- /* Glue free blocks */
- for (i = 0; i < PPMD_NUM_INDEXES; i++)
- {
- CPpmd8_Node_Ref next = (CPpmd8_Node_Ref)p->FreeList[i];
- p->FreeList[i] = 0;
- while (next != 0)
- {
- CPpmd8_Node *node = NODE(next);
- if (node->NU != 0)
- {
- CPpmd8_Node *node2;
- *prev = next;
- prev = &(node->Next);
- while ((node2 = node + node->NU)->Stamp == EMPTY_NODE)
- {
- node->NU += node2->NU;
- node2->NU = 0;
- }
- }
- next = node->Next;
- }
- }
- *prev = 0;
-
- /* Fill lists of free blocks */
- while (head != 0)
- {
- CPpmd8_Node *node = NODE(head);
- unsigned nu;
- head = node->Next;
- nu = node->NU;
- if (nu == 0)
- continue;
- for (; nu > 128; nu -= 128, node += 128)
- InsertNode(p, node, PPMD_NUM_INDEXES - 1);
- if (I2U(i = U2I(nu)) != nu)
- {
- unsigned k = I2U(--i);
- InsertNode(p, node + k, nu - k - 1);
- }
- InsertNode(p, node, i);
- }
-}
-
-static void *AllocUnitsRare(CPpmd8 *p, unsigned indx)
-{
- unsigned i;
- void *retVal;
- if (p->GlueCount == 0)
- {
- GlueFreeBlocks(p);
- if (p->FreeList[indx] != 0)
- return RemoveNode(p, indx);
- }
- i = indx;
- do
- {
- if (++i == PPMD_NUM_INDEXES)
- {
- UInt32 numBytes = U2B(I2U(indx));
- p->GlueCount--;
- return ((UInt32)(p->UnitsStart - p->Text) > numBytes) ? (p->UnitsStart -= numBytes) : (NULL);
- }
- }
- while (p->FreeList[i] == 0);
- retVal = RemoveNode(p, i);
- SplitBlock(p, retVal, i, indx);
- return retVal;
-}
-
-static void *AllocUnits(CPpmd8 *p, unsigned indx)
-{
- UInt32 numBytes;
- if (p->FreeList[indx] != 0)
- return RemoveNode(p, indx);
- numBytes = U2B(I2U(indx));
- if (numBytes <= (UInt32)(p->HiUnit - p->LoUnit))
- {
- void *retVal = p->LoUnit;
- p->LoUnit += numBytes;
- return retVal;
- }
- return AllocUnitsRare(p, indx);
-}
-
-#define MyMem12Cpy(dest, src, num) \
- { UInt32 *d = (UInt32 *)dest; const UInt32 *s = (const UInt32 *)src; UInt32 n = num; \
- do { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; s += 3; d += 3; } while(--n); }
-
-static void *ShrinkUnits(CPpmd8 *p, void *oldPtr, unsigned oldNU, unsigned newNU)
-{
- unsigned i0 = U2I(oldNU);
- unsigned i1 = U2I(newNU);
- if (i0 == i1)
- return oldPtr;
- if (p->FreeList[i1] != 0)
- {
- void *ptr = RemoveNode(p, i1);
- MyMem12Cpy(ptr, oldPtr, newNU);
- InsertNode(p, oldPtr, i0);
- return ptr;
- }
- SplitBlock(p, oldPtr, i0, i1);
- return oldPtr;
-}
-
-static void FreeUnits(CPpmd8 *p, void *ptr, unsigned nu)
-{
- InsertNode(p, ptr, U2I(nu));
-}
-
-static void SpecialFreeUnit(CPpmd8 *p, void *ptr)
-{
- if ((Byte *)ptr != p->UnitsStart)
- InsertNode(p, ptr, 0);
- else
- {
- #ifdef PPMD8_FREEZE_SUPPORT
- *(UInt32 *)ptr = EMPTY_NODE; /* it's used for (Flags == 0xFF) check in RemoveBinContexts */
- #endif
- p->UnitsStart += UNIT_SIZE;
- }
-}
-
-static void *MoveUnitsUp(CPpmd8 *p, void *oldPtr, unsigned nu)
-{
- unsigned indx = U2I(nu);
- void *ptr;
- if ((Byte *)oldPtr > p->UnitsStart + 16 * 1024 || REF(oldPtr) > p->FreeList[indx])
- return oldPtr;
- ptr = RemoveNode(p, indx);
- MyMem12Cpy(ptr, oldPtr, nu);
- if ((Byte*)oldPtr != p->UnitsStart)
- InsertNode(p, oldPtr, indx);
- else
- p->UnitsStart += U2B(I2U(indx));
- return ptr;
-}
-
-static void ExpandTextArea(CPpmd8 *p)
-{
- UInt32 count[PPMD_NUM_INDEXES];
- unsigned i;
- memset(count, 0, sizeof(count));
- if (p->LoUnit != p->HiUnit)
- ((CPpmd8_Node *)p->LoUnit)->Stamp = 0;
-
- {
- CPpmd8_Node *node = (CPpmd8_Node *)p->UnitsStart;
- for (; node->Stamp == EMPTY_NODE; node += node->NU)
- {
- node->Stamp = 0;
- count[U2I(node->NU)]++;
- }
- p->UnitsStart = (Byte *)node;
- }
-
- for (i = 0; i < PPMD_NUM_INDEXES; i++)
- {
- CPpmd8_Node_Ref *next = (CPpmd8_Node_Ref *)&p->FreeList[i];
- while (count[i] != 0)
- {
- CPpmd8_Node *node = NODE(*next);
- while (node->Stamp == 0)
- {
- *next = node->Next;
- node = NODE(*next);
- p->Stamps[i]--;
- if (--count[i] == 0)
- break;
- }
- next = &node->Next;
- }
- }
-}
-
-#define SUCCESSOR(p) ((CPpmd_Void_Ref)((p)->SuccessorLow | ((UInt32)(p)->SuccessorHigh << 16)))
-
-static void SetSuccessor(CPpmd_State *p, CPpmd_Void_Ref v)
-{
- (p)->SuccessorLow = (UInt16)((UInt32)(v) & 0xFFFF);
- (p)->SuccessorHigh = (UInt16)(((UInt32)(v) >> 16) & 0xFFFF);
-}
-
-#define RESET_TEXT(offs) { p->Text = p->Base + p->AlignOffset + (offs); }
-
-static void RestartModel(CPpmd8 *p)
-{
- unsigned i, k, m, r;
-
- memset(p->FreeList, 0, sizeof(p->FreeList));
- memset(p->Stamps, 0, sizeof(p->Stamps));
- RESET_TEXT(0);
- p->HiUnit = p->Text + p->Size;
- p->LoUnit = p->UnitsStart = p->HiUnit - p->Size / 8 / UNIT_SIZE * 7 * UNIT_SIZE;
- p->GlueCount = 0;
-
- p->OrderFall = p->MaxOrder;
- p->RunLength = p->InitRL = -(Int32)((p->MaxOrder < 12) ? p->MaxOrder : 12) - 1;
- p->PrevSuccess = 0;
-
- p->MinContext = p->MaxContext = (CTX_PTR)(p->HiUnit -= UNIT_SIZE); /* AllocContext(p); */
- p->MinContext->Suffix = 0;
- p->MinContext->NumStats = 255;
- p->MinContext->Flags = 0;
- p->MinContext->SummFreq = 256 + 1;
- p->FoundState = (CPpmd_State *)p->LoUnit; /* AllocUnits(p, PPMD_NUM_INDEXES - 1); */
- p->LoUnit += U2B(256 / 2);
- p->MinContext->Stats = REF(p->FoundState);
- for (i = 0; i < 256; i++)
- {
- CPpmd_State *s = &p->FoundState[i];
- s->Symbol = (Byte)i;
- s->Freq = 1;
- SetSuccessor(s, 0);
- }
-
- for (i = m = 0; m < 25; m++)
- {
- while (p->NS2Indx[i] == m)
- i++;
- for (k = 0; k < 8; k++)
- {
- UInt16 val = (UInt16)(PPMD_BIN_SCALE - kInitBinEsc[k] / (i + 1));
- UInt16 *dest = p->BinSumm[m] + k;
- for (r = 0; r < 64; r += 8)
- dest[r] = val;
- }
- }
-
- for (i = m = 0; m < 24; m++)
- {
- while (p->NS2Indx[i + 3] == m + 3)
- i++;
- for (k = 0; k < 32; k++)
- {
- CPpmd_See *s = &p->See[m][k];
- s->Summ = (UInt16)((2 * i + 5) << (s->Shift = PPMD_PERIOD_BITS - 4));
- s->Count = 7;
- }
- }
-}
-
-void Ppmd8_Init(CPpmd8 *p, unsigned maxOrder, unsigned restoreMethod)
-{
- p->MaxOrder = maxOrder;
- p->RestoreMethod = restoreMethod;
- RestartModel(p);
- p->DummySee.Shift = PPMD_PERIOD_BITS;
- p->DummySee.Summ = 0; /* unused */
- p->DummySee.Count = 64; /* unused */
-}
-
-static void Refresh(CPpmd8 *p, CTX_PTR ctx, unsigned oldNU, unsigned scale)
-{
- unsigned i = ctx->NumStats, escFreq, sumFreq, flags;
- CPpmd_State *s = (CPpmd_State *)ShrinkUnits(p, STATS(ctx), oldNU, (i + 2) >> 1);
- ctx->Stats = REF(s);
- #ifdef PPMD8_FREEZE_SUPPORT
- /* fixed over Shkarin's code. Fixed code is not compatible with original code for some files in FREEZE mode. */
- scale |= (ctx->SummFreq >= ((UInt32)1 << 15));
- #endif
- flags = (ctx->Flags & (0x10 + 0x04 * scale)) + 0x08 * (s->Symbol >= 0x40);
- escFreq = ctx->SummFreq - s->Freq;
- sumFreq = (s->Freq = (Byte)((s->Freq + scale) >> scale));
- do
- {
- escFreq -= (++s)->Freq;
- sumFreq += (s->Freq = (Byte)((s->Freq + scale) >> scale));
- flags |= 0x08 * (s->Symbol >= 0x40);
- }
- while (--i);
- ctx->SummFreq = (UInt16)(sumFreq + ((escFreq + scale) >> scale));
- ctx->Flags = (Byte)flags;
-}
-
-static void SwapStates(CPpmd_State *t1, CPpmd_State *t2)
-{
- CPpmd_State tmp = *t1;
- *t1 = *t2;
- *t2 = tmp;
-}
-
-static CPpmd_Void_Ref CutOff(CPpmd8 *p, CTX_PTR ctx, unsigned order)
-{
- int i;
- unsigned tmp;
- CPpmd_State *s;
-
- if (!ctx->NumStats)
- {
- s = ONE_STATE(ctx);
- if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) >= p->UnitsStart)
- {
- if (order < p->MaxOrder)
- SetSuccessor(s, CutOff(p, CTX(SUCCESSOR(s)), order + 1));
- else
- SetSuccessor(s, 0);
- if (SUCCESSOR(s) || order <= 9) /* O_BOUND */
- return REF(ctx);
- }
- SpecialFreeUnit(p, ctx);
- return 0;
- }
-
- ctx->Stats = STATS_REF(MoveUnitsUp(p, STATS(ctx), tmp = ((unsigned)ctx->NumStats + 2) >> 1));
-
- for (s = STATS(ctx) + (i = ctx->NumStats); s >= STATS(ctx); s--)
- if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) < p->UnitsStart)
- {
- CPpmd_State *s2 = STATS(ctx) + (i--);
- SetSuccessor(s, 0);
- SwapStates(s, s2);
- }
- else if (order < p->MaxOrder)
- SetSuccessor(s, CutOff(p, CTX(SUCCESSOR(s)), order + 1));
- else
- SetSuccessor(s, 0);
-
- if (i != ctx->NumStats && order)
- {
- ctx->NumStats = (Byte)i;
- s = STATS(ctx);
- if (i < 0)
- {
- FreeUnits(p, s, tmp);
- SpecialFreeUnit(p, ctx);
- return 0;
- }
- if (i == 0)
- {
- ctx->Flags = (ctx->Flags & 0x10) + 0x08 * (s->Symbol >= 0x40);
- *ONE_STATE(ctx) = *s;
- FreeUnits(p, s, tmp);
- ONE_STATE(ctx)->Freq = (Byte)((unsigned)ONE_STATE(ctx)->Freq + 11) >> 3;
- }
- else
- Refresh(p, ctx, tmp, ctx->SummFreq > 16 * i);
- }
- return REF(ctx);
-}
-
-#ifdef PPMD8_FREEZE_SUPPORT
-static CPpmd_Void_Ref RemoveBinContexts(CPpmd8 *p, CTX_PTR ctx, unsigned order)
-{
- CPpmd_State *s;
- if (!ctx->NumStats)
- {
- s = ONE_STATE(ctx);
- if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) >= p->UnitsStart && order < p->MaxOrder)
- SetSuccessor(s, RemoveBinContexts(p, CTX(SUCCESSOR(s)), order + 1));
- else
- SetSuccessor(s, 0);
- /* Suffix context can be removed already, since different (high-order)
- Successors may refer to same context. So we check Flags == 0xFF (Stamp == EMPTY_NODE) */
- if (!SUCCESSOR(s) && (!SUFFIX(ctx)->NumStats || SUFFIX(ctx)->Flags == 0xFF))
- {
- FreeUnits(p, ctx, 1);
- return 0;
- }
- else
- return REF(ctx);
- }
-
- for (s = STATS(ctx) + ctx->NumStats; s >= STATS(ctx); s--)
- if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) >= p->UnitsStart && order < p->MaxOrder)
- SetSuccessor(s, RemoveBinContexts(p, CTX(SUCCESSOR(s)), order + 1));
- else
- SetSuccessor(s, 0);
-
- return REF(ctx);
-}
-#endif
-
-static UInt32 GetUsedMemory(const CPpmd8 *p)
-{
- UInt32 v = 0;
- unsigned i;
- for (i = 0; i < PPMD_NUM_INDEXES; i++)
- v += p->Stamps[i] * I2U(i);
- return p->Size - (UInt32)(p->HiUnit - p->LoUnit) - (UInt32)(p->UnitsStart - p->Text) - U2B(v);
-}
-
-#ifdef PPMD8_FREEZE_SUPPORT
- #define RESTORE_MODEL(c1, fSuccessor) RestoreModel(p, c1, fSuccessor)
-#else
- #define RESTORE_MODEL(c1, fSuccessor) RestoreModel(p, c1)
-#endif
-
-static void RestoreModel(CPpmd8 *p, CTX_PTR c1
- #ifdef PPMD8_FREEZE_SUPPORT
- , CTX_PTR fSuccessor
- #endif
- )
-{
- CTX_PTR c;
- CPpmd_State *s;
- RESET_TEXT(0);
- for (c = p->MaxContext; c != c1; c = SUFFIX(c))
- if (--(c->NumStats) == 0)
- {
- s = STATS(c);
- c->Flags = (c->Flags & 0x10) + 0x08 * (s->Symbol >= 0x40);
- *ONE_STATE(c) = *s;
- SpecialFreeUnit(p, s);
- ONE_STATE(c)->Freq = (ONE_STATE(c)->Freq + 11) >> 3;
- }
- else
- Refresh(p, c, (c->NumStats+3) >> 1, 0);
-
- for (; c != p->MinContext; c = SUFFIX(c))
- if (!c->NumStats)
- ONE_STATE(c)->Freq -= ONE_STATE(c)->Freq >> 1;
- else if ((c->SummFreq += 4) > 128 + 4 * c->NumStats)
- Refresh(p, c, (c->NumStats + 2) >> 1, 1);
-
- #ifdef PPMD8_FREEZE_SUPPORT
- if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE)
- {
- p->MaxContext = fSuccessor;
- p->GlueCount += !(p->Stamps[1] & 1);
- }
- else if (p->RestoreMethod == PPMD8_RESTORE_METHOD_FREEZE)
- {
- while (p->MaxContext->Suffix)
- p->MaxContext = SUFFIX(p->MaxContext);
- RemoveBinContexts(p, p->MaxContext, 0);
- p->RestoreMethod++;
- p->GlueCount = 0;
- p->OrderFall = p->MaxOrder;
- }
- else
- #endif
- if (p->RestoreMethod == PPMD8_RESTORE_METHOD_RESTART || GetUsedMemory(p) < (p->Size >> 1))
- RestartModel(p);
- else
- {
- while (p->MaxContext->Suffix)
- p->MaxContext = SUFFIX(p->MaxContext);
- do
- {
- CutOff(p, p->MaxContext, 0);
- ExpandTextArea(p);
- }
- while (GetUsedMemory(p) > 3 * (p->Size >> 2));
- p->GlueCount = 0;
- p->OrderFall = p->MaxOrder;
- }
-}
-
-static CTX_PTR CreateSuccessors(CPpmd8 *p, Bool skip, CPpmd_State *s1, CTX_PTR c)
-{
- CPpmd_State upState;
- Byte flags;
- CPpmd_Byte_Ref upBranch = (CPpmd_Byte_Ref)SUCCESSOR(p->FoundState);
- /* fixed over Shkarin's code. Maybe it could work without + 1 too. */
- CPpmd_State *ps[PPMD8_MAX_ORDER + 1];
- unsigned numPs = 0;
-
- if (!skip)
- ps[numPs++] = p->FoundState;
-
- while (c->Suffix)
- {
- CPpmd_Void_Ref successor;
- CPpmd_State *s;
- c = SUFFIX(c);
- if (s1)
- {
- s = s1;
- s1 = NULL;
- }
- else if (c->NumStats != 0)
- {
- for (s = STATS(c); s->Symbol != p->FoundState->Symbol; s++);
- if (s->Freq < MAX_FREQ - 9)
- {
- s->Freq++;
- c->SummFreq++;
- }
- }
- else
- {
- s = ONE_STATE(c);
- s->Freq += (!SUFFIX(c)->NumStats & (s->Freq < 24));
- }
- successor = SUCCESSOR(s);
- if (successor != upBranch)
- {
- c = CTX(successor);
- if (numPs == 0)
- return c;
- break;
- }
- ps[numPs++] = s;
- }
-
- upState.Symbol = *(const Byte *)Ppmd8_GetPtr(p, upBranch);
- SetSuccessor(&upState, upBranch + 1);
- flags = 0x10 * (p->FoundState->Symbol >= 0x40) + 0x08 * (upState.Symbol >= 0x40);
-
- if (c->NumStats == 0)
- upState.Freq = ONE_STATE(c)->Freq;
- else
- {
- UInt32 cf, s0;
- CPpmd_State *s;
- for (s = STATS(c); s->Symbol != upState.Symbol; s++);
- cf = s->Freq - 1;
- s0 = c->SummFreq - c->NumStats - cf;
- upState.Freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : ((cf + 2 * s0 - 3) / s0)));
- }
-
- do
- {
- /* Create Child */
- CTX_PTR c1; /* = AllocContext(p); */
- if (p->HiUnit != p->LoUnit)
- c1 = (CTX_PTR)(p->HiUnit -= UNIT_SIZE);
- else if (p->FreeList[0] != 0)
- c1 = (CTX_PTR)RemoveNode(p, 0);
- else
- {
- c1 = (CTX_PTR)AllocUnitsRare(p, 0);
- if (!c1)
- return NULL;
- }
- c1->NumStats = 0;
- c1->Flags = flags;
- *ONE_STATE(c1) = upState;
- c1->Suffix = REF(c);
- SetSuccessor(ps[--numPs], REF(c1));
- c = c1;
- }
- while (numPs != 0);
-
- return c;
-}
-
-static CTX_PTR ReduceOrder(CPpmd8 *p, CPpmd_State *s1, CTX_PTR c)
-{
- CPpmd_State *s = NULL;
- CTX_PTR c1 = c;
- CPpmd_Void_Ref upBranch = REF(p->Text);
-
- #ifdef PPMD8_FREEZE_SUPPORT
- /* The BUG in Shkarin's code was fixed: ps could overflow in CUT_OFF mode. */
- CPpmd_State *ps[PPMD8_MAX_ORDER + 1];
- unsigned numPs = 0;
- ps[numPs++] = p->FoundState;
- #endif
-
- SetSuccessor(p->FoundState, upBranch);
- p->OrderFall++;
-
- for (;;)
- {
- if (s1)
- {
- c = SUFFIX(c);
- s = s1;
- s1 = NULL;
- }
- else
- {
- if (!c->Suffix)
- {
- #ifdef PPMD8_FREEZE_SUPPORT
- if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE)
- {
- do { SetSuccessor(ps[--numPs], REF(c)); } while (numPs);
- RESET_TEXT(1);
- p->OrderFall = 1;
- }
- #endif
- return c;
- }
- c = SUFFIX(c);
- if (c->NumStats)
- {
- if ((s = STATS(c))->Symbol != p->FoundState->Symbol)
- do { s++; } while (s->Symbol != p->FoundState->Symbol);
- if (s->Freq < MAX_FREQ - 9)
- {
- s->Freq += 2;
- c->SummFreq += 2;
- }
- }
- else
- {
- s = ONE_STATE(c);
- s->Freq += (s->Freq < 32);
- }
- }
- if (SUCCESSOR(s))
- break;
- #ifdef PPMD8_FREEZE_SUPPORT
- ps[numPs++] = s;
- #endif
- SetSuccessor(s, upBranch);
- p->OrderFall++;
- }
-
- #ifdef PPMD8_FREEZE_SUPPORT
- if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE)
- {
- c = CTX(SUCCESSOR(s));
- do { SetSuccessor(ps[--numPs], REF(c)); } while (numPs);
- RESET_TEXT(1);
- p->OrderFall = 1;
- return c;
- }
- else
- #endif
- if (SUCCESSOR(s) <= upBranch)
- {
- CTX_PTR successor;
- CPpmd_State *s1 = p->FoundState;
- p->FoundState = s;
-
- successor = CreateSuccessors(p, False, NULL, c);
- if (successor == NULL)
- SetSuccessor(s, 0);
- else
- SetSuccessor(s, REF(successor));
- p->FoundState = s1;
- }
-
- if (p->OrderFall == 1 && c1 == p->MaxContext)
- {
- SetSuccessor(p->FoundState, SUCCESSOR(s));
- p->Text--;
- }
- if (SUCCESSOR(s) == 0)
- return NULL;
- return CTX(SUCCESSOR(s));
-}
-
-static void UpdateModel(CPpmd8 *p)
-{
- CPpmd_Void_Ref successor, fSuccessor = SUCCESSOR(p->FoundState);
- CTX_PTR c;
- unsigned s0, ns, fFreq = p->FoundState->Freq;
- Byte flag, fSymbol = p->FoundState->Symbol;
- CPpmd_State *s = NULL;
-
- if (p->FoundState->Freq < MAX_FREQ / 4 && p->MinContext->Suffix != 0)
- {
- c = SUFFIX(p->MinContext);
-
- if (c->NumStats == 0)
- {
- s = ONE_STATE(c);
- if (s->Freq < 32)
- s->Freq++;
- }
- else
- {
- s = STATS(c);
- if (s->Symbol != p->FoundState->Symbol)
- {
- do { s++; } while (s->Symbol != p->FoundState->Symbol);
- if (s[0].Freq >= s[-1].Freq)
- {
- SwapStates(&s[0], &s[-1]);
- s--;
- }
- }
- if (s->Freq < MAX_FREQ - 9)
- {
- s->Freq += 2;
- c->SummFreq += 2;
- }
- }
- }
-
- c = p->MaxContext;
- if (p->OrderFall == 0 && fSuccessor)
- {
- CTX_PTR cs = CreateSuccessors(p, True, s, p->MinContext);
- if (cs == 0)
- {
- SetSuccessor(p->FoundState, 0);
- RESTORE_MODEL(c, CTX(fSuccessor));
- }
- else
- {
- SetSuccessor(p->FoundState, REF(cs));
- p->MaxContext = cs;
- }
- return;
- }
-
- *p->Text++ = p->FoundState->Symbol;
- successor = REF(p->Text);
- if (p->Text >= p->UnitsStart)
- {
- RESTORE_MODEL(c, CTX(fSuccessor)); /* check it */
- return;
- }
-
- if (!fSuccessor)
- {
- CTX_PTR cs = ReduceOrder(p, s, p->MinContext);
- if (cs == NULL)
- {
- RESTORE_MODEL(c, 0);
- return;
- }
- fSuccessor = REF(cs);
- }
- else if ((Byte *)Ppmd8_GetPtr(p, fSuccessor) < p->UnitsStart)
- {
- CTX_PTR cs = CreateSuccessors(p, False, s, p->MinContext);
- if (cs == NULL)
- {
- RESTORE_MODEL(c, 0);
- return;
- }
- fSuccessor = REF(cs);
- }
-
- if (--p->OrderFall == 0)
- {
- successor = fSuccessor;
- p->Text -= (p->MaxContext != p->MinContext);
- }
- #ifdef PPMD8_FREEZE_SUPPORT
- else if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE)
- {
- successor = fSuccessor;
- RESET_TEXT(0);
- p->OrderFall = 0;
- }
- #endif
-
- s0 = p->MinContext->SummFreq - (ns = p->MinContext->NumStats) - fFreq;
- flag = 0x08 * (fSymbol >= 0x40);
-
- for (; c != p->MinContext; c = SUFFIX(c))
- {
- unsigned ns1;
- UInt32 cf, sf;
- if ((ns1 = c->NumStats) != 0)
- {
- if ((ns1 & 1) != 0)
- {
- /* Expand for one UNIT */
- unsigned oldNU = (ns1 + 1) >> 1;
- unsigned i = U2I(oldNU);
- if (i != U2I(oldNU + 1))
- {
- void *ptr = AllocUnits(p, i + 1);
- void *oldPtr;
- if (!ptr)
- {
- RESTORE_MODEL(c, CTX(fSuccessor));
- return;
- }
- oldPtr = STATS(c);
- MyMem12Cpy(ptr, oldPtr, oldNU);
- InsertNode(p, oldPtr, i);
- c->Stats = STATS_REF(ptr);
- }
- }
- c->SummFreq = (UInt16)(c->SummFreq + (3 * ns1 + 1 < ns));
- }
- else
- {
- CPpmd_State *s = (CPpmd_State*)AllocUnits(p, 0);
- if (!s)
- {
- RESTORE_MODEL(c, CTX(fSuccessor));
- return;
- }
- *s = *ONE_STATE(c);
- c->Stats = REF(s);
- if (s->Freq < MAX_FREQ / 4 - 1)
- s->Freq <<= 1;
- else
- s->Freq = MAX_FREQ - 4;
- c->SummFreq = (UInt16)(s->Freq + p->InitEsc + (ns > 2));
- }
- cf = 2 * fFreq * (c->SummFreq + 6);
- sf = (UInt32)s0 + c->SummFreq;
- if (cf < 6 * sf)
- {
- cf = 1 + (cf > sf) + (cf >= 4 * sf);
- c->SummFreq += 4;
- }
- else
- {
- cf = 4 + (cf > 9 * sf) + (cf > 12 * sf) + (cf > 15 * sf);
- c->SummFreq = (UInt16)(c->SummFreq + cf);
- }
- {
- CPpmd_State *s = STATS(c) + ns1 + 1;
- SetSuccessor(s, successor);
- s->Symbol = fSymbol;
- s->Freq = (Byte)cf;
- c->Flags |= flag;
- c->NumStats = (Byte)(ns1 + 1);
- }
- }
- p->MaxContext = p->MinContext = CTX(fSuccessor);
-}
-
-static void Rescale(CPpmd8 *p)
-{
- unsigned i, adder, sumFreq, escFreq;
- CPpmd_State *stats = STATS(p->MinContext);
- CPpmd_State *s = p->FoundState;
- {
- CPpmd_State tmp = *s;
- for (; s != stats; s--)
- s[0] = s[-1];
- *s = tmp;
- }
- escFreq = p->MinContext->SummFreq - s->Freq;
- s->Freq += 4;
- adder = (p->OrderFall != 0
- #ifdef PPMD8_FREEZE_SUPPORT
- || p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE
- #endif
- );
- s->Freq = (Byte)((s->Freq + adder) >> 1);
- sumFreq = s->Freq;
-
- i = p->MinContext->NumStats;
- do
- {
- escFreq -= (++s)->Freq;
- s->Freq = (Byte)((s->Freq + adder) >> 1);
- sumFreq += s->Freq;
- if (s[0].Freq > s[-1].Freq)
- {
- CPpmd_State *s1 = s;
- CPpmd_State tmp = *s1;
- do
- s1[0] = s1[-1];
- while (--s1 != stats && tmp.Freq > s1[-1].Freq);
- *s1 = tmp;
- }
- }
- while (--i);
-
- if (s->Freq == 0)
- {
- unsigned numStats = p->MinContext->NumStats;
- unsigned n0, n1;
- do { i++; } while ((--s)->Freq == 0);
- escFreq += i;
- p->MinContext->NumStats = (Byte)(p->MinContext->NumStats - i);
- if (p->MinContext->NumStats == 0)
- {
- CPpmd_State tmp = *stats;
- tmp.Freq = (Byte)((2 * tmp.Freq + escFreq - 1) / escFreq);
- if (tmp.Freq > MAX_FREQ / 3)
- tmp.Freq = MAX_FREQ / 3;
- InsertNode(p, stats, U2I((numStats + 2) >> 1));
- p->MinContext->Flags = (p->MinContext->Flags & 0x10) + 0x08 * (tmp.Symbol >= 0x40);
- *(p->FoundState = ONE_STATE(p->MinContext)) = tmp;
- return;
- }
- n0 = (numStats + 2) >> 1;
- n1 = (p->MinContext->NumStats + 2) >> 1;
- if (n0 != n1)
- p->MinContext->Stats = STATS_REF(ShrinkUnits(p, stats, n0, n1));
- p->MinContext->Flags &= ~0x08;
- p->MinContext->Flags |= 0x08 * ((s = STATS(p->MinContext))->Symbol >= 0x40);
- i = p->MinContext->NumStats;
- do { p->MinContext->Flags |= 0x08*((++s)->Symbol >= 0x40); } while (--i);
- }
- p->MinContext->SummFreq = (UInt16)(sumFreq + escFreq - (escFreq >> 1));
- p->MinContext->Flags |= 0x4;
- p->FoundState = STATS(p->MinContext);
-}
-
-CPpmd_See *Ppmd8_MakeEscFreq(CPpmd8 *p, unsigned numMasked1, UInt32 *escFreq)
-{
- CPpmd_See *see;
- if (p->MinContext->NumStats != 0xFF)
- {
- see = p->See[p->NS2Indx[p->MinContext->NumStats + 2] - 3] +
- (p->MinContext->SummFreq > 11 * ((unsigned)p->MinContext->NumStats + 1)) +
- 2 * (2 * (unsigned)p->MinContext->NumStats <
- ((unsigned)SUFFIX(p->MinContext)->NumStats + numMasked1)) +
- p->MinContext->Flags;
- {
- unsigned r = (see->Summ >> see->Shift);
- see->Summ = (UInt16)(see->Summ - r);
- *escFreq = r + (r == 0);
- }
- }
- else
- {
- see = &p->DummySee;
- *escFreq = 1;
- }
- return see;
-}
-
-static void NextContext(CPpmd8 *p)
-{
- CTX_PTR c = CTX(SUCCESSOR(p->FoundState));
- if (p->OrderFall == 0 && (Byte *)c >= p->UnitsStart)
- p->MinContext = p->MaxContext = c;
- else
- {
- UpdateModel(p);
- p->MinContext = p->MaxContext;
- }
-}
-
-void Ppmd8_Update1(CPpmd8 *p)
-{
- CPpmd_State *s = p->FoundState;
- s->Freq += 4;
- p->MinContext->SummFreq += 4;
- if (s[0].Freq > s[-1].Freq)
- {
- SwapStates(&s[0], &s[-1]);
- p->FoundState = --s;
- if (s->Freq > MAX_FREQ)
- Rescale(p);
- }
- NextContext(p);
-}
-
-void Ppmd8_Update1_0(CPpmd8 *p)
-{
- p->PrevSuccess = (2 * p->FoundState->Freq >= p->MinContext->SummFreq);
- p->RunLength += p->PrevSuccess;
- p->MinContext->SummFreq += 4;
- if ((p->FoundState->Freq += 4) > MAX_FREQ)
- Rescale(p);
- NextContext(p);
-}
-
-void Ppmd8_UpdateBin(CPpmd8 *p)
-{
- p->FoundState->Freq = (Byte)(p->FoundState->Freq + (p->FoundState->Freq < 196));
- p->PrevSuccess = 1;
- p->RunLength++;
- NextContext(p);
-}
-
-void Ppmd8_Update2(CPpmd8 *p)
-{
- p->MinContext->SummFreq += 4;
- if ((p->FoundState->Freq += 4) > MAX_FREQ)
- Rescale(p);
- p->RunLength = p->InitRL;
- UpdateModel(p);
- p->MinContext = p->MaxContext;
-}
-
-/* H->I changes:
- NS2Indx
- GlewCount, and Glue method
- BinSum
- See / EscFreq
- CreateSuccessors updates more suffix contexts
- UpdateModel consts.
- PrevSuccess Update
-*/
diff --git a/src/libs/7zip/win/C/Ppmd8.h b/src/libs/7zip/win/C/Ppmd8.h
deleted file mode 100644
index 870dc9dd8..000000000
--- a/src/libs/7zip/win/C/Ppmd8.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/* Ppmd8.h -- PPMdI codec
-2010-03-24 : Igor Pavlov : Public domain
-This code is based on:
- PPMd var.I (2002): Dmitry Shkarin : Public domain
- Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#ifndef __PPMD8_H
-#define __PPMD8_H
-
-#include "Ppmd.h"
-
-EXTERN_C_BEGIN
-
-#define PPMD8_MIN_ORDER 2
-#define PPMD8_MAX_ORDER 16
-
-struct CPpmd8_Context_;
-
-typedef
- #ifdef PPMD_32BIT
- struct CPpmd8_Context_ *
- #else
- UInt32
- #endif
- CPpmd8_Context_Ref;
-
-typedef struct CPpmd8_Context_
-{
- Byte NumStats;
- Byte Flags;
- UInt16 SummFreq;
- CPpmd_State_Ref Stats;
- CPpmd8_Context_Ref Suffix;
-} CPpmd8_Context;
-
-#define Ppmd8Context_OneState(p) ((CPpmd_State *)&(p)->SummFreq)
-
-/* The BUG in Shkarin's code for FREEZE mode was fixed, but that fixed
- code is not compatible with original code for some files compressed
- in FREEZE mode. So we disable FREEZE mode support. */
-
-enum
-{
- PPMD8_RESTORE_METHOD_RESTART,
- PPMD8_RESTORE_METHOD_CUT_OFF
- #ifdef PPMD8_FREEZE_SUPPORT
- , PPMD8_RESTORE_METHOD_FREEZE
- #endif
-};
-
-typedef struct
-{
- CPpmd8_Context *MinContext, *MaxContext;
- CPpmd_State *FoundState;
- unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder;
- Int32 RunLength, InitRL; /* must be 32-bit at least */
-
- UInt32 Size;
- UInt32 GlueCount;
- Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart;
- UInt32 AlignOffset;
- unsigned RestoreMethod;
-
- /* Range Coder */
- UInt32 Range;
- UInt32 Code;
- UInt32 Low;
- union
- {
- IByteIn *In;
- IByteOut *Out;
- } Stream;
-
- Byte Indx2Units[PPMD_NUM_INDEXES];
- Byte Units2Indx[128];
- CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES];
- UInt32 Stamps[PPMD_NUM_INDEXES];
-
- Byte NS2BSIndx[256], NS2Indx[260];
- CPpmd_See DummySee, See[24][32];
- UInt16 BinSumm[25][64];
-} CPpmd8;
-
-void Ppmd8_Construct(CPpmd8 *p);
-Bool Ppmd8_Alloc(CPpmd8 *p, UInt32 size, ISzAlloc *alloc);
-void Ppmd8_Free(CPpmd8 *p, ISzAlloc *alloc);
-void Ppmd8_Init(CPpmd8 *p, unsigned maxOrder, unsigned restoreMethod);
-#define Ppmd8_WasAllocated(p) ((p)->Base != NULL)
-
-
-/* ---------- Internal Functions ---------- */
-
-extern const Byte PPMD8_kExpEscape[16];
-
-#ifdef PPMD_32BIT
- #define Ppmd8_GetPtr(p, ptr) (ptr)
- #define Ppmd8_GetContext(p, ptr) (ptr)
- #define Ppmd8_GetStats(p, ctx) ((ctx)->Stats)
-#else
- #define Ppmd8_GetPtr(p, offs) ((void *)((p)->Base + (offs)))
- #define Ppmd8_GetContext(p, offs) ((CPpmd8_Context *)Ppmd8_GetPtr((p), (offs)))
- #define Ppmd8_GetStats(p, ctx) ((CPpmd_State *)Ppmd8_GetPtr((p), ((ctx)->Stats)))
-#endif
-
-void Ppmd8_Update1(CPpmd8 *p);
-void Ppmd8_Update1_0(CPpmd8 *p);
-void Ppmd8_Update2(CPpmd8 *p);
-void Ppmd8_UpdateBin(CPpmd8 *p);
-
-#define Ppmd8_GetBinSumm(p) \
- &p->BinSumm[p->NS2Indx[Ppmd8Context_OneState(p->MinContext)->Freq - 1]][ \
- p->NS2BSIndx[Ppmd8_GetContext(p, p->MinContext->Suffix)->NumStats] + \
- p->PrevSuccess + p->MinContext->Flags + ((p->RunLength >> 26) & 0x20)]
-
-CPpmd_See *Ppmd8_MakeEscFreq(CPpmd8 *p, unsigned numMasked, UInt32 *scale);
-
-
-/* ---------- Decode ---------- */
-
-Bool Ppmd8_RangeDec_Init(CPpmd8 *p);
-#define Ppmd8_RangeDec_IsFinishedOK(p) ((p)->Code == 0)
-int Ppmd8_DecodeSymbol(CPpmd8 *p); /* returns: -1 as EndMarker, -2 as DataError */
-
-
-/* ---------- Encode ---------- */
-
-#define Ppmd8_RangeEnc_Init(p) { (p)->Low = 0; (p)->Range = 0xFFFFFFFF; }
-void Ppmd8_RangeEnc_FlushData(CPpmd8 *p);
-void Ppmd8_EncodeSymbol(CPpmd8 *p, int symbol); /* symbol = -1 means EndMarker */
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/Ppmd8Dec.c b/src/libs/7zip/win/C/Ppmd8Dec.c
deleted file mode 100644
index c54e02ab2..000000000
--- a/src/libs/7zip/win/C/Ppmd8Dec.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/* Ppmd8Dec.c -- PPMdI Decoder
-2010-04-16 : Igor Pavlov : Public domain
-This code is based on:
- PPMd var.I (2002): Dmitry Shkarin : Public domain
- Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#include "Ppmd8.h"
-
-#define kTop (1 << 24)
-#define kBot (1 << 15)
-
-Bool Ppmd8_RangeDec_Init(CPpmd8 *p)
-{
- unsigned i;
- p->Low = 0;
- p->Range = 0xFFFFFFFF;
- p->Code = 0;
- for (i = 0; i < 4; i++)
- p->Code = (p->Code << 8) | p->Stream.In->Read(p->Stream.In);
- return (p->Code < 0xFFFFFFFF);
-}
-
-static UInt32 RangeDec_GetThreshold(CPpmd8 *p, UInt32 total)
-{
- return p->Code / (p->Range /= total);
-}
-
-static void RangeDec_Decode(CPpmd8 *p, UInt32 start, UInt32 size)
-{
- start *= p->Range;
- p->Low += start;
- p->Code -= start;
- p->Range *= size;
-
- while ((p->Low ^ (p->Low + p->Range)) < kTop ||
- (p->Range < kBot && ((p->Range = (0 - p->Low) & (kBot - 1)), 1)))
- {
- p->Code = (p->Code << 8) | p->Stream.In->Read(p->Stream.In);
- p->Range <<= 8;
- p->Low <<= 8;
- }
-}
-
-#define MASK(sym) ((signed char *)charMask)[sym]
-
-int Ppmd8_DecodeSymbol(CPpmd8 *p)
-{
- size_t charMask[256 / sizeof(size_t)];
- if (p->MinContext->NumStats != 0)
- {
- CPpmd_State *s = Ppmd8_GetStats(p, p->MinContext);
- unsigned i;
- UInt32 count, hiCnt;
- if ((count = RangeDec_GetThreshold(p, p->MinContext->SummFreq)) < (hiCnt = s->Freq))
- {
- Byte symbol;
- RangeDec_Decode(p, 0, s->Freq);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd8_Update1_0(p);
- return symbol;
- }
- p->PrevSuccess = 0;
- i = p->MinContext->NumStats;
- do
- {
- if ((hiCnt += (++s)->Freq) > count)
- {
- Byte symbol;
- RangeDec_Decode(p, hiCnt - s->Freq, s->Freq);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd8_Update1(p);
- return symbol;
- }
- }
- while (--i);
- if (count >= p->MinContext->SummFreq)
- return -2;
- RangeDec_Decode(p, hiCnt, p->MinContext->SummFreq - hiCnt);
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- i = p->MinContext->NumStats;
- do { MASK((--s)->Symbol) = 0; } while (--i);
- }
- else
- {
- UInt16 *prob = Ppmd8_GetBinSumm(p);
- if (((p->Code / (p->Range >>= 14)) < *prob))
- {
- Byte symbol;
- RangeDec_Decode(p, 0, *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob);
- symbol = (p->FoundState = Ppmd8Context_OneState(p->MinContext))->Symbol;
- Ppmd8_UpdateBin(p);
- return symbol;
- }
- RangeDec_Decode(p, *prob, (1 << 14) - *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob);
- p->InitEsc = PPMD8_kExpEscape[*prob >> 10];
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(Ppmd8Context_OneState(p->MinContext)->Symbol) = 0;
- p->PrevSuccess = 0;
- }
- for (;;)
- {
- CPpmd_State *ps[256], *s;
- UInt32 freqSum, count, hiCnt;
- CPpmd_See *see;
- unsigned i, num, numMasked = p->MinContext->NumStats;
- do
- {
- p->OrderFall++;
- if (!p->MinContext->Suffix)
- return -1;
- p->MinContext = Ppmd8_GetContext(p, p->MinContext->Suffix);
- }
- while (p->MinContext->NumStats == numMasked);
- hiCnt = 0;
- s = Ppmd8_GetStats(p, p->MinContext);
- i = 0;
- num = p->MinContext->NumStats - numMasked;
- do
- {
- int k = (int)(MASK(s->Symbol));
- hiCnt += (s->Freq & k);
- ps[i] = s++;
- i -= k;
- }
- while (i != num);
-
- see = Ppmd8_MakeEscFreq(p, numMasked, &freqSum);
- freqSum += hiCnt;
- count = RangeDec_GetThreshold(p, freqSum);
-
- if (count < hiCnt)
- {
- Byte symbol;
- CPpmd_State **pps = ps;
- for (hiCnt = 0; (hiCnt += (*pps)->Freq) <= count; pps++);
- s = *pps;
- RangeDec_Decode(p, hiCnt - s->Freq, s->Freq);
- Ppmd_See_Update(see);
- p->FoundState = s;
- symbol = s->Symbol;
- Ppmd8_Update2(p);
- return symbol;
- }
- if (count >= freqSum)
- return -2;
- RangeDec_Decode(p, hiCnt, freqSum - hiCnt);
- see->Summ = (UInt16)(see->Summ + freqSum);
- do { MASK(ps[--i]->Symbol) = 0; } while (i != 0);
- }
-}
diff --git a/src/libs/7zip/win/C/Ppmd8Enc.c b/src/libs/7zip/win/C/Ppmd8Enc.c
deleted file mode 100644
index 8da727eb2..000000000
--- a/src/libs/7zip/win/C/Ppmd8Enc.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/* Ppmd8Enc.c -- PPMdI Encoder
-2010-04-16 : Igor Pavlov : Public domain
-This code is based on:
- PPMd var.I (2002): Dmitry Shkarin : Public domain
- Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#include "Ppmd8.h"
-
-#define kTop (1 << 24)
-#define kBot (1 << 15)
-
-void Ppmd8_RangeEnc_FlushData(CPpmd8 *p)
-{
- unsigned i;
- for (i = 0; i < 4; i++, p->Low <<= 8 )
- p->Stream.Out->Write(p->Stream.Out, (Byte)(p->Low >> 24));
-}
-
-static void RangeEnc_Normalize(CPpmd8 *p)
-{
- while ((p->Low ^ (p->Low + p->Range)) < kTop ||
- (p->Range < kBot && ((p->Range = (0 - p->Low) & (kBot - 1)), 1)))
- {
- p->Stream.Out->Write(p->Stream.Out, (Byte)(p->Low >> 24));
- p->Range <<= 8;
- p->Low <<= 8;
- }
-}
-
-static void RangeEnc_Encode(CPpmd8 *p, UInt32 start, UInt32 size, UInt32 total)
-{
- p->Low += start * (p->Range /= total);
- p->Range *= size;
- RangeEnc_Normalize(p);
-}
-
-static void RangeEnc_EncodeBit_0(CPpmd8 *p, UInt32 size0)
-{
- p->Range >>= 14;
- p->Range *= size0;
- RangeEnc_Normalize(p);
-}
-
-static void RangeEnc_EncodeBit_1(CPpmd8 *p, UInt32 size0)
-{
- p->Low += size0 * (p->Range >>= 14);
- p->Range *= ((1 << 14) - size0);
- RangeEnc_Normalize(p);
-}
-
-
-#define MASK(sym) ((signed char *)charMask)[sym]
-
-void Ppmd8_EncodeSymbol(CPpmd8 *p, int symbol)
-{
- size_t charMask[256 / sizeof(size_t)];
- if (p->MinContext->NumStats != 0)
- {
- CPpmd_State *s = Ppmd8_GetStats(p, p->MinContext);
- UInt32 sum;
- unsigned i;
- if (s->Symbol == symbol)
- {
- RangeEnc_Encode(p, 0, s->Freq, p->MinContext->SummFreq);
- p->FoundState = s;
- Ppmd8_Update1_0(p);
- return;
- }
- p->PrevSuccess = 0;
- sum = s->Freq;
- i = p->MinContext->NumStats;
- do
- {
- if ((++s)->Symbol == symbol)
- {
- RangeEnc_Encode(p, sum, s->Freq, p->MinContext->SummFreq);
- p->FoundState = s;
- Ppmd8_Update1(p);
- return;
- }
- sum += s->Freq;
- }
- while (--i);
-
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- i = p->MinContext->NumStats;
- do { MASK((--s)->Symbol) = 0; } while (--i);
- RangeEnc_Encode(p, sum, p->MinContext->SummFreq - sum, p->MinContext->SummFreq);
- }
- else
- {
- UInt16 *prob = Ppmd8_GetBinSumm(p);
- CPpmd_State *s = Ppmd8Context_OneState(p->MinContext);
- if (s->Symbol == symbol)
- {
- RangeEnc_EncodeBit_0(p, *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob);
- p->FoundState = s;
- Ppmd8_UpdateBin(p);
- return;
- }
- else
- {
- RangeEnc_EncodeBit_1(p, *prob);
- *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob);
- p->InitEsc = PPMD8_kExpEscape[*prob >> 10];
- PPMD_SetAllBitsIn256Bytes(charMask);
- MASK(s->Symbol) = 0;
- p->PrevSuccess = 0;
- }
- }
- for (;;)
- {
- UInt32 escFreq;
- CPpmd_See *see;
- CPpmd_State *s;
- UInt32 sum;
- unsigned i, numMasked = p->MinContext->NumStats;
- do
- {
- p->OrderFall++;
- if (!p->MinContext->Suffix)
- return; /* EndMarker (symbol = -1) */
- p->MinContext = Ppmd8_GetContext(p, p->MinContext->Suffix);
- }
- while (p->MinContext->NumStats == numMasked);
-
- see = Ppmd8_MakeEscFreq(p, numMasked, &escFreq);
- s = Ppmd8_GetStats(p, p->MinContext);
- sum = 0;
- i = p->MinContext->NumStats + 1;
- do
- {
- int cur = s->Symbol;
- if (cur == symbol)
- {
- UInt32 low = sum;
- CPpmd_State *s1 = s;
- do
- {
- sum += (s->Freq & (int)(MASK(s->Symbol)));
- s++;
- }
- while (--i);
- RangeEnc_Encode(p, low, s1->Freq, sum + escFreq);
- Ppmd_See_Update(see);
- p->FoundState = s1;
- Ppmd8_Update2(p);
- return;
- }
- sum += (s->Freq & (int)(MASK(cur)));
- MASK(cur) = 0;
- s++;
- }
- while (--i);
-
- RangeEnc_Encode(p, sum, escFreq, sum + escFreq);
- see->Summ = (UInt16)(see->Summ + sum + escFreq);
- }
-}
diff --git a/src/libs/7zip/win/C/Sort.c b/src/libs/7zip/win/C/Sort.c
deleted file mode 100644
index 388d22893..000000000
--- a/src/libs/7zip/win/C/Sort.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Sort.c -- Sort functions
-2010-09-17 : Igor Pavlov : Public domain */
-
-#include "Sort.h"
-
-#define HeapSortDown(p, k, size, temp) \
- { for (;;) { \
- UInt32 s = (k << 1); \
- if (s > size) break; \
- if (s < size && p[s + 1] > p[s]) s++; \
- if (temp >= p[s]) break; \
- p[k] = p[s]; k = s; \
- } p[k] = temp; }
-
-void HeapSort(UInt32 *p, UInt32 size)
-{
- if (size <= 1)
- return;
- p--;
- {
- UInt32 i = size / 2;
- do
- {
- UInt32 temp = p[i];
- UInt32 k = i;
- HeapSortDown(p, k, size, temp)
- }
- while (--i != 0);
- }
- /*
- do
- {
- UInt32 k = 1;
- UInt32 temp = p[size];
- p[size--] = p[1];
- HeapSortDown(p, k, size, temp)
- }
- while (size > 1);
- */
- while (size > 3)
- {
- UInt32 temp = p[size];
- UInt32 k = (p[3] > p[2]) ? 3 : 2;
- p[size--] = p[1];
- p[1] = p[k];
- HeapSortDown(p, k, size, temp)
- }
- {
- UInt32 temp = p[size];
- p[size] = p[1];
- if (size > 2 && p[2] < temp)
- {
- p[1] = p[2];
- p[2] = temp;
- }
- else
- p[1] = temp;
- }
-}
-
-/*
-#define HeapSortRefDown(p, vals, n, size, temp) \
- { UInt32 k = n; UInt32 val = vals[temp]; for (;;) { \
- UInt32 s = (k << 1); \
- if (s > size) break; \
- if (s < size && vals[p[s + 1]] > vals[p[s]]) s++; \
- if (val >= vals[p[s]]) break; \
- p[k] = p[s]; k = s; \
- } p[k] = temp; }
-
-void HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size)
-{
- if (size <= 1)
- return;
- p--;
- {
- UInt32 i = size / 2;
- do
- {
- UInt32 temp = p[i];
- HeapSortRefDown(p, vals, i, size, temp);
- }
- while (--i != 0);
- }
- do
- {
- UInt32 temp = p[size];
- p[size--] = p[1];
- HeapSortRefDown(p, vals, 1, size, temp);
- }
- while (size > 1);
-}
-*/
diff --git a/src/libs/7zip/win/C/Sort.h b/src/libs/7zip/win/C/Sort.h
deleted file mode 100644
index 65dfc6f6a..000000000
--- a/src/libs/7zip/win/C/Sort.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Sort.h -- Sort functions
-2009-02-07 : Igor Pavlov : Public domain */
-
-#ifndef __7Z_SORT_H
-#define __7Z_SORT_H
-
-#include "Types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void HeapSort(UInt32 *p, UInt32 size);
-/* void HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size); */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/ApmHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/ApmHandler.cpp
deleted file mode 100644
index a3b5e19b9..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/ApmHandler.cpp
+++ /dev/null
@@ -1,356 +0,0 @@
-// ApmHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#define Get16(p) GetBe16(p)
-#define Get32(p) GetBe32(p)
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NApm {
-
-struct CItem
-{
- UInt32 StartBlock;
- UInt32 NumBlocks;
- char Name[32];
- char Type[32];
- /*
- UInt32 DataStartBlock;
- UInt32 NumDataBlocks;
- UInt32 Status;
- UInt32 BootStartBlock;
- UInt32 BootSize;
- UInt32 BootAddr;
- UInt32 BootEntry;
- UInt32 BootChecksum;
- char Processor[16];
- */
-
- bool Parse(const Byte *p, UInt32 &numBlocksInMap)
- {
- if (p[0] != 0x50 || p[1] != 0x4D || p[2] != 0 || p[3] != 0)
- return false;
- numBlocksInMap = Get32(p + 4);
- StartBlock = Get32(p + 8);
- NumBlocks = Get32(p + 0xC);
- memcpy(Name, p + 0x10, 32);
- memcpy(Type, p + 0x30, 32);
- /*
- DataStartBlock = Get32(p + 0x50);
- NumDataBlocks = Get32(p + 0x54);
- Status = Get32(p + 0x58);
- BootStartBlock = Get32(p + 0x5C);
- BootSize = Get32(p + 0x60);
- BootAddr = Get32(p + 0x64);
- if (Get32(p + 0x68) != 0)
- return false;
- BootEntry = Get32(p + 0x6C);
- if (Get32(p + 0x70) != 0)
- return false;
- BootChecksum = Get32(p + 0x74);
- memcpy(Processor, p + 0x78, 16);
- */
- return true;
- }
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CRecordVector<CItem> _items;
-
- int _blockSizeLog;
- UInt32 _numBlocks;
-
- HRESULT ReadTables(IInStream *stream);
- UInt64 BlocksToBytes(UInt32 i) const { return (UInt64)i << _blockSizeLog; }
- UInt64 GetItemSize(const CItem &item) { return BlocksToBytes(item.NumBlocks); }
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-static inline int GetLog(UInt32 num)
-{
- for (int i = 0; i < 31; i++)
- if (((UInt32)1 << i) == num)
- return i;
- return -1;
-}
-
-HRESULT CHandler::ReadTables(IInStream *stream)
-{
- const UInt32 kSectorSize = 512;
- Byte buf[kSectorSize];
- {
- RINOK(ReadStream_FALSE(stream, buf, kSectorSize));
- if (buf[0] != 0x45 || buf[1] != 0x52)
- return S_FALSE;
- _blockSizeLog = GetLog(Get16(buf + 2));
- if (_blockSizeLog < 9 || _blockSizeLog > 14)
- return S_FALSE;
- _numBlocks = Get32(buf + 4);
- for (int i = 8; i < 16; i++)
- if (buf[i] != 0)
- return S_FALSE;
- }
-
- unsigned numSkips = (unsigned)1 << (_blockSizeLog - 9);
- for (unsigned j = 1; j < numSkips; j++)
- {
- RINOK(ReadStream_FALSE(stream, buf, kSectorSize));
- }
-
- UInt32 numBlocksInMap = 0;
- for (unsigned i = 0;;)
- {
- RINOK(ReadStream_FALSE(stream, buf, kSectorSize));
-
- CItem item;
-
- UInt32 numBlocksInMap2;
- if (!item.Parse(buf, numBlocksInMap2))
- return S_FALSE;
- if (i == 0)
- {
- numBlocksInMap = numBlocksInMap2;
- if (numBlocksInMap > (1 << 8))
- return S_FALSE;
- }
- else if (numBlocksInMap2 != numBlocksInMap)
- return S_FALSE;
-
- UInt32 finish = item.StartBlock + item.NumBlocks;
- if (finish < item.StartBlock)
- return S_FALSE;
- _numBlocks = MyMax(_numBlocks, finish);
-
- _items.Add(item);
- for (unsigned j = 1; j < numSkips; j++)
- {
- RINOK(ReadStream_FALSE(stream, buf, kSectorSize));
- }
- if (++i == numBlocksInMap)
- break;
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- RINOK(ReadTables(stream));
- _stream = stream;
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _items.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidOffset, VT_UI8}
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidPhySize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-static AString GetString(const char *s)
-{
- AString res;
- for (int i = 0; i < 32 && s[i] != 0; i++)
- res += s[i];
- return res;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMainSubfile:
- {
- int mainIndex = -1;
- for (int i = 0; i < _items.Size(); i++)
- {
- AString s = GetString(_items[i].Type);
- if (s != "Apple_Free" &&
- s != "Apple_partition_map")
- {
- if (mainIndex >= 0)
- {
- mainIndex = -1;
- break;
- }
- mainIndex = i;
- }
- }
- if (mainIndex >= 0)
- prop = (UInt32)mainIndex;
- break;
- }
- case kpidClusterSize: prop = (UInt32)1 << _blockSizeLog; break;
- case kpidPhySize: prop = BlocksToBytes(_numBlocks); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- const CItem &item = _items[index];
- switch(propID)
- {
- case kpidPath:
- {
- AString s = GetString(item.Name);
- if (s.IsEmpty())
- {
- char s2[32];
- ConvertUInt32ToString(index, s2);
- s = s2;
- }
- AString type = GetString(item.Type);
- if (type == "Apple_HFS")
- type = "hfs";
- if (!type.IsEmpty())
- {
- s += '.';
- s += type;
- }
- prop = s;
- break;
- }
- case kpidSize:
- case kpidPackSize:
- prop = GetItemSize(item);
- break;
- case kpidOffset: prop = BlocksToBytes(item.StartBlock); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += GetItemSize(_items[allFilesMode ? i : indices[i]]);
- extractCallback->SetTotal(totalSize);
-
- totalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
-
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- UInt64 size = GetItemSize(item);
- totalSize += size;
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- RINOK(_stream->Seek(BlocksToBytes(item.StartBlock), STREAM_SEEK_SET, NULL));
- streamSpec->Init(size);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == size ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItem &item = _items[index];
- return CreateLimitedInStream(_stream, BlocksToBytes(item.StartBlock), GetItemSize(item), stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"APM", L"", 0, 0xD4, { 0x50, 0x4D, 0, 0, 0, 0, 0 }, 7, false, CreateArc, 0 };
-
-REGISTER_ARC(Apm)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Archive.def b/src/libs/7zip/win/CPP/7zip/Archive/Archive.def
new file mode 100644
index 000000000..55b530b2d
--- /dev/null
+++ b/src/libs/7zip/win/CPP/7zip/Archive/Archive.def
@@ -0,0 +1,6 @@
+EXPORTS
+ CreateObject PRIVATE
+ GetHandlerProperty PRIVATE
+ GetNumberOfFormats PRIVATE
+ GetHandlerProperty2 PRIVATE
+ CreateObject PRIVATE
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Archive2.def b/src/libs/7zip/win/CPP/7zip/Archive/Archive2.def
new file mode 100644
index 000000000..885d39d14
--- /dev/null
+++ b/src/libs/7zip/win/CPP/7zip/Archive/Archive2.def
@@ -0,0 +1,9 @@
+EXPORTS
+ CreateObject PRIVATE
+ GetHandlerProperty PRIVATE
+ GetNumberOfFormats PRIVATE
+ GetHandlerProperty2 PRIVATE
+ CreateObject PRIVATE
+ GetNumberOfMethods PRIVATE
+ GetMethodProperty PRIVATE
+ SetLargePageMode PRIVATE
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/ArjHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/ArjHandler.cpp
deleted file mode 100644
index 4dd686ec0..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/ArjHandler.cpp
+++ /dev/null
@@ -1,798 +0,0 @@
-// ArjHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/ArjDecoder1.h"
-#include "../Compress/ArjDecoder2.h"
-#include "../Compress/CopyCoder.h"
-
-#include "Common/ItemNameUtils.h"
-#include "Common/OutStreamWithCRC.h"
-
-using namespace NWindows;
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-
-namespace NArchive {
-namespace NArj {
-
-const int kBlockSizeMin = 30;
-const int kBlockSizeMax = 2600;
-
-namespace NSignature
-{
- const Byte kSig0 = 0x60;
- const Byte kSig1 = 0xEA;
-}
-
-namespace NFileHeader
-{
- namespace NCompressionMethod
- {
- enum
- {
- kStored = 0,
- kCompressed1a = 1,
- kCompressed1b = 2,
- kCompressed1c = 3,
- kCompressed2 = 4,
- kNoDataNoCRC = 8,
- kNoData = 9
- };
- }
-
- namespace NFileType
- {
- enum
- {
- kBinary = 0,
- k7BitText = 1,
- kArchiveHeader = 2,
- kDirectory = 3,
- kVolumeLablel = 4,
- kChapterLabel = 5
- };
- }
-
- namespace NFlags
- {
- const Byte kGarbled = 1;
- const Byte kVolume = 4;
- const Byte kExtFile = 8;
- const Byte kPathSym = 0x10;
- const Byte kBackup = 0x20;
- }
-
- namespace NHostOS
- {
- enum EEnum
- {
- kMSDOS = 0, // filesystem used by MS-DOS, OS/2, Win32
- // pkarj 2.50 (FAT / VFAT / FAT32 file systems)
- kPRIMOS,
- kUnix,
- kAMIGA,
- kMac,
- kOS_2,
- kAPPLE_GS,
- kAtari_ST,
- kNext,
- kVAX_VMS,
- kWIN95
- };
- }
-}
-
-struct CArchiveHeader
-{
- // Byte ArchiverVersion;
- // Byte ExtractVersion;
- Byte HostOS;
- // Byte Flags;
- // Byte SecuryVersion;
- // Byte FileType;
- // Byte Reserved;
- UInt32 CTime;
- UInt32 MTime;
- UInt32 ArchiveSize;
- // UInt32 SecurityEnvelopeFilePosition;
- // UInt16 FilespecPositionInFilename;
- // UInt16 LengthOfSecurityEnvelopeSata;
- // Byte EncryptionVersion;
- // Byte LastChapter;
- AString Name;
- AString Comment;
-
- HRESULT Parse(const Byte *p, unsigned size);
-};
-
-static HRESULT ReadString(const Byte *p, unsigned &size, AString &res)
-{
- AString s;
- for (unsigned i = 0; i < size;)
- {
- char c = (char)p[i++];
- if (c == 0)
- {
- size = i;
- res = s;
- return S_OK;
- }
- s += c;
- }
- return S_FALSE;
-}
-
-HRESULT CArchiveHeader::Parse(const Byte *p, unsigned size)
-{
- if (size < kBlockSizeMin)
- return S_FALSE;
- Byte firstHeaderSize = p[0];
- if (firstHeaderSize > size)
- return S_FALSE;
- // ArchiverVersion = p[1];
- // ExtractVersion = p[2];
- HostOS = p[3];
- // Flags = p[4];
- // SecuryVersion = p[5];
- if (p[6] != NFileHeader::NFileType::kArchiveHeader)
- return S_FALSE;
- // Reserved = p[7];
- CTime = Get32(p + 8);
- MTime = Get32(p + 12);
- ArchiveSize = Get32(p + 16);
- // SecurityEnvelopeFilePosition = Get32(p + 20);
- // UInt16 filespecPositionInFilename = Get16(p + 24);
- // LengthOfSecurityEnvelopeSata = Get16(p + 26);
- // EncryptionVersion = p[28];
- // LastChapter = p[29];
- unsigned pos = firstHeaderSize;
- unsigned size1 = size - pos;
- RINOK(ReadString(p + pos, size1, Name));
- pos += size1;
- size1 = size - pos;
- RINOK(ReadString(p + pos, size1, Comment));
- pos += size1;
- return S_OK;
-}
-
-struct CItem
-{
- AString Name;
- AString Comment;
-
- UInt32 MTime;
- UInt32 PackSize;
- UInt32 Size;
- UInt32 FileCRC;
- UInt32 SplitPos;
-
- Byte Version;
- Byte ExtractVersion;
- Byte HostOS;
- Byte Flags;
- Byte Method;
- Byte FileType;
-
- // UInt16 FilespecPositionInFilename;
- UInt16 FileAccessMode;
- // Byte FirstChapter;
- // Byte LastChapter;
-
- UInt64 DataPosition;
-
- bool IsEncrypted() const { return (Flags & NFileHeader::NFlags::kGarbled) != 0; }
- bool IsDir() const { return (FileType == NFileHeader::NFileType::kDirectory); }
- bool IsSplitAfter() const { return (Flags & NFileHeader::NFlags::kVolume) != 0; }
- bool IsSplitBefore() const { return (Flags & NFileHeader::NFlags::kExtFile) != 0; }
- UInt32 GetWinAttributes() const
- {
- UInt32 winAtrributes;
- switch(HostOS)
- {
- case NFileHeader::NHostOS::kMSDOS:
- case NFileHeader::NHostOS::kWIN95:
- winAtrributes = FileAccessMode;
- break;
- default:
- winAtrributes = 0;
- }
- if (IsDir())
- winAtrributes |= FILE_ATTRIBUTE_DIRECTORY;
- return winAtrributes;
- }
-
- HRESULT Parse(const Byte *p, unsigned size);
-};
-
-HRESULT CItem::Parse(const Byte *p, unsigned size)
-{
- if (size < kBlockSizeMin)
- return S_FALSE;
-
- Byte firstHeaderSize = p[0];
-
- Version = p[1];
- ExtractVersion = p[2];
- HostOS = p[3];
- Flags = p[4];
- Method = p[5];
- FileType = p[6];
- // Reserved = p[7];
- MTime = Get32(p + 8);
- PackSize = Get32(p + 12);
- Size = Get32(p + 16);
- FileCRC = Get32(p + 20);
- // FilespecPositionInFilename = Get16(p + 24);
- FileAccessMode = Get16(p + 26);
- // FirstChapter = p[28];
- // FirstChapter = p[29];
-
- SplitPos = 0;
- if (IsSplitBefore() && firstHeaderSize >= 34)
- SplitPos = Get32(p + 30);
-
- unsigned pos = firstHeaderSize;
- unsigned size1 = size - pos;
- RINOK(ReadString(p + pos, size1, Name));
- pos += size1;
- size1 = size - pos;
- RINOK(ReadString(p + pos, size1, Comment));
- pos += size1;
-
- return S_OK;
-}
-
-struct CInArchiveException
-{
- enum CCauseType
- {
- kUnexpectedEndOfArchive = 0,
- kCRCError,
- kIncorrectArchive
- }
- Cause;
- CInArchiveException(CCauseType cause): Cause(cause) {};
-};
-
-class CInArchive
-{
- UInt32 _blockSize;
- Byte _block[kBlockSizeMax + 4];
-
- HRESULT ReadBlock(bool &filled);
- HRESULT ReadSignatureAndBlock(bool &filled);
- HRESULT SkipExtendedHeaders();
-
- HRESULT SafeReadBytes(void *data, UInt32 size);
-
-public:
- CArchiveHeader Header;
-
- IInStream *Stream;
- IArchiveOpenCallback *Callback;
- UInt64 NumFiles;
- UInt64 NumBytes;
-
- HRESULT Open(const UInt64 *searchHeaderSizeLimit);
- HRESULT GetNextItem(bool &filled, CItem &item);
-};
-
-static inline bool TestMarkerCandidate(const Byte *p, unsigned maxSize)
-{
- if (p[0] != NSignature::kSig0 || p[1] != NSignature::kSig1)
- return false;
- UInt32 blockSize = Get16(p + 2);
- p += 4;
- if (p[6] != NFileHeader::NFileType::kArchiveHeader ||
- p[0] > blockSize ||
- maxSize < 2 + 2 + blockSize + 4 ||
- blockSize < kBlockSizeMin || blockSize > kBlockSizeMax ||
- p[28] > 8) // EncryptionVersion
- return false;
- // return (Get32(p + blockSize) == CrcCalc(p, blockSize));
- return true;
-}
-
-static HRESULT FindAndReadMarker(ISequentialInStream *stream, const UInt64 *searchHeaderSizeLimit, UInt64 &position)
-{
- position = 0;
-
- const int kMarkerSizeMin = 2 + 2 + kBlockSizeMin + 4;
- const int kMarkerSizeMax = 2 + 2 + kBlockSizeMax + 4;
-
- CByteBuffer byteBuffer;
- const UInt32 kBufSize = 1 << 16;
- byteBuffer.SetCapacity(kBufSize);
- Byte *buf = byteBuffer;
-
- size_t processedSize = kMarkerSizeMax;
- RINOK(ReadStream(stream, buf, &processedSize));
- if (processedSize < kMarkerSizeMin)
- return S_FALSE;
- if (TestMarkerCandidate(buf, (unsigned)processedSize))
- return S_OK;
-
- UInt32 numBytesPrev = (UInt32)processedSize - 1;
- memmove(buf, buf + 1, numBytesPrev);
- UInt64 curTestPos = 1;
- for (;;)
- {
- if (searchHeaderSizeLimit != NULL)
- if (curTestPos > *searchHeaderSizeLimit)
- return S_FALSE;
- processedSize = kBufSize - numBytesPrev;
- RINOK(ReadStream(stream, buf + numBytesPrev, &processedSize));
- UInt32 numBytesInBuffer = numBytesPrev + (UInt32)processedSize;
- if (numBytesInBuffer < kMarkerSizeMin)
- return S_FALSE;
- UInt32 numTests = numBytesInBuffer - kMarkerSizeMin + 1;
- UInt32 pos;
- for (pos = 0; pos < numTests; pos++)
- {
- for (; buf[pos] != NSignature::kSig0 && pos < numTests; pos++);
- if (pos == numTests)
- break;
- if (TestMarkerCandidate(buf + pos, numBytesInBuffer - pos))
- {
- position = curTestPos + pos;
- return S_OK;
- }
- }
- curTestPos += pos;
- numBytesPrev = numBytesInBuffer - numTests;
- memmove(buf, buf + numTests, numBytesPrev);
- }
-}
-
-HRESULT CInArchive::SafeReadBytes(void *data, UInt32 size)
-{
- size_t processed = size;
- RINOK(ReadStream(Stream, data, &processed));
- if (processed != size)
- throw CInArchiveException(CInArchiveException::kUnexpectedEndOfArchive);
- return S_OK;
-}
-
-HRESULT CInArchive::ReadBlock(bool &filled)
-{
- filled = false;
- Byte buf[2];
- RINOK(SafeReadBytes(buf, 2));
- _blockSize = Get16(buf);
- if (_blockSize == 0)
- return S_OK;
- if (_blockSize > kBlockSizeMax)
- throw CInArchiveException(CInArchiveException::kIncorrectArchive);
- RINOK(SafeReadBytes(_block, _blockSize + 4));
- NumBytes += _blockSize + 6;
- if (Get32(_block + _blockSize) != CrcCalc(_block, _blockSize))
- throw CInArchiveException(CInArchiveException::kCRCError);
- filled = true;
- return S_OK;
-}
-
-HRESULT CInArchive::ReadSignatureAndBlock(bool &filled)
-{
- Byte id[2];
- RINOK(SafeReadBytes(id, 2));
- if (id[0] != NSignature::kSig0 || id[1] != NSignature::kSig1)
- throw CInArchiveException(CInArchiveException::kIncorrectArchive);
- return ReadBlock(filled);
-}
-
-HRESULT CInArchive::SkipExtendedHeaders()
-{
- for (UInt32 i = 0;; i++)
- {
- bool filled;
- RINOK(ReadBlock(filled));
- if (!filled)
- return S_OK;
- if (Callback && (i & 0xFF) == 0)
- RINOK(Callback->SetCompleted(&NumFiles, &NumBytes));
- }
-}
-
-HRESULT CInArchive::Open(const UInt64 *searchHeaderSizeLimit)
-{
- UInt64 position = 0;
- RINOK(FindAndReadMarker(Stream, searchHeaderSizeLimit, position));
- RINOK(Stream->Seek(position, STREAM_SEEK_SET, NULL));
- bool filled;
- RINOK(ReadSignatureAndBlock(filled));
- if (!filled)
- return S_FALSE;
- RINOK(Header.Parse(_block, _blockSize));
- return SkipExtendedHeaders();
-}
-
-HRESULT CInArchive::GetNextItem(bool &filled, CItem &item)
-{
- RINOK(ReadSignatureAndBlock(filled));
- if (!filled)
- return S_OK;
- filled = false;
- RINOK(item.Parse(_block, _blockSize));
- /*
- UInt32 extraData;
- if ((header.Flags & NFileHeader::NFlags::kExtFile) != 0)
- extraData = GetUi32(_block + pos);
- */
-
- RINOK(SkipExtendedHeaders());
- filled = true;
- return S_OK;
-}
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP1(IInArchive)
-
- INTERFACE_IInArchive(;)
-
- HRESULT Open2(IInStream *inStream, const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *callback);
-private:
- CInArchive _archive;
- CObjectVector<CItem> _items;
- CMyComPtr<IInStream> _stream;
-};
-
-const wchar_t *kHostOS[] =
-{
- L"MSDOS",
- L"PRIMOS",
- L"UNIX",
- L"AMIGA",
- L"MAC",
- L"OS/2",
- L"APPLE GS",
- L"ATARI ST",
- L"NEXT",
- L"VAX VMS",
- L"WIN95"
-};
-
-const wchar_t *kUnknownOS = L"Unknown";
-
-const int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]);
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidName, VT_BSTR},
- { NULL, kpidCTime, VT_BSTR},
- { NULL, kpidMTime, VT_BSTR},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidComment, VT_BSTR}
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI4},
- { NULL, kpidPosition, VT_UI8},
- { NULL, kpidPackSize, VT_UI4},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidEncrypted, VT_BOOL},
- { NULL, kpidCRC, VT_UI4},
- { NULL, kpidMethod, VT_UI1},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidComment, VT_BSTR}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-static void SetTime(UInt32 dosTime, NWindows::NCOM::CPropVariant &prop)
-{
- if (dosTime == 0)
- return;
- FILETIME localFileTime, utc;
- if (NTime::DosTimeToFileTime(dosTime, localFileTime))
- {
- if (!LocalFileTimeToFileTime(&localFileTime, &utc))
- utc.dwHighDateTime = utc.dwLowDateTime = 0;
- }
- else
- utc.dwHighDateTime = utc.dwLowDateTime = 0;
- prop = utc;
-}
-
-static void SetHostOS(Byte hostOS, NWindows::NCOM::CPropVariant &prop)
-{
- prop = hostOS < kNumHostOSes ? kHostOS[hostOS] : kUnknownOS;
-}
-
-static void SetUnicodeString(const AString &s, NWindows::NCOM::CPropVariant &prop)
-{
- if (!s.IsEmpty())
- prop = MultiByteToUnicodeString(s, CP_OEMCP);
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidName: SetUnicodeString(_archive.Header.Name, prop); break;
- case kpidCTime: SetTime(_archive.Header.CTime, prop); break;
- case kpidMTime: SetTime(_archive.Header.MTime, prop); break;
- case kpidHostOS: SetHostOS(_archive.Header.HostOS, prop); break;
- case kpidComment: SetUnicodeString(_archive.Header.Comment, prop); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _items[index];
- switch(propID)
- {
- case kpidPath: prop = NItemName::GetOSName(MultiByteToUnicodeString(item.Name, CP_OEMCP)); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.Size; break;
- case kpidPackSize: prop = item.PackSize; break;
- case kpidPosition: if (item.IsSplitBefore() || item.IsSplitAfter()) prop = (UInt64)item.SplitPos; break;
- case kpidAttrib: prop = item.GetWinAttributes(); break;
- case kpidEncrypted: prop = item.IsEncrypted(); break;
- case kpidCRC: prop = item.FileCRC; break;
- case kpidMethod: prop = item.Method; break;
- case kpidHostOS: SetHostOS(item.HostOS, prop); break;
- case kpidMTime: SetTime(item.MTime, prop); break;
- case kpidComment: SetUnicodeString(item.Comment, prop); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::Open2(IInStream *inStream, const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *callback)
-{
- Close();
-
- UInt64 endPos = 0;
- if (callback != NULL)
- {
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPos));
- RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));
- }
-
- _archive.Stream = inStream;
- _archive.Callback = callback;
- _archive.NumFiles = _archive.NumBytes = 0;
-
- RINOK(_archive.Open(maxCheckStartPosition));
- if (callback != NULL)
- RINOK(callback->SetTotal(NULL, &endPos));
- for (;;)
- {
- CItem item;
- bool filled;
-
-
- RINOK(_archive.GetNextItem(filled, item));
-
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &item.DataPosition));
-
- if (!filled)
- break;
- _items.Add(item);
-
- if (inStream->Seek(item.PackSize, STREAM_SEEK_CUR, NULL) != S_OK)
- throw CInArchiveException(CInArchiveException::kUnexpectedEndOfArchive);
-
- _archive.NumFiles = _items.Size();
- _archive.NumBytes = item.DataPosition;
-
- if (callback != NULL && _items.Size() % 100 == 0)
- {
- RINOK(callback->SetCompleted(&_archive.NumFiles, &_archive.NumBytes));
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- HRESULT res;
- try
- {
- res = Open2(inStream, maxCheckStartPosition, callback);
- if (res == S_OK)
- {
- _stream = inStream;
- return S_OK;
- }
- }
- catch(const CInArchiveException &) { res = S_FALSE; }
- Close();
- return res;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _items.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- UInt64 totalUnpacked = 0, totalPacked = 0;
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const CItem &item = _items[allFilesMode ? i : indices[i]];
- totalUnpacked += item.Size;
- totalPacked += item.PackSize;
- }
- extractCallback->SetTotal(totalUnpacked);
-
- totalUnpacked = totalPacked = 0;
- UInt64 curUnpacked, curPacked;
-
- CMyComPtr<ICompressCoder> arj1Decoder;
- CMyComPtr<ICompressCoder> arj2Decoder;
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *inStreamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(inStreamSpec);
- inStreamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++, totalUnpacked += curUnpacked, totalPacked += curPacked)
- {
- lps->InSize = totalPacked;
- lps->OutSize = totalUnpacked;
- RINOK(lps->SetCur());
-
- curUnpacked = curPacked = 0;
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (item.IsDir())
- {
- // if (!testMode)
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- continue;
- }
-
- if (!testMode && !realOutStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- curUnpacked = item.Size;
- curPacked = item.PackSize;
-
- {
- COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init();
-
- inStreamSpec->Init(item.PackSize);
-
- UInt64 pos;
- _stream->Seek(item.DataPosition, STREAM_SEEK_SET, &pos);
-
- HRESULT result = S_OK;
- Int32 opRes = NExtract::NOperationResult::kOK;
-
- if (item.IsEncrypted())
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- switch(item.Method)
- {
- case NFileHeader::NCompressionMethod::kStored:
- {
- result = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (result == S_OK && copyCoderSpec->TotalSize != item.PackSize)
- result = S_FALSE;
- break;
- }
- case NFileHeader::NCompressionMethod::kCompressed1a:
- case NFileHeader::NCompressionMethod::kCompressed1b:
- case NFileHeader::NCompressionMethod::kCompressed1c:
- {
- if (!arj1Decoder)
- arj1Decoder = new NCompress::NArj::NDecoder1::CCoder;
- result = arj1Decoder->Code(inStream, outStream, NULL, &curUnpacked, progress);
- break;
- }
- case NFileHeader::NCompressionMethod::kCompressed2:
- {
- if (!arj2Decoder)
- arj2Decoder = new NCompress::NArj::NDecoder2::CCoder;
- result = arj2Decoder->Code(inStream, outStream, NULL, &curUnpacked, progress);
- break;
- }
- default:
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- }
- }
- if (opRes == NExtract::NOperationResult::kOK)
- {
- if (result == S_FALSE)
- opRes = NExtract::NOperationResult::kDataError;
- else
- {
- RINOK(result);
- opRes = (outStreamSpec->GetCRC() == item.FileCRC) ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kCRCError;
- }
- }
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Arj", L"arj", 0, 4, { 0x60, 0xEA }, 2, false, CreateArc, 0 };
-
-REGISTER_ARC(Arj)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Bz2Handler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Bz2Handler.cpp
deleted file mode 100644
index 98cbcc182..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Bz2Handler.cpp
+++ /dev/null
@@ -1,423 +0,0 @@
-// Bz2Handler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariant.h"
-
-#ifndef _7ZIP_ST
-#include "../../Windows/System.h"
-#endif
-
-#include "../Common/CreateCoder.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/BZip2Decoder.h"
-#include "../Compress/BZip2Encoder.h"
-#include "../Compress/CopyCoder.h"
-
-#include "Common/DummyOutStream.h"
-#include "Common/ParseProperties.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NBz2 {
-
-static const UInt32 kNumPassesX1 = 1;
-static const UInt32 kNumPassesX7 = 2;
-static const UInt32 kNumPassesX9 = 7;
-
-static const UInt32 kDicSizeX1 = 100000;
-static const UInt32 kDicSizeX3 = 500000;
-static const UInt32 kDicSizeX5 = 900000;
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public IOutArchive,
- public ISetProperties,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CMyComPtr<ISequentialInStream> _seqStream;
- UInt64 _packSize;
- UInt64 _startPosition;
- bool _packSizeDefined;
-
- UInt32 _level;
- UInt32 _dicSize;
- UInt32 _numPasses;
- #ifndef _7ZIP_ST
- UInt32 _numThreads;
- #endif
-
- void InitMethodProperties()
- {
- _level = 5;
- _dicSize =
- _numPasses = 0xFFFFFFFF;
- #ifndef _7ZIP_ST
- _numThreads = NWindows::NSystem::GetNumberOfProcessors();;
- #endif
- }
-
-public:
- MY_UNKNOWN_IMP4(IInArchive, IArchiveOpenSeq, IOutArchive, ISetProperties)
-
- INTERFACE_IInArchive(;)
- INTERFACE_IOutArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
- STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProps);
-
- CHandler() { InitMethodProperties(); }
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPackSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPackSize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- try
- {
- Close();
- RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_startPosition));
- const int kSignatureSize = 3;
- Byte buf[kSignatureSize];
- RINOK(ReadStream_FALSE(stream, buf, kSignatureSize));
- if (buf[0] != 'B' || buf[1] != 'Z' || buf[2] != 'h')
- return S_FALSE;
-
- UInt64 endPosition;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPosition));
- _packSize = endPosition - _startPosition;
- _packSizeDefined = true;
- _stream = stream;
- _seqStream = stream;
- }
- catch(...) { return S_FALSE; }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- Close();
- _seqStream = stream;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _packSizeDefined = false;
- _seqStream.Release();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- if (_stream)
- extractCallback->SetTotal(_packSize);
- UInt64 currentTotalPacked = 0;
- RINOK(extractCallback->SetCompleted(&currentTotalPacked));
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- NCompress::NBZip2::CDecoder *decoderSpec = new NCompress::NBZip2::CDecoder;
- CMyComPtr<ICompressCoder> decoder = decoderSpec;
-
- if (_stream)
- {
- RINOK(_stream->Seek(_startPosition, STREAM_SEEK_SET, NULL));
- }
-
- decoderSpec->SetInStream(_seqStream);
-
- #ifndef _7ZIP_ST
- RINOK(decoderSpec->SetNumberOfThreads(_numThreads));
- #endif
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
-
- realOutStream.Release();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, true);
-
- HRESULT result = S_OK;
-
- bool firstItem = true;
- for (;;)
- {
- lps->InSize = currentTotalPacked;
- lps->OutSize = outStreamSpec->GetSize();
-
- RINOK(lps->SetCur());
-
- bool isBz2;
- result = decoderSpec->CodeResume(outStream, isBz2, progress);
-
- if (result != S_OK)
- break;
- if (!isBz2)
- {
- if (firstItem)
- result = S_FALSE;
- break;
- }
- firstItem = false;
-
- _packSize = currentTotalPacked = decoderSpec->GetInputProcessedSize();
- _packSizeDefined = true;
- }
- decoderSpec->ReleaseInStream();
- outStream.Release();
-
- Int32 retResult;
- if (result == S_OK)
- retResult = NExtract::NOperationResult::kOK;
- else if (result == S_FALSE)
- retResult = NExtract::NOperationResult::kDataError;
- else
- return result;
- return extractCallback->SetOperationResult(retResult);
-
- COM_TRY_END
-}
-
-static HRESULT UpdateArchive(
- UInt64 unpackSize,
- ISequentialOutStream *outStream,
- int indexInClient,
- UInt32 dictionary,
- UInt32 numPasses,
- #ifndef _7ZIP_ST
- UInt32 numThreads,
- #endif
- IArchiveUpdateCallback *updateCallback)
-{
- RINOK(updateCallback->SetTotal(unpackSize));
- UInt64 complexity = 0;
- RINOK(updateCallback->SetCompleted(&complexity));
-
- CMyComPtr<ISequentialInStream> fileInStream;
-
- RINOK(updateCallback->GetStream(indexInClient, &fileInStream));
-
- CLocalProgress *localProgressSpec = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> localProgress = localProgressSpec;
- localProgressSpec->Init(updateCallback, true);
-
- NCompress::NBZip2::CEncoder *encoderSpec = new NCompress::NBZip2::CEncoder;
- CMyComPtr<ICompressCoder> encoder = encoderSpec;
- {
- NWindows::NCOM::CPropVariant properties[] =
- {
- dictionary,
- numPasses
- #ifndef _7ZIP_ST
- , numThreads
- #endif
- };
- PROPID propIDs[] =
- {
- NCoderPropID::kDictionarySize,
- NCoderPropID::kNumPasses
- #ifndef _7ZIP_ST
- , NCoderPropID::kNumThreads
- #endif
- };
- RINOK(encoderSpec->SetCoderProperties(propIDs, properties, sizeof(propIDs) / sizeof(propIDs[0])));
- }
-
- RINOK(encoder->Code(fileInStream, outStream, NULL, NULL, localProgress));
-
- return updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK);
-}
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *type)
-{
- *type = NFileTimeType::kUnix;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *updateCallback)
-{
- if (numItems != 1)
- return E_INVALIDARG;
-
- Int32 newData, newProps;
- UInt32 indexInArchive;
- if (!updateCallback)
- return E_FAIL;
- RINOK(updateCallback->GetUpdateItemInfo(0, &newData, &newProps, &indexInArchive));
-
- if (IntToBool(newProps))
- {
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidIsDir, &prop));
- if (prop.vt == VT_BOOL)
- {
- if (prop.boolVal != VARIANT_FALSE)
- return E_INVALIDARG;
- }
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- }
- }
-
- if (IntToBool(newData))
- {
- UInt64 size;
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- size = prop.uhVal.QuadPart;
- }
-
- UInt32 dicSize = _dicSize;
- if (dicSize == 0xFFFFFFFF)
- dicSize = (_level >= 5 ? kDicSizeX5 :
- (_level >= 3 ? kDicSizeX3 :
- kDicSizeX1));
-
- UInt32 numPasses = _numPasses;
- if (numPasses == 0xFFFFFFFF)
- numPasses = (_level >= 9 ? kNumPassesX9 :
- (_level >= 7 ? kNumPassesX7 :
- kNumPassesX1));
-
- return UpdateArchive(
- size, outStream, 0, dicSize, numPasses,
- #ifndef _7ZIP_ST
- _numThreads,
- #endif
- updateCallback);
- }
- if (indexInArchive != 0)
- return E_INVALIDARG;
- if (_stream)
- RINOK(_stream->Seek(_startPosition, STREAM_SEEK_SET, NULL));
- return NCompress::CopyStream(_stream, outStream, NULL);
-}
-
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps)
-{
- InitMethodProperties();
- #ifndef _7ZIP_ST
- const UInt32 numProcessors = NSystem::GetNumberOfProcessors();
- _numThreads = numProcessors;
- #endif
-
- for (int i = 0; i < numProps; i++)
- {
- UString name = names[i];
- name.MakeUpper();
- if (name.IsEmpty())
- return E_INVALIDARG;
- const PROPVARIANT &prop = values[i];
- if (name[0] == L'X')
- {
- UInt32 level = 9;
- RINOK(ParsePropValue(name.Mid(1), prop, level));
- _level = level;
- }
- else if (name[0] == L'D')
- {
- UInt32 dicSize = kDicSizeX5;
- RINOK(ParsePropDictionaryValue(name.Mid(1), prop, dicSize));
- _dicSize = dicSize;
- }
- else if (name.Left(4) == L"PASS")
- {
- UInt32 num = kNumPassesX9;
- RINOK(ParsePropValue(name.Mid(4), prop, num));
- _numPasses = num;
- }
- else if (name.Left(2) == L"MT")
- {
- #ifndef _7ZIP_ST
- RINOK(ParseMtProp(name.Mid(2), prop, numProcessors, _numThreads));
- #endif
- }
- else
- return E_INVALIDARG;
- }
- return S_OK;
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new CHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
- { L"bzip2", L"bz2 bzip2 tbz2 tbz", L"* * .tar .tar", 2, { 'B', 'Z', 'h' }, 3, true, CreateArc, CreateArcOut };
-
-REGISTER_ARC(BZip2)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.cpp
deleted file mode 100644
index 12c73eb5f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.cpp
+++ /dev/null
@@ -1,189 +0,0 @@
-// CabBlockInStream.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/Alloc.h"
-
-#include "Common/Defs.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "CabBlockInStream.h"
-
-namespace NArchive {
-namespace NCab {
-
-static const UInt32 kBlockSize = (1 << 16);
-
-bool CCabBlockInStream::Create()
-{
- if (!_buffer)
- _buffer = (Byte *)::MyAlloc(kBlockSize);
- return (_buffer != 0);
-}
-
-CCabBlockInStream::~CCabBlockInStream()
-{
- MyFree(_buffer);
-}
-
-class CCheckSum2
-{
- UInt32 m_Value;
- int m_Pos;
- Byte m_Hist[4];
-public:
- CCheckSum2(): m_Value(0){};
- void Init() { m_Value = 0; m_Pos = 0; }
- void Update(const void *data, UInt32 size);
- void FinishDataUpdate()
- {
- for (int i = 0; i < m_Pos; i++)
- m_Value ^= ((UInt32)(m_Hist[i])) << (8 * (m_Pos - i - 1));
- }
- void UpdateUInt32(UInt32 v) { m_Value ^= v; }
- UInt32 GetResult() const { return m_Value; }
-};
-
-void CCheckSum2::Update(const void *data, UInt32 size)
-{
- UInt32 checkSum = m_Value;
- const Byte *dataPointer = (const Byte *)data;
-
- while (size != 0 && m_Pos != 0)
- {
- m_Hist[m_Pos] = *dataPointer++;
- m_Pos = (m_Pos + 1) & 3;
- size--;
- if (m_Pos == 0)
- for (int i = 0; i < 4; i++)
- checkSum ^= ((UInt32)m_Hist[i]) << (8 * i);
- }
-
- int numWords = size / 4;
-
- while (numWords-- != 0)
- {
- UInt32 temp = *dataPointer++;
- temp |= ((UInt32)(*dataPointer++)) << 8;
- temp |= ((UInt32)(*dataPointer++)) << 16;
- temp |= ((UInt32)(*dataPointer++)) << 24;
- checkSum ^= temp;
- }
- m_Value = checkSum;
-
- size &= 3;
-
- while (size != 0)
- {
- m_Hist[m_Pos] = *dataPointer++;
- m_Pos = (m_Pos + 1) & 3;
- size--;
- }
-}
-
-static const UInt32 kDataBlockHeaderSize = 8;
-
-class CTempCabInBuffer2
-{
-public:
- Byte Buffer[kDataBlockHeaderSize];
- UInt32 Pos;
- Byte ReadByte()
- {
- return Buffer[Pos++];
- }
- UInt32 ReadUInt32()
- {
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- value |= (((UInt32)ReadByte()) << (8 * i));
- return value;
- }
- UInt16 ReadUInt16()
- {
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- value |= (((UInt16)ReadByte()) << (8 * i));
- return value;
- }
-};
-
-HRESULT CCabBlockInStream::PreRead(UInt32 &packSize, UInt32 &unpackSize)
-{
- CTempCabInBuffer2 inBuffer;
- inBuffer.Pos = 0;
- RINOK(ReadStream_FALSE(_stream, inBuffer.Buffer, kDataBlockHeaderSize))
-
- UInt32 checkSum = inBuffer.ReadUInt32();
- packSize = inBuffer.ReadUInt16();
- unpackSize = inBuffer.ReadUInt16();
- if (ReservedSize != 0)
- {
- RINOK(ReadStream_FALSE(_stream, _buffer, ReservedSize));
- }
- _pos = 0;
- CCheckSum2 checkSumCalc;
- checkSumCalc.Init();
- UInt32 packSize2 = packSize;
- if (MsZip && _size == 0)
- {
- if (packSize < 2)
- return S_FALSE; // bad block;
- Byte sig[2];
- RINOK(ReadStream_FALSE(_stream, sig, 2));
- if (sig[0] != 0x43 || sig[1] != 0x4B)
- return S_FALSE;
- packSize2 -= 2;
- checkSumCalc.Update(sig, 2);
- }
-
- if (kBlockSize - _size < packSize2)
- return S_FALSE;
-
- UInt32 curSize = packSize2;
- if (curSize != 0)
- {
- size_t processedSizeLoc = curSize;
- RINOK(ReadStream(_stream, _buffer + _size, &processedSizeLoc));
- checkSumCalc.Update(_buffer + _size, (UInt32)processedSizeLoc);
- _size += (UInt32)processedSizeLoc;
- if (processedSizeLoc != curSize)
- return S_FALSE;
- }
- TotalPackSize = _size;
-
- checkSumCalc.FinishDataUpdate();
-
- bool dataError;
- if (checkSum == 0)
- dataError = false;
- else
- {
- checkSumCalc.UpdateUInt32(packSize | (((UInt32)unpackSize) << 16));
- dataError = (checkSumCalc.GetResult() != checkSum);
- }
- DataError |= dataError;
- return dataError ? S_FALSE : S_OK;
-}
-
-STDMETHODIMP CCabBlockInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != 0)
- *processedSize = 0;
- if (size == 0)
- return S_OK;
- if (_size != 0)
- {
- size = MyMin(_size, size);
- memmove(data, _buffer + _pos, size);
- _pos += size;
- _size -= size;
- if (processedSize != 0)
- *processedSize = size;
- return S_OK;
- }
- return S_OK; // no blocks data
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.h
deleted file mode 100644
index 1db3835b4..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// CabBlockInStream.cpp
-
-#ifndef __CABBLOCKINSTREAM_H
-#define __CABBLOCKINSTREAM_H
-
-#include "Common/MyCom.h"
-#include "../../IStream.h"
-
-namespace NArchive {
-namespace NCab {
-
-class CCabBlockInStream:
- public ISequentialInStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialInStream> _stream;
- Byte *_buffer;
- UInt32 _pos;
- UInt32 _size;
-
-public:
- UInt32 TotalPackSize;
- UInt32 ReservedSize;
- bool DataError;
- bool MsZip;
-
- CCabBlockInStream(): _buffer(0), ReservedSize(0), MsZip(false), DataError(false), TotalPackSize(0) {}
- ~CCabBlockInStream();
- bool Create();
- void SetStream(ISequentialInStream *stream) { _stream = stream; }
-
- void InitForNewFolder() { TotalPackSize = 0; }
- void InitForNewBlock() { _size = 0; }
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-
- HRESULT PreRead(UInt32 &packSize, UInt32 &unpackSize);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.cpp
deleted file mode 100644
index 20f670d35..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.cpp
+++ /dev/null
@@ -1,929 +0,0 @@
-// CabHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/Alloc.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/Defs.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-#include "Common/UTFConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-#include "../../Compress/DeflateDecoder.h"
-#include "../../Compress/LzxDecoder.h"
-#include "../../Compress/QuantumDecoder.h"
-
-#include "../Common/ItemNameUtils.h"
-
-#include "CabBlockInStream.h"
-#include "CabHandler.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NCab {
-
-// #define _CAB_DETAILS
-
-#ifdef _CAB_DETAILS
-enum
-{
- kpidBlockReal = kpidUserDefined
-};
-#endif
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidBlock, VT_I4}
- #ifdef _CAB_DETAILS
- ,
- { L"BlockReal", kpidBlockReal, VT_UI4},
- { NULL, kpidOffset, VT_UI4},
- { NULL, kpidVolume, VT_UI4}
- #endif
-};
-
-static const char *kMethods[] =
-{
- "None",
- "MSZip",
- "Quantum",
- "LZX"
-};
-
-static const int kNumMethods = sizeof(kMethods) / sizeof(kMethods[0]);
-static const char *kUnknownMethod = "Unknown";
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidMethod, VT_BSTR},
- // { NULL, kpidSolid, VT_BOOL},
- { NULL, kpidNumBlocks, VT_UI4},
- { NULL, kpidNumVolumes, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMethod:
- {
- AString resString;
- CRecordVector<Byte> ids;
- int i;
- for (int v = 0; v < m_Database.Volumes.Size(); v++)
- {
- const CDatabaseEx &de = m_Database.Volumes[v];
- for (i = 0; i < de.Folders.Size(); i++)
- ids.AddToUniqueSorted(de.Folders[i].GetCompressionMethod());
- }
- for (i = 0; i < ids.Size(); i++)
- {
- Byte id = ids[i];
- AString method = (id < kNumMethods) ? kMethods[id] : kUnknownMethod;
- if (!resString.IsEmpty())
- resString += ' ';
- resString += method;
- }
- prop = resString;
- break;
- }
- // case kpidSolid: prop = _database.IsSolid(); break;
- case kpidNumBlocks:
- {
- UInt32 numFolders = 0;
- for (int v = 0; v < m_Database.Volumes.Size(); v++)
- numFolders += m_Database.Volumes[v].Folders.Size();
- prop = numFolders;
- break;
- }
- case kpidNumVolumes:
- {
- prop = (UInt32)m_Database.Volumes.Size();
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- const CMvItem &mvItem = m_Database.Items[index];
- const CDatabaseEx &db = m_Database.Volumes[mvItem.VolumeIndex];
- int itemIndex = mvItem.ItemIndex;
- const CItem &item = db.Items[itemIndex];
- switch(propID)
- {
- case kpidPath:
- {
- UString unicodeName;
- if (item.IsNameUTF())
- ConvertUTF8ToUnicode(item.Name, unicodeName);
- else
- unicodeName = MultiByteToUnicodeString(item.Name, CP_ACP);
- prop = (const wchar_t *)NItemName::WinNameToOSName(unicodeName);
- break;
- }
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.Size; break;
- case kpidAttrib: prop = item.GetWinAttributes(); break;
-
- case kpidMTime:
- {
- FILETIME localFileTime, utcFileTime;
- if (NTime::DosTimeToFileTime(item.Time, localFileTime))
- {
- if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))
- utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
- }
- else
- utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
- prop = utcFileTime;
- break;
- }
-
- case kpidMethod:
- {
- UInt32 realFolderIndex = item.GetFolderIndex(db.Folders.Size());
- const CFolder &folder = db.Folders[realFolderIndex];
- int methodIndex = folder.GetCompressionMethod();
- AString method = (methodIndex < kNumMethods) ? kMethods[methodIndex] : kUnknownMethod;
- if (methodIndex == NHeader::NCompressionMethodMajor::kLZX ||
- methodIndex == NHeader::NCompressionMethodMajor::kQuantum)
- {
- method += ':';
- char temp[32];
- ConvertUInt64ToString(folder.CompressionTypeMinor, temp);
- method += temp;
- }
- prop = method;
- break;
- }
- case kpidBlock: prop = (Int32)m_Database.GetFolderIndex(&mvItem); break;
-
- #ifdef _CAB_DETAILS
-
- case kpidBlockReal: prop = (UInt32)item.FolderIndex; break;
- case kpidOffset: prop = (UInt32)item.Offset; break;
- case kpidVolume: prop = (UInt32)mvItem.VolumeIndex; break;
-
- #endif
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-/*
-class CProgressImp: public CProgressVirt
-{
- CMyComPtr<IArchiveOpenCallback> m_OpenArchiveCallback;
-public:
- STDMETHOD(SetTotal)(const UInt64 *numFiles);
- STDMETHOD(SetCompleted)(const UInt64 *numFiles);
- void Init(IArchiveOpenCallback *openArchiveCallback)
- { m_OpenArchiveCallback = openArchiveCallback; }
-};
-
-STDMETHODIMP CProgressImp::SetTotal(const UInt64 *numFiles)
-{
- if (m_OpenArchiveCallback)
- return m_OpenArchiveCallback->SetCompleted(numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CProgressImp::SetCompleted(const UInt64 *numFiles)
-{
- if (m_OpenArchiveCallback)
- return m_OpenArchiveCallback->SetCompleted(numFiles, NULL);
- return S_OK;
-}
-*/
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- Close();
- HRESULT res = S_FALSE;
- CInArchive archive;
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
- callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback);
-
- CMyComPtr<IInStream> nextStream = inStream;
- bool prevChecked = false;
- UInt64 numItems = 0;
- try
- {
- while (nextStream != 0)
- {
- CDatabaseEx db;
- db.Stream = nextStream;
- res = archive.Open(maxCheckStartPosition, db);
- if (res == S_OK)
- {
- if (!m_Database.Volumes.IsEmpty())
- {
- const CDatabaseEx &dbPrev = m_Database.Volumes[prevChecked ? m_Database.Volumes.Size() - 1 : 0];
- if (dbPrev.ArchiveInfo.SetID != db.ArchiveInfo.SetID ||
- dbPrev.ArchiveInfo.CabinetNumber + (prevChecked ? 1: - 1) !=
- db.ArchiveInfo.CabinetNumber)
- res = S_FALSE;
- }
- }
- if (res == S_OK)
- m_Database.Volumes.Insert(prevChecked ? m_Database.Volumes.Size() : 0, db);
- else if (res != S_FALSE)
- return res;
- else
- {
- if (m_Database.Volumes.IsEmpty())
- return S_FALSE;
- if (prevChecked)
- break;
- prevChecked = true;
- }
-
- numItems += db.Items.Size();
- RINOK(callback->SetCompleted(&numItems, NULL));
-
- nextStream = 0;
- for (;;)
- {
- const COtherArchive *otherArchive = 0;
- if (!prevChecked)
- {
- const CInArchiveInfo &ai = m_Database.Volumes.Front().ArchiveInfo;
- if (ai.IsTherePrev())
- otherArchive = &ai.PrevArc;
- else
- prevChecked = true;
- }
- if (otherArchive == 0)
- {
- const CInArchiveInfo &ai = m_Database.Volumes.Back().ArchiveInfo;
- if (ai.IsThereNext())
- otherArchive = &ai.NextArc;
- }
- if (!otherArchive)
- break;
- const UString fullName = MultiByteToUnicodeString(otherArchive->FileName, CP_ACP);
- if (!openVolumeCallback)
- break;
-
- HRESULT result = openVolumeCallback->GetStream(fullName, &nextStream);
- if (result == S_OK)
- break;
- if (result != S_FALSE)
- return result;
- if (prevChecked)
- break;
- prevChecked = true;
- }
- }
- if (res == S_OK)
- {
- m_Database.FillSortAndShrink();
- if (!m_Database.Check())
- res = S_FALSE;
- }
- }
- catch(...)
- {
- res = S_FALSE;
- }
- if (res != S_OK)
- {
- Close();
- return res;
- }
- COM_TRY_END
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- m_Database.Clear();
- return S_OK;
-}
-
-class CFolderOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-private:
- const CMvDatabaseEx *m_Database;
- const CRecordVector<bool> *m_ExtractStatuses;
-
- Byte *TempBuf;
- UInt32 TempBufSize;
- int NumIdenticalFiles;
- bool TempBufMode;
- UInt32 m_BufStartFolderOffset;
-
- int m_StartIndex;
- int m_CurrentIndex;
- CMyComPtr<IArchiveExtractCallback> m_ExtractCallback;
- bool m_TestMode;
-
- CMyComPtr<ISequentialOutStream> m_RealOutStream;
-
- bool m_IsOk;
- bool m_FileIsOpen;
- UInt32 m_RemainFileSize;
- UInt64 m_FolderSize;
- UInt64 m_PosInFolder;
-
- void FreeTempBuf()
- {
- ::MyFree(TempBuf);
- TempBuf = NULL;
- }
-
- HRESULT OpenFile();
- HRESULT CloseFileWithResOp(Int32 resOp);
- HRESULT CloseFile();
- HRESULT Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK);
-public:
- HRESULT WriteEmptyFiles();
-
- CFolderOutStream(): TempBuf(NULL) {}
- ~CFolderOutStream() { FreeTempBuf(); }
- void Init(
- const CMvDatabaseEx *database,
- const CRecordVector<bool> *extractStatuses,
- int startIndex,
- UInt64 folderSize,
- IArchiveExtractCallback *extractCallback,
- bool testMode);
- HRESULT FlushCorrupted();
- HRESULT Unsupported();
-
- UInt64 GetRemain() const { return m_FolderSize - m_PosInFolder; }
- UInt64 GetPosInFolder() const { return m_PosInFolder; }
-};
-
-void CFolderOutStream::Init(
- const CMvDatabaseEx *database,
- const CRecordVector<bool> *extractStatuses,
- int startIndex,
- UInt64 folderSize,
- IArchiveExtractCallback *extractCallback,
- bool testMode)
-{
- m_Database = database;
- m_ExtractStatuses = extractStatuses;
- m_StartIndex = startIndex;
- m_FolderSize = folderSize;
-
- m_ExtractCallback = extractCallback;
- m_TestMode = testMode;
-
- m_CurrentIndex = 0;
- m_PosInFolder = 0;
- m_FileIsOpen = false;
- m_IsOk = true;
- TempBufMode = false;
- NumIdenticalFiles = 0;
-}
-
-HRESULT CFolderOutStream::CloseFileWithResOp(Int32 resOp)
-{
- m_RealOutStream.Release();
- m_FileIsOpen = false;
- NumIdenticalFiles--;
- return m_ExtractCallback->SetOperationResult(resOp);
-}
-
-HRESULT CFolderOutStream::CloseFile()
-{
- return CloseFileWithResOp(m_IsOk ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError);
-}
-
-HRESULT CFolderOutStream::OpenFile()
-{
- if (NumIdenticalFiles == 0)
- {
- const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex];
- const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
- int numExtractItems = 0;
- int curIndex;
- for (curIndex = m_CurrentIndex; curIndex < m_ExtractStatuses->Size(); curIndex++)
- {
- const CMvItem &mvItem2 = m_Database->Items[m_StartIndex + curIndex];
- const CItem &item2 = m_Database->Volumes[mvItem2.VolumeIndex].Items[mvItem2.ItemIndex];
- if (item.Offset != item2.Offset ||
- item.Size != item2.Size ||
- item.Size == 0)
- break;
- if (!m_TestMode && (*m_ExtractStatuses)[curIndex])
- numExtractItems++;
- }
- NumIdenticalFiles = (curIndex - m_CurrentIndex);
- if (NumIdenticalFiles == 0)
- NumIdenticalFiles = 1;
- TempBufMode = false;
- if (numExtractItems > 1)
- {
- if (!TempBuf || item.Size > TempBufSize)
- {
- FreeTempBuf();
- TempBuf = (Byte *)MyAlloc(item.Size);
- TempBufSize = item.Size;
- if (TempBuf == NULL)
- return E_OUTOFMEMORY;
- }
- TempBufMode = true;
- m_BufStartFolderOffset = item.Offset;
- }
- else if (numExtractItems == 1)
- {
- while (NumIdenticalFiles && !(*m_ExtractStatuses)[m_CurrentIndex])
- {
- CMyComPtr<ISequentialOutStream> stream;
- RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &stream, NExtract::NAskMode::kSkip));
- if (stream)
- return E_FAIL;
- RINOK(m_ExtractCallback->PrepareOperation(NExtract::NAskMode::kSkip));
- m_CurrentIndex++;
- m_FileIsOpen = true;
- CloseFile();
- }
- }
- }
-
- Int32 askMode = (*m_ExtractStatuses)[m_CurrentIndex] ? (m_TestMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract) :
- NExtract::NAskMode::kSkip;
- RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &m_RealOutStream, askMode));
- if (!m_RealOutStream && !m_TestMode)
- askMode = NExtract::NAskMode::kSkip;
- return m_ExtractCallback->PrepareOperation(askMode);
-}
-
-HRESULT CFolderOutStream::WriteEmptyFiles()
-{
- if (m_FileIsOpen)
- return S_OK;
- for (; m_CurrentIndex < m_ExtractStatuses->Size(); m_CurrentIndex++)
- {
- const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex];
- const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
- UInt64 fileSize = item.Size;
- if (fileSize != 0)
- return S_OK;
- HRESULT result = OpenFile();
- m_RealOutStream.Release();
- RINOK(result);
- RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- return S_OK;
-}
-
-// This is Write function
-HRESULT CFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK)
-{
- COM_TRY_BEGIN
- UInt32 realProcessed = 0;
- if (processedSize != NULL)
- *processedSize = 0;
- while (size != 0)
- {
- if (m_FileIsOpen)
- {
- UInt32 numBytesToWrite = MyMin(m_RemainFileSize, size);
- HRESULT res = S_OK;
- if (numBytesToWrite > 0)
- {
- if (!isOK)
- m_IsOk = false;
- if (m_RealOutStream)
- {
- UInt32 processedSizeLocal = 0;
- res = m_RealOutStream->Write((const Byte *)data, numBytesToWrite, &processedSizeLocal);
- numBytesToWrite = processedSizeLocal;
- }
- if (TempBufMode && TempBuf)
- memcpy(TempBuf + (m_PosInFolder - m_BufStartFolderOffset), data, numBytesToWrite);
- }
- realProcessed += numBytesToWrite;
- if (processedSize != NULL)
- *processedSize = realProcessed;
- data = (const void *)((const Byte *)data + numBytesToWrite);
- size -= numBytesToWrite;
- m_RemainFileSize -= numBytesToWrite;
- m_PosInFolder += numBytesToWrite;
- if (res != S_OK)
- return res;
- if (m_RemainFileSize == 0)
- {
- RINOK(CloseFile());
-
- while (NumIdenticalFiles)
- {
- HRESULT result = OpenFile();
- m_FileIsOpen = true;
- m_CurrentIndex++;
- if (result == S_OK && m_RealOutStream && TempBuf)
- result = WriteStream(m_RealOutStream, TempBuf, (size_t)(m_PosInFolder - m_BufStartFolderOffset));
-
- if (!TempBuf && TempBufMode && m_RealOutStream)
- {
- RINOK(CloseFileWithResOp(NExtract::NOperationResult::kUnSupportedMethod));
- }
- else
- {
- RINOK(CloseFile());
- }
- RINOK(result);
- }
- TempBufMode = false;
- }
- if (realProcessed > 0)
- break; // with this break this function works as Write-Part
- }
- else
- {
- if (m_CurrentIndex >= m_ExtractStatuses->Size())
- return E_FAIL;
-
- const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex];
- const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
-
- m_RemainFileSize = item.Size;
-
- UInt32 fileOffset = item.Offset;
- if (fileOffset < m_PosInFolder)
- return E_FAIL;
- if (fileOffset > m_PosInFolder)
- {
- UInt32 numBytesToWrite = MyMin(fileOffset - (UInt32)m_PosInFolder, size);
- realProcessed += numBytesToWrite;
- if (processedSize != NULL)
- *processedSize = realProcessed;
- data = (const void *)((const Byte *)data + numBytesToWrite);
- size -= numBytesToWrite;
- m_PosInFolder += numBytesToWrite;
- }
- if (fileOffset == m_PosInFolder)
- {
- RINOK(OpenFile());
- m_FileIsOpen = true;
- m_CurrentIndex++;
- m_IsOk = true;
- }
- }
- }
- return WriteEmptyFiles();
- COM_TRY_END
-}
-
-STDMETHODIMP CFolderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- return Write2(data, size, processedSize, true);
-}
-
-HRESULT CFolderOutStream::FlushCorrupted()
-{
- const UInt32 kBufferSize = (1 << 10);
- Byte buffer[kBufferSize];
- for (int i = 0; i < kBufferSize; i++)
- buffer[i] = 0;
- for (;;)
- {
- UInt64 remain = GetRemain();
- if (remain == 0)
- return S_OK;
- UInt32 size = (UInt32)MyMin(remain, (UInt64)kBufferSize);
- UInt32 processedSizeLocal = 0;
- RINOK(Write2(buffer, size, &processedSizeLocal, false));
- }
-}
-
-HRESULT CFolderOutStream::Unsupported()
-{
- while(m_CurrentIndex < m_ExtractStatuses->Size())
- {
- HRESULT result = OpenFile();
- if (result != S_FALSE && result != S_OK)
- return result;
- m_RealOutStream.Release();
- RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- m_CurrentIndex++;
- }
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testModeSpec, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = m_Database.Items.Size();
- if(numItems == 0)
- return S_OK;
- bool testMode = (testModeSpec != 0);
- UInt64 totalUnPacked = 0;
-
- UInt32 i;
- int lastFolder = -2;
- UInt64 lastFolderSize = 0;
- for(i = 0; i < numItems; i++)
- {
- int index = allFilesMode ? i : indices[i];
- const CMvItem &mvItem = m_Database.Items[index];
- const CItem &item = m_Database.Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
- if (item.IsDir())
- continue;
- int folderIndex = m_Database.GetFolderIndex(&mvItem);
- if (folderIndex != lastFolder)
- totalUnPacked += lastFolderSize;
- lastFolder = folderIndex;
- lastFolderSize = item.GetEndOffset();
- }
- totalUnPacked += lastFolderSize;
-
- extractCallback->SetTotal(totalUnPacked);
-
- totalUnPacked = 0;
-
- UInt64 totalPacked = 0;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- NCompress::NDeflate::NDecoder::CCOMCoder *deflateDecoderSpec = NULL;
- CMyComPtr<ICompressCoder> deflateDecoder;
-
- NCompress::NLzx::CDecoder *lzxDecoderSpec = NULL;
- CMyComPtr<ICompressCoder> lzxDecoder;
-
- NCompress::NQuantum::CDecoder *quantumDecoderSpec = NULL;
- CMyComPtr<ICompressCoder> quantumDecoder;
-
- CCabBlockInStream *cabBlockInStreamSpec = new CCabBlockInStream();
- CMyComPtr<ISequentialInStream> cabBlockInStream = cabBlockInStreamSpec;
- if (!cabBlockInStreamSpec->Create())
- return E_OUTOFMEMORY;
-
- CRecordVector<bool> extractStatuses;
- for(i = 0; i < numItems;)
- {
- int index = allFilesMode ? i : indices[i];
-
- const CMvItem &mvItem = m_Database.Items[index];
- const CDatabaseEx &db = m_Database.Volumes[mvItem.VolumeIndex];
- int itemIndex = mvItem.ItemIndex;
- const CItem &item = db.Items[itemIndex];
-
- i++;
- if (item.IsDir())
- {
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- int folderIndex = m_Database.GetFolderIndex(&mvItem);
- if (folderIndex < 0)
- {
- // If we need previous archive
- Int32 askMode= testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kDataError));
- continue;
- }
- int startIndex2 = m_Database.FolderStartFileIndex[folderIndex];
- int startIndex = startIndex2;
- extractStatuses.Clear();
- for (; startIndex < index; startIndex++)
- extractStatuses.Add(false);
- extractStatuses.Add(true);
- startIndex++;
- UInt64 curUnpack = item.GetEndOffset();
- for(;i < numItems; i++)
- {
- int indexNext = allFilesMode ? i : indices[i];
- const CMvItem &mvItem = m_Database.Items[indexNext];
- const CItem &item = m_Database.Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
- if (item.IsDir())
- continue;
- int newFolderIndex = m_Database.GetFolderIndex(&mvItem);
-
- if (newFolderIndex != folderIndex)
- break;
- for (; startIndex < indexNext; startIndex++)
- extractStatuses.Add(false);
- extractStatuses.Add(true);
- startIndex++;
- curUnpack = item.GetEndOffset();
- }
-
- lps->OutSize = totalUnPacked;
- lps->InSize = totalPacked;
- RINOK(lps->SetCur());
-
- CFolderOutStream *cabFolderOutStream = new CFolderOutStream;
- CMyComPtr<ISequentialOutStream> outStream(cabFolderOutStream);
-
- const CFolder &folder = db.Folders[item.GetFolderIndex(db.Folders.Size())];
-
- cabFolderOutStream->Init(&m_Database, &extractStatuses, startIndex2,
- curUnpack, extractCallback, testMode);
-
- cabBlockInStreamSpec->MsZip = false;
- switch(folder.GetCompressionMethod())
- {
- case NHeader::NCompressionMethodMajor::kNone:
- break;
- case NHeader::NCompressionMethodMajor::kMSZip:
- if(deflateDecoderSpec == NULL)
- {
- deflateDecoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder;
- deflateDecoder = deflateDecoderSpec;
- }
- cabBlockInStreamSpec->MsZip = true;
- break;
- case NHeader::NCompressionMethodMajor::kLZX:
- if(lzxDecoderSpec == NULL)
- {
- lzxDecoderSpec = new NCompress::NLzx::CDecoder;
- lzxDecoder = lzxDecoderSpec;
- }
- RINOK(lzxDecoderSpec->SetParams(folder.CompressionTypeMinor));
- break;
- case NHeader::NCompressionMethodMajor::kQuantum:
- if(quantumDecoderSpec == NULL)
- {
- quantumDecoderSpec = new NCompress::NQuantum::CDecoder;
- quantumDecoder = quantumDecoderSpec;
- }
- quantumDecoderSpec->SetParams(folder.CompressionTypeMinor);
- break;
- default:
- {
- RINOK(cabFolderOutStream->Unsupported());
- totalUnPacked += curUnpack;
- continue;
- }
- }
-
- cabBlockInStreamSpec->InitForNewFolder();
-
- HRESULT res = S_OK;
-
- {
- int volIndex = mvItem.VolumeIndex;
- int locFolderIndex = item.GetFolderIndex(db.Folders.Size());
- bool keepHistory = false;
- bool keepInputBuffer = false;
- for (UInt32 f = 0; cabFolderOutStream->GetRemain() != 0;)
- {
- if (volIndex >= m_Database.Volumes.Size())
- {
- res = S_FALSE;
- break;
- }
-
- const CDatabaseEx &db = m_Database.Volumes[volIndex];
- const CFolder &folder = db.Folders[locFolderIndex];
- if (f == 0)
- {
- cabBlockInStreamSpec->SetStream(db.Stream);
- cabBlockInStreamSpec->ReservedSize = db.ArchiveInfo.GetDataBlockReserveSize();
- RINOK(db.Stream->Seek(db.StartPosition + folder.DataStart, STREAM_SEEK_SET, NULL));
- }
- if (f == folder.NumDataBlocks)
- {
- volIndex++;
- locFolderIndex = 0;
- f = 0;
- continue;
- }
- f++;
-
- cabBlockInStreamSpec->DataError = false;
-
- if (!keepInputBuffer)
- cabBlockInStreamSpec->InitForNewBlock();
-
- UInt32 packSize, unpackSize;
- res = cabBlockInStreamSpec->PreRead(packSize, unpackSize);
- if (res == S_FALSE)
- break;
- RINOK(res);
- keepInputBuffer = (unpackSize == 0);
- if (keepInputBuffer)
- continue;
-
- UInt64 totalUnPacked2 = totalUnPacked + cabFolderOutStream->GetPosInFolder();
- totalPacked += packSize;
-
- lps->OutSize = totalUnPacked2;
- lps->InSize = totalPacked;
- RINOK(lps->SetCur());
-
- UInt64 unpackRemain = cabFolderOutStream->GetRemain();
-
- const UInt32 kBlockSizeMax = (1 << 15);
- if (unpackRemain > kBlockSizeMax)
- unpackRemain = kBlockSizeMax;
- if (unpackRemain > unpackSize)
- unpackRemain = unpackSize;
-
- switch(folder.GetCompressionMethod())
- {
- case NHeader::NCompressionMethodMajor::kNone:
- res = copyCoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);
- break;
- case NHeader::NCompressionMethodMajor::kMSZip:
- deflateDecoderSpec->SetKeepHistory(keepHistory);
- res = deflateDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);
- break;
- case NHeader::NCompressionMethodMajor::kLZX:
- lzxDecoderSpec->SetKeepHistory(keepHistory);
- res = lzxDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);
- break;
- case NHeader::NCompressionMethodMajor::kQuantum:
- quantumDecoderSpec->SetKeepHistory(keepHistory);
- res = quantumDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL);
- break;
- }
- if (res != S_OK)
- {
- if (res != S_FALSE)
- RINOK(res);
- break;
- }
- keepHistory = true;
- }
- if (res == S_OK)
- {
- RINOK(cabFolderOutStream->WriteEmptyFiles());
- }
- }
- if (res != S_OK || cabFolderOutStream->GetRemain() != 0)
- {
- RINOK(cabFolderOutStream->FlushCorrupted());
- }
- totalUnPacked += curUnpack;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = m_Database.Items.Size();
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.h
deleted file mode 100644
index 1edcd11e2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// CabHandler.h
-
-#ifndef __CAB_HANDLER_H
-#define __CAB_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-#include "CabIn.h"
-
-namespace NArchive {
-namespace NCab {
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP1(IInArchive)
-
- INTERFACE_IInArchive(;)
-
-private:
- CMvDatabaseEx m_Database;
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.cpp
deleted file mode 100644
index 0cba1b0b7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// CabHeader.cpp
-
-#include "StdAfx.h"
-
-#include "CabHeader.h"
-
-namespace NArchive {
-namespace NCab {
-namespace NHeader {
-
-Byte kMarker[kMarkerSize] = {'M', 'S', 'C', 'F', 0, 0, 0, 0 };
-
-// struct CSignatureInitializer { CSignatureInitializer() { kMarker[0]--; }; } g_SignatureInitializer;
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.h
deleted file mode 100644
index 0f0d2af35..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Archive/Cab/Header.h
-
-#ifndef __ARCHIVE_CAB_HEADER_H
-#define __ARCHIVE_CAB_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NCab {
-namespace NHeader {
-
-const unsigned kMarkerSize = 8;
-extern Byte kMarker[kMarkerSize];
-
-namespace NArchive
-{
- namespace NFlags
- {
- const int kPrevCabinet = 0x0001;
- const int kNextCabinet = 0x0002;
- const int kReservePresent = 0x0004;
- }
-}
-
-namespace NCompressionMethodMajor
-{
- const Byte kNone = 0;
- const Byte kMSZip = 1;
- const Byte kQuantum = 2;
- const Byte kLZX = 3;
-}
-
-const int kFileNameIsUTFAttributeMask = 0x80;
-
-namespace NFolderIndex
-{
- const int kContinuedFromPrev = 0xFFFD;
- const int kContinuedToNext = 0xFFFE;
- const int kContinuedPrevAndNext = 0xFFFF;
-}
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.cpp
deleted file mode 100644
index c0bffa2d2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.cpp
+++ /dev/null
@@ -1,272 +0,0 @@
-// Archive/CabIn.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/FindSignature.h"
-
-#include "CabIn.h"
-
-namespace NArchive {
-namespace NCab {
-
-Byte CInArchive::Read8()
-{
- Byte b;
- if (!inBuffer.ReadByte(b))
- throw CInArchiveException(CInArchiveException::kUnsupported);
- return b;
-}
-
-UInt16 CInArchive::Read16()
-{
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- {
- Byte b = Read8();
- value |= (UInt16(b) << (8 * i));
- }
- return value;
-}
-
-UInt32 CInArchive::Read32()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- {
- Byte b = Read8();
- value |= (UInt32(b) << (8 * i));
- }
- return value;
-}
-
-AString CInArchive::SafeReadName()
-{
- AString name;
- for (;;)
- {
- Byte b = Read8();
- if (b == 0)
- return name;
- name += (char)b;
- }
-}
-
-void CInArchive::ReadOtherArchive(COtherArchive &oa)
-{
- oa.FileName = SafeReadName();
- oa.DiskName = SafeReadName();
-}
-
-void CInArchive::Skip(UInt32 size)
-{
- while (size-- != 0)
- Read8();
-}
-
-HRESULT CInArchive::Open(const UInt64 *searchHeaderSizeLimit, CDatabaseEx &db)
-{
- IInStream *stream = db.Stream;
- db.Clear();
- RINOK(stream->Seek(0, STREAM_SEEK_SET, &db.StartPosition));
-
- RINOK(FindSignatureInStream(stream, NHeader::kMarker, NHeader::kMarkerSize,
- searchHeaderSizeLimit, db.StartPosition));
-
- RINOK(stream->Seek(db.StartPosition + NHeader::kMarkerSize, STREAM_SEEK_SET, NULL));
- if (!inBuffer.Create(1 << 17))
- return E_OUTOFMEMORY;
- inBuffer.SetStream(stream);
- inBuffer.Init();
-
- CInArchiveInfo &ai = db.ArchiveInfo;
-
- ai.Size = Read32();
- if (Read32() != 0)
- return S_FALSE;
- ai.FileHeadersOffset = Read32();
- if (Read32() != 0)
- return S_FALSE;
-
- ai.VersionMinor = Read8();
- ai.VersionMajor = Read8();
- ai.NumFolders = Read16();
- ai.NumFiles = Read16();
- ai.Flags = Read16();
- if (ai.Flags > 7)
- return S_FALSE;
- ai.SetID = Read16();
- ai.CabinetNumber = Read16();
-
- if (ai.ReserveBlockPresent())
- {
- ai.PerCabinetAreaSize = Read16();
- ai.PerFolderAreaSize = Read8();
- ai.PerDataBlockAreaSize = Read8();
-
- Skip(ai.PerCabinetAreaSize);
- }
-
- {
- if (ai.IsTherePrev())
- ReadOtherArchive(ai.PrevArc);
- if (ai.IsThereNext())
- ReadOtherArchive(ai.NextArc);
- }
-
- int i;
- for (i = 0; i < ai.NumFolders; i++)
- {
- CFolder folder;
-
- folder.DataStart = Read32();
- folder.NumDataBlocks = Read16();
- folder.CompressionTypeMajor = Read8();
- folder.CompressionTypeMinor = Read8();
-
- Skip(ai.PerFolderAreaSize);
- db.Folders.Add(folder);
- }
-
- RINOK(stream->Seek(db.StartPosition + ai.FileHeadersOffset, STREAM_SEEK_SET, NULL));
-
- inBuffer.SetStream(stream);
- inBuffer.Init();
- for (i = 0; i < ai.NumFiles; i++)
- {
- CItem item;
- item.Size = Read32();
- item.Offset = Read32();
- item.FolderIndex = Read16();
- UInt16 pureDate = Read16();
- UInt16 pureTime = Read16();
- item.Time = ((UInt32(pureDate) << 16)) | pureTime;
- item.Attributes = Read16();
- item.Name = SafeReadName();
- int folderIndex = item.GetFolderIndex(db.Folders.Size());
- if (folderIndex >= db.Folders.Size())
- return S_FALSE;
- db.Items.Add(item);
- }
- return S_OK;
-}
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareMvItems(const CMvItem *p1, const CMvItem *p2, void *param)
-{
- const CMvDatabaseEx &mvDb = *(const CMvDatabaseEx *)param;
- const CDatabaseEx &db1 = mvDb.Volumes[p1->VolumeIndex];
- const CDatabaseEx &db2 = mvDb.Volumes[p2->VolumeIndex];
- const CItem &item1 = db1.Items[p1->ItemIndex];
- const CItem &item2 = db2.Items[p2->ItemIndex];;
- bool isDir1 = item1.IsDir();
- bool isDir2 = item2.IsDir();
- if (isDir1 && !isDir2)
- return -1;
- if (isDir2 && !isDir1)
- return 1;
- int f1 = mvDb.GetFolderIndex(p1);
- int f2 = mvDb.GetFolderIndex(p2);
- RINOZ(MyCompare(f1, f2));
- RINOZ(MyCompare(item1.Offset, item2.Offset));
- RINOZ(MyCompare(item1.Size, item2.Size));
- RINOZ(MyCompare(p1->VolumeIndex, p2->VolumeIndex));
- return MyCompare(p1->ItemIndex, p2->ItemIndex);
-}
-
-bool CMvDatabaseEx::AreItemsEqual(int i1, int i2)
-{
- const CMvItem *p1 = &Items[i1];
- const CMvItem *p2 = &Items[i2];
- const CDatabaseEx &db1 = Volumes[p1->VolumeIndex];
- const CDatabaseEx &db2 = Volumes[p2->VolumeIndex];
- const CItem &item1 = db1.Items[p1->ItemIndex];
- const CItem &item2 = db2.Items[p2->ItemIndex];;
- return GetFolderIndex(p1) == GetFolderIndex(p2) &&
- item1.Offset == item2.Offset &&
- item1.Size == item2.Size &&
- item1.Name == item2.Name;
-}
-
-void CMvDatabaseEx::FillSortAndShrink()
-{
- Items.Clear();
- StartFolderOfVol.Clear();
- FolderStartFileIndex.Clear();
- int offset = 0;
- for (int v = 0; v < Volumes.Size(); v++)
- {
- const CDatabaseEx &db = Volumes[v];
- int curOffset = offset;
- if (db.IsTherePrevFolder())
- curOffset--;
- StartFolderOfVol.Add(curOffset);
- offset += db.GetNumberOfNewFolders();
-
- CMvItem mvItem;
- mvItem.VolumeIndex = v;
- for (int i = 0 ; i < db.Items.Size(); i++)
- {
- mvItem.ItemIndex = i;
- Items.Add(mvItem);
- }
- }
-
- Items.Sort(CompareMvItems, (void *)this);
- int j = 1;
- int i;
- for (i = 1; i < Items.Size(); i++)
- if (!AreItemsEqual(i, i -1))
- Items[j++] = Items[i];
- Items.DeleteFrom(j);
-
- for (i = 0; i < Items.Size(); i++)
- {
- int folderIndex = GetFolderIndex(&Items[i]);
- if (folderIndex >= FolderStartFileIndex.Size())
- FolderStartFileIndex.Add(i);
- }
-}
-
-bool CMvDatabaseEx::Check()
-{
- for (int v = 1; v < Volumes.Size(); v++)
- {
- const CDatabaseEx &db1 = Volumes[v];
- if (db1.IsTherePrevFolder())
- {
- const CDatabaseEx &db0 = Volumes[v - 1];
- if (db0.Folders.IsEmpty() || db1.Folders.IsEmpty())
- return false;
- const CFolder &f0 = db0.Folders.Back();
- const CFolder &f1 = db1.Folders.Front();
- if (f0.CompressionTypeMajor != f1.CompressionTypeMajor ||
- f0.CompressionTypeMinor != f1.CompressionTypeMinor)
- return false;
- }
- }
- UInt32 beginPos = 0;
- UInt64 endPos = 0;
- int prevFolder = -2;
- for (int i = 0; i < Items.Size(); i++)
- {
- const CMvItem &mvItem = Items[i];
- int fIndex = GetFolderIndex(&mvItem);
- if (fIndex >= FolderStartFileIndex.Size())
- return false;
- const CItem &item = Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex];
- if (item.IsDir())
- continue;
- int folderIndex = GetFolderIndex(&mvItem);
- if (folderIndex != prevFolder)
- prevFolder = folderIndex;
- else if (item.Offset < endPos &&
- (item.Offset != beginPos || item.GetEndOffset() != endPos))
- return false;
- beginPos = item.Offset;
- endPos = item.GetEndOffset();
- }
- return true;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.h
deleted file mode 100644
index 1e9b188b5..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.h
+++ /dev/null
@@ -1,161 +0,0 @@
-// Archive/CabIn.h
-
-#ifndef __ARCHIVE_CAB_IN_H
-#define __ARCHIVE_CAB_IN_H
-
-#include "../../IStream.h"
-#include "../../Common/InBuffer.h"
-#include "CabHeader.h"
-#include "CabItem.h"
-
-namespace NArchive {
-namespace NCab {
-
-class CInArchiveException
-{
-public:
- enum CCauseType
- {
- kUnexpectedEndOfArchive = 0,
- kIncorrectArchive,
- kUnsupported
- } Cause;
- CInArchiveException(CCauseType cause) : Cause(cause) {}
-};
-
-struct COtherArchive
-{
- AString FileName;
- AString DiskName;
-};
-
-struct CArchiveInfo
-{
- Byte VersionMinor; /* cabinet file format version, minor */
- Byte VersionMajor; /* cabinet file format version, major */
- UInt16 NumFolders; /* number of CFFOLDER entries in this cabinet */
- UInt16 NumFiles; /* number of CFFILE entries in this cabinet */
- UInt16 Flags; /* cabinet file option indicators */
- UInt16 SetID; /* must be the same for all cabinets in a set */
- UInt16 CabinetNumber; /* number of this cabinet file in a set */
-
- bool ReserveBlockPresent() const { return (Flags & NHeader::NArchive::NFlags::kReservePresent) != 0; }
-
- bool IsTherePrev() const { return (Flags & NHeader::NArchive::NFlags::kPrevCabinet) != 0; }
- bool IsThereNext() const { return (Flags & NHeader::NArchive::NFlags::kNextCabinet) != 0; }
-
- UInt16 PerCabinetAreaSize; // (optional) size of per-cabinet reserved area
- Byte PerFolderAreaSize; // (optional) size of per-folder reserved area
- Byte PerDataBlockAreaSize; // (optional) size of per-datablock reserved area
-
- Byte GetDataBlockReserveSize() const { return (Byte)(ReserveBlockPresent() ? PerDataBlockAreaSize : 0); }
-
- COtherArchive PrevArc;
- COtherArchive NextArc;
-
- CArchiveInfo()
- {
- Clear();
- }
-
- void Clear()
- {
- PerCabinetAreaSize = 0;
- PerFolderAreaSize = 0;
- PerDataBlockAreaSize = 0;
- }
-};
-
-struct CInArchiveInfo: public CArchiveInfo
-{
- UInt32 Size; /* size of this cabinet file in bytes */
- UInt32 FileHeadersOffset; // offset of the first CFFILE entry
-};
-
-
-struct CDatabase
-{
- UInt64 StartPosition;
- CInArchiveInfo ArchiveInfo;
- CObjectVector<CFolder> Folders;
- CObjectVector<CItem> Items;
-
- void Clear()
- {
- ArchiveInfo.Clear();
- Folders.Clear();
- Items.Clear();
- }
- bool IsTherePrevFolder() const
- {
- for (int i = 0; i < Items.Size(); i++)
- if (Items[i].ContinuedFromPrev())
- return true;
- return false;
- }
- int GetNumberOfNewFolders() const
- {
- int res = Folders.Size();
- if (IsTherePrevFolder())
- res--;
- return res;
- }
- UInt32 GetFileOffset(int index) const { return Items[index].Offset; }
- UInt32 GetFileSize(int index) const { return Items[index].Size; }
-};
-
-struct CDatabaseEx: public CDatabase
-{
- CMyComPtr<IInStream> Stream;
-};
-
-struct CMvItem
-{
- int VolumeIndex;
- int ItemIndex;
-};
-
-class CMvDatabaseEx
-{
- bool AreItemsEqual(int i1, int i2);
-public:
- CObjectVector<CDatabaseEx> Volumes;
- CRecordVector<CMvItem> Items;
- CRecordVector<int> StartFolderOfVol;
- CRecordVector<int> FolderStartFileIndex;
-
- int GetFolderIndex(const CMvItem *mvi) const
- {
- const CDatabaseEx &db = Volumes[mvi->VolumeIndex];
- return StartFolderOfVol[mvi->VolumeIndex] +
- db.Items[mvi->ItemIndex].GetFolderIndex(db.Folders.Size());
- }
- void Clear()
- {
- Volumes.Clear();
- Items.Clear();
- StartFolderOfVol.Clear();
- FolderStartFileIndex.Clear();
- }
- void FillSortAndShrink();
- bool Check();
-};
-
-class CInArchive
-{
- CInBuffer inBuffer;
-
- Byte Read8();
- UInt16 Read16();
- UInt32 Read32();
- AString SafeReadName();
- void Skip(UInt32 size);
- void ReadOtherArchive(COtherArchive &oa);
-
-public:
- HRESULT Open(const UInt64 *searchHeaderSizeLimit, CDatabaseEx &db);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabItem.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabItem.h
deleted file mode 100644
index 63a1e856c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabItem.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Archive/CabItem.h
-
-#ifndef __ARCHIVE_CAB_ITEM_H
-#define __ARCHIVE_CAB_ITEM_H
-
-#include "Common/Types.h"
-#include "Common/MyString.h"
-#include "CabHeader.h"
-
-namespace NArchive {
-namespace NCab {
-
-struct CFolder
-{
- UInt32 DataStart; // offset of the first CFDATA block in this folder
- UInt16 NumDataBlocks; // number of CFDATA blocks in this folder
- Byte CompressionTypeMajor;
- Byte CompressionTypeMinor;
- Byte GetCompressionMethod() const { return (Byte)(CompressionTypeMajor & 0xF); }
-};
-
-struct CItem
-{
- AString Name;
- UInt32 Offset;
- UInt32 Size;
- UInt32 Time;
- UInt16 FolderIndex;
- UInt16 Flags;
- UInt16 Attributes;
-
- UInt64 GetEndOffset() const { return (UInt64)Offset + Size; }
- UInt32 GetWinAttributes() const { return (Attributes & ~NHeader::kFileNameIsUTFAttributeMask); }
- bool IsNameUTF() const { return (Attributes & NHeader::kFileNameIsUTFAttributeMask) != 0; }
- bool IsDir() const { return (Attributes & FILE_ATTRIBUTE_DIRECTORY) != 0; }
-
- bool ContinuedFromPrev() const
- {
- return
- (FolderIndex == NHeader::NFolderIndex::kContinuedFromPrev) ||
- (FolderIndex == NHeader::NFolderIndex::kContinuedPrevAndNext);
- }
-
- bool ContinuedToNext() const
- {
- return
- (FolderIndex == NHeader::NFolderIndex::kContinuedToNext) ||
- (FolderIndex == NHeader::NFolderIndex::kContinuedPrevAndNext);
- }
-
- int GetFolderIndex(int numFolders) const
- {
- if (ContinuedFromPrev())
- return 0;
- if (ContinuedToNext())
- return (numFolders - 1);
- return FolderIndex;
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabRegister.cpp
deleted file mode 100644
index 15fe4099f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// CabRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "CabHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NCab::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Cab", L"cab", 0, 8, { 0x4D, 0x53, 0x43, 0x46 }, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Cab)
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/StdAfx.h
deleted file mode 100644
index e7fb6986d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/MyWindows.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHandler.cpp
deleted file mode 100644
index a9e334b03..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHandler.cpp
+++ /dev/null
@@ -1,721 +0,0 @@
-// ChmHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/Defs.h"
-#include "Common/StringConvert.h"
-#include "Common/UTFConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-#include "../../Compress/LzxDecoder.h"
-
-#include "../Common/ItemNameUtils.h"
-
-#include "ChmHandler.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-namespace NArchive {
-namespace NChm {
-
-// #define _CHM_DETAILS
-
-#ifdef _CHM_DETAILS
-
-enum
-{
- kpidSection = kpidUserDefined
-};
-
-#endif
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidBlock, VT_UI4}
-
- #ifdef _CHM_DETAILS
- ,
- { L"Section", kpidSection, VT_UI4},
- { NULL, kpidOffset, VT_UI4}
- #endif
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidNumBlocks, VT_UI8}
-};
-
-IMP_IInArchive_Props
-
-IMP_IInArchive_ArcProps_NO
-/*
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidNumBlocks:
- {
- UInt64 numBlocks = 0;
- for (int i = 0; i < m_Database.Sections.Size(); i++)
- {
- const CSectionInfo &s = m_Database.Sections[i];
- for (int j = 0; j < s.Methods.Size(); j++)
- {
- const CMethodInfo &m = s.Methods[j];
- if (m.IsLzx())
- numBlocks += m.LzxInfo.ResetTable.GetNumBlocks();
- }
- }
- prop = numBlocks;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-*/
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- if (m_Database.NewFormat)
- {
- switch(propID)
- {
- case kpidSize:
- prop = (UInt64)m_Database.NewFormatString.Length();
- break;
- }
- prop.Detach(value);
- return S_OK;
- }
- int entryIndex;
- if (m_Database.LowLevel)
- entryIndex = index;
- else
- entryIndex = m_Database.Indices[index];
- const CItem &item = m_Database.Items[entryIndex];
- switch(propID)
- {
- case kpidPath:
- {
- UString us;
- if (ConvertUTF8ToUnicode(item.Name, us))
- {
- if (!m_Database.LowLevel)
- {
- if (us.Length() > 1)
- if (us[0] == L'/')
- us.Delete(0);
- }
- prop = NItemName::GetOSName2(us);
- }
- break;
- }
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.Size; break;
- case kpidMethod:
- {
- if (!item.IsDir())
- if (item.Section == 0)
- prop = L"Copy";
- else if (item.Section < m_Database.Sections.Size())
- prop = m_Database.Sections[(int)item.Section].GetMethodName();
- break;
- }
- case kpidBlock:
- if (m_Database.LowLevel)
- prop = item.Section;
- else if (item.Section != 0)
- prop = m_Database.GetFolder(index);
- break;
-
- #ifdef _CHM_DETAILS
-
- case kpidSection: prop = (UInt32)item.Section; break;
- case kpidOffset: prop = (UInt32)item.Offset; break;
-
- #endif
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CProgressImp: public CProgressVirt
-{
- CMyComPtr<IArchiveOpenCallback> _callback;
-public:
- STDMETHOD(SetTotal)(const UInt64 *numFiles);
- STDMETHOD(SetCompleted)(const UInt64 *numFiles);
- CProgressImp(IArchiveOpenCallback *callback): _callback(callback) {};
-};
-
-STDMETHODIMP CProgressImp::SetTotal(const UInt64 *numFiles)
-{
- if (_callback)
- return _callback->SetCompleted(numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CProgressImp::SetCompleted(const UInt64 *numFiles)
-{
- if (_callback)
- return _callback->SetCompleted(numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- m_Stream.Release();
- try
- {
- CInArchive archive;
- // CProgressImp progressImp(openArchiveCallback);
- RINOK(archive.Open(inStream, maxCheckStartPosition, m_Database));
- /*
- if (m_Database.LowLevel)
- return S_FALSE;
- */
- m_Stream = inStream;
- }
- catch(...)
- {
- return S_FALSE;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- m_Database.Clear();
- m_Stream.Release();
- return S_OK;
-}
-
-class CChmFolderOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
-
- HRESULT Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK);
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-
- UInt64 m_FolderSize;
- UInt64 m_PosInFolder;
- UInt64 m_PosInSection;
- const CRecordVector<bool> *m_ExtractStatuses;
- int m_StartIndex;
- int m_CurrentIndex;
- int m_NumFiles;
-
-private:
- const CFilesDatabase *m_Database;
- CMyComPtr<IArchiveExtractCallback> m_ExtractCallback;
- bool m_TestMode;
-
- bool m_IsOk;
- bool m_FileIsOpen;
- UInt64 m_RemainFileSize;
- CMyComPtr<ISequentialOutStream> m_RealOutStream;
-
- HRESULT OpenFile();
- HRESULT WriteEmptyFiles();
-public:
- void Init(
- const CFilesDatabase *database,
- IArchiveExtractCallback *extractCallback,
- bool testMode);
- HRESULT FlushCorrupted(UInt64 maxSize);
-};
-
-void CChmFolderOutStream::Init(
- const CFilesDatabase *database,
- IArchiveExtractCallback *extractCallback,
- bool testMode)
-{
- m_Database = database;
- m_ExtractCallback = extractCallback;
- m_TestMode = testMode;
-
- m_CurrentIndex = 0;
- m_FileIsOpen = false;
-}
-
-HRESULT CChmFolderOutStream::OpenFile()
-{
- Int32 askMode = (*m_ExtractStatuses)[m_CurrentIndex] ? (m_TestMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract) :
- NExtract::NAskMode::kSkip;
- m_RealOutStream.Release();
- RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &m_RealOutStream, askMode));
- if (!m_RealOutStream && !m_TestMode)
- askMode = NExtract::NAskMode::kSkip;
- return m_ExtractCallback->PrepareOperation(askMode);
-}
-
-HRESULT CChmFolderOutStream::WriteEmptyFiles()
-{
- if (m_FileIsOpen)
- return S_OK;
- for (;m_CurrentIndex < m_NumFiles; m_CurrentIndex++)
- {
- UInt64 fileSize = m_Database->GetFileSize(m_StartIndex + m_CurrentIndex);
- if (fileSize != 0)
- return S_OK;
- HRESULT result = OpenFile();
- m_RealOutStream.Release();
- RINOK(result);
- RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- return S_OK;
-}
-
-// This is WritePart function
-HRESULT CChmFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK)
-{
- UInt32 realProcessed = 0;
- if (processedSize != NULL)
- *processedSize = 0;
- while(size != 0)
- {
- if (m_FileIsOpen)
- {
- UInt32 numBytesToWrite = (UInt32)MyMin(m_RemainFileSize, (UInt64)(size));
- HRESULT res = S_OK;
- if (numBytesToWrite > 0)
- {
- if (!isOK)
- m_IsOk = false;
- if (m_RealOutStream)
- {
- UInt32 processedSizeLocal = 0;
- res = m_RealOutStream->Write((const Byte *)data, numBytesToWrite, &processedSizeLocal);
- numBytesToWrite = processedSizeLocal;
- }
- }
- realProcessed += numBytesToWrite;
- if (processedSize != NULL)
- *processedSize = realProcessed;
- data = (const void *)((const Byte *)data + numBytesToWrite);
- size -= numBytesToWrite;
- m_RemainFileSize -= numBytesToWrite;
- m_PosInSection += numBytesToWrite;
- m_PosInFolder += numBytesToWrite;
- if (res != S_OK)
- return res;
- if (m_RemainFileSize == 0)
- {
- m_RealOutStream.Release();
- RINOK(m_ExtractCallback->SetOperationResult(
- m_IsOk ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- m_FileIsOpen = false;
- }
- if (realProcessed > 0)
- break; // with this break this function works as write part
- }
- else
- {
- if (m_CurrentIndex >= m_NumFiles)
- return E_FAIL;
- int fullIndex = m_StartIndex + m_CurrentIndex;
- m_RemainFileSize = m_Database->GetFileSize(fullIndex);
- UInt64 fileOffset = m_Database->GetFileOffset(fullIndex);
- if (fileOffset < m_PosInSection)
- return E_FAIL;
- if (fileOffset > m_PosInSection)
- {
- UInt32 numBytesToWrite = (UInt32)MyMin(fileOffset - m_PosInSection, UInt64(size));
- realProcessed += numBytesToWrite;
- if (processedSize != NULL)
- *processedSize = realProcessed;
- data = (const void *)((const Byte *)data + numBytesToWrite);
- size -= numBytesToWrite;
- m_PosInSection += numBytesToWrite;
- m_PosInFolder += numBytesToWrite;
- }
- if (fileOffset == m_PosInSection)
- {
- RINOK(OpenFile());
- m_FileIsOpen = true;
- m_CurrentIndex++;
- m_IsOk = true;
- }
- }
- }
- return WriteEmptyFiles();
-}
-
-STDMETHODIMP CChmFolderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- return Write2(data, size, processedSize, true);
-}
-
-HRESULT CChmFolderOutStream::FlushCorrupted(UInt64 maxSize)
-{
- const UInt32 kBufferSize = (1 << 10);
- Byte buffer[kBufferSize];
- for (int i = 0; i < kBufferSize; i++)
- buffer[i] = 0;
- if (maxSize > m_FolderSize)
- maxSize = m_FolderSize;
- while (m_PosInFolder < maxSize)
- {
- UInt32 size = (UInt32)MyMin(maxSize - m_PosInFolder, (UInt64)kBufferSize);
- UInt32 processedSizeLocal = 0;
- RINOK(Write2(buffer, size, &processedSizeLocal, false));
- if (processedSizeLocal == 0)
- return S_OK;
- }
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testModeSpec, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
-
- if (allFilesMode)
- numItems = m_Database.NewFormat ? 1:
- (m_Database.LowLevel ?
- m_Database.Items.Size():
- m_Database.Indices.Size());
- if (numItems == 0)
- return S_OK;
- bool testMode = (testModeSpec != 0);
-
- UInt64 currentTotalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
- UInt32 i;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(m_Stream);
-
- if (m_Database.LowLevel)
- {
- UInt64 currentItemSize = 0;
- UInt64 totalSize = 0;
- if (m_Database.NewFormat)
- totalSize = m_Database.NewFormatString.Length();
- else
- for (i = 0; i < numItems; i++)
- totalSize += m_Database.Items[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- currentItemSize = 0;
- lps->InSize = currentTotalSize; // Change it
- lps->OutSize = currentTotalSize;
-
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode= testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (m_Database.NewFormat)
- {
- if (index != 0)
- return E_FAIL;
- if (!testMode && !realOutStream)
- continue;
- if (!testMode)
- {
- UInt32 size = m_Database.NewFormatString.Length();
- RINOK(WriteStream(realOutStream, (const char *)m_Database.NewFormatString, size));
- }
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- const CItem &item = m_Database.Items[index];
-
- currentItemSize = item.Size;
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (item.Section != 0)
- {
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
-
- if (testMode)
- {
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- RINOK(m_Stream->Seek(m_Database.ContentOffset + item.Offset, STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
-
- RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- }
-
- UInt64 lastFolderIndex = ((UInt64)0 - 1);
- for (i = 0; i < numItems; i++)
- {
- UInt32 index = allFilesMode ? i : indices[i];
- int entryIndex = m_Database.Indices[index];
- const CItem &item = m_Database.Items[entryIndex];
- UInt64 sectionIndex = item.Section;
- if (item.IsDir() || item.Size == 0)
- continue;
- if (sectionIndex == 0)
- {
- currentTotalSize += item.Size;
- continue;
- }
- const CSectionInfo &section = m_Database.Sections[(int)item.Section];
- if (section.IsLzx())
- {
- const CLzxInfo &lzxInfo = section.Methods[0].LzxInfo;
- UInt64 folderIndex = m_Database.GetFolder(index);
- if (lastFolderIndex == folderIndex)
- folderIndex++;
- lastFolderIndex = m_Database.GetLastFolder(index);
- for (; folderIndex <= lastFolderIndex; folderIndex++)
- currentTotalSize += lzxInfo.GetFolderSize();
- }
- }
-
- RINOK(extractCallback->SetTotal(currentTotalSize));
-
- NCompress::NLzx::CDecoder *lzxDecoderSpec = 0;
- CMyComPtr<ICompressCoder> lzxDecoder;
- CChmFolderOutStream *chmFolderOutStream = 0;
- CMyComPtr<ISequentialOutStream> outStream;
-
- currentTotalSize = 0;
-
- CRecordVector<bool> extractStatuses;
- for (i = 0; i < numItems;)
- {
- RINOK(extractCallback->SetCompleted(&currentTotalSize));
- UInt32 index = allFilesMode ? i : indices[i];
- i++;
- int entryIndex = m_Database.Indices[index];
- const CItem &item = m_Database.Items[entryIndex];
- UInt64 sectionIndex = item.Section;
- Int32 askMode= testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- if (item.IsDir())
- {
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- lps->InSize = currentTotalSize; // Change it
- lps->OutSize = currentTotalSize;
-
- if (item.Size == 0 || sectionIndex == 0)
- {
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- Int32 opRes = NExtract::NOperationResult::kOK;
- if (!testMode && item.Size != 0)
- {
- RINOK(m_Stream->Seek(m_Database.ContentOffset + item.Offset, STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
- RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));
- if (copyCoderSpec->TotalSize != item.Size)
- opRes = NExtract::NOperationResult::kDataError;
- }
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(opRes));
- currentTotalSize += item.Size;
- continue;
- }
-
- const CSectionInfo &section = m_Database.Sections[(int)sectionIndex];
-
- if (!section.IsLzx())
- {
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
-
- const CLzxInfo &lzxInfo = section.Methods[0].LzxInfo;
-
- if (chmFolderOutStream == 0)
- {
- chmFolderOutStream = new CChmFolderOutStream;
- outStream = chmFolderOutStream;
- }
-
- chmFolderOutStream->Init(&m_Database, extractCallback, testMode);
-
- if (lzxDecoderSpec == NULL)
- {
- lzxDecoderSpec = new NCompress::NLzx::CDecoder;
- lzxDecoder = lzxDecoderSpec;
- }
-
- UInt64 folderIndex = m_Database.GetFolder(index);
-
- UInt64 compressedPos = m_Database.ContentOffset + section.Offset;
- UInt32 numDictBits = lzxInfo.GetNumDictBits();
- RINOK(lzxDecoderSpec->SetParams(numDictBits));
-
- const CItem *lastItem = &item;
- extractStatuses.Clear();
- extractStatuses.Add(true);
-
- for (;; folderIndex++)
- {
- RINOK(extractCallback->SetCompleted(&currentTotalSize));
-
- UInt64 startPos = lzxInfo.GetFolderPos(folderIndex);
- UInt64 finishPos = lastItem->Offset + lastItem->Size;
- UInt64 limitFolderIndex = lzxInfo.GetFolder(finishPos);
-
- lastFolderIndex = m_Database.GetLastFolder(index);
- UInt64 folderSize = lzxInfo.GetFolderSize();
- UInt64 unPackSize = folderSize;
- if (extractStatuses.IsEmpty())
- chmFolderOutStream->m_StartIndex = index + 1;
- else
- chmFolderOutStream->m_StartIndex = index;
- if (limitFolderIndex == folderIndex)
- {
- for (; i < numItems; i++)
- {
- UInt32 nextIndex = allFilesMode ? i : indices[i];
- int entryIndex = m_Database.Indices[nextIndex];
- const CItem &nextItem = m_Database.Items[entryIndex];
- if (nextItem.Section != sectionIndex)
- break;
- UInt64 nextFolderIndex = m_Database.GetFolder(nextIndex);
- if (nextFolderIndex != folderIndex)
- break;
- for (index++; index < nextIndex; index++)
- extractStatuses.Add(false);
- extractStatuses.Add(true);
- index = nextIndex;
- lastItem = &nextItem;
- if (nextItem.Size != 0)
- finishPos = nextItem.Offset + nextItem.Size;
- lastFolderIndex = m_Database.GetLastFolder(index);
- }
- }
- unPackSize = MyMin(finishPos - startPos, unPackSize);
-
- chmFolderOutStream->m_FolderSize = folderSize;
- chmFolderOutStream->m_PosInFolder = 0;
- chmFolderOutStream->m_PosInSection = startPos;
- chmFolderOutStream->m_ExtractStatuses = &extractStatuses;
- chmFolderOutStream->m_NumFiles = extractStatuses.Size();
- chmFolderOutStream->m_CurrentIndex = 0;
- try
- {
- UInt64 startBlock = lzxInfo.GetBlockIndexFromFolderIndex(folderIndex);
- const CResetTable &rt = lzxInfo.ResetTable;
- UInt32 numBlocks = (UInt32)rt.GetNumBlocks(unPackSize);
- for (UInt32 b = 0; b < numBlocks; b++)
- {
- UInt64 completedSize = currentTotalSize + chmFolderOutStream->m_PosInSection - startPos;
- RINOK(extractCallback->SetCompleted(&completedSize));
- UInt64 bCur = startBlock + b;
- if (bCur >= rt.ResetOffsets.Size())
- return E_FAIL;
- UInt64 offset = rt.ResetOffsets[(int)bCur];
- UInt64 compressedSize;
- rt.GetCompressedSizeOfBlock(bCur, compressedSize);
- UInt64 rem = finishPos - chmFolderOutStream->m_PosInSection;
- if (rem > rt.BlockSize)
- rem = rt.BlockSize;
- RINOK(m_Stream->Seek(compressedPos + offset, STREAM_SEEK_SET, NULL));
- streamSpec->SetStream(m_Stream);
- streamSpec->Init(compressedSize);
- lzxDecoderSpec->SetKeepHistory(b > 0);
- HRESULT res = lzxDecoder->Code(inStream, outStream, NULL, &rem, NULL);
- if (res != S_OK)
- {
- if (res != S_FALSE)
- return res;
- throw 1;
- }
- }
- }
- catch(...)
- {
- RINOK(chmFolderOutStream->FlushCorrupted(unPackSize));
- }
- currentTotalSize += folderSize;
- if (folderIndex == lastFolderIndex)
- break;
- extractStatuses.Clear();
- }
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = m_Database.NewFormat ? 1:
- (m_Database.LowLevel ?
- m_Database.Items.Size():
- m_Database.Indices.Size());
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHandler.h
deleted file mode 100644
index 440c50f11..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHandler.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// ChmHandler.h
-
-#ifndef __ARCHIVE_CHM_HANDLER_H
-#define __ARCHIVE_CHM_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-#include "ChmIn.h"
-
-namespace NArchive {
-namespace NChm {
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP1(IInArchive)
-
- INTERFACE_IInArchive(;)
-
-private:
- CFilesDatabase m_Database;
- CMyComPtr<IInStream> m_Stream;
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHeader.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHeader.cpp
deleted file mode 100644
index e8dc9f3e8..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHeader.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-// Archive/Chm/Header.h
-
-#include "StdAfx.h"
-
-#include "ChmHeader.h"
-
-namespace NArchive{
-namespace NChm{
-namespace NHeader{
-
-UInt32 kItsfSignature = 0x46535449 + 1;
-UInt32 kItolSignature = 0x4C4F5449 + 1;
-static class CSignatureInitializer
-{
-public:
- CSignatureInitializer()
- {
- kItsfSignature--;
- kItolSignature--;
- }
-}g_SignatureInitializer;
-
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHeader.h b/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHeader.h
deleted file mode 100644
index 9f1bd42b6..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmHeader.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Archive/Chm/Header.h
-
-#ifndef __ARCHIVE_CHM_HEADER_H
-#define __ARCHIVE_CHM_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NChm {
-namespace NHeader{
-
-const UInt32 kItspSignature = 0x50535449;
-const UInt32 kPmglSignature = 0x4C474D50;
-const UInt32 kLzxcSignature = 0x43585A4C;
-
-const UInt32 kIfcmSignature = 0x4D434649;
-const UInt32 kAollSignature = 0x4C4C4F41;
-const UInt32 kCaolSignature = 0x4C4F4143;
-
-extern UInt32 kItsfSignature;
-
-extern UInt32 kItolSignature;
-const UInt32 kItlsSignature = 0x534C5449;
-UInt64 inline GetHxsSignature() { return ((UInt64)kItlsSignature << 32) | kItolSignature; }
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmIn.cpp
deleted file mode 100644
index d52b9ba6c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmIn.cpp
+++ /dev/null
@@ -1,937 +0,0 @@
-// Archive/ChmIn.cpp
-
-#include "StdAfx.h"
-
-#include "Common/IntToString.h"
-#include "Common/UTFConvert.h"
-
-#include "../../Common/LimitedStreams.h"
-
-#include "ChmIn.h"
-
-namespace NArchive {
-namespace NChm {
-
-// define CHM_LOW, if you want to see low level items
-// #define CHM_LOW
-
-static const GUID kChmLzxGuid = { 0x7FC28940, 0x9D31, 0x11D0, { 0x9B, 0x27, 0x00, 0xA0, 0xC9, 0x1E, 0x9C, 0x7C } };
-static const GUID kHelp2LzxGuid = { 0x0A9007C6, 0x4076, 0x11D3, { 0x87, 0x89, 0x00, 0x00, 0xF8, 0x10, 0x57, 0x54 } };
-static const GUID kDesGuid = { 0x67F6E4A2, 0x60BF, 0x11D3, { 0x85, 0x40, 0x00, 0xC0, 0x4F, 0x58, 0xC3, 0xCF } };
-
-static bool AreGuidsEqual(REFGUID g1, REFGUID g2)
-{
- if (g1.Data1 != g2.Data1 ||
- g1.Data2 != g2.Data2 ||
- g1.Data3 != g2.Data3)
- return false;
- for (int i = 0; i < 8; i++)
- if (g1.Data4[i] != g2.Data4[i])
- return false;
- return true;
-}
-
-static char GetHex(Byte value)
-{
- return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));
-}
-
-static void PrintByte(Byte b, AString &s)
-{
- s += GetHex(b >> 4);
- s += GetHex(b & 0xF);
-}
-
-static void PrintUInt16(UInt16 v, AString &s)
-{
- PrintByte((Byte)(v >> 8), s);
- PrintByte((Byte)v, s);
-}
-
-static void PrintUInt32(UInt32 v, AString &s)
-{
- PrintUInt16((UInt16)(v >> 16), s);
- PrintUInt16((UInt16)v, s);
-}
-
-AString CMethodInfo::GetGuidString() const
-{
- AString s;
- s += '{';
- PrintUInt32(Guid.Data1, s);
- s += '-';
- PrintUInt16(Guid.Data2, s);
- s += '-';
- PrintUInt16(Guid.Data3, s);
- s += '-';
- PrintByte(Guid.Data4[0], s);
- PrintByte(Guid.Data4[1], s);
- s += '-';
- for (int i = 2; i < 8; i++)
- PrintByte(Guid.Data4[i], s);
- s += '}';
- return s;
-}
-
-bool CMethodInfo::IsLzx() const
-{
- if (AreGuidsEqual(Guid, kChmLzxGuid))
- return true;
- return AreGuidsEqual(Guid, kHelp2LzxGuid);
-}
-
-bool CMethodInfo::IsDes() const
-{
- return AreGuidsEqual(Guid, kDesGuid);
-}
-
-UString CMethodInfo::GetName() const
-{
- UString s;
- if (IsLzx())
- {
- s = L"LZX:";
- wchar_t temp[16];
- ConvertUInt32ToString(LzxInfo.GetNumDictBits(), temp);
- s += temp;
- }
- else
- {
- AString s2;
- if (IsDes())
- s2 = "DES";
- else
- {
- s2 = GetGuidString();
- if (ControlData.GetCapacity() > 0)
- {
- s2 += ':';
- for (size_t i = 0; i < ControlData.GetCapacity(); i++)
- PrintByte(ControlData[i], s2);
- }
- }
- ConvertUTF8ToUnicode(s2, s);
- }
- return s;
-}
-
-bool CSectionInfo::IsLzx() const
-{
- if (Methods.Size() != 1)
- return false;
- return Methods[0].IsLzx();
-}
-
-UString CSectionInfo::GetMethodName() const
-{
- UString s;
- if (!IsLzx())
- {
- UString temp;
- if (ConvertUTF8ToUnicode(Name, temp))
- s += temp;
- s += L": ";
- }
- for (int i = 0; i < Methods.Size(); i++)
- {
- if (i != 0)
- s += L' ';
- s += Methods[i].GetName();
- }
- return s;
-}
-
-Byte CInArchive::ReadByte()
-{
- Byte b;
- if (!_inBuffer.ReadByte(b))
- throw 1;
- return b;
-}
-
-void CInArchive::Skip(size_t size)
-{
- while (size-- != 0)
- ReadByte();
-}
-
-void CInArchive::ReadBytes(Byte *data, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- data[i] = ReadByte();
-}
-
-UInt16 CInArchive::ReadUInt16()
-{
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- value |= ((UInt16)(ReadByte()) << (8 * i));
- return value;
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- value |= ((UInt32)(ReadByte()) << (8 * i));
- return value;
-}
-
-UInt64 CInArchive::ReadUInt64()
-{
- UInt64 value = 0;
- for (int i = 0; i < 8; i++)
- value |= ((UInt64)(ReadByte()) << (8 * i));
- return value;
-}
-
-UInt64 CInArchive::ReadEncInt()
-{
- UInt64 val = 0;;
- for (int i = 0; i < 10; i++)
- {
- Byte b = ReadByte();
- val |= (b & 0x7F);
- if (b < 0x80)
- return val;
- val <<= 7;
- }
- throw 1;
-}
-
-void CInArchive::ReadGUID(GUID &g)
-{
- g.Data1 = ReadUInt32();
- g.Data2 = ReadUInt16();
- g.Data3 = ReadUInt16();
- ReadBytes(g.Data4, 8);
-}
-
-void CInArchive::ReadString(int size, AString &s)
-{
- s.Empty();
- while(size-- != 0)
- {
- char c = (char)ReadByte();
- if (c == 0)
- {
- Skip(size);
- return;
- }
- s += c;
- }
-}
-
-void CInArchive::ReadUString(int size, UString &s)
-{
- s.Empty();
- while(size-- != 0)
- {
- wchar_t c = ReadUInt16();
- if (c == 0)
- {
- Skip(2 * size);
- return;
- }
- s += c;
- }
-}
-
-HRESULT CInArchive::ReadChunk(IInStream *inStream, UInt64 pos, UInt64 size)
-{
- RINOK(inStream->Seek(pos, STREAM_SEEK_SET, NULL));
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> limitedStream(streamSpec);
- streamSpec->SetStream(inStream);
- streamSpec->Init(size);
- _inBuffer.SetStream(limitedStream);
- _inBuffer.Init();
- return S_OK;
-}
-
-HRESULT CInArchive::ReadDirEntry(CDatabase &database)
-{
- CItem item;
- UInt64 nameLength = ReadEncInt();
- if (nameLength == 0 || nameLength >= 0x10000000)
- return S_FALSE;
- ReadString((int)nameLength, item.Name);
- item.Section = ReadEncInt();
- item.Offset = ReadEncInt();
- item.Size = ReadEncInt();
- database.Items.Add(item);
- return S_OK;
-}
-
-HRESULT CInArchive::OpenChm(IInStream *inStream, CDatabase &database)
-{
- UInt32 headerSize = ReadUInt32();
- if (headerSize != 0x60)
- return S_FALSE;
- UInt32 unknown1 = ReadUInt32();
- if (unknown1 != 0 && unknown1 != 1) // it's 0 in one .sll file
- return S_FALSE;
- /* UInt32 timeStamp = */ ReadUInt32();
- // Considered as a big-endian DWORD, it appears to contain seconds (MSB) and
- // fractional seconds (second byte).
- // The third and fourth bytes may contain even more fractional bits.
- // The 4 least significant bits in the last byte are constant.
- /* UInt32 lang = */ ReadUInt32();
- GUID g;
- ReadGUID(g); // {7C01FD10-7BAA-11D0-9E0C-00A0-C922-E6EC}
- ReadGUID(g); // {7C01FD11-7BAA-11D0-9E0C-00A0-C922-E6EC}
- const int kNumSections = 2;
- UInt64 sectionOffsets[kNumSections];
- UInt64 sectionSizes[kNumSections];
- int i;
- for (i = 0; i < kNumSections; i++)
- {
- sectionOffsets[i] = ReadUInt64();
- sectionSizes[i] = ReadUInt64();
- }
- // if (chmVersion == 3)
- database.ContentOffset = ReadUInt64();
- /*
- else
- database.ContentOffset = _startPosition + 0x58
- */
-
- /*
- // Section 0
- ReadChunk(inStream, sectionOffsets[0], sectionSizes[0]);
- if (sectionSizes[0] != 0x18)
- return S_FALSE;
- ReadUInt32(); // unknown: 01FE
- ReadUInt32(); // unknown: 0
- UInt64 fileSize = ReadUInt64();
- ReadUInt32(); // unknown: 0
- ReadUInt32(); // unknown: 0
- */
-
- // Section 1: The Directory Listing
- ReadChunk(inStream, sectionOffsets[1], sectionSizes[1]);
- if (ReadUInt32() != NHeader::kItspSignature)
- return S_FALSE;
- if (ReadUInt32() != 1) // version
- return S_FALSE;
- /* UInt32 dirHeaderSize = */ ReadUInt32();
- ReadUInt32(); // 0x0A (unknown)
- UInt32 dirChunkSize = ReadUInt32(); // $1000
- if (dirChunkSize < 32)
- return S_FALSE;
- /* UInt32 density = */ ReadUInt32(); // "Density" of quickref section, usually 2.
- /* UInt32 depth = */ ReadUInt32(); // Depth of the index tree: 1 there is no index,
- // 2 if there is one level of PMGI chunks.
-
- /* UInt32 chunkNumber = */ ReadUInt32(); // Chunk number of root index chunk, -1 if there is none
- // (though at least one file has 0 despite there being no
- // index chunk, probably a bug.)
- /* UInt32 firstPmglChunkNumber = */ ReadUInt32(); // Chunk number of first PMGL (listing) chunk
- /* UInt32 lastPmglChunkNumber = */ ReadUInt32(); // Chunk number of last PMGL (listing) chunk
- ReadUInt32(); // -1 (unknown)
- UInt32 numDirChunks = ReadUInt32(); // Number of directory chunks (total)
- /* UInt32 windowsLangId = */ ReadUInt32();
- ReadGUID(g); // {5D02926A-212E-11D0-9DF9-00A0C922E6EC}
- ReadUInt32(); // 0x54 (This is the length again)
- ReadUInt32(); // -1 (unknown)
- ReadUInt32(); // -1 (unknown)
- ReadUInt32(); // -1 (unknown)
-
- for (UInt32 ci = 0; ci < numDirChunks; ci++)
- {
- UInt64 chunkPos = _inBuffer.GetProcessedSize();
- if (ReadUInt32() == NHeader::kPmglSignature)
- {
- // The quickref area is written backwards from the end of the chunk.
- // One quickref entry exists for every n entries in the file, where n
- // is calculated as 1 + (1 << quickref density). So for density = 2, n = 5.
-
- UInt32 quickrefLength = ReadUInt32(); // Length of free space and/or quickref area at end of directory chunk
- if (quickrefLength > dirChunkSize || quickrefLength < 2)
- return S_FALSE;
- ReadUInt32(); // Always 0
- ReadUInt32(); // Chunk number of previous listing chunk when reading
- // directory in sequence (-1 if this is the first listing chunk)
- ReadUInt32(); // Chunk number of next listing chunk when reading
- // directory in sequence (-1 if this is the last listing chunk)
- int numItems = 0;
- for (;;)
- {
- UInt64 offset = _inBuffer.GetProcessedSize() - chunkPos;
- UInt32 offsetLimit = dirChunkSize - quickrefLength;
- if (offset > offsetLimit)
- return S_FALSE;
- if (offset == offsetLimit)
- break;
- RINOK(ReadDirEntry(database));
- numItems++;
- }
- Skip(quickrefLength - 2);
- if (ReadUInt16() != numItems)
- return S_FALSE;
- }
- else
- Skip(dirChunkSize - 4);
- }
- return S_OK;
-}
-
-HRESULT CInArchive::OpenHelp2(IInStream *inStream, CDatabase &database)
-{
- if (ReadUInt32() != 1) // version
- return S_FALSE;
- if (ReadUInt32() != 0x28) // Location of header section table
- return S_FALSE;
- UInt32 numHeaderSections = ReadUInt32();
- const int kNumHeaderSectionsMax = 5;
- if (numHeaderSections != kNumHeaderSectionsMax)
- return S_FALSE;
- ReadUInt32(); // Length of post-header table
- GUID g;
- ReadGUID(g); // {0A9007C1-4076-11D3-8789-0000F8105754}
-
- // header section table
- UInt64 sectionOffsets[kNumHeaderSectionsMax];
- UInt64 sectionSizes[kNumHeaderSectionsMax];
- UInt32 i;
- for (i = 0; i < numHeaderSections; i++)
- {
- sectionOffsets[i] = ReadUInt64();
- sectionSizes[i] = ReadUInt64();
- }
-
- // Post-Header
- ReadUInt32(); // 2
- ReadUInt32(); // 0x98: offset to CAOL from beginning of post-header)
- // ----- Directory information
- ReadUInt64(); // Chunk number of top-level AOLI chunk in directory, or -1
- ReadUInt64(); // Chunk number of first AOLL chunk in directory
- ReadUInt64(); // Chunk number of last AOLL chunk in directory
- ReadUInt64(); // 0 (unknown)
- ReadUInt32(); // $2000 (Directory chunk size of directory)
- ReadUInt32(); // Quickref density for main directory, usually 2
- ReadUInt32(); // 0 (unknown)
- ReadUInt32(); // Depth of main directory index tree
- // 1 there is no index, 2 if there is one level of AOLI chunks.
- ReadUInt64(); // 0 (unknown)
- UInt64 numDirEntries = ReadUInt64(); // Number of directory entries
- // ----- Directory Index Information
- ReadUInt64(); // -1 (unknown, probably chunk number of top-level AOLI in directory index)
- ReadUInt64(); // Chunk number of first AOLL chunk in directory index
- ReadUInt64(); // Chunk number of last AOLL chunk in directory index
- ReadUInt64(); // 0 (unknown)
- ReadUInt32(); // $200 (Directory chunk size of directory index)
- ReadUInt32(); // Quickref density for directory index, usually 2
- ReadUInt32(); // 0 (unknown)
- ReadUInt32(); // Depth of directory index index tree.
- ReadUInt64(); // Possibly flags -- sometimes 1, sometimes 0.
- ReadUInt64(); // Number of directory index entries (same as number of AOLL
- // chunks in main directory)
-
- // (The obvious guess for the following two fields, which recur in a number
- // of places, is they are maximum sizes for the directory and directory index.
- // However, I have seen no direct evidence that this is the case.)
-
- ReadUInt32(); // $100000 (Same as field following chunk size in directory)
- ReadUInt32(); // $20000 (Same as field following chunk size in directory index)
-
- ReadUInt64(); // 0 (unknown)
- if (ReadUInt32() != NHeader::kCaolSignature)
- return S_FALSE;
- if (ReadUInt32() != 2) // (Most likely a version number)
- return S_FALSE;
- UInt32 caolLength = ReadUInt32(); // $50 (Length of the CAOL section, which includes the ITSF section)
- if (caolLength >= 0x2C)
- {
- /* UInt32 c7 = */ ReadUInt16(); // Unknown. Remains the same when identical files are built.
- // Does not appear to be a checksum. Many files have
- // 'HH' (HTML Help?) here, indicating this may be a compiler ID
- // field. But at least one ITOL/ITLS compiler does not set this
- // field to a constant value.
- ReadUInt16(); // 0 (Unknown. Possibly part of 00A4 field)
- ReadUInt32(); // Unknown. Two values have been seen -- $43ED, and 0.
- ReadUInt32(); // $2000 (Directory chunk size of directory)
- ReadUInt32(); // $200 (Directory chunk size of directory index)
- ReadUInt32(); // $100000 (Same as field following chunk size in directory)
- ReadUInt32(); // $20000 (Same as field following chunk size in directory index)
- ReadUInt32(); // 0 (unknown)
- ReadUInt32(); // 0 (Unknown)
- if (caolLength == 0x2C)
- {
- database.ContentOffset = 0;
- database.NewFormat = true;
- }
- else if (caolLength == 0x50)
- {
- ReadUInt32(); // 0 (Unknown)
- if (ReadUInt32() != NHeader::kItsfSignature)
- return S_FALSE;
- if (ReadUInt32() != 4) // $4 (Version number -- CHM uses 3)
- return S_FALSE;
- if (ReadUInt32() != 0x20) // $20 (length of ITSF)
- return S_FALSE;
- UInt32 unknown = ReadUInt32();
- if (unknown != 0 && unknown != 1) // = 0 for some HxW files, 1 in other cases;
- return S_FALSE;
- database.ContentOffset = _startPosition + ReadUInt64();
- /* UInt32 timeStamp = */ ReadUInt32();
- // A timestamp of some sort.
- // Considered as a big-endian DWORD, it appears to contain
- // seconds (MSB) and fractional seconds (second byte).
- // The third and fourth bytes may contain even more fractional
- // bits. The 4 least significant bits in the last byte are constant.
- /* UInt32 lang = */ ReadUInt32(); // BE?
- }
- else
- return S_FALSE;
- }
-
- /*
- // Section 0
- ReadChunk(inStream, _startPosition + sectionOffsets[0], sectionSizes[0]);
- if (sectionSizes[0] != 0x18)
- return S_FALSE;
- ReadUInt32(); // unknown: 01FE
- ReadUInt32(); // unknown: 0
- UInt64 fileSize = ReadUInt64();
- ReadUInt32(); // unknown: 0
- ReadUInt32(); // unknown: 0
- */
-
- // Section 1: The Directory Listing
- ReadChunk(inStream, _startPosition + sectionOffsets[1], sectionSizes[1]);
- if (ReadUInt32() != NHeader::kIfcmSignature)
- return S_FALSE;
- if (ReadUInt32() != 1) // (probably a version number)
- return S_FALSE;
- UInt32 dirChunkSize = ReadUInt32(); // $2000
- if (dirChunkSize < 64)
- return S_FALSE;
- ReadUInt32(); // $100000 (unknown)
- ReadUInt32(); // -1 (unknown)
- ReadUInt32(); // -1 (unknown)
- UInt32 numDirChunks = ReadUInt32();
- ReadUInt32(); // 0 (unknown, probably high word of above)
-
- for (UInt32 ci = 0; ci < numDirChunks; ci++)
- {
- UInt64 chunkPos = _inBuffer.GetProcessedSize();
- if (ReadUInt32() == NHeader::kAollSignature)
- {
- UInt32 quickrefLength = ReadUInt32(); // Length of quickref area at end of directory chunk
- if (quickrefLength > dirChunkSize || quickrefLength < 2)
- return S_FALSE;
- ReadUInt64(); // Directory chunk number
- // This must match physical position in file, that is
- // the chunk size times the chunk number must be the
- // offset from the end of the directory header.
- ReadUInt64(); // Chunk number of previous listing chunk when reading
- // directory in sequence (-1 if first listing chunk)
- ReadUInt64(); // Chunk number of next listing chunk when reading
- // directory in sequence (-1 if last listing chunk)
- ReadUInt64(); // Number of first listing entry in this chunk
- ReadUInt32(); // 1 (unknown -- other values have also been seen here)
- ReadUInt32(); // 0 (unknown)
-
- int numItems = 0;
- for (;;)
- {
- UInt64 offset = _inBuffer.GetProcessedSize() - chunkPos;
- UInt32 offsetLimit = dirChunkSize - quickrefLength;
- if (offset > offsetLimit)
- return S_FALSE;
- if (offset == offsetLimit)
- break;
- if (database.NewFormat)
- {
- UInt16 nameLength = ReadUInt16();
- if (nameLength == 0)
- return S_FALSE;
- UString name;
- ReadUString((int)nameLength, name);
- AString s;
- ConvertUnicodeToUTF8(name, s);
- Byte b = ReadByte();
- s += ' ';
- PrintByte(b, s);
- s += ' ';
- UInt64 len = ReadEncInt();
- // then number of items ?
- // then length ?
- // then some data (binary encoding?)
- while (len-- != 0)
- {
- b = ReadByte();
- PrintByte(b, s);
- }
- database.NewFormatString += s;
- database.NewFormatString += "\r\n";
- }
- else
- {
- RINOK(ReadDirEntry(database));
- }
- numItems++;
- }
- Skip(quickrefLength - 2);
- if (ReadUInt16() != numItems)
- return S_FALSE;
- if (numItems > numDirEntries)
- return S_FALSE;
- numDirEntries -= numItems;
- }
- else
- Skip(dirChunkSize - 4);
- }
- return numDirEntries == 0 ? S_OK : S_FALSE;
-}
-
-HRESULT CInArchive::DecompressStream(IInStream *inStream, const CDatabase &database, const AString &name)
-{
- int index = database.FindItem(name);
- if (index < 0)
- return S_FALSE;
- const CItem &item = database.Items[index];
- _chunkSize = item.Size;
- return ReadChunk(inStream, database.ContentOffset + item.Offset, item.Size);
-}
-
-
-#define DATA_SPACE "::DataSpace/"
-static const char *kNameList = DATA_SPACE "NameList";
-static const char *kStorage = DATA_SPACE "Storage/";
-static const char *kContent = "Content";
-static const char *kControlData = "ControlData";
-static const char *kSpanInfo = "SpanInfo";
-static const char *kTransform = "Transform/";
-static const char *kResetTable = "/InstanceData/ResetTable";
-static const char *kTransformList = "List";
-
-static AString GetSectionPrefix(const AString &name)
-{
- return AString(kStorage) + name + AString("/");
-}
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareFiles(const int *p1, const int *p2, void *param)
-{
- const CObjectVector<CItem> &items = *(const CObjectVector<CItem> *)param;
- const CItem &item1 = items[*p1];
- const CItem &item2 = items[*p2];
- bool isDir1 = item1.IsDir();
- bool isDir2 = item2.IsDir();
- if (isDir1 && !isDir2)
- return -1;
- if (isDir2)
- {
- if (isDir1)
- return MyCompare(*p1, *p2);
- return 1;
- }
- RINOZ(MyCompare(item1.Section, item2.Section));
- RINOZ(MyCompare(item1.Offset, item2.Offset));
- RINOZ(MyCompare(item1.Size, item2.Size));
- return MyCompare(*p1, *p2);
-}
-
-void CFilesDatabase::SetIndices()
-{
- for (int i = 0; i < Items.Size(); i++)
- {
- const CItem &item = Items[i];
- if (item.IsUserItem() && item.Name.Length() != 1)
- Indices.Add(i);
- }
-}
-
-void CFilesDatabase::Sort()
-{
- Indices.Sort(CompareFiles, (void *)&Items);
-}
-
-bool CFilesDatabase::Check()
-{
- UInt64 maxPos = 0;
- UInt64 prevSection = 0;
- for(int i = 0; i < Indices.Size(); i++)
- {
- const CItem &item = Items[Indices[i]];
- if (item.Section == 0 || item.IsDir())
- continue;
- if (item.Section != prevSection)
- {
- prevSection = item.Section;
- maxPos = 0;
- continue;
- }
- if (item.Offset < maxPos)
- return false;
- maxPos = item.Offset + item.Size;
- if (maxPos < item.Offset)
- return false;
- }
- return true;
-}
-
-HRESULT CInArchive::OpenHighLevel(IInStream *inStream, CFilesDatabase &database)
-{
- {
- // The NameList file
- RINOK(DecompressStream(inStream, database, kNameList));
- /* UInt16 length = */ ReadUInt16();
- UInt16 numSections = ReadUInt16();
- for (int i = 0; i < numSections; i++)
- {
- CSectionInfo section;
- UInt16 nameLength = ReadUInt16();
- UString name;
- ReadUString(nameLength, name);
- if (ReadUInt16() != 0)
- return S_FALSE;
- if (!ConvertUnicodeToUTF8(name, section.Name))
- return S_FALSE;
- database.Sections.Add(section);
- }
- }
-
- int i;
- for (i = 1; i < database.Sections.Size(); i++)
- {
- CSectionInfo &section = database.Sections[i];
- AString sectionPrefix = GetSectionPrefix(section.Name);
- {
- // Content
- int index = database.FindItem(sectionPrefix + kContent);
- if (index < 0)
- return S_FALSE;
- const CItem &item = database.Items[index];
- section.Offset = item.Offset;
- section.CompressedSize = item.Size;
- }
- AString transformPrefix = sectionPrefix + kTransform;
- if (database.Help2Format)
- {
- // Transform List
- RINOK(DecompressStream(inStream, database, transformPrefix + kTransformList));
- if ((_chunkSize & 0xF) != 0)
- return S_FALSE;
- int numGuids = (int)(_chunkSize / 0x10);
- if (numGuids < 1)
- return S_FALSE;
- for (int i = 0; i < numGuids; i++)
- {
- CMethodInfo method;
- ReadGUID(method.Guid);
- section.Methods.Add(method);
- }
- }
- else
- {
- CMethodInfo method;
- method.Guid = kChmLzxGuid;
- section.Methods.Add(method);
- }
-
- {
- // Control Data
- RINOK(DecompressStream(inStream, database, sectionPrefix + kControlData));
- for (int mi = 0; mi < section.Methods.Size(); mi++)
- {
- CMethodInfo &method = section.Methods[mi];
- UInt32 numDWORDS = ReadUInt32();
- if (method.IsLzx())
- {
- if (numDWORDS < 5)
- return S_FALSE;
- if (ReadUInt32() != NHeader::kLzxcSignature)
- return S_FALSE;
- CLzxInfo &li = method.LzxInfo;
- li.Version = ReadUInt32();
- if (li.Version != 2 && li.Version != 3)
- return S_FALSE;
- li.ResetInterval = ReadUInt32();
- li.WindowSize = ReadUInt32();
- li.CacheSize = ReadUInt32();
- if (
- li.ResetInterval != 1 &&
- li.ResetInterval != 2 &&
- li.ResetInterval != 4 &&
- li.ResetInterval != 8 &&
- li.ResetInterval != 16 &&
- li.ResetInterval != 32 &&
- li.ResetInterval != 64)
- return S_FALSE;
- if (
- li.WindowSize != 1 &&
- li.WindowSize != 2 &&
- li.WindowSize != 4 &&
- li.WindowSize != 8 &&
- li.WindowSize != 16 &&
- li.WindowSize != 32 &&
- li.WindowSize != 64)
- return S_FALSE;
- numDWORDS -= 5;
- while (numDWORDS-- != 0)
- ReadUInt32();
- }
- else
- {
- UInt32 numBytes = numDWORDS * 4;
- method.ControlData.SetCapacity(numBytes);
- ReadBytes(method.ControlData, numBytes);
- }
- }
- }
-
- {
- // SpanInfo
- RINOK(DecompressStream(inStream, database, sectionPrefix + kSpanInfo));
- section.UncompressedSize = ReadUInt64();
- }
-
- // read ResetTable for LZX
- for (int mi = 0; mi < section.Methods.Size(); mi++)
- {
- CMethodInfo &method = section.Methods[mi];
- if (method.IsLzx())
- {
- // ResetTable;
- RINOK(DecompressStream(inStream, database, transformPrefix +
- method.GetGuidString() + kResetTable));
- CResetTable &rt = method.LzxInfo.ResetTable;
- if (_chunkSize < 4)
- {
- if (_chunkSize != 0)
- return S_FALSE;
- // ResetTable is empty in .chw files
- if (section.UncompressedSize != 0)
- return S_FALSE;
- rt.UncompressedSize = 0;
- rt.CompressedSize = 0;
- rt.BlockSize = 0;
- }
- else
- {
- UInt32 ver = ReadUInt32(); // 2 unknown (possibly a version number)
- if (ver != 2 && ver != 3)
- return S_FALSE;
- UInt32 numEntries = ReadUInt32();
- if (ReadUInt32() != 8) // Size of table entry (bytes)
- return S_FALSE;
- if (ReadUInt32() != 0x28) // Length of table header
- return S_FALSE;
- rt.UncompressedSize = ReadUInt64();
- rt.CompressedSize = ReadUInt64();
- rt.BlockSize = ReadUInt64(); // 0x8000 block size for locations below
- if (rt.BlockSize != 0x8000)
- return S_FALSE;
- rt.ResetOffsets.Reserve(numEntries);
- for (UInt32 i = 0; i < numEntries; i++)
- rt.ResetOffsets.Add(ReadUInt64());
- }
- }
- }
- }
-
- database.SetIndices();
- database.Sort();
- return database.Check() ? S_OK : S_FALSE;
-}
-
-HRESULT CInArchive::Open2(IInStream *inStream,
- const UInt64 *searchHeaderSizeLimit,
- CFilesDatabase &database)
-{
- database.Clear();
-
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &_startPosition));
-
- database.Help2Format = false;
- const UInt32 chmVersion = 3;
- {
- if (!_inBuffer.Create(1 << 14))
- return E_OUTOFMEMORY;
- _inBuffer.SetStream(inStream);
- _inBuffer.Init();
- UInt64 value = 0;
- const int kSignatureSize = 8;
- UInt64 hxsSignature = NHeader::GetHxsSignature();
- UInt64 chmSignature = ((UInt64)chmVersion << 32)| NHeader::kItsfSignature;
- UInt64 limit = 1 << 18;
- if (searchHeaderSizeLimit)
- if (limit > *searchHeaderSizeLimit)
- limit = *searchHeaderSizeLimit;
-
- for (;;)
- {
- Byte b;
- if (!_inBuffer.ReadByte(b))
- return S_FALSE;
- value >>= 8;
- value |= ((UInt64)b) << ((kSignatureSize - 1) * 8);
- if (_inBuffer.GetProcessedSize() >= kSignatureSize)
- {
- if (value == chmSignature)
- break;
- if (value == hxsSignature)
- {
- database.Help2Format = true;
- break;
- }
- if (_inBuffer.GetProcessedSize() > limit)
- return S_FALSE;
- }
- }
- _startPosition += _inBuffer.GetProcessedSize() - kSignatureSize;
- }
-
- if (database.Help2Format)
- {
- RINOK(OpenHelp2(inStream, database));
- if (database.NewFormat)
- return S_OK;
- }
- else
- {
- RINOK(OpenChm(inStream, database));
- }
-
- #ifndef CHM_LOW
- try
- {
- HRESULT res = OpenHighLevel(inStream, database);
- if (res == S_FALSE)
- {
- database.HighLevelClear();
- return S_OK;
- }
- RINOK(res);
- database.LowLevel = false;
- }
- catch(...)
- {
- return S_OK;
- }
- #endif
- return S_OK;
-}
-
-HRESULT CInArchive::Open(IInStream *inStream,
- const UInt64 *searchHeaderSizeLimit,
- CFilesDatabase &database)
-{
- try
- {
- HRESULT res = Open2(inStream, searchHeaderSizeLimit, database);
- _inBuffer.ReleaseStream();
- return res;
- }
- catch(...)
- {
- _inBuffer.ReleaseStream();
- throw;
- }
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmIn.h
deleted file mode 100644
index 4719a484d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmIn.h
+++ /dev/null
@@ -1,244 +0,0 @@
-// Archive/ChmIn.h
-
-#ifndef __ARCHIVE_CHM_IN_H
-#define __ARCHIVE_CHM_IN_H
-
-#include "Common/Buffer.h"
-#include "Common/MyString.h"
-
-#include "../../IStream.h"
-#include "../../Common/InBuffer.h"
-
-#include "ChmHeader.h"
-
-namespace NArchive {
-namespace NChm {
-
-struct CItem
-{
- UInt64 Section;
- UInt64 Offset;
- UInt64 Size;
- AString Name;
-
- bool IsFormatRelatedItem() const
- {
- if (Name.Length() < 2)
- return false;
- return Name[0] == ':' && Name[1] == ':';
- }
-
- bool IsUserItem() const
- {
- if (Name.Length() < 2)
- return false;
- return Name[0] == '/';
- }
-
- bool IsDir() const
- {
- if (Name.Length() == 0)
- return false;
- return (Name[Name.Length() - 1] == '/');
- }
-};
-
-struct CDatabase
-{
- UInt64 ContentOffset;
- CObjectVector<CItem> Items;
- AString NewFormatString;
- bool Help2Format;
- bool NewFormat;
-
- int FindItem(const AString &name) const
- {
- for (int i = 0; i < Items.Size(); i++)
- if (Items[i].Name == name)
- return i;
- return -1;
- }
-
- void Clear()
- {
- NewFormat = false;
- NewFormatString.Empty();
- Help2Format = false;
- Items.Clear();
- }
-};
-
-struct CResetTable
-{
- UInt64 UncompressedSize;
- UInt64 CompressedSize;
- UInt64 BlockSize;
- CRecordVector<UInt64> ResetOffsets;
- bool GetCompressedSizeOfBlocks(UInt64 blockIndex, UInt32 numBlocks, UInt64 &size) const
- {
- if (blockIndex >= ResetOffsets.Size())
- return false;
- UInt64 startPos = ResetOffsets[(int)blockIndex];
- if (blockIndex + numBlocks >= ResetOffsets.Size())
- size = CompressedSize - startPos;
- else
- size = ResetOffsets[(int)(blockIndex + numBlocks)] - startPos;
- return true;
- }
- bool GetCompressedSizeOfBlock(UInt64 blockIndex, UInt64 &size) const
- {
- return GetCompressedSizeOfBlocks(blockIndex, 1, size);
- }
- UInt64 GetNumBlocks(UInt64 size) const
- {
- return (size + BlockSize - 1) / BlockSize;
- }
-};
-
-struct CLzxInfo
-{
- UInt32 Version;
- UInt32 ResetInterval;
- UInt32 WindowSize;
- UInt32 CacheSize;
- CResetTable ResetTable;
-
- UInt32 GetNumDictBits() const
- {
- if (Version == 2 || Version == 3)
- {
- for (int i = 0; i <= 31; i++)
- if (((UInt32)1 << i) >= WindowSize)
- return 15 + i;
- }
- return 0;
- }
-
- UInt64 GetFolderSize() const { return ResetTable.BlockSize * ResetInterval; };
- UInt64 GetFolder(UInt64 offset) const { return offset / GetFolderSize(); };
- UInt64 GetFolderPos(UInt64 folderIndex) const { return folderIndex * GetFolderSize(); };
- UInt64 GetBlockIndexFromFolderIndex(UInt64 folderIndex) const { return folderIndex * ResetInterval; };
- bool GetOffsetOfFolder(UInt64 folderIndex, UInt64 &offset) const
- {
- UInt64 blockIndex = GetBlockIndexFromFolderIndex(folderIndex);
- if (blockIndex >= ResetTable.ResetOffsets.Size())
- return false;
- offset = ResetTable.ResetOffsets[(int)blockIndex];
- return true;
- }
- bool GetCompressedSizeOfFolder(UInt64 folderIndex, UInt64 &size) const
- {
- UInt64 blockIndex = GetBlockIndexFromFolderIndex(folderIndex);
- return ResetTable.GetCompressedSizeOfBlocks(blockIndex, ResetInterval, size);
- }
-};
-
-struct CMethodInfo
-{
- GUID Guid;
- CByteBuffer ControlData;
- CLzxInfo LzxInfo;
- bool IsLzx() const;
- bool IsDes() const;
- AString GetGuidString() const;
- UString GetName() const;
-};
-
-struct CSectionInfo
-{
- UInt64 Offset;
- UInt64 CompressedSize;
- UInt64 UncompressedSize;
-
- AString Name;
- CObjectVector<CMethodInfo> Methods;
-
- bool IsLzx() const;
- UString GetMethodName() const;
-};
-
-class CFilesDatabase: public CDatabase
-{
-public:
- bool LowLevel;
- CRecordVector<int> Indices;
- CObjectVector<CSectionInfo> Sections;
-
- UInt64 GetFileSize(int fileIndex) const { return Items[Indices[fileIndex]].Size; }
- UInt64 GetFileOffset(int fileIndex) const { return Items[Indices[fileIndex]].Offset; }
-
- UInt64 GetFolder(int fileIndex) const
- {
- const CItem &item = Items[Indices[fileIndex]];
- const CSectionInfo &section = Sections[(int)item.Section];
- if (section.IsLzx())
- return section.Methods[0].LzxInfo.GetFolder(item.Offset);
- return 0;
- }
-
- UInt64 GetLastFolder(int fileIndex) const
- {
- const CItem &item = Items[Indices[fileIndex]];
- const CSectionInfo &section = Sections[(int)item.Section];
- if (section.IsLzx())
- return section.Methods[0].LzxInfo.GetFolder(item.Offset + item.Size - 1);
- return 0;
- }
-
- void HighLevelClear()
- {
- LowLevel = true;
- Indices.Clear();
- Sections.Clear();
- }
-
- void Clear()
- {
- CDatabase::Clear();
- HighLevelClear();
- }
- void SetIndices();
- void Sort();
- bool Check();
-};
-
-class CProgressVirt
-{
-public:
- STDMETHOD(SetTotal)(const UInt64 *numFiles) PURE;
- STDMETHOD(SetCompleted)(const UInt64 *numFiles) PURE;
-};
-
-class CInArchive
-{
- UInt64 _startPosition;
- ::CInBuffer _inBuffer;
- UInt64 _chunkSize;
-
- Byte ReadByte();
- void ReadBytes(Byte *data, UInt32 size);
- void Skip(size_t size);
- UInt16 ReadUInt16();
- UInt32 ReadUInt32();
- UInt64 ReadUInt64();
- UInt64 ReadEncInt();
- void ReadString(int size, AString &s);
- void ReadUString(int size, UString &s);
- void ReadGUID(GUID &g);
-
- HRESULT ReadChunk(IInStream *inStream, UInt64 pos, UInt64 size);
-
- HRESULT ReadDirEntry(CDatabase &database);
- HRESULT DecompressStream(IInStream *inStream, const CDatabase &database, const AString &name);
-
-public:
- HRESULT OpenChm(IInStream *inStream, CDatabase &database);
- HRESULT OpenHelp2(IInStream *inStream, CDatabase &database);
- HRESULT OpenHighLevel(IInStream *inStream, CFilesDatabase &database);
- HRESULT Open2(IInStream *inStream, const UInt64 *searchHeaderSizeLimit, CFilesDatabase &database);
- HRESULT Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit, CFilesDatabase &database);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmRegister.cpp
deleted file mode 100644
index e5f38afa4..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Chm/ChmRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// ChmRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "ChmHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NChm::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Chm", L"chm chi chq chw hxs hxi hxr hxq hxw lit", 0, 0xE9, { 'I', 'T', 'S', 'F' }, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Chm)
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Chm/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Chm/StdAfx.h
deleted file mode 100644
index e7fb6986d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Chm/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/MyWindows.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Com/ComHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Com/ComHandler.cpp
deleted file mode 100644
index 58f76439f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Com/ComHandler.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-// ComHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "ComHandler.h"
-
-namespace NArchive {
-namespace NCom {
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidMTime, VT_FILETIME}
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidSectorSize, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidClusterSize: prop = (UInt32)1 << _db.SectorSizeBits; break;
- case kpidSectorSize: prop = (UInt32)1 << _db.MiniSectorSizeBits; break;
- case kpidMainSubfile: if (_db.MainSubfile >= 0) prop = (UInt32)_db.MainSubfile; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CRef &ref = _db.Refs[index];
- const CItem &item = _db.Items[ref.Did];
-
- switch(propID)
- {
- case kpidPath: prop = _db.GetItemPath(index); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidCTime: prop = item.CTime; break;
- case kpidMTime: prop = item.MTime; break;
- case kpidPackSize: if (!item.IsDir()) prop = _db.GetItemPackSize(item.Size); break;
- case kpidSize: if (!item.IsDir()) prop = item.Size; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- try
- {
- if (_db.Open(inStream) != S_OK)
- return S_FALSE;
- _stream = inStream;
- }
- catch(...) { return S_FALSE; }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _db.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _db.Refs.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- UInt64 totalSize = 0;
- for(i = 0; i < numItems; i++)
- {
- const CItem &item = _db.Items[_db.Refs[allFilesMode ? i : indices[i]].Did];
- if (!item.IsDir())
- totalSize += item.Size;
- }
- RINOK(extractCallback->SetTotal(totalSize));
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _db.Items[_db.Refs[index].Did];
-
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
-
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- totalPackSize += _db.GetItemPackSize(item.Size);
- totalSize += item.Size;
-
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- Int32 res = NExtract::NOperationResult::kDataError;
- CMyComPtr<ISequentialInStream> inStream;
- HRESULT hres = GetStream(index, &inStream);
- if (hres == S_FALSE)
- res = NExtract::NOperationResult::kDataError;
- else if (hres == E_NOTIMPL)
- res = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- RINOK(hres);
- if (inStream)
- {
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- if (copyCoderSpec->TotalSize == item.Size)
- res = NExtract::NOperationResult::kOK;
- }
- }
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _db.Refs.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
- const CItem &item = _db.Items[_db.Refs[index].Did];
- CClusterInStream *streamSpec = new CClusterInStream;
- CMyComPtr<ISequentialInStream> streamTemp = streamSpec;
- streamSpec->Stream = _stream;
- streamSpec->StartOffset = 0;
-
- bool isLargeStream = _db.IsLargeStream(item.Size);
- int bsLog = isLargeStream ? _db.SectorSizeBits : _db.MiniSectorSizeBits;
- streamSpec->BlockSizeLog = bsLog;
- streamSpec->Size = item.Size;
-
- UInt32 clusterSize = (UInt32)1 << bsLog;
- UInt64 numClusters64 = (item.Size + clusterSize - 1) >> bsLog;
- if (numClusters64 >= ((UInt32)1 << 31))
- return E_NOTIMPL;
- streamSpec->Vector.Reserve((int)numClusters64);
- UInt32 sid = item.Sid;
- UInt64 size = item.Size;
-
- if (size != 0)
- {
- for (;; size -= clusterSize)
- {
- if (isLargeStream)
- {
- if (sid >= _db.FatSize)
- return S_FALSE;
- streamSpec->Vector.Add(sid + 1);
- sid = _db.Fat[sid];
- }
- else
- {
- UInt64 val;
- if (sid >= _db.MatSize || !_db.GetMiniCluster(sid, val) || val >= (UInt64)1 << 32)
- return S_FALSE;
- streamSpec->Vector.Add((UInt32)val);
- sid = _db.Mat[sid];
- }
- if (size <= clusterSize)
- break;
- }
- }
- if (sid != NFatID::kEndOfChain)
- return S_FALSE;
- RINOK(streamSpec->InitAndSeek());
- *stream = streamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Com/ComHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Com/ComHandler.h
deleted file mode 100644
index f2b7de96d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Com/ComHandler.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// ComHandler.h
-
-#ifndef __ARCHIVE_COM_HANDLER_H
-#define __ARCHIVE_COM_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-#include "ComIn.h"
-
-namespace NArchive {
-namespace NCom {
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CDatabase _db;
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Com/ComIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Com/ComIn.cpp
deleted file mode 100644
index 2203ca531..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Com/ComIn.cpp
+++ /dev/null
@@ -1,389 +0,0 @@
-// Archive/ComIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/Alloc.h"
-#include "../../../../C/CpuArch.h"
-
-#include "Common/IntToString.h"
-#include "Common/MyCom.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "ComIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-
-namespace NArchive{
-namespace NCom{
-
-static const UInt32 kSignatureSize = 8;
-static const Byte kSignature[kSignatureSize] = { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 };
-
-void CUInt32Buf::Free()
-{
- MyFree(_buf);
- _buf = 0;
-}
-
-bool CUInt32Buf::Allocate(UInt32 numItems)
-{
- Free();
- if (numItems == 0)
- return true;
- size_t newSize = (size_t)numItems * sizeof(UInt32);
- if (newSize / sizeof(UInt32) != numItems)
- return false;
- _buf = (UInt32 *)MyAlloc(newSize);
- return (_buf != 0);
-}
-
-static HRESULT ReadSector(IInStream *inStream, Byte *buf, int sectorSizeBits, UInt32 sid)
-{
- RINOK(inStream->Seek((((UInt64)sid + 1) << sectorSizeBits), STREAM_SEEK_SET, NULL));
- return ReadStream_FALSE(inStream, buf, (UInt32)1 << sectorSizeBits);
-}
-
-static HRESULT ReadIDs(IInStream *inStream, Byte *buf, int sectorSizeBits, UInt32 sid, UInt32 *dest)
-{
- RINOK(ReadSector(inStream, buf, sectorSizeBits, sid));
- UInt32 sectorSize = (UInt32)1 << sectorSizeBits;
- for (UInt32 t = 0; t < sectorSize; t += 4)
- *dest++ = Get32(buf + t);
- return S_OK;
-}
-
-static void GetFileTimeFromMem(const Byte *p, FILETIME *ft)
-{
- ft->dwLowDateTime = Get32(p);
- ft->dwHighDateTime = Get32(p + 4);
-}
-
-void CItem::Parse(const Byte *p, bool mode64bit)
-{
- memcpy(Name, p, kNameSizeMax);
- // NameSize = Get16(p + 64);
- Type = p[66];
- LeftDid = Get32(p + 68);
- RightDid = Get32(p + 72);
- SonDid = Get32(p + 76);
- // Flags = Get32(p + 96);
- GetFileTimeFromMem(p + 100, &CTime);
- GetFileTimeFromMem(p + 108, &MTime);
- Sid = Get32(p + 116);
- Size = Get32(p + 120);
- if (mode64bit)
- Size |= ((UInt64)Get32(p + 124) << 32);
-}
-
-void CDatabase::Clear()
-{
- Fat.Free();
- MiniSids.Free();
- Mat.Free();
- Items.Clear();
- Refs.Clear();
-}
-
-static const UInt32 kNoDid = 0xFFFFFFFF;
-
-HRESULT CDatabase::AddNode(int parent, UInt32 did)
-{
- if (did == kNoDid)
- return S_OK;
- if (did >= (UInt32)Items.Size())
- return S_FALSE;
- const CItem &item = Items[did];
- if (item.IsEmpty())
- return S_FALSE;
- CRef ref;
- ref.Parent = parent;
- ref.Did = did;
- int index = Refs.Add(ref);
- if (Refs.Size() > Items.Size())
- return S_FALSE;
- RINOK(AddNode(parent, item.LeftDid));
- RINOK(AddNode(parent, item.RightDid));
- if (item.IsDir())
- {
- RINOK(AddNode(index, item.SonDid));
- }
- return S_OK;
-}
-
-static const char kCharOpenBracket = '[';
-static const char kCharCloseBracket = ']';
-
-static UString CompoundNameToFileName(const UString &s)
-{
- UString res;
- for (int i = 0; i < s.Length(); i++)
- {
- wchar_t c = s[i];
- if (c < 0x20)
- {
- res += kCharOpenBracket;
- wchar_t buf[32];
- ConvertUInt32ToString(c, buf);
- res += buf;
- res += kCharCloseBracket;
- }
- else
- res += c;
- }
- return res;
-}
-
-static char g_MsiChars[] =
-"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._";
-
-static const wchar_t *kMsi_ID = L""; // L"{msi}";
-
-static const int kMsiNumBits = 6;
-static const UInt32 kMsiNumChars = 1 << kMsiNumBits;
-static const UInt32 kMsiCharMask = kMsiNumChars - 1;
-static const UInt32 kMsiStartUnicodeChar = 0x3800;
-static const UInt32 kMsiUnicodeRange = kMsiNumChars * (kMsiNumChars + 1);
-
-bool CompoundMsiNameToFileName(const UString &name, UString &resultName)
-{
- resultName.Empty();
- for (int i = 0; i < name.Length(); i++)
- {
- wchar_t c = name[i];
- if (c < kMsiStartUnicodeChar || c > kMsiStartUnicodeChar + kMsiUnicodeRange)
- return false;
- if (i == 0)
- resultName += kMsi_ID;
- c -= kMsiStartUnicodeChar;
-
- UInt32 c0 = c & kMsiCharMask;
- UInt32 c1 = c >> kMsiNumBits;
-
- if (c1 <= kMsiNumChars)
- {
- resultName += (wchar_t)g_MsiChars[c0];
- if (c1 == kMsiNumChars)
- break;
- resultName += (wchar_t)g_MsiChars[c1];
- }
- else
- resultName += L'!';
- }
- return true;
-}
-
-static UString ConvertName(const Byte *p, bool &isMsi)
-{
- isMsi = false;
- UString s;
- for (int i = 0; i < kNameSizeMax; i += 2)
- {
- wchar_t c = (p[i] | (wchar_t)p[i + 1] << 8);
- if (c == 0)
- break;
- s += c;
- }
- UString msiName;
- if (CompoundMsiNameToFileName(s, msiName))
- {
- isMsi = true;
- return msiName;
- }
- return CompoundNameToFileName(s);
-}
-
-static UString ConvertName(const Byte *p)
-{
- bool isMsi;
- return ConvertName(p, isMsi);
-}
-
-UString CDatabase::GetItemPath(UInt32 index) const
-{
- UString s;
- while (index != kNoDid)
- {
- const CRef &ref = Refs[index];
- const CItem &item = Items[ref.Did];
- if (!s.IsEmpty())
- s = (UString)WCHAR_PATH_SEPARATOR + s;
- s = ConvertName(item.Name) + s;
- index = ref.Parent;
- }
- return s;
-}
-
-HRESULT CDatabase::Open(IInStream *inStream)
-{
- MainSubfile = -1;
- static const UInt32 kHeaderSize = 512;
- Byte p[kHeaderSize];
- RINOK(ReadStream_FALSE(inStream, p, kHeaderSize));
- if (memcmp(p, kSignature, kSignatureSize) != 0)
- return S_FALSE;
- if (Get16(p + 0x1A) > 4) // majorVer
- return S_FALSE;
- if (Get16(p + 0x1C) != 0xFFFE)
- return S_FALSE;
- int sectorSizeBits = Get16(p + 0x1E);
- bool mode64bit = (sectorSizeBits >= 12);
- int miniSectorSizeBits = Get16(p + 0x20);
- SectorSizeBits = sectorSizeBits;
- MiniSectorSizeBits = miniSectorSizeBits;
-
- if (sectorSizeBits > 28 || miniSectorSizeBits > 28 ||
- sectorSizeBits < 7 || miniSectorSizeBits < 2 || miniSectorSizeBits > sectorSizeBits)
- return S_FALSE;
- UInt32 numSectorsForFAT = Get32(p + 0x2C);
- LongStreamMinSize = Get32(p + 0x38);
-
- UInt32 sectSize = (UInt32)1 << (int)sectorSizeBits;
-
- CByteBuffer sect;
- sect.SetCapacity(sectSize);
-
- int ssb2 = (int)(sectorSizeBits - 2);
- UInt32 numSidsInSec = (UInt32)1 << ssb2;
- UInt32 numFatItems = numSectorsForFAT << ssb2;
- if ((numFatItems >> ssb2) != numSectorsForFAT)
- return S_FALSE;
- FatSize = numFatItems;
-
- {
- CUInt32Buf bat;
- UInt32 numSectorsForBat = Get32(p + 0x48);
- const UInt32 kNumHeaderBatItems = 109;
- UInt32 numBatItems = kNumHeaderBatItems + (numSectorsForBat << ssb2);
- if (numBatItems < kNumHeaderBatItems || ((numBatItems - kNumHeaderBatItems) >> ssb2) != numSectorsForBat)
- return S_FALSE;
- if (!bat.Allocate(numBatItems))
- return S_FALSE;
- UInt32 i;
- for (i = 0; i < kNumHeaderBatItems; i++)
- bat[i] = Get32(p + 0x4c + i * 4);
- UInt32 sid = Get32(p + 0x44);
- for (UInt32 s = 0; s < numSectorsForBat; s++)
- {
- RINOK(ReadIDs(inStream, sect, sectorSizeBits, sid, bat + i));
- i += numSidsInSec - 1;
- sid = bat[i];
- }
- numBatItems = i;
-
- if (!Fat.Allocate(numFatItems))
- return S_FALSE;
- UInt32 j = 0;
-
- for (i = 0; i < numFatItems; j++, i += numSidsInSec)
- {
- if (j >= numBatItems)
- return S_FALSE;
- RINOK(ReadIDs(inStream, sect, sectorSizeBits, bat[j], Fat + i));
- }
- }
-
- UInt32 numMatItems;
- {
- UInt32 numSectorsForMat = Get32(p + 0x40);
- numMatItems = (UInt32)numSectorsForMat << ssb2;
- if ((numMatItems >> ssb2) != numSectorsForMat)
- return S_FALSE;
- if (!Mat.Allocate(numMatItems))
- return S_FALSE;
- UInt32 i;
- UInt32 sid = Get32(p + 0x3C);
- for (i = 0; i < numMatItems; i += numSidsInSec)
- {
- RINOK(ReadIDs(inStream, sect, sectorSizeBits, sid, Mat + i));
- if (sid >= numFatItems)
- return S_FALSE;
- sid = Fat[sid];
- }
- if (sid != NFatID::kEndOfChain)
- return S_FALSE;
- }
-
- {
- UInt32 sid = Get32(p + 0x30);
- for (;;)
- {
- if (sid >= numFatItems)
- return S_FALSE;
- RINOK(ReadSector(inStream, sect, sectorSizeBits, sid));
- for (UInt32 i = 0; i < sectSize; i += 128)
- {
- CItem item;
- item.Parse(sect + i, mode64bit);
- Items.Add(item);
- }
- sid = Fat[sid];
- if (sid == NFatID::kEndOfChain)
- break;
- }
- }
-
- CItem root = Items[0];
-
- {
- UInt32 numSectorsInMiniStream;
- {
- UInt64 numSatSects64 = (root.Size + sectSize - 1) >> sectorSizeBits;
- if (numSatSects64 > NFatID::kMaxValue)
- return S_FALSE;
- numSectorsInMiniStream = (UInt32)numSatSects64;
- }
- NumSectorsInMiniStream = numSectorsInMiniStream;
- if (!MiniSids.Allocate(numSectorsInMiniStream))
- return S_FALSE;
- {
- UInt64 matSize64 = (root.Size + ((UInt64)1 << miniSectorSizeBits) - 1) >> miniSectorSizeBits;
- if (matSize64 > NFatID::kMaxValue)
- return S_FALSE;
- MatSize = (UInt32)matSize64;
- if (numMatItems < MatSize)
- return S_FALSE;
- }
-
- UInt32 sid = root.Sid;
- for (UInt32 i = 0; ; i++)
- {
- if (sid == NFatID::kEndOfChain)
- {
- if (i != numSectorsInMiniStream)
- return S_FALSE;
- break;
- }
- if (i >= numSectorsInMiniStream)
- return S_FALSE;
- MiniSids[i] = sid;
- if (sid >= numFatItems)
- return S_FALSE;
- sid = Fat[sid];
- }
- }
-
- RINOK(AddNode(-1, root.SonDid));
-
- unsigned numCabs = 0;
- for (int i = 0; i < Refs.Size(); i++)
- {
- const CItem &item = Items[Refs[i].Did];
- if (item.IsDir() || numCabs > 1)
- continue;
- bool isMsiName;
- UString msiName = ConvertName(item.Name, isMsiName);
- if (isMsiName && msiName.Right(4).CompareNoCase(L".cab") == 0)
- {
- numCabs++;
- MainSubfile = i;
- }
- }
- if (numCabs > 1)
- MainSubfile = -1;
-
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Com/ComIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Com/ComIn.h
deleted file mode 100644
index 429d3796e..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Com/ComIn.h
+++ /dev/null
@@ -1,119 +0,0 @@
-// Archive/ComIn.h
-
-#ifndef __ARCHIVE_COM_IN_H
-#define __ARCHIVE_COM_IN_H
-
-#include "Common/MyString.h"
-#include "Common/Buffer.h"
-
-namespace NArchive {
-namespace NCom {
-
-struct CUInt32Buf
-{
- UInt32 *_buf;
-public:
- CUInt32Buf(): _buf(0) {}
- ~CUInt32Buf() { Free(); }
- void Free();
- bool Allocate(UInt32 numItems);
- operator UInt32 *() const { return _buf; };
-};
-
-namespace NFatID
-{
- const UInt32 kFree = 0xFFFFFFFF;
- const UInt32 kEndOfChain = 0xFFFFFFFE;
- const UInt32 kFatSector = 0xFFFFFFFD;
- const UInt32 kMatSector = 0xFFFFFFFC;
- const UInt32 kMaxValue = 0xFFFFFFFA;
-}
-
-namespace NItemType
-{
- const Byte kEmpty = 0;
- const Byte kStorage = 1;
- const Byte kStream = 2;
- const Byte kLockBytes = 3;
- const Byte kProperty = 4;
- const Byte kRootStorage = 5;
-}
-
-const UInt32 kNameSizeMax = 64;
-
-struct CItem
-{
- Byte Name[kNameSizeMax];
- // UInt16 NameSize;
- // UInt32 Flags;
- FILETIME CTime;
- FILETIME MTime;
- UInt64 Size;
- UInt32 LeftDid;
- UInt32 RightDid;
- UInt32 SonDid;
- UInt32 Sid;
- Byte Type;
-
- bool IsEmpty() const { return Type == NItemType::kEmpty; }
- bool IsDir() const { return Type == NItemType::kStorage || Type == NItemType::kRootStorage; }
-
- void Parse(const Byte *p, bool mode64bit);
-};
-
-struct CRef
-{
- int Parent;
- UInt32 Did;
-};
-
-class CDatabase
-{
- UInt32 NumSectorsInMiniStream;
- CUInt32Buf MiniSids;
-
- HRESULT AddNode(int parent, UInt32 did);
-public:
-
- CUInt32Buf Fat;
- UInt32 FatSize;
-
- CUInt32Buf Mat;
- UInt32 MatSize;
-
- CObjectVector<CItem> Items;
- CRecordVector<CRef> Refs;
-
- UInt32 LongStreamMinSize;
- int SectorSizeBits;
- int MiniSectorSizeBits;
-
- Int32 MainSubfile;
-
- void Clear();
- bool IsLargeStream(UInt64 size) const { return size >= LongStreamMinSize; }
- UString GetItemPath(UInt32 index) const;
-
- UInt64 GetItemPackSize(UInt64 size) const
- {
- UInt64 mask = ((UInt64)1 << (IsLargeStream(size) ? SectorSizeBits : MiniSectorSizeBits)) - 1;
- return (size + mask) & ~mask;
- }
-
- bool GetMiniCluster(UInt32 sid, UInt64 &res) const
- {
- int subBits = SectorSizeBits - MiniSectorSizeBits;
- UInt32 fid = sid >> subBits;
- if (fid >= NumSectorsInMiniStream)
- return false;
- res = (((UInt64)MiniSids[fid] + 1) << subBits) + (sid & ((1 << subBits) - 1));
- return true;
- }
-
- HRESULT Open(IInStream *inStream);
-};
-
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Com/ComRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Com/ComRegister.cpp
deleted file mode 100644
index 6712b890f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Com/ComRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// ComRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "ComHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NCom::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Compound", L"msi msp doc xls ppt", 0, 0xE5, { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 }, 8, false, CreateArc, 0 };
-
-REGISTER_ARC(Com)
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer.cpp
deleted file mode 100644
index a19f04579..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// CoderMixer.cpp
-
-#include "StdAfx.h"
-
-#include "CoderMixer.h"
-
-namespace NCoderMixer {
-
-void CCoderInfo::SetCoderInfo(const UInt64 *inSize, const UInt64 *outSize)
-{
- InSizeAssigned = (inSize != 0);
- if (InSizeAssigned)
- InSizeValue = *inSize;
- OutSizeAssigned = (outSize != 0);
- if (OutSizeAssigned)
- OutSizeValue = *outSize;
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer.h
deleted file mode 100644
index 6379dd808..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// CoderMixer.h
-
-#ifndef __CODER_MIXER_H
-#define __CODER_MIXER_H
-
-#include "../../../Common/MyCom.h"
-#include "../../ICoder.h"
-
-namespace NCoderMixer {
-
-struct CCoderInfo
-{
- CMyComPtr<ICompressCoder> Coder;
- CMyComPtr<ISequentialInStream> InStream;
- CMyComPtr<ISequentialOutStream> OutStream;
- CMyComPtr<ICompressProgressInfo> Progress;
-
- UInt64 InSizeValue;
- UInt64 OutSizeValue;
- bool InSizeAssigned;
- bool OutSizeAssigned;
-
- void ReInit()
- {
- InSizeAssigned = OutSizeAssigned = false;
- }
-
- void SetCoderInfo(const UInt64 *inSize, const UInt64 *outSize);
-};
-
-}
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2ST.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2ST.cpp
deleted file mode 100644
index a59ce5fc0..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2ST.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-// CoderMixer2ST.cpp
-
-#include "StdAfx.h"
-
-#include "CoderMixer2ST.h"
-
-namespace NCoderMixer2 {
-
-CCoderMixer2ST::CCoderMixer2ST() {}
-
-CCoderMixer2ST::~CCoderMixer2ST(){ }
-
-HRESULT CCoderMixer2ST::SetBindInfo(const CBindInfo &bindInfo)
-{
- _bindInfo = bindInfo;
- return S_OK;
-}
-
-void CCoderMixer2ST::AddCoderCommon(bool isMain)
-{
- const CCoderStreamsInfo &csi = _bindInfo.Coders[_coders.Size()];
- _coders.Add(CSTCoderInfo(csi.NumInStreams, csi.NumOutStreams, isMain));
-}
-
-void CCoderMixer2ST::AddCoder(ICompressCoder *coder, bool isMain)
-{
- AddCoderCommon(isMain);
- _coders.Back().Coder = coder;
-}
-
-void CCoderMixer2ST::AddCoder2(ICompressCoder2 *coder, bool isMain)
-{
- AddCoderCommon(isMain);
- _coders.Back().Coder2 = coder;
-}
-
-void CCoderMixer2ST::ReInit() { }
-
-HRESULT CCoderMixer2ST::GetInStream(
- ISequentialInStream **inStreams, const UInt64 **inSizes,
- UInt32 streamIndex, ISequentialInStream **inStreamRes)
-{
- CMyComPtr<ISequentialInStream> seqInStream;
- int i;
- for(i = 0; i < _bindInfo.InStreams.Size(); i++)
- if (_bindInfo.InStreams[i] == streamIndex)
- {
- seqInStream = inStreams[i];
- *inStreamRes = seqInStream.Detach();
- return S_OK;
- }
- int binderIndex = _bindInfo.FindBinderForInStream(streamIndex);
- if (binderIndex < 0)
- return E_INVALIDARG;
-
- UInt32 coderIndex, coderStreamIndex;
- _bindInfo.FindOutStream(_bindInfo.BindPairs[binderIndex].OutIndex,
- coderIndex, coderStreamIndex);
-
- CCoderInfo &coder = _coders[coderIndex];
- if (!coder.Coder)
- return E_NOTIMPL;
- coder.Coder.QueryInterface(IID_ISequentialInStream, &seqInStream);
- if (!seqInStream)
- return E_NOTIMPL;
-
- UInt32 startIndex = _bindInfo.GetCoderInStreamIndex(coderIndex);
-
- CMyComPtr<ICompressSetInStream> setInStream;
- if (!coder.Coder)
- return E_NOTIMPL;
- coder.Coder.QueryInterface(IID_ICompressSetInStream, &setInStream);
- if (!setInStream)
- return E_NOTIMPL;
-
- if (coder.NumInStreams > 1)
- return E_NOTIMPL;
- for (i = 0; i < (int)coder.NumInStreams; i++)
- {
- CMyComPtr<ISequentialInStream> seqInStream2;
- RINOK(GetInStream(inStreams, inSizes, startIndex + i, &seqInStream2));
- RINOK(setInStream->SetInStream(seqInStream2));
- }
- *inStreamRes = seqInStream.Detach();
- return S_OK;
-}
-
-HRESULT CCoderMixer2ST::GetOutStream(
- ISequentialOutStream **outStreams, const UInt64 **outSizes,
- UInt32 streamIndex, ISequentialOutStream **outStreamRes)
-{
- CMyComPtr<ISequentialOutStream> seqOutStream;
- int i;
- for(i = 0; i < _bindInfo.OutStreams.Size(); i++)
- if (_bindInfo.OutStreams[i] == streamIndex)
- {
- seqOutStream = outStreams[i];
- *outStreamRes = seqOutStream.Detach();
- return S_OK;
- }
- int binderIndex = _bindInfo.FindBinderForOutStream(streamIndex);
- if (binderIndex < 0)
- return E_INVALIDARG;
-
- UInt32 coderIndex, coderStreamIndex;
- _bindInfo.FindInStream(_bindInfo.BindPairs[binderIndex].InIndex,
- coderIndex, coderStreamIndex);
-
- CCoderInfo &coder = _coders[coderIndex];
- if (!coder.Coder)
- return E_NOTIMPL;
- coder.Coder.QueryInterface(IID_ISequentialOutStream, &seqOutStream);
- if (!seqOutStream)
- return E_NOTIMPL;
-
- UInt32 startIndex = _bindInfo.GetCoderOutStreamIndex(coderIndex);
-
- CMyComPtr<ICompressSetOutStream> setOutStream;
- if (!coder.Coder)
- return E_NOTIMPL;
- coder.Coder.QueryInterface(IID_ICompressSetOutStream, &setOutStream);
- if (!setOutStream)
- return E_NOTIMPL;
-
- if (coder.NumOutStreams > 1)
- return E_NOTIMPL;
- for (i = 0; i < (int)coder.NumOutStreams; i++)
- {
- CMyComPtr<ISequentialOutStream> seqOutStream2;
- RINOK(GetOutStream(outStreams, outSizes, startIndex + i, &seqOutStream2));
- RINOK(setOutStream->SetOutStream(seqOutStream2));
- }
- *outStreamRes = seqOutStream.Detach();
- return S_OK;
-}
-
-
-STDMETHODIMP CCoderMixer2ST::Code(ISequentialInStream **inStreams,
- const UInt64 **inSizes,
- UInt32 numInStreams,
- ISequentialOutStream **outStreams,
- const UInt64 **outSizes,
- UInt32 numOutStreams,
- ICompressProgressInfo *progress)
-{
- if (numInStreams != (UInt32)_bindInfo.InStreams.Size() ||
- numOutStreams != (UInt32)_bindInfo.OutStreams.Size())
- return E_INVALIDARG;
-
- // Find main coder
- int _mainCoderIndex = -1;
- int i;
- for (i = 0; i < _coders.Size(); i++)
- if (_coders[i].IsMain)
- {
- _mainCoderIndex = i;
- break;
- }
- if (_mainCoderIndex < 0)
- for (i = 0; i < _coders.Size(); i++)
- if (_coders[i].NumInStreams > 1)
- {
- if (_mainCoderIndex >= 0)
- return E_NOTIMPL;
- _mainCoderIndex = i;
- }
- if (_mainCoderIndex < 0)
- _mainCoderIndex = 0;
-
- // _mainCoderIndex = 0;
- // _mainCoderIndex = _coders.Size() - 1;
- CCoderInfo &mainCoder = _coders[_mainCoderIndex];
-
- CObjectVector< CMyComPtr<ISequentialInStream> > seqInStreams;
- CObjectVector< CMyComPtr<ISequentialOutStream> > seqOutStreams;
- UInt32 startInIndex = _bindInfo.GetCoderInStreamIndex(_mainCoderIndex);
- UInt32 startOutIndex = _bindInfo.GetCoderOutStreamIndex(_mainCoderIndex);
- for (i = 0; i < (int)mainCoder.NumInStreams; i++)
- {
- CMyComPtr<ISequentialInStream> seqInStream;
- RINOK(GetInStream(inStreams, inSizes, startInIndex + i, &seqInStream));
- seqInStreams.Add(seqInStream);
- }
- for (i = 0; i < (int)mainCoder.NumOutStreams; i++)
- {
- CMyComPtr<ISequentialOutStream> seqOutStream;
- RINOK(GetOutStream(outStreams, outSizes, startOutIndex + i, &seqOutStream));
- seqOutStreams.Add(seqOutStream);
- }
- CRecordVector< ISequentialInStream * > seqInStreamsSpec;
- CRecordVector< ISequentialOutStream * > seqOutStreamsSpec;
- for (i = 0; i < (int)mainCoder.NumInStreams; i++)
- seqInStreamsSpec.Add(seqInStreams[i]);
- for (i = 0; i < (int)mainCoder.NumOutStreams; i++)
- seqOutStreamsSpec.Add(seqOutStreams[i]);
-
- for (i = 0; i < _coders.Size(); i++)
- {
- if (i == _mainCoderIndex)
- continue;
- CCoderInfo &coder = _coders[i];
- CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;
- coder.Coder.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize);
- if (setOutStreamSize)
- {
- RINOK(setOutStreamSize->SetOutStreamSize(coder.OutSizePointers[0]));
- }
- }
- if (mainCoder.Coder)
- {
- RINOK(mainCoder.Coder->Code(
- seqInStreamsSpec[0], seqOutStreamsSpec[0],
- mainCoder.InSizePointers[0], mainCoder.OutSizePointers[0],
- progress));
- }
- else
- {
- RINOK(mainCoder.Coder2->Code(
- &seqInStreamsSpec.Front(),
- &mainCoder.InSizePointers.Front(), mainCoder.NumInStreams,
- &seqOutStreamsSpec.Front(),
- &mainCoder.OutSizePointers.Front(), mainCoder.NumOutStreams,
- progress));
- }
- CMyComPtr<IOutStreamFlush> flush;
- seqOutStreams.Front().QueryInterface(IID_IOutStreamFlush, &flush);
- if (flush)
- return flush->Flush();
- return S_OK;
-}
-
-/*
-UInt64 CCoderMixer2ST::GetWriteProcessedSize(UInt32 binderIndex) const
-{
- return _streamBinders[binderIndex].ProcessedSize;
-}
-*/
-
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2ST.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2ST.h
deleted file mode 100644
index a4ea7e80d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2ST.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// CoderMixer2ST.h
-
-#ifndef __CODER_MIXER2_ST_H
-#define __CODER_MIXER2_ST_H
-
-#include "CoderMixer2.h"
-#include "../../../Common/MyCom.h"
-#include "../../ICoder.h"
-
-namespace NCoderMixer2 {
-
-// SetBindInfo()
-// for each coder
-// {
-// AddCoder[2]()
-// }
-//
-// for each file
-// {
-// ReInit()
-// for each coder
-// {
-// SetCoderInfo
-// }
-// SetProgressIndex(UInt32 coderIndex);
-// Code
-// }
-
-struct CSTCoderInfo: public CCoderInfo
-{
- bool IsMain;
- CSTCoderInfo(UInt32 numInStreams, UInt32 numOutStreams, bool isMain):
- CCoderInfo(numInStreams, numOutStreams),IsMain(isMain) {}
-};
-
-class CCoderMixer2ST:
- public ICompressCoder2,
- public CCoderMixer2,
- public CMyUnknownImp
-{
- MY_UNKNOWN_IMP
-
- HRESULT GetInStream(
- ISequentialInStream **inStreams, const UInt64 **inSizes,
- UInt32 streamIndex, ISequentialInStream **inStreamRes);
- HRESULT GetOutStream(
- ISequentialOutStream **outStreams, const UInt64 **outSizes,
- UInt32 streamIndex, ISequentialOutStream **outStreamRes);
-public:
- STDMETHOD(Code)(ISequentialInStream **inStreams,
- const UInt64 **inSizes,
- UInt32 numInStreams,
- ISequentialOutStream **outStreams,
- const UInt64 **outSizes,
- UInt32 numOutStreams,
- ICompressProgressInfo *progress);
-
- CCoderMixer2ST();
- ~CCoderMixer2ST();
- void AddCoderCommon(bool isMain);
- void AddCoder(ICompressCoder *coder, bool isMain);
- void AddCoder2(ICompressCoder2 *coder, bool isMain);
-
- void ReInit();
- void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes)
- {
- { _coders[coderIndex].SetCoderInfo(inSizes, outSizes); }
- }
-
- void SetProgressCoderIndex(UInt32 /*coderIndex*/)
- {
- // _progressCoderIndex = coderIndex;
- }
-
- // UInt64 GetWriteProcessedSize(UInt32 binderIndex) const;
-
-private:
- CBindInfo _bindInfo;
- CObjectVector<CSTCoderInfo> _coders;
- int _mainCoderIndex;
-public:
- HRESULT SetBindInfo(const CBindInfo &bindInfo);
-
-};
-
-}
-#endif
-
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixerMT.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixerMT.cpp
deleted file mode 100644
index f43d1612d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixerMT.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-// CoderMixerMT.cpp
-
-#include "StdAfx.h"
-
-#include "CoderMixerMT.h"
-
-namespace NCoderMixer {
-
-void CCoder::Execute() { Code(NULL); }
-
-void CCoder::Code(ICompressProgressInfo *progress)
-{
- Result = Coder->Code(InStream, OutStream,
- InSizeAssigned ? &InSizeValue : NULL,
- OutSizeAssigned ? &OutSizeValue : NULL,
- progress);
- InStream.Release();
- OutStream.Release();
-}
-
-void CCoderMixerMT::AddCoder(ICompressCoder *coder)
-{
- _coders.Add(CCoder());
- _coders.Back().Coder = coder;
-}
-
-void CCoderMixerMT::ReInit()
-{
- for(int i = 0; i < _coders.Size(); i++)
- _coders[i].ReInit();
-}
-
-HRESULT CCoderMixerMT::ReturnIfError(HRESULT code)
-{
- for (int i = 0; i < _coders.Size(); i++)
- if (_coders[i].Result == code)
- return code;
- return S_OK;
-}
-
-STDMETHODIMP CCoderMixerMT::Code(ISequentialInStream *inStream,
- ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */,
- ICompressProgressInfo *progress)
-{
- _coders.Front().InStream = inStream;
- int i;
- _coders.Back().OutStream = outStream;
-
- for (i = 0; i < _coders.Size(); i++)
- if (i != _progressCoderIndex)
- {
- RINOK(_coders[i].Create());
- }
-
- _streamBinders.Clear();
- for (i = 0; i + 1 < _coders.Size(); i++)
- {
- _streamBinders.Add(CStreamBinder());
- CStreamBinder &sb = _streamBinders[i];
- RINOK(sb.CreateEvents());
- sb.CreateStreams(&_coders[i + 1].InStream, &_coders[i].OutStream);
- }
-
- for(i = 0; i < _streamBinders.Size(); i++)
- _streamBinders[i].ReInit();
-
- for (i = 0; i < _coders.Size(); i++)
- if (i != _progressCoderIndex)
- _coders[i].Start();
-
- _coders[_progressCoderIndex].Code(progress);
-
- for (i = 0; i < _coders.Size(); i++)
- if (i != _progressCoderIndex)
- _coders[i].WaitFinish();
-
- RINOK(ReturnIfError(E_ABORT));
- RINOK(ReturnIfError(E_OUTOFMEMORY));
-
- for (i = 0; i < _coders.Size(); i++)
- {
- HRESULT result = _coders[i].Result;
- if (result != S_OK && result != E_FAIL && result != S_FALSE)
- return result;
- }
-
- RINOK(ReturnIfError(S_FALSE));
-
- for (i = 0; i < _coders.Size(); i++)
- {
- HRESULT result = _coders[i].Result;
- if (result != S_OK)
- return result;
- }
- return S_OK;
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixerMT.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixerMT.h
deleted file mode 100644
index c70e1829f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixerMT.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// CoderMixerMT.h
-
-#ifndef __CODER_MIXER_MT_H
-#define __CODER_MIXER_MT_H
-
-#include "../../../Common/MyVector.h"
-#include "../../../Common/MyCom.h"
-#include "../../ICoder.h"
-#include "../../Common/StreamBinder.h"
-#include "../../Common/VirtThread.h"
-#include "CoderMixer.h"
-
-namespace NCoderMixer {
-
-struct CCoder: public CCoderInfo, public CVirtThread
-{
- HRESULT Result;
-
- virtual void Execute();
- void Code(ICompressProgressInfo *progress);
-};
-
-/*
- for each coder
- AddCoder()
- SetProgressIndex(UInt32 coderIndex);
-
- for each file
- {
- ReInit()
- for each coder
- SetCoderInfo
- Code
- }
-*/
-
-
-class CCoderMixerMT:
- public ICompressCoder,
- public CMyUnknownImp
-{
- CObjectVector<CStreamBinder> _streamBinders;
- int _progressCoderIndex;
-
- HRESULT ReturnIfError(HRESULT code);
-public:
- CObjectVector<CCoder> _coders;
- MY_UNKNOWN_IMP
-
- STDMETHOD(Code)(ISequentialInStream *inStream,
- ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress);
-
- void AddCoder(ICompressCoder *coder);
- void SetProgressCoderIndex(int coderIndex) { _progressCoderIndex = coderIndex; }
-
- void ReInit();
- void SetCoderInfo(UInt32 coderIndex, const UInt64 *inSize, const UInt64 *outSize)
- { _coders[coderIndex].SetCoderInfo(inSize, outSize); }
-
- /*
- UInt64 GetWriteProcessedSize(UInt32 binderIndex) const
- { return _streamBinders[binderIndex].ProcessedSize; }
- */
-};
-
-}
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/FindSignature.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/FindSignature.cpp
deleted file mode 100644
index 15aa6ceae..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/FindSignature.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-// FindSignature.cpp
-
-#include "StdAfx.h"
-
-#include "Common/Buffer.h"
-
-#include "FindSignature.h"
-
-#include "../../Common/StreamUtils.h"
-
-HRESULT FindSignatureInStream(ISequentialInStream *stream,
- const Byte *signature, unsigned signatureSize,
- const UInt64 *limit, UInt64 &resPos)
-{
- resPos = 0;
- CByteBuffer byteBuffer2;
- byteBuffer2.SetCapacity(signatureSize);
- RINOK(ReadStream_FALSE(stream, byteBuffer2, signatureSize));
-
- if (memcmp(byteBuffer2, signature, signatureSize) == 0)
- return S_OK;
-
- const UInt32 kBufferSize = (1 << 16);
- CByteBuffer byteBuffer;
- byteBuffer.SetCapacity(kBufferSize);
- Byte *buffer = byteBuffer;
- UInt32 numPrevBytes = signatureSize - 1;
- memcpy(buffer, (const Byte *)byteBuffer2 + 1, numPrevBytes);
- resPos = 1;
- for (;;)
- {
- if (limit != NULL)
- if (resPos > *limit)
- return S_FALSE;
- do
- {
- UInt32 numReadBytes = kBufferSize - numPrevBytes;
- UInt32 processedSize;
- RINOK(stream->Read(buffer + numPrevBytes, numReadBytes, &processedSize));
- numPrevBytes += processedSize;
- if (processedSize == 0)
- return S_FALSE;
- }
- while (numPrevBytes < signatureSize);
- UInt32 numTests = numPrevBytes - signatureSize + 1;
- for (UInt32 pos = 0; pos < numTests; pos++)
- {
- Byte b = signature[0];
- for (; buffer[pos] != b && pos < numTests; pos++);
- if (pos == numTests)
- break;
- if (memcmp(buffer + pos, signature, signatureSize) == 0)
- {
- resPos += pos;
- return S_OK;
- }
- }
- resPos += numTests;
- numPrevBytes -= numTests;
- memmove(buffer, buffer + numTests, numPrevBytes);
- }
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/FindSignature.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/FindSignature.h
deleted file mode 100644
index e15af5732..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/FindSignature.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// FindSignature.h
-
-#ifndef __FINDSIGNATURE_H
-#define __FINDSIGNATURE_H
-
-#include "../../IStream.h"
-
-HRESULT FindSignatureInStream(ISequentialInStream *stream,
- const Byte *signature, unsigned signatureSize,
- const UInt64 *limit, UInt64 &resPos);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp
deleted file mode 100644
index 0526c1b1d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// OutStreamWithSha1.cpp
-
-#include "StdAfx.h"
-
-#include "OutStreamWithSha1.h"
-
-STDMETHODIMP COutStreamWithSha1::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- HRESULT result = S_OK;
- if (_stream)
- result = _stream->Write(data, size, &size);
- if (_calculate)
- _sha.Update((const Byte *)data, size);
- _size += size;
- if (processedSize != NULL)
- *processedSize = size;
- return result;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithSha1.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithSha1.h
deleted file mode 100644
index 3bbfbbe19..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithSha1.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// OutStreamWithSha1.h
-
-#ifndef __OUT_STREAM_WITH_SHA1_H
-#define __OUT_STREAM_WITH_SHA1_H
-
-#include "../../Crypto/Sha1.h"
-
-#include "../../../Common/MyCom.h"
-
-#include "../../IStream.h"
-
-class COutStreamWithSha1:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialOutStream> _stream;
- UInt64 _size;
- NCrypto::NSha1::CContext _sha;
- bool _calculate;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- void SetStream(ISequentialOutStream *stream) { _stream = stream; }
- void ReleaseStream() { _stream.Release(); }
- void Init(bool calculate = true)
- {
- _size = 0;
- _calculate = calculate;
- _sha.Init();
- }
- void InitSha1() { _sha.Init(); }
- UInt64 GetSize() const { return _size; }
- void Final(Byte *digest) { _sha.Final(digest); }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/CpioHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/CpioHandler.cpp
deleted file mode 100644
index 0f32ef663..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/CpioHandler.cpp
+++ /dev/null
@@ -1,624 +0,0 @@
-// CpioHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-#include "Common/StringToInt.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#include "Common/ItemNameUtils.h"
-
-namespace NArchive {
-namespace NCpio {
-
-namespace NFileHeader
-{
- namespace NMagic
- {
- const char *kMagic1 = "070701";
- const char *kMagic2 = "070702";
- const char *kMagic3 = "070707";
- const char *kEndName = "TRAILER!!!";
-
- const Byte kMagicForRecord2[2] = { 0xC7, 0x71 };
- }
-
- const UInt32 kRecord2Size = 26;
- /*
- struct CRecord2
- {
- unsigned short c_magic;
- short c_dev;
- unsigned short c_ino;
- unsigned short c_mode;
- unsigned short c_uid;
- unsigned short c_gid;
- unsigned short c_nlink;
- short c_rdev;
- unsigned short c_mtimes[2];
- unsigned short c_namesize;
- unsigned short c_filesizes[2];
- };
- */
-
- const UInt32 kRecordSize = 110;
- /*
- struct CRecord
- {
- char Magic[6]; // "070701" for "new" portable format, "070702" for CRC format
- char inode[8];
- char Mode[8];
- char UID[8];
- char GID[8];
- char nlink[8];
- char mtime[8];
- char Size[8]; // must be 0 for FIFOs and directories
- char DevMajor[8];
- char DevMinor[8];
- char RDevMajor[8]; //only valid for chr and blk special files
- char RDevMinor[8]; //only valid for chr and blk special files
- char NameSize[8]; // count includes terminating NUL in pathname
- char ChkSum[8]; // 0 for "new" portable format; for CRC format the sum of all the bytes in the file
- bool CheckMagic() const
- { return memcmp(Magic, NMagic::kMagic1, 6) == 0 ||
- memcmp(Magic, NMagic::kMagic2, 6) == 0; };
- };
- */
-
- const UInt32 kOctRecordSize = 76;
-
-}
-
-struct CItem
-{
- AString Name;
- UInt32 inode;
- UInt32 Mode;
- UInt32 UID;
- UInt32 GID;
- UInt32 Size;
- UInt32 MTime;
-
- // char LinkFlag;
- // AString LinkName; ?????
- char Magic[8];
- UInt32 NumLinks;
- UInt32 DevMajor;
- UInt32 DevMinor;
- UInt32 RDevMajor;
- UInt32 RDevMinor;
- UInt32 ChkSum;
-
- UInt32 Align;
-
- bool IsDir() const { return (Mode & 0170000) == 0040000; }
-};
-
-class CItemEx: public CItem
-{
-public:
- UInt64 HeaderPosition;
- UInt32 HeaderSize;
- UInt64 GetDataPosition() const { return HeaderPosition + HeaderSize; };
-};
-
-const UInt32 kMaxBlockSize = NFileHeader::kRecordSize;
-
-class CInArchive
-{
- CMyComPtr<IInStream> m_Stream;
- UInt64 m_Position;
-
- UInt16 _blockSize;
- Byte _block[kMaxBlockSize];
- UInt32 _blockPos;
- Byte ReadByte();
- UInt16 ReadUInt16();
- UInt32 ReadUInt32();
-
- bool ReadNumber(UInt32 &resultValue);
- bool ReadOctNumber(int size, UInt32 &resultValue);
-
- HRESULT ReadBytes(void *data, UInt32 size, UInt32 &processedSize);
-public:
- HRESULT Open(IInStream *inStream);
- HRESULT GetNextItem(bool &filled, CItemEx &itemInfo);
- HRESULT Skip(UInt64 numBytes);
- HRESULT SkipDataRecords(UInt64 dataSize, UInt32 align);
-};
-
-HRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 &processedSize)
-{
- size_t realProcessedSize = size;
- RINOK(ReadStream(m_Stream, data, &realProcessedSize));
- processedSize = (UInt32)realProcessedSize;
- m_Position += processedSize;
- return S_OK;
-}
-
-Byte CInArchive::ReadByte()
-{
- if (_blockPos >= _blockSize)
- throw "Incorrect cpio archive";
- return _block[_blockPos++];
-}
-
-UInt16 CInArchive::ReadUInt16()
-{
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- {
- Byte b = ReadByte();
- value |= (UInt16(b) << (8 * i));
- }
- return value;
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- {
- Byte b = ReadByte();
- value |= (UInt32(b) << (8 * i));
- }
- return value;
-}
-
-HRESULT CInArchive::Open(IInStream *inStream)
-{
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Position));
- m_Stream = inStream;
- return S_OK;
-}
-
-bool CInArchive::ReadNumber(UInt32 &resultValue)
-{
- resultValue = 0;
- for (int i = 0; i < 8; i++)
- {
- char c = char(ReadByte());
- int d;
- if (c >= '0' && c <= '9')
- d = c - '0';
- else if (c >= 'A' && c <= 'F')
- d = 10 + c - 'A';
- else if (c >= 'a' && c <= 'f')
- d = 10 + c - 'a';
- else
- return false;
- resultValue *= 0x10;
- resultValue += d;
- }
- return true;
-}
-
-static bool OctalToNumber(const char *s, UInt64 &res)
-{
- const char *end;
- res = ConvertOctStringToUInt64(s, &end);
- return (*end == ' ' || *end == 0);
-}
-
-static bool OctalToNumber32(const char *s, UInt32 &res)
-{
- UInt64 res64;
- if (!OctalToNumber(s, res64))
- return false;
- res = (UInt32)res64;
- return (res64 <= 0xFFFFFFFF);
-}
-
-bool CInArchive::ReadOctNumber(int size, UInt32 &resultValue)
-{
- char sz[32 + 4];
- int i;
- for (i = 0; i < size && i < 32; i++)
- sz[i] = (char)ReadByte();
- sz[i] = 0;
- return OctalToNumber32(sz, resultValue);
-}
-
-#define GetFromHex(y) { if (!ReadNumber(y)) return S_FALSE; }
-#define GetFromOct6(y) { if (!ReadOctNumber(6, y)) return S_FALSE; }
-#define GetFromOct11(y) { if (!ReadOctNumber(11, y)) return S_FALSE; }
-
-static unsigned short ConvertValue(unsigned short value, bool convert)
-{
- if (!convert)
- return value;
- return (unsigned short)((((unsigned short)(value & 0xFF)) << 8) | (value >> 8));
-}
-
-static UInt32 GetAlignedSize(UInt32 size, UInt32 align)
-{
- while ((size & (align - 1)) != 0)
- size++;
- return size;
-}
-
-
-HRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item)
-{
- filled = false;
-
- UInt32 processedSize;
- item.HeaderPosition = m_Position;
-
- _blockSize = kMaxBlockSize;
- RINOK(ReadBytes(_block, 2, processedSize));
- if (processedSize != 2)
- return S_FALSE;
- _blockPos = 0;
-
- UInt32 nameSize;
-
- bool oldBE =
- _block[0] == NFileHeader::NMagic::kMagicForRecord2[1] &&
- _block[1] == NFileHeader::NMagic::kMagicForRecord2[0];
-
- bool binMode = (_block[0] == NFileHeader::NMagic::kMagicForRecord2[0] &&
- _block[1] == NFileHeader::NMagic::kMagicForRecord2[1]) ||
- oldBE;
-
- if (binMode)
- {
- RINOK(ReadBytes(_block + 2, NFileHeader::kRecord2Size - 2, processedSize));
- if (processedSize != NFileHeader::kRecord2Size - 2)
- return S_FALSE;
- item.Align = 2;
- _blockPos = 2;
- item.DevMajor = 0;
- item.DevMinor = ConvertValue(ReadUInt16(), oldBE);
- item.inode = ConvertValue(ReadUInt16(), oldBE);
- item.Mode = ConvertValue(ReadUInt16(), oldBE);
- item.UID = ConvertValue(ReadUInt16(), oldBE);
- item.GID = ConvertValue(ReadUInt16(), oldBE);
- item.NumLinks = ConvertValue(ReadUInt16(), oldBE);
- item.RDevMajor =0;
- item.RDevMinor = ConvertValue(ReadUInt16(), oldBE);
- UInt16 timeHigh = ConvertValue(ReadUInt16(), oldBE);
- UInt16 timeLow = ConvertValue(ReadUInt16(), oldBE);
- item.MTime = (UInt32(timeHigh) << 16) + timeLow;
- nameSize = ConvertValue(ReadUInt16(), oldBE);
- UInt16 sizeHigh = ConvertValue(ReadUInt16(), oldBE);
- UInt16 sizeLow = ConvertValue(ReadUInt16(), oldBE);
- item.Size = (UInt32(sizeHigh) << 16) + sizeLow;
-
- item.ChkSum = 0;
- item.HeaderSize = GetAlignedSize(
- nameSize + NFileHeader::kRecord2Size, item.Align);
- nameSize = item.HeaderSize - NFileHeader::kRecord2Size;
- }
- else
- {
- RINOK(ReadBytes(_block + 2, 4, processedSize));
- if (processedSize != 4)
- return S_FALSE;
-
- bool magicOK =
- memcmp(_block, NFileHeader::NMagic::kMagic1, 6) == 0 ||
- memcmp(_block, NFileHeader::NMagic::kMagic2, 6) == 0;
- _blockPos = 6;
- if (magicOK)
- {
- RINOK(ReadBytes(_block + 6, NFileHeader::kRecordSize - 6, processedSize));
- if (processedSize != NFileHeader::kRecordSize - 6)
- return S_FALSE;
- item.Align = 4;
-
- GetFromHex(item.inode);
- GetFromHex(item.Mode);
- GetFromHex(item.UID);
- GetFromHex(item.GID);
- GetFromHex(item.NumLinks);
- UInt32 mTime;
- GetFromHex(mTime);
- item.MTime = mTime;
- GetFromHex(item.Size);
- GetFromHex(item.DevMajor);
- GetFromHex(item.DevMinor);
- GetFromHex(item.RDevMajor);
- GetFromHex(item.RDevMinor);
- GetFromHex(nameSize);
- GetFromHex(item.ChkSum);
- item.HeaderSize = GetAlignedSize(
- nameSize + NFileHeader::kRecordSize, item.Align);
- nameSize = item.HeaderSize - NFileHeader::kRecordSize;
- }
- else
- {
- if (!memcmp(_block, NFileHeader::NMagic::kMagic3, 6) == 0)
- return S_FALSE;
- RINOK(ReadBytes(_block + 6, NFileHeader::kOctRecordSize - 6, processedSize));
- if (processedSize != NFileHeader::kOctRecordSize - 6)
- return S_FALSE;
- item.Align = 1;
- item.DevMajor = 0;
- GetFromOct6(item.DevMinor);
- GetFromOct6(item.inode);
- GetFromOct6(item.Mode);
- GetFromOct6(item.UID);
- GetFromOct6(item.GID);
- GetFromOct6(item.NumLinks);
- item.RDevMajor = 0;
- GetFromOct6(item.RDevMinor);
- UInt32 mTime;
- GetFromOct11(mTime);
- item.MTime = mTime;
- GetFromOct6(nameSize);
- GetFromOct11(item.Size); // ?????
- item.HeaderSize = GetAlignedSize(
- nameSize + NFileHeader::kOctRecordSize, item.Align);
- nameSize = item.HeaderSize - NFileHeader::kOctRecordSize;
- }
- }
- if (nameSize == 0 || nameSize >= (1 << 27))
- return E_FAIL;
- RINOK(ReadBytes(item.Name.GetBuffer(nameSize), nameSize, processedSize));
- if (processedSize != nameSize)
- return E_FAIL;
- item.Name.ReleaseBuffer();
- if (strcmp(item.Name, NFileHeader::NMagic::kEndName) == 0)
- return S_OK;
- filled = true;
- return S_OK;
-}
-
-HRESULT CInArchive::Skip(UInt64 numBytes)
-{
- UInt64 newPostion;
- RINOK(m_Stream->Seek(numBytes, STREAM_SEEK_CUR, &newPostion));
- m_Position += numBytes;
- if (m_Position != newPostion)
- return E_FAIL;
- return S_OK;
-}
-
-HRESULT CInArchive::SkipDataRecords(UInt64 dataSize, UInt32 align)
-{
- while ((dataSize & (align - 1)) != 0)
- dataSize++;
- return Skip(dataSize);
-}
-
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CObjectVector<CItemEx> _items;
- CMyComPtr<IInStream> _stream;
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-/*
-enum
-{
- kpidinode = kpidUserDefined,
- kpidiChkSum
-};
-*/
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidPosixAttrib, VT_UI4},
- // { L"inode", kpidinode, VT_UI4}
- // { L"CheckSum", kpidiChkSum, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- // try
- {
- CInArchive archive;
-
- UInt64 endPos = 0;
- bool needSetTotal = true;
-
- if (callback != NULL)
- {
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
-
- RINOK(archive.Open(stream));
-
- _items.Clear();
-
- for (;;)
- {
- CItemEx item;
- bool filled;
- HRESULT result = archive.GetNextItem(filled, item);
- if (result == S_FALSE)
- return S_FALSE;
- if (result != S_OK)
- return S_FALSE;
- if (!filled)
- break;
- _items.Add(item);
- archive.SkipDataRecords(item.Size, item.Align);
- if (callback != NULL)
- {
- if (needSetTotal)
- {
- RINOK(callback->SetTotal(NULL, &endPos));
- needSetTotal = false;
- }
- if (_items.Size() % 100 == 0)
- {
- UInt64 numFiles = _items.Size();
- UInt64 numBytes = item.HeaderPosition;
- RINOK(callback->SetCompleted(&numFiles, &numBytes));
- }
- }
- }
- if (_items.Size() == 0)
- return S_FALSE;
-
- _stream = stream;
- }
- /*
- catch(...)
- {
- return S_FALSE;
- }
- */
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _items.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItemEx &item = _items[index];
-
- switch(propID)
- {
- case kpidPath: prop = NItemName::GetOSName(MultiByteToUnicodeString(item.Name, CP_OEMCP)); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)item.Size;
- break;
- case kpidMTime:
- {
- if (item.MTime != 0)
- {
- FILETIME utc;
- NWindows::NTime::UnixTimeToFileTime(item.MTime, utc);
- prop = utc;
- }
- break;
- }
- case kpidPosixAttrib: prop = item.Mode; break;
- /*
- case kpidinode: prop = item.inode; break;
- case kpidiChkSum: prop = item.ChkSum; break;
- */
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItemEx &item = _items[index];
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- currentTotalSize += item.Size;
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (testMode)
- {
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- RINOK(_stream->Seek(item.GetDataPosition(), STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItemEx &item = _items[index];
- return CreateLimitedInStream(_stream, item.GetDataPosition(), item.Size, stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NCpio::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Cpio", L"cpio", 0, 0xED, { 0 }, 0, false, CreateArc, 0 };
-
-REGISTER_ARC(Cpio)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/CramfsHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/CramfsHandler.cpp
deleted file mode 100644
index a55e3743d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/CramfsHandler.cpp
+++ /dev/null
@@ -1,644 +0,0 @@
-// CramfsHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/CpuArch.h"
-#include "../../../C/Alloc.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariantUtils.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-#include "../Compress/ZlibDecoder.h"
-
-namespace NArchive {
-namespace NCramfs {
-
-#define SIGNATURE { 'C','o','m','p','r','e','s','s','e','d',' ','R','O','M','F','S' }
-
-static const UInt32 kSignatureSize = 16;
-static const char kSignature[kSignatureSize] = SIGNATURE;
-
-static const UInt32 kArcSizeMax = (256 + 16) << 20;
-static const UInt32 kNumFilesMax = (1 << 19);
-static const unsigned kNumDirLevelsMax = (1 << 8);
-
-static const UInt32 kHeaderSize = 0x40;
-static const unsigned kHeaderNameSize = 16;
-static const UInt32 kNodeSize = 12;
-
-static const UInt32 kFlag_FsVer2 = (1 << 0);
-
-static const CUInt32PCharPair k_Flags[] =
-{
- { 0, "Ver2" },
- { 1, "SortedDirs" },
- { 8, "Holes" },
- { 9, "WrongSignature" },
- { 10, "ShiftedRootOffset" }
-};
-
-static const unsigned kBlockSizeLog = 12;
-static const UInt32 kBlockSize = 1 << kBlockSizeLog;
-
-/*
-struct CNode
-{
- UInt16 Mode;
- UInt16 Uid;
- UInt32 Size;
- Byte Gid;
- UInt32 NameLen;
- UInt32 Offset;
-
- void Parse(const Byte *p)
- {
- Mode = GetUi16(p);
- Uid = GetUi16(p + 2);
- Size = Get32(p + 4) & 0xFFFFFF;
- Gid = p[7];
- NameLen = p[8] & 0x3F;
- Offset = Get32(p + 8) >> 6;
- }
-};
-*/
-
-#define Get32(p) (be ? GetBe32(p) : GetUi32(p))
-
-static UInt32 GetMode(const Byte *p, bool be) { return be ? GetBe16(p) : GetUi16(p); }
-static bool IsDir(const Byte *p, bool be) { return (GetMode(p, be) & 0xF000) == 0x4000; }
-
-static UInt32 GetSize(const Byte *p, bool be)
-{
- if (be)
- return GetBe32(p + 4) >> 8;
- else
- return GetUi32(p + 4) & 0xFFFFFF;
-}
-
-static UInt32 GetNameLen(const Byte *p, bool be)
-{
- if (be)
- return (p[8] & 0xFC);
- else
- return (p[8] & 0x3F) << 2;
-}
-
-static UInt32 GetOffset(const Byte *p, bool be)
-{
- if (be)
- return (GetBe32(p + 8) & 0x03FFFFFF) << 2;
- else
- return GetUi32(p + 8) >> 6 << 2;
-}
-
-struct CItem
-{
- UInt32 Offset;
- int Parent;
-};
-
-struct CHeader
-{
- bool be;
- UInt32 Size;
- UInt32 Flags;
- // UInt32 Future;
- UInt32 Crc;
- // UInt32 Edition;
- UInt32 NumBlocks;
- UInt32 NumFiles;
- char Name[kHeaderNameSize];
-
- bool Parse(const Byte *p)
- {
- if (memcmp(p + 16, kSignature, kSignatureSize) != 0)
- return false;
- switch(GetUi32(p))
- {
- case 0x28CD3D45: be = false; break;
- case 0x453DCD28: be = true; break;
- default: return false;
- }
- Size = Get32(p + 4);
- Flags = Get32(p + 8);
- // Future = Get32(p + 0xC);
- Crc = Get32(p + 0x20);
- // Edition = Get32(p + 0x24);
- NumBlocks = Get32(p + 0x28);
- NumFiles = Get32(p + 0x2C);
- memcpy(Name, p + 0x30, kHeaderNameSize);
- return true;
- }
-
- bool IsVer2() const { return (Flags & kFlag_FsVer2) != 0; }
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CRecordVector<CItem> _items;
- CMyComPtr<IInStream> _stream;
- Byte *_data;
- UInt32 _size;
- UInt32 _headersSize;
- AString _errorMessage;
- CHeader _h;
-
- // Current file
-
- NCompress::NZlib::CDecoder *_zlibDecoderSpec;
- CMyComPtr<ICompressCoder> _zlibDecoder;
-
- CBufInStream *_inStreamSpec;
- CMyComPtr<ISequentialInStream> _inStream;
-
- CBufPtrSeqOutStream *_outStreamSpec;
- CMyComPtr<ISequentialOutStream> _outStream;
-
- UInt32 _curBlocksOffset;
- UInt32 _curNumBlocks;
-
- HRESULT OpenDir(int parent, UInt32 baseOffsetBase, unsigned level);
- HRESULT Open2(IInStream *inStream);
- AString GetPath(int index) const;
- bool GetPackSize(int index, UInt32 &res) const;
- void Free();
-public:
- CHandler(): _data(0) {}
- ~CHandler() { Free(); }
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
- HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize);
-};
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI4},
- { NULL, kpidPackSize, VT_UI4},
- { NULL, kpidPosixAttrib, VT_UI4}
- // { NULL, kpidOffset, VT_UI4}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidName, VT_BSTR},
- { NULL, kpidBigEndian, VT_BOOL},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidPhySize, VT_UI4},
- { NULL, kpidHeadersSize, VT_UI4},
- { NULL, kpidNumSubFiles, VT_UI4},
- { NULL, kpidNumBlocks, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-HRESULT CHandler::OpenDir(int parent, UInt32 baseOffset, unsigned level)
-{
- const Byte *p = _data + baseOffset;
- bool be = _h.be;
- if (!IsDir(p, be))
- return S_OK;
- UInt32 offset = GetOffset(p, be);
- UInt32 size = GetSize(p, be);
- if (offset == 0 && size == 0)
- return S_OK;
- UInt32 end = offset + size;
- if (offset < kHeaderSize || end > _size || level > kNumDirLevelsMax)
- return S_FALSE;
- if (end > _headersSize)
- _headersSize = end;
-
- int startIndex = _items.Size();
-
- while (size != 0)
- {
- if (size < kNodeSize || (UInt32)_items.Size() >= kNumFilesMax)
- return S_FALSE;
- CItem item;
- item.Parent = parent;
- item.Offset = offset;
- _items.Add(item);
- UInt32 nodeLen = kNodeSize + GetNameLen(_data + offset, be);
- if (size < nodeLen)
- return S_FALSE;
- offset += nodeLen;
- size -= nodeLen;
- }
-
- int endIndex = _items.Size();
- for (int i = startIndex; i < endIndex; i++)
- {
- RINOK(OpenDir(i, _items[i].Offset, level + 1));
- }
- return S_OK;
-}
-
-HRESULT CHandler::Open2(IInStream *inStream)
-{
- Byte buf[kHeaderSize];
- RINOK(ReadStream_FALSE(inStream, buf, kHeaderSize));
- if (!_h.Parse(buf))
- return S_FALSE;
- if (_h.IsVer2())
- {
- if (_h.Size < kHeaderSize || _h.Size > kArcSizeMax || _h.NumFiles > kNumFilesMax)
- return S_FALSE;
- }
- else
- {
- UInt64 size;
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &size));
- if (size > kArcSizeMax)
- return S_FALSE;
- _h.Size = (UInt32)size;
- RINOK(inStream->Seek(kHeaderSize, STREAM_SEEK_SET, NULL));
- }
- _data = (Byte *)MidAlloc(_h.Size);
- if (_data == 0)
- return E_OUTOFMEMORY;
- memcpy(_data, buf, kHeaderSize);
- size_t processed = _h.Size - kHeaderSize;
- RINOK(ReadStream(inStream, _data + kHeaderSize, &processed));
- if (processed < kNodeSize)
- return S_FALSE;
- _size = kHeaderSize + (UInt32)processed;
- if (_size != _h.Size)
- _errorMessage = "Unexpected end of archive";
- else
- {
- SetUi32(_data + 0x20, 0);
- if (_h.IsVer2())
- if (CrcCalc(_data, _h.Size) != _h.Crc)
- _errorMessage = "CRC error";
- }
- if (_h.IsVer2())
- _items.Reserve(_h.NumFiles - 1);
- return OpenDir(-1, kHeaderSize, 0);
-}
-
-AString CHandler::GetPath(int index) const
-{
- unsigned len = 0;
- int indexMem = index;
- do
- {
- const CItem &item = _items[index];
- index = item.Parent;
- const Byte *p = _data + item.Offset;
- unsigned size = GetNameLen(p, _h.be);
- p += kNodeSize;
- unsigned i;
- for (i = 0; i < size && p[i]; i++);
- len += i + 1;
- }
- while (index >= 0);
- len--;
-
- AString path;
- char *dest = path.GetBuffer(len) + len;
- index = indexMem;
- for (;;)
- {
- const CItem &item = _items[index];
- index = item.Parent;
- const Byte *p = _data + item.Offset;
- unsigned size = GetNameLen(p, _h.be);
- p += kNodeSize;
- unsigned i;
- for (i = 0; i < size && p[i]; i++);
- dest -= i;
- memcpy(dest, p, i);
- if (index < 0)
- break;
- *(--dest) = CHAR_PATH_SEPARATOR;
- }
- path.ReleaseBuffer(len);
- return path;
-}
-
-bool CHandler::GetPackSize(int index, UInt32 &res) const
-{
- const CItem &item = _items[index];
- const Byte *p = _data + item.Offset;
- bool be = _h.be;
- UInt32 offset = GetOffset(p, be);
- if (offset < kHeaderSize)
- return false;
- UInt32 numBlocks = (GetSize(p, be) + kBlockSize - 1) >> kBlockSizeLog;
- UInt32 start = offset + numBlocks * 4;
- if (start > _size)
- return false;
- UInt32 end = Get32(_data + start - 4);
- if (end < start)
- return false;
- res = end - start;
- return true;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback * /* callback */)
-{
- COM_TRY_BEGIN
- {
- Close();
- RINOK(Open2(stream));
- _stream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-void CHandler::Free()
-{
- MidFree(_data);
- _data = 0;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _headersSize = 0;
- _items.Clear();
- _stream.Release();
- _errorMessage.Empty();
- Free();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidName:
- {
- char dest[kHeaderNameSize + 4];
- memcpy(dest, _h.Name, kHeaderNameSize);
- dest[kHeaderNameSize] = 0;
- prop = dest;
- break;
- }
- case kpidBigEndian: prop = _h.be; break;
- case kpidCharacts: FLAGS_TO_PROP(k_Flags, _h.Flags, prop); break;
- case kpidNumBlocks: if (_h.IsVer2()) prop = _h.NumBlocks; break;
- case kpidNumSubFiles: if (_h.IsVer2()) prop = _h.NumFiles; break;
- case kpidPhySize: if (_h.IsVer2()) prop = _h.Size; break;
- case kpidHeadersSize: prop = _headersSize; break;
- case kpidError: if (!_errorMessage.IsEmpty()) prop = _errorMessage; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _items[index];
- const Byte *p = _data + item.Offset;
- bool be = _h.be;
- bool isDir = IsDir(p, be);
- switch(propID)
- {
- case kpidPath: prop = MultiByteToUnicodeString(GetPath(index), CP_OEMCP); break;
- case kpidIsDir: prop = isDir; break;
- // case kpidOffset: prop = (UInt32)GetOffset(p, be); break;
- case kpidSize: if (!isDir) prop = GetSize(p, be); break;
- case kpidPackSize:
- if (!isDir)
- {
- UInt32 size;
- if (GetPackSize(index, size))
- prop = size;
- }
- break;
- case kpidPosixAttrib: prop = (UInt32)GetMode(p, be); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CCramfsInStream: public CCachedInStream
-{
- HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize);
-public:
- CHandler *Handler;
-};
-
-HRESULT CCramfsInStream::ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize)
-{
- return Handler->ReadBlock(blockIndex, dest, blockSize);
-}
-
-HRESULT CHandler::ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize)
-{
- if (!_zlibDecoder)
- {
- _zlibDecoderSpec = new NCompress::NZlib::CDecoder();
- _zlibDecoder = _zlibDecoderSpec;
- }
- if (!_inStream)
- {
- _inStreamSpec = new CBufInStream();
- _inStream = _inStreamSpec;
- }
- if (!_outStream)
- {
- _outStreamSpec = new CBufPtrSeqOutStream();
- _outStream = _outStreamSpec;
- }
- bool be = _h.be;
- const Byte *p = _data + (_curBlocksOffset + (UInt32)blockIndex * 4);
- UInt32 start = (blockIndex == 0 ? _curBlocksOffset + _curNumBlocks * 4: Get32(p - 4));
- UInt32 end = Get32(p);
- if (end < start || end > _size)
- return S_FALSE;
- UInt32 inSize = end - start;
- _inStreamSpec->Init(_data + start, inSize);
- _outStreamSpec->Init(dest, blockSize);
- RINOK(_zlibDecoder->Code(_inStream, _outStream, NULL, NULL, NULL));
- return (_zlibDecoderSpec->GetInputProcessedSize() == inSize &&
- _outStreamSpec->GetPos() == blockSize) ? S_OK : S_FALSE;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- bool be = _h.be;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const Byte *p = _data + _items[allFilesMode ? i : indices[i]].Offset;
- if (!IsDir(p, be))
- totalSize += GetSize(p, be);
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- const Byte *p = _data + item.Offset;
-
- if (IsDir(p, be))
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- UInt32 curSize = GetSize(p, be);
- totalSize += curSize;
- UInt32 packSize;
- if (GetPackSize(index, packSize))
- totalPackSize += packSize;
-
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- UInt32 offset = GetOffset(p, be);
- if (offset < kHeaderSize)
- curSize = 0;
-
- int res = NExtract::NOperationResult::kDataError;
- {
- CMyComPtr<ISequentialInStream> inSeqStream;
- CMyComPtr<IInStream> inStream;
- HRESULT hres = GetStream(index, &inSeqStream);
- if (inSeqStream)
- inSeqStream.QueryInterface(IID_IInStream, &inStream);
- if (hres == E_OUTOFMEMORY)
- return E_OUTOFMEMORY;
- if (hres == S_FALSE || !inStream)
- res = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- RINOK(hres);
- if (inStream)
- {
- HRESULT hres = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (hres != S_OK && hres != S_FALSE)
- {
- RINOK(hres);
- }
- if (copyCoderSpec->TotalSize == curSize && hres == S_OK)
- res = NExtract::NOperationResult::kOK;
- }
- }
- }
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
-
- const CItem &item = _items[index];
- const Byte *p = _data + item.Offset;
-
- bool be = _h.be;
- if (IsDir(p, be))
- return E_FAIL;
-
- UInt32 size = GetSize(p, be);
- UInt32 numBlocks = (size + kBlockSize - 1) >> kBlockSizeLog;
- UInt32 offset = GetOffset(p, be);
- if (offset < kHeaderSize)
- {
- if (offset != 0)
- return S_FALSE;
- CBufInStream *streamSpec = new CBufInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- streamSpec->Init(NULL, 0);
- *stream = streamTemp.Detach();
- return S_OK;
- }
-
- if (offset + numBlocks * 4 > _size)
- return S_FALSE;
- UInt32 prev = offset;
- for (UInt32 i = 0; i < numBlocks; i++)
- {
- UInt32 next = Get32(_data + offset + i * 4);
- if (next < prev || next > _size)
- return S_FALSE;
- prev = next;
- }
-
- CCramfsInStream *streamSpec = new CCramfsInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- _curNumBlocks = numBlocks;
- _curBlocksOffset = offset;
- streamSpec->Handler = this;
- if (!streamSpec->Alloc(kBlockSizeLog, 21 - kBlockSizeLog))
- return E_OUTOFMEMORY;
- streamSpec->Init(size);
- *stream = streamTemp.Detach();
-
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NCramfs::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"CramFS", L"cramfs", 0, 0xD3, SIGNATURE, kSignatureSize, false, CreateArc, 0 };
-
-REGISTER_ARC(Cramfs)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/DebHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/DebHandler.cpp
deleted file mode 100644
index 82d2cde88..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/DebHandler.cpp
+++ /dev/null
@@ -1,413 +0,0 @@
-// DebHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-#include "Common/StringToInt.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#include "Common/ItemNameUtils.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-namespace NArchive {
-namespace NDeb {
-
-namespace NHeader
-{
- const int kSignatureLen = 8;
-
- const char *kSignature = "!<arch>\n";
-
- const int kNameSize = 16;
- const int kTimeSize = 12;
- const int kModeSize = 8;
- const int kSizeSize = 10;
-
- /*
- struct CHeader
- {
- char Name[kNameSize];
- char MTime[kTimeSize];
- char Number0[6];
- char Number1[6];
- char Mode[kModeSize];
- char Size[kSizeSize];
- char Quote;
- char NewLine;
- };
- */
- const int kHeaderSize = kNameSize + kTimeSize + 6 + 6 + kModeSize + kSizeSize + 1 + 1;
-}
-
-struct CItem
-{
- AString Name;
- UInt64 Size;
- UInt32 MTime;
- UInt32 Mode;
-
- UInt64 HeaderPos;
- UInt64 GetDataPos() const { return HeaderPos + NHeader::kHeaderSize; };
- // UInt64 GetFullSize() const { return NFileHeader::kRecordSize + Size; };
-};
-
-class CInArchive
-{
- CMyComPtr<IInStream> m_Stream;
-
- HRESULT GetNextItemReal(bool &filled, CItem &itemInfo);
-public:
- UInt64 m_Position;
- HRESULT Open(IInStream *inStream);
- HRESULT GetNextItem(bool &filled, CItem &itemInfo);
- HRESULT SkipData(UInt64 dataSize);
-};
-
-HRESULT CInArchive::Open(IInStream *inStream)
-{
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Position));
- char signature[NHeader::kSignatureLen];
- RINOK(ReadStream_FALSE(inStream, signature, NHeader::kSignatureLen));
- m_Position += NHeader::kSignatureLen;
- if (memcmp(signature, NHeader::kSignature, NHeader::kSignatureLen) != 0)
- return S_FALSE;
- m_Stream = inStream;
- return S_OK;
-}
-
-static void MyStrNCpy(char *dest, const char *src, int size)
-{
- for (int i = 0; i < size; i++)
- {
- char c = src[i];
- dest[i] = c;
- if (c == 0)
- break;
- }
-}
-
-static bool OctalToNumber(const char *s, int size, UInt64 &res)
-{
- char sz[32];
- MyStrNCpy(sz, s, size);
- sz[size] = 0;
- const char *end;
- int i;
- for (i = 0; sz[i] == ' '; i++);
- res = ConvertOctStringToUInt64(sz + i, &end);
- return (*end == ' ' || *end == 0);
-}
-
-static bool OctalToNumber32(const char *s, int size, UInt32 &res)
-{
- UInt64 res64;
- if (!OctalToNumber(s, size, res64))
- return false;
- res = (UInt32)res64;
- return (res64 <= 0xFFFFFFFF);
-}
-
-static bool DecimalToNumber(const char *s, int size, UInt64 &res)
-{
- char sz[32];
- MyStrNCpy(sz, s, size);
- sz[size] = 0;
- const char *end;
- int i;
- for (i = 0; sz[i] == ' '; i++);
- res = ConvertStringToUInt64(sz + i, &end);
- return (*end == ' ' || *end == 0);
-}
-
-static bool DecimalToNumber32(const char *s, int size, UInt32 &res)
-{
- UInt64 res64;
- if (!DecimalToNumber(s, size, res64))
- return false;
- res = (UInt32)res64;
- return (res64 <= 0xFFFFFFFF);
-}
-
-#define RIF(x) { if (!(x)) return S_FALSE; }
-
-
-HRESULT CInArchive::GetNextItemReal(bool &filled, CItem &item)
-{
- filled = false;
-
- char header[NHeader::kHeaderSize];
- const char *cur = header;
-
- size_t processedSize = sizeof(header);
- item.HeaderPos = m_Position;
- RINOK(ReadStream(m_Stream, header, &processedSize));
- if (processedSize != sizeof(header))
- return S_OK;
- m_Position += processedSize;
-
- char tempString[NHeader::kNameSize + 1];
- MyStrNCpy(tempString, cur, NHeader::kNameSize);
- cur += NHeader::kNameSize;
- tempString[NHeader::kNameSize] = '\0';
- item.Name = tempString;
- item.Name.Trim();
-
- for (int i = 0; i < item.Name.Length(); i++)
- if (((Byte)item.Name[i]) < 0x20)
- return S_FALSE;
-
- RIF(DecimalToNumber32(cur, NHeader::kTimeSize, item.MTime));
- cur += NHeader::kTimeSize;
-
- cur += 6 + 6;
-
- RIF(OctalToNumber32(cur, NHeader::kModeSize, item.Mode));
- cur += NHeader::kModeSize;
-
- RIF(DecimalToNumber(cur, NHeader::kSizeSize, item.Size));
- cur += NHeader::kSizeSize;
-
- filled = true;
- return S_OK;
-}
-
-HRESULT CInArchive::GetNextItem(bool &filled, CItem &item)
-{
- for (;;)
- {
- RINOK(GetNextItemReal(filled, item));
- if (!filled)
- return S_OK;
- if (item.Name.Compare("debian-binary") != 0)
- return S_OK;
- if (item.Size != 4)
- return S_OK;
- SkipData(item.Size);
- }
-}
-
-HRESULT CInArchive::SkipData(UInt64 dataSize)
-{
- return m_Stream->Seek((dataSize + 1) & (~((UInt64)0x1)), STREAM_SEEK_CUR, &m_Position);
-}
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CObjectVector<CItem> _items;
- CMyComPtr<IInStream> _stream;
- Int32 _mainSubfile;
- UInt64 _phySize;
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidPhySize, VT_UI8}
-};
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback *openArchiveCallback)
-{
- COM_TRY_BEGIN
- {
- _mainSubfile = -1;
- CInArchive archive;
- if (archive.Open(stream) != S_OK)
- return S_FALSE;
- _items.Clear();
-
- if (openArchiveCallback != NULL)
- {
- RINOK(openArchiveCallback->SetTotal(NULL, NULL));
- UInt64 numFiles = _items.Size();
- RINOK(openArchiveCallback->SetCompleted(&numFiles, NULL));
- }
-
- for (;;)
- {
- CItem item;
- bool filled;
- HRESULT result = archive.GetNextItem(filled, item);
- if (result == S_FALSE)
- return S_FALSE;
- if (result != S_OK)
- return S_FALSE;
- if (!filled)
- break;
- if (item.Name.Left(5) == "data.")
- _mainSubfile = _items.Size();
- _items.Add(item);
- archive.SkipData(item.Size);
- if (openArchiveCallback != NULL)
- {
- UInt64 numFiles = _items.Size();
- RINOK(openArchiveCallback->SetCompleted(&numFiles, NULL));
- }
- }
- _stream = stream;
- _phySize = archive.m_Position;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _items.Clear();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: prop = _phySize; break;
- case kpidMainSubfile: if (_mainSubfile >= 0) prop = (UInt32)_mainSubfile; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _items[index];
-
- switch(propID)
- {
- case kpidPath: prop = (const wchar_t *)NItemName::GetOSName2(MultiByteToUnicodeString(item.Name, CP_OEMCP)); break;
- case kpidSize:
- case kpidPackSize:
- prop = item.Size;
- break;
- case kpidMTime:
- {
- if (item.MTime != 0)
- {
- FILETIME fileTime;
- NTime::UnixTimeToFileTime(item.MTime, fileTime);
- prop = fileTime;
- }
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- currentTotalSize += item.Size;
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (testMode)
- {
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- RINOK(_stream->Seek(item.GetDataPos(), STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
- RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItem &item = _items[index];
- return CreateLimitedInStream(_stream, item.GetDataPos(), item.Size, stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NDeb::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Deb", L"deb", 0, 0xEC, { '!', '<', 'a', 'r', 'c', 'h', '>', '\n' }, 8, false, CreateArc, 0 };
-
-REGISTER_ARC(Deb)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/DeflateProps.cpp b/src/libs/7zip/win/CPP/7zip/Archive/DeflateProps.cpp
deleted file mode 100644
index 8498e0565..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/DeflateProps.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-// DeflateProps.cpp
-
-#include "StdAfx.h"
-
-#include "Windows/PropVariant.h"
-
-#include "Common/ParseProperties.h"
-
-#include "DeflateProps.h"
-
-namespace NArchive {
-
-static const UInt32 kAlgo1 = 0;
-static const UInt32 kAlgo5 = 1;
-
-static const UInt32 kPasses1 = 1;
-static const UInt32 kPasses7 = 3;
-static const UInt32 kPasses9 = 10;
-
-static const UInt32 kFb1 = 32;
-static const UInt32 kFb7 = 64;
-static const UInt32 kFb9 = 128;
-
-void CDeflateProps::Normalize()
-{
- UInt32 level = Level;
- if (level == 0xFFFFFFFF)
- level = 5;
-
- if (Algo == 0xFFFFFFFF)
- Algo = (level >= 5 ?
- kAlgo5 :
- kAlgo1);
-
- if (NumPasses == 0xFFFFFFFF)
- NumPasses =
- (level >= 9 ? kPasses9 :
- (level >= 7 ? kPasses7 :
- kPasses1));
- if (Fb == 0xFFFFFFFF)
- Fb =
- (level >= 9 ? kFb9 :
- (level >= 7 ? kFb7 :
- kFb1));
-}
-
-HRESULT CDeflateProps::SetCoderProperties(ICompressSetCoderProperties *setCoderProperties)
-{
- Normalize();
-
- NWindows::NCOM::CPropVariant props[] =
- {
- Algo,
- NumPasses,
- Fb,
- Mc
- };
- PROPID propIDs[] =
- {
- NCoderPropID::kAlgorithm,
- NCoderPropID::kNumPasses,
- NCoderPropID::kNumFastBytes,
- NCoderPropID::kMatchFinderCycles
- };
- int numProps = sizeof(propIDs) / sizeof(propIDs[0]);
- if (!McDefined)
- numProps--;
- return setCoderProperties->SetCoderProperties(propIDs, props, numProps);
-}
-
-HRESULT CDeflateProps::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps)
-{
- Init();
- for (int i = 0; i < numProps; i++)
- {
- UString name = names[i];
- name.MakeUpper();
- if (name.IsEmpty())
- return E_INVALIDARG;
- const PROPVARIANT &prop = values[i];
- if (name[0] == L'X')
- {
- UInt32 a = 9;
- RINOK(ParsePropValue(name.Mid(1), prop, a));
- Level = a;
- }
- else if (name.Left(1) == L"A")
- {
- UInt32 a = kAlgo5;
- RINOK(ParsePropValue(name.Mid(1), prop, a));
- Algo = a;
- }
- else if (name.Left(4) == L"PASS")
- {
- UInt32 a = kPasses9;
- RINOK(ParsePropValue(name.Mid(4), prop, a));
- NumPasses = a;
- }
- else if (name.Left(2) == L"FB")
- {
- UInt32 a = kFb9;
- RINOK(ParsePropValue(name.Mid(2), prop, a));
- Fb = a;
- }
- else if (name.Left(2) == L"MC")
- {
- UInt32 a = 0xFFFFFFFF;
- RINOK(ParsePropValue(name.Mid(2), prop, a));
- Mc = a;
- McDefined = true;
- }
- else
- return E_INVALIDARG;
- }
- return S_OK;
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/DeflateProps.h b/src/libs/7zip/win/CPP/7zip/Archive/DeflateProps.h
deleted file mode 100644
index e05a9d4aa..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/DeflateProps.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// DeflateProps.h
-
-#ifndef __DEFLATE_PROPS_H
-#define __DEFLATE_PROPS_H
-
-#include "../ICoder.h"
-
-namespace NArchive {
-
-class CDeflateProps
-{
- UInt32 Level;
- UInt32 NumPasses;
- UInt32 Fb;
- UInt32 Algo;
- UInt32 Mc;
- bool McDefined;
-
- void Init()
- {
- Level = NumPasses = Fb = Algo = Mc = 0xFFFFFFFF;
- McDefined = false;
- }
- void Normalize();
-public:
- CDeflateProps() { Init(); }
- bool IsMaximum() const { return Algo > 0; }
-
- HRESULT SetCoderProperties(ICompressSetCoderProperties *setCoderProperties);
- HRESULT SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps);
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/DllExports.cpp b/src/libs/7zip/win/CPP/7zip/Archive/DllExports.cpp
deleted file mode 100644
index 6c72dea71..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/DllExports.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-// DLLExports.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/MyInitGuid.h"
-#include "../../Common/ComTry.h"
-#include "../../Common/Types.h"
-
-#include "../../Windows/NtCheck.h"
-#include "../../Windows/PropVariant.h"
-
-#include "IArchive.h"
-#include "../ICoder.h"
-#include "../IPassword.h"
-
-HINSTANCE g_hInstance;
-
-#define NT_CHECK_FAIL_ACTION return FALSE;
-
-extern "C"
-BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
-{
- if (dwReason == DLL_PROCESS_ATTACH)
- {
- g_hInstance = hInstance;
- NT_CHECK;
- }
- return TRUE;
-}
-
-DEFINE_GUID(CLSID_CArchiveHandler,
-0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00);
-
-STDAPI CreateArchiver(const GUID *classID, const GUID *iid, void **outObject);
-
-STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject)
-{
- return CreateArchiver(clsid, iid, outObject);
-}
-
-STDAPI SetLargePageMode()
-{
- #if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES)
- SetLargePageSize();
- #endif
- return S_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/DmgHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/DmgHandler.cpp
deleted file mode 100644
index 5040d5182..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/DmgHandler.cpp
+++ /dev/null
@@ -1,918 +0,0 @@
-// DmgHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyXml.h"
-#include "Common/UTFConvert.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/BZip2Decoder.h"
-#include "../Compress/CopyCoder.h"
-#include "../Compress/ZlibDecoder.h"
-
-// #define DMG_SHOW_RAW
-
-// #include <stdio.h>
-#define PRF(x) // x
-
-#define Get32(p) GetBe32(p)
-#define Get64(p) GetBe64(p)
-
-static int Base64ToByte(char c)
-{
- if (c >= 'A' && c <= 'Z') return c - 'A';
- if (c >= 'a' && c <= 'z') return c - 'a' + 26;
- if (c >= '0' && c <= '9') return c - '0' + 52;
- if (c == '+') return 62;
- if (c == '/') return 63;
- if (c == '=') return 0;
- return -1;
-}
-
-static int Base64ToBin(Byte *dest, const char *src, int srcLen)
-{
- int srcPos = 0;
- int destPos = 0;
- while (srcPos < srcLen)
- {
- Byte buf[4];
- int filled = 0;
- while (srcPos < srcLen)
- {
- int n = Base64ToByte(src[srcPos++]);
- if (n >= 0)
- {
- buf[filled++] = (Byte)n;
- if (filled == 4)
- break;
- }
- }
- if (filled >= 2) { if (dest) dest[destPos] = (buf[0] << 2) | (buf[1] >> 4); destPos++; }
- if (filled >= 3) { if (dest) dest[destPos] = (buf[1] << 4) | (buf[2] >> 2); destPos++; }
- if (filled >= 4) { if (dest) dest[destPos] = (buf[2] << 6) | (buf[3] ); destPos++; }
- }
- return destPos;
-}
-
-static UString GetSizeString(UInt64 value)
-{
- wchar_t s[32];
- wchar_t c;
- if (value < (UInt64)20000) c = 0;
- else if (value < ((UInt64)20000 << 10)) { value >>= 10; c = L'K'; }
- else if (value < ((UInt64)20000 << 20)) { value >>= 20; c = L'M'; }
- else { value >>= 30; c = L'G'; }
- ConvertUInt64ToString(value, s);
- int p = MyStringLen(s);
- s[p++] = c;
- s[p++] = L'\0';
- return s;
-}
-
-namespace NArchive {
-namespace NDmg {
-
-struct CBlock
-{
- UInt32 Type;
- UInt64 UnpPos;
- UInt64 UnpSize;
- UInt64 PackPos;
- UInt64 PackSize;
-
- UInt64 GetNextPackOffset() const { return PackPos + PackSize; }
-};
-
-struct CFile
-{
- CByteBuffer Raw;
- UInt64 StartPos;
- CRecordVector<CBlock> Blocks;
- UInt64 GetUnpackSize() const
- {
- UInt64 size = 0;
- for (int i = 0; i < Blocks.Size(); i++)
- size += Blocks[i].UnpSize;
- return size;
- };
- UInt64 GetPackSize() const
- {
- UInt64 size = 0;
- for (int i = 0; i < Blocks.Size(); i++)
- size += Blocks[i].PackSize;
- return size;
- };
-
- AString Name;
-};
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _inStream;
-
- AString _xml;
- CObjectVector<CFile> _files;
- CRecordVector<int> _fileIndices;
-
- HRESULT Open2(IInStream *stream);
- HRESULT Extract(IInStream *stream);
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-const UInt32 kXmlSizeMax = ((UInt32)1 << 31) - (1 << 14);
-
-enum
-{
- METHOD_ZERO_0 = 0,
- METHOD_COPY = 1,
- METHOD_ZERO_2 = 2,
- METHOD_ADC = 0x80000004,
- METHOD_ZLIB = 0x80000005,
- METHOD_BZIP2 = 0x80000006,
- METHOD_DUMMY = 0x7FFFFFFE,
- METHOD_END = 0xFFFFFFFF
-};
-
-struct CMethodStat
-{
- UInt32 NumBlocks;
- UInt64 PackSize;
- UInt64 UnpSize;
- CMethodStat(): NumBlocks(0), PackSize(0), UnpSize(0) {}
-};
-
-struct CMethods
-{
- CRecordVector<CMethodStat> Stats;
- CRecordVector<UInt32> Types;
- void Update(const CFile &file);
- UString GetString() const;
-};
-
-void CMethods::Update(const CFile &file)
-{
- for (int i = 0; i < file.Blocks.Size(); i++)
- {
- const CBlock &b = file.Blocks[i];
- int index = Types.FindInSorted(b.Type);
- if (index < 0)
- {
- index = Types.AddToUniqueSorted(b.Type);
- Stats.Insert(index, CMethodStat());
- }
- CMethodStat &m = Stats[index];
- m.PackSize += b.PackSize;
- m.UnpSize += b.UnpSize;
- m.NumBlocks++;
- }
-}
-
-UString CMethods::GetString() const
-{
- UString res;
- for (int i = 0; i < Types.Size(); i++)
- {
- if (i != 0)
- res += L' ';
- wchar_t buf[32];
- const wchar_t *s;
- const CMethodStat &m = Stats[i];
- bool showPack = true;
- UInt32 type = Types[i];
- switch(type)
- {
- case METHOD_ZERO_0: s = L"zero0"; showPack = (m.PackSize != 0); break;
- case METHOD_ZERO_2: s = L"zero2"; showPack = (m.PackSize != 0); break;
- case METHOD_COPY: s = L"copy"; showPack = (m.UnpSize != m.PackSize); break;
- case METHOD_ADC: s = L"adc"; break;
- case METHOD_ZLIB: s = L"zlib"; break;
- case METHOD_BZIP2: s = L"bzip2"; break;
- default: ConvertUInt64ToString(type, buf); s = buf;
- }
- res += s;
- if (m.NumBlocks != 1)
- {
- res += L'[';
- ConvertUInt64ToString(m.NumBlocks, buf);
- res += buf;
- res += L']';
- }
- res += L'-';
- res += GetSizeString(m.UnpSize);
- if (showPack)
- {
- res += L'-';
- res += GetSizeString(m.PackSize);
- }
- }
- return res;
-}
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidMethod, VT_BSTR}
-};
-
-IMP_IInArchive_Props
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidNumBlocks, VT_UI4}
-};
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMethod:
- {
- CMethods m;
- for (int i = 0; i < _files.Size(); i++)
- m.Update(_files[i]);
- prop = m.GetString();
- break;
- }
- case kpidNumBlocks:
- {
- UInt64 numBlocks = 0;
- for (int i = 0; i < _files.Size(); i++)
- numBlocks += _files[i].Blocks.Size();
- prop = numBlocks;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-IMP_IInArchive_ArcProps
-
-static int FindKeyPair(const CXmlItem &item, const AString &key, const AString &nextTag)
-{
- for (int i = 0; i + 1 < item.SubItems.Size(); i++)
- {
- const CXmlItem &si = item.SubItems[i];
- if (si.IsTagged("key") && si.GetSubString() == key && item.SubItems[i + 1].IsTagged(nextTag))
- return i + 1;
- }
- return -1;
-}
-
-static AString GetStringFromKeyPair(const CXmlItem &item, const AString &key, const AString &nextTag)
-{
- int index = FindKeyPair(item, key, nextTag);
- if (index >= 0)
- return item.SubItems[index].GetSubString();
- return AString();
-}
-
-HRESULT CHandler::Open2(IInStream *stream)
-{
- const int HEADER_SIZE = 0x1E0;
-
- UInt64 headerPos;
- RINOK(stream->Seek(-HEADER_SIZE, STREAM_SEEK_END, &headerPos));
- Byte buf[HEADER_SIZE];
- RINOK(ReadStream_FALSE(stream, buf, HEADER_SIZE));
- UInt64 address1 = Get64(buf + 0);
- UInt64 address2 = Get64(buf + 0xB8);
- UInt64 size64 = Get64(buf + 0xC0);
- if (address1 != address2 || size64 >= kXmlSizeMax || size64 == 0 ||
- address1 >= headerPos || address1 + size64 > headerPos)
- return S_FALSE;
- RINOK(stream->Seek(address1, STREAM_SEEK_SET, NULL));
- size_t size = (size_t)size64;
-
- char *ss = _xml.GetBuffer((int)size + 1);
- RINOK(ReadStream_FALSE(stream, ss, size));
- ss[size] = 0;
- _xml.ReleaseBuffer();
-
- CXml xml;
- if (!xml.Parse(_xml))
- return S_FALSE;
- if (xml.Root.Name != "plist")
- return S_FALSE;
-
- int dictIndex = xml.Root.FindSubTag("dict");
- if (dictIndex < 0)
- return S_FALSE;
-
- const CXmlItem &dictItem = xml.Root.SubItems[dictIndex];
- int rfDictIndex = FindKeyPair(dictItem, "resource-fork", "dict");
- if (rfDictIndex < 0)
- return S_FALSE;
-
- const CXmlItem &rfDictItem = dictItem.SubItems[rfDictIndex];
- int arrIndex = FindKeyPair(rfDictItem, "blkx", "array");
- if (arrIndex < 0)
- return S_FALSE;
-
- const CXmlItem &arrItem = rfDictItem.SubItems[arrIndex];
-
- int i;
- for (i = 0; i < arrItem.SubItems.Size(); i++)
- {
- const CXmlItem &item = arrItem.SubItems[i];
- if (!item.IsTagged("dict"))
- continue;
-
- CFile file;
- file.StartPos = 0;
-
- int destLen;
- {
- AString dataString;
- AString name = GetStringFromKeyPair(item, "Name", "string");
- if (name.IsEmpty())
- name = GetStringFromKeyPair(item, "CFName", "string");
- file.Name = name;
- dataString = GetStringFromKeyPair(item, "Data", "data");
-
- destLen = Base64ToBin(NULL, dataString, dataString.Length());
- file.Raw.SetCapacity(destLen);
- Base64ToBin(file.Raw, dataString, dataString.Length());
- }
-
- if (destLen > 0xCC && Get32(file.Raw) == 0x6D697368)
- {
- PRF(printf("\n\n index = %d", _files.Size()));
- const int kRecordSize = 40;
- for (int offset = 0xCC; offset + kRecordSize <= destLen; offset += kRecordSize)
- {
- const Byte *p = (const Byte *)file.Raw + offset;
- CBlock b;
- b.Type = Get32(p);
- if (b.Type == METHOD_END)
- break;
- if (b.Type == METHOD_DUMMY)
- continue;
-
- b.UnpPos = Get64(p + 0x08) << 9;
- b.UnpSize = Get64(p + 0x10) << 9;
- b.PackPos = Get64(p + 0x18);
- b.PackSize = Get64(p + 0x20);
-
- file.Blocks.Add(b);
-
- PRF(printf("\nType=%8x m[1]=%8x uPos=%8x uSize=%7x pPos=%8x pSize=%7x",
- b.Type, Get32(p + 4), (UInt32)b.UnpPos, (UInt32)b.UnpSize, (UInt32)b.PackPos, (UInt32)b.PackSize));
- }
- }
- int itemIndex = _files.Add(file);
- if (file.Blocks.Size() > 0)
- {
- // if (file.Name.Find("HFS") >= 0)
- _fileIndices.Add(itemIndex);
- }
- }
-
- // PackPos for each new file is 0 in some DMG files. So we use additional StartPos
-
- bool allStartAreZeros = true;
- for (i = 0; i < _files.Size(); i++)
- {
- const CFile &file = _files[i];
- if (!file.Blocks.IsEmpty() && file.Blocks[0].PackPos != 0)
- allStartAreZeros = false;
- }
- UInt64 startPos = 0;
- if (allStartAreZeros)
- {
- for (i = 0; i < _files.Size(); i++)
- {
- CFile &file = _files[i];
- file.StartPos = startPos;
- if (!file.Blocks.IsEmpty())
- startPos += file.Blocks.Back().GetNextPackOffset();
- }
- }
-
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- {
- Close();
- if (Open2(stream) != S_OK)
- return S_FALSE;
- _inStream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _inStream.Release();
- _fileIndices.Clear();
- _files.Clear();
- _xml.Empty();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _fileIndices.Size()
- #ifdef DMG_SHOW_RAW
- + _files.Size() + 1;
- #endif
- ;
- return S_OK;
-}
-
-#define RAW_PREFIX L"raw" WSTRING_PATH_SEPARATOR
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- #ifdef DMG_SHOW_RAW
- if ((int)index == _fileIndices.Size())
- {
- switch(propID)
- {
- case kpidPath:
- prop = RAW_PREFIX L"a.xml";
- break;
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)_xml.Length();
- break;
- }
- }
- else if ((int)index > _fileIndices.Size())
- {
- int rawIndex = (int)index - (_fileIndices.Size() + 1);
- switch(propID)
- {
- case kpidPath:
- {
- wchar_t s[32] = RAW_PREFIX;
- ConvertUInt64ToString(rawIndex, s + MyStringLen(s));
- prop = s;
- break;
- }
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)_files[rawIndex].Raw.GetCapacity();
- break;
- }
- }
- else
- #endif
- {
- int itemIndex = _fileIndices[index];
- const CFile &item = _files[itemIndex];
- switch(propID)
- {
- case kpidMethod:
- {
- CMethods m;
- m.Update(item);
- UString resString = m.GetString();
- if (!resString.IsEmpty())
- prop = resString;
- break;
- }
-
- // case kpidExtension: prop = L"hfs"; break;
-
- case kpidPath:
- {
- // break;
- UString name;
- wchar_t s[32];
- ConvertUInt64ToString(index, s);
- name = s;
- int num = 10;
- int numDigits;
- for (numDigits = 1; num < _fileIndices.Size(); numDigits++)
- num *= 10;
- while (name.Length() < numDigits)
- name = L'0' + name;
-
- AString subName;
- int pos1 = item.Name.Find('(');
- if (pos1 >= 0)
- {
- pos1++;
- int pos2 = item.Name.Find(')', pos1);
- if (pos2 >= 0)
- {
- subName = item.Name.Mid(pos1, pos2 - pos1);
- pos1 = subName.Find(':');
- if (pos1 >= 0)
- subName = subName.Left(pos1);
- }
- }
- subName.Trim();
- if (!subName.IsEmpty())
- {
- if (subName == "Apple_HFS")
- subName = "hfs";
- else if (subName == "Apple_HFSX")
- subName = "hfsx";
- else if (subName == "Apple_Free")
- subName = "free";
- else if (subName == "DDM")
- subName = "ddm";
- UString name2;
- ConvertUTF8ToUnicode(subName, name2);
- name += L'.';
- name += name2;
- }
- else
- {
- UString name2;
- ConvertUTF8ToUnicode(item.Name, name2);
- if (!name2.IsEmpty())
- name += L" - ";
- name += name2;
- }
- prop = name;
- break;
- }
- case kpidComment:
- {
- UString name;
- ConvertUTF8ToUnicode(item.Name, name);
- prop = name;
- break;
- }
-
- case kpidSize: prop = item.GetUnpackSize(); break;
- case kpidPackSize: prop = item.GetPackSize(); break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CAdcDecoder:
- public ICompressCoder,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- CInBuffer m_InStream;
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InStream.ReleaseStream();
- }
-
- class CCoderReleaser
- {
- CAdcDecoder *m_Coder;
- public:
- bool NeedFlush;
- CCoderReleaser(CAdcDecoder *coder): m_Coder(coder), NeedFlush(true) {}
- ~CCoderReleaser()
- {
- if (NeedFlush)
- m_Coder->m_OutWindowStream.Flush();
- m_Coder->ReleaseStreams();
- }
- };
- friend class CCoderReleaser;
-
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(CodeReal)(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress);
-};
-
-STDMETHODIMP CAdcDecoder::CodeReal(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress)
-{
- if (!m_OutWindowStream.Create(1 << 18))
- return E_OUTOFMEMORY;
- if (!m_InStream.Create(1 << 18))
- return E_OUTOFMEMORY;
-
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(false);
- m_InStream.SetStream(inStream);
- m_InStream.Init();
-
- CCoderReleaser coderReleaser(this);
-
- const UInt32 kStep = (1 << 20);
- UInt64 nextLimit = kStep;
-
- UInt64 pos = 0;
- while (pos < *outSize)
- {
- if (pos > nextLimit && progress)
- {
- UInt64 packSize = m_InStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &pos));
- nextLimit += kStep;
- }
- Byte b;
- if (!m_InStream.ReadByte(b))
- return S_FALSE;
- UInt64 rem = *outSize - pos;
- if (b & 0x80)
- {
- unsigned num = (b & 0x7F) + 1;
- if (num > rem)
- return S_FALSE;
- for (unsigned i = 0; i < num; i++)
- {
- if (!m_InStream.ReadByte(b))
- return S_FALSE;
- m_OutWindowStream.PutByte(b);
- }
- pos += num;
- continue;
- }
- Byte b1;
- if (!m_InStream.ReadByte(b1))
- return S_FALSE;
-
- UInt32 len, distance;
-
- if (b & 0x40)
- {
- len = ((UInt32)b & 0x3F) + 4;
- Byte b2;
- if (!m_InStream.ReadByte(b2))
- return S_FALSE;
- distance = ((UInt32)b1 << 8) + b2;
- }
- else
- {
- b &= 0x3F;
- len = ((UInt32)b >> 2) + 3;
- distance = (((UInt32)b & 3) << 8) + b1;
- }
-
- if (distance >= pos || len > rem)
- return S_FALSE;
- m_OutWindowStream.CopyBlock(distance, len);
- pos += len;
- }
- if (*inSize != m_InStream.GetProcessedSize())
- return S_FALSE;
- coderReleaser.NeedFlush = false;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CAdcDecoder::Code(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress);}
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _files.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- int index = (int)(allFilesMode ? i : indices[i]);
- #ifdef DMG_SHOW_RAW
- if (index == _fileIndices.Size())
- totalSize += _xml.Length();
- else if (index > _fileIndices.Size())
- totalSize += _files[index - (_fileIndices.Size() + 1)].Raw.GetCapacity();
- else
- #endif
- totalSize += _files[_fileIndices[index]].GetUnpackSize();
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentPackTotal = 0;
- UInt64 currentUnpTotal = 0;
- UInt64 currentPackSize = 0;
- UInt64 currentUnpSize = 0;
-
- const UInt32 kZeroBufSize = (1 << 14);
- CByteBuffer zeroBuf;
- zeroBuf.SetCapacity(kZeroBufSize);
- memset(zeroBuf, 0, kZeroBufSize);
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- NCompress::NBZip2::CDecoder *bzip2CoderSpec = new NCompress::NBZip2::CDecoder();
- CMyComPtr<ICompressCoder> bzip2Coder = bzip2CoderSpec;
-
- NCompress::NZlib::CDecoder *zlibCoderSpec = new NCompress::NZlib::CDecoder();
- CMyComPtr<ICompressCoder> zlibCoder = zlibCoderSpec;
-
- CAdcDecoder *adcCoderSpec = new CAdcDecoder();
- CMyComPtr<ICompressCoder> adcCoder = adcCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_inStream);
-
- for (i = 0; i < numItems; i++, currentPackTotal += currentPackSize, currentUnpTotal += currentUnpSize)
- {
- lps->InSize = currentPackTotal;
- lps->OutSize = currentUnpTotal;
- currentPackSize = 0;
- currentUnpSize = 0;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- // const CItemEx &item = _files[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- CLimitedSequentialOutStream *outStreamSpec = new CLimitedSequentialOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
-
- realOutStream.Release();
-
- Int32 opRes = NExtract::NOperationResult::kOK;
- #ifdef DMG_SHOW_RAW
- if (index > _fileIndices.Size())
- {
- const CByteBuffer &buf = _files[index - (_fileIndices.Size() + 1)].Raw;
- outStreamSpec->Init(buf.GetCapacity());
- RINOK(WriteStream(outStream, buf, buf.GetCapacity()));
- currentPackSize = currentUnpSize = buf.GetCapacity();
- }
- else if (index == _fileIndices.Size())
- {
- outStreamSpec->Init(_xml.Length());
- RINOK(WriteStream(outStream, (const char *)_xml, _xml.Length()));
- currentPackSize = currentUnpSize = _xml.Length();
- }
- else
- #endif
- {
- const CFile &item = _files[_fileIndices[index]];
- currentPackSize = item.GetPackSize();
- currentUnpSize = item.GetUnpackSize();
-
- UInt64 unpPos = 0;
- UInt64 packPos = 0;
- {
- for (int j = 0; j < item.Blocks.Size(); j++)
- {
- lps->InSize = currentPackTotal + packPos;
- lps->OutSize = currentUnpTotal + unpPos;
- RINOK(lps->SetCur());
-
- const CBlock &block = item.Blocks[j];
-
- packPos += block.PackSize;
- if (block.UnpPos != unpPos)
- {
- opRes = NExtract::NOperationResult::kDataError;
- break;
- }
-
- RINOK(_inStream->Seek(item.StartPos + block.PackPos, STREAM_SEEK_SET, NULL));
- streamSpec->Init(block.PackSize);
- // UInt64 startSize = outStreamSpec->GetSize();
- bool realMethod = true;
- outStreamSpec->Init(block.UnpSize);
- HRESULT res = S_OK;
-
- switch(block.Type)
- {
- case METHOD_ZERO_0:
- case METHOD_ZERO_2:
- realMethod = false;
- if (block.PackSize != 0)
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- break;
-
- case METHOD_COPY:
- if (block.UnpSize != block.PackSize)
- {
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- break;
- }
- res = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- break;
-
- case METHOD_ADC:
- {
- res = adcCoder->Code(inStream, outStream, &block.PackSize, &block.UnpSize, progress);
- break;
- }
-
- case METHOD_ZLIB:
- {
- res = zlibCoder->Code(inStream, outStream, NULL, NULL, progress);
- break;
- }
-
- case METHOD_BZIP2:
- {
- res = bzip2Coder->Code(inStream, outStream, NULL, NULL, progress);
- if (res == S_OK)
- if (streamSpec->GetSize() != block.PackSize)
- opRes = NExtract::NOperationResult::kDataError;
- break;
- }
-
- default:
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- break;
- }
- if (res != S_OK)
- {
- if (res != S_FALSE)
- return res;
- if (opRes == NExtract::NOperationResult::kOK)
- opRes = NExtract::NOperationResult::kDataError;
- }
- unpPos += block.UnpSize;
- if (!outStreamSpec->IsFinishedOK())
- {
- if (realMethod && opRes == NExtract::NOperationResult::kOK)
- opRes = NExtract::NOperationResult::kDataError;
-
- while (outStreamSpec->GetRem() != 0)
- {
- UInt64 rem = outStreamSpec->GetRem();
- UInt32 size = (UInt32)MyMin(rem, (UInt64)kZeroBufSize);
- RINOK(WriteStream(outStream, zeroBuf, size));
- }
- }
- }
- }
- }
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Dmg", L"dmg", 0, 0xE4, { 0 }, 0, false, CreateArc, 0 };
-
-REGISTER_ARC(Dmg)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/ElfHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/ElfHandler.cpp
deleted file mode 100644
index c4ad78e9e..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/ElfHandler.cpp
+++ /dev/null
@@ -1,534 +0,0 @@
-// ElfHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-
-#include "Windows/PropVariantUtils.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-static UInt16 Get16(const Byte *p, int be) { if (be) return GetBe16(p); return GetUi16(p); }
-static UInt32 Get32(const Byte *p, int be) { if (be) return GetBe32(p); return GetUi32(p); }
-static UInt64 Get64(const Byte *p, int be) { if (be) return GetBe64(p); return GetUi64(p); }
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NElf {
-
-#define ELF_CLASS_32 1
-#define ELF_CLASS_64 2
-
-#define ELF_DATA_2LSB 1
-#define ELF_DATA_2MSB 2
-
-#define NUM_SCAN_SECTIONS_MAX (1 << 6)
-
-struct CHeader
-{
- bool Mode64;
- bool Be;
- Byte Os;
- Byte AbiVer;
-
- UInt16 Type;
- UInt16 Machine;
- // UInt32 Version;
-
- // UInt64 EntryVa;
- UInt64 ProgOffset;
- UInt64 SectOffset;
- UInt32 Flags;
- UInt16 ElfHeaderSize;
- UInt16 SegmentEntrySize;
- UInt16 NumSegments;
- UInt16 SectEntrySize;
- UInt16 NumSections;
- // UInt16 SectNameStringTableIndex;
-
- bool Parse(const Byte *buf);
-
- bool CheckSegmentEntrySize() const
- {
- return (Mode64 && SegmentEntrySize == 0x38) || (!Mode64 && SegmentEntrySize == 0x20);
- };
-
- UInt64 GetHeadersSize() const
- { return ElfHeaderSize +
- (UInt64)SegmentEntrySize * NumSegments +
- (UInt64)SectEntrySize * NumSections; }
-
-};
-
-bool CHeader::Parse(const Byte *p)
-{
- switch(p[4])
- {
- case ELF_CLASS_32: Mode64 = false; break;
- case ELF_CLASS_64: Mode64 = true; break;
- default: return false;
- }
- bool be;
- switch(p[5])
- {
- case ELF_DATA_2LSB: be = false; break;
- case ELF_DATA_2MSB: be = true; break;
- default: return false;
- }
- Be = be;
- if (p[6] != 1) // Version
- return false;
- Os = p[7];
- AbiVer = p[8];
- for (int i = 9; i < 16; i++)
- if (p[i] != 0)
- return false;
-
- Type = Get16(p + 0x10, be);
- Machine = Get16(p + 0x12, be);
- if (Get32(p + 0x14, be) != 1) // Version
- return false;
-
- if (Mode64)
- {
- // EntryVa = Get64(p + 0x18, be);
- ProgOffset = Get64(p + 0x20, be);
- SectOffset = Get64(p + 0x28, be);
- p += 0x30;
- }
- else
- {
- // EntryVa = Get32(p + 0x18, be);
- ProgOffset = Get32(p + 0x1C, be);
- SectOffset = Get32(p + 0x20, be);
- p += 0x24;
- }
-
- Flags = Get32(p + 0, be);
- ElfHeaderSize = Get16(p + 4, be);
- SegmentEntrySize = Get16(p + 6, be);
- NumSegments = Get16(p + 8, be);
- SectEntrySize = Get16(p + 10, be);
- NumSections = Get16(p + 12, be);
- // SectNameStringTableIndex = Get16(p + 14, be);
- return CheckSegmentEntrySize();
-}
-
-struct CSegment
-{
- UInt32 Type;
- UInt32 Flags;
- UInt64 Offset;
- UInt64 Va;
- // UInt64 Pa;
- UInt64 PSize;
- UInt64 VSize;
- // UInt64 Align;
-
- void UpdateTotalSize(UInt64 &totalSize)
- {
- UInt64 t = Offset + PSize;
- if (t > totalSize)
- totalSize = t;
- }
- void Parse(const Byte *p, bool mode64, bool be);
-};
-
-void CSegment::Parse(const Byte *p, bool mode64, bool be)
-{
- Type = Get32(p, be);
- if (mode64)
- {
- Flags = Get32(p + 4, be);
- Offset = Get64(p + 8, be);
- Va = Get64(p + 0x10, be);
- // Pa = Get64(p + 0x18, be);
- PSize = Get64(p + 0x20, be);
- VSize = Get64(p + 0x28, be);
- // Align = Get64(p + 0x30, be);
- }
- else
- {
- Offset = Get32(p + 4, be);
- Va = Get32(p + 8, be);
- // Pa = Get32(p + 12, be);
- PSize = Get32(p + 16, be);
- VSize = Get32(p + 20, be);
- Flags = Get32(p + 24, be);
- // Align = Get32(p + 28, be);
- }
-}
-
-static const CUInt32PCharPair g_MachinePairs[] =
-{
- { 0, "None" },
- { 1, "AT&T WE 32100" },
- { 2, "SPARC" },
- { 3, "Intel 386" },
- { 4, "Motorola 68000" },
- { 5, "Motorola 88000" },
- { 6, "Intel 486" },
- { 7, "Intel i860" },
- { 8, "MIPS" },
- { 9, "IBM S/370" },
- { 10, "MIPS RS3000 LE" },
- { 11, "RS6000" },
-
- { 15, "PA-RISC" },
- { 16, "nCUBE" },
- { 17, "Fujitsu VPP500" },
- { 18, "SPARC 32+" },
- { 19, "Intel i960" },
- { 20, "PowerPC" },
- { 21, "PowerPC 64-bit" },
- { 22, "IBM S/390" },
-
- { 36, "NEX v800" },
- { 37, "Fujitsu FR20" },
- { 38, "TRW RH-32" },
- { 39, "Motorola RCE" },
- { 40, "ARM" },
- { 41, "Alpha" },
- { 42, "Hitachi SH" },
- { 43, "SPARC-V9" },
- { 44, "Siemens Tricore" },
- { 45, "ARC" },
- { 46, "H8/300" },
- { 47, "H8/300H" },
- { 48, "H8S" },
- { 49, "H8/500" },
- { 50, "IA-64" },
- { 51, "Stanford MIPS-X" },
- { 52, "Motorola ColdFire" },
- { 53, "M68HC12" },
- { 54, "Fujitsu MMA" },
- { 55, "Siemens PCP" },
- { 56, "Sony nCPU" },
- { 57, "Denso NDR1" },
- { 58, "Motorola StarCore" },
- { 59, "Toyota ME16" },
- { 60, "ST100" },
- { 61, "Advanced Logic TinyJ" },
- { 62, "AMD64" },
- { 63, "Sony DSP" },
-
- { 66, "Siemens FX66" },
- { 67, "ST9+" },
- { 68, "ST7" },
- { 69, "MC68HC16" },
- { 70, "MC68HC11" },
- { 71, "MC68HC08" },
- { 72, "MC68HC05" },
- { 73, "Silicon Graphics SVx" },
- { 74, "ST19" },
- { 75, "Digital VAX" },
- { 76, "Axis CRIS" },
- { 77, "Infineon JAVELIN" },
- { 78, "Element 14 FirePath" },
- { 79, "LSI ZSP" },
- { 80, "MMIX" },
- { 81, "HUANY" },
- { 82, "SiTera Prism" },
- { 83, "Atmel AVR" },
- { 84, "Fujitsu FR30" },
- { 85, "Mitsubishi D10V" },
- { 86, "Mitsubishi D30V" },
- { 87, "NEC v850" },
- { 88, "Mitsubishi M32R" },
- { 89, "Matsushita MN10300" },
- { 90, "Matsushita MN10200" },
- { 91, "picoJava" },
- { 92, "OpenRISC" },
- { 93, "ARC Tangent-A5" },
- { 94, "Tensilica Xtensa" },
- { 0x9026, "Alpha" }
-};
-
-static const CUInt32PCharPair g_AbiOS[] =
-{
- { 0, "None" },
- { 1, "HP-UX" },
- { 2, "NetBSD" },
- { 3, "Linux" },
-
- { 6, "Solaris" },
- { 7, "AIX" },
- { 8, "IRIX" },
- { 9, "FreeBSD" },
- { 10, "TRU64" },
- { 11, "Novell Modesto" },
- { 12, "OpenBSD" },
- { 13, "OpenVMS" },
- { 14, "HP NSK" },
- { 15, "AROS" },
- { 97, "ARM" },
- { 255, "Standalone" }
-};
-
-static const CUInt32PCharPair g_SegmentFlags[] =
-{
- { 0, "Execute" },
- { 1, "Write" },
- { 2, "Read" }
-};
-
-static const char *g_Types[] =
-{
- "None",
- "Relocatable file",
- "Executable file",
- "Shared object file",
- "Core file"
-};
-
-static const char *g_SegnmentTypes[] =
-{
- "Unused",
- "Loadable segment",
- "Dynamic linking tables",
- "Program interpreter path name",
- "Note section",
- "SHLIB",
- "Program header table",
- "TLS"
-};
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _inStream;
- CObjectVector<CSegment> _sections;
- UInt32 _peOffset;
- CHeader _header;
- UInt64 _totalSize;
- HRESULT Open2(IInStream *stream);
- bool Parse(const Byte *buf, UInt32 size);
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-#define ELF_PT_PHDR 6
-
-bool CHandler::Parse(const Byte *buf, UInt32 size)
-{
- if (size < 64)
- return false;
- if (!_header.Parse(buf))
- return false;
- if (_header.ProgOffset > size ||
- _header.ProgOffset + (UInt64)_header.SegmentEntrySize * _header.NumSegments > size ||
- _header.NumSegments > NUM_SCAN_SECTIONS_MAX)
- return false;
- const Byte *p = buf + _header.ProgOffset;
- _totalSize = _header.ProgOffset;
-
- for (int i = 0; i < _header.NumSegments; i++, p += _header.SegmentEntrySize)
- {
- CSegment sect;
- sect.Parse(p, _header.Mode64, _header.Be);
- sect.UpdateTotalSize(_totalSize);
- if (sect.Type != ELF_PT_PHDR)
- _sections.Add(sect);
- }
- UInt64 total2 = _header.SectOffset + (UInt64)_header.SectEntrySize * _header.NumSections;
- if (total2 > _totalSize)
- _totalSize = total2;
- return true;
-}
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidCpu, VT_BSTR},
- { NULL, kpidBit64, VT_BOOL},
- { NULL, kpidBigEndian, VT_BOOL},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI8}
- };
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidType, VT_BSTR},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidOffset, VT_UI8},
- { NULL, kpidVa, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: prop = _totalSize; break;
- case kpidHeadersSize: prop = _header.GetHeadersSize(); break;
- case kpidBit64: if (_header.Mode64) prop = _header.Mode64; break;
- case kpidBigEndian: if (_header.Be) prop = _header.Be; break;
- case kpidCpu: PAIR_TO_PROP(g_MachinePairs, _header.Machine, prop); break;
- case kpidHostOS: PAIR_TO_PROP(g_AbiOS, _header.Os, prop); break;
- case kpidCharacts: TYPE_TO_PROP(g_Types, _header.Type, prop); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- const CSegment &item = _sections[index];
- switch(propID)
- {
- case kpidPath:
- {
- wchar_t sz[32];
- ConvertUInt64ToString(index, sz);
- prop = sz;
- break;
- }
- case kpidSize: prop = (UInt64)item.VSize; break;
- case kpidPackSize: prop = (UInt64)item.PSize; break;
- case kpidOffset: prop = item.Offset; break;
- case kpidVa: prop = item.Va; break;
- case kpidType: TYPE_TO_PROP(g_SegnmentTypes, item.Type, prop); break;
- case kpidCharacts: FLAGS_TO_PROP(g_SegmentFlags, item.Flags, prop); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::Open2(IInStream *stream)
-{
- const UInt32 kBufSize = 1 << 18;
- const UInt32 kSigSize = 4;
-
- CByteBuffer buffer;
- buffer.SetCapacity(kBufSize);
- Byte *buf = buffer;
-
- size_t processed = kSigSize;
- RINOK(ReadStream_FALSE(stream, buf, processed));
- if (buf[0] != 0x7F || buf[1] != 'E' || buf[2] != 'L' || buf[3] != 'F')
- return S_FALSE;
- processed = kBufSize - kSigSize;
- RINOK(ReadStream(stream, buf + kSigSize, &processed));
- processed += kSigSize;
- if (!Parse(buf, (UInt32)processed))
- return S_FALSE;
- UInt64 fileSize;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize));
- return (fileSize == _totalSize) ? S_OK : S_FALSE;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- RINOK(Open2(inStream));
- _inStream = inStream;
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _inStream.Release();
- _sections.Clear();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _sections.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _sections.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _sections[allFilesMode ? i : indices[i]].PSize;
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
- UInt64 currentItemSize;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_inStream);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CSegment &item = _sections[index];
- currentItemSize = item.PSize;
-
- CMyComPtr<ISequentialOutStream> outStream;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(_inStream->Seek(item.Offset, STREAM_SEEK_SET, NULL));
- streamSpec->Init(currentItemSize);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == currentItemSize ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"ELF", L"", 0, 0xDE, { 0 }, 0, false, CreateArc, 0 };
-
-REGISTER_ARC(Elf)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/FatHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/FatHandler.cpp
deleted file mode 100644
index 1c374a444..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/FatHandler.cpp
+++ /dev/null
@@ -1,996 +0,0 @@
-// FatHandler.cpp
-
-#include "StdAfx.h"
-
-// #include <stdio.h>
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyCom.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#include "Common/DummyOutStream.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-
-#define PRF(x) /* x */
-
-namespace NArchive {
-namespace NFat {
-
-static const UInt32 kFatItemUsedByDirMask = (UInt32)1 << 31;
-
-struct CHeader
-{
- UInt32 NumSectors;
- UInt16 NumReservedSectors;
- Byte NumFats;
- UInt32 NumFatSectors;
- UInt32 RootDirSector;
- UInt32 NumRootDirSectors;
- UInt32 DataSector;
-
- UInt32 FatSize;
- UInt32 BadCluster;
-
- Byte NumFatBits;
- Byte SectorSizeLog;
- Byte SectorsPerClusterLog;
- Byte ClusterSizeLog;
-
- UInt16 SectorsPerTrack;
- UInt16 NumHeads;
- UInt32 NumHiddenSectors;
-
- bool VolFieldsDefined;
-
- UInt32 VolId;
- // Byte VolName[11];
- // Byte FileSys[8];
-
- // Byte OemName[5];
- Byte MediaType;
-
- // 32-bit FAT
- UInt16 Flags;
- UInt16 FsInfoSector;
- UInt32 RootCluster;
-
- bool IsFat32() const { return NumFatBits == 32; }
- UInt64 GetPhySize() const { return (UInt64)NumSectors << SectorSizeLog; }
- UInt32 SectorSize() const { return (UInt32)1 << SectorSizeLog; }
- UInt32 ClusterSize() const { return (UInt32)1 << ClusterSizeLog; }
- UInt32 ClusterToSector(UInt32 c) const { return DataSector + ((c - 2) << SectorsPerClusterLog); }
- UInt32 IsEoc(UInt32 c) const { return c > BadCluster; }
- UInt32 IsEocAndUnused(UInt32 c) const { return c > BadCluster && (c & kFatItemUsedByDirMask) == 0; }
- UInt32 IsValidCluster(UInt32 c) const { return c >= 2 && c < FatSize; }
- UInt32 SizeToSectors(UInt32 size) const { return (size + SectorSize() - 1) >> SectorSizeLog; }
- UInt32 CalcFatSizeInSectors() const { return SizeToSectors((FatSize * (NumFatBits / 4) + 1) / 2); }
-
- UInt32 GetFatSector() const
- {
- UInt32 index = (IsFat32() && (Flags & 0x80) != 0) ? (Flags & 0xF) : 0;
- if (index > NumFats)
- index = 0;
- return NumReservedSectors + index * NumFatSectors;
- }
-
- UInt64 GetFilePackSize(UInt32 unpackSize) const
- {
- UInt64 mask = ClusterSize() - 1;
- return (unpackSize + mask) & ~mask;
- }
-
- UInt32 GetNumClusters(UInt32 size) const
- { return (UInt32)(((UInt64)size + ClusterSize() - 1) >> ClusterSizeLog); }
-
- bool Parse(const Byte *p);
-};
-
-static int GetLog(UInt32 num)
-{
- for (int i = 0; i < 31; i++)
- if (((UInt32)1 << i) == num)
- return i;
- return -1;
-}
-
-bool CHeader::Parse(const Byte *p)
-{
- if (p[0x1FE] != 0x55 || p[0x1FF] != 0xAA)
- return false;
-
- int codeOffset = 0;
- switch (p[0])
- {
- case 0xE9: codeOffset = 3 + (Int16)Get16(p + 1); break;
- case 0xEB: if (p[2] != 0x90) return false; codeOffset = 2 + (signed char)p[1]; break;
- default: return false;
- }
- {
- int s = GetLog(Get16(p + 11));
- if (s < 9 || s > 12)
- return false;
- SectorSizeLog = (Byte)s;
- s = GetLog(p[13]);
- if (s < 0)
- return false;
- SectorsPerClusterLog = (Byte)s;
- ClusterSizeLog = SectorSizeLog + SectorsPerClusterLog;
- }
-
- NumReservedSectors = Get16(p + 14);
- if (NumReservedSectors == 0)
- return false;
-
- NumFats = p[16];
- if (NumFats < 1 || NumFats > 4)
- return false;
-
- UInt16 numRootDirEntries = Get16(p + 17);
- if (numRootDirEntries == 0)
- {
- if (codeOffset < 90)
- return false;
- NumFatBits = 32;
- NumRootDirSectors = 0;
- }
- else
- {
- if (codeOffset < 62)
- return false;
- NumFatBits = 0;
- UInt32 mask = (1 << (SectorSizeLog - 5)) - 1;
- if ((numRootDirEntries & mask) != 0)
- return false;
- NumRootDirSectors = (numRootDirEntries + mask) >> (SectorSizeLog - 5);
- }
-
- NumSectors = Get16(p + 19);
- if (NumSectors == 0)
- NumSectors = Get32(p + 32);
- else if (IsFat32())
- return false;
-
- MediaType = p[21];
- NumFatSectors = Get16(p + 22);
- SectorsPerTrack = Get16(p + 24);
- NumHeads = Get16(p + 26);
- NumHiddenSectors = Get32(p + 28);
-
- // memcpy(OemName, p + 3, 5);
-
- p += 36;
- if (IsFat32())
- {
- if (NumFatSectors != 0)
- return false;
- NumFatSectors = Get32(p);
- if (NumFatSectors >= (1 << 24))
- return false;
-
- Flags = Get16(p + 4);
- if (Get16(p + 6) != 0)
- return false;
- RootCluster = Get32(p + 8);
- FsInfoSector = Get16(p + 12);
- for (int i = 16; i < 28; i++)
- if (p[i] != 0)
- return false;
- p += 28;
- }
-
- // DriveNumber = p[0];
- VolFieldsDefined = (p[2] == 0x29); // ExtendedBootSig
- VolId = Get32(p + 3);
- // memcpy(VolName, p + 7, 11);
- // memcpy(FileSys, p + 18, 8);
-
- if (NumFatSectors == 0)
- return false;
- RootDirSector = NumReservedSectors + NumFatSectors * NumFats;
- DataSector = RootDirSector + NumRootDirSectors;
- if (NumSectors < DataSector)
- return false;
- UInt32 numDataSectors = NumSectors - DataSector;
- UInt32 numClusters = numDataSectors >> SectorsPerClusterLog;
-
- BadCluster = 0x0FFFFFF7;
- if (numClusters < 0xFFF5)
- {
- if (NumFatBits == 32)
- return false;
- NumFatBits = (numClusters < 0xFF5) ? 12: 16;
- BadCluster &= ((1 << NumFatBits) - 1);
- }
- else if (NumFatBits != 32)
- return false;
-
- FatSize = numClusters + 2;
- if (FatSize > BadCluster || CalcFatSizeInSectors() > NumFatSectors)
- return false;
- return true;
-}
-
-struct CItem
-{
- UString UName;
- char DosName[11];
- Byte CTime2;
- UInt32 CTime;
- UInt32 MTime;
- UInt16 ADate;
- Byte Attrib;
- Byte Flags;
- UInt32 Size;
- UInt32 Cluster;
- Int32 Parent;
-
- // NT uses Flags to store Low Case status
- bool NameIsLow() const { return (Flags & 0x8) != 0; }
- bool ExtIsLow() const { return (Flags & 0x10) != 0; }
- bool IsDir() const { return (Attrib & 0x10) != 0; }
- UString GetShortName() const;
- UString GetName() const;
- UString GetVolName() const;
-};
-
-static int CopyAndTrim(char *dest, const char *src, int size, bool toLower)
-{
- int i;
- memcpy(dest, src, size);
- if (toLower)
- for (i = 0; i < size; i++)
- {
- char c = dest[i];
- if (c >= 'A' && c <= 'Z')
- dest[i] = c + 0x20;
- }
- for (i = size - 1; i >= 0 && dest[i] == ' '; i--);
- return i + 1;
-}
-
-static UString FatStringToUnicode(const char *s)
-{
- return MultiByteToUnicodeString(s, CP_OEMCP);
-}
-
-UString CItem::GetShortName() const
-{
- char s[16];
- int i = CopyAndTrim(s, DosName, 8, NameIsLow());
- s[i++] = '.';
- int j = CopyAndTrim(s + i, DosName + 8, 3, ExtIsLow());
- if (j == 0)
- j--;
- s[i + j] = 0;
- return FatStringToUnicode(s);
-}
-
-UString CItem::GetName() const
-{
- if (!UName.IsEmpty())
- return UName;
- return GetShortName();
-}
-
-UString CItem::GetVolName() const
-{
- if (!UName.IsEmpty())
- return UName;
- char s[12];
- int i = CopyAndTrim(s, DosName, 11, false);
- s[i] = 0;
- return FatStringToUnicode(s);
-}
-
-struct CDatabase
-{
- CHeader Header;
- CObjectVector<CItem> Items;
- UInt32 *Fat;
- CMyComPtr<IInStream> InStream;
- IArchiveOpenCallback *OpenCallback;
-
- UInt32 NumFreeClusters;
- bool VolItemDefined;
- CItem VolItem;
- UInt32 NumDirClusters;
- CByteBuffer ByteBuf;
- UInt64 NumCurUsedBytes;
-
- CDatabase(): Fat(0) {}
- ~CDatabase() { ClearAndClose(); }
-
- void Clear();
- void ClearAndClose();
- HRESULT OpenProgressFat(bool changeTotal = true);
- HRESULT OpenProgress();
-
- UString GetItemPath(Int32 index) const;
- HRESULT Open();
- HRESULT ReadDir(Int32 parent, UInt32 cluster, int level);
-
- UInt64 GetHeadersSize() const
- {
- return (UInt64)(Header.DataSector + (NumDirClusters << Header.SectorsPerClusterLog)) << Header.SectorSizeLog;
- }
- HRESULT SeekToSector(UInt32 sector);
- HRESULT SeekToCluster(UInt32 cluster) { return SeekToSector(Header.ClusterToSector(cluster)); }
-};
-
-HRESULT CDatabase::SeekToSector(UInt32 sector)
-{
- return InStream->Seek((UInt64)sector << Header.SectorSizeLog, STREAM_SEEK_SET, NULL);
-}
-
-void CDatabase::Clear()
-{
- VolItemDefined = false;
- NumDirClusters = 0;
- NumCurUsedBytes = 0;
-
- Items.Clear();
- delete []Fat;
- Fat = 0;
-}
-
-void CDatabase::ClearAndClose()
-{
- Clear();
- InStream.Release();
-}
-
-HRESULT CDatabase::OpenProgressFat(bool changeTotal)
-{
- if (!OpenCallback)
- return S_OK;
- if (changeTotal)
- {
- UInt64 numTotalBytes = (Header.CalcFatSizeInSectors() << Header.SectorSizeLog) +
- ((UInt64)(Header.FatSize - NumFreeClusters) << Header.ClusterSizeLog);
- RINOK(OpenCallback->SetTotal(NULL, &numTotalBytes));
- }
- return OpenCallback->SetCompleted(NULL, &NumCurUsedBytes);
-}
-
-HRESULT CDatabase::OpenProgress()
-{
- if (!OpenCallback)
- return S_OK;
- UInt64 numItems = Items.Size();
- return OpenCallback->SetCompleted(&numItems, &NumCurUsedBytes);
-}
-
-UString CDatabase::GetItemPath(Int32 index) const
-{
- const CItem *item = &Items[index];
- UString name = item->GetName();
- for (;;)
- {
- index = item->Parent;
- if (index < 0)
- return name;
- item = &Items[index];
- name = item->GetName() + WCHAR_PATH_SEPARATOR + name;
- }
-}
-
-static wchar_t *AddSubStringToName(wchar_t *dest, const Byte *p, int numChars)
-{
- for (int i = 0; i < numChars; i++)
- {
- wchar_t c = Get16(p + i * 2);
- if (c != 0 && c != 0xFFFF)
- *dest++ = c;
- }
- *dest = 0;
- return dest;
-}
-
-HRESULT CDatabase::ReadDir(Int32 parent, UInt32 cluster, int level)
-{
- int startIndex = Items.Size();
- if (startIndex >= (1 << 30) || level > 256)
- return S_FALSE;
-
- UInt32 sectorIndex = 0;
- UInt32 blockSize = Header.ClusterSize();
- bool clusterMode = (Header.IsFat32() || parent >= 0);
- if (!clusterMode)
- {
- blockSize = Header.SectorSize();
- RINOK(SeekToSector(Header.RootDirSector));
- }
-
- ByteBuf.SetCapacity(blockSize);
- UString curName;
- int checkSum = -1;
- int numLongRecords = -1;
- for (UInt32 pos = blockSize;; pos += 32)
- {
- if (pos == blockSize)
- {
- pos = 0;
-
- if ((NumDirClusters & 0xFF) == 0)
- {
- RINOK(OpenProgress());
- }
-
- if (clusterMode)
- {
- if (Header.IsEoc(cluster))
- break;
- if (!Header.IsValidCluster(cluster))
- return S_FALSE;
- PRF(printf("\nCluster = %4X", cluster));
- RINOK(SeekToCluster(cluster));
- UInt32 newCluster = Fat[cluster];
- if ((newCluster & kFatItemUsedByDirMask) != 0)
- return S_FALSE;
- Fat[cluster] |= kFatItemUsedByDirMask;
- cluster = newCluster;
- NumDirClusters++;
- NumCurUsedBytes += Header.ClusterSize();
- }
- else if (sectorIndex++ >= Header.NumRootDirSectors)
- break;
-
- RINOK(ReadStream_FALSE(InStream, ByteBuf, blockSize));
- }
- const Byte *p = ByteBuf + pos;
- if (p[0] == 0)
- {
- /*
- // FreeDOS formats FAT partition with cluster chain longer than required.
- if (clusterMode && !Header.IsEoc(cluster))
- return S_FALSE;
- */
- break;
- }
- if (p[0] == 0xE5)
- {
- if (numLongRecords > 0)
- return S_FALSE;
- continue;
- }
-
- Byte attrib = p[11];
- if ((attrib & 0x3F) == 0xF)
- {
- if (p[0] > 0x7F || Get16(p + 26) != 0)
- return S_FALSE;
- int longIndex = p[0] & 0x3F;
- if (longIndex == 0)
- return S_FALSE;
- bool isLast = (p[0] & 0x40) != 0;
- if (numLongRecords < 0)
- {
- if (!isLast)
- return S_FALSE;
- numLongRecords = longIndex;
- }
- else if (isLast || numLongRecords != longIndex)
- return S_FALSE;
-
- numLongRecords--;
-
- if (p[12] == 0)
- {
- wchar_t nameBuf[14];
- wchar_t *dest;
-
- dest = AddSubStringToName(nameBuf, p + 1, 5);
- dest = AddSubStringToName(dest, p + 14, 6);
- AddSubStringToName(dest, p + 28, 2);
- curName = nameBuf + curName;
- if (isLast)
- checkSum = p[13];
- if (checkSum != p[13])
- return S_FALSE;
- }
- }
- else
- {
- if (numLongRecords > 0)
- return S_FALSE;
- CItem item;
- memcpy(item.DosName, p, 11);
-
- if (checkSum >= 0)
- {
- Byte sum = 0;
- for (int i = 0; i < 11; i++)
- sum = ((sum & 1) ? 0x80 : 0) + (sum >> 1) + (Byte)item.DosName[i];
- if (sum == checkSum)
- item.UName = curName;
- }
-
- if (item.DosName[0] == 5)
- item.DosName[0] = (char)(Byte)0xE5;
- item.Attrib = attrib;
- item.Flags = p[12];
- item.Size = Get32(p + 28);
- item.Cluster = Get16(p + 26);
- if (Header.NumFatBits > 16)
- item.Cluster |= ((UInt32)Get16(p + 20) << 16);
- else
- {
- // OS/2 and WinNT probably can store EA (extended atributes) in that field.
- }
-
- item.CTime = Get32(p + 14);
- item.CTime2 = p[13];
- item.ADate = Get16(p + 18);
- item.MTime = Get32(p + 22);
- item.Parent = parent;
-
- if (attrib == 8)
- {
- VolItem = item;
- VolItemDefined = true;
- }
- else
- if (memcmp(item.DosName, ". ", 11) != 0 &&
- memcmp(item.DosName, ".. ", 11) != 0)
- {
- if (!item.IsDir())
- NumCurUsedBytes += Header.GetFilePackSize(item.Size);
- Items.Add(item);
- PRF(printf("\n%7d: %S", Items.Size(), GetItemPath(Items.Size() - 1)));
- }
- numLongRecords = -1;
- curName.Empty();
- checkSum = -1;
- }
- }
-
- int finishIndex = Items.Size();
- for (int i = startIndex; i < finishIndex; i++)
- {
- const CItem &item = Items[i];
- if (item.IsDir())
- {
- PRF(printf("\n%S", GetItemPath(i)));
- RINOK(CDatabase::ReadDir(i, item.Cluster, level + 1));
- }
- }
- return S_OK;
-}
-
-HRESULT CDatabase::Open()
-{
- Clear();
- bool numFreeClustersDefined = false;
- {
- static const UInt32 kHeaderSize = 512;
- Byte buf[kHeaderSize];
- RINOK(ReadStream_FALSE(InStream, buf, kHeaderSize));
- if (!Header.Parse(buf))
- return S_FALSE;
- UInt64 fileSize;
- RINOK(InStream->Seek(0, STREAM_SEEK_END, &fileSize));
-
- /* we comment that check to support truncated images */
- /*
- if (fileSize < Header.GetPhySize())
- return S_FALSE;
- */
-
- if (Header.IsFat32())
- {
- SeekToSector(Header.FsInfoSector);
- RINOK(ReadStream_FALSE(InStream, buf, kHeaderSize));
- if (buf[0x1FE] != 0x55 || buf[0x1FF] != 0xAA)
- return S_FALSE;
- if (Get32(buf) == 0x41615252 && Get32(buf + 484) == 0x61417272)
- {
- NumFreeClusters = Get32(buf + 488);
- numFreeClustersDefined = (NumFreeClusters <= Header.FatSize);
- }
- }
- }
-
- // numFreeClustersDefined = false; // to recalculate NumFreeClusters
- if (!numFreeClustersDefined)
- NumFreeClusters = 0;
-
- CByteBuffer byteBuf;
- Fat = new UInt32[Header.FatSize];
-
- RINOK(OpenProgressFat());
- RINOK(SeekToSector(Header.GetFatSector()));
- if (Header.NumFatBits == 32)
- {
- const UInt32 kBufSize = (1 << 15);
- byteBuf.SetCapacity(kBufSize);
- for (UInt32 i = 0; i < Header.FatSize;)
- {
- UInt32 size = Header.FatSize - i;
- const UInt32 kBufSize32 = kBufSize / 4;
- if (size > kBufSize32)
- size = kBufSize32;
- UInt32 readSize = Header.SizeToSectors(size * 4) << Header.SectorSizeLog;
- RINOK(ReadStream_FALSE(InStream, byteBuf, readSize));
- NumCurUsedBytes += readSize;
-
- const UInt32 *src = (const UInt32 *)(const Byte *)byteBuf;
- UInt32 *dest = Fat + i;
- if (numFreeClustersDefined)
- for (UInt32 j = 0; j < size; j++)
- dest[j] = Get32(src + j) & 0x0FFFFFFF;
- else
- {
- UInt32 numFreeClusters = 0;
- for (UInt32 j = 0; j < size; j++)
- {
- UInt32 v = Get32(src + j) & 0x0FFFFFFF;
- numFreeClusters += (UInt32)(v - 1) >> 31;
- dest[j] = v;
- }
- NumFreeClusters += numFreeClusters;
- }
- i += size;
- if ((i & 0xFFFFF) == 0)
- {
- RINOK(OpenProgressFat(!numFreeClustersDefined));
- }
- }
- }
- else
- {
- const UInt32 kBufSize = (UInt32)Header.CalcFatSizeInSectors() << Header.SectorSizeLog;
- NumCurUsedBytes += kBufSize;
- byteBuf.SetCapacity(kBufSize);
- Byte *p = byteBuf;
- RINOK(ReadStream_FALSE(InStream, p, kBufSize));
- UInt32 fatSize = Header.FatSize;
- UInt32 *fat = &Fat[0];
- if (Header.NumFatBits == 16)
- for (UInt32 j = 0; j < fatSize; j++)
- fat[j] = Get16(p + j * 2);
- else
- for (UInt32 j = 0; j < fatSize; j++)
- fat[j] = (Get16(p + j * 3 / 2) >> ((j & 1) << 2)) & 0xFFF;
-
- if (!numFreeClustersDefined)
- {
- UInt32 numFreeClusters = 0;
- for (UInt32 i = 0; i < fatSize; i++)
- numFreeClusters += (UInt32)(fat[i] - 1) >> 31;
- NumFreeClusters = numFreeClusters;
- }
- }
-
- RINOK(OpenProgressFat());
-
- if ((Fat[0] & 0xFF) != Header.MediaType)
- return S_FALSE;
-
- return ReadDir(-1, Header.RootCluster, 0);
-}
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp,
- CDatabase
-{
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
- const CItem &item = Items[index];
- CClusterInStream *streamSpec = new CClusterInStream;
- CMyComPtr<ISequentialInStream> streamTemp = streamSpec;
- streamSpec->Stream = InStream;
- streamSpec->StartOffset = Header.DataSector << Header.SectorSizeLog;
- streamSpec->BlockSizeLog = Header.ClusterSizeLog;
- streamSpec->Size = item.Size;
-
- UInt32 numClusters = Header.GetNumClusters(item.Size);
- streamSpec->Vector.Reserve(numClusters);
- UInt32 cluster = item.Cluster;
- UInt32 size = item.Size;
-
- if (size == 0)
- {
- if (cluster != 0)
- return S_FALSE;
- }
- else
- {
- UInt32 clusterSize = Header.ClusterSize();
- for (;; size -= clusterSize)
- {
- if (!Header.IsValidCluster(cluster))
- return S_FALSE;
- streamSpec->Vector.Add(cluster - 2);
- cluster = Fat[cluster];
- if (size <= clusterSize)
- break;
- }
- if (!Header.IsEocAndUnused(cluster))
- return S_FALSE;
- }
- RINOK(streamSpec->InitAndSeek());
- *stream = streamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI8},
- { NULL, kpidShortName, VT_BSTR}
-};
-
-enum
-{
- kpidNumFats = kpidUserDefined
- // kpidOemName,
- // kpidVolName,
- // kpidFileSysType
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidFileSystem, VT_BSTR},
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidFreeSpace, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidVolumeName, VT_BSTR},
-
- { L"FATs", kpidNumFats, VT_UI4},
- { NULL, kpidSectorSize, VT_UI4},
- { NULL, kpidId, VT_UI4},
- // { L"OEM Name", kpidOemName, VT_BSTR},
- // { L"Volume Name", kpidVolName, VT_BSTR},
- // { L"File System Type", kpidFileSysType, VT_BSTR}
- // { NULL, kpidSectorsPerTrack, VT_UI4},
- // { NULL, kpidNumHeads, VT_UI4},
- // { NULL, kpidHiddenSectors, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_WITH_NAME
-
-static void FatTimeToProp(UInt32 dosTime, UInt32 ms10, NWindows::NCOM::CPropVariant &prop)
-{
- FILETIME localFileTime, utc;
- if (NWindows::NTime::DosTimeToFileTime(dosTime, localFileTime))
- if (LocalFileTimeToFileTime(&localFileTime, &utc))
- {
- UInt64 t64 = (((UInt64)utc.dwHighDateTime) << 32) + utc.dwLowDateTime;
- t64 += ms10 * 100000;
- utc.dwLowDateTime = (DWORD)t64;
- utc.dwHighDateTime = (DWORD)(t64 >> 32);
- prop = utc;
- }
-}
-
-/*
-static void StringToProp(const Byte *src, int size, NWindows::NCOM::CPropVariant &prop)
-{
- char dest[32];
- memcpy(dest, src, size);
- dest[size] = 0;
- prop = FatStringToUnicode(dest);
-}
-
-#define STRING_TO_PROP(s, p) StringToProp(s, sizeof(s), prop)
-*/
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidFileSystem:
- {
- wchar_t s[32] = { L'F', L'A', L'T' };
- ConvertUInt32ToString(Header.NumFatBits, s + 3);
- prop = s;
- break;
- }
- case kpidClusterSize: prop = Header.ClusterSize(); break;
- case kpidPhySize: prop = Header.GetPhySize(); break;
- case kpidFreeSpace: prop = (UInt64)NumFreeClusters << Header.ClusterSizeLog; break;
- case kpidHeadersSize: prop = GetHeadersSize(); break;
- case kpidMTime: if (VolItemDefined) FatTimeToProp(VolItem.MTime, 0, prop); break;
- case kpidVolumeName: if (VolItemDefined) prop = VolItem.GetVolName(); break;
- case kpidNumFats: if (Header.NumFats != 2) prop = Header.NumFats; break;
- case kpidSectorSize: prop = (UInt32)1 << Header.SectorSizeLog; break;
- // case kpidSectorsPerTrack: prop = Header.SectorsPerTrack; break;
- // case kpidNumHeads: prop = Header.NumHeads; break;
- // case kpidOemName: STRING_TO_PROP(Header.OemName, prop); break;
- case kpidId: if (Header.VolFieldsDefined) prop = Header.VolId; break;
- // case kpidVolName: if (Header.VolFieldsDefined) STRING_TO_PROP(Header.VolName, prop); break;
- // case kpidFileSysType: if (Header.VolFieldsDefined) STRING_TO_PROP(Header.FileSys, prop); break;
- // case kpidHiddenSectors: prop = Header.NumHiddenSectors; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = Items[index];
- switch(propID)
- {
- case kpidPath: prop = GetItemPath(index); break;
- case kpidShortName: prop = item.GetShortName(); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidMTime: FatTimeToProp(item.MTime, 0, prop); break;
- case kpidCTime: FatTimeToProp(item.CTime, item.CTime2, prop); break;
- case kpidATime: FatTimeToProp(((UInt32)item.ADate << 16), 0, prop); break;
- case kpidAttrib: prop = (UInt32)item.Attrib; break;
- case kpidSize: if (!item.IsDir()) prop = item.Size; break;
- case kpidPackSize: if (!item.IsDir()) prop = Header.GetFilePackSize(item.Size); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- {
- OpenCallback = callback;
- InStream = stream;
- HRESULT res;
- try
- {
- res = CDatabase::Open();
- if (res == S_OK)
- return S_OK;
- }
- catch(...)
- {
- Close();
- throw;
- }
- Close();
- return res;
- }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- ClearAndClose();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = Items.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- UInt64 totalSize = 0;
- for (i = 0; i < numItems; i++)
- {
- const CItem &item = Items[allFilesMode ? i : indices[i]];
- if (!item.IsDir())
- totalSize += item.Size;
- }
- RINOK(extractCallback->SetTotal(totalSize));
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = Items[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- totalPackSize += Header.GetFilePackSize(item.Size);
- totalSize += item.Size;
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init();
-
- int res = NExtract::NOperationResult::kDataError;
- CMyComPtr<ISequentialInStream> inStream;
- HRESULT hres = GetStream(index, &inStream);
- if (hres != S_FALSE)
- {
- RINOK(hres);
- if (inStream)
- {
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- if (copyCoderSpec->TotalSize == item.Size)
- res = NExtract::NOperationResult::kOK;
- }
- }
- outStreamSpec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = Items.Size();
- return S_OK;
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"FAT", L"fat img", 0, 0xDA, { 0x55, 0xAA }, 2, false, CreateArc, 0 };
-
-REGISTER_ARC(Fat)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/FlvHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/FlvHandler.cpp
deleted file mode 100644
index a22c29e30..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/FlvHandler.cpp
+++ /dev/null
@@ -1,544 +0,0 @@
-// FlvHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-// #include "Common/Defs.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#define GetBe24(p) ( \
- ((UInt32)((const Byte *)(p))[0] << 16) | \
- ((UInt32)((const Byte *)(p))[1] << 8) | \
- ((const Byte *)(p))[2] )
-
-#define Get16(p) GetBe16(p)
-#define Get24(p) GetBe24(p)
-#define Get32(p) GetBe32(p)
-
-namespace NArchive {
-namespace NFlv {
-
-static const UInt32 kFileSizeMax = (UInt32)1 << 30;
-static const int kNumChunksMax = (UInt32)1 << 23;
-
-const UInt32 kTagHeaderSize = 11;
-
-static const Byte kFlag_Video = 1;
-static const Byte kFlag_Audio = 4;
-
-static const Byte kType_Audio = 8;
-static const Byte kType_Video = 9;
-static const Byte kType_Meta = 18;
-static const int kNumTypes = 19;
-
-struct CItem
-{
- UInt32 Offset;
- UInt32 Size;
- // UInt32 Time;
- Byte Type;
-};
-
-struct CItem2
-{
- Byte Type;
- Byte SubType;
- Byte Props;
- bool SameSubTypes;
- int NumChunks;
- size_t Size;
-
- CReferenceBuf *BufSpec;
- CMyComPtr<IUnknown> RefBuf;
-
- bool IsAudio() const { return Type == kType_Audio; }
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- int _isRaw;
- CMyComPtr<IInStream> _stream;
- CObjectVector<CItem2> _items2;
- // CByteBuffer _metadata;
- HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback);
- AString GetComment();
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidNumBlocks, VT_UI4},
- { NULL, kpidComment, VT_BSTR}
-};
-
-/*
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidComment, VT_BSTR}
-};
-*/
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-static const char *g_AudioTypes[16] =
-{
- "pcm",
- "adpcm",
- "mp3",
- "pcm_le",
- "nellymoser16",
- "nellymoser8",
- "nellymoser",
- "g711a",
- "g711m",
- "audio9",
- "aac",
- "speex",
- "audio12",
- "audio13",
- "mp3",
- "audio15"
-};
-
-static const char *g_VideoTypes[16] =
-{
- "video0",
- "jpeg",
- "h263",
- "screen",
- "vp6",
- "vp6alpha",
- "screen2",
- "avc",
- "video8",
- "video9",
- "video10",
- "video11",
- "video12",
- "video13",
- "video14",
- "video15"
-};
-
-static const char *g_Rates[4] =
-{
- "5.5 kHz",
- "11 kHz",
- "22 kHz",
- "44 kHz"
-};
-
-static void MyStrCat(char *d, const char *s)
-{
- MyStringCopy(d + MyStringLen(d), s);
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- const CItem2 &item = _items2[index];
- switch(propID)
- {
- case kpidExtension:
- prop = _isRaw ?
- (item.IsAudio() ? g_AudioTypes[item.SubType] : g_VideoTypes[item.SubType]) :
- (item.IsAudio() ? "audio.flv" : "video.flv");
- break;
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)item.Size;
- break;
- case kpidNumBlocks: prop = (UInt32)item.NumChunks; break;
- case kpidComment:
- {
- char sz[64];
- MyStringCopy(sz, (item.IsAudio() ? g_AudioTypes[item.SubType] : g_VideoTypes[item.SubType]) );
- if (item.IsAudio())
- {
- MyStrCat(sz, " ");
- MyStrCat(sz, g_Rates[(item.Props >> 2) & 3]);
- MyStrCat(sz, (item.Props & 2) ? " 16-bit" : " 8-bit");
- MyStrCat(sz, (item.Props & 1) ? " stereo" : " mono");
- }
- prop = sz;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
-}
-
-/*
-AString CHandler::GetComment()
-{
- const Byte *p = _metadata;
- size_t size = _metadata.GetCapacity();
- AString res;
- if (size > 0)
- {
- p++;
- size--;
- for (;;)
- {
- if (size < 2)
- break;
- int len = Get16(p);
- p += 2;
- size -= 2;
- if (len == 0 || (size_t)len > size)
- break;
- {
- AString temp;
- char *sz = temp.GetBuffer(len);
- memcpy(sz, p, len);
- sz[len] = 0;
- temp.ReleaseBuffer();
- if (!res.IsEmpty())
- res += '\n';
- res += temp;
- }
- p += len;
- size -= len;
- if (size < 1)
- break;
- Byte type = *p++;
- size--;
- bool ok = false;
- switch(type)
- {
- case 0:
- {
- if (size < 8)
- break;
- ok = true;
- Byte reverse[8];
- for (int i = 0; i < 8; i++)
- {
- bool little_endian = 1;
- if (little_endian)
- reverse[i] = p[7 - i];
- else
- reverse[i] = p[i];
- }
- double d = *(double *)reverse;
- char temp[32];
- sprintf(temp, " = %.3f", d);
- res += temp;
- p += 8;
- size -= 8;
- break;
- }
- case 8:
- {
- if (size < 4)
- break;
- ok = true;
- // UInt32 numItems = Get32(p);
- p += 4;
- size -= 4;
- break;
- }
- }
- if (!ok)
- break;
- }
- }
- return res;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidComment: prop = GetComment(); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-*/
-
-HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback)
-{
- CRecordVector<CItem> items;
-
- const UInt32 kHeaderSize = 13;
- Byte header[kHeaderSize];
- RINOK(ReadStream_FALSE(stream, header, kHeaderSize));
- if (header[0] != 'F' ||
- header[1] != 'L' ||
- header[2] != 'V' ||
- header[3] != 1 ||
- (header[4] & 0xFA) != 0)
- return S_FALSE;
- UInt32 offset = Get32(header + 5);
- if (offset != 9 || Get32(header + 9) != 0)
- return S_FALSE;
- offset += 4;
-
- CByteBuffer inBuf;
- size_t fileSize;
- {
- UInt64 fileSize64;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize64));
- if (fileSize64 > kFileSizeMax)
- return S_FALSE;
-
- if (callback)
- RINOK(callback->SetTotal(NULL, &fileSize64))
-
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- fileSize = (size_t)fileSize64;
- inBuf.SetCapacity(fileSize);
- for (size_t pos = 0; pos < fileSize;)
- {
- UInt64 offset64 = pos;
- if (callback)
- RINOK(callback->SetCompleted(NULL, &offset64))
- size_t rem = MyMin(fileSize - pos, (size_t)(1 << 20));
- RINOK(ReadStream_FALSE(stream, inBuf + pos, rem));
- pos += rem;
- }
- }
-
- int lasts[kNumTypes];
- int i;
- for (i = 0; i < kNumTypes; i++)
- lasts[i] = -1;
-
- while (offset < fileSize)
- {
- CItem item;
- item.Offset = offset;
- const Byte *buf = inBuf + offset;
- offset += kTagHeaderSize;
- if (offset > fileSize)
- return S_FALSE;
-
- item.Type = buf[0];
- UInt32 size = Get24(buf + 1);
- if (size < 1)
- return S_FALSE;
- // item.Time = Get24(buf + 4);
- // item.Time |= (UInt32)buf[7] << 24;
- if (Get24(buf + 8) != 0) // streamID
- return S_FALSE;
-
- UInt32 curSize = kTagHeaderSize + size + 4;
- item.Size = curSize;
-
- offset += curSize - kTagHeaderSize;
- if (offset > fileSize)
- return S_FALSE;
-
- if (Get32(buf + kTagHeaderSize + size) != kTagHeaderSize + size)
- return S_FALSE;
-
- // printf("\noffset = %6X type = %2d time = %6d size = %6d", (UInt32)offset, item.Type, item.Time, item.Size);
-
- if (item.Type == kType_Meta)
- {
- // _metadata = item.Buf;
- }
- else
- {
- if (item.Type != kType_Audio && item.Type != kType_Video)
- return S_FALSE;
- if (items.Size() >= kNumChunksMax)
- return S_FALSE;
- Byte firstByte = buf[kTagHeaderSize];
- Byte subType, props;
- if (item.Type == kType_Audio)
- {
- subType = firstByte >> 4;
- props = firstByte & 0xF;
- }
- else
- {
- subType = firstByte & 0xF;
- props = firstByte >> 4;
- }
- int last = lasts[item.Type];
- if (last < 0)
- {
- CItem2 item2;
- item2.RefBuf = item2.BufSpec = new CReferenceBuf;
- item2.Size = curSize;
- item2.Type = item.Type;
- item2.SubType = subType;
- item2.Props = props;
- item2.NumChunks = 1;
- item2.SameSubTypes = true;
- lasts[item.Type] = _items2.Add(item2);
- }
- else
- {
- CItem2 &item2 = _items2[last];
- if (subType != item2.SubType)
- item2.SameSubTypes = false;
- item2.Size += curSize;
- item2.NumChunks++;
- }
- items.Add(item);
- }
- }
-
- _isRaw = (_items2.Size() == 1);
- for (i = 0; i < _items2.Size(); i++)
- {
- CItem2 &item2 = _items2[i];
- CByteBuffer &itemBuf = item2.BufSpec->Buf;
- if (_isRaw)
- {
- if (!item2.SameSubTypes)
- return S_FALSE;
- itemBuf.SetCapacity((size_t)item2.Size - (kTagHeaderSize + 4 + 1) * item2.NumChunks);
- item2.Size = 0;
- }
- else
- {
- itemBuf.SetCapacity(kHeaderSize + (size_t)item2.Size);
- memcpy(itemBuf, header, kHeaderSize);
- itemBuf[4] = item2.IsAudio() ? kFlag_Audio : kFlag_Video;
- item2.Size = kHeaderSize;
- }
- }
-
- for (i = 0; i < items.Size(); i++)
- {
- const CItem &item = items[i];
- CItem2 &item2 = _items2[lasts[item.Type]];
- size_t size = item.Size;
- const Byte *src = inBuf + item.Offset;
- if (_isRaw)
- {
- src += kTagHeaderSize + 1;
- size -= (kTagHeaderSize + 4 + 1);
- }
- memcpy(item2.BufSpec->Buf + item2.Size, src, size);
- item2.Size += size;
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- Close();
- HRESULT res;
- try
- {
- res = Open2(inStream, callback);
- if (res == S_OK)
- _stream = inStream;
- }
- catch(...) { res = S_FALSE; }
- if (res != S_OK)
- {
- Close();
- return S_FALSE;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _items2.Clear();
- // _metadata.SetCapacity(0);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items2.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items2.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items2[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- totalSize = 0;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CItem2 &item = _items2[index];
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- totalSize += item.Size;
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (outStream)
- {
- RINOK(WriteStream(outStream, item.BufSpec->Buf, item.BufSpec->Buf.GetCapacity()));
- }
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
- CBufInStream *streamSpec = new CBufInStream;
- CMyComPtr<ISequentialInStream> streamTemp = streamSpec;
- streamSpec->Init(_items2[index].BufSpec);
- *stream = streamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"FLV", L"flv", 0, 0xD6, { 'F', 'L', 'V' }, 3, false, CreateArc, 0 };
-
-REGISTER_ARC(Flv)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/GzHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/GzHandler.cpp
deleted file mode 100644
index 7b73bddc3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/GzHandler.cpp
+++ /dev/null
@@ -1,698 +0,0 @@
-// GzHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-#include "../Compress/DeflateDecoder.h"
-#include "../Compress/DeflateEncoder.h"
-
-#include "Common/InStreamWithCRC.h"
-#include "Common/OutStreamWithCRC.h"
-
-#include "DeflateProps.h"
-
-#define Get32(p) GetUi32(p)
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NGz {
-
-static const UInt16 kSignature = 0x8B1F;
-
-namespace NHeader
-{
- namespace NFlags
- {
- const Byte kIsText = 1 << 0;
- const Byte kCrc = 1 << 1;
- const Byte kExtra = 1 << 2;
- const Byte kName = 1 << 3;
- const Byte kComment = 1 << 4;
- }
-
- namespace NExtraFlags
- {
- const Byte kMaximum = 2;
- const Byte kFastest = 4;
- }
-
- namespace NCompressionMethod
- {
- const Byte kDeflate = 8;
- }
-
- namespace NHostOS
- {
- enum EEnum
- {
- kFAT = 0,
- kAMIGA,
- kVMS,
- kUnix,
- kVM_CMS,
- kAtari,
- kHPFS,
- kMac,
- kZ_System,
- kCPM,
- kTOPS20,
- kNTFS,
- kQDOS,
- kAcorn,
- kVFAT,
- kMVS,
- kBeOS,
- kTandem,
-
- kUnknown = 255
- };
- }
-}
-
-static const char *kHostOSes[] =
-{
- "FAT",
- "AMIGA",
- "VMS",
- "Unix",
- "VM/CMS",
- "Atari",
- "HPFS",
- "Macintosh",
- "Z-System",
- "CP/M",
- "TOPS-20",
- "NTFS",
- "SMS/QDOS",
- "Acorn",
- "VFAT",
- "MVS",
- "BeOS",
- "Tandem",
- "OS/400",
- "OS/X"
-};
-
-static const char *kUnknownOS = "Unknown";
-
-class CItem
-{
- bool TestFlag(Byte flag) const { return (Flags & flag) != 0; }
-public:
- Byte Method;
- Byte Flags;
- Byte ExtraFlags;
- Byte HostOS;
- UInt32 Time;
- UInt32 Crc;
- UInt32 Size32;
-
- AString Name;
- AString Comment;
- // CByteBuffer Extra;
-
- // bool IsText() const { return TestFlag(NHeader::NFlags::kIsText); }
- bool HeaderCrcIsPresent() const { return TestFlag(NHeader::NFlags::kCrc); }
- bool ExtraFieldIsPresent() const { return TestFlag(NHeader::NFlags::kExtra); }
- bool NameIsPresent() const { return TestFlag(NHeader::NFlags::kName); }
- bool CommentIsPresent() const { return TestFlag(NHeader::NFlags::kComment); }
-
- void Clear()
- {
- Name.Empty();
- Comment.Empty();
- // Extra.SetCapacity(0);
- }
-
- HRESULT ReadHeader(NCompress::NDeflate::NDecoder::CCOMCoder *stream);
- HRESULT ReadFooter1(NCompress::NDeflate::NDecoder::CCOMCoder *stream);
- HRESULT ReadFooter2(ISequentialInStream *stream);
-
- HRESULT WriteHeader(ISequentialOutStream *stream);
- HRESULT WriteFooter(ISequentialOutStream *stream);
-};
-
-static HRESULT ReadBytes(NCompress::NDeflate::NDecoder::CCOMCoder *stream, Byte *data, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- data[i] = stream->ReadByte();
- return stream->InputEofError() ? S_FALSE : S_OK;
-}
-
-static HRESULT SkipBytes(NCompress::NDeflate::NDecoder::CCOMCoder *stream, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- stream->ReadByte();
- return stream->InputEofError() ? S_FALSE : S_OK;
-}
-
-static HRESULT ReadUInt16(NCompress::NDeflate::NDecoder::CCOMCoder *stream, UInt16 &value /* , UInt32 &crc */)
-{
- value = 0;
- for (int i = 0; i < 2; i++)
- {
- Byte b = stream->ReadByte();
- if (stream->InputEofError())
- return S_FALSE;
- // crc = CRC_UPDATE_BYTE(crc, b);
- value |= (UInt16(b) << (8 * i));
- }
- return S_OK;
-}
-
-static HRESULT ReadString(NCompress::NDeflate::NDecoder::CCOMCoder *stream, AString &s, UInt32 limit /* , UInt32 &crc */)
-{
- s.Empty();
- for (UInt32 i = 0; i < limit; i++)
- {
- Byte b = stream->ReadByte();
- if (stream->InputEofError())
- return S_FALSE;
- // crc = CRC_UPDATE_BYTE(crc, b);
- if (b == 0)
- return S_OK;
- s += (char)b;
- }
- return S_FALSE;
-}
-
-HRESULT CItem::ReadHeader(NCompress::NDeflate::NDecoder::CCOMCoder *stream)
-{
- Clear();
-
- // Header-CRC field had another meaning in old version of gzip!
- // UInt32 crc = CRC_INIT_VAL;
- Byte buf[10];
-
- RINOK(ReadBytes(stream, buf, 10));
-
- if (GetUi16(buf) != kSignature)
- return S_FALSE;
-
- Method = buf[2];
-
- if (Method != NHeader::NCompressionMethod::kDeflate)
- return S_FALSE;
-
- Flags = buf[3];
- Time = Get32(buf + 4);
- ExtraFlags = buf[8];
- HostOS = buf[9];
-
- // crc = CrcUpdate(crc, buf, 10);
-
- if (ExtraFieldIsPresent())
- {
- UInt16 extraSize;
- RINOK(ReadUInt16(stream, extraSize /* , crc */));
- RINOK(SkipBytes(stream, extraSize));
- // Extra.SetCapacity(extraSize);
- // RINOK(ReadStream_FALSE(stream, Extra, extraSize));
- // crc = CrcUpdate(crc, Extra, extraSize);
- }
- if (NameIsPresent())
- RINOK(ReadString(stream, Name, (1 << 10) /* , crc */));
- if (CommentIsPresent())
- RINOK(ReadString(stream, Comment, (1 << 16) /* , crc */));
-
- if (HeaderCrcIsPresent())
- {
- UInt16 headerCRC;
- // UInt32 dummy = 0;
- RINOK(ReadUInt16(stream, headerCRC /* , dummy */));
- /*
- if ((UInt16)CRC_GET_DIGEST(crc) != headerCRC)
- return S_FALSE;
- */
- }
- return stream->InputEofError() ? S_FALSE : S_OK;
-}
-
-HRESULT CItem::ReadFooter1(NCompress::NDeflate::NDecoder::CCOMCoder *stream)
-{
- Byte buf[8];
- RINOK(ReadBytes(stream, buf, 8));
- Crc = Get32(buf);
- Size32 = Get32(buf + 4);
- return stream->InputEofError() ? S_FALSE : S_OK;
-}
-
-HRESULT CItem::ReadFooter2(ISequentialInStream *stream)
-{
- Byte buf[8];
- RINOK(ReadStream_FALSE(stream, buf, 8));
- Crc = Get32(buf);
- Size32 = Get32(buf + 4);
- return S_OK;
-}
-
-HRESULT CItem::WriteHeader(ISequentialOutStream *stream)
-{
- Byte buf[10];
- SetUi16(buf, kSignature);
- buf[2] = Method;
- buf[3] = Flags & NHeader::NFlags::kName;
- // buf[3] |= NHeader::NFlags::kCrc;
- SetUi32(buf + 4, Time);
- buf[8] = ExtraFlags;
- buf[9] = HostOS;
- RINOK(WriteStream(stream, buf, 10));
- // crc = CrcUpdate(CRC_INIT_VAL, buf, 10);
- if (NameIsPresent())
- {
- // crc = CrcUpdate(crc, (const char *)Name, Name.Length() + 1);
- RINOK(WriteStream(stream, (const char *)Name, Name.Length() + 1));
- }
- // SetUi16(buf, (UInt16)CRC_GET_DIGEST(crc));
- // RINOK(WriteStream(stream, buf, 2));
- return S_OK;
-}
-
-HRESULT CItem::WriteFooter(ISequentialOutStream *stream)
-{
- Byte buf[8];
- SetUi32(buf, Crc);
- SetUi32(buf + 4, Size32);
- return WriteStream(stream, buf, 8);
-}
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public IOutArchive,
- public ISetProperties,
- public CMyUnknownImp
-{
- CItem _item;
- UInt64 _startPosition;
- UInt64 _headerSize;
- UInt64 _packSize;
- bool _packSizeDefined;
- CMyComPtr<IInStream> _stream;
- CMyComPtr<ICompressCoder> _decoder;
- NCompress::NDeflate::NDecoder::CCOMCoder *_decoderSpec;
-
- CDeflateProps _method;
-
-public:
- MY_UNKNOWN_IMP4(IInArchive, IArchiveOpenSeq, IOutArchive, ISetProperties)
- INTERFACE_IInArchive(;)
- INTERFACE_IOutArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
- STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProps);
-
- CHandler()
- {
- _decoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder;
- _decoder = _decoderSpec;
- }
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidCRC, VT_UI4}
- // { NULL, kpidComment, VT_BSTR}
-}
-;
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPath:
- if (_item.NameIsPresent())
- prop = MultiByteToUnicodeString(_item.Name, CP_ACP);
- break;
- // case kpidComment: if (_item.CommentIsPresent()) prop = MultiByteToUnicodeString(_item.Comment, CP_ACP); break;
- case kpidMTime:
- {
- if (_item.Time != 0)
- {
- FILETIME utc;
- NTime::UnixTimeToFileTime(_item.Time, utc);
- prop = utc;
- }
- break;
- }
- case kpidSize: if (_stream) prop = (UInt64)_item.Size32; break;
- case kpidPackSize: if (_packSizeDefined) prop = _packSize; break;
- case kpidHostOS: prop = (_item.HostOS < sizeof(kHostOSes) / sizeof(kHostOSes[0])) ?
- kHostOSes[_item.HostOS] : kUnknownOS; break;
- case kpidCRC: if (_stream) prop = _item.Crc; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *)
-{
- COM_TRY_BEGIN
- HRESULT res;
- try
- {
- RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_startPosition));
- res = OpenSeq(stream);
- if (res == S_OK)
- {
- UInt64 endPos;
- res = stream->Seek(-8, STREAM_SEEK_END, &endPos);
- _packSize = endPos + 8 - _startPosition;
- _packSizeDefined = true;
- if (res == S_OK)
- {
- res = _item.ReadFooter2(stream);
- _stream = stream;
- }
- }
- }
- catch(...) { res = S_FALSE; }
- if (res != S_OK)
- Close();
- return res;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- COM_TRY_BEGIN
- HRESULT res;
- try
- {
- Close();
- _decoderSpec->SetInStream(stream);
- _decoderSpec->InitInStream(true);
- res = _item.ReadHeader(_decoderSpec);
- _headerSize = _decoderSpec->GetInputProcessedSize();
- }
- catch(...) { res = S_FALSE; }
- if (res != S_OK)
- Close();
- return res;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _packSizeDefined = false;
- _stream.Release();
- _decoderSpec->ReleaseInStream();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- if (_stream)
- extractCallback->SetTotal(_packSize);
- UInt64 currentTotalPacked = 0;
- RINOK(extractCallback->SetCompleted(&currentTotalPacked));
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
- realOutStream.Release();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, true);
-
- if (_stream)
- {
- RINOK(_stream->Seek(_startPosition, STREAM_SEEK_SET, NULL));
- _decoderSpec->InitInStream(true);
- }
- bool firstItem = true;
- Int32 opRes;
- for (;;)
- {
- lps->InSize = _packSize = _decoderSpec->GetInputProcessedSize();
- _packSizeDefined = true;
- lps->OutSize = outStreamSpec->GetSize();
- RINOK(lps->SetCur());
-
- CItem item;
- if (!firstItem || _stream)
- {
- HRESULT result = item.ReadHeader(_decoderSpec);
- if (result != S_OK)
- {
- if (result != S_FALSE)
- return result;
- opRes = firstItem ?
- NExtract::NOperationResult::kDataError :
- NExtract::NOperationResult::kOK;
- break;
- }
- }
- firstItem = false;
-
- UInt64 startOffset = outStreamSpec->GetSize();
- outStreamSpec->InitCRC();
-
- HRESULT result = _decoderSpec->CodeResume(outStream, NULL, progress);
- if (result != S_OK)
- {
- if (result != S_FALSE)
- return result;
- opRes = NExtract::NOperationResult::kDataError;
- break;
- }
-
- _decoderSpec->AlignToByte();
- if (item.ReadFooter1(_decoderSpec) != S_OK)
- {
- opRes = NExtract::NOperationResult::kDataError;
- break;
- }
- if (item.Crc != outStreamSpec->GetCRC() ||
- item.Size32 != (UInt32)(outStreamSpec->GetSize() - startOffset))
- {
- opRes = NExtract::NOperationResult::kCRCError;
- break;
- }
- }
- outStream.Release();
- return extractCallback->SetOperationResult(opRes);
- COM_TRY_END
-}
-
-static const Byte kHostOS =
- #ifdef _WIN32
- NHeader::NHostOS::kFAT;
- #else
- NHeader::NHostOS::kUnix;
- #endif
-
-static HRESULT UpdateArchive(
- ISequentialOutStream *outStream,
- UInt64 unpackSize,
- const CItem &newItem,
- CDeflateProps &deflateProps,
- IArchiveUpdateCallback *updateCallback)
-{
- UInt64 complexity = 0;
- RINOK(updateCallback->SetTotal(unpackSize));
- RINOK(updateCallback->SetCompleted(&complexity));
-
- CMyComPtr<ISequentialInStream> fileInStream;
-
- RINOK(updateCallback->GetStream(0, &fileInStream));
-
- CSequentialInStreamWithCRC *inStreamSpec = new CSequentialInStreamWithCRC;
- CMyComPtr<ISequentialInStream> crcStream(inStreamSpec);
- inStreamSpec->SetStream(fileInStream);
- inStreamSpec->Init();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(updateCallback, true);
-
- CItem item = newItem;
- item.Method = NHeader::NCompressionMethod::kDeflate;
- item.ExtraFlags = deflateProps.IsMaximum() ?
- NHeader::NExtraFlags::kMaximum :
- NHeader::NExtraFlags::kFastest;
-
- item.HostOS = kHostOS;
-
- RINOK(item.WriteHeader(outStream));
-
- NCompress::NDeflate::NEncoder::CCOMCoder *deflateEncoderSpec = new NCompress::NDeflate::NEncoder::CCOMCoder;
- CMyComPtr<ICompressCoder> deflateEncoder = deflateEncoderSpec;
- RINOK(deflateProps.SetCoderProperties(deflateEncoderSpec));
- RINOK(deflateEncoder->Code(crcStream, outStream, NULL, NULL, progress));
-
- item.Crc = inStreamSpec->GetCRC();
- item.Size32 = (UInt32)inStreamSpec->GetSize();
- RINOK(item.WriteFooter(outStream));
- return updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK);
-}
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *timeType)
-{
- *timeType = NFileTimeType::kUnix;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *updateCallback)
-{
- if (numItems != 1)
- return E_INVALIDARG;
-
- Int32 newData, newProps;
- UInt32 indexInArchive;
- if (!updateCallback)
- return E_FAIL;
- RINOK(updateCallback->GetUpdateItemInfo(0, &newData, &newProps, &indexInArchive));
-
- CItem newItem = _item;
- newItem.ExtraFlags = 0;
- newItem.Flags = 0;
- if (IntToBool(newProps))
- {
- {
- FILETIME utcTime;
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidMTime, &prop));
- if (prop.vt != VT_FILETIME)
- return E_INVALIDARG;
- utcTime = prop.filetime;
- if (!NTime::FileTimeToUnixTime(utcTime, newItem.Time))
- return E_INVALIDARG;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidPath, &prop));
- if (prop.vt == VT_BSTR)
- {
- UString name = prop.bstrVal;
- int dirDelimiterPos = name.ReverseFind(CHAR_PATH_SEPARATOR);
- if (dirDelimiterPos >= 0)
- name = name.Mid(dirDelimiterPos + 1);
- newItem.Name = UnicodeStringToMultiByte(name, CP_ACP);
- if (!newItem.Name.IsEmpty())
- newItem.Flags |= NHeader::NFlags::kName;
- }
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidIsDir, &prop));
- if (prop.vt == VT_BOOL)
- {
- if (prop.boolVal != VARIANT_FALSE)
- return E_INVALIDARG;
- }
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- }
- }
-
- if (IntToBool(newData))
- {
- UInt64 size;
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- size = prop.uhVal.QuadPart;
- }
-
- return UpdateArchive(outStream, size, newItem, _method, updateCallback);
- }
-
- if (indexInArchive != 0)
- return E_INVALIDARG;
-
- if (!_stream)
- return E_NOTIMPL;
-
- UInt64 offset = _startPosition;
- if (IntToBool(newProps))
- {
- newItem.WriteHeader(outStream);
- offset += _headerSize;
- }
- RINOK(_stream->Seek(offset, STREAM_SEEK_SET, NULL));
- return NCompress::CopyStream(_stream, outStream, NULL);
-}
-
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps)
-{
- return _method.SetProperties(names, values, numProps);
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new CHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
- { L"gzip", L"gz gzip tgz tpz", L"* * .tar .tar", 0xEF, { 0x1F, 0x8B, 8 }, 3, true, CreateArc, CreateArcOut };
-
-REGISTER_ARC(GZip)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsHandler.cpp
deleted file mode 100644
index f226458d4..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsHandler.cpp
+++ /dev/null
@@ -1,243 +0,0 @@
-// HfsHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Windows/PropVariant.h"
-#include "../../Common/StreamUtils.h"
-#include "HfsHandler.h"
-
-namespace NArchive {
-namespace NHfs {
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME}
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidFreeSpace, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidMTime, VT_FILETIME}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-static void HfsTimeToProp(UInt32 hfsTime, NWindows::NCOM::CPropVariant &prop)
-{
- FILETIME ft;
- HfsTimeToFileTime(hfsTime, ft);
- prop = ft;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMethod: prop = _db.Header.IsHfsX() ? L"HFSX" : L"HFS+"; break;
- case kpidClusterSize: prop = (UInt32)1 << _db.Header.BlockSizeLog; break;
- case kpidFreeSpace: prop = (UInt64)_db.Header.NumFreeBlocks << _db.Header.BlockSizeLog; break;
- case kpidMTime: HfsTimeToProp(_db.Header.MTime, prop); break;
- case kpidCTime:
- {
- FILETIME localFt, ft;
- HfsTimeToFileTime(_db.Header.CTime, localFt);
- if (LocalFileTimeToFileTime(&localFt, &ft))
- prop = ft;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _db.Items[index];
- switch(propID)
- {
- case kpidPath: prop = _db.GetItemPath(index); break;
- case kpidIsDir: prop = item.IsDir(); break;
-
- case kpidCTime: HfsTimeToProp(item.CTime, prop); break;
- case kpidMTime: HfsTimeToProp(item.MTime, prop); break;
- case kpidATime: HfsTimeToProp(item.ATime, prop); break;
-
- case kpidPackSize: if (!item.IsDir()) prop = (UInt64)item.NumBlocks << _db.Header.BlockSizeLog; break;
- case kpidSize: if (!item.IsDir()) prop = item.Size; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CProgressImp: public CProgressVirt
-{
- CMyComPtr<IArchiveOpenCallback> _callback;
-public:
- HRESULT SetTotal(UInt64 numFiles);
- HRESULT SetCompleted(UInt64 numFiles);
- CProgressImp(IArchiveOpenCallback *callback): _callback(callback) {}
-};
-
-HRESULT CProgressImp::SetTotal(UInt64 numFiles)
-{
- if (_callback)
- return _callback->SetTotal(&numFiles, NULL);
- return S_OK;
-}
-
-HRESULT CProgressImp::SetCompleted(UInt64 numFiles)
-{
- if (_callback)
- return _callback->SetCompleted(&numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- Close();
- try
- {
- CProgressImp progressImp(callback);
- HRESULT res = _db.Open(inStream, &progressImp);
- if (res == E_ABORT)
- return res;
- if (res != S_OK)
- return S_FALSE;
- _stream = inStream;
- }
- catch(...) { return S_FALSE; }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _db.Clear();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _db.Items.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- UInt64 totalSize = 0;
- for (i = 0; i < numItems; i++)
- {
- const CItem &item = _db.Items[allFilesMode ? i : indices[i]];
- if (!item.IsDir())
- totalSize += item.Size;
- }
- RINOK(extractCallback->SetTotal(totalSize));
-
- UInt64 currentTotalSize = 0, currentItemSize = 0;
-
- CByteBuffer buf;
- const UInt32 kBufSize = (1 << 16);
- buf.SetCapacity(kBufSize);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- RINOK(extractCallback->SetCompleted(&currentTotalSize));
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _db.Items[index];
- currentItemSize = 0;
- if (!item.IsDir())
- currentItemSize = item.Size;
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- UInt64 pos = 0;
- int res = NExtract::NOperationResult::kOK;
- int i;
- for (i = 0; i < item.Extents.Size(); i++)
- {
- if (item.Size == pos)
- break;
- if (res != NExtract::NOperationResult::kOK)
- break;
- const CExtent &e = item.Extents[i];
- RINOK(_stream->Seek((UInt64)e.Pos << _db.Header.BlockSizeLog, STREAM_SEEK_SET, NULL));
- UInt64 extentSize = (UInt64)e.NumBlocks << _db.Header.BlockSizeLog;
- for (;;)
- {
- if (extentSize == 0)
- break;
- UInt64 rem = item.Size - pos;
- if (rem == 0)
- {
- if (extentSize >= (UInt64)((UInt32)1 << _db.Header.BlockSizeLog))
- res = NExtract::NOperationResult::kDataError;
- break;
- }
- UInt32 curSize = kBufSize;
- if (curSize > rem)
- curSize = (UInt32)rem;
- if (curSize > extentSize)
- curSize = (UInt32)extentSize;
- RINOK(ReadStream_FALSE(_stream, buf, curSize));
- if (realOutStream)
- {
- RINOK(WriteStream(realOutStream, buf, curSize));
- }
- pos += curSize;
- extentSize -= curSize;
- UInt64 processed = currentTotalSize + pos;
- RINOK(extractCallback->SetCompleted(&processed));
- }
- }
- if (i != item.Extents.Size() || item.Size != pos)
- res = NExtract::NOperationResult::kDataError;
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _db.Items.Size();
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsHandler.h
deleted file mode 100644
index 269af218e..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsHandler.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// HfsHandler.h
-
-#ifndef __ARCHIVE_HFS_HANDLER_H
-#define __ARCHIVE_HFS_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-#include "HfsIn.h"
-
-namespace NArchive {
-namespace NHfs {
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CDatabase _db;
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsIn.cpp
deleted file mode 100644
index 8391dd936..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsIn.cpp
+++ /dev/null
@@ -1,480 +0,0 @@
-// HfsIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/StreamUtils.h"
-#include "Common/IntToString.h"
-
-#include "HfsIn.h"
-
-#include "../../../../C/CpuArch.h"
-
-#define Get16(p) GetBe16(p)
-#define Get32(p) GetBe32(p)
-#define Get64(p) GetBe64(p)
-
-namespace NArchive {
-namespace NHfs {
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareIdToIndex(const CIdIndexPair *p1, const CIdIndexPair *p2, void * /* param */)
-{
- RINOZ(MyCompare(p1->ID, p2->ID));
- return MyCompare(p1->Index, p2->Index);
-}
-
-bool operator< (const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID < a2.ID); }
-bool operator> (const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID > a2.ID); }
-bool operator==(const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID == a2.ID); }
-bool operator!=(const CIdIndexPair &a1, const CIdIndexPair &a2) { return (a1.ID != a2.ID); }
-
-static UString GetSpecName(const UString &name, UInt32 /* id */)
-{
- UString name2 = name;
- name2.Trim();
- if (name2.IsEmpty())
- {
- /*
- wchar_t s[32];
- ConvertUInt64ToString(id, s);
- return L"[" + (UString)s + L"]";
- */
- return L"[]";
- }
- return name;
-}
-
-UString CDatabase::GetItemPath(int index) const
-{
- const CItem *item = &Items[index];
- UString name = GetSpecName(item->Name, item->ID);
-
- for (int i = 0; i < 1000; i++)
- {
- if (item->ParentID < 16 && item->ParentID != 2)
- {
- if (item->ParentID != 1)
- break;
- return name;
- }
- CIdIndexPair pair;
- pair.ID = item->ParentID;
- pair.Index = 0;
- int indexInMap = IdToIndexMap.FindInSorted(pair);
- if (indexInMap < 0)
- break;
- item = &Items[IdToIndexMap[indexInMap].Index];
- name = GetSpecName(item->Name, item->ID) + WCHAR_PATH_SEPARATOR + name;
- }
- return (UString)L"Unknown" + WCHAR_PATH_SEPARATOR + name;
-}
-
-void CFork::Parse(const Byte *p)
-{
- Size = Get64(p);
- // ClumpSize = Get32(p + 8);
- NumBlocks = Get32(p + 0xC);
- for (int i = 0; i < 8; i++)
- {
- CExtent &e = Extents[i];
- e.Pos = Get32(p + 0x10 + i * 8);
- e.NumBlocks = Get32(p + 0x10 + i * 8 + 4);
- }
-}
-
-static HRESULT ReadExtent(int blockSizeLog, IInStream *inStream, Byte *buf, const CExtent &e)
-{
- RINOK(inStream->Seek((UInt64)e.Pos << blockSizeLog, STREAM_SEEK_SET, NULL));
- return ReadStream_FALSE(inStream, buf, (size_t)e.NumBlocks << blockSizeLog);
-}
-
-HRESULT CDatabase::ReadFile(const CFork &fork, CByteBuffer &buf, IInStream *inStream)
-{
- if (fork.NumBlocks >= Header.NumBlocks)
- return S_FALSE;
- size_t totalSize = (size_t)fork.NumBlocks << Header.BlockSizeLog;
- if ((totalSize >> Header.BlockSizeLog) != fork.NumBlocks)
- return S_FALSE;
- buf.SetCapacity(totalSize);
- UInt32 curBlock = 0;
- for (int i = 0; i < 8; i++)
- {
- if (curBlock >= fork.NumBlocks)
- break;
- const CExtent &e = fork.Extents[i];
- if (fork.NumBlocks - curBlock < e.NumBlocks || e.Pos >= Header.NumBlocks)
- return S_FALSE;
- RINOK(ReadExtent(Header.BlockSizeLog, inStream,
- (Byte *)buf + ((size_t)curBlock << Header.BlockSizeLog), e));
- curBlock += e.NumBlocks;
- }
- return S_OK;
-}
-
-struct CNodeDescriptor
-{
- UInt32 fLink;
- UInt32 bLink;
- Byte Kind;
- Byte Height;
- UInt16 NumRecords;
- // UInt16 Reserved;
- void Parse(const Byte *p);
-};
-
-void CNodeDescriptor::Parse(const Byte *p)
-{
- fLink = Get32(p);
- bLink = Get32(p + 4);
- Kind = p[8];
- Height = p[9];
- NumRecords = Get16(p + 10);
-}
-
-struct CHeaderRec
-{
- // UInt16 TreeDepth;
- // UInt32 RootNode;
- // UInt32 LeafRecords;
- UInt32 FirstLeafNode;
- // UInt32 LastLeafNode;
- int NodeSizeLog;
- // UInt16 MaxKeyLength;
- UInt32 TotalNodes;
- // UInt32 FreeNodes;
- // UInt16 Reserved1;
- // UInt32 ClumpSize;
- // Byte BtreeType;
- // Byte KeyCompareType;
- // UInt32 Attributes;
- // UInt32 Reserved3[16];
-
- HRESULT Parse(const Byte *p);
-};
-
-HRESULT CHeaderRec::Parse(const Byte *p)
-{
- // TreeDepth = Get16(p);
- // RootNode = Get32(p + 2);
- // LeafRecords = Get32(p + 6);
- FirstLeafNode = Get32(p + 0xA);
- // LastLeafNode = Get32(p + 0xE);
- UInt32 nodeSize = Get16(p + 0x12);
-
- int i;
- for (i = 9; ((UInt32)1 << i) != nodeSize; i++)
- if (i == 16)
- return S_FALSE;
- NodeSizeLog = i;
-
- // MaxKeyLength = Get16(p + 0x14);
- TotalNodes = Get32(p + 0x16);
- // FreeNodes = Get32(p + 0x1A);
- // Reserved1 = Get16(p + 0x1E);
- // ClumpSize = Get32(p + 0x20);
- // BtreeType = p[0x24];
- // KeyCompareType = p[0x25];
- // Attributes = Get32(p + 0x26);
- /*
- for (int i = 0; i < 16; i++)
- Reserved3[i] = Get32(p + 0x2A + i * 4);
- */
- return S_OK;
-}
-
-
-enum ENodeType
-{
- NODE_TYPE_LEAF = 0xFF,
- NODE_TYPE_INDEX = 0,
- NODE_TYPE_HEADER = 1,
- NODE_TYPE_MODE = 2
-};
-
-HRESULT CDatabase::LoadExtentFile(IInStream *inStream)
-{
- // FileExtents.Clear();
- // ResExtents.Clear();
-
- CByteBuffer extents;
- RINOK(ReadFile(Header.ExtentsFile, extents, inStream));
-
- const Byte *p = (const Byte *)extents;
-
- // CNodeDescriptor nodeDesc;
- // nodeDesc.Parse(p);
- CHeaderRec hr;
- RINOK(hr.Parse(p + 14));
-
- UInt32 node = hr.FirstLeafNode;
- if (node != 0)
- return S_FALSE;
- /*
- while (node != 0)
- {
- size_t nodeOffset = node * hr.NodeSize;
- if ((node + 1)* hr.NodeSize > CatalogBuf.GetCapacity())
- return S_FALSE;
- CNodeDescriptor desc;
- desc.Parse(p + nodeOffset);
- if (desc.Kind != NODE_TYPE_LEAF)
- return S_FALSE;
- UInt32 ptr = hr.NodeSize;
- for (int i = 0; i < desc.NumRecords; i++)
- {
- UInt32 offs = Get16(p + nodeOffset + hr.NodeSize - (i + 1) * 2);
- UInt32 offsNext = Get16(p + nodeOffset + hr.NodeSize - (i + 2) * 2);
-
- const Byte *r = p + nodeOffset + offs;
- int keyLength = Get16(r);
- Byte forkType = r[2];
- UInt32 id = Get16(r + 4);
- UInt32 startBlock = Get16(r + 4);
- CObjectVector<CIdExtents> *extents = (forkType == 0) ? &FileExtents : &ResExtents;
- if (extents->Size() == 0)
- extents->Add(CIdExtents());
- else
- {
- CIdExtents &e = extents->Back();
- if (e.ID != id)
- {
- if (e.ID > id)
- return S_FALSE;
- extents->Add(CIdExtents());
- }
- }
- CIdExtents &e = extents->Back();
- for (UInt32 k = offs + 10 + 2; k + 8 <= offsNext; k += 8)
- {
- CExtent ee;
- ee.Pos = Get32(p + nodeOffset + k);
- ee.NumBlocks = Get32(p + nodeOffset + k * 4);
- e.Extents.Add(ee);
- }
- }
- node = desc.fLink;
- }
- */
- return S_OK;
-}
-
-
-HRESULT CDatabase::LoadCatalog(IInStream *inStream, CProgressVirt *progress)
-{
- Items.Clear();
- IdToIndexMap.ClearAndFree();
-
- CByteBuffer catalogBuf;
- RINOK(ReadFile(Header.CatalogFile, catalogBuf, inStream));
- const Byte *p = (const Byte *)catalogBuf;
-
- // CNodeDescriptor nodeDesc;
- // nodeDesc.Parse(p);
- CHeaderRec hr;
- hr.Parse(p + 14);
-
- // CaseSensetive = (Header.IsHfsX() && hr.KeyCompareType == 0xBC);
-
- if ((catalogBuf.GetCapacity() >> hr.NodeSizeLog) < hr.TotalNodes)
- return S_FALSE;
-
- CByteBuffer usedBuf;
- usedBuf.SetCapacity(hr.TotalNodes);
- for (UInt32 i = 0; i < hr.TotalNodes; i++)
- usedBuf[i] = 0;
-
- UInt32 node = hr.FirstLeafNode;
- while (node != 0)
- {
- if (node >= hr.TotalNodes)
- return S_FALSE;
- if (usedBuf[node])
- return S_FALSE;
- usedBuf[node] = 1;
- size_t nodeOffset = (size_t)node << hr.NodeSizeLog;
- CNodeDescriptor desc;
- desc.Parse(p + nodeOffset);
- if (desc.Kind != NODE_TYPE_LEAF)
- return S_FALSE;
- for (int i = 0; i < desc.NumRecords; i++)
- {
- UInt32 nodeSize = (1 << hr.NodeSizeLog);
- UInt32 offs = Get16(p + nodeOffset + nodeSize - (i + 1) * 2);
- UInt32 offsNext = Get16(p + nodeOffset + nodeSize - (i + 2) * 2);
- UInt32 recSize = offsNext - offs;
- if (offsNext >= nodeSize || offsNext < offs || recSize < 6)
- return S_FALSE;
-
- CItem item;
-
- const Byte *r = p + nodeOffset + offs;
- UInt32 keyLength = Get16(r);
- item.ParentID = Get32(r + 2);
- UString name;
- if (keyLength < 6 || (keyLength & 1) != 0 || keyLength + 2 > recSize)
- return S_FALSE;
- r += 6;
- recSize -= 6;
- keyLength -= 6;
-
- int nameLength = Get16(r);
- if (nameLength * 2 != (int)keyLength)
- return S_FALSE;
- r += 2;
- recSize -= 2;
-
- wchar_t *pp = name.GetBuffer(nameLength + 1);
-
- int j;
- for (j = 0; j < nameLength; j++)
- pp[j] = ((wchar_t)r[j * 2] << 8) | r[j * 2 + 1];
- pp[j] = 0;
- name.ReleaseBuffer();
- r += j * 2;
- recSize -= j * 2;
-
- if (recSize < 2)
- return S_FALSE;
- item.Type = Get16(r);
-
- if (item.Type != RECORD_TYPE_FOLDER && item.Type != RECORD_TYPE_FILE)
- continue;
- if (recSize < 0x58)
- return S_FALSE;
-
- // item.Flags = Get16(r + 2);
- // item.Valence = Get32(r + 4);
- item.ID = Get32(r + 8);
- item.CTime = Get32(r + 0xC);
- item.MTime = Get32(r + 0x10);
- // item.AttrMTime = Get32(r + 0x14);
- item.ATime = Get32(r + 0x18);
- // item.BackupDate = Get32(r + 0x1C);
-
- /*
- item.OwnerID = Get32(r + 0x20);
- item.GroupID = Get32(r + 0x24);
- item.AdminFlags = r[0x28];
- item.OwnerFlags = r[0x29];
- item.FileMode = Get16(r + 0x2A);
- item.special.iNodeNum = Get16(r + 0x2C);
- */
-
- item.Name = name;
-
- if (item.IsDir())
- {
- CIdIndexPair pair;
- pair.ID = item.ID;
- pair.Index = Items.Size();
- IdToIndexMap.Add(pair);
- }
- else
- {
- CFork fd;
- recSize -= 0x58;
- r += 0x58;
- if (recSize < 0x50 * 2)
- return S_FALSE;
- fd.Parse(r);
- item.Size = fd.Size;
- item.NumBlocks = fd.NumBlocks;
- UInt32 curBlock = 0;
- for (int j = 0; j < 8; j++)
- {
- if (curBlock >= fd.NumBlocks)
- break;
- const CExtent &e = fd.Extents[j];
- item.Extents.Add(e);
- curBlock += e.NumBlocks;
- }
- }
- Items.Add(item);
- if (progress && Items.Size() % 100 == 0)
- {
- RINOK(progress->SetCompleted(Items.Size()));
- }
- }
- node = desc.fLink;
- }
- IdToIndexMap.Sort(CompareIdToIndex, NULL);
- return S_OK;
-}
-
-HRESULT CDatabase::Open(IInStream *inStream, CProgressVirt *progress)
-{
- static const UInt32 kHeaderSize = 1024 + 512;
- Byte buf[kHeaderSize];
- RINOK(ReadStream_FALSE(inStream, buf, kHeaderSize));
- int i;
- for (i = 0; i < 1024; i++)
- if (buf[i] != 0)
- return S_FALSE;
- const Byte *p = buf + 1024;
- CVolHeader &h = Header;
-
- h.Header[0] = p[0];
- h.Header[1] = p[1];
- if (p[0] != 'H' || (p[1] != '+' && p[1] != 'X'))
- return S_FALSE;
- h.Version = Get16(p + 2);
- if (h.Version < 4 || h.Version > 5)
- return S_FALSE;
-
- // h.Attr = Get32(p + 4);
- // h.LastMountedVersion = Get32(p + 8);
- // h.JournalInfoBlock = Get32(p + 0xC);
-
- h.CTime = Get32(p + 0x10);
- h.MTime = Get32(p + 0x14);
- // h.BackupTime = Get32(p + 0x18);
- // h.CheckedTime = Get32(p + 0x1C);
-
- // h.NumFiles = Get32(p + 0x20);
- // h.NumFolders = Get32(p + 0x24);
-
- UInt32 numFiles = Get32(p + 0x20);
- UInt32 numFolders = Get32(p + 0x24);;
- if (progress)
- {
- RINOK(progress->SetTotal(numFolders + numFiles));
- }
-
- UInt32 blockSize = Get32(p + 0x28);
-
- for (i = 9; ((UInt32)1 << i) != blockSize; i++)
- if (i == 31)
- return S_FALSE;
- h.BlockSizeLog = i;
-
- h.NumBlocks = Get32(p + 0x2C);
- h.NumFreeBlocks = Get32(p + 0x30);
-
- /*
- h.WriteCount = Get32(p + 0x44);
- for (i = 0; i < 6; i++)
- h.FinderInfo[i] = Get32(p + 0x50 + i * 4);
- h.VolID = Get64(p + 0x68);
- */
-
- UInt64 endPos;
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPos));
- if ((endPos >> h.BlockSizeLog) < h.NumBlocks)
- return S_FALSE;
-
- // h.AllocationFile.Parse(p + 0x70 + 0x50 * 0);
- h.ExtentsFile.Parse( p + 0x70 + 0x50 * 1);
- h.CatalogFile.Parse( p + 0x70 + 0x50 * 2);
- // h.AttributesFile.Parse(p + 0x70 + 0x50 * 3);
- // h.StartupFile.Parse( p + 0x70 + 0x50 * 4);
-
- RINOK(LoadExtentFile(inStream));
- RINOK(LoadCatalog(inStream, progress));
-
- // if (Header.NumFiles + Header.NumFolders != (UInt32)Items.Size()) return S_OK;
-
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsIn.h
deleted file mode 100644
index c19539057..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsIn.h
+++ /dev/null
@@ -1,154 +0,0 @@
-// HfsIn.h
-
-#ifndef __ARCHIVE_HFS_IN_H
-#define __ARCHIVE_HFS_IN_H
-
-#include "Common/MyString.h"
-#include "Common/Buffer.h"
-
-namespace NArchive {
-namespace NHfs {
-
-struct CExtent
-{
- UInt32 Pos;
- UInt32 NumBlocks;
-};
-
-struct CFork
-{
- UInt64 Size;
- // UInt32 ClumpSize;
- UInt32 NumBlocks;
- CExtent Extents[8];
- void Parse(const Byte *p);
-};
-
-struct CVolHeader
-{
- Byte Header[2];
- UInt16 Version;
- // UInt32 Attr;
- // UInt32 LastMountedVersion;
- // UInt32 JournalInfoBlock;
-
- UInt32 CTime;
- UInt32 MTime;
- // UInt32 BackupTime;
- // UInt32 CheckedTime;
-
- // UInt32 NumFiles;
- // UInt32 NumFolders;
- int BlockSizeLog;
- UInt32 NumBlocks;
- UInt32 NumFreeBlocks;
-
- // UInt32 WriteCount;
- // UInt32 FinderInfo[8];
- // UInt64 VolID;
-
- // CFork AllocationFile;
- CFork ExtentsFile;
- CFork CatalogFile;
- // CFork AttributesFile;
- // CFork StartupFile;
-
- bool IsHfsX() const { return Version > 4; }
-};
-
-inline void HfsTimeToFileTime(UInt32 hfsTime, FILETIME &ft)
-{
- UInt64 v = ((UInt64)3600 * 24 * (365 * 303 + 24 * 3) + hfsTime) * 10000000;
- ft.dwLowDateTime = (DWORD)v;
- ft.dwHighDateTime = (DWORD)(v >> 32);
-}
-
-enum ERecordType
-{
- RECORD_TYPE_FOLDER = 1,
- RECORD_TYPE_FILE = 2,
- RECORD_TYPE_FOLDER_THREAD = 3,
- RECORD_TYPE_FILE_THREAD = 4
-};
-
-struct CItem
-{
- UString Name;
-
- UInt32 ParentID;
-
- UInt16 Type;
- // UInt16 Flags;
- // UInt32 Valence;
- UInt32 ID;
- UInt32 CTime;
- UInt32 MTime;
- // UInt32 AttrMTime;
- UInt32 ATime;
- // UInt32 BackupDate;
-
- /*
- UInt32 OwnerID;
- UInt32 GroupID;
- Byte AdminFlags;
- Byte OwnerFlags;
- UInt16 FileMode;
- union
- {
- UInt32 iNodeNum;
- UInt32 LinkCount;
- UInt32 RawDevice;
- } special;
- */
-
- UInt64 Size;
- UInt32 NumBlocks;
- CRecordVector<CExtent> Extents;
-
- bool IsDir() const { return Type == RECORD_TYPE_FOLDER; }
- CItem(): Size(0), NumBlocks(0) {}
-};
-
-struct CIdIndexPair
-{
- UInt32 ID;
- int Index;
-};
-
-struct CProgressVirt
-{
- virtual HRESULT SetTotal(UInt64 numFiles) PURE;
- virtual HRESULT SetCompleted(UInt64 numFiles) PURE;
-};
-
-class CDatabase
-{
- // CObjectVector<CIdExtents> FileExtents;
- // CObjectVector<CIdExtents> ResExtents;
- CRecordVector<CIdIndexPair> IdToIndexMap;
-
- HRESULT LoadExtentFile(IInStream *inStream);
- HRESULT LoadCatalog(IInStream *inStream, CProgressVirt *progress);
-
- HRESULT ReadFile(const CFork &fork, CByteBuffer &buf, IInStream *inStream);
-public:
- CVolHeader Header;
- CObjectVector<CItem> Items;
- // bool CaseSensetive;
-
- void Clear()
- {
- // CaseSensetive = false;
- Items.Clear();
- // FileExtents.Clear();
- // ResExtents.Clear();
- IdToIndexMap.Clear();
- }
-
- UString GetItemPath(int index) const;
- HRESULT Open(IInStream *inStream, CProgressVirt *progress);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsRegister.cpp
deleted file mode 100644
index 51c3c2b15..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Hfs/HfsRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// HfsRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "HfsHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NHfs::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"HFS", L"hfs", 0, 0xE3, { 'H', '+', 0, 4 }, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Hfs)
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHandler.cpp
deleted file mode 100644
index 4bfb7dc68..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHandler.cpp
+++ /dev/null
@@ -1,326 +0,0 @@
-// IsoHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "../Common/ItemNameUtils.h"
-
-#include "IsoHandler.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-namespace NArchive {
-namespace NIso {
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidMTime, VT_FILETIME}
- // { NULL, kpidPhySize, VT_UI8},
- // { NULL, kpidHeadersSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- // try
- {
- if (_archive.Open(stream) != S_OK)
- return S_FALSE;
- _stream = stream;
- }
- // catch(...) { return S_FALSE; }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _archive.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _archive.Refs.Size() + _archive.BootEntries.Size();
- return S_OK;
-}
-
-static void AddString(AString &s, const char *name, const Byte *p, int size)
-{
- int i;
- for (i = 0; i < size && p[i]; i++);
- for (; i > 0 && p[i - 1] == ' '; i--);
- if (i != 0)
- {
- AString d;
- memcpy(d.GetBuffer(i), p, i);
- d.ReleaseBuffer(i);
- s += '\n';
- s += name;
- s += ": ";
- s += d;
- }
-}
-
-#define ADD_STRING(n, v) AddString(s, n, vol. ## v, sizeof(vol. ## v))
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CVolumeDescriptor &vol = _archive.VolDescs[_archive.MainVolDescIndex];
- switch(propID)
- {
- case kpidComment:
- {
- AString s;
- ADD_STRING("System", SystemId);
- ADD_STRING("Volume", VolumeId);
- ADD_STRING("VolumeSet", VolumeSetId);
- ADD_STRING("Publisher", PublisherId);
- ADD_STRING("Preparer", DataPreparerId);
- ADD_STRING("Application", ApplicationId);
- ADD_STRING("Copyright", CopyrightFileId);
- ADD_STRING("Abstract", AbstractFileId);
- ADD_STRING("Bib", BibFileId);
- prop = s;
- break;
- }
- case kpidCTime: { FILETIME utc; if (vol.CTime.GetFileTime(utc)) prop = utc; break; }
- case kpidMTime: { FILETIME utc; if (vol.MTime.GetFileTime(utc)) prop = utc; break; }
- // case kpidPhySize: break;
- // case kpidHeadersSize: break;
- case kpidError: if (_archive.IncorrectBigEndian) prop = "Incorrect big-endian headers"; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- if (index >= (UInt32)_archive.Refs.Size())
- {
- index -= _archive.Refs.Size();
- const CBootInitialEntry &be = _archive.BootEntries[index];
- switch(propID)
- {
- case kpidPath:
- {
- // wchar_t name[32];
- // ConvertUInt64ToString(index + 1, name);
- UString s = L"[BOOT]" WSTRING_PATH_SEPARATOR;
- // s += name;
- // s += L"-";
- s += be.GetName();
- prop = (const wchar_t *)s;
- break;
- }
- case kpidIsDir: prop = false; break;
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)_archive.GetBootItemSize(index);
- break;
- }
- }
- else
- {
- const CRef &ref = _archive.Refs[index];
- const CDir &item = ref.Dir->_subItems[ref.Index];
- switch(propID)
- {
- case kpidPath:
- // if (item.FileId.GetCapacity() >= 0)
- {
- UString s;
- if (_archive.IsJoliet())
- s = item.GetPathU();
- else
- s = MultiByteToUnicodeString(item.GetPath(_archive.IsSusp, _archive.SuspSkipSize), CP_OEMCP);
-
- int pos = s.ReverseFind(L';');
- if (pos >= 0 && pos == s.Length() - 2)
- if (s[s.Length() - 1] == L'1')
- s = s.Left(pos);
- if (!s.IsEmpty())
- if (s[s.Length() - 1] == L'.')
- s = s.Left(s.Length() - 1);
- prop = (const wchar_t *)NItemName::GetOSName2(s);
- }
- break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize:
- case kpidPackSize:
- if (!item.IsDir())
- prop = (UInt64)item.DataLength;
- break;
- case kpidMTime:
- {
- FILETIME utc;
- if (item.DateTime.GetFileTime(utc))
- prop = utc;
- break;
- }
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _archive.Refs.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for(i = 0; i < numItems; i++)
- {
- UInt32 index = (allFilesMode ? i : indices[i]);
- if (index < (UInt32)_archive.Refs.Size())
- {
- const CRef &ref = _archive.Refs[index];
- const CDir &item = ref.Dir->_subItems[ref.Index];
- totalSize += item.DataLength;
- }
- else
- {
- totalSize += _archive.GetBootItemSize(index - _archive.Refs.Size());
- }
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
- UInt64 currentItemSize;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- CLimitedSequentialOutStream *outStreamSpec = new CLimitedSequentialOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- currentItemSize = 0;
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- UInt64 blockIndex;
- if (index < (UInt32)_archive.Refs.Size())
- {
- const CRef &ref = _archive.Refs[index];
- const CDir &item = ref.Dir->_subItems[ref.Index];
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- currentItemSize = item.DataLength;
- blockIndex = item.ExtentLocation;
- }
- else
- {
- int bootIndex = index - _archive.Refs.Size();
- const CBootInitialEntry &be = _archive.BootEntries[bootIndex];
- currentItemSize = _archive.GetBootItemSize(bootIndex);
- blockIndex = be.LoadRBA;
- }
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init(currentItemSize);
- RINOK(_stream->Seek(blockIndex * _archive.BlockSize, STREAM_SEEK_SET, NULL));
- streamSpec->Init(currentItemSize);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStreamSpec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(outStreamSpec->IsFinishedOK() ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
- UInt64 blockIndex;
- UInt64 currentItemSize;
- if (index < (UInt32)_archive.Refs.Size())
- {
- const CRef &ref = _archive.Refs[index];
- const CDir &item = ref.Dir->_subItems[ref.Index];
- if (item.IsDir())
- return S_FALSE;
- currentItemSize = item.DataLength;
- blockIndex = item.ExtentLocation;
- }
- else
- {
- int bootIndex = index - _archive.Refs.Size();
- const CBootInitialEntry &be = _archive.BootEntries[bootIndex];
- currentItemSize = _archive.GetBootItemSize(bootIndex);
- blockIndex = be.LoadRBA;
- }
- return CreateLimitedInStream(_stream, blockIndex * _archive.BlockSize, currentItemSize, stream);
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHandler.h
deleted file mode 100644
index 1dcade8f9..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHandler.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// IsoHandler.h
-
-#ifndef __ISO_HANDLER_H
-#define __ISO_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-
-#include "IsoIn.h"
-#include "IsoItem.h"
-
-namespace NArchive {
-namespace NIso {
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CInArchive _archive;
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHeader.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHeader.cpp
deleted file mode 100644
index b3e418bbc..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHeader.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// Archive/Iso/Header.h
-
-#include "StdAfx.h"
-
-#include "IsoHeader.h"
-
-namespace NArchive {
-namespace NIso {
-
-const char *kElToritoSpec = "EL TORITO SPECIFICATION\0\0\0\0\0\0\0\0\0";
-
-const wchar_t *kMediaTypes[5] =
-{
- L"NoEmulation",
- L"1.2M",
- L"1.44M",
- L"2.88M",
- L"HardDisk"
-};
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHeader.h b/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHeader.h
deleted file mode 100644
index 9702d70ae..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoHeader.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Archive/IsoHeader.h
-
-#ifndef __ARCHIVE_ISO_HEADER_H
-#define __ARCHIVE_ISO_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NIso {
-
-namespace NVolDescType
-{
- const Byte kBootRecord = 0;
- const Byte kPrimaryVol = 1;
- const Byte kSupplementaryVol = 2;
- const Byte kVolParttition = 3;
- const Byte kTerminator = 255;
-}
-
-const Byte kVersion = 1;
-
-namespace NFileFlags
-{
- const Byte kDirectory = 1 << 1;
-}
-
-extern const char *kElToritoSpec;
-
-const UInt32 kStartPos = 0x8000;
-
-namespace NBootEntryId
-{
- const Byte kValidationEntry = 1;
- const Byte kInitialEntryNotBootable = 0;
- const Byte kInitialEntryBootable = 0x88;
-}
-
-namespace NBootPlatformId
-{
- const Byte kX86 = 0;
- const Byte kPowerPC = 1;
- const Byte kMac = 2;
-}
-
-const BYTE kBootMediaTypeMask = 0xF;
-
-namespace NBootMediaType
-{
- const Byte kNoEmulation = 0;
- const Byte k1d2Floppy = 1;
- const Byte k1d44Floppy = 2;
- const Byte k2d88Floppy = 3;
- const Byte kHardDisk = 4;
-}
-
-const int kNumBootMediaTypes = 5;
-extern const wchar_t *kMediaTypes[];
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoIn.cpp
deleted file mode 100644
index 7ed618d29..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoIn.cpp
+++ /dev/null
@@ -1,453 +0,0 @@
-// Archive/IsoIn.cpp
-
-#include "StdAfx.h"
-
-#include "IsoIn.h"
-
-#include "../../Common/StreamUtils.h"
-
-namespace NArchive {
-namespace NIso {
-
-Byte CInArchive::ReadByte()
-{
- if (m_BufferPos >= BlockSize)
- m_BufferPos = 0;
- if (m_BufferPos == 0)
- {
- size_t processedSize = BlockSize;
- if (ReadStream(_stream, m_Buffer, &processedSize) != S_OK)
- throw 1;
- if (processedSize != BlockSize)
- throw 1;
- }
- Byte b = m_Buffer[m_BufferPos++];
- _position++;
- return b;
-}
-
-void CInArchive::ReadBytes(Byte *data, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- data[i] = ReadByte();
-}
-
-void CInArchive::Skip(size_t size)
-{
- while (size-- != 0)
- ReadByte();
-}
-
-void CInArchive::SkipZeros(size_t size)
-{
- while (size-- != 0)
- {
- Byte b = ReadByte();
- if (b != 0)
- throw 1;
- }
-}
-
-UInt16 CInArchive::ReadUInt16Spec()
-{
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- value |= ((UInt16)(ReadByte()) << (8 * i));
- return value;
-}
-
-
-UInt16 CInArchive::ReadUInt16()
-{
- Byte b[4];
- ReadBytes(b, 4);
- UInt32 value = 0;
- for (int i = 0; i < 2; i++)
- {
- if (b[i] != b[3 - i])
- IncorrectBigEndian = true;
- value |= ((UInt16)(b[i]) << (8 * i));
- }
- return (UInt16)value;
-}
-
-UInt32 CInArchive::ReadUInt32Le()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- value |= ((UInt32)(ReadByte()) << (8 * i));
- return value;
-}
-
-UInt32 CInArchive::ReadUInt32Be()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- {
- value <<= 8;
- value |= ReadByte();
- }
- return value;
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- Byte b[8];
- ReadBytes(b, 8);
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- {
- if (b[i] != b[7 - i])
- throw 1;
- value |= ((UInt32)(b[i]) << (8 * i));
- }
- return value;
-}
-
-UInt32 CInArchive::ReadDigits(int numDigits)
-{
- UInt32 res = 0;
- for (int i = 0; i < numDigits; i++)
- {
- Byte b = ReadByte();
- if (b < '0' || b > '9')
- {
- if (b == 0) // it's bug in some CD's
- b = '0';
- else
- throw 1;
- }
- UInt32 d = (UInt32)(b - '0');
- res *= 10;
- res += d;
- }
- return res;
-}
-
-void CInArchive::ReadDateTime(CDateTime &d)
-{
- d.Year = (UInt16)ReadDigits(4);
- d.Month = (Byte)ReadDigits(2);
- d.Day = (Byte)ReadDigits(2);
- d.Hour = (Byte)ReadDigits(2);
- d.Minute = (Byte)ReadDigits(2);
- d.Second = (Byte)ReadDigits(2);
- d.Hundredths = (Byte)ReadDigits(2);
- d.GmtOffset = (signed char)ReadByte();
-}
-
-void CInArchive::ReadBootRecordDescriptor(CBootRecordDescriptor &d)
-{
- ReadBytes(d.BootSystemId, sizeof(d.BootSystemId));
- ReadBytes(d.BootId, sizeof(d.BootId));
- ReadBytes(d.BootSystemUse, sizeof(d.BootSystemUse));
-}
-
-void CInArchive::ReadRecordingDateTime(CRecordingDateTime &t)
-{
- t.Year = ReadByte();
- t.Month = ReadByte();
- t.Day = ReadByte();
- t.Hour = ReadByte();
- t.Minute = ReadByte();
- t.Second = ReadByte();
- t.GmtOffset = (signed char)ReadByte();
-}
-
-void CInArchive::ReadDirRecord2(CDirRecord &r, Byte len)
-{
- r.ExtendedAttributeRecordLen = ReadByte();
- if (r.ExtendedAttributeRecordLen != 0)
- throw 1;
- r.ExtentLocation = ReadUInt32();
- r.DataLength = ReadUInt32();
- ReadRecordingDateTime(r.DateTime);
- r.FileFlags = ReadByte();
- r.FileUnitSize = ReadByte();
- r.InterleaveGapSize = ReadByte();
- r.VolSequenceNumber = ReadUInt16();
- Byte idLen = ReadByte();
- r.FileId.SetCapacity(idLen);
- ReadBytes((Byte *)r.FileId, idLen);
- int padSize = 1 - (idLen & 1);
-
- // SkipZeros(1 - (idLen & 1));
- Skip(1 - (idLen & 1)); // it's bug in some cd's. Must be zeros
-
- int curPos = 33 + idLen + padSize;
- if (curPos > len)
- throw 1;
- int rem = len - curPos;
- r.SystemUse.SetCapacity(rem);
- ReadBytes((Byte *)r.SystemUse, rem);
-}
-
-void CInArchive::ReadDirRecord(CDirRecord &r)
-{
- Byte len = ReadByte();
- // Some CDs can have incorrect value len = 48 ('0') in VolumeDescriptor.
- // But maybe we must use real "len" for other records.
- len = 34;
- ReadDirRecord2(r, len);
-}
-
-void CInArchive::ReadVolumeDescriptor(CVolumeDescriptor &d)
-{
- d.VolFlags = ReadByte();
- ReadBytes(d.SystemId, sizeof(d.SystemId));
- ReadBytes(d.VolumeId, sizeof(d.VolumeId));
- SkipZeros(8);
- d.VolumeSpaceSize = ReadUInt32();
- ReadBytes(d.EscapeSequence, sizeof(d.EscapeSequence));
- d.VolumeSetSize = ReadUInt16();
- d.VolumeSequenceNumber = ReadUInt16();
- d.LogicalBlockSize = ReadUInt16();
- d.PathTableSize = ReadUInt32();
- d.LPathTableLocation = ReadUInt32Le();
- d.LOptionalPathTableLocation = ReadUInt32Le();
- d.MPathTableLocation = ReadUInt32Be();
- d.MOptionalPathTableLocation = ReadUInt32Be();
- ReadDirRecord(d.RootDirRecord);
- ReadBytes(d.VolumeSetId, sizeof(d.VolumeSetId));
- ReadBytes(d.PublisherId, sizeof(d.PublisherId));
- ReadBytes(d.DataPreparerId, sizeof(d.DataPreparerId));
- ReadBytes(d.ApplicationId, sizeof(d.ApplicationId));
- ReadBytes(d.CopyrightFileId, sizeof(d.CopyrightFileId));
- ReadBytes(d.AbstractFileId, sizeof(d.AbstractFileId));
- ReadBytes(d.BibFileId, sizeof(d.BibFileId));
- ReadDateTime(d.CTime);
- ReadDateTime(d.MTime);
- ReadDateTime(d.ExpirationTime);
- ReadDateTime(d.EffectiveTime);
- d.FileStructureVersion = ReadByte(); // = 1
- SkipZeros(1);
- ReadBytes(d.ApplicationUse, sizeof(d.ApplicationUse));
- SkipZeros(653);
-}
-
-static const Byte kSig_CD001[5] = { 'C', 'D', '0', '0', '1' };
-
-static const Byte kSig_NSR02[5] = { 'N', 'S', 'R', '0', '2' };
-static const Byte kSig_NSR03[5] = { 'N', 'S', 'R', '0', '3' };
-static const Byte kSig_BEA01[5] = { 'B', 'E', 'A', '0', '1' };
-static const Byte kSig_TEA01[5] = { 'T', 'E', 'A', '0', '1' };
-
-static inline bool CheckSignature(const Byte *sig, const Byte *data)
-{
- for (int i = 0; i < 5; i++)
- if (sig[i] != data[i])
- return false;
- return true;
-}
-
-void CInArchive::SeekToBlock(UInt32 blockIndex)
-{
- if (_stream->Seek((UInt64)blockIndex * VolDescs[MainVolDescIndex].LogicalBlockSize, STREAM_SEEK_SET, &_position) != S_OK)
- throw 1;
- m_BufferPos = 0;
-}
-
-void CInArchive::ReadDir(CDir &d, int level)
-{
- if (!d.IsDir())
- return;
- SeekToBlock(d.ExtentLocation);
- UInt64 startPos = _position;
-
- bool firstItem = true;
- for (;;)
- {
- UInt64 offset = _position - startPos;
- if (offset >= d.DataLength)
- break;
- Byte len = ReadByte();
- if (len == 0)
- continue;
- CDir subItem;
- ReadDirRecord2(subItem, len);
- if (firstItem && level == 0)
- IsSusp = subItem.CheckSusp(SuspSkipSize);
-
- if (!subItem.IsSystemItem())
- d._subItems.Add(subItem);
-
- firstItem = false;
- }
- for (int i = 0; i < d._subItems.Size(); i++)
- ReadDir(d._subItems[i], level + 1);
-}
-
-void CInArchive::CreateRefs(CDir &d)
-{
- if (!d.IsDir())
- return;
- for (int i = 0; i < d._subItems.Size(); i++)
- {
- CRef ref;
- CDir &subItem = d._subItems[i];
- subItem.Parent = &d;
- ref.Dir = &d;
- ref.Index = i;
- Refs.Add(ref);
- CreateRefs(subItem);
- }
-}
-
-void CInArchive::ReadBootInfo()
-{
- if (!_bootIsDefined)
- return;
- if (memcmp(_bootDesc.BootSystemId, kElToritoSpec, sizeof(_bootDesc.BootSystemId)) != 0)
- return;
-
- const Byte *p = (const Byte *)_bootDesc.BootSystemUse;
- UInt32 blockIndex = p[0] | ((UInt32)p[1] << 8) | ((UInt32)p[2] << 16) | ((UInt32)p[3] << 24);
- SeekToBlock(blockIndex);
- Byte b = ReadByte();
- if (b != NBootEntryId::kValidationEntry)
- return;
- {
- CBootValidationEntry e;
- e.PlatformId = ReadByte();
- if (ReadUInt16Spec() != 0)
- throw 1;
- ReadBytes(e.Id, sizeof(e.Id));
- /* UInt16 checkSum = */ ReadUInt16Spec();
- if (ReadByte() != 0x55)
- throw 1;
- if (ReadByte() != 0xAA)
- throw 1;
- }
- b = ReadByte();
- if (b == NBootEntryId::kInitialEntryBootable || b == NBootEntryId::kInitialEntryNotBootable)
- {
- CBootInitialEntry e;
- e.Bootable = (b == NBootEntryId::kInitialEntryBootable);
- e.BootMediaType = ReadByte();
- e.LoadSegment = ReadUInt16Spec();
- e.SystemType = ReadByte();
- if (ReadByte() != 0)
- throw 1;
- e.SectorCount = ReadUInt16Spec();
- e.LoadRBA = ReadUInt32Le();
- if (ReadByte() != 0)
- throw 1;
- BootEntries.Add(e);
- }
- else
- return;
-}
-
-HRESULT CInArchive::Open2()
-{
- Clear();
- RINOK(_stream->Seek(kStartPos, STREAM_SEEK_CUR, &_position));
-
- m_BufferPos = 0;
- BlockSize = kBlockSize;
- for (;;)
- {
- Byte sig[7];
- ReadBytes(sig, 7);
- Byte ver = sig[6];
- if (!CheckSignature(kSig_CD001, sig + 1))
- {
- return S_FALSE;
- /*
- if (sig[0] != 0 || ver != 1)
- break;
- if (CheckSignature(kSig_BEA01, sig + 1))
- {
- }
- else if (CheckSignature(kSig_TEA01, sig + 1))
- {
- break;
- }
- else if (CheckSignature(kSig_NSR02, sig + 1))
- {
- }
- else
- break;
- SkipZeros(0x800 - 7);
- continue;
- */
- }
- // version = 2 for ISO 9660:1999?
- if (ver > 2)
- throw S_FALSE;
-
- if (sig[0] == NVolDescType::kTerminator)
- {
- break;
- // Skip(0x800 - 7);
- // continue;
- }
- switch(sig[0])
- {
- case NVolDescType::kBootRecord:
- {
- _bootIsDefined = true;
- ReadBootRecordDescriptor(_bootDesc);
- break;
- }
- case NVolDescType::kPrimaryVol:
- case NVolDescType::kSupplementaryVol:
- {
- // some ISOs have two PrimaryVols.
- CVolumeDescriptor vd;
- ReadVolumeDescriptor(vd);
- if (sig[0] == NVolDescType::kPrimaryVol)
- {
- // some burners write "Joliet" Escape Sequence to primary volume
- memset(vd.EscapeSequence, 0, sizeof(vd.EscapeSequence));
- }
- VolDescs.Add(vd);
- break;
- }
- default:
- break;
- }
- }
- if (VolDescs.IsEmpty())
- return S_FALSE;
- for (MainVolDescIndex = VolDescs.Size() - 1; MainVolDescIndex > 0; MainVolDescIndex--)
- if (VolDescs[MainVolDescIndex].IsJoliet())
- break;
- // MainVolDescIndex = 0; // to read primary volume
- const CVolumeDescriptor &vd = VolDescs[MainVolDescIndex];
- if (vd.LogicalBlockSize != kBlockSize)
- return S_FALSE;
- (CDirRecord &)_rootDir = vd.RootDirRecord;
- ReadDir(_rootDir, 0);
- CreateRefs(_rootDir);
- ReadBootInfo();
- return S_OK;
-}
-
-HRESULT CInArchive::Open(IInStream *inStream)
-{
- _stream = inStream;
- UInt64 pos;
- RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &pos));
- RINOK(_stream->Seek(0, STREAM_SEEK_END, &_archiveSize));
- RINOK(_stream->Seek(pos, STREAM_SEEK_SET, &_position));
- HRESULT res = S_FALSE;
- try { res = Open2(); }
- catch(...) { Clear(); res = S_FALSE; }
- _stream.Release();
- return res;
-}
-
-void CInArchive::Clear()
-{
- IncorrectBigEndian = false;
- Refs.Clear();
- _rootDir.Clear();
- VolDescs.Clear();
- _bootIsDefined = false;
- BootEntries.Clear();
- SuspSkipSize = 0;
- IsSusp = false;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoIn.h
deleted file mode 100644
index f9c6f6403..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoIn.h
+++ /dev/null
@@ -1,315 +0,0 @@
-// Archive/IsoIn.h
-
-#ifndef __ARCHIVE_ISO_IN_H
-#define __ARCHIVE_ISO_IN_H
-
-#include "Common/IntToString.h"
-#include "Common/MyCom.h"
-
-#include "../../IStream.h"
-
-#include "IsoHeader.h"
-#include "IsoItem.h"
-
-namespace NArchive {
-namespace NIso {
-
-struct CDir: public CDirRecord
-{
- CDir *Parent;
- CObjectVector<CDir> _subItems;
-
- void Clear()
- {
- Parent = 0;
- _subItems.Clear();
- }
-
- int GetLength(bool checkSusp, int skipSize) const
- {
- int len = GetLengthCur(checkSusp, skipSize);
- if (Parent != 0)
- if (Parent->Parent != 0)
- len += 1 + Parent->GetLength(checkSusp, skipSize);
- return len;
- }
-
- int GetLengthU() const
- {
- int len = (int)(FileId.GetCapacity() / 2);
- if (Parent != 0)
- if (Parent->Parent != 0)
- len += 1 + Parent->GetLengthU();
- return len;
- }
-
- AString GetPath(bool checkSusp, int skipSize) const
- {
- AString s;
- int len = GetLength(checkSusp, skipSize);
- char *p = s.GetBuffer(len + 1);
- p += len;
- *p = 0;
- const CDir *cur = this;
- for (;;)
- {
- int curLen = cur->GetLengthCur(checkSusp, skipSize);
- p -= curLen;
- memmove(p, (const char *)(const Byte *)cur->GetNameCur(checkSusp, skipSize), curLen);
- cur = cur->Parent;
- if (cur == 0)
- break;
- if (cur->Parent == 0)
- break;
- p--;
- *p = CHAR_PATH_SEPARATOR;
- }
- s.ReleaseBuffer();
- return s;
- }
-
- UString GetPathU() const
- {
- UString s;
- int len = GetLengthU();
- wchar_t *p = s.GetBuffer(len + 1);
- p += len;
- *p = 0;
- const CDir *cur = this;
- for (;;)
- {
- int curLen = (int)(cur->FileId.GetCapacity() / 2);
- p -= curLen;
- for (int i = 0; i < curLen; i++)
- {
- Byte b0 = ((const Byte *)cur->FileId)[i * 2];
- Byte b1 = ((const Byte *)cur->FileId)[i * 2 + 1];
- p[i] = (wchar_t)(((wchar_t)b0 << 8) | b1);
- }
- cur = cur->Parent;
- if (cur == 0)
- break;
- if (cur->Parent == 0)
- break;
- p--;
- *p = WCHAR_PATH_SEPARATOR;
- }
- s.ReleaseBuffer();
- return s;
- }
-};
-
-struct CDateTime
-{
- UInt16 Year;
- Byte Month;
- Byte Day;
- Byte Hour;
- Byte Minute;
- Byte Second;
- Byte Hundredths;
- signed char GmtOffset; // min intervals from -48 (West) to +52 (East) recorded.
- bool NotSpecified() const { return Year == 0 && Month == 0 && Day == 0 &&
- Hour == 0 && Minute == 0 && Second == 0 && GmtOffset == 0; }
-
- bool GetFileTime(FILETIME &ft) const
- {
- UInt64 value;
- bool res = NWindows::NTime::GetSecondsSince1601(Year, Month, Day, Hour, Minute, Second, value);
- if (res)
- {
- value -= (UInt64)((Int64)GmtOffset * 15 * 60);
- value *= 10000000;
- }
- ft.dwLowDateTime = (DWORD)value;
- ft.dwHighDateTime = (DWORD)(value >> 32);
- return res;
- }
-};
-
-struct CBootRecordDescriptor
-{
- Byte BootSystemId[32]; // a-characters
- Byte BootId[32]; // a-characters
- Byte BootSystemUse[1977];
-};
-
-struct CBootValidationEntry
-{
- Byte PlatformId;
- Byte Id[24]; // to identify the manufacturer/developer of the CD-ROM.
-};
-
-struct CBootInitialEntry
-{
- bool Bootable;
- Byte BootMediaType;
- UInt16 LoadSegment;
- /* This is the load segment for the initial boot image. If this
- value is 0 the system will use the traditional segment of 7C0. If this value
- is non-zero the system will use the specified segment. This applies to x86
- architectures only. For "flat" model architectures (such as Motorola) this
- is the address divided by 10. */
- Byte SystemType; // This must be a copy of byte 5 (System Type) from the
- // Partition Table found in the boot image.
- UInt16 SectorCount; // This is the number of virtual/emulated sectors the system
- // will store at Load Segment during the initial boot procedure.
- UInt32 LoadRBA; // This is the start address of the virtual disk. CD’s use
- // Relative/Logical block addressing.
-
- UInt64 GetSize() const
- {
- // if (BootMediaType == NBootMediaType::k1d44Floppy) (1440 << 10);
- return SectorCount * 512;
- }
-
- UString GetName() const
- {
- UString s;
- if (Bootable)
- s += L"Bootable";
- else
- s += L"NotBootable";
- s += L"_";
- if (BootMediaType >= kNumBootMediaTypes)
- {
- wchar_t name[16];
- ConvertUInt32ToString(BootMediaType, name);
- s += name;
- }
- else
- s += kMediaTypes[BootMediaType];
- s += L".img";
- return s;
- }
-};
-
-struct CVolumeDescriptor
-{
- Byte VolFlags;
- Byte SystemId[32]; // a-characters. An identification of a system
- // which can recognize and act upon the content of the Logical
- // Sectors with logical Sector Numbers 0 to 15 of the volume.
- Byte VolumeId[32]; // d-characters. An identification of the volume.
- UInt32 VolumeSpaceSize; // the number of Logical Blocks in which the Volume Space of the volume is recorded
- Byte EscapeSequence[32];
- UInt16 VolumeSetSize;
- UInt16 VolumeSequenceNumber; // the ordinal number of the volume in the Volume Set of which the volume is a member.
- UInt16 LogicalBlockSize;
- UInt32 PathTableSize;
- UInt32 LPathTableLocation;
- UInt32 LOptionalPathTableLocation;
- UInt32 MPathTableLocation;
- UInt32 MOptionalPathTableLocation;
- CDirRecord RootDirRecord;
- Byte VolumeSetId[128];
- Byte PublisherId[128];
- Byte DataPreparerId[128];
- Byte ApplicationId[128];
- Byte CopyrightFileId[37];
- Byte AbstractFileId[37];
- Byte BibFileId[37];
- CDateTime CTime;
- CDateTime MTime;
- CDateTime ExpirationTime;
- CDateTime EffectiveTime;
- Byte FileStructureVersion; // = 1;
- Byte ApplicationUse[512];
-
- bool IsJoliet() const
- {
- if ((VolFlags & 1) != 0)
- return false;
- Byte b = EscapeSequence[2];
- return (EscapeSequence[0] == 0x25 && EscapeSequence[1] == 0x2F &&
- (b == 0x40 || b == 0x43 || b == 0x45));
- }
-};
-
-struct CRef
-{
- CDir *Dir;
- UInt32 Index;
-};
-
-const UInt32 kBlockSize = 1 << 11;
-
-class CInArchive
-{
- CMyComPtr<IInStream> _stream;
- UInt64 _position;
-
- Byte m_Buffer[kBlockSize];
- UInt32 m_BufferPos;
-
- CDir _rootDir;
- bool _bootIsDefined;
- CBootRecordDescriptor _bootDesc;
-
- void Skip(size_t size);
- void SkipZeros(size_t size);
- Byte ReadByte();
- void ReadBytes(Byte *data, UInt32 size);
- UInt16 ReadUInt16Spec();
- UInt16 ReadUInt16();
- UInt32 ReadUInt32Le();
- UInt32 ReadUInt32Be();
- UInt32 ReadUInt32();
- UInt64 ReadUInt64();
- UInt32 ReadDigits(int numDigits);
- void ReadDateTime(CDateTime &d);
- void ReadRecordingDateTime(CRecordingDateTime &t);
- void ReadDirRecord2(CDirRecord &r, Byte len);
- void ReadDirRecord(CDirRecord &r);
-
- void ReadBootRecordDescriptor(CBootRecordDescriptor &d);
- void ReadVolumeDescriptor(CVolumeDescriptor &d);
-
- void SeekToBlock(UInt32 blockIndex);
- void ReadDir(CDir &d, int level);
- void CreateRefs(CDir &d);
-
- void ReadBootInfo();
- HRESULT Open2();
-public:
- HRESULT Open(IInStream *inStream);
- void Clear();
-
- UInt64 _archiveSize;
-
- CRecordVector<CRef> Refs;
- CObjectVector<CVolumeDescriptor> VolDescs;
- int MainVolDescIndex;
- UInt32 BlockSize;
- CObjectVector<CBootInitialEntry> BootEntries;
- bool IncorrectBigEndian;
-
-
- bool IsJoliet() const { return VolDescs[MainVolDescIndex].IsJoliet(); }
-
- UInt64 GetBootItemSize(int index) const
- {
- const CBootInitialEntry &be = BootEntries[index];
- UInt64 size = be.GetSize();
- if (be.BootMediaType == NBootMediaType::k1d2Floppy)
- size = (1200 << 10);
- else if (be.BootMediaType == NBootMediaType::k1d44Floppy)
- size = (1440 << 10);
- else if (be.BootMediaType == NBootMediaType::k2d88Floppy)
- size = (2880 << 10);
- UInt64 startPos = be.LoadRBA * BlockSize;
- if (startPos < _archiveSize)
- {
- if (_archiveSize - startPos < size)
- size = _archiveSize - startPos;
- }
- return size;
- }
-
- bool IsSusp;
- int SuspSkipSize;
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoItem.h b/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoItem.h
deleted file mode 100644
index f39c2f5d2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoItem.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// Archive/IsoItem.h
-
-#ifndef __ARCHIVE_ISO_ITEM_H
-#define __ARCHIVE_ISO_ITEM_H
-
-#include "Common/Types.h"
-#include "Common/MyString.h"
-#include "Common/Buffer.h"
-
-#include "Windows/Time.h"
-
-#include "IsoHeader.h"
-
-namespace NArchive {
-namespace NIso {
-
-struct CRecordingDateTime
-{
- Byte Year;
- Byte Month;
- Byte Day;
- Byte Hour;
- Byte Minute;
- Byte Second;
- signed char GmtOffset; // min intervals from -48 (West) to +52 (East) recorded.
-
- bool GetFileTime(FILETIME &ft) const
- {
- UInt64 value;
- bool res = NWindows::NTime::GetSecondsSince1601(Year + 1900, Month, Day, Hour, Minute, Second, value);
- if (res)
- {
- value -= (UInt64)((Int64)GmtOffset * 15 * 60);
- value *= 10000000;
- }
- ft.dwLowDateTime = (DWORD)value;
- ft.dwHighDateTime = (DWORD)(value >> 32);
- return res;
- }
-};
-
-struct CDirRecord
-{
- Byte ExtendedAttributeRecordLen;
- UInt32 ExtentLocation;
- UInt32 DataLength;
- CRecordingDateTime DateTime;
- Byte FileFlags;
- Byte FileUnitSize;
- Byte InterleaveGapSize;
- UInt16 VolSequenceNumber;
- CByteBuffer FileId;
- CByteBuffer SystemUse;
-
- bool IsDir() const { return (FileFlags & NFileFlags::kDirectory) != 0; }
- bool IsSystemItem() const
- {
- if (FileId.GetCapacity() != 1)
- return false;
- Byte b = *(const Byte *)FileId;
- return (b == 0 || b == 1);
- }
-
- const Byte* FindSuspName(int skipSize, int &lenRes) const
- {
- lenRes = 0;
- const Byte *p = (const Byte *)SystemUse + skipSize;
- int length = (int)(SystemUse.GetCapacity() - skipSize);
- while (length >= 5)
- {
- int len = p[2];
- if (p[0] == 'N' && p[1] == 'M' && p[3] == 1)
- {
- lenRes = len - 5;
- return p + 5;
- }
- p += len;
- length -= len;
- }
- return 0;
- }
-
- int GetLengthCur(bool checkSusp, int skipSize) const
- {
- if (checkSusp)
- {
- int len;
- const Byte *res = FindSuspName(skipSize, len);
- if (res != 0)
- return len;
- }
- return (int)FileId.GetCapacity();
- }
-
- const Byte* GetNameCur(bool checkSusp, int skipSize) const
- {
- if (checkSusp)
- {
- int len;
- const Byte *res = FindSuspName(skipSize, len);
- if (res != 0)
- return res;
- }
- return (const Byte *)FileId;
- }
-
-
- bool CheckSusp(const Byte *p, int &startPos) const
- {
- if (p[0] == 'S' &&
- p[1] == 'P' &&
- p[2] == 0x7 &&
- p[3] == 0x1 &&
- p[4] == 0xBE &&
- p[5] == 0xEF)
- {
- startPos = p[6];
- return true;
- }
- return false;
- }
-
- bool CheckSusp(int &startPos) const
- {
- const Byte *p = (const Byte *)SystemUse;
- int length = (int)SystemUse.GetCapacity();
- const int kMinLen = 7;
- if (length < kMinLen)
- return false;
- if (CheckSusp(p, startPos))
- return true;
- const int kOffset2 = 14;
- if (length < kOffset2 + kMinLen)
- return false;
- return CheckSusp(p + kOffset2, startPos);
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoRegister.cpp
deleted file mode 100644
index 67a09c769..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Iso/IsoRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// IsoRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "IsoHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NIso::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Iso", L"iso img", 0, 0xE7, { 'C', 'D', '0', '0', '1', 0x1 }, 7, false, CreateArc, 0 };
-
-REGISTER_ARC(Iso)
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Iso/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Iso/StdAfx.h
deleted file mode 100644
index 2e4be10b2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Iso/StdAfx.h
+++ /dev/null
@@ -1,9 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/MyWindows.h"
-#include "../../../Common/NewHandler.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/LzhHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/LzhHandler.cpp
deleted file mode 100644
index 95efc5013..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/LzhHandler.cpp
+++ /dev/null
@@ -1,775 +0,0 @@
-// LzhHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../ICoder.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-#include "../Compress/LzhDecoder.h"
-
-#include "IArchive.h"
-
-#include "Common/ItemNameUtils.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-
-namespace NArchive {
-namespace NLzh{
-
-const int kMethodIdSize = 5;
-
-const Byte kExtIdFileName = 0x01;
-const Byte kExtIdDirName = 0x02;
-const Byte kExtIdUnixTime = 0x54;
-
-struct CExtension
-{
- Byte Type;
- CByteBuffer Data;
- AString GetString() const
- {
- AString s;
- for (size_t i = 0; i < Data.GetCapacity(); i++)
- {
- char c = (char)Data[i];
- if (c == 0)
- break;
- s += c;
- }
- return s;
- }
-};
-
-struct CItem
-{
- AString Name;
- Byte Method[kMethodIdSize];
- Byte Attributes;
- Byte Level;
- Byte OsId;
- UInt32 PackSize;
- UInt32 Size;
- UInt32 ModifiedTime;
- UInt16 CRC;
- CObjectVector<CExtension> Extensions;
-
- bool IsValidMethod() const { return (Method[0] == '-' && Method[1] == 'l' && Method[4] == '-'); }
- bool IsLhMethod() const {return (IsValidMethod() && Method[2] == 'h'); }
- bool IsDir() const {return (IsLhMethod() && Method[3] == 'd'); }
-
- bool IsCopyMethod() const
- {
- return (IsLhMethod() && Method[3] == '0') ||
- (IsValidMethod() && Method[2] == 'z' && Method[3] == '4');
- }
-
- bool IsLh1GroupMethod() const
- {
- if (!IsLhMethod())
- return false;
- switch(Method[3])
- {
- case '1':
- return true;
- }
- return false;
- }
-
- bool IsLh4GroupMethod() const
- {
- if (!IsLhMethod())
- return false;
- switch(Method[3])
- {
- case '4':
- case '5':
- case '6':
- case '7':
- return true;
- }
- return false;
- }
-
- int GetNumDictBits() const
- {
- if (!IsLhMethod())
- return 0;
- switch(Method[3])
- {
- case '1': return 12;
- case '2': return 13;
- case '3': return 13;
- case '4': return 12;
- case '5': return 13;
- case '6': return 15;
- case '7': return 16;
- }
- return 0;
- }
-
- int FindExt(Byte type) const
- {
- for (int i = 0; i < Extensions.Size(); i++)
- if (Extensions[i].Type == type)
- return i;
- return -1;
- }
- bool GetUnixTime(UInt32 &value) const
- {
- int index = FindExt(kExtIdUnixTime);
- if (index < 0)
- {
- if (Level == 2)
- {
- value = ModifiedTime;
- return true;
- }
- return false;
- }
- const Byte *data = (const Byte *)(Extensions[index].Data);
- value = GetUi32(data);
- return true;
- }
-
- AString GetDirName() const
- {
- int index = FindExt(kExtIdDirName);
- if (index < 0)
- return AString();
- return Extensions[index].GetString();
- }
-
- AString GetFileName() const
- {
- int index = FindExt(kExtIdFileName);
- if (index < 0)
- return Name;
- return Extensions[index].GetString();
- }
-
- AString GetName() const
- {
- AString dirName = GetDirName();
- const char kDirSeparator = '\\';
- // check kDirSeparator in Linux
- dirName.Replace((char)(unsigned char)0xFF, kDirSeparator);
- if (!dirName.IsEmpty() && dirName.Back() != kDirSeparator)
- dirName += kDirSeparator;
- return dirName + GetFileName();
- }
-};
-
-struct CItemEx: public CItem
-{
- UInt64 DataPosition;
-};
-
-class CInArchive
-{
- CMyComPtr<IInStream> m_Stream;
- UInt64 m_Position;
-
- HRESULT ReadBytes(void *data, UInt32 size, UInt32 &processedSize);
- HRESULT CheckReadBytes(void *data, UInt32 size);
-public:
- HRESULT Open(IInStream *inStream);
- HRESULT GetNextItem(bool &filled, CItemEx &itemInfo);
- HRESULT Skip(UInt64 numBytes);
-};
-
-HRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 &processedSize)
-{
- size_t realProcessedSize = size;
- RINOK(ReadStream(m_Stream, data, &realProcessedSize));
- processedSize = (UInt32)realProcessedSize;
- m_Position += processedSize;
- return S_OK;
-}
-
-HRESULT CInArchive::CheckReadBytes(void *data, UInt32 size)
-{
- UInt32 processedSize;
- RINOK(ReadBytes(data, size, processedSize));
- return (processedSize == size) ? S_OK: S_FALSE;
-}
-
-HRESULT CInArchive::Open(IInStream *inStream)
-{
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Position));
- m_Stream = inStream;
- return S_OK;
-}
-
-static const Byte *ReadUInt16(const Byte *p, UInt16 &v)
-{
- v = Get16(p);
- return p + 2;
-}
-
-static const Byte *ReadString(const Byte *p, size_t size, AString &s)
-{
- s.Empty();
- for (size_t i = 0; i < size; i++)
- {
- char c = p[i];
- if (c == 0)
- break;
- s += c;
- }
- return p + size;
-}
-
-static Byte CalcSum(const Byte *data, size_t size)
-{
- Byte sum = 0;
- for (size_t i = 0; i < size; i++)
- sum = (Byte)(sum + data[i]);
- return sum;
-}
-
-HRESULT CInArchive::GetNextItem(bool &filled, CItemEx &item)
-{
- filled = false;
-
- UInt32 processedSize;
- Byte startHeader[2];
- RINOK(ReadBytes(startHeader, 2, processedSize))
- if (processedSize == 0)
- return S_OK;
- if (processedSize == 1)
- return (startHeader[0] == 0) ? S_OK: S_FALSE;
- if (startHeader[0] == 0 && startHeader[1] == 0)
- return S_OK;
-
- Byte header[256];
- const UInt32 kBasicPartSize = 22;
- RINOK(ReadBytes(header, kBasicPartSize, processedSize));
- if (processedSize != kBasicPartSize)
- return (startHeader[0] == 0) ? S_OK: S_FALSE;
-
- const Byte *p = header;
- memcpy(item.Method, p, kMethodIdSize);
- if (!item.IsValidMethod())
- return S_OK;
- p += kMethodIdSize;
- item.PackSize = Get32(p);
- item.Size = Get32(p + 4);
- item.ModifiedTime = Get32(p + 8);
- item.Attributes = p[12];
- item.Level = p[13];
- p += 14;
- if (item.Level > 2)
- return S_FALSE;
- UInt32 headerSize;
- if (item.Level < 2)
- {
- headerSize = startHeader[0];
- if (headerSize < kBasicPartSize)
- return S_FALSE;
- UInt32 remain = headerSize - kBasicPartSize;
- RINOK(CheckReadBytes(header + kBasicPartSize, remain));
- if (startHeader[1] != CalcSum(header, headerSize))
- return S_FALSE;
- size_t nameLength = *p++;
- if ((p - header) + nameLength + 2 > headerSize)
- return S_FALSE;
- p = ReadString(p, nameLength, item.Name);
- }
- else
- headerSize = startHeader[0] | ((UInt32)startHeader[1] << 8);
- p = ReadUInt16(p, item.CRC);
- if (item.Level != 0)
- {
- if (item.Level == 2)
- {
- RINOK(CheckReadBytes(header + kBasicPartSize, 2));
- }
- if ((size_t)(p - header) + 3 > headerSize)
- return S_FALSE;
- item.OsId = *p++;
- UInt16 nextSize;
- p = ReadUInt16(p, nextSize);
- while (nextSize != 0)
- {
- if (nextSize < 3)
- return S_FALSE;
- if (item.Level == 1)
- {
- if (item.PackSize < nextSize)
- return S_FALSE;
- item.PackSize -= nextSize;
- }
- CExtension ext;
- RINOK(CheckReadBytes(&ext.Type, 1))
- nextSize -= 3;
- ext.Data.SetCapacity(nextSize);
- RINOK(CheckReadBytes((Byte *)ext.Data, nextSize))
- item.Extensions.Add(ext);
- Byte hdr2[2];
- RINOK(CheckReadBytes(hdr2, 2));
- ReadUInt16(hdr2, nextSize);
- }
- }
- item.DataPosition = m_Position;
- filled = true;
- return S_OK;
-}
-
-HRESULT CInArchive::Skip(UInt64 numBytes)
-{
- UInt64 newPostion;
- RINOK(m_Stream->Seek(numBytes, STREAM_SEEK_CUR, &newPostion));
- m_Position += numBytes;
- if (m_Position != newPostion)
- return E_FAIL;
- return S_OK;
-}
-
-struct COsPair
-{
- Byte Id;
- const char *Name;
-};
-
-static COsPair g_OsPairs[] =
-{
- { 0, "MS-DOS" },
- { 'M', "MS-DOS" },
- { '2', "OS/2" },
- { '9', "OS9" },
- { 'K', "OS/68K" },
- { '3', "OS/386" },
- { 'H', "HUMAN" },
- { 'U', "UNIX" },
- { 'C', "CP/M" },
- { 'F', "FLEX" },
- { 'm', "Mac" },
- { 'R', "Runser" },
- { 'T', "TownsOS" },
- { 'X', "XOSK" },
- { 'w', "Windows 95" },
- { 'W', "Windows NT" },
- { 'J', "Java VM" }
-};
-
-static const char *kUnknownOS = "Unknown";
-
-static const char *GetOS(Byte osId)
-{
- for (int i = 0; i < sizeof(g_OsPairs) / sizeof(g_OsPairs[0]); i++)
- if (g_OsPairs[i].Id == osId)
- return g_OsPairs[i].Name;
- return kUnknownOS;
-}
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- // { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidCRC, VT_UI4},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidHostOS, VT_BSTR}
-};
-
-class CCRC
-{
- UInt16 _value;
-public:
- static UInt16 Table[256];
- static void InitTable();
-
- CCRC(): _value(0) {}
- void Init() { _value = 0; }
- void Update(const void *data, size_t size);
- UInt16 GetDigest() const { return _value; }
-};
-
-static const UInt16 kCRCPoly = 0xA001;
-
-UInt16 CCRC::Table[256];
-
-void CCRC::InitTable()
-{
- for (UInt32 i = 0; i < 256; i++)
- {
- UInt32 r = i;
- for (int j = 0; j < 8; j++)
- if (r & 1)
- r = (r >> 1) ^ kCRCPoly;
- else
- r >>= 1;
- CCRC::Table[i] = (UInt16)r;
- }
-}
-
-class CCRCTableInit
-{
-public:
- CCRCTableInit() { CCRC::InitTable(); }
-} g_CRCTableInit;
-
-void CCRC::Update(const void *data, size_t size)
-{
- UInt16 v = _value;
- const Byte *p = (const Byte *)data;
- for (; size > 0; size--, p++)
- v = (UInt16)(Table[((Byte)(v)) ^ *p] ^ (v >> 8));
- _value = v;
-}
-
-
-class COutStreamWithCRC:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-private:
- CCRC _crc;
- CMyComPtr<ISequentialOutStream> _stream;
-public:
- void Init(ISequentialOutStream *stream)
- {
- _stream = stream;
- _crc.Init();
- }
- void ReleaseStream() { _stream.Release(); }
- UInt32 GetCRC() const { return _crc.GetDigest(); }
- void InitCRC() { _crc.Init(); }
-};
-
-STDMETHODIMP COutStreamWithCRC::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize;
- HRESULT result;
- if (!_stream)
- {
- realProcessedSize = size;
- result = S_OK;
- }
- else
- result = _stream->Write(data, size, &realProcessedSize);
- _crc.Update(data, realProcessedSize);
- if (processedSize != NULL)
- *processedSize = realProcessedSize;
- return result;
-}
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CObjectVector<CItemEx> _items;
- CMyComPtr<IInStream> _stream;
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
- CHandler();
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-CHandler::CHandler() {}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItemEx &item = _items[index];
- switch(propID)
- {
- case kpidPath:
- {
- UString s = NItemName::WinNameToOSName(MultiByteToUnicodeString(item.GetName(), CP_OEMCP));
- if (!s.IsEmpty())
- {
- if (s[s.Length() - 1] == WCHAR_PATH_SEPARATOR)
- s.Delete(s.Length() - 1);
- prop = s;
- }
- break;
- }
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.Size; break;
- case kpidPackSize: prop = item.PackSize; break;
- case kpidCRC: prop = (UInt32)item.CRC; break;
- case kpidHostOS: prop = GetOS(item.OsId); break;
- case kpidMTime:
- {
- FILETIME utc;
- UInt32 unixTime;
- if (item.GetUnixTime(unixTime))
- NTime::UnixTimeToFileTime(unixTime, utc);
- else
- {
- FILETIME localFileTime;
- if (DosTimeToFileTime(item.ModifiedTime, localFileTime))
- {
- if (!LocalFileTimeToFileTime(&localFileTime, &utc))
- utc.dwHighDateTime = utc.dwLowDateTime = 0;
- }
- else
- utc.dwHighDateTime = utc.dwLowDateTime = 0;
- }
- prop = utc;
- break;
- }
- // case kpidAttrib: prop = (UInt32)item.Attributes; break;
- case kpidMethod:
- {
- char method2[kMethodIdSize + 1];
- method2[kMethodIdSize] = 0;
- memcpy(method2, item.Method, kMethodIdSize);
- prop = method2;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- try
- {
- _items.Clear();
- CInArchive archive;
-
- UInt64 endPos = 0;
- bool needSetTotal = true;
-
- if (callback != NULL)
- {
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
-
- RINOK(archive.Open(stream));
- for (;;)
- {
- CItemEx item;
- bool filled;
- HRESULT result = archive.GetNextItem(filled, item);
- if (result == S_FALSE)
- return S_FALSE;
- if (result != S_OK)
- return S_FALSE;
- if (!filled)
- break;
- _items.Add(item);
- archive.Skip(item.PackSize);
- if (callback != NULL)
- {
- if (needSetTotal)
- {
- RINOK(callback->SetTotal(NULL, &endPos));
- needSetTotal = false;
- }
- if (_items.Size() % 100 == 0)
- {
- UInt64 numFiles = _items.Size();
- UInt64 numBytes = item.DataPosition;
- RINOK(callback->SetCompleted(&numFiles, &numBytes));
- }
- }
- }
- if (_items.IsEmpty())
- return S_FALSE;
-
- _stream = stream;
- }
- catch(...)
- {
- return S_FALSE;
- }
- COM_TRY_END
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _items.Clear();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testModeSpec, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool testMode = (testModeSpec != 0);
- UInt64 totalUnPacked = 0, totalPacked = 0;
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const CItemEx &item = _items[allFilesMode ? i : indices[i]];
- totalUnPacked += item.Size;
- totalPacked += item.PackSize;
- }
- RINOK(extractCallback->SetTotal(totalUnPacked));
-
- UInt64 currentTotalUnPacked = 0, currentTotalPacked = 0;
- UInt64 currentItemUnPacked, currentItemPacked;
-
- NCompress::NLzh::NDecoder::CCoder *lzhDecoderSpec = 0;
- CMyComPtr<ICompressCoder> lzhDecoder;
- CMyComPtr<ICompressCoder> lzh1Decoder;
- CMyComPtr<ICompressCoder> arj2Decoder;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++, currentTotalUnPacked += currentItemUnPacked,
- currentTotalPacked += currentItemPacked)
- {
- currentItemUnPacked = 0;
- currentItemPacked = 0;
-
- lps->InSize = currentTotalPacked;
- lps->OutSize = currentTotalUnPacked;
- RINOK(lps->SetCur());
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode;
- askMode = testMode ? NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItemEx &item = _items[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (item.IsDir())
- {
- // if (!testMode)
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- continue;
- }
-
- if (!testMode && !realOutStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- currentItemUnPacked = item.Size;
- currentItemPacked = item.PackSize;
-
- {
- COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->Init(realOutStream);
- realOutStream.Release();
-
- UInt64 pos;
- _stream->Seek(item.DataPosition, STREAM_SEEK_SET, &pos);
-
- streamSpec->Init(item.PackSize);
-
- HRESULT result = S_OK;
- Int32 opRes = NExtract::NOperationResult::kOK;
-
- if (item.IsCopyMethod())
- {
- result = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (result == S_OK && copyCoderSpec->TotalSize != item.PackSize)
- result = S_FALSE;
- }
- else if (item.IsLh4GroupMethod())
- {
- if (!lzhDecoder)
- {
- lzhDecoderSpec = new NCompress::NLzh::NDecoder::CCoder;
- lzhDecoder = lzhDecoderSpec;
- }
- lzhDecoderSpec->SetDictionary(item.GetNumDictBits());
- result = lzhDecoder->Code(inStream, outStream, NULL, &currentItemUnPacked, progress);
- }
- /*
- else if (item.IsLh1GroupMethod())
- {
- if (!lzh1Decoder)
- {
- lzh1DecoderSpec = new NCompress::NLzh1::NDecoder::CCoder;
- lzh1Decoder = lzh1DecoderSpec;
- }
- lzh1DecoderSpec->SetDictionary(item.GetNumDictBits());
- result = lzh1Decoder->Code(inStream, outStream, NULL, &currentItemUnPacked, progress);
- }
- */
- else
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
-
- if (opRes == NExtract::NOperationResult::kOK)
- {
- if (result == S_FALSE)
- opRes = NExtract::NOperationResult::kDataError;
- else
- {
- RINOK(result);
- if (outStreamSpec->GetCRC() != item.CRC)
- opRes = NExtract::NOperationResult::kCRCError;
- }
- }
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Lzh", L"lzh lha", 0, 6, { '-', 'l' }, 2, false, CreateArc, 0 };
-
-REGISTER_ARC(Lzh)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/MachoHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/MachoHandler.cpp
deleted file mode 100644
index a6261f34d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/MachoHandler.cpp
+++ /dev/null
@@ -1,500 +0,0 @@
-// MachoHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariantUtils.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-static UInt32 Get32(const Byte *p, int be) { if (be) return GetBe32(p); return GetUi32(p); }
-static UInt64 Get64(const Byte *p, int be) { if (be) return GetBe64(p); return GetUi64(p); }
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NMacho {
-
-#define MACH_ARCH_ABI64 (1 << 24)
-#define MACH_MACHINE_386 7
-#define MACH_MACHINE_ARM 12
-#define MACH_MACHINE_SPARC 14
-#define MACH_MACHINE_PPC 18
-
-#define MACH_MACHINE_PPC64 (MACH_ARCH_ABI64 | MACH_MACHINE_PPC)
-#define MACH_MACHINE_AMD64 (MACH_ARCH_ABI64 | MACH_MACHINE_386)
-
-#define MACH_CMD_SEGMENT_32 1
-#define MACH_CMD_SEGMENT_64 0x19
-
-#define MACH_SECT_TYPE_MASK 0x000000FF
-#define MACH_SECT_ATTR_MASK 0xFFFFFF00
-
-#define MACH_SECT_ATTR_ZEROFILL 1
-
-static const char *g_SectTypes[] =
-{
- "REGULAR",
- "ZEROFILL",
- "CSTRINGS",
- "4BYTE_LITERALS",
- "8BYTE_LITERALS",
- "LITERAL_POINTERS",
- "NON_LAZY_SYMBOL_POINTERS",
- "LAZY_SYMBOL_POINTERS",
- "SYMBOL_STUBS",
- "MOD_INIT_FUNC_POINTERS",
- "MOD_TERM_FUNC_POINTERS",
- "COALESCED",
- "GB_ZEROFILL",
- "INTERPOSING",
- "16BYTE_LITERALS"
-};
-
-static const char *g_FileTypes[] =
-{
- "0",
- "OBJECT",
- "EXECUTE",
- "FVMLIB",
- "CORE",
- "PRELOAD",
- "DYLIB",
- "DYLINKER",
- "BUNDLE",
- "DYLIB_STUB",
- "DSYM"
-};
-
-static const CUInt32PCharPair g_Flags[] =
-{
- { 31, "PURE_INSTRUCTIONS" },
- { 30, "NO_TOC" },
- { 29, "STRIP_STATIC_SYMS" },
- { 28, "NO_DEAD_STRIP" },
- { 27, "LIVE_SUPPORT" },
- { 26, "SELF_MODIFYING_CODE" },
- { 25, "DEBUG" },
- { 10, "SOME_INSTRUCTIONS" },
- { 9, "EXT_RELOC" },
- { 8, "LOC_RELOC" }
-};
-
-static const CUInt32PCharPair g_MachinePairs[] =
-{
- { MACH_MACHINE_386, "x86" },
- { MACH_MACHINE_ARM, "ARM" },
- { MACH_MACHINE_SPARC, "SPARC" },
- { MACH_MACHINE_PPC, "PowerPC" },
- { MACH_MACHINE_PPC64, "PowerPC 64-bit" },
- { MACH_MACHINE_AMD64, "x64" }
-};
-
-static const int kNameSize = 16;
-
-struct CSegment
-{
- char Name[kNameSize];
-};
-
-struct CSection
-{
- char Name[kNameSize];
- char SegName[kNameSize];
- UInt64 Va;
- UInt64 Pa;
- UInt64 VSize;
- UInt64 PSize;
-
- UInt32 Flags;
- int SegmentIndex;
-
- bool IsDummy;
-
- CSection(): IsDummy(false) {}
- // UInt64 GetPackSize() const { return Flags == MACH_SECT_ATTR_ZEROFILL ? 0 : Size; }
- UInt64 GetPackSize() const { return PSize; }
-};
-
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _inStream;
- CObjectVector<CSegment> _segments;
- CObjectVector<CSection> _sections;
- bool _mode64;
- bool _be;
- UInt32 _machine;
- UInt32 _type;
- UInt32 _headersSize;
- UInt64 _totalSize;
- HRESULT Open2(ISequentialInStream *stream);
- bool Parse(const Byte *buf, UInt32 size);
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-bool CHandler::Parse(const Byte *buf, UInt32 size)
-{
- bool mode64 = _mode64;
- bool be = _be;
-
- const Byte *bufStart = buf;
- bool reduceCommands = false;
- if (size < 512)
- return false;
-
- _machine = Get32(buf + 4, be);
- _type = Get32(buf + 0xC, be);
-
- UInt32 numCommands = Get32(buf + 0x10, be);
- UInt32 commandsSize = Get32(buf + 0x14, be);
- if (commandsSize > size)
- return false;
-
- if (commandsSize > (1 << 24) || numCommands > (1 << 18))
- return false;
-
- if (numCommands > 16)
- {
- reduceCommands = true;
- numCommands = 16;
- }
-
- _headersSize = 0;
-
- buf += 0x1C;
- size -= 0x1C;
-
- if (mode64)
- {
- buf += 4;
- size -= 4;
- }
-
- _totalSize = (UInt32)(buf - bufStart);
- if (commandsSize < size)
- size = commandsSize;
-
- for (UInt32 cmdIndex = 0; cmdIndex < numCommands; cmdIndex++)
- {
- if (size < 8)
- return false;
- UInt32 cmd = Get32(buf, be);
- UInt32 cmdSize = Get32(buf + 4, be);
- if (size < cmdSize)
- return false;
- if (cmd == MACH_CMD_SEGMENT_32 || cmd == MACH_CMD_SEGMENT_64)
- {
- UInt32 offs = (cmd == MACH_CMD_SEGMENT_64) ? 0x48 : 0x38;
- if (cmdSize < offs)
- break;
-
- UInt64 vmAddr, vmSize, phAddr, phSize;
-
- {
- if (cmd == MACH_CMD_SEGMENT_64)
- {
- vmAddr = Get64(buf + 0x18, be);
- vmSize = Get64(buf + 0x20, be);
- phAddr = Get64(buf + 0x28, be);
- phSize = Get64(buf + 0x30, be);
- }
- else
- {
- vmAddr = Get32(buf + 0x18, be);
- vmSize = Get32(buf + 0x1C, be);
- phAddr = Get32(buf + 0x20, be);
- phSize = Get32(buf + 0x24, be);
- }
- {
- UInt64 totalSize = phAddr + phSize;
- if (totalSize > _totalSize)
- _totalSize = totalSize;
- }
- }
-
- CSegment seg;
- memcpy(seg.Name, buf + 8, kNameSize);
- _segments.Add(seg);
-
- UInt32 numSections = Get32(buf + offs - 8, be);
- if (numSections > (1 << 8))
- return false;
-
- if (numSections == 0)
- {
- CSection section;
- section.IsDummy = true;
- section.SegmentIndex = _segments.Size() - 1;
- section.Va = vmAddr;
- section.PSize = phSize;
- section.VSize = vmSize;
- section.Pa = phAddr;
- section.Flags = 0;
- _sections.Add(section);
- }
- else do
- {
- CSection section;
- UInt32 headerSize = (cmd == MACH_CMD_SEGMENT_64) ? 0x50 : 0x44;
- const Byte *p = buf + offs;
- if (cmdSize - offs < headerSize)
- break;
- if (cmd == MACH_CMD_SEGMENT_64)
- {
- section.Va = Get64(p + 0x20, be);
- section.VSize = Get64(p + 0x28, be);
- section.Pa = Get32(p + 0x30, be);
- section.Flags = Get32(p + 0x40, be);
- }
- else
- {
- section.Va = Get32(p + 0x20, be);
- section.VSize = Get32(p + 0x24, be);
- section.Pa = Get32(p + 0x28, be);
- section.Flags = Get32(p + 0x38, be);
- }
- if (section.Flags == MACH_SECT_ATTR_ZEROFILL)
- section.PSize = 0;
- else
- section.PSize = section.VSize;
- memcpy(section.Name, p, kNameSize);
- memcpy(section.SegName, p + kNameSize, kNameSize);
- section.SegmentIndex = _segments.Size() - 1;
- _sections.Add(section);
- offs += headerSize;
- }
- while (--numSections);
-
- if (offs != cmdSize)
- return false;
- }
- buf += cmdSize;
- size -= cmdSize;
- }
- _headersSize = (UInt32)(buf - bufStart);
- return reduceCommands || (size == 0);
-}
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidCpu, VT_BSTR},
- { NULL, kpidBit64, VT_BOOL},
- { NULL, kpidBigEndian, VT_BOOL},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI4}
-};
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidOffset, VT_UI8},
- { NULL, kpidVa, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidCpu: PAIR_TO_PROP(g_MachinePairs, _machine, prop); break;
- case kpidCharacts: TYPE_TO_PROP(g_FileTypes, _type, prop); break;
- case kpidPhySize: prop = _totalSize; break;
- case kpidHeadersSize: prop = _headersSize; break;
- case kpidBit64: if (_mode64) prop = _mode64; break;
- case kpidBigEndian: if (_be) prop = _be; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-static AString GetName(const char *name)
-{
- char res[kNameSize + 1];
- memcpy(res, name, kNameSize);
- res[kNameSize] = 0;
- return res;
-}
-
-static AString SectFlagsToString(UInt32 flags)
-{
- AString res = TypeToString(g_SectTypes, sizeof(g_SectTypes) / sizeof(g_SectTypes[0]),
- flags & MACH_SECT_TYPE_MASK);
- AString s = FlagsToString(g_Flags, sizeof(g_Flags) / sizeof(g_Flags[0]),
- flags & MACH_SECT_ATTR_MASK);
- if (!s.IsEmpty())
- {
- res += ' ';
- res += s;
- }
- return res;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- const CSection &item = _sections[index];
- switch(propID)
- {
- case kpidPath:
- {
- AString s = GetName(_segments[item.SegmentIndex].Name);
- if (!item.IsDummy)
- s += GetName(item.Name);
- StringToProp(s, prop);
- break;
- }
- case kpidSize: /* prop = (UInt64)item.VSize; break; */
- case kpidPackSize: prop = (UInt64)item.GetPackSize(); break;
- case kpidCharacts: if (!item.IsDummy) StringToProp(SectFlagsToString(item.Flags), prop); break;
- case kpidOffset: prop = item.Pa; break;
- case kpidVa: prop = item.Va; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::Open2(ISequentialInStream *stream)
-{
- const UInt32 kBufSize = 1 << 18;
- const UInt32 kSigSize = 4;
-
- CByteBuffer buffer;
- buffer.SetCapacity(kBufSize);
- Byte *buf = buffer;
-
- size_t processed = kSigSize;
- RINOK(ReadStream_FALSE(stream, buf, processed));
- UInt32 sig = GetUi32(buf);
- bool be, mode64;
- switch(sig)
- {
- case 0xCEFAEDFE: be = true; mode64 = false; break;
- case 0xCFFAEDFE: be = true; mode64 = true; break;
- case 0xFEEDFACE: be = false; mode64 = false; break;
- case 0xFEEDFACF: be = false; mode64 = true; break;
- default: return S_FALSE;
- }
- processed = kBufSize - kSigSize;
- RINOK(ReadStream(stream, buf + kSigSize, &processed));
- _mode64 = mode64;
- _be = be;
- return Parse(buf, (UInt32)processed + kSigSize) ? S_OK : S_FALSE;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- RINOK(Open2(inStream));
- _inStream = inStream;
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _inStream.Release();
- _sections.Clear();
- _segments.Clear();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _sections.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _sections.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _sections[allFilesMode ? i : indices[i]].GetPackSize();
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
- UInt64 currentItemSize;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_inStream);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CSection &item = _sections[index];
- currentItemSize = item.GetPackSize();
-
- CMyComPtr<ISequentialOutStream> outStream;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(_inStream->Seek(item.Pa, STREAM_SEEK_SET, NULL));
- streamSpec->Init(currentItemSize);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == currentItemSize ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"MachO", L"", 0, 0xDF, { 0 }, 0, false, CreateArc, 0 };
-
-REGISTER_ARC(Macho)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/MbrHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/MbrHandler.cpp
deleted file mode 100644
index b6d791829..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/MbrHandler.cpp
+++ /dev/null
@@ -1,507 +0,0 @@
-// MbrHandler.cpp
-
-#include "StdAfx.h"
-
-// #define SHOW_DEBUG_INFO
-
-#ifdef SHOW_DEBUG_INFO
-#include <stdio.h>
-#endif
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#ifdef SHOW_DEBUG_INFO
-#define PRF(x) x
-#else
-#define PRF(x)
-#endif
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NMbr {
-
-struct CChs
-{
- Byte Head;
- Byte SectCyl;
- Byte Cyl8;
-
- UInt32 GetSector() const { return SectCyl & 0x3F; }
- UInt32 GetCyl() const { return ((UInt32)SectCyl >> 6 << 8) | Cyl8; }
- void ToString(NCOM::CPropVariant &prop) const;
-
- void Parse(const Byte *p)
- {
- Head = p[0];
- SectCyl = p[1];
- Cyl8 = p[2];
- }
- bool Check() const { return GetSector() > 0; }
-};
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareChs(const CChs &c1, const CChs &c2)
-{
- RINOZ(MyCompare(c1.GetCyl(), c2.GetCyl()));
- RINOZ(MyCompare(c1.Head, c2.Head));
- return MyCompare(c1.GetSector(), c2.GetSector());
-}
-
-static void AddUIntToString(UInt32 val, AString &res)
-{
- char s[16];
- ConvertUInt32ToString(val, s);
- res += s;
-}
-
-void CChs::ToString(NCOM::CPropVariant &prop) const
-{
- AString s;
- AddUIntToString(GetCyl(), s);
- s += '-';
- AddUIntToString(Head, s);
- s += '-';
- AddUIntToString(GetSector(), s);
- prop = s;
-}
-
-struct CPartition
-{
- Byte Status;
- CChs BeginChs;
- Byte Type;
- CChs EndChs;
- UInt32 Lba;
- UInt32 NumBlocks;
-
- CPartition() { memset (this, 0, sizeof(*this)); }
-
- bool IsEmpty() const { return Type == 0; }
- bool IsExtended() const { return Type == 5 || Type == 0xF; }
- UInt32 GetLimit() const { return Lba + NumBlocks; }
- // bool IsActive() const { return Status == 0x80; }
- UInt64 GetPos() const { return (UInt64)Lba * 512; }
- UInt64 GetSize() const { return (UInt64)NumBlocks * 512; }
-
- bool CheckLbaLimits() const { return (UInt32)0xFFFFFFFF - Lba >= NumBlocks; }
- bool Parse(const Byte *p)
- {
- Status = p[0];
- BeginChs.Parse(p + 1);
- Type = p[4];
- EndChs.Parse(p + 5);
- Lba = GetUi32(p + 8);
- NumBlocks = GetUi32(p + 12);
- if (Type == 0)
- return true;
- if (Status != 0 && Status != 0x80)
- return false;
- return
- BeginChs.Check() &&
- EndChs.Check() &&
- CompareChs(BeginChs, EndChs) <= 0 &&
- NumBlocks > 0 &&
- CheckLbaLimits();
- }
-
- #ifdef SHOW_DEBUG_INFO
- void Print() const
- {
- NCOM::CPropVariant prop, prop2;
- BeginChs.ToString(prop);
- EndChs.ToString(prop2);
- printf(" %2x %2x %8X %8X %12S %12S", (int)Status, (int)Type, Lba, NumBlocks, prop.bstrVal, prop2.bstrVal);
- }
- #endif
-};
-
-struct CPartType
-{
- UInt32 Id;
- const char *Ext;
- const char *Name;
-};
-
-static const char *kFat = "fat";
-
-static const CPartType kPartTypes[] =
-{
- { 0x01, kFat, "FAT12" },
- { 0x04, kFat, "FAT16 DOS 3.0+" },
- { 0x05, 0, "Extended" },
- { 0x06, kFat, "FAT16 DOS 3.31+" },
- { 0x07, "ntfs", "NTFS" },
- { 0x0B, kFat, "FAT32" },
- { 0x0C, kFat, "FAT32-LBA" },
- { 0x0E, kFat, "FAT16-LBA" },
- { 0x0F, 0, "Extended-LBA" },
- { 0x11, kFat, "FAT12-Hidden" },
- { 0x14, kFat, "FAT16-Hidden < 32 MB" },
- { 0x16, kFat, "FAT16-Hidden >= 32 MB" },
- { 0x1B, kFat, "FAT32-Hidden" },
- { 0x1C, kFat, "FAT32-LBA-Hidden" },
- { 0x1E, kFat, "FAT16-LBA-WIN95-Hidden" },
- { 0x82, 0, "Solaris x86 / Linux swap" },
- { 0x83, 0, "Linux" },
- { 0xBE, 0, "Solaris 8 boot" },
- { 0xBF, 0, "New Solaris x86" },
- { 0xC2, 0, "Linux-Hidden" },
- { 0xC3, 0, "Linux swap-Hidden" },
- { 0xEE, 0, "EFI-MBR" },
- { 0xEE, 0, "EFI" }
-};
-
-static int FindPartType(UInt32 type)
-{
- for (int i = 0; i < sizeof(kPartTypes) / sizeof(kPartTypes[0]); i++)
- if (kPartTypes[i].Id == type)
- return i;
- return -1;
-}
-
-struct CItem
-{
- bool IsReal;
- bool IsPrim;
- UInt64 Size;
- CPartition Part;
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CObjectVector<CItem> _items;
- UInt64 _totalSize;
- CByteBuffer _buffer;
-
- HRESULT ReadTables(IInStream *stream, UInt32 baseLba, UInt32 lba, int level);
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-HRESULT CHandler::ReadTables(IInStream *stream, UInt32 baseLba, UInt32 lba, int level)
-{
- if (level >= 128 || _items.Size() >= 128)
- return S_FALSE;
-
- const int kNumHeaderParts = 4;
- CPartition parts[kNumHeaderParts];
-
- {
- const UInt32 kSectorSize = 512;
- _buffer.SetCapacity(kSectorSize);
- Byte *buf = _buffer;
- UInt64 newPos = (UInt64)lba << 9;
- if (newPos + 512 > _totalSize)
- return S_FALSE;
- RINOK(stream->Seek(newPos, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(stream, buf, kSectorSize));
-
- if (buf[0x1FE] != 0x55 || buf[0x1FF] != 0xAA)
- return S_FALSE;
-
- for (int i = 0; i < kNumHeaderParts; i++)
- if (!parts[i].Parse(buf + 0x1BE + 16 * i))
- return S_FALSE;
- }
-
- PRF(printf("\n# %8X", lba));
-
- UInt32 limLba = lba + 1;
- if (limLba == 0)
- return S_FALSE;
-
- for (int i = 0; i < kNumHeaderParts; i++)
- {
- CPartition &part = parts[i];
-
- if (part.IsEmpty())
- continue;
- PRF(printf("\n %2d ", (int)level));
- #ifdef SHOW_DEBUG_INFO
- part.Print();
- #endif
-
- int numItems = _items.Size();
- UInt32 newLba = lba + part.Lba;
-
- if (part.IsExtended())
- {
- // if (part.Type == 5) // Check it!
- newLba = baseLba + part.Lba;
- if (newLba < limLba)
- return S_FALSE;
- HRESULT res = ReadTables(stream, level < 1 ? newLba : baseLba, newLba, level + 1);
- if (res != S_FALSE && res != S_OK)
- return res;
- }
- if (newLba < limLba)
- return S_FALSE;
- part.Lba = newLba;
- if (!part.CheckLbaLimits())
- return S_FALSE;
-
- CItem n;
- n.Part = part;
- bool addItem = false;
- if (numItems == _items.Size())
- {
- n.IsPrim = (level == 0);
- n.IsReal = true;
- addItem = true;
- }
- else
- {
- const CItem &back = _items.Back();
- UInt32 backLimit = back.Part.GetLimit();
- UInt32 partLimit = part.GetLimit();
- if (backLimit < partLimit)
- {
- n.IsReal = false;
- n.Part.Lba = backLimit;
- n.Part.NumBlocks = partLimit - backLimit;
- addItem = true;
- }
- }
- if (addItem)
- {
- if (n.Part.GetLimit() < limLba)
- return S_FALSE;
- limLba = n.Part.GetLimit();
- n.Size = n.Part.GetSize();
- _items.Add(n);
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- RINOK(stream->Seek(0, STREAM_SEEK_END, &_totalSize));
- RINOK(ReadTables(stream, 0, 0, 0));
- if (_items.IsEmpty())
- return S_FALSE;
- UInt32 lbaLimit = _items.Back().Part.GetLimit();
- UInt64 lim = (UInt64)lbaLimit << 9;
- if (lim < _totalSize)
- {
- CItem n;
- n.Part.Lba = lbaLimit;
- n.Size = _totalSize - lim;
- n.IsReal = false;
- _items.Add(n);
- }
- _stream = stream;
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _items.Clear();
- _stream.Release();
- return S_OK;
-}
-
-enum
-{
- kpidPrimary = kpidUserDefined,
- kpidBegChs,
- kpidEndChs
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidFileSystem, VT_BSTR},
- { NULL, kpidOffset, VT_UI8},
- { L"Primary", kpidPrimary, VT_BOOL},
- { L"Begin CHS", kpidBegChs, VT_BSTR},
- { L"End CHS", kpidEndChs, VT_BSTR}
-};
-
-IMP_IInArchive_Props_WITH_NAME
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMainSubfile:
- {
- int mainIndex = -1;
- for (int i = 0; i < _items.Size(); i++)
- if (_items[i].IsReal)
- {
- if (mainIndex >= 0)
- {
- mainIndex = -1;
- break;
- }
- mainIndex = i;
- }
- if (mainIndex >= 0)
- prop = (UInt32)mainIndex;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
-
- const CItem &item = _items[index];
- const CPartition &part = item.Part;
- switch(propID)
- {
- case kpidPath:
- {
- AString s;
- AddUIntToString(index, s);
- if (item.IsReal)
- {
- int typeIndex = FindPartType(part.Type);
- s += '.';
- const char *ext = "img";
- if (typeIndex >= 0 && kPartTypes[typeIndex].Ext != 0)
- ext = kPartTypes[typeIndex].Ext;
- s += ext;
- }
- prop = s;
- break;
- }
- case kpidFileSystem:
- if (item.IsReal)
- {
- char s[32];
- ConvertUInt32ToString(part.Type, s);
- const char *res = s;
- int typeIndex = FindPartType(part.Type);
- if (typeIndex >= 0 && kPartTypes[typeIndex].Name)
- res = kPartTypes[typeIndex].Name;
- prop = res;
- }
- break;
- case kpidSize: prop = item.Size; break;;
- case kpidPackSize: prop = item.Size; break;
- case kpidOffset: prop = part.GetPos(); break;
- case kpidPrimary: if (item.IsReal) prop = item.IsPrim; break;
- case kpidBegChs: if (item.IsReal) part.BeginChs.ToString(prop); break;
- case kpidEndChs: if (item.IsReal) part.EndChs.ToString(prop); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- totalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- const CPartition &part = item.Part;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- totalSize += item.Size;
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- RINOK(_stream->Seek(part.GetPos(), STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(copyCoderSpec->TotalSize == item.Size ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItem &item = _items[index];
- return CreateLimitedInStream(_stream, item.Part.GetPos(), item.Size, stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"MBR", L"mbr", 0, 0xDB, { 1, 1, 0 }, 3, false, CreateArc, 0 };
-
-REGISTER_ARC(Mbr)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/MslzHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/MslzHandler.cpp
deleted file mode 100644
index 67495e765..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/MslzHandler.cpp
+++ /dev/null
@@ -1,257 +0,0 @@
-// MslzHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "Common/DummyOutStream.h"
-
-namespace NArchive {
-namespace NMslz {
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- UInt32 _size;
- UInt64 _packSize;
- UString _name;
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPath: if (!_name.IsEmpty()) prop = _name; break;
- case kpidSize: prop = _size; break;
- case kpidPackSize: prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-static const unsigned kSignatureSize = 9;
-static const unsigned kHeaderSize = kSignatureSize + 1 + 4;
-#define MSLZ_SIGNATURE { 0x53, 0x5A, 0x44, 0x44, 0x88, 0xF0, 0x27, 0x33, 0x41 }
-// old signature: 53 5A 20 88 F0 27 33
-static const Byte signature[kSignatureSize] = MSLZ_SIGNATURE;
-
-static const wchar_t *g_Exts[] =
-{
- L"dll",
- L"exe",
- L"kmd",
- L"sys"
-};
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- {
- Close();
- Byte buffer[kHeaderSize];
- RINOK(ReadStream_FALSE(stream, buffer, kHeaderSize));
- if (memcmp(buffer, signature, kSignatureSize) != 0)
- return S_FALSE;
- _size = GetUi32(buffer + 10);
- if (_size > 0xFFFFFFE0)
- return S_FALSE;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &_packSize));
-
- if (callback)
- {
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
- callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback);
- if (openVolumeCallback)
- {
- NWindows::NCOM::CPropVariant prop;
- if (openVolumeCallback->GetProperty(kpidName, &prop) == S_OK && prop.vt == VT_BSTR)
- {
- UString baseName = prop.bstrVal;
- if (!baseName.IsEmpty() && baseName.Back() == L'_')
- {
- baseName.DeleteBack();
- Byte replaceByte = buffer[kSignatureSize];
- if (replaceByte == 0)
- {
- for (int i = 0; i < sizeof(g_Exts) / sizeof(g_Exts[0]); i++)
- {
- UString s = g_Exts[i];
- int len = s.Length();
- Byte b = (Byte)s.Back();
- s.DeleteBack();
- if (baseName.Length() >= len &&
- baseName[baseName.Length() - len] == '.' &&
- s.CompareNoCase(baseName.Right(len - 1)) == 0)
- {
- replaceByte = b;
- break;
- }
- }
- }
- if (replaceByte >= 0x20 && replaceByte < 0x80)
- _name = baseName + (wchar_t)replaceByte;
- }
- }
- }
- }
- _stream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _name.Empty();
- return S_OK;
-}
-
-// MslzDec is modified LZSS algorithm of Haruhiko Okumura:
-// maxLen = 18; Okumura
-// maxLen = 16; MS
-
-#define PROGRESS_AND_WRITE \
- if ((dest & kMask) == 0) { RINOK(WriteStream(outStream, buf, kBufSize)); \
- if ((dest & ((1 << 20) - 1)) == 0) \
- { UInt64 inSize = inStream.GetProcessedSize(); UInt64 outSize = dest; \
- RINOK(progress->SetRatioInfo(&inSize, &outSize)); }}
-
-static HRESULT MslzDec(CInBuffer &inStream, ISequentialOutStream *outStream, UInt32 unpackSize, ICompressProgressInfo *progress)
-{
- const unsigned kBufSize = (1 << 12);
- const unsigned kMask = kBufSize - 1;
- Byte buf[kBufSize];
- UInt32 dest = 0;
- memset(buf, ' ', kBufSize);
- while (dest < unpackSize)
- {
- Byte b;
- if (!inStream.ReadByte(b))
- return S_FALSE;
- for (unsigned mask = (unsigned)b | 0x100; mask > 1 && dest < unpackSize; mask >>= 1)
- {
- if (!inStream.ReadByte(b))
- return S_FALSE;
- if (mask & 1)
- {
- buf[dest++ & kMask] = b;
- PROGRESS_AND_WRITE
- }
- else
- {
- Byte b1;
- if (!inStream.ReadByte(b1))
- return S_FALSE;
- const unsigned kMaxLen = 16; // 18 in Okumura's code.
- unsigned src = (((((unsigned)b1 & 0xF0) << 4) | b) + kMaxLen) & kMask;
- unsigned len = (b1 & 0xF) + 3;
- if (len > kMaxLen || dest + len > unpackSize)
- return S_FALSE;
- do
- {
- buf[dest++ & kMask] = buf[src++ & kMask];
- PROGRESS_AND_WRITE
- }
- while (--len != 0);
- }
- }
- }
- return WriteStream(outStream, buf, dest & kMask);
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- extractCallback->SetTotal(_size);
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
- realOutStream.Release();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL));
- CInBuffer s;
- if (!s.Create(1 << 20))
- return E_OUTOFMEMORY;
- s.SetStream(_stream);
- s.Init();
- Byte buffer[kHeaderSize];
- Int32 opRes = NExtract::NOperationResult::kDataError;
- if (s.ReadBytes(buffer, kHeaderSize) == kHeaderSize)
- {
- HRESULT result = MslzDec(s, outStream, _size, progress);
- if (result == S_OK)
- opRes = NExtract::NOperationResult::kOK;
- else if (result != S_FALSE)
- return result;
- }
- outStream.Release();
- return extractCallback->SetOperationResult(opRes);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"MsLZ", L"", 0, 0xD5, MSLZ_SIGNATURE, kSignatureSize, false, CreateArc, 0 };
-
-REGISTER_ARC(Mslz)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/MubHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/MubHandler.cpp
deleted file mode 100644
index da4df24c9..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/MubHandler.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-// MubHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#define Get32(p) GetBe32(p)
-
-namespace NArchive {
-namespace NMub {
-
-struct CItem
-{
- UInt32 Type;
- UInt32 SubType;
- UInt64 Offset;
- UInt64 Size;
- UInt32 Align;
- bool IsTail;
-};
-
-const UInt32 kNumFilesMax = 10;
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- UInt64 _startPos;
- CMyComPtr<IInStream> _stream;
- UInt32 _numItems;
- CItem _items[kNumFilesMax + 1];
- HRESULT Open2(IInStream *stream);
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-#define MACH_ARCH_ABI64 0x1000000
-#define MACH_MACHINE_386 7
-#define MACH_MACHINE_ARM 12
-#define MACH_MACHINE_SPARC 14
-#define MACH_MACHINE_PPC 18
-
-#define MACH_MACHINE_PPC64 (MACH_MACHINE_PPC | MACH_ARCH_ABI64)
-#define MACH_MACHINE_AMD64 (MACH_MACHINE_386 | MACH_ARCH_ABI64)
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _items[index];
- switch(propID)
- {
- case kpidExtension:
- {
- const wchar_t *ext;
- if (item.IsTail)
- ext = L"tail";
- else
- {
- switch(item.Type)
- {
- case MACH_MACHINE_386: ext = L"86"; break;
- case MACH_MACHINE_ARM: ext = L"arm"; break;
- case MACH_MACHINE_SPARC: ext = L"sparc"; break;
- case MACH_MACHINE_PPC: ext = L"ppc"; break;
- case MACH_MACHINE_PPC64: ext = L"ppc64"; break;
- case MACH_MACHINE_AMD64: ext = L"x64"; break;
- default: ext = L"unknown"; break;
- }
- }
- prop = ext;
- break;
- }
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)item.Size;
- break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-#define MACH_TYPE_ABI64 (1 << 24)
-#define MACH_SUBTYPE_ABI64 (1 << 31)
-
-HRESULT CHandler::Open2(IInStream *stream)
-{
- RINOK(stream->Seek(0, STREAM_SEEK_SET, &_startPos));
-
- const UInt32 kHeaderSize = 8;
- const UInt32 kRecordSize = 5 * 4;
- const UInt32 kBufSize = kHeaderSize + kNumFilesMax * kRecordSize;
- Byte buf[kBufSize];
- size_t processed = kBufSize;
- RINOK(ReadStream(stream, buf, &processed));
- if (processed < kHeaderSize)
- return S_FALSE;
- UInt32 num = Get32(buf + 4);
- if (Get32(buf) != 0xCAFEBABE || num > kNumFilesMax || processed < kHeaderSize + num * kRecordSize)
- return S_FALSE;
- UInt64 endPosMax = kHeaderSize;
- for (UInt32 i = 0; i < num; i++)
- {
- const Byte *p = buf + kHeaderSize + i * kRecordSize;
- CItem &sb = _items[i];
- sb.IsTail = false;
- sb.Type = Get32(p);
- sb.SubType = Get32(p + 4);
- sb.Offset = Get32(p + 8);
- sb.Size = Get32(p + 12);
- sb.Align = Get32(p + 16);
-
- if ((sb.Type & ~MACH_TYPE_ABI64) >= 0x100 ||
- (sb.SubType & ~MACH_SUBTYPE_ABI64) >= 0x100 ||
- sb.Align > 31)
- return S_FALSE;
-
- UInt64 endPos = (UInt64)sb.Offset + sb.Size;
- if (endPos > endPosMax)
- endPosMax = endPos;
- }
- UInt64 fileSize;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize));
- fileSize -= _startPos;
- _numItems = num;
- if (fileSize > endPosMax)
- {
- CItem &sb = _items[_numItems++];
- sb.IsTail = true;
- sb.Type = 0;
- sb.SubType = 0;
- sb.Offset = endPosMax;
- sb.Size = fileSize - endPosMax;
- sb.Align = 0;
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- try
- {
- if (Open2(inStream) != S_OK)
- return S_FALSE;
- _stream = inStream;
- }
- catch(...) { return S_FALSE; }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _numItems = 0;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _numItems;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _numItems;
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items[allFilesMode ? i : indices[i]].Size;
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- currentTotalSize += item.Size;
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (testMode)
- {
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- RINOK(_stream->Seek(_startPos + item.Offset, STREAM_SEEK_SET, NULL));
- streamSpec->Init(item.Size);
- RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult((copyCoderSpec->TotalSize == item.Size) ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItem &item = _items[index];
- return CreateLimitedInStream(_stream, _startPos + item.Offset, item.Size, stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Mub", L"", 0, 0xE2, { 0xCA, 0xFE, 0xBA, 0xBE, 0, 0, 0 }, 7, false, CreateArc, 0 };
-
-REGISTER_ARC(Mub)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.cpp
deleted file mode 100644
index 0845f965d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-// NsisDecode.cpp
-
-#include "StdAfx.h"
-
-#include "NsisDecode.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "../../Common/MethodId.h"
-
-#include "../../Compress/BZip2Decoder.h"
-#include "../../Compress/DeflateDecoder.h"
-#include "../../Compress/LzmaDecoder.h"
-
-namespace NArchive {
-namespace NNsis {
-
-static const CMethodId k_BCJ_X86 = 0x03030103;
-
-HRESULT CDecoder::Init(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream, NMethodType::EEnum method, bool thereIsFilterFlag, bool &useFilter)
-{
- useFilter = false;
- CObjectVector< CMyComPtr<ISequentialInStream> > inStreams;
-
- if (_decoderInStream)
- if (method != _method)
- Release();
- _method = method;
- if (!_codecInStream)
- {
- switch (method)
- {
- // case NMethodType::kCopy: return E_NOTIMPL;
- case NMethodType::kDeflate: _codecInStream = new NCompress::NDeflate::NDecoder::CNsisCOMCoder(); break;
- case NMethodType::kBZip2: _codecInStream = new NCompress::NBZip2::CNsisDecoder(); break;
- case NMethodType::kLZMA: _codecInStream = new NCompress::NLzma::CDecoder(); break;
- default: return E_NOTIMPL;
- }
- }
-
- if (thereIsFilterFlag)
- {
- UInt32 processedSize;
- BYTE flag;
- RINOK(inStream->Read(&flag, 1, &processedSize));
- if (processedSize != 1)
- return E_FAIL;
- if (flag > 1)
- return E_NOTIMPL;
- useFilter = (flag != 0);
- }
-
- if (useFilter)
- {
- if (!_filterInStream)
- {
- CMyComPtr<ICompressCoder> coder;
- RINOK(CreateCoder(
- EXTERNAL_CODECS_LOC_VARS
- k_BCJ_X86, coder, false));
- if (!coder)
- return E_NOTIMPL;
- coder.QueryInterface(IID_ISequentialInStream, &_filterInStream);
- if (!_filterInStream)
- return E_NOTIMPL;
- }
- CMyComPtr<ICompressSetInStream> setInStream;
- _filterInStream.QueryInterface(IID_ICompressSetInStream, &setInStream);
- if (!setInStream)
- return E_NOTIMPL;
- RINOK(setInStream->SetInStream(_codecInStream));
- _decoderInStream = _filterInStream;
- }
- else
- _decoderInStream = _codecInStream;
-
- if (method == NMethodType::kLZMA)
- {
- CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;
- _codecInStream.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties);
- if (setDecoderProperties)
- {
- static const UInt32 kPropertiesSize = 5;
- BYTE properties[kPropertiesSize];
- UInt32 processedSize;
- RINOK(inStream->Read(properties, kPropertiesSize, &processedSize));
- if (processedSize != kPropertiesSize)
- return E_FAIL;
- RINOK(setDecoderProperties->SetDecoderProperties2((const Byte *)properties, kPropertiesSize));
- }
- }
-
- {
- CMyComPtr<ICompressSetInStream> setInStream;
- _codecInStream.QueryInterface(IID_ICompressSetInStream, &setInStream);
- if (!setInStream)
- return E_NOTIMPL;
- RINOK(setInStream->SetInStream(inStream));
- }
-
- {
- CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;
- _codecInStream.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize);
- if (!setOutStreamSize)
- return E_NOTIMPL;
- RINOK(setOutStreamSize->SetOutStreamSize(NULL));
- }
-
- if (useFilter)
- {
- /*
- CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize;
- _filterInStream.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize);
- if (!setOutStreamSize)
- return E_NOTIMPL;
- RINOK(setOutStreamSize->SetOutStreamSize(NULL));
- */
- }
-
- return S_OK;
-}
-
-HRESULT CDecoder::Read(void *data, size_t *processedSize)
-{
- return ReadStream(_decoderInStream, data, processedSize);;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.h b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.h
deleted file mode 100644
index 36aeb2b14..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// NsisDecode.h
-
-#ifndef __NSIS_DECODE_H
-#define __NSIS_DECODE_H
-
-#include "../../IStream.h"
-
-#include "../../Common/CreateCoder.h"
-
-namespace NArchive {
-namespace NNsis {
-
-namespace NMethodType
-{
- enum EEnum
- {
- kCopy,
- kDeflate,
- kBZip2,
- kLZMA
- };
-}
-
-class CDecoder
-{
- NMethodType::EEnum _method;
-
- CMyComPtr<ISequentialInStream> _filterInStream;
- CMyComPtr<ISequentialInStream> _codecInStream;
- CMyComPtr<ISequentialInStream> _decoderInStream;
-
-public:
- void Release()
- {
- _filterInStream.Release();
- _codecInStream.Release();
- _decoderInStream.Release();
- }
- HRESULT Init(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream, NMethodType::EEnum method, bool thereIsFilterFlag, bool &useFilter);
- HRESULT Read(void *data, size_t *processedSize);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.cpp
deleted file mode 100644
index 4058bd2af..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.cpp
+++ /dev/null
@@ -1,510 +0,0 @@
-// NSisHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "../Common/ItemNameUtils.h"
-
-#include "NsisHandler.h"
-
-#define Get32(p) GetUi32(p)
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NNsis {
-
-static const char *kBcjMethod = "BCJ";
-static const char *kUnknownMethod = "Unknown";
-
-static const char *kMethods[] =
-{
- "Copy",
- "Deflate",
- "BZip2",
- "LZMA"
-};
-
-static const int kNumMethods = sizeof(kMethods) / sizeof(kMethods[0]);
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidSolid, VT_BOOL}
-};
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidSolid, VT_BOOL}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMethod:
- {
- UInt32 dict = 1;
- bool filter = false;
- for (int i = 0; i < _archive.Items.Size(); i++)
- {
- const CItem &item = _archive.Items[i];
- filter |= item.UseFilter;
- if (item.DictionarySize > dict)
- dict = item.DictionarySize;
- }
- prop = GetMethod(filter, dict);
- break;
- }
- case kpidSolid: prop = _archive.IsSolid; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 * maxCheckStartPosition, IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- Close();
- {
- if (_archive.Open(
- EXTERNAL_CODECS_VARS
- stream, maxCheckStartPosition) != S_OK)
- return S_FALSE;
- _inStream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _archive.Clear();
- _archive.Release();
- _inStream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _archive.Items.Size()
- #ifdef NSIS_SCRIPT
- + 1
- #endif
- ;
- return S_OK;
-}
-
-static AString UInt32ToString(UInt32 value)
-{
- char buffer[16];
- ConvertUInt32ToString(value, buffer);
- return buffer;
-}
-
-static AString GetStringForSizeValue(UInt32 value)
-{
- for (int i = 31; i >= 0; i--)
- if (((UInt32)1 << i) == value)
- return UInt32ToString(i);
- char c = 'b';
- if (value % (1 << 20) == 0)
- {
- value >>= 20;
- c = 'm';
- }
- else if (value % (1 << 10) == 0)
- {
- value >>= 10;
- c = 'k';
- }
- return UInt32ToString(value) + c;
-}
-
-AString CHandler::GetMethod(bool useItemFilter, UInt32 dictionary) const
-{
- NMethodType::EEnum methodIndex = _archive.Method;
- AString method;
- if (_archive.IsSolid && _archive.UseFilter || !_archive.IsSolid && useItemFilter)
- {
- method += kBcjMethod;
- method += ' ';
- }
- method += (methodIndex < kNumMethods) ? kMethods[methodIndex] : kUnknownMethod;
- if (methodIndex == NMethodType::kLZMA)
- {
- method += ':';
- method += GetStringForSizeValue(_archive.IsSolid ? _archive.DictionarySize: dictionary);
- }
- return method;
-}
-
-bool CHandler::GetUncompressedSize(int index, UInt32 &size)
-{
- size = 0;
- const CItem &item = _archive.Items[index];
- if (item.SizeIsDefined)
- size = item.Size;
- else if (_archive.IsSolid && item.EstimatedSizeIsDefined)
- size = item.EstimatedSize;
- else
- return false;
- return true;
-}
-
-bool CHandler::GetCompressedSize(int index, UInt32 &size)
-{
- size = 0;
- const CItem &item = _archive.Items[index];
- if (item.CompressedSizeIsDefined)
- size = item.CompressedSize;
- else
- {
- if (_archive.IsSolid)
- {
- if (index == 0)
- size = _archive.FirstHeader.GetDataSize();
- else
- return false;
- }
- else
- {
- if (!item.IsCompressed)
- size = item.Size;
- else
- return false;
- }
- }
- return true;
-}
-
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- #ifdef NSIS_SCRIPT
- if (index >= (UInt32)_archive.Items.Size())
- {
- switch(propID)
- {
- case kpidPath: prop = L"[NSIS].nsi"; break;
- case kpidSize:
- case kpidPackSize: prop = (UInt64)_archive.Script.Length(); break;
- case kpidSolid: prop = false; break;
- }
- }
- else
- #endif
- {
- const CItem &item = _archive.Items[index];
- switch(propID)
- {
- case kpidPath:
- {
- UString s = NItemName::WinNameToOSName(item.GetReducedName(_archive.IsUnicode));
- if (!s.IsEmpty())
- prop = (const wchar_t *)s;
- break;
- }
- case kpidSize:
- {
- UInt32 size;
- if (GetUncompressedSize(index, size))
- prop = (UInt64)size;
- break;
- }
- case kpidPackSize:
- {
- UInt32 size;
- if (GetCompressedSize(index, size))
- prop = (UInt64)size;
- break;
- }
- case kpidMTime:
- {
- if (item.MTime.dwHighDateTime > 0x01000000 &&
- item.MTime.dwHighDateTime < 0xFF000000)
- prop = item.MTime;
- break;
- }
- case kpidMethod: prop = GetMethod(item.UseFilter, item.DictionarySize); break;
- case kpidSolid: prop = _archive.IsSolid; break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- GetNumberOfItems(&numItems);
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
-
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- UInt32 index = (allFilesMode ? i : indices[i]);
- #ifdef NSIS_SCRIPT
- if (index >= (UInt32)_archive.Items.Size())
- totalSize += _archive.Script.Length();
- else
- #endif
- {
- UInt32 size;
- if (_archive.IsSolid)
- {
- GetUncompressedSize(index, size);
- UInt64 pos = _archive.GetPosOfSolidItem(index);
- if (pos > totalSize)
- totalSize = pos + size;
- }
- else
- {
- GetCompressedSize(index, size);
- totalSize += size;
- }
- }
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
- UInt32 currentItemSize = 0;
-
- UInt64 streamPos = 0;
- if (_archive.IsSolid)
- {
- RINOK(_inStream->Seek(_archive.StreamOffset, STREAM_SEEK_SET, NULL));
- bool useFilter;
- RINOK(_archive.Decoder.Init(
- EXTERNAL_CODECS_VARS
- _inStream, _archive.Method, _archive.FilterFlag, useFilter));
- }
-
- CByteBuffer byteBuf;
- const UInt32 kBufferLength = 1 << 16;
- byteBuf.SetCapacity(kBufferLength);
- Byte *buffer = byteBuf;
-
- CByteBuffer tempBuf;
-
- bool dataError = false;
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- currentItemSize = 0;
- RINOK(extractCallback->SetCompleted(&currentTotalSize));
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- #ifdef NSIS_SCRIPT
- if (index >= (UInt32)_archive.Items.Size())
- {
- currentItemSize = _archive.Script.Length();
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- if (!testMode)
- RINOK(WriteStream(realOutStream, (const char *)_archive.Script, (UInt32)_archive.Script.Length()));
- }
- else
- #endif
- {
- const CItem &item = _archive.Items[index];
-
- if (_archive.IsSolid)
- GetUncompressedSize(index, currentItemSize);
- else
- GetCompressedSize(index, currentItemSize);
-
- if (!testMode && !realOutStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
-
- if (!dataError)
- {
- bool needDecompress = false;
- bool sizeIsKnown = false;
- UInt32 fullSize = 0;
-
- bool writeToTemp = false;
- bool readFromTemp = false;
-
- if (_archive.IsSolid)
- {
- UInt64 pos = _archive.GetPosOfSolidItem(index);
- while (streamPos < pos)
- {
- size_t processedSize = (UInt32)MyMin(pos - streamPos, (UInt64)kBufferLength);
- HRESULT res = _archive.Decoder.Read(buffer, &processedSize);
- if (res != S_OK)
- {
- if (res != S_FALSE)
- return res;
- dataError = true;
- break;
- }
- if (processedSize == 0)
- {
- dataError = true;
- break;
- }
- streamPos += processedSize;
- }
- if (streamPos == pos)
- {
- Byte buffer2[4];
- size_t processedSize = 4;
- RINOK(_archive.Decoder.Read(buffer2, &processedSize));
- if (processedSize != 4)
- return E_FAIL;
- streamPos += processedSize;
- fullSize = Get32(buffer2);
- sizeIsKnown = true;
- needDecompress = true;
-
- if (!testMode && i + 1 < numItems)
- {
- UInt64 nextPos = _archive.GetPosOfSolidItem(allFilesMode ? i : indices[i + 1]);
- if (nextPos < streamPos + fullSize)
- {
- tempBuf.Free();
- tempBuf.SetCapacity(fullSize);
- writeToTemp = true;
- }
- }
- }
- else
- readFromTemp = true;
- }
- else
- {
- RINOK(_inStream->Seek(_archive.GetPosOfNonSolidItem(index) + 4, STREAM_SEEK_SET, NULL));
- if (item.IsCompressed)
- {
- needDecompress = true;
- bool useFilter;
- RINOK(_archive.Decoder.Init(
- EXTERNAL_CODECS_VARS
- _inStream, _archive.Method, _archive.FilterFlag, useFilter));
- // fullSize = Get32(buffer); // It's bug !!!
- // Test it: what is exact fullSize?
- fullSize = 0xFFFFFFFF;
- }
- else
- fullSize = item.Size;
- }
- if (!dataError)
- {
- if (needDecompress)
- {
- UInt64 offset = 0;
- while (!sizeIsKnown || fullSize > 0)
- {
- UInt32 curSize = kBufferLength;
- if (sizeIsKnown && curSize > fullSize)
- curSize = fullSize;
- size_t processedSize = curSize;
- HRESULT res = _archive.Decoder.Read(buffer, &processedSize);
- if (res != S_OK)
- {
- if (res != S_FALSE)
- return res;
- dataError = true;
- break;
- }
- if (processedSize == 0)
- {
- if (sizeIsKnown)
- dataError = true;
- break;
- }
-
- if (writeToTemp)
- memcpy((Byte *)tempBuf + (size_t)offset, buffer, processedSize);
-
- fullSize -= (UInt32)processedSize;
- streamPos += processedSize;
- offset += processedSize;
-
- UInt64 completed;
- if (_archive.IsSolid)
- completed = currentTotalSize + offset;
- else
- completed = streamPos;
- RINOK(extractCallback->SetCompleted(&completed));
- if (!testMode)
- RINOK(WriteStream(realOutStream, buffer, processedSize));
- }
- }
- else
- {
- if (readFromTemp)
- {
- if (!testMode)
- RINOK(WriteStream(realOutStream, tempBuf, tempBuf.GetCapacity()));
- }
- else
- while (fullSize > 0)
- {
- UInt32 curSize = MyMin(fullSize, kBufferLength);
- UInt32 processedSize;
- RINOK(_inStream->Read(buffer, curSize, &processedSize));
- if (processedSize == 0)
- {
- dataError = true;
- break;
- }
- fullSize -= processedSize;
- streamPos += processedSize;
- if (!testMode)
- RINOK(WriteStream(realOutStream, buffer, processedSize));
- }
- }
- }
- }
- }
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(dataError ?
- NExtract::NOperationResult::kDataError :
- NExtract::NOperationResult::kOK));
- }
- return S_OK;
- COM_TRY_END
-}
-
-IMPL_ISetCompressCodecsInfo
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.h
deleted file mode 100644
index 6de493df8..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// NSisHandler.h
-
-#ifndef __NSIS_HANDLER_H
-#define __NSIS_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-
-#include "NsisIn.h"
-
-#include "../../Common/CreateCoder.h"
-
-namespace NArchive {
-namespace NNsis {
-
-class CHandler:
- public IInArchive,
- PUBLIC_ISetCompressCodecsInfo
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _inStream;
- CInArchive _archive;
-
- DECL_EXTERNAL_CODECS_VARS
-
- bool GetUncompressedSize(int index, UInt32 &size);
- bool GetCompressedSize(int index, UInt32 &size);
-
- AString GetMethod(bool useItemFilter, UInt32 dictionary) const;
-public:
- MY_QUERYINTERFACE_BEGIN2(IInArchive)
- QUERY_ENTRY_ISetCompressCodecsInfo
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- INTERFACE_IInArchive(;)
-
- DECL_ISetCompressCodecsInfo
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.cpp
deleted file mode 100644
index 407560085..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.cpp
+++ /dev/null
@@ -1,1461 +0,0 @@
-// NsisIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/IntToString.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "NsisIn.h"
-
-#define Get32(p) GetUi32(p)
-
-namespace NArchive {
-namespace NNsis {
-
-Byte kSignature[kSignatureSize] = NSIS_SIGNATURE;
-
-#ifdef NSIS_SCRIPT
-static const char *kCrLf = "\x0D\x0A";
-#endif
-
-#define NS_UN_SKIP_CODE 0xE000
-#define NS_UN_VAR_CODE 0xE001
-#define NS_UN_SHELL_CODE 0xE002
-#define NS_UN_LANG_CODE 0xE003
-#define NS_UN_CODES_START NS_UN_SKIP_CODE
-#define NS_UN_CODES_END NS_UN_LANG_CODE
-
-Byte CInArchive::ReadByte()
-{
- if (_posInData >= _size)
- throw 1;
- return _data[_posInData++];
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- value |= ((UInt32)(ReadByte()) << (8 * i));
- return value;
-}
-
-void CInArchive::ReadBlockHeader(CBlockHeader &bh)
-{
- bh.Offset = ReadUInt32();
- bh.Num = ReadUInt32();
-}
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareItems(void *const *p1, void *const *p2, void * /* param */)
-{
- const CItem &i1 = **(CItem **)p1;
- const CItem &i2 = **(CItem **)p2;
- RINOZ(MyCompare(i1.Pos, i2.Pos));
- if (i1.IsUnicode)
- {
- RINOZ(i1.PrefixU.Compare(i2.PrefixU));
- RINOZ(i1.NameU.Compare(i2.NameU));
- }
- else
- {
- RINOZ(i1.PrefixA.Compare(i2.PrefixA));
- RINOZ(i1.NameA.Compare(i2.NameA));
- }
- return 0;
-}
-
-static AString UIntToString(UInt32 v)
-{
- char sz[32];
- ConvertUInt64ToString(v, sz);
- return sz;
-}
-
-static AString IntToString(Int32 v)
-{
- char sz[32];
- ConvertInt64ToString(v, sz);
- return sz;
-}
-
-AString CInArchive::ReadStringA(UInt32 pos) const
-{
- AString s;
- if (pos >= _size)
- return IntToString((Int32)pos);
- UInt32 offset = GetOffset() + _stringsPos + pos;
- for (;;)
- {
- if (offset >= _size)
- break; // throw 1;
- char c = _data[offset++];
- if (c == 0)
- break;
- s += c;
- }
- return s;
-}
-
-UString CInArchive::ReadStringU(UInt32 pos) const
-{
- UString s;
- UInt32 offset = GetOffset() + _stringsPos + (pos * 2);
- for (;;)
- {
- if (offset >= _size || offset + 1 >= _size)
- return s; // throw 1;
- char c0 = _data[offset++];
- char c1 = _data[offset++];
- wchar_t c = (c0 | ((wchar_t)c1 << 8));
- if (c == 0)
- break;
- s += c;
- }
- return s;
-}
-
-/*
-static AString ParsePrefix(const AString &prefix)
-{
- AString res = prefix;
- if (prefix.Length() >= 3)
- {
- if ((Byte)prefix[0] == 0xFD && (Byte)prefix[1] == 0x95 && (Byte)prefix[2] == 0x80)
- res = "$INSTDIR" + prefix.Mid(3);
- else if ((Byte)prefix[0] == 0xFD && (Byte)prefix[1] == 0x96 && (Byte)prefix[2] == 0x80)
- res = "$OUTDIR" + prefix.Mid(3);
- }
- return res;
-}
-*/
-
-#define SYSREGKEY "Software\\Microsoft\\Windows\\CurrentVersion"
-
-/*
-# define CSIDL_PROGRAMS 0x2
-# define CSIDL_PRINTERS 0x4
-# define CSIDL_PERSONAL 0x5
-# define CSIDL_FAVORITES 0x6
-# define CSIDL_STARTUP 0x7
-# define CSIDL_RECENT 0x8
-# define CSIDL_SENDTO 0x9
-# define CSIDL_STARTMENU 0xB
-# define CSIDL_MYMUSIC 0xD
-# define CSIDL_MYVIDEO 0xE
-
-# define CSIDL_DESKTOPDIRECTORY 0x10
-# define CSIDL_NETHOOD 0x13
-# define CSIDL_FONTS 0x14
-# define CSIDL_TEMPLATES 0x15
-# define CSIDL_COMMON_STARTMENU 0x16
-# define CSIDL_COMMON_PROGRAMS 0x17
-# define CSIDL_COMMON_STARTUP 0x18
-# define CSIDL_COMMON_DESKTOPDIRECTORY 0x19
-# define CSIDL_APPDATA 0x1A
-# define CSIDL_PRINTHOOD 0x1B
-# define CSIDL_LOCAL_APPDATA 0x1C
-# define CSIDL_ALTSTARTUP 0x1D
-# define CSIDL_COMMON_ALTSTARTUP 0x1E
-# define CSIDL_COMMON_FAVORITES 0x1F
-
-# define CSIDL_INTERNET_CACHE 0x20
-# define CSIDL_COOKIES 0x21
-# define CSIDL_HISTORY 0x22
-# define CSIDL_COMMON_APPDATA 0x23
-# define CSIDL_WINDOWS 0x24
-# define CSIDL_SYSTEM 0x25
-# define CSIDL_PROGRAM_FILES 0x26
-# define CSIDL_MYPICTURES 0x27
-# define CSIDL_PROFILE 0x28
-# define CSIDL_PROGRAM_FILES_COMMON 0x2B
-# define CSIDL_COMMON_TEMPLATES 0x2D
-# define CSIDL_COMMON_DOCUMENTS 0x2E
-# define CSIDL_COMMON_ADMINTOOLS 0x2F
-
-# define CSIDL_ADMINTOOLS 0x30
-# define CSIDL_COMMON_MUSIC 0x35
-# define CSIDL_COMMON_PICTURES 0x36
-# define CSIDL_COMMON_VIDEO 0x37
-# define CSIDL_RESOURCES 0x38
-# define CSIDL_RESOURCES_LOCALIZED 0x39
-# define CSIDL_CDBURN_AREA 0x3B
-*/
-
-struct CCommandPair
-{
- int NumParams;
- const char *Name;
-};
-
-enum
-{
- // 0
- EW_INVALID_OPCODE, // zero is invalid. useful for catching errors. (otherwise an all zeroes instruction
- // does nothing, which is easily ignored but means something is wrong.
- EW_RET, // return from function call
- EW_NOP, // Nop/Jump, do nothing: 1, [?new address+1:advance one]
- EW_ABORT, // Abort: 1 [status]
- EW_QUIT, // Quit: 0
- EW_CALL, // Call: 1 [new address+1]
- EW_UPDATETEXT, // Update status text: 2 [update str, ui_st_updateflag=?ui_st_updateflag:this]
- EW_SLEEP, // Sleep: 1 [sleep time in milliseconds]
- EW_BRINGTOFRONT, // BringToFront: 0
- EW_CHDETAILSVIEW, // SetDetailsView: 2 [listaction,buttonaction]
-
- // 10
- EW_SETFILEATTRIBUTES, // SetFileAttributes: 2 [filename, attributes]
- EW_CREATEDIR, // Create directory: 2, [path, ?update$INSTDIR]
- EW_IFFILEEXISTS, // IfFileExists: 3, [file name, jump amount if exists, jump amount if not exists]
- EW_SETFLAG, // Sets a flag: 2 [id, data]
- EW_IFFLAG, // If a flag: 4 [on, off, id, new value mask]
- EW_GETFLAG, // Gets a flag: 2 [output, id]
- EW_RENAME, // Rename: 3 [old, new, rebootok]
- EW_GETFULLPATHNAME, // GetFullPathName: 2 [output, input, ?lfn:sfn]
- EW_SEARCHPATH, // SearchPath: 2 [output, filename]
- EW_GETTEMPFILENAME, // GetTempFileName: 2 [output, base_dir]
-
- // 20
- EW_EXTRACTFILE, // File to extract: 6 [overwriteflag, output filename, compressed filedata, filedatetimelow, filedatetimehigh, allow ignore]
- // overwriteflag: 0x1 = no. 0x0=force, 0x2=try, 0x3=if date is newer
- EW_DELETEFILE, // Delete File: 2, [filename, rebootok]
- EW_MESSAGEBOX, // MessageBox: 5,[MB_flags,text,retv1:retv2,moveonretv1:moveonretv2]
- EW_RMDIR, // RMDir: 2 [path, recursiveflag]
- EW_STRLEN, // StrLen: 2 [output, input]
- EW_ASSIGNVAR, // Assign: 4 [variable (0-9) to assign, string to assign, maxlen, startpos]
- EW_STRCMP, // StrCmp: 5 [str1, str2, jump_if_equal, jump_if_not_equal, case-sensitive?]
- EW_READENVSTR, // ReadEnvStr/ExpandEnvStrings: 3 [output, string_with_env_variables, IsRead]
- EW_INTCMP, // IntCmp: 6 [val1, val2, equal, val1<val2, val1>val2, unsigned?]
- EW_INTOP, // IntOp: 4 [output, input1, input2, op] where op: 0=add, 1=sub, 2=mul, 3=div, 4=bor, 5=band, 6=bxor, 7=bnot input1, 8=lnot input1, 9=lor, 10=land], 11=1%2
-
- // 30
- EW_INTFMT, // IntFmt: [output, format, input]
- EW_PUSHPOP, // Push/Pop/Exchange: 3 [variable/string, ?pop:push, ?exch]
- EW_FINDWINDOW, // FindWindow: 5, [outputvar, window class,window name, window_parent, window_after]
- EW_SENDMESSAGE, // SendMessage: 6 [output, hwnd, msg, wparam, lparam, [wparamstring?1:0 | lparamstring?2:0 | timeout<<2]
- EW_ISWINDOW, // IsWindow: 3 [hwnd, jump_if_window, jump_if_notwindow]
- EW_GETDLGITEM, // GetDlgItem: 3: [outputvar, dialog, item_id]
- EW_SETCTLCOLORS, // SerCtlColors: 3: [hwnd, pointer to struct colors]
- EW_SETBRANDINGIMAGE, // SetBrandingImage: 1: [Bitmap file]
- EW_CREATEFONT, // CreateFont: 5: [handle output, face name, height, weight, flags]
- EW_SHOWWINDOW, // ShowWindow: 2: [hwnd, show state]
-
- // 40
- EW_SHELLEXEC, // ShellExecute program: 4, [shell action, complete commandline, parameters, showwindow]
- EW_EXECUTE, // Execute program: 3,[complete command line,waitflag,>=0?output errorcode]
- EW_GETFILETIME, // GetFileTime; 3 [file highout lowout]
- EW_GETDLLVERSION, // GetDLLVersion: 3 [file highout lowout]
- EW_REGISTERDLL, // Register DLL: 3,[DLL file name, string ptr of function to call, text to put in display (<0 if none/pass parms), 1 - no unload, 0 - unload]
- EW_CREATESHORTCUT, // Make Shortcut: 5, [link file, target file, parameters, icon file, iconindex|show mode<<8|hotkey<<16]
- EW_COPYFILES, // CopyFiles: 3 [source mask, destination location, flags]
- EW_REBOOT, // Reboot: 0
- EW_WRITEINI, // Write INI String: 4, [Section, Name, Value, INI File]
- EW_READINISTR, // ReadINIStr: 4 [output, section, name, ini_file]
-
- // 50
- EW_DELREG, // DeleteRegValue/DeleteRegKey: 4, [root key(int), KeyName, ValueName, delkeyonlyifempty]. ValueName is -1 if delete key
- EW_WRITEREG, // Write Registry value: 5, [RootKey(int),KeyName,ItemName,ItemData,typelen]
- // typelen=1 for str, 2 for dword, 3 for binary, 0 for expanded str
- EW_READREGSTR, // ReadRegStr: 5 [output, rootkey(int), keyname, itemname, ==1?int::str]
- EW_REGENUM, // RegEnum: 5 [output, rootkey, keyname, index, ?key:value]
- EW_FCLOSE, // FileClose: 1 [handle]
- EW_FOPEN, // FileOpen: 4 [name, openmode, createmode, outputhandle]
- EW_FPUTS, // FileWrite: 3 [handle, string, ?int:string]
- EW_FGETS, // FileRead: 4 [handle, output, maxlen, ?getchar:gets]
- EW_FSEEK, // FileSeek: 4 [handle, offset, mode, >=0?positionoutput]
- EW_FINDCLOSE, // FindClose: 1 [handle]
-
- // 60
- EW_FINDNEXT, // FindNext: 2 [output, handle]
- EW_FINDFIRST, // FindFirst: 2 [filespec, output, handleoutput]
- EW_WRITEUNINSTALLER, // WriteUninstaller: 3 [name, offset, icon_size]
- EW_LOG, // LogText: 2 [0, text] / LogSet: [1, logstate]
- EW_SECTIONSET, // SectionSetText: 3: [idx, 0, text]
- // SectionGetText: 3: [idx, 1, output]
- // SectionSetFlags: 3: [idx, 2, flags]
- // SectionGetFlags: 3: [idx, 3, output]
- EW_INSTTYPESET, // InstTypeSetFlags: 3: [idx, 0, flags]
- // InstTypeGetFlags: 3: [idx, 1, output]
- // instructions not actually implemented in exehead, but used in compiler.
- EW_GETLABELADDR, // both of these get converted to EW_ASSIGNVAR
- EW_GETFUNCTIONADDR,
-
- EW_LOCKWINDOW
-};
-
-#ifdef NSIS_SCRIPT
-static CCommandPair kCommandPairs[] =
-{
- { 0, "Invalid" },
- { 0, "Return" },
- { 1, "Goto" },
- { 0, "Abort" },
- { 0, "Quit" },
- { 1, "Call" },
- { 2, "UpdateSatusText" },
- { 1, "Sleep" },
- { 0, "BringToFront" },
- { 2, "SetDetailsView" },
-
- { 2, "SetFileAttributes" },
- { 2, "SetOutPath" },
- { 3, "IfFileExists" },
- { 2, "SetFlag" },
- { 4, "IfFlag" },
- { 2, "GetFlag" },
- { 3, "Rename" },
- { 2, "GetFullPathName" },
- { 2, "SearchPath" },
- { 2, "GetTempFileName" },
-
- { 6, "File" },
- { 2, "Delete" },
- { 5, "MessageBox" },
- { 2, "RMDir" },
- { 2, "StrLen" },
- { 4, "StrCpy" },
- { 5, "StrCmp" },
- { 3, "ReadEnvStr" },
- { 6, "IntCmp" },
- { 4, "IntOp" },
-
- { 3, "IntFmt" },
- { 3, "PushPop" },
- { 5, "FindWindow" },
- { 6, "SendMessage" },
- { 3, "IsWindow" },
- { 3, "GetDlgItem" },
- { 3, "SerCtlColors" },
- { 1, "SetBrandingImage" },
- { 5, "CreateFont" },
- { 2, "ShowWindow" },
-
- { 4, "ShellExecute" },
- { 3, "Execute" },
- { 3, "GetFileTime" },
- { 3, "GetDLLVersion" },
- { 3, "RegisterDLL" },
- { 5, "CreateShortCut" },
- { 3, "CopyFiles" },
- { 0, "Reboot" },
- { 4, "WriteINIStr" },
- { 4, "ReadINIStr" },
-
- { 4, "DelReg" },
- { 5, "WriteReg" },
- { 5, "ReadRegStr" },
- { 5, "RegEnum" },
- { 1, "FileClose" },
- { 4, "FileOpen" },
- { 3, "FileWrite" },
- { 4, "FileRead" },
- { 4, "FileSeek" },
- { 1, "FindClose" },
-
- { 2, "FindNext" },
- { 2, "FindFirst" },
- { 3, "WriteUninstaller" },
- { 2, "LogText" },
- { 3, "Section?etText" },
- { 3, "InstType?etFlags" },
- { 6, "GetLabelAddr" },
- { 2, "GetFunctionAddress" },
- { 6, "LockWindow" }
-};
-
-#endif
-
-static const char *kShellStrings[] =
-{
- "",
- "",
-
- "SMPROGRAMS",
- "",
- "PRINTERS",
- "DOCUMENTS",
- "FAVORITES",
- "SMSTARTUP",
- "RECENT",
- "SENDTO",
- "",
- "STARTMENU",
- "",
- "MUSIC",
- "VIDEO",
- "",
-
- "DESKTOP",
- "",
- "",
- "NETHOOD",
- "FONTS",
- "TEMPLATES",
- "COMMONSTARTMENU",
- "COMMONFILES",
- "COMMON_STARTUP",
- "COMMON_DESKTOPDIRECTORY",
- "QUICKLAUNCH",
- "PRINTHOOD",
- "LOCALAPPDATA",
- "ALTSTARTUP",
- "ALTSTARTUP",
- "FAVORITES",
-
- "INTERNET_CACHE",
- "COOKIES",
- "HISTORY",
- "APPDATA",
- "WINDIR",
- "SYSDIR",
- "PROGRAMFILES",
- "PICTURES",
- "PROFILE",
- "",
- "",
- "COMMONFILES",
- "",
- "TEMPLATES",
- "DOCUMENTS",
- "ADMINTOOLS",
-
- "ADMINTOOLS",
- "",
- "",
- "",
- "",
- "MUSIC",
- "PICTURES",
- "VIDEO",
- "RESOURCES",
- "RESOURCES_LOCALIZED",
- "",
- "CDBURN_AREA"
-};
-
-static const int kNumShellStrings = sizeof(kShellStrings) / sizeof(kShellStrings[0]);
-
-/*
-# define CMDLINE 20 // everything before here doesn't have trailing slash removal
-# define INSTDIR 21
-# define OUTDIR 22
-# define EXEDIR 23
-# define LANGUAGE 24
-# define TEMP 25
-# define PLUGINSDIR 26
-# define HWNDPARENT 27
-# define _CLICK 28
-# define _OUTDIR 29
-*/
-
-static const char *kVarStrings[] =
-{
- "CMDLINE",
- "INSTDIR",
- "OUTDIR",
- "EXEDIR",
- "LANGUAGE",
- "TEMP",
- "PLUGINSDIR",
- "EXEPATH", // test it
- "EXEFILE", // test it
- "HWNDPARENT",
- "_CLICK",
- "_OUTDIR"
-};
-
-static const int kNumVarStrings = sizeof(kVarStrings) / sizeof(kVarStrings[0]);
-
-
-static AString GetVar(UInt32 index)
-{
- AString res = "$";
- if (index < 10)
- res += UIntToString(index);
- else if (index < 20)
- {
- res += "R";
- res += UIntToString(index - 10);
- }
- else if (index < 20 + kNumVarStrings)
- res += kVarStrings[index - 20];
- else
- {
- res += "[";
- res += UIntToString(index);
- res += "]";
- }
- return res;
-}
-
-#define NS_SKIP_CODE 252
-#define NS_VAR_CODE 253
-#define NS_SHELL_CODE 254
-#define NS_LANG_CODE 255
-#define NS_CODES_START NS_SKIP_CODE
-
-static AString GetShellString(int index)
-{
- AString res = "$";
- if (index < kNumShellStrings)
- {
- const char *sz = kShellStrings[index];
- if (sz[0] != 0)
- return res + sz;
- }
- res += "SHELL[";
- res += UIntToString(index);
- res += "]";
- return res;
-}
-
-// Based on Dave Laundon's simplified process_string
-AString GetNsisString(const AString &s)
-{
- AString res;
- for (int i = 0; i < s.Length();)
- {
- unsigned char nVarIdx = s[i++];
- if (nVarIdx > NS_CODES_START && i + 2 <= s.Length())
- {
- int nData = s[i++] & 0x7F;
- unsigned char c1 = s[i++];
- nData |= (((int)(c1 & 0x7F)) << 7);
-
- if (nVarIdx == NS_SHELL_CODE)
- res += GetShellString(c1);
- else if (nVarIdx == NS_VAR_CODE)
- res += GetVar(nData);
- else if (nVarIdx == NS_LANG_CODE)
- res += "NS_LANG_CODE";
- }
- else if (nVarIdx == NS_SKIP_CODE)
- {
- if (i < s.Length())
- res += s[i++];
- }
- else // Normal char
- res += (char)nVarIdx;
- }
- return res;
-}
-
-UString GetNsisString(const UString &s)
-{
- UString res;
- for (int i = 0; i < s.Length();)
- {
- wchar_t nVarIdx = s[i++];
- if (nVarIdx > NS_UN_CODES_START && nVarIdx <= NS_UN_CODES_END)
- {
- if (i == s.Length())
- break;
- int nData = s[i++] & 0x7FFF;
-
- if (nVarIdx == NS_UN_SHELL_CODE)
- res += GetUnicodeString(GetShellString(nData >> 8));
- else if (nVarIdx == NS_UN_VAR_CODE)
- res += GetUnicodeString(GetVar(nData));
- else if (nVarIdx == NS_UN_LANG_CODE)
- res += L"NS_LANG_CODE";
- }
- else if (nVarIdx == NS_UN_SKIP_CODE)
- {
- if (i == s.Length())
- break;
- res += s[i++];
- }
- else // Normal char
- res += (char)nVarIdx;
- }
- return res;
-}
-
-AString CInArchive::ReadString2A(UInt32 pos) const
-{
- return GetNsisString(ReadStringA(pos));
-}
-
-UString CInArchive::ReadString2U(UInt32 pos) const
-{
- return GetNsisString(ReadStringU(pos));
-}
-
-AString CInArchive::ReadString2(UInt32 pos) const
-{
- if (IsUnicode)
- return UnicodeStringToMultiByte(ReadString2U(pos));
- else
- return ReadString2A(pos);
-}
-
-AString CInArchive::ReadString2Qw(UInt32 pos) const
-{
- return "\"" + ReadString2(pos) + "\"";
-}
-
-#define DEL_DIR 1
-#define DEL_RECURSE 2
-#define DEL_REBOOT 4
-// #define DEL_SIMPLE 8
-
-static const int kNumEntryParams = 6;
-
-struct CEntry
-{
- UInt32 Which;
- UInt32 Params[kNumEntryParams];
- AString GetParamsString(int numParams);
- CEntry()
- {
- Which = 0;
- for (UInt32 j = 0; j < kNumEntryParams; j++)
- Params[j] = 0;
- }
-};
-
-AString CEntry::GetParamsString(int numParams)
-{
- AString s;
- for (int i = 0; i < numParams; i++)
- {
- s += " ";
- UInt32 v = Params[i];
- if (v > 0xFFF00000)
- s += IntToString((Int32)Params[i]);
- else
- s += UIntToString(Params[i]);
- }
- return s;
-}
-
-#ifdef NSIS_SCRIPT
-
-static AString GetRegRootID(UInt32 val)
-{
- const char *s;
- switch(val)
- {
- case 0: s = "SHCTX"; break;
- case 0x80000000: s = "HKCR"; break;
- case 0x80000001: s = "HKCU"; break;
- case 0x80000002: s = "HKLM"; break;
- case 0x80000003: s = "HKU"; break;
- case 0x80000004: s = "HKPD"; break;
- case 0x80000005: s = "HKCC"; break;
- case 0x80000006: s = "HKDD"; break;
- case 0x80000050: s = "HKPT"; break;
- case 0x80000060: s = "HKPN"; break;
- default:
- return UIntToString(val); break;
- }
- return s;
-}
-
-#endif
-
-HRESULT CInArchive::ReadEntries(const CBlockHeader &bh)
-{
- _posInData = bh.Offset + GetOffset();
- AString prefixA;
- UString prefixU;
- for (UInt32 i = 0; i < bh.Num; i++)
- {
- CEntry e;
- e.Which = ReadUInt32();
- for (UInt32 j = 0; j < kNumEntryParams; j++)
- e.Params[j] = ReadUInt32();
- #ifdef NSIS_SCRIPT
- if (e.Which != EW_PUSHPOP && e.Which < sizeof(kCommandPairs) / sizeof(kCommandPairs[0]))
- {
- const CCommandPair &pair = kCommandPairs[e.Which];
- Script += pair.Name;
- }
- #endif
-
- switch (e.Which)
- {
- case EW_CREATEDIR:
- {
- if (IsUnicode)
- {
- prefixU.Empty();
- prefixU = ReadString2U(e.Params[0]);
- }
- else
- {
- prefixA.Empty();
- prefixA = ReadString2A(e.Params[0]);
- }
- #ifdef NSIS_SCRIPT
- Script += " ";
- if (IsUnicode)
- Script += UnicodeStringToMultiByte(prefixU);
- else
- Script += prefixA;
- #endif
- break;
- }
-
- case EW_EXTRACTFILE:
- {
- CItem item;
- item.IsUnicode = IsUnicode;
- if (IsUnicode)
- {
- item.PrefixU = prefixU;
- item.NameU = ReadString2U(e.Params[1]);
- }
- else
- {
- item.PrefixA = prefixA;
- item.NameA = ReadString2A(e.Params[1]);
- }
- /* UInt32 overwriteFlag = e.Params[0]; */
- item.Pos = e.Params[2];
- item.MTime.dwLowDateTime = e.Params[3];
- item.MTime.dwHighDateTime = e.Params[4];
- /* UInt32 allowIgnore = e.Params[5]; */
- if (Items.Size() > 0)
- {
- /*
- if (item.Pos == Items.Back().Pos)
- continue;
- */
- }
- Items.Add(item);
- #ifdef NSIS_SCRIPT
- Script += " ";
-
- if (IsUnicode)
- Script += UnicodeStringToMultiByte(item.NameU);
- else
- Script += item.NameA;
- #endif
- break;
- }
-
-
- #ifdef NSIS_SCRIPT
- case EW_UPDATETEXT:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += UIntToString(e.Params[1]);
- break;
- }
- case EW_SETFILEATTRIBUTES:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += UIntToString(e.Params[1]);
- break;
- }
- case EW_IFFILEEXISTS:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += UIntToString(e.Params[1]);
- Script += " ";
- Script += UIntToString(e.Params[2]);
- break;
- }
- case EW_RENAME:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
- Script += " ";
- Script += UIntToString(e.Params[2]);
- break;
- }
- case EW_GETFULLPATHNAME:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
- Script += " ";
- Script += UIntToString(e.Params[2]);
- break;
- }
- case EW_SEARCHPATH:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
- break;
- }
- case EW_GETTEMPFILENAME:
- {
- AString s;
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
- break;
- }
-
- case EW_DELETEFILE:
- {
- UInt64 flag = e.Params[1];
- if (flag != 0)
- {
- Script += " ";
- if (flag == DEL_REBOOT)
- Script += "/REBOOTOK";
- else
- Script += UIntToString(e.Params[1]);
- }
- Script += " ";
- Script += ReadString2(e.Params[0]);
- break;
- }
- case EW_RMDIR:
- {
- UInt64 flag = e.Params[1];
- if (flag != 0)
- {
- if ((flag & DEL_REBOOT) != 0)
- Script += " /REBOOTOK";
- if ((flag & DEL_RECURSE) != 0)
- Script += " /r";
- }
- Script += " ";
- Script += ReadString2(e.Params[0]);
- break;
- }
- case EW_STRLEN:
- {
- Script += " ";
- Script += GetVar(e.Params[0]);;
- Script += " ";
- Script += ReadString2Qw(e.Params[1]);
- break;
- }
- case EW_ASSIGNVAR:
- {
- Script += " ";
- Script += GetVar(e.Params[0]);;
- Script += " ";
- Script += ReadString2Qw(e.Params[1]);
- AString maxLen, startOffset;
- if (e.Params[2] != 0)
- maxLen = ReadString2(e.Params[2]);
- if (e.Params[3] != 0)
- startOffset = ReadString2(e.Params[3]);
- if (!maxLen.IsEmpty() || !startOffset.IsEmpty())
- {
- Script += " ";
- if (maxLen.IsEmpty())
- Script += "\"\"";
- else
- Script += maxLen;
- if (!startOffset.IsEmpty())
- {
- Script += " ";
- Script += startOffset;
- }
- }
- break;
- }
- case EW_STRCMP:
- {
- Script += " ";
-
- Script += " ";
- Script += ReadString2Qw(e.Params[0]);
-
- Script += " ";
- Script += ReadString2Qw(e.Params[1]);
-
- for (int j = 2; j < 5; j++)
- {
- Script += " ";
- Script += UIntToString(e.Params[j]);
- }
- break;
- }
- case EW_INTCMP:
- {
- if (e.Params[5] != 0)
- Script += "U";
-
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
-
- for (int i = 2; i < 5; i++)
- {
- Script += " ";
- Script += UIntToString(e.Params[i]);
- }
- break;
- }
- case EW_INTOP:
- {
- Script += " ";
- Script += GetVar(e.Params[0]);
- Script += " ";
- int numOps = 2;
- AString op;
- switch (e.Params[3])
- {
- case 0: op = '+'; break;
- case 1: op = '-'; break;
- case 2: op = '*'; break;
- case 3: op = '/'; break;
- case 4: op = '|'; break;
- case 5: op = '&'; break;
- case 6: op = '^'; break;
- case 7: op = '~'; numOps = 1; break;
- case 8: op = '!'; numOps = 1; break;
- case 9: op = "||"; break;
- case 10: op = "&&"; break;
- case 11: op = '%'; break;
- default: op = UIntToString(e.Params[3]);
- }
- AString p1 = ReadString2(e.Params[1]);
- if (numOps == 1)
- {
- Script += op;
- Script += p1;
- }
- else
- {
- Script += p1;
- Script += " ";
- Script += op;
- Script += " ";
- Script += ReadString2(e.Params[2]);
- }
- break;
- }
-
- case EW_PUSHPOP:
- {
- int isPop = (e.Params[1] != 0);
- if (isPop)
- {
- Script += "Pop";
- Script += " ";
- Script += GetVar(e.Params[0]);;
- }
- else
- {
- int isExch = (e.Params[2] != 0);
- if (isExch)
- {
- Script += "Exch";
- }
- else
- {
- Script += "Push";
- Script += " ";
- Script += ReadString2(e.Params[0]);
- }
- }
- break;
- }
-
- case EW_SENDMESSAGE:
- {
- // SendMessage: 6 [output, hwnd, msg, wparam, lparam, [wparamstring?1:0 | lparamstring?2:0 | timeout<<2]
- Script += " ";
- // Script += ReadString2(e.Params[0]);
- // Script += " ";
- Script += ReadString2(e.Params[1]);
- Script += " ";
- Script += ReadString2(e.Params[2]);
-
- Script += " ";
- UInt32 spec = e.Params[5];
- // if (spec & 1)
- Script += IntToString(e.Params[3]);
- // else
- // Script += ReadString2(e.Params[3]);
-
- Script += " ";
- // if (spec & 2)
- Script += IntToString(e.Params[4]);
- // else
- // Script += ReadString2(e.Params[4]);
-
- if ((Int32)e.Params[0] >= 0)
- {
- Script += " ";
- Script += GetVar(e.Params[1]);
- }
-
- spec >>= 2;
- if (spec != 0)
- {
- Script += " /TIMEOUT=";
- Script += IntToString(spec);
- }
- break;
- }
-
- case EW_GETDLGITEM:
- {
- Script += " ";
- Script += GetVar(e.Params[0]);;
- Script += " ";
- Script += ReadString2(e.Params[1]);
- Script += " ";
- Script += ReadString2(e.Params[2]);
- break;
- }
-
-
- case EW_REGISTERDLL:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- Script += " ";
- Script += ReadString2(e.Params[1]);
- Script += " ";
- Script += UIntToString(e.Params[2]);
- break;
- }
-
- case EW_CREATESHORTCUT:
- {
- AString s;
-
- Script += " ";
- Script += ReadString2Qw(e.Params[0]);
-
- Script += " ";
- Script += ReadString2Qw(e.Params[1]);
-
- for (int j = 2; j < 5; j++)
- {
- Script += " ";
- Script += UIntToString(e.Params[j]);
- }
- break;
- }
-
- /*
- case EW_DELREG:
- {
- AString keyName, valueName;
- keyName = ReadString2(e.Params[1]);
- bool isValue = (e.Params[2] != -1);
- if (isValue)
- {
- valueName = ReadString2(e.Params[2]);
- Script += "Key";
- }
- else
- Script += "Value";
- Script += " ";
- Script += UIntToString(e.Params[0]);
- Script += " ";
- Script += keyName;
- if (isValue)
- {
- Script += " ";
- Script += valueName;
- }
- Script += " ";
- Script += UIntToString(e.Params[3]);
- break;
- }
- */
-
- case EW_WRITEREG:
- {
- AString s;
- switch(e.Params[4])
- {
- case 1: s = "Str"; break;
- case 2: s = "ExpandStr"; break;
- case 3: s = "Bin"; break;
- case 4: s = "DWORD"; break;
- default: s = "?" + UIntToString(e.Params[4]); break;
- }
- Script += s;
- Script += " ";
- Script += GetRegRootID(e.Params[0]);
- Script += " ";
-
- AString keyName, valueName;
- keyName = ReadString2Qw(e.Params[1]);
- Script += keyName;
- Script += " ";
-
- valueName = ReadString2Qw(e.Params[2]);
- Script += valueName;
- Script += " ";
-
- valueName = ReadString2Qw(e.Params[3]);
- Script += valueName;
- Script += " ";
-
- break;
- }
-
- case EW_WRITEUNINSTALLER:
- {
- Script += " ";
- Script += ReadString2(e.Params[0]);
- for (int j = 1; j < 3; j++)
- {
- Script += " ";
- Script += UIntToString(e.Params[j]);
- }
- break;
- }
-
- default:
- {
- int numParams = kNumEntryParams;
- if (e.Which < sizeof(kCommandPairs) / sizeof(kCommandPairs[0]))
- {
- const CCommandPair &pair = kCommandPairs[e.Which];
- // Script += pair.Name;
- numParams = pair.NumParams;
- }
- else
- {
- Script += "Unknown";
- Script += UIntToString(e.Which);
- }
- Script += e.GetParamsString(numParams);
- }
- #endif
- }
- #ifdef NSIS_SCRIPT
- Script += kCrLf;
- #endif
- }
-
- {
- Items.Sort(CompareItems, 0);
- int i;
- // if (IsSolid)
- for (i = 0; i + 1 < Items.Size();)
- {
- bool sameName = IsUnicode ?
- (Items[i].NameU == Items[i + 1].NameU) :
- (Items[i].NameA == Items[i + 1].NameA);
- if (Items[i].Pos == Items[i + 1].Pos && sameName)
- Items.Delete(i + 1);
- else
- i++;
- }
- for (i = 0; i < Items.Size(); i++)
- {
- CItem &item = Items[i];
- UInt32 curPos = item.Pos + 4;
- for (int nextIndex = i + 1; nextIndex < Items.Size(); nextIndex++)
- {
- UInt32 nextPos = Items[nextIndex].Pos;
- if (curPos <= nextPos)
- {
- item.EstimatedSizeIsDefined = true;
- item.EstimatedSize = nextPos - curPos;
- break;
- }
- }
- }
- if (!IsSolid)
- {
- for (i = 0; i < Items.Size(); i++)
- {
- CItem &item = Items[i];
- RINOK(_stream->Seek(GetPosOfNonSolidItem(i), STREAM_SEEK_SET, NULL));
- const UInt32 kSigSize = 4 + 1 + 5;
- BYTE sig[kSigSize];
- size_t processedSize = kSigSize;
- RINOK(ReadStream(_stream, sig, &processedSize));
- if (processedSize < 4)
- return S_FALSE;
- UInt32 size = Get32(sig);
- if ((size & 0x80000000) != 0)
- {
- item.IsCompressed = true;
- // is compressed;
- size &= ~0x80000000;
- if (Method == NMethodType::kLZMA)
- {
- if (processedSize < 9)
- return S_FALSE;
- if (FilterFlag)
- item.UseFilter = (sig[4] != 0);
- item.DictionarySize = Get32(sig + 5 + (FilterFlag ? 1 : 0));
- }
- }
- else
- {
- item.IsCompressed = false;
- item.Size = size;
- item.SizeIsDefined = true;
- }
- item.CompressedSize = size;
- item.CompressedSizeIsDefined = true;
- }
- }
- }
- return S_OK;
-}
-
-HRESULT CInArchive::Parse()
-{
- // UInt32 offset = ReadUInt32();
- // ???? offset == FirstHeader.HeaderLength
- /* UInt32 ehFlags = */ ReadUInt32();
- CBlockHeader bhPages, bhSections, bhEntries, bhStrings, bhLangTables, bhCtlColors, bhData;
- // CBlockHeader bgFont;
- ReadBlockHeader(bhPages);
- ReadBlockHeader(bhSections);
- ReadBlockHeader(bhEntries);
- ReadBlockHeader(bhStrings);
- ReadBlockHeader(bhLangTables);
- ReadBlockHeader(bhCtlColors);
- // ReadBlockHeader(bgFont);
- ReadBlockHeader(bhData);
-
- _stringsPos = bhStrings.Offset;
- UInt32 pos = GetOffset() + _stringsPos;
- int numZeros0 = 0;
- int numZeros1 = 0;
- int i;
- const int kBlockSize = 256;
- for (i = 0; i < kBlockSize; i++)
- {
- if (pos >= _size || pos + 1 >= _size)
- break;
- char c0 = _data[pos++];
- char c1 = _data[pos++];
- wchar_t c = (c0 | ((wchar_t)c1 << 8));
-
- if (c >= NS_UN_CODES_START && c < NS_UN_CODES_END)
- {
- if (pos >= _size || pos + 1 >= _size)
- break;
- pos += 2;
- numZeros1++;
- }
- else
- {
- if (c0 == 0 && c1 != 0)
- numZeros0++;
- if (c1 == 0)
- numZeros1++;
- }
- // printf("\nnumZeros0 = %2x %2x", _data[pos + 0], _data[pos + 1]);
- }
- IsUnicode = (numZeros1 > numZeros0 * 3 + kBlockSize / 16);
- // printf("\nnumZeros0 = %3d numZeros1 = %3d", numZeros0, numZeros1);
- return ReadEntries(bhEntries);
-}
-
-static bool IsLZMA(const Byte *p, UInt32 &dictionary)
-{
- dictionary = Get32(p + 1);
- return (p[0] == 0x5D && p[1] == 0x00 && p[2] == 0x00 && p[5] == 0x00);
-}
-
-static bool IsLZMA(const Byte *p, UInt32 &dictionary, bool &thereIsFlag)
-{
- if (IsLZMA(p, dictionary))
- {
- thereIsFlag = false;
- return true;
- }
- if (IsLZMA(p + 1, dictionary))
- {
- thereIsFlag = true;
- return true;
- }
- return false;
-}
-
-static bool IsBZip2(const Byte *p)
-{
- return (p[0] == 0x31 && p[1] < 14);
-}
-
-HRESULT CInArchive::Open2(
- DECL_EXTERNAL_CODECS_LOC_VARS2
- )
-{
- RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &StreamOffset));
-
- const UInt32 kSigSize = 4 + 1 + 5 + 1; // size, flag, lzma props, lzma first byte
- BYTE sig[kSigSize];
- RINOK(ReadStream_FALSE(_stream, sig, kSigSize));
- UInt64 position;
- RINOK(_stream->Seek(StreamOffset, STREAM_SEEK_SET, &position));
-
- _headerIsCompressed = true;
- IsSolid = true;
- FilterFlag = false;
- DictionarySize = 1;
-
- UInt32 compressedHeaderSize = Get32(sig);
-
- if (compressedHeaderSize == FirstHeader.HeaderLength)
- {
- _headerIsCompressed = false;
- IsSolid = false;
- Method = NMethodType::kCopy;
- }
- else if (IsLZMA(sig, DictionarySize, FilterFlag))
- {
- Method = NMethodType::kLZMA;
- }
- else if (IsLZMA(sig + 4, DictionarySize, FilterFlag))
- {
- IsSolid = false;
- Method = NMethodType::kLZMA;
- }
- else if (sig[3] == 0x80)
- {
- IsSolid = false;
- if (IsBZip2(sig + 4))
- Method = NMethodType::kBZip2;
- else
- Method = NMethodType::kDeflate;
- }
- else if (IsBZip2(sig))
- {
- Method = NMethodType::kBZip2;
- }
- else
- {
- Method = NMethodType::kDeflate;
- }
-
- _posInData = 0;
- if (!IsSolid)
- {
- _headerIsCompressed = ((compressedHeaderSize & 0x80000000) != 0);
- if (_headerIsCompressed)
- compressedHeaderSize &= ~0x80000000;
- _nonSolidStartOffset = compressedHeaderSize;
- RINOK(_stream->Seek(StreamOffset + 4, STREAM_SEEK_SET, NULL));
- }
- UInt32 unpackSize = FirstHeader.HeaderLength;
- if (_headerIsCompressed)
- {
- // unpackSize = (1 << 23);
- _data.SetCapacity(unpackSize);
- RINOK(Decoder.Init(
- EXTERNAL_CODECS_LOC_VARS
- _stream, Method, FilterFlag, UseFilter));
- size_t processedSize = unpackSize;
- RINOK(Decoder.Read(_data, &processedSize));
- if (processedSize != unpackSize)
- return S_FALSE;
- _size = processedSize;
- if (IsSolid)
- {
- UInt32 size2 = ReadUInt32();
- if (size2 < _size)
- _size = size2;
- }
- }
- else
- {
- _data.SetCapacity(unpackSize);
- _size = (size_t)unpackSize;
- RINOK(ReadStream_FALSE(_stream, (Byte *)_data, unpackSize));
- }
- return Parse();
-}
-
-/*
-NsisExe =
-{
- ExeStub
- Archive // must start from 512 * N
- #ifndef NSIS_CONFIG_CRC_ANAL
- {
- Some additional data
- }
-}
-
-Archive
-{
- FirstHeader
- Data
- #ifdef NSIS_CONFIG_CRC_SUPPORT && FirstHeader.ThereIsCrc()
- {
- CRC
- }
-}
-
-FirstHeader
-{
- UInt32 Flags;
- Byte Signature[16];
- // points to the header+sections+entries+stringtable in the datablock
- UInt32 HeaderLength;
- UInt32 ArchiveSize;
-}
-*/
-
-HRESULT CInArchive::Open(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream, const UInt64 *maxCheckStartPosition)
-{
- Clear();
- RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));
- UInt64 maxSize = ((maxCheckStartPosition != 0) ? *maxCheckStartPosition : 0);
- const UInt32 kStep = 512;
- Byte buffer[kStep];
-
- UInt64 position = 0;
- for (; position <= maxSize; position += kStep)
- {
- RINOK(ReadStream_FALSE(inStream, buffer, kStep));
- if (memcmp(buffer + 4, kSignature, kSignatureSize) == 0)
- break;
- }
- if (position > maxSize)
- return S_FALSE;
- const UInt32 kStartHeaderSize = 4 * 7;
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &_archiveSize));
- RINOK(inStream->Seek(position + kStartHeaderSize, STREAM_SEEK_SET, 0));
- FirstHeader.Flags = Get32(buffer);
- FirstHeader.HeaderLength = Get32(buffer + kSignatureSize + 4);
- FirstHeader.ArchiveSize = Get32(buffer + kSignatureSize + 8);
- if (_archiveSize - position < FirstHeader.ArchiveSize)
- return S_FALSE;
-
- try
- {
- _stream = inStream;
- HRESULT res = Open2(EXTERNAL_CODECS_LOC_VARS2);
- if (res != S_OK)
- Clear();
- _stream.Release();
- return res;
- }
- catch(...) { Clear(); return S_FALSE; }
-}
-
-void CInArchive::Clear()
-{
- #ifdef NSIS_SCRIPT
- Script.Empty();
- #endif
- Items.Clear();
- _stream.Release();
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.h
deleted file mode 100644
index 87ae3f1ca..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.h
+++ /dev/null
@@ -1,181 +0,0 @@
-// NsisIn.h
-
-#ifndef __ARCHIVE_NSIS_IN_H
-#define __ARCHIVE_NSIS_IN_H
-
-#include "Common/Buffer.h"
-#include "Common/MyCom.h"
-#include "Common/StringConvert.h"
-
-#include "NsisDecode.h"
-
-// #define NSIS_SCRIPT
-
-namespace NArchive {
-namespace NNsis {
-
-const int kSignatureSize = 16;
-#define NSIS_SIGNATURE { 0xEF, 0xBE, 0xAD, 0xDE, 0x4E, 0x75, 0x6C, 0x6C, 0x73, 0x6F, 0x66, 0x74, 0x49, 0x6E, 0x73, 0x74}
-
-extern Byte kSignature[kSignatureSize];
-
-const UInt32 kFlagsMask = 0xF;
-namespace NFlags
-{
- const UInt32 kUninstall = 1;
- const UInt32 kSilent = 2;
- const UInt32 kNoCrc = 4;
- const UInt32 kForceCrc = 8;
-}
-
-struct CFirstHeader
-{
- UInt32 Flags;
- UInt32 HeaderLength;
-
- UInt32 ArchiveSize;
-
- bool ThereIsCrc() const
- {
- if ((Flags & NFlags::kForceCrc ) != 0)
- return true;
- return ((Flags & NFlags::kNoCrc) == 0);
- }
-
- UInt32 GetDataSize() const { return ArchiveSize - (ThereIsCrc() ? 4 : 0); }
-};
-
-
-struct CBlockHeader
-{
- UInt32 Offset;
- UInt32 Num;
-};
-
-struct CItem
-{
- AString PrefixA;
- UString PrefixU;
- AString NameA;
- UString NameU;
- FILETIME MTime;
- bool IsUnicode;
- bool UseFilter;
- bool IsCompressed;
- bool SizeIsDefined;
- bool CompressedSizeIsDefined;
- bool EstimatedSizeIsDefined;
- UInt32 Pos;
- UInt32 Size;
- UInt32 CompressedSize;
- UInt32 EstimatedSize;
- UInt32 DictionarySize;
-
- CItem(): IsUnicode(false), UseFilter(false), IsCompressed(true), SizeIsDefined(false),
- CompressedSizeIsDefined(false), EstimatedSizeIsDefined(false), Size(0), DictionarySize(1) {}
-
- bool IsINSTDIR() const
- {
- return (PrefixA.Length() >= 3 || PrefixU.Length() >= 3);
- }
-
- UString GetReducedName(bool unicode) const
- {
- UString s;
- if (unicode)
- s = PrefixU;
- else
- s = MultiByteToUnicodeString(PrefixA);
- if (s.Length() > 0)
- if (s[s.Length() - 1] != L'\\')
- s += L'\\';
- if (unicode)
- s += NameU;
- else
- s += MultiByteToUnicodeString(NameA);
- const int len = 9;
- if (s.Left(len).CompareNoCase(L"$INSTDIR\\") == 0)
- s = s.Mid(len);
- return s;
- }
-};
-
-class CInArchive
-{
- UInt64 _archiveSize;
- CMyComPtr<IInStream> _stream;
-
- Byte ReadByte();
- UInt32 ReadUInt32();
- HRESULT Open2(
- DECL_EXTERNAL_CODECS_LOC_VARS2
- );
- void ReadBlockHeader(CBlockHeader &bh);
- AString ReadStringA(UInt32 pos) const;
- UString ReadStringU(UInt32 pos) const;
- AString ReadString2A(UInt32 pos) const;
- UString ReadString2U(UInt32 pos) const;
- AString ReadString2(UInt32 pos) const;
- AString ReadString2Qw(UInt32 pos) const;
- HRESULT ReadEntries(const CBlockHeader &bh);
- HRESULT Parse();
-
- CByteBuffer _data;
- UInt64 _size;
-
- size_t _posInData;
-
- UInt32 _stringsPos;
-
-
- bool _headerIsCompressed;
- UInt32 _nonSolidStartOffset;
-public:
- HRESULT Open(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream, const UInt64 *maxCheckStartPosition);
- void Clear();
-
- UInt64 StreamOffset;
- CDecoder Decoder;
- CObjectVector<CItem> Items;
- CFirstHeader FirstHeader;
- NMethodType::EEnum Method;
- UInt32 DictionarySize;
- bool IsSolid;
- bool UseFilter;
- bool FilterFlag;
- bool IsUnicode;
-
- #ifdef NSIS_SCRIPT
- AString Script;
- #endif
- UInt32 GetOffset() const { return IsSolid ? 4 : 0; }
- UInt64 GetDataPos(int index)
- {
- const CItem &item = Items[index];
- return GetOffset() + FirstHeader.HeaderLength + item.Pos;
- }
-
- UInt64 GetPosOfSolidItem(int index) const
- {
- const CItem &item = Items[index];
- return 4 + FirstHeader.HeaderLength + item.Pos;
- }
-
- UInt64 GetPosOfNonSolidItem(int index) const
- {
- const CItem &item = Items[index];
- return StreamOffset + _nonSolidStartOffset + 4 + item.Pos;
- }
-
- void Release()
- {
- Decoder.Release();
- }
-
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisRegister.cpp
deleted file mode 100644
index 41dedb0d3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// NsisRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "NsisHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NNsis::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Nsis", L"", 0, 0x9, NSIS_SIGNATURE, NArchive::NNsis::kSignatureSize, false, CreateArc, 0 };
-
-REGISTER_ARC(Nsis)
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/StdAfx.h
deleted file mode 100644
index 2e4be10b2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/StdAfx.h
+++ /dev/null
@@ -1,9 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/MyWindows.h"
-#include "../../../Common/NewHandler.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/NtfsHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/NtfsHandler.cpp
deleted file mode 100644
index 505486fc5..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/NtfsHandler.cpp
+++ /dev/null
@@ -1,1764 +0,0 @@
-// NtfsHandler.cpp
-
-#include "StdAfx.h"
-
-// #define SHOW_DEBUG_INFO
-// #define SHOW_DEBUG_INFO2
-
-#if defined(SHOW_DEBUG_INFO) || defined(SHOW_DEBUG_INFO2)
-#include <stdio.h>
-#endif
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyCom.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#include "Common/DummyOutStream.h"
-
-#ifdef SHOW_DEBUG_INFO
-#define PRF(x) x
-#else
-#define PRF(x)
-#endif
-
-#ifdef SHOW_DEBUG_INFO2
-#define PRF2(x) x
-#else
-#define PRF2(x)
-#endif
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-#define G16(p, dest) dest = Get16(p);
-#define G32(p, dest) dest = Get32(p);
-#define G64(p, dest) dest = Get64(p);
-
-namespace NArchive {
-namespace Ntfs {
-
-static const UInt32 kNumSysRecs = 16;
-static const UInt32 kRecIndex_Volume = 3;
-static const UInt32 kRecIndex_BadClus = 8;
-
-struct CHeader
-{
- Byte SectorSizeLog;
- Byte ClusterSizeLog;
- // Byte MediaType;
- UInt32 NumHiddenSectors;
- UInt64 NumClusters;
- UInt64 MftCluster;
- UInt64 SerialNumber;
- UInt16 SectorsPerTrack;
- UInt16 NumHeads;
-
- UInt64 GetPhySize() const { return NumClusters << ClusterSizeLog; }
- UInt32 ClusterSize() const { return (UInt32)1 << ClusterSizeLog; }
- bool Parse(const Byte *p);
-};
-
-static int GetLog(UInt32 num)
-{
- for (int i = 0; i < 31; i++)
- if (((UInt32)1 << i) == num)
- return i;
- return -1;
-}
-
-bool CHeader::Parse(const Byte *p)
-{
- if (p[0x1FE] != 0x55 || p[0x1FF] != 0xAA)
- return false;
-
- int codeOffset = 0;
- switch (p[0])
- {
- case 0xE9: codeOffset = 3 + (Int16)Get16(p + 1); break;
- case 0xEB: if (p[2] != 0x90) return false; codeOffset = 2 + (signed char)p[1]; break;
- default: return false;
- }
- Byte sectorsPerClusterLog;
-
- if (memcmp(p + 3, "NTFS ", 8) != 0)
- return false;
- {
- int s = GetLog(Get16(p + 11));
- if (s < 9 || s > 12)
- return false;
- SectorSizeLog = (Byte)s;
- s = GetLog(p[13]);
- if (s < 0)
- return false;
- sectorsPerClusterLog = (Byte)s;
- ClusterSizeLog = SectorSizeLog + sectorsPerClusterLog;
- }
-
- for (int i = 14; i < 21; i++)
- if (p[i] != 0)
- return false;
-
- // MediaType = p[21];
- if (Get16(p + 22) != 0) // NumFatSectors
- return false;
- G16(p + 24, SectorsPerTrack);
- G16(p + 26, NumHeads);
- G32(p + 28, NumHiddenSectors);
- if (Get32(p + 32) != 0) // NumSectors32
- return false;
-
- // DriveNumber = p[0x24];
- if (p[0x25] != 0) // CurrentHead
- return false;
- /*
- NTFS-HDD: p[0x26] = 0x80
- NTFS-FLASH: p[0x26] = 0
- */
- if (p[0x26] != 0x80 && p[0x26] != 0) // ExtendedBootSig
- return false;
- if (p[0x27] != 0) // reserved
- return false;
- UInt64 numSectors = Get64(p + 0x28);
- NumClusters = numSectors >> sectorsPerClusterLog;
-
- G64(p + 0x30, MftCluster);
- // G64(p + 0x38, Mft2Cluster);
- G64(p + 0x48, SerialNumber);
- UInt32 numClustersInMftRec;
- UInt32 numClustersInIndexBlock;
- G32(p + 0x40, numClustersInMftRec);
- G32(p + 0x44, numClustersInIndexBlock);
- return (numClustersInMftRec < 256 && numClustersInIndexBlock < 256);
-}
-
-struct CMftRef
-{
- UInt64 Val;
- UInt64 GetIndex() const { return Val & (((UInt64)1 << 48) - 1); }
- UInt16 GetNumber() const { return (UInt16)(Val >> 48); }
- bool IsBaseItself() const { return Val == 0; }
-};
-
-#define ATNAME(n) ATTR_TYPE_ ## n
-#define DEF_ATTR_TYPE(v, n) ATNAME(n) = v
-
-enum
-{
- DEF_ATTR_TYPE(0x00, UNUSED),
- DEF_ATTR_TYPE(0x10, STANDARD_INFO),
- DEF_ATTR_TYPE(0x20, ATTRIBUTE_LIST),
- DEF_ATTR_TYPE(0x30, FILE_NAME),
- DEF_ATTR_TYPE(0x40, OBJECT_ID),
- DEF_ATTR_TYPE(0x50, SECURITY_DESCRIPTOR),
- DEF_ATTR_TYPE(0x60, VOLUME_NAME),
- DEF_ATTR_TYPE(0x70, VOLUME_INFO),
- DEF_ATTR_TYPE(0x80, DATA),
- DEF_ATTR_TYPE(0x90, INDEX_ROOT),
- DEF_ATTR_TYPE(0xA0, INDEX_ALLOCATION),
- DEF_ATTR_TYPE(0xB0, BITMAP),
- DEF_ATTR_TYPE(0xC0, REPARSE_POINT),
- DEF_ATTR_TYPE(0xD0, EA_INFO),
- DEF_ATTR_TYPE(0xE0, EA),
- DEF_ATTR_TYPE(0xF0, PROPERTY_SET),
- DEF_ATTR_TYPE(0x100, LOGGED_UTILITY_STREAM),
- DEF_ATTR_TYPE(0x1000, FIRST_USER_DEFINED_ATTRIBUTE)
-};
-
-static const Byte kFileNameType_Posix = 0;
-static const Byte kFileNameType_Win32 = 1;
-static const Byte kFileNameType_Dos = 2;
-static const Byte kFileNameType_Win32Dos = 3;
-
-struct CFileNameAttr
-{
- CMftRef ParentDirRef;
- // UInt64 CTime;
- // UInt64 MTime;
- // UInt64 ThisRecMTime;
- // UInt64 ATime;
- // UInt64 AllocatedSize;
- // UInt64 DataSize;
- // UInt16 PackedEaSize;
- UString Name;
- UInt32 Attrib;
- Byte NameType;
-
- bool IsDos() const { return NameType == kFileNameType_Dos; }
- bool Parse(const Byte *p, unsigned size);
-};
-
-static void GetString(const Byte *p, unsigned length, UString &res)
-{
- wchar_t *s = res.GetBuffer(length);
- for (unsigned i = 0; i < length; i++)
- s[i] = Get16(p + i * 2);
- s[length] = 0;
- res.ReleaseBuffer();
-}
-
-bool CFileNameAttr::Parse(const Byte *p, unsigned size)
-{
- if (size < 0x42)
- return false;
- G64(p + 0x00, ParentDirRef.Val);
- // G64(p + 0x08, CTime);
- // G64(p + 0x10, MTime);
- // G64(p + 0x18, ThisRecMTime);
- // G64(p + 0x20, ATime);
- // G64(p + 0x28, AllocatedSize);
- // G64(p + 0x30, DataSize);
- G32(p + 0x38, Attrib);
- // G16(p + 0x3C, PackedEaSize);
- NameType = p[0x41];
- unsigned length = p[0x40];
- if (0x42 + length > size)
- return false;
- GetString(p + 0x42, length, Name);
- return true;
-}
-
-struct CSiAttr
-{
- UInt64 CTime;
- UInt64 MTime;
- // UInt64 ThisRecMTime;
- UInt64 ATime;
- UInt32 Attrib;
-
- /*
- UInt32 MaxVersions;
- UInt32 Version;
- UInt32 ClassId;
- UInt32 OwnerId;
- UInt32 SecurityId;
- UInt64 QuotaCharged;
- */
-
- bool Parse(const Byte *p, unsigned size);
-};
-
-bool CSiAttr::Parse(const Byte *p, unsigned size)
-{
- if (size < 0x24)
- return false;
- G64(p + 0x00, CTime);
- G64(p + 0x08, MTime);
- // G64(p + 0x10, ThisRecMTime);
- G64(p + 0x18, ATime);
- G32(p + 0x20, Attrib);
- return true;
-}
-
-static const UInt64 kEmptyExtent = (UInt64)(Int64)-1;
-
-struct CExtent
-{
- UInt64 Virt;
- UInt64 Phy;
-
- bool IsEmpty() const { return Phy == kEmptyExtent; }
-};
-
-struct CVolInfo
-{
- Byte MajorVer;
- Byte MinorVer;
- // UInt16 Flags;
-
- bool Parse(const Byte *p, unsigned size);
-};
-
-bool CVolInfo::Parse(const Byte *p, unsigned size)
-{
- if (size < 12)
- return false;
- MajorVer = p[8];
- MinorVer = p[9];
- // Flags = Get16(p + 10);
- return true;
-}
-
-struct CAttr
-{
- UInt32 Type;
- // UInt32 Length;
- UString Name;
- // UInt16 Flags;
- // UInt16 Instance;
- CByteBuffer Data;
- Byte NonResident;
-
- // Non-Resident
- Byte CompressionUnit;
- UInt64 LowVcn;
- UInt64 HighVcn;
- UInt64 AllocatedSize;
- UInt64 Size;
- UInt64 PackSize;
- UInt64 InitializedSize;
-
- // Resident
- // UInt16 ResidentFlags;
-
- bool IsCompressionUnitSupported() const { return CompressionUnit == 0 || CompressionUnit == 4; }
-
- UInt32 Parse(const Byte *p, unsigned size);
- bool ParseFileName(CFileNameAttr &a) const { return a.Parse(Data, (unsigned)Data.GetCapacity()); }
- bool ParseSi(CSiAttr &a) const { return a.Parse(Data, (unsigned)Data.GetCapacity()); }
- bool ParseVolInfo(CVolInfo &a) const { return a.Parse(Data, (unsigned)Data.GetCapacity()); }
- bool ParseExtents(CRecordVector<CExtent> &extents, UInt64 numClustersMax, int compressionUnit) const;
- UInt64 GetSize() const { return NonResident ? Size : Data.GetCapacity(); }
- UInt64 GetPackSize() const
- {
- if (!NonResident)
- return Data.GetCapacity();
- if (CompressionUnit != 0)
- return PackSize;
- return AllocatedSize;
- }
-};
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareAttr(void *const *elem1, void *const *elem2, void *)
-{
- const CAttr &a1 = *(*((const CAttr **)elem1));
- const CAttr &a2 = *(*((const CAttr **)elem2));
- RINOZ(MyCompare(a1.Type, a2.Type));
- RINOZ(MyCompare(a1.Name, a2.Name));
- return MyCompare(a1.LowVcn, a2.LowVcn);
-}
-
-UInt32 CAttr::Parse(const Byte *p, unsigned size)
-{
- if (size < 4)
- return 0;
- G32(p, Type);
- if (Type == 0xFFFFFFFF)
- return 4;
- if (size < 0x18)
- return 0;
- PRF(printf(" T=%2X", Type));
-
- UInt32 length = Get32(p + 0x04);
- PRF(printf(" L=%3d", length));
- if (length > size)
- return 0;
- NonResident = p[0x08];
- {
- int nameLength = p[9];
- UInt32 nameOffset = Get16(p + 0x0A);
- if (nameLength != 0)
- {
- if (nameOffset + nameLength * 2 > length)
- return 0;
- GetString(p + nameOffset, nameLength, Name);
- PRF(printf(" N=%S", Name));
- }
- }
-
- // G16(p + 0x0C, Flags);
- // G16(p + 0x0E, Instance);
- // PRF(printf(" F=%4X", Flags));
- // PRF(printf(" Inst=%d", Instance));
-
- UInt32 dataSize;
- UInt32 offs;
- if (NonResident)
- {
- if (length < 0x40)
- return 0;
- PRF(printf(" NR"));
- G64(p + 0x10, LowVcn);
- G64(p + 0x18, HighVcn);
- G64(p + 0x28, AllocatedSize);
- G64(p + 0x30, Size);
- G64(p + 0x38, InitializedSize);
- G16(p + 0x20, offs);
- CompressionUnit = p[0x22];
-
- PackSize = Size;
- if (CompressionUnit != 0)
- {
- if (length < 0x48)
- return 0;
- G64(p + 0x40, PackSize);
- PRF(printf(" PS=%I64x", PackSize));
- }
-
- // PRF(printf("\n"));
- PRF(printf(" ASize=%4I64d", AllocatedSize));
- PRF(printf(" Size=%I64d", Size));
- PRF(printf(" IS=%I64d", InitializedSize));
- PRF(printf(" Low=%I64d", LowVcn));
- PRF(printf(" High=%I64d", HighVcn));
- PRF(printf(" CU=%d", (int)CompressionUnit));
- dataSize = length - offs;
- }
- else
- {
- if (length < 0x18)
- return 0;
- PRF(printf(" RES"));
- dataSize = Get32(p + 0x10);
- PRF(printf(" dataSize=%3d", dataSize));
- offs = Get16(p + 0x14);
- // G16(p + 0x16, ResidentFlags);
- // PRF(printf(" ResFlags=%4X", ResidentFlags));
- }
- if (offs > length || dataSize > length || length - dataSize < offs)
- return 0;
- Data.SetCapacity(dataSize);
- memcpy(Data, p + offs, dataSize);
- #ifdef SHOW_DEBUG_INFO
- PRF(printf(" : "));
- for (unsigned i = 0; i < Data.GetCapacity(); i++)
- {
- PRF(printf(" %02X", (int)Data[i]));
- }
- #endif
- return length;
-}
-
-bool CAttr::ParseExtents(CRecordVector<CExtent> &extents, UInt64 numClustersMax, int compressionUnit) const
-{
- const Byte *p = Data;
- unsigned size = (unsigned)Data.GetCapacity();
- UInt64 vcn = LowVcn;
- UInt64 lcn = 0;
- UInt64 highVcn1 = HighVcn + 1;
- if (LowVcn != extents.Back().Virt || highVcn1 > (UInt64)1 << 63)
- return false;
-
- extents.DeleteBack();
-
- PRF2(printf("\n# ParseExtents # LowVcn = %4I64X # HighVcn = %4I64X", LowVcn, HighVcn));
-
- while (size > 0)
- {
- Byte b = *p++;
- size--;
- if (b == 0)
- break;
- UInt32 num = b & 0xF;
- if (num == 0 || num > 8 || num > size)
- return false;
-
- int i;
- UInt64 vSize = p[num - 1];
- for (i = (int)num - 2; i >= 0; i--)
- vSize = (vSize << 8) | p[i];
- if (vSize == 0)
- return false;
- p += num;
- size -= num;
- if ((highVcn1 - vcn) < vSize)
- return false;
-
- num = (b >> 4) & 0xF;
- if (num > 8 || num > size)
- return false;
- CExtent e;
- e.Virt = vcn;
- if (num == 0)
- {
- if (compressionUnit == 0)
- return false;
- e.Phy = kEmptyExtent;
- }
- else
- {
- Int64 v = (signed char)p[num - 1];
- for (i = (int)num - 2; i >= 0; i--)
- v = (v << 8) | p[i];
- p += num;
- size -= num;
- lcn += v;
- if (lcn > numClustersMax)
- return false;
- e.Phy = lcn;
- }
- extents.Add(e);
- vcn += vSize;
- }
- CExtent e;
- e.Phy = kEmptyExtent;
- e.Virt = vcn;
- extents.Add(e);
- return (highVcn1 == vcn);
-}
-
-static const UInt64 kEmptyTag = (UInt64)(Int64)-1;
-
-static const int kNumCacheChunksLog = 1;
-static const UInt32 kNumCacheChunks = (1 << kNumCacheChunksLog);
-
-class CInStream:
- public IInStream,
- public CMyUnknownImp
-{
- UInt64 _virtPos;
- UInt64 _physPos;
- UInt64 _curRem;
- bool _sparseMode;
- size_t _compressedPos;
-
- UInt64 _tags[kNumCacheChunks];
- int _chunkSizeLog;
- CByteBuffer _inBuf;
- CByteBuffer _outBuf;
-public:
- CMyComPtr<IInStream> Stream;
- UInt64 Size;
- UInt64 InitializedSize;
- int BlockSizeLog;
- int CompressionUnit;
- bool InUse;
- CRecordVector<CExtent> Extents;
-
- HRESULT SeekToPhys() { return Stream->Seek(_physPos, STREAM_SEEK_SET, NULL); }
-
- UInt32 GetCuSize() const { return (UInt32)1 << (BlockSizeLog + CompressionUnit); }
- HRESULT InitAndSeek(int compressionUnit)
- {
- CompressionUnit = compressionUnit;
- if (compressionUnit != 0)
- {
- UInt32 cuSize = GetCuSize();
- _inBuf.SetCapacity(cuSize);
- _chunkSizeLog = BlockSizeLog + CompressionUnit;
- _outBuf.SetCapacity(kNumCacheChunks << _chunkSizeLog);
- }
- for (int i = 0; i < kNumCacheChunks; i++)
- _tags[i] = kEmptyTag;
-
- _sparseMode = false;
- _curRem = 0;
- _virtPos = 0;
- _physPos = 0;
- const CExtent &e = Extents[0];
- if (!e.IsEmpty())
- _physPos = e.Phy << BlockSizeLog;
- return SeekToPhys();
- }
-
- MY_UNKNOWN_IMP1(IInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-
-static size_t Lznt1Dec(Byte *dest, size_t outBufLim, size_t destLen, const Byte *src, size_t srcLen)
-{
- size_t destSize = 0;
- while (destSize < destLen)
- {
- if (srcLen < 2 || (destSize & 0xFFF) != 0)
- break;
- UInt32 v = Get16(src);
- if (v == 0)
- break;
- src += 2;
- srcLen -= 2;
- UInt32 comprSize = (v & 0xFFF) + 1;
- if (comprSize > srcLen)
- break;
- srcLen -= comprSize;
- if ((v & 0x8000) == 0)
- {
- if (comprSize != (1 << 12))
- break;
- memcpy(dest + destSize, src, comprSize);
- src += comprSize;
- destSize += comprSize;
- }
- else
- {
- if (destSize + (1 << 12) > outBufLim || (src[0] & 1) != 0)
- return 0;
- int numDistBits = 4;
- UInt32 sbOffset = 0;
- UInt32 pos = 0;
-
- do
- {
- comprSize--;
- for (UInt32 mask = src[pos++] | 0x100; mask > 1 && comprSize > 0; mask >>= 1)
- {
- if ((mask & 1) == 0)
- {
- if (sbOffset >= (1 << 12))
- return 0;
- dest[destSize++] = src[pos++];
- sbOffset++;
- comprSize--;
- }
- else
- {
- if (comprSize < 2)
- return 0;
- UInt32 v = Get16(src + pos);
- pos += 2;
- comprSize -= 2;
-
- while (((sbOffset - 1) >> numDistBits) != 0)
- numDistBits++;
-
- UInt32 len = (v & (0xFFFF >> numDistBits)) + 3;
- if (sbOffset + len > (1 << 12))
- return 0;
- UInt32 dist = (v >> (16 - numDistBits));
- if (dist >= sbOffset)
- return 0;
- Int32 offs = -1 - dist;
- Byte *p = dest + destSize;
- for (UInt32 t = 0; t < len; t++)
- p[t] = p[t + offs];
- destSize += len;
- sbOffset += len;
- }
- }
- }
- while (comprSize > 0);
- src += pos;
- }
- }
- return destSize;
-}
-
-STDMETHODIMP CInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- if (_virtPos >= Size)
- return (Size == _virtPos) ? S_OK: E_FAIL;
- if (size == 0)
- return S_OK;
- UInt64 rem = Size - _virtPos;
- if (size > rem)
- size = (UInt32)rem;
- if (_virtPos >= InitializedSize)
- {
- memset((Byte *)data, 0, size);
- _virtPos += size;
- *processedSize = size;
- return S_OK;
- }
- rem = InitializedSize - _virtPos;
- if (size > rem)
- size = (UInt32)rem;
-
- while (_curRem == 0)
- {
- UInt64 cacheTag = _virtPos >> _chunkSizeLog;
- UInt32 cacheIndex = (UInt32)cacheTag & (kNumCacheChunks - 1);
- if (_tags[cacheIndex] == cacheTag)
- {
- UInt32 chunkSize = (UInt32)1 << _chunkSizeLog;
- UInt32 offset = (UInt32)_virtPos & (chunkSize - 1);
- UInt32 cur = MyMin(chunkSize - offset, size);
- memcpy(data, _outBuf + (cacheIndex << _chunkSizeLog) + offset, cur);
- *processedSize = cur;
- _virtPos += cur;
- return S_OK;
- }
-
- PRF2(printf("\nVirtPos = %6d", _virtPos));
-
- UInt32 comprUnitSize = (UInt32)1 << CompressionUnit;
- UInt64 virtBlock = _virtPos >> BlockSizeLog;
- UInt64 virtBlock2 = virtBlock & ~((UInt64)comprUnitSize - 1);
-
- int left = 0, right = Extents.Size();
- for (;;)
- {
- int mid = (left + right) / 2;
- if (mid == left)
- break;
- if (virtBlock2 < Extents[mid].Virt)
- right = mid;
- else
- left = mid;
- }
-
- bool isCompressed = false;
- UInt64 virtBlock2End = virtBlock2 + comprUnitSize;
- if (CompressionUnit != 0)
- for (int i = left; i < Extents.Size(); i++)
- {
- const CExtent &e = Extents[i];
- if (e.Virt >= virtBlock2End)
- break;
- if (e.IsEmpty())
- {
- isCompressed = true;
- break;
- }
- }
-
- int i;
- for (i = left; Extents[i + 1].Virt <= virtBlock; i++);
-
- _sparseMode = false;
- if (!isCompressed)
- {
- const CExtent &e = Extents[i];
- UInt64 newPos = (e.Phy << BlockSizeLog) + _virtPos - (e.Virt << BlockSizeLog);
- if (newPos != _physPos)
- {
- _physPos = newPos;
- RINOK(SeekToPhys());
- }
- UInt64 next = Extents[i + 1].Virt;
- if (next > virtBlock2End)
- next &= ~((UInt64)comprUnitSize - 1);
- next <<= BlockSizeLog;
- if (next > Size)
- next = Size;
- _curRem = next - _virtPos;
- break;
- }
- bool thereArePhy = false;
- for (int i2 = left; i2 < Extents.Size(); i2++)
- {
- const CExtent &e = Extents[i2];
- if (e.Virt >= virtBlock2End)
- break;
- if (!e.IsEmpty())
- {
- thereArePhy = true;
- break;
- }
- }
- if (!thereArePhy)
- {
- _curRem = (Extents[i + 1].Virt << BlockSizeLog) - _virtPos;
- _sparseMode = true;
- break;
- }
-
- size_t offs = 0;
- UInt64 curVirt = virtBlock2;
- for (i = left; i < Extents.Size(); i++)
- {
- const CExtent &e = Extents[i];
- if (e.IsEmpty())
- break;
- if (e.Virt >= virtBlock2End)
- return S_FALSE;
- UInt64 newPos = (e.Phy + (curVirt - e.Virt)) << BlockSizeLog;
- if (newPos != _physPos)
- {
- _physPos = newPos;
- RINOK(SeekToPhys());
- }
- UInt64 numChunks = Extents[i + 1].Virt - curVirt;
- if (curVirt + numChunks > virtBlock2End)
- numChunks = virtBlock2End - curVirt;
- size_t compressed = (size_t)numChunks << BlockSizeLog;
- RINOK(ReadStream_FALSE(Stream, _inBuf + offs, compressed));
- curVirt += numChunks;
- _physPos += compressed;
- offs += compressed;
- }
- size_t destLenMax = GetCuSize();
- size_t destLen = destLenMax;
- UInt64 rem = Size - (virtBlock2 << BlockSizeLog);
- if (destLen > rem)
- destLen = (size_t)rem;
-
- Byte *dest = _outBuf + (cacheIndex << _chunkSizeLog);
- size_t destSizeRes = Lznt1Dec(dest, destLenMax, destLen, _inBuf, offs);
- _tags[cacheIndex] = cacheTag;
-
- // some files in Vista have destSize > destLen
- if (destSizeRes < destLen)
- {
- memset(dest, 0, destLenMax);
- if (InUse)
- return S_FALSE;
- }
- }
- if (size > _curRem)
- size = (UInt32)_curRem;
- HRESULT res = S_OK;
- if (_sparseMode)
- memset(data, 0, size);
- else
- {
- res = Stream->Read(data, size, &size);
- _physPos += size;
- }
- if (processedSize != NULL)
- *processedSize = size;
- _virtPos += size;
- _curRem -= size;
- return res;
-}
-
-STDMETHODIMP CInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- UInt64 newVirtPos = offset;
- switch(seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: newVirtPos += _virtPos; break;
- case STREAM_SEEK_END: newVirtPos += Size; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (_virtPos != newVirtPos)
- _curRem = 0;
- _virtPos = newVirtPos;
- if (newPosition)
- *newPosition = newVirtPos;
- return S_OK;
-}
-
-class CByteBufStream:
- public IInStream,
- public CMyUnknownImp
-{
- UInt64 _virtPos;
-public:
- CByteBuffer Buf;
- void Init() { _virtPos = 0; }
-
- MY_UNKNOWN_IMP1(IInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-
-STDMETHODIMP CByteBufStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- if (_virtPos >= Buf.GetCapacity())
- return (_virtPos == Buf.GetCapacity()) ? S_OK: E_FAIL;
- UInt64 rem = Buf.GetCapacity() - _virtPos;
- if (rem < size)
- size = (UInt32)rem;
- memcpy(data, Buf + (size_t)_virtPos, size);
- if (processedSize != NULL)
- *processedSize = size;
- _virtPos += size;
- return S_OK;
-}
-
-STDMETHODIMP CByteBufStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch(seekOrigin)
- {
- case STREAM_SEEK_SET: _virtPos = offset; break;
- case STREAM_SEEK_CUR: _virtPos += offset; break;
- case STREAM_SEEK_END: _virtPos = Buf.GetCapacity() + offset; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
-}
-
-static HRESULT DataParseExtents(int clusterSizeLog, const CObjectVector<CAttr> &attrs,
- int attrIndex, int attrIndexLim, UInt64 numPhysClusters, CRecordVector<CExtent> &Extents)
-{
- CExtent e;
- e.Virt = 0;
- e.Phy = kEmptyExtent;
- Extents.Add(e);
- const CAttr &attr0 = attrs[attrIndex];
-
- if (attr0.AllocatedSize < attr0.Size ||
- (attrs[attrIndexLim - 1].HighVcn + 1) != (attr0.AllocatedSize >> clusterSizeLog) ||
- (attr0.AllocatedSize & ((1 << clusterSizeLog) - 1)) != 0)
- return S_FALSE;
-
- for (int i = attrIndex; i < attrIndexLim; i++)
- if (!attrs[i].ParseExtents(Extents, numPhysClusters, attr0.CompressionUnit))
- return S_FALSE;
-
- UInt64 packSizeCalc = 0;
- for (int k = 0; k < Extents.Size(); k++)
- {
- CExtent &e = Extents[k];
- if (!e.IsEmpty())
- packSizeCalc += (Extents[k + 1].Virt - e.Virt) << clusterSizeLog;
- PRF2(printf("\nSize = %4I64X", Extents[k + 1].Virt - e.Virt));
- PRF2(printf(" Pos = %4I64X", e.Phy));
- }
-
- if (attr0.CompressionUnit != 0)
- {
- if (packSizeCalc != attr0.PackSize)
- return S_FALSE;
- }
- else
- {
- if (packSizeCalc != attr0.AllocatedSize)
- return S_FALSE;
- }
- return S_OK;
-}
-
-struct CDataRef
-{
- int Start;
- int Num;
-};
-
-static const UInt32 kMagic_FILE = 0x454c4946;
-static const UInt32 kMagic_BAAD = 0x44414142;
-
-struct CMftRec
-{
- UInt32 Magic;
- // UInt64 Lsn;
- UInt16 SeqNumber;
- UInt16 Flags;
- // UInt16 LinkCount;
- // UInt16 NextAttrInstance;
- CMftRef BaseMftRef;
- // UInt32 ThisRecNumber;
- UInt32 MyNumNameLinks;
-
- CObjectVector<CAttr> DataAttrs;
- CObjectVector<CFileNameAttr> FileNames;
- CRecordVector<CDataRef> DataRefs;
-
- CSiAttr SiAttr;
-
- void MoveAttrsFrom(CMftRec &src)
- {
- DataAttrs += src.DataAttrs;
- FileNames += src.FileNames;
- src.DataAttrs.ClearAndFree();
- src.FileNames.ClearAndFree();
- }
-
- UInt64 GetPackSize() const
- {
- UInt64 res = 0;
- for (int i = 0; i < DataRefs.Size(); i++)
- res += DataAttrs[DataRefs[i].Start].GetPackSize();
- return res;
- }
-
- bool Parse(Byte *p, int sectorSizeLog, UInt32 numSectors, UInt32 recNumber, CObjectVector<CAttr> *attrs);
-
- bool IsEmpty() const { return (Magic <= 2); }
- bool IsFILE() const { return (Magic == kMagic_FILE); }
- bool IsBAAD() const { return (Magic == kMagic_BAAD); }
-
- bool InUse() const { return (Flags & 1) != 0; }
- bool IsDir() const { return (Flags & 2) != 0; }
-
- void ParseDataNames();
- HRESULT GetStream(IInStream *mainStream, int dataIndex,
- int clusterSizeLog, UInt64 numPhysClusters, IInStream **stream) const;
- int GetNumExtents(int dataIndex, int clusterSizeLog, UInt64 numPhysClusters) const;
-
- UInt64 GetSize(int dataIndex) const { return DataAttrs[DataRefs[dataIndex].Start].GetSize(); }
-
- CMftRec(): MyNumNameLinks(0) {}
-};
-
-void CMftRec::ParseDataNames()
-{
- DataRefs.Clear();
- DataAttrs.Sort(CompareAttr, 0);
-
- for (int i = 0; i < DataAttrs.Size();)
- {
- CDataRef ref;
- ref.Start = i;
- for (i++; i < DataAttrs.Size(); i++)
- if (DataAttrs[ref.Start].Name != DataAttrs[i].Name)
- break;
- ref.Num = i - ref.Start;
- DataRefs.Add(ref);
- }
-}
-
-HRESULT CMftRec::GetStream(IInStream *mainStream, int dataIndex,
- int clusterSizeLog, UInt64 numPhysClusters, IInStream **destStream) const
-{
- *destStream = 0;
- CByteBufStream *streamSpec = new CByteBufStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
-
- if (dataIndex < 0)
- return E_FAIL;
-
- if (dataIndex < DataRefs.Size())
- {
- const CDataRef &ref = DataRefs[dataIndex];
- int numNonResident = 0;
- int i;
- for (i = ref.Start; i < ref.Start + ref.Num; i++)
- if (DataAttrs[i].NonResident)
- numNonResident++;
-
- const CAttr &attr0 = DataAttrs[ref.Start];
-
- if (numNonResident != 0 || ref.Num != 1)
- {
- if (numNonResident != ref.Num || !attr0.IsCompressionUnitSupported())
- return S_FALSE;
- CInStream *streamSpec = new CInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- RINOK(DataParseExtents(clusterSizeLog, DataAttrs, ref.Start, ref.Start + ref.Num, numPhysClusters, streamSpec->Extents));
- streamSpec->Size = attr0.Size;
- streamSpec->InitializedSize = attr0.InitializedSize;
- streamSpec->Stream = mainStream;
- streamSpec->BlockSizeLog = clusterSizeLog;
- streamSpec->InUse = InUse();
- RINOK(streamSpec->InitAndSeek(attr0.CompressionUnit));
- *destStream = streamTemp.Detach();
- return S_OK;
- }
- streamSpec->Buf = attr0.Data;
- }
- streamSpec->Init();
- *destStream = streamTemp.Detach();
- return S_OK;
-}
-
-int CMftRec::GetNumExtents(int dataIndex, int clusterSizeLog, UInt64 numPhysClusters) const
-{
- if (dataIndex < 0)
- return 0;
- {
- const CDataRef &ref = DataRefs[dataIndex];
- int numNonResident = 0;
- int i;
- for (i = ref.Start; i < ref.Start + ref.Num; i++)
- if (DataAttrs[i].NonResident)
- numNonResident++;
-
- const CAttr &attr0 = DataAttrs[ref.Start];
-
- if (numNonResident != 0 || ref.Num != 1)
- {
- if (numNonResident != ref.Num || !attr0.IsCompressionUnitSupported())
- return 0; // error;
- CRecordVector<CExtent> extents;
- if (DataParseExtents(clusterSizeLog, DataAttrs, ref.Start, ref.Start + ref.Num, numPhysClusters, extents) != S_OK)
- return 0; // error;
- return extents.Size() - 1;
- }
- // if (attr0.Data.GetCapacity() != 0)
- // return 1;
- return 0;
- }
-}
-
-bool CMftRec::Parse(Byte *p, int sectorSizeLog, UInt32 numSectors, UInt32 recNumber,
- CObjectVector<CAttr> *attrs)
-{
- G32(p, Magic);
- if (!IsFILE())
- return IsEmpty() || IsBAAD();
-
- UInt32 usaOffset;
- UInt32 numUsaItems;
- G16(p + 0x04, usaOffset);
- G16(p + 0x06, numUsaItems);
-
- if ((usaOffset & 1) != 0 || usaOffset + numUsaItems * 2 > ((UInt32)1 << sectorSizeLog) - 2 ||
- numUsaItems == 0 || numUsaItems - 1 != numSectors)
- return false;
-
- UInt16 usn = Get16(p + usaOffset);
- // PRF(printf("\nusn = %d", usn));
- for (UInt32 i = 1; i < numUsaItems; i++)
- {
- void *pp = p + (i << sectorSizeLog) - 2;
- if (Get16(pp) != usn)
- return false;
- SetUi16(pp, Get16(p + usaOffset + i * 2));
- }
-
- // G64(p + 0x08, Lsn);
- G16(p + 0x10, SeqNumber);
- // G16(p + 0x12, LinkCount);
- // PRF(printf(" L=%d", LinkCount));
- UInt32 attrOffs = Get16(p + 0x14);
- G16(p + 0x16, Flags);
- PRF(printf(" F=%4X", Flags));
-
- UInt32 bytesInUse = Get32(p + 0x18);
- UInt32 bytesAlloc = Get32(p + 0x1C);
- G64(p + 0x20, BaseMftRef.Val);
- if (BaseMftRef.Val != 0)
- {
- PRF(printf(" BaseRef=%d", (int)BaseMftRef.Val));
- // return false; // Check it;
- }
- // G16(p + 0x28, NextAttrInstance);
- if (usaOffset >= 0x30)
- if (Get32(p + 0x2C) != recNumber) // NTFS 3.1+
- return false;
-
- UInt32 limit = numSectors << sectorSizeLog;
- if (attrOffs >= limit || (attrOffs & 7) != 0 || bytesInUse > limit
- || bytesAlloc != limit)
- return false;
-
-
- for (UInt32 t = attrOffs; t < limit;)
- {
- CAttr attr;
- // PRF(printf("\n %2d:", Attrs.Size()));
- PRF(printf("\n"));
- UInt32 length = attr.Parse(p + t, limit - t);
- if (length == 0 || limit - t < length)
- return false;
- t += length;
- if (attr.Type == 0xFFFFFFFF)
- break;
- switch(attr.Type)
- {
- case ATTR_TYPE_FILE_NAME:
- {
- CFileNameAttr fna;
- if (!attr.ParseFileName(fna))
- return false;
- FileNames.Add(fna);
- PRF(printf(" flags = %4x", (int)fna.NameType));
- PRF(printf("\n %S", fna.Name));
- break;
- }
- case ATTR_TYPE_STANDARD_INFO:
- if (!attr.ParseSi(SiAttr))
- return false;
- break;
- case ATTR_TYPE_DATA:
- DataAttrs.Add(attr);
- break;
- default:
- if (attrs)
- attrs->Add(attr);
- break;
- }
- }
-
- return true;
-}
-
-struct CItem
-{
- int RecIndex;
- int DataIndex;
- CMftRef ParentRef;
- UString Name;
- UInt32 Attrib;
-
- bool IsDir() const { return (DataIndex < 0); }
-};
-
-struct CDatabase
-{
- CHeader Header;
- CObjectVector<CItem> Items;
- CObjectVector<CMftRec> Recs;
- CMyComPtr<IInStream> InStream;
- IArchiveOpenCallback *OpenCallback;
-
- CByteBuffer ByteBuf;
-
- CObjectVector<CAttr> VolAttrs;
-
- ~CDatabase() { ClearAndClose(); }
-
- void Clear();
- void ClearAndClose();
-
- UString GetItemPath(Int32 index) const;
- HRESULT Open();
- HRESULT ReadDir(Int32 parent, UInt32 cluster, int level);
-
- HRESULT SeekToCluster(UInt64 cluster);
-
- int FindMtfRec(const CMftRef &ref) const
- {
- UInt64 val = ref.GetIndex();
- int left = 0, right = Items.Size();
- while (left != right)
- {
- int mid = (left + right) / 2;
- UInt64 midValue = Items[mid].RecIndex;
- if (val == midValue)
- return mid;
- if (val < midValue)
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
- }
-
-};
-
-HRESULT CDatabase::SeekToCluster(UInt64 cluster)
-{
- return InStream->Seek(cluster << Header.ClusterSizeLog, STREAM_SEEK_SET, NULL);
-}
-
-void CDatabase::Clear()
-{
- Items.Clear();
- Recs.Clear();
-}
-
-void CDatabase::ClearAndClose()
-{
- Clear();
- InStream.Release();
-}
-
-#define MY_DIR_PREFIX(x) L"[" x L"]" WSTRING_PATH_SEPARATOR
-
-UString CDatabase::GetItemPath(Int32 index) const
-{
- const CItem *item = &Items[index];
- UString name = item->Name;
- for (int j = 0; j < 256; j++)
- {
- CMftRef ref = item->ParentRef;
- index = FindMtfRec(ref);
- if (ref.GetIndex() == 5)
- return name;
- if (index < 0 || Recs[Items[index].RecIndex].SeqNumber != ref.GetNumber())
- return MY_DIR_PREFIX(L"UNKNOWN") + name;
- item = &Items[index];
- name = item->Name + WCHAR_PATH_SEPARATOR + name;
- }
- return MY_DIR_PREFIX(L"BAD") + name;
-}
-
-HRESULT CDatabase::Open()
-{
- Clear();
-
- static const UInt32 kHeaderSize = 512;
- Byte buf[kHeaderSize];
- RINOK(ReadStream_FALSE(InStream, buf, kHeaderSize));
- if (!Header.Parse(buf))
- return S_FALSE;
- UInt64 fileSize;
- RINOK(InStream->Seek(0, STREAM_SEEK_END, &fileSize));
- if (fileSize < Header.GetPhySize())
- return S_FALSE;
-
- SeekToCluster(Header.MftCluster);
-
- CMftRec mftRec;
- UInt32 numSectorsInRec;
- int recSizeLog;
- CMyComPtr<IInStream> mftStream;
- {
- UInt32 blockSize = 1 << 12;
- ByteBuf.SetCapacity(blockSize);
- RINOK(ReadStream_FALSE(InStream, ByteBuf, blockSize));
-
- UInt32 allocSize = Get32(ByteBuf + 0x1C);
- recSizeLog = GetLog(allocSize);
- if (recSizeLog < Header.SectorSizeLog)
- return false;
- numSectorsInRec = 1 << (recSizeLog - Header.SectorSizeLog);
- if (!mftRec.Parse(ByteBuf, Header.SectorSizeLog, numSectorsInRec, NULL, 0))
- return S_FALSE;
- if (!mftRec.IsFILE())
- return S_FALSE;
- mftRec.ParseDataNames();
- if (mftRec.DataRefs.IsEmpty())
- return S_FALSE;
- RINOK(mftRec.GetStream(InStream, 0, Header.ClusterSizeLog, Header.NumClusters, &mftStream));
- if (!mftStream)
- return S_FALSE;
- }
-
- UInt64 mftSize = mftRec.DataAttrs[0].Size;
- if ((mftSize >> 4) > Header.GetPhySize())
- return S_FALSE;
-
- UInt64 numFiles = mftSize >> recSizeLog;
- if (numFiles > (1 << 30))
- return S_FALSE;
- if (OpenCallback)
- {
- RINOK(OpenCallback->SetTotal(&numFiles, &mftSize));
- }
- const UInt32 kBufSize = (1 << 15);
- if (kBufSize < (1 << recSizeLog))
- return S_FALSE;
-
- ByteBuf.SetCapacity((size_t)kBufSize);
- Recs.Reserve((int)numFiles);
- for (UInt64 pos64 = 0;;)
- {
- if (OpenCallback)
- {
- UInt64 numFiles = Recs.Size();
- if ((numFiles & 0x3FF) == 0)
- {
- RINOK(OpenCallback->SetCompleted(&numFiles, &pos64));
- }
- }
- UInt32 readSize = kBufSize;
- UInt64 rem = mftSize - pos64;
- if (readSize > rem)
- readSize = (UInt32)rem;
- if (readSize < ((UInt32)1 << recSizeLog))
- break;
- RINOK(ReadStream_FALSE(mftStream, ByteBuf, (size_t)readSize));
- pos64 += readSize;
- for (int i = 0; ((UInt32)(i + 1) << recSizeLog) <= readSize; i++)
- {
- PRF(printf("\n---------------------"));
- PRF(printf("\n%5d:", Recs.Size()));
- Byte *p = ByteBuf + ((UInt32)i << recSizeLog);
- CMftRec rec;
- if (!rec.Parse(p, Header.SectorSizeLog, numSectorsInRec, (UInt32)Recs.Size(),
- (Recs.Size() == kRecIndex_Volume) ? &VolAttrs: NULL))
- return S_FALSE;
- Recs.Add(rec);
- }
- }
-
- int i;
- for (i = 0; i < Recs.Size(); i++)
- {
- CMftRec &rec = Recs[i];
- if (!rec.BaseMftRef.IsBaseItself())
- {
- UInt64 refIndex = rec.BaseMftRef.GetIndex();
- if (refIndex > (UInt32)Recs.Size())
- return S_FALSE;
- CMftRec &refRec = Recs[(int)refIndex];
- bool moveAttrs = (refRec.SeqNumber == rec.BaseMftRef.GetNumber() && refRec.BaseMftRef.IsBaseItself());
- if (rec.InUse() && refRec.InUse())
- {
- if (!moveAttrs)
- return S_FALSE;
- }
- else if (rec.InUse() || refRec.InUse())
- moveAttrs = false;
- if (moveAttrs)
- refRec.MoveAttrsFrom(rec);
- }
- }
-
- for (i = 0; i < Recs.Size(); i++)
- Recs[i].ParseDataNames();
-
- for (i = 0; i < Recs.Size(); i++)
- {
- CMftRec &rec = Recs[i];
- if (!rec.IsFILE() || !rec.BaseMftRef.IsBaseItself())
- continue;
- int numNames = 0;
- // printf("\n%4d: ", i);
- for (int t = 0; t < rec.FileNames.Size(); t++)
- {
- const CFileNameAttr &fna = rec.FileNames[t];
- // printf("%4d %S | ", (int)fna.NameType, fna.Name);
- if (fna.IsDos())
- continue;
- int numDatas = rec.DataRefs.Size();
-
- // For hard linked files we show substreams only for first Name.
- if (numDatas > 1 && numNames > 0)
- numDatas = 1;
- numNames++;
-
- if (rec.IsDir())
- {
- CItem item;
- item.Name = fna.Name;
- item.RecIndex = i;
- item.DataIndex = -1;
- item.ParentRef = fna.ParentDirRef;
- item.Attrib = rec.SiAttr.Attrib | 0x10;
- // item.Attrib = fna.Attrib;
- Items.Add(item);
- }
- for (int di = 0; di < numDatas; di++)
- {
- CItem item;
- item.Name = fna.Name;
- item.Attrib = rec.SiAttr.Attrib;
- const UString &subName = rec.DataAttrs[rec.DataRefs[di].Start].Name;
- if (!subName.IsEmpty())
- {
- // $BadClus:$Bad is sparse file for all clusters. So we skip it.
- if (i == kRecIndex_BadClus && subName == L"$Bad")
- continue;
- item.Name += L":";
- item.Name += subName;
- item.Attrib = fna.Attrib;
- }
-
- PRF(printf("\n%3d", i));
- PRF(printf(" attrib=%2x", rec.SiAttr.Attrib));
- PRF(printf(" %S", item.Name));
-
- item.RecIndex = i;
- item.DataIndex = di;
- item.ParentRef = fna.ParentDirRef;
-
- Items.Add(item);
- rec.MyNumNameLinks++;
- }
- }
- rec.FileNames.ClearAndFree();
- }
-
- return S_OK;
-}
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp,
- CDatabase
-{
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- IInStream *stream2;
- const CItem &item = Items[index];
- const CMftRec &rec = Recs[item.RecIndex];
- HRESULT res = rec.GetStream(InStream, item.DataIndex, Header.ClusterSizeLog, Header.NumClusters, &stream2);
- *stream = (ISequentialInStream *)stream2;
- return res;
- COM_TRY_END
-}
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidLinks, VT_UI4},
- { NULL, kpidNumBlocks, VT_UI4}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidVolumeName, VT_BSTR},
- { NULL, kpidFileSystem, VT_BSTR},
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME},
-
- { NULL, kpidSectorSize, VT_UI4},
- { NULL, kpidId, VT_UI8}
- // { NULL, kpidSectorsPerTrack, VT_UI4},
- // { NULL, kpidNumHeads, VT_UI4},
- // { NULL, kpidHiddenSectors, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-static void NtfsTimeToProp(UInt64 t, NWindows::NCOM::CPropVariant &prop)
-{
- FILETIME ft;
- ft.dwLowDateTime = (DWORD)t;
- ft.dwHighDateTime = (DWORD)(t >> 32);
- prop = ft;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- const CMftRec *volRec = (Recs.Size() > kRecIndex_Volume ? &Recs[kRecIndex_Volume] : NULL);
-
- switch(propID)
- {
- case kpidClusterSize: prop = Header.ClusterSize(); break;
- case kpidPhySize: prop = Header.GetPhySize(); break;
- /*
- case kpidHeadersSize:
- {
- UInt64 val = 0;
- for (int i = 0; i < kNumSysRecs; i++)
- {
- printf("\n%2d: %8I64d ", i, Recs[i].GetPackSize());
- if (i == 8)
- i = i
- val += Recs[i].GetPackSize();
- }
- prop = val;
- break;
- }
- */
- case kpidCTime: if (volRec) NtfsTimeToProp(volRec->SiAttr.CTime, prop); break;break;
- case kpidVolumeName:
- {
- for (int i = 0; i < VolAttrs.Size(); i++)
- {
- const CAttr &attr = VolAttrs[i];
- if (attr.Type == ATTR_TYPE_VOLUME_NAME)
- {
- UString name;
- GetString(attr.Data, (int)attr.Data.GetCapacity() / 2, name);
- prop = name;
- break;
- }
- }
- break;
- }
- case kpidFileSystem:
- {
- AString s = "NTFS";
- for (int i = 0; i < VolAttrs.Size(); i++)
- {
- const CAttr &attr = VolAttrs[i];
- if (attr.Type == ATTR_TYPE_VOLUME_INFO)
- {
- CVolInfo vi;
- if (attr.ParseVolInfo(vi))
- {
- s += ' ';
- char temp[16];
- ConvertUInt32ToString(vi.MajorVer, temp);
- s += temp;
- s += '.';
- ConvertUInt32ToString(vi.MinorVer, temp);
- s += temp;
- }
- break;
- }
- }
- prop = s;
- break;
- }
- case kpidSectorSize: prop = (UInt32)1 << Header.SectorSizeLog; break;
- case kpidId: prop = Header.SerialNumber; break;
- // case kpidMediaType: prop = Header.MediaType; break;
- // case kpidSectorsPerTrack: prop = Header.SectorsPerTrack; break;
- // case kpidNumHeads: prop = Header.NumHeads; break;
- // case kpidHiddenSectors: prop = Header.NumHiddenSectors; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = Items[index];
- const CMftRec &rec = Recs[item.RecIndex];
-
- const CAttr *data= NULL;
- if (item.DataIndex >= 0)
- data = &rec.DataAttrs[rec.DataRefs[item.DataIndex].Start];
-
- switch(propID)
- {
- case kpidPath:
- {
- UString name = GetItemPath(index);
- const wchar_t *prefix = NULL;
- if (!rec.InUse())
- prefix = MY_DIR_PREFIX(L"DELETED");
- else if (item.RecIndex < kNumSysRecs)
- prefix = MY_DIR_PREFIX(L"SYSTEM");
- if (prefix)
- name = prefix + name;
- prop = name;
- break;
- }
-
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidMTime: NtfsTimeToProp(rec.SiAttr.MTime, prop); break;
-
- case kpidCTime: NtfsTimeToProp(rec.SiAttr.CTime, prop); break;
- case kpidATime: NtfsTimeToProp(rec.SiAttr.ATime, prop); break;
- case kpidAttrib:
- prop = item.Attrib;
- break;
- case kpidLinks: prop = rec.MyNumNameLinks; break;
- case kpidSize: if (data) prop = data->GetSize(); break;
- case kpidPackSize: if (data) prop = data->GetPackSize(); break;
- case kpidNumBlocks: if (data) prop = (UInt32)rec.GetNumExtents(item.DataIndex, Header.ClusterSizeLog, Header.NumClusters); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- {
- OpenCallback = callback;
- InStream = stream;
- HRESULT res;
- try
- {
- res = CDatabase::Open();
- if (res == S_OK)
- return S_OK;
- }
- catch(...)
- {
- Close();
- throw;
- }
- Close();
- return res;
- }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- ClearAndClose();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = Items.Size();
- if (numItems == 0)
- return S_OK;
- UInt32 i;
- UInt64 totalSize = 0;
- for (i = 0; i < numItems; i++)
- {
- const CItem &item = Items[allFilesMode ? i : indices[i]];
- const CMftRec &rec = Recs[item.RecIndex];
- if (!rec.IsDir())
- totalSize += rec.GetSize(item.DataIndex);
- }
- RINOK(extractCallback->SetTotal(totalSize));
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- CByteBuffer buf;
- UInt32 clusterSize = Header.ClusterSize();
- buf.SetCapacity(clusterSize);
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- const CItem &item = Items[index];
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init();
-
- const CMftRec &rec = Recs[item.RecIndex];
- const CAttr &data = rec.DataAttrs[rec.DataRefs[item.DataIndex].Start];
-
- int res = NExtract::NOperationResult::kDataError;
- {
- CMyComPtr<IInStream> inStream;
- HRESULT hres = rec.GetStream(InStream, item.DataIndex, Header.ClusterSizeLog, Header.NumClusters, &inStream);
- if (hres == S_FALSE)
- res = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- RINOK(hres);
- if (inStream)
- {
- HRESULT hres = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (hres != S_OK && hres != S_FALSE)
- {
- RINOK(hres);
- }
- if (/* copyCoderSpec->TotalSize == item.GetSize() && */ hres == S_OK)
- res = NExtract::NOperationResult::kOK;
- }
- }
- }
- totalPackSize += data.GetPackSize();
- totalSize += data.GetSize();
- outStreamSpec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = Items.Size();
- return S_OK;
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"NTFS", L"ntfs img", 0, 0xD9, { 'N', 'T', 'F', 'S', ' ', ' ', ' ', ' ', 0 }, 9, false, CreateArc, 0 };
-
-REGISTER_ARC(Fat)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/PeHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/PeHandler.cpp
deleted file mode 100644
index c64067aa5..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/PeHandler.cpp
+++ /dev/null
@@ -1,1752 +0,0 @@
-// PeHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/DynamicBuffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariantUtils.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NPe {
-
-#define NUM_SCAN_SECTIONS_MAX (1 << 6)
-
-#define PE_SIG 0x00004550
-#define PE_OptHeader_Magic_32 0x10B
-#define PE_OptHeader_Magic_64 0x20B
-
-static AString GetDecString(UInt32 v)
-{
- char sz[32];
- ConvertUInt64ToString(v, sz);
- return sz;
-}
-
-struct CVersion
-{
- UInt16 Major;
- UInt16 Minor;
-
- void Parse(const Byte *buf);
- AString GetString() const { return GetDecString(Major) + '.' + GetDecString(Minor); }
-};
-
-void CVersion::Parse(const Byte *p)
-{
- Major = Get16(p);
- Minor = Get16(p + 2);
-}
-
-static const UInt32 kHeaderSize = 4 + 20;
-
-struct CHeader
-{
- UInt16 NumSections;
- UInt32 Time;
- UInt32 PointerToSymbolTable;
- UInt32 NumSymbols;
- UInt16 OptHeaderSize;
- UInt16 Flags;
- UInt16 Machine;
-
- bool Parse(const Byte *buf);
-};
-
-bool CHeader::Parse(const Byte *p)
-{
- if (Get32(p) != PE_SIG)
- return false;
- p += 4;
- Machine = Get16(p + 0);
- NumSections = Get16(p + 2);
- Time = Get32(p + 4);
- PointerToSymbolTable = Get32(p + 8);
- NumSymbols = Get32(p + 12);
- OptHeaderSize = Get16(p + 16);
- Flags = Get16(p + 18);
- return true;
-}
-
-struct CDirLink
-{
- UInt32 Va;
- UInt32 Size;
- void Parse(const Byte *p);
-};
-
-void CDirLink::Parse(const Byte *p)
-{
- Va = Get32(p);
- Size = Get32(p + 4);
-}
-
-enum
-{
- kDirLink_Certificate = 4,
- kDirLink_Debug = 6
-};
-
-struct CDebugEntry
-{
- UInt32 Flags;
- UInt32 Time;
- CVersion Ver;
- UInt32 Type;
- UInt32 Size;
- UInt32 Va;
- UInt32 Pa;
-
- void Parse(const Byte *p);
-};
-
-void CDebugEntry::Parse(const Byte *p)
-{
- Flags = Get32(p);
- Time = Get32(p + 4);
- Ver.Parse(p + 8);
- Type = Get32(p + 12);
- Size = Get32(p + 16);
- Va = Get32(p + 20);
- Pa = Get32(p + 24);
-}
-
-static const UInt32 kNumDirItemsMax = 16;
-
-struct COptHeader
-{
- UInt16 Magic;
- Byte LinkerVerMajor;
- Byte LinkerVerMinor;
-
- UInt32 CodeSize;
- UInt32 InitDataSize;
- UInt32 UninitDataSize;
-
- // UInt32 AddressOfEntryPoint;
- // UInt32 BaseOfCode;
- // UInt32 BaseOfData32;
- UInt64 ImageBase;
-
- UInt32 SectAlign;
- UInt32 FileAlign;
-
- CVersion OsVer;
- CVersion ImageVer;
- CVersion SubsysVer;
-
- UInt32 ImageSize;
- UInt32 HeadersSize;
- UInt32 CheckSum;
- UInt16 SubSystem;
- UInt16 DllCharacts;
-
- UInt64 StackReserve;
- UInt64 StackCommit;
- UInt64 HeapReserve;
- UInt64 HeapCommit;
-
- UInt32 NumDirItems;
- CDirLink DirItems[kNumDirItemsMax];
-
- bool Is64Bit() const { return Magic == PE_OptHeader_Magic_64; }
- bool Parse(const Byte *p, UInt32 size);
-
- int GetNumFileAlignBits() const
- {
- for (int i = 9; i <= 16; i++)
- if (((UInt32)1 << i) == FileAlign)
- return i;
- return -1;
- }
-};
-
-bool COptHeader::Parse(const Byte *p, UInt32 size)
-{
- Magic = Get16(p);
- switch (Magic)
- {
- case PE_OptHeader_Magic_32:
- case PE_OptHeader_Magic_64:
- break;
- default:
- return false;
- }
- LinkerVerMajor = p[2];
- LinkerVerMinor = p[3];
-
- bool hdr64 = Is64Bit();
-
- CodeSize = Get32(p + 4);
- InitDataSize = Get32(p + 8);
- UninitDataSize = Get32(p + 12);
-
- // AddressOfEntryPoint = Get32(p + 16);
- // BaseOfCode = Get32(p + 20);
- // BaseOfData32 = hdr64 ? 0: Get32(p + 24);
- ImageBase = hdr64 ? GetUi64(p + 24) : Get32(p + 28);
-
- SectAlign = Get32(p + 32);
- FileAlign = Get32(p + 36);
-
- OsVer.Parse(p + 40);
- ImageVer.Parse(p + 44);
- SubsysVer.Parse(p + 48);
-
- // reserved = Get32(p + 52);
-
- ImageSize = Get32(p + 56);
- HeadersSize = Get32(p + 60);
- CheckSum = Get32(p + 64);
- SubSystem = Get16(p + 68);
- DllCharacts = Get16(p + 70);
-
- if (hdr64)
- {
- StackReserve = Get64(p + 72);
- StackCommit = Get64(p + 80);
- HeapReserve = Get64(p + 88);
- HeapCommit = Get64(p + 96);
- }
- else
- {
- StackReserve = Get32(p + 72);
- StackCommit = Get32(p + 76);
- HeapReserve = Get32(p + 80);
- HeapCommit = Get32(p + 84);
- }
- UInt32 pos = (hdr64 ? 108 : 92);
- NumDirItems = Get32(p + pos);
- pos += 4;
- if (pos + 8 * NumDirItems != size)
- return false;
- for (UInt32 i = 0; i < NumDirItems && i < kNumDirItemsMax; i++)
- DirItems[i].Parse(p + pos + i * 8);
- return true;
-}
-
-static const UInt32 kSectionSize = 40;
-
-struct CSection
-{
- AString Name;
-
- UInt32 VSize;
- UInt32 Va;
- UInt32 PSize;
- UInt32 Pa;
- UInt32 Flags;
- UInt32 Time;
- // UInt16 NumRelocs;
- bool IsDebug;
- bool IsRealSect;
- bool IsAdditionalSection;
-
- CSection(): IsRealSect(false), IsDebug(false), IsAdditionalSection(false) {}
- UInt64 GetPackSize() const { return PSize; }
-
- void UpdateTotalSize(UInt32 &totalSize)
- {
- UInt32 t = Pa + PSize;
- if (t > totalSize)
- totalSize = t;
- }
- void Parse(const Byte *p);
-};
-
-static bool operator <(const CSection &a1, const CSection &a2) { return (a1.Pa < a2.Pa) || ((a1.Pa == a2.Pa) && (a1.PSize < a2.PSize)) ; }
-static bool operator ==(const CSection &a1, const CSection &a2) { return (a1.Pa == a2.Pa) && (a1.PSize == a2.PSize); }
-
-static AString GetName(const Byte *name)
-{
- const int kNameSize = 8;
- AString res;
- char *p = res.GetBuffer(kNameSize);
- memcpy(p, name, kNameSize);
- p[kNameSize] = 0;
- res.ReleaseBuffer();
- return res;
-}
-
-void CSection::Parse(const Byte *p)
-{
- Name = GetName(p);
- VSize = Get32(p + 8);
- Va = Get32(p + 12);
- PSize = Get32(p + 16);
- Pa = Get32(p + 20);
- // NumRelocs = Get16(p + 32);
- Flags = Get32(p + 36);
-}
-
-static const CUInt32PCharPair g_HeaderCharacts[] =
-{
- { 1, "Executable" },
- { 13, "DLL" },
- { 8, "32-bit" },
- { 5, "LargeAddress" },
- { 0, "NoRelocs" },
- { 2, "NoLineNums" },
- { 3, "NoLocalSyms" },
- { 4, "AggressiveWsTrim" },
- { 9, "NoDebugInfo" },
- { 10, "RemovableRun" },
- { 11, "NetRun" },
- { 12, "System" },
- { 14, "UniCPU" },
- { 7, "Little-Endian" },
- { 15, "Big-Endian" }
-};
-
-static const CUInt32PCharPair g_DllCharacts[] =
-{
- { 6, "Relocated" },
- { 7, "Integrity" },
- { 8, "NX-Compatible" },
- { 9, "NoIsolation" },
- { 10, "NoSEH" },
- { 11, "NoBind" },
- { 13, "WDM" },
- { 15, "TerminalServerAware" }
-};
-
-static const CUInt32PCharPair g_SectFlags[] =
-{
- { 3, "NoPad" },
- { 5, "Code" },
- { 6, "InitializedData" },
- { 7, "UninitializedData" },
- { 9, "Comments" },
- { 11, "Remove" },
- { 12, "COMDAT" },
- { 15, "GP" },
- { 24, "ExtendedRelocations" },
- { 25, "Discardable" },
- { 26, "NotCached" },
- { 27, "NotPaged" },
- { 28, "Shared" },
- { 29, "Execute" },
- { 30, "Read" },
- { 31, "Write" }
-};
-
-static const CUInt32PCharPair g_MachinePairs[] =
-{
- { 0x014C, "x86" },
- { 0x0162, "MIPS-R3000" },
- { 0x0166, "MIPS-R4000" },
- { 0x0168, "MIPS-R10000" },
- { 0x0169, "MIPS-V2" },
- { 0x0184, "Alpha" },
- { 0x01A2, "SH3" },
- { 0x01A3, "SH3-DSP" },
- { 0x01A4, "SH3E" },
- { 0x01A6, "SH4" },
- { 0x01A8, "SH5" },
- { 0x01C0, "ARM" },
- { 0x01C2, "ARM-Thumb" },
- { 0x01F0, "PPC" },
- { 0x01F1, "PPC-FP" },
- { 0x0200, "IA-64" },
- { 0x0284, "Alpha-64" },
- { 0x0200, "IA-64" },
- { 0x0366, "MIPSFPU" },
- { 0x8664, "x64" },
- { 0x0EBC, "EFI" }
-};
-
-static const CUInt32PCharPair g_SubSystems[] =
-{
- { 0, "Unknown" },
- { 1, "Native" },
- { 2, "Windows GUI" },
- { 3, "Windows CUI" },
- { 7, "Posix" },
- { 9, "Windows CE" },
- { 10, "EFI" },
- { 11, "EFI Boot" },
- { 12, "EFI Runtime" },
- { 13, "EFI ROM" },
- { 14, "XBOX" }
-};
-
-static const wchar_t *g_ResTypes[] =
-{
- NULL,
- L"CURSOR",
- L"BITMAP",
- L"ICON",
- L"MENU",
- L"DIALOG",
- L"STRING",
- L"FONTDIR",
- L"FONT",
- L"ACCELERATOR",
- L"RCDATA",
- L"MESSAGETABLE",
- L"GROUP_CURSOR",
- NULL,
- L"GROUP_ICON",
- NULL,
- L"VERSION",
- L"DLGINCLUDE",
- NULL,
- L"PLUGPLAY",
- L"VXD",
- L"ANICURSOR",
- L"ANIICON",
- L"HTML",
- L"MANIFEST"
-};
-
-const UInt32 kFlag = (UInt32)1 << 31;
-const UInt32 kMask = ~kFlag;
-
-struct CTableItem
-{
- UInt32 Offset;
- UInt32 ID;
-};
-
-
-const UInt32 kBmpHeaderSize = 14;
-const UInt32 kIconHeaderSize = 22;
-
-struct CResItem
-{
- UInt32 Type;
- UInt32 ID;
- UInt32 Lang;
-
- UInt32 Size;
- UInt32 Offset;
-
- UInt32 HeaderSize;
- Byte Header[kIconHeaderSize]; // it must be enough for max size header.
- bool Enabled;
-
- bool IsNameEqual(const CResItem &item) const { return Lang == item.Lang; }
- UInt32 GetSize() const { return Size + HeaderSize; }
- bool IsBmp() const { return Type == 2; }
- bool IsIcon() const { return Type == 3; }
- bool IsString() const { return Type == 6; }
- bool IsRcData() const { return Type == 10; }
- bool IsRcDataOrUnknown() const { return IsRcData() || Type > 64; }
-};
-
-struct CStringItem
-{
- UInt32 Lang;
- UInt32 Size;
- CByteDynamicBuffer Buf;
-
- void AddChar(Byte c);
- void AddWChar(UInt16 c);
-};
-
-void CStringItem::AddChar(Byte c)
-{
- Buf.EnsureCapacity(Size + 2);
- Buf[Size++] = c;
- Buf[Size++] = 0;
-}
-
-void CStringItem::AddWChar(UInt16 c)
-{
- if (c == '\n')
- {
- AddChar('\\');
- c = 'n';
- }
- Buf.EnsureCapacity(Size + 2);
- SetUi16(Buf + Size, c);
- Size += 2;
-}
-
-struct CMixItem
-{
- int SectionIndex;
- int ResourceIndex;
- int StringIndex;
-
- bool IsSectionItem() const { return ResourceIndex < 0 && StringIndex < 0; };
-};
-
-struct CUsedBitmap
-{
- CByteBuffer Buf;
-public:
- void Alloc(size_t size)
- {
- size = (size + 7) / 8;
- Buf.SetCapacity(size);
- memset(Buf, 0, size);
- }
- void Free()
- {
- Buf.SetCapacity(0);
- }
- bool SetRange(size_t from, int size)
- {
- for (int i = 0; i < size; i++)
- {
- size_t pos = (from + i) >> 3;
- Byte mask = (Byte)(1 << ((from + i) & 7));
- Byte b = Buf[pos];
- if ((b & mask) != 0)
- return false;
- Buf[pos] = b | mask;
- }
- return true;
- }
-};
-
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- CObjectVector<CSection> _sections;
- UInt32 _peOffset;
- CHeader _header;
- COptHeader _optHeader;
- UInt32 _totalSize;
- UInt32 _totalSizeLimited;
- Int32 _mainSubfile;
-
- CRecordVector<CResItem> _items;
- CObjectVector<CStringItem> _strings;
-
- CByteBuffer _buf;
- bool _oneLang;
- UString _resourceFileName;
- CUsedBitmap _usedRes;
- bool _parseResources;
-
- CRecordVector<CMixItem> _mixItems;
-
- HRESULT LoadDebugSections(IInStream *stream, bool &thereIsSection);
- HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback);
- bool Parse(const Byte *buf, UInt32 size);
-
- void AddResNameToString(UString &s, UInt32 id) const;
- UString GetLangPrefix(UInt32 lang);
- HRESULT ReadString(UInt32 offset, UString &dest) const;
- HRESULT ReadTable(UInt32 offset, CRecordVector<CTableItem> &items);
- bool ParseStringRes(UInt32 id, UInt32 lang, const Byte *src, UInt32 size);
- HRESULT OpenResources(int sectIndex, IInStream *stream, IArchiveOpenCallback *callback);
- void CloseResources();
-
-
- bool CheckItem(const CSection &sect, const CResItem &item, size_t offset) const
- {
- return item.Offset >= sect.Va && offset <= _buf.GetCapacity() && _buf.GetCapacity() - offset >= item.Size;
- }
-
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-bool CHandler::Parse(const Byte *buf, UInt32 size)
-{
- UInt32 i;
- if (size < 512)
- return false;
- _peOffset = Get32(buf + 0x3C);
- if (_peOffset >= 0x1000 || _peOffset + 512 > size || (_peOffset & 7) != 0)
- return false;
-
- UInt32 pos = _peOffset;
- if (!_header.Parse(buf + pos))
- return false;
- if (_header.OptHeaderSize > 512 || _header.NumSections > NUM_SCAN_SECTIONS_MAX)
- return false;
- pos += kHeaderSize;
-
- if (!_optHeader.Parse(buf + pos, _header.OptHeaderSize))
- return false;
-
- pos += _header.OptHeaderSize;
- _totalSize = pos;
-
- for (i = 0; i < _header.NumSections; i++, pos += kSectionSize)
- {
- CSection sect;
- if (pos + kSectionSize > size)
- return false;
- sect.Parse(buf + pos);
- sect.IsRealSect = true;
- sect.UpdateTotalSize(_totalSize);
- _sections.Add(sect);
- }
-
- return true;
-}
-
-enum
-{
- kpidSectAlign = kpidUserDefined,
- kpidFileAlign,
- kpidLinkerVer,
- kpidOsVer,
- kpidImageVer,
- kpidSubsysVer,
- kpidCodeSize,
- kpidImageSize,
- kpidInitDataSize,
- kpidUnInitDataSize,
- kpidHeadersSizeUnInitDataSize,
- kpidSubSystem,
- kpidDllCharacts,
- kpidStackReserve,
- kpidStackCommit,
- kpidHeapReserve,
- kpidHeapCommit,
- kpidImageBase
- // kpidAddressOfEntryPoint,
- // kpidBaseOfCode,
- // kpidBaseOfData32,
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidCpu, VT_BSTR},
- { NULL, kpidBit64, VT_BOOL},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidPhySize, VT_UI4},
- { NULL, kpidHeadersSize, VT_UI4},
- { NULL, kpidChecksum, VT_UI4},
- { L"Image Size", kpidImageSize, VT_UI4},
- { L"Section Alignment", kpidSectAlign, VT_UI4},
- { L"File Alignment", kpidFileAlign, VT_UI4},
- { L"Code Size", kpidCodeSize, VT_UI4},
- { L"Initialized Data Size", kpidInitDataSize, VT_UI4},
- { L"Uninitialized Data Size", kpidUnInitDataSize, VT_UI4},
- { L"Linker Version", kpidLinkerVer, VT_BSTR},
- { L"OS Version", kpidOsVer, VT_BSTR},
- { L"Image Version", kpidImageVer, VT_BSTR},
- { L"Subsystem Version", kpidSubsysVer, VT_BSTR},
- { L"Subsystem", kpidSubSystem, VT_BSTR},
- { L"DLL Characteristics", kpidDllCharacts, VT_BSTR},
- { L"Stack Reserve", kpidStackReserve, VT_UI8},
- { L"Stack Commit", kpidStackCommit, VT_UI8},
- { L"Heap Reserve", kpidHeapReserve, VT_UI8},
- { L"Heap Commit", kpidHeapCommit, VT_UI8},
- { L"Image Base", kpidImageBase, VT_UI8}
- // { L"Address Of Entry Point", kpidAddressOfEntryPoint, VT_UI8},
- // { L"Base Of Code", kpidBaseOfCode, VT_UI8},
- // { L"Base Of Data", kpidBaseOfData32, VT_UI8},
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidOffset, VT_UI8},
- { NULL, kpidVa, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_WITH_NAME
-
-static void VerToProp(const CVersion &v, NCOM::CPropVariant &prop)
-{
- StringToProp(v.GetString(), prop);
-}
-
-void TimeToProp(UInt32 unixTime, NCOM::CPropVariant &prop)
-{
- if (unixTime != 0)
- {
- FILETIME ft;
- NTime::UnixTimeToFileTime(unixTime, ft);
- prop = ft;
- }
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidSectAlign: prop = _optHeader.SectAlign; break;
- case kpidFileAlign: prop = _optHeader.FileAlign; break;
- case kpidLinkerVer:
- {
- CVersion v = { _optHeader.LinkerVerMajor, _optHeader.LinkerVerMinor };
- VerToProp(v, prop);
- break;
- }
-
- case kpidOsVer: VerToProp(_optHeader.OsVer, prop); break;
- case kpidImageVer: VerToProp(_optHeader.ImageVer, prop); break;
- case kpidSubsysVer: VerToProp(_optHeader.SubsysVer, prop); break;
- case kpidCodeSize: prop = _optHeader.CodeSize; break;
- case kpidInitDataSize: prop = _optHeader.InitDataSize; break;
- case kpidUnInitDataSize: prop = _optHeader.UninitDataSize; break;
- case kpidImageSize: prop = _optHeader.ImageSize; break;
- case kpidPhySize: prop = _totalSize; break;
- case kpidHeadersSize: prop = _optHeader.HeadersSize; break;
- case kpidChecksum: prop = _optHeader.CheckSum; break;
-
- case kpidCpu: PAIR_TO_PROP(g_MachinePairs, _header.Machine, prop); break;
- case kpidBit64: if (_optHeader.Is64Bit()) prop = true; break;
- case kpidSubSystem: PAIR_TO_PROP(g_SubSystems, _optHeader.SubSystem, prop); break;
-
- case kpidMTime:
- case kpidCTime: TimeToProp(_header.Time, prop); break;
- case kpidCharacts: FLAGS_TO_PROP(g_HeaderCharacts, _header.Flags, prop); break;
- case kpidDllCharacts: FLAGS_TO_PROP(g_DllCharacts, _optHeader.DllCharacts, prop); break;
- case kpidStackReserve: prop = _optHeader.StackReserve; break;
- case kpidStackCommit: prop = _optHeader.StackCommit; break;
- case kpidHeapReserve: prop = _optHeader.HeapReserve; break;
- case kpidHeapCommit: prop = _optHeader.HeapCommit; break;
-
- case kpidImageBase: prop = _optHeader.ImageBase; break;
- // case kpidAddressOfEntryPoint: prop = _optHeader.AddressOfEntryPoint; break;
- // case kpidBaseOfCode: prop = _optHeader.BaseOfCode; break;
- // case kpidBaseOfData32: if (!_optHeader.Is64Bit()) prop = _optHeader.BaseOfData32; break;
-
- case kpidMainSubfile: if (_mainSubfile >= 0) prop = (UInt32)_mainSubfile; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-void CHandler::AddResNameToString(UString &s, UInt32 id) const
-{
- if ((id & kFlag) != 0)
- {
- UString name;
- if (ReadString(id & kMask, name) == S_OK)
- {
- if (name.IsEmpty())
- s += L"[]";
- else
- {
- if (name.Length() > 1 && name[0] == '"' && name.Back() == '"')
- name = name.Mid(1, name.Length() - 2);
- s += name;
- }
- return;
- }
- }
- wchar_t sz[32];
- ConvertUInt32ToString(id, sz);
- s += sz;
-}
-
-UString CHandler::GetLangPrefix(UInt32 lang)
-{
- UString s = _resourceFileName;
- s += WCHAR_PATH_SEPARATOR;
- if (!_oneLang)
- {
- AddResNameToString(s, lang);
- s += WCHAR_PATH_SEPARATOR;
- }
- return s;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- const CMixItem &mixItem = _mixItems[index];
- if (mixItem.StringIndex >= 0)
- {
- const CStringItem &item = _strings[mixItem.StringIndex];
- switch(propID)
- {
- case kpidPath: prop = GetLangPrefix(item.Lang) + L"string.txt"; break;
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)item.Size; break;
- }
- }
- else if (mixItem.ResourceIndex < 0)
- {
- const CSection &item = _sections[mixItem.SectionIndex];
- switch(propID)
- {
- case kpidPath: StringToProp(item.Name, prop); break;
- case kpidSize: prop = (UInt64)item.VSize; break;
- case kpidPackSize: prop = (UInt64)item.GetPackSize(); break;
- case kpidOffset: prop = item.Pa; break;
- case kpidVa: if (item.IsRealSect) prop = item.Va; break;
- case kpidMTime:
- case kpidCTime:
- TimeToProp(item.IsDebug ? item.Time : _header.Time, prop); break;
- case kpidCharacts: if (item.IsRealSect) FLAGS_TO_PROP(g_SectFlags, item.Flags, prop); break;
- }
- }
- else
- {
- const CResItem &item = _items[mixItem.ResourceIndex];
- switch(propID)
- {
- case kpidPath:
- {
- UString s = GetLangPrefix(item.Lang);
- {
- const wchar_t *p = NULL;
- if (item.Type < sizeof(g_ResTypes) / sizeof(g_ResTypes[0]))
- p = g_ResTypes[item.Type];
- if (p != 0)
- s += p;
- else
- AddResNameToString(s, item.Type);
- }
- s += WCHAR_PATH_SEPARATOR;
- AddResNameToString(s, item.ID);
- if (item.HeaderSize != 0)
- {
- if (item.IsBmp())
- s += L".bmp";
- else if (item.IsIcon())
- s += L".ico";
- }
- prop = s;
- break;
- }
- case kpidSize: prop = (UInt64)item.GetSize(); break;
- case kpidPackSize: prop = (UInt64)item.Size; break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::LoadDebugSections(IInStream *stream, bool &thereIsSection)
-{
- thereIsSection = false;
- const CDirLink &debugLink = _optHeader.DirItems[kDirLink_Debug];
- if (debugLink.Size == 0)
- return S_OK;
- const unsigned kEntrySize = 28;
- UInt32 numItems = debugLink.Size / kEntrySize;
- if (numItems * kEntrySize != debugLink.Size || numItems > 16)
- return S_FALSE;
-
- UInt64 pa = 0;
- int i;
- for (i = 0; i < _sections.Size(); i++)
- {
- const CSection &sect = _sections[i];
- if (sect.Va < debugLink.Va && debugLink.Va + debugLink.Size <= sect.Va + sect.PSize)
- {
- pa = sect.Pa + (debugLink.Va - sect.Va);
- break;
- }
- }
- if (i == _sections.Size())
- {
- return S_OK;
- // Exe for ARM requires S_OK
- // return S_FALSE;
- }
-
- CByteBuffer buffer;
- buffer.SetCapacity(debugLink.Size);
- Byte *buf = buffer;
-
- RINOK(stream->Seek(pa, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(stream, buf, debugLink.Size));
-
- for (i = 0; i < (int)numItems; i++)
- {
- CDebugEntry de;
- de.Parse(buf);
-
- if (de.Size == 0)
- continue;
-
- CSection sect;
- sect.Name = ".debug" + GetDecString(i);
-
- sect.IsDebug = true;
- sect.Time = de.Time;
- sect.Va = de.Va;
- sect.Pa = de.Pa;
- sect.PSize = sect.VSize = de.Size;
- UInt32 totalSize = sect.Pa + sect.PSize;
- if (totalSize > _totalSize)
- {
- _totalSize = totalSize;
- _sections.Add(sect);
- thereIsSection = true;
- }
- buf += kEntrySize;
- }
-
- return S_OK;
-}
-
-HRESULT CHandler::ReadString(UInt32 offset, UString &dest) const
-{
- if ((offset & 1) != 0 || offset >= _buf.GetCapacity())
- return S_FALSE;
- size_t rem = _buf.GetCapacity() - offset;
- if (rem < 2)
- return S_FALSE;
- unsigned length = Get16(_buf + offset);
- if ((rem - 2) / 2 < length)
- return S_FALSE;
- dest.Empty();
- offset += 2;
- for (unsigned i = 0; i < length; i++)
- dest += (wchar_t)Get16(_buf + offset + i * 2);
- return S_OK;
-}
-
-HRESULT CHandler::ReadTable(UInt32 offset, CRecordVector<CTableItem> &items)
-{
- if ((offset & 3) != 0 || offset >= _buf.GetCapacity())
- return S_FALSE;
- size_t rem = _buf.GetCapacity() - offset;
- if (rem < 16)
- return S_FALSE;
- items.Clear();
- unsigned numNameItems = Get16(_buf + offset + 12);
- unsigned numIdItems = Get16(_buf + offset + 14);
- unsigned numItems = numNameItems + numIdItems;
- if ((rem - 16) / 8 < numItems)
- return S_FALSE;
- if (!_usedRes.SetRange(offset, 16 + numItems * 8))
- return S_FALSE;
- offset += 16;
- _oneLang = true;
- unsigned i;
- for (i = 0; i < numItems; i++)
- {
- CTableItem item;
- const Byte *buf = _buf + offset;
- offset += 8;
- item.ID = Get32(buf + 0);
- if (((item.ID & kFlag) != 0) != (i < numNameItems))
- return S_FALSE;
- item.Offset = Get32(buf + 4);
- items.Add(item);
- }
- return S_OK;
-}
-
-static const UInt32 kFileSizeMax = (UInt32)1 << 30;
-static const int kNumResItemsMax = (UInt32)1 << 23;
-static const int kNumStringLangsMax = 128;
-
-// BITMAPINFOHEADER
-struct CBitmapInfoHeader
-{
- // UInt32 HeaderSize;
- UInt32 XSize;
- Int32 YSize;
- UInt16 Planes;
- UInt16 BitCount;
- UInt32 Compression;
- UInt32 SizeImage;
-
- bool Parse(const Byte *p, size_t size);
-};
-
-static const UInt32 kBitmapInfoHeader_Size = 0x28;
-
-bool CBitmapInfoHeader::Parse(const Byte *p, size_t size)
-{
- if (size < kBitmapInfoHeader_Size || Get32(p) != kBitmapInfoHeader_Size)
- return false;
- XSize = Get32(p + 4);
- YSize = (Int32)Get32(p + 8);
- Planes = Get16(p + 12);
- BitCount = Get16(p + 14);
- Compression = Get32(p + 16);
- SizeImage = Get32(p + 20);
- return true;
-}
-
-static UInt32 GetImageSize(UInt32 xSize, UInt32 ySize, UInt32 bitCount)
-{
- return ((xSize * bitCount + 7) / 8 + 3) / 4 * 4 * ySize;
-}
-
-static UInt32 SetBitmapHeader(Byte *dest, const Byte *src, UInt32 size)
-{
- CBitmapInfoHeader h;
- if (!h.Parse(src, size))
- return 0;
- if (h.YSize < 0)
- h.YSize = -h.YSize;
- if (h.XSize > (1 << 26) || h.YSize > (1 << 26) || h.Planes != 1 || h.BitCount > 32 ||
- h.Compression != 0) // BI_RGB
- return 0;
- if (h.SizeImage == 0)
- h.SizeImage = GetImageSize(h.XSize, h.YSize, h.BitCount);
- UInt32 totalSize = kBmpHeaderSize + size;
- UInt32 offBits = totalSize - h.SizeImage;
- // BITMAPFILEHEADER
- SetUi16(dest, 0x4D42);
- SetUi32(dest + 2, totalSize);
- SetUi32(dest + 6, 0);
- SetUi32(dest + 10, offBits);
- return kBmpHeaderSize;
-}
-
-static UInt32 SetIconHeader(Byte *dest, const Byte *src, UInt32 size)
-{
- CBitmapInfoHeader h;
- if (!h.Parse(src, size))
- return 0;
- if (h.YSize < 0)
- h.YSize = -h.YSize;
- if (h.XSize > (1 << 26) || h.YSize > (1 << 26) || h.Planes != 1 ||
- h.Compression != 0) // BI_RGB
- return 0;
-
- UInt32 numBitCount = h.BitCount;
- if (numBitCount != 1 &&
- numBitCount != 4 &&
- numBitCount != 8 &&
- numBitCount != 24 &&
- numBitCount != 32)
- return 0;
-
- if ((h.YSize & 1) != 0)
- return 0;
- h.YSize /= 2;
- if (h.XSize > 0x100 || h.YSize > 0x100)
- return 0;
-
- UInt32 imageSize;
- // imageSize is not correct if AND mask array contains zeros
- // in this case it is equal image1Size
-
- // UInt32 imageSize = h.SizeImage;
- // if (imageSize == 0)
- // {
- UInt32 image1Size = GetImageSize(h.XSize, h.YSize, h.BitCount);
- UInt32 image2Size = GetImageSize(h.XSize, h.YSize, 1);
- imageSize = image1Size + image2Size;
- // }
- UInt32 numColors = 0;
- if (numBitCount < 16)
- numColors = 1 << numBitCount;
-
- SetUi16(dest, 0); // Reserved
- SetUi16(dest + 2, 1); // RES_ICON
- SetUi16(dest + 4, 1); // ResCount
-
- dest[6] = (Byte)h.XSize; // Width
- dest[7] = (Byte)h.YSize; // Height
- dest[8] = (Byte)numColors; // ColorCount
- dest[9] = 0; // Reserved
-
- SetUi32(dest + 10, 0); // Reserved1 / Reserved2
-
- UInt32 numQuadsBytes = numColors * 4;
- UInt32 BytesInRes = kBitmapInfoHeader_Size + numQuadsBytes + imageSize;
- SetUi32(dest + 14, BytesInRes);
- SetUi32(dest + 18, kIconHeaderSize);
-
- /*
- Description = DWORDToString(xSize) +
- kDelimiterChar + DWORDToString(ySize) +
- kDelimiterChar + DWORDToString(numBitCount);
- */
- return kIconHeaderSize;
-}
-
-bool CHandler::ParseStringRes(UInt32 id, UInt32 lang, const Byte *src, UInt32 size)
-{
- if ((size & 1) != 0)
- return false;
-
- int i;
- for (i = 0; i < _strings.Size(); i++)
- if (_strings[i].Lang == lang)
- break;
- if (i == _strings.Size())
- {
- if (_strings.Size() >= kNumStringLangsMax)
- return false;
- CStringItem item;
- item.Size = 0;
- item.Lang = lang;
- i = _strings.Add(item);
- }
-
- CStringItem &item = _strings[i];
- id = (id - 1) << 4;
- UInt32 pos = 0;
- for (i = 0; i < 16; i++)
- {
- if (size - pos < 2)
- return false;
- UInt32 len = Get16(src + pos);
- pos += 2;
- if (len != 0)
- {
- if (size - pos < len * 2)
- return false;
- char temp[32];
- ConvertUInt32ToString(id + i, temp);
- size_t tempLen = strlen(temp);
- size_t j;
- for (j = 0; j < tempLen; j++)
- item.AddChar(temp[j]);
- item.AddChar('\t');
- for (j = 0; j < len; j++, pos += 2)
- item.AddWChar(Get16(src + pos));
- item.AddChar(0x0D);
- item.AddChar(0x0A);
- }
- }
- return (size == pos);
-}
-
-HRESULT CHandler::OpenResources(int sectionIndex, IInStream *stream, IArchiveOpenCallback *callback)
-{
- const CSection &sect = _sections[sectionIndex];
- size_t fileSize = sect.PSize; // Maybe we need sect.VSize here !!!
- if (fileSize > kFileSizeMax)
- return S_FALSE;
- {
- UInt64 fileSize64 = fileSize;
- if (callback)
- RINOK(callback->SetTotal(NULL, &fileSize64));
- RINOK(stream->Seek(sect.Pa, STREAM_SEEK_SET, NULL));
- _buf.SetCapacity(fileSize);
- for (size_t pos = 0; pos < fileSize;)
- {
- UInt64 offset64 = pos;
- if (callback)
- RINOK(callback->SetCompleted(NULL, &offset64))
- size_t rem = MyMin(fileSize - pos, (size_t)(1 << 20));
- RINOK(ReadStream_FALSE(stream, _buf + pos, rem));
- pos += rem;
- }
- }
-
- _usedRes.Alloc(fileSize);
- CRecordVector<CTableItem> specItems;
- RINOK(ReadTable(0, specItems));
-
- _oneLang = true;
- bool stringsOk = true;
- size_t maxOffset = 0;
- for (int i = 0; i < specItems.Size(); i++)
- {
- const CTableItem &item1 = specItems[i];
- if ((item1.Offset & kFlag) == 0)
- return S_FALSE;
-
- CRecordVector<CTableItem> specItems2;
- RINOK(ReadTable(item1.Offset & kMask, specItems2));
-
- for (int j = 0; j < specItems2.Size(); j++)
- {
- const CTableItem &item2 = specItems2[j];
- if ((item2.Offset & kFlag) == 0)
- return S_FALSE;
-
- CRecordVector<CTableItem> specItems3;
- RINOK(ReadTable(item2.Offset & kMask, specItems3));
-
- CResItem item;
- item.Type = item1.ID;
- item.ID = item2.ID;
-
- for (int k = 0; k < specItems3.Size(); k++)
- {
- if (_items.Size() >= kNumResItemsMax)
- return S_FALSE;
- const CTableItem &item3 = specItems3[k];
- if ((item3.Offset & kFlag) != 0)
- return S_FALSE;
- if (item3.Offset >= _buf.GetCapacity() || _buf.GetCapacity() - item3.Offset < 16)
- return S_FALSE;
- const Byte *buf = _buf + item3.Offset;
- item.Lang = item3.ID;
- item.Offset = Get32(buf + 0);
- item.Size = Get32(buf + 4);
- // UInt32 codePage = Get32(buf + 8);
- if (Get32(buf + 12) != 0)
- return S_FALSE;
- if (!_items.IsEmpty() && _oneLang && !item.IsNameEqual(_items.Back()))
- _oneLang = false;
-
- item.HeaderSize = 0;
-
- size_t offset = item.Offset - sect.Va;
- if (offset > maxOffset)
- maxOffset = offset;
- if (offset + item.Size > maxOffset)
- maxOffset = offset + item.Size;
-
- if (CheckItem(sect, item, offset))
- {
- const Byte *data = _buf + offset;
- if (item.IsBmp())
- item.HeaderSize = SetBitmapHeader(item.Header, data, item.Size);
- else if (item.IsIcon())
- item.HeaderSize = SetIconHeader(item.Header, data, item.Size);
- else if (item.IsString())
- {
- if (stringsOk)
- stringsOk = ParseStringRes(item.ID, item.Lang, data, item.Size);
- }
- }
-
- item.Enabled = true;
- _items.Add(item);
- }
- }
- }
-
- if (stringsOk && !_strings.IsEmpty())
- {
- int i;
- for (i = 0; i < _items.Size(); i++)
- {
- CResItem &item = _items[i];
- if (item.IsString())
- item.Enabled = false;
- }
- for (i = 0; i < _strings.Size(); i++)
- {
- if (_strings[i].Size == 0)
- continue;
- CMixItem mixItem;
- mixItem.ResourceIndex = -1;
- mixItem.StringIndex = i;
- mixItem.SectionIndex = sectionIndex;
- _mixItems.Add(mixItem);
- }
- }
-
- _usedRes.Free();
-
- int numBits = _optHeader.GetNumFileAlignBits();
- if (numBits >= 0)
- {
- UInt32 mask = (1 << numBits) - 1;
- size_t end = ((maxOffset + mask) & ~mask);
- if (end < sect.VSize && end <= sect.PSize)
- {
- CSection sect2;
- sect2.Flags = 0;
-
- // we skip Zeros to start of aligned block
- size_t i;
- for (i = maxOffset; i < end; i++)
- if (_buf[i] != 0)
- break;
- if (i == end)
- maxOffset = end;
-
- sect2.Pa = sect.Pa + (UInt32)maxOffset;
- sect2.Va = sect.Va + (UInt32)maxOffset;
- sect2.PSize = sect.VSize - (UInt32)maxOffset;
- sect2.VSize = sect2.PSize;
- sect2.Name = ".rsrc_1";
- sect2.Time = 0;
- sect2.IsAdditionalSection = true;
- _sections.Add(sect2);
- }
- }
-
- return S_OK;
-}
-
-HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback)
-{
- const UInt32 kBufSize = 1 << 18;
- const UInt32 kSigSize = 2;
-
- _mainSubfile = -1;
-
- CByteBuffer buffer;
- buffer.SetCapacity(kBufSize);
- Byte *buf = buffer;
-
- size_t processed = kSigSize;
- RINOK(ReadStream_FALSE(stream, buf, processed));
- if (buf[0] != 'M' || buf[1] != 'Z')
- return S_FALSE;
- processed = kBufSize - kSigSize;
- RINOK(ReadStream(stream, buf + kSigSize, &processed));
- processed += kSigSize;
- if (!Parse(buf, (UInt32)processed))
- return S_FALSE;
- bool thereISDebug;
- RINOK(LoadDebugSections(stream, thereISDebug));
-
- const CDirLink &certLink = _optHeader.DirItems[kDirLink_Certificate];
- if (certLink.Size != 0)
- {
- CSection sect;
- sect.Name = "CERTIFICATE";
- sect.Va = 0;
- sect.Pa = certLink.Va;
- sect.PSize = sect.VSize = certLink.Size;
- sect.UpdateTotalSize(_totalSize);
- _sections.Add(sect);
- }
-
- if (thereISDebug)
- {
- const UInt32 kAlign = 1 << 12;
- UInt32 alignPos = _totalSize & (kAlign - 1);
- if (alignPos != 0)
- {
- UInt32 size = kAlign - alignPos;
- RINOK(stream->Seek(_totalSize, STREAM_SEEK_SET, NULL));
- buffer.Free();
- buffer.SetCapacity(kAlign);
- Byte *buf = buffer;
- size_t processed = size;
- RINOK(ReadStream(stream, buf, &processed));
- size_t i;
- for (i = 0; i < processed; i++)
- {
- if (buf[i] != 0)
- break;
- }
- if (processed < size && processed < 100)
- _totalSize += (UInt32)processed;
- else if (((_totalSize + i) & 0x1FF) == 0 || processed < size)
- _totalSize += (UInt32)i;
- }
- }
-
- if (_header.NumSymbols > 0 && _header.PointerToSymbolTable >= 512)
- {
- if (_header.NumSymbols >= (1 << 24))
- return S_FALSE;
- CSection sect;
- sect.Name = "COFF_SYMBOLS";
- UInt32 size = _header.NumSymbols * 18;
- RINOK(stream->Seek((UInt64)_header.PointerToSymbolTable + size, STREAM_SEEK_SET, NULL));
- Byte buf[4];
- RINOK(ReadStream_FALSE(stream, buf, 4));
- UInt32 size2 = Get32(buf);
- if (size2 >= (1 << 28))
- return S_FALSE;
- size += size2;
-
- sect.Va = 0;
- sect.Pa = _header.PointerToSymbolTable;
- sect.PSize = sect.VSize = size;
- sect.UpdateTotalSize(_totalSize);
- _sections.Add(sect);
- }
-
- UInt64 fileSize;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize));
- if (fileSize > _totalSize)
- return S_FALSE;
- _totalSizeLimited = (_totalSize < fileSize) ? _totalSize : (UInt32)fileSize;
-
- {
- CObjectVector<CSection> sections = _sections;
- sections.Sort();
- UInt32 limit = (1 << 12);
- int num = 0;
- int numSections = sections.Size();
- for (int i = 0; i < numSections; i++)
- {
- const CSection &s = sections[i];
- if (s.Pa > limit)
- {
- CSection s2;
- s2.Pa = s2.Va = limit;
- s2.PSize = s2.VSize = s.Pa - limit;
- s2.IsAdditionalSection = true;
- s2.Name = '[';
- s2.Name += GetDecString(num++);
- s2.Name += ']';
- _sections.Add(s2);
- limit = s.Pa;
- }
- UInt32 next = s.Pa + s.PSize;
- if (next < s.Pa)
- break;
- if (next >= limit)
- limit = next;
- }
- }
-
- _parseResources = true;
-
- UInt64 mainSize = 0, mainSize2 = 0;
- int i;
- for (i = 0; i < _sections.Size(); i++)
- {
- const CSection &sect = _sections[i];
- CMixItem mixItem;
- mixItem.SectionIndex = i;
- if (_parseResources && sect.Name == ".rsrc" && _items.IsEmpty())
- {
- HRESULT res = OpenResources(i, stream, callback);
- if (res == S_OK)
- {
- _resourceFileName = GetUnicodeString(sect.Name);
- for (int j = 0; j < _items.Size(); j++)
- {
- const CResItem &item = _items[j];
- if (item.Enabled)
- {
- mixItem.ResourceIndex = j;
- mixItem.StringIndex = -1;
- if (item.IsRcDataOrUnknown())
- {
- if (item.Size >= mainSize)
- {
- mainSize2 = mainSize;
- mainSize = item.Size;
- _mainSubfile = _mixItems.Size();
- }
- else if (item.Size >= mainSize2)
- mainSize2 = item.Size;
- }
- _mixItems.Add(mixItem);
- }
- }
- if (sect.PSize > sect.VSize)
- {
- int numBits = _optHeader.GetNumFileAlignBits();
- if (numBits >= 0)
- {
- UInt32 mask = (1 << numBits) - 1;
- UInt32 end = ((sect.VSize + mask) & ~mask);
-
- if (sect.PSize > end)
- {
- CSection sect2;
- sect2.Flags = 0;
- sect2.Pa = sect.Pa + end;
- sect2.Va = sect.Va + end;
- sect2.PSize = sect.PSize - end;
- sect2.VSize = sect2.PSize;
- sect2.Name = ".rsrc_2";
- sect2.Time = 0;
- sect2.IsAdditionalSection = true;
- _sections.Add(sect2);
- }
- }
- }
- continue;
- }
- if (res != S_FALSE)
- return res;
- CloseResources();
- }
- mixItem.StringIndex = -1;
- mixItem.ResourceIndex = -1;
- if (sect.IsAdditionalSection)
- {
- if (sect.PSize >= mainSize)
- {
- mainSize2 = mainSize;
- mainSize = sect.PSize;
- _mainSubfile = _mixItems.Size();
- }
- else
- mainSize2 = sect.PSize;
- }
- _mixItems.Add(mixItem);
- }
-
- if (mainSize2 >= (1 << 20) && mainSize < mainSize2 * 2)
- _mainSubfile = -1;
-
- for (i = 0; i < _mixItems.Size(); i++)
- {
- const CMixItem &mixItem = _mixItems[i];
- if (mixItem.StringIndex < 0 && mixItem.ResourceIndex < 0 && _sections[mixItem.SectionIndex].Name == "_winzip_")
- {
- _mainSubfile = i;
- break;
- }
- }
-
- return S_OK;
-}
-
-HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 excludePos, UInt32 &res)
-{
- // size &= ~1;
- const UInt32 kBufSize = 1 << 23;
- CByteBuffer buffer;
- buffer.SetCapacity(kBufSize);
- Byte *buf = buffer;
-
- UInt32 sum = 0;
- UInt32 pos = 0;
- for (;;)
- {
- UInt32 rem = size - pos;
- if (rem > kBufSize)
- rem = kBufSize;
- if (rem == 0)
- break;
- size_t processed = rem;
- RINOK(ReadStream(stream, buf, &processed));
-
- /*
- for (; processed < rem; processed++)
- buf[processed] = 0;
- */
-
- if ((processed & 1) != 0)
- buf[processed] = 0;
-
- for (int j = 0; j < 4; j++)
- {
- UInt32 p = excludePos + j;
- if (pos <= p && p < pos + processed)
- buf[p - pos] = 0;
- }
-
- for (size_t i = 0; i < processed; i += 2)
- {
- sum += Get16(buf + i);
- sum = (sum + (sum >> 16)) & 0xFFFF;
- }
- pos += (UInt32)processed;
- if (rem != processed)
- break;
- }
- sum += pos;
- res = sum;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- Close();
- RINOK(Open2(inStream, callback));
- _stream = inStream;
- return S_OK;
- COM_TRY_END
-}
-
-void CHandler::CloseResources()
-{
- _usedRes.Free();
- _items.Clear();
- _strings.Clear();
- _buf.SetCapacity(0);
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- _sections.Clear();
- _mixItems.Clear();
- CloseResources();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _mixItems.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _mixItems.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const CMixItem &mixItem = _mixItems[allFilesMode ? i : indices[i]];
- if (mixItem.StringIndex >= 0)
- totalSize += _strings[mixItem.StringIndex].Size;
- else if (mixItem.ResourceIndex < 0)
- totalSize += _sections[mixItem.SectionIndex].GetPackSize();
- else
- totalSize += _items[mixItem.ResourceIndex].GetSize();
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
- UInt64 currentItemSize;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- bool checkSumOK = true;
- if (_optHeader.CheckSum != 0 && (int)numItems == _mixItems.Size())
- {
- UInt32 checkSum = 0;
- RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL));
- CalcCheckSum(_stream, _totalSizeLimited, _peOffset + kHeaderSize + 64, checkSum);
- checkSumOK = (checkSum == _optHeader.CheckSum);
- }
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(_stream);
-
- for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
-
- CMyComPtr<ISequentialOutStream> outStream;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- const CMixItem &mixItem = _mixItems[index];
-
- const CSection &sect = _sections[mixItem.SectionIndex];
- bool isOk = true;
- if (mixItem.StringIndex >= 0)
- {
- const CStringItem &item = _strings[mixItem.StringIndex];
- currentItemSize = item.Size;
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- if (outStream)
- RINOK(WriteStream(outStream, item.Buf, item.Size));
- }
- else if (mixItem.ResourceIndex < 0)
- {
- currentItemSize = sect.GetPackSize();
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(_stream->Seek(sect.Pa, STREAM_SEEK_SET, NULL));
- streamSpec->Init(currentItemSize);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- isOk = (copyCoderSpec->TotalSize == currentItemSize);
- }
- else
- {
- const CResItem &item = _items[mixItem.ResourceIndex];
- currentItemSize = item.GetSize();
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- size_t offset = item.Offset - sect.Va;
- if (!CheckItem(sect, item, offset))
- isOk = false;
- else if (outStream)
- {
- if (item.HeaderSize != 0)
- RINOK(WriteStream(outStream, item.Header, item.HeaderSize));
- RINOK(WriteStream(outStream, _buf + offset, item.Size));
- }
- }
-
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(isOk ?
- checkSumOK ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kCRCError:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
-
- const CMixItem &mixItem = _mixItems[index];
- const CSection &sect = _sections[mixItem.SectionIndex];
- if (mixItem.IsSectionItem())
- return CreateLimitedInStream(_stream, sect.Pa, sect.PSize, stream);
-
- CBufInStream *inStreamSpec = new CBufInStream;
- CMyComPtr<ISequentialInStream> streamTemp = inStreamSpec;
- CReferenceBuf *referenceBuf = new CReferenceBuf;
- CMyComPtr<IUnknown> ref = referenceBuf;
- if (mixItem.StringIndex >= 0)
- {
- const CStringItem &item = _strings[mixItem.StringIndex];
- referenceBuf->Buf.SetCapacity(item.Size);
- memcpy(referenceBuf->Buf, item.Buf, item.Size);
- }
- else
- {
- const CResItem &item = _items[mixItem.ResourceIndex];
- size_t offset = item.Offset - sect.Va;
- if (!CheckItem(sect, item, offset))
- return S_FALSE;
- if (item.HeaderSize == 0)
- {
- CBufInStream *streamSpec = new CBufInStream;
- CMyComPtr<IInStream> streamTemp2 = streamSpec;
- streamSpec->Init(_buf + offset, item.Size, (IInArchive *)this);
- *stream = streamTemp2.Detach();
- return S_OK;
- }
- referenceBuf->Buf.SetCapacity(item.HeaderSize + item.Size);
- memcpy(referenceBuf->Buf, item.Header, item.HeaderSize);
- memcpy(referenceBuf->Buf + item.HeaderSize, _buf + offset, item.Size);
- }
- inStreamSpec->Init(referenceBuf);
-
- *stream = streamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"PE", L"exe dll sys", 0, 0xDD, { 'P', 'E', 0, 0 }, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Pe)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/PpmdHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/PpmdHandler.cpp
deleted file mode 100644
index 9b2ef0482..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/PpmdHandler.cpp
+++ /dev/null
@@ -1,456 +0,0 @@
-/* PpmdHandler.c -- PPMd format handler
-2010-03-10 : Igor Pavlov : Public domain
-This code is based on:
- PPMd var.H (2001) / var.I (2002): Dmitry Shkarin : Public domain
- Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-#include "../../../C/Alloc.h"
-#include "../../../C/Ppmd7.h"
-#include "../../../C/Ppmd8.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/CWrappers.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NPpmd {
-
-static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
-static void SzBigFree(void *, void *address) { BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-static const UInt32 kBufSize = (1 << 20);
-
-struct CBuf
-{
- Byte *Buf;
-
- CBuf(): Buf(0) {}
- ~CBuf() { ::MidFree(Buf); }
- bool Alloc()
- {
- if (!Buf)
- Buf = (Byte *)::MidAlloc(kBufSize);
- return (Buf != 0);
- }
-};
-
-static const UInt32 kHeaderSize = 16;
-static const UInt32 kSignature = 0x84ACAF8F;
-static const unsigned kNewHeaderVer = 8;
-
-struct CItem
-{
- UInt32 Attrib;
- UInt32 Time;
- AString Name;
-
- unsigned Order;
- unsigned MemInMB;
- unsigned Ver;
- unsigned Restor;
-
- HRESULT ReadHeader(ISequentialInStream *s, UInt32 &headerSize);
- bool IsSupported() const { return Ver == 7 || (Ver == 8 && Restor <= 1); }
-};
-
-HRESULT CItem::ReadHeader(ISequentialInStream *s, UInt32 &headerSize)
-{
- Byte h[kHeaderSize];
- RINOK(ReadStream_FALSE(s, h, kHeaderSize));
- if (GetUi32(h) != kSignature)
- return S_FALSE;
- Attrib = GetUi32(h + 4);
- Time = GetUi32(h + 12);
-
- unsigned info = GetUi16(h + 8);
- Order = (info & 0xF) + 1;
- MemInMB = ((info >> 4) & 0xFF) + 1;
- Ver = info >> 12;
-
- UInt32 nameLen = GetUi16(h + 10);
- Restor = nameLen >> 14;
- if (Restor > 2)
- return S_FALSE;
- if (Ver >= kNewHeaderVer)
- nameLen &= 0x3FFF;
- if (nameLen > (1 << 9))
- return S_FALSE;
- char *name = Name.GetBuffer(nameLen + 1);
- HRESULT res = ReadStream_FALSE(s, name, nameLen);
- name[nameLen] = 0;
- headerSize = kHeaderSize + nameLen;
- Name.ReleaseBuffer();
- return res;
-}
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public CMyUnknownImp
-{
- CItem _item;
- UInt32 _headerSize;
- UInt64 _packSize;
- bool _packSizeDefined;
- CMyComPtr<ISequentialInStream> _stream;
-
-public:
- MY_UNKNOWN_IMP2(IInArchive, IArchiveOpenSeq)
- INTERFACE_IInArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidMethod, VT_BSTR}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-static void UIntToString(AString &s, const char *prefix, unsigned value)
-{
- s += prefix;
- char temp[16];
- ::ConvertUInt32ToString((UInt32)value, temp);
- s += temp;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPath: prop = MultiByteToUnicodeString(_item.Name, CP_ACP); break;
- case kpidMTime:
- {
- FILETIME utc;
- if (NTime::DosTimeToFileTime(_item.Time, utc))
- prop = utc;
- break;
- }
- case kpidAttrib: prop = _item.Attrib; break;
- case kpidPackSize: if (_packSizeDefined) prop = _packSize; break;
- case kpidMethod:
- {
- AString s = "PPMd";
- s += (char)('A' + _item.Ver);
- UIntToString(s, ":o", _item.Order);
- UIntToString(s, ":mem", _item.MemInMB);
- s += 'm';
- if (_item.Ver >= kNewHeaderVer && _item.Restor != 0)
- UIntToString(s, ":r", _item.Restor);
- prop = s;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *)
-{
- return OpenSeq(stream);
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- COM_TRY_BEGIN
- HRESULT res;
- try
- {
- Close();
- res = _item.ReadHeader(stream, _headerSize);
- }
- catch(...) { res = S_FALSE; }
- if (res == S_OK)
- _stream = stream;
- else
- Close();
- return res;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _packSizeDefined = false;
- _stream.Release();
- return S_OK;
-}
-
-static const UInt32 kTopValue = (1 << 24);
-static const UInt32 kBot = (1 << 15);
-
-struct CRangeDecoder
-{
- IPpmd7_RangeDec s;
- UInt32 Range;
- UInt32 Code;
- UInt32 Low;
- CByteInBufWrap *Stream;
-
-public:
- bool Init()
- {
- Code = 0;
- Low = 0;
- Range = 0xFFFFFFFF;
- for (int i = 0; i < 4; i++)
- Code = (Code << 8) | Stream->ReadByte();
- return Code < 0xFFFFFFFF;
- }
-
- void Normalize()
- {
- while ((Low ^ (Low + Range)) < kTopValue ||
- Range < kBot && ((Range = (0 - Low) & (kBot - 1)), 1))
- {
- Code = (Code << 8) | Stream->ReadByte();
- Range <<= 8;
- Low <<= 8;
- }
- }
-
- CRangeDecoder();
-};
-
-
-extern "C" {
-
-static UInt32 Range_GetThreshold(void *pp, UInt32 total)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- return p->Code / (p->Range /= total);
-}
-
-static void Range_Decode(void *pp, UInt32 start, UInt32 size)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- start *= p->Range;
- p->Low += start;
- p->Code -= start;
- p->Range *= size;
- p->Normalize();
-}
-
-static UInt32 Range_DecodeBit(void *pp, UInt32 size0)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- if (p->Code / (p->Range >>= 14) < size0)
- {
- Range_Decode(p, 0, size0);
- return 0;
- }
- else
- {
- Range_Decode(p, size0, (1 << 14) - size0);
- return 1;
- }
-}
-
-}
-
-CRangeDecoder::CRangeDecoder()
-{
- s.GetThreshold = Range_GetThreshold;
- s.Decode = Range_Decode;
- s.DecodeBit = Range_DecodeBit;
-}
-
-struct CPpmdCpp
-{
- unsigned Ver;
- CRangeDecoder _rc;
- CPpmd7 _ppmd7;
- CPpmd8 _ppmd8;
-
- CPpmdCpp(unsigned version)
- {
- Ver = version;
- Ppmd7_Construct(&_ppmd7);
- Ppmd8_Construct(&_ppmd8);
- }
-
- ~CPpmdCpp()
- {
- Ppmd7_Free(&_ppmd7, &g_BigAlloc);
- Ppmd8_Free(&_ppmd8, &g_BigAlloc);
- }
-
- bool Alloc(UInt32 memInMB)
- {
- memInMB <<= 20;
- if (Ver == 7)
- return Ppmd7_Alloc(&_ppmd7, memInMB, &g_BigAlloc) != 0;
- return Ppmd8_Alloc(&_ppmd8, memInMB, &g_BigAlloc) != 0;
- }
-
- void Init(unsigned order, unsigned restor)
- {
- if (Ver == 7)
- Ppmd7_Init(&_ppmd7, order);
- else
- Ppmd8_Init(&_ppmd8, order, restor);;
- }
-
- bool InitRc(CByteInBufWrap *inStream)
- {
- if (Ver == 7)
- {
- _rc.Stream = inStream;
- return _rc.Init();
- }
- else
- {
- _ppmd8.Stream.In = &inStream->p;
- return Ppmd8_RangeDec_Init(&_ppmd8) != 0;
- }
- }
-
- bool IsFinishedOK()
- {
- if (Ver == 7)
- return Ppmd7z_RangeDec_IsFinishedOK(&_rc);
- return Ppmd8_RangeDec_IsFinishedOK(&_ppmd8);
- }
-};
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- // extractCallback->SetTotal(_packSize);
- UInt64 currentTotalPacked = 0;
- RINOK(extractCallback->SetCompleted(&currentTotalPacked));
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- CByteInBufWrap inBuf;
- if (!inBuf.Alloc(1 << 20))
- return E_OUTOFMEMORY;
- inBuf.Stream = _stream;
-
- CBuf outBuf;
- if (!outBuf.Alloc())
- return E_OUTOFMEMORY;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, true);
-
- CPpmdCpp ppmd(_item.Ver);
- if (!ppmd.Alloc(_item.MemInMB))
- return E_OUTOFMEMORY;
- Int32 opRes = NExtract::NOperationResult::kUnSupportedMethod;
- if (_item.IsSupported())
- {
- opRes = NExtract::NOperationResult::kDataError;
- ppmd.Init(_item.Order, _item.Restor);
- inBuf.Init();
- UInt64 outSize = 0;
- if (ppmd.InitRc(&inBuf) && !inBuf.Extra && inBuf.Res == S_OK)
- for (;;)
- {
- lps->InSize = _packSize = inBuf.GetProcessed();
- lps->OutSize = outSize;
- RINOK(lps->SetCur());
-
- size_t i;
- int sym = 0;
-
- if (ppmd.Ver == 7)
- {
- for (i = 0; i < kBufSize; i++)
- {
- sym = Ppmd7_DecodeSymbol(&ppmd._ppmd7, &ppmd._rc.s);
- if (inBuf.Extra || sym < 0)
- break;
- outBuf.Buf[i] = (Byte)sym;
- }
- }
- else
- {
- for (i = 0; i < kBufSize; i++)
- {
- sym = Ppmd8_DecodeSymbol(&ppmd._ppmd8);
- if (inBuf.Extra || sym < 0)
- break;
- outBuf.Buf[i] = (Byte)sym;
- }
- }
-
- outSize += i;
- _packSize = _headerSize + inBuf.GetProcessed();
- _packSizeDefined = true;
- if (realOutStream)
- {
- RINOK(WriteStream(realOutStream, outBuf.Buf, i));
- }
- if (sym < 0)
- {
- if (sym == -1 && ppmd.IsFinishedOK())
- opRes = NExtract::NOperationResult::kOK;
- break;
- }
- }
- RINOK(inBuf.Res);
- }
- realOutStream.Release();
- return extractCallback->SetOperationResult(opRes);
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Ppmd", L"pmd", 0, 0xD, { 0x8F, 0xAF, 0xAC, 0x84 }, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Ppmd)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHandler.cpp
deleted file mode 100644
index 5d072d34d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHandler.cpp
+++ /dev/null
@@ -1,869 +0,0 @@
-// RarHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/PropVariantUtils.h"
-#include "Windows/Time.h"
-
-#include "../../IPassword.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/FilterCoder.h"
-#include "../../Common/MethodId.h"
-#include "../../Common/ProgressUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "../../Crypto/Rar20Crypto.h"
-#include "../../Crypto/RarAes.h"
-
-#include "../Common/ItemNameUtils.h"
-#include "../Common/OutStreamWithCRC.h"
-
-#include "RarHandler.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-namespace NArchive {
-namespace NRar {
-
-static const wchar_t *kHostOS[] =
-{
- L"MS DOS",
- L"OS/2",
- L"Win32",
- L"Unix",
- L"Mac OS",
- L"BeOS"
-};
-
-static const int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]);
-
-static const wchar_t *kUnknownOS = L"Unknown";
-
-static const CUInt32PCharPair k_Flags[] =
-{
- { 0, "Volume" },
- { 1, "Comment" },
- { 2, "Lock" },
- { 3, "Solid" },
- { 4, "NewVolName" }, // pack_comment in old versuons
- { 5, "Authenticity" },
- { 6, "Recovery" },
- { 7, "BlockEncryption" },
- { 8, "FirstVolume" },
- { 9, "EncryptVer" }
-};
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
-
- { NULL, kpidEncrypted, VT_BOOL},
- { NULL, kpidSolid, VT_BOOL},
- { NULL, kpidCommented, VT_BOOL},
- { NULL, kpidSplitBefore, VT_BOOL},
- { NULL, kpidSplitAfter, VT_BOOL},
- { NULL, kpidCRC, VT_UI4},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidUnpackVer, VT_UI1}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidCharacts, VT_BSTR},
- { NULL, kpidSolid, VT_BOOL},
- { NULL, kpidNumBlocks, VT_UI4},
- // { NULL, kpidEncrypted, VT_BOOL},
- { NULL, kpidIsVolume, VT_BOOL},
- { NULL, kpidNumVolumes, VT_UI4},
- { NULL, kpidPhySize, VT_UI8}
- // { NULL, kpidCommented, VT_BOOL}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-UInt64 CHandler::GetPackSize(int refIndex) const
-{
- const CRefItem &refItem = _refItems[refIndex];
- UInt64 totalPackSize = 0;
- for (int i = 0; i < refItem.NumItems; i++)
- totalPackSize += _items[refItem.ItemIndex + i].PackSize;
- return totalPackSize;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidSolid: prop = _archiveInfo.IsSolid(); break;
- case kpidCharacts: FLAGS_TO_PROP(k_Flags, _archiveInfo.Flags, prop); break;
- // case kpidEncrypted: prop = _archiveInfo.IsEncrypted(); break; // it's for encrypted names.
- case kpidIsVolume: prop = _archiveInfo.IsVolume(); break;
- case kpidNumVolumes: prop = (UInt32)_archives.Size(); break;
- case kpidOffset: if (_archiveInfo.StartPosition != 0) prop = _archiveInfo.StartPosition; break;
- // case kpidCommented: prop = _archiveInfo.IsCommented(); break;
- case kpidNumBlocks:
- {
- UInt32 numBlocks = 0;
- for (int i = 0; i < _refItems.Size(); i++)
- if (!IsSolid(i))
- numBlocks++;
- prop = (UInt32)numBlocks;
- break;
- }
- case kpidError: if (!_errorMessage.IsEmpty()) prop = _errorMessage; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _refItems.Size();
- return S_OK;
-}
-
-static bool RarTimeToFileTime(const CRarTime &rarTime, FILETIME &result)
-{
- if (!DosTimeToFileTime(rarTime.DosTime, result))
- return false;
- UInt64 value = (((UInt64)result.dwHighDateTime) << 32) + result.dwLowDateTime;
- value += (UInt64)rarTime.LowSecond * 10000000;
- value += ((UInt64)rarTime.SubTime[2] << 16) +
- ((UInt64)rarTime.SubTime[1] << 8) +
- ((UInt64)rarTime.SubTime[0]);
- result.dwLowDateTime = (DWORD)value;
- result.dwHighDateTime = DWORD(value >> 32);
- return true;
-}
-
-static void RarTimeToProp(const CRarTime &rarTime, NWindows::NCOM::CPropVariant &prop)
-{
- FILETIME localFileTime, utcFileTime;
- if (RarTimeToFileTime(rarTime, localFileTime))
- {
- if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))
- utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
- }
- else
- utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
- prop = utcFileTime;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CRefItem &refItem = _refItems[index];
- const CItemEx &item = _items[refItem.ItemIndex];
- switch(propID)
- {
- case kpidPath:
- {
- UString u;
- if (item.HasUnicodeName() && !item.UnicodeName.IsEmpty())
- u = item.UnicodeName;
- else
- u = MultiByteToUnicodeString(item.Name, CP_OEMCP);
- prop = (const wchar_t *)NItemName::WinNameToOSName(u);
- break;
- }
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.Size; break;
- case kpidPackSize: prop = GetPackSize(index); break;
- case kpidMTime: RarTimeToProp(item.MTime, prop); break;
- case kpidCTime: if (item.CTimeDefined) RarTimeToProp(item.CTime, prop); break;
- case kpidATime: if (item.ATimeDefined) RarTimeToProp(item.ATime, prop); break;
- case kpidAttrib: prop = item.GetWinAttributes(); break;
- case kpidEncrypted: prop = item.IsEncrypted(); break;
- case kpidSolid: prop = IsSolid(index); break;
- case kpidCommented: prop = item.IsCommented(); break;
- case kpidSplitBefore: prop = item.IsSplitBefore(); break;
- case kpidSplitAfter: prop = _items[refItem.ItemIndex + refItem.NumItems - 1].IsSplitAfter(); break;
- case kpidCRC:
- {
- const CItemEx &lastItem = _items[refItem.ItemIndex + refItem.NumItems - 1];
- prop = ((lastItem.IsSplitAfter()) ? item.FileCRC : lastItem.FileCRC);
- break;
- }
- case kpidUnpackVer: prop = item.UnPackVersion; break;
- case kpidMethod:
- {
- UString method;
- if (item.Method >= Byte('0') && item.Method <= Byte('5'))
- {
- method = L"m";
- wchar_t temp[32];
- ConvertUInt64ToString(item.Method - Byte('0'), temp);
- method += temp;
- if (!item.IsDir())
- {
- method += L":";
- ConvertUInt64ToString(16 + item.GetDictSize(), temp);
- method += temp;
- }
- }
- else
- {
- wchar_t temp[32];
- ConvertUInt64ToString(item.Method, temp);
- method += temp;
- }
- prop = method;
- break;
- }
- case kpidHostOS: prop = (item.HostOS < kNumHostOSes) ? (kHostOS[item.HostOS]) : kUnknownOS; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CVolumeName
-{
- bool _first;
- bool _newStyle;
- UString _unchangedPart;
- UString _changedPart;
- UString _afterPart;
-public:
- CVolumeName(): _newStyle(true) {};
-
- bool InitName(const UString &name, bool newStyle)
- {
- _first = true;
- _newStyle = newStyle;
- int dotPos = name.ReverseFind('.');
- UString basePart = name;
- if (dotPos >= 0)
- {
- UString ext = name.Mid(dotPos + 1);
- if (ext.CompareNoCase(L"rar") == 0)
- {
- _afterPart = name.Mid(dotPos);
- basePart = name.Left(dotPos);
- }
- else if (ext.CompareNoCase(L"exe") == 0)
- {
- _afterPart = L".rar";
- basePart = name.Left(dotPos);
- }
- else if (!_newStyle)
- {
- if (ext.CompareNoCase(L"000") == 0 ||
- ext.CompareNoCase(L"001") == 0 ||
- ext.CompareNoCase(L"r00") == 0 ||
- ext.CompareNoCase(L"r01") == 0)
- {
- _afterPart.Empty();
- _first = false;
- _changedPart = ext;
- _unchangedPart = name.Left(dotPos + 1);
- return true;
- }
- }
- }
-
- if (!_newStyle)
- {
- _afterPart.Empty();
- _unchangedPart = basePart + UString(L".");
- _changedPart = L"r00";
- return true;
- }
-
- int numLetters = 1;
- if (basePart.Right(numLetters) == L"1" || basePart.Right(numLetters) == L"0")
- {
- while (numLetters < basePart.Length())
- {
- if (basePart[basePart.Length() - numLetters - 1] != '0')
- break;
- numLetters++;
- }
- }
- else
- return false;
- _unchangedPart = basePart.Left(basePart.Length() - numLetters);
- _changedPart = basePart.Right(numLetters);
- return true;
- }
-
- UString GetNextName()
- {
- UString newName;
- if (_newStyle || !_first)
- {
- int i;
- int numLetters = _changedPart.Length();
- for (i = numLetters - 1; i >= 0; i--)
- {
- wchar_t c = _changedPart[i];
- if (c == L'9')
- {
- c = L'0';
- newName = c + newName;
- if (i == 0)
- newName = UString(L'1') + newName;
- continue;
- }
- c++;
- newName = UString(c) + newName;
- i--;
- for (; i >= 0; i--)
- newName = _changedPart[i] + newName;
- break;
- }
- _changedPart = newName;
- }
- _first = false;
- return _unchangedPart + _changedPart + _afterPart;
- }
-};
-
-HRESULT CHandler::Open2(IInStream *stream,
- const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *openCallback)
-{
- {
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
- CMyComPtr<ICryptoGetTextPassword> getTextPassword;
- CMyComPtr<IArchiveOpenCallback> openArchiveCallbackWrap = openCallback;
-
- CVolumeName seqName;
-
- UInt64 totalBytes = 0;
- UInt64 curBytes = 0;
-
- if (openCallback)
- {
- openArchiveCallbackWrap.QueryInterface(IID_IArchiveOpenVolumeCallback, &openVolumeCallback);
- openArchiveCallbackWrap.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword);
- }
-
- for (;;)
- {
- CMyComPtr<IInStream> inStream;
- if (!_archives.IsEmpty())
- {
- if (!openVolumeCallback)
- break;
-
- if (_archives.Size() == 1)
- {
- if (!_archiveInfo.IsVolume())
- break;
- UString baseName;
- {
- NCOM::CPropVariant prop;
- RINOK(openVolumeCallback->GetProperty(kpidName, &prop));
- if (prop.vt != VT_BSTR)
- break;
- baseName = prop.bstrVal;
- }
- seqName.InitName(baseName, _archiveInfo.HaveNewVolumeName());
- }
-
- UString fullName = seqName.GetNextName();
- HRESULT result = openVolumeCallback->GetStream(fullName, &inStream);
- if (result == S_FALSE)
- break;
- if (result != S_OK)
- return result;
- if (!stream)
- break;
- }
- else
- inStream = stream;
-
- UInt64 endPos = 0;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- if (openCallback)
- {
- totalBytes += endPos;
- RINOK(openCallback->SetTotal(NULL, &totalBytes));
- }
-
- NArchive::NRar::CInArchive archive;
- RINOK(archive.Open(inStream, maxCheckStartPosition));
-
- if (_archives.IsEmpty())
- archive.GetArchiveInfo(_archiveInfo);
-
- CItemEx item;
- for (;;)
- {
- if (archive.m_Position > endPos)
- {
- AddErrorMessage("Unexpected end of archive");
- break;
- }
- bool decryptionError;
- AString errorMessageLoc;
- HRESULT result = archive.GetNextItem(item, getTextPassword, decryptionError, errorMessageLoc);
- if (errorMessageLoc)
- AddErrorMessage(errorMessageLoc);
- if (result == S_FALSE)
- {
- if (decryptionError && _items.IsEmpty())
- return S_FALSE;
- break;
- }
- RINOK(result);
- if (item.IgnoreItem())
- continue;
-
- bool needAdd = true;
- if (item.IsSplitBefore())
- {
- if (!_refItems.IsEmpty())
- {
- CRefItem &refItem = _refItems.Back();
- refItem.NumItems++;
- needAdd = false;
- }
- }
- if (needAdd)
- {
- CRefItem refItem;
- refItem.ItemIndex = _items.Size();
- refItem.NumItems = 1;
- refItem.VolumeIndex = _archives.Size();
- _refItems.Add(refItem);
- }
- _items.Add(item);
- if (openCallback && _items.Size() % 100 == 0)
- {
- UInt64 numFiles = _items.Size();
- UInt64 numBytes = curBytes + item.Position;
- RINOK(openCallback->SetCompleted(&numFiles, &numBytes));
- }
- }
- curBytes += endPos;
- _archives.Add(archive);
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *openCallback)
-{
- COM_TRY_BEGIN
- Close();
- try
- {
- HRESULT res = Open2(stream, maxCheckStartPosition, openCallback);
- if (res != S_OK)
- Close();
- return res;
- }
- catch(const CInArchiveException &) { Close(); return S_FALSE; }
- catch(...) { Close(); throw; }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- COM_TRY_BEGIN
- _errorMessage.Empty();
- _refItems.Clear();
- _items.Clear();
- _archives.Clear();
- return S_OK;
- COM_TRY_END
-}
-
-struct CMethodItem
-{
- Byte RarUnPackVersion;
- CMyComPtr<ICompressCoder> Coder;
-};
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- CMyComPtr<ICryptoGetTextPassword> getTextPassword;
- UInt64 censoredTotalUnPacked = 0,
- // censoredTotalPacked = 0,
- importantTotalUnPacked = 0;
- // importantTotalPacked = 0;
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _refItems.Size();
- if (numItems == 0)
- return S_OK;
- int lastIndex = 0;
- CRecordVector<int> importantIndexes;
- CRecordVector<bool> extractStatuses;
-
- for (UInt32 t = 0; t < numItems; t++)
- {
- int index = allFilesMode ? t : indices[t];
- const CRefItem &refItem = _refItems[index];
- const CItemEx &item = _items[refItem.ItemIndex];
- censoredTotalUnPacked += item.Size;
- // censoredTotalPacked += item.PackSize;
- int j;
- for (j = lastIndex; j <= index; j++)
- // if (!_items[_refItems[j].ItemIndex].IsSolid())
- if (!IsSolid(j))
- lastIndex = j;
- for (j = lastIndex; j <= index; j++)
- {
- const CRefItem &refItem = _refItems[j];
- const CItemEx &item = _items[refItem.ItemIndex];
-
- // const CItemEx &item = _items[j];
-
- importantTotalUnPacked += item.Size;
- // importantTotalPacked += item.PackSize;
- importantIndexes.Add(j);
- extractStatuses.Add(j == index);
- }
- lastIndex = index + 1;
- }
-
- RINOK(extractCallback->SetTotal(importantTotalUnPacked));
- UInt64 currentImportantTotalUnPacked = 0;
- UInt64 currentImportantTotalPacked = 0;
- UInt64 currentUnPackSize, currentPackSize;
-
- CObjectVector<CMethodItem> methodItems;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CFilterCoder *filterStreamSpec = new CFilterCoder;
- CMyComPtr<ISequentialInStream> filterStream = filterStreamSpec;
-
- NCrypto::NRar20::CDecoder *rar20CryptoDecoderSpec = NULL;
- CMyComPtr<ICompressFilter> rar20CryptoDecoder;
- NCrypto::NRar29::CDecoder *rar29CryptoDecoderSpec = NULL;
- CMyComPtr<ICompressFilter> rar29CryptoDecoder;
-
- CFolderInStream *folderInStreamSpec = NULL;
- CMyComPtr<ISequentialInStream> folderInStream;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- bool solidStart = true;
- for (int i = 0; i < importantIndexes.Size(); i++,
- currentImportantTotalUnPacked += currentUnPackSize,
- currentImportantTotalPacked += currentPackSize)
- {
- lps->InSize = currentImportantTotalPacked;
- lps->OutSize = currentImportantTotalUnPacked;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
-
- Int32 askMode;
- if (extractStatuses[i])
- askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- else
- askMode = NExtract::NAskMode::kSkip;
-
- UInt32 index = importantIndexes[i];
-
- const CRefItem &refItem = _refItems[index];
- const CItemEx &item = _items[refItem.ItemIndex];
-
- currentUnPackSize = item.Size;
-
- currentPackSize = GetPackSize(index);
-
- if (item.IgnoreItem())
- continue;
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (!IsSolid(index))
- solidStart = true;
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- bool mustBeProcessedAnywhere = false;
- if (i < importantIndexes.Size() - 1)
- {
- // const CRefItem &nextRefItem = _refItems[importantIndexes[i + 1]];
- // const CItemEx &nextItemInfo = _items[nextRefItem.ItemIndex];
- // mustBeProcessedAnywhere = nextItemInfo.IsSolid();
- mustBeProcessedAnywhere = IsSolid(importantIndexes[i + 1]);
- }
-
- if (!mustBeProcessedAnywhere && !testMode && !realOutStream)
- continue;
-
- if (!realOutStream && !testMode)
- askMode = NExtract::NAskMode::kSkip;
-
- RINOK(extractCallback->PrepareOperation(askMode));
-
- COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
- realOutStream.Release();
-
- /*
- for (int partIndex = 0; partIndex < 1; partIndex++)
- {
- CMyComPtr<ISequentialInStream> inStream;
-
- // item redefinition
- const CItemEx &item = _items[refItem.ItemIndex + partIndex];
-
- NArchive::NRar::CInArchive &archive = _archives[refItem.VolumeIndex + partIndex];
-
- inStream.Attach(archive.CreateLimitedStream(item.GetDataPosition(),
- item.PackSize));
- */
- if (!folderInStream)
- {
- folderInStreamSpec = new CFolderInStream;
- folderInStream = folderInStreamSpec;
- }
-
- folderInStreamSpec->Init(&_archives, &_items, refItem);
-
- UInt64 packSize = currentPackSize;
-
- // packedPos += item.PackSize;
- // unpackedPos += 0;
-
- CMyComPtr<ISequentialInStream> inStream;
- if (item.IsEncrypted())
- {
- CMyComPtr<ICryptoSetPassword> cryptoSetPassword;
- if (item.UnPackVersion >= 29)
- {
- if (!rar29CryptoDecoder)
- {
- rar29CryptoDecoderSpec = new NCrypto::NRar29::CDecoder;
- rar29CryptoDecoder = rar29CryptoDecoderSpec;
- // RINOK(rar29CryptoDecoder.CoCreateInstance(CLSID_CCryptoRar29Decoder));
- }
- rar29CryptoDecoderSpec->SetRar350Mode(item.UnPackVersion < 36);
- CMyComPtr<ICompressSetDecoderProperties2> cryptoProperties;
- RINOK(rar29CryptoDecoder.QueryInterface(IID_ICompressSetDecoderProperties2,
- &cryptoProperties));
- RINOK(cryptoProperties->SetDecoderProperties2(item.Salt, item.HasSalt() ? sizeof(item.Salt) : 0));
- filterStreamSpec->Filter = rar29CryptoDecoder;
- }
- else if (item.UnPackVersion >= 20)
- {
- if (!rar20CryptoDecoder)
- {
- rar20CryptoDecoderSpec = new NCrypto::NRar20::CDecoder;
- rar20CryptoDecoder = rar20CryptoDecoderSpec;
- // RINOK(rar20CryptoDecoder.CoCreateInstance(CLSID_CCryptoRar20Decoder));
- }
- filterStreamSpec->Filter = rar20CryptoDecoder;
- }
- else
- {
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
- RINOK(filterStreamSpec->Filter.QueryInterface(IID_ICryptoSetPassword,
- &cryptoSetPassword));
-
- if (!getTextPassword)
- extractCallback->QueryInterface(IID_ICryptoGetTextPassword, (void **)&getTextPassword);
- if (getTextPassword)
- {
- CMyComBSTR password;
- RINOK(getTextPassword->CryptoGetTextPassword(&password));
- if (item.UnPackVersion >= 29)
- {
- CByteBuffer buffer;
- UString unicodePassword(password);
- const UInt32 sizeInBytes = unicodePassword.Length() * 2;
- buffer.SetCapacity(sizeInBytes);
- for (int i = 0; i < unicodePassword.Length(); i++)
- {
- wchar_t c = unicodePassword[i];
- ((Byte *)buffer)[i * 2] = (Byte)c;
- ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);
- }
- RINOK(cryptoSetPassword->CryptoSetPassword(
- (const Byte *)buffer, sizeInBytes));
- }
- else
- {
- AString oemPassword = UnicodeStringToMultiByte(
- (const wchar_t *)password, CP_OEMCP);
- RINOK(cryptoSetPassword->CryptoSetPassword(
- (const Byte *)(const char *)oemPassword, oemPassword.Length()));
- }
- }
- else
- {
- RINOK(cryptoSetPassword->CryptoSetPassword(0, 0));
- }
- filterStreamSpec->SetInStream(folderInStream);
- inStream = filterStream;
- }
- else
- {
- inStream = folderInStream;
- }
- CMyComPtr<ICompressCoder> commonCoder;
- switch(item.Method)
- {
- case '0':
- {
- commonCoder = copyCoder;
- break;
- }
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- {
- /*
- if (item.UnPackVersion >= 29)
- {
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
- */
- int m;
- for (m = 0; m < methodItems.Size(); m++)
- if (methodItems[m].RarUnPackVersion == item.UnPackVersion)
- break;
- if (m == methodItems.Size())
- {
- CMethodItem mi;
- mi.RarUnPackVersion = item.UnPackVersion;
-
- mi.Coder.Release();
- if (item.UnPackVersion <= 30)
- {
- UInt32 methodID = 0x040300;
- if (item.UnPackVersion < 20)
- methodID += 1;
- else if (item.UnPackVersion < 29)
- methodID += 2;
- else
- methodID += 3;
- RINOK(CreateCoder(EXTERNAL_CODECS_VARS methodID, mi.Coder, false));
- }
-
- if (mi.Coder == 0)
- {
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
-
- m = methodItems.Add(mi);
- }
- CMyComPtr<ICompressCoder> decoder = methodItems[m].Coder;
-
- CMyComPtr<ICompressSetDecoderProperties2> compressSetDecoderProperties;
- RINOK(decoder.QueryInterface(IID_ICompressSetDecoderProperties2,
- &compressSetDecoderProperties));
-
- Byte isSolid = (Byte)((IsSolid(index) || item.IsSplitBefore()) ? 1: 0);
- if (solidStart)
- {
- isSolid = false;
- solidStart = false;
- }
-
-
- RINOK(compressSetDecoderProperties->SetDecoderProperties2(&isSolid, 1));
-
- commonCoder = decoder;
- break;
- }
- default:
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- continue;
- }
- HRESULT result = commonCoder->Code(inStream, outStream, &packSize, &item.Size, progress);
- if (item.IsEncrypted())
- filterStreamSpec->ReleaseInStream();
- if (result == S_FALSE)
- {
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kDataError));
- continue;
- }
- if (result != S_OK)
- return result;
-
- /*
- if (refItem.NumItems == 1 &&
- !item.IsSplitBefore() && !item.IsSplitAfter())
- */
- {
- const CItemEx &lastItem = _items[refItem.ItemIndex + refItem.NumItems - 1];
- bool crcOK = outStreamSpec->GetCRC() == lastItem.FileCRC;
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(crcOK ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kCRCError));
- }
- /*
- else
- {
- bool crcOK = true;
- for (int partIndex = 0; partIndex < refItem.NumItems; partIndex++)
- {
- const CItemEx &item = _items[refItem.ItemIndex + partIndex];
- if (item.FileCRC != folderInStreamSpec->CRCs[partIndex])
- {
- crcOK = false;
- break;
- }
- }
- RINOK(extractCallback->SetOperationResult(crcOK ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kCRCError));
- }
- */
- }
- return S_OK;
- COM_TRY_END
-}
-
-IMPL_ISetCompressCodecsInfo
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHandler.h
deleted file mode 100644
index 792668273..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHandler.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Rar/Handler.h
-
-#ifndef __RAR_HANDLER_H
-#define __RAR_HANDLER_H
-
-#include "../IArchive.h"
-
-#include "../../Common/CreateCoder.h"
-
-#include "RarIn.h"
-#include "RarVolumeInStream.h"
-
-namespace NArchive {
-namespace NRar {
-
-class CHandler:
- public IInArchive,
- PUBLIC_ISetCompressCodecsInfo
- public CMyUnknownImp
-{
- CRecordVector<CRefItem> _refItems;
- CObjectVector<CItemEx> _items;
- CObjectVector<CInArchive> _archives;
- NArchive::NRar::CInArchiveInfo _archiveInfo;
- AString _errorMessage;
-
- DECL_EXTERNAL_CODECS_VARS
-
- UInt64 GetPackSize(int refIndex) const;
-
- bool IsSolid(int refIndex)
- {
- const CItemEx &item = _items[_refItems[refIndex].ItemIndex];
- if (item.UnPackVersion < 20)
- {
- if (_archiveInfo.IsSolid())
- return (refIndex > 0);
- return false;
- }
- return item.IsSolid();
- }
- void AddErrorMessage(const AString &s)
- {
- if (!_errorMessage.IsEmpty())
- _errorMessage += '\n';
- _errorMessage += s;
- }
-
- HRESULT Open2(IInStream *stream,
- const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *openCallback);
-
-public:
- MY_QUERYINTERFACE_BEGIN2(IInArchive)
- QUERY_ENTRY_ISetCompressCodecsInfo
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- INTERFACE_IInArchive(;)
-
- DECL_ISetCompressCodecsInfo
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHeader.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHeader.cpp
deleted file mode 100644
index 94481e025..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHeader.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// Archive/Rar/Headers.cpp
-
-#include "StdAfx.h"
-
-#include "RarHeader.h"
-
-namespace NArchive{
-namespace NRar{
-namespace NHeader{
-
-Byte kMarker[kMarkerSize] = {0x52 + 1, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00};
-
-class CMarkerInitializer
-{
-public:
- CMarkerInitializer() { kMarker[0]--; };
-};
-
-static CMarkerInitializer markerInitializer;
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHeader.h b/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHeader.h
deleted file mode 100644
index 5c21a2ac0..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarHeader.h
+++ /dev/null
@@ -1,205 +0,0 @@
-// Archive/RarHeader.h
-
-#ifndef __ARCHIVE_RAR_HEADER_H
-#define __ARCHIVE_RAR_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NRar {
-namespace NHeader {
-
-const int kMarkerSize = 7;
-extern Byte kMarker[kMarkerSize];
-
-const int kArchiveSolid = 0x1;
-
-namespace NBlockType
-{
- enum EBlockType
- {
- kMarker = 0x72,
- kArchiveHeader,
- kFileHeader,
- kCommentHeader,
- kOldAuthenticity,
- kOldSubBlock,
- kRecoveryRecord,
- kAuthenticity,
- kSubBlock,
- kEndOfArchive
- };
-}
-
-namespace NArchive
-{
- const UInt16 kVolume = 1;
- const UInt16 kComment = 2;
- const UInt16 kLock = 4;
- const UInt16 kSolid = 8;
- const UInt16 kNewVolName = 0x10; // ('volname.partN.rar')
- const UInt16 kAuthenticity = 0x20;
- const UInt16 kRecovery = 0x40;
- const UInt16 kBlockEncryption = 0x80;
- const UInt16 kFirstVolume = 0x100; // (set only by RAR 3.0 and later)
- const UInt16 kEncryptVer = 0x200; // RAR 3.6 there is EncryptVer Byte in End of MainHeader
-
- const int kHeaderSizeMin = 7;
-
- const int kArchiveHeaderSize = 13;
-
- const int kBlockHeadersAreEncrypted = 0x80;
-
-}
-
-namespace NFile
-{
- const int kSplitBefore = 1 << 0;
- const int kSplitAfter = 1 << 1;
- const int kEncrypted = 1 << 2;
- const int kComment = 1 << 3;
- const int kSolid = 1 << 4;
-
- const int kDictBitStart = 5;
- const int kNumDictBits = 3;
- const int kDictMask = (1 << kNumDictBits) - 1;
- const int kDictDirectoryValue = 0x7;
-
- const int kSize64Bits = 1 << 8;
- const int kUnicodeName = 1 << 9;
- const int kSalt = 1 << 10;
- const int kOldVersion = 1 << 11;
- const int kExtTime = 1 << 12;
- // const int kExtFlags = 1 << 13;
- // const int kSkipIfUnknown = 1 << 14;
-
- const int kLongBlock = 1 << 15;
-
- /*
- struct CBlock
- {
- // UInt16 HeadCRC;
- // Byte Type;
- // UInt16 Flags;
- // UInt16 HeadSize;
- UInt32 PackSize;
- UInt32 UnPackSize;
- Byte HostOS;
- UInt32 FileCRC;
- UInt32 Time;
- Byte UnPackVersion;
- Byte Method;
- UInt16 NameSize;
- UInt32 Attributes;
- };
- */
-
- /*
- struct CBlock32
- {
- UInt16 HeadCRC;
- Byte Type;
- UInt16 Flags;
- UInt16 HeadSize;
- UInt32 PackSize;
- UInt32 UnPackSize;
- Byte HostOS;
- UInt32 FileCRC;
- UInt32 Time;
- Byte UnPackVersion;
- Byte Method;
- UInt16 NameSize;
- UInt32 Attributes;
- UInt16 GetRealCRC(const void *aName, UInt32 aNameSize,
- bool anExtraDataDefined = false, Byte *anExtraData = 0) const;
- };
- struct CBlock64
- {
- UInt16 HeadCRC;
- Byte Type;
- UInt16 Flags;
- UInt16 HeadSize;
- UInt32 PackSizeLow;
- UInt32 UnPackSizeLow;
- Byte HostOS;
- UInt32 FileCRC;
- UInt32 Time;
- Byte UnPackVersion;
- Byte Method;
- UInt16 NameSize;
- UInt32 Attributes;
- UInt32 PackSizeHigh;
- UInt32 UnPackSizeHigh;
- UInt16 GetRealCRC(const void *aName, UInt32 aNameSize) const;
- };
- */
-
- const int kLabelFileAttribute = 0x08;
- const int kWinFileDirectoryAttributeMask = 0x10;
-
- enum CHostOS
- {
- kHostMSDOS = 0,
- kHostOS2 = 1,
- kHostWin32 = 2,
- kHostUnix = 3,
- kHostMacOS = 4,
- kHostBeOS = 5
- };
-}
-
-namespace NBlock
-{
- const UInt16 kLongBlock = 1 << 15;
- struct CBlock
- {
- UInt16 CRC;
- Byte Type;
- UInt16 Flags;
- UInt16 HeadSize;
- // UInt32 DataSize;
- };
-}
-
-/*
-struct CSubBlock
-{
- UInt16 HeadCRC;
- Byte HeadType;
- UInt16 Flags;
- UInt16 HeadSize;
- UInt32 DataSize;
- UInt16 SubType;
- Byte Level; // Reserved : Must be 0
-};
-
-struct CCommentBlock
-{
- UInt16 HeadCRC;
- Byte HeadType;
- UInt16 Flags;
- UInt16 HeadSize;
- UInt16 UnpSize;
- Byte UnpVer;
- Byte Method;
- UInt16 CommCRC;
-};
-
-
-struct CProtectHeader
-{
- UInt16 HeadCRC;
- Byte HeadType;
- UInt16 Flags;
- UInt16 HeadSize;
- UInt32 DataSize;
- Byte Version;
- UInt16 RecSectors;
- UInt32 TotalBlocks;
- Byte Mark[8];
-};
-*/
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarIn.cpp
deleted file mode 100644
index e4c23752c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarIn.cpp
+++ /dev/null
@@ -1,478 +0,0 @@
-// Archive/RarIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/7zCrc.h"
-#include "../../../../C/CpuArch.h"
-
-#include "Common/StringConvert.h"
-#include "Common/UTFConvert.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../Common/FindSignature.h"
-
-#include "RarIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-namespace NArchive {
-namespace NRar {
-
-static const char *k_UnexpectedEnd = "Unexpected end of archive";
-static const char *k_DecryptionError = "Decryption Error";
-
-void CInArchive::ThrowExceptionWithCode(
- CInArchiveException::CCauseType cause)
-{
- throw CInArchiveException(cause);
-}
-
-HRESULT CInArchive::Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit)
-{
- try
- {
- Close();
- HRESULT res = Open2(inStream, searchHeaderSizeLimit);
- if (res == S_OK)
- return res;
- Close();
- return res;
- }
- catch(...) { Close(); throw; }
-}
-
-void CInArchive::Close()
-{
- m_Stream.Release();
-}
-
-HRESULT CInArchive::ReadBytesSpec(void *data, size_t *resSize)
-{
- if (m_CryptoMode)
- {
- size_t size = *resSize;
- *resSize = 0;
- const Byte *bufData = m_DecryptedDataAligned;
- UInt32 bufSize = m_DecryptedDataSize;
- size_t i;
- for (i = 0; i < size && m_CryptoPos < bufSize; i++)
- ((Byte *)data)[i] = bufData[m_CryptoPos++];
- *resSize = i;
- return S_OK;
- }
- return ReadStream(m_Stream, data, resSize);
-}
-
-bool CInArchive::ReadBytesAndTestSize(void *data, UInt32 size)
-{
- size_t processed = size;
- if (ReadBytesSpec(data, &processed) != S_OK)
- return false;
- return processed == size;
-}
-
-HRESULT CInArchive::Open2(IInStream *stream, const UInt64 *searchHeaderSizeLimit)
-{
- m_CryptoMode = false;
- RINOK(stream->Seek(0, STREAM_SEEK_SET, &m_StreamStartPosition));
- m_Position = m_StreamStartPosition;
-
- UInt64 arcStartPos;
- RINOK(FindSignatureInStream(stream, NHeader::kMarker, NHeader::kMarkerSize,
- searchHeaderSizeLimit, arcStartPos));
- m_Position = arcStartPos + NHeader::kMarkerSize;
- RINOK(stream->Seek(m_Position, STREAM_SEEK_SET, NULL));
- Byte buf[NHeader::NArchive::kArchiveHeaderSize + 1];
-
- RINOK(ReadStream_FALSE(stream, buf, NHeader::NArchive::kArchiveHeaderSize));
- AddToSeekValue(NHeader::NArchive::kArchiveHeaderSize);
-
-
- UInt32 blockSize = Get16(buf + 5);
-
- _header.EncryptVersion = 0;
- _header.Flags = Get16(buf + 3);
-
- UInt32 headerSize = NHeader::NArchive::kArchiveHeaderSize;
- if (_header.IsThereEncryptVer())
- {
- if (blockSize <= headerSize)
- return S_FALSE;
- RINOK(ReadStream_FALSE(stream, buf + NHeader::NArchive::kArchiveHeaderSize, 1));
- AddToSeekValue(1);
- _header.EncryptVersion = buf[NHeader::NArchive::kArchiveHeaderSize];
- headerSize += 1;
- }
- if (blockSize < headerSize ||
- buf[2] != NHeader::NBlockType::kArchiveHeader ||
- (UInt32)Get16(buf) != (CrcCalc(buf + 2, headerSize - 2) & 0xFFFF))
- return S_FALSE;
-
- size_t commentSize = blockSize - headerSize;
- _comment.SetCapacity(commentSize);
- RINOK(ReadStream_FALSE(stream, _comment, commentSize));
- AddToSeekValue(commentSize);
- m_Stream = stream;
- _header.StartPosition = arcStartPos;
- return S_OK;
-}
-
-void CInArchive::GetArchiveInfo(CInArchiveInfo &archiveInfo) const
-{
- archiveInfo = _header;
-}
-
-static void DecodeUnicodeFileName(const char *name, const Byte *encName,
- int encSize, wchar_t *unicodeName, int maxDecSize)
-{
- int encPos = 0;
- int decPos = 0;
- int flagBits = 0;
- Byte flags = 0;
- Byte highByte = encName[encPos++];
- while (encPos < encSize && decPos < maxDecSize)
- {
- if (flagBits == 0)
- {
- flags = encName[encPos++];
- flagBits = 8;
- }
- switch(flags >> 6)
- {
- case 0:
- unicodeName[decPos++] = encName[encPos++];
- break;
- case 1:
- unicodeName[decPos++] = (wchar_t)(encName[encPos++] + (highByte << 8));
- break;
- case 2:
- unicodeName[decPos++] = (wchar_t)(encName[encPos] + (encName[encPos + 1] << 8));
- encPos += 2;
- break;
- case 3:
- {
- int length = encName[encPos++];
- if (length & 0x80)
- {
- Byte correction = encName[encPos++];
- for (length = (length & 0x7f) + 2;
- length > 0 && decPos < maxDecSize; length--, decPos++)
- unicodeName[decPos] = (wchar_t)(((name[decPos] + correction) & 0xff) + (highByte << 8));
- }
- else
- for (length += 2; length > 0 && decPos < maxDecSize; length--, decPos++)
- unicodeName[decPos] = name[decPos];
- }
- break;
- }
- flags <<= 2;
- flagBits -= 2;
- }
- unicodeName[decPos < maxDecSize ? decPos : maxDecSize - 1] = 0;
-}
-
-void CInArchive::ReadName(CItemEx &item, int nameSize)
-{
- item.UnicodeName.Empty();
- if (nameSize > 0)
- {
- m_NameBuffer.EnsureCapacity(nameSize + 1);
- char *buffer = (char *)m_NameBuffer;
-
- for (int i = 0; i < nameSize; i++)
- buffer[i] = ReadByte();
-
- int mainLen;
- for (mainLen = 0; mainLen < nameSize; mainLen++)
- if (buffer[mainLen] == '\0')
- break;
- buffer[mainLen] = '\0';
- item.Name = buffer;
-
- if(item.HasUnicodeName())
- {
- if(mainLen < nameSize)
- {
- int unicodeNameSizeMax = MyMin(nameSize, (0x400));
- _unicodeNameBuffer.EnsureCapacity(unicodeNameSizeMax + 1);
- DecodeUnicodeFileName(buffer, (const Byte *)buffer + mainLen + 1,
- nameSize - (mainLen + 1), _unicodeNameBuffer, unicodeNameSizeMax);
- item.UnicodeName = _unicodeNameBuffer;
- }
- else if (!ConvertUTF8ToUnicode(item.Name, item.UnicodeName))
- item.UnicodeName.Empty();
- }
- }
- else
- item.Name.Empty();
-}
-
-Byte CInArchive::ReadByte()
-{
- if (m_CurPos >= m_PosLimit)
- throw CInArchiveException(CInArchiveException::kIncorrectArchive);
- return m_CurData[m_CurPos++];
-}
-
-UInt16 CInArchive::ReadUInt16()
-{
- UInt16 value = 0;
- for (int i = 0; i < 2; i++)
- {
- Byte b = ReadByte();
- value |= (UInt16(b) << (8 * i));
- }
- return value;
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- UInt32 value = 0;
- for (int i = 0; i < 4; i++)
- {
- Byte b = ReadByte();
- value |= (UInt32(b) << (8 * i));
- }
- return value;
-}
-
-void CInArchive::ReadTime(Byte mask, CRarTime &rarTime)
-{
- rarTime.LowSecond = (Byte)(((mask & 4) != 0) ? 1 : 0);
- int numDigits = (mask & 3);
- rarTime.SubTime[0] = rarTime.SubTime[1] = rarTime.SubTime[2] = 0;
- for (int i = 0; i < numDigits; i++)
- rarTime.SubTime[3 - numDigits + i] = ReadByte();
-}
-
-void CInArchive::ReadHeaderReal(CItemEx &item)
-{
- item.Flags = m_BlockHeader.Flags;
- item.PackSize = ReadUInt32();
- item.Size = ReadUInt32();
- item.HostOS = ReadByte();
- item.FileCRC = ReadUInt32();
- item.MTime.DosTime = ReadUInt32();
- item.UnPackVersion = ReadByte();
- item.Method = ReadByte();
- int nameSize = ReadUInt16();
- item.Attrib = ReadUInt32();
-
- item.MTime.LowSecond = 0;
- item.MTime.SubTime[0] =
- item.MTime.SubTime[1] =
- item.MTime.SubTime[2] = 0;
-
- if((item.Flags & NHeader::NFile::kSize64Bits) != 0)
- {
- item.PackSize |= ((UInt64)ReadUInt32() << 32);
- item.Size |= ((UInt64)ReadUInt32() << 32);
- }
-
- ReadName(item, nameSize);
-
- if (item.HasSalt())
- for (int i = 0; i < sizeof(item.Salt); i++)
- item.Salt[i] = ReadByte();
-
- // some rar archives have HasExtTime flag without field.
- if (m_CurPos < m_PosLimit && item.HasExtTime())
- {
- Byte accessMask = (Byte)(ReadByte() >> 4);
- Byte b = ReadByte();
- Byte modifMask = (Byte)(b >> 4);
- Byte createMask = (Byte)(b & 0xF);
- if ((modifMask & 8) != 0)
- ReadTime(modifMask, item.MTime);
- item.CTimeDefined = ((createMask & 8) != 0);
- if (item.CTimeDefined)
- {
- item.CTime.DosTime = ReadUInt32();
- ReadTime(createMask, item.CTime);
- }
- item.ATimeDefined = ((accessMask & 8) != 0);
- if (item.ATimeDefined)
- {
- item.ATime.DosTime = ReadUInt32();
- ReadTime(accessMask, item.ATime);
- }
- }
-
- UInt16 fileHeaderWithNameSize = (UInt16)m_CurPos;
-
- item.Position = m_Position;
- item.MainPartSize = fileHeaderWithNameSize;
- item.CommentSize = (UInt16)(m_BlockHeader.HeadSize - fileHeaderWithNameSize);
-
- if (m_CryptoMode)
- item.AlignSize = (UInt16)((16 - ((m_BlockHeader.HeadSize) & 0xF)) & 0xF);
- else
- item.AlignSize = 0;
- AddToSeekValue(m_BlockHeader.HeadSize);
-}
-
-void CInArchive::AddToSeekValue(UInt64 addValue)
-{
- m_Position += addValue;
-}
-
-HRESULT CInArchive::GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword, bool &decryptionError, AString &errorMessage)
-{
- decryptionError = false;
- for (;;)
- {
- SeekInArchive(m_Position);
- if (!m_CryptoMode && (_header.Flags &
- NHeader::NArchive::kBlockHeadersAreEncrypted) != 0)
- {
- m_CryptoMode = false;
- if (getTextPassword == 0)
- return S_FALSE;
- if (!m_RarAES)
- {
- m_RarAESSpec = new NCrypto::NRar29::CDecoder;
- m_RarAES = m_RarAESSpec;
- }
- m_RarAESSpec->SetRar350Mode(_header.IsEncryptOld());
-
- // Salt
- const UInt32 kSaltSize = 8;
- Byte salt[kSaltSize];
- if(!ReadBytesAndTestSize(salt, kSaltSize))
- return S_FALSE;
- m_Position += kSaltSize;
- RINOK(m_RarAESSpec->SetDecoderProperties2(salt, kSaltSize))
- // Password
- CMyComBSTR password;
- RINOK(getTextPassword->CryptoGetTextPassword(&password))
- UString unicodePassword(password);
-
- CByteBuffer buffer;
- const UInt32 sizeInBytes = unicodePassword.Length() * 2;
- buffer.SetCapacity(sizeInBytes);
- for (int i = 0; i < unicodePassword.Length(); i++)
- {
- wchar_t c = unicodePassword[i];
- ((Byte *)buffer)[i * 2] = (Byte)c;
- ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);
- }
-
- RINOK(m_RarAESSpec->CryptoSetPassword((const Byte *)buffer, sizeInBytes));
-
- const UInt32 kDecryptedBufferSize = (1 << 12);
- if (m_DecryptedData.GetCapacity() == 0)
- {
- const UInt32 kAlign = 16;
- m_DecryptedData.SetCapacity(kDecryptedBufferSize + kAlign);
- m_DecryptedDataAligned = (Byte *)((ptrdiff_t)((Byte *)m_DecryptedData + kAlign - 1) & ~(ptrdiff_t)(kAlign - 1));
- }
- RINOK(m_RarAES->Init());
- size_t decryptedDataSizeT = kDecryptedBufferSize;
- RINOK(ReadStream(m_Stream, m_DecryptedDataAligned, &decryptedDataSizeT));
- m_DecryptedDataSize = (UInt32)decryptedDataSizeT;
- m_DecryptedDataSize = m_RarAES->Filter(m_DecryptedDataAligned, m_DecryptedDataSize);
-
- m_CryptoMode = true;
- m_CryptoPos = 0;
- }
-
- m_FileHeaderData.EnsureCapacity(7);
- size_t processed = 7;
- RINOK(ReadBytesSpec((Byte *)m_FileHeaderData, &processed));
- if (processed != 7)
- {
- if (processed != 0)
- errorMessage = k_UnexpectedEnd;
- return S_FALSE;
- }
-
- m_CurData = (Byte *)m_FileHeaderData;
- m_CurPos = 0;
- m_PosLimit = 7;
- m_BlockHeader.CRC = ReadUInt16();
- m_BlockHeader.Type = ReadByte();
- m_BlockHeader.Flags = ReadUInt16();
- m_BlockHeader.HeadSize = ReadUInt16();
-
- if (m_BlockHeader.HeadSize < 7)
- ThrowExceptionWithCode(CInArchiveException::kIncorrectArchive);
-
- if (m_BlockHeader.Type == NHeader::NBlockType::kEndOfArchive)
- return S_FALSE;
-
- if (m_BlockHeader.Type == NHeader::NBlockType::kFileHeader)
- {
- m_FileHeaderData.EnsureCapacity(m_BlockHeader.HeadSize);
- m_CurData = (Byte *)m_FileHeaderData;
- m_PosLimit = m_BlockHeader.HeadSize;
- if (!ReadBytesAndTestSize(m_CurData + m_CurPos, m_BlockHeader.HeadSize - 7))
- {
- errorMessage = k_UnexpectedEnd;
- return S_FALSE;
- }
-
- ReadHeaderReal(item);
- if ((CrcCalc(m_CurData + 2,
- m_BlockHeader.HeadSize - item.CommentSize - 2) & 0xFFFF) != m_BlockHeader.CRC)
- ThrowExceptionWithCode(CInArchiveException::kFileHeaderCRCError);
-
- FinishCryptoBlock();
- m_CryptoMode = false;
- SeekInArchive(m_Position); // Move Position to compressed Data;
- AddToSeekValue(item.PackSize); // m_Position points to next header;
- return S_OK;
- }
- if (m_CryptoMode && m_BlockHeader.HeadSize > (1 << 10))
- {
- decryptionError = true;
- errorMessage = k_DecryptionError;
- return S_FALSE;
- }
- if ((m_BlockHeader.Flags & NHeader::NBlock::kLongBlock) != 0)
- {
- m_FileHeaderData.EnsureCapacity(7 + 4);
- m_CurData = (Byte *)m_FileHeaderData;
- if (!ReadBytesAndTestSize(m_CurData + m_CurPos, 4))
- {
- errorMessage = k_UnexpectedEnd;
- return S_FALSE;
- }
- m_PosLimit = 7 + 4;
- UInt32 dataSize = ReadUInt32();
- AddToSeekValue(dataSize);
- if (m_CryptoMode && dataSize > (1 << 27))
- {
- decryptionError = true;
- errorMessage = k_DecryptionError;
- return S_FALSE;
- }
- m_CryptoPos = m_BlockHeader.HeadSize;
- }
- else
- m_CryptoPos = 0;
- AddToSeekValue(m_BlockHeader.HeadSize);
- FinishCryptoBlock();
- m_CryptoMode = false;
- }
-}
-
-void CInArchive::SeekInArchive(UInt64 position)
-{
- m_Stream->Seek(position, STREAM_SEEK_SET, NULL);
-}
-
-ISequentialInStream* CInArchive::CreateLimitedStream(UInt64 position, UInt64 size)
-{
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- SeekInArchive(position);
- streamSpec->SetStream(m_Stream);
- streamSpec->Init(size);
- return inStream.Detach();
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarIn.h
deleted file mode 100644
index a6998db26..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarIn.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// RarIn.h
-
-#ifndef __ARCHIVE_RAR_IN_H
-#define __ARCHIVE_RAR_IN_H
-
-#include "Common/DynamicBuffer.h"
-#include "Common/MyCom.h"
-
-#include "../../ICoder.h"
-#include "../../IStream.h"
-
-#include "../../Common/StreamObjects.h"
-
-#include "../../Crypto/RarAes.h"
-
-#include "RarHeader.h"
-#include "RarItem.h"
-
-namespace NArchive {
-namespace NRar {
-
-class CInArchiveException
-{
-public:
- enum CCauseType
- {
- kUnexpectedEndOfArchive = 0,
- kArchiveHeaderCRCError,
- kFileHeaderCRCError,
- kIncorrectArchive
- }
- Cause;
- CInArchiveException(CCauseType cause) : Cause(cause) {}
-};
-
-
-struct CInArchiveInfo
-{
- UInt32 Flags;
- Byte EncryptVersion;
- UInt64 StartPosition;
-
- bool IsSolid() const { return (Flags & NHeader::NArchive::kSolid) != 0; }
- bool IsCommented() const { return (Flags & NHeader::NArchive::kComment) != 0; }
- bool IsVolume() const { return (Flags & NHeader::NArchive::kVolume) != 0; }
- bool HaveNewVolumeName() const { return (Flags & NHeader::NArchive::kNewVolName) != 0; }
- bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; }
- bool IsThereEncryptVer() const { return (Flags & NHeader::NArchive::kEncryptVer) != 0; }
- bool IsEncryptOld() const { return (!IsThereEncryptVer() || EncryptVersion < 36); }
-};
-
-class CInArchive
-{
- CMyComPtr<IInStream> m_Stream;
-
- UInt64 m_StreamStartPosition;
-
- CInArchiveInfo _header;
- CDynamicBuffer<char> m_NameBuffer;
- CDynamicBuffer<wchar_t> _unicodeNameBuffer;
-
- CByteBuffer _comment;
-
- void ReadName(CItemEx &item, int nameSize);
- void ReadHeaderReal(CItemEx &item);
-
- HRESULT ReadBytesSpec(void *data, size_t *size);
- bool ReadBytesAndTestSize(void *data, UInt32 size);
-
- HRESULT Open2(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
-
- void ThrowExceptionWithCode(CInArchiveException::CCauseType cause);
- void ThrowUnexpectedEndOfArchiveException();
-
- void AddToSeekValue(UInt64 addValue);
-
- CDynamicBuffer<Byte> m_FileHeaderData;
-
- NHeader::NBlock::CBlock m_BlockHeader;
-
- NCrypto::NRar29::CDecoder *m_RarAESSpec;
- CMyComPtr<ICompressFilter> m_RarAES;
-
- Byte *m_CurData; // it must point to start of Rar::Block
- UInt32 m_CurPos;
- UInt32 m_PosLimit;
- Byte ReadByte();
- UInt16 ReadUInt16();
- UInt32 ReadUInt32();
- void ReadTime(Byte mask, CRarTime &rarTime);
-
- CBuffer<Byte> m_DecryptedData;
- Byte *m_DecryptedDataAligned;
- UInt32 m_DecryptedDataSize;
-
- bool m_CryptoMode;
- UInt32 m_CryptoPos;
- void FinishCryptoBlock()
- {
- if (m_CryptoMode)
- while ((m_CryptoPos & 0xF) != 0)
- {
- m_CryptoPos++;
- m_Position++;
- }
- }
-
-public:
- UInt64 m_Position;
-
- HRESULT Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit);
- void Close();
- HRESULT GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword, bool &decryptionError, AString &errorMessage);
-
- void GetArchiveInfo(CInArchiveInfo &archiveInfo) const;
-
- void SeekInArchive(UInt64 position);
- ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarItem.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarItem.cpp
deleted file mode 100644
index 9216ae57b..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarItem.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-// RarItem.cpp
-
-#include "StdAfx.h"
-
-#include "RarItem.h"
-
-namespace NArchive{
-namespace NRar{
-
-bool CItem::IgnoreItem() const
-{
- switch(HostOS)
- {
- case NHeader::NFile::kHostMSDOS:
- case NHeader::NFile::kHostOS2:
- case NHeader::NFile::kHostWin32:
- return ((Attrib & NHeader::NFile::kLabelFileAttribute) != 0);
- }
- return false;
-}
-
-bool CItem::IsDir() const
-{
- if (GetDictSize() == NHeader::NFile::kDictDirectoryValue)
- return true;
- switch(HostOS)
- {
- case NHeader::NFile::kHostMSDOS:
- case NHeader::NFile::kHostOS2:
- case NHeader::NFile::kHostWin32:
- if ((Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0)
- return true;
- }
- return false;
-}
-
-UInt32 CItem::GetWinAttributes() const
-{
- UInt32 winAttributes;
- switch(HostOS)
- {
- case NHeader::NFile::kHostMSDOS:
- case NHeader::NFile::kHostOS2:
- case NHeader::NFile::kHostWin32:
- winAttributes = Attrib;
- break;
- default:
- winAttributes = 0; // must be converted from unix value;
- }
- if (IsDir())
- winAttributes |= NHeader::NFile::kWinFileDirectoryAttributeMask;
- return winAttributes;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarItem.h b/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarItem.h
deleted file mode 100644
index 4aa4d8667..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarItem.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// RarItem.h
-
-#ifndef __ARCHIVE_RAR_ITEM_H
-#define __ARCHIVE_RAR_ITEM_H
-
-#include "Common/Types.h"
-#include "Common/MyString.h"
-
-#include "RarHeader.h"
-
-namespace NArchive{
-namespace NRar{
-
-struct CRarTime
-{
- UInt32 DosTime;
- Byte LowSecond;
- Byte SubTime[3];
-};
-
-struct CItem
-{
- UInt64 Size;
- UInt64 PackSize;
-
- CRarTime CTime;
- CRarTime ATime;
- CRarTime MTime;
-
- UInt32 FileCRC;
- UInt32 Attrib;
-
- UInt16 Flags;
- Byte HostOS;
- Byte UnPackVersion;
- Byte Method;
-
- bool CTimeDefined;
- bool ATimeDefined;
-
- AString Name;
- UString UnicodeName;
-
- Byte Salt[8];
-
- bool IsEncrypted() const { return (Flags & NHeader::NFile::kEncrypted) != 0; }
- bool IsSolid() const { return (Flags & NHeader::NFile::kSolid) != 0; }
- bool IsCommented() const { return (Flags & NHeader::NFile::kComment) != 0; }
- bool IsSplitBefore() const { return (Flags & NHeader::NFile::kSplitBefore) != 0; }
- bool IsSplitAfter() const { return (Flags & NHeader::NFile::kSplitAfter) != 0; }
- bool HasSalt() const { return (Flags & NHeader::NFile::kSalt) != 0; }
- bool HasExtTime() const { return (Flags & NHeader::NFile::kExtTime) != 0; }
- bool HasUnicodeName()const { return (Flags & NHeader::NFile::kUnicodeName) != 0; }
- bool IsOldVersion() const { return (Flags & NHeader::NFile::kOldVersion) != 0; }
-
- UInt32 GetDictSize() const { return (Flags >> NHeader::NFile::kDictBitStart) & NHeader::NFile::kDictMask; }
- bool IsDir() const;
- bool IgnoreItem() const;
- UInt32 GetWinAttributes() const;
-
- CItem(): CTimeDefined(false), ATimeDefined(false) {}
-};
-
-class CItemEx: public CItem
-{
-public:
- UInt64 Position;
- UInt16 MainPartSize;
- UInt16 CommentSize;
- UInt16 AlignSize;
- UInt64 GetFullSize() const { return MainPartSize + CommentSize + AlignSize + PackSize; };
- // DWORD GetHeaderWithCommentSize() const { return MainPartSize + CommentSize; };
- UInt64 GetCommentPosition() const { return Position + MainPartSize; };
- UInt64 GetDataPosition() const { return GetCommentPosition() + CommentSize + AlignSize; };
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarRegister.cpp
deleted file mode 100644
index 2bcf569ef..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// RarRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "RarHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NRar::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Rar", L"rar r00", 0, 3, {0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}, 7, false, CreateArc, 0, };
-
-REGISTER_ARC(Rar)
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp
deleted file mode 100644
index 25194f915..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-// RarVolumeInStream.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/7zCrc.h"
-
-#include "RarVolumeInStream.h"
-
-namespace NArchive {
-namespace NRar {
-
-void CFolderInStream::Init(
- CObjectVector<CInArchive> *archives,
- const CObjectVector<CItemEx> *items,
- const CRefItem &refItem)
-{
- _archives = archives;
- _items = items;
- _refItem = refItem;
- _curIndex = 0;
- CRCs.Clear();
- _fileIsOpen = false;
-}
-
-HRESULT CFolderInStream::OpenStream()
-{
- while (_curIndex < _refItem.NumItems)
- {
- const CItemEx &item = (*_items)[_refItem.ItemIndex + _curIndex];
- _stream.Attach((*_archives)[_refItem.VolumeIndex + _curIndex].
- CreateLimitedStream(item.GetDataPosition(), item.PackSize));
- _curIndex++;
- _fileIsOpen = true;
- _crc = CRC_INIT_VAL;
- return S_OK;
- }
- return S_OK;
-}
-
-HRESULT CFolderInStream::CloseStream()
-{
- CRCs.Add(CRC_GET_DIGEST(_crc));
- _stream.Release();
- _fileIsOpen = false;
- return S_OK;
-}
-
-STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize = 0;
- while ((_curIndex < _refItem.NumItems || _fileIsOpen) && size > 0)
- {
- if (_fileIsOpen)
- {
- UInt32 localProcessedSize;
- RINOK(_stream->Read(
- ((Byte *)data) + realProcessedSize, size, &localProcessedSize));
- _crc = CrcUpdate(_crc, ((Byte *)data) + realProcessedSize, localProcessedSize);
- if (localProcessedSize == 0)
- {
- RINOK(CloseStream());
- continue;
- }
- realProcessedSize += localProcessedSize;
- size -= localProcessedSize;
- break;
- }
- else
- {
- RINOK(OpenStream());
- }
- }
- if (processedSize != 0)
- *processedSize = realProcessedSize;
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarVolumeInStream.h b/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarVolumeInStream.h
deleted file mode 100644
index 78d95b10f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/RarVolumeInStream.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// RarVolumeInStream.h
-
-#ifndef __RAR_VOLUME_IN_STREAM_H
-#define __RAR_VOLUME_IN_STREAM_H
-
-#include "../../IStream.h"
-#include "RarIn.h"
-
-namespace NArchive {
-namespace NRar {
-
-struct CRefItem
-{
- int VolumeIndex;
- int ItemIndex;
- int NumItems;
-};
-
-class CFolderInStream:
- public ISequentialInStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-
-private:
- CObjectVector<CInArchive> *_archives;
- const CObjectVector<CItemEx> *_items;
- CRefItem _refItem;
- int _curIndex;
- UInt32 _crc;
- bool _fileIsOpen;
- CMyComPtr<ISequentialInStream> _stream;
-
- HRESULT OpenStream();
- HRESULT CloseStream();
-public:
- void Init(CObjectVector<CInArchive> *archives,
- const CObjectVector<CItemEx> *items,
- const CRefItem &refItem);
-
- CRecordVector<UInt32> CRCs;
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/StdAfx.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Rar/StdAfx.cpp
deleted file mode 100644
index d0feea85c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/StdAfx.cpp
+++ /dev/null
@@ -1,3 +0,0 @@
-// StdAfx.cpp
-
-#include "StdAfx.h"
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Rar/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Rar/StdAfx.h
deleted file mode 100644
index e7fb6986d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Rar/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/MyWindows.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/RpmHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/RpmHandler.cpp
deleted file mode 100644
index 1d31d4514..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/RpmHandler.cpp
+++ /dev/null
@@ -1,292 +0,0 @@
-// RpmHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-using namespace NWindows;
-
-#define Get16(p) GetBe16(p)
-#define Get32(p) GetBe32(p)
-
-namespace NArchive {
-namespace NRpm {
-
-/* Reference: lib/signature.h of rpm package */
-#define RPMSIG_NONE 0 /* Do not change! */
-/* The following types are no longer generated */
-#define RPMSIG_PGP262_1024 1 /* No longer generated */ /* 256 byte */
-/* These are the new-style signatures. They are Header structures. */
-/* Inside them we can put any number of any type of signature we like. */
-
-#define RPMSIG_HEADERSIG 5 /* New Header style signature */
-
-const UInt32 kLeadSize = 96;
-struct CLead
-{
- unsigned char Magic[4];
- unsigned char Major; // not supported ver1, only support 2,3 and lator
- unsigned char Minor;
- UInt16 Type;
- UInt16 ArchNum;
- char Name[66];
- UInt16 OSNum;
- UInt16 SignatureType;
- char Reserved[16]; // pad to 96 bytes -- 8 byte aligned
- bool MagicCheck() const
- { return Magic[0] == 0xed && Magic[1] == 0xab && Magic[2] == 0xee && Magic[3] == 0xdb; };
-};
-
-const UInt32 kEntryInfoSize = 16;
-/*
-struct CEntryInfo
-{
- int Tag;
- int Type;
- int Offset; // Offset from beginning of data segment, only defined on disk
- int Count;
-};
-*/
-
-// case: SignatureType == RPMSIG_HEADERSIG
-const UInt32 kCSigHeaderSigSize = 16;
-struct CSigHeaderSig
-{
- unsigned char Magic[4];
- UInt32 Reserved;
- UInt32 IndexLen; // count of index entries
- UInt32 DataLen; // number of bytes
- bool MagicCheck()
- { return Magic[0] == 0x8e && Magic[1] == 0xad && Magic[2] == 0xe8 && Magic[3] == 0x01; };
- UInt32 GetLostHeaderLen()
- { return IndexLen * kEntryInfoSize + DataLen; };
-};
-
-static HRESULT RedSigHeaderSig(IInStream *inStream, CSigHeaderSig &h)
-{
- char dat[kCSigHeaderSigSize];
- char *cur = dat;
- RINOK(ReadStream_FALSE(inStream, dat, kCSigHeaderSigSize));
- memcpy(h.Magic, cur, 4);
- cur += 4;
- cur += 4;
- h.IndexLen = Get32(cur);
- cur += 4;
- h.DataLen = Get32(cur);
- return S_OK;
-}
-
-HRESULT OpenArchive(IInStream *inStream)
-{
- UInt64 pos;
- char leadData[kLeadSize];
- char *cur = leadData;
- CLead lead;
- RINOK(ReadStream_FALSE(inStream, leadData, kLeadSize));
- memcpy(lead.Magic, cur, 4);
- cur += 4;
- lead.Major = *cur++;
- lead.Minor = *cur++;
- lead.Type = Get16(cur);
- cur += 2;
- lead.ArchNum = Get16(cur);
- cur += 2;
- memcpy(lead.Name, cur, sizeof(lead.Name));
- cur += sizeof(lead.Name);
- lead.OSNum = Get16(cur);
- cur += 2;
- lead.SignatureType = Get16(cur);
- cur += 2;
-
- if (!lead.MagicCheck() || lead.Major < 3)
- return S_FALSE;
-
- CSigHeaderSig sigHeader, header;
- if (lead.SignatureType == RPMSIG_NONE)
- {
- ;
- }
- else if (lead.SignatureType == RPMSIG_PGP262_1024)
- {
- UInt64 pos;
- RINOK(inStream->Seek(256, STREAM_SEEK_CUR, &pos));
- }
- else if (lead.SignatureType == RPMSIG_HEADERSIG)
- {
- RINOK(RedSigHeaderSig(inStream, sigHeader));
- if (!sigHeader.MagicCheck())
- return S_FALSE;
- UInt32 len = sigHeader.GetLostHeaderLen();
- RINOK(inStream->Seek(len, STREAM_SEEK_CUR, &pos));
- if ((pos % 8) != 0)
- {
- RINOK(inStream->Seek((pos / 8 + 1) * 8 - pos,
- STREAM_SEEK_CUR, &pos));
- }
- }
- else
- return S_FALSE;
-
- RINOK(RedSigHeaderSig(inStream, header));
- if (!header.MagicCheck())
- return S_FALSE;
- int headerLen = header.GetLostHeaderLen();
- if (headerLen == -1)
- return S_FALSE;
- RINOK(inStream->Seek(headerLen, STREAM_SEEK_CUR, &pos));
- return S_OK;
-}
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- UInt64 _pos;
- UInt64 _size;
- Byte _sig[4];
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID) { case kpidMainSubfile: prop = (UInt32)0; break; }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- try
- {
- Close();
- if (OpenArchive(inStream) != S_OK)
- return S_FALSE;
- RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &_pos));
- RINOK(ReadStream_FALSE(inStream, _sig, sizeof(_sig) / sizeof(_sig[0])));
- UInt64 endPosition;
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPosition));
- _size = endPosition - _pos;
- _stream = inStream;
- return S_OK;
- }
- catch(...) { return S_FALSE; }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidSize:
- case kpidPackSize:
- prop = _size;
- break;
- case kpidExtension:
- {
- char s[32];
- MyStringCopy(s, "cpio.");
- const char *ext;
- if (_sig[0] == 0x1F && _sig[1] == 0x8B)
- ext = "gz";
- else if (_sig[0] == 'B' && _sig[1] == 'Z' && _sig[2] == 'h')
- ext = "bz2";
- else
- ext = "lzma";
- MyStringCopy(s + MyStringLen(s), ext);
- prop = s;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- RINOK(extractCallback->SetTotal(_size));
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &outStream, askMode));
- if (!testMode && !outStream)
- return S_OK;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- CMyComPtr<ICompressCoder> copyCoder = new NCompress::CCopyCoder;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- RINOK(_stream->Seek(_pos, STREAM_SEEK_SET, NULL));
- RINOK(copyCoder->Code(_stream, outStream, NULL, NULL, progress));
- outStream.Release();
- return extractCallback->SetOperationResult(NExtract::NOperationResult::kOK);
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 /* index */, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- return CreateLimitedInStream(_stream, _pos, _size, stream);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NRpm::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Rpm", L"rpm", 0, 0xEB, { 0xED, 0xAB, 0xEE, 0xDB}, 4, false, CreateArc, 0 };
-
-REGISTER_ARC(Rpm)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/SquashfsHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/SquashfsHandler.cpp
deleted file mode 100644
index 2cc1219ad..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/SquashfsHandler.cpp
+++ /dev/null
@@ -1,2155 +0,0 @@
-// SquashfsHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/Alloc.h"
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariantUtils.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-#include "../Compress/ZlibDecoder.h"
-#include "../Compress/LzmaDecoder.h"
-
-namespace NArchive {
-namespace NSquashfs {
-
-static const UInt32 kNumFilesMax = (1 << 28);
-static const unsigned kNumDirLevelsMax = (1 << 10);
-
-// Layout: Header, Data, inodes, Directories, Fragments, UIDs, GIDs
-
-/*
-#define Get16(p) (be ? GetBe16(p) : GetUi16(p))
-#define Get32(p) (be ? GetBe32(p) : GetUi32(p))
-#define Get64(p) (be ? GetBe64(p) : GetUi64(p))
-*/
-
-UInt16 Get16b(const Byte *p, bool be) { return be ? GetBe16(p) : GetUi16(p); }
-UInt32 Get32b(const Byte *p, bool be) { return be ? GetBe32(p) : GetUi32(p); }
-UInt64 Get64b(const Byte *p, bool be) { return be ? GetBe64(p) : GetUi64(p); }
-
-#define Get16(p) Get16b(p, be)
-#define Get32(p) Get32b(p, be)
-#define Get64(p) Get64b(p, be)
-
-#define LE_16(offs, dest) dest = GetUi16(p + (offs));
-#define LE_32(offs, dest) dest = GetUi32(p + (offs));
-#define LE_64(offs, dest) dest = GetUi64(p + (offs));
-
-#define GET_16(offs, dest) dest = Get16(p + (offs));
-#define GET_32(offs, dest) dest = Get32(p + (offs));
-#define GET_64(offs, dest) dest = Get64(p + (offs));
-
-static const UInt32 kSignatureSize = 4;
-#define SIGNATURE { 'h', 's', 'q', 's' }
-static const UInt32 kSignature32_LE = 0x73717368;
-static const UInt32 kSignature32_BE = 0x68737173;
-static const UInt32 kSignature32_LZ = 0x71736873;
-
-#define kMethod_ZLIB 1
-#define kMethod_LZMA 2
-#define kMethod_LZO 3
-
-static const char *k_Methods[] =
-{
- "Unknown",
- "ZLIB",
- "LZMA",
- "LZO"
-};
-
-static const UInt32 kMetadataBlockSizeLog = 13;
-static const UInt32 kMetadataBlockSize = (1 << kMetadataBlockSizeLog);
-
-#define MY_S_IFIFO 0x1000
-#define MY_S_IFCHR 0x2000
-#define MY_S_IFDIR 0x4000
-#define MY_S_IFBLK 0x6000
-#define MY_S_IFREG 0x8000
-#define MY_S_IFLNK 0xA000
-#define MY_S_IFSOCK 0xC000
-
-enum
-{
- kType_IPC,
- kType_DIR,
- kType_FILE,
- kType_LNK,
- kType_BLK,
- kType_CHR,
- kType_FIFO,
- kType_SOCK
-};
-
-static const UInt32 k_TypeToMode[] =
-{
- 0,
- MY_S_IFDIR, MY_S_IFREG, MY_S_IFLNK, MY_S_IFBLK, MY_S_IFCHR, MY_S_IFIFO, MY_S_IFSOCK,
- MY_S_IFDIR, MY_S_IFREG, MY_S_IFLNK, MY_S_IFBLK, MY_S_IFCHR, MY_S_IFIFO, MY_S_IFSOCK
-};
-
-
-enum
-{
- kFlag_UNC_INODES,
- kFlag_UNC_DATA,
- kFlag_CHECK,
- kFlag_UNC_FRAGS,
- kFlag_NO_FRAGS,
- kFlag_ALWAYS_FRAG,
- kFlag_DUPLICATE,
- kFlag_EXPORT
-};
-
-static const CUInt32PCharPair k_Flags[] =
-{
- { kFlag_UNC_INODES, "UNCOMPRESSED_INODES" },
- { kFlag_UNC_DATA, "UNCOMPRESSED_DATA" },
- { kFlag_CHECK, "CHECK" },
- { kFlag_UNC_FRAGS, "UNCOMPRESSED_FRAGMENTS" },
- { kFlag_NO_FRAGS, "NO_FRAGMENTS" },
- { kFlag_ALWAYS_FRAG, "ALWAYS_FRAGMENTS" },
- { kFlag_DUPLICATE, "DUPLICATES_REMOVED" },
- { kFlag_EXPORT, "EXPORTABLE" }
-};
-
-static const UInt32 kNotCompressedBit16 = (1 << 15);
-static const UInt32 kNotCompressedBit32 = (1 << 24);
-
-#define GET_COMPRESSED_BLOCK_SIZE(size) ((size) & ~kNotCompressedBit32)
-#define IS_COMPRESSED_BLOCK(size) (((size) & kNotCompressedBit32) == 0)
-
-static const UInt32 kHeaderSize1 = 0x33;
-static const UInt32 kHeaderSize2 = 0x3F;
-static const UInt32 kHeaderSize3 = 0x77;
-static const UInt32 kHeaderSize4 = 0x60;
-
-struct CHeader
-{
- bool be;
- bool SeveralMethods;
- Byte NumUids;
- Byte NumGids;
-
- UInt32 NumInodes;
- UInt32 CTime;
- UInt32 BlockSize;
- UInt32 NumFrags;
- UInt16 Method;
- UInt16 BlockSizeLog;
- UInt16 Flags;
- UInt16 NumIDs;
- UInt16 Major;
- UInt16 Minor;
- UInt64 RootInode;
- UInt64 Size;
- UInt64 UidTable;
- UInt64 GidTable;
- UInt64 XattrIdTable;
- UInt64 InodeTable;
- UInt64 DirTable;
- UInt64 FragTable;
- UInt64 LookupTable;
-
- void Parse3(const Byte *p)
- {
- Method = kMethod_ZLIB;
- GET_32 (0x08, Size);
- GET_32 (0x0C, UidTable);
- GET_32 (0x10, GidTable);
- GET_32 (0x14, InodeTable);
- GET_32 (0x18, DirTable);
- GET_16 (0x20, BlockSize);
- GET_16 (0x22, BlockSizeLog);
- Flags = p[0x24];
- NumUids = p[0x25];
- NumGids = p[0x26];
- GET_32 (0x27, CTime);
- GET_64 (0x2B, RootInode);
- NumFrags = 0;
- FragTable = UidTable;
-
- if (Major >= 2)
- {
- GET_32 (0x33, BlockSize);
- GET_32 (0x37, NumFrags);
- GET_32 (0x3B, FragTable);
- if (Major == 3)
- {
- GET_64 (0x3F, Size);
- GET_64 (0x47, UidTable);
- GET_64 (0x4F, GidTable);
- GET_64 (0x57, InodeTable);
- GET_64 (0x5F, DirTable);
- GET_64 (0x67, FragTable);
- GET_64 (0x6F, LookupTable);
- }
- }
- }
-
- void Parse4(const Byte *p)
- {
- LE_32 (0x08, CTime);
- LE_32 (0x0C, BlockSize);
- LE_32 (0x10, NumFrags);
- LE_16 (0x14, Method);
- LE_16 (0x16, BlockSizeLog);
- LE_16 (0x18, Flags);
- LE_16 (0x1A, NumIDs);
- LE_64 (0x20, RootInode);
- LE_64 (0x28, Size);
- LE_64 (0x30, UidTable);
- LE_64 (0x38, XattrIdTable);
- LE_64 (0x40, InodeTable);
- LE_64 (0x48, DirTable);
- LE_64 (0x50, FragTable);
- LE_64 (0x58, LookupTable);
- GidTable = 0;
- }
-
- bool Parse(const Byte *p)
- {
- be = false;
- SeveralMethods = false;
- switch (GetUi32(p))
- {
- case kSignature32_LE: break;
- case kSignature32_BE: be = true; break;
- case kSignature32_LZ: SeveralMethods = true; break;
- default: return false;
- }
- GET_32 (4, NumInodes);
- GET_16 (0x1C, Major);
- GET_16 (0x1E, Minor);
- if (Major <= 3)
- Parse3(p);
- else
- {
- if (be)
- return false;
- Parse4(p);
- }
- return
- InodeTable < DirTable &&
- DirTable <= FragTable &&
- FragTable <= Size &&
- UidTable <= Size &&
- BlockSizeLog >= 12 &&
- BlockSizeLog < 31 &&
- BlockSize == ((UInt32)1 << BlockSizeLog);
- }
-
- bool IsSupported() const { return Major > 0 && Major <= 4 && BlockSizeLog <= 23; }
- bool IsOldVersion() const { return Major < 4; }
- bool NeedCheckData() const { return (Flags & (1 << kFlag_CHECK)) != 0; }
- unsigned GetFileNameOffset() const { return Major <= 2 ? 3 : (Major == 3 ? 5 : 8); }
- unsigned GetSymLinkOffset() const { return Major <= 1 ? 5: (Major <= 2 ? 6: (Major == 3 ? 18 : 24)); }
- unsigned GetSpecGuidIndex() const { return Major <= 1 ? 0xF: 0xFF; }
-};
-
-static const UInt32 kFrag_Empty = (UInt32)(Int32)-1;
-// static const UInt32 kXattr_Empty = (UInt32)(Int32)-1;
-
-struct CNode
-{
- UInt16 Type;
- UInt16 Mode;
- UInt16 Uid;
- UInt16 Gid;
- UInt32 Frag;
- UInt32 Offset;
- // UInt32 MTime;
- // UInt32 Number;
- // UInt32 NumLinks;
- // UInt32 RDev;
- // UInt32 Xattr;
- // UInt32 Parent;
-
- UInt64 FileSize;
- UInt64 StartBlock;
- // UInt64 Sparse;
-
- UInt32 Parse1(const Byte *p, UInt32 size, const CHeader &_h);
- UInt32 Parse2(const Byte *p, UInt32 size, const CHeader &_h);
- UInt32 Parse3(const Byte *p, UInt32 size, const CHeader &_h);
- UInt32 Parse4(const Byte *p, UInt32 size, const CHeader &_h);
-
- bool IsDir() const { return (Type == kType_DIR || Type == kType_DIR + 7); }
- bool IsLink() const { return (Type == kType_LNK || Type == kType_LNK + 7); }
- UInt64 GetSize() const { return IsDir() ? 0 : FileSize; }
-
- bool ThereAreFrags() const { return Frag != kFrag_Empty; }
- UInt64 GetNumBlocks(const CHeader &_h) const
- {
- return (FileSize >> _h.BlockSizeLog) +
- (!ThereAreFrags() && (FileSize & (_h.BlockSize - 1)) != 0);
- }
-};
-
-UInt32 CNode::Parse1(const Byte *p, UInt32 size, const CHeader &_h)
-{
- bool be = _h.be;
- if (size < 4)
- return 0;
- UInt16 t = Get16(p);
- if (be)
- {
- Type = t >> 12;
- Mode = t & 0xFFF;
- Uid = p[2] >> 4;
- Gid = p[2] & 0xF;
- }
- else
- {
- Type = t & 0xF;
- Mode = t >> 4;
- Uid = p[2] & 0xF;
- Gid = p[2] >> 4;
- }
-
- // Xattr = kXattr_Empty;
- // MTime = 0;
- FileSize = 0;
- StartBlock = 0;
- Frag = kFrag_Empty;
-
- if (Type == 0)
- {
- Byte t = p[3];
- if (be)
- {
- Type = t >> 4;
- Offset = t & 0xF;
- }
- else
- {
- Type = t & 0xF;
- Offset = t >> 4;
- }
- return (Type == kType_FIFO || Type == kType_SOCK) ? 4 : 0;
- }
-
- Type--;
- Uid += (Type / 5) * 16;
- Type = (Type % 5) + 1;
-
- if (Type == kType_FILE)
- {
- if (size < 15)
- return 0;
- // GET_32 (3, MTime);
- GET_32 (7, StartBlock);
- UInt32 t;
- GET_32 (11, t);
- FileSize = t;
- UInt32 numBlocks = t >> _h.BlockSizeLog;
- if ((t & (_h.BlockSize - 1)) != 0)
- numBlocks++;
- UInt32 pos = numBlocks * 2 + 15;
- return (pos <= size) ? pos : 0;
- }
-
- if (Type == kType_DIR)
- {
- if (size < 14)
- return 0;
- UInt32 t = Get32(p + 3);
- if (be)
- {
- FileSize = t >> 13;
- Offset = t & 0x1FFF;
- }
- else
- {
- FileSize = t & 0x7FFFF;
- Offset = t >> 19;
- }
- // GET_32 (7, MTime);
- GET_32 (10, StartBlock);
- if (be)
- StartBlock &= 0xFFFFFF;
- else
- StartBlock >>= 8;
- return 14;
- }
-
- if (size < 5)
- return 0;
-
- if (Type == kType_LNK)
- {
- UInt32 len;
- GET_16 (3, len);
- FileSize = len;
- len += 5;
- return (len <= size) ? len : 0;
- }
-
- // GET_32 (3, RDev);
- return 5;
-}
-
-UInt32 CNode::Parse2(const Byte *p, UInt32 size, const CHeader &_h)
-{
- bool be = _h.be;
- if (size < 4)
- return 0;
- UInt16 t = Get16(p);
- if (be)
- {
- Type = t >> 12;
- Mode = t & 0xFFF;
- }
- else
- {
- Type = t & 0xF;
- Mode = t >> 4;
- }
- Uid = p[2];
- Gid = p[3];
-
- // Xattr = kXattr_Empty;
-
- if (Type == kType_FILE)
- {
- if (size < 24)
- return 0;
- // GET_32 (4, MTime);
- GET_32 (8, StartBlock);
- GET_32 (12, Frag);
- GET_32 (16, Offset);
- UInt32 t;
- GET_32 (20, t);
- FileSize = t;
- UInt32 numBlocks = t >> _h.BlockSizeLog;
- if (!ThereAreFrags() && (t & (_h.BlockSize - 1)) != 0)
- numBlocks++;
- UInt32 pos = numBlocks * 4 + 24;
- return (pos <= size) ? (UInt32)pos : 0;
- }
-
- FileSize = 0;
- // MTime = 0;
- StartBlock = 0;
- Frag = kFrag_Empty;
-
- if (Type == kType_DIR)
- {
- if (size < 15)
- return 0;
- UInt32 t = Get32(p + 4);
- if (be)
- {
- FileSize = t >> 13;
- Offset = t & 0x1FFF;
- }
- else
- {
- FileSize = t & 0x7FFFF;
- Offset = t >> 19;
- }
- // GET_32 (8, MTime);
- GET_32 (11, StartBlock);
- if (be)
- StartBlock &= 0xFFFFFF;
- else
- StartBlock >>= 8;
- return 15;
- }
-
- if (Type == kType_DIR + 7)
- {
- if (size < 18)
- return 0;
- UInt32 t = Get32(p + 4);
- UInt32 t2 = Get16(p + 7);
- if (be)
- {
- FileSize = t >> 5;
- Offset = t2 & 0x1FFF;
- }
- else
- {
- FileSize = t & 0x7FFFFFF;
- Offset = t2 >> 3;
- }
- // GET_32 (9, MTime);
- GET_32 (12, StartBlock);
- if (be)
- StartBlock &= 0xFFFFFF;
- else
- StartBlock >>= 8;
- UInt32 iCount;
- GET_16 (16, iCount);
- UInt32 pos = 18;
- for (UInt32 i = 0; i < iCount; i++)
- {
- // 27 bits: index
- // 29 bits: startBlock
- if (pos + 8 > size)
- return 0;
- pos += 8 + (UInt32)p[pos + 7] + 1; // nameSize
- if (pos > size)
- return 0;
- }
- return pos;
- }
-
- if (Type == kType_FIFO || Type == kType_SOCK)
- return 4;
-
- if (size < 6)
- return 0;
-
- if (Type == kType_LNK)
- {
- UInt32 len;
- GET_16 (4, len);
- FileSize = len;
- len += 6;
- return (len <= size) ? len : 0;
- }
-
- if (Type == kType_BLK || Type == kType_CHR)
- {
- // GET_16 (4, RDev);
- return 6;
- }
-
- return 0;
-}
-
-UInt32 CNode::Parse3(const Byte *p, UInt32 size, const CHeader &_h)
-{
- bool be = _h.be;
- if (size < 12)
- return 0;
- UInt16 t = Get16(p);
- if (be)
- {
- Type = t >> 12;
- Mode = t & 0xFFF;
- }
- else
- {
- Type = t & 0xF;
- Mode = t >> 4;
- }
- Uid = p[2];
- Gid = p[3];
- // GET_32 (4, MTime);
- // GET_32 (8, Number);
- // Xattr = kXattr_Empty;
- FileSize = 0;
- StartBlock = 0;
-
- if (Type == kType_FILE || Type == kType_FILE + 7)
- {
- UInt32 offset;
- if (Type == kType_FILE)
- {
- if (size < 32)
- return 0;
- GET_64 (12, StartBlock);
- GET_32 (20, Frag);
- GET_32 (24, Offset);
- GET_32 (28, FileSize);
- offset = 32;
- }
- else
- {
- if (size < 40)
- return 0;
- // GET_32 (12, NumLinks);
- GET_64 (16, StartBlock);
- GET_32 (24, Frag);
- GET_32 (28, Offset);
- GET_64 (32, FileSize);
- offset = 40;
- }
- UInt64 pos = GetNumBlocks(_h) * 4 + offset;
- return (pos <= size) ? (UInt32)pos : 0;
- }
-
- if (size < 16)
- return 0;
- // GET_32 (12, NumLinks);
-
- if (Type == kType_DIR)
- {
- if (size < 28)
- return 0;
- UInt32 t = Get32(p + 16);
- if (be)
- {
- FileSize = t >> 13;
- Offset = t & 0x1FFF;
- }
- else
- {
- FileSize = t & 0x7FFFF;
- Offset = t >> 19;
- }
- GET_32 (20, StartBlock);
- // GET_32 (24, Parent);
- return 28;
- }
-
- if (Type == kType_DIR + 7)
- {
- if (size < 31)
- return 0;
- UInt32 t = Get32(p + 16);
- UInt32 t2 = Get16(p + 19);
- if (be)
- {
- FileSize = t >> 5;
- Offset = t2 & 0x1FFF;
- }
- else
- {
- FileSize = t & 0x7FFFFFF;
- Offset = t2 >> 3;
- }
- GET_32 (21, StartBlock);
- UInt32 iCount;
- GET_16 (25, iCount);
- // GET_32 (27, Parent);
- UInt32 pos = 31;
- for (UInt32 i = 0; i < iCount; i++)
- {
- // UInt32 index
- // UInt32 startBlock
- if (pos + 9 > size)
- return 0;
- pos += 9 + (unsigned)p[pos + 8] + 1; // nameSize
- if (pos > size)
- return 0;
- }
- return pos;
- }
-
- if (Type == kType_FIFO || Type == kType_SOCK)
- return 16;
-
- if (size < 18)
- return 0;
- if (Type == kType_LNK)
- {
- UInt32 len;
- GET_16 (16, len);
- FileSize = len;
- len += 18;
- return (len <= size) ? len : 0;
- }
-
- if (Type == kType_BLK || Type == kType_CHR)
- {
- // GET_16 (16, RDev);
- return 18;
- }
-
- return 0;
-}
-
-UInt32 CNode::Parse4(const Byte *p, UInt32 size, const CHeader &_h)
-{
- if (size < 20)
- return 0;
- LE_16 (0, Type);
- LE_16 (2, Mode);
- LE_16 (4, Uid);
- LE_16 (6, Gid);
- // LE_32 (8, MTime);
- // LE_32 (12, Number);
-
- // Xattr = kXattr_Empty;
- FileSize = 0;
- StartBlock = 0;
-
- if (Type == kType_FILE || Type == kType_FILE + 7)
- {
- UInt32 offset;
- if (Type == kType_FILE)
- {
- if (size < 32)
- return 0;
- LE_32 (16, StartBlock);
- LE_32 (20, Frag);
- LE_32 (24, Offset);
- LE_32 (28, FileSize);
- offset = 32;
- }
- else
- {
- if (size < 56)
- return 0;
- LE_64 (16, StartBlock);
- LE_64 (24, FileSize);
- // LE_64 (32, Sparse);
- // LE_32 (40, NumLinks);
- LE_32 (44, Frag);
- LE_32 (48, Offset);
- // LE_32 (52, Xattr);
- offset = 56;
- }
- UInt64 pos = GetNumBlocks(_h) * 4 + offset;
- return (pos <= size) ? (UInt32)pos : 0;
- }
-
- if (Type == kType_DIR)
- {
- if (size < 32)
- return 0;
- LE_32 (16, StartBlock);
- // LE_32 (20, NumLinks);
- LE_16 (24, FileSize);
- LE_16 (26, Offset);
- // LE_32 (28, Parent);
- return 32;
- }
-
- // LE_32 (16, NumLinks);
-
- if (Type == kType_DIR + 7)
- {
- if (size < 40)
- return 0;
- LE_32 (20, FileSize);
- LE_32 (24, StartBlock);
- // LE_32 (28, Parent);
- UInt32 iCount;
- LE_16 (32, iCount);
- LE_16 (34, Offset);
- // LE_32 (36, Xattr);
-
- UInt32 pos = 40;
- for (UInt32 i = 0; i < iCount; i++)
- {
- // UInt32 index
- // UInt32 startBlock
- if (pos + 12 > size)
- return 0;
- UInt32 nameLen = GetUi32(p + pos + 8);
- pos += 12 + nameLen + 1;
- if (pos > size || nameLen > (1 << 10))
- return 0;
- }
- return pos;
- }
-
- unsigned offset = 20;
- switch(Type)
- {
- case kType_FIFO: case kType_FIFO + 7:
- case kType_SOCK: case kType_SOCK + 7:
- break;
- case kType_LNK: case kType_LNK + 7:
- {
- if (size < 24)
- return 0;
- UInt32 len;
- LE_32 (20, len);
- FileSize = len;
- offset = len + 24;
- if (size < offset || len > (1 << 30))
- return 0;
- break;
- }
- case kType_BLK: case kType_BLK + 7:
- case kType_CHR: case kType_CHR + 7:
- if (size < 24)
- return 0;
- // LE_32 (20, RDev);
- offset = 24;
- break;
- default:
- return 0;
- }
-
- if (Type >= 8)
- {
- if (size < offset + 4)
- return 0;
- // LE_32 (offset, Xattr);
- offset += 4;
- }
- return offset;
-}
-
-struct CItem
-{
- int Node;
- int Parent;
- UInt32 Ptr;
-};
-
-struct CData
-{
- CByteBuffer Data;
- CRecordVector<UInt32> PackPos;
- CRecordVector<UInt32> UnpackPos; // additional item at the end contains TotalUnpackSize
-
- UInt32 GetNumBlocks() const { return PackPos.Size(); }
- void Clear()
- {
- Data.Free();
- PackPos.Clear();
- UnpackPos.Clear();
- }
-};
-
-struct CFrag
-{
- UInt64 StartBlock;
- UInt32 Size;
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CRecordVector<CItem> _items;
- CRecordVector<CNode> _nodes;
- CRecordVector<UInt32> _nodesPos;
- CRecordVector<UInt32> _blockToNode;
- CData _inodesData;
- CData _dirs;
- CRecordVector<CFrag> _frags;
- // CByteBuffer _uids;
- // CByteBuffer _gids;
- CHeader _h;
-
- CMyComPtr<IInStream> _stream;
- UInt64 _sizeCalculated;
-
- IArchiveOpenCallback *_openCallback;
-
- int _nodeIndex;
- CRecordVector<bool> _blockCompressed;
- CRecordVector<UInt64> _blockOffsets;
-
- CByteBuffer _cachedBlock;
- UInt64 _cachedBlockStartPos;
- UInt32 _cachedPackBlockSize;
- UInt32 _cachedUnpackBlockSize;
-
- CLimitedSequentialInStream *_limitedInStreamSpec;
- CMyComPtr<ISequentialInStream> _limitedInStream;
-
- CBufPtrSeqOutStream *_outStreamSpec;
- CMyComPtr<ISequentialOutStream> _outStream;
-
- NCompress::NLzma::CDecoder *_lzmaDecoderSpec;
- CMyComPtr<ICompressCoder> _lzmaDecoder;
-
- NCompress::NZlib::CDecoder *_zlibDecoderSpec;
- CMyComPtr<ICompressCoder> _zlibDecoder;
-
- CByteBuffer _inputBuffer;
-
- CDynBufSeqOutStream *_dynOutStreamSpec;
- CMyComPtr<ISequentialOutStream> _dynOutStream;
-
- void ClearCache()
- {
- _cachedBlockStartPos = 0;
- _cachedPackBlockSize = 0;
- _cachedUnpackBlockSize = 0;
- }
-
- HRESULT Decompress(ISequentialOutStream *outStream, Byte *outBuf, bool *outBufWasWritten, UInt32 *outBufWasWrittenSize,
- UInt32 inSize, UInt32 outSizeMax);
- HRESULT ReadMetadataBlock(UInt32 &packSize);
- HRESULT ReadData(CData &data, UInt64 start, UInt64 end);
-
- HRESULT OpenDir(int parent, UInt32 startBlock, UInt32 offset, unsigned level, int &nodeIndex);
- HRESULT ScanInodes(UInt64 ptr);
- // HRESULT ReadUids(UInt64 start, UInt32 num, CByteBuffer &ids);
- HRESULT Open2(IInStream *inStream);
- AString GetPath(int index) const;
- bool GetPackSize(int index, UInt64 &res, bool fillOffsets);
-
-public:
- CHandler();
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-
- HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize);
-};
-
-CHandler::CHandler()
-{
- _limitedInStreamSpec = new CLimitedSequentialInStream;
- _limitedInStream = _limitedInStreamSpec;
-
- _outStreamSpec = new CBufPtrSeqOutStream();
- _outStream = _outStreamSpec;
-
- _dynOutStreamSpec = new CDynBufSeqOutStream;
- _dynOutStream = _dynOutStreamSpec;
-}
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidPosixAttrib, VT_UI4}
- // { NULL, kpidUser, VT_BSTR},
- // { NULL, kpidGroup, VT_BSTR},
- // { NULL, kpidLinks, VT_UI4},
- // { NULL, kpidOffset, VT_UI4}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidFileSystem, VT_BSTR},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidBlock, VT_UI4},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI8},
- { NULL, kpidBigEndian, VT_BOOL},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidCharacts, VT_BSTR}
- // { NULL, kpidNumBlocks, VT_UI4}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-static HRESULT LzoDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen)
-{
- SizeT destRem = *destLen;
- SizeT srcRem = *srcLen;
- *destLen = 0;
- *srcLen = 0;
- const Byte *destStart = dest;
- const Byte *srcStart = src;
- unsigned mode = 2;
-
- {
- if (srcRem == 0)
- return S_FALSE;
- UInt32 b = *src;
- if (b > 17)
- {
- src++;
- srcRem--;
- b -= 17;
- mode = (b < 4 ? 0 : 1);
- if (b > srcRem || b > destRem)
- return S_FALSE;
- srcRem -= b;
- destRem -= b;
- do
- *dest++ = *src++;
- while (--b);
- }
- }
-
- for (;;)
- {
- if (srcRem < 3)
- return S_FALSE;
- UInt32 b = *src++;
- srcRem--;
- UInt32 len, back;
- if (b >= 64)
- {
- srcRem--;
- back = ((b >> 2) & 7) + ((UInt32)*src++ << 3);
- len = (b >> 5) + 1;
- }
- else if (b < 16)
- {
- if (mode == 2)
- {
- if (b == 0)
- {
- for (b = 15;; b += 255)
- {
- if (srcRem == 0)
- return S_FALSE;
- UInt32 b2 = *src++;
- srcRem--;
- if (b2 != 0)
- {
- b += b2;
- break;
- }
- }
- }
- b += 3;
- if (b > srcRem || b > destRem)
- return S_FALSE;
- srcRem -= b;
- destRem -= b;
- mode = 1;
- do
- *dest++ = *src++;
- while (--b);
- continue;
- }
- srcRem--;
- back = (b >> 2) + (*src++ << 2);
- len = 2;
- if (mode == 1)
- {
- back += (1 << 11);
- len = 3;
- }
- }
- else
- {
- UInt32 bOld = b;
- b = (b < 32 ? 7 : 31);
- len = bOld & b;
- if (len == 0)
- {
- for (len = b;; len += 255)
- {
- if (srcRem == 0)
- return S_FALSE;
- UInt32 b2 = *src++;
- srcRem--;
- if (b2 != 0)
- {
- len += b2;
- break;
- }
- }
- }
- len += 2;
- if (srcRem < 2)
- return S_FALSE;
- b = *src;
- back = (b >> 2) + ((UInt32)src[1] << 6);
- src += 2;
- srcRem -= 2;
- if (bOld < 32)
- {
- if (back == 0)
- {
- *destLen = dest - destStart;
- *srcLen = src - srcStart;
- return S_OK;
- }
- back += ((bOld & 8) << 11) + (1 << 14) - 1;
- }
- }
- back++;
- if (len > destRem || (size_t)(dest - destStart) < back)
- return S_FALSE;
- destRem -= len;
- Byte *destTemp = dest - back;
- dest += len;
- do
- {
- *(destTemp + back) = *destTemp;
- destTemp++;
- }
- while (--len);
- b &= 3;
- if (b == 0)
- {
- mode = 2;
- continue;
- }
- if (b > srcRem || b > destRem)
- return S_FALSE;
- srcRem -= b;
- destRem -= b;
- mode = 0;
- *dest++ = *src++;
- if (b > 1)
- {
- *dest++ = *src++;
- if (b > 2)
- *dest++ = *src++;
- }
- }
-}
-
-HRESULT CHandler::Decompress(ISequentialOutStream *outStream, Byte *outBuf, bool *outBufWasWritten, UInt32 *outBufWasWrittenSize, UInt32 inSize, UInt32 outSizeMax)
-{
- if (outBuf)
- {
- *outBufWasWritten = false;
- *outBufWasWrittenSize = 0;
- }
- UInt32 method = _h.Method;
- if (_h.SeveralMethods)
- {
- Byte props[1];
- RINOK(ReadStream_FALSE(_stream, props, 1));
- method = (props[0] == 0x5D ? kMethod_LZMA : kMethod_ZLIB);
- RINOK(_stream->Seek(-1, STREAM_SEEK_CUR, NULL));
- }
-
- if (method == kMethod_LZO)
- {
- if (_inputBuffer.GetCapacity() < inSize)
- {
- _inputBuffer.Free();
- _inputBuffer.SetCapacity(inSize);
- }
- RINOK(ReadStream_FALSE(_stream, _inputBuffer, inSize));
-
- Byte *dest = outBuf;
- if (!outBuf)
- {
- dest = _dynOutStreamSpec->GetBufPtrForWriting(outSizeMax);
- if (!dest)
- return E_OUTOFMEMORY;
- }
- SizeT destLen = outSizeMax, srcLen = inSize;
- RINOK(LzoDecode(dest, &destLen, _inputBuffer, &srcLen));
- if (inSize != srcLen)
- return S_FALSE;
- if (outBuf)
- {
- *outBufWasWritten = true;
- *outBufWasWrittenSize = (UInt32)destLen;
- }
- else
- _dynOutStreamSpec->UpdateSize(destLen);
- }
- else if (method == kMethod_LZMA)
- {
- if (!_lzmaDecoder)
- {
- _lzmaDecoderSpec = new NCompress::NLzma::CDecoder();
- _lzmaDecoderSpec->FinishStream = true;
- _lzmaDecoder = _lzmaDecoderSpec;
- }
- const UInt32 kPropsSize = 5 + 8;
- Byte props[kPropsSize];
- ReadStream_FALSE(_limitedInStream, props, kPropsSize);
- RINOK(_lzmaDecoderSpec->SetDecoderProperties2(props, 5));
- UInt64 outSize = GetUi64(props + 5);
- if (outSize > outSizeMax)
- return S_FALSE;
- RINOK(_lzmaDecoder->Code(_limitedInStream, outStream, NULL, &outSize, NULL));
- if (inSize != kPropsSize + _lzmaDecoderSpec->GetInputProcessedSize())
- return S_FALSE;
- }
- else
- {
- if (!_zlibDecoder)
- {
- _zlibDecoderSpec = new NCompress::NZlib::CDecoder();
- _zlibDecoder = _zlibDecoderSpec;
- }
- RINOK(_zlibDecoder->Code(_limitedInStream, outStream, NULL, NULL, NULL));
- if (inSize != _zlibDecoderSpec->GetInputProcessedSize())
- return S_FALSE;
- }
- return S_OK;
-}
-
-HRESULT CHandler::ReadMetadataBlock(UInt32 &packSize)
-{
- Byte temp[3];
- unsigned offset = _h.NeedCheckData() ? 3 : 2;
- if (offset > packSize)
- return S_FALSE;
- RINOK(ReadStream_FALSE(_stream, temp, offset));
- // if (NeedCheckData && Major < 4) checkByte must be = 0xFF
- bool be = _h.be;
- UInt32 size = Get16(temp);
- bool isCompressed = ((size & kNotCompressedBit16) == 0);
- if (size != kNotCompressedBit16)
- size &= ~kNotCompressedBit16;
-
- if (size > kMetadataBlockSize || offset + size > packSize)
- return S_FALSE;
- packSize = offset + size;
- if (isCompressed)
- {
- _limitedInStreamSpec->Init(size);
- RINOK(Decompress(_dynOutStream, NULL, NULL, NULL, size, kMetadataBlockSize));
- }
- else
- {
- // size != 0 here
- Byte *buf = _dynOutStreamSpec->GetBufPtrForWriting(size);
- if (!buf)
- return E_OUTOFMEMORY;
- RINOK(ReadStream_FALSE(_stream, buf, size));
- _dynOutStreamSpec->UpdateSize(size);
- }
- return S_OK;
-}
-
-HRESULT CHandler::ReadData(CData &data, UInt64 start, UInt64 end)
-{
- if (end < start || end - start >= ((UInt64)1 << 32))
- return S_FALSE;
- UInt32 size = (UInt32)(end - start);
- RINOK(_stream->Seek(start, STREAM_SEEK_SET, NULL));
- _dynOutStreamSpec->Init();
- UInt32 packPos = 0;
- while (packPos != size)
- {
- data.PackPos.Add(packPos);
- data.UnpackPos.Add((UInt32)_dynOutStreamSpec->GetSize());
- if (packPos > size)
- return S_FALSE;
- UInt32 packSize = size - packPos;
- RINOK(ReadMetadataBlock(packSize));
- if (_dynOutStreamSpec->GetSize() >= ((UInt64)1 << 32))
- return S_FALSE;
- packPos += packSize;
- }
- data.UnpackPos.Add((UInt32)_dynOutStreamSpec->GetSize());
- _dynOutStreamSpec->CopyToBuffer(data.Data);
- return S_OK;
-}
-
-struct CTempItem
-{
- UInt32 StartBlock;
- // UInt32 iNodeNumber1;
- UInt32 Offset;
- // UInt16 iNodeNumber2;
- UInt16 Type;
-};
-
-HRESULT CHandler::OpenDir(int parent, UInt32 startBlock, UInt32 offset, unsigned level, int &nodeIndex)
-{
- if (level > kNumDirLevelsMax)
- return S_FALSE;
-
- int blockIndex = _inodesData.PackPos.FindInSorted(startBlock);
- if (blockIndex < 0)
- return S_FALSE;
- UInt32 unpackPos = _inodesData.UnpackPos[blockIndex] + offset;
- if (unpackPos < offset)
- return S_FALSE;
-
- nodeIndex = _nodesPos.FindInSorted(unpackPos, _blockToNode[blockIndex], _blockToNode[blockIndex + 1]);
- // nodeIndex = _nodesPos.FindInSorted(unpackPos);
- if (nodeIndex < 0)
- return S_FALSE;
-
- const CNode &n = _nodes[nodeIndex];
- if (!n.IsDir())
- return S_OK;
- blockIndex = _dirs.PackPos.FindInSorted((UInt32)n.StartBlock);
- if (blockIndex < 0)
- return S_FALSE;
- unpackPos = _dirs.UnpackPos[blockIndex] + n.Offset;
- if (unpackPos < n.Offset || unpackPos > _dirs.Data.GetCapacity())
- return S_FALSE;
-
- UInt32 rem = (UInt32)_dirs.Data.GetCapacity() - unpackPos;
- const Byte *p = _dirs.Data + unpackPos;
- UInt32 fileSize = (UInt32)n.FileSize;
-
- if (fileSize > rem)
- return S_FALSE;
- rem = fileSize;
- if (_h.Major >= 3)
- {
- if (rem < 3)
- return S_FALSE;
- rem -= 3;
- }
-
- CRecordVector<CTempItem> tempItems;
- while (rem != 0)
- {
- bool be = _h.be;
- UInt32 count;
- CTempItem tempItem;
- if (_h.Major <= 2)
- {
- if (rem < 4)
- return S_FALSE;
- count = p[0];
- tempItem.StartBlock = Get32(p);
- if (be)
- tempItem.StartBlock &= 0xFFFFFF;
- else
- tempItem.StartBlock >>= 8;
- p += 4;
- rem -= 4;
- }
- else
- {
- if (_h.Major == 3)
- {
- if (rem < 9)
- return S_FALSE;
- count = p[0];
- p += 1;
- rem -= 1;
- }
- else
- {
- if (rem < 12)
- return S_FALSE;
- count = GetUi32(p);
- p += 4;
- rem -= 4;
- }
- GET_32 (0, tempItem.StartBlock);
- // GET_32 (4, tempItem.iNodeNumber1);
- p += 8;
- rem -= 8;
- }
- count++;
-
- for (UInt32 i = 0; i < count; i++)
- {
- if (rem == 0)
- return S_FALSE;
-
- UInt32 nameOffset = _h.GetFileNameOffset();
- if (rem < nameOffset)
- return S_FALSE;
-
- if ((UInt32)_items.Size() >= kNumFilesMax)
- return S_FALSE;
- if (_openCallback)
- {
- UInt64 numFiles = _items.Size();
- if ((numFiles & 0xFFFF) == 0)
- {
- RINOK(_openCallback->SetCompleted(&numFiles, NULL));
- }
- }
-
- CItem item;
- item.Ptr = (UInt32)(p - _dirs.Data);
-
- UInt32 size;
- if (_h.IsOldVersion())
- {
- UInt32 t = Get16(p);
- if (be)
- {
- tempItem.Offset = t >> 3;
- tempItem.Type = (UInt16)(t & 0x7);
- }
- else
- {
- tempItem.Offset = t & 0x1FFF;
- tempItem.Type = (UInt16)(t >> 13);
- }
- size = (UInt32)p[2];
- /*
- if (_h.Major > 2)
- tempItem.iNodeNumber2 = Get16(p + 3);
- */
- }
- else
- {
- GET_16 (0, tempItem.Offset);
- // GET_16 (2, tempItem.iNodeNumber2);
- GET_16 (4, tempItem.Type);
- GET_16 (6, size);
- }
- p += nameOffset;
- rem -= nameOffset;
- size++;
- if (rem < size)
- return S_FALSE;
- p += size;
- rem -= size;
- item.Parent = parent;
- _items.Add(item);
- tempItems.Add(tempItem);
- }
- }
-
- int startItemIndex = _items.Size() - tempItems.Size();
- for (int i = 0; i < tempItems.Size(); i++)
- {
- const CTempItem &tempItem = tempItems[i];
- int index = startItemIndex + i;
- CItem &item = _items[index];
- RINOK(OpenDir(index, tempItem.StartBlock, tempItem.Offset, level + 1, item.Node));
- }
-
- return S_OK;
-}
-
-/*
-HRESULT CHandler::ReadUids(UInt64 start, UInt32 num, CByteBuffer &ids)
-{
- size_t size = num * 4;
- ids.SetCapacity(size);
- RINOK(_stream->Seek(start, STREAM_SEEK_SET, NULL));
- return ReadStream_FALSE(_stream, ids, size);
-}
-*/
-
-HRESULT CHandler::Open2(IInStream *inStream)
-{
- {
- Byte buf[kHeaderSize3];
- RINOK(ReadStream_FALSE(inStream, buf, kHeaderSize3));
- if (!_h.Parse(buf))
- return S_FALSE;
- if (!_h.IsSupported())
- return E_NOTIMPL;
-
- switch (_h.Method)
- {
- case kMethod_ZLIB:
- case kMethod_LZMA:
- case kMethod_LZO:
- break;
- default:
- return E_NOTIMPL;
- }
- }
-
- _stream = inStream;
-
- if (_h.NumFrags != 0)
- {
- if (_h.NumFrags > kNumFilesMax)
- return S_FALSE;
- _frags.Reserve(_h.NumFrags);
- CByteBuffer data;
- unsigned bigFrag = (_h.Major > 2);
-
- unsigned fragPtrsInBlockLog = kMetadataBlockSizeLog - (3 + bigFrag);
- UInt32 numBlocks = (_h.NumFrags + (1 << fragPtrsInBlockLog) - 1) >> fragPtrsInBlockLog;
- size_t numBlocksBytes = (size_t)numBlocks << (2 + bigFrag);
- data.SetCapacity(numBlocksBytes);
- RINOK(inStream->Seek(_h.FragTable, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(inStream, data, numBlocksBytes));
- bool be = _h.be;
-
- for (UInt32 i = 0; i < numBlocks; i++)
- {
- UInt64 offset = bigFrag ? Get64(data + i * 8) : Get32(data + i * 4);
- RINOK(_stream->Seek(offset, STREAM_SEEK_SET, NULL));
- _dynOutStreamSpec->Init();
- UInt32 packSize = kMetadataBlockSize + 3;
- RINOK(ReadMetadataBlock(packSize));
- UInt32 unpackSize = (UInt32)_dynOutStreamSpec->GetSize();
- if (unpackSize != kMetadataBlockSize)
- if (i != numBlocks - 1 || unpackSize != ((_h.NumFrags << (3 + bigFrag)) & (kMetadataBlockSize - 1)))
- return S_FALSE;
- const Byte *buf = _dynOutStreamSpec->GetBuffer();
- for (UInt32 j = 0; j < kMetadataBlockSize && j < unpackSize;)
- {
- CFrag frag;
- if (bigFrag)
- {
- frag.StartBlock = Get64(buf + j);
- frag.Size = Get32(buf + j + 8);
- // some archives contain nonzero in unused (buf + j + 12)
- j += 16;
- }
- else
- {
- frag.StartBlock = Get32(buf + j);
- frag.Size = Get32(buf + j + 4);
- j += 8;
- }
- _frags.Add(frag);
- }
- }
- if ((UInt32)_frags.Size() != _h.NumFrags)
- return S_FALSE;
- }
-
- // RINOK(inStream->Seek(_h.InodeTable, STREAM_SEEK_SET, NULL));
-
- RINOK(ReadData(_inodesData, _h.InodeTable, _h.DirTable));
- RINOK(ReadData(_dirs, _h.DirTable, _h.FragTable));
-
- UInt64 absOffset = _h.RootInode >> 16;
- if (absOffset >= ((UInt64)1 << 32))
- return S_FALSE;
- {
- UInt32 pos = 0;
- UInt32 totalSize = (UInt32)_inodesData.Data.GetCapacity();
- _nodesPos.Reserve(_h.NumInodes);
- _nodes.Reserve(_h.NumInodes);
- // we use _blockToNode for binary search seed optimizations
- _blockToNode.Reserve(_inodesData.GetNumBlocks() + 1);
- int curBlock = 0;
- for (UInt32 i = 0; i < _h.NumInodes; i++)
- {
- CNode n;
- const Byte *p = _inodesData.Data + pos;
- UInt32 size = totalSize - pos;
-
- switch(_h.Major)
- {
- case 1: size = n.Parse1(p, size, _h); break;
- case 2: size = n.Parse2(p, size, _h); break;
- case 3: size = n.Parse3(p, size, _h); break;
- default: size = n.Parse4(p, size, _h); break;
- }
- if (size == 0)
- return S_FALSE;
- while (pos >= _inodesData.UnpackPos[curBlock])
- {
- _blockToNode.Add(_nodesPos.Size());
- curBlock++;
- }
- _nodesPos.Add(pos);
- _nodes.Add(n);
- pos += size;
- }
- _blockToNode.Add(_nodesPos.Size());
- if (pos != totalSize)
- return S_FALSE;
- }
- int rootNodeIndex;
- RINOK(OpenDir(-1, (UInt32)absOffset, (UInt32)_h.RootInode & 0xFFFF, 0, rootNodeIndex));
-
- /*
- if (_h.Major < 4)
- {
- RINOK(ReadUids(_h.UidTable, _h.NumUids, _uids));
- RINOK(ReadUids(_h.GidTable, _h.NumGids, _gids));
- }
- else
- {
- UInt32 size = _h.NumIDs * 4;
- _uids.SetCapacity(size);
-
- UInt32 numBlocks = (size + kMetadataBlockSize - 1) / kMetadataBlockSize;
- UInt32 numBlocksBytes = numBlocks << 3;
- CByteBuffer data;
- data.SetCapacity(numBlocksBytes);
- RINOK(inStream->Seek(_h.UidTable, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(inStream, data, numBlocksBytes));
-
- for (UInt32 i = 0; i < numBlocks; i++)
- {
- UInt64 offset = GetUi64(data + i * 8);
- UInt32 unpackSize, packSize;
- RINOK(_stream->Seek(offset, STREAM_SEEK_SET, NULL));
- RINOK(ReadMetadataBlock(NULL, _uids + kMetadataBlockSize * i, packSize, unpackSize));
- if (unpackSize != kMetadataBlockSize)
- if (i != numBlocks - 1 || unpackSize != (size & (kMetadataBlockSize - 1)))
- return S_FALSE;
- }
- }
- */
-
- {
- const UInt32 alignSize = 1 << 12;
- Byte buf[alignSize];
- RINOK(inStream->Seek(_h.Size, STREAM_SEEK_SET, NULL));
- UInt32 rem = (UInt32)(0 - _h.Size) & (alignSize - 1);
- _sizeCalculated = _h.Size;
- if (rem != 0)
- {
- if (ReadStream_FALSE(_stream, buf, rem) == S_OK)
- {
- size_t i;
- for (i = 0; i < rem && buf[i] == 0; i++);
- if (i == rem)
- _sizeCalculated = _h.Size + rem;
- }
- }
- }
- return S_OK;
-}
-
-AString CHandler::GetPath(int index) const
-{
- unsigned len = 0;
- int indexMem = index;
- bool be = _h.be;
- do
- {
- const CItem &item = _items[index];
- index = item.Parent;
- const Byte *p = _dirs.Data + item.Ptr;
- unsigned size = (_h.IsOldVersion() ? (unsigned)p[2] : (unsigned)Get16(p + 6)) + 1;
- p += _h.GetFileNameOffset();
- unsigned i;
- for (i = 0; i < size && p[i]; i++);
- len += i + 1;
- }
- while (index >= 0);
- len--;
-
- AString path;
- char *dest = path.GetBuffer(len) + len;
- index = indexMem;
- for (;;)
- {
- const CItem &item = _items[index];
- index = item.Parent;
-
- const Byte *p = _dirs.Data + item.Ptr;
- unsigned size = (_h.IsOldVersion() ? (unsigned)p[2] : (unsigned)Get16(p + 6)) + 1;
- p += _h.GetFileNameOffset();
- unsigned i;
- for (i = 0; i < size && p[i]; i++);
- dest -= i;
- memcpy(dest, p, i);
- if (index < 0)
- break;
- *(--dest) = CHAR_PATH_SEPARATOR;
- }
- path.ReleaseBuffer(len);
- return path;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- {
- Close();
- _limitedInStreamSpec->SetStream(stream);
- HRESULT res;
- try
- {
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- _openCallback = callback;
- res = Open2(stream);
- }
- catch(...)
- {
- Close();
- throw;
- }
- if (res != S_OK)
- {
- Close();
- return res;
- }
- _stream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _limitedInStreamSpec->ReleaseStream();
- _stream.Release();
-
- _items.Clear();
- _nodes.Clear();
- _nodesPos.Clear();
- _blockToNode.Clear();
- _frags.Clear();
- _inodesData.Clear();
- _dirs.Clear();
-
- // _uids.Free();
- // _gids.Free();;
-
- _cachedBlock.Free();
- ClearCache();
-
- return S_OK;
-}
-
-bool CHandler::GetPackSize(int index, UInt64 &totalPack, bool fillOffsets)
-{
- totalPack = 0;
- const CItem &item = _items[index];
- const CNode &node = _nodes[item.Node];
- UInt32 ptr = _nodesPos[item.Node];
- const Byte *p = _inodesData.Data + ptr;
- bool be = _h.be;
-
- UInt32 type = node.Type;
- UInt32 offset;
- if (node.IsLink() || node.FileSize == 0)
- {
- totalPack = node.FileSize;
- return true;
- }
-
- UInt32 numBlocks = (UInt32)node.GetNumBlocks(_h);
-
- if (fillOffsets)
- {
- _blockOffsets.Clear();
- _blockCompressed.Clear();
- _blockOffsets.Add(totalPack);
- }
-
- if (_h.Major <= 1)
- {
- offset = 15;
- p += offset;
-
- for (UInt32 i = 0; i < numBlocks; i++)
- {
- UInt32 t = Get16(p + i * 2);
- if (fillOffsets)
- _blockCompressed.Add((t & kNotCompressedBit16) == 0);
- if (t != kNotCompressedBit16)
- t &= ~kNotCompressedBit16;
- totalPack += t;
- if (fillOffsets)
- _blockOffsets.Add(totalPack);
- }
- }
- else
- {
- if (_h.Major <= 2)
- offset = 24;
- else if (type == kType_FILE)
- offset = 32;
- else if (type == kType_FILE + 7)
- offset = (_h.Major <= 3 ? 40 : 56);
- else
- return false;
-
- p += offset;
-
- for (UInt64 i = 0; i < numBlocks; i++)
- {
- UInt32 t = Get32(p + i * 4);
- if (fillOffsets)
- _blockCompressed.Add(IS_COMPRESSED_BLOCK(t));
- UInt32 size = GET_COMPRESSED_BLOCK_SIZE(t);
- if (size > _h.BlockSize)
- return false;
- totalPack += size;
- if (fillOffsets)
- _blockOffsets.Add(totalPack);
- }
-
- if (node.ThereAreFrags())
- {
- if (node.Frag >= (UInt32)_frags.Size())
- return false;
- const CFrag &frag = _frags[node.Frag];
- if (node.Offset == 0)
- {
- UInt32 size = GET_COMPRESSED_BLOCK_SIZE(frag.Size);
- if (size > _h.BlockSize)
- return false;
- totalPack += size;
- }
- }
- }
- return true;
-}
-
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMethod:
- {
- const char *s;
- if (_h.SeveralMethods)
- s = "LZMA ZLIB";
- else
- {
- s = k_Methods[0];
- if (_h.Method < sizeof(k_Methods) / sizeof(k_Methods[0]))
- s = k_Methods[_h.Method];
- }
- prop = s;
- break;
- }
- case kpidFileSystem:
- {
- AString res = "SquashFS";
- if (_h.SeveralMethods)
- res += "-LZMA";
- res += ' ';
- char s[16];
- ConvertUInt32ToString(_h.Major, s);
- res += s;
- res += '.';
- ConvertUInt32ToString(_h.Minor, s);
- res += s;
- prop = res;
- break;
- }
- case kpidBlock: prop = _h.BlockSize; break;
- case kpidBigEndian: prop = _h.be; break;
- case kpidCTime:
- if (_h.CTime != 0)
- {
- FILETIME ft;
- NWindows::NTime::UnixTimeToFileTime(_h.CTime, ft);
- prop = ft;
- }
- break;
- case kpidCharacts: FLAGS_TO_PROP(k_Flags, _h.Flags, prop); break;
- // case kpidNumBlocks: prop = _h.NumFrags; break;
- case kpidPhySize: prop = _sizeCalculated; break;
- case kpidHeadersSize:
- if (_sizeCalculated >= _h.InodeTable)
- prop = _sizeCalculated - _h.InodeTable;
- break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItem &item = _items[index];
- const CNode &node = _nodes[item.Node];
- bool isDir = node.IsDir();
- bool be = _h.be;
-
- switch(propID)
- {
- case kpidPath: prop = MultiByteToUnicodeString(GetPath(index), CP_OEMCP); break;
- case kpidIsDir: prop = isDir; break;
- // case kpidOffset: if (!node.IsLink()) prop = (UInt64)node.StartBlock; break;
- case kpidSize: if (!isDir) prop = node.GetSize(); break;
- case kpidPackSize:
- if (!isDir)
- {
- UInt64 size;
- if (GetPackSize(index, size, false))
- prop = size;
- }
- break;
- case kpidMTime:
- {
- UInt32 offset = 0;
- switch(_h.Major)
- {
- case 1:
- if (node.Type == kType_FILE)
- offset = 3;
- else if (node.Type == kType_DIR)
- offset = 7;
- break;
- case 2:
- if (node.Type == kType_FILE)
- offset = 4;
- else if (node.Type == kType_DIR)
- offset = 8;
- else if (node.Type == kType_DIR + 7)
- offset = 9;
- break;
- case 3: offset = 4; break;
- case 4: offset = 8; break;
- }
- if (offset != 0)
- {
- const Byte *p = _inodesData.Data + _nodesPos[item.Node] + offset;
- FILETIME ft;
- NWindows::NTime::UnixTimeToFileTime(Get32(p), ft);
- prop = ft;
- }
- break;
- }
- case kpidPosixAttrib:
- {
- if (node.Type != 0 && node.Type < sizeof(k_TypeToMode) / sizeof(k_TypeToMode[0]))
- prop = (UInt32)(node.Mode & 0xFFF) | k_TypeToMode[node.Type];
- break;
- }
- /*
- case kpidUser:
- {
- UInt32 offset = node.Uid * 4;
- if (offset < _uids.GetCapacity())
- prop = (UInt32)Get32(_uids + offset);
- break;
- }
- case kpidGroup:
- {
- if (_h.Major == 4 || node.Gid == _h.GetSpecGuidIndex())
- {
- UInt32 offset = node.Uid * 4;
- if (offset < _uids.GetCapacity())
- prop = (UInt32)Get32(_uids + offset);
- }
- else
- {
- UInt32 offset = node.Gid * 4;
- if (offset < _gids.GetCapacity())
- prop = (UInt32)Get32(_gids + offset);
- }
- break;
- }
- */
- /*
- case kpidLinks:
- if (_h.Major >= 3 && node.Type != kType_FILE)
- prop = node.NumLinks;
- break;
- */
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CSquashfsInStream: public CCachedInStream
-{
- HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize);
-public:
- CHandler *Handler;
-};
-
-HRESULT CSquashfsInStream::ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize)
-{
- return Handler->ReadBlock(blockIndex, dest, blockSize);
-}
-
-HRESULT CHandler::ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize)
-{
- const CNode &node = _nodes[_nodeIndex];
- UInt64 blockOffset;
- UInt32 packBlockSize;
- UInt32 offsetInBlock = 0;
- bool compressed;
- if (blockIndex < _blockCompressed.Size())
- {
- compressed = _blockCompressed[(int)blockIndex];
- blockOffset = _blockOffsets[(int)blockIndex];
- packBlockSize = (UInt32)(_blockOffsets[(int)blockIndex + 1] - blockOffset);
- blockOffset += node.StartBlock;
- }
- else
- {
- if (!node.ThereAreFrags())
- return S_FALSE;
- const CFrag &frag = _frags[node.Frag];
- offsetInBlock = node.Offset;
- blockOffset = frag.StartBlock;
- packBlockSize = GET_COMPRESSED_BLOCK_SIZE(frag.Size);
- compressed = IS_COMPRESSED_BLOCK(frag.Size);
- }
-
- if (packBlockSize == 0)
- {
- // sparse file ???
- memset(dest, 0, blockSize);
- return S_OK;
- }
-
- if (blockOffset != _cachedBlockStartPos ||
- packBlockSize != _cachedPackBlockSize)
- {
- ClearCache();
- RINOK(_stream->Seek(blockOffset, STREAM_SEEK_SET, NULL));
- _limitedInStreamSpec->Init(packBlockSize);
-
- if (compressed)
- {
- _outStreamSpec->Init((Byte *)_cachedBlock, _h.BlockSize);
- bool outBufWasWritten;
- UInt32 outBufWasWrittenSize;
- HRESULT res = Decompress(_outStream, _cachedBlock, &outBufWasWritten, &outBufWasWrittenSize, packBlockSize, _h.BlockSize);
- if (outBufWasWritten)
- _cachedUnpackBlockSize = outBufWasWrittenSize;
- else
- _cachedUnpackBlockSize = (UInt32)_outStreamSpec->GetPos();
- RINOK(res);
- }
- else
- {
- RINOK(ReadStream_FALSE(_limitedInStream, _cachedBlock, packBlockSize));
- _cachedUnpackBlockSize = packBlockSize;
- }
- _cachedBlockStartPos = blockOffset;
- _cachedPackBlockSize = packBlockSize;
- }
- if (offsetInBlock + blockSize > _cachedUnpackBlockSize)
- return S_FALSE;
- memcpy(dest, _cachedBlock + offsetInBlock, blockSize);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const CItem &item = _items[allFilesMode ? i : indices[i]];
- const CNode &node = _nodes[item.Node];
- totalSize += node.GetSize();
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CItem &item = _items[index];
- const CNode &node = _nodes[item.Node];
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- // const Byte *p = _data + item.Offset;
-
- if (node.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- UInt64 unpackSize = node.GetSize();
- totalSize += unpackSize;
- UInt64 packSize;
- if (GetPackSize(index, packSize, false))
- totalPackSize += packSize;
-
- if (!testMode && !outStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- int res = NExtract::NOperationResult::kDataError;
- {
- CMyComPtr<ISequentialInStream> inSeqStream;
- CMyComPtr<IInStream> inStream;
- HRESULT hres = GetStream(index, &inSeqStream);
- if (inSeqStream)
- inSeqStream.QueryInterface(IID_IInStream, &inStream);
- if (hres == S_FALSE || !inStream)
- {
- if (hres == E_OUTOFMEMORY)
- return hres;
- res = NExtract::NOperationResult::kUnSupportedMethod;
- }
- else
- {
- RINOK(hres);
- if (inStream)
- {
- HRESULT hres = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (hres != S_OK && hres != S_FALSE)
- {
- RINOK(hres);
- }
- if (copyCoderSpec->TotalSize == unpackSize && hres == S_OK)
- res = NExtract::NOperationResult::kOK;
- else
- {
- res = res;
- }
- }
- }
- }
- RINOK(extractCallback->SetOperationResult(res));
- }
- return S_OK;
- COM_TRY_END
-}
-
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
-
- const CItem &item = _items[index];
- const CNode &node = _nodes[item.Node];
-
- if (node.IsDir())
- return E_FAIL;
-
- const Byte *p = _inodesData.Data + _nodesPos[item.Node];
-
- if (node.FileSize == 0 || node.IsLink())
- {
- CBufInStream *streamSpec = new CBufInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- if (node.IsLink())
- streamSpec->Init(p + _h.GetSymLinkOffset(), (size_t)node.FileSize);
- else
- streamSpec->Init(NULL, 0);
- *stream = streamTemp.Detach();
- return S_OK;
- }
-
- UInt64 packSize;
- if (!GetPackSize(index, packSize, true))
- return S_FALSE;
-
- _nodeIndex = item.Node;
-
- size_t cacheSize = _h.BlockSize;
- if (_cachedBlock.GetCapacity() != cacheSize)
- {
- ClearCache();
- _cachedBlock.SetCapacity(cacheSize);
- }
-
- CSquashfsInStream *streamSpec = new CSquashfsInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- streamSpec->Handler = this;
- unsigned cacheSizeLog = 22;
- if (cacheSizeLog <= _h.BlockSizeLog)
- cacheSizeLog = _h.BlockSizeLog + 1;
- if (!streamSpec->Alloc(_h.BlockSizeLog, cacheSizeLog - _h.BlockSizeLog))
- return E_OUTOFMEMORY;
- streamSpec->Init(node.FileSize);
- *stream = streamTemp.Detach();
-
- return S_OK;
-
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NSquashfs::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"SquashFS", L"squashfs", 0, 0xD2, SIGNATURE, kSignatureSize, false, CreateArc, 0 };
-
-REGISTER_ARC(Cramfs)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/SwfHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/SwfHandler.cpp
deleted file mode 100644
index dfc0326d1..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/SwfHandler.cpp
+++ /dev/null
@@ -1,706 +0,0 @@
-// SwfHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-#include "../Compress/ZlibDecoder.h"
-#include "../Compress/ZlibEncoder.h"
-
-#include "Common/DummyOutStream.h"
-
-#include "DeflateProps.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NSwfc {
-
-static const UInt32 kHeaderSize = 8;
-
-static const Byte SWF_UNCOMPRESSED = 'F';
-static const Byte SWF_COMPRESSED = 'C';
-static const Byte SWF_MIN_COMPRESSED_VER = 6;
-
-struct CItem
-{
- Byte Buf[kHeaderSize];
-
- UInt32 GetSize() const { return GetUi32(Buf + 4); }
- bool IsSwf(Byte c) const { return (Buf[0] == c && Buf[1] == 'W' && Buf[2] == 'S' && Buf[3] < 32); }
- bool IsUncompressed() const { return IsSwf(SWF_UNCOMPRESSED); }
- bool IsCompressed() const { return IsSwf(SWF_COMPRESSED); }
-
- void MakeUncompressed() { Buf[0] = SWF_UNCOMPRESSED; }
- void MakeCompressed()
- {
- Buf[0] = SWF_COMPRESSED;
- if (Buf[3] < SWF_MIN_COMPRESSED_VER)
- Buf[3] = SWF_MIN_COMPRESSED_VER;
- }
-
- HRESULT ReadHeader(ISequentialInStream *stream) { return ReadStream_FALSE(stream, Buf, kHeaderSize); }
- HRESULT WriteHeader(ISequentialOutStream *stream) { return WriteStream(stream, Buf, kHeaderSize); }
-};
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public IOutArchive,
- public ISetProperties,
- public CMyUnknownImp
-{
- CItem _item;
- UInt64 _packSize;
- bool _packSizeDefined;
- CMyComPtr<ISequentialInStream> _seqStream;
- CMyComPtr<IInStream> _stream;
-
- CDeflateProps _method;
-
-public:
- MY_UNKNOWN_IMP4(IInArchive, IArchiveOpenSeq, IOutArchive, ISetProperties)
- INTERFACE_IInArchive(;)
- INTERFACE_IOutArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
- STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProps);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidSize: prop = (UInt64)_item.GetSize(); break;
- case kpidPackSize: if (_packSizeDefined) prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *)
-{
- RINOK(OpenSeq(stream));
- _stream = stream;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- Close();
- HRESULT res = _item.ReadHeader(stream);
- if (res == S_OK)
- if (_item.IsCompressed())
- _seqStream = stream;
- else
- res = S_FALSE;
- return res;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _packSizeDefined = false;
- _seqStream.Release();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- extractCallback->SetTotal(_item.GetSize());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- NCompress::NZlib::CDecoder *_decoderSpec = new NCompress::NZlib::CDecoder;
- CMyComPtr<ICompressCoder> _decoder = _decoderSpec;
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
- realOutStream.Release();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- lps->InSize = kHeaderSize;
- lps->OutSize = outStreamSpec->GetSize();
- RINOK(lps->SetCur());
-
- CItem item = _item;
- item.MakeUncompressed();
- RINOK(item.WriteHeader(outStream));
- if (_stream)
- RINOK(_stream->Seek(kHeaderSize, STREAM_SEEK_SET, NULL));
- HRESULT result = _decoderSpec->Code(_seqStream, outStream, NULL, NULL, progress);
- Int32 opRes = NExtract::NOperationResult::kDataError;
- if (result == S_OK)
- {
- if (_item.GetSize() == outStreamSpec->GetSize())
- {
- _packSizeDefined = true;
- _packSize = _decoderSpec->GetInputProcessedSize() + kHeaderSize;
- opRes = NExtract::NOperationResult::kOK;
- }
- }
- else if (result != S_FALSE)
- return result;
-
- outStream.Release();
- return extractCallback->SetOperationResult(opRes);
- COM_TRY_END
-}
-
-static HRESULT UpdateArchive(ISequentialOutStream *outStream,
- UInt64 size, CDeflateProps &deflateProps,
- IArchiveUpdateCallback *updateCallback)
-{
- UInt64 complexity = 0;
- RINOK(updateCallback->SetTotal(size));
- RINOK(updateCallback->SetCompleted(&complexity));
-
- CMyComPtr<ISequentialInStream> fileInStream;
- RINOK(updateCallback->GetStream(0, &fileInStream));
-
- CItem item;
- HRESULT res = item.ReadHeader(fileInStream);
- if (res == S_FALSE)
- return E_INVALIDARG;
- RINOK(res);
- if (!item.IsUncompressed() || size != item.GetSize())
- return E_INVALIDARG;
-
- item.MakeCompressed();
- item.WriteHeader(outStream);
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(updateCallback, true);
-
- NCompress::NZlib::CEncoder *encoderSpec = new NCompress::NZlib::CEncoder;
- CMyComPtr<ICompressCoder> encoder = encoderSpec;
- encoderSpec->Create();
- RINOK(deflateProps.SetCoderProperties(encoderSpec->DeflateEncoderSpec));
- RINOK(encoder->Code(fileInStream, outStream, NULL, NULL, progress));
- if (encoderSpec->GetInputProcessedSize() + kHeaderSize != size)
- return E_INVALIDARG;
- return updateCallback->SetOperationResult(NUpdate::NOperationResult::kOK);
-}
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *timeType)
-{
- *timeType = NFileTimeType::kUnix;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *updateCallback)
-{
- if (numItems != 1)
- return E_INVALIDARG;
-
- Int32 newData, newProps;
- UInt32 indexInArchive;
- if (!updateCallback)
- return E_FAIL;
- RINOK(updateCallback->GetUpdateItemInfo(0, &newData, &newProps, &indexInArchive));
-
- if (IntToBool(newProps))
- {
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidIsDir, &prop));
- if (prop.vt == VT_BOOL)
- {
- if (prop.boolVal != VARIANT_FALSE)
- return E_INVALIDARG;
- }
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- }
- }
-
- if (IntToBool(newData))
- {
- UInt64 size;
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(0, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- size = prop.uhVal.QuadPart;
- }
- return UpdateArchive(outStream, size, _method, updateCallback);
- }
-
- if (indexInArchive != 0)
- return E_INVALIDARG;
-
- if (!_seqStream)
- return E_NOTIMPL;
-
- if (_stream)
- {
- RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
- else
- _item.WriteHeader(outStream);
- return NCompress::CopyStream(_seqStream, outStream, NULL);
-}
-
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps)
-{
- return _method.SetProperties(names, values, numProps);
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new CHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
- { L"SWFc", L"swf", L"~.swf", 0xD8, { 'C', 'W', 'S' }, 3, true, CreateArc, CreateArcOut };
-
-REGISTER_ARC(Swfc)
-
-}
-
-namespace NSwf {
-
-static const UInt32 kFileSizeMax = (UInt32)1 << 30;
-static const int kNumTagsMax = (UInt32)1 << 23;
-
-struct CTag
-{
- UInt32 Type;
- CByteBuffer Buf;
-};
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public CMyUnknownImp
-{
- CObjectVector<CTag> _tags;
- NSwfc::CItem _item;
- UInt64 _packSize;
-
- HRESULT OpenSeq3(ISequentialInStream *stream, IArchiveOpenCallback *callback);
- HRESULT OpenSeq2(ISequentialInStream *stream, IArchiveOpenCallback *callback);
-public:
- MY_UNKNOWN_IMP2(IInArchive, IArchiveOpenSeq)
- INTERFACE_IInArchive(;)
-
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidComment, VT_BSTR}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _tags.Size();
- return S_OK;
-}
-
-static const char *g_TagDesc[92] =
-{
- "End",
- "ShowFrame",
- "DefineShape",
- NULL,
- "PlaceObject",
- "RemoveObject",
- "DefineBits",
- "DefineButton",
- "JPEGTables",
- "SetBackgroundColor",
- "DefineFont",
- "DefineText",
- "DoAction",
- "DefineFontInfo",
- "DefineSound",
- "StartSound",
- NULL,
- "DefineButtonSound",
- "SoundStreamHead",
- "SoundStreamBlock",
- "DefineBitsLossless",
- "DefineBitsJPEG2",
- "DefineShape2",
- "DefineButtonCxform",
- "Protect",
- NULL,
- "PlaceObject2",
- NULL,
- "RemoveObject2",
- NULL,
- NULL,
- NULL,
- "DefineShape3",
- "DefineText2",
- "DefineButton2",
- "DefineBitsJPEG3",
- "DefineBitsLossless2",
- "DefineEditText",
- NULL,
- "DefineSprite",
- NULL,
- "41",
- NULL,
- "FrameLabel",
- NULL,
- "SoundStreamHead2",
- "DefineMorphShape",
- NULL,
- "DefineFont2",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "ExportAssets",
- "ImportAssets",
- "EnableDebugger",
- "DoInitAction",
- "DefineVideoStream",
- "VideoFrame",
- "DefineFontInfo2",
- NULL,
- "EnableDebugger2",
- "ScriptLimits",
- "SetTabIndex",
- NULL,
- NULL,
- "FileAttributes",
- "PlaceObject3",
- "ImportAssets2",
- NULL,
- "DefineFontAlignZones",
- "CSMTextSettings",
- "DefineFont3",
- "SymbolClass",
- "Metadata",
- "DefineScalingGrid",
- NULL,
- NULL,
- NULL,
- "DoABC",
- "DefineShape4",
- "DefineMorphShape2",
- NULL,
- "DefineSceneAndFrameLabelData",
- "DefineBinaryData",
- "DefineFontName",
- "StartSound2",
- "DefineBitsJPEG4",
- "DefineFont4"
-};
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- const CTag &tag = _tags[index];
- switch(propID)
- {
- case kpidPath:
- {
- char s[32];
- ConvertUInt32ToString(index, s);
- size_t i = strlen(s);
- s[i++] = '.';
- ConvertUInt32ToString(tag.Type, s + i);
- prop = s;
- break;
- }
- case kpidSize:
- case kpidPackSize:
- prop = (UInt64)tag.Buf.GetCapacity(); break;
- case kpidComment:
- if (tag.Type < sizeof(g_TagDesc) / sizeof(g_TagDesc[0]))
- {
- const char *s = g_TagDesc[tag.Type];
- if (s != NULL)
- prop = s;
- }
- break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- return OpenSeq2(stream, callback);
-}
-
-static UInt16 Read16(CInBuffer &stream)
-{
- UInt16 res = 0;
- for (int i = 0; i < 2; i++)
- {
- Byte b;
- if (!stream.ReadByte(b))
- throw 1;
- res |= (UInt16)b << (i * 8);
- }
- return res;
-}
-
-static UInt32 Read32(CInBuffer &stream)
-{
- UInt32 res = 0;
- for (int i = 0; i < 4; i++)
- {
- Byte b;
- if (!stream.ReadByte(b))
- throw 1;
- res |= (UInt32)b << (i * 8);
- }
- return res;
-}
-
-struct CBitReader
-{
- CInBuffer *stream;
- unsigned NumBits;
- Byte Val;
-
- CBitReader(): NumBits(0), Val(0) {}
-
- UInt32 ReadBits(unsigned numBits);
-};
-
-UInt32 CBitReader::ReadBits(unsigned numBits)
-{
- UInt32 res = 0;
- while (numBits > 0)
- {
- if (NumBits == 0)
- {
- Val = stream->ReadByte();
- NumBits = 8;
- }
- if (numBits <= NumBits)
- {
- res <<= numBits;
- NumBits -= numBits;
- res |= (Val >> NumBits);
- Val &= (1 << NumBits) - 1;
- break;
- }
- else
- {
- res <<= NumBits;
- res |= Val;
- numBits -= NumBits;
- NumBits = 0;
- }
- }
- return res;
-}
-
-HRESULT CHandler::OpenSeq3(ISequentialInStream *stream, IArchiveOpenCallback *callback)
-{
- RINOK(_item.ReadHeader(stream))
- if (!_item.IsUncompressed())
- return S_FALSE;
-
- CInBuffer s;
- if (!s.Create(1 << 20))
- return E_OUTOFMEMORY;
- s.SetStream(stream);
- s.Init();
- {
- CBitReader br;
- br.stream = &s;
- unsigned numBits = br.ReadBits(5);
- /* UInt32 xMin = */ br.ReadBits(numBits);
- /* UInt32 xMax = */ br.ReadBits(numBits);
- /* UInt32 yMin = */ br.ReadBits(numBits);
- /* UInt32 yMax = */ br.ReadBits(numBits);
- }
- /* UInt32 frameDelay = */ Read16(s);
- /* UInt32 numFrames = */ Read16(s);
-
- _tags.Clear();
- UInt64 offsetPrev = 0;
- for (;;)
- {
- UInt32 pair = Read16(s);
- UInt32 type = pair >> 6;
- UInt32 length = pair & 0x3F;
- if (length == 0x3F)
- length = Read32(s);
- if (type == 0)
- break;
- UInt64 offset = s.GetProcessedSize() + NSwfc::kHeaderSize + length;
- if (offset > kFileSizeMax || _tags.Size() >= kNumTagsMax)
- return S_FALSE;
- _tags.Add(CTag());
- CTag &tag = _tags.Back();
- tag.Type = type;
- tag.Buf.SetCapacity(length);
- if (s.ReadBytes(tag.Buf, length) != length)
- return S_FALSE;
- if (callback && offset >= offsetPrev + (1 << 20))
- {
- UInt64 numItems = _tags.Size();
- RINOK(callback->SetCompleted(&numItems, &offset));
- offsetPrev = offset;
- }
- }
- _packSize = s.GetProcessedSize() + NSwfc::kHeaderSize;
- return S_OK;
-}
-
-HRESULT CHandler::OpenSeq2(ISequentialInStream *stream, IArchiveOpenCallback *callback)
-{
- HRESULT res;
- try { res = OpenSeq3(stream, callback); }
- catch(...) { res = S_FALSE; }
- return res;
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- return OpenSeq2(stream, NULL);
-}
-
-STDMETHODIMP CHandler::Close()
-{
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _tags.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _tags[allFilesMode ? i : indices[i]].Buf.GetCapacity();
- extractCallback->SetTotal(totalSize);
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- totalSize = 0;
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
- const CByteBuffer &buf = _tags[index].Buf;
- totalSize += buf.GetCapacity();
-
- CMyComPtr<ISequentialOutStream> outStream;
- RINOK(extractCallback->GetStream(index, &outStream, askMode));
- if (!testMode && !outStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- if (outStream)
- RINOK(WriteStream(outStream, buf, buf.GetCapacity()));
- outStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"SWF", L"swf", 0, 0xD7, { 'F', 'W', 'S' }, 3, true, CreateArc, 0 };
-
-REGISTER_ARC(Swf)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Tar/StdAfx.h
deleted file mode 100644
index 2e4be10b2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/StdAfx.h
+++ /dev/null
@@ -1,9 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/MyWindows.h"
-#include "../../../Common/NewHandler.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandler.cpp
deleted file mode 100644
index 4db0cae82..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandler.cpp
+++ /dev/null
@@ -1,386 +0,0 @@
-// TarHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamObjects.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../Common/ItemNameUtils.h"
-
-#include "TarHandler.h"
-#include "TarIn.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NTar {
-
-static const char *kUnexpectedEnd = "Unexpected end of archive";
-
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidPosixAttrib, VT_UI4},
- { NULL, kpidUser, VT_BSTR},
- { NULL, kpidGroup, VT_BSTR},
- { NULL, kpidLink, VT_BSTR}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidHeadersSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPhySize: if (_phySizeDefined) prop = _phySize; break;
- case kpidHeadersSize: if (_phySizeDefined) prop = _headersSize; break;
- case kpidError: if (!_errorMessage.IsEmpty()) prop = _errorMessage; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-HRESULT CHandler::ReadItem2(ISequentialInStream *stream, bool &filled, CItemEx &item)
-{
- item.HeaderPos = _phySize;
- RINOK(ReadItem(stream, filled, item, _errorMessage));
- _phySize += item.HeaderSize;
- _headersSize += item.HeaderSize;
- return S_OK;
-}
-
-HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback)
-{
- UInt64 endPos = 0;
- {
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));
- RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
-
- _phySizeDefined = true;
- for (;;)
- {
- CItemEx item;
- bool filled;
- RINOK(ReadItem2(stream, filled, item));
- if (!filled)
- break;
- _items.Add(item);
-
- RINOK(stream->Seek(item.GetPackSize(), STREAM_SEEK_CUR, &_phySize));
- if (_phySize > endPos)
- {
- _errorMessage = kUnexpectedEnd;
- break;
- }
- /*
- if (_phySize == endPos)
- {
- _errorMessage = "There are no trailing zero-filled records";
- break;
- }
- */
- if (callback != NULL)
- {
- if (_items.Size() == 1)
- {
- RINOK(callback->SetTotal(NULL, &endPos));
- }
- if (_items.Size() % 100 == 0)
- {
- UInt64 numFiles = _items.Size();
- RINOK(callback->SetCompleted(&numFiles, &_phySize));
- }
- }
- }
-
- if (_items.Size() == 0)
- {
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
- if (!callback)
- return S_FALSE;
- callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback);
- if (!openVolumeCallback)
- return S_FALSE;
- NCOM::CPropVariant prop;
- if (openVolumeCallback->GetProperty(kpidName, &prop) != S_OK)
- return S_FALSE;
- if (prop.vt != VT_BSTR)
- return S_FALSE;
- UString baseName = prop.bstrVal;
- baseName = baseName.Right(4);
- if (baseName.CompareNoCase(L".tar") != 0)
- return S_FALSE;
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *openArchiveCallback)
-{
- COM_TRY_BEGIN
- {
- Close();
- RINOK(Open2(stream, openArchiveCallback));
- _stream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- Close();
- _seqStream = stream;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _errorMessage.Empty();
- _phySizeDefined = false;
- _phySize = 0;
- _headersSize = 0;
- _curIndex = 0;
- _latestIsRead = false;
- _items.Clear();
- _seqStream.Release();
- _stream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = (_stream ? _items.Size() : (UInt32)(Int32)-1);
- return S_OK;
-}
-
-CHandler::CHandler()
-{
- copyCoderSpec = new NCompress::CCopyCoder();
- copyCoder = copyCoderSpec;
-}
-
-HRESULT CHandler::SkipTo(UInt32 index)
-{
- while (_curIndex < index || !_latestIsRead)
- {
- if (_latestIsRead)
- {
- UInt64 packSize = _latestItem.GetPackSize();
- RINOK(copyCoderSpec->Code(_seqStream, NULL, &packSize, &packSize, NULL));
- _phySize += copyCoderSpec->TotalSize;
- if (copyCoderSpec->TotalSize != packSize)
- {
- _errorMessage = kUnexpectedEnd;
- return S_FALSE;
- }
- _latestIsRead = false;
- _curIndex++;
- }
- else
- {
- bool filled;
- RINOK(ReadItem2(_seqStream, filled, _latestItem));
- if (!filled)
- {
- _phySizeDefined = true;
- return E_INVALIDARG;
- }
- _latestIsRead = true;
- }
- }
- return S_OK;
-}
-
-static UString TarStringToUnicode(const AString &s)
-{
- return MultiByteToUnicodeString(s, CP_OEMCP);
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- const CItemEx *item;
- if (_stream)
- item = &_items[index];
- else
- {
- if (index < _curIndex)
- return E_INVALIDARG;
- else
- {
- RINOK(SkipTo(index));
- item = &_latestItem;
- }
- }
-
- switch(propID)
- {
- case kpidPath: prop = NItemName::GetOSName2(TarStringToUnicode(item->Name)); break;
- case kpidIsDir: prop = item->IsDir(); break;
- case kpidSize: prop = item->GetUnpackSize(); break;
- case kpidPackSize: prop = item->GetPackSize(); break;
- case kpidMTime:
- if (item->MTime != 0)
- {
- FILETIME ft;
- NTime::UnixTimeToFileTime(item->MTime, ft);
- prop = ft;
- }
- break;
- case kpidPosixAttrib: prop = item->Mode; break;
- case kpidUser: prop = TarStringToUnicode(item->User); break;
- case kpidGroup: prop = TarStringToUnicode(item->Group); break;
- case kpidLink: prop = TarStringToUnicode(item->LinkName); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- ISequentialInStream *stream = _seqStream;
- bool seqMode = (_stream == NULL);
- if (!seqMode)
- stream = _stream;
-
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _items.Size();
- if (_stream && numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- totalSize += _items[allFilesMode ? i : indices[i]].GetUnpackSize();
- extractCallback->SetTotal(totalSize);
-
- UInt64 totalPackSize;
- totalSize = totalPackSize = 0;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(streamSpec);
- streamSpec->SetStream(stream);
-
- CLimitedSequentialOutStream *outStreamSpec = new CLimitedSequentialOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
-
- for (i = 0; i < numItems || seqMode; i++)
- {
- lps->InSize = totalPackSize;
- lps->OutSize = totalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- const CItemEx *item;
- if (seqMode)
- {
- HRESULT res = SkipTo(index);
- if (res == E_INVALIDARG)
- break;
- RINOK(res);
- item = &_latestItem;
- }
- else
- item = &_items[index];
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- UInt64 unpackSize = item->GetUnpackSize();
- totalSize += unpackSize;
- totalPackSize += item->GetPackSize();
- if (item->IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- bool skipMode = false;
- if (!testMode && !realOutStream)
- {
- if (!seqMode)
- continue;
- skipMode = true;
- askMode = NExtract::NAskMode::kSkip;
- }
- RINOK(extractCallback->PrepareOperation(askMode));
-
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init(skipMode ? 0 : unpackSize, true);
-
- if (item->IsLink())
- {
- RINOK(WriteStream(outStreamSpec, (const char *)item->LinkName, item->LinkName.Length()));
- }
- else
- {
- if (!seqMode)
- {
- RINOK(_stream->Seek(item->GetDataPosition(), STREAM_SEEK_SET, NULL));
- }
- streamSpec->Init(item->GetPackSize());
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- }
- if (seqMode)
- {
- _latestIsRead = false;
- _curIndex++;
- }
- outStreamSpec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(outStreamSpec->GetRem() == 0 ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CItemEx &item = _items[index];
- if (item.IsLink())
- {
- CBufInStream *streamSpec = new CBufInStream;
- CMyComPtr<IInStream> streamTemp = streamSpec;
- streamSpec->Init((const Byte *)(const char *)item.LinkName, item.LinkName.Length(), (IInArchive *)this);
- *stream = streamTemp.Detach();
- return S_OK;
- }
- return CreateLimitedInStream(_stream, item.GetDataPosition(), item.Size, stream);
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandler.h
deleted file mode 100644
index b19670616..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandler.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// TarHandler.h
-
-#ifndef __TAR_HANDLER_H
-#define __TAR_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "TarItem.h"
-
-namespace NArchive {
-namespace NTar {
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- public IInArchiveGetStream,
- public IOutArchive,
- public CMyUnknownImp
-{
- CObjectVector<CItemEx> _items;
- CMyComPtr<IInStream> _stream;
- CMyComPtr<ISequentialInStream> _seqStream;
-
- UInt32 _curIndex;
- bool _latestIsRead;
- CItemEx _latestItem;
-
- UInt64 _phySize;
- UInt64 _headersSize;
- bool _phySizeDefined;
- AString _errorMessage;
-
- NCompress::CCopyCoder *copyCoderSpec;
- CMyComPtr<ICompressCoder> copyCoder;
-
- HRESULT ReadItem2(ISequentialInStream *stream, bool &filled, CItemEx &itemInfo);
- HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback);
- HRESULT SkipTo(UInt32 index);
-
-public:
- MY_UNKNOWN_IMP4(
- IInArchive,
- IArchiveOpenSeq,
- IInArchiveGetStream,
- IOutArchive
- )
-
- INTERFACE_IInArchive(;)
- INTERFACE_IOutArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-
- CHandler();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandlerOut.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandlerOut.cpp
deleted file mode 100644
index ffdf2b136..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHandlerOut.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-// TarHandlerOut.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "TarHandler.h"
-#include "TarUpdate.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NTar {
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *type)
-{
- *type = NFileTimeType::kUnix;
- return S_OK;
-}
-
-static HRESULT GetPropString(IArchiveUpdateCallback *callback, UInt32 index, PROPID propId, AString &res)
-{
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(index, propId, &prop));
- if (prop.vt == VT_BSTR)
- res = UnicodeStringToMultiByte(prop.bstrVal, CP_OEMCP);
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *callback)
-{
- COM_TRY_BEGIN
- if ((_stream && !_errorMessage.IsEmpty()) || _seqStream)
- return E_NOTIMPL;
- CObjectVector<CUpdateItem> updateItems;
- for (UInt32 i = 0; i < numItems; i++)
- {
- CUpdateItem ui;
- Int32 newData;
- Int32 newProps;
- UInt32 indexInArchive;
- if (!callback)
- return E_FAIL;
- RINOK(callback->GetUpdateItemInfo(i, &newData, &newProps, &indexInArchive));
- ui.NewProps = IntToBool(newProps);
- ui.NewData = IntToBool(newData);
- ui.IndexInArchive = indexInArchive;
- ui.IndexInClient = i;
-
- if (IntToBool(newProps))
- {
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidIsDir, &prop));
- if (prop.vt == VT_EMPTY)
- ui.IsDir = false;
- else if (prop.vt != VT_BOOL)
- return E_INVALIDARG;
- else
- ui.IsDir = (prop.boolVal != VARIANT_FALSE);
- }
-
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidPosixAttrib, &prop));
- if (prop.vt == VT_EMPTY)
- ui.Mode = 0777 | (ui.IsDir ? 0040000 : 0100000);
- else if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- else
- ui.Mode = prop.ulVal;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidMTime, &prop));
- if (prop.vt == VT_EMPTY)
- ui.Time = 0;
- else if (prop.vt != VT_FILETIME)
- return E_INVALIDARG;
- else if (!NTime::FileTimeToUnixTime(prop.filetime, ui.Time))
- ui.Time = 0;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidPath, &prop));
- if (prop.vt == VT_BSTR)
- ui.Name = UnicodeStringToMultiByte(NItemName::MakeLegalName(prop.bstrVal), CP_OEMCP);
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- if (ui.IsDir)
- ui.Name += '/';
- }
- RINOK(GetPropString(callback, i, kpidUser, ui.User));
- RINOK(GetPropString(callback, i, kpidGroup, ui.Group));
- }
- if (IntToBool(newData))
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- ui.Size = prop.uhVal.QuadPart;
- /*
- // now we support GNU extension for big files
- if (ui.Size >= ((UInt64)1 << 33))
- return E_INVALIDARG;
- */
- }
- updateItems.Add(ui);
- }
- return UpdateArchive(_stream, outStream, _items, updateItems, callback);
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHeader.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHeader.cpp
deleted file mode 100644
index 3275b284c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHeader.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// Archive/Tar/Header.h
-
-#include "StdAfx.h"
-
-#include "TarHeader.h"
-
-namespace NArchive {
-namespace NTar {
-namespace NFileHeader {
-
- // The checksum field is filled with this while the checksum is computed.
- const char *kCheckSumBlanks = " "; // 8 blanks, no null
-
- const char *kLongLink = "././@LongLink";
- const char *kLongLink2 = "@LongLink";
-
- // The magic field is filled with this if uname and gname are valid.
- namespace NMagic
- {
- const char *kUsTar = "ustar"; // 5 chars
- const char *kGNUTar = "GNUtar "; // 7 chars and a null
- const char *kEmpty = "\0\0\0\0\0\0\0\0"; // 7 chars and a null
- }
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHeader.h b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHeader.h
deleted file mode 100644
index 0b78bdc26..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarHeader.h
+++ /dev/null
@@ -1,108 +0,0 @@
-// Archive/Tar/Header.h
-
-#ifndef __ARCHIVE_TAR_HEADER_H
-#define __ARCHIVE_TAR_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NTar {
-
-namespace NFileHeader
-{
- const int kRecordSize = 512;
- const int kNameSize = 100;
- const int kUserNameSize = 32;
- const int kGroupNameSize = 32;
- const int kPrefixSize = 155;
-
- /*
- struct CHeader
- {
- char Name[kNameSize];
- char Mode[8];
- char UID[8];
- char GID[8];
- char Size[12];
- char ModificationTime[12];
- char CheckSum[8];
- char LinkFlag;
- char LinkName[kNameSize];
- char Magic[8];
- char UserName[kUserNameSize];
- char GroupName[kGroupNameSize];
- char DeviceMajor[8];
- char DeviceMinor[8];
- char Prefix[155];
- };
- union CRecord
- {
- CHeader Header;
- Byte Padding[kRecordSize];
- };
- */
-
- namespace NMode
- {
- const int kSetUID = 04000; // Set UID on execution
- const int kSetGID = 02000; // Set GID on execution
- const int kSaveText = 01000; // Save text (sticky bit)
- }
-
- namespace NFilePermissions
- {
- const int kUserRead = 00400; // read by owner
- const int kUserWrite = 00200; // write by owner
- const int kUserExecute = 00100; // execute/search by owner
- const int kGroupRead = 00040; // read by group
- const int kGroupWrite = 00020; // write by group
- const int kGroupExecute = 00010; // execute/search by group
- const int kOtherRead = 00004; // read by other
- const int kOtherWrite = 00002; // write by other
- const int kOtherExecute = 00001; // execute/search by other
- }
-
-
- // The linkflag defines the type of file
- namespace NLinkFlag
- {
- const char kOldNormal = '\0'; // Normal disk file, Unix compatible
- const char kNormal = '0'; // Normal disk file
- const char kLink = '1'; // Link to previously dumped file
- const char kSymbolicLink = '2'; // Symbolic link
- const char kCharacter = '3'; // Character special file
- const char kBlock = '4'; // Block special file
- const char kDirectory = '5'; // Directory
- const char kFIFO = '6'; // FIFO special file
- const char kContiguous = '7'; // Contiguous file
-
- const char kDumpDir = 'D'; /* GNUTYPE_DUMPDIR.
- data: list of files created by the --incremental (-G) option
- Each file name is preceded by either
- - 'Y' (file should be in this archive)
- - 'N' (file is a directory, or is not stored in the archive.)
- Each file name is terminated by a null + an additional null after
- the last file name. */
-
- }
- // Further link types may be defined later.
-
- // The checksum field is filled with this while the checksum is computed.
- extern const char *kCheckSumBlanks;// = " "; // 8 blanks, no null
-
- extern const char *kLongLink; // = "././@LongLink";
- extern const char *kLongLink2; // = "@LongLink";
-
- // The magic field is filled with this if uname and gname are valid.
- namespace NMagic
- {
- extern const char *kUsTar; // = "ustar"; // 5 chars
- extern const char *kGNUTar; // = "GNUtar "; // 7 chars and a null
- extern const char *kEmpty; // = "GNUtar "; // 7 chars and a null
- }
-
-}
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarIn.cpp
deleted file mode 100644
index 5ceaa509d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarIn.cpp
+++ /dev/null
@@ -1,207 +0,0 @@
-// TarIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/StringToInt.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "TarIn.h"
-
-namespace NArchive {
-namespace NTar {
-
-static void MyStrNCpy(char *dest, const char *src, int size)
-{
- for (int i = 0; i < size; i++)
- {
- char c = src[i];
- dest[i] = c;
- if (c == 0)
- break;
- }
-}
-
-static bool OctalToNumber(const char *srcString, int size, UInt64 &res)
-{
- char sz[32];
- MyStrNCpy(sz, srcString, size);
- sz[size] = 0;
- const char *end;
- int i;
- for (i = 0; sz[i] == ' '; i++);
- res = ConvertOctStringToUInt64(sz + i, &end);
- return (*end == ' ' || *end == 0);
-}
-
-static bool OctalToNumber32(const char *srcString, int size, UInt32 &res)
-{
- UInt64 res64;
- if (!OctalToNumber(srcString, size, res64))
- return false;
- res = (UInt32)res64;
- return (res64 <= 0xFFFFFFFF);
-}
-
-#define RIF(x) { if (!(x)) return S_FALSE; }
-
-static bool IsRecordLast(const char *buf)
-{
- for (int i = 0; i < NFileHeader::kRecordSize; i++)
- if (buf[i] != 0)
- return false;
- return true;
-}
-
-static void ReadString(const char *s, int size, AString &result)
-{
- char temp[NFileHeader::kRecordSize + 1];
- MyStrNCpy(temp, s, size);
- temp[size] = '\0';
- result = temp;
-}
-
-static HRESULT GetNextItemReal(ISequentialInStream *stream, bool &filled, CItemEx &item, AString &error)
-{
- char buf[NFileHeader::kRecordSize];
- char *p = buf;
-
- error.Empty();
- filled = false;
-
- bool thereAreEmptyRecords = false;
- for (;;)
- {
- size_t processedSize = NFileHeader::kRecordSize;
- RINOK(ReadStream(stream, buf, &processedSize));
- if (processedSize == 0)
- {
- if (!thereAreEmptyRecords )
- error = "There are no trailing zero-filled records";
- return S_OK;
- }
- if (processedSize != NFileHeader::kRecordSize)
- {
- error = "There is no correct record at the end of archive";
- return S_OK;
- }
- item.HeaderSize += NFileHeader::kRecordSize;
- if (!IsRecordLast(buf))
- break;
- thereAreEmptyRecords = true;
- }
- if (thereAreEmptyRecords)
- {
- error = "There are data after end of archive";
- return S_OK;
- }
-
- ReadString(p, NFileHeader::kNameSize, item.Name); p += NFileHeader::kNameSize;
-
- RIF(OctalToNumber32(p, 8, item.Mode)); p += 8;
-
- if (!OctalToNumber32(p, 8, item.UID)) item.UID = 0; p += 8;
- if (!OctalToNumber32(p, 8, item.GID)) item.GID = 0; p += 8;
-
- if (GetBe32(p) == (UInt32)1 << 31)
- {
- // GNU extension
- item.Size = GetBe64(p + 4);
- }
- else
- {
- RIF(OctalToNumber(p, 12, item.Size));
- }
- p += 12;
- RIF(OctalToNumber32(p, 12, item.MTime)); p += 12;
-
- UInt32 checkSum;
- RIF(OctalToNumber32(p, 8, checkSum));
- memcpy(p, NFileHeader::kCheckSumBlanks, 8); p += 8;
-
- item.LinkFlag = *p++;
-
- ReadString(p, NFileHeader::kNameSize, item.LinkName); p += NFileHeader::kNameSize;
-
- memcpy(item.Magic, p, 8); p += 8;
-
- ReadString(p, NFileHeader::kUserNameSize, item.User); p += NFileHeader::kUserNameSize;
- ReadString(p, NFileHeader::kGroupNameSize, item.Group); p += NFileHeader::kGroupNameSize;
-
- item.DeviceMajorDefined = (p[0] != 0); RIF(OctalToNumber32(p, 8, item.DeviceMajor)); p += 8;
- item.DeviceMinorDefined = (p[0] != 0); RIF(OctalToNumber32(p, 8, item.DeviceMinor)); p += 8;
-
- AString prefix;
- ReadString(p, NFileHeader::kPrefixSize, prefix);
- p += NFileHeader::kPrefixSize;
- if (!prefix.IsEmpty() && item.IsMagic() &&
- (item.LinkFlag != 'L' /* || prefix != "00000000000" */ ))
- item.Name = prefix + AString('/') + item.Name;
-
- if (item.LinkFlag == NFileHeader::NLinkFlag::kLink)
- item.Size = 0;
-
- UInt32 checkSumReal = 0;
- for (int i = 0; i < NFileHeader::kRecordSize; i++)
- checkSumReal += (Byte)buf[i];
-
- if (checkSumReal != checkSum)
- return S_FALSE;
-
- filled = true;
- return S_OK;
-}
-
-HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &item, AString &error)
-{
- item.HeaderSize = 0;
- bool flagL = false;
- bool flagK = false;
- AString nameL;
- AString nameK;
- for (;;)
- {
- RINOK(GetNextItemReal(stream, filled, item, error));
- if (!filled)
- return S_OK;
- if (item.LinkFlag == 'L' || // NEXT file has a long name
- item.LinkFlag == 'K') // NEXT file has a long linkname
- {
- AString *name;
- if (item.LinkFlag == 'L')
- { if (flagL) return S_FALSE; flagL = true; name = &nameL; }
- else
- { if (flagK) return S_FALSE; flagK = true; name = &nameK; }
-
- if (item.Name.Compare(NFileHeader::kLongLink) != 0 &&
- item.Name.Compare(NFileHeader::kLongLink2) != 0)
- return S_FALSE;
- if (item.Size > (1 << 14))
- return S_FALSE;
- int packSize = (int)item.GetPackSize();
- char *buf = name->GetBuffer(packSize);
- RINOK(ReadStream_FALSE(stream, buf, packSize));
- item.HeaderSize += packSize;
- buf[(size_t)item.Size] = '\0';
- name->ReleaseBuffer();
- continue;
- }
- if (item.LinkFlag == 'g' || item.LinkFlag == 'x' || item.LinkFlag == 'X')
- {
- // pax Extended Header
- }
- else if (item.LinkFlag == NFileHeader::NLinkFlag::kDumpDir)
- {
- // GNU Extensions to the Archive Format
- }
- else if (item.LinkFlag > '7' || (item.LinkFlag < '0' && item.LinkFlag != 0))
- return S_FALSE;
- if (flagL) item.Name = nameL;
- if (flagK) item.LinkName = nameK;
- return S_OK;
- }
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarIn.h
deleted file mode 100644
index a5491ebe4..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarIn.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// TarIn.h
-
-#ifndef __ARCHIVE_TAR_IN_H
-#define __ARCHIVE_TAR_IN_H
-
-#include "../../IStream.h"
-
-#include "TarItem.h"
-
-namespace NArchive {
-namespace NTar {
-
-HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &itemInfo, AString &error);
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarItem.h b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarItem.h
deleted file mode 100644
index 859e66dd8..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarItem.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// TarItem.h
-
-#ifndef __ARCHIVE_TAR_ITEM_H
-#define __ARCHIVE_TAR_ITEM_H
-
-#include "../Common/ItemNameUtils.h"
-
-#include "TarHeader.h"
-
-namespace NArchive {
-namespace NTar {
-
-struct CItem
-{
- AString Name;
- UInt64 Size;
-
- UInt32 Mode;
- UInt32 UID;
- UInt32 GID;
- UInt32 MTime;
- UInt32 DeviceMajor;
- UInt32 DeviceMinor;
-
- AString LinkName;
- AString User;
- AString Group;
-
- char Magic[8];
- char LinkFlag;
- bool DeviceMajorDefined;
- bool DeviceMinorDefined;
-
- bool IsLink() const { return LinkFlag == NFileHeader::NLinkFlag::kSymbolicLink && (Size == 0); }
- UInt64 GetUnpackSize() const { return IsLink() ? LinkName.Length() : Size; }
-
- bool IsDir() const
- {
- switch(LinkFlag)
- {
- case NFileHeader::NLinkFlag::kDirectory:
- case NFileHeader::NLinkFlag::kDumpDir:
- return true;
- case NFileHeader::NLinkFlag::kOldNormal:
- case NFileHeader::NLinkFlag::kNormal:
- return NItemName::HasTailSlash(Name, CP_OEMCP);
- }
- return false;
- }
-
- bool IsMagic() const
- {
- for (int i = 0; i < 5; i++)
- if (Magic[i] != NFileHeader::NMagic::kUsTar[i])
- return false;
- return true;
- }
-
- UInt64 GetPackSize() const { return (Size + 0x1FF) & (~((UInt64)0x1FF)); }
-};
-
-struct CItemEx: public CItem
-{
- UInt64 HeaderPos;
- unsigned HeaderSize;
- UInt64 GetDataPosition() const { return HeaderPos + HeaderSize; }
- UInt64 GetFullSize() const { return HeaderSize + Size; }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarOut.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarOut.cpp
deleted file mode 100644
index e542a3b2f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarOut.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-// TarOut.cpp
-
-#include "StdAfx.h"
-
-#include "Common/IntToString.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "TarOut.h"
-
-namespace NArchive {
-namespace NTar {
-
-HRESULT COutArchive::WriteBytes(const void *buffer, UInt32 size)
-{
- return WriteStream(m_Stream, buffer, size);
-}
-
-void COutArchive::Create(ISequentialOutStream *outStream)
-{
- m_Stream = outStream;
-}
-
-static AString MakeOctalString(UInt64 value)
-{
- char s[32];
- ConvertUInt64ToString(value, s, 8);
- return AString(s) + ' ';
-}
-
-static void MyStrNCpy(char *dest, const char *src, int size)
-{
- for (int i = 0; i < size; i++)
- {
- char c = src[i];
- dest[i] = c;
- if (c == 0)
- break;
- }
-}
-
-static bool MakeOctalString8(char *s, UInt32 value)
-{
- AString tempString = MakeOctalString(value);
-
- const int kMaxSize = 8;
- if (tempString.Length() >= kMaxSize)
- return false;
- int numSpaces = kMaxSize - (tempString.Length() + 1);
- for(int i = 0; i < numSpaces; i++)
- s[i] = ' ';
- MyStringCopy(s + numSpaces, (const char *)tempString);
- return true;
-}
-
-static void MakeOctalString12(char *s, UInt64 value)
-{
- AString tempString = MakeOctalString(value);
- const int kMaxSize = 12;
- if (tempString.Length() > kMaxSize)
- {
- // GNU extension;
- s[0] = (char)(Byte)0x80;
- s[1] = s[2] = s[3] = 0;
- for (int i = 0; i < 8; i++, value <<= 8)
- s[4 + i] = (char)(value >> 56);
- return;
- }
- int numSpaces = kMaxSize - tempString.Length();
- for(int i = 0; i < numSpaces; i++)
- s[i] = ' ';
- memmove(s + numSpaces, (const char *)tempString, tempString.Length());
-}
-
-static bool CopyString(char *dest, const AString &src, int maxSize)
-{
- if (src.Length() >= maxSize)
- return false;
- MyStringCopy(dest, (const char *)src);
- return true;
-}
-
-#define RETURN_IF_NOT_TRUE(x) { if (!(x)) return E_FAIL; }
-
-HRESULT COutArchive::WriteHeaderReal(const CItem &item)
-{
- char record[NFileHeader::kRecordSize];
- char *cur = record;
- int i;
- for (i = 0; i < NFileHeader::kRecordSize; i++)
- record[i] = 0;
-
- // RETURN_IF_NOT_TRUE(CopyString(header.Name, item.Name, NFileHeader::kNameSize));
- if (item.Name.Length() > NFileHeader::kNameSize)
- return E_FAIL;
- MyStrNCpy(cur, item.Name, NFileHeader::kNameSize);
- cur += NFileHeader::kNameSize;
-
- RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.Mode)); cur += 8;
- RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.UID)); cur += 8;
- RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.GID)); cur += 8;
-
- MakeOctalString12(cur, item.Size); cur += 12;
- MakeOctalString12(cur, item.MTime); cur += 12;
-
- memmove(cur, NFileHeader::kCheckSumBlanks, 8);
- cur += 8;
-
- *cur++ = item.LinkFlag;
-
- RETURN_IF_NOT_TRUE(CopyString(cur, item.LinkName, NFileHeader::kNameSize));
- cur += NFileHeader::kNameSize;
-
- memmove(cur, item.Magic, 8);
- cur += 8;
-
- RETURN_IF_NOT_TRUE(CopyString(cur, item.User, NFileHeader::kUserNameSize));
- cur += NFileHeader::kUserNameSize;
- RETURN_IF_NOT_TRUE(CopyString(cur, item.Group, NFileHeader::kGroupNameSize));
- cur += NFileHeader::kGroupNameSize;
-
-
- if (item.DeviceMajorDefined)
- RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.DeviceMajor));
- cur += 8;
-
- if (item.DeviceMinorDefined)
- RETURN_IF_NOT_TRUE(MakeOctalString8(cur, item.DeviceMinor));
- cur += 8;
-
-
- UInt32 checkSumReal = 0;
- for(i = 0; i < NFileHeader::kRecordSize; i++)
- checkSumReal += Byte(record[i]);
-
- RETURN_IF_NOT_TRUE(MakeOctalString8(record + 148, checkSumReal));
-
- return WriteBytes(record, NFileHeader::kRecordSize);
-}
-
-HRESULT COutArchive::WriteHeader(const CItem &item)
-{
- int nameSize = item.Name.Length();
- if (nameSize < NFileHeader::kNameSize)
- return WriteHeaderReal(item);
-
- CItem modifiedItem = item;
- int nameStreamSize = nameSize + 1;
- modifiedItem.Size = nameStreamSize;
- modifiedItem.LinkFlag = 'L';
- modifiedItem.Name = NFileHeader::kLongLink;
- modifiedItem.LinkName.Empty();
- RINOK(WriteHeaderReal(modifiedItem));
- RINOK(WriteBytes(item.Name, nameStreamSize));
- RINOK(FillDataResidual(nameStreamSize));
-
- modifiedItem = item;
- modifiedItem.Name = item.Name.Left(NFileHeader::kNameSize - 1);
- return WriteHeaderReal(modifiedItem);
-}
-
-HRESULT COutArchive::FillDataResidual(UInt64 dataSize)
-{
- UInt32 lastRecordSize = UInt32(dataSize & (NFileHeader::kRecordSize - 1));
- if (lastRecordSize == 0)
- return S_OK;
- UInt32 residualSize = NFileHeader::kRecordSize - lastRecordSize;
- Byte residualBytes[NFileHeader::kRecordSize];
- for (UInt32 i = 0; i < residualSize; i++)
- residualBytes[i] = 0;
- return WriteBytes(residualBytes, residualSize);
-}
-
-HRESULT COutArchive::WriteFinishHeader()
-{
- Byte record[NFileHeader::kRecordSize];
- int i;
- for (i = 0; i < NFileHeader::kRecordSize; i++)
- record[i] = 0;
- for (i = 0; i < 2; i++)
- {
- RINOK(WriteBytes(record, NFileHeader::kRecordSize));
- }
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarOut.h b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarOut.h
deleted file mode 100644
index ef837869b..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarOut.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Archive/TarOut.h
-
-#ifndef __ARCHIVE_TAR_OUT_H
-#define __ARCHIVE_TAR_OUT_H
-
-#include "TarItem.h"
-
-#include "Common/MyCom.h"
-#include "../../IStream.h"
-
-namespace NArchive {
-namespace NTar {
-
-class COutArchive
-{
- CMyComPtr<ISequentialOutStream> m_Stream;
- HRESULT WriteBytes(const void *buffer, UInt32 size);
-public:
- void Create(ISequentialOutStream *outStream);
- HRESULT WriteHeaderReal(const CItem &item);
- HRESULT WriteHeader(const CItem &item);
- HRESULT FillDataResidual(UInt64 dataSize);
- HRESULT WriteFinishHeader();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarRegister.cpp
deleted file mode 100644
index e21c0aac4..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarRegister.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// TarRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "TarHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NTar::CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new NArchive::NTar::CHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
-{ L"tar", L"tar", 0, 0xEE, { 'u', 's', 't', 'a', 'r' }, 5, false, CreateArc, CreateArcOut };
-
-REGISTER_ARC(Tar)
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarUpdate.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarUpdate.cpp
deleted file mode 100644
index c16332189..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarUpdate.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-// TarUpdate.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "TarOut.h"
-#include "TarUpdate.h"
-
-namespace NArchive {
-namespace NTar {
-
-HRESULT UpdateArchive(IInStream *inStream, ISequentialOutStream *outStream,
- const CObjectVector<NArchive::NTar::CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- IArchiveUpdateCallback *updateCallback)
-{
- COutArchive outArchive;
- outArchive.Create(outStream);
-
- UInt64 complexity = 0;
-
- int i;
- for(i = 0; i < updateItems.Size(); i++)
- {
- const CUpdateItem &ui = updateItems[i];
- if (ui.NewData)
- complexity += ui.Size;
- else
- complexity += inputItems[ui.IndexInArchive].GetFullSize();
- }
-
- RINOK(updateCallback->SetTotal(complexity));
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(updateCallback, true);
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<CLimitedSequentialInStream> inStreamLimited(streamSpec);
- streamSpec->SetStream(inStream);
-
- complexity = 0;
-
- for(i = 0; i < updateItems.Size(); i++)
- {
- lps->InSize = lps->OutSize = complexity;
- RINOK(lps->SetCur());
-
- const CUpdateItem &ui = updateItems[i];
- CItem item;
- if (ui.NewProps)
- {
- item.Mode = ui.Mode;
- item.Name = ui.Name;
- item.User = ui.User;
- item.Group = ui.Group;
- if (ui.IsDir)
- {
- item.LinkFlag = NFileHeader::NLinkFlag::kDirectory;
- item.Size = 0;
- }
- else
- {
- item.LinkFlag = NFileHeader::NLinkFlag::kNormal;
- item.Size = ui.Size;
- }
- item.MTime = ui.Time;
- item.DeviceMajorDefined = false;
- item.DeviceMinorDefined = false;
- item.UID = 0;
- item.GID = 0;
- memmove(item.Magic, NFileHeader::NMagic::kEmpty, 8);
- }
- else
- item = inputItems[ui.IndexInArchive];
-
- if (ui.NewData)
- {
- item.Size = ui.Size;
- if (item.Size == (UInt64)(Int64)-1)
- return E_INVALIDARG;
- }
- else
- item.Size = inputItems[ui.IndexInArchive].Size;
-
- if (ui.NewData)
- {
- CMyComPtr<ISequentialInStream> fileInStream;
- HRESULT res = updateCallback->GetStream(ui.IndexInClient, &fileInStream);
- if (res != S_FALSE)
- {
- RINOK(res);
- RINOK(outArchive.WriteHeader(item));
- if (!ui.IsDir)
- {
- RINOK(copyCoder->Code(fileInStream, outStream, NULL, NULL, progress));
- if (copyCoderSpec->TotalSize != item.Size)
- return E_FAIL;
- RINOK(outArchive.FillDataResidual(item.Size));
- }
- }
- complexity += ui.Size;
- RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- }
- else
- {
- const CItemEx &existItem = inputItems[ui.IndexInArchive];
- UInt64 size;
- if (ui.NewProps)
- {
- RINOK(outArchive.WriteHeader(item));
- RINOK(inStream->Seek(existItem.GetDataPosition(), STREAM_SEEK_SET, NULL));
- size = existItem.Size;
- }
- else
- {
- RINOK(inStream->Seek(existItem.HeaderPos, STREAM_SEEK_SET, NULL));
- size = existItem.GetFullSize();
- }
- streamSpec->Init(size);
-
- RINOK(copyCoder->Code(inStreamLimited, outStream, NULL, NULL, progress));
- if (copyCoderSpec->TotalSize != size)
- return E_FAIL;
- RINOK(outArchive.FillDataResidual(existItem.Size));
- complexity += size;
- }
- }
- return outArchive.WriteFinishHeader();
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarUpdate.h b/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarUpdate.h
deleted file mode 100644
index fb217d196..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Tar/TarUpdate.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// TarUpdate.h
-
-#ifndef __TAR_UPDATE_H
-#define __TAR_UPDATE_H
-
-#include "../IArchive.h"
-#include "TarItem.h"
-
-namespace NArchive {
-namespace NTar {
-
-struct CUpdateItem
-{
- int IndexInArchive;
- int IndexInClient;
- UInt32 Time;
- UInt32 Mode;
- UInt64 Size;
- AString Name;
- AString User;
- AString Group;
- bool NewData;
- bool NewProps;
- bool IsDir;
-};
-
-HRESULT UpdateArchive(IInStream *inStream, ISequentialOutStream *outStream,
- const CObjectVector<CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- IArchiveUpdateCallback *updateCallback);
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Udf/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Udf/StdAfx.h
deleted file mode 100644
index 2e4be10b2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Udf/StdAfx.h
+++ /dev/null
@@ -1,9 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/MyWindows.h"
-#include "../../../Common/NewHandler.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfHandler.cpp
deleted file mode 100644
index c70852728..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfHandler.cpp
+++ /dev/null
@@ -1,451 +0,0 @@
-// UdfHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamObjects.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "UdfHandler.h"
-
-namespace NArchive {
-namespace NUdf {
-
-void UdfTimeToFileTime(const CTime &t, NWindows::NCOM::CPropVariant &prop)
-{
- UInt64 numSecs;
- const Byte *d = t.Data;
- if (!NWindows::NTime::GetSecondsSince1601(t.GetYear(), d[4], d[5], d[6], d[7], d[8], numSecs))
- return;
- if (t.IsLocal())
- numSecs -= t.GetMinutesOffset() * 60;
- FILETIME ft;
- UInt64 v = (((numSecs * 100 + d[9]) * 100 + d[10]) * 100 + d[11]) * 10;
- ft.dwLowDateTime = (UInt32)v;
- ft.dwHighDateTime = (UInt32)(v >> 32);
- prop = ft;
-}
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME}
-};
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidClusterSize, VT_UI4},
- { NULL, kpidCTime, VT_FILETIME}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidComment:
- {
- UString comment = _archive.GetComment();
- if (!comment.IsEmpty())
- prop = comment;
- break;
- }
-
- case kpidClusterSize:
- if (_archive.LogVols.Size() > 0)
- {
- UInt32 blockSize = _archive.LogVols[0].BlockSize;
- int i;
- for (i = 1; i < _archive.LogVols.Size(); i++)
- if (_archive.LogVols[i].BlockSize != blockSize)
- break;
- if (i == _archive.LogVols.Size())
- prop = blockSize;
- }
- break;
-
- case kpidCTime:
- if (_archive.LogVols.Size() == 1)
- {
- const CLogVol &vol = _archive.LogVols[0];
- if (vol.FileSets.Size() >= 1)
- UdfTimeToFileTime(vol.FileSets[0].RecodringTime, prop);
- }
- break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CProgressImp: public CProgressVirt
-{
- CMyComPtr<IArchiveOpenCallback> _callback;
- UInt64 _numFiles;
- UInt64 _numBytes;
-public:
- HRESULT SetTotal(UInt64 numBytes);
- HRESULT SetCompleted(UInt64 numFiles, UInt64 numBytes);
- HRESULT SetCompleted();
- CProgressImp(IArchiveOpenCallback *callback): _callback(callback), _numFiles(0), _numBytes(0) {}
-};
-
-HRESULT CProgressImp::SetTotal(UInt64 numBytes)
-{
- if (_callback)
- return _callback->SetTotal(NULL, &numBytes);
- return S_OK;
-}
-
-HRESULT CProgressImp::SetCompleted(UInt64 numFiles, UInt64 numBytes)
-{
- _numFiles = numFiles;
- _numBytes = numBytes;
- return SetCompleted();
-}
-
-HRESULT CProgressImp::SetCompleted()
-{
- if (_callback)
- return _callback->SetCompleted(&_numFiles, &_numBytes);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- {
- Close();
- CProgressImp progressImp(callback);
- RINOK(_archive.Open(stream, &progressImp));
- bool showVolName = (_archive.LogVols.Size() > 1);
- for (int volIndex = 0; volIndex < _archive.LogVols.Size(); volIndex++)
- {
- const CLogVol &vol = _archive.LogVols[volIndex];
- bool showFileSetName = (vol.FileSets.Size() > 1);
- for (int fsIndex = 0; fsIndex < vol.FileSets.Size(); fsIndex++)
- {
- const CFileSet &fs = vol.FileSets[fsIndex];
- for (int i = ((showVolName || showFileSetName) ? 0 : 1); i < fs.Refs.Size(); i++)
- {
- CRef2 ref2;
- ref2.Vol = volIndex;
- ref2.Fs = fsIndex;
- ref2.Ref = i;
- _refs2.Add(ref2);
- }
- }
- }
- _inStream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _inStream.Release();
- _archive.Clear();
- _refs2.Clear();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _refs2.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- {
- const CRef2 &ref2 = _refs2[index];
- const CLogVol &vol = _archive.LogVols[ref2.Vol];
- const CRef &ref = vol.FileSets[ref2.Fs].Refs[ref2.Ref];
- const CFile &file = _archive.Files[ref.FileIndex];
- const CItem &item = _archive.Items[file.ItemIndex];
- switch(propID)
- {
- case kpidPath: prop = _archive.GetItemPath(ref2.Vol, ref2.Fs, ref2.Ref,
- _archive.LogVols.Size() > 1, vol.FileSets.Size() > 1); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: if (!item.IsDir()) prop = (UInt64)item.Size; break;
- case kpidPackSize: if (!item.IsDir()) prop = (UInt64)item.NumLogBlockRecorded * vol.BlockSize; break;
- case kpidMTime: UdfTimeToFileTime(item.MTime, prop); break;
- case kpidATime: UdfTimeToFileTime(item.ATime, prop); break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-struct CSeekExtent
-{
- UInt64 Phy;
- UInt64 Virt;
-};
-
-class CExtentsStream:
- public IInStream,
- public CMyUnknownImp
-{
- UInt64 _phyPos;
- UInt64 _virtPos;
- bool _needStartSeek;
-
- HRESULT SeekToPhys() { return Stream->Seek(_phyPos, STREAM_SEEK_SET, NULL); }
-
-public:
- CMyComPtr<IInStream> Stream;
- CRecordVector<CSeekExtent> Extents;
-
- MY_UNKNOWN_IMP1(IInStream)
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
- void ReleaseStream() { Stream.Release(); }
-
- void Init()
- {
- _virtPos = 0;
- _phyPos = 0;
- _needStartSeek = true;
- }
-
-};
-
-
-STDMETHODIMP CExtentsStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (size > 0)
- {
- UInt64 totalSize = Extents.Back().Virt;
- if (_virtPos >= totalSize)
- return (_virtPos == totalSize) ? S_OK : E_FAIL;
- int left = 0, right = Extents.Size() - 1;
- for (;;)
- {
- int mid = (left + right) / 2;
- if (mid == left)
- break;
- if (_virtPos < Extents[mid].Virt)
- right = mid;
- else
- left = mid;
- }
-
- const CSeekExtent &extent = Extents[left];
- UInt64 phyPos = extent.Phy + (_virtPos - extent.Virt);
- if (_needStartSeek || _phyPos != phyPos)
- {
- _needStartSeek = false;
- _phyPos = phyPos;
- RINOK(SeekToPhys());
- }
-
- UInt64 rem = Extents[left + 1].Virt - _virtPos;
- if (size > rem)
- size = (UInt32)rem;
-
- HRESULT res = Stream->Read(data, size, &size);
- _phyPos += size;
- _virtPos += size;
- if (processedSize)
- *processedSize = size;
- return res;
- }
- return S_OK;
-}
-
-STDMETHODIMP CExtentsStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch(seekOrigin)
- {
- case STREAM_SEEK_SET: _virtPos = offset; break;
- case STREAM_SEEK_CUR: _virtPos += offset; break;
- case STREAM_SEEK_END: _virtPos = Extents.Back().Virt + offset; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- *stream = 0;
-
- const CRef2 &ref2 = _refs2[index];
- const CLogVol &vol = _archive.LogVols[ref2.Vol];
- const CRef &ref = vol.FileSets[ref2.Fs].Refs[ref2.Ref];
- const CFile &file = _archive.Files[ref.FileIndex];
- const CItem &item = _archive.Items[file.ItemIndex];
- UInt64 size = item.Size;
-
- if (!item.IsRecAndAlloc() || !item.CheckChunkSizes() || ! _archive.CheckItemExtents(ref2.Vol, item))
- return E_NOTIMPL;
-
- if (item.IsInline)
- {
- CBufInStream *inStreamSpec = new CBufInStream;
- CMyComPtr<ISequentialInStream> inStream = inStreamSpec;
- CReferenceBuf *referenceBuf = new CReferenceBuf;
- CMyComPtr<IUnknown> ref = referenceBuf;
- referenceBuf->Buf = item.InlineData;
- inStreamSpec->Init(referenceBuf);
- *stream = inStream.Detach();
- return S_OK;
- }
-
- CExtentsStream *extentStreamSpec = new CExtentsStream();
- CMyComPtr<ISequentialInStream> extentStream = extentStreamSpec;
-
- extentStreamSpec->Stream = _inStream;
-
- UInt64 virtOffset = 0;
- for (int extentIndex = 0; extentIndex < item.Extents.Size(); extentIndex++)
- {
- const CMyExtent &extent = item.Extents[extentIndex];
- UInt32 len = extent.GetLen();
- if (len == 0)
- continue;
- if (size < len)
- return S_FALSE;
-
- int partitionIndex = vol.PartitionMaps[extent.PartitionRef].PartitionIndex;
- UInt32 logBlockNumber = extent.Pos;
- const CPartition &partition = _archive.Partitions[partitionIndex];
- UInt64 offset = ((UInt64)partition.Pos << _archive.SecLogSize) +
- (UInt64)logBlockNumber * vol.BlockSize;
-
- CSeekExtent se;
- se.Phy = offset;
- se.Virt = virtOffset;
- virtOffset += len;
- extentStreamSpec->Extents.Add(se);
-
- size -= len;
- }
- if (size != 0)
- return S_FALSE;
- CSeekExtent se;
- se.Phy = 0;
- se.Virt = virtOffset;
- extentStreamSpec->Extents.Add(se);
- extentStreamSpec->Init();
- *stream = extentStream.Detach();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _refs2.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
-
- for (i = 0; i < numItems; i++)
- {
- UInt32 index = (allFilesMode ? i : indices[i]);
- const CRef2 &ref2 = _refs2[index];
- const CRef &ref = _archive.LogVols[ref2.Vol].FileSets[ref2.Fs].Refs[ref2.Ref];
- const CFile &file = _archive.Files[ref.FileIndex];
- const CItem &item = _archive.Items[file.ItemIndex];
- if (!item.IsDir())
- totalSize += item.Size;
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentTotalSize = 0;
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialOutStream *outStreamSpec = new CLimitedSequentialOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- UInt32 index = allFilesMode ? i : indices[i];
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- const CRef2 &ref2 = _refs2[index];
- const CRef &ref = _archive.LogVols[ref2.Vol].FileSets[ref2.Fs].Refs[ref2.Ref];
- const CFile &file = _archive.Files[ref.FileIndex];
- const CItem &item = _archive.Items[file.ItemIndex];
-
- if (item.IsDir())
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- currentTotalSize += item.Size;
-
- if (!testMode && !realOutStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init(item.Size);
- Int32 opRes;
- CMyComPtr<ISequentialInStream> udfInStream;
- HRESULT res = GetStream(index, &udfInStream);
- if (res == E_NOTIMPL)
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- else if (res != S_OK)
- opRes = NExtract::NOperationResult::kDataError;
- else
- {
- RINOK(copyCoder->Code(udfInStream, outStream, NULL, NULL, progress));
- opRes = outStreamSpec->IsFinishedOK() ?
- NExtract::NOperationResult::kOK:
- NExtract::NOperationResult::kDataError;
- }
- outStreamSpec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- return S_OK;
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfHandler.h
deleted file mode 100644
index f513727d7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfHandler.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Udf/Handler.h
-
-#ifndef __UDF_HANDLER_H
-#define __UDF_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "../IArchive.h"
-
-#include "UdfIn.h"
-
-namespace NArchive {
-namespace NUdf {
-
-struct CRef2
-{
- int Vol;
- int Fs;
- int Ref;
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _inStream;
- CInArchive _archive;
- CRecordVector<CRef2> _refs2;
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfIn.cpp
deleted file mode 100644
index 60d5fc2ad..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfIn.cpp
+++ /dev/null
@@ -1,876 +0,0 @@
-// Archive/UdfIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "../../Common/StreamUtils.h"
-
-#include "UdfIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-namespace NArchive {
-namespace NUdf {
-
-const int kNumPartitionsMax = 64;
-const int kNumLogVolumesMax = 64;
-const int kNumRecureseLevelsMax = 1 << 10;
-const int kNumItemsMax = 1 << 27;
-const int kNumFilesMax = 1 << 28;
-const int kNumRefsMax = 1 << 28;
-const UInt32 kNumExtentsMax = (UInt32)1 << 30;
-const UInt64 kFileNameLengthTotalMax = (UInt64)1 << 33;
-const UInt64 kInlineExtentsSizeMax = (UInt64)1 << 33;
-
-void MY_FAST_CALL Crc16GenerateTable(void);
-
-#define CRC16_INIT_VAL 0
-#define CRC16_GET_DIGEST(crc) (crc)
-#define CRC16_UPDATE_BYTE(crc, b) (g_Crc16Table[(((crc) >> 8) ^ (b)) & 0xFF] ^ ((crc) << 8))
-
-#define kCrc16Poly 0x1021
-UInt16 g_Crc16Table[256];
-
-void MY_FAST_CALL Crc16GenerateTable(void)
-{
- UInt32 i;
- for (i = 0; i < 256; i++)
- {
- UInt32 r = (i << 8);
- for (int j = 8; j > 0; j--)
- r = ((r & 0x8000) ? ((r << 1) ^ kCrc16Poly) : (r << 1)) & 0xFFFF;
- g_Crc16Table[i] = (UInt16)r;
- }
-}
-
-UInt16 MY_FAST_CALL Crc16_Update(UInt16 v, const void *data, size_t size)
-{
- const Byte *p = (const Byte *)data;
- for (; size > 0 ; size--, p++)
- v = CRC16_UPDATE_BYTE(v, *p);
- return v;
-}
-
-UInt16 MY_FAST_CALL Crc16Calc(const void *data, size_t size)
-{
- return Crc16_Update(CRC16_INIT_VAL, data, size);
-}
-
-struct CCrc16TableInit { CCrc16TableInit() { Crc16GenerateTable(); } } g_Crc16TableInit;
-
-void CDString128::Parse(const Byte *buf) { memcpy(Data, buf, sizeof(Data)); }
-
-void CDString::Parse(const Byte *p, unsigned size)
-{
- Data.SetCapacity(size);
- memcpy(Data, p, size);
-}
-
-static UString ParseDString(const Byte *data, int size)
-{
- UString res;
- wchar_t *p;
- if (size > 0)
- {
- Byte type = data[0];
- if (type == 8)
- {
- p = res.GetBuffer((int)size + 1);
- for (int i = 1; i < size; i++)
- {
- wchar_t c = data[i];
- if (c == 0)
- break;
- *p++ = c;
- }
- }
- else if (type == 16)
- {
- p = res.GetBuffer((int)size / 2 + 1);
- for (int i = 1; i + 2 <= size; i += 2)
- {
- wchar_t c = ((wchar_t)data[i] << 8) | data[i + 1];
- if (c == 0)
- break;
- *p++ = c;
- }
- }
- else
- return L"[unknow]";
- *p++ = 0;
- res.ReleaseBuffer();
- }
- return res;
-}
-
-UString CDString:: GetString() const { return ParseDString(Data, (int)Data.GetCapacity()); }
-UString CDString128::GetString() const
-{
- int size = Data[sizeof(Data) - 1];
- return ParseDString(Data, MyMin(size, (int)(sizeof(Data) - 1)));
-}
-
-void CTime::Parse(const Byte *buf) { memcpy(Data, buf, sizeof(Data)); }
-
-/*
-void CRegId::Parse(const Byte *buf)
-{
- Flags = buf[0];
- memcpy(Id, buf + 1, sizeof(Id));
- memcpy(Suffix, buf + 24, sizeof(Suffix));
-}
-*/
-
-// ECMA 3/7.1
-
-struct CExtent
-{
- UInt32 Len;
- UInt32 Pos;
-
- void Parse(const Byte *buf);
-};
-
-void CExtent::Parse(const Byte *buf)
-{
- Len = Get32(buf);
- Pos = Get32(buf + 4);
-}
-
-// ECMA 3/7.2
-
-struct CTag
-{
- UInt16 Id;
- UInt16 Version;
- // Byte Checksum;
- // UInt16 SerialNumber;
- // UInt16 Crc;
- // UInt16 CrcLen;
- // UInt32 TagLocation;
-
- HRESULT Parse(const Byte *buf, size_t size);
-};
-
-HRESULT CTag::Parse(const Byte *buf, size_t size)
-{
- if (size < 16)
- return S_FALSE;
- Byte sum = 0;
- int i;
- for (i = 0; i < 4; i++) sum = sum + buf[i];
- for (i = 5; i < 16; i++) sum = sum + buf[i];
- if (sum != buf[4] || buf[5] != 0) return S_FALSE;
-
- Id = Get16(buf);
- Version = Get16(buf + 2);
- // SerialNumber = Get16(buf + 6);
- UInt16 crc = Get16(buf + 8);
- UInt16 crcLen = Get16(buf + 10);
- // TagLocation = Get32(buf + 12);
-
- if (size >= 16 + (size_t)crcLen)
- if (crc == Crc16Calc(buf + 16, crcLen))
- return S_OK;
- return S_FALSE;
-}
-
-// ECMA 3/7.2.1
-
-enum EDescriptorType
-{
- DESC_TYPE_SpoaringTable = 0, // UDF
- DESC_TYPE_PrimVol = 1,
- DESC_TYPE_AnchorVolPtr = 2,
- DESC_TYPE_VolPtr = 3,
- DESC_TYPE_ImplUseVol = 4,
- DESC_TYPE_Partition = 5,
- DESC_TYPE_LogicalVol = 6,
- DESC_TYPE_UnallocSpace = 7,
- DESC_TYPE_Terminating = 8,
- DESC_TYPE_LogicalVolIntegrity = 9,
- DESC_TYPE_FileSet = 256,
- DESC_TYPE_FileId = 257,
- DESC_TYPE_AllocationExtent = 258,
- DESC_TYPE_Indirect = 259,
- DESC_TYPE_Terminal = 260,
- DESC_TYPE_File = 261,
- DESC_TYPE_ExtendedAttrHeader = 262,
- DESC_TYPE_UnallocatedSpace = 263,
- DESC_TYPE_SpaceBitmap = 264,
- DESC_TYPE_PartitionIntegrity = 265,
- DESC_TYPE_ExtendedFile = 266
-};
-
-
-void CLogBlockAddr::Parse(const Byte *buf)
-{
- Pos = Get32(buf);
- PartitionRef = Get16(buf + 4);
-}
-
-void CShortAllocDesc::Parse(const Byte *buf)
-{
- Len = Get32(buf);
- Pos = Get32(buf + 4);
-}
-
-/*
-void CADImpUse::Parse(const Byte *buf)
-{
- Flags = Get16(buf);
- UdfUniqueId = Get32(buf + 2);
-}
-*/
-
-void CLongAllocDesc::Parse(const Byte *buf)
-{
- Len = Get32(buf);
- Location.Parse(buf + 4);
- // memcpy(ImplUse, buf + 10, sizeof(ImplUse));
- // adImpUse.Parse(ImplUse);
-}
-
-bool CInArchive::CheckExtent(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len) const
-{
- const CLogVol &vol = LogVols[volIndex];
- const CPartition &partition = Partitions[vol.PartitionMaps[partitionRef].PartitionIndex];
- UInt64 offset = ((UInt64)partition.Pos << SecLogSize) + (UInt64)blockPos * vol.BlockSize;
- return (offset + len) <= (((UInt64)partition.Pos + partition.Len) << SecLogSize);
-}
-
-bool CInArchive::CheckItemExtents(int volIndex, const CItem &item) const
-{
- for (int i = 0; i < item.Extents.Size(); i++)
- {
- const CMyExtent &e = item.Extents[i];
- if (!CheckExtent(volIndex, e.PartitionRef, e.Pos, e.GetLen()))
- return false;
- }
- return true;
-}
-
-HRESULT CInArchive::Read(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len, Byte *buf)
-{
- if (!CheckExtent(volIndex, partitionRef, blockPos, len))
- return S_FALSE;
- const CLogVol &vol = LogVols[volIndex];
- const CPartition &partition = Partitions[vol.PartitionMaps[partitionRef].PartitionIndex];
- RINOK(_stream->Seek(((UInt64)partition.Pos << SecLogSize) +
- (UInt64)blockPos * vol.BlockSize, STREAM_SEEK_SET, NULL));
- return ReadStream_FALSE(_stream, buf, len);
-}
-
-HRESULT CInArchive::Read(int volIndex, const CLongAllocDesc &lad, Byte *buf)
-{
- return Read(volIndex, lad.Location.PartitionRef, lad.Location.Pos, lad.GetLen(), (Byte *)buf);
-}
-
-HRESULT CInArchive::ReadFromFile(int volIndex, const CItem &item, CByteBuffer &buf)
-{
- if (item.Size >= (UInt32)1 << 30)
- return S_FALSE;
- if (item.IsInline)
- {
- buf = item.InlineData;
- return S_OK;
- }
- buf.SetCapacity((size_t)item.Size);
- size_t pos = 0;
- for (int i = 0; i < item.Extents.Size(); i++)
- {
- const CMyExtent &e = item.Extents[i];
- UInt32 len = e.GetLen();
- RINOK(Read(volIndex, e.PartitionRef, e.Pos, len, (Byte *)buf + pos));
- pos += len;
- }
- return S_OK;
-}
-
-
-void CIcbTag::Parse(const Byte *p)
-{
- // PriorDirectNum = Get32(p);
- // StrategyType = Get16(p + 4);
- // StrategyParam = Get16(p + 6);
- // MaxNumOfEntries = Get16(p + 8);
- FileType = p[11];
- // ParentIcb.Parse(p + 12);
- Flags = Get16(p + 18);
-}
-
-void CItem::Parse(const Byte *p)
-{
- // Uid = Get32(p + 36);
- // Gid = Get32(p + 40);
- // Permissions = Get32(p + 44);
- // FileLinkCount = Get16(p + 48);
- // RecordFormat = p[50];
- // RecordDisplayAttr = p[51];
- // RecordLen = Get32(p + 52);
- Size = Get64(p + 56);
- NumLogBlockRecorded = Get64(p + 64);
- ATime.Parse(p + 72);
- MTime.Parse(p + 84);
- // AttrtTime.Parse(p + 96);
- // CheckPoint = Get32(p + 108);
- // ExtendedAttrIcb.Parse(p + 112);
- // ImplId.Parse(p + 128);
- // UniqueId = Get64(p + 160);
-}
-
-// 4/14.4
-struct CFileId
-{
- // UInt16 FileVersion;
- Byte FileCharacteristics;
- // CByteBuffer ImplUse;
- CDString Id;
- CLongAllocDesc Icb;
-
- bool IsItLinkParent() const { return (FileCharacteristics & FILEID_CHARACS_Parent) != 0; }
- HRESULT Parse(const Byte *p, size_t size, size_t &processed);
-};
-
-HRESULT CFileId::Parse(const Byte *p, size_t size, size_t &processed)
-{
- processed = 0;
- if (size < 38)
- return S_FALSE;
- CTag tag;
- RINOK(tag.Parse(p, size));
- if (tag.Id != DESC_TYPE_FileId)
- return S_FALSE;
- // FileVersion = Get16(p + 16);
- FileCharacteristics = p[18];
- unsigned idLen = p[19];
- Icb.Parse(p + 20);
- unsigned impLen = Get16(p + 36);
- if (size < 38 + idLen + impLen)
- return S_FALSE;
- // ImplUse.SetCapacity(impLen);
- processed = 38;
- // memcpy(ImplUse, p + processed, impLen);
- processed += impLen;
- Id.Parse(p + processed, idLen);
- processed += idLen;
- for (;(processed & 3) != 0; processed++)
- if (p[processed] != 0)
- return S_FALSE;
- return (processed <= size) ? S_OK : S_FALSE;
-}
-
-HRESULT CInArchive::ReadFileItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed)
-{
- if (Files.Size() % 100 == 0)
- RINOK(_progress->SetCompleted(Files.Size(), _processedProgressBytes));
- if (numRecurseAllowed-- == 0)
- return S_FALSE;
- CFile &file = Files.Back();
- const CLogVol &vol = LogVols[volIndex];
- CPartition &partition = Partitions[vol.PartitionMaps[lad.Location.PartitionRef].PartitionIndex];
-
- UInt32 key = lad.Location.Pos;
- UInt32 value;
- const UInt32 kRecursedErrorValue = (UInt32)(Int32)-1;
- if (partition.Map.Find(key, value))
- {
- if (value == kRecursedErrorValue)
- return S_FALSE;
- file.ItemIndex = value;
- }
- else
- {
- value = Items.Size();
- file.ItemIndex = (int)value;
- if (partition.Map.Set(key, kRecursedErrorValue))
- return S_FALSE;
- RINOK(ReadItem(volIndex, fsIndex, lad, numRecurseAllowed));
- if (!partition.Map.Set(key, value))
- return S_FALSE;
- }
- return S_OK;
-}
-
-HRESULT CInArchive::ReadItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed)
-{
- if (Items.Size() > kNumItemsMax)
- return S_FALSE;
- Items.Add(CItem());
- CItem &item = Items.Back();
-
- const CLogVol &vol = LogVols[volIndex];
-
- if (lad.GetLen() != vol.BlockSize)
- return S_FALSE;
-
- CByteBuffer buf;
- size_t size = lad.GetLen();
- buf.SetCapacity(size);
- RINOK(Read(volIndex, lad, buf));
-
- CTag tag;
- const Byte *p = buf;
- RINOK(tag.Parse(p, size));
- if (tag.Id != DESC_TYPE_File)
- return S_FALSE;
-
- item.IcbTag.Parse(p + 16);
- if (item.IcbTag.FileType != ICB_FILE_TYPE_DIR &&
- item.IcbTag.FileType != ICB_FILE_TYPE_FILE)
- return S_FALSE;
-
- item.Parse(p);
-
- _processedProgressBytes += (UInt64)item.NumLogBlockRecorded * vol.BlockSize + size;
-
- UInt32 extendedAttrLen = Get32(p + 168);
- UInt32 allocDescriptorsLen = Get32(p + 172);
-
- if ((extendedAttrLen & 3) != 0)
- return S_FALSE;
- int pos = 176;
- if (extendedAttrLen > size - pos)
- return S_FALSE;
- /*
- if (extendedAttrLen != 16)
- {
- if (extendedAttrLen < 24)
- return S_FALSE;
- CTag attrTag;
- RINOK(attrTag.Parse(p + pos, size));
- if (attrTag.Id != DESC_TYPE_ExtendedAttrHeader)
- return S_FALSE;
- // UInt32 implAttrLocation = Get32(p + pos + 16);
- // UInt32 applicationlAttrLocation = Get32(p + pos + 20);
- }
- */
- pos += extendedAttrLen;
-
- int desctType = item.IcbTag.GetDescriptorType();
- if (allocDescriptorsLen > size - pos)
- return S_FALSE;
- if (desctType == ICB_DESC_TYPE_INLINE)
- {
- item.IsInline = true;
- item.InlineData.SetCapacity(allocDescriptorsLen);
- memcpy(item.InlineData, p + pos, allocDescriptorsLen);
- }
- else
- {
- item.IsInline = false;
- if (desctType != ICB_DESC_TYPE_SHORT && desctType != ICB_DESC_TYPE_LONG)
- return S_FALSE;
- for (UInt32 i = 0; i < allocDescriptorsLen;)
- {
- CMyExtent e;
- if (desctType == ICB_DESC_TYPE_SHORT)
- {
- if (i + 8 > allocDescriptorsLen)
- return S_FALSE;
- CShortAllocDesc sad;
- sad.Parse(p + pos + i);
- e.Pos = sad.Pos;
- e.Len = sad.Len;
- e.PartitionRef = lad.Location.PartitionRef;
- i += 8;
- }
- else
- {
- if (i + 16 > allocDescriptorsLen)
- return S_FALSE;
- CLongAllocDesc ladNew;
- ladNew.Parse(p + pos + i);
- e.Pos = ladNew.Location.Pos;
- e.PartitionRef = ladNew.Location.PartitionRef;
- e.Len = ladNew.Len;
- i += 16;
- }
- item.Extents.Add(e);
- }
- }
-
- if (item.IcbTag.IsDir())
- {
- if (!item.CheckChunkSizes() || !CheckItemExtents(volIndex, item))
- return S_FALSE;
- CByteBuffer buf;
- RINOK(ReadFromFile(volIndex, item, buf));
- item.Size = 0;
- item.Extents.ClearAndFree();
- item.InlineData.Free();
-
- const Byte *p = buf;
- size = buf.GetCapacity();
- size_t processedTotal = 0;
- for (; processedTotal < size;)
- {
- size_t processedCur;
- CFileId fileId;
- RINOK(fileId.Parse(p + processedTotal, size - processedTotal, processedCur));
- if (!fileId.IsItLinkParent())
- {
- CFile file;
- // file.FileVersion = fileId.FileVersion;
- // file.FileCharacteristics = fileId.FileCharacteristics;
- // file.ImplUse = fileId.ImplUse;
- file.Id = fileId.Id;
-
- _fileNameLengthTotal += file.Id.Data.GetCapacity();
- if (_fileNameLengthTotal > kFileNameLengthTotalMax)
- return S_FALSE;
-
- item.SubFiles.Add(Files.Size());
- if (Files.Size() > kNumFilesMax)
- return S_FALSE;
- Files.Add(file);
- RINOK(ReadFileItem(volIndex, fsIndex, fileId.Icb, numRecurseAllowed));
- }
- processedTotal += processedCur;
- }
- }
- else
- {
- if ((UInt32)item.Extents.Size() > kNumExtentsMax - _numExtents)
- return S_FALSE;
- _numExtents += item.Extents.Size();
-
- if (item.InlineData.GetCapacity() > kInlineExtentsSizeMax - _inlineExtentsSize)
- return S_FALSE;
- _inlineExtentsSize += item.InlineData.GetCapacity();
- }
-
- return S_OK;
-}
-
-HRESULT CInArchive::FillRefs(CFileSet &fs, int fileIndex, int parent, int numRecurseAllowed)
-{
- if (_numRefs % 10000 == 0)
- {
- RINOK(_progress->SetCompleted());
- }
- if (numRecurseAllowed-- == 0)
- return S_FALSE;
- if (_numRefs >= kNumRefsMax)
- return S_FALSE;
- _numRefs++;
- CRef ref;
- ref.FileIndex = fileIndex;
- ref.Parent = parent;
- parent = fs.Refs.Size();
- fs.Refs.Add(ref);
- const CItem &item = Items[Files[fileIndex].ItemIndex];
- for (int i = 0; i < item.SubFiles.Size(); i++)
- {
- RINOK(FillRefs(fs, item.SubFiles[i], parent, numRecurseAllowed));
- }
- return S_OK;
-}
-
-HRESULT CInArchive::Open2()
-{
- Clear();
-
- UInt64 fileSize;
- RINOK(_stream->Seek(0, STREAM_SEEK_END, &fileSize));
-
- // Some UDFs contain additional 2 KB of zeros, so we also check 12, corrected to 11.
- const int kSecLogSizeMax = 12;
- Byte buf[1 << kSecLogSizeMax];
- Byte kSizesLog[] = { 11, 8, 12 };
-
- for (int i = 0;; i++)
- {
- if (i == sizeof(kSizesLog) / sizeof(kSizesLog[0]))
- return S_FALSE;
- SecLogSize = kSizesLog[i];
- Int32 bufSize = 1 << SecLogSize;
- if (bufSize > fileSize)
- return S_FALSE;
- RINOK(_stream->Seek(-bufSize, STREAM_SEEK_END, NULL));
- RINOK(ReadStream_FALSE(_stream, buf, bufSize));
- CTag tag;
- if (tag.Parse(buf, bufSize) == S_OK)
- if (tag.Id == DESC_TYPE_AnchorVolPtr)
- break;
- }
- if (SecLogSize == 12)
- SecLogSize = 11;
-
- CExtent extentVDS;
- extentVDS.Parse(buf + 16);
-
- for (UInt32 location = extentVDS.Pos; ; location++)
- {
- size_t bufSize = 1 << SecLogSize;
- size_t pos = 0;
- RINOK(_stream->Seek((UInt64)location << SecLogSize, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(_stream, buf, bufSize));
- CTag tag;
- RINOK(tag.Parse(buf + pos, bufSize - pos));
- if (tag.Id == DESC_TYPE_Terminating)
- break;
- if (tag.Id == DESC_TYPE_Partition)
- {
- if (Partitions.Size() >= kNumPartitionsMax)
- return S_FALSE;
- CPartition partition;
- // UInt32 volDescSeqNumer = Get32(buf + 16);
- // partition.Flags = Get16(buf + 20);
- partition.Number = Get16(buf + 22);
- // partition.ContentsId.Parse(buf + 24);
-
- // memcpy(partition.ContentsUse, buf + 56, sizeof(partition.ContentsUse));
- // ContentsUse is Partition Header Description.
-
- // partition.AccessType = Get32(buf + 184);
- partition.Pos = Get32(buf + 188);
- partition.Len = Get32(buf + 192);
- // partition.ImplId.Parse(buf + 196);
- // memcpy(partition.ImplUse, buf + 228, sizeof(partition.ImplUse));
-
- Partitions.Add(partition);
- }
- else if (tag.Id == DESC_TYPE_LogicalVol)
- {
- if (LogVols.Size() >= kNumLogVolumesMax)
- return S_FALSE;
- CLogVol vol;
- vol.Id.Parse(buf + 84);
- vol.BlockSize = Get32(buf + 212);
- // vol.DomainId.Parse(buf + 216);
-
- if (vol.BlockSize < 512 || vol.BlockSize > ((UInt32)1 << 30))
- return S_FALSE;
-
- // memcpy(vol.ContentsUse, buf + 248, sizeof(vol.ContentsUse));
- vol.FileSetLocation.Parse(buf + 248);
-
- // UInt32 mapTableLength = Get32(buf + 264);
- UInt32 numPartitionMaps = Get32(buf + 268);
- if (numPartitionMaps > kNumPartitionsMax)
- return S_FALSE;
- // vol.ImplId.Parse(buf + 272);
- // memcpy(vol.ImplUse, buf + 128, sizeof(vol.ImplUse));
- size_t pos = 440;
- for (UInt32 i = 0; i < numPartitionMaps; i++)
- {
- if (pos + 2 > bufSize)
- return S_FALSE;
- CPartitionMap pm;
- pm.Type = buf[pos];
- // pm.Length = buf[pos + 1];
- Byte len = buf[pos + 1];
-
- if (pos + len > bufSize)
- return S_FALSE;
-
- // memcpy(pm.Data, buf + pos + 2, pm.Length - 2);
- if (pm.Type == 1)
- {
- if (pos + 6 > bufSize)
- return S_FALSE;
- // pm.VolSeqNumber = Get16(buf + pos + 2);
- pm.PartitionNumber = Get16(buf + pos + 4);
- }
- else
- return S_FALSE;
- pos += len;
- vol.PartitionMaps.Add(pm);
- }
- LogVols.Add(vol);
- }
- }
-
- UInt64 totalSize = 0;
-
- int volIndex;
- for (volIndex = 0; volIndex < LogVols.Size(); volIndex++)
- {
- CLogVol &vol = LogVols[volIndex];
- for (int pmIndex = 0; pmIndex < vol.PartitionMaps.Size(); pmIndex++)
- {
- CPartitionMap &pm = vol.PartitionMaps[pmIndex];
- int i;
- for (i = 0; i < Partitions.Size(); i++)
- {
- CPartition &part = Partitions[i];
- if (part.Number == pm.PartitionNumber)
- {
- if (part.VolIndex >= 0)
- return S_FALSE;
- pm.PartitionIndex = i;
- part.VolIndex = volIndex;
-
- totalSize += (UInt64)part.Len << SecLogSize;
- break;
- }
- }
- if (i == Partitions.Size())
- return S_FALSE;
- }
- }
-
- RINOK(_progress->SetTotal(totalSize));
-
- for (volIndex = 0; volIndex < LogVols.Size(); volIndex++)
- {
- CLogVol &vol = LogVols[volIndex];
-
- CLongAllocDesc nextExtent = vol.FileSetLocation;
- // while (nextExtent.ExtentLen != 0)
- // for (int i = 0; i < 1; i++)
- {
- if (nextExtent.GetLen() < 512)
- return S_FALSE;
- CByteBuffer buf;
- buf.SetCapacity(nextExtent.GetLen());
- RINOK(Read(volIndex, nextExtent, buf));
- const Byte *p = buf;
- size_t size = nextExtent.GetLen();
-
- CTag tag;
- RINOK(tag.Parse(p, size));
- if (tag.Id != DESC_TYPE_FileSet)
- return S_FALSE;
-
- CFileSet fs;
- fs.RecodringTime.Parse(p + 16);
- // fs.InterchangeLevel = Get16(p + 18);
- // fs.MaxInterchangeLevel = Get16(p + 20);
- // fs.FileSetNumber = Get32(p + 40);
- // fs.FileSetDescNumber = Get32(p + 44);
-
- // fs.Id.Parse(p + 304);
- // fs.CopyrightId.Parse(p + 336);
- // fs.AbstractId.Parse(p + 368);
-
- fs.RootDirICB.Parse(p + 400);
- // fs.DomainId.Parse(p + 416);
-
- // fs.SystemStreamDirICB.Parse(p + 464);
-
- vol.FileSets.Add(fs);
-
- // nextExtent.Parse(p + 448);
- }
-
- for (int fsIndex = 0; fsIndex < vol.FileSets.Size(); fsIndex++)
- {
- CFileSet &fs = vol.FileSets[fsIndex];
- int fileIndex = Files.Size();
- Files.Add(CFile());
- RINOK(ReadFileItem(volIndex, fsIndex, fs.RootDirICB, kNumRecureseLevelsMax));
- RINOK(FillRefs(fs, fileIndex, -1, kNumRecureseLevelsMax));
- }
- }
-
- return S_OK;
-}
-
-HRESULT CInArchive::Open(IInStream *inStream, CProgressVirt *progress)
-{
- _progress = progress;
- _stream = inStream;
- HRESULT res;
- try { res = Open2(); }
- catch(...) { Clear(); res = S_FALSE; }
- _stream.Release();
- return res;
-}
-
-void CInArchive::Clear()
-{
- Partitions.Clear();
- LogVols.Clear();
- Items.Clear();
- Files.Clear();
- _fileNameLengthTotal = 0;
- _numRefs = 0;
- _numExtents = 0;
- _inlineExtentsSize = 0;
- _processedProgressBytes = 0;
-}
-
-UString CInArchive::GetComment() const
-{
- UString res;
- for (int i = 0; i < LogVols.Size(); i++)
- {
- if (i > 0)
- res += L" ";
- res += LogVols[i].GetName();
- }
- return res;
-}
-
-static UString GetSpecName(const UString &name)
-{
- UString name2 = name;
- name2.Trim();
- if (name2.IsEmpty())
- {
- /*
- wchar_t s[32];
- ConvertUInt64ToString(id, s);
- return L"[" + (UString)s + L"]";
- */
- return L"[]";
- }
- return name;
-}
-
-static void UpdateWithName(UString &res, const UString &addString)
-{
- if (res.IsEmpty())
- res = addString;
- else
- res = addString + WCHAR_PATH_SEPARATOR + res;
-}
-
-UString CInArchive::GetItemPath(int volIndex, int fsIndex, int refIndex,
- bool showVolName, bool showFsName) const
-{
- // showVolName = true;
- const CLogVol &vol = LogVols[volIndex];
- const CFileSet &fs = vol.FileSets[fsIndex];
-
- UString name;
-
- for (;;)
- {
- const CRef &ref = fs.Refs[refIndex];
- refIndex = ref.Parent;
- if (refIndex < 0)
- break;
- UpdateWithName(name, GetSpecName(Files[ref.FileIndex].GetName()));
- }
-
- if (showFsName)
- {
- wchar_t s[32];
- ConvertUInt64ToString(fsIndex, s);
- UString newName = L"File Set ";
- newName += s;
- UpdateWithName(name, newName);
- }
-
- if (showVolName)
- {
- wchar_t s[32];
- ConvertUInt64ToString(volIndex, s);
- UString newName = s;
- UString newName2 = vol.GetName();
- if (newName2.IsEmpty())
- newName2 = L"Volume";
- newName += L'-';
- newName += newName2;
- UpdateWithName(name, newName);
- }
- return name;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfIn.h
deleted file mode 100644
index 46b9a7e85..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfIn.h
+++ /dev/null
@@ -1,375 +0,0 @@
-// Archive/UdfIn.h -- UDF / ECMA-167
-
-#ifndef __ARCHIVE_UDF_IN_H
-#define __ARCHIVE_UDF_IN_H
-
-#include "Common/MyCom.h"
-#include "Common/IntToString.h"
-#include "Common/Buffer.h"
-#include "Common/MyString.h"
-#include "Common/MyMap.h"
-
-#include "../../IStream.h"
-
-namespace NArchive {
-namespace NUdf {
-
-// ---------- ECMA Part 1 ----------
-
-// ECMA 1/7.2.12
-
-/*
-struct CDString32
-{
- Byte Data[32];
- void Parse(const Byte *buf);
- // UString GetString() const;
-};
-*/
-
-struct CDString128
-{
- Byte Data[128];
- void Parse(const Byte *buf);
- UString GetString() const;
-};
-
-struct CDString
-{
- CByteBuffer Data;
- void Parse(const Byte *p, unsigned size);
- UString GetString() const;
-};
-
-
-// ECMA 1/7.3
-
-struct CTime
-{
- Byte Data[12];
-
- unsigned GetType() const { return Data[1] >> 4; }
- bool IsLocal() const { return GetType() == 1; }
- int GetMinutesOffset() const
- {
- int t = (Data[0] | ((UInt16)Data[1] << 8)) & 0xFFF;
- if ((t >> 11) != 0)
- t -= (1 << 12);
- return (t > (60 * 24) || t < -(60 * 24)) ? 0 : t;
- }
- unsigned GetYear() const { return (Data[2] | ((UInt16)Data[3] << 8)); }
- void Parse(const Byte *buf);
-};
-
-
-// ECMA 1/7.4
-
-/*
-struct CRegId
-{
- Byte Flags;
- char Id[23];
- char Suffix[8];
-
- void Parse(const Byte *buf);
-};
-*/
-
-// ---------- ECMA Part 3: Volume Structure ----------
-
-// ECMA 3/10.5
-
-struct CPartition
-{
- // UInt16 Flags;
- UInt16 Number;
- // CRegId ContentsId;
- // Byte ContentsUse[128];
- // UInt32 AccessType;
-
- UInt32 Pos;
- UInt32 Len;
-
- // CRegId ImplId;
- // Byte ImplUse[128];
-
- int VolIndex;
- CMap32 Map;
-
- CPartition(): VolIndex(-1) {}
-
- // bool IsNsr() const { return (strncmp(ContentsId.Id, "+NSR0", 5) == 0); }
- // bool IsAllocated() const { return ((Flags & 1) != 0); }
-};
-
-struct CLogBlockAddr
-{
- UInt32 Pos;
- UInt16 PartitionRef;
-
- void Parse(const Byte *buf);
-};
-
-enum EShortAllocDescType
-{
- SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated = 0,
- SHORT_ALLOC_DESC_TYPE_NotRecordedButAllocated = 1,
- SHORT_ALLOC_DESC_TYPE_NotRecordedAndNotAllocated = 2,
- SHORT_ALLOC_DESC_TYPE_NextExtent = 3
-};
-
-struct CShortAllocDesc
-{
- UInt32 Len;
- UInt32 Pos;
-
- // 4/14.14.1
- // UInt32 GetLen() const { return Len & 0x3FFFFFFF; }
- // UInt32 GetType() const { return Len >> 30; }
- // bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }
- void Parse(const Byte *buf);
-};
-
-/*
-struct CADImpUse
-{
- UInt16 Flags;
- UInt32 UdfUniqueId;
- void Parse(const Byte *buf);
-};
-*/
-
-struct CLongAllocDesc
-{
- UInt32 Len;
- CLogBlockAddr Location;
-
- // Byte ImplUse[6];
- // CADImpUse adImpUse; // UDF
-
- UInt32 GetLen() const { return Len & 0x3FFFFFFF; }
- UInt32 GetType() const { return Len >> 30; }
- bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }
- void Parse(const Byte *buf);
-};
-
-struct CPartitionMap
-{
- Byte Type;
- // Byte Len;
-
- // Type - 1
- // UInt16 VolSeqNumber;
- UInt16 PartitionNumber;
-
- // Byte Data[256];
-
- int PartitionIndex;
-};
-
-// ECMA 4/14.6
-
-enum EIcbFileType
-{
- ICB_FILE_TYPE_DIR = 4,
- ICB_FILE_TYPE_FILE = 5
-};
-
-enum EIcbDescriptorType
-{
- ICB_DESC_TYPE_SHORT = 0,
- ICB_DESC_TYPE_LONG = 1,
- ICB_DESC_TYPE_EXTENDED = 2,
- ICB_DESC_TYPE_INLINE = 3
-};
-
-struct CIcbTag
-{
- // UInt32 PriorDirectNum;
- // UInt16 StrategyType;
- // UInt16 StrategyParam;
- // UInt16 MaxNumOfEntries;
- Byte FileType;
- // CLogBlockAddr ParentIcb;
- UInt16 Flags;
-
- bool IsDir() const { return FileType == ICB_FILE_TYPE_DIR; }
- int GetDescriptorType() const { return Flags & 3; }
- void Parse(const Byte *p);
-};
-
-// const Byte FILEID_CHARACS_Existance = (1 << 0);
-const Byte FILEID_CHARACS_Parent = (1 << 3);
-
-struct CFile
-{
- // UInt16 FileVersion;
- // Byte FileCharacteristics;
- // CByteBuffer ImplUse;
- CDString Id;
-
- CFile(): /* FileVersion(0), FileCharacteristics(0), */ ItemIndex(-1) {}
- int ItemIndex;
- UString GetName() const { return Id.GetString(); }
-};
-
-struct CMyExtent
-{
- UInt32 Pos;
- UInt32 Len;
- int PartitionRef;
-
- UInt32 GetLen() const { return Len & 0x3FFFFFFF; }
- UInt32 GetType() const { return Len >> 30; }
- bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }
-};
-
-struct CItem
-{
- CIcbTag IcbTag;
-
- // UInt32 Uid;
- // UInt32 Gid;
- // UInt32 Permissions;
- // UInt16 FileLinkCount;
- // Byte RecordFormat;
- // Byte RecordDisplayAttr;
- // UInt32 RecordLen;
- UInt64 Size;
- UInt64 NumLogBlockRecorded;
- CTime ATime;
- CTime MTime;
- // CTime AttrtTime;
- // UInt32 CheckPoint;
- // CLongAllocDesc ExtendedAttrIcb;
- // CRegId ImplId;
- // UInt64 UniqueId;
-
- bool IsInline;
- CByteBuffer InlineData;
- CRecordVector<CMyExtent> Extents;
- CRecordVector<int> SubFiles;
-
- void Parse(const Byte *buf);
-
- bool IsRecAndAlloc() const
- {
- for (int i = 0; i < Extents.Size(); i++)
- if (!Extents[i].IsRecAndAlloc())
- return false;
- return true;
- }
-
- UInt64 GetChunksSumSize() const
- {
- if (IsInline)
- return InlineData.GetCapacity();
- UInt64 size = 0;
- for (int i = 0; i < Extents.Size(); i++)
- size += Extents[i].GetLen();
- return size;
- }
-
- bool CheckChunkSizes() const { return GetChunksSumSize() == Size; }
-
- bool IsDir() const { return IcbTag.IsDir(); }
-};
-
-struct CRef
-{
- int Parent;
- int FileIndex;
-};
-
-
-// ECMA 4 / 14.1
-struct CFileSet
-{
- CTime RecodringTime;
- // UInt16 InterchangeLevel;
- // UInt16 MaxInterchangeLevel;
- // UInt32 FileSetNumber;
- // UInt32 FileSetDescNumber;
- // CDString32 Id;
- // CDString32 CopyrightId;
- // CDString32 AbstractId;
-
- CLongAllocDesc RootDirICB;
- // CRegId DomainId;
- // CLongAllocDesc SystemStreamDirICB;
-
- CRecordVector<CRef> Refs;
-};
-
-
-// ECMA 3/10.6
-
-struct CLogVol
-{
- CDString128 Id;
- UInt32 BlockSize;
- // CRegId DomainId;
-
- // Byte ContentsUse[16];
- CLongAllocDesc FileSetLocation; // UDF
-
- // CRegId ImplId;
- // Byte ImplUse[128];
-
- CObjectVector<CPartitionMap> PartitionMaps;
- CObjectVector<CFileSet> FileSets;
-
- UString GetName() const { return Id.GetString(); }
-};
-
-struct CProgressVirt
-{
- virtual HRESULT SetTotal(UInt64 numBytes) PURE;
- virtual HRESULT SetCompleted(UInt64 numFiles, UInt64 numBytes) PURE;
- virtual HRESULT SetCompleted() PURE;
-};
-
-class CInArchive
-{
- CMyComPtr<IInStream> _stream;
- CProgressVirt *_progress;
-
- HRESULT Read(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len, Byte *buf);
- HRESULT Read(int volIndex, const CLongAllocDesc &lad, Byte *buf);
- HRESULT ReadFromFile(int volIndex, const CItem &item, CByteBuffer &buf);
-
- HRESULT ReadFileItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed);
- HRESULT ReadItem(int volIndex, int fsIndex, const CLongAllocDesc &lad, int numRecurseAllowed);
-
- HRESULT Open2();
- HRESULT FillRefs(CFileSet &fs, int fileIndex, int parent, int numRecurseAllowed);
-
- UInt64 _processedProgressBytes;
-
- UInt64 _fileNameLengthTotal;
- int _numRefs;
- UInt32 _numExtents;
- UInt64 _inlineExtentsSize;
- bool CheckExtent(int volIndex, int partitionRef, UInt32 blockPos, UInt32 len) const;
-public:
- HRESULT Open(IInStream *inStream, CProgressVirt *progress);
- void Clear();
-
- CObjectVector<CPartition> Partitions;
- CObjectVector<CLogVol> LogVols;
-
- CObjectVector<CItem> Items;
- CObjectVector<CFile> Files;
-
- int SecLogSize;
-
- UString GetComment() const;
- UString GetItemPath(int volIndex, int fsIndex, int refIndex,
- bool showVolName, bool showFsName) const;
-
- bool CheckItemExtents(int volIndex, const CItem &item) const;
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfRegister.cpp
deleted file mode 100644
index 1b08d120b..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Udf/UdfRegister.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// UdfRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "UdfHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NUdf::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Udf", L"iso img", 0, 0xE0, { 0, 'N', 'S', 'R', '0' }, 5, false, CreateArc, 0 };
-
-REGISTER_ARC(Udf)
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/VhdHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/VhdHandler.cpp
deleted file mode 100644
index 9d1c928e6..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/VhdHandler.cpp
+++ /dev/null
@@ -1,734 +0,0 @@
-// VhdHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/Buffer.h"
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/MyString.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#define Get16(p) GetBe16(p)
-#define Get32(p) GetBe32(p)
-#define Get64(p) GetBe64(p)
-
-#define G32(p, dest) dest = Get32(p);
-#define G64(p, dest) dest = Get64(p);
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NVhd {
-
-static const UInt32 kUnusedBlock = 0xFFFFFFFF;
-
-static const UInt32 kDiskType_Fixed = 2;
-static const UInt32 kDiskType_Dynamic = 3;
-static const UInt32 kDiskType_Diff = 4;
-
-static const char *kDiskTypes[] =
-{
- "0",
- "1",
- "Fixed",
- "Dynamic",
- "Differencing"
-};
-
-struct CFooter
-{
- // UInt32 Features;
- // UInt32 FormatVersion;
- UInt64 DataOffset;
- UInt32 CTime;
- UInt32 CreatorApp;
- UInt32 CreatorVersion;
- UInt32 CreatorHostOS;
- // UInt64 OriginalSize;
- UInt64 CurrentSize;
- UInt32 DiskGeometry;
- UInt32 Type;
- Byte Id[16];
- Byte SavedState;
-
- bool IsFixed() const { return Type == kDiskType_Fixed; }
- bool ThereIsDynamic() const { return Type == kDiskType_Dynamic || Type == kDiskType_Diff; }
- // bool IsSupported() const { return Type == kDiskType_Fixed || Type == kDiskType_Dynamic || Type == kDiskType_Diff; }
- UInt32 NumCyls() const { return DiskGeometry >> 16; }
- UInt32 NumHeads() const { return (DiskGeometry >> 8) & 0xFF; }
- UInt32 NumSectorsPerTrack() const { return DiskGeometry & 0xFF; }
- AString GetTypeString() const;
- bool Parse(const Byte *p);
-};
-
-AString CFooter::GetTypeString() const
-{
- if (Type < sizeof(kDiskTypes) / sizeof(kDiskTypes[0]))
- return kDiskTypes[Type];
- char s[16];
- ConvertUInt32ToString(Type, s);
- return s;
-}
-
-static bool CheckBlock(const Byte *p, unsigned size, unsigned checkSumOffset, unsigned zeroOffset)
-{
- UInt32 sum = 0;
- unsigned i;
- for (i = 0; i < checkSumOffset; i++)
- sum += p[i];
- for (i = checkSumOffset + 4; i < size; i++)
- sum += p[i];
- if (~sum != Get32(p + checkSumOffset))
- return false;
- for (i = zeroOffset; i < size; i++)
- if (p[i] != 0)
- return false;
- return true;
-}
-
-bool CFooter::Parse(const Byte *p)
-{
- if (memcmp(p, "conectix", 8) != 0)
- return false;
- // G32(p + 0x08, Features);
- // G32(p + 0x0C, FormatVersion);
- G64(p + 0x10, DataOffset);
- G32(p + 0x18, CTime);
- G32(p + 0x1C, CreatorApp);
- G32(p + 0x20, CreatorVersion);
- G32(p + 0x24, CreatorHostOS);
- // G64(p + 0x28, OriginalSize);
- G64(p + 0x30, CurrentSize);
- G32(p + 0x38, DiskGeometry);
- G32(p + 0x3C, Type);
- memcpy(Id, p + 0x44, 16);
- SavedState = p[0x54];
- return CheckBlock(p, 512, 0x40, 0x55);
-}
-
-/*
-struct CParentLocatorEntry
-{
- UInt32 Code;
- UInt32 DataSpace;
- UInt32 DataLen;
- UInt64 DataOffset;
-
- bool Parse(const Byte *p);
-};
-bool CParentLocatorEntry::Parse(const Byte *p)
-{
- G32(p + 0x00, Code);
- G32(p + 0x04, DataSpace);
- G32(p + 0x08, DataLen);
- G32(p + 0x10, DataOffset);
- return (Get32(p + 0x0C) == 0); // Resrved
-}
-*/
-
-struct CDynHeader
-{
- // UInt64 DataOffset;
- UInt64 TableOffset;
- // UInt32 HeaderVersion;
- UInt32 NumBlocks;
- int BlockSizeLog;
- UInt32 ParentTime;
- Byte ParentId[16];
- UString ParentName;
- // CParentLocatorEntry ParentLocators[8];
-
- bool Parse(const Byte *p);
- UInt32 NumBitMapSectors() const
- {
- UInt32 numSectorsInBlock = (1 << (BlockSizeLog - 9));
- return (numSectorsInBlock + 512 * 8 - 1) / (512 * 8);
- }
-};
-
-static int GetLog(UInt32 num)
-{
- for (int i = 0; i < 31; i++)
- if (((UInt32)1 << i) == num)
- return i;
- return -1;
-}
-
-bool CDynHeader::Parse(const Byte *p)
-{
- if (memcmp(p, "cxsparse", 8) != 0)
- return false;
- // G64(p + 0x08, DataOffset);
- G64(p + 0x10, TableOffset);
- // G32(p + 0x18, HeaderVersion);
- G32(p + 0x1C, NumBlocks);
- BlockSizeLog = GetLog(Get32(p + 0x20));
- if (BlockSizeLog < 9 || BlockSizeLog > 30)
- return false;
- G32(p + 0x38, ParentTime);
- if (Get32(p + 0x3C) != 0) // reserved
- return false;
- memcpy(ParentId, p + 0x28, 16);
- {
- const int kNameLength = 256;
- wchar_t *s = ParentName.GetBuffer(kNameLength);
- for (unsigned i = 0; i < kNameLength; i++)
- s[i] = Get16(p + 0x40 + i * 2);
- s[kNameLength] = 0;
- ParentName.ReleaseBuffer();
- }
- /*
- for (int i = 0; i < 8; i++)
- if (!ParentLocators[i].Parse(p + 0x240 + i * 24))
- return false;
- */
- return CheckBlock(p, 1024, 0x24, 0x240 + 8 * 24);
-}
-
-class CHandler:
- public IInStream,
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- UInt64 _virtPos;
- UInt64 _phyPos;
- UInt64 _phyLimit;
-
- CFooter Footer;
- CDynHeader Dyn;
- CRecordVector<UInt32> Bat;
- CByteBuffer BitMap;
- UInt32 BitMapTag;
- UInt32 NumUsedBlocks;
- CMyComPtr<IInStream> Stream;
- CMyComPtr<IInStream> ParentStream;
- CHandler *Parent;
-
- HRESULT Seek(UInt64 offset);
- HRESULT InitAndSeek();
- HRESULT ReadPhy(UInt64 offset, void *data, UInt32 size);
-
- bool NeedParent() const { return Footer.Type == kDiskType_Diff; }
- UInt64 GetPackSize() const
- { return Footer.ThereIsDynamic() ? ((UInt64)NumUsedBlocks << Dyn.BlockSizeLog) : Footer.CurrentSize; }
-
- UString GetParentName() const
- {
- const CHandler *p = this;
- UString res;
- while (p && p->NeedParent())
- {
- if (!res.IsEmpty())
- res += L" -> ";
- res += p->Dyn.ParentName;
- p = p->Parent;
- }
- return res;
- }
-
- bool IsOK() const
- {
- const CHandler *p = this;
- while (p->NeedParent())
- {
- p = p->Parent;
- if (p == 0)
- return false;
- }
- return true;
- }
-
- HRESULT Open3();
- HRESULT Open2(IInStream *stream, CHandler *child, IArchiveOpenCallback *openArchiveCallback, int level);
-
-public:
- MY_UNKNOWN_IMP3(IInArchive, IInArchiveGetStream, IInStream)
-
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-
-HRESULT CHandler::Seek(UInt64 offset) { return Stream->Seek(offset, STREAM_SEEK_SET, NULL); }
-
-HRESULT CHandler::InitAndSeek()
-{
- if (ParentStream)
- {
- RINOK(Parent->InitAndSeek());
- }
- _virtPos = _phyPos = 0;
- BitMapTag = kUnusedBlock;
- BitMap.SetCapacity(Dyn.NumBitMapSectors() << 9);
- return Seek(0);
-}
-
-HRESULT CHandler::ReadPhy(UInt64 offset, void *data, UInt32 size)
-{
- if (offset + size > _phyLimit)
- return S_FALSE;
- if (offset != _phyPos)
- {
- _phyPos = offset;
- RINOK(Seek(offset));
- }
- HRESULT res = ReadStream_FALSE(Stream, data, size);
- _phyPos += size;
- return res;
-}
-
-HRESULT CHandler::Open3()
-{
- RINOK(Stream->Seek(0, STREAM_SEEK_END, &_phyPos));
- if (_phyPos < 512)
- return S_FALSE;
- const UInt32 kDynSize = 1024;
- Byte buf[kDynSize];
-
- _phyLimit = _phyPos;
- RINOK(ReadPhy(_phyLimit - 512, buf, 512));
- if (!Footer.Parse(buf))
- return S_FALSE;
- _phyLimit -= 512;
-
- if (!Footer.ThereIsDynamic())
- return S_OK;
-
- RINOK(ReadPhy(0, buf + 512, 512));
- if (memcmp(buf, buf + 512, 512) != 0)
- return S_FALSE;
-
- RINOK(ReadPhy(Footer.DataOffset, buf, kDynSize));
- if (!Dyn.Parse(buf))
- return S_FALSE;
-
- if (Dyn.NumBlocks >= (UInt32)1 << 31)
- return S_FALSE;
- if (Footer.CurrentSize == 0)
- {
- if (Dyn.NumBlocks != 0)
- return S_FALSE;
- }
- else if (((Footer.CurrentSize - 1) >> Dyn.BlockSizeLog) + 1 != Dyn.NumBlocks)
- return S_FALSE;
-
- Bat.Reserve(Dyn.NumBlocks);
- while ((UInt32)Bat.Size() < Dyn.NumBlocks)
- {
- RINOK(ReadPhy(Dyn.TableOffset + (UInt64)Bat.Size() * 4, buf, 512));
- for (UInt32 j = 0; j < 512; j += 4)
- {
- UInt32 v = Get32(buf + j);
- if (v != kUnusedBlock)
- NumUsedBlocks++;
- Bat.Add(v);
- if ((UInt32)Bat.Size() >= Dyn.NumBlocks)
- break;
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- if (_virtPos >= Footer.CurrentSize)
- return (Footer.CurrentSize == _virtPos) ? S_OK: E_FAIL;
- UInt64 rem = Footer.CurrentSize - _virtPos;
- if (size > rem)
- size = (UInt32)rem;
- if (size == 0)
- return S_OK;
- UInt32 blockIndex = (UInt32)(_virtPos >> Dyn.BlockSizeLog);
- UInt32 blockSectIndex = Bat[blockIndex];
- UInt32 blockSize = (UInt32)1 << Dyn.BlockSizeLog;
- UInt32 offsetInBlock = (UInt32)_virtPos & (blockSize - 1);
- size = MyMin(blockSize - offsetInBlock, size);
-
- HRESULT res = S_OK;
- if (blockSectIndex == kUnusedBlock)
- {
- if (ParentStream)
- {
- RINOK(ParentStream->Seek(_virtPos, STREAM_SEEK_SET, NULL));
- res = ParentStream->Read(data, size, &size);
- }
- else
- memset(data, 0, size);
- }
- else
- {
- UInt64 newPos = (UInt64)blockSectIndex << 9;
- if (BitMapTag != blockIndex)
- {
- RINOK(ReadPhy(newPos, BitMap, (UInt32)BitMap.GetCapacity()));
- BitMapTag = blockIndex;
- }
- RINOK(ReadPhy(newPos + BitMap.GetCapacity() + offsetInBlock, data, size));
- for (UInt32 cur = 0; cur < size;)
- {
- UInt32 rem = MyMin(0x200 - (offsetInBlock & 0x1FF), size - cur);
- UInt32 bmi = offsetInBlock >> 9;
- if (((BitMap[bmi >> 3] >> (7 - (bmi & 7))) & 1) == 0)
- {
- if (ParentStream)
- {
- RINOK(ParentStream->Seek(_virtPos + cur, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(ParentStream, (Byte *)data + cur, rem));
- }
- else
- {
- const Byte *p = (const Byte *)data + cur;
- for (UInt32 i = 0; i < rem; i++)
- if (p[i] != 0)
- return S_FALSE;
- }
- }
- offsetInBlock += rem;
- cur += rem;
- }
- }
- if (processedSize != NULL)
- *processedSize = size;
- _virtPos += size;
- return res;
-}
-
-STDMETHODIMP CHandler::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch(seekOrigin)
- {
- case STREAM_SEEK_SET: _virtPos = offset; break;
- case STREAM_SEEK_CUR: _virtPos += offset; break;
- case STREAM_SEEK_END: _virtPos = Footer.CurrentSize + offset; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
-}
-
-enum
-{
- kpidParent = kpidUserDefined,
- kpidSavedState
-};
-
-STATPROPSTG kArcProps[] =
-{
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidClusterSize, VT_UI8},
- { NULL, kpidMethod, VT_BSTR},
- { L"Parent", kpidParent, VT_BSTR},
- { NULL, kpidCreatorApp, VT_BSTR},
- { NULL, kpidHostOS, VT_BSTR},
- { L"Saved State", kpidSavedState, VT_BOOL},
- { NULL, kpidId, VT_BSTR}
- };
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME}
-
- /*
- { NULL, kpidNumCyls, VT_UI4},
- { NULL, kpidNumHeads, VT_UI4},
- { NULL, kpidSectorsPerTrack, VT_UI4}
- */
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_WITH_NAME
-
-// VHD start time: 2000-01-01
-static const UInt64 kVhdTimeStartValue = (UInt64)3600 * 24 * (399 * 365 + 24 * 4);
-
-static void VhdTimeToFileTime(UInt32 vhdTime, NCOM::CPropVariant &prop)
-{
- FILETIME ft, utc;
- UInt64 v = (kVhdTimeStartValue + vhdTime) * 10000000;
- ft.dwLowDateTime = (DWORD)v;
- ft.dwHighDateTime = (DWORD)(v >> 32);
- // specification says that it's UTC time, but Virtual PC 6 writes local time. Why?
- LocalFileTimeToFileTime(&ft, &utc);
- prop = utc;
-}
-
-static void StringToAString(char *dest, UInt32 s)
-{
- for (int i = 24; i >= 0; i -= 8)
- {
- Byte b = (Byte)((s >> i) & 0xFF);
- if (b < 0x20 || b > 0x7F)
- break;
- *dest++ = b;
- }
- *dest = 0;
-}
-
-static void ConvertByteToHex(unsigned value, char *s)
-{
- for (int i = 0; i < 2; i++)
- {
- unsigned t = value & 0xF;
- value >>= 4;
- s[1 - i] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10)));
- }
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidMainSubfile: prop = (UInt32)0; break;
- case kpidCTime: VhdTimeToFileTime(Footer.CTime, prop); break;
- case kpidClusterSize: if (Footer.ThereIsDynamic()) prop = (UInt32)1 << Dyn.BlockSizeLog; break;
- case kpidMethod:
- {
- AString s = Footer.GetTypeString();
- if (NeedParent())
- {
- s += " -> ";
- const CHandler *p = this;
- while (p != 0 && p->NeedParent())
- p = p->Parent;
- if (p == 0)
- s += '?';
- else
- s += p->Footer.GetTypeString();
- }
- prop = s;
- break;
- }
- case kpidCreatorApp:
- {
- char s[16];
- StringToAString(s, Footer.CreatorApp);
- AString res = s;
- res.Trim();
- ConvertUInt32ToString(Footer.CreatorVersion >> 16, s);
- res += ' ';
- res += s;
- res += '.';
- ConvertUInt32ToString(Footer.CreatorVersion & 0xFFFF, s);
- res += s;
- prop = res;
- break;
- }
- case kpidHostOS:
- {
- if (Footer.CreatorHostOS == 0x5769326b)
- prop = "Windows";
- else
- {
- char s[16];
- StringToAString(s, Footer.CreatorHostOS);
- prop = s;
- }
- break;
- }
- case kpidId:
- {
- char s[32 + 4];
- for (int i = 0; i < 16; i++)
- ConvertByteToHex(Footer.Id[i], s + i * 2);
- s[32] = 0;
- prop = s;
- break;
- }
- case kpidSavedState: prop = Footer.SavedState ? true : false; break;
- case kpidParent: if (NeedParent()) prop = GetParentName(); break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CHandler::Open2(IInStream *stream, CHandler *child, IArchiveOpenCallback *openArchiveCallback, int level)
-{
- Close();
- Stream = stream;
- if (level > 32)
- return S_FALSE;
- RINOK(Open3());
- if (child && memcmp(child->Dyn.ParentId, Footer.Id, 16) != 0)
- return S_FALSE;
- if (Footer.Type != kDiskType_Diff)
- return S_OK;
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
- if (openArchiveCallback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback) != S_OK)
- return S_FALSE;
- CMyComPtr<IInStream> nextStream;
- HRESULT res = openVolumeCallback->GetStream(Dyn.ParentName, &nextStream);
- if (res == S_FALSE)
- return S_OK;
- RINOK(res);
-
- Parent = new CHandler;
- ParentStream = Parent;
- return Parent->Open2(nextStream, this, openArchiveCallback, level + 1);
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * openArchiveCallback)
-{
- COM_TRY_BEGIN
- {
- HRESULT res;
- try
- {
- res = Open2(stream, NULL, openArchiveCallback, 0);
- if (res == S_OK)
- return S_OK;
- }
- catch(...)
- {
- Close();
- throw;
- }
- Close();
- return res;
- }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- Bat.Clear();
- NumUsedBlocks = 0;
- Parent = 0;
- Stream.Release();
- ParentStream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- switch(propID)
- {
- case kpidSize: prop = Footer.CurrentSize; break;
- case kpidPackSize: prop = GetPackSize(); break;
- case kpidCTime: VhdTimeToFileTime(Footer.CTime, prop); break;
- /*
- case kpidNumCyls: prop = Footer.NumCyls(); break;
- case kpidNumHeads: prop = Footer.NumHeads(); break;
- case kpidSectorsPerTrack: prop = Footer.NumSectorsPerTrack(); break;
- */
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- RINOK(extractCallback->SetTotal(Footer.CurrentSize));
- CMyComPtr<ISequentialOutStream> outStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- RINOK(extractCallback->GetStream(0, &outStream, askMode));
- if (!testMode && !outStream)
- return S_OK;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- int res = NExtract::NOperationResult::kDataError;
- CMyComPtr<ISequentialInStream> inStream;
- HRESULT hres = GetStream(0, &inStream);
- if (hres == S_FALSE)
- res = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- RINOK(hres);
- HRESULT hres = copyCoder->Code(inStream, outStream, NULL, NULL, progress);
- if (hres == S_OK)
- {
- if (copyCoderSpec->TotalSize == Footer.CurrentSize)
- res = NExtract::NOperationResult::kOK;
- }
- else
- {
- if (hres != S_FALSE)
- {
- RINOK(hres);
- }
- }
- }
- outStream.Release();
- return extractCallback->SetOperationResult(res);
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 /* index */, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- *stream = 0;
- if (Footer.IsFixed())
- {
- CLimitedInStream *streamSpec = new CLimitedInStream;
- CMyComPtr<ISequentialInStream> streamTemp = streamSpec;
- streamSpec->SetStream(Stream);
- streamSpec->InitAndSeek(0, Footer.CurrentSize);
- RINOK(streamSpec->SeekToStart());
- *stream = streamTemp.Detach();
- return S_OK;
- }
- if (!Footer.ThereIsDynamic() || !IsOK())
- return S_FALSE;
- CMyComPtr<ISequentialInStream> streamTemp = this;
- RINOK(InitAndSeek());
- *stream = streamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"VHD", L"vhd", L".mbr", 0xDC, { 'c', 'o', 'n', 'e', 'c', 't', 'i', 'x', 0, 0 }, 10, false, CreateArc, 0 };
-
-REGISTER_ARC(Vhd)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Wim/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Wim/StdAfx.h
deleted file mode 100644
index e7fb6986d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Wim/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/MyWindows.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandler.cpp
deleted file mode 100644
index eaad1e7ca..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandler.cpp
+++ /dev/null
@@ -1,660 +0,0 @@
-// WimHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringToInt.h"
-#include "Common/UTFConvert.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamUtils.h"
-
-#include "WimHandler.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NWim {
-
-#define WIM_DETAILS
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidShortName, VT_BSTR}
-
- #ifdef WIM_DETAILS
- , { NULL, kpidVolume, VT_UI4}
- , { NULL, kpidOffset, VT_UI8}
- , { NULL, kpidLinks, VT_UI4}
- #endif
-};
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidUnpackVer, VT_BSTR},
- { NULL, kpidIsVolume, VT_BOOL},
- { NULL, kpidVolume, VT_UI4},
- { NULL, kpidNumVolumes, VT_UI4}
-};
-
-static bool ParseNumber64(const AString &s, UInt64 &res)
-{
- const char *end;
- if (s.Left(2) == "0x")
- {
- if (s.Length() == 2)
- return false;
- res = ConvertHexStringToUInt64((const char *)s + 2, &end);
- }
- else
- {
- if (s.IsEmpty())
- return false;
- res = ConvertStringToUInt64(s, &end);
- }
- return *end == 0;
-}
-
-static bool ParseNumber32(const AString &s, UInt32 &res)
-{
- UInt64 res64;
- if (!ParseNumber64(s, res64) || res64 >= ((UInt64)1 << 32))
- return false;
- res = (UInt32)res64;
- return true;
-}
-
-bool ParseTime(const CXmlItem &item, FILETIME &ft, const char *tag)
-{
- int index = item.FindSubTag(tag);
- if (index >= 0)
- {
- const CXmlItem &timeItem = item.SubItems[index];
- UInt32 low = 0, high = 0;
- if (ParseNumber32(timeItem.GetSubStringForTag("LOWPART"), low) &&
- ParseNumber32(timeItem.GetSubStringForTag("HIGHPART"), high))
- {
- ft.dwLowDateTime = low;
- ft.dwHighDateTime = high;
- return true;
- }
- }
- return false;
-}
-
-void CImageInfo::Parse(const CXmlItem &item)
-{
- CTimeDefined = ParseTime(item, CTime, "CREATIONTIME");
- MTimeDefined = ParseTime(item, MTime, "LASTMODIFICATIONTIME");
- NameDefined = ConvertUTF8ToUnicode(item.GetSubStringForTag("NAME"), Name);
- // IndexDefined = ParseNumber32(item.GetPropertyValue("INDEX"), Index);
-}
-
-void CXml::ToUnicode(UString &s)
-{
- size_t size = Data.GetCapacity();
- if (size < 2 || (size & 1) != 0 || size > (1 << 24))
- return;
- const Byte *p = Data;
- if (Get16(p) != 0xFEFF)
- return;
- wchar_t *chars = s.GetBuffer((int)size / 2);
- for (size_t i = 2; i < size; i += 2)
- *chars++ = (wchar_t)Get16(p + i);
- *chars = 0;
- s.ReleaseBuffer();
-}
-
-void CXml::Parse()
-{
- UString s;
- ToUnicode(s);
- AString utf;
- if (!ConvertUnicodeToUTF8(s, utf))
- return;
- ::CXml xml;
- if (!xml.Parse(utf))
- return;
- if (xml.Root.Name != "WIM")
- return;
-
- for (int i = 0; i < xml.Root.SubItems.Size(); i++)
- {
- const CXmlItem &item = xml.Root.SubItems[i];
- if (item.IsTagged("IMAGE"))
- {
- CImageInfo imageInfo;
- imageInfo.Parse(item);
- Images.Add(imageInfo);
- }
- }
-}
-
-static const char *kMethodLZX = "LZX";
-static const char *kMethodXpress = "XPress";
-static const char *kMethodCopy = "Copy";
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- const CImageInfo *image = NULL;
- if (_xmls.Size() == 1)
- {
- const CXml &xml = _xmls[0];
- if (xml.Images.Size() == 1)
- image = &xml.Images[0];
- }
-
- switch(propID)
- {
- case kpidSize: prop = _db.GetUnpackSize(); break;
- case kpidPackSize: prop = _db.GetPackSize(); break;
-
- case kpidCTime:
- if (_xmls.Size() == 1)
- {
- const CXml &xml = _xmls[0];
- int index = -1;
- for (int i = 0; i < xml.Images.Size(); i++)
- {
- const CImageInfo &image = xml.Images[i];
- if (image.CTimeDefined)
- if (index < 0 || ::CompareFileTime(&image.CTime, &xml.Images[index].CTime) < 0)
- index = i;
- }
- if (index >= 0)
- prop = xml.Images[index].CTime;
- }
- break;
-
- case kpidMTime:
- if (_xmls.Size() == 1)
- {
- const CXml &xml = _xmls[0];
- int index = -1;
- for (int i = 0; i < xml.Images.Size(); i++)
- {
- const CImageInfo &image = xml.Images[i];
- if (image.MTimeDefined)
- if (index < 0 || ::CompareFileTime(&image.MTime, &xml.Images[index].MTime) > 0)
- index = i;
- }
- if (index >= 0)
- prop = xml.Images[index].MTime;
- }
- break;
-
- case kpidComment:
- if (image != NULL)
- {
- if (_xmlInComments)
- {
- UString s;
- _xmls[0].ToUnicode(s);
- prop = s;
- }
- else if (image->NameDefined)
- prop = image->Name;
- }
- break;
-
- case kpidUnpackVer:
- {
- UInt32 ver1 = _version >> 16;
- UInt32 ver2 = (_version >> 8) & 0xFF;
- UInt32 ver3 = (_version) & 0xFF;
-
- char s[16];
- ConvertUInt32ToString(ver1, s);
- AString res = s;
- res += '.';
- ConvertUInt32ToString(ver2, s);
- res += s;
- if (ver3 != 0)
- {
- res += '.';
- ConvertUInt32ToString(ver3, s);
- res += s;
- }
- prop = res;
- break;
- }
-
- case kpidIsVolume:
- if (_xmls.Size() > 0)
- {
- UInt16 volIndex = _xmls[0].VolIndex;
- if (volIndex < _volumes.Size())
- prop = (_volumes[volIndex].Header.NumParts > 1);
- }
- break;
- case kpidVolume:
- if (_xmls.Size() > 0)
- {
- UInt16 volIndex = _xmls[0].VolIndex;
- if (volIndex < _volumes.Size())
- prop = (UInt32)_volumes[volIndex].Header.PartNumber;
- }
- break;
- case kpidNumVolumes: if (_volumes.Size() > 0) prop = (UInt32)(_volumes.Size() - 1); break;
- case kpidMethod:
- {
- bool lzx = false, xpress = false, copy = false;
- for (int i = 0; i < _xmls.Size(); i++)
- {
- const CHeader &header = _volumes[_xmls[i].VolIndex].Header;
- if (header.IsCompressed())
- if (header.IsLzxMode())
- lzx = true;
- else
- xpress = true;
- else
- copy = true;
- }
- AString res;
- if (lzx)
- res = kMethodLZX;
- if (xpress)
- {
- if (!res.IsEmpty())
- res += ' ';
- res += kMethodXpress;
- }
- if (copy)
- {
- if (!res.IsEmpty())
- res += ' ';
- res += kMethodCopy;
- }
- prop = res;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- if (index < (UInt32)_db.SortedItems.Size())
- {
- int realIndex = _db.SortedItems[index];
- const CItem &item = _db.Items[realIndex];
- const CStreamInfo *si = NULL;
- const CVolume *vol = NULL;
- if (item.StreamIndex >= 0)
- {
- si = &_db.Streams[item.StreamIndex];
- vol = &_volumes[si->PartNumber];
- }
-
- switch(propID)
- {
- case kpidPath:
- if (item.HasMetadata)
- prop = _db.GetItemPath(realIndex);
- else
- {
- char sz[16];
- ConvertUInt32ToString(item.StreamIndex, sz);
- AString s = sz;
- while (s.Length() < _nameLenForStreams)
- s = '0' + s;
- /*
- if (si->Resource.IsFree())
- prefix = "[Free]";
- */
- s = "[Files]" STRING_PATH_SEPARATOR + s;
- prop = s;
- }
- break;
- case kpidShortName: if (item.HasMetadata) prop = item.ShortName; break;
-
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidAttrib: if (item.HasMetadata) prop = item.Attrib; break;
- case kpidCTime: if (item.HasMetadata) prop = item.CTime; break;
- case kpidATime: if (item.HasMetadata) prop = item.ATime; break;
- case kpidMTime: if (item.HasMetadata) prop = item.MTime; break;
- case kpidPackSize: prop = si ? si->Resource.PackSize : (UInt64)0; break;
- case kpidSize: prop = si ? si->Resource.UnpackSize : (UInt64)0; break;
- case kpidMethod: if (si) prop = si->Resource.IsCompressed() ?
- (vol->Header.IsLzxMode() ? kMethodLZX : kMethodXpress) : kMethodCopy; break;
- #ifdef WIM_DETAILS
- case kpidVolume: if (si) prop = (UInt32)si->PartNumber; break;
- case kpidOffset: if (si) prop = (UInt64)si->Resource.Offset; break;
- case kpidLinks: prop = si ? (UInt32)si->RefCount : (UInt32)0; break;
- #endif
- }
- }
- else
- {
- index -= _db.SortedItems.Size();
- {
- switch(propID)
- {
- case kpidPath:
- {
- char sz[16];
- ConvertUInt32ToString(_xmls[index].VolIndex, sz);
- prop = (AString)"[" + (AString)sz + "].xml";
- break;
- }
- case kpidIsDir: prop = false; break;
- case kpidPackSize:
- case kpidSize: prop = (UInt64)_xmls[index].Data.GetCapacity(); break;
- case kpidMethod: prop = kMethodCopy; break;
- }
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CVolumeName
-{
- // UInt32 _volIndex;
- UString _before;
- UString _after;
-public:
- CVolumeName() {};
-
- void InitName(const UString &name)
- {
- // _volIndex = 1;
- int dotPos = name.ReverseFind('.');
- if (dotPos < 0)
- dotPos = name.Length();
- _before = name.Left(dotPos);
- _after = name.Mid(dotPos);
- }
-
- UString GetNextName(UInt32 index)
- {
- wchar_t s[16];
- ConvertUInt32ToString(index, s);
- return _before + (UString)s + _after;
- }
-};
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback *openArchiveCallback)
-{
- COM_TRY_BEGIN
- Close();
- {
- CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
-
- CVolumeName seqName;
- if (openArchiveCallback != NULL)
- openArchiveCallback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback);
-
- UInt32 numVolumes = 1;
- int firstVolumeIndex = -1;
- for (UInt32 i = 1; i <= numVolumes; i++)
- {
- CMyComPtr<IInStream> curStream;
- if (i != 1)
- {
- UString fullName = seqName.GetNextName(i);
- HRESULT result = openVolumeCallback->GetStream(fullName, &curStream);
- if (result == S_FALSE)
- continue;
- if (result != S_OK)
- return result;
- if (!curStream)
- break;
- }
- else
- curStream = inStream;
- CHeader header;
- HRESULT res = NWim::ReadHeader(curStream, header);
- if (res != S_OK)
- {
- if (i == 1)
- return res;
- if (res == S_FALSE)
- continue;
- return res;
- }
- _version = header.Version;
- _isOldVersion = header.IsOldVersion();
- if (firstVolumeIndex >= 0)
- if (!header.AreFromOnArchive(_volumes[firstVolumeIndex].Header))
- break;
- if (_volumes.Size() > header.PartNumber && _volumes[header.PartNumber].Stream)
- break;
- CXml xml;
- xml.VolIndex = header.PartNumber;
- res = _db.Open(curStream, header, xml.Data, openArchiveCallback);
- if (res != S_OK)
- {
- if (i == 1)
- return res;
- if (res == S_FALSE)
- continue;
- return res;
- }
-
- while (_volumes.Size() <= header.PartNumber)
- _volumes.Add(CVolume());
- CVolume &volume = _volumes[header.PartNumber];
- volume.Header = header;
- volume.Stream = curStream;
-
- firstVolumeIndex = header.PartNumber;
-
- bool needAddXml = true;
- if (_xmls.Size() != 0)
- if (xml.Data == _xmls[0].Data)
- needAddXml = false;
- if (needAddXml)
- {
- xml.Parse();
- _xmls.Add(xml);
- }
-
- if (i == 1)
- {
- if (header.PartNumber != 1)
- break;
- if (!openVolumeCallback)
- break;
- numVolumes = header.NumParts;
- {
- NCOM::CPropVariant prop;
- RINOK(openVolumeCallback->GetProperty(kpidName, &prop));
- if (prop.vt != VT_BSTR)
- break;
- seqName.InitName(prop.bstrVal);
- }
- }
- }
-
- _db.DetectPathMode();
- RINOK(_db.Sort(_db.SkipRoot));
-
- wchar_t sz[16];
- ConvertUInt32ToString(_db.Streams.Size(), sz);
- _nameLenForStreams = MyStringLen(sz);
-
- _xmlInComments = (_xmls.Size() == 1 && !_db.ShowImageNumber);
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _db.Clear();
- _volumes.Clear();
- _xmls.Clear();
- _nameLenForStreams = 0;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
-
- if (allFilesMode)
- numItems = _db.SortedItems.Size() + _xmls.Size();
- if (numItems == 0)
- return S_OK;
-
- UInt32 i;
- UInt64 totalSize = 0;
- for (i = 0; i < numItems; i++)
- {
- UInt32 index = allFilesMode ? i : indices[i];
- if (index < (UInt32)_db.SortedItems.Size())
- {
- int streamIndex = _db.Items[_db.SortedItems[index]].StreamIndex;
- if (streamIndex >= 0)
- {
- const CStreamInfo &si = _db.Streams[streamIndex];
- totalSize += si.Resource.UnpackSize;
- }
- }
- else
- totalSize += _xmls[index - (UInt32)_db.SortedItems.Size()].Data.GetCapacity();
- }
-
- RINOK(extractCallback->SetTotal(totalSize));
-
- UInt64 currentTotalPacked = 0;
- UInt64 currentTotalUnPacked = 0;
- UInt64 currentItemUnPacked, currentItemPacked;
-
- int prevSuccessStreamIndex = -1;
-
- CUnpacker unpacker;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- for (i = 0; i < numItems; currentTotalUnPacked += currentItemUnPacked,
- currentTotalPacked += currentItemPacked)
- {
- currentItemUnPacked = 0;
- currentItemPacked = 0;
-
- lps->InSize = currentTotalPacked;
- lps->OutSize = currentTotalUnPacked;
-
- RINOK(lps->SetCur());
- UInt32 index = allFilesMode ? i : indices[i];
- i++;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- if (index >= (UInt32)_db.SortedItems.Size())
- {
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- const CByteBuffer &data = _xmls[index - (UInt32)_db.SortedItems.Size()].Data;
- currentItemUnPacked = data.GetCapacity();
- if (realOutStream)
- {
- RINOK(WriteStream(realOutStream, (const Byte *)data, data.GetCapacity()));
- realOutStream.Release();
- }
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
-
- const CItem &item = _db.Items[_db.SortedItems[index]];
- int streamIndex = item.StreamIndex;
- if (streamIndex < 0)
- {
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(item.HasStream() ?
- NExtract::NOperationResult::kDataError :
- NExtract::NOperationResult::kOK));
- continue;
- }
-
- const CStreamInfo &si = _db.Streams[streamIndex];
- currentItemUnPacked = si.Resource.UnpackSize;
- currentItemPacked = si.Resource.PackSize;
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
- Int32 opRes = NExtract::NOperationResult::kOK;
- if (streamIndex != prevSuccessStreamIndex || realOutStream)
- {
- Byte digest[20];
- const CVolume &vol = _volumes[si.PartNumber];
- HRESULT res = unpacker.Unpack(vol.Stream, si.Resource, vol.Header.IsLzxMode(),
- realOutStream, progress, digest);
- if (res == S_OK)
- {
- if (memcmp(digest, si.Hash, kHashSize) == 0)
- prevSuccessStreamIndex = streamIndex;
- else
- opRes = NExtract::NOperationResult::kCRCError;
- }
- else if (res == S_FALSE)
- opRes = NExtract::NOperationResult::kDataError;
- else
- return res;
- }
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _db.SortedItems.Size();
- if (!_xmlInComments)
- *numItems += _xmls.Size();
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandler.h
deleted file mode 100644
index aa92069a5..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandler.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// WimHandler.h
-
-#ifndef __ARCHIVE_WIM_HANDLER_H
-#define __ARCHIVE_WIM_HANDLER_H
-
-#include "Common/MyCom.h"
-#include "Common/MyXml.h"
-
-#include "WimIn.h"
-
-namespace NArchive {
-namespace NWim {
-
-struct CVolume
-{
- CHeader Header;
- CMyComPtr<IInStream> Stream;
-};
-
-struct CImageInfo
-{
- bool CTimeDefined;
- bool MTimeDefined;
- bool NameDefined;
- // bool IndexDefined;
-
- FILETIME CTime;
- FILETIME MTime;
- UString Name;
- // UInt32 Index;
-
- CImageInfo(): CTimeDefined(false), MTimeDefined(false), NameDefined(false)
- // , IndexDefined(false)
- {}
- void Parse(const CXmlItem &item);
-};
-
-struct CXml
-{
- CByteBuffer Data;
- UInt16 VolIndex;
- CObjectVector<CImageInfo> Images;
-
- void ToUnicode(UString &s);
- void Parse();
-};
-
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CDatabase _db;
- UInt32 _version;
- bool _isOldVersion;
- CObjectVector<CVolume> _volumes;
- CObjectVector<CXml> _xmls;
- int _nameLenForStreams;
- bool _xmlInComments;
-
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-class COutHandler:
- public IOutArchive,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP1(IOutArchive)
- INTERFACE_IOutArchive(;)
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandlerOut.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandlerOut.cpp
deleted file mode 100644
index 50b879e79..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimHandlerOut.cpp
+++ /dev/null
@@ -1,639 +0,0 @@
-// WimHandlerOut.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Crypto/RandGen.h"
-#include "../../Crypto/Sha1.h"
-
-#include "WimHandler.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NWim {
-
-struct CSha1Hash
-{
- Byte Hash[kHashSize];
-};
-
-struct CHashList
-{
- CRecordVector<CSha1Hash> Digests;
- CIntVector Sorted;
-
- int AddUnique(const CSha1Hash &h);
-};
-
-int CHashList::AddUnique(const CSha1Hash &h)
-{
- int left = 0, right = Sorted.Size();
- while (left != right)
- {
- int mid = (left + right) / 2;
- int index = Sorted[mid];
- UInt32 i;
- const Byte *hash2 = Digests[index].Hash;
- for (i = 0; i < kHashSize; i++)
- if (h.Hash[i] != hash2[i])
- break;
- if (i == kHashSize)
- return index;
- if (h.Hash[i] < hash2[i])
- right = mid;
- else
- left = mid + 1;
- }
- Sorted.Insert(left, Digests.Add(h));
- return -1;
-}
-
-struct CUpdateItem
-{
- UString Name;
- UInt64 Size;
- FILETIME CTime;
- FILETIME ATime;
- FILETIME MTime;
- UInt32 Attrib;
- bool IsDir;
- int HashIndex;
-
- CUpdateItem(): HashIndex(-1) {}
-};
-
-struct CDir
-{
- int Index;
- UString Name;
- CObjectVector<CDir> Dirs;
- CIntVector Files;
-
- CDir(): Index(-1) {}
- bool IsLeaf() const { return Index >= 0; }
- UInt64 GetNumDirs() const;
- UInt64 GetNumFiles() const;
- CDir* AddDir(CObjectVector<CUpdateItem> &items, const UString &name, int index);
-};
-
-UInt64 CDir::GetNumDirs() const
-{
- UInt64 num = Dirs.Size();
- for (int i = 0; i < Dirs.Size(); i++)
- num += Dirs[i].GetNumDirs();
- return num;
-}
-
-UInt64 CDir::GetNumFiles() const
-{
- UInt64 num = Files.Size();
- for (int i = 0; i < Dirs.Size(); i++)
- num += Dirs[i].GetNumFiles();
- return num;
-}
-
-CDir* CDir::AddDir(CObjectVector<CUpdateItem> &items, const UString &name, int index)
-{
- int left = 0, right = Dirs.Size();
- while (left != right)
- {
- int mid = (left + right) / 2;
- CDir &d = Dirs[mid];
- int compare = name.CompareNoCase(d.IsLeaf() ? items[Dirs[mid].Index].Name : d.Name);
- if (compare == 0)
- {
- if (index >= 0)
- d.Index = index;
- return &d;
- }
- if (compare < 0)
- right = mid;
- else
- left = mid + 1;
- }
- Dirs.Insert(left, CDir());
- CDir &d = Dirs[left];
- d.Index = index;
- if (index < 0)
- d.Name = name;
- return &d;
-}
-
-
-STDMETHODIMP COutHandler::GetFileTimeType(UInt32 *type)
-{
- *type = NFileTimeType::kWindows;
- return S_OK;
-}
-
-static HRESULT GetTime(IArchiveUpdateCallback *callback, int index, PROPID propID, FILETIME &ft)
-{
- ft.dwLowDateTime = ft.dwHighDateTime = 0;
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(index, propID, &prop));
- if (prop.vt == VT_FILETIME)
- ft = prop.filetime;
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- return S_OK;
-}
-
-#define Set16(p, d) SetUi16(p, d)
-#define Set32(p, d) SetUi32(p, d)
-#define Set64(p, d) SetUi64(p, d)
-
-void CResource::WriteTo(Byte *p) const
-{
- Set64(p, PackSize);
- p[7] = Flags;
- Set64(p + 8, Offset);
- Set64(p + 16, UnpackSize);
-}
-
-void CHeader::WriteTo(Byte *p) const
-{
- memcpy(p, kSignature, kSignatureSize);
- Set32(p + 8, kHeaderSizeMax);
- Set32(p + 0xC, Version);
- Set32(p + 0x10, Flags);
- Set32(p + 0x14, ChunkSize);
- memcpy(p + 0x18, Guid, 16);
- Set16(p + 0x28, PartNumber);
- Set16(p + 0x2A, NumParts);
- Set32(p + 0x2C, NumImages);
- OffsetResource.WriteTo(p + 0x30);
- XmlResource.WriteTo(p + 0x48);
- MetadataResource.WriteTo(p + 0x60);
- IntegrityResource.WriteTo(p + 0x7C);
- Set32(p + 0x78, BootIndex);
- memset(p + 0x94, 0, 60);
-}
-
-void CStreamInfo::WriteTo(Byte *p) const
-{
- Resource.WriteTo(p);
- Set16(p + 0x18, PartNumber);
- Set32(p + 0x1A, RefCount);
- memcpy(p + 0x1E, Hash, kHashSize);
-}
-
-class CInStreamWithSha1:
- public ISequentialInStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialInStream> _stream;
- UInt64 _size;
- NCrypto::NSha1::CContext _sha;
-public:
- MY_UNKNOWN_IMP1(IInStream)
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-
- void SetStream(ISequentialInStream *stream) { _stream = stream; }
- void Init()
- {
- _size = 0;
- _sha.Init();
- }
- void ReleaseStream() { _stream.Release(); }
- UInt64 GetSize() const { return _size; }
- void Final(Byte *digest) { _sha.Final(digest); }
-};
-
-STDMETHODIMP CInStreamWithSha1::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize;
- HRESULT result = _stream->Read(data, size, &realProcessedSize);
- _size += realProcessedSize;
- _sha.Update((const Byte *)data, realProcessedSize);
- if (processedSize != NULL)
- *processedSize = realProcessedSize;
- return result;
-}
-
-static void SetFileTimeToMem(Byte *p, const FILETIME &ft)
-{
- Set32(p, ft.dwLowDateTime);
- Set32(p + 4, ft.dwHighDateTime);
-}
-
-static size_t WriteItem(const CUpdateItem &item, Byte *p, const Byte *hash)
-{
- int fileNameLen = item.Name.Length() * 2;
- int fileNameLen2 = (fileNameLen == 0 ? fileNameLen : fileNameLen + 2);
-
- size_t totalLen = ((kDirRecordSize + fileNameLen2 + 6) & ~7);
- if (p)
- {
- memset(p, 0, totalLen);
- Set64(p, totalLen);
- Set64(p + 8, item.Attrib);
- Set32(p + 0xC, (UInt32)(Int32)-1); // item.SecurityId
- // Set64(p + 0x10, 0); // subdirOffset
- SetFileTimeToMem(p + 0x28, item.CTime);
- SetFileTimeToMem(p + 0x30, item.ATime);
- SetFileTimeToMem(p + 0x38, item.MTime);
- if (hash)
- memcpy(p + 0x40, hash, kHashSize);
- /*
- else
- memset(p + 0x40, 0, kHashSize);
- */
- // Set16(p + 98, 0); // shortNameLen
- Set16(p + 100, (UInt16)fileNameLen);
- for (int i = 0; i * 2 < fileNameLen; i++)
- Set16(p + kDirRecordSize + i * 2, item.Name[i]);
- }
- return totalLen;
-}
-
-static void WriteTree(const CDir &tree, CRecordVector<CSha1Hash> &digests,
- CUpdateItem &defaultDirItem,
- CObjectVector<CUpdateItem> &updateItems, Byte *dest, size_t &pos)
-{
- int i;
- for (i = 0; i < tree.Files.Size(); i++)
- {
- const CUpdateItem &ui = updateItems[tree.Files[i]];
- pos += WriteItem(ui, dest ? dest + pos : NULL,
- ui.HashIndex >= 0 ? digests[ui.HashIndex].Hash : NULL);
- }
-
- size_t posStart = pos;
- for (i = 0; i < tree.Dirs.Size(); i++)
- {
- const CDir &subfolder = tree.Dirs[i];
- CUpdateItem *item = &defaultDirItem;
- if (subfolder.IsLeaf())
- item = &updateItems[subfolder.Index];
- else
- defaultDirItem.Name = subfolder.Name;
- pos += WriteItem(*item, NULL, NULL);
- }
-
- if (dest)
- Set64(dest + pos, 0);
-
- pos += 8;
-
- for (i = 0; i < tree.Dirs.Size(); i++)
- {
- const CDir &subfolder = tree.Dirs[i];
- if (dest)
- {
- CUpdateItem *item = &defaultDirItem;
- if (subfolder.IsLeaf())
- item = &updateItems[subfolder.Index];
- else
- defaultDirItem.Name = subfolder.Name;
- size_t len = WriteItem(*item, dest + posStart, NULL);
- Set64(dest + posStart + 0x10, pos);
- posStart += len;
- }
- WriteTree(subfolder, digests, defaultDirItem, updateItems, dest, pos);
- }
-}
-
-static void AddTag(AString &s, const char *name, const AString &value)
-{
- s += "<";
- s += name;
- s += ">";
- s += value;
- s += "</";
- s += name;
- s += ">";
-}
-
-static void AddTagUInt64(AString &s, const char *name, UInt64 value)
-{
- char temp[32];
- ConvertUInt64ToString(value, temp);
- AddTag(s, name, temp);
-}
-
-static AString TimeToXml(FILETIME &ft)
-{
- AString res;
- char temp[16] = { '0', 'x' };
- ConvertUInt32ToHexWithZeros(ft.dwHighDateTime, temp + 2);
- AddTag(res, "HIGHPART", temp);
- ConvertUInt32ToHexWithZeros(ft.dwLowDateTime, temp + 2);
- AddTag(res, "LOWPART", temp);
- return res;
-}
-
-void CHeader::SetDefaultFields(bool useLZX)
-{
- Version = kWimVersion;
- Flags = NHeaderFlags::kRpFix;
- ChunkSize = 0;
- if (useLZX)
- {
- Flags |= NHeaderFlags::kCompression | NHeaderFlags::kLZX;
- ChunkSize = kChunkSize;
- }
- g_RandomGenerator.Generate(Guid, 16);
- PartNumber = 1;
- NumParts = 1;
- NumImages = 1;
- BootIndex = 0;
- OffsetResource.Clear();
- XmlResource.Clear();
- MetadataResource.Clear();
- IntegrityResource.Clear();
-}
-
-static HRESULT UpdateArchive(ISequentialOutStream *seqOutStream,
- CDir &rootFolder,
- CObjectVector<CUpdateItem> &updateItems,
- IArchiveUpdateCallback *callback)
-{
- CMyComPtr<IOutStream> outStream;
- RINOK(seqOutStream->QueryInterface(IID_IOutStream, (void **)&outStream));
- if (!outStream)
- return E_NOTIMPL;
-
- UInt64 complexity = 0;
-
- int i;
- for (i = 0; i < updateItems.Size(); i++)
- complexity += updateItems[i].Size;
-
- RINOK(callback->SetTotal(complexity));
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(callback, true);
-
- complexity = 0;
-
- bool useCompression = false;
-
- CHeader header;
- header.SetDefaultFields(useCompression);
- Byte buf[kHeaderSizeMax];
- header.WriteTo(buf);
- RINOK(WriteStream(outStream, buf, kHeaderSizeMax));
-
- CHashList hashes;
- CObjectVector<CStreamInfo> streams;
-
- UInt64 curPos = kHeaderSizeMax;
- UInt64 unpackTotalSize = 0;
- for (i = 0; i < updateItems.Size(); i++)
- {
- lps->InSize = lps->OutSize = complexity;
- RINOK(lps->SetCur());
-
- CUpdateItem &ui = updateItems[i];
- if (ui.IsDir || ui.Size == 0)
- continue;
-
- CInStreamWithSha1 *inShaStreamSpec = new CInStreamWithSha1;
- CMyComPtr<ISequentialInStream> inShaStream = inShaStreamSpec;
-
- {
- CMyComPtr<ISequentialInStream> fileInStream;
- HRESULT res = callback->GetStream(i, &fileInStream);
- if (res != S_FALSE)
- {
- RINOK(res);
- inShaStreamSpec->SetStream(fileInStream);
- fileInStream.Release();
- inShaStreamSpec->Init();
- UInt64 offsetBlockSize = 0;
- if (useCompression)
- {
- for (UInt64 t = kChunkSize; t < ui.Size; t += kChunkSize)
- {
- Byte buf[8];
- SetUi32(buf, (UInt32)t);
- RINOK(WriteStream(outStream, buf, 4));
- offsetBlockSize += 4;
- }
- }
-
- RINOK(copyCoder->Code(inShaStream, outStream, NULL, NULL, progress));
- ui.Size = copyCoderSpec->TotalSize;
-
- CSha1Hash hash;
- unpackTotalSize += ui.Size;
- UInt64 packSize = offsetBlockSize + ui.Size;
- inShaStreamSpec->Final(hash.Hash);
- int index = hashes.AddUnique(hash);
- if (index >= 0)
- {
- ui.HashIndex = index;
- streams[index].RefCount++;
- outStream->Seek(-(Int64)packSize, STREAM_SEEK_CUR, &curPos);
- outStream->SetSize(curPos);
- }
- else
- {
- ui.HashIndex = hashes.Digests.Size() - 1;
- CStreamInfo s;
- s.Resource.PackSize = packSize;
- s.Resource.Offset = curPos;
- s.Resource.UnpackSize = ui.Size;
- s.Resource.Flags = 0;
- if (useCompression)
- s.Resource.Flags = NResourceFlags::Compressed;
- s.PartNumber = 1;
- s.RefCount = 1;
- memcpy(s.Hash, hash.Hash, kHashSize);
- streams.Add(s);
- curPos += packSize;
- }
- }
- fileInStream.Release();
- complexity += ui.Size;
- RINOK(callback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- }
- }
-
-
- CUpdateItem ri;
- FILETIME ft;
- NTime::GetCurUtcFileTime(ft);
- ri.MTime = ri.ATime = ri.CTime = ft;
- ri.Attrib = FILE_ATTRIBUTE_DIRECTORY;
-
- const UInt32 kSecuritySize = 8;
- size_t pos = kSecuritySize;
- WriteTree(rootFolder, hashes.Digests, ri, updateItems, NULL, pos);
-
- CByteBuffer meta;
- meta.SetCapacity(pos);
-
- // we can write 0 here only if there is no security data, imageX does it,
- // but some programs expect size = 8
- Set32((Byte *)meta, 8); // size of security data
- Set32((Byte *)meta + 4, 0); // num security entries
-
- pos = kSecuritySize;
- WriteTree(rootFolder, hashes.Digests, ri, updateItems, (Byte *)meta, pos);
-
- {
- NCrypto::NSha1::CContext sha;
- sha.Init();
- sha.Update((const Byte *)meta, pos);
- CSha1Hash digest;
- sha.Final(digest.Hash);
-
- CStreamInfo s;
- s.Resource.PackSize = pos;
- s.Resource.Offset = curPos;
- s.Resource.UnpackSize = pos;
- s.Resource.Flags = NResourceFlags::kMetadata;
- s.PartNumber = 1;
- s.RefCount = 1;
- memcpy(s.Hash, digest.Hash, kHashSize);
- streams.Add(s);
- RINOK(WriteStream(outStream, (const Byte *)meta, pos));
- meta.Free();
- curPos += pos;
- }
-
-
- header.OffsetResource.UnpackSize = header.OffsetResource.PackSize = (UInt64)streams.Size() * kStreamInfoSize;
- header.OffsetResource.Offset = curPos;
- header.OffsetResource.Flags = NResourceFlags::kMetadata;
-
- for (i = 0; i < streams.Size(); i++)
- {
- Byte buf[kStreamInfoSize];
- streams[i].WriteTo(buf);
- RINOK(WriteStream(outStream, buf, kStreamInfoSize));
- curPos += kStreamInfoSize;
- }
-
- AString xml = "<WIM>";
- AddTagUInt64(xml, "TOTALBYTES", curPos);
- xml += "<IMAGE INDEX=\"1\"><NAME>1</NAME>";
- AddTagUInt64(xml, "DIRCOUNT", rootFolder.GetNumDirs());
- AddTagUInt64(xml, "FILECOUNT", rootFolder.GetNumFiles());
- AddTagUInt64(xml, "TOTALBYTES", unpackTotalSize);
- NTime::GetCurUtcFileTime(ft);
- AddTag(xml, "CREATIONTIME", TimeToXml(ft));
- AddTag(xml, "LASTMODIFICATIONTIME", TimeToXml(ft));
- xml += "</IMAGE></WIM>";
-
- size_t xmlSize = (xml.Length() + 1) * 2;
- meta.SetCapacity(xmlSize);
- Set16((Byte *)meta, 0xFEFF);
- for (i = 0; i < xml.Length(); i++)
- Set16((Byte *)meta + 2 + i * 2, xml[i]);
- RINOK(WriteStream(outStream, (const Byte *)meta, xmlSize));
- meta.Free();
-
- header.XmlResource.UnpackSize = header.XmlResource.PackSize = xmlSize;
- header.XmlResource.Offset = curPos;
- header.XmlResource.Flags = NResourceFlags::kMetadata;
-
- outStream->Seek(0, STREAM_SEEK_SET, NULL);
- header.WriteTo(buf);
- return WriteStream(outStream, buf, kHeaderSizeMax);
-}
-
-STDMETHODIMP COutHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *callback)
-{
- COM_TRY_BEGIN
- CObjectVector<CUpdateItem> updateItems;
- CDir tree;
- tree.Dirs.Add(CDir());
- CDir &rootFolder = tree.Dirs.Back();
-
- for (UInt32 i = 0; i < numItems; i++)
- {
- CUpdateItem ui;
- Int32 newData, newProps;
- UInt32 indexInArchive;
- if (!callback)
- return E_FAIL;
- RINOK(callback->GetUpdateItemInfo(i, &newData, &newProps, &indexInArchive));
-
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidIsDir, &prop));
- if (prop.vt == VT_EMPTY)
- ui.IsDir = false;
- else if (prop.vt != VT_BOOL)
- return E_INVALIDARG;
- else
- ui.IsDir = (prop.boolVal != VARIANT_FALSE);
- }
-
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidAttrib, &prop));
- if (prop.vt == VT_EMPTY)
- ui.Attrib = (ui.IsDir ? FILE_ATTRIBUTE_DIRECTORY : 0);
- else if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- else
- ui.Attrib = prop.ulVal;
- }
-
- RINOK(GetTime(callback, i, kpidCTime, ui.CTime));
- RINOK(GetTime(callback, i, kpidATime, ui.ATime));
- RINOK(GetTime(callback, i, kpidMTime, ui.MTime));
-
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- ui.Size = prop.uhVal.QuadPart;
- }
-
- UString path;
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidPath, &prop));
- if (prop.vt == VT_BSTR)
- path = prop.bstrVal;
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
-
- CDir *curItem = &rootFolder;
- int len = path.Length();
- UString fileName;
- for (int j = 0; j < len; j++)
- {
- wchar_t c = path[j];
- if (c == WCHAR_PATH_SEPARATOR || c == L'/')
- {
- curItem = curItem->AddDir(updateItems, fileName, -1);
- fileName.Empty();
- }
- else
- fileName += c;
- }
-
- ui.Name = fileName;
- updateItems.Add(ui);
- if (ui.IsDir)
- curItem->AddDir(updateItems, fileName, (int)i);
- else
- curItem->Files.Add(i);
- }
- return UpdateArchive(outStream, tree, updateItems, callback);
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimIn.cpp
deleted file mode 100644
index c210804df..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimIn.cpp
+++ /dev/null
@@ -1,855 +0,0 @@
-// Archive/WimIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/IntToString.h"
-
-#include "../../Common/StreamUtils.h"
-#include "../../Common/StreamObjects.h"
-#include "../../Common/LimitedStreams.h"
-
-#include "../Common/OutStreamWithSha1.h"
-
-#include "WimIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-namespace NArchive {
-namespace NWim {
-
-namespace NXpress {
-
-class CDecoderFlusher
-{
- CDecoder *m_Decoder;
-public:
- bool NeedFlush;
- CDecoderFlusher(CDecoder *decoder): m_Decoder(decoder), NeedFlush(true) {}
- ~CDecoderFlusher()
- {
- if (NeedFlush)
- m_Decoder->Flush();
- m_Decoder->ReleaseStreams();
- }
-};
-
-HRESULT CDecoder::CodeSpec(UInt32 outSize)
-{
- {
- Byte levels[kMainTableSize];
- for (unsigned i = 0; i < kMainTableSize; i += 2)
- {
- Byte b = m_InBitStream.DirectReadByte();
- levels[i] = b & 0xF;
- levels[i + 1] = b >> 4;
- }
- if (!m_MainDecoder.SetCodeLengths(levels))
- return S_FALSE;
- }
-
- while (outSize > 0)
- {
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
- if (number < 256)
- {
- m_OutWindowStream.PutByte((Byte)number);
- outSize--;
- }
- else
- {
- if (number >= kMainTableSize)
- return S_FALSE;
- UInt32 posLenSlot = number - 256;
- UInt32 posSlot = posLenSlot / kNumLenSlots;
- UInt32 len = posLenSlot % kNumLenSlots;
- UInt32 distance = (1 << posSlot) - 1 + m_InBitStream.ReadBits(posSlot);
-
- if (len == kNumLenSlots - 1)
- {
- len = m_InBitStream.DirectReadByte();
- if (len == 0xFF)
- {
- len = m_InBitStream.DirectReadByte();
- len |= (UInt32)m_InBitStream.DirectReadByte() << 8;
- }
- else
- len += kNumLenSlots - 1;
- }
-
- len += kMatchMinLen;
- UInt32 locLen = (len <= outSize ? len : outSize);
-
- if (!m_OutWindowStream.CopyBlock(distance, locLen))
- return S_FALSE;
-
- len -= locLen;
- outSize -= locLen;
- if (len != 0)
- return S_FALSE;
- }
- }
- return S_OK;
-}
-
-const UInt32 kDictSize = (1 << kNumPosSlots);
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize)
-{
- if (!m_OutWindowStream.Create(kDictSize) || !m_InBitStream.Create(1 << 16))
- return E_OUTOFMEMORY;
-
- CDecoderFlusher flusher(this);
-
- m_InBitStream.SetStream(inStream);
- m_OutWindowStream.SetStream(outStream);
- m_InBitStream.Init();
- m_OutWindowStream.Init(false);
-
- RINOK(CodeSpec(outSize));
-
- flusher.NeedFlush = false;
- return Flush();
-}
-
-HRESULT CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize)
-{
- try { return CodeReal(inStream, outStream, outSize); }
- catch(const CInBufferException &e) { return e.ErrorCode; } \
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}
-
-HRESULT CUnpacker::Unpack(IInStream *inStream, const CResource &resource, bool lzxMode,
- ISequentialOutStream *outStream, ICompressProgressInfo *progress)
-{
- RINOK(inStream->Seek(resource.Offset, STREAM_SEEK_SET, NULL));
-
- CLimitedSequentialInStream *limitedStreamSpec = new CLimitedSequentialInStream();
- CMyComPtr<ISequentialInStream> limitedStream = limitedStreamSpec;
- limitedStreamSpec->SetStream(inStream);
-
- if (!copyCoder)
- {
- copyCoderSpec = new NCompress::CCopyCoder;
- copyCoder = copyCoderSpec;
- }
- if (!resource.IsCompressed())
- {
- if (resource.PackSize != resource.UnpackSize)
- return S_FALSE;
- limitedStreamSpec->Init(resource.PackSize);
- return copyCoder->Code(limitedStreamSpec, outStream, NULL, NULL, progress);
- }
- if (resource.UnpackSize == 0)
- return S_OK;
- UInt64 numChunks = (resource.UnpackSize + kChunkSize - 1) >> kChunkSizeBits;
- unsigned entrySize = ((resource.UnpackSize > (UInt64)1 << 32) ? 8 : 4);
- UInt64 sizesBufSize64 = entrySize * (numChunks - 1);
- size_t sizesBufSize = (size_t)sizesBufSize64;
- if (sizesBufSize != sizesBufSize64)
- return E_OUTOFMEMORY;
- if (sizesBufSize > sizesBuf.GetCapacity())
- {
- sizesBuf.Free();
- sizesBuf.SetCapacity(sizesBufSize);
- }
- RINOK(ReadStream_FALSE(inStream, (Byte *)sizesBuf, sizesBufSize));
- const Byte *p = (const Byte *)sizesBuf;
-
- if (lzxMode && !lzxDecoder)
- {
- lzxDecoderSpec = new NCompress::NLzx::CDecoder(true);
- lzxDecoder = lzxDecoderSpec;
- RINOK(lzxDecoderSpec->SetParams(kChunkSizeBits));
- }
-
- UInt64 baseOffset = resource.Offset + sizesBufSize64;
- UInt64 outProcessed = 0;
- for (UInt32 i = 0; i < (UInt32)numChunks; i++)
- {
- UInt64 offset = 0;
- if (i > 0)
- {
- offset = (entrySize == 4) ? Get32(p): Get64(p);
- p += entrySize;
- }
- UInt64 nextOffset = resource.PackSize - sizesBufSize64;
- if (i + 1 < (UInt32)numChunks)
- nextOffset = (entrySize == 4) ? Get32(p): Get64(p);
- if (nextOffset < offset)
- return S_FALSE;
-
- RINOK(inStream->Seek(baseOffset + offset, STREAM_SEEK_SET, NULL));
- UInt64 inSize = nextOffset - offset;
- limitedStreamSpec->Init(inSize);
-
- if (progress)
- {
- RINOK(progress->SetRatioInfo(&offset, &outProcessed));
- }
-
- UInt32 outSize = kChunkSize;
- if (outProcessed + outSize > resource.UnpackSize)
- outSize = (UInt32)(resource.UnpackSize - outProcessed);
- UInt64 outSize64 = outSize;
- if (inSize == outSize)
- {
- RINOK(copyCoder->Code(limitedStreamSpec, outStream, NULL, &outSize64, NULL));
- }
- else
- {
- if (lzxMode)
- {
- lzxDecoderSpec->SetKeepHistory(false);
- RINOK(lzxDecoder->Code(limitedStreamSpec, outStream, NULL, &outSize64, NULL));
- }
- else
- {
- RINOK(xpressDecoder.Code(limitedStreamSpec, outStream, outSize));
- }
- }
- outProcessed += outSize;
- }
- return S_OK;
-}
-
-HRESULT CUnpacker::Unpack(IInStream *inStream, const CResource &resource, bool lzxMode,
- ISequentialOutStream *outStream, ICompressProgressInfo *progress, Byte *digest)
-{
- COutStreamWithSha1 *shaStreamSpec = new COutStreamWithSha1();
- CMyComPtr<ISequentialOutStream> shaStream = shaStreamSpec;
- shaStreamSpec->SetStream(outStream);
- shaStreamSpec->Init(digest != NULL);
- HRESULT result = Unpack(inStream, resource, lzxMode, shaStream, progress);
- if (digest)
- shaStreamSpec->Final(digest);
- return result;
-}
-
-static HRESULT UnpackData(IInStream *inStream, const CResource &resource, bool lzxMode, CByteBuffer &buf, Byte *digest)
-{
- size_t size = (size_t)resource.UnpackSize;
- if (size != resource.UnpackSize)
- return E_OUTOFMEMORY;
- buf.Free();
- buf.SetCapacity(size);
-
- CBufPtrSeqOutStream *outStreamSpec = new CBufPtrSeqOutStream();
- CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;
- outStreamSpec->Init((Byte *)buf, size);
-
- CUnpacker unpacker;
- return unpacker.Unpack(inStream, resource, lzxMode, outStream, NULL, digest);
-}
-
-void CResource::Parse(const Byte *p)
-{
- Flags = p[7];
- PackSize = Get64(p) & (((UInt64)1 << 56) - 1);
- Offset = Get64(p + 8);
- UnpackSize = Get64(p + 16);
-}
-
-#define GetResource(p, res) res.Parse(p)
-
-static void GetStream(bool oldVersion, const Byte *p, CStreamInfo &s)
-{
- s.Resource.Parse(p);
- if (oldVersion)
- {
- s.PartNumber = 1;
- s.Id = Get32(p + 24);
- s.RefCount = Get32(p + 28);
- memcpy(s.Hash, p + 32, kHashSize);
- }
- else
- {
- s.PartNumber = Get16(p + 24);
- s.RefCount = Get32(p + 26);
- memcpy(s.Hash, p + 30, kHashSize);
- }
-}
-
-static const wchar_t *kLongPath = L"[LongPath]";
-
-UString CDatabase::GetItemPath(const int index1) const
-{
- int size = 0;
- int index = index1;
- int newLevel;
- for (newLevel = 0;; newLevel = 1)
- {
- const CItem &item = Items[index];
- index = item.Parent;
- if (index >= 0 || !SkipRoot)
- size += item.Name.Length() + newLevel;
- if (index < 0)
- break;
- if ((UInt32)size >= ((UInt32)1 << 16))
- return kLongPath;
- }
-
- wchar_t temp[16];
- int imageLen = 0;
- if (ShowImageNumber)
- {
- ConvertUInt32ToString(-1 - index, temp);
- imageLen = MyStringLen(temp);
- size += imageLen + 1;
- }
- if ((UInt32)size >= ((UInt32)1 << 16))
- return kLongPath;
-
- UString path;
- wchar_t *s = path.GetBuffer(size);
- s[size] = 0;
- if (ShowImageNumber)
- {
- memcpy(s, temp, imageLen * sizeof(wchar_t));
- s[imageLen] = WCHAR_PATH_SEPARATOR;
- }
-
- index = index1;
-
- for (newLevel = 0;; newLevel = 1)
- {
- const CItem &item = Items[index];
- index = item.Parent;
- if (index >= 0 || !SkipRoot)
- {
- if (newLevel)
- s[--size] = WCHAR_PATH_SEPARATOR;
- size -= item.Name.Length();
- memcpy(s + size, item.Name, sizeof(wchar_t) * item.Name.Length());
- }
- if (index < 0)
- {
- path.ReleaseBuffer();
- return path;
- }
- }
-}
-
-static void GetFileTimeFromMem(const Byte *p, FILETIME *ft)
-{
- ft->dwLowDateTime = Get32(p);
- ft->dwHighDateTime = Get32(p + 4);
-}
-
-static HRESULT ReadName(const Byte *p, int size, UString &dest)
-{
- if (size == 0)
- return S_OK;
- if (Get16(p + size) != 0)
- return S_FALSE;
- wchar_t *s = dest.GetBuffer(size / 2);
- for (int i = 0; i <= size; i += 2)
- *s++ = Get16(p + i);
- dest.ReleaseBuffer();
- return S_OK;
-}
-
-HRESULT CDatabase::ParseDirItem(size_t pos, int parent)
-{
- if ((pos & 7) != 0)
- return S_FALSE;
-
- int prevIndex = -1;
- for (int numItems = 0;; numItems++)
- {
- if (OpenCallback)
- {
- UInt64 numFiles = Items.Size();
- if ((numFiles & 0x3FF) == 0)
- {
- RINOK(OpenCallback->SetCompleted(&numFiles, NULL));
- }
- }
- size_t rem = DirSize - pos;
- if (pos < DirStartOffset || pos > DirSize || rem < 8)
- return S_FALSE;
- const Byte *p = DirData + pos;
- UInt64 len = Get64(p);
- if (len == 0)
- {
- if (parent < 0 && numItems != 1)
- SkipRoot = false;
- DirProcessed += 8;
- return S_OK;
- }
- if ((len & 7) != 0 || rem < len)
- return S_FALSE;
- if (!IsOldVersion)
- if (len < 0x28)
- return S_FALSE;
- DirProcessed += (size_t)len;
- if (DirProcessed > DirSize)
- return S_FALSE;
- int extraOffset = 0;
- if (IsOldVersion)
- {
- if (len < 0x40 || (/* Get32(p + 12) == 0 && */ Get32(p + 0x14) != 0))
- {
- extraOffset = 0x10;
- }
- }
- else if (Get64(p + 8) == 0)
- extraOffset = 0x24;
- if (extraOffset)
- {
- if (prevIndex == -1)
- return S_FALSE;
- UInt32 fileNameLen = Get16(p + extraOffset);
- if ((fileNameLen & 1) != 0)
- return S_FALSE;
- /* Probably different versions of ImageX can use different number of
- additional ZEROs. So we don't use exact check. */
- UInt32 fileNameLen2 = (fileNameLen == 0 ? fileNameLen : fileNameLen + 2);
- if (((extraOffset + 2 + fileNameLen2 + 6) & ~7) > len)
- return S_FALSE;
-
- UString name;
- RINOK(ReadName(p + extraOffset + 2, fileNameLen, name));
-
- CItem &prevItem = Items[prevIndex];
- if (name.IsEmpty() && !prevItem.HasStream())
- {
- if (IsOldVersion)
- prevItem.Id = Get32(p + 8);
- else
- memcpy(prevItem.Hash, p + 0x10, kHashSize);
- }
- else
- {
- CItem item;
- item.Name = prevItem.Name + L':' + name;
- item.CTime = prevItem.CTime;
- item.ATime = prevItem.ATime;
- item.MTime = prevItem.MTime;
- if (IsOldVersion)
- {
- item.Id = Get32(p + 8);
- memset(item.Hash, 0, kHashSize);
- }
- else
- memcpy(item.Hash, p + 0x10, kHashSize);
- item.Attrib = 0;
- item.Order = Order++;
- item.Parent = parent;
- Items.Add(item);
- }
- pos += (size_t)len;
- continue;
- }
-
- UInt32 dirRecordSize = IsOldVersion ? kDirRecordSizeOld : kDirRecordSize;
- if (len < dirRecordSize)
- return S_FALSE;
-
- CItem item;
- item.Attrib = Get32(p + 8);
- // item.SecurityId = Get32(p + 0xC);
- UInt64 subdirOffset = Get64(p + 0x10);
- UInt32 timeOffset = IsOldVersion ? 0x18: 0x28;
- GetFileTimeFromMem(p + timeOffset, &item.CTime);
- GetFileTimeFromMem(p + timeOffset + 8, &item.ATime);
- GetFileTimeFromMem(p + timeOffset + 16, &item.MTime);
- if (IsOldVersion)
- {
- item.Id = Get32(p + 0x10);
- memset(item.Hash, 0, kHashSize);
- }
- else
- {
- memcpy(item.Hash, p + 0x40, kHashSize);
- }
- // UInt32 numStreams = Get16(p + dirRecordSize - 6);
- UInt32 shortNameLen = Get16(p + dirRecordSize - 4);
- UInt32 fileNameLen = Get16(p + dirRecordSize - 2);
-
- if ((shortNameLen & 1) != 0 || (fileNameLen & 1) != 0)
- return S_FALSE;
-
- UInt32 shortNameLen2 = (shortNameLen == 0 ? shortNameLen : shortNameLen + 2);
- UInt32 fileNameLen2 = (fileNameLen == 0 ? fileNameLen : fileNameLen + 2);
-
- if (((dirRecordSize + fileNameLen2 + shortNameLen2 + 6) & ~7) > len)
- return S_FALSE;
- p += dirRecordSize;
-
- RINOK(ReadName(p, fileNameLen, item.Name));
- RINOK(ReadName(p + fileNameLen2, shortNameLen, item.ShortName));
-
- if (parent < 0 && (shortNameLen || fileNameLen || !item.IsDir()))
- SkipRoot = false;
-
- /*
- // there are some extra data for some files.
- p -= dirRecordSize;
- p += ((dirRecordSize + fileNameLen2 + shortNameLen2 + 6) & ~7);
- if (((dirRecordSize + fileNameLen2 + shortNameLen2 + 6) & ~7) != len)
- p = p;
- */
-
- /*
- if (parent >= 0)
- {
- UString s = GetItemPath(parent) + L"\\" + item.Name;
- printf("\n%s %8x %S", item.IsDir() ? "D" : " ", (int)subdirOffset, (const wchar_t *)s);
- }
- */
-
- if (fileNameLen == 0 && item.IsDir() && !item.HasStream())
- item.Attrib = 0x10; // some swm archives have system/hidden attributes for root
-
- item.Parent = parent;
- prevIndex = Items.Add(item);
- if (item.IsDir() && subdirOffset != 0)
- {
- RINOK(ParseDirItem((size_t)subdirOffset, prevIndex));
- }
- Items[prevIndex].Order = Order++;
- pos += (size_t)len;
- }
-}
-
-HRESULT CDatabase::ParseImageDirs(const CByteBuffer &buf, int parent)
-{
- DirData = buf;
- DirSize = buf.GetCapacity();
-
- size_t pos = 0;
- if (DirSize < 8)
- return S_FALSE;
- const Byte *p = DirData;
- UInt32 totalLength = Get32(p);
- if (IsOldVersion)
- {
- for (pos = 4;; pos += 8)
- {
- if (pos + 4 > DirSize)
- return S_FALSE;
- UInt32 n = Get32(p + pos);
- if (n == 0)
- break;
- if (pos + 8 > DirSize)
- return S_FALSE;
- totalLength += Get32(p + pos + 4);
- if (totalLength > DirSize)
- return S_FALSE;
- }
- pos += totalLength + 4;
- pos = (pos + 7) & ~(size_t)7;
- if (pos > DirSize)
- return S_FALSE;
- }
- else
- {
-
- // UInt32 numEntries = Get32(p + 4);
- pos += 8;
- {
- /*
- CRecordVector<UInt64> entryLens;
- UInt64 sum = 0;
- for (UInt32 i = 0; i < numEntries; i++)
- {
- if (pos + 8 > DirSize)
- return S_FALSE;
- UInt64 len = Get64(p + pos);
- entryLens.Add(len);
- sum += len;
- pos += 8;
- }
- pos += (size_t)sum; // skip security descriptors
- while ((pos & 7) != 0)
- pos++;
- if (pos != totalLength)
- return S_FALSE;
- */
- if (totalLength == 0)
- pos = 8;
- else if (totalLength < 8)
- return S_FALSE;
- else
- pos = totalLength;
- }
- }
- DirStartOffset = DirProcessed = pos;
- RINOK(ParseDirItem(pos, parent));
- if (DirProcessed == DirSize)
- return S_OK;
- /* Original program writes additional 8 bytes (END_OF_ROOT_FOLDER), but
- reference to that folder is empty */
- if (DirProcessed == DirSize - 8 && DirProcessed - DirStartOffset == 112 &&
- Get64(p + DirSize - 8) == 0)
- return S_OK;
- return S_FALSE;
-}
-
-HRESULT CHeader::Parse(const Byte *p)
-{
- UInt32 headerSize = Get32(p + 8);
- Version = Get32(p + 0x0C);
- Flags = Get32(p + 0x10);
- if (!IsSupported())
- return S_FALSE;
- ChunkSize = Get32(p + 0x14);
- if (ChunkSize != kChunkSize && ChunkSize != 0)
- return S_FALSE;
- int offset;
- if (IsOldVersion())
- {
- if (headerSize != 0x60)
- return S_FALSE;
- memset(Guid, 0, 16);
- offset = 0x18;
- PartNumber = 1;
- NumParts = 1;
- }
- else
- {
- if (headerSize < 0x74)
- return S_FALSE;
- memcpy(Guid, p + 0x18, 16);
- PartNumber = Get16(p + 0x28);
- NumParts = Get16(p + 0x2A);
- offset = 0x2C;
- if (IsNewVersion())
- {
- NumImages = Get32(p + offset);
- offset += 4;
- }
- }
- GetResource(p + offset, OffsetResource);
- GetResource(p + offset + 0x18, XmlResource);
- GetResource(p + offset + 0x30, MetadataResource);
- if (IsNewVersion())
- {
- if (headerSize < 0xD0)
- return S_FALSE;
- BootIndex = Get32(p + 0x48);
- IntegrityResource.Parse(p + offset + 0x4C);
- }
- return S_OK;
-}
-
-const Byte kSignature[kSignatureSize] = { 'M', 'S', 'W', 'I', 'M', 0, 0, 0 };
-
-HRESULT ReadHeader(IInStream *inStream, CHeader &h)
-{
- Byte p[kHeaderSizeMax];
- RINOK(ReadStream_FALSE(inStream, p, kHeaderSizeMax));
- if (memcmp(p, kSignature, kSignatureSize) != 0)
- return S_FALSE;
- return h.Parse(p);
-}
-
-static HRESULT ReadStreams(bool oldVersion, IInStream *inStream, const CHeader &h, CDatabase &db)
-{
- CByteBuffer offsetBuf;
- RINOK(UnpackData(inStream, h.OffsetResource, h.IsLzxMode(), offsetBuf, NULL));
- size_t i;
- size_t streamInfoSize = oldVersion ? kStreamInfoSize + 2 : kStreamInfoSize;
- for (i = 0; offsetBuf.GetCapacity() - i >= streamInfoSize; i += streamInfoSize)
- {
- CStreamInfo s;
- GetStream(oldVersion, (const Byte *)offsetBuf + i, s);
- if (s.PartNumber == h.PartNumber)
- db.Streams.Add(s);
- }
- return (i == offsetBuf.GetCapacity()) ? S_OK : S_FALSE;
-}
-
-static bool IsEmptySha(const Byte *data)
-{
- for (int i = 0; i < kHashSize; i++)
- if (data[i] != 0)
- return false;
- return true;
-}
-
-HRESULT CDatabase::Open(IInStream *inStream, const CHeader &h, CByteBuffer &xml, IArchiveOpenCallback *openCallback)
-{
- OpenCallback = openCallback;
- IsOldVersion = h.IsOldVersion();
- RINOK(UnpackData(inStream, h.XmlResource, h.IsLzxMode(), xml, NULL));
- RINOK(ReadStreams(h.IsOldVersion(), inStream, h, *this));
- bool needBootMetadata = !h.MetadataResource.IsEmpty();
- Order = 0;
- if (h.PartNumber == 1)
- {
- int imageIndex = 1;
- for (int i = 0; i < Streams.Size(); i++)
- {
- // if (imageIndex > 1) break;
- const CStreamInfo &si = Streams[i];
- if (!si.Resource.IsMetadata() || si.PartNumber != h.PartNumber)
- continue;
- Byte hash[kHashSize];
- CByteBuffer metadata;
- RINOK(UnpackData(inStream, si.Resource, h.IsLzxMode(), metadata, hash));
- if (memcmp(hash, si.Hash, kHashSize) != 0 &&
- !(h.IsOldVersion() && IsEmptySha(si.Hash)))
- return S_FALSE;
- NumImages++;
- RINOK(ParseImageDirs(metadata, -(int)(++imageIndex)));
- if (needBootMetadata)
- if (h.MetadataResource.Offset == si.Resource.Offset)
- needBootMetadata = false;
- }
- }
-
- if (needBootMetadata)
- {
- CByteBuffer metadata;
- RINOK(UnpackData(inStream, h.MetadataResource, h.IsLzxMode(), metadata, NULL));
- RINOK(ParseImageDirs(metadata, -1));
- NumImages++;
- }
- return S_OK;
-}
-
-
-static int CompareStreamsByPos(const CStreamInfo *p1, const CStreamInfo *p2, void * /* param */)
-{
- int res = MyCompare(p1->PartNumber, p2->PartNumber);
- if (res != 0)
- return res;
- return MyCompare(p1->Resource.Offset, p2->Resource.Offset);
-}
-
-static int CompareIDs(const int *p1, const int *p2, void *param)
-{
- const CRecordVector<CStreamInfo> &streams = *(const CRecordVector<CStreamInfo> *)param;
- return MyCompare(streams[*p1].Id, streams[*p2].Id);
-}
-
-static int CompareHashRefs(const int *p1, const int *p2, void *param)
-{
- const CRecordVector<CStreamInfo> &streams = *(const CRecordVector<CStreamInfo> *)param;
- return memcmp(streams[*p1].Hash, streams[*p2].Hash, kHashSize);
-}
-
-static int FindId(const CRecordVector<CStreamInfo> &streams,
- const CIntVector &sortedByHash, UInt32 id)
-{
- int left = 0, right = streams.Size();
- while (left != right)
- {
- int mid = (left + right) / 2;
- int streamIndex = sortedByHash[mid];
- UInt32 id2 = streams[streamIndex].Id;
- if (id == id2)
- return streamIndex;
- if (id < id2)
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
-}
-
-static int FindHash(const CRecordVector<CStreamInfo> &streams,
- const CIntVector &sortedByHash, const Byte *hash)
-{
- int left = 0, right = streams.Size();
- while (left != right)
- {
- int mid = (left + right) / 2;
- int streamIndex = sortedByHash[mid];
- UInt32 i;
- const Byte *hash2 = streams[streamIndex].Hash;
- for (i = 0; i < kHashSize; i++)
- if (hash[i] != hash2[i])
- break;
- if (i == kHashSize)
- return streamIndex;
- if (hash[i] < hash2[i])
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
-}
-
-static int CompareItems(const int *a1, const int *a2, void *param)
-{
- const CObjectVector<CItem> &items = ((CDatabase *)param)->Items;
- const CItem &i1 = items[*a1];
- const CItem &i2 = items[*a2];
-
- if (i1.IsDir() != i2.IsDir())
- return i1.IsDir() ? 1 : -1;
- int res = MyCompare(i1.StreamIndex, i2.StreamIndex);
- if (res != 0)
- return res;
- return MyCompare(i1.Order, i2.Order);
-}
-
-HRESULT CDatabase::Sort(bool skipRootDir)
-{
- Streams.Sort(CompareStreamsByPos, NULL);
-
- {
- CIntVector sortedByHash;
- {
- for (int i = 0; i < Streams.Size(); i++)
- sortedByHash.Add(i);
- if (IsOldVersion)
- sortedByHash.Sort(CompareIDs, &Streams);
- else
- sortedByHash.Sort(CompareHashRefs, &Streams);
- }
-
- for (int i = 0; i < Items.Size(); i++)
- {
- CItem &item = Items[i];
- item.StreamIndex = -1;
- if (item.HasStream())
- if (IsOldVersion)
- item.StreamIndex = FindId(Streams, sortedByHash, item.Id);
- else
- item.StreamIndex = FindHash(Streams, sortedByHash, item.Hash);
- }
- }
-
- {
- CRecordVector<bool> used;
- int i;
- for (i = 0; i < Streams.Size(); i++)
- {
- const CStreamInfo &s = Streams[i];
- used.Add(s.Resource.IsMetadata() && s.PartNumber == 1);
- // used.Add(false);
- }
- for (i = 0; i < Items.Size(); i++)
- {
- CItem &item = Items[i];
- if (item.StreamIndex >= 0)
- used[item.StreamIndex] = true;
- }
- for (i = 0; i < Streams.Size(); i++)
- if (!used[i])
- {
- CItem item;
- item.StreamIndex = i;
- item.HasMetadata = false;
- Items.Add(item);
- }
- }
-
- SortedItems.Reserve(Items.Size());
- for (int i = (skipRootDir ? 1 : 0); i < Items.Size(); i++)
- SortedItems.Add(i);
- SortedItems.Sort(CompareItems, this);
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimIn.h
deleted file mode 100644
index da3e28a56..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimIn.h
+++ /dev/null
@@ -1,297 +0,0 @@
-// Archive/WimIn.h
-
-#ifndef __ARCHIVE_WIM_IN_H
-#define __ARCHIVE_WIM_IN_H
-
-#include "Common/Buffer.h"
-#include "Common/MyString.h"
-
-#include "../../Compress/CopyCoder.h"
-#include "../../Compress/LzxDecoder.h"
-
-#include "../IArchive.h"
-
-namespace NArchive {
-namespace NWim {
-
-namespace NXpress {
-
-class CBitStream
-{
- CInBuffer m_Stream;
- UInt32 m_Value;
- unsigned m_BitPos;
-public:
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *s) { m_Stream.SetStream(s); }
- void ReleaseStream() { m_Stream.ReleaseStream(); }
-
- void Init() { m_Stream.Init(); m_BitPos = 0; }
- // UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - m_BitPos / 8; }
- Byte DirectReadByte() { return m_Stream.ReadByte(); }
-
- void Normalize()
- {
- if (m_BitPos < 16)
- {
- Byte b0 = m_Stream.ReadByte();
- Byte b1 = m_Stream.ReadByte();
- m_Value = (m_Value << 8) | b1;
- m_Value = (m_Value << 8) | b0;
- m_BitPos += 16;
- }
- }
-
- UInt32 GetValue(unsigned numBits)
- {
- Normalize();
- return (m_Value >> (m_BitPos - numBits)) & ((1 << numBits) - 1);
- }
-
- void MovePos(unsigned numBits) { m_BitPos -= numBits; }
-
- UInt32 ReadBits(unsigned numBits)
- {
- UInt32 res = GetValue(numBits);
- m_BitPos -= numBits;
- return res;
- }
-};
-
-const unsigned kNumHuffmanBits = 16;
-const UInt32 kMatchMinLen = 3;
-const UInt32 kNumLenSlots = 16;
-const UInt32 kNumPosSlots = 16;
-const UInt32 kNumPosLenSlots = kNumPosSlots * kNumLenSlots;
-const UInt32 kMainTableSize = 256 + kNumPosLenSlots;
-
-class CDecoder
-{
- CBitStream m_InBitStream;
- CLzOutWindow m_OutWindowStream;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
-
- HRESULT CodeSpec(UInt32 size);
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize);
-public:
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
- HRESULT Flush() { return m_OutWindowStream.Flush(); }
- HRESULT Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt32 outSize);
-};
-
-}
-
-namespace NResourceFlags
-{
- const Byte kFree = 1;
- const Byte kMetadata = 2;
- const Byte Compressed = 4;
- const Byte Spanned = 4;
-}
-
-struct CResource
-{
- UInt64 PackSize;
- UInt64 Offset;
- UInt64 UnpackSize;
- Byte Flags;
-
- void Clear()
- {
- PackSize = 0;
- Offset = 0;
- UnpackSize = 0;
- Flags = 0;
- }
- void Parse(const Byte *p);
- void WriteTo(Byte *p) const;
- bool IsFree() const { return (Flags & NResourceFlags::kFree) != 0; }
- bool IsMetadata() const { return (Flags & NResourceFlags::kMetadata) != 0; }
- bool IsCompressed() const { return (Flags & NResourceFlags::Compressed) != 0; }
- bool IsEmpty() const { return (UnpackSize == 0); }
-};
-
-namespace NHeaderFlags
-{
- const UInt32 kCompression = 2;
- const UInt32 kSpanned = 8;
- const UInt32 kRpFix = 0x80;
- const UInt32 kXPRESS = 0x20000;
- const UInt32 kLZX = 0x40000;
-}
-
-const UInt32 kWimVersion = 0x010D00;
-const UInt32 kHeaderSizeMax = 0xD0;
-const UInt32 kSignatureSize = 8;
-extern const Byte kSignature[kSignatureSize];
-const unsigned kChunkSizeBits = 15;
-const UInt32 kChunkSize = (1 << kChunkSizeBits);
-
-struct CHeader
-{
- UInt32 Version;
- UInt32 Flags;
- UInt32 ChunkSize;
- Byte Guid[16];
- UInt16 PartNumber;
- UInt16 NumParts;
- UInt32 NumImages;
-
- CResource OffsetResource;
- CResource XmlResource;
- CResource MetadataResource;
- CResource IntegrityResource;
- UInt32 BootIndex;
-
- void SetDefaultFields(bool useLZX);
-
- void WriteTo(Byte *p) const;
- HRESULT Parse(const Byte *p);
- bool IsCompressed() const { return (Flags & NHeaderFlags::kCompression) != 0; }
- bool IsSupported() const { return (!IsCompressed() || (Flags & NHeaderFlags::kLZX) != 0 || (Flags & NHeaderFlags::kXPRESS) != 0 ) ; }
- bool IsLzxMode() const { return (Flags & NHeaderFlags::kLZX) != 0; }
- bool IsSpanned() const { return (!IsCompressed() || (Flags & NHeaderFlags::kSpanned) != 0); }
- bool IsOldVersion() const { return (Version <= 0x010A00); }
- bool IsNewVersion() const { return (Version > 0x010C00); }
-
- bool AreFromOnArchive(const CHeader &h)
- {
- return (memcmp(Guid, h.Guid, sizeof(Guid)) == 0) && (h.NumParts == NumParts);
- }
-};
-
-const UInt32 kHashSize = 20;
-const UInt32 kStreamInfoSize = 24 + 2 + 4 + kHashSize;
-
-struct CStreamInfo
-{
- CResource Resource;
- UInt16 PartNumber;
- UInt32 RefCount;
- UInt32 Id;
- BYTE Hash[kHashSize];
-
- void WriteTo(Byte *p) const;
-};
-
-const UInt32 kDirRecordSizeOld = 62;
-const UInt32 kDirRecordSize = 102;
-
-struct CItem
-{
- UString Name;
- UString ShortName;
- UInt32 Attrib;
- // UInt32 SecurityId;
- BYTE Hash[kHashSize];
- UInt32 Id;
- FILETIME CTime;
- FILETIME ATime;
- FILETIME MTime;
- // UInt32 ReparseTag;
- // UInt64 HardLink;
- // UInt16 NumStreams;
- int StreamIndex;
- int Parent;
- unsigned Order;
- bool HasMetadata;
- CItem(): HasMetadata(true), StreamIndex(-1), Id(0) {}
- bool IsDir() const { return HasMetadata && ((Attrib & 0x10) != 0); }
- bool HasStream() const
- {
- for (unsigned i = 0; i < kHashSize; i++)
- if (Hash[i] != 0)
- return true;
- return Id != 0;
- }
-};
-
-class CDatabase
-{
- const Byte *DirData;
- size_t DirSize;
- size_t DirProcessed;
- size_t DirStartOffset;
- int Order;
- IArchiveOpenCallback *OpenCallback;
-
- HRESULT ParseDirItem(size_t pos, int parent);
- HRESULT ParseImageDirs(const CByteBuffer &buf, int parent);
-
-public:
- CRecordVector<CStreamInfo> Streams;
- CObjectVector<CItem> Items;
- CIntVector SortedItems;
- int NumImages;
- bool SkipRoot;
- bool ShowImageNumber;
-
- bool IsOldVersion;
-
- UInt64 GetUnpackSize() const
- {
- UInt64 res = 0;
- for (int i = 0; i < Streams.Size(); i++)
- res += Streams[i].Resource.UnpackSize;
- return res;
- }
-
- UInt64 GetPackSize() const
- {
- UInt64 res = 0;
- for (int i = 0; i < Streams.Size(); i++)
- res += Streams[i].Resource.PackSize;
- return res;
- }
-
- void Clear()
- {
- Streams.Clear();
- Items.Clear();
- SortedItems.Clear();
- NumImages = 0;
-
- SkipRoot = true;
- ShowImageNumber = true;
- IsOldVersion = false;
- }
-
- UString GetItemPath(int index) const;
-
- HRESULT Open(IInStream *inStream, const CHeader &h, CByteBuffer &xml, IArchiveOpenCallback *openCallback);
-
- void DetectPathMode()
- {
- ShowImageNumber = (NumImages != 1);
- }
-
- HRESULT Sort(bool skipRootDir);
-};
-
-HRESULT ReadHeader(IInStream *inStream, CHeader &header);
-
-class CUnpacker
-{
- NCompress::CCopyCoder *copyCoderSpec;
- CMyComPtr<ICompressCoder> copyCoder;
-
- NCompress::NLzx::CDecoder *lzxDecoderSpec;
- CMyComPtr<ICompressCoder> lzxDecoder;
-
- NXpress::CDecoder xpressDecoder;
-
- CByteBuffer sizesBuf;
- HRESULT Unpack(IInStream *inStream, const CResource &res, bool lzxMode,
- ISequentialOutStream *outStream, ICompressProgressInfo *progress);
-public:
- HRESULT Unpack(IInStream *inStream, const CResource &res, bool lzxMode,
- ISequentialOutStream *outStream, ICompressProgressInfo *progress, Byte *digest);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimRegister.cpp
deleted file mode 100644
index 8da914360..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Wim/WimRegister.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// WimRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "WimHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NWim::CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new NArchive::NWim::COutHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
- { L"wim", L"wim swm", 0, 0xE6, { 'M', 'S', 'W', 'I', 'M', 0, 0, 0 }, 8, false, CreateArc, CreateArcOut };
-
-REGISTER_ARC(Wim)
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/XarHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/XarHandler.cpp
deleted file mode 100644
index e7d88b6c7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/XarHandler.cpp
+++ /dev/null
@@ -1,588 +0,0 @@
-// XarHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/ComTry.h"
-#include "Common/MyXml.h"
-#include "Common/StringToInt.h"
-#include "Common/UTFConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../Common/LimitedStreams.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/BZip2Decoder.h"
-#include "../Compress/CopyCoder.h"
-#include "../Compress/ZlibDecoder.h"
-
-#include "Common/OutStreamWithSha1.h"
-
-#define XAR_SHOW_RAW
-
-#define Get16(p) GetBe16(p)
-#define Get32(p) GetBe32(p)
-#define Get64(p) GetBe64(p)
-
-namespace NArchive {
-namespace NXar {
-
-struct CFile
-{
- AString Name;
- AString Method;
- UInt64 Size;
- UInt64 PackSize;
- UInt64 Offset;
-
- // UInt32 mode;
- UInt64 CTime;
- UInt64 MTime;
- UInt64 ATime;
-
- bool IsDir;
- bool HasData;
-
- bool Sha1IsDefined;
- Byte Sha1[20];
- // bool packSha1IsDefined;
- // Byte packSha1[20];
-
- int Parent;
-
- CFile(): IsDir(false), HasData(false), Sha1IsDefined(false),
- /* packSha1IsDefined(false), */
- Parent(-1), Size(0), PackSize(0), CTime(0), MTime(0), ATime(0) {}
-};
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- UInt64 _dataStartPos;
- CMyComPtr<IInStream> _inStream;
- AString _xml;
- CObjectVector<CFile> _files;
-
- HRESULT Open2(IInStream *stream);
- HRESULT Extract(IInStream *stream);
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-const UInt32 kXmlSizeMax = ((UInt32)1 << 30) - (1 << 14);
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidMethod, VT_BSTR}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-static bool ParseNumber(const char *s, int size, UInt32 &res)
-{
- const char *end;
- res = (UInt32)ConvertStringToUInt64(s, &end);
- return (end - s == size);
-}
-
-static bool ParseUInt64(const CXmlItem &item, const char *name, UInt64 &res)
-{
- AString s = item.GetSubStringForTag(name);
- const char *end;
- res = ConvertStringToUInt64(s, &end);
- return (end - (const char *)s == s.Length());
-}
-
-static UInt64 ParseTime(const CXmlItem &item, const char *name)
-{
- AString s = item.GetSubStringForTag(name);
- if (s.Length() < 20)
- return 0;
- const char *p = s;
- if (p[ 4] != '-' || p[ 7] != '-' || p[10] != 'T' ||
- p[13] != ':' || p[16] != ':' || p[19] != 'Z')
- return 0;
- UInt32 year, month, day, hour, min, sec;
- if (!ParseNumber(p, 4, year )) return 0;
- if (!ParseNumber(p + 5, 2, month)) return 0;
- if (!ParseNumber(p + 8, 2, day )) return 0;
- if (!ParseNumber(p + 11, 2, hour )) return 0;
- if (!ParseNumber(p + 14, 2, min )) return 0;
- if (!ParseNumber(p + 17, 2, sec )) return 0;
-
- UInt64 numSecs;
- if (!NWindows::NTime::GetSecondsSince1601(year, month, day, hour, min, sec, numSecs))
- return 0;
- return numSecs * 10000000;
-}
-
-static bool HexToByte(char c, Byte &res)
-{
- if (c >= '0' && c <= '9') res = c - '0';
- else if (c >= 'A' && c <= 'F') res = c - 'A' + 10;
- else if (c >= 'a' && c <= 'f') res = c - 'a' + 10;
- else return false;
- return true;
-}
-
-#define METHOD_NAME_ZLIB "zlib"
-
-static bool ParseSha1(const CXmlItem &item, const char *name, Byte *digest)
-{
- int index = item.FindSubTag(name);
- if (index < 0)
- return false;
- const CXmlItem &checkItem = item.SubItems[index];
- AString style = checkItem.GetPropertyValue("style");
- if (style == "SHA1")
- {
- AString s = checkItem.GetSubString();
- if (s.Length() != 40)
- return false;
- for (int i = 0; i < s.Length(); i += 2)
- {
- Byte b0, b1;
- if (!HexToByte(s[i], b0) || !HexToByte(s[i + 1], b1))
- return false;
- digest[i / 2] = (b0 << 4) | b1;
- }
- return true;
- }
- return false;
-}
-
-static bool AddItem(const CXmlItem &item, CObjectVector<CFile> &files, int parent)
-{
- if (!item.IsTag)
- return true;
- if (item.Name == "file")
- {
- CFile file;
- file.Parent = parent;
- parent = files.Size();
- file.Name = item.GetSubStringForTag("name");
- AString type = item.GetSubStringForTag("type");
- if (type == "directory")
- file.IsDir = true;
- else if (type == "file")
- file.IsDir = false;
- else
- return false;
-
- int dataIndex = item.FindSubTag("data");
- if (dataIndex >= 0 && !file.IsDir)
- {
- file.HasData = true;
- const CXmlItem &dataItem = item.SubItems[dataIndex];
- if (!ParseUInt64(dataItem, "size", file.Size))
- return false;
- if (!ParseUInt64(dataItem, "length", file.PackSize))
- return false;
- if (!ParseUInt64(dataItem, "offset", file.Offset))
- return false;
- file.Sha1IsDefined = ParseSha1(dataItem, "extracted-checksum", file.Sha1);
- // file.packSha1IsDefined = ParseSha1(dataItem, "archived-checksum", file.packSha1);
- int encodingIndex = dataItem.FindSubTag("encoding");
- if (encodingIndex >= 0)
- {
- const CXmlItem &encodingItem = dataItem.SubItems[encodingIndex];
- if (encodingItem.IsTag)
- {
- AString s = encodingItem.GetPropertyValue("style");
- if (s.Length() >= 0)
- {
- AString appl = "application/";
- if (s.Left(appl.Length()) == appl)
- {
- s = s.Mid(appl.Length());
- AString xx = "x-";
- if (s.Left(xx.Length()) == xx)
- {
- s = s.Mid(xx.Length());
- if (s == "gzip")
- s = METHOD_NAME_ZLIB;
- }
- }
- file.Method = s;
- }
- }
- }
- }
-
- file.CTime = ParseTime(item, "ctime");
- file.MTime = ParseTime(item, "mtime");
- file.ATime = ParseTime(item, "atime");
- files.Add(file);
- }
- for (int i = 0; i < item.SubItems.Size(); i++)
- if (!AddItem(item.SubItems[i], files, parent))
- return false;
- return true;
-}
-
-HRESULT CHandler::Open2(IInStream *stream)
-{
- UInt64 archiveStartPos;
- RINOK(stream->Seek(0, STREAM_SEEK_SET, &archiveStartPos));
-
- const UInt32 kHeaderSize = 0x1C;
- Byte buf[kHeaderSize];
- RINOK(ReadStream_FALSE(stream, buf, kHeaderSize));
-
- UInt32 size = Get16(buf + 4);
- // UInt32 ver = Get16(buf + 6); // == 0
- if (Get32(buf) != 0x78617221 || size != kHeaderSize)
- return S_FALSE;
-
- UInt64 packSize = Get64(buf + 8);
- UInt64 unpackSize = Get64(buf + 0x10);
- // UInt32 checkSumAlogo = Get32(buf + 0x18);
-
- if (unpackSize >= kXmlSizeMax)
- return S_FALSE;
-
- _dataStartPos = archiveStartPos + kHeaderSize + packSize;
-
- char *ss = _xml.GetBuffer((int)unpackSize + 1);
-
- NCompress::NZlib::CDecoder *zlibCoderSpec = new NCompress::NZlib::CDecoder();
- CMyComPtr<ICompressCoder> zlibCoder = zlibCoderSpec;
-
- CLimitedSequentialInStream *inStreamLimSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStreamLim(inStreamLimSpec);
- inStreamLimSpec->SetStream(stream);
- inStreamLimSpec->Init(packSize);
-
- CBufPtrSeqOutStream *outStreamLimSpec = new CBufPtrSeqOutStream;
- CMyComPtr<ISequentialOutStream> outStreamLim(outStreamLimSpec);
- outStreamLimSpec->Init((Byte *)ss, (size_t)unpackSize);
-
- RINOK(zlibCoder->Code(inStreamLim, outStreamLim, NULL, NULL, NULL));
-
- if (outStreamLimSpec->GetPos() != (size_t)unpackSize)
- return S_FALSE;
-
- ss[(size_t)unpackSize] = 0;
- _xml.ReleaseBuffer();
-
- CXml xml;
- if (!xml.Parse(_xml))
- return S_FALSE;
-
- if (!xml.Root.IsTagged("xar") || xml.Root.SubItems.Size() != 1)
- return S_FALSE;
- const CXmlItem &toc = xml.Root.SubItems[0];
- if (!toc.IsTagged("toc"))
- return S_FALSE;
- if (!AddItem(toc, _files, -1))
- return S_FALSE;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- {
- Close();
- if (Open2(stream) != S_OK)
- return S_FALSE;
- _inStream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _inStream.Release();
- _files.Clear();
- _xml.Empty();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _files.Size()
- #ifdef XAR_SHOW_RAW
- + 1
- #endif
- ;
- return S_OK;
-}
-
-static void TimeToProp(UInt64 t, NWindows::NCOM::CPropVariant &prop)
-{
- if (t != 0)
- {
- FILETIME ft;
- ft.dwLowDateTime = (UInt32)(t);
- ft.dwHighDateTime = (UInt32)(t >> 32);
- prop = ft;
- }
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
-
- #ifdef XAR_SHOW_RAW
- if ((int)index == _files.Size())
- {
- switch(propID)
- {
- case kpidPath: prop = L"[TOC].xml"; break;
- case kpidSize:
- case kpidPackSize: prop = (UInt64)_xml.Length(); break;
- }
- }
- else
- #endif
- {
- const CFile &item = _files[index];
- switch(propID)
- {
- case kpidMethod:
- {
- UString name;
- if (!item.Method.IsEmpty() && ConvertUTF8ToUnicode(item.Method, name))
- prop = name;
- break;
- }
- case kpidPath:
- {
- AString path;
- int cur = index;
- do
- {
- const CFile &item = _files[cur];
- AString s = item.Name;
- if (s.IsEmpty())
- s = "unknown";
- if (path.IsEmpty())
- path = s;
- else
- path = s + CHAR_PATH_SEPARATOR + path;
- cur = item.Parent;
- }
- while (cur >= 0);
-
- UString name;
- if (ConvertUTF8ToUnicode(path, name))
- prop = name;
- break;
- }
-
- case kpidIsDir: prop = item.IsDir; break;
- case kpidSize: if (!item.IsDir) prop = item.Size; break;
- case kpidPackSize: if (!item.IsDir) prop = item.PackSize; break;
-
- case kpidMTime: TimeToProp(item.MTime, prop); break;
- case kpidCTime: TimeToProp(item.CTime, prop); break;
- case kpidATime: TimeToProp(item.ATime, prop); break;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = _files.Size();
- if (numItems == 0)
- return S_OK;
- UInt64 totalSize = 0;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- int index = (int)(allFilesMode ? i : indices[i]);
- #ifdef XAR_SHOW_RAW
- if (index == _files.Size())
- totalSize += _xml.Length();
- else
- #endif
- totalSize += _files[index].Size;
- }
- extractCallback->SetTotal(totalSize);
-
- UInt64 currentPackTotal = 0;
- UInt64 currentUnpTotal = 0;
- UInt64 currentPackSize = 0;
- UInt64 currentUnpSize = 0;
-
- const UInt32 kZeroBufSize = (1 << 14);
- CByteBuffer zeroBuf;
- zeroBuf.SetCapacity(kZeroBufSize);
- memset(zeroBuf, 0, kZeroBufSize);
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- NCompress::NZlib::CDecoder *zlibCoderSpec = new NCompress::NZlib::CDecoder();
- CMyComPtr<ICompressCoder> zlibCoder = zlibCoderSpec;
-
- NCompress::NBZip2::CDecoder *bzip2CoderSpec = new NCompress::NBZip2::CDecoder();
- CMyComPtr<ICompressCoder> bzip2Coder = bzip2CoderSpec;
-
- NCompress::NDeflate::NDecoder::CCOMCoder *deflateCoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder();
- CMyComPtr<ICompressCoder> deflateCoder = deflateCoderSpec;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- CLimitedSequentialInStream *inStreamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream(inStreamSpec);
- inStreamSpec->SetStream(_inStream);
-
-
- CLimitedSequentialOutStream *outStreamLimSpec = new CLimitedSequentialOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamLimSpec);
-
- COutStreamWithSha1 *outStreamSha1Spec = new COutStreamWithSha1;
- {
- CMyComPtr<ISequentialOutStream> outStreamSha1(outStreamSha1Spec);
- outStreamLimSpec->SetStream(outStreamSha1);
- }
-
- for (i = 0; i < numItems; i++, currentPackTotal += currentPackSize, currentUnpTotal += currentUnpSize)
- {
- lps->InSize = currentPackTotal;
- lps->OutSize = currentUnpTotal;
- currentPackSize = 0;
- currentUnpSize = 0;
- RINOK(lps->SetCur());
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- if (index < _files.Size())
- {
- const CFile &item = _files[index];
- if (item.IsDir)
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- continue;
- }
- }
-
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- outStreamSha1Spec->SetStream(realOutStream);
- realOutStream.Release();
-
- Int32 opRes = NExtract::NOperationResult::kOK;
- #ifdef XAR_SHOW_RAW
- if (index == _files.Size())
- {
- outStreamSha1Spec->Init(false);
- outStreamLimSpec->Init(_xml.Length());
- RINOK(WriteStream(outStream, (const char *)_xml, _xml.Length()));
- currentPackSize = currentUnpSize = _xml.Length();
- }
- else
- #endif
- {
- const CFile &item = _files[index];
- if (item.HasData)
- {
- currentPackSize = item.PackSize;
- currentUnpSize = item.Size;
-
- RINOK(_inStream->Seek(_dataStartPos + item.Offset, STREAM_SEEK_SET, NULL));
- inStreamSpec->Init(item.PackSize);
- outStreamSha1Spec->Init(item.Sha1IsDefined);
- outStreamLimSpec->Init(item.Size);
- HRESULT res = S_OK;
-
- ICompressCoder *coder = NULL;
- if (item.Method.IsEmpty() || item.Method == "octet-stream")
- if (item.PackSize == item.Size)
- coder = copyCoder;
- else
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
- else if (item.Method == METHOD_NAME_ZLIB)
- coder = zlibCoder;
- else if (item.Method == "bzip2")
- coder = bzip2Coder;
- else
- opRes = NExtract::NOperationResult::kUnSupportedMethod;
-
- if (coder)
- res = coder->Code(inStream, outStream, NULL, NULL, progress);
-
- if (res != S_OK)
- {
- if (!outStreamLimSpec->IsFinishedOK())
- opRes = NExtract::NOperationResult::kDataError;
- else if (res != S_FALSE)
- return res;
- if (opRes == NExtract::NOperationResult::kOK)
- opRes = NExtract::NOperationResult::kDataError;
- }
-
- if (opRes == NExtract::NOperationResult::kOK)
- {
- if (outStreamLimSpec->IsFinishedOK() &&
- outStreamSha1Spec->GetSize() == item.Size)
- {
- if (!outStreamLimSpec->IsFinishedOK())
- {
- opRes = NExtract::NOperationResult::kDataError;
- }
- else if (item.Sha1IsDefined)
- {
- Byte digest[NCrypto::NSha1::kDigestSize];
- outStreamSha1Spec->Final(digest);
- if (memcmp(digest, item.Sha1, NCrypto::NSha1::kDigestSize) != 0)
- opRes = NExtract::NOperationResult::kCRCError;
- }
- }
- else
- opRes = NExtract::NOperationResult::kDataError;
- }
- }
- }
- outStreamSha1Spec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- return S_OK;
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new NArchive::NXar::CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Xar", L"xar", 0, 0xE1, { 'x', 'a', 'r', '!', 0, 0x1C }, 6, false, CreateArc, 0 };
-
-REGISTER_ARC(Xar)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/ZHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/ZHandler.cpp
deleted file mode 100644
index 49b76a116..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/ZHandler.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-// ZHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/ZDecoder.h"
-
-#include "Common/DummyOutStream.h"
-
-namespace NArchive {
-namespace NZ {
-
-class CHandler:
- public IInArchive,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- UInt64 _streamStartPosition;
- UInt64 _packSize;
- Byte _properties;
-public:
- MY_UNKNOWN_IMP1(IInArchive)
- INTERFACE_IInArchive(;)
-};
-
-STATPROPSTG kProps[] =
-{
- { NULL, kpidPackSize, VT_UI8}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidPackSize: prop = _packSize; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-static const int kSignatureSize = 3;
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 * /* maxCheckStartPosition */,
- IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- {
- RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_streamStartPosition));
- Byte buffer[kSignatureSize];
- RINOK(ReadStream_FALSE(stream, buffer, kSignatureSize));
- if (buffer[0] != 0x1F || buffer[1] != 0x9D)
- return S_FALSE;
- _properties = buffer[2];
-
- UInt64 endPosition;
- RINOK(stream->Seek(0, STREAM_SEEK_END, &endPosition));
- _packSize = endPosition - _streamStartPosition - kSignatureSize;
-
- _stream = stream;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stream.Release();
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- if (numItems == 0)
- return S_OK;
- if (numItems != (UInt32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- extractCallback->SetTotal(_packSize);
-
- UInt64 currentTotalPacked = 0;
-
- RINOK(extractCallback->SetCompleted(&currentTotalPacked));
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
-
- RINOK(extractCallback->GetStream(0, &realOutStream, askMode));
-
- if (!testMode && !realOutStream)
- return S_OK;
-
- extractCallback->PrepareOperation(askMode);
-
- CDummyOutStream *outStreamSpec = new CDummyOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init();
- realOutStream.Release();
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, true);
-
- RINOK(_stream->Seek(_streamStartPosition + kSignatureSize, STREAM_SEEK_SET, NULL));
-
- CMyComPtr<ICompressCoder> decoder;
- NCompress::NZ::CDecoder *decoderSpec = new NCompress::NZ::CDecoder;
- decoder = decoderSpec;
-
- HRESULT result = decoderSpec->SetDecoderProperties2(&_properties, 1);
-
- int opResult;
- if (result != S_OK)
- opResult = NExtract::NOperationResult::kUnSupportedMethod;
- else
- {
- result = decoder->Code(_stream, outStream, NULL, NULL, progress);
- if (result == S_FALSE)
- opResult = NExtract::NOperationResult::kDataError;
- else
- {
- RINOK(result);
- opResult = NExtract::NOperationResult::kOK;
- }
- }
- outStream.Release();
- return extractCallback->SetOperationResult(opResult);
- COM_TRY_END
-}
-
-static IInArchive *CreateArc() { return new CHandler; }
-
-static CArcInfo g_ArcInfo =
- { L"Z", L"z taz", L"* .tar", 5, { 0x1F, 0x9D }, 2, false, CreateArc, 0 };
-
-REGISTER_ARC(Z)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Zip/StdAfx.h
deleted file mode 100644
index e7fb6986d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/MyWindows.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipAddCommon.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipAddCommon.cpp
deleted file mode 100644
index 4c5fd38d1..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipAddCommon.cpp
+++ /dev/null
@@ -1,379 +0,0 @@
-// ZipAddCommon.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/7zCrc.h"
-
-#include "Windows/PropVariant.h"
-
-#include "../../ICoder.h"
-#include "../../IPassword.h"
-#include "../../MyVersion.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/StreamObjects.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/LzmaEncoder.h"
-#include "../../Compress/PpmdZip.h"
-
-#include "../Common/InStreamWithCRC.h"
-
-#include "ZipAddCommon.h"
-#include "ZipHeader.h"
-
-namespace NArchive {
-namespace NZip {
-
-static const CMethodId kMethodId_ZipBase = 0x040100;
-static const CMethodId kMethodId_BZip2 = 0x040202;
-
-static const UInt32 kLzmaPropsSize = 5;
-static const UInt32 kLzmaHeaderSize = 4 + kLzmaPropsSize;
-
-class CLzmaEncoder:
- public ICompressCoder,
- public CMyUnknownImp
-{
- NCompress::NLzma::CEncoder *EncoderSpec;
- CMyComPtr<ICompressCoder> Encoder;
- Byte Header[kLzmaHeaderSize];
-public:
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- HRESULT SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
-
- MY_UNKNOWN_IMP
-};
-
-HRESULT CLzmaEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
-{
- if (!Encoder)
- {
- EncoderSpec = new NCompress::NLzma::CEncoder;
- Encoder = EncoderSpec;
- }
- CBufPtrSeqOutStream *outStreamSpec = new CBufPtrSeqOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->Init(Header + 4, kLzmaPropsSize);
- RINOK(EncoderSpec->SetCoderProperties(propIDs, props, numProps));
- RINOK(EncoderSpec->WriteCoderProperties(outStream));
- if (outStreamSpec->GetPos() != kLzmaPropsSize)
- return E_FAIL;
- Header[0] = MY_VER_MAJOR;
- Header[1] = MY_VER_MINOR;
- Header[2] = kLzmaPropsSize;
- Header[3] = 0;
- return S_OK;
-}
-
-HRESULT CLzmaEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- RINOK(WriteStream(outStream, Header, kLzmaHeaderSize));
- return Encoder->Code(inStream, outStream, inSize, outSize, progress);
-}
-
-
-CAddCommon::CAddCommon(const CCompressionMethodMode &options):
- _options(options),
- _copyCoderSpec(NULL),
- _cryptoStreamSpec(0)
- {}
-
-static HRESULT GetStreamCRC(ISequentialInStream *inStream, UInt32 &resultCRC)
-{
- UInt32 crc = CRC_INIT_VAL;
- const UInt32 kBufferSize = (1 << 14);
- Byte buffer[kBufferSize];
- for (;;)
- {
- UInt32 realProcessedSize;
- RINOK(inStream->Read(buffer, kBufferSize, &realProcessedSize));
- if (realProcessedSize == 0)
- {
- resultCRC = CRC_GET_DIGEST(crc);
- return S_OK;
- }
- crc = CrcUpdate(crc, buffer, (size_t)realProcessedSize);
- }
-}
-
-HRESULT CAddCommon::Compress(
- DECL_EXTERNAL_CODECS_LOC_VARS
- ISequentialInStream *inStream, IOutStream *outStream,
- ICompressProgressInfo *progress, CCompressingResult &opRes)
-{
- CSequentialInStreamWithCRC *inSecCrcStreamSpec = 0;
- CInStreamWithCRC *inCrcStreamSpec = 0;
- CMyComPtr<ISequentialInStream> inCrcStream;
- {
- CMyComPtr<IInStream> inStream2;
- // we don't support stdin, since stream from stdin can require 64-bit size header
- RINOK(inStream->QueryInterface(IID_IInStream, (void **)&inStream2));
- if (inStream2)
- {
- inCrcStreamSpec = new CInStreamWithCRC;
- inCrcStream = inCrcStreamSpec;
- inCrcStreamSpec->SetStream(inStream2);
- inCrcStreamSpec->Init();
- }
- else
- {
- inSecCrcStreamSpec = new CSequentialInStreamWithCRC;
- inCrcStream = inSecCrcStreamSpec;
- inSecCrcStreamSpec->SetStream(inStream);
- inSecCrcStreamSpec->Init();
- }
- }
-
- int numTestMethods = _options.MethodSequence.Size();
- if (numTestMethods > 1 || _options.PasswordIsDefined)
- {
- if (inCrcStreamSpec == 0)
- {
- if (_options.PasswordIsDefined)
- return E_NOTIMPL;
- numTestMethods = 1;
- }
- }
- Byte method = 0;
- COutStreamReleaser outStreamReleaser;
- opRes.ExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_Default;
- for (int i = 0; i < numTestMethods; i++)
- {
- opRes.ExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_Default;
- if (inCrcStreamSpec != 0)
- RINOK(inCrcStreamSpec->Seek(0, STREAM_SEEK_SET, NULL));
- RINOK(outStream->SetSize(0));
- RINOK(outStream->Seek(0, STREAM_SEEK_SET, NULL));
- if (_options.PasswordIsDefined)
- {
- opRes.ExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_ZipCrypto;
-
- if (!_cryptoStream)
- {
- _cryptoStreamSpec = new CFilterCoder;
- _cryptoStream = _cryptoStreamSpec;
- }
- if (_options.IsAesMode)
- {
- opRes.ExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_Aes;
- if (!_cryptoStreamSpec->Filter)
- {
- _cryptoStreamSpec->Filter = _filterAesSpec = new NCrypto::NWzAes::CEncoder;
- _filterAesSpec->SetKeyMode(_options.AesKeyMode);
- RINOK(_filterAesSpec->CryptoSetPassword((const Byte *)(const char *)_options.Password, _options.Password.Length()));
- }
- RINOK(_filterAesSpec->WriteHeader(outStream));
- }
- else
- {
- if (!_cryptoStreamSpec->Filter)
- {
- _cryptoStreamSpec->Filter = _filterSpec = new NCrypto::NZip::CEncoder;
- _filterSpec->CryptoSetPassword((const Byte *)(const char *)_options.Password, _options.Password.Length());
- }
- UInt32 crc = 0;
- RINOK(GetStreamCRC(inStream, crc));
- RINOK(inCrcStreamSpec->Seek(0, STREAM_SEEK_SET, NULL));
- RINOK(_filterSpec->WriteHeader(outStream, crc));
- }
- RINOK(_cryptoStreamSpec->SetOutStream(outStream));
- outStreamReleaser.FilterCoder = _cryptoStreamSpec;
- }
-
- method = _options.MethodSequence[i];
- switch(method)
- {
- case NFileHeader::NCompressionMethod::kStored:
- {
- if (_copyCoderSpec == NULL)
- {
- _copyCoderSpec = new NCompress::CCopyCoder;
- _copyCoder = _copyCoderSpec;
- }
- CMyComPtr<ISequentialOutStream> outStreamNew;
- if (_options.PasswordIsDefined)
- outStreamNew = _cryptoStream;
- else
- outStreamNew = outStream;
- RINOK(_copyCoder->Code(inCrcStream, outStreamNew, NULL, NULL, progress));
- break;
- }
- default:
- {
- if (!_compressEncoder)
- {
- if (method == NFileHeader::NCompressionMethod::kLZMA)
- {
- _compressExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_LZMA;
- CLzmaEncoder *_lzmaEncoder = new CLzmaEncoder();
- _compressEncoder = _lzmaEncoder;
- NWindows::NCOM::CPropVariant props[] =
- {
- #ifndef _7ZIP_ST
- _options.NumThreads,
- #endif
- _options.Algo,
- _options.DicSize,
- _options.NumFastBytes,
- const_cast<BSTR>((const wchar_t *)_options.MatchFinder),
- _options.NumMatchFinderCycles
- };
- PROPID propIDs[] =
- {
- #ifndef _7ZIP_ST
- NCoderPropID::kNumThreads,
- #endif
- NCoderPropID::kAlgorithm,
- NCoderPropID::kDictionarySize,
- NCoderPropID::kNumFastBytes,
- NCoderPropID::kMatchFinder,
- NCoderPropID::kMatchFinderCycles
- };
- int numProps = sizeof(propIDs) / sizeof(propIDs[0]);
- if (!_options.NumMatchFinderCyclesDefined)
- numProps--;
- RINOK(_lzmaEncoder->SetCoderProperties(propIDs, props, numProps));
- }
- else if (method == NFileHeader::NCompressionMethod::kPPMd)
- {
- _compressExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_PPMd;
- NCompress::NPpmdZip::CEncoder *encoder = new NCompress::NPpmdZip::CEncoder();
- _compressEncoder = encoder;
- NWindows::NCOM::CPropVariant props[] =
- {
- _options.Algo,
- _options.MemSize,
- _options.Order
-
- };
- PROPID propIDs[] =
- {
- NCoderPropID::kAlgorithm,
- NCoderPropID::kUsedMemorySize,
- NCoderPropID::kOrder
- };
- RINOK(encoder->SetCoderProperties(propIDs, props, sizeof(propIDs) / sizeof(propIDs[0])));
- }
- else
- {
- CMethodId methodId;
- switch(method)
- {
- case NFileHeader::NCompressionMethod::kBZip2:
- methodId = kMethodId_BZip2;
- _compressExtractVersion = NFileHeader::NCompressionMethod::kExtractVersion_BZip2;
- break;
- default:
- _compressExtractVersion = ((method == NFileHeader::NCompressionMethod::kDeflated64) ?
- NFileHeader::NCompressionMethod::kExtractVersion_Deflate64 :
- NFileHeader::NCompressionMethod::kExtractVersion_Deflate);
- methodId = kMethodId_ZipBase + method;
- break;
- }
- RINOK(CreateCoder(
- EXTERNAL_CODECS_LOC_VARS
- methodId, _compressEncoder, true));
- if (!_compressEncoder)
- return E_NOTIMPL;
-
- if (method == NFileHeader::NCompressionMethod::kDeflated ||
- method == NFileHeader::NCompressionMethod::kDeflated64)
- {
- NWindows::NCOM::CPropVariant props[] =
- {
- _options.Algo,
- _options.NumPasses,
- _options.NumFastBytes,
- _options.NumMatchFinderCycles
- };
- PROPID propIDs[] =
- {
- NCoderPropID::kAlgorithm,
- NCoderPropID::kNumPasses,
- NCoderPropID::kNumFastBytes,
- NCoderPropID::kMatchFinderCycles
- };
- int numProps = sizeof(propIDs) / sizeof(propIDs[0]);
- if (!_options.NumMatchFinderCyclesDefined)
- numProps--;
- CMyComPtr<ICompressSetCoderProperties> setCoderProperties;
- _compressEncoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties);
- if (setCoderProperties)
- {
- RINOK(setCoderProperties->SetCoderProperties(propIDs, props, numProps));
- }
- }
- else if (method == NFileHeader::NCompressionMethod::kBZip2)
- {
- NWindows::NCOM::CPropVariant props[] =
- {
- _options.DicSize,
- _options.NumPasses
- #ifndef _7ZIP_ST
- , _options.NumThreads
- #endif
- };
- PROPID propIDs[] =
- {
- NCoderPropID::kDictionarySize,
- NCoderPropID::kNumPasses
- #ifndef _7ZIP_ST
- , NCoderPropID::kNumThreads
- #endif
- };
- CMyComPtr<ICompressSetCoderProperties> setCoderProperties;
- _compressEncoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties);
- if (setCoderProperties)
- {
- RINOK(setCoderProperties->SetCoderProperties(propIDs, props, sizeof(propIDs) / sizeof(propIDs[0])));
- }
- }
- }
- }
- CMyComPtr<ISequentialOutStream> outStreamNew;
- if (_options.PasswordIsDefined)
- outStreamNew = _cryptoStream;
- else
- outStreamNew = outStream;
- if (_compressExtractVersion > opRes.ExtractVersion)
- opRes.ExtractVersion = _compressExtractVersion;
- RINOK(_compressEncoder->Code(inCrcStream, outStreamNew, NULL, NULL, progress));
- break;
- }
- }
-
- RINOK(outStream->Seek(0, STREAM_SEEK_CUR, &opRes.PackSize));
-
- if (inCrcStreamSpec != 0)
- {
- opRes.CRC = inCrcStreamSpec->GetCRC();
- opRes.UnpackSize = inCrcStreamSpec->GetSize();
- }
- else
- {
- opRes.CRC = inSecCrcStreamSpec->GetCRC();
- opRes.UnpackSize = inSecCrcStreamSpec->GetSize();
- }
-
- if (_options.PasswordIsDefined)
- {
- if (opRes.PackSize < opRes.UnpackSize +
- (_options.IsAesMode ? _filterAesSpec->GetHeaderSize() : NCrypto::NZip::kHeaderSize))
- break;
- }
- else if (opRes.PackSize < opRes.UnpackSize)
- break;
- }
- if (_options.IsAesMode)
- {
- RINOK(_filterAesSpec->WriteFooter(outStream));
- RINOK(outStream->Seek(0, STREAM_SEEK_CUR, &opRes.PackSize));
- }
- opRes.Method = method;
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipAddCommon.h b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipAddCommon.h
deleted file mode 100644
index e4c02db3f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipAddCommon.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// ZipAddCommon.h
-
-#ifndef __ZIP_ADD_COMMON_H
-#define __ZIP_ADD_COMMON_H
-
-#include "../../ICoder.h"
-#include "../../IProgress.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/FilterCoder.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "../../Crypto/ZipCrypto.h"
-#include "../../Crypto/WzAes.h"
-
-#include "ZipCompressionMode.h"
-
-namespace NArchive {
-namespace NZip {
-
-struct CCompressingResult
-{
- UInt64 UnpackSize;
- UInt64 PackSize;
- UInt32 CRC;
- UInt16 Method;
- Byte ExtractVersion;
-};
-
-class CAddCommon
-{
- CCompressionMethodMode _options;
- NCompress::CCopyCoder *_copyCoderSpec;
- CMyComPtr<ICompressCoder> _copyCoder;
-
- CMyComPtr<ICompressCoder> _compressEncoder;
- Byte _compressExtractVersion;
-
- CFilterCoder *_cryptoStreamSpec;
- CMyComPtr<ISequentialOutStream> _cryptoStream;
-
- NCrypto::NZip::CEncoder *_filterSpec;
- NCrypto::NWzAes::CEncoder *_filterAesSpec;
-
-public:
- CAddCommon(const CCompressionMethodMode &options);
- HRESULT Compress(
- DECL_EXTERNAL_CODECS_LOC_VARS
- ISequentialInStream *inStream, IOutStream *outStream,
- ICompressProgressInfo *progress, CCompressingResult &operationResult);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipCompressionMode.h b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipCompressionMode.h
deleted file mode 100644
index 7ef7cfb28..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipCompressionMode.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// CompressionMode.h
-
-#ifndef __ZIP_COMPRESSION_MODE_H
-#define __ZIP_COMPRESSION_MODE_H
-
-#include "Common/MyString.h"
-
-namespace NArchive {
-namespace NZip {
-
-struct CCompressionMethodMode
-{
- CRecordVector<Byte> MethodSequence;
- UString MatchFinder;
- UInt32 Algo;
- UInt32 NumPasses;
- UInt32 NumFastBytes;
- bool NumMatchFinderCyclesDefined;
- UInt32 NumMatchFinderCycles;
- UInt32 DicSize;
- UInt32 MemSize;
- UInt32 Order;
-
- #ifndef _7ZIP_ST
- UInt32 NumThreads;
- #endif
- bool PasswordIsDefined;
- AString Password;
- bool IsAesMode;
- Byte AesKeyMode;
-
- CCompressionMethodMode():
- NumMatchFinderCyclesDefined(false),
- PasswordIsDefined(false),
- IsAesMode(false),
- AesKeyMode(3)
- {}
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandler.cpp
deleted file mode 100644
index bd1563226..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandler.cpp
+++ /dev/null
@@ -1,822 +0,0 @@
-// ZipHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../IPassword.h"
-
-#include "../../Common/FilterCoder.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamObjects.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-#include "../../Compress/LzmaDecoder.h"
-#include "../../Compress/ImplodeDecoder.h"
-#include "../../Compress/PpmdZip.h"
-#include "../../Compress/ShrinkDecoder.h"
-
-#include "../../Crypto/WzAes.h"
-#include "../../Crypto/ZipCrypto.h"
-#include "../../Crypto/ZipStrong.h"
-
-#include "../Common/ItemNameUtils.h"
-#include "../Common/OutStreamWithCRC.h"
-
-#include "ZipHandler.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NZip {
-
-static const CMethodId kMethodId_ZipBase = 0x040100;
-static const CMethodId kMethodId_BZip2 = 0x040202;
-
-static const char *kHostOS[] =
-{
- "FAT",
- "AMIGA",
- "VMS",
- "Unix",
- "VM/CMS",
- "Atari",
- "HPFS",
- "Macintosh",
- "Z-System",
- "CP/M",
- "TOPS-20",
- "NTFS",
- "SMS/QDOS",
- "Acorn",
- "VFAT",
- "MVS",
- "BeOS",
- "Tandem",
- "OS/400",
- "OS/X"
-};
-
-static const char *kUnknownOS = "Unknown";
-
-static const char *kMethods[] =
-{
- "Store",
- "Shrink",
- "Reduced1",
- "Reduced2",
- "Reduced3",
- "Reduced4",
- "Implode",
- "Tokenizing",
- "Deflate",
- "Deflate64",
- "PKImploding"
-};
-
-static const char *kBZip2Method = "BZip2";
-static const char *kLZMAMethod = "LZMA";
-static const char *kJpegMethod = "Jpeg";
-static const char *kWavPackMethod = "WavPack";
-static const char *kPPMdMethod = "PPMd";
-static const char *kAESMethod = "AES";
-static const char *kZipCryptoMethod = "ZipCrypto";
-static const char *kStrongCryptoMethod = "StrongCrypto";
-
-static struct CStrongCryptoPair
-{
- UInt16 Id;
- const char *Name;
-} g_StrongCryptoPairs[] =
-{
- { NStrongCryptoFlags::kDES, "DES" },
- { NStrongCryptoFlags::kRC2old, "RC2a" },
- { NStrongCryptoFlags::k3DES168, "3DES-168" },
- { NStrongCryptoFlags::k3DES112, "3DES-112" },
- { NStrongCryptoFlags::kAES128, "pkAES-128" },
- { NStrongCryptoFlags::kAES192, "pkAES-192" },
- { NStrongCryptoFlags::kAES256, "pkAES-256" },
- { NStrongCryptoFlags::kRC2, "RC2" },
- { NStrongCryptoFlags::kBlowfish, "Blowfish" },
- { NStrongCryptoFlags::kTwofish, "Twofish" },
- { NStrongCryptoFlags::kRC4, "RC4" }
-};
-
-static STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidPackSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidEncrypted, VT_BOOL},
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidCRC, VT_UI4},
- { NULL, kpidMethod, VT_BSTR},
- { NULL, kpidHostOS, VT_BSTR},
- { NULL, kpidUnpackVer, VT_UI4}
-};
-
-static STATPROPSTG kArcProps[] =
-{
- { NULL, kpidBit64, VT_BOOL},
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidPhySize, VT_UI8},
- { NULL, kpidOffset, VT_UI8}
-};
-
-CHandler::CHandler()
-{
- InitMethodProperties();
-}
-
-static AString BytesToString(const CByteBuffer &data)
-{
- AString s;
- int size = (int)data.GetCapacity();
- if (size > 0)
- {
- char *p = s.GetBuffer(size + 1);
- memcpy(p, (const Byte *)data, size);
- p[size] = '\0';
- s.ReleaseBuffer();
- }
- return s;
-}
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- switch(propID)
- {
- case kpidBit64: if (m_Archive.IsZip64) prop = m_Archive.IsZip64; break;
- case kpidComment: prop = MultiByteToUnicodeString(BytesToString(m_Archive.ArcInfo.Comment), CP_ACP); break;
- case kpidPhySize: prop = m_Archive.ArcInfo.GetPhySize(); break;
- case kpidOffset: if (m_Archive.ArcInfo.StartPosition != 0) prop = m_Archive.ArcInfo.StartPosition; break;
- }
- prop.Detach(value);
- COM_TRY_END
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = m_Items.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NWindows::NCOM::CPropVariant prop;
- const CItemEx &item = m_Items[index];
- switch(propID)
- {
- case kpidPath: prop = NItemName::GetOSName2(item.GetUnicodeString(item.Name)); break;
- case kpidIsDir: prop = item.IsDir(); break;
- case kpidSize: prop = item.UnPackSize; break;
- case kpidPackSize: prop = item.PackSize; break;
- case kpidTimeType:
- {
- FILETIME ft;
- UInt32 unixTime;
- if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kMTime, ft))
- prop = (UInt32)NFileTimeType::kWindows;
- else if (item.CentralExtra.GetUnixTime(NFileHeader::NUnixTime::kMTime, unixTime))
- prop = (UInt32)NFileTimeType::kUnix;
- else
- prop = (UInt32)NFileTimeType::kDOS;
- break;
- }
- case kpidCTime:
- {
- FILETIME ft;
- if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kCTime, ft))
- prop = ft;
- break;
- }
- case kpidATime:
- {
- FILETIME ft;
- if (item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kATime, ft))
- prop = ft;
- break;
- }
- case kpidMTime:
- {
- FILETIME utc;
- if (!item.CentralExtra.GetNtfsTime(NFileHeader::NNtfsExtra::kMTime, utc))
- {
- UInt32 unixTime;
- if (item.CentralExtra.GetUnixTime(NFileHeader::NUnixTime::kMTime, unixTime))
- NTime::UnixTimeToFileTime(unixTime, utc);
- else
- {
- FILETIME localFileTime;
- if (!NTime::DosTimeToFileTime(item.Time, localFileTime) ||
- !LocalFileTimeToFileTime(&localFileTime, &utc))
- utc.dwHighDateTime = utc.dwLowDateTime = 0;
- }
- }
- prop = utc;
- break;
- }
- case kpidAttrib: prop = item.GetWinAttributes(); break;
- case kpidEncrypted: prop = item.IsEncrypted(); break;
- case kpidComment: prop = item.GetUnicodeString(BytesToString(item.Comment)); break;
- case kpidCRC: if (item.IsThereCrc()) prop = item.FileCRC; break;
- case kpidMethod:
- {
- UInt16 methodId = item.CompressionMethod;
- AString method;
- if (item.IsEncrypted())
- {
- if (methodId == NFileHeader::NCompressionMethod::kWzAES)
- {
- method = kAESMethod;
- CWzAesExtraField aesField;
- if (item.CentralExtra.GetWzAesField(aesField))
- {
- method += '-';
- char s[32];
- ConvertUInt64ToString((aesField.Strength + 1) * 64 , s);
- method += s;
- method += ' ';
- methodId = aesField.Method;
- }
- }
- else
- {
- if (item.IsStrongEncrypted())
- {
- CStrongCryptoField f;
- bool finded = false;
- if (item.CentralExtra.GetStrongCryptoField(f))
- {
- for (int i = 0; i < sizeof(g_StrongCryptoPairs) / sizeof(g_StrongCryptoPairs[0]); i++)
- {
- const CStrongCryptoPair &pair = g_StrongCryptoPairs[i];
- if (f.AlgId == pair.Id)
- {
- method += pair.Name;
- finded = true;
- break;
- }
- }
- }
- if (!finded)
- method += kStrongCryptoMethod;
- }
- else
- method += kZipCryptoMethod;
- method += ' ';
- }
- }
- if (methodId < sizeof(kMethods) / sizeof(kMethods[0]))
- method += kMethods[methodId];
- else switch (methodId)
- {
- case NFileHeader::NCompressionMethod::kLZMA:
- method += kLZMAMethod;
- if (item.IsLzmaEOS())
- method += ":EOS";
- break;
- case NFileHeader::NCompressionMethod::kBZip2: method += kBZip2Method; break;
- case NFileHeader::NCompressionMethod::kJpeg: method += kJpegMethod; break;
- case NFileHeader::NCompressionMethod::kWavPack: method += kWavPackMethod; break;
- case NFileHeader::NCompressionMethod::kPPMd: method += kPPMdMethod; break;
- default:
- {
- char s[32];
- ConvertUInt64ToString(methodId, s);
- method += s;
- }
- }
- prop = method;
- break;
- }
- case kpidHostOS:
- prop = (item.MadeByVersion.HostOS < sizeof(kHostOS) / sizeof(kHostOS[0])) ?
- (kHostOS[item.MadeByVersion.HostOS]) : kUnknownOS;
- break;
- case kpidUnpackVer:
- prop = (UInt32)item.ExtractVersion.Version;
- break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-class CProgressImp: public CProgressVirt
-{
- CMyComPtr<IArchiveOpenCallback> _callback;
-public:
- STDMETHOD(SetTotal)(UInt64 numFiles);
- STDMETHOD(SetCompleted)(UInt64 numFiles);
- CProgressImp(IArchiveOpenCallback *callback): _callback(callback) {}
-};
-
-STDMETHODIMP CProgressImp::SetTotal(UInt64 numFiles)
-{
- if (_callback)
- return _callback->SetTotal(&numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CProgressImp::SetCompleted(UInt64 numFiles)
-{
- if (_callback)
- return _callback->SetCompleted(&numFiles, NULL);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream,
- const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- try
- {
- Close();
- RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));
- RINOK(m_Archive.Open(inStream, maxCheckStartPosition));
- CProgressImp progressImp(callback);
- return m_Archive.ReadHeaders(m_Items, &progressImp);
- }
- catch(const CInArchiveException &) { Close(); return S_FALSE; }
- catch(...) { Close(); throw; }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- m_Items.Clear();
- m_Archive.Close();
- return S_OK;
-}
-
-//////////////////////////////////////
-// CHandler::DecompressItems
-
-class CLzmaDecoder:
- public ICompressCoder,
- public CMyUnknownImp
-{
- NCompress::NLzma::CDecoder *DecoderSpec;
- CMyComPtr<ICompressCoder> Decoder;
-public:
- CLzmaDecoder();
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- MY_UNKNOWN_IMP
-};
-
-CLzmaDecoder::CLzmaDecoder()
-{
- DecoderSpec = new NCompress::NLzma::CDecoder;
- Decoder = DecoderSpec;
-}
-
-HRESULT CLzmaDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- Byte buf[9];
- RINOK(ReadStream_FALSE(inStream, buf, 9));
- if (buf[2] != 5 || buf[3] != 0)
- return E_NOTIMPL;
- RINOK(DecoderSpec->SetDecoderProperties2(buf + 4, 5));
- return Decoder->Code(inStream, outStream, NULL, outSize, progress);
-}
-
-struct CMethodItem
-{
- UInt16 ZipMethod;
- CMyComPtr<ICompressCoder> Coder;
-};
-
-class CZipDecoder
-{
- NCrypto::NZip::CDecoder *_zipCryptoDecoderSpec;
- NCrypto::NZipStrong::CDecoder *_pkAesDecoderSpec;
- NCrypto::NWzAes::CDecoder *_wzAesDecoderSpec;
-
- CMyComPtr<ICompressFilter> _zipCryptoDecoder;
- CMyComPtr<ICompressFilter> _pkAesDecoder;
- CMyComPtr<ICompressFilter> _wzAesDecoder;
-
- CFilterCoder *filterStreamSpec;
- CMyComPtr<ISequentialInStream> filterStream;
- CMyComPtr<ICryptoGetTextPassword> getTextPassword;
- CObjectVector<CMethodItem> methodItems;
-
-public:
- CZipDecoder():
- _zipCryptoDecoderSpec(0),
- _pkAesDecoderSpec(0),
- _wzAesDecoderSpec(0),
- filterStreamSpec(0) {}
-
- HRESULT Decode(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CInArchive &archive, const CItemEx &item,
- ISequentialOutStream *realOutStream,
- IArchiveExtractCallback *extractCallback,
- ICompressProgressInfo *compressProgress,
- UInt32 numThreads, Int32 &res);
-};
-
-HRESULT CZipDecoder::Decode(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CInArchive &archive, const CItemEx &item,
- ISequentialOutStream *realOutStream,
- IArchiveExtractCallback *extractCallback,
- ICompressProgressInfo *compressProgress,
- UInt32 numThreads, Int32 &res)
-{
- res = NExtract::NOperationResult::kDataError;
- CInStreamReleaser inStreamReleaser;
-
- bool needCRC = true;
- bool wzAesMode = false;
- bool pkAesMode = false;
- UInt16 methodId = item.CompressionMethod;
- if (item.IsEncrypted())
- {
- if (item.IsStrongEncrypted())
- {
- CStrongCryptoField f;
- if (item.CentralExtra.GetStrongCryptoField(f))
- {
- pkAesMode = true;
- }
- if (!pkAesMode)
- {
- res = NExtract::NOperationResult::kUnSupportedMethod;
- return S_OK;
- }
- }
- if (methodId == NFileHeader::NCompressionMethod::kWzAES)
- {
- CWzAesExtraField aesField;
- if (item.CentralExtra.GetWzAesField(aesField))
- {
- wzAesMode = true;
- needCRC = aesField.NeedCrc();
- }
- }
- }
-
- COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;
- CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;
- outStreamSpec->SetStream(realOutStream);
- outStreamSpec->Init(needCRC);
-
- UInt64 authenticationPos;
-
- CMyComPtr<ISequentialInStream> inStream;
- {
- UInt64 packSize = item.PackSize;
- if (wzAesMode)
- {
- if (packSize < NCrypto::NWzAes::kMacSize)
- return S_OK;
- packSize -= NCrypto::NWzAes::kMacSize;
- }
- UInt64 dataPos = item.GetDataPosition();
- inStream.Attach(archive.CreateLimitedStream(dataPos, packSize));
- authenticationPos = dataPos + packSize;
- }
-
- CMyComPtr<ICompressFilter> cryptoFilter;
- if (item.IsEncrypted())
- {
- if (wzAesMode)
- {
- CWzAesExtraField aesField;
- if (!item.CentralExtra.GetWzAesField(aesField))
- return S_OK;
- methodId = aesField.Method;
- if (!_wzAesDecoder)
- {
- _wzAesDecoderSpec = new NCrypto::NWzAes::CDecoder;
- _wzAesDecoder = _wzAesDecoderSpec;
- }
- cryptoFilter = _wzAesDecoder;
- Byte properties = aesField.Strength;
- RINOK(_wzAesDecoderSpec->SetDecoderProperties2(&properties, 1));
- }
- else if (pkAesMode)
- {
- if (!_pkAesDecoder)
- {
- _pkAesDecoderSpec = new NCrypto::NZipStrong::CDecoder;
- _pkAesDecoder = _pkAesDecoderSpec;
- }
- cryptoFilter = _pkAesDecoder;
- }
- else
- {
- if (!_zipCryptoDecoder)
- {
- _zipCryptoDecoderSpec = new NCrypto::NZip::CDecoder;
- _zipCryptoDecoder = _zipCryptoDecoderSpec;
- }
- cryptoFilter = _zipCryptoDecoder;
- }
- CMyComPtr<ICryptoSetPassword> cryptoSetPassword;
- RINOK(cryptoFilter.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword));
-
- if (!getTextPassword)
- extractCallback->QueryInterface(IID_ICryptoGetTextPassword, (void **)&getTextPassword);
-
- if (getTextPassword)
- {
- CMyComBSTR password;
- RINOK(getTextPassword->CryptoGetTextPassword(&password));
- AString charPassword;
- if (wzAesMode || pkAesMode)
- {
- charPassword = UnicodeStringToMultiByte((const wchar_t *)password, CP_ACP);
- /*
- for (int i = 0;; i++)
- {
- wchar_t c = password[i];
- if (c == 0)
- break;
- if (c >= 0x80)
- {
- res = NExtract::NOperationResult::kDataError;
- return S_OK;
- }
- charPassword += (char)c;
- }
- */
- }
- else
- {
- // we use OEM. WinZip/Windows probably use ANSI for some files
- charPassword = UnicodeStringToMultiByte((const wchar_t *)password, CP_OEMCP);
- }
- HRESULT result = cryptoSetPassword->CryptoSetPassword(
- (const Byte *)(const char *)charPassword, charPassword.Length());
- if (result != S_OK)
- return S_OK;
- }
- else
- {
- RINOK(cryptoSetPassword->CryptoSetPassword(0, 0));
- }
- }
-
- int m;
- for (m = 0; m < methodItems.Size(); m++)
- if (methodItems[m].ZipMethod == methodId)
- break;
-
- if (m == methodItems.Size())
- {
- CMethodItem mi;
- mi.ZipMethod = methodId;
- if (methodId == NFileHeader::NCompressionMethod::kStored)
- mi.Coder = new NCompress::CCopyCoder;
- else if (methodId == NFileHeader::NCompressionMethod::kShrunk)
- mi.Coder = new NCompress::NShrink::CDecoder;
- else if (methodId == NFileHeader::NCompressionMethod::kImploded)
- mi.Coder = new NCompress::NImplode::NDecoder::CCoder;
- else if (methodId == NFileHeader::NCompressionMethod::kLZMA)
- mi.Coder = new CLzmaDecoder;
- else if (methodId == NFileHeader::NCompressionMethod::kPPMd)
- mi.Coder = new NCompress::NPpmdZip::CDecoder(true);
- else
- {
- CMethodId szMethodID;
- if (methodId == NFileHeader::NCompressionMethod::kBZip2)
- szMethodID = kMethodId_BZip2;
- else
- {
- if (methodId > 0xFF)
- {
- res = NExtract::NOperationResult::kUnSupportedMethod;
- return S_OK;
- }
- szMethodID = kMethodId_ZipBase + (Byte)methodId;
- }
-
- RINOK(CreateCoder(EXTERNAL_CODECS_LOC_VARS szMethodID, mi.Coder, false));
-
- if (mi.Coder == 0)
- {
- res = NExtract::NOperationResult::kUnSupportedMethod;
- return S_OK;
- }
- }
- m = methodItems.Add(mi);
- }
- ICompressCoder *coder = methodItems[m].Coder;
-
- {
- CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;
- coder->QueryInterface(IID_ICompressSetDecoderProperties2, (void **)&setDecoderProperties);
- if (setDecoderProperties)
- {
- Byte properties = (Byte)item.Flags;
- RINOK(setDecoderProperties->SetDecoderProperties2(&properties, 1));
- }
- }
-
- #ifndef _7ZIP_ST
- {
- CMyComPtr<ICompressSetCoderMt> setCoderMt;
- coder->QueryInterface(IID_ICompressSetCoderMt, (void **)&setCoderMt);
- if (setCoderMt)
- {
- RINOK(setCoderMt->SetNumberOfThreads(numThreads));
- }
- }
- #endif
-
- {
- HRESULT result = S_OK;
- CMyComPtr<ISequentialInStream> inStreamNew;
- if (item.IsEncrypted())
- {
- if (!filterStream)
- {
- filterStreamSpec = new CFilterCoder;
- filterStream = filterStreamSpec;
- }
- filterStreamSpec->Filter = cryptoFilter;
- if (wzAesMode)
- {
- result = _wzAesDecoderSpec->ReadHeader(inStream);
- }
- else if (pkAesMode)
- {
- result =_pkAesDecoderSpec->ReadHeader(inStream, item.FileCRC, item.UnPackSize);
- if (result == S_OK)
- {
- bool passwOK;
- result = _pkAesDecoderSpec->CheckPassword(passwOK);
- if (result == S_OK && !passwOK)
- result = S_FALSE;
- }
- }
- else
- {
- result = _zipCryptoDecoderSpec->ReadHeader(inStream);
- }
-
- if (result == S_OK)
- {
- RINOK(filterStreamSpec->SetInStream(inStream));
- inStreamReleaser.FilterCoder = filterStreamSpec;
- inStreamNew = filterStream;
- if (wzAesMode)
- {
- if (!_wzAesDecoderSpec->CheckPasswordVerifyCode())
- result = S_FALSE;
- }
- }
- }
- else
- inStreamNew = inStream;
- if (result == S_OK)
- result = coder->Code(inStreamNew, outStream, NULL, &item.UnPackSize, compressProgress);
- if (result == S_FALSE)
- return S_OK;
- if (result == E_NOTIMPL)
- {
- res = NExtract::NOperationResult::kUnSupportedMethod;
- return S_OK;
- }
-
- RINOK(result);
- }
- bool crcOK = true;
- bool authOk = true;
- if (needCRC)
- crcOK = (outStreamSpec->GetCRC() == item.FileCRC);
- if (wzAesMode)
- {
- inStream.Attach(archive.CreateLimitedStream(authenticationPos, NCrypto::NWzAes::kMacSize));
- if (_wzAesDecoderSpec->CheckMac(inStream, authOk) != S_OK)
- authOk = false;
- }
-
- res = ((crcOK && authOk) ?
- NExtract::NOperationResult::kOK :
- NExtract::NOperationResult::kCRCError);
- return S_OK;
-}
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
- COM_TRY_BEGIN
- CZipDecoder myDecoder;
- UInt64 totalUnPacked = 0, totalPacked = 0;
- bool allFilesMode = (numItems == (UInt32)-1);
- if (allFilesMode)
- numItems = m_Items.Size();
- if(numItems == 0)
- return S_OK;
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- const CItemEx &item = m_Items[allFilesMode ? i : indices[i]];
- totalUnPacked += item.UnPackSize;
- totalPacked += item.PackSize;
- }
- RINOK(extractCallback->SetTotal(totalUnPacked));
-
- UInt64 currentTotalUnPacked = 0, currentTotalPacked = 0;
- UInt64 currentItemUnPacked, currentItemPacked;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- for (i = 0; i < numItems; i++, currentTotalUnPacked += currentItemUnPacked,
- currentTotalPacked += currentItemPacked)
- {
- currentItemUnPacked = 0;
- currentItemPacked = 0;
-
- lps->InSize = currentTotalPacked;
- lps->OutSize = currentTotalUnPacked;
- RINOK(lps->SetCur());
-
- CMyComPtr<ISequentialOutStream> realOutStream;
- Int32 askMode = testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract;
- Int32 index = allFilesMode ? i : indices[i];
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
- CItemEx item = m_Items[index];
- if (!item.FromLocal)
- {
- HRESULT res = m_Archive.ReadLocalItemAfterCdItem(item);
- if (res == S_FALSE)
- {
- if (item.IsDir() || realOutStream || testMode)
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
- }
- continue;
- }
- RINOK(res);
- }
-
- if (item.IsDir() || item.IgnoreItem())
- {
- // if (!testMode)
- {
- RINOK(extractCallback->PrepareOperation(askMode));
- realOutStream.Release();
- RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
- }
- continue;
- }
-
- currentItemUnPacked = item.UnPackSize;
- currentItemPacked = item.PackSize;
-
- if (!testMode && !realOutStream)
- continue;
-
- RINOK(extractCallback->PrepareOperation(askMode));
-
- Int32 res;
- RINOK(myDecoder.Decode(
- EXTERNAL_CODECS_VARS
- m_Archive, item, realOutStream, extractCallback,
- progress, _numThreads, res));
- realOutStream.Release();
-
- RINOK(extractCallback->SetOperationResult(res))
- }
- return S_OK;
- COM_TRY_END
-}
-
-IMPL_ISetCompressCodecsInfo
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandler.h
deleted file mode 100644
index fdb60aafe..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandler.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Zip/Handler.h
-
-#ifndef __ZIP_HANDLER_H
-#define __ZIP_HANDLER_H
-
-#include "Common/DynamicBuffer.h"
-#include "../../ICoder.h"
-#include "../IArchive.h"
-
-#include "../../Common/CreateCoder.h"
-
-#include "ZipIn.h"
-#include "ZipCompressionMode.h"
-
-#ifndef _7ZIP_ST
-#include "../../../Windows/System.h"
-#endif
-
-namespace NArchive {
-namespace NZip {
-
-class CHandler:
- public IInArchive,
- public IOutArchive,
- public ISetProperties,
- PUBLIC_ISetCompressCodecsInfo
- public CMyUnknownImp
-{
-public:
- MY_QUERYINTERFACE_BEGIN2(IInArchive)
- MY_QUERYINTERFACE_ENTRY(IOutArchive)
- MY_QUERYINTERFACE_ENTRY(ISetProperties)
- QUERY_ENTRY_ISetCompressCodecsInfo
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- INTERFACE_IInArchive(;)
- INTERFACE_IOutArchive(;)
-
- STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties);
-
- DECL_ISetCompressCodecsInfo
-
- CHandler();
-private:
- CObjectVector<CItemEx> m_Items;
- CInArchive m_Archive;
-
- int m_Level;
- int m_MainMethod;
- UInt32 m_DicSize;
- UInt32 m_Algo;
- UInt32 m_NumPasses;
- UInt32 m_NumFastBytes;
- UInt32 m_NumMatchFinderCycles;
- UInt32 m_MemSize;
- UInt32 m_Order;
-
- bool m_NumMatchFinderCyclesDefined;
-
- bool m_ForceAesMode;
- bool m_IsAesMode;
- Byte m_AesKeyMode;
-
- bool m_WriteNtfsTimeExtra;
- bool m_ForceLocal;
- bool m_ForceUtf8;
-
- #ifndef _7ZIP_ST
- UInt32 _numThreads;
- #endif
-
- DECL_EXTERNAL_CODECS_VARS
-
- void InitMethodProperties()
- {
- m_Level = -1;
- m_MainMethod = -1;
- m_Algo =
- m_DicSize =
- m_NumPasses =
- m_NumFastBytes =
- m_Order =
- m_MemSize =
- m_NumMatchFinderCycles = 0xFFFFFFFF;
- m_NumMatchFinderCyclesDefined = false;
- m_ForceAesMode = false;
- m_IsAesMode = false;
- m_AesKeyMode = 3; // aes-256
- m_WriteNtfsTimeExtra = true;
- m_ForceLocal = false;
- m_ForceUtf8 = false;
- #ifndef _7ZIP_ST
- _numThreads = NWindows::NSystem::GetNumberOfProcessors();;
- #endif
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp
deleted file mode 100644
index a5e0f59d7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp
+++ /dev/null
@@ -1,531 +0,0 @@
-// ZipHandlerOut.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/StringConvert.h"
-#include "Common/StringToInt.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/Time.h"
-
-#include "../../IPassword.h"
-
-#include "../../Common/OutBuffer.h"
-
-#include "../../Crypto/WzAes.h"
-
-#include "../Common/ItemNameUtils.h"
-#include "../Common/ParseProperties.h"
-
-#include "ZipHandler.h"
-#include "ZipUpdate.h"
-
-using namespace NWindows;
-using namespace NCOM;
-using namespace NTime;
-
-namespace NArchive {
-namespace NZip {
-
-static const UInt32 kLzAlgoX1 = 0;
-static const UInt32 kLzAlgoX5 = 1;
-
-static const UInt32 kDeflateNumPassesX1 = 1;
-static const UInt32 kDeflateNumPassesX7 = 3;
-static const UInt32 kDeflateNumPassesX9 = 10;
-
-static const UInt32 kDeflateNumFastBytesX1 = 32;
-static const UInt32 kDeflateNumFastBytesX7 = 64;
-static const UInt32 kDeflateNumFastBytesX9 = 128;
-
-static const wchar_t *kLzmaMatchFinderX1 = L"HC4";
-static const wchar_t *kLzmaMatchFinderX5 = L"BT4";
-
-static const UInt32 kLzmaNumFastBytesX1 = 32;
-static const UInt32 kLzmaNumFastBytesX7 = 64;
-
-static const UInt32 kLzmaDicSizeX1 = 1 << 16;
-static const UInt32 kLzmaDicSizeX3 = 1 << 20;
-static const UInt32 kLzmaDicSizeX5 = 1 << 24;
-static const UInt32 kLzmaDicSizeX7 = 1 << 25;
-static const UInt32 kLzmaDicSizeX9 = 1 << 26;
-
-static const UInt32 kBZip2NumPassesX1 = 1;
-static const UInt32 kBZip2NumPassesX7 = 2;
-static const UInt32 kBZip2NumPassesX9 = 7;
-
-static const UInt32 kBZip2DicSizeX1 = 100000;
-static const UInt32 kBZip2DicSizeX3 = 500000;
-static const UInt32 kBZip2DicSizeX5 = 900000;
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *timeType)
-{
- *timeType = NFileTimeType::kDOS;
- return S_OK;
-}
-
-static bool IsAsciiString(const UString &s)
-{
- for (int i = 0; i < s.Length(); i++)
- {
- wchar_t c = s[i];
- if (c < 0x20 || c > 0x7F)
- return false;
- }
- return true;
-}
-
-#define COM_TRY_BEGIN2 try {
-#define COM_TRY_END2 } \
-catch(const CSystemException &e) { return e.ErrorCode; } \
-catch(...) { return E_OUTOFMEMORY; }
-
-static HRESULT GetTime(IArchiveUpdateCallback *callback, int index, PROPID propID, FILETIME &filetime)
-{
- filetime.dwHighDateTime = filetime.dwLowDateTime = 0;
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(index, propID, &prop));
- if (prop.vt == VT_FILETIME)
- filetime = prop.filetime;
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *callback)
-{
- COM_TRY_BEGIN2
- CObjectVector<CUpdateItem> updateItems;
- bool thereAreAesUpdates = false;
- for (UInt32 i = 0; i < numItems; i++)
- {
- CUpdateItem ui;
- Int32 newData;
- Int32 newProperties;
- UInt32 indexInArchive;
- if (!callback)
- return E_FAIL;
- RINOK(callback->GetUpdateItemInfo(i, &newData, &newProperties, &indexInArchive));
- ui.NewProperties = IntToBool(newProperties);
- ui.NewData = IntToBool(newData);
- ui.IndexInArchive = indexInArchive;
- ui.IndexInClient = i;
- bool existInArchive = (indexInArchive != (UInt32)-1);
- if (existInArchive && newData)
- if (m_Items[indexInArchive].IsAesEncrypted())
- thereAreAesUpdates = true;
-
- if (IntToBool(newProperties))
- {
- UString name;
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidAttrib, &prop));
- if (prop.vt == VT_EMPTY)
- ui.Attributes = 0;
- else if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- else
- ui.Attributes = prop.ulVal;
- }
-
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidPath, &prop));
- if (prop.vt == VT_EMPTY)
- name.Empty();
- else if (prop.vt != VT_BSTR)
- return E_INVALIDARG;
- else
- name = prop.bstrVal;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidIsDir, &prop));
- if (prop.vt == VT_EMPTY)
- ui.IsDir = false;
- else if (prop.vt != VT_BOOL)
- return E_INVALIDARG;
- else
- ui.IsDir = (prop.boolVal != VARIANT_FALSE);
- }
-
- {
- CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidTimeType, &prop));
- if (prop.vt == VT_UI4)
- ui.NtfsTimeIsDefined = (prop.ulVal == NFileTimeType::kWindows);
- else
- ui.NtfsTimeIsDefined = m_WriteNtfsTimeExtra;
- }
- RINOK(GetTime(callback, i, kpidMTime, ui.NtfsMTime));
- RINOK(GetTime(callback, i, kpidATime, ui.NtfsATime));
- RINOK(GetTime(callback, i, kpidCTime, ui.NtfsCTime));
-
- {
- FILETIME localFileTime = { 0, 0 };
- if (ui.NtfsMTime.dwHighDateTime != 0 ||
- ui.NtfsMTime.dwLowDateTime != 0)
- if (!FileTimeToLocalFileTime(&ui.NtfsMTime, &localFileTime))
- return E_INVALIDARG;
- FileTimeToDosTime(localFileTime, ui.Time);
- }
-
- name = NItemName::MakeLegalName(name);
- bool needSlash = ui.IsDir;
- const wchar_t kSlash = L'/';
- if (!name.IsEmpty())
- {
- if (name[name.Length() - 1] == kSlash)
- {
- if (!ui.IsDir)
- return E_INVALIDARG;
- needSlash = false;
- }
- }
- if (needSlash)
- name += kSlash;
-
- bool tryUtf8 = true;
- if (m_ForceLocal || !m_ForceUtf8)
- {
- bool defaultCharWasUsed;
- ui.Name = UnicodeStringToMultiByte(name, CP_OEMCP, '_', defaultCharWasUsed);
- tryUtf8 = (!m_ForceLocal && (defaultCharWasUsed ||
- MultiByteToUnicodeString(ui.Name, CP_OEMCP) != name));
- }
-
- if (tryUtf8)
- {
- int i;
- for (i = 0; i < name.Length() && (unsigned)name[i] < 0x80; i++);
- ui.IsUtf8 = (i != name.Length());
- if (!ConvertUnicodeToUTF8(name, ui.Name))
- return E_INVALIDARG;
- }
-
- if (ui.Name.Length() >= (1 << 16))
- return E_INVALIDARG;
-
- ui.IndexInClient = i;
- /*
- if (existInArchive)
- {
- const CItemEx &itemInfo = m_Items[indexInArchive];
- // ui.Commented = itemInfo.IsCommented();
- ui.Commented = false;
- if (ui.Commented)
- {
- ui.CommentRange.Position = itemInfo.GetCommentPosition();
- ui.CommentRange.Size = itemInfo.CommentSize;
- }
- }
- else
- ui.Commented = false;
- */
- }
- if (IntToBool(newData))
- {
- UInt64 size;
- {
- NCOM::CPropVariant prop;
- RINOK(callback->GetProperty(i, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- size = prop.uhVal.QuadPart;
- }
- ui.Size = size;
- }
- updateItems.Add(ui);
- }
-
- CMyComPtr<ICryptoGetTextPassword2> getTextPassword;
- {
- CMyComPtr<IArchiveUpdateCallback> udateCallBack2(callback);
- udateCallBack2.QueryInterface(IID_ICryptoGetTextPassword2, &getTextPassword);
- }
- CCompressionMethodMode options;
-
- if (getTextPassword)
- {
- CMyComBSTR password;
- Int32 passwordIsDefined;
- RINOK(getTextPassword->CryptoGetTextPassword2(&passwordIsDefined, &password));
- options.PasswordIsDefined = IntToBool(passwordIsDefined);
- if (options.PasswordIsDefined)
- {
- options.IsAesMode = (m_ForceAesMode ? m_IsAesMode : thereAreAesUpdates);
- options.AesKeyMode = m_AesKeyMode;
-
- if (!IsAsciiString((const wchar_t *)password))
- return E_INVALIDARG;
- if (options.IsAesMode)
- {
- if (options.Password.Length() > NCrypto::NWzAes::kPasswordSizeMax)
- return E_INVALIDARG;
- }
- options.Password = UnicodeStringToMultiByte((const wchar_t *)password, CP_OEMCP);
- }
- }
- else
- options.PasswordIsDefined = false;
-
- int level = m_Level;
- if (level < 0)
- level = 5;
-
- Byte mainMethod;
- if (m_MainMethod < 0)
- mainMethod = (Byte)(((level == 0) ?
- NFileHeader::NCompressionMethod::kStored :
- NFileHeader::NCompressionMethod::kDeflated));
- else
- mainMethod = (Byte)m_MainMethod;
- options.MethodSequence.Add(mainMethod);
- if (mainMethod != NFileHeader::NCompressionMethod::kStored)
- options.MethodSequence.Add(NFileHeader::NCompressionMethod::kStored);
- bool isDeflate = (mainMethod == NFileHeader::NCompressionMethod::kDeflated) ||
- (mainMethod == NFileHeader::NCompressionMethod::kDeflated64);
- bool isLZMA = (mainMethod == NFileHeader::NCompressionMethod::kLZMA);
- bool isLz = (isLZMA || isDeflate);
- options.NumPasses = m_NumPasses;
- options.DicSize = m_DicSize;
- options.NumFastBytes = m_NumFastBytes;
- options.NumMatchFinderCycles = m_NumMatchFinderCycles;
- options.NumMatchFinderCyclesDefined = m_NumMatchFinderCyclesDefined;
- options.Algo = m_Algo;
- options.MemSize = m_MemSize;
- options.Order = m_Order;
- #ifndef _7ZIP_ST
- options.NumThreads = _numThreads;
- #endif
- if (isLz)
- {
- if (isDeflate)
- {
- if (options.NumPasses == 0xFFFFFFFF)
- options.NumPasses = (level >= 9 ? kDeflateNumPassesX9 :
- (level >= 7 ? kDeflateNumPassesX7 :
- kDeflateNumPassesX1));
- if (options.NumFastBytes == 0xFFFFFFFF)
- options.NumFastBytes = (level >= 9 ? kDeflateNumFastBytesX9 :
- (level >= 7 ? kDeflateNumFastBytesX7 :
- kDeflateNumFastBytesX1));
- }
- else if (isLZMA)
- {
- if (options.DicSize == 0xFFFFFFFF)
- options.DicSize =
- (level >= 9 ? kLzmaDicSizeX9 :
- (level >= 7 ? kLzmaDicSizeX7 :
- (level >= 5 ? kLzmaDicSizeX5 :
- (level >= 3 ? kLzmaDicSizeX3 :
- kLzmaDicSizeX1))));
-
- if (options.NumFastBytes == 0xFFFFFFFF)
- options.NumFastBytes = (level >= 7 ? kLzmaNumFastBytesX7 :
- kLzmaNumFastBytesX1);
-
- options.MatchFinder =
- (level >= 5 ? kLzmaMatchFinderX5 :
- kLzmaMatchFinderX1);
- }
-
- if (options.Algo == 0xFFFFFFFF)
- options.Algo = (level >= 5 ? kLzAlgoX5 :
- kLzAlgoX1);
- }
- if (mainMethod == NFileHeader::NCompressionMethod::kBZip2)
- {
- if (options.NumPasses == 0xFFFFFFFF)
- options.NumPasses = (level >= 9 ? kBZip2NumPassesX9 :
- (level >= 7 ? kBZip2NumPassesX7 :
- kBZip2NumPassesX1));
- if (options.DicSize == 0xFFFFFFFF)
- options.DicSize = (level >= 5 ? kBZip2DicSizeX5 :
- (level >= 3 ? kBZip2DicSizeX3 :
- kBZip2DicSizeX1));
- }
- if (mainMethod == NFileHeader::NCompressionMethod::kPPMd)
- {
- int level2 = level;
- if (level2 < 1) level2 = 1;
- if (level2 > 9) level2 = 9;
-
- if (options.MemSize == 0xFFFFFFFF)
- options.MemSize = (1 << (19 + (level2 > 8 ? 8 : level2)));
-
- if (options.Order == 0xFFFFFFFF)
- options.Order = 3 + level2;
-
- if (options.Algo == 0xFFFFFFFF)
- options.Algo = (level2 >= 7 ? 1 : 0);
- }
-
- return Update(
- EXTERNAL_CODECS_VARS
- m_Items, updateItems, outStream,
- m_Archive.IsOpen() ? &m_Archive : NULL, &options, callback);
- COM_TRY_END2
-}
-
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties)
-{
- #ifndef _7ZIP_ST
- const UInt32 numProcessors = NSystem::GetNumberOfProcessors();
- _numThreads = numProcessors;
- #endif
- InitMethodProperties();
- for (int i = 0; i < numProperties; i++)
- {
- UString name = UString(names[i]);
- name.MakeUpper();
- if (name.IsEmpty())
- return E_INVALIDARG;
-
- const PROPVARIANT &prop = values[i];
-
- if (name[0] == L'X')
- {
- UInt32 level = 9;
- RINOK(ParsePropValue(name.Mid(1), prop, level));
- m_Level = level;
- continue;
- }
- else if (name == L"M")
- {
- if (prop.vt == VT_BSTR)
- {
- UString m = prop.bstrVal;
- m.MakeUpper();
- if (m == L"COPY") m_MainMethod = NFileHeader::NCompressionMethod::kStored;
- else if (m == L"DEFLATE") m_MainMethod = NFileHeader::NCompressionMethod::kDeflated;
- else if (m == L"DEFLATE64") m_MainMethod = NFileHeader::NCompressionMethod::kDeflated64;
- else if (m == L"BZIP2") m_MainMethod = NFileHeader::NCompressionMethod::kBZip2;
- else if (m == L"LZMA") m_MainMethod = NFileHeader::NCompressionMethod::kLZMA;
- else if (m == L"PPMD") m_MainMethod = NFileHeader::NCompressionMethod::kPPMd;
- else return E_INVALIDARG;
- }
- else if (prop.vt == VT_UI4)
- {
- switch(prop.ulVal)
- {
- case NFileHeader::NCompressionMethod::kStored:
- case NFileHeader::NCompressionMethod::kDeflated:
- case NFileHeader::NCompressionMethod::kDeflated64:
- case NFileHeader::NCompressionMethod::kBZip2:
- case NFileHeader::NCompressionMethod::kLZMA:
- m_MainMethod = (Byte)prop.ulVal;
- break;
- default:
- return E_INVALIDARG;
- }
- }
- else
- return E_INVALIDARG;
- }
- else if (name.Left(2) == L"EM")
- {
- if (prop.vt == VT_BSTR)
- {
- UString valueString = prop.bstrVal;
- valueString.MakeUpper();
- if (valueString.Left(3) == L"AES")
- {
- valueString = valueString.Mid(3);
- if (valueString == L"128")
- m_AesKeyMode = 1;
- else if (valueString == L"192")
- m_AesKeyMode = 2;
- else if (valueString == L"256" || valueString.IsEmpty())
- m_AesKeyMode = 3;
- else
- return E_INVALIDARG;
- m_IsAesMode = true;
- m_ForceAesMode = true;
- }
- else if (valueString == L"ZIPCRYPTO")
- {
- m_IsAesMode = false;
- m_ForceAesMode = true;
- }
- else
- return E_INVALIDARG;
- }
- else
- return E_INVALIDARG;
- }
- else if (name[0] == L'D')
- {
- UInt32 dicSize = kBZip2DicSizeX5;
- RINOK(ParsePropDictionaryValue(name.Mid(1), prop, dicSize));
- m_DicSize = dicSize;
- }
- else if (name.Left(3) == L"MEM")
- {
- UInt32 memSize = 1 << 24;
- RINOK(ParsePropDictionaryValue(name.Mid(3), prop, memSize));
- m_MemSize = memSize;
- }
- else if (name[0] == L'O')
- {
- UInt32 order = 8;
- RINOK(ParsePropValue(name.Mid(1), prop, order));
- m_Order = order;
- }
- else if (name.Left(4) == L"PASS")
- {
- UInt32 num = kDeflateNumPassesX9;
- RINOK(ParsePropValue(name.Mid(4), prop, num));
- m_NumPasses = num;
- }
- else if (name.Left(2) == L"FB")
- {
- UInt32 num = kDeflateNumFastBytesX9;
- RINOK(ParsePropValue(name.Mid(2), prop, num));
- m_NumFastBytes = num;
- }
- else if (name.Left(2) == L"MC")
- {
- UInt32 num = 0xFFFFFFFF;
- RINOK(ParsePropValue(name.Mid(2), prop, num));
- m_NumMatchFinderCycles = num;
- m_NumMatchFinderCyclesDefined = true;
- }
- else if (name.Left(2) == L"MT")
- {
- #ifndef _7ZIP_ST
- RINOK(ParseMtProp(name.Mid(2), prop, numProcessors, _numThreads));
- #endif
- }
- else if (name.Left(1) == L"A")
- {
- UInt32 num = kLzAlgoX5;
- RINOK(ParsePropValue(name.Mid(1), prop, num));
- m_Algo = num;
- }
- else if (name.CompareNoCase(L"TC") == 0)
- {
- RINOK(SetBoolProperty(m_WriteNtfsTimeExtra, prop));
- }
- else if (name.CompareNoCase(L"CL") == 0)
- {
- RINOK(SetBoolProperty(m_ForceLocal, prop));
- if (m_ForceLocal)
- m_ForceUtf8 = false;
- }
- else if (name.CompareNoCase(L"CU") == 0)
- {
- RINOK(SetBoolProperty(m_ForceUtf8, prop));
- if (m_ForceUtf8)
- m_ForceLocal = false;
- }
- else
- return E_INVALIDARG;
- }
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHeader.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHeader.cpp
deleted file mode 100644
index 582187b51..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHeader.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-// Archive/Zip/Header.h
-
-#include "StdAfx.h"
-
-#include "ZipHeader.h"
-
-namespace NArchive {
-namespace NZip {
-
-namespace NSignature
-{
- UInt32 kLocalFileHeader = 0x04034B50 + 1;
- UInt32 kDataDescriptor = 0x08074B50 + 1;
- UInt32 kCentralFileHeader = 0x02014B50 + 1;
- UInt32 kEndOfCentralDir = 0x06054B50 + 1;
- UInt32 kZip64EndOfCentralDir = 0x06064B50 + 1;
- UInt32 kZip64EndOfCentralDirLocator = 0x07064B50 + 1;
-
- class CMarkersInitializer
- {
- public:
- CMarkersInitializer()
- {
- kLocalFileHeader--;
- kDataDescriptor--;
- kCentralFileHeader--;
- kEndOfCentralDir--;
- kZip64EndOfCentralDir--;
- kZip64EndOfCentralDirLocator--;
- }
- };
- static CMarkersInitializer g_MarkerInitializer;
-}
-
-}}
-
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHeader.h b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHeader.h
deleted file mode 100644
index ce8c1e4f7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipHeader.h
+++ /dev/null
@@ -1,284 +0,0 @@
-// Archive/Zip/Header.h
-
-#ifndef __ARCHIVE_ZIP_HEADER_H
-#define __ARCHIVE_ZIP_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NZip {
-
-namespace NSignature
-{
- extern UInt32 kLocalFileHeader;
- extern UInt32 kDataDescriptor;
- extern UInt32 kCentralFileHeader;
- extern UInt32 kEndOfCentralDir;
- extern UInt32 kZip64EndOfCentralDir;
- extern UInt32 kZip64EndOfCentralDirLocator;
-
- static const UInt32 kMarkerSize = 4;
-}
-
-const UInt32 kEcdSize = 22;
-const UInt32 kZip64EcdSize = 44;
-const UInt32 kZip64EcdLocatorSize = 20;
-/*
-struct CEndOfCentralDirectoryRecord
-{
- UInt16 ThisDiskNumber;
- UInt16 StartCentralDirectoryDiskNumber;
- UInt16 NumEntriesInCentaralDirectoryOnThisDisk;
- UInt16 NumEntriesInCentaralDirectory;
- UInt32 CentralDirectorySize;
- UInt32 CentralDirectoryStartOffset;
- UInt16 CommentSize;
-};
-
-struct CEndOfCentralDirectoryRecordFull
-{
- UInt32 Signature;
- CEndOfCentralDirectoryRecord Header;
-};
-*/
-
-namespace NFileHeader
-{
- /*
- struct CVersion
- {
- Byte Version;
- Byte HostOS;
- };
- */
-
- namespace NCompressionMethod
- {
- enum EType
- {
- kStored = 0,
- kShrunk = 1,
- kReduced1 = 2,
- kReduced2 = 3,
- kReduced3 = 4,
- kReduced4 = 5,
- kImploded = 6,
- kReservedTokenizing = 7, // reserved for tokenizing
- kDeflated = 8,
- kDeflated64 = 9,
- kPKImploding = 10,
-
- kBZip2 = 12,
- kLZMA = 14,
- kTerse = 18,
- kLz77 = 19,
- kJpeg = 0x60,
- kWavPack = 0x61,
- kPPMd = 0x62,
- kWzAES = 0x63
- };
- const int kNumCompressionMethods = 11;
- const Byte kMadeByProgramVersion = 63;
-
- const Byte kExtractVersion_Default = 10;
- const Byte kExtractVersion_Dir = 20;
- const Byte kExtractVersion_ZipCrypto = 20;
- const Byte kExtractVersion_Deflate = 20;
- const Byte kExtractVersion_Deflate64 = 21;
- const Byte kExtractVersion_Zip64 = 45;
- const Byte kExtractVersion_BZip2 = 46;
- const Byte kExtractVersion_Aes = 51;
- const Byte kExtractVersion_LZMA = 63;
- const Byte kExtractVersion_PPMd = 63;
-
- // const Byte kSupportedVersion = 20;
- }
-
- namespace NExtraID
- {
- enum
- {
- kZip64 = 0x01,
- kNTFS = 0x0A,
- kStrongEncrypt = 0x17,
- kUnixTime = 0x5455,
- kWzAES = 0x9901
- };
- }
-
- namespace NNtfsExtra
- {
- const UInt16 kTagTime = 1;
- enum
- {
- kMTime = 0,
- kATime,
- kCTime
- };
- }
-
- namespace NUnixTime
- {
- enum
- {
- kMTime = 0,
- kATime,
- kCTime
- };
- }
-
- const UInt32 kLocalBlockSize = 26;
- /*
- struct CLocalBlock
- {
- CVersion ExtractVersion;
-
- UInt16 Flags;
- UInt16 CompressionMethod;
- UInt32 Time;
- UInt32 FileCRC;
- UInt32 PackSize;
- UInt32 UnPackSize;
- UInt16 NameSize;
- UInt16 ExtraSize;
- };
- */
-
- const UInt32 kDataDescriptorSize = 16;
- // const UInt32 kDataDescriptor64Size = 16 + 8;
- /*
- struct CDataDescriptor
- {
- UInt32 Signature;
- UInt32 FileCRC;
- UInt32 PackSize;
- UInt32 UnPackSize;
- };
-
- struct CLocalBlockFull
- {
- UInt32 Signature;
- CLocalBlock Header;
- };
- */
-
- const UInt32 kCentralBlockSize = 42;
- /*
- struct CBlock
- {
- CVersion MadeByVersion;
- CVersion ExtractVersion;
- UInt16 Flags;
- UInt16 CompressionMethod;
- UInt32 Time;
- UInt32 FileCRC;
- UInt32 PackSize;
- UInt32 UnPackSize;
- UInt16 NameSize;
- UInt16 ExtraSize;
- UInt16 CommentSize;
- UInt16 DiskNumberStart;
- UInt16 InternalAttributes;
- UInt32 ExternalAttributes;
- UInt32 LocalHeaderOffset;
- };
-
- struct CBlockFull
- {
- UInt32 Signature;
- CBlock Header;
- };
- */
-
- namespace NFlags
- {
- const int kEncrypted = 1 << 0;
- const int kLzmaEOS = 1 << 1;
- const int kDescriptorUsedMask = 1 << 3;
- const int kStrongEncrypted = 1 << 6;
- const int kUtf8 = 1 << 11;
-
- const int kImplodeDictionarySizeMask = 1 << 1;
- const int kImplodeLiteralsOnMask = 1 << 2;
-
- const int kDeflateTypeBitStart = 1;
- const int kNumDeflateTypeBits = 2;
- const int kNumDeflateTypes = (1 << kNumDeflateTypeBits);
- const int kDeflateTypeMask = (1 << kNumDeflateTypeBits) - 1;
- }
-
- namespace NHostOS
- {
- enum EEnum
- {
- kFAT = 0,
- kAMIGA = 1,
- kVMS = 2, // VAX/VMS
- kUnix = 3,
- kVM_CMS = 4,
- kAtari = 5, // what if it's a minix filesystem? [cjh]
- kHPFS = 6, // filesystem used by OS/2 (and NT 3.x)
- kMac = 7,
- kZ_System = 8,
- kCPM = 9,
- kTOPS20 = 10, // pkzip 2.50 NTFS
- kNTFS = 11, // filesystem used by Windows NT
- kQDOS = 12, // SMS/QDOS
- kAcorn = 13, // Archimedes Acorn RISC OS
- kVFAT = 14, // filesystem used by Windows 95, NT
- kMVS = 15,
- kBeOS = 16, // hybrid POSIX/database filesystem
- kTandem = 17,
- kOS400 = 18,
- kOSX = 19
- };
- }
- namespace NUnixAttribute
- {
- const UInt32 kIFMT = 0170000; /* Unix file type mask */
-
- const UInt32 kIFDIR = 0040000; /* Unix directory */
- const UInt32 kIFREG = 0100000; /* Unix regular file */
- const UInt32 kIFSOCK = 0140000; /* Unix socket (BSD, not SysV or Amiga) */
- const UInt32 kIFLNK = 0120000; /* Unix symbolic link (not SysV, Amiga) */
- const UInt32 kIFBLK = 0060000; /* Unix block special (not Amiga) */
- const UInt32 kIFCHR = 0020000; /* Unix character special (not Amiga) */
- const UInt32 kIFIFO = 0010000; /* Unix fifo (BCC, not MSC or Amiga) */
-
- const UInt32 kISUID = 04000; /* Unix set user id on execution */
- const UInt32 kISGID = 02000; /* Unix set group id on execution */
- const UInt32 kISVTX = 01000; /* Unix directory permissions control */
- const UInt32 kENFMT = kISGID; /* Unix record locking enforcement flag */
- const UInt32 kIRWXU = 00700; /* Unix read, write, execute: owner */
- const UInt32 kIRUSR = 00400; /* Unix read permission: owner */
- const UInt32 kIWUSR = 00200; /* Unix write permission: owner */
- const UInt32 kIXUSR = 00100; /* Unix execute permission: owner */
- const UInt32 kIRWXG = 00070; /* Unix read, write, execute: group */
- const UInt32 kIRGRP = 00040; /* Unix read permission: group */
- const UInt32 kIWGRP = 00020; /* Unix write permission: group */
- const UInt32 kIXGRP = 00010; /* Unix execute permission: group */
- const UInt32 kIRWXO = 00007; /* Unix read, write, execute: other */
- const UInt32 kIROTH = 00004; /* Unix read permission: other */
- const UInt32 kIWOTH = 00002; /* Unix write permission: other */
- const UInt32 kIXOTH = 00001; /* Unix execute permission: other */
- }
-
- namespace NAmigaAttribute
- {
- const UInt32 kIFMT = 06000; /* Amiga file type mask */
- const UInt32 kIFDIR = 04000; /* Amiga directory */
- const UInt32 kIFREG = 02000; /* Amiga regular file */
- const UInt32 kIHIDDEN = 00200; /* to be supported in AmigaDOS 3.x */
- const UInt32 kISCRIPT = 00100; /* executable script (text command file) */
- const UInt32 kIPURE = 00040; /* allow loading into resident memory */
- const UInt32 kIARCHIVE = 00020; /* not modified since bit was last set */
- const UInt32 kIREAD = 00010; /* can be opened for reading */
- const UInt32 kIWRITE = 00004; /* can be opened for writing */
- const UInt32 kIEXECUTE = 00002; /* executable image, a loadable runfile */
- const UInt32 kIDELETE = 00001; /* can be deleted */
- }
-}
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipIn.cpp
deleted file mode 100644
index b36b61be7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipIn.cpp
+++ /dev/null
@@ -1,893 +0,0 @@
-// Archive/ZipIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "Common/DynamicBuffer.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/StreamUtils.h"
-
-#include "ZipIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-namespace NArchive {
-namespace NZip {
-
-HRESULT CInArchive::Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit)
-{
- _inBufMode = false;
- Close();
- RINOK(stream->Seek(0, STREAM_SEEK_CUR, &m_StreamStartPosition));
- m_Position = m_StreamStartPosition;
- RINOK(FindAndReadMarker(stream, searchHeaderSizeLimit));
- RINOK(stream->Seek(m_Position, STREAM_SEEK_SET, NULL));
- m_Stream = stream;
- return S_OK;
-}
-
-void CInArchive::Close()
-{
- _inBuffer.ReleaseStream();
- m_Stream.Release();
-}
-
-HRESULT CInArchive::Seek(UInt64 offset)
-{
- return m_Stream->Seek(offset, STREAM_SEEK_SET, NULL);
-}
-
-//////////////////////////////////////
-// Markers
-
-static inline bool TestMarkerCandidate(const Byte *p, UInt32 &value)
-{
- value = Get32(p);
- return
- (value == NSignature::kLocalFileHeader) ||
- (value == NSignature::kEndOfCentralDir);
-}
-
-static const UInt32 kNumMarkerAddtionalBytes = 2;
-static inline bool TestMarkerCandidate2(const Byte *p, UInt32 &value)
-{
- value = Get32(p);
- if (value == NSignature::kEndOfCentralDir)
- return (Get16(p + 4) == 0);
- return (value == NSignature::kLocalFileHeader && p[4] < 128);
-}
-
-HRESULT CInArchive::FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit)
-{
- ArcInfo.Clear();
- m_Position = m_StreamStartPosition;
-
- Byte marker[NSignature::kMarkerSize];
- RINOK(ReadStream_FALSE(stream, marker, NSignature::kMarkerSize));
- m_Position += NSignature::kMarkerSize;
- if (TestMarkerCandidate(marker, m_Signature))
- return S_OK;
-
- CByteDynamicBuffer dynamicBuffer;
- const UInt32 kSearchMarkerBufferSize = 0x10000;
- dynamicBuffer.EnsureCapacity(kSearchMarkerBufferSize);
- Byte *buffer = dynamicBuffer;
- UInt32 numBytesPrev = NSignature::kMarkerSize - 1;
- memcpy(buffer, marker + 1, numBytesPrev);
- UInt64 curTestPos = m_StreamStartPosition + 1;
- for (;;)
- {
- if (searchHeaderSizeLimit != NULL)
- if (curTestPos - m_StreamStartPosition > *searchHeaderSizeLimit)
- break;
- size_t numReadBytes = kSearchMarkerBufferSize - numBytesPrev;
- RINOK(ReadStream(stream, buffer + numBytesPrev, &numReadBytes));
- m_Position += numReadBytes;
- UInt32 numBytesInBuffer = numBytesPrev + (UInt32)numReadBytes;
- const UInt32 kMarker2Size = NSignature::kMarkerSize + kNumMarkerAddtionalBytes;
- if (numBytesInBuffer < kMarker2Size)
- break;
- UInt32 numTests = numBytesInBuffer - kMarker2Size + 1;
- for (UInt32 pos = 0; pos < numTests; pos++)
- {
- if (buffer[pos] != 0x50)
- continue;
- if (TestMarkerCandidate2(buffer + pos, m_Signature))
- {
- curTestPos += pos;
- ArcInfo.StartPosition = curTestPos;
- m_Position = curTestPos + NSignature::kMarkerSize;
- return S_OK;
- }
- }
- curTestPos += numTests;
- numBytesPrev = numBytesInBuffer - numTests;
- memmove(buffer, buffer + numTests, numBytesPrev);
- }
- return S_FALSE;
-}
-
-HRESULT CInArchive::ReadBytes(void *data, UInt32 size, UInt32 *processedSize)
-{
- size_t realProcessedSize = size;
- HRESULT result = S_OK;
- if (_inBufMode)
- {
- try { realProcessedSize = _inBuffer.ReadBytes((Byte *)data, size); }
- catch (const CInBufferException &e) { return e.ErrorCode; }
- }
- else
- result = ReadStream(m_Stream, data, &realProcessedSize);
- if (processedSize != NULL)
- *processedSize = (UInt32)realProcessedSize;
- m_Position += realProcessedSize;
- return result;
-}
-
-void CInArchive::Skip(UInt64 num)
-{
- for (UInt64 i = 0; i < num; i++)
- ReadByte();
-}
-
-void CInArchive::IncreaseRealPosition(UInt64 addValue)
-{
- if (m_Stream->Seek(addValue, STREAM_SEEK_CUR, &m_Position) != S_OK)
- throw CInArchiveException(CInArchiveException::kSeekStreamError);
-}
-
-bool CInArchive::ReadBytesAndTestSize(void *data, UInt32 size)
-{
- UInt32 realProcessedSize;
- if (ReadBytes(data, size, &realProcessedSize) != S_OK)
- throw CInArchiveException(CInArchiveException::kReadStreamError);
- return (realProcessedSize == size);
-}
-
-void CInArchive::SafeReadBytes(void *data, UInt32 size)
-{
- if (!ReadBytesAndTestSize(data, size))
- throw CInArchiveException(CInArchiveException::kUnexpectedEndOfArchive);
-}
-
-void CInArchive::ReadBuffer(CByteBuffer &buffer, UInt32 size)
-{
- buffer.SetCapacity(size);
- if (size > 0)
- SafeReadBytes(buffer, size);
-}
-
-Byte CInArchive::ReadByte()
-{
- Byte b;
- SafeReadBytes(&b, 1);
- return b;
-}
-
-UInt16 CInArchive::ReadUInt16()
-{
- Byte buf[2];
- SafeReadBytes(buf, 2);
- return Get16(buf);
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
- Byte buf[4];
- SafeReadBytes(buf, 4);
- return Get32(buf);
-}
-
-UInt64 CInArchive::ReadUInt64()
-{
- Byte buf[8];
- SafeReadBytes(buf, 8);
- return Get64(buf);
-}
-
-bool CInArchive::ReadUInt32(UInt32 &value)
-{
- Byte buf[4];
- if (!ReadBytesAndTestSize(buf, 4))
- return false;
- value = Get32(buf);
- return true;
-}
-
-void CInArchive::ReadFileName(UInt32 nameSize, AString &dest)
-{
- if (nameSize == 0)
- dest.Empty();
- char *p = dest.GetBuffer((int)nameSize);
- SafeReadBytes(p, nameSize);
- p[nameSize] = 0;
- dest.ReleaseBuffer();
-}
-
-void CInArchive::ReadExtra(UInt32 extraSize, CExtraBlock &extraBlock,
- UInt64 &unpackSize, UInt64 &packSize, UInt64 &localHeaderOffset, UInt32 &diskStartNumber)
-{
- extraBlock.Clear();
- UInt32 remain = extraSize;
- while(remain >= 4)
- {
- CExtraSubBlock subBlock;
- subBlock.ID = ReadUInt16();
- UInt32 dataSize = ReadUInt16();
- remain -= 4;
- if (dataSize > remain) // it's bug
- dataSize = remain;
- if (subBlock.ID == NFileHeader::NExtraID::kZip64)
- {
- if (unpackSize == 0xFFFFFFFF)
- {
- if (dataSize < 8)
- break;
- unpackSize = ReadUInt64();
- remain -= 8;
- dataSize -= 8;
- }
- if (packSize == 0xFFFFFFFF)
- {
- if (dataSize < 8)
- break;
- packSize = ReadUInt64();
- remain -= 8;
- dataSize -= 8;
- }
- if (localHeaderOffset == 0xFFFFFFFF)
- {
- if (dataSize < 8)
- break;
- localHeaderOffset = ReadUInt64();
- remain -= 8;
- dataSize -= 8;
- }
- if (diskStartNumber == 0xFFFF)
- {
- if (dataSize < 4)
- break;
- diskStartNumber = ReadUInt32();
- remain -= 4;
- dataSize -= 4;
- }
- for (UInt32 i = 0; i < dataSize; i++)
- ReadByte();
- }
- else
- {
- ReadBuffer(subBlock.Data, dataSize);
- extraBlock.SubBlocks.Add(subBlock);
- }
- remain -= dataSize;
- }
- Skip(remain);
-}
-
-HRESULT CInArchive::ReadLocalItem(CItemEx &item)
-{
- const int kBufSize = 26;
- Byte p[kBufSize];
- SafeReadBytes(p, kBufSize);
-
- item.ExtractVersion.Version = p[0];
- item.ExtractVersion.HostOS = p[1];
- item.Flags = Get16(p + 2);
- item.CompressionMethod = Get16(p + 4);
- item.Time = Get32(p + 6);
- item.FileCRC = Get32(p + 10);
- item.PackSize = Get32(p + 14);
- item.UnPackSize = Get32(p + 18);
- UInt32 fileNameSize = Get16(p + 22);
- item.LocalExtraSize = Get16(p + 24);
- ReadFileName(fileNameSize, item.Name);
- item.FileHeaderWithNameSize = 4 + NFileHeader::kLocalBlockSize + fileNameSize;
- if (item.LocalExtraSize > 0)
- {
- UInt64 localHeaderOffset = 0;
- UInt32 diskStartNumber = 0;
- ReadExtra(item.LocalExtraSize, item.LocalExtra, item.UnPackSize, item.PackSize,
- localHeaderOffset, diskStartNumber);
- }
- /*
- if (item.IsDir())
- item.UnPackSize = 0; // check It
- */
- return S_OK;
-}
-
-static bool FlagsAreSame(CItem &i1, CItem &i2)
-{
- if (i1.CompressionMethod != i2.CompressionMethod)
- return false;
- // i1.Time
-
- if (i1.Flags == i2.Flags)
- return true;
- UInt32 mask = 0xFFFF;
- switch(i1.CompressionMethod)
- {
- case NFileHeader::NCompressionMethod::kDeflated:
- mask = 0x7FF9;
- break;
- default:
- if (i1.CompressionMethod <= NFileHeader::NCompressionMethod::kImploded)
- mask = 0x7FFF;
- }
- return ((i1.Flags & mask) == (i2.Flags & mask));
-}
-
-HRESULT CInArchive::ReadLocalItemAfterCdItem(CItemEx &item)
-{
- if (item.FromLocal)
- return S_OK;
- try
- {
- RINOK(Seek(ArcInfo.Base + item.LocalHeaderPosition));
- CItemEx localItem;
- if (ReadUInt32() != NSignature::kLocalFileHeader)
- return S_FALSE;
- RINOK(ReadLocalItem(localItem));
- if (!FlagsAreSame(item, localItem))
- return S_FALSE;
-
- if ((!localItem.HasDescriptor() &&
- (
- item.FileCRC != localItem.FileCRC ||
- item.PackSize != localItem.PackSize ||
- item.UnPackSize != localItem.UnPackSize
- )
- ) ||
- item.Name.Length() != localItem.Name.Length()
- )
- return S_FALSE;
- item.FileHeaderWithNameSize = localItem.FileHeaderWithNameSize;
- item.LocalExtraSize = localItem.LocalExtraSize;
- item.LocalExtra = localItem.LocalExtra;
- item.FromLocal = true;
- }
- catch(...) { return S_FALSE; }
- return S_OK;
-}
-
-HRESULT CInArchive::ReadLocalItemDescriptor(CItemEx &item)
-{
- if (item.HasDescriptor())
- {
- const int kBufferSize = (1 << 12);
- Byte buffer[kBufferSize];
-
- UInt32 numBytesInBuffer = 0;
- UInt32 packedSize = 0;
-
- bool descriptorWasFound = false;
- for (;;)
- {
- UInt32 processedSize;
- RINOK(ReadBytes(buffer + numBytesInBuffer, kBufferSize - numBytesInBuffer, &processedSize));
- numBytesInBuffer += processedSize;
- if (numBytesInBuffer < NFileHeader::kDataDescriptorSize)
- return S_FALSE;
- UInt32 i;
- for (i = 0; i <= numBytesInBuffer - NFileHeader::kDataDescriptorSize; i++)
- {
- // descriptorSignature field is Info-ZIP's extension
- // to Zip specification.
- UInt32 descriptorSignature = Get32(buffer + i);
-
- // !!!! It must be fixed for Zip64 archives
- UInt32 descriptorPackSize = Get32(buffer + i + 8);
- if (descriptorSignature== NSignature::kDataDescriptor && descriptorPackSize == packedSize + i)
- {
- descriptorWasFound = true;
- item.FileCRC = Get32(buffer + i + 4);
- item.PackSize = descriptorPackSize;
- item.UnPackSize = Get32(buffer + i + 12);
- IncreaseRealPosition(Int64(Int32(0 - (numBytesInBuffer - i - NFileHeader::kDataDescriptorSize))));
- break;
- }
- }
- if (descriptorWasFound)
- break;
- packedSize += i;
- int j;
- for (j = 0; i < numBytesInBuffer; i++, j++)
- buffer[j] = buffer[i];
- numBytesInBuffer = j;
- }
- }
- else
- IncreaseRealPosition(item.PackSize);
- return S_OK;
-}
-
-HRESULT CInArchive::ReadLocalItemAfterCdItemFull(CItemEx &item)
-{
- if (item.FromLocal)
- return S_OK;
- try
- {
- RINOK(ReadLocalItemAfterCdItem(item));
- if (item.HasDescriptor())
- {
- RINOK(Seek(ArcInfo.Base + item.GetDataPosition() + item.PackSize));
- if (ReadUInt32() != NSignature::kDataDescriptor)
- return S_FALSE;
- UInt32 crc = ReadUInt32();
- UInt64 packSize, unpackSize;
-
- /*
- if (IsZip64)
- {
- packSize = ReadUInt64();
- unpackSize = ReadUInt64();
- }
- else
- */
- {
- packSize = ReadUInt32();
- unpackSize = ReadUInt32();
- }
-
- if (crc != item.FileCRC || item.PackSize != packSize || item.UnPackSize != unpackSize)
- return S_FALSE;
- }
- }
- catch(...) { return S_FALSE; }
- return S_OK;
-}
-
-HRESULT CInArchive::ReadCdItem(CItemEx &item)
-{
- item.FromCentral = true;
- const int kBufSize = 42;
- Byte p[kBufSize];
- SafeReadBytes(p, kBufSize);
- item.MadeByVersion.Version = p[0];
- item.MadeByVersion.HostOS = p[1];
- item.ExtractVersion.Version = p[2];
- item.ExtractVersion.HostOS = p[3];
- item.Flags = Get16(p + 4);
- item.CompressionMethod = Get16(p + 6);
- item.Time = Get32(p + 8);
- item.FileCRC = Get32(p + 12);
- item.PackSize = Get32(p + 16);
- item.UnPackSize = Get32(p + 20);
- UInt16 headerNameSize = Get16(p + 24);
- UInt16 headerExtraSize = Get16(p + 26);
- UInt16 headerCommentSize = Get16(p + 28);
- UInt32 headerDiskNumberStart = Get16(p + 30);
- item.InternalAttributes = Get16(p + 32);
- item.ExternalAttributes = Get32(p + 34);
- item.LocalHeaderPosition = Get32(p + 38);
- ReadFileName(headerNameSize, item.Name);
-
- if (headerExtraSize > 0)
- {
- ReadExtra(headerExtraSize, item.CentralExtra, item.UnPackSize, item.PackSize,
- item.LocalHeaderPosition, headerDiskNumberStart);
- }
-
- if (headerDiskNumberStart != 0)
- throw CInArchiveException(CInArchiveException::kMultiVolumeArchiveAreNotSupported);
-
- // May be these strings must be deleted
- /*
- if (item.IsDir())
- item.UnPackSize = 0;
- */
-
- ReadBuffer(item.Comment, headerCommentSize);
- return S_OK;
-}
-
-HRESULT CInArchive::TryEcd64(UInt64 offset, CCdInfo &cdInfo)
-{
- RINOK(Seek(offset));
- const UInt32 kEcd64Size = 56;
- Byte buf[kEcd64Size];
- if (!ReadBytesAndTestSize(buf, kEcd64Size))
- return S_FALSE;
- if (Get32(buf) != NSignature::kZip64EndOfCentralDir)
- return S_FALSE;
- // cdInfo.NumEntries = Get64(buf + 24);
- cdInfo.Size = Get64(buf + 40);
- cdInfo.Offset = Get64(buf + 48);
- return S_OK;
-}
-
-HRESULT CInArchive::FindCd(CCdInfo &cdInfo)
-{
- UInt64 endPosition;
- RINOK(m_Stream->Seek(0, STREAM_SEEK_END, &endPosition));
- const UInt32 kBufSizeMax = (1 << 16) + kEcdSize + kZip64EcdLocatorSize;
- CByteBuffer byteBuffer;
- byteBuffer.SetCapacity(kBufSizeMax);
- Byte *buf = byteBuffer;
- UInt32 bufSize = (endPosition < kBufSizeMax) ? (UInt32)endPosition : kBufSizeMax;
- if (bufSize < kEcdSize)
- return S_FALSE;
- UInt64 startPosition = endPosition - bufSize;
- RINOK(m_Stream->Seek(startPosition, STREAM_SEEK_SET, &m_Position));
- if (m_Position != startPosition)
- return S_FALSE;
- if (!ReadBytesAndTestSize(buf, bufSize))
- return S_FALSE;
- for (int i = (int)(bufSize - kEcdSize); i >= 0; i--)
- {
- if (Get32(buf + i) == NSignature::kEndOfCentralDir)
- {
- if (i >= kZip64EcdLocatorSize)
- {
- const Byte *locator = buf + i - kZip64EcdLocatorSize;
- if (Get32(locator) == NSignature::kZip64EndOfCentralDirLocator)
- {
- UInt64 ecd64Offset = Get64(locator + 8);
- if (TryEcd64(ecd64Offset, cdInfo) == S_OK)
- return S_OK;
- if (TryEcd64(ArcInfo.StartPosition + ecd64Offset, cdInfo) == S_OK)
- {
- ArcInfo.Base = ArcInfo.StartPosition;
- return S_OK;
- }
- }
- }
- if (Get32(buf + i + 4) == 0)
- {
- // cdInfo.NumEntries = GetUInt16(buf + i + 10);
- cdInfo.Size = Get32(buf + i + 12);
- cdInfo.Offset = Get32(buf + i + 16);
- UInt64 curPos = endPosition - bufSize + i;
- UInt64 cdEnd = cdInfo.Size + cdInfo.Offset;
- if (curPos != cdEnd)
- {
- /*
- if (cdInfo.Offset <= 16 && cdInfo.Size != 0)
- {
- // here we support some rare ZIP files with Central directory at the start
- ArcInfo.Base = 0;
- }
- else
- */
- ArcInfo.Base = curPos - cdEnd;
- }
- return S_OK;
- }
- }
- }
- return S_FALSE;
-}
-
-HRESULT CInArchive::TryReadCd(CObjectVector<CItemEx> &items, UInt64 cdOffset, UInt64 cdSize, CProgressVirt *progress)
-{
- items.Clear();
- RINOK(m_Stream->Seek(cdOffset, STREAM_SEEK_SET, &m_Position));
- if (m_Position != cdOffset)
- return S_FALSE;
-
- if (!_inBuffer.Create(1 << 15))
- return E_OUTOFMEMORY;
- _inBuffer.SetStream(m_Stream);
- _inBuffer.Init();
- _inBufMode = true;
-
- while(m_Position - cdOffset < cdSize)
- {
- if (ReadUInt32() != NSignature::kCentralFileHeader)
- return S_FALSE;
- CItemEx cdItem;
- RINOK(ReadCdItem(cdItem));
- items.Add(cdItem);
- if (progress && items.Size() % 1000 == 0)
- RINOK(progress->SetCompleted(items.Size()));
- }
- return (m_Position - cdOffset == cdSize) ? S_OK : S_FALSE;
-}
-
-HRESULT CInArchive::ReadCd(CObjectVector<CItemEx> &items, UInt64 &cdOffset, UInt64 &cdSize, CProgressVirt *progress)
-{
- ArcInfo.Base = 0;
- CCdInfo cdInfo;
- RINOK(FindCd(cdInfo));
- HRESULT res = S_FALSE;
- cdSize = cdInfo.Size;
- cdOffset = cdInfo.Offset;
- res = TryReadCd(items, ArcInfo.Base + cdOffset, cdSize, progress);
- if (res == S_FALSE && ArcInfo.Base == 0)
- {
- res = TryReadCd(items, cdInfo.Offset + ArcInfo.StartPosition, cdSize, progress);
- if (res == S_OK)
- ArcInfo.Base = ArcInfo.StartPosition;
- }
- if (!ReadUInt32(m_Signature))
- return S_FALSE;
- return res;
-}
-
-HRESULT CInArchive::ReadLocalsAndCd(CObjectVector<CItemEx> &items, CProgressVirt *progress, UInt64 &cdOffset, int &numCdItems)
-{
- items.Clear();
- numCdItems = 0;
- while (m_Signature == NSignature::kLocalFileHeader)
- {
- // FSeek points to next byte after signature
- // NFileHeader::CLocalBlock localHeader;
- CItemEx item;
- item.LocalHeaderPosition = m_Position - m_StreamStartPosition - 4; // points to signature;
- RINOK(ReadLocalItem(item));
- item.FromLocal = true;
- ReadLocalItemDescriptor(item);
- items.Add(item);
- if (progress && items.Size() % 100 == 0)
- RINOK(progress->SetCompleted(items.Size()));
- if (!ReadUInt32(m_Signature))
- break;
- }
- cdOffset = m_Position - 4;
- int i;
- for (i = 0; i < items.Size(); i++, numCdItems++)
- {
- if (progress && i % 1000 == 0)
- RINOK(progress->SetCompleted(items.Size()));
- if (m_Signature == NSignature::kEndOfCentralDir)
- break;
-
- if (m_Signature != NSignature::kCentralFileHeader)
- return S_FALSE;
-
- CItemEx cdItem;
- RINOK(ReadCdItem(cdItem));
-
- if (i == 0)
- {
- int j;
- for (j = 0; j < items.Size(); j++)
- {
- CItemEx &item = items[j];
- if (item.Name == cdItem.Name)
- {
- ArcInfo.Base = item.LocalHeaderPosition - cdItem.LocalHeaderPosition;
- break;
- }
- }
- if (j == items.Size())
- return S_FALSE;
- }
-
- int index;
- int left = 0, right = items.Size();
- for (;;)
- {
- if (left >= right)
- return S_FALSE;
- index = (left + right) / 2;
- UInt64 position = items[index].LocalHeaderPosition - ArcInfo.Base;
- if (cdItem.LocalHeaderPosition == position)
- break;
- if (cdItem.LocalHeaderPosition < position)
- right = index;
- else
- left = index + 1;
- }
- CItemEx &item = items[index];
- // item.LocalHeaderPosition = cdItem.LocalHeaderPosition;
- item.MadeByVersion = cdItem.MadeByVersion;
- item.CentralExtra = cdItem.CentralExtra;
-
- if (
- // item.ExtractVersion != cdItem.ExtractVersion ||
- !FlagsAreSame(item, cdItem) ||
- item.FileCRC != cdItem.FileCRC)
- return S_FALSE;
-
- if (item.Name.Length() != cdItem.Name.Length() ||
- item.PackSize != cdItem.PackSize ||
- item.UnPackSize != cdItem.UnPackSize
- )
- return S_FALSE;
- item.Name = cdItem.Name;
- item.InternalAttributes = cdItem.InternalAttributes;
- item.ExternalAttributes = cdItem.ExternalAttributes;
- item.Comment = cdItem.Comment;
- item.FromCentral = cdItem.FromCentral;
- if (!ReadUInt32(m_Signature))
- return S_FALSE;
- }
- for (i = 0; i < items.Size(); i++)
- items[i].LocalHeaderPosition -= ArcInfo.Base;
- return S_OK;
-}
-
-struct CEcd
-{
- UInt16 thisDiskNumber;
- UInt16 startCDDiskNumber;
- UInt16 numEntriesInCDOnThisDisk;
- UInt16 numEntriesInCD;
- UInt32 cdSize;
- UInt32 cdStartOffset;
- UInt16 commentSize;
- void Parse(const Byte *p);
-};
-
-void CEcd::Parse(const Byte *p)
-{
- thisDiskNumber = Get16(p);
- startCDDiskNumber = Get16(p + 2);
- numEntriesInCDOnThisDisk = Get16(p + 4);
- numEntriesInCD = Get16(p + 6);
- cdSize = Get32(p + 8);
- cdStartOffset = Get32(p + 12);
- commentSize = Get16(p + 16);
-}
-
-struct CEcd64
-{
- UInt16 versionMade;
- UInt16 versionNeedExtract;
- UInt32 thisDiskNumber;
- UInt32 startCDDiskNumber;
- UInt64 numEntriesInCDOnThisDisk;
- UInt64 numEntriesInCD;
- UInt64 cdSize;
- UInt64 cdStartOffset;
- void Parse(const Byte *p);
- CEcd64() { memset(this, 0, sizeof(*this)); }
-};
-
-void CEcd64::Parse(const Byte *p)
-{
- versionMade = Get16(p);
- versionNeedExtract = Get16(p + 2);
- thisDiskNumber = Get32(p + 4);
- startCDDiskNumber = Get32(p + 8);
- numEntriesInCDOnThisDisk = Get64(p + 12);
- numEntriesInCD = Get64(p + 20);
- cdSize = Get64(p + 28);
- cdStartOffset = Get64(p + 36);
-}
-
-#define COPY_ECD_ITEM_16(n) if (!isZip64 || ecd. n != 0xFFFF) ecd64. n = ecd. n;
-#define COPY_ECD_ITEM_32(n) if (!isZip64 || ecd. n != 0xFFFFFFFF) ecd64. n = ecd. n;
-
-HRESULT CInArchive::ReadHeaders(CObjectVector<CItemEx> &items, CProgressVirt *progress)
-{
- // m_Signature must be kLocalFileHeaderSignature or
- // kEndOfCentralDirSignature
- // m_Position points to next byte after signature
-
- IsZip64 = false;
- items.Clear();
-
- UInt64 cdSize, cdStartOffset;
- HRESULT res;
- try
- {
- res = ReadCd(items, cdStartOffset, cdSize, progress);
- }
- catch(CInArchiveException &)
- {
- res = S_FALSE;
- }
- if (res != S_FALSE && res != S_OK)
- return res;
-
- /*
- if (res != S_OK)
- return res;
- res = S_FALSE;
- */
-
- int numCdItems = items.Size();
- if (res == S_FALSE)
- {
- _inBufMode = false;
- ArcInfo.Base = 0;
- RINOK(m_Stream->Seek(ArcInfo.StartPosition, STREAM_SEEK_SET, &m_Position));
- if (m_Position != ArcInfo.StartPosition)
- return S_FALSE;
- if (!ReadUInt32(m_Signature))
- return S_FALSE;
- RINOK(ReadLocalsAndCd(items, progress, cdStartOffset, numCdItems));
- cdSize = (m_Position - 4) - cdStartOffset;
- cdStartOffset -= ArcInfo.Base;
- }
-
- CEcd64 ecd64;
- bool isZip64 = false;
- UInt64 zip64EcdStartOffset = m_Position - 4 - ArcInfo.Base;
- if (m_Signature == NSignature::kZip64EndOfCentralDir)
- {
- IsZip64 = isZip64 = true;
- UInt64 recordSize = ReadUInt64();
-
- const int kBufSize = kZip64EcdSize;
- Byte buf[kBufSize];
- SafeReadBytes(buf, kBufSize);
- ecd64.Parse(buf);
-
- Skip(recordSize - kZip64EcdSize);
- if (!ReadUInt32(m_Signature))
- return S_FALSE;
- if (ecd64.thisDiskNumber != 0 || ecd64.startCDDiskNumber != 0)
- throw CInArchiveException(CInArchiveException::kMultiVolumeArchiveAreNotSupported);
- if (ecd64.numEntriesInCDOnThisDisk != numCdItems ||
- ecd64.numEntriesInCD != numCdItems ||
- ecd64.cdSize != cdSize ||
- (ecd64.cdStartOffset != cdStartOffset &&
- (!items.IsEmpty())))
- return S_FALSE;
- }
- if (m_Signature == NSignature::kZip64EndOfCentralDirLocator)
- {
- /* UInt32 startEndCDDiskNumber = */ ReadUInt32();
- UInt64 endCDStartOffset = ReadUInt64();
- /* UInt32 numberOfDisks = */ ReadUInt32();
- if (zip64EcdStartOffset != endCDStartOffset)
- return S_FALSE;
- if (!ReadUInt32(m_Signature))
- return S_FALSE;
- }
- if (m_Signature != NSignature::kEndOfCentralDir)
- return S_FALSE;
-
- const int kBufSize = kEcdSize - 4;
- Byte buf[kBufSize];
- SafeReadBytes(buf, kBufSize);
- CEcd ecd;
- ecd.Parse(buf);
-
- COPY_ECD_ITEM_16(thisDiskNumber);
- COPY_ECD_ITEM_16(startCDDiskNumber);
- COPY_ECD_ITEM_16(numEntriesInCDOnThisDisk);
- COPY_ECD_ITEM_16(numEntriesInCD);
- COPY_ECD_ITEM_32(cdSize);
- COPY_ECD_ITEM_32(cdStartOffset);
-
- ReadBuffer(ArcInfo.Comment, ecd.commentSize);
-
- if (ecd64.thisDiskNumber != 0 || ecd64.startCDDiskNumber != 0)
- throw CInArchiveException(CInArchiveException::kMultiVolumeArchiveAreNotSupported);
- if ((UInt16)ecd64.numEntriesInCDOnThisDisk != ((UInt16)numCdItems) ||
- (UInt16)ecd64.numEntriesInCD != ((UInt16)numCdItems) ||
- (UInt32)ecd64.cdSize != (UInt32)cdSize ||
- ((UInt32)(ecd64.cdStartOffset) != (UInt32)cdStartOffset &&
- (!items.IsEmpty())))
- return S_FALSE;
-
- _inBufMode = false;
- _inBuffer.Free();
- IsOkHeaders = (numCdItems == items.Size());
- ArcInfo.FinishPosition = m_Position;
- return S_OK;
-}
-
-ISequentialInStream* CInArchive::CreateLimitedStream(UInt64 position, UInt64 size)
-{
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> stream(streamSpec);
- SeekInArchive(ArcInfo.Base + position);
- streamSpec->SetStream(m_Stream);
- streamSpec->Init(size);
- return stream.Detach();
-}
-
-IInStream* CInArchive::CreateStream()
-{
- CMyComPtr<IInStream> stream = m_Stream;
- return stream.Detach();
-}
-
-bool CInArchive::SeekInArchive(UInt64 position)
-{
- UInt64 newPosition;
- if (m_Stream->Seek(position, STREAM_SEEK_SET, &newPosition) != S_OK)
- return false;
- return (newPosition == position);
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipIn.h
deleted file mode 100644
index 0565339a0..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipIn.h
+++ /dev/null
@@ -1,125 +0,0 @@
-// Archive/ZipIn.h
-
-#ifndef __ZIP_IN_H
-#define __ZIP_IN_H
-
-#include "Common/MyCom.h"
-
-#include "../../IStream.h"
-
-#include "../../Common/InBuffer.h"
-
-#include "ZipHeader.h"
-#include "ZipItemEx.h"
-
-namespace NArchive {
-namespace NZip {
-
-class CInArchiveException
-{
-public:
- enum ECauseType
- {
- kUnexpectedEndOfArchive = 0,
- kArchiceHeaderCRCError,
- kFileHeaderCRCError,
- kIncorrectArchive,
- kDataDescroptorsAreNotSupported,
- kMultiVolumeArchiveAreNotSupported,
- kReadStreamError,
- kSeekStreamError
- }
- Cause;
- CInArchiveException(ECauseType cause): Cause(cause) {}
-};
-
-class CInArchiveInfo
-{
-public:
- UInt64 Base;
- UInt64 StartPosition;
- UInt64 FinishPosition;
- CByteBuffer Comment;
-
- CInArchiveInfo(): Base(0), StartPosition(0) {}
- UInt64 GetPhySize() const { return FinishPosition - StartPosition; }
- void Clear()
- {
- Base = 0;
- StartPosition = 0;
- Comment.SetCapacity(0);
- }
-};
-
-class CProgressVirt
-{
-public:
- STDMETHOD(SetTotal)(UInt64 numFiles) PURE;
- STDMETHOD(SetCompleted)(UInt64 numFiles) PURE;
-};
-
-struct CCdInfo
-{
- // UInt64 NumEntries;
- UInt64 Size;
- UInt64 Offset;
-};
-
-class CInArchive
-{
- CMyComPtr<IInStream> m_Stream;
- UInt32 m_Signature;
- UInt64 m_StreamStartPosition;
- UInt64 m_Position;
-
- bool _inBufMode;
- CInBuffer _inBuffer;
-
- HRESULT Seek(UInt64 offset);
-
- HRESULT FindAndReadMarker(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
- void ReadFileName(UInt32 nameSize, AString &dest);
-
- HRESULT ReadBytes(void *data, UInt32 size, UInt32 *processedSize);
- bool ReadBytesAndTestSize(void *data, UInt32 size);
- void SafeReadBytes(void *data, UInt32 size);
- void ReadBuffer(CByteBuffer &buffer, UInt32 size);
- Byte ReadByte();
- UInt16 ReadUInt16();
- UInt32 ReadUInt32();
- UInt64 ReadUInt64();
- bool ReadUInt32(UInt32 &signature);
-
- void Skip(UInt64 num);
- void IncreaseRealPosition(UInt64 addValue);
-
- void ReadExtra(UInt32 extraSize, CExtraBlock &extraBlock,
- UInt64 &unpackSize, UInt64 &packSize, UInt64 &localHeaderOffset, UInt32 &diskStartNumber);
- HRESULT ReadLocalItem(CItemEx &item);
- HRESULT ReadLocalItemDescriptor(CItemEx &item);
- HRESULT ReadCdItem(CItemEx &item);
- HRESULT TryEcd64(UInt64 offset, CCdInfo &cdInfo);
- HRESULT FindCd(CCdInfo &cdInfo);
- HRESULT TryReadCd(CObjectVector<CItemEx> &items, UInt64 cdOffset, UInt64 cdSize, CProgressVirt *progress);
- HRESULT ReadCd(CObjectVector<CItemEx> &items, UInt64 &cdOffset, UInt64 &cdSize, CProgressVirt *progress);
- HRESULT ReadLocalsAndCd(CObjectVector<CItemEx> &items, CProgressVirt *progress, UInt64 &cdOffset, int &numCdItems);
-public:
- CInArchiveInfo ArcInfo;
- bool IsZip64;
- bool IsOkHeaders;
-
- HRESULT ReadHeaders(CObjectVector<CItemEx> &items, CProgressVirt *progress);
- HRESULT ReadLocalItemAfterCdItem(CItemEx &item);
- HRESULT ReadLocalItemAfterCdItemFull(CItemEx &item);
- HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
- void Close();
- bool SeekInArchive(UInt64 position);
- ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);
- IInStream* CreateStream();
-
- bool IsOpen() const { return m_Stream != NULL; }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItem.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItem.cpp
deleted file mode 100644
index 139b01291..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItem.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-// Archive/ZipItem.cpp
-
-#include "StdAfx.h"
-
-#include "ZipHeader.h"
-#include "ZipItem.h"
-#include "../Common/ItemNameUtils.h"
-#include "../../../../C/CpuArch.h"
-
-namespace NArchive {
-namespace NZip {
-
-bool operator==(const CVersion &v1, const CVersion &v2)
-{
- return (v1.Version == v2.Version) && (v1.HostOS == v2.HostOS);
-}
-
-bool operator!=(const CVersion &v1, const CVersion &v2)
-{
- return !(v1 == v2);
-}
-
-bool CExtraSubBlock::ExtractNtfsTime(int index, FILETIME &ft) const
-{
- ft.dwHighDateTime = ft.dwLowDateTime = 0;
- UInt32 size = (UInt32)Data.GetCapacity();
- if (ID != NFileHeader::NExtraID::kNTFS || size < 32)
- return false;
- const Byte *p = (const Byte *)Data;
- p += 4; // for reserved
- size -= 4;
- while (size > 4)
- {
- UInt16 tag = GetUi16(p);
- UInt32 attrSize = GetUi16(p + 2);
- p += 4;
- size -= 4;
- if (attrSize > size)
- attrSize = size;
-
- if (tag == NFileHeader::NNtfsExtra::kTagTime && attrSize >= 24)
- {
- p += 8 * index;
- ft.dwLowDateTime = GetUi32(p);
- ft.dwHighDateTime = GetUi32(p + 4);
- return true;
- }
- p += attrSize;
- size -= attrSize;
- }
- return false;
-}
-
-bool CExtraSubBlock::ExtractUnixTime(int index, UInt32 &res) const
-{
- res = 0;
- UInt32 size = (UInt32)Data.GetCapacity();
- if (ID != NFileHeader::NExtraID::kUnixTime || size < 5)
- return false;
- const Byte *p = (const Byte *)Data;
- Byte flags = *p++;
- size--;
- for (int i = 0; i < 3; i++)
- if ((flags & (1 << i)) != 0)
- {
- if (size < 4)
- return false;
- if (index == i)
- {
- res = GetUi32(p);
- return true;
- }
- p += 4;
- size -= 4;
- }
- return false;
-}
-
-bool CLocalItem::IsDir() const
-{
- return NItemName::HasTailSlash(Name, GetCodePage());
-}
-
-bool CItem::IsDir() const
-{
- if (NItemName::HasTailSlash(Name, GetCodePage()))
- return true;
- if (!FromCentral)
- return false;
- WORD highAttributes = WORD((ExternalAttributes >> 16 ) & 0xFFFF);
- switch(MadeByVersion.HostOS)
- {
- case NFileHeader::NHostOS::kAMIGA:
- switch (highAttributes & NFileHeader::NAmigaAttribute::kIFMT)
- {
- case NFileHeader::NAmigaAttribute::kIFDIR: return true;
- case NFileHeader::NAmigaAttribute::kIFREG: return false;
- default: return false; // change it throw kUnknownAttributes;
- }
- case NFileHeader::NHostOS::kFAT:
- case NFileHeader::NHostOS::kNTFS:
- case NFileHeader::NHostOS::kHPFS:
- case NFileHeader::NHostOS::kVFAT:
- return ((ExternalAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0);
- case NFileHeader::NHostOS::kAtari:
- case NFileHeader::NHostOS::kMac:
- case NFileHeader::NHostOS::kVMS:
- case NFileHeader::NHostOS::kVM_CMS:
- case NFileHeader::NHostOS::kAcorn:
- case NFileHeader::NHostOS::kMVS:
- return false; // change it throw kUnknownAttributes;
- default:
- /*
- switch (highAttributes & NFileHeader::NUnixAttribute::kIFMT)
- {
- case NFileHeader::NUnixAttribute::kIFDIR:
- return true;
- default:
- return false;
- }
- */
- return false;
- }
-}
-
-UInt32 CLocalItem::GetWinAttributes() const
-{
- DWORD winAttributes = 0;
- if (IsDir())
- winAttributes |= FILE_ATTRIBUTE_DIRECTORY;
- return winAttributes;
-}
-
-UInt32 CItem::GetWinAttributes() const
-{
- DWORD winAttributes = 0;
- switch(MadeByVersion.HostOS)
- {
- case NFileHeader::NHostOS::kFAT:
- case NFileHeader::NHostOS::kNTFS:
- if (FromCentral)
- winAttributes = ExternalAttributes;
- break;
- default:
- winAttributes = 0; // must be converted from unix value;
- }
- if (IsDir()) // test it;
- winAttributes |= FILE_ATTRIBUTE_DIRECTORY;
- return winAttributes;
-}
-
-void CLocalItem::SetFlagBits(int startBitNumber, int numBits, int value)
-{
- UInt16 mask = (UInt16)(((1 << numBits) - 1) << startBitNumber);
- Flags &= ~mask;
- Flags |= value << startBitNumber;
-}
-
-void CLocalItem::SetBitMask(int bitMask, bool enable)
-{
- if(enable)
- Flags |= bitMask;
- else
- Flags &= ~bitMask;
-}
-
-void CLocalItem::SetEncrypted(bool encrypted)
- { SetBitMask(NFileHeader::NFlags::kEncrypted, encrypted); }
-void CLocalItem::SetUtf8(bool isUtf8)
- { SetBitMask(NFileHeader::NFlags::kUtf8, isUtf8); }
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItem.h b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItem.h
deleted file mode 100644
index 31f2de732..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItem.h
+++ /dev/null
@@ -1,281 +0,0 @@
-// Archive/ZipItem.h
-
-#ifndef __ARCHIVE_ZIP_ITEM_H
-#define __ARCHIVE_ZIP_ITEM_H
-
-#include "Common/Types.h"
-#include "Common/MyString.h"
-#include "Common/Buffer.h"
-#include "Common/UTFConvert.h"
-#include "Common/StringConvert.h"
-
-#include "ZipHeader.h"
-
-namespace NArchive {
-namespace NZip {
-
-struct CVersion
-{
- Byte Version;
- Byte HostOS;
-};
-
-bool operator==(const CVersion &v1, const CVersion &v2);
-bool operator!=(const CVersion &v1, const CVersion &v2);
-
-struct CExtraSubBlock
-{
- UInt16 ID;
- CByteBuffer Data;
- bool ExtractNtfsTime(int index, FILETIME &ft) const;
- bool ExtractUnixTime(int index, UInt32 &res) const;
-};
-
-struct CWzAesExtraField
-{
- UInt16 VendorVersion; // 0x0001 - AE-1, 0x0002 - AE-2,
- // UInt16 VendorId; // "AE"
- Byte Strength; // 1 - 128-bit , 2 - 192-bit , 3 - 256-bit
- UInt16 Method;
-
- CWzAesExtraField(): VendorVersion(2), Strength(3), Method(0) {}
-
- bool NeedCrc() const { return (VendorVersion == 1); }
-
- bool ParseFromSubBlock(const CExtraSubBlock &sb)
- {
- if (sb.ID != NFileHeader::NExtraID::kWzAES)
- return false;
- if (sb.Data.GetCapacity() < 7)
- return false;
- const Byte *p = (const Byte *)sb.Data;
- VendorVersion = (((UInt16)p[1]) << 8) | p[0];
- if (p[2] != 'A' || p[3] != 'E')
- return false;
- Strength = p[4];
- Method = (((UInt16)p[6]) << 16) | p[5];
- return true;
- }
- void SetSubBlock(CExtraSubBlock &sb) const
- {
- sb.Data.SetCapacity(7);
- sb.ID = NFileHeader::NExtraID::kWzAES;
- Byte *p = (Byte *)sb.Data;
- p[0] = (Byte)VendorVersion;
- p[1] = (Byte)(VendorVersion >> 8);
- p[2] = 'A';
- p[3] = 'E';
- p[4] = Strength;
- p[5] = (Byte)Method;
- p[6] = (Byte)(Method >> 8);
- }
-};
-
-namespace NStrongCryptoFlags
-{
- const UInt16 kDES = 0x6601;
- const UInt16 kRC2old = 0x6602;
- const UInt16 k3DES168 = 0x6603;
- const UInt16 k3DES112 = 0x6609;
- const UInt16 kAES128 = 0x660E;
- const UInt16 kAES192 = 0x660F;
- const UInt16 kAES256 = 0x6610;
- const UInt16 kRC2 = 0x6702;
- const UInt16 kBlowfish = 0x6720;
- const UInt16 kTwofish = 0x6721;
- const UInt16 kRC4 = 0x6801;
-}
-
-struct CStrongCryptoField
-{
- UInt16 Format;
- UInt16 AlgId;
- UInt16 BitLen;
- UInt16 Flags;
-
- bool ParseFromSubBlock(const CExtraSubBlock &sb)
- {
- if (sb.ID != NFileHeader::NExtraID::kStrongEncrypt)
- return false;
- const Byte *p = (const Byte *)sb.Data;
- if (sb.Data.GetCapacity() < 8)
- return false;
- Format = (((UInt16)p[1]) << 8) | p[0];
- AlgId = (((UInt16)p[3]) << 8) | p[2];
- BitLen = (((UInt16)p[5]) << 8) | p[4];
- Flags = (((UInt16)p[7]) << 8) | p[6];
- return (Format == 2);
- }
-};
-
-struct CExtraBlock
-{
- CObjectVector<CExtraSubBlock> SubBlocks;
- void Clear() { SubBlocks.Clear(); }
- size_t GetSize() const
- {
- size_t res = 0;
- for (int i = 0; i < SubBlocks.Size(); i++)
- res += SubBlocks[i].Data.GetCapacity() + 2 + 2;
- return res;
- }
- bool GetWzAesField(CWzAesExtraField &aesField) const
- {
- for (int i = 0; i < SubBlocks.Size(); i++)
- if (aesField.ParseFromSubBlock(SubBlocks[i]))
- return true;
- return false;
- }
-
- bool GetStrongCryptoField(CStrongCryptoField &f) const
- {
- for (int i = 0; i < SubBlocks.Size(); i++)
- if (f.ParseFromSubBlock(SubBlocks[i]))
- return true;
- return false;
- }
-
- bool HasWzAesField() const
- {
- CWzAesExtraField aesField;
- return GetWzAesField(aesField);
- }
-
- bool GetNtfsTime(int index, FILETIME &ft) const
- {
- for (int i = 0; i < SubBlocks.Size(); i++)
- {
- const CExtraSubBlock &sb = SubBlocks[i];
- if (sb.ID == NFileHeader::NExtraID::kNTFS)
- return sb.ExtractNtfsTime(index, ft);
- }
- return false;
- }
-
- bool GetUnixTime(int index, UInt32 &res) const
- {
- for (int i = 0; i < SubBlocks.Size(); i++)
- {
- const CExtraSubBlock &sb = SubBlocks[i];
- if (sb.ID == NFileHeader::NExtraID::kUnixTime)
- return sb.ExtractUnixTime(index, res);
- }
- return false;
- }
-
- /*
- bool HasStrongCryptoField() const
- {
- CStrongCryptoField f;
- return GetStrongCryptoField(f);
- }
- */
-
- void RemoveUnknownSubBlocks()
- {
- for (int i = SubBlocks.Size() - 1; i >= 0; i--)
- if (SubBlocks[i].ID != NFileHeader::NExtraID::kWzAES)
- SubBlocks.Delete(i);
- }
-};
-
-
-class CLocalItem
-{
-public:
- CVersion ExtractVersion;
- UInt16 Flags;
- UInt16 CompressionMethod;
- UInt32 Time;
- UInt32 FileCRC;
- UInt64 PackSize;
- UInt64 UnPackSize;
-
- AString Name;
-
- CExtraBlock LocalExtra;
-
- bool IsUtf8() const { return (Flags & NFileHeader::NFlags::kUtf8) != 0; }
-
- bool IsEncrypted() const { return (Flags & NFileHeader::NFlags::kEncrypted) != 0; }
- bool IsStrongEncrypted() const { return IsEncrypted() && (Flags & NFileHeader::NFlags::kStrongEncrypted) != 0; };
- bool IsAesEncrypted() const { return IsEncrypted() && (IsStrongEncrypted() || CompressionMethod == NFileHeader::NCompressionMethod::kWzAES); };
-
- bool IsLzmaEOS() const { return (Flags & NFileHeader::NFlags::kLzmaEOS) != 0; }
-
- bool IsDir() const;
- bool IgnoreItem() const { return false; }
- UInt32 GetWinAttributes() const;
-
- bool HasDescriptor() const { return (Flags & NFileHeader::NFlags::kDescriptorUsedMask) != 0; }
-
- UString GetUnicodeString(const AString &s) const
- {
- UString res;
- if (IsUtf8())
- if (!ConvertUTF8ToUnicode(s, res))
- res.Empty();
- if (res.IsEmpty())
- res = MultiByteToUnicodeString(s, GetCodePage());
- return res;
- }
-
-private:
- void SetFlagBits(int startBitNumber, int numBits, int value);
- void SetBitMask(int bitMask, bool enable);
-public:
- void ClearFlags() { Flags = 0; }
- void SetEncrypted(bool encrypted);
- void SetUtf8(bool isUtf8);
-
- WORD GetCodePage() const { return CP_OEMCP; }
-};
-
-class CItem: public CLocalItem
-{
-public:
- CVersion MadeByVersion;
- UInt16 InternalAttributes;
- UInt32 ExternalAttributes;
-
- UInt64 LocalHeaderPosition;
-
- FILETIME NtfsMTime;
- FILETIME NtfsATime;
- FILETIME NtfsCTime;
-
- CExtraBlock CentralExtra;
- CByteBuffer Comment;
-
- bool FromLocal;
- bool FromCentral;
- bool NtfsTimeIsDefined;
-
- bool IsDir() const;
- UInt32 GetWinAttributes() const;
-
- bool IsThereCrc() const
- {
- if (CompressionMethod == NFileHeader::NCompressionMethod::kWzAES)
- {
- CWzAesExtraField aesField;
- if (CentralExtra.GetWzAesField(aesField))
- return aesField.NeedCrc();
- }
- return (FileCRC != 0 || !IsDir());
- }
-
- WORD GetCodePage() const
- {
- return (WORD)((MadeByVersion.HostOS == NFileHeader::NHostOS::kFAT
- || MadeByVersion.HostOS == NFileHeader::NHostOS::kNTFS
- ) ? CP_OEMCP : CP_ACP);
- }
- CItem() : FromLocal(false), FromCentral(false), NtfsTimeIsDefined(false) {}
-};
-
-}}
-
-#endif
-
-
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItemEx.h b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItemEx.h
deleted file mode 100644
index ab62cdbb4..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipItemEx.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Archive/ZipItemEx.h
-
-#ifndef __ARCHIVE_ZIP_ITEMEX_H
-#define __ARCHIVE_ZIP_ITEMEX_H
-
-#include "ZipHeader.h"
-#include "ZipItem.h"
-
-namespace NArchive {
-namespace NZip {
-
-class CItemEx: public CItem
-{
-public:
- UInt32 FileHeaderWithNameSize;
- UInt16 LocalExtraSize;
-
- UInt64 GetLocalFullSize() const
- { return FileHeaderWithNameSize + LocalExtraSize + PackSize +
- (HasDescriptor() ? NFileHeader::kDataDescriptorSize : 0); };
- /*
- UInt64 GetLocalFullSize(bool isZip64) const
- { return FileHeaderWithNameSize + LocalExtraSize + PackSize +
- (HasDescriptor() ? (isZip64 ? NFileHeader::kDataDescriptor64Size : NFileHeader::kDataDescriptorSize) : 0); };
- */
- UInt64 GetLocalExtraPosition() const
- { return LocalHeaderPosition + FileHeaderWithNameSize; };
- UInt64 GetDataPosition() const
- { return GetLocalExtraPosition() + LocalExtraSize; };
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipOut.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipOut.cpp
deleted file mode 100644
index aa82143e3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipOut.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-// ZipOut.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/OffsetStream.h"
-
-#include "ZipOut.h"
-
-namespace NArchive {
-namespace NZip {
-
-void COutArchive::Create(IOutStream *outStream)
-{
- if (!m_OutBuffer.Create(1 << 16))
- throw CSystemException(E_OUTOFMEMORY);
- m_Stream = outStream;
- m_OutBuffer.SetStream(outStream);
- m_OutBuffer.Init();
- m_BasePosition = 0;
-}
-
-void COutArchive::MoveBasePosition(UInt64 distanceToMove)
-{
- m_BasePosition += distanceToMove; // test overflow
-}
-
-void COutArchive::PrepareWriteCompressedDataZip64(UInt16 fileNameLength, bool isZip64, bool aesEncryption)
-{
- m_IsZip64 = isZip64;
- m_ExtraSize = isZip64 ? (4 + 8 + 8) : 0;
- if (aesEncryption)
- m_ExtraSize += 4 + 7;
- m_LocalFileHeaderSize = 4 + NFileHeader::kLocalBlockSize + fileNameLength + m_ExtraSize;
-}
-
-void COutArchive::PrepareWriteCompressedData(UInt16 fileNameLength, UInt64 unPackSize, bool aesEncryption)
-{
- // We test it to 0xF8000000 to support case when compressed size
- // can be larger than uncompressed size.
- PrepareWriteCompressedDataZip64(fileNameLength, unPackSize >= 0xF8000000, aesEncryption);
-}
-
-void COutArchive::PrepareWriteCompressedData2(UInt16 fileNameLength, UInt64 unPackSize, UInt64 packSize, bool aesEncryption)
-{
- bool isUnPack64 = unPackSize >= 0xFFFFFFFF;
- bool isPack64 = packSize >= 0xFFFFFFFF;
- bool isZip64 = isPack64 || isUnPack64;
- PrepareWriteCompressedDataZip64(fileNameLength, isZip64, aesEncryption);
-}
-
-void COutArchive::WriteBytes(const void *buffer, UInt32 size)
-{
- m_OutBuffer.WriteBytes(buffer, size);
- m_BasePosition += size;
-}
-
-void COutArchive::WriteByte(Byte b)
-{
- WriteBytes(&b, 1);
-}
-
-void COutArchive::WriteUInt16(UInt16 value)
-{
- for (int i = 0; i < 2; i++)
- {
- WriteByte((Byte)value);
- value >>= 8;
- }
-}
-
-void COutArchive::WriteUInt32(UInt32 value)
-{
- for (int i = 0; i < 4; i++)
- {
- WriteByte((Byte)value);
- value >>= 8;
- }
-}
-
-void COutArchive::WriteUInt64(UInt64 value)
-{
- for (int i = 0; i < 8; i++)
- {
- WriteByte((Byte)value);
- value >>= 8;
- }
-}
-
-void COutArchive::WriteExtra(const CExtraBlock &extra)
-{
- if (extra.SubBlocks.Size() != 0)
- {
- for (int i = 0; i < extra.SubBlocks.Size(); i++)
- {
- const CExtraSubBlock &subBlock = extra.SubBlocks[i];
- WriteUInt16(subBlock.ID);
- WriteUInt16((UInt16)subBlock.Data.GetCapacity());
- WriteBytes(subBlock.Data, (UInt32)subBlock.Data.GetCapacity());
- }
- }
-}
-
-void COutArchive::SeekTo(UInt64 offset)
-{
- HRESULT res = m_Stream->Seek(offset, STREAM_SEEK_SET, NULL);
- if (res != S_OK)
- throw CSystemException(res);
-}
-
-void COutArchive::WriteLocalHeader(const CLocalItem &item)
-{
- SeekTo(m_BasePosition);
-
- bool isZip64 = m_IsZip64 || item.PackSize >= 0xFFFFFFFF || item.UnPackSize >= 0xFFFFFFFF;
-
- WriteUInt32(NSignature::kLocalFileHeader);
- {
- Byte ver = item.ExtractVersion.Version;
- if (isZip64 && ver < NFileHeader::NCompressionMethod::kExtractVersion_Zip64)
- ver = NFileHeader::NCompressionMethod::kExtractVersion_Zip64;
- WriteByte(ver);
- }
- WriteByte(item.ExtractVersion.HostOS);
- WriteUInt16(item.Flags);
- WriteUInt16(item.CompressionMethod);
- WriteUInt32(item.Time);
- WriteUInt32(item.FileCRC);
- WriteUInt32(isZip64 ? 0xFFFFFFFF: (UInt32)item.PackSize);
- WriteUInt32(isZip64 ? 0xFFFFFFFF: (UInt32)item.UnPackSize);
- WriteUInt16((UInt16)item.Name.Length());
- {
- UInt16 localExtraSize = (UInt16)((isZip64 ? (4 + 16): 0) + item.LocalExtra.GetSize());
- if (localExtraSize > m_ExtraSize)
- throw CSystemException(E_FAIL);
- }
- WriteUInt16((UInt16)m_ExtraSize); // test it;
- WriteBytes((const char *)item.Name, item.Name.Length());
-
- UInt32 extraPos = 0;
- if (isZip64)
- {
- extraPos += 4 + 16;
- WriteUInt16(NFileHeader::NExtraID::kZip64);
- WriteUInt16(16);
- WriteUInt64(item.UnPackSize);
- WriteUInt64(item.PackSize);
- }
-
- WriteExtra(item.LocalExtra);
- extraPos += (UInt32)item.LocalExtra.GetSize();
- for (; extraPos < m_ExtraSize; extraPos++)
- WriteByte(0);
-
- m_OutBuffer.FlushWithCheck();
- MoveBasePosition(item.PackSize);
- SeekTo(m_BasePosition);
-}
-
-void COutArchive::WriteCentralHeader(const CItem &item)
-{
- bool isUnPack64 = item.UnPackSize >= 0xFFFFFFFF;
- bool isPack64 = item.PackSize >= 0xFFFFFFFF;
- bool isPosition64 = item.LocalHeaderPosition >= 0xFFFFFFFF;
- bool isZip64 = isPack64 || isUnPack64 || isPosition64;
-
- WriteUInt32(NSignature::kCentralFileHeader);
- WriteByte(item.MadeByVersion.Version);
- WriteByte(item.MadeByVersion.HostOS);
- {
- Byte ver = item.ExtractVersion.Version;
- if (isZip64 && ver < NFileHeader::NCompressionMethod::kExtractVersion_Zip64)
- ver = NFileHeader::NCompressionMethod::kExtractVersion_Zip64;
- WriteByte(ver);
- }
- WriteByte(item.ExtractVersion.HostOS);
- WriteUInt16(item.Flags);
- WriteUInt16(item.CompressionMethod);
- WriteUInt32(item.Time);
- WriteUInt32(item.FileCRC);
- WriteUInt32(isPack64 ? 0xFFFFFFFF: (UInt32)item.PackSize);
- WriteUInt32(isUnPack64 ? 0xFFFFFFFF: (UInt32)item.UnPackSize);
- WriteUInt16((UInt16)item.Name.Length());
- UInt16 zip64ExtraSize = (UInt16)((isUnPack64 ? 8: 0) + (isPack64 ? 8: 0) + (isPosition64 ? 8: 0));
- const UInt16 kNtfsExtraSize = 4 + 2 + 2 + (3 * 8);
- UInt16 centralExtraSize = (UInt16)(isZip64 ? (4 + zip64ExtraSize) : 0) + (item.NtfsTimeIsDefined ? (4 + kNtfsExtraSize) : 0);
- centralExtraSize = (UInt16)(centralExtraSize + item.CentralExtra.GetSize());
- WriteUInt16(centralExtraSize); // test it;
- WriteUInt16((UInt16)item.Comment.GetCapacity());
- WriteUInt16(0); // DiskNumberStart;
- WriteUInt16(item.InternalAttributes);
- WriteUInt32(item.ExternalAttributes);
- WriteUInt32(isPosition64 ? 0xFFFFFFFF: (UInt32)item.LocalHeaderPosition);
- WriteBytes((const char *)item.Name, item.Name.Length());
- if (isZip64)
- {
- WriteUInt16(NFileHeader::NExtraID::kZip64);
- WriteUInt16(zip64ExtraSize);
- if(isUnPack64)
- WriteUInt64(item.UnPackSize);
- if(isPack64)
- WriteUInt64(item.PackSize);
- if(isPosition64)
- WriteUInt64(item.LocalHeaderPosition);
- }
- if (item.NtfsTimeIsDefined)
- {
- WriteUInt16(NFileHeader::NExtraID::kNTFS);
- WriteUInt16(kNtfsExtraSize);
- WriteUInt32(0); // reserved
- WriteUInt16(NFileHeader::NNtfsExtra::kTagTime);
- WriteUInt16(8 * 3);
- WriteUInt32(item.NtfsMTime.dwLowDateTime);
- WriteUInt32(item.NtfsMTime.dwHighDateTime);
- WriteUInt32(item.NtfsATime.dwLowDateTime);
- WriteUInt32(item.NtfsATime.dwHighDateTime);
- WriteUInt32(item.NtfsCTime.dwLowDateTime);
- WriteUInt32(item.NtfsCTime.dwHighDateTime);
- }
- WriteExtra(item.CentralExtra);
- if (item.Comment.GetCapacity() > 0)
- WriteBytes(item.Comment, (UInt32)item.Comment.GetCapacity());
-}
-
-void COutArchive::WriteCentralDir(const CObjectVector<CItem> &items, const CByteBuffer *comment)
-{
- SeekTo(m_BasePosition);
-
- UInt64 cdOffset = GetCurrentPosition();
- for(int i = 0; i < items.Size(); i++)
- WriteCentralHeader(items[i]);
- UInt64 cd64EndOffset = GetCurrentPosition();
- UInt64 cdSize = cd64EndOffset - cdOffset;
- bool cdOffset64 = cdOffset >= 0xFFFFFFFF;
- bool cdSize64 = cdSize >= 0xFFFFFFFF;
- bool items64 = items.Size() >= 0xFFFF;
- bool isZip64 = (cdOffset64 || cdSize64 || items64);
-
- if (isZip64)
- {
- WriteUInt32(NSignature::kZip64EndOfCentralDir);
- WriteUInt64(kZip64EcdSize); // ThisDiskNumber = 0;
- WriteUInt16(45); // version
- WriteUInt16(45); // version
- WriteUInt32(0); // ThisDiskNumber = 0;
- WriteUInt32(0); // StartCentralDirectoryDiskNumber;;
- WriteUInt64((UInt64)items.Size());
- WriteUInt64((UInt64)items.Size());
- WriteUInt64((UInt64)cdSize);
- WriteUInt64((UInt64)cdOffset);
-
- WriteUInt32(NSignature::kZip64EndOfCentralDirLocator);
- WriteUInt32(0); // number of the disk with the start of the zip64 end of central directory
- WriteUInt64(cd64EndOffset);
- WriteUInt32(1); // total number of disks
- }
- WriteUInt32(NSignature::kEndOfCentralDir);
- WriteUInt16(0); // ThisDiskNumber = 0;
- WriteUInt16(0); // StartCentralDirectoryDiskNumber;
- WriteUInt16((UInt16)(items64 ? 0xFFFF: items.Size()));
- WriteUInt16((UInt16)(items64 ? 0xFFFF: items.Size()));
- WriteUInt32(cdSize64 ? 0xFFFFFFFF: (UInt32)cdSize);
- WriteUInt32(cdOffset64 ? 0xFFFFFFFF: (UInt32)cdOffset);
- UInt32 commentSize = (UInt32)(comment ? comment->GetCapacity() : 0);
- WriteUInt16((UInt16)commentSize);
- if (commentSize > 0)
- WriteBytes((const Byte *)*comment, commentSize);
- m_OutBuffer.FlushWithCheck();
-}
-
-void COutArchive::CreateStreamForCompressing(IOutStream **outStream)
-{
- COffsetOutStream *streamSpec = new COffsetOutStream;
- CMyComPtr<IOutStream> tempStream(streamSpec);
- streamSpec->Init(m_Stream, m_BasePosition + m_LocalFileHeaderSize);
- *outStream = tempStream.Detach();
-}
-
-void COutArchive::SeekToPackedDataPosition()
-{
- SeekTo(m_BasePosition + m_LocalFileHeaderSize);
-}
-
-void COutArchive::CreateStreamForCopying(ISequentialOutStream **outStream)
-{
- CMyComPtr<ISequentialOutStream> tempStream(m_Stream);
- *outStream = tempStream.Detach();
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipOut.h b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipOut.h
deleted file mode 100644
index 2f6349e5c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipOut.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// ZipOut.h
-
-#ifndef __ZIP_OUT_H
-#define __ZIP_OUT_H
-
-#include "Common/MyCom.h"
-
-#include "../../IStream.h"
-#include "../../Common/OutBuffer.h"
-
-#include "ZipItem.h"
-
-namespace NArchive {
-namespace NZip {
-
-// can throw CSystemException and COutBufferException
-
-class COutArchive
-{
- CMyComPtr<IOutStream> m_Stream;
- COutBuffer m_OutBuffer;
-
- UInt64 m_BasePosition;
- UInt32 m_LocalFileHeaderSize;
- UInt32 m_ExtraSize;
- bool m_IsZip64;
-
- void WriteBytes(const void *buffer, UInt32 size);
- void WriteByte(Byte b);
- void WriteUInt16(UInt16 value);
- void WriteUInt32(UInt32 value);
- void WriteUInt64(UInt64 value);
-
- void WriteExtraHeader(const CItem &item);
- void WriteCentralHeader(const CItem &item);
- void WriteExtra(const CExtraBlock &extra);
- void SeekTo(UInt64 offset);
-public:
- void Create(IOutStream *outStream);
- void MoveBasePosition(UInt64 distanceToMove);
- UInt64 GetCurrentPosition() const { return m_BasePosition; };
- void PrepareWriteCompressedDataZip64(UInt16 fileNameLength, bool isZip64, bool aesEncryption);
- void PrepareWriteCompressedData(UInt16 fileNameLength, UInt64 unPackSize, bool aesEncryption);
- void PrepareWriteCompressedData2(UInt16 fileNameLength, UInt64 unPackSize, UInt64 packSize, bool aesEncryption);
- void WriteLocalHeader(const CLocalItem &item);
-
- void WriteCentralDir(const CObjectVector<CItem> &items, const CByteBuffer *comment);
-
- void CreateStreamForCompressing(IOutStream **outStream);
- void CreateStreamForCopying(ISequentialOutStream **outStream);
- void SeekToPackedDataPosition();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipRegister.cpp
deleted file mode 100644
index 3e7aade85..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipRegister.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// ZipRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "ZipHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NZip::CHandler; }
-#ifndef EXTRACT_ONLY
-static IOutArchive *CreateArcOut() { return new NArchive::NZip::CHandler; }
-#else
-#define CreateArcOut 0
-#endif
-
-static CArcInfo g_ArcInfo =
- { L"zip", L"zip jar xpi odt ods docx xlsx", 0, 1, { 0x50, 0x4B, 0x03, 0x04 }, 4, false, CreateArc, CreateArcOut };
-
-REGISTER_ARC(Zip)
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipUpdate.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipUpdate.cpp
deleted file mode 100644
index d4fdee3d7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipUpdate.cpp
+++ /dev/null
@@ -1,1068 +0,0 @@
-// ZipUpdate.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/Alloc.h"
-
-#include "Common/AutoPtr.h"
-#include "Common/Defs.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/Defs.h"
-#include "Windows/Thread.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/OutMemStream.h"
-#include "../../Common/ProgressUtils.h"
-#ifndef _7ZIP_ST
-#include "../../Common/ProgressMt.h"
-#endif
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "ZipAddCommon.h"
-#include "ZipOut.h"
-#include "ZipUpdate.h"
-
-using namespace NWindows;
-using namespace NSynchronization;
-
-namespace NArchive {
-namespace NZip {
-
-static const Byte kHostOS =
- #ifdef _WIN32
- NFileHeader::NHostOS::kFAT;
- #else
- NFileHeader::NHostOS::kUnix;
- #endif
-
-static const Byte kMadeByHostOS = kHostOS;
-static const Byte kExtractHostOS = kHostOS;
-
-static const Byte kMethodForDirectory = NFileHeader::NCompressionMethod::kStored;
-
-static HRESULT CopyBlockToArchive(ISequentialInStream *inStream,
- COutArchive &outArchive, ICompressProgressInfo *progress)
-{
- CMyComPtr<ISequentialOutStream> outStream;
- outArchive.CreateStreamForCopying(&outStream);
- return NCompress::CopyStream(inStream, outStream, progress);
-}
-
-static HRESULT WriteRange(IInStream *inStream, COutArchive &outArchive,
- const CUpdateRange &range, ICompressProgressInfo *progress)
-{
- UInt64 position;
- RINOK(inStream->Seek(range.Position, STREAM_SEEK_SET, &position));
-
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<CLimitedSequentialInStream> inStreamLimited(streamSpec);
- streamSpec->SetStream(inStream);
- streamSpec->Init(range.Size);
-
- RINOK(CopyBlockToArchive(inStreamLimited, outArchive, progress));
- return progress->SetRatioInfo(&range.Size, &range.Size);
-}
-
-static void SetFileHeader(
- COutArchive &archive,
- const CCompressionMethodMode &options,
- const CUpdateItem &ui,
- CItem &item)
-{
- item.UnPackSize = ui.Size;
- bool isDir;
-
- item.ClearFlags();
-
- if (ui.NewProperties)
- {
- isDir = ui.IsDir;
- item.Name = ui.Name;
- item.SetUtf8(ui.IsUtf8);
- item.ExternalAttributes = ui.Attributes;
- item.Time = ui.Time;
- item.NtfsMTime = ui.NtfsMTime;
- item.NtfsATime = ui.NtfsATime;
- item.NtfsCTime = ui.NtfsCTime;
- item.NtfsTimeIsDefined = ui.NtfsTimeIsDefined;
- }
- else
- isDir = item.IsDir();
-
- item.LocalHeaderPosition = archive.GetCurrentPosition();
- item.MadeByVersion.HostOS = kMadeByHostOS;
- item.MadeByVersion.Version = NFileHeader::NCompressionMethod::kMadeByProgramVersion;
-
- item.ExtractVersion.HostOS = kExtractHostOS;
-
- item.InternalAttributes = 0; // test it
- item.SetEncrypted(!isDir && options.PasswordIsDefined);
- if (isDir)
- {
- item.ExtractVersion.Version = NFileHeader::NCompressionMethod::kExtractVersion_Dir;
- item.CompressionMethod = kMethodForDirectory;
- item.PackSize = 0;
- item.FileCRC = 0; // test it
- }
-}
-
-static void SetItemInfoFromCompressingResult(const CCompressingResult &compressingResult,
- bool isAesMode, Byte aesKeyMode, CItem &item)
-{
- item.ExtractVersion.Version = compressingResult.ExtractVersion;
- item.CompressionMethod = compressingResult.Method;
- item.FileCRC = compressingResult.CRC;
- item.UnPackSize = compressingResult.UnpackSize;
- item.PackSize = compressingResult.PackSize;
-
- item.LocalExtra.Clear();
- item.CentralExtra.Clear();
-
- if (isAesMode)
- {
- CWzAesExtraField wzAesField;
- wzAesField.Strength = aesKeyMode;
- wzAesField.Method = compressingResult.Method;
- item.CompressionMethod = NFileHeader::NCompressionMethod::kWzAES;
- item.FileCRC = 0;
- CExtraSubBlock sb;
- wzAesField.SetSubBlock(sb);
- item.LocalExtra.SubBlocks.Add(sb);
- item.CentralExtra.SubBlocks.Add(sb);
- }
-}
-
-#ifndef _7ZIP_ST
-
-static THREAD_FUNC_DECL CoderThread(void *threadCoderInfo);
-
-struct CThreadInfo
-{
- #ifdef EXTERNAL_CODECS
- CMyComPtr<ICompressCodecsInfo> _codecsInfo;
- const CObjectVector<CCodecInfoEx> *_externalCodecs;
- #endif
-
- NWindows::CThread Thread;
- NWindows::NSynchronization::CAutoResetEvent CompressEvent;
- NWindows::NSynchronization::CAutoResetEvent CompressionCompletedEvent;
- bool ExitThread;
-
- CMtCompressProgress *ProgressSpec;
- CMyComPtr<ICompressProgressInfo> Progress;
-
- COutMemStream *OutStreamSpec;
- CMyComPtr<IOutStream> OutStream;
- CMyComPtr<ISequentialInStream> InStream;
-
- CAddCommon Coder;
- HRESULT Result;
- CCompressingResult CompressingResult;
-
- bool IsFree;
- UInt32 UpdateIndex;
-
- CThreadInfo(const CCompressionMethodMode &options):
- ExitThread(false),
- ProgressSpec(0),
- OutStreamSpec(0),
- Coder(options)
- {}
-
- HRESULT CreateEvents()
- {
- RINOK(CompressEvent.CreateIfNotCreated());
- return CompressionCompletedEvent.CreateIfNotCreated();
- }
- HRes CreateThread() { return Thread.Create(CoderThread, this); }
-
- void WaitAndCode();
- void StopWaitClose()
- {
- ExitThread = true;
- if (OutStreamSpec != 0)
- OutStreamSpec->StopWriting(E_ABORT);
- if (CompressEvent.IsCreated())
- CompressEvent.Set();
- Thread.Wait();
- Thread.Close();
- }
-
-};
-
-void CThreadInfo::WaitAndCode()
-{
- for (;;)
- {
- CompressEvent.Lock();
- if (ExitThread)
- return;
- Result = Coder.Compress(
- #ifdef EXTERNAL_CODECS
- _codecsInfo, _externalCodecs,
- #endif
- InStream, OutStream, Progress, CompressingResult);
- if (Result == S_OK && Progress)
- Result = Progress->SetRatioInfo(&CompressingResult.UnpackSize, &CompressingResult.PackSize);
- CompressionCompletedEvent.Set();
- }
-}
-
-static THREAD_FUNC_DECL CoderThread(void *threadCoderInfo)
-{
- ((CThreadInfo *)threadCoderInfo)->WaitAndCode();
- return 0;
-}
-
-class CThreads
-{
-public:
- CObjectVector<CThreadInfo> Threads;
- ~CThreads()
- {
- for (int i = 0; i < Threads.Size(); i++)
- Threads[i].StopWaitClose();
- }
-};
-
-struct CMemBlocks2: public CMemLockBlocks
-{
- CCompressingResult CompressingResult;
- bool Defined;
- bool Skip;
- CMemBlocks2(): Defined(false), Skip(false) {}
-};
-
-class CMemRefs
-{
-public:
- CMemBlockManagerMt *Manager;
- CObjectVector<CMemBlocks2> Refs;
- CMemRefs(CMemBlockManagerMt *manager): Manager(manager) {} ;
- ~CMemRefs()
- {
- for (int i = 0; i < Refs.Size(); i++)
- Refs[i].FreeOpt(Manager);
- }
-};
-
-class CMtProgressMixer2:
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
- UInt64 ProgressOffset;
- UInt64 InSizes[2];
- UInt64 OutSizes[2];
- CMyComPtr<IProgress> Progress;
- CMyComPtr<ICompressProgressInfo> RatioProgress;
- bool _inSizeIsMain;
-public:
- NWindows::NSynchronization::CCriticalSection CriticalSection;
- MY_UNKNOWN_IMP
- void Create(IProgress *progress, bool inSizeIsMain);
- void SetProgressOffset(UInt64 progressOffset);
- HRESULT SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize);
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
-};
-
-void CMtProgressMixer2::Create(IProgress *progress, bool inSizeIsMain)
-{
- Progress = progress;
- Progress.QueryInterface(IID_ICompressProgressInfo, &RatioProgress);
- _inSizeIsMain = inSizeIsMain;
- ProgressOffset = InSizes[0] = InSizes[1] = OutSizes[0] = OutSizes[1] = 0;
-}
-
-void CMtProgressMixer2::SetProgressOffset(UInt64 progressOffset)
-{
- CriticalSection.Enter();
- InSizes[1] = OutSizes[1] = 0;
- ProgressOffset = progressOffset;
- CriticalSection.Leave();
-}
-
-HRESULT CMtProgressMixer2::SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize)
-{
- NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);
- if (index == 0 && RatioProgress)
- {
- RINOK(RatioProgress->SetRatioInfo(inSize, outSize));
- }
- if (inSize != 0)
- InSizes[index] = *inSize;
- if (outSize != 0)
- OutSizes[index] = *outSize;
- UInt64 v = ProgressOffset + (_inSizeIsMain ?
- (InSizes[0] + InSizes[1]) :
- (OutSizes[0] + OutSizes[1]));
- return Progress->SetCompleted(&v);
-}
-
-STDMETHODIMP CMtProgressMixer2::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
-{
- return SetRatioInfo(0, inSize, outSize);
-}
-
-class CMtProgressMixer:
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
-public:
- CMtProgressMixer2 *Mixer2;
- CMyComPtr<ICompressProgressInfo> RatioProgress;
- void Create(IProgress *progress, bool inSizeIsMain);
- MY_UNKNOWN_IMP
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
-};
-
-void CMtProgressMixer::Create(IProgress *progress, bool inSizeIsMain)
-{
- Mixer2 = new CMtProgressMixer2;
- RatioProgress = Mixer2;
- Mixer2->Create(progress, inSizeIsMain);
-}
-
-STDMETHODIMP CMtProgressMixer::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
-{
- return Mixer2->SetRatioInfo(1, inSize, outSize);
-}
-
-
-#endif
-
-
-static HRESULT UpdateItemOldData(COutArchive &archive,
- IInStream *inStream,
- const CUpdateItem &ui, CItemEx &item,
- /* bool izZip64, */
- ICompressProgressInfo *progress,
- UInt64 &complexity)
-{
- if (ui.NewProperties)
- {
- if (item.HasDescriptor())
- return E_NOTIMPL;
-
- // use old name size.
- // CUpdateRange range(item.GetLocalExtraPosition(), item.LocalExtraSize + item.PackSize);
- CUpdateRange range(item.GetDataPosition(), item.PackSize);
-
- // item.ExternalAttributes = ui.Attributes;
- // Test it
- item.Name = ui.Name;
- item.SetUtf8(ui.IsUtf8);
- item.Time = ui.Time;
- item.NtfsMTime = ui.NtfsMTime;
- item.NtfsATime = ui.NtfsATime;
- item.NtfsCTime = ui.NtfsCTime;
- item.NtfsTimeIsDefined = ui.NtfsTimeIsDefined;
-
- item.CentralExtra.RemoveUnknownSubBlocks();
- item.LocalExtra.RemoveUnknownSubBlocks();
-
- archive.PrepareWriteCompressedData2((UInt16)item.Name.Length(), item.UnPackSize, item.PackSize, item.LocalExtra.HasWzAesField());
- item.LocalHeaderPosition = archive.GetCurrentPosition();
- archive.SeekToPackedDataPosition();
- RINOK(WriteRange(inStream, archive, range, progress));
- complexity += range.Size;
- archive.WriteLocalHeader(item);
- }
- else
- {
- CUpdateRange range(item.LocalHeaderPosition, item.GetLocalFullSize());
-
- // set new header position
- item.LocalHeaderPosition = archive.GetCurrentPosition();
-
- RINOK(WriteRange(inStream, archive, range, progress));
- complexity += range.Size;
- archive.MoveBasePosition(range.Size);
- }
- return S_OK;
-}
-
-static void WriteDirHeader(COutArchive &archive, const CCompressionMethodMode *options,
- const CUpdateItem &ui, CItemEx &item)
-{
- SetFileHeader(archive, *options, ui, item);
- archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);
- archive.WriteLocalHeader(item);
-}
-
-static HRESULT Update2St(
- DECL_EXTERNAL_CODECS_LOC_VARS
- COutArchive &archive,
- CInArchive *inArchive,
- IInStream *inStream,
- const CObjectVector<CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- const CCompressionMethodMode *options,
- const CByteBuffer *comment,
- IArchiveUpdateCallback *updateCallback)
-{
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(updateCallback, true);
-
- CAddCommon compressor(*options);
-
- CObjectVector<CItem> items;
- UInt64 unpackSizeTotal = 0, packSizeTotal = 0;
-
- for (int itemIndex = 0; itemIndex < updateItems.Size(); itemIndex++)
- {
- lps->InSize = unpackSizeTotal;
- lps->OutSize = packSizeTotal;
- RINOK(lps->SetCur());
- const CUpdateItem &ui = updateItems[itemIndex];
- CItemEx item;
- if (!ui.NewProperties || !ui.NewData)
- {
- item = inputItems[ui.IndexInArchive];
- if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)
- return E_NOTIMPL;
- }
-
- if (ui.NewData)
- {
- bool isDir = ((ui.NewProperties) ? ui.IsDir : item.IsDir());
- if (isDir)
- {
- WriteDirHeader(archive, options, ui, item);
- }
- else
- {
- CMyComPtr<ISequentialInStream> fileInStream;
- HRESULT res = updateCallback->GetStream(ui.IndexInClient, &fileInStream);
- if (res == S_FALSE)
- {
- lps->ProgressOffset += ui.Size;
- RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- continue;
- }
- RINOK(res);
-
- // file Size can be 64-bit !!!
- SetFileHeader(archive, *options, ui, item);
- archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);
- CCompressingResult compressingResult;
- CMyComPtr<IOutStream> outStream;
- archive.CreateStreamForCompressing(&outStream);
- RINOK(compressor.Compress(
- EXTERNAL_CODECS_LOC_VARS
- fileInStream, outStream, progress, compressingResult));
- SetItemInfoFromCompressingResult(compressingResult, options->IsAesMode, options->AesKeyMode, item);
- archive.WriteLocalHeader(item);
- RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- unpackSizeTotal += item.UnPackSize;
- packSizeTotal += item.PackSize;
- }
- }
- else
- {
- UInt64 complexity = 0;
- lps->SendRatio = false;
- RINOK(UpdateItemOldData(archive, inStream, ui, item, progress, complexity));
- lps->SendRatio = true;
- lps->ProgressOffset += complexity;
- }
- items.Add(item);
- lps->ProgressOffset += NFileHeader::kLocalBlockSize;
- }
- archive.WriteCentralDir(items, comment);
- return S_OK;
-}
-
-static HRESULT Update2(
- DECL_EXTERNAL_CODECS_LOC_VARS
- COutArchive &archive,
- CInArchive *inArchive,
- IInStream *inStream,
- const CObjectVector<CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- const CCompressionMethodMode *options,
- const CByteBuffer *comment,
- IArchiveUpdateCallback *updateCallback)
-{
- UInt64 complexity = 0;
- UInt64 numFilesToCompress = 0;
- UInt64 numBytesToCompress = 0;
-
- int i;
- for(i = 0; i < updateItems.Size(); i++)
- {
- const CUpdateItem &ui = updateItems[i];
- if (ui.NewData)
- {
- complexity += ui.Size;
- numBytesToCompress += ui.Size;
- numFilesToCompress++;
- /*
- if (ui.Commented)
- complexity += ui.CommentRange.Size;
- */
- }
- else
- {
- CItemEx inputItem = inputItems[ui.IndexInArchive];
- if (inArchive->ReadLocalItemAfterCdItemFull(inputItem) != S_OK)
- return E_NOTIMPL;
- complexity += inputItem.GetLocalFullSize();
- // complexity += inputItem.GetCentralExtraPlusCommentSize();
- }
- complexity += NFileHeader::kLocalBlockSize;
- complexity += NFileHeader::kCentralBlockSize;
- }
-
- if (comment)
- complexity += comment->GetCapacity();
- complexity++; // end of central
- updateCallback->SetTotal(complexity);
-
- CAddCommon compressor(*options);
-
- complexity = 0;
-
- #ifndef _7ZIP_ST
-
- const size_t kNumMaxThreads = (1 << 10);
- UInt32 numThreads = options->NumThreads;
- if (numThreads > kNumMaxThreads)
- numThreads = kNumMaxThreads;
-
- const size_t kMemPerThread = (1 << 25);
- const size_t kBlockSize = 1 << 16;
-
- CCompressionMethodMode options2;
- if (options != 0)
- options2 = *options;
-
- bool mtMode = ((options != 0) && (numThreads > 1));
-
- if (numFilesToCompress <= 1)
- mtMode = false;
-
- if (mtMode)
- {
- Byte method = options->MethodSequence.Front();
- if (method == NFileHeader::NCompressionMethod::kStored && !options->PasswordIsDefined)
- mtMode = false;
- if (method == NFileHeader::NCompressionMethod::kBZip2)
- {
- UInt64 averageSize = numBytesToCompress / numFilesToCompress;
- UInt32 blockSize = options->DicSize;
- if (blockSize == 0)
- blockSize = 1;
- UInt64 averageNumberOfBlocks = averageSize / blockSize;
- UInt32 numBZip2Threads = 32;
- if (averageNumberOfBlocks < numBZip2Threads)
- numBZip2Threads = (UInt32)averageNumberOfBlocks;
- if (numBZip2Threads < 1)
- numBZip2Threads = 1;
- numThreads = numThreads / numBZip2Threads;
- options2.NumThreads = numBZip2Threads;
- if (numThreads <= 1)
- mtMode = false;
- }
- if (method == NFileHeader::NCompressionMethod::kLZMA)
- {
- UInt32 numLZMAThreads = (options->Algo > 0 ? 2 : 1);
- numThreads /= numLZMAThreads;
- options2.NumThreads = numLZMAThreads;
- if (numThreads <= 1)
- mtMode = false;
- }
- }
-
- if (!mtMode)
- #endif
- return Update2St(
- EXTERNAL_CODECS_LOC_VARS
- archive, inArchive,inStream,
- inputItems, updateItems, options, comment, updateCallback);
-
-
- #ifndef _7ZIP_ST
-
- CObjectVector<CItem> items;
-
- CMtProgressMixer *mtProgressMixerSpec = new CMtProgressMixer;
- CMyComPtr<ICompressProgressInfo> progress = mtProgressMixerSpec;
- mtProgressMixerSpec->Create(updateCallback, true);
-
- CMtCompressProgressMixer mtCompressProgressMixer;
- mtCompressProgressMixer.Init(numThreads, mtProgressMixerSpec->RatioProgress);
-
- CMemBlockManagerMt memManager(kBlockSize);
- CMemRefs refs(&memManager);
-
- CThreads threads;
- CRecordVector<HANDLE> compressingCompletedEvents;
- CRecordVector<int> threadIndices; // list threads in order of updateItems
-
- {
- RINOK(memManager.AllocateSpaceAlways((size_t)numThreads * (kMemPerThread / kBlockSize)));
- for(i = 0; i < updateItems.Size(); i++)
- refs.Refs.Add(CMemBlocks2());
-
- UInt32 i;
- for (i = 0; i < numThreads; i++)
- threads.Threads.Add(CThreadInfo(options2));
-
- for (i = 0; i < numThreads; i++)
- {
- CThreadInfo &threadInfo = threads.Threads[i];
- #ifdef EXTERNAL_CODECS
- threadInfo._codecsInfo = codecsInfo;
- threadInfo._externalCodecs = externalCodecs;
- #endif
- RINOK(threadInfo.CreateEvents());
- threadInfo.OutStreamSpec = new COutMemStream(&memManager);
- RINOK(threadInfo.OutStreamSpec->CreateEvents());
- threadInfo.OutStream = threadInfo.OutStreamSpec;
- threadInfo.IsFree = true;
- threadInfo.ProgressSpec = new CMtCompressProgress();
- threadInfo.Progress = threadInfo.ProgressSpec;
- threadInfo.ProgressSpec->Init(&mtCompressProgressMixer, (int)i);
- RINOK(threadInfo.CreateThread());
- }
- }
- int mtItemIndex = 0;
-
- int itemIndex = 0;
- int lastRealStreamItemIndex = -1;
-
- while (itemIndex < updateItems.Size())
- {
- if ((UInt32)threadIndices.Size() < numThreads && mtItemIndex < updateItems.Size())
- {
- const CUpdateItem &ui = updateItems[mtItemIndex++];
- if (!ui.NewData)
- continue;
- CItemEx item;
- if (ui.NewProperties)
- {
- if (ui.IsDir)
- continue;
- }
- else
- {
- item = inputItems[ui.IndexInArchive];
- if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)
- return E_NOTIMPL;
- if (item.IsDir())
- continue;
- }
- CMyComPtr<ISequentialInStream> fileInStream;
- {
- NWindows::NSynchronization::CCriticalSectionLock lock(mtProgressMixerSpec->Mixer2->CriticalSection);
- HRESULT res = updateCallback->GetStream(ui.IndexInClient, &fileInStream);
- if (res == S_FALSE)
- {
- complexity += ui.Size;
- complexity += NFileHeader::kLocalBlockSize;
- mtProgressMixerSpec->Mixer2->SetProgressOffset(complexity);
- RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- refs.Refs[mtItemIndex - 1].Skip = true;
- continue;
- }
- RINOK(res);
- RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- }
-
- for (UInt32 i = 0; i < numThreads; i++)
- {
- CThreadInfo &threadInfo = threads.Threads[i];
- if (threadInfo.IsFree)
- {
- threadInfo.IsFree = false;
- threadInfo.InStream = fileInStream;
-
- // !!!!! we must release ref before sending event
- // BUG was here in v4.43 and v4.44. It could change ref counter in two threads in same time
- fileInStream.Release();
-
- threadInfo.OutStreamSpec->Init();
- threadInfo.ProgressSpec->Reinit();
- threadInfo.CompressEvent.Set();
- threadInfo.UpdateIndex = mtItemIndex - 1;
-
- compressingCompletedEvents.Add(threadInfo.CompressionCompletedEvent);
- threadIndices.Add(i);
- break;
- }
- }
- continue;
- }
-
- if (refs.Refs[itemIndex].Skip)
- {
- itemIndex++;
- continue;
- }
-
- const CUpdateItem &ui = updateItems[itemIndex];
-
- CItemEx item;
- if (!ui.NewProperties || !ui.NewData)
- {
- item = inputItems[ui.IndexInArchive];
- if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)
- return E_NOTIMPL;
- }
-
- if (ui.NewData)
- {
- bool isDir = ((ui.NewProperties) ? ui.IsDir : item.IsDir());
- if (isDir)
- {
- WriteDirHeader(archive, options, ui, item);
- }
- else
- {
- if (lastRealStreamItemIndex < itemIndex)
- {
- lastRealStreamItemIndex = itemIndex;
- SetFileHeader(archive, *options, ui, item);
- // file Size can be 64-bit !!!
- archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);
- }
-
- CMemBlocks2 &memRef = refs.Refs[itemIndex];
- if (memRef.Defined)
- {
- CMyComPtr<IOutStream> outStream;
- archive.CreateStreamForCompressing(&outStream);
- memRef.WriteToStream(memManager.GetBlockSize(), outStream);
- SetItemInfoFromCompressingResult(memRef.CompressingResult,
- options->IsAesMode, options->AesKeyMode, item);
- SetFileHeader(archive, *options, ui, item);
- archive.WriteLocalHeader(item);
- // RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- memRef.FreeOpt(&memManager);
- }
- else
- {
- {
- CThreadInfo &thread = threads.Threads[threadIndices.Front()];
- if (!thread.OutStreamSpec->WasUnlockEventSent())
- {
- CMyComPtr<IOutStream> outStream;
- archive.CreateStreamForCompressing(&outStream);
- thread.OutStreamSpec->SetOutStream(outStream);
- thread.OutStreamSpec->SetRealStreamMode();
- }
- }
-
- DWORD result = ::WaitForMultipleObjects(compressingCompletedEvents.Size(),
- &compressingCompletedEvents.Front(), FALSE, INFINITE);
- int t = (int)(result - WAIT_OBJECT_0);
- CThreadInfo &threadInfo = threads.Threads[threadIndices[t]];
- threadInfo.InStream.Release();
- threadInfo.IsFree = true;
- RINOK(threadInfo.Result);
- threadIndices.Delete(t);
- compressingCompletedEvents.Delete(t);
- if (t == 0)
- {
- RINOK(threadInfo.OutStreamSpec->WriteToRealStream());
- threadInfo.OutStreamSpec->ReleaseOutStream();
- SetItemInfoFromCompressingResult(threadInfo.CompressingResult,
- options->IsAesMode, options->AesKeyMode, item);
- SetFileHeader(archive, *options, ui, item);
- archive.WriteLocalHeader(item);
- }
- else
- {
- CMemBlocks2 &memRef = refs.Refs[threadInfo.UpdateIndex];
- threadInfo.OutStreamSpec->DetachData(memRef);
- memRef.CompressingResult = threadInfo.CompressingResult;
- memRef.Defined = true;
- continue;
- }
- }
- }
- }
- else
- {
- RINOK(UpdateItemOldData(archive, inStream, ui, item, progress, complexity));
- }
- items.Add(item);
- complexity += NFileHeader::kLocalBlockSize;
- mtProgressMixerSpec->Mixer2->SetProgressOffset(complexity);
- itemIndex++;
- }
- archive.WriteCentralDir(items, comment);
- return S_OK;
- #endif
-}
-
-static const size_t kCacheBlockSize = (1 << 20);
-static const size_t kCacheSize = (kCacheBlockSize << 2);
-static const size_t kCacheMask = (kCacheSize - 1);
-
-class CCacheOutStream:
- public IOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<IOutStream> _stream;
- Byte *_cache;
- UInt64 _virtPos;
- UInt64 _virtSize;
- UInt64 _phyPos;
- UInt64 _phySize; // <= _virtSize
- UInt64 _cachedPos; // (_cachedPos + _cachedSize) <= _virtSize
- size_t _cachedSize;
-
- HRESULT MyWrite(size_t size);
- HRESULT MyWriteBlock()
- {
- return MyWrite(kCacheBlockSize - ((size_t)_cachedPos & (kCacheBlockSize - 1)));
- }
- HRESULT FlushCache();
-public:
- CCacheOutStream(): _cache(0) {}
- ~CCacheOutStream();
- bool Allocate();
- HRESULT Init(IOutStream *stream);
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
- STDMETHOD(SetSize)(UInt64 newSize);
-};
-
-bool CCacheOutStream::Allocate()
-{
- if (!_cache)
- _cache = (Byte *)::MidAlloc(kCacheSize);
- return (_cache != NULL);
-}
-
-HRESULT CCacheOutStream::Init(IOutStream *stream)
-{
- _virtPos = _phyPos = 0;
- _stream = stream;
- RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &_virtPos));
- RINOK(_stream->Seek(0, STREAM_SEEK_END, &_virtSize));
- RINOK(_stream->Seek(_virtPos, STREAM_SEEK_SET, &_virtPos));
- _phyPos = _virtPos;
- _phySize = _virtSize;
- _cachedPos = 0;
- _cachedSize = 0;
- return S_OK;
-}
-
-HRESULT CCacheOutStream::MyWrite(size_t size)
-{
- while (size != 0 && _cachedSize != 0)
- {
- if (_phyPos != _cachedPos)
- {
- RINOK(_stream->Seek(_cachedPos, STREAM_SEEK_SET, &_phyPos));
- }
- size_t pos = (size_t)_cachedPos & kCacheMask;
- size_t curSize = MyMin(kCacheSize - pos, _cachedSize);
- curSize = MyMin(curSize, size);
- RINOK(WriteStream(_stream, _cache + pos, curSize));
- _phyPos += curSize;
- if (_phySize < _phyPos)
- _phySize = _phyPos;
- _cachedPos += curSize;
- _cachedSize -= curSize;
- size -= curSize;
- }
- return S_OK;
-}
-
-HRESULT CCacheOutStream::FlushCache()
-{
- return MyWrite(_cachedSize);
-}
-
-CCacheOutStream::~CCacheOutStream()
-{
- FlushCache();
- if (_virtSize != _phySize)
- _stream->SetSize(_virtSize);
- if (_virtPos != _phyPos)
- _stream->Seek(_virtPos, STREAM_SEEK_SET, NULL);
- ::MidFree(_cache);
-}
-
-STDMETHODIMP CCacheOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (size == 0)
- return S_OK;
-
- UInt64 zerosStart = _virtPos;
- if (_cachedSize != 0)
- {
- if (_virtPos < _cachedPos)
- {
- RINOK(FlushCache());
- }
- else
- {
- UInt64 cachedEnd = _cachedPos + _cachedSize;
- if (cachedEnd < _virtPos)
- {
- if (cachedEnd < _phySize)
- {
- RINOK(FlushCache());
- }
- else
- zerosStart = cachedEnd;
- }
- }
- }
-
- if (_cachedSize == 0 && _phySize < _virtPos)
- _cachedPos = zerosStart = _phySize;
-
- if (zerosStart != _virtPos)
- {
- // write zeros to [cachedEnd ... _virtPos)
-
- for (;;)
- {
- UInt64 cachedEnd = _cachedPos + _cachedSize;
- size_t endPos = (size_t)cachedEnd & kCacheMask;
- size_t curSize = kCacheSize - endPos;
- if (curSize > _virtPos - cachedEnd)
- curSize = (size_t)(_virtPos - cachedEnd);
- if (curSize == 0)
- break;
- while (curSize > (kCacheSize - _cachedSize))
- {
- RINOK(MyWriteBlock());
- }
- memset(_cache + endPos, 0, curSize);
- _cachedSize += curSize;
- }
- }
-
- if (_cachedSize == 0)
- _cachedPos = _virtPos;
-
- size_t pos = (size_t)_virtPos & kCacheMask;
- size = (UInt32)MyMin((size_t)size, kCacheSize - pos);
- UInt64 cachedEnd = _cachedPos + _cachedSize;
- if (_virtPos != cachedEnd) // _virtPos < cachedEnd
- size = (UInt32)MyMin((size_t)size, (size_t)(cachedEnd - _virtPos));
- else
- {
- // _virtPos == cachedEnd
- if (_cachedSize == kCacheSize)
- {
- RINOK(MyWriteBlock());
- }
- size_t startPos = (size_t)_cachedPos & kCacheMask;
- if (startPos > pos)
- size = (UInt32)MyMin((size_t)size, (size_t)(startPos - pos));
- _cachedSize += size;
- }
- memcpy(_cache + pos, data, size);
- if (processedSize)
- *processedSize = size;
- _virtPos += size;
- if (_virtSize < _virtPos)
- _virtSize = _virtPos;
- return S_OK;
-}
-
-STDMETHODIMP CCacheOutStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch(seekOrigin)
- {
- case STREAM_SEEK_SET: _virtPos = offset; break;
- case STREAM_SEEK_CUR: _virtPos += offset; break;
- case STREAM_SEEK_END: _virtPos = _virtSize + offset; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
-}
-
-STDMETHODIMP CCacheOutStream::SetSize(UInt64 newSize)
-{
- _virtSize = newSize;
- if (newSize < _phySize)
- {
- RINOK(_stream->SetSize(newSize));
- _phySize = newSize;
- }
- if (newSize <= _cachedPos)
- {
- _cachedSize = 0;
- _cachedPos = newSize;
- }
- if (newSize < _cachedPos + _cachedSize)
- _cachedSize = (size_t)(newSize - _cachedPos);
- return S_OK;
-}
-
-
-HRESULT Update(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const CObjectVector<CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- ISequentialOutStream *seqOutStream,
- CInArchive *inArchive,
- CCompressionMethodMode *compressionMethodMode,
- IArchiveUpdateCallback *updateCallback)
-{
- CMyComPtr<IOutStream> outStream;
- {
- CMyComPtr<IOutStream> outStreamReal;
- seqOutStream->QueryInterface(IID_IOutStream, (void **)&outStreamReal);
- if (!outStreamReal)
- return E_NOTIMPL;
- CCacheOutStream *cacheStream = new CCacheOutStream();
- outStream = cacheStream;
- if (!cacheStream->Allocate())
- return E_OUTOFMEMORY;
- RINOK(cacheStream->Init(outStreamReal));
- }
-
- if (inArchive)
- {
- if (inArchive->ArcInfo.Base != 0 ||
- inArchive->ArcInfo.StartPosition != 0 ||
- !inArchive->IsOkHeaders)
- return E_NOTIMPL;
- }
-
- COutArchive outArchive;
- outArchive.Create(outStream);
- /*
- if (inArchive && inArchive->ArcInfo.StartPosition > 0)
- {
- CMyComPtr<ISequentialInStream> inStream;
- inStream.Attach(inArchive->CreateLimitedStream(0, inArchive->ArcInfo.StartPosition));
- RINOK(CopyBlockToArchive(inStream, outArchive, NULL));
- outArchive.MoveBasePosition(inArchive->ArcInfo.StartPosition);
- }
- */
- CMyComPtr<IInStream> inStream;
- if (inArchive)
- inStream.Attach(inArchive->CreateStream());
-
- return Update2(
- EXTERNAL_CODECS_LOC_VARS
- outArchive, inArchive, inStream,
- inputItems, updateItems,
- compressionMethodMode,
- inArchive ? &inArchive->ArcInfo.Comment : NULL,
- updateCallback);
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipUpdate.h b/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipUpdate.h
deleted file mode 100644
index eee16738c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Zip/ZipUpdate.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Zip/Update.h
-
-#ifndef __ZIP_UPDATE_H
-#define __ZIP_UPDATE_H
-
-#include "../../ICoder.h"
-#include "../IArchive.h"
-
-#include "../../Common/CreateCoder.h"
-
-#include "ZipCompressionMode.h"
-#include "ZipIn.h"
-
-namespace NArchive {
-namespace NZip {
-
-struct CUpdateRange
-{
- UInt64 Position;
- UInt64 Size;
- CUpdateRange() {};
- CUpdateRange(UInt64 position, UInt64 size): Position(position), Size(size) {};
-};
-
-struct CUpdateItem
-{
- bool NewData;
- bool NewProperties;
- bool IsDir;
- bool NtfsTimeIsDefined;
- bool IsUtf8;
- int IndexInArchive;
- int IndexInClient;
- UInt32 Attributes;
- UInt32 Time;
- UInt64 Size;
- AString Name;
- // bool Commented;
- // CUpdateRange CommentRange;
- FILETIME NtfsMTime;
- FILETIME NtfsATime;
- FILETIME NtfsCTime;
-
- CUpdateItem(): NtfsTimeIsDefined(false), IsUtf8(false), Size(0) {}
-};
-
-HRESULT Update(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const CObjectVector<CItemEx> &inputItems,
- const CObjectVector<CUpdateItem> &updateItems,
- ISequentialOutStream *seqOutStream,
- CInArchive *inArchive,
- CCompressionMethodMode *compressionMethodMode,
- IArchiveUpdateCallback *updateCallback);
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/InMemStream.cpp b/src/libs/7zip/win/CPP/7zip/Common/InMemStream.cpp
deleted file mode 100644
index 38c5c92c3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/InMemStream.cpp
+++ /dev/null
@@ -1,222 +0,0 @@
-// InMemStream.cpp
-
-#include "StdAfx.h"
-
-#include <stdio.h>
-
-#include "Windows/Thread.h"
-
-#include "InMemStream.h"
-#include "../../Common/Defs.h"
-
-void CStreamInfo::Free(IInMemStreamMtCallback *callback)
-{
- for (int i = 0; i < Blocks.Size(); i++)
- {
- callback->FreeBlock(Blocks[i]);
- Blocks[i] = 0;
- }
-}
-
-bool CInMemStreamMt::Create(int numSubStreams, UInt64 subStreamSize)
-{
- Free();
- _subStreamSize = subStreamSize;
- size_t blockSize = Callback->GetBlockSize();
- for (int i = 0; i < numSubStreams; i++)
- {
- _streams.Add(CStreamInfo());
- CStreamInfo &blocks = _streams.Back();
- blocks.Create();
- for (UInt64 j = 0; (UInt64)j * blockSize < _subStreamSize; j++)
- blocks.Blocks.Add(0);
- }
- if (!_streamIndexAllocator.AllocateList(numSubStreams))
- return false;
- return true;
-}
-
-void CInMemStreamMt::Free()
-{
- while(_streams.Size() > 0)
- {
- _streams.Back().Free(Callback);
- _streams.DeleteBack();
- }
-}
-
-HRESULT CInMemStreamMt::Read()
-{
- for (;;)
- {
- // printf("\n_streamIndexAllocator.AllocateItem\n");
- int index = _streamIndexAllocator.AllocateItem();
- /*
- if (_stopReading)
- return E_ABORT;
- */
- // printf("\nread Index = %d\n", index);
- CStreamInfo &blocks = _streams[index];
- blocks.Init();
- Callback->AddStreamIndexToQueue(index);
-
- for (;;)
- {
- const Byte *p = (const Byte *)blocks.Blocks[blocks.LastBlockIndex];
- if (p == 0)
- {
- void **pp = &blocks.Blocks[blocks.LastBlockIndex];
- HRESULT res = Callback->AllocateBlock(pp);
- p = (const Byte *)*pp;
- RINOK(res);
- if (p == 0)
- return E_FAIL;
- }
- size_t blockSize = Callback->GetBlockSize();
- UInt32 curSize = (UInt32)(blockSize - blocks.LastBlockPos);
- UInt32 realProcessedSize;
- UInt64 pos64 = (UInt64)blocks.LastBlockIndex * blockSize + blocks.LastBlockPos;
- if (curSize > _subStreamSize - pos64)
- curSize = (UInt32)(_subStreamSize - pos64);
- RINOK(_stream->Read((void *)(p + blocks.LastBlockPos), curSize, &realProcessedSize));
-
- blocks.Cs->Enter();
- if (realProcessedSize == 0)
- {
- blocks.StreamWasFinished = true;
- blocks.CanReadEvent->Set();
- blocks.Cs->Leave();
-
- Callback->AddStreamIndexToQueue(-1);
- return S_OK;
- }
-
- blocks.LastBlockPos += realProcessedSize;
- if (blocks.LastBlockPos == blockSize)
- {
- blocks.LastBlockPos = 0;
- blocks.LastBlockIndex++;
- }
- pos64 += realProcessedSize;
- if (pos64 >= _subStreamSize)
- blocks.StreamWasFinished = true;
- blocks.CanReadEvent->Set();
- blocks.Cs->Leave();
- if (pos64 >= _subStreamSize)
- break;
- }
- }
-}
-
-static THREAD_FUNC_DECL CoderThread(void *threadCoderInfo)
-{
- ((CInMemStreamMt *)threadCoderInfo)->ReadResult = ((CInMemStreamMt *)threadCoderInfo)->Read();
- return 0;
-}
-
-HRes CInMemStreamMt::StartReadThread()
-{
- // _stopReading = false;
- NWindows::CThread Thread;
- return Thread.Create(CoderThread, this);
-}
-
-void CInMemStreamMt::FreeSubStream(int subStreamIndex)
-{
- // printf("\nFreeSubStream\n");
- _streams[subStreamIndex].Free(Callback);
- _streamIndexAllocator.FreeItem(subStreamIndex);
- // printf("\nFreeSubStream end\n");
-}
-
-HRESULT CInMemStreamMt::ReadSubStream(int subStreamIndex, void *data, UInt32 size, UInt32 *processedSize, bool keepData)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- CStreamInfo &blocks = _streams[subStreamIndex];
- while (size > 0)
- {
- if (blocks.CurBlockPos == Callback->GetBlockSize())
- {
- blocks.CurBlockPos = 0;
- blocks.CurBlockIndex++;
- }
- UInt32 curSize;
- UInt32 curPos = blocks.CurBlockPos;
-
- blocks.Cs->Enter();
- if (blocks.CurBlockIndex == blocks.LastBlockIndex)
- {
- curSize = blocks.LastBlockPos - curPos;
- if (curSize == 0)
- {
- if (blocks.StreamWasFinished)
- {
- blocks.Cs->Leave();
- void *p = blocks.Blocks[blocks.CurBlockIndex];
- if (p != 0 && !keepData)
- {
- Callback->FreeBlock(p);
- blocks.Blocks[blocks.CurBlockIndex] = 0;
- }
- return S_OK;
- }
- blocks.CanReadEvent->Reset();
- blocks.Cs->Leave();
- // printf("\nBlock Lock\n");
- blocks.CanReadEvent->Lock();
- // printf("\nAfter Lock\n");
- if (blocks.ExitResult != S_OK)
- return blocks.ExitResult;
- continue;
- }
- }
- else
- curSize = Callback->GetBlockSize() - curPos;
- blocks.Cs->Leave();
-
- if (curSize > size)
- curSize = size;
- void *p = blocks.Blocks[blocks.CurBlockIndex];
- memmove(data, (const Byte *)p + curPos, curSize);
- data = (void *)((Byte *)data + curSize);
- size -= curSize;
- if (processedSize != NULL)
- *processedSize += curSize;
- curPos += curSize;
-
- bool needFree = false;
- blocks.CurBlockPos = curPos;
-
- if (curPos == Callback->GetBlockSize())
- needFree = true;
- blocks.Cs->Enter();
- if (blocks.CurBlockIndex == blocks.LastBlockIndex &&
- blocks.CurBlockPos == blocks.LastBlockPos &&
- blocks.StreamWasFinished)
- needFree = true;
- blocks.Cs->Leave();
-
- if (needFree && !keepData)
- {
- Callback->FreeBlock(p);
- blocks.Blocks[blocks.CurBlockIndex] = 0;
- }
- return S_OK;
- }
- return S_OK;
-}
-
-STDMETHODIMP CInMemStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize;
- HRESULT result = mtStream->ReadSubStream(Index, data, size, &realProcessedSize, _keepData);
- if (processedSize != NULL)
- *processedSize = realProcessedSize;
- if (realProcessedSize != 0)
- {
- // printf("\ns = %d\n", Index);
- }
- _size += realProcessedSize;
- return result;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/InMemStream.h b/src/libs/7zip/win/CPP/7zip/Common/InMemStream.h
deleted file mode 100644
index ec493977c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/InMemStream.h
+++ /dev/null
@@ -1,284 +0,0 @@
-// InMemStream.h
-
-#ifndef __IN_MEM_STREAM_H
-#define __IN_MEM_STREAM_H
-
-#include <stdio.h>
-
-#include "../../../C/Alloc.h"
-
-#include "../../Common/MyCom.h"
-
-#include "MemBlocks.h"
-
-class CIntListCheck
-{
-protected:
- int *_data;
-public:
- CIntListCheck(): _data(0) {}
- ~CIntListCheck() { FreeList(); }
-
- bool AllocateList(int numItems)
- {
- FreeList();
- if (numItems == 0)
- return true;
- _data = (int *)::MyAlloc(numItems * sizeof(int));
- return (_data != 0);
- }
-
- void FreeList()
- {
- ::MyFree(_data);
- _data = 0;
- }
-};
-
-
-class CResourceList : public CIntListCheck
-{
- int _headFree;
-public:
- CResourceList(): _headFree(-1) {}
-
- bool AllocateList(int numItems)
- {
- FreeList();
- if (numItems == 0)
- return true;
- if (!CIntListCheck::AllocateList(numItems))
- return false;
- for (int i = 0; i < numItems; i++)
- _data[i] = i + 1;
- _data[numItems - 1] = -1;
- _headFree = 0;
- return true;
- }
-
- void FreeList()
- {
- CIntListCheck::FreeList();
- _headFree = -1;
- }
-
- int AllocateItem()
- {
- int res = _headFree;
- if (res >= 0)
- _headFree = _data[res];
- return res;
- }
-
- void FreeItem(int index)
- {
- if (index < 0)
- return;
- _data[index] = _headFree;
- _headFree = index;
- }
-};
-
-class CResourceListMt: public CResourceList
-{
- NWindows::NSynchronization::CCriticalSection _criticalSection;
-public:
- NWindows::NSynchronization::CSemaphore Semaphore;
-
- HRes AllocateList(int numItems)
- {
- if (!CResourceList::AllocateList(numItems))
- return E_OUTOFMEMORY;
- Semaphore.Close();
- return Semaphore.Create(numItems, numItems);
- }
-
- int AllocateItem()
- {
- Semaphore.Lock();
- _criticalSection.Enter();
- int res = CResourceList::AllocateItem();
- _criticalSection.Leave();
- return res;
- }
-
- void FreeItem(int index)
- {
- if (index < 0)
- return;
- _criticalSection.Enter();
- CResourceList::FreeItem(index);
- _criticalSection.Leave();
- Semaphore.Release();
- }
-};
-
-class CIntQueueMt: public CIntListCheck
-{
- int _numItems;
- int _head;
- int _cur;
-public:
- CIntQueueMt(): _numItems(0), _head(0), _cur(0) {}
- NWindows::NSynchronization::CSemaphore Semaphore;
-
- HRes AllocateList(int numItems)
- {
- FreeList();
- if (numItems == 0)
- return S_OK;
- if (!CIntListCheck::AllocateList(numItems))
- return E_OUTOFMEMORY;
- _numItems = numItems;
- return Semaphore.Create(0, numItems);
- }
-
- void FreeList()
- {
- CIntListCheck::FreeList();
- _numItems = 0;
- _head = 0;
- _cur = 0;
- }
-
- void AddItem(int value)
- {
- _data[_head++] = value;
- if (_head == _numItems)
- _head = 0;
- Semaphore.Release();
- // printf("\nRelease prev = %d\n", previousCount);
- }
-
- int GetItem()
- {
- // Semaphore.Lock();
- int res = _data[_cur++];
- if (_cur == _numItems)
- _cur = 0;
- return res;
- }
-};
-
-struct IInMemStreamMtCallback
-{
- // must be same for all calls
- virtual size_t GetBlockSize() = 0;
-
- // Out:
- // result != S_OK stops Reading
- // if *p = 0, result must be != S_OK;
- // Locking is allowed
- virtual HRESULT AllocateBlock(void **p) = 0;
-
- virtual void FreeBlock(void *p) = 0;
-
- // It must allow to add at least numSubStreams + 1 ,
- // where numSubStreams is value from CInMemStreamMt::Create
- // value -1 means End of stream
- // Locking is not allowed
- virtual void AddStreamIndexToQueue(int index) = 0;
-};
-
-struct CStreamInfo
-{
- CRecordVector<void *> Blocks;
-
- int LastBlockIndex;
- size_t LastBlockPos;
- bool StreamWasFinished;
-
- int CurBlockIndex;
- size_t CurBlockPos;
-
- NWindows::NSynchronization::CCriticalSection *Cs;
- NWindows::NSynchronization::CManualResetEvent *CanReadEvent;
-
- HRESULT ExitResult;
-
- CStreamInfo(): Cs(0), CanReadEvent(0), StreamWasFinished(false) { }
- ~CStreamInfo()
- {
- delete Cs;
- delete CanReadEvent;
- // Free();
- }
- void Create()
- {
- Cs = new NWindows::NSynchronization::CCriticalSection;
- CanReadEvent = new NWindows::NSynchronization::CManualResetEvent;
- }
-
- void Free(IInMemStreamMtCallback *callback);
- void Init()
- {
- LastBlockIndex = CurBlockIndex = 0;
- CurBlockPos = LastBlockPos = 0;
- StreamWasFinished = false;
- ExitResult = S_OK;
- }
-
- // res must be != S_OK
- void Exit(HRESULT res)
- {
- ExitResult = res;
- CanReadEvent->Set();
- }
-};
-
-
-class CInMemStreamMt
-{
- CMyComPtr<ISequentialInStream> _stream;
- NWindows::NSynchronization::CCriticalSection CS;
- CObjectVector<CStreamInfo> _streams;
- int _nextFreeStreamIndex;
- int _currentStreamIndex;
- UInt64 _subStreamSize;
-
- CResourceListMt _streamIndexAllocator;
-
- // bool _stopReading;
-
-public:
- HRESULT Read();
- HRESULT ReadResult;
- IInMemStreamMtCallback *Callback;
- void FreeSubStream(int subStreamIndex);
- HRESULT ReadSubStream(int subStreamIndex, void *data, UInt32 size, UInt32 *processedSize, bool keepData);
-
- // numSubStreams: min = 1, good min = numThreads
- bool Create(int numSubStreams, UInt64 subStreamSize);
- ~CInMemStreamMt() { Free(); }
- void SetStream(ISequentialInStream *stream) { _stream = stream; }
-
- // to stop reading you must implement
- // returning Error in IInMemStreamMtCallback::AllocateBlock
- // and then you must free at least one substream
- HRes StartReadThread();
-
- void Free();
-
- // you must free at least one substream after that function to unlock waiting.
- // void StopReading() { _stopReading = true; }
-};
-
-class CInMemStream:
- public ISequentialInStream,
- public CMyUnknownImp
-{
- UInt64 _size;
- bool _keepData;
-public:
- int Index;
- CInMemStreamMt *mtStream;
- void Init(bool keepData = false)
- {
- _size = 0; _keepData = keepData ;
- }
- MY_UNKNOWN_IMP
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- UInt64 GetSize() const { return _size; }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/MemBlocks.cpp b/src/libs/7zip/win/CPP/7zip/Common/MemBlocks.cpp
deleted file mode 100644
index a5b93b5e7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/MemBlocks.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-// MemBlocks.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "MemBlocks.h"
-#include "StreamUtils.h"
-
-bool CMemBlockManager::AllocateSpace(size_t numBlocks)
-{
- FreeSpace();
- if (_blockSize < sizeof(void *) || numBlocks < 1)
- return false;
- size_t totalSize = numBlocks * _blockSize;
- if (totalSize / _blockSize != numBlocks)
- return false;
- _data = ::MidAlloc(totalSize);
- if (_data == 0)
- return false;
- Byte *p = (Byte *)_data;
- for (size_t i = 0; i + 1 < numBlocks; i++, p += _blockSize)
- *(Byte **)p = (p + _blockSize);
- *(Byte **)p = 0;
- _headFree = _data;
- return true;
-}
-
-void CMemBlockManager::FreeSpace()
-{
- ::MidFree(_data);
- _data = 0;
- _headFree= 0;
-}
-
-void *CMemBlockManager::AllocateBlock()
-{
- if (_headFree == 0)
- return 0;
- void *p = _headFree;
- _headFree = *(void **)_headFree;
- return p;
-}
-
-void CMemBlockManager::FreeBlock(void *p)
-{
- if (p == 0)
- return;
- *(void **)p = _headFree;
- _headFree = p;
-}
-
-
-HRes CMemBlockManagerMt::AllocateSpace(size_t numBlocks, size_t numNoLockBlocks)
-{
- if (numNoLockBlocks > numBlocks)
- return E_INVALIDARG;
- if (!CMemBlockManager::AllocateSpace(numBlocks))
- return E_OUTOFMEMORY;
- size_t numLockBlocks = numBlocks - numNoLockBlocks;
- Semaphore.Close();
- return Semaphore.Create((LONG)numLockBlocks, (LONG)numLockBlocks);
-}
-
-HRes CMemBlockManagerMt::AllocateSpaceAlways(size_t desiredNumberOfBlocks, size_t numNoLockBlocks)
-{
- if (numNoLockBlocks > desiredNumberOfBlocks)
- return E_INVALIDARG;
- for (;;)
- {
- if (AllocateSpace(desiredNumberOfBlocks, numNoLockBlocks) == 0)
- return 0;
- if (desiredNumberOfBlocks == numNoLockBlocks)
- return E_OUTOFMEMORY;
- desiredNumberOfBlocks = numNoLockBlocks + ((desiredNumberOfBlocks - numNoLockBlocks) >> 1);
- }
-}
-
-void CMemBlockManagerMt::FreeSpace()
-{
- Semaphore.Close();
- CMemBlockManager::FreeSpace();
-}
-
-void *CMemBlockManagerMt::AllocateBlock()
-{
- // Semaphore.Lock();
- NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
- return CMemBlockManager::AllocateBlock();
-}
-
-void CMemBlockManagerMt::FreeBlock(void *p, bool lockMode)
-{
- if (p == 0)
- return;
- {
- NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
- CMemBlockManager::FreeBlock(p);
- }
- if (lockMode)
- Semaphore.Release();
-}
-
-void CMemBlocks::Free(CMemBlockManagerMt *manager)
-{
- while(Blocks.Size() > 0)
- {
- manager->FreeBlock(Blocks.Back());
- Blocks.DeleteBack();
- }
- TotalSize = 0;
-}
-
-void CMemBlocks::FreeOpt(CMemBlockManagerMt *manager)
-{
- Free(manager);
- Blocks.ClearAndFree();
-}
-
-HRESULT CMemBlocks::WriteToStream(size_t blockSize, ISequentialOutStream *outStream) const
-{
- UInt64 totalSize = TotalSize;
- for (int blockIndex = 0; totalSize > 0; blockIndex++)
- {
- UInt32 curSize = (UInt32)blockSize;
- if (totalSize < curSize)
- curSize = (UInt32)totalSize;
- if (blockIndex >= Blocks.Size())
- return E_FAIL;
- RINOK(WriteStream(outStream, Blocks[blockIndex], curSize));
- totalSize -= curSize;
- }
- return S_OK;
-}
-
-
-void CMemLockBlocks::FreeBlock(int index, CMemBlockManagerMt *memManager)
-{
- memManager->FreeBlock(Blocks[index], LockMode);
- Blocks[index] = 0;
-}
-
-void CMemLockBlocks::Free(CMemBlockManagerMt *memManager)
-{
- while (Blocks.Size() > 0)
- {
- FreeBlock(Blocks.Size() - 1, memManager);
- Blocks.DeleteBack();
- }
- TotalSize = 0;
-}
-
-HRes CMemLockBlocks::SwitchToNoLockMode(CMemBlockManagerMt *memManager)
-{
- if (LockMode)
- {
- if (Blocks.Size() > 0)
- {
- RINOK(memManager->ReleaseLockedBlocks(Blocks.Size()));
- }
- LockMode = false;
- }
- return 0;
-}
-
-void CMemLockBlocks::Detach(CMemLockBlocks &blocks, CMemBlockManagerMt *memManager)
-{
- blocks.Free(memManager);
- blocks.LockMode = LockMode;
- UInt64 totalSize = 0;
- size_t blockSize = memManager->GetBlockSize();
- for (int i = 0; i < Blocks.Size(); i++)
- {
- if (totalSize < TotalSize)
- blocks.Blocks.Add(Blocks[i]);
- else
- FreeBlock(i, memManager);
- Blocks[i] = 0;
- totalSize += blockSize;
- }
- blocks.TotalSize = TotalSize;
- Free(memManager);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/MemBlocks.h b/src/libs/7zip/win/CPP/7zip/Common/MemBlocks.h
deleted file mode 100644
index e1058ae38..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/MemBlocks.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// MemBlocks.h
-
-#ifndef __MEM_BLOCKS_H
-#define __MEM_BLOCKS_H
-
-#include "Common/MyVector.h"
-
-#include "Windows/Synchronization.h"
-
-#include "../IStream.h"
-
-class CMemBlockManager
-{
- void *_data;
- size_t _blockSize;
- void *_headFree;
-public:
- CMemBlockManager(size_t blockSize = (1 << 20)): _data(0), _blockSize(blockSize), _headFree(0) {}
- ~CMemBlockManager() { FreeSpace(); }
-
- bool AllocateSpace(size_t numBlocks);
- void FreeSpace();
- size_t GetBlockSize() const { return _blockSize; }
- void *AllocateBlock();
- void FreeBlock(void *p);
-};
-
-
-class CMemBlockManagerMt: public CMemBlockManager
-{
- NWindows::NSynchronization::CCriticalSection _criticalSection;
-public:
- NWindows::NSynchronization::CSemaphore Semaphore;
-
- CMemBlockManagerMt(size_t blockSize = (1 << 20)): CMemBlockManager(blockSize) {}
- ~CMemBlockManagerMt() { FreeSpace(); }
-
- HRes AllocateSpace(size_t numBlocks, size_t numNoLockBlocks = 0);
- HRes AllocateSpaceAlways(size_t desiredNumberOfBlocks, size_t numNoLockBlocks = 0);
- void FreeSpace();
- void *AllocateBlock();
- void FreeBlock(void *p, bool lockMode = true);
- HRes ReleaseLockedBlocks(int number) { return Semaphore.Release(number); }
-};
-
-
-class CMemBlocks
-{
- void Free(CMemBlockManagerMt *manager);
-public:
- CRecordVector<void *> Blocks;
- UInt64 TotalSize;
-
- CMemBlocks(): TotalSize(0) {}
-
- void FreeOpt(CMemBlockManagerMt *manager);
- HRESULT WriteToStream(size_t blockSize, ISequentialOutStream *outStream) const;
-};
-
-struct CMemLockBlocks: public CMemBlocks
-{
- bool LockMode;
-
- CMemLockBlocks(): LockMode(true) {};
- void Free(CMemBlockManagerMt *memManager);
- void FreeBlock(int index, CMemBlockManagerMt *memManager);
- HRes SwitchToNoLockMode(CMemBlockManagerMt *memManager);
- void Detach(CMemLockBlocks &blocks, CMemBlockManagerMt *memManager);
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/OutMemStream.cpp b/src/libs/7zip/win/CPP/7zip/Common/OutMemStream.cpp
deleted file mode 100644
index 2e92886b8..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/OutMemStream.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-// OutMemStream.cpp
-
-#include "StdAfx.h"
-
-#include "OutMemStream.h"
-
-void COutMemStream::Free()
-{
- Blocks.Free(_memManager);
- Blocks.LockMode = true;
-}
-
-void COutMemStream::Init()
-{
- WriteToRealStreamEvent.Reset();
- _unlockEventWasSent = false;
- _realStreamMode = false;
- Free();
- _curBlockPos = 0;
- _curBlockIndex = 0;
-}
-
-void COutMemStream::DetachData(CMemLockBlocks &blocks)
-{
- Blocks.Detach(blocks, _memManager);
- Free();
-}
-
-
-HRESULT COutMemStream::WriteToRealStream()
-{
- RINOK(Blocks.WriteToStream(_memManager->GetBlockSize(), OutSeqStream));
- Blocks.Free(_memManager);
- return S_OK;
-}
-
-STDMETHODIMP COutMemStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (_realStreamMode)
- return OutSeqStream->Write(data, size, processedSize);
- if (processedSize != 0)
- *processedSize = 0;
- while(size != 0)
- {
- if ((int)_curBlockIndex < Blocks.Blocks.Size())
- {
- Byte *p = (Byte *)Blocks.Blocks[(int)_curBlockIndex] + _curBlockPos;
- size_t curSize = _memManager->GetBlockSize() - _curBlockPos;
- if (size < curSize)
- curSize = size;
- memmove(p, data, curSize);
- if (processedSize != 0)
- *processedSize += (UInt32)curSize;
- data = (const void *)((const Byte *)data + curSize);
- size -= (UInt32)curSize;
- _curBlockPos += curSize;
-
- UInt64 pos64 = GetPos();
- if (pos64 > Blocks.TotalSize)
- Blocks.TotalSize = pos64;
- if (_curBlockPos == _memManager->GetBlockSize())
- {
- _curBlockIndex++;
- _curBlockPos = 0;
- }
- continue;
- }
- HANDLE events[3] = { StopWritingEvent, WriteToRealStreamEvent, /* NoLockEvent, */ _memManager->Semaphore };
- DWORD waitResult = ::WaitForMultipleObjects((Blocks.LockMode ? 3 : 2), events, FALSE, INFINITE);
- switch (waitResult)
- {
- case (WAIT_OBJECT_0 + 0):
- return StopWriteResult;
- case (WAIT_OBJECT_0 + 1):
- {
- _realStreamMode = true;
- RINOK(WriteToRealStream());
- UInt32 processedSize2;
- HRESULT res = OutSeqStream->Write(data, size, &processedSize2);
- if (processedSize != 0)
- *processedSize += processedSize2;
- return res;
- }
- /*
- case (WAIT_OBJECT_0 + 2):
- {
- // it has bug: no write.
- if (!Blocks.SwitchToNoLockMode(_memManager))
- return E_FAIL;
- break;
- }
- */
- case (WAIT_OBJECT_0 + 2):
- break;
- default:
- return E_FAIL;
- }
- Blocks.Blocks.Add(_memManager->AllocateBlock());
- if (Blocks.Blocks.Back() == 0)
- return E_FAIL;
- }
- return S_OK;
-}
-
-STDMETHODIMP COutMemStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- if (_realStreamMode)
- {
- if (!OutStream)
- return E_FAIL;
- return OutStream->Seek(offset, seekOrigin, newPosition);
- }
- if (seekOrigin == STREAM_SEEK_CUR)
- {
- if (offset != 0)
- return E_NOTIMPL;
- }
- else if (seekOrigin == STREAM_SEEK_SET)
- {
- if (offset != 0)
- return E_NOTIMPL;
- _curBlockIndex = 0;
- _curBlockPos = 0;
- }
- else
- return E_NOTIMPL;
- if (newPosition != 0)
- *newPosition = GetPos();
- return S_OK;
-}
-
-STDMETHODIMP COutMemStream::SetSize(UInt64 newSize)
-{
- if (_realStreamMode)
- {
- if (!OutStream)
- return E_FAIL;
- return OutStream->SetSize(newSize);
- }
- Blocks.TotalSize = newSize;
- return S_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/OutMemStream.h b/src/libs/7zip/win/CPP/7zip/Common/OutMemStream.h
deleted file mode 100644
index b47f339e9..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/OutMemStream.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// OutMemStream.h
-
-#ifndef __OUTMEMSTREAM_H
-#define __OUTMEMSTREAM_H
-
-#include "Common/MyCom.h"
-#include "MemBlocks.h"
-
-class COutMemStream:
- public IOutStream,
- public CMyUnknownImp
-{
- CMemBlockManagerMt *_memManager;
- size_t _curBlockIndex;
- size_t _curBlockPos;
- bool _realStreamMode;
-
- bool _unlockEventWasSent;
- NWindows::NSynchronization::CAutoResetEvent StopWritingEvent;
- NWindows::NSynchronization::CAutoResetEvent WriteToRealStreamEvent;
- // NWindows::NSynchronization::CAutoResetEvent NoLockEvent;
-
- HRESULT StopWriteResult;
- CMemLockBlocks Blocks;
-
- UInt64 GetPos() const { return (UInt64)_curBlockIndex * _memManager->GetBlockSize() + _curBlockPos; }
-
- CMyComPtr<ISequentialOutStream> OutSeqStream;
- CMyComPtr<IOutStream> OutStream;
-
-public:
-
- HRes CreateEvents()
- {
- RINOK(StopWritingEvent.CreateIfNotCreated());
- return WriteToRealStreamEvent.CreateIfNotCreated();
- }
-
- void SetOutStream(IOutStream *outStream)
- {
- OutStream = outStream;
- OutSeqStream = outStream;
- }
-
- void SetSeqOutStream(ISequentialOutStream *outStream)
- {
- OutStream = NULL;
- OutSeqStream = outStream;
- }
-
- void ReleaseOutStream()
- {
- OutStream.Release();
- OutSeqStream.Release();
- }
-
- COutMemStream(CMemBlockManagerMt *memManager): _memManager(memManager) { }
-
- ~COutMemStream() { Free(); }
- void Free();
-
- void Init();
- HRESULT WriteToRealStream();
-
- void DetachData(CMemLockBlocks &blocks);
-
- bool WasUnlockEventSent() const { return _unlockEventWasSent; }
-
- void SetRealStreamMode()
- {
- _unlockEventWasSent = true;
- WriteToRealStreamEvent.Set();
- }
-
- /*
- void SetNoLockMode()
- {
- _unlockEventWasSent = true;
- NoLockEvent.Set();
- }
- */
-
- void StopWriting(HRESULT res)
- {
- StopWriteResult = res;
- StopWritingEvent.Set();
- }
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
- STDMETHOD(SetSize)(UInt64 newSize);
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/ProgressMt.cpp b/src/libs/7zip/win/CPP/7zip/Common/ProgressMt.cpp
deleted file mode 100644
index 319bd241b..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/ProgressMt.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-// ProgressMt.h
-
-#include "StdAfx.h"
-
-#include "ProgressMt.h"
-
-void CMtCompressProgressMixer::Init(int numItems, ICompressProgressInfo *progress)
-{
- NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);
- InSizes.Clear();
- OutSizes.Clear();
- for (int i = 0; i < numItems; i++)
- {
- InSizes.Add(0);
- OutSizes.Add(0);
- }
- TotalInSize = 0;
- TotalOutSize = 0;
- _progress = progress;
-}
-
-void CMtCompressProgressMixer::Reinit(int index)
-{
- NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);
- InSizes[index] = 0;
- OutSizes[index] = 0;
-}
-
-HRESULT CMtCompressProgressMixer::SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize)
-{
- NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);
- if (inSize != 0)
- {
- UInt64 diff = *inSize - InSizes[index];
- InSizes[index] = *inSize;
- TotalInSize += diff;
- }
- if (outSize != 0)
- {
- UInt64 diff = *outSize - OutSizes[index];
- OutSizes[index] = *outSize;
- TotalOutSize += diff;
- }
- if (_progress)
- return _progress->SetRatioInfo(&TotalInSize, &TotalOutSize);
- return S_OK;
-}
-
-
-STDMETHODIMP CMtCompressProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
-{
- return _progress->SetRatioInfo(_index, inSize, outSize);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/ProgressMt.h b/src/libs/7zip/win/CPP/7zip/Common/ProgressMt.h
deleted file mode 100644
index 26079d4e9..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/ProgressMt.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// ProgressMt.h
-
-#ifndef __PROGRESSMT_H
-#define __PROGRESSMT_H
-
-#include "../../Common/MyCom.h"
-#include "../../Common/MyVector.h"
-#include "../../Windows/Synchronization.h"
-
-#include "../ICoder.h"
-#include "../IProgress.h"
-
-class CMtCompressProgressMixer
-{
- CMyComPtr<ICompressProgressInfo> _progress;
- CRecordVector<UInt64> InSizes;
- CRecordVector<UInt64> OutSizes;
- UInt64 TotalInSize;
- UInt64 TotalOutSize;
-public:
- NWindows::NSynchronization::CCriticalSection CriticalSection;
- void Init(int numItems, ICompressProgressInfo *progress);
- void Reinit(int index);
- HRESULT SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize);
-};
-
-class CMtCompressProgress:
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
- CMtCompressProgressMixer *_progress;
- int _index;
-public:
- void Init(CMtCompressProgressMixer *progress, int index)
- {
- _progress = progress;
- _index = index;
- }
- void Reinit() { _progress->Reinit(_index); }
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder1.cpp b/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder1.cpp
deleted file mode 100644
index 2c354e1eb..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder1.cpp
+++ /dev/null
@@ -1,309 +0,0 @@
-// ArjDecoder1.cpp
-
-#include "StdAfx.h"
-
-#include "ArjDecoder1.h"
-
-namespace NCompress{
-namespace NArj {
-namespace NDecoder1 {
-
-static const UInt32 kHistorySize = 26624;
-static const UInt32 kMatchMinLen = 3;
-static const UInt32 kMatchMaxLen = 256;
-
-// static const UInt32 kNC = 255 + kMatchMaxLen + 2 - kMatchMinLen;
-
-void CCoder::MakeTable(int nchar, Byte *bitlen, int tablebits,
- UInt32 *table, int tablesize)
-{
- UInt32 count[17], weight[17], start[18], *p;
- UInt32 i, k, len, ch, jutbits, avail, nextcode, mask;
-
- for (i = 1; i <= 16; i++)
- count[i] = 0;
- for (i = 0; (int)i < nchar; i++)
- count[bitlen[i]]++;
-
- start[1] = 0;
- for (i = 1; i <= 16; i++)
- start[i + 1] = start[i] + (count[i] << (16 - i));
- if (start[17] != (UInt32) (1 << 16))
- throw "Data error";
-
- jutbits = 16 - tablebits;
- for (i = 1; (int)i <= tablebits; i++)
- {
- start[i] >>= jutbits;
- weight[i] = 1 << (tablebits - i);
- }
- while (i <= 16)
- {
- weight[i] = 1 << (16 - i);
- i++;
- }
-
- i = start[tablebits + 1] >> jutbits;
- if (i != (UInt32) (1 << 16))
- {
- k = 1 << tablebits;
- while (i != k)
- table[i++] = 0;
- }
-
- avail = nchar;
- mask = 1 << (15 - tablebits);
- for (ch = 0; (int)ch < nchar; ch++)
- {
- if ((len = bitlen[ch]) == 0)
- continue;
- k = start[len];
- nextcode = k + weight[len];
- if ((int)len <= tablebits)
- {
- if (nextcode > (UInt32)tablesize)
- throw "Data error";
- for (i = start[len]; i < nextcode; i++)
- table[i] = ch;
- }
- else
- {
- p = &table[k >> jutbits];
- i = len - tablebits;
- while (i != 0)
- {
- if (*p == 0)
- {
- right[avail] = left[avail] = 0;
- *p = avail++;
- }
- if (k & mask)
- p = &right[*p];
- else
- p = &left[*p];
- k <<= 1;
- i--;
- }
- *p = ch;
- }
- start[len] = nextcode;
- }
-}
-
-void CCoder::read_pt_len(int nn, int nbit, int i_special)
-{
- UInt32 n = m_InBitStream.ReadBits(nbit);
- if (n == 0)
- {
- UInt32 c = m_InBitStream.ReadBits(nbit);
- int i;
- for (i = 0; i < nn; i++)
- pt_len[i] = 0;
- for (i = 0; i < 256; i++)
- pt_table[i] = c;
- }
- else
- {
- UInt32 i = 0;
- while (i < n)
- {
- UInt32 bitBuf = m_InBitStream.GetValue(16);
- int c = bitBuf >> 13;
- if (c == 7)
- {
- UInt32 mask = 1 << (12);
- while (mask & bitBuf)
- {
- mask >>= 1;
- c++;
- }
- }
- m_InBitStream.MovePos((c < 7) ? 3 : (int)(c - 3));
- pt_len[i++] = (Byte)c;
- if (i == (UInt32)i_special)
- {
- c = m_InBitStream.ReadBits(2);
- while (--c >= 0)
- pt_len[i++] = 0;
- }
- }
- while (i < (UInt32)nn)
- pt_len[i++] = 0;
- MakeTable(nn, pt_len, 8, pt_table, PTABLESIZE);
- }
-}
-
-void CCoder::read_c_len()
-{
- int i, c, n;
- UInt32 mask;
-
- n = m_InBitStream.ReadBits(CBIT);
- if (n == 0)
- {
- c = m_InBitStream.ReadBits(CBIT);
- for (i = 0; i < NC; i++)
- c_len[i] = 0;
- for (i = 0; i < CTABLESIZE; i++)
- c_table[i] = c;
- }
- else
- {
- i = 0;
- while (i < n)
- {
- UInt32 bitBuf = m_InBitStream.GetValue(16);
- c = pt_table[bitBuf >> (8)];
- if (c >= NT)
- {
- mask = 1 << (7);
- do
- {
- if (bitBuf & mask)
- c = right[c];
- else
- c = left[c];
- mask >>= 1;
- } while (c >= NT);
- }
- m_InBitStream.MovePos((int)(pt_len[c]));
- if (c <= 2)
- {
- if (c == 0)
- c = 1;
- else if (c == 1)
- c = m_InBitStream.ReadBits(4) + 3;
- else
- c = m_InBitStream.ReadBits(CBIT) + 20;
- while (--c >= 0)
- c_len[i++] = 0;
- }
- else
- c_len[i++] = (Byte)(c - 2);
- }
- while (i < NC)
- c_len[i++] = 0;
- MakeTable(NC, c_len, 12, c_table, CTABLESIZE);
- }
-}
-
-UInt32 CCoder::decode_c()
-{
- UInt32 j, mask;
- UInt32 bitbuf = m_InBitStream.GetValue(16);
- j = c_table[bitbuf >> 4];
- if (j >= NC)
- {
- mask = 1 << (3);
- do
- {
- if (bitbuf & mask)
- j = right[j];
- else
- j = left[j];
- mask >>= 1;
- } while (j >= NC);
- }
- m_InBitStream.MovePos((int)(c_len[j]));
- return j;
-}
-
-UInt32 CCoder::decode_p()
-{
- UInt32 j, mask;
- UInt32 bitbuf = m_InBitStream.GetValue(16);
- j = pt_table[bitbuf >> (8)];
- if (j >= NP)
- {
- mask = 1 << (7);
- do
- {
- if (bitbuf & mask)
- j = right[j];
- else
- j = left[j];
- mask >>= 1;
- } while (j >= NP);
- }
- m_InBitStream.MovePos((int)(pt_len[j]));
- if (j != 0)
- {
- j--;
- j = (1 << j) + m_InBitStream.ReadBits((int)j);
- }
- return j;
-}
-
-
-HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (outSize == NULL)
- return E_INVALIDARG;
-
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
-
- // check it
- for (int i = 0; i < CTABLESIZE; i++)
- c_table[i] = 0;
-
- UInt64 pos = 0;
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(false);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
-
- CCoderReleaser coderReleaser(this);
-
- UInt32 blockSize = 0;
-
- while(pos < *outSize)
- {
- if (blockSize == 0)
- {
- if (progress != NULL)
- {
- UInt64 packSize = m_InBitStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &pos));
- }
- blockSize = m_InBitStream.ReadBits(16);
- read_pt_len(NT, TBIT, 3);
- read_c_len();
- read_pt_len(NP, PBIT, -1);
- }
- blockSize--;
-
- UInt32 number = decode_c();
- if (number < 256)
- {
- m_OutWindowStream.PutByte((Byte)number);
- pos++;
- continue;
- }
- else
- {
- UInt32 len = number - 256 + kMatchMinLen;
- UInt32 distance = decode_p();
- if (distance >= pos)
- return S_FALSE;
- m_OutWindowStream.CopyBlock(distance, len);
- pos += len;
- }
- }
- coderReleaser.NeedFlush = false;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress);}
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder1.h b/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder1.h
deleted file mode 100644
index 17939dafb..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder1.h
+++ /dev/null
@@ -1,98 +0,0 @@
-// ArjDecoder1.h
-
-#ifndef __COMPRESS_ARJ_DECODER1_H
-#define __COMPRESS_ARJ_DECODER1_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NArj {
-namespace NDecoder1 {
-
-#define CODE_BIT 16
-
-#define THRESHOLD 3
-#define DDICSIZ 26624
-#define MAXDICBIT 16
-#define MATCHBIT 8
-#define MAXMATCH 256
-#define NC (0xFF + MAXMATCH + 2 - THRESHOLD)
-#define NP (MAXDICBIT + 1)
-#define CBIT 9
-#define NT (CODE_BIT + 3)
-#define PBIT 5
-#define TBIT 5
-
-#if NT > NP
-#define NPT NT
-#else
-#define NPT NP
-#endif
-
-#define CTABLESIZE 4096
-#define PTABLESIZE 256
-
-
-class CCoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- NBitm::CDecoder<CInBuffer> m_InBitStream;
-
- UInt32 left[2 * NC - 1];
- UInt32 right[2 * NC - 1];
- Byte c_len[NC];
- Byte pt_len[NPT];
-
- UInt32 c_table[CTABLESIZE];
- UInt32 pt_table[PTABLESIZE];
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
-
- class CCoderReleaser
- {
- CCoder *m_Coder;
- public:
- bool NeedFlush;
- CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}
- ~CCoderReleaser()
- {
- if (NeedFlush)
- m_Coder->m_OutWindowStream.Flush();
- m_Coder->ReleaseStreams();
- }
- };
- friend class CCoderReleaser;
-
- void MakeTable(int nchar, Byte *bitlen, int tablebits, UInt32 *table, int tablesize);
-
- void read_c_len();
- void read_pt_len(int nn, int nbit, int i_special);
- UInt32 decode_c();
- UInt32 decode_p();
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder2.cpp b/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder2.cpp
deleted file mode 100644
index 365993bc5..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder2.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-// ArjDecoder2.cpp
-
-#include "StdAfx.h"
-
-#include "ArjDecoder2.h"
-
-namespace NCompress{
-namespace NArj {
-namespace NDecoder2 {
-
-static const UInt32 kHistorySize = 26624;
-static const UInt32 kMatchMinLen = 3;
-
-HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo * /* progress */)
-{
- if (outSize == NULL)
- return E_INVALIDARG;
-
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
-
- UInt64 pos = 0;
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(false);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
- CCoderReleaser coderReleaser(this);
-
- while(pos < *outSize)
- {
- const UInt32 kStartWidth = 0;
- const UInt32 kStopWidth = 7;
- UInt32 power = 1 << kStartWidth;
- UInt32 width;
- UInt32 len = 0;
- for (width = kStartWidth; width < kStopWidth; width++)
- {
- if (m_InBitStream.ReadBits(1) == 0)
- break;
- len += power;
- power <<= 1;
- }
- if (width != 0)
- len += m_InBitStream.ReadBits(width);
- if (len == 0)
- {
- m_OutWindowStream.PutByte((Byte)m_InBitStream.ReadBits(8));
- pos++;
- continue;
- }
- else
- {
- len = len - 1 + kMatchMinLen;
- const UInt32 kStartWidth = 9;
- const UInt32 kStopWidth = 13;
- UInt32 power = 1 << kStartWidth;
- UInt32 width;
- UInt32 distance = 0;
- for (width = kStartWidth; width < kStopWidth; width++)
- {
- if (m_InBitStream.ReadBits(1) == 0)
- break;
- distance += power;
- power <<= 1;
- }
- if (width != 0)
- distance += m_InBitStream.ReadBits(width);
- if (distance >= pos)
- return S_FALSE;
- m_OutWindowStream.CopyBlock(distance, len);
- pos += len;
- }
- }
- coderReleaser.NeedFlush = false;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress);}
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder2.h b/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder2.h
deleted file mode 100644
index cf00975da..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ArjDecoder2.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// ArjDecoder2.h
-
-#ifndef __COMPRESS_ARJ_DECODER2_H
-#define __COMPRESS_ARJ_DECODER2_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NArj {
-namespace NDecoder2 {
-
-class CCoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- NBitm::CDecoder<CInBuffer> m_InBitStream;
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
-
- class CCoderReleaser
- {
- CCoder *m_Coder;
- public:
- bool NeedFlush;
- CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}
- ~CCoderReleaser()
- {
- if (NeedFlush)
- m_Coder->m_OutWindowStream.Flush();
- m_Coder->ReleaseStreams();
- }
- };
- friend class CCoderReleaser;
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Const.h b/src/libs/7zip/win/CPP/7zip/Compress/BZip2Const.h
deleted file mode 100644
index 62427aa68..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Const.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Compress/BZip2Const.h
-
-#ifndef __COMPRESS_BZIP2_CONST_H
-#define __COMPRESS_BZIP2_CONST_H
-
-namespace NCompress {
-namespace NBZip2 {
-
-const Byte kArSig0 = 'B';
-const Byte kArSig1 = 'Z';
-const Byte kArSig2 = 'h';
-const Byte kArSig3 = '0';
-
-const Byte kFinSig0 = 0x17;
-const Byte kFinSig1 = 0x72;
-const Byte kFinSig2 = 0x45;
-const Byte kFinSig3 = 0x38;
-const Byte kFinSig4 = 0x50;
-const Byte kFinSig5 = 0x90;
-
-const Byte kBlockSig0 = 0x31;
-const Byte kBlockSig1 = 0x41;
-const Byte kBlockSig2 = 0x59;
-const Byte kBlockSig3 = 0x26;
-const Byte kBlockSig4 = 0x53;
-const Byte kBlockSig5 = 0x59;
-
-const int kNumOrigBits = 24;
-
-const int kNumTablesBits = 3;
-const int kNumTablesMin = 2;
-const int kNumTablesMax = 6;
-
-const int kNumLevelsBits = 5;
-
-const int kMaxHuffmanLen = 20; // Check it
-
-const int kMaxAlphaSize = 258;
-
-const int kGroupSize = 50;
-
-const int kBlockSizeMultMin = 1;
-const int kBlockSizeMultMax = 9;
-const UInt32 kBlockSizeStep = 100000;
-const UInt32 kBlockSizeMax = kBlockSizeMultMax * kBlockSizeStep;
-
-const int kNumSelectorsBits = 15;
-const UInt32 kNumSelectorsMax = (2 + (kBlockSizeMax / kGroupSize));
-
-const int kRleModeRepSize = 4;
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Crc.cpp b/src/libs/7zip/win/CPP/7zip/Compress/BZip2Crc.cpp
deleted file mode 100644
index 4e4741f40..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Crc.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// BZip2Crc.cpp
-
-#include "StdAfx.h"
-
-#include "BZip2Crc.h"
-
-UInt32 CBZip2Crc::Table[256];
-
-static const UInt32 kBZip2CrcPoly = 0x04c11db7; /* AUTODIN II, Ethernet, & FDDI */
-
-void CBZip2Crc::InitTable()
-{
- for (UInt32 i = 0; i < 256; i++)
- {
- UInt32 r = (i << 24);
- for (int j = 8; j > 0; j--)
- r = (r & 0x80000000) ? ((r << 1) ^ kBZip2CrcPoly) : (r << 1);
- Table[i] = r;
- }
-}
-
-class CBZip2CrcTableInit
-{
-public:
- CBZip2CrcTableInit() { CBZip2Crc::InitTable(); }
-} g_BZip2CrcTableInit;
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Crc.h b/src/libs/7zip/win/CPP/7zip/Compress/BZip2Crc.h
deleted file mode 100644
index 876945b5f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Crc.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// BZip2Crc.h
-
-#ifndef __BZIP2_CRC_H
-#define __BZIP2_CRC_H
-
-#include "Common/Types.h"
-
-class CBZip2Crc
-{
- UInt32 _value;
- static UInt32 Table[256];
-public:
- static void InitTable();
- CBZip2Crc(): _value(0xFFFFFFFF) {};
- void Init() { _value = 0xFFFFFFFF; }
- void UpdateByte(Byte b) { _value = Table[(_value >> 24) ^ b] ^ (_value << 8); }
- void UpdateByte(unsigned int b) { _value = Table[(_value >> 24) ^ b] ^ (_value << 8); }
- UInt32 GetDigest() const { return _value ^ 0xFFFFFFFF; }
-};
-
-class CBZip2CombinedCrc
-{
- UInt32 _value;
-public:
- CBZip2CombinedCrc(): _value(0){};
- void Init() { _value = 0; }
- void Update(UInt32 v) { _value = ((_value << 1) | (_value >> 31)) ^ v; }
- UInt32 GetDigest() const { return _value ; }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Decoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/BZip2Decoder.cpp
deleted file mode 100644
index cb1f981a7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Decoder.cpp
+++ /dev/null
@@ -1,943 +0,0 @@
-// BZip2Decoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "BZip2Decoder.h"
-#include "Mtf8.h"
-
-namespace NCompress {
-namespace NBZip2 {
-
-#undef NO_INLINE
-#define NO_INLINE
-
-static const UInt32 kNumThreadsMax = 4;
-
-static const UInt32 kBufferSize = (1 << 17);
-
-static const UInt16 kRandNums[512] = {
- 619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
- 985, 724, 205, 454, 863, 491, 741, 242, 949, 214,
- 733, 859, 335, 708, 621, 574, 73, 654, 730, 472,
- 419, 436, 278, 496, 867, 210, 399, 680, 480, 51,
- 878, 465, 811, 169, 869, 675, 611, 697, 867, 561,
- 862, 687, 507, 283, 482, 129, 807, 591, 733, 623,
- 150, 238, 59, 379, 684, 877, 625, 169, 643, 105,
- 170, 607, 520, 932, 727, 476, 693, 425, 174, 647,
- 73, 122, 335, 530, 442, 853, 695, 249, 445, 515,
- 909, 545, 703, 919, 874, 474, 882, 500, 594, 612,
- 641, 801, 220, 162, 819, 984, 589, 513, 495, 799,
- 161, 604, 958, 533, 221, 400, 386, 867, 600, 782,
- 382, 596, 414, 171, 516, 375, 682, 485, 911, 276,
- 98, 553, 163, 354, 666, 933, 424, 341, 533, 870,
- 227, 730, 475, 186, 263, 647, 537, 686, 600, 224,
- 469, 68, 770, 919, 190, 373, 294, 822, 808, 206,
- 184, 943, 795, 384, 383, 461, 404, 758, 839, 887,
- 715, 67, 618, 276, 204, 918, 873, 777, 604, 560,
- 951, 160, 578, 722, 79, 804, 96, 409, 713, 940,
- 652, 934, 970, 447, 318, 353, 859, 672, 112, 785,
- 645, 863, 803, 350, 139, 93, 354, 99, 820, 908,
- 609, 772, 154, 274, 580, 184, 79, 626, 630, 742,
- 653, 282, 762, 623, 680, 81, 927, 626, 789, 125,
- 411, 521, 938, 300, 821, 78, 343, 175, 128, 250,
- 170, 774, 972, 275, 999, 639, 495, 78, 352, 126,
- 857, 956, 358, 619, 580, 124, 737, 594, 701, 612,
- 669, 112, 134, 694, 363, 992, 809, 743, 168, 974,
- 944, 375, 748, 52, 600, 747, 642, 182, 862, 81,
- 344, 805, 988, 739, 511, 655, 814, 334, 249, 515,
- 897, 955, 664, 981, 649, 113, 974, 459, 893, 228,
- 433, 837, 553, 268, 926, 240, 102, 654, 459, 51,
- 686, 754, 806, 760, 493, 403, 415, 394, 687, 700,
- 946, 670, 656, 610, 738, 392, 760, 799, 887, 653,
- 978, 321, 576, 617, 626, 502, 894, 679, 243, 440,
- 680, 879, 194, 572, 640, 724, 926, 56, 204, 700,
- 707, 151, 457, 449, 797, 195, 791, 558, 945, 679,
- 297, 59, 87, 824, 713, 663, 412, 693, 342, 606,
- 134, 108, 571, 364, 631, 212, 174, 643, 304, 329,
- 343, 97, 430, 751, 497, 314, 983, 374, 822, 928,
- 140, 206, 73, 263, 980, 736, 876, 478, 430, 305,
- 170, 514, 364, 692, 829, 82, 855, 953, 676, 246,
- 369, 970, 294, 750, 807, 827, 150, 790, 288, 923,
- 804, 378, 215, 828, 592, 281, 565, 555, 710, 82,
- 896, 831, 547, 261, 524, 462, 293, 465, 502, 56,
- 661, 821, 976, 991, 658, 869, 905, 758, 745, 193,
- 768, 550, 608, 933, 378, 286, 215, 979, 792, 961,
- 61, 688, 793, 644, 986, 403, 106, 366, 905, 644,
- 372, 567, 466, 434, 645, 210, 389, 550, 919, 135,
- 780, 773, 635, 389, 707, 100, 626, 958, 165, 504,
- 920, 176, 193, 713, 857, 265, 203, 50, 668, 108,
- 645, 990, 626, 197, 510, 357, 358, 850, 858, 364,
- 936, 638
-};
-
-bool CState::Alloc()
-{
- if (!Counters)
- Counters = (UInt32 *)::BigAlloc((256 + kBlockSizeMax) * sizeof(UInt32));
- return (Counters != 0);
-}
-
-void CState::Free()
-{
- ::BigFree(Counters);
- Counters = 0;
-}
-
-UInt32 CDecoder::ReadBits(unsigned numBits) { return m_InStream.ReadBits(numBits); }
-Byte CDecoder::ReadByte() {return (Byte)ReadBits(8); }
-bool CDecoder::ReadBit() { return ReadBits(1) != 0; }
-
-UInt32 CDecoder::ReadCrc()
-{
- UInt32 crc = 0;
- for (int i = 0; i < 4; i++)
- {
- crc <<= 8;
- crc |= ReadByte();
- }
- return crc;
-}
-
-static UInt32 NO_INLINE ReadBits(NBitm::CDecoder<CInBuffer> *m_InStream, unsigned num)
-{
- return m_InStream->ReadBits(num);
-}
-
-static UInt32 NO_INLINE ReadBit(NBitm::CDecoder<CInBuffer> *m_InStream)
-{
- return m_InStream->ReadBits(1);
-}
-
-static HRESULT NO_INLINE ReadBlock(NBitm::CDecoder<CInBuffer> *m_InStream,
- UInt32 *CharCounters, UInt32 blockSizeMax, Byte *m_Selectors, CHuffmanDecoder *m_HuffmanDecoders,
- UInt32 *blockSizeRes, UInt32 *origPtrRes, bool *randRes)
-{
- if (randRes)
- *randRes = ReadBit(m_InStream) ? true : false;
- *origPtrRes = ReadBits(m_InStream, kNumOrigBits);
-
- // in original code it compares OrigPtr to (UInt32)(10 + blockSizeMax)) : why ?
- if (*origPtrRes >= blockSizeMax)
- return S_FALSE;
-
- CMtf8Decoder mtf;
- mtf.StartInit();
-
- int numInUse = 0;
- {
- Byte inUse16[16];
- int i;
- for (i = 0; i < 16; i++)
- inUse16[i] = (Byte)ReadBit(m_InStream);
- for (i = 0; i < 256; i++)
- if (inUse16[i >> 4])
- {
- if (ReadBit(m_InStream))
- mtf.Add(numInUse++, (Byte)i);
- }
- if (numInUse == 0)
- return S_FALSE;
- // mtf.Init(numInUse);
- }
- int alphaSize = numInUse + 2;
-
- int numTables = ReadBits(m_InStream, kNumTablesBits);
- if (numTables < kNumTablesMin || numTables > kNumTablesMax)
- return S_FALSE;
-
- UInt32 numSelectors = ReadBits(m_InStream, kNumSelectorsBits);
- if (numSelectors < 1 || numSelectors > kNumSelectorsMax)
- return S_FALSE;
-
- {
- Byte mtfPos[kNumTablesMax];
- int t = 0;
- do
- mtfPos[t] = (Byte)t;
- while(++t < numTables);
- UInt32 i = 0;
- do
- {
- int j = 0;
- while (ReadBit(m_InStream))
- if (++j >= numTables)
- return S_FALSE;
- Byte tmp = mtfPos[j];
- for (;j > 0; j--)
- mtfPos[j] = mtfPos[j - 1];
- m_Selectors[i] = mtfPos[0] = tmp;
- }
- while(++i < numSelectors);
- }
-
- int t = 0;
- do
- {
- Byte lens[kMaxAlphaSize];
- int len = (int)ReadBits(m_InStream, kNumLevelsBits);
- int i;
- for (i = 0; i < alphaSize; i++)
- {
- for (;;)
- {
- if (len < 1 || len > kMaxHuffmanLen)
- return S_FALSE;
- if (!ReadBit(m_InStream))
- break;
- len += 1 - (int)(ReadBit(m_InStream) << 1);
- }
- lens[i] = (Byte)len;
- }
- for (; i < kMaxAlphaSize; i++)
- lens[i] = 0;
- if(!m_HuffmanDecoders[t].SetCodeLengths(lens))
- return S_FALSE;
- }
- while(++t < numTables);
-
- {
- for (int i = 0; i < 256; i++)
- CharCounters[i] = 0;
- }
-
- UInt32 blockSize = 0;
- {
- UInt32 groupIndex = 0;
- UInt32 groupSize = 0;
- CHuffmanDecoder *huffmanDecoder = 0;
- int runPower = 0;
- UInt32 runCounter = 0;
-
- for (;;)
- {
- if (groupSize == 0)
- {
- if (groupIndex >= numSelectors)
- return S_FALSE;
- groupSize = kGroupSize;
- huffmanDecoder = &m_HuffmanDecoders[m_Selectors[groupIndex++]];
- }
- groupSize--;
-
- UInt32 nextSym = huffmanDecoder->DecodeSymbol(m_InStream);
-
- if (nextSym < 2)
- {
- runCounter += ((UInt32)(nextSym + 1) << runPower++);
- if (blockSizeMax - blockSize < runCounter)
- return S_FALSE;
- continue;
- }
- if (runCounter != 0)
- {
- UInt32 b = (UInt32)mtf.GetHead();
- CharCounters[b] += runCounter;
- do
- CharCounters[256 + blockSize++] = b;
- while(--runCounter != 0);
- runPower = 0;
- }
- if (nextSym <= (UInt32)numInUse)
- {
- UInt32 b = (UInt32)mtf.GetAndMove((int)nextSym - 1);
- if (blockSize >= blockSizeMax)
- return S_FALSE;
- CharCounters[b]++;
- CharCounters[256 + blockSize++] = b;
- }
- else if (nextSym == (UInt32)numInUse + 1)
- break;
- else
- return S_FALSE;
- }
- }
- *blockSizeRes = blockSize;
- return (*origPtrRes < blockSize) ? S_OK : S_FALSE;
-}
-
-static void NO_INLINE DecodeBlock1(UInt32 *charCounters, UInt32 blockSize)
-{
- {
- UInt32 sum = 0;
- for (UInt32 i = 0; i < 256; i++)
- {
- sum += charCounters[i];
- charCounters[i] = sum - charCounters[i];
- }
- }
-
- UInt32 *tt = charCounters + 256;
- // Compute the T^(-1) vector
- UInt32 i = 0;
- do
- tt[charCounters[tt[i] & 0xFF]++] |= (i << 8);
- while(++i < blockSize);
-}
-
-static UInt32 NO_INLINE DecodeBlock2(const UInt32 *tt, UInt32 blockSize, UInt32 OrigPtr, COutBuffer &m_OutStream)
-{
- CBZip2Crc crc;
-
- // it's for speed optimization: prefetch & prevByte_init;
- UInt32 tPos = tt[tt[OrigPtr] >> 8];
- unsigned prevByte = (unsigned)(tPos & 0xFF);
-
- unsigned numReps = 0;
-
- do
- {
- unsigned b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
-
- if (numReps == kRleModeRepSize)
- {
- for (; b > 0; b--)
- {
- crc.UpdateByte(prevByte);
- m_OutStream.WriteByte((Byte)prevByte);
- }
- numReps = 0;
- continue;
- }
- if (b != prevByte)
- numReps = 0;
- numReps++;
- prevByte = b;
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
-
- /*
- prevByte = b;
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
- for (; --blockSize != 0;)
- {
- b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
- if (b != prevByte)
- {
- prevByte = b;
- continue;
- }
- if (--blockSize == 0)
- break;
-
- b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
- if (b != prevByte)
- {
- prevByte = b;
- continue;
- }
- if (--blockSize == 0)
- break;
-
- b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
- if (b != prevByte)
- {
- prevByte = b;
- continue;
- }
- --blockSize;
- break;
- }
- if (blockSize == 0)
- break;
-
- b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
-
- for (; b > 0; b--)
- {
- crc.UpdateByte(prevByte);
- m_OutStream.WriteByte((Byte)prevByte);
- }
- */
- }
- while(--blockSize != 0);
- return crc.GetDigest();
-}
-
-static UInt32 NO_INLINE DecodeBlock2Rand(const UInt32 *tt, UInt32 blockSize, UInt32 OrigPtr, COutBuffer &m_OutStream)
-{
- CBZip2Crc crc;
-
- UInt32 randIndex = 1;
- UInt32 randToGo = kRandNums[0] - 2;
-
- unsigned numReps = 0;
-
- // it's for speed optimization: prefetch & prevByte_init;
- UInt32 tPos = tt[tt[OrigPtr] >> 8];
- unsigned prevByte = (unsigned)(tPos & 0xFF);
-
- do
- {
- unsigned b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
-
- {
- if (randToGo == 0)
- {
- b ^= 1;
- randToGo = kRandNums[randIndex++];
- randIndex &= 0x1FF;
- }
- randToGo--;
- }
-
- if (numReps == kRleModeRepSize)
- {
- for (; b > 0; b--)
- {
- crc.UpdateByte(prevByte);
- m_OutStream.WriteByte((Byte)prevByte);
- }
- numReps = 0;
- continue;
- }
- if (b != prevByte)
- numReps = 0;
- numReps++;
- prevByte = b;
- crc.UpdateByte(b);
- m_OutStream.WriteByte((Byte)b);
- }
- while(--blockSize != 0);
- return crc.GetDigest();
-}
-
-
-CDecoder::CDecoder()
-{
- #ifndef _7ZIP_ST
- m_States = 0;
- m_NumThreadsPrev = 0;
- NumThreads = 1;
- #endif
- _needInStreamInit = true;
-}
-
-#ifndef _7ZIP_ST
-
-CDecoder::~CDecoder()
-{
- Free();
-}
-
-#define RINOK_THREAD(x) { WRes __result_ = (x); if(__result_ != 0) return __result_; }
-
-HRESULT CDecoder::Create()
-{
- RINOK_THREAD(CanProcessEvent.CreateIfNotCreated());
- RINOK_THREAD(CanStartWaitingEvent.CreateIfNotCreated());
- if (m_States != 0 && m_NumThreadsPrev == NumThreads)
- return S_OK;
- Free();
- MtMode = (NumThreads > 1);
- m_NumThreadsPrev = NumThreads;
- try
- {
- m_States = new CState[NumThreads];
- if (!m_States)
- return E_OUTOFMEMORY;
- }
- catch(...) { return E_OUTOFMEMORY; }
- for (UInt32 t = 0; t < NumThreads; t++)
- {
- CState &ti = m_States[t];
- ti.Decoder = this;
- if (MtMode)
- {
- HRESULT res = ti.Create();
- if (res != S_OK)
- {
- NumThreads = t;
- Free();
- return res;
- }
- }
- }
- return S_OK;
-}
-
-void CDecoder::Free()
-{
- if (!m_States)
- return;
- CloseThreads = true;
- CanProcessEvent.Set();
- for (UInt32 t = 0; t < NumThreads; t++)
- {
- CState &s = m_States[t];
- if (MtMode)
- s.Thread.Wait();
- s.Free();
- }
- delete []m_States;
- m_States = 0;
-}
-
-#endif
-
-HRESULT CDecoder::ReadSignatures(bool &wasFinished, UInt32 &crc)
-{
- wasFinished = false;
- Byte s[6];
- for (int i = 0; i < 6; i++)
- s[i] = ReadByte();
- crc = ReadCrc();
- if (s[0] == kFinSig0)
- {
- if (s[1] != kFinSig1 ||
- s[2] != kFinSig2 ||
- s[3] != kFinSig3 ||
- s[4] != kFinSig4 ||
- s[5] != kFinSig5)
- return S_FALSE;
-
- wasFinished = true;
- return (crc == CombinedCrc.GetDigest()) ? S_OK : S_FALSE;
- }
- if (s[0] != kBlockSig0 ||
- s[1] != kBlockSig1 ||
- s[2] != kBlockSig2 ||
- s[3] != kBlockSig3 ||
- s[4] != kBlockSig4 ||
- s[5] != kBlockSig5)
- return S_FALSE;
- CombinedCrc.Update(crc);
- return S_OK;
-}
-
-HRESULT CDecoder::DecodeFile(bool &isBZ, ICompressProgressInfo *progress)
-{
- Progress = progress;
- #ifndef _7ZIP_ST
- RINOK(Create());
- for (UInt32 t = 0; t < NumThreads; t++)
- {
- CState &s = m_States[t];
- if (!s.Alloc())
- return E_OUTOFMEMORY;
- if (MtMode)
- {
- RINOK(s.StreamWasFinishedEvent.Reset());
- RINOK(s.WaitingWasStartedEvent.Reset());
- RINOK(s.CanWriteEvent.Reset());
- }
- }
- #else
- if (!m_States[0].Alloc())
- return E_OUTOFMEMORY;
- #endif
-
- isBZ = false;
- Byte s[6];
- int i;
- for (i = 0; i < 4; i++)
- s[i] = ReadByte();
- if (s[0] != kArSig0 ||
- s[1] != kArSig1 ||
- s[2] != kArSig2 ||
- s[3] <= kArSig3 ||
- s[3] > kArSig3 + kBlockSizeMultMax)
- return S_OK;
- isBZ = true;
- UInt32 dicSize = (UInt32)(s[3] - kArSig3) * kBlockSizeStep;
-
- CombinedCrc.Init();
- #ifndef _7ZIP_ST
- if (MtMode)
- {
- NextBlockIndex = 0;
- StreamWasFinished1 = StreamWasFinished2 = false;
- CloseThreads = false;
- CanStartWaitingEvent.Reset();
- m_States[0].CanWriteEvent.Set();
- BlockSizeMax = dicSize;
- Result1 = Result2 = S_OK;
- CanProcessEvent.Set();
- UInt32 t;
- for (t = 0; t < NumThreads; t++)
- m_States[t].StreamWasFinishedEvent.Lock();
- CanProcessEvent.Reset();
- CanStartWaitingEvent.Set();
- for (t = 0; t < NumThreads; t++)
- m_States[t].WaitingWasStartedEvent.Lock();
- CanStartWaitingEvent.Reset();
- RINOK(Result2);
- RINOK(Result1);
- }
- else
- #endif
- {
- CState &state = m_States[0];
- for (;;)
- {
- RINOK(SetRatioProgress(m_InStream.GetProcessedSize()));
- bool wasFinished;
- UInt32 crc;
- RINOK(ReadSignatures(wasFinished, crc));
- if (wasFinished)
- return S_OK;
-
- UInt32 blockSize, origPtr;
- bool randMode;
- RINOK(ReadBlock(&m_InStream, state.Counters, dicSize,
- m_Selectors, m_HuffmanDecoders,
- &blockSize, &origPtr, &randMode));
- DecodeBlock1(state.Counters, blockSize);
- if ((randMode ?
- DecodeBlock2Rand(state.Counters + 256, blockSize, origPtr, m_OutStream) :
- DecodeBlock2(state.Counters + 256, blockSize, origPtr, m_OutStream)) != crc)
- return S_FALSE;
- }
- }
- return SetRatioProgress(m_InStream.GetProcessedSize());
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- bool &isBZ, ICompressProgressInfo *progress)
-{
- isBZ = false;
- try
- {
-
- if (!m_InStream.Create(kBufferSize))
- return E_OUTOFMEMORY;
- if (!m_OutStream.Create(kBufferSize))
- return E_OUTOFMEMORY;
-
- if (inStream)
- m_InStream.SetStream(inStream);
-
- CDecoderFlusher flusher(this, inStream != NULL);
-
- if (_needInStreamInit)
- {
- m_InStream.Init();
- _needInStreamInit = false;
- }
- _inStart = m_InStream.GetProcessedSize();
-
- m_InStream.AlignToByte();
-
- m_OutStream.SetStream(outStream);
- m_OutStream.Init();
-
- RINOK(DecodeFile(isBZ, progress));
- flusher.NeedFlush = false;
- return Flush();
-
- }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const COutBufferException &e) { return e.ErrorCode; }
- catch(...) { return E_FAIL; }
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- _needInStreamInit = true;
- bool isBZ;
- RINOK(CodeReal(inStream, outStream, isBZ, progress));
- return isBZ ? S_OK : S_FALSE;
-}
-
-HRESULT CDecoder::CodeResume(ISequentialOutStream *outStream, bool &isBZ, ICompressProgressInfo *progress)
-{
- return CodeReal(NULL, outStream, isBZ, progress);
-}
-
-STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) { m_InStream.SetStream(inStream); return S_OK; }
-STDMETHODIMP CDecoder::ReleaseInStream() { m_InStream.ReleaseStream(); return S_OK; }
-
-#ifndef _7ZIP_ST
-
-static THREAD_FUNC_DECL MFThread(void *p) { ((CState *)p)->ThreadFunc(); return 0; }
-
-HRESULT CState::Create()
-{
- RINOK_THREAD(StreamWasFinishedEvent.CreateIfNotCreated());
- RINOK_THREAD(WaitingWasStartedEvent.CreateIfNotCreated());
- RINOK_THREAD(CanWriteEvent.CreateIfNotCreated());
- RINOK_THREAD(Thread.Create(MFThread, this));
- return S_OK;
-}
-
-void CState::FinishStream()
-{
- Decoder->StreamWasFinished1 = true;
- StreamWasFinishedEvent.Set();
- Decoder->CS.Leave();
- Decoder->CanStartWaitingEvent.Lock();
- WaitingWasStartedEvent.Set();
-}
-
-void CState::ThreadFunc()
-{
- for (;;)
- {
- Decoder->CanProcessEvent.Lock();
- Decoder->CS.Enter();
- if (Decoder->CloseThreads)
- {
- Decoder->CS.Leave();
- return;
- }
- if (Decoder->StreamWasFinished1)
- {
- FinishStream();
- continue;
- }
- HRESULT res = S_OK;
-
- UInt32 blockIndex = Decoder->NextBlockIndex;
- UInt32 nextBlockIndex = blockIndex + 1;
- if (nextBlockIndex == Decoder->NumThreads)
- nextBlockIndex = 0;
- Decoder->NextBlockIndex = nextBlockIndex;
- UInt32 crc;
- UInt64 packSize = 0;
- UInt32 blockSize = 0, origPtr = 0;
- bool randMode = false;
-
- try
- {
- bool wasFinished;
- res = Decoder->ReadSignatures(wasFinished, crc);
- if (res != S_OK)
- {
- Decoder->Result1 = res;
- FinishStream();
- continue;
- }
- if (wasFinished)
- {
- Decoder->Result1 = res;
- FinishStream();
- continue;
- }
-
- res = ReadBlock(&Decoder->m_InStream, Counters, Decoder->BlockSizeMax,
- Decoder->m_Selectors, Decoder->m_HuffmanDecoders,
- &blockSize, &origPtr, &randMode);
- if (res != S_OK)
- {
- Decoder->Result1 = res;
- FinishStream();
- continue;
- }
- packSize = Decoder->m_InStream.GetProcessedSize();
- }
- catch(const CInBufferException &e) { res = e.ErrorCode; if (res != S_OK) res = E_FAIL; }
- catch(...) { res = E_FAIL; }
- if (res != S_OK)
- {
- Decoder->Result1 = res;
- FinishStream();
- continue;
- }
-
- Decoder->CS.Leave();
-
- DecodeBlock1(Counters, blockSize);
-
- bool needFinish = true;
- try
- {
- Decoder->m_States[blockIndex].CanWriteEvent.Lock();
- needFinish = Decoder->StreamWasFinished2;
- if (!needFinish)
- {
- if ((randMode ?
- DecodeBlock2Rand(Counters + 256, blockSize, origPtr, Decoder->m_OutStream) :
- DecodeBlock2(Counters + 256, blockSize, origPtr, Decoder->m_OutStream)) == crc)
- res = Decoder->SetRatioProgress(packSize);
- else
- res = S_FALSE;
- }
- }
- catch(const COutBufferException &e) { res = e.ErrorCode; if (res != S_OK) res = E_FAIL; }
- catch(...) { res = E_FAIL; }
- if (res != S_OK)
- {
- Decoder->Result2 = res;
- Decoder->StreamWasFinished2 = true;
- }
- Decoder->m_States[nextBlockIndex].CanWriteEvent.Set();
- if (res != S_OK || needFinish)
- {
- StreamWasFinishedEvent.Set();
- Decoder->CanStartWaitingEvent.Lock();
- WaitingWasStartedEvent.Set();
- }
- }
-}
-
-STDMETHODIMP CDecoder::SetNumberOfThreads(UInt32 numThreads)
-{
- NumThreads = numThreads;
- if (NumThreads < 1)
- NumThreads = 1;
- if (NumThreads > kNumThreadsMax)
- NumThreads = kNumThreadsMax;
- return S_OK;
-}
-
-#endif
-
-HRESULT CDecoder::SetRatioProgress(UInt64 packSize)
-{
- if (!Progress)
- return S_OK;
- packSize -= _inStart;
- UInt64 unpackSize = m_OutStream.GetProcessedSize();
- return Progress->SetRatioInfo(&packSize, &unpackSize);
-}
-
-
-// ---------- NSIS ----------
-
-enum
-{
- NSIS_STATE_INIT,
- NSIS_STATE_NEW_BLOCK,
- NSIS_STATE_DATA,
- NSIS_STATE_FINISHED,
- NSIS_STATE_ERROR
-};
-
-STDMETHODIMP CNsisDecoder::SetInStream(ISequentialInStream *inStream) { m_InStream.SetStream(inStream); return S_OK; }
-STDMETHODIMP CNsisDecoder::ReleaseInStream() { m_InStream.ReleaseStream(); return S_OK; }
-
-STDMETHODIMP CNsisDecoder::SetOutStreamSize(const UInt64 * /* outSize */)
-{
- _nsisState = NSIS_STATE_INIT;
- return S_OK;
-}
-
-STDMETHODIMP CNsisDecoder::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- try {
-
- *processedSize = 0;
- if (_nsisState == NSIS_STATE_FINISHED)
- return S_OK;
- if (_nsisState == NSIS_STATE_ERROR)
- return S_FALSE;
- if (size == 0)
- return S_OK;
-
- CState &state = m_State;
-
- if (_nsisState == NSIS_STATE_INIT)
- {
- if (!m_InStream.Create(kBufferSize))
- return E_OUTOFMEMORY;
- if (!state.Alloc())
- return E_OUTOFMEMORY;
- m_InStream.Init();
- _nsisState = NSIS_STATE_NEW_BLOCK;
- }
-
- if (_nsisState == NSIS_STATE_NEW_BLOCK)
- {
- Byte b = (Byte)m_InStream.ReadBits(8);
- if (b == kFinSig0)
- {
- _nsisState = NSIS_STATE_FINISHED;
- return S_OK;
- }
- if (b != kBlockSig0)
- {
- _nsisState = NSIS_STATE_ERROR;
- return S_FALSE;
- }
- UInt32 origPtr;
- RINOK(ReadBlock(&m_InStream, state.Counters, 9 * kBlockSizeStep,
- m_Selectors, m_HuffmanDecoders, &_blockSize, &origPtr, NULL));
- DecodeBlock1(state.Counters, _blockSize);
- const UInt32 *tt = state.Counters + 256;
- _tPos = tt[tt[origPtr] >> 8];
- _prevByte = (unsigned)(_tPos & 0xFF);
- _numReps = 0;
- _repRem = 0;
- _nsisState = NSIS_STATE_DATA;
- }
-
- UInt32 tPos = _tPos;
- unsigned prevByte = _prevByte;
- unsigned numReps = _numReps;
- UInt32 blockSize = _blockSize;
- const UInt32 *tt = state.Counters + 256;
-
- while (_repRem)
- {
- _repRem--;
- *(Byte *)data = (Byte)prevByte;
- data = (Byte *)data + 1;
- (*processedSize)++;
- if (--size == 0)
- return S_OK;
- }
-
- if (blockSize == 0)
- {
- _nsisState = NSIS_STATE_NEW_BLOCK;
- return S_OK;
- }
-
- do
- {
- unsigned b = (unsigned)(tPos & 0xFF);
- tPos = tt[tPos >> 8];
- blockSize--;
-
- if (numReps == kRleModeRepSize)
- {
- numReps = 0;
- while (b)
- {
- b--;
- *(Byte *)data = (Byte)prevByte;
- data = (Byte *)data + 1;
- (*processedSize)++;
- if (--size == 0)
- break;
- }
- _repRem = b;
- continue;
- }
- if (b != prevByte)
- numReps = 0;
- numReps++;
- prevByte = b;
- *(Byte *)data = (Byte)b;
- data = (Byte *)data + 1;
- (*processedSize)++;
- size--;
- }
- while (size && blockSize);
- _tPos = tPos;
- _prevByte = prevByte;
- _numReps = numReps;
- _blockSize = blockSize;
- return S_OK;
-
- }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Decoder.h b/src/libs/7zip/win/CPP/7zip/Compress/BZip2Decoder.h
deleted file mode 100644
index e6dec1eaa..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Decoder.h
+++ /dev/null
@@ -1,205 +0,0 @@
-// Compress/BZip2Decoder.h
-
-#ifndef __COMPRESS_BZIP2_DECODER_H
-#define __COMPRESS_BZIP2_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#ifndef _7ZIP_ST
-#include "../../Windows/Synchronization.h"
-#include "../../Windows/Thread.h"
-#endif
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/OutBuffer.h"
-
-#include "BitmDecoder.h"
-#include "BZip2Const.h"
-#include "BZip2Crc.h"
-#include "HuffmanDecoder.h"
-
-namespace NCompress {
-namespace NBZip2 {
-
-typedef NCompress::NHuffman::CDecoder<kMaxHuffmanLen, kMaxAlphaSize> CHuffmanDecoder;
-
-class CDecoder;
-
-struct CState
-{
- UInt32 *Counters;
-
- #ifndef _7ZIP_ST
-
- CDecoder *Decoder;
- NWindows::CThread Thread;
- bool m_OptimizeNumTables;
-
- NWindows::NSynchronization::CAutoResetEvent StreamWasFinishedEvent;
- NWindows::NSynchronization::CAutoResetEvent WaitingWasStartedEvent;
-
- // it's not member of this thread. We just need one event per thread
- NWindows::NSynchronization::CAutoResetEvent CanWriteEvent;
-
- Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
-
- HRESULT Create();
- void FinishStream();
- void ThreadFunc();
-
- #endif
-
- CState(): Counters(0) {}
- ~CState() { Free(); }
- bool Alloc();
- void Free();
-};
-
-class CDecoder :
- public ICompressCoder,
- #ifndef _7ZIP_ST
- public ICompressSetCoderMt,
- #endif
- public CMyUnknownImp
-{
-public:
- COutBuffer m_OutStream;
- Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
- NBitm::CDecoder<CInBuffer> m_InStream;
- Byte m_Selectors[kNumSelectorsMax];
- CHuffmanDecoder m_HuffmanDecoders[kNumTablesMax];
- UInt64 _inStart;
-
-private:
-
- bool _needInStreamInit;
-
- UInt32 ReadBits(unsigned numBits);
- Byte ReadByte();
- bool ReadBit();
- UInt32 ReadCrc();
- HRESULT DecodeFile(bool &isBZ, ICompressProgressInfo *progress);
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- bool &isBZ, ICompressProgressInfo *progress);
- class CDecoderFlusher
- {
- CDecoder *_decoder;
- public:
- bool NeedFlush;
- bool ReleaseInStream;
- CDecoderFlusher(CDecoder *decoder, bool releaseInStream):
- _decoder(decoder),
- ReleaseInStream(releaseInStream),
- NeedFlush(true) {}
- ~CDecoderFlusher()
- {
- if (NeedFlush)
- _decoder->Flush();
- _decoder->ReleaseStreams(ReleaseInStream);
- }
- };
-
-public:
- CBZip2CombinedCrc CombinedCrc;
- ICompressProgressInfo *Progress;
-
- #ifndef _7ZIP_ST
- CState *m_States;
- UInt32 m_NumThreadsPrev;
-
- NWindows::NSynchronization::CManualResetEvent CanProcessEvent;
- NWindows::NSynchronization::CCriticalSection CS;
- UInt32 NumThreads;
- bool MtMode;
- UInt32 NextBlockIndex;
- bool CloseThreads;
- bool StreamWasFinished1;
- bool StreamWasFinished2;
- NWindows::NSynchronization::CManualResetEvent CanStartWaitingEvent;
-
- HRESULT Result1;
- HRESULT Result2;
-
- UInt32 BlockSizeMax;
- ~CDecoder();
- HRESULT Create();
- void Free();
-
- #else
- CState m_States[1];
- #endif
-
- CDecoder();
-
- HRESULT SetRatioProgress(UInt64 packSize);
- HRESULT ReadSignatures(bool &wasFinished, UInt32 &crc);
-
- HRESULT Flush() { return m_OutStream.Flush(); }
- void ReleaseStreams(bool releaseInStream)
- {
- if (releaseInStream)
- m_InStream.ReleaseStream();
- m_OutStream.ReleaseStream();
- }
-
- MY_QUERYINTERFACE_BEGIN2(ICompressCoder)
- #ifndef _7ZIP_ST
- MY_QUERYINTERFACE_ENTRY(ICompressSetCoderMt)
- #endif
-
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
-
- HRESULT CodeResume(ISequentialOutStream *outStream, bool &isBZ, ICompressProgressInfo *progress);
- UInt64 GetInputProcessedSize() const { return m_InStream.GetProcessedSize(); }
-
- #ifndef _7ZIP_ST
- STDMETHOD(SetNumberOfThreads)(UInt32 numThreads);
- #endif
-};
-
-
-class CNsisDecoder :
- public ISequentialInStream,
- public ICompressSetInStream,
- public ICompressSetOutStreamSize,
- public CMyUnknownImp
-{
- NBitm::CDecoder<CInBuffer> m_InStream;
- Byte m_Selectors[kNumSelectorsMax];
- CHuffmanDecoder m_HuffmanDecoders[kNumTablesMax];
- CState m_State;
-
- int _nsisState;
- UInt32 _tPos;
- unsigned _prevByte;
- unsigned _repRem;
- unsigned _numReps;
- UInt32 _blockSize;
-
-public:
-
- MY_QUERYINTERFACE_BEGIN2(ISequentialInStream)
- MY_QUERYINTERFACE_ENTRY(ICompressSetInStream)
- MY_QUERYINTERFACE_ENTRY(ICompressSetOutStreamSize)
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Encoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/BZip2Encoder.cpp
deleted file mode 100644
index eaa108558..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Encoder.cpp
+++ /dev/null
@@ -1,895 +0,0 @@
-// BZip2Encoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-#include "../../../C/BwtSort.h"
-#include "../../../C/HuffEnc.h"
-
-#include "BZip2Crc.h"
-#include "BZip2Encoder.h"
-#include "Mtf8.h"
-
-namespace NCompress {
-namespace NBZip2 {
-
-const int kMaxHuffmanLenForEncoding = 16; // it must be < kMaxHuffmanLen = 20
-
-static const UInt32 kBufferSize = (1 << 17);
-static const int kNumHuffPasses = 4;
-
-bool CThreadInfo::Alloc()
-{
- if (m_BlockSorterIndex == 0)
- {
- m_BlockSorterIndex = (UInt32 *)::BigAlloc(BLOCK_SORT_BUF_SIZE(kBlockSizeMax) * sizeof(UInt32));
- if (m_BlockSorterIndex == 0)
- return false;
- }
-
- if (m_Block == 0)
- {
- m_Block = (Byte *)::MidAlloc(kBlockSizeMax * 5 + kBlockSizeMax / 10 + (20 << 10));
- if (m_Block == 0)
- return false;
- m_MtfArray = m_Block + kBlockSizeMax;
- m_TempArray = m_MtfArray + kBlockSizeMax * 2 + 2;
- }
- return true;
-}
-
-void CThreadInfo::Free()
-{
- ::BigFree(m_BlockSorterIndex);
- m_BlockSorterIndex = 0;
- ::MidFree(m_Block);
- m_Block = 0;
-}
-
-#ifndef _7ZIP_ST
-
-static THREAD_FUNC_DECL MFThread(void *threadCoderInfo)
-{
- return ((CThreadInfo *)threadCoderInfo)->ThreadFunc();
-}
-
-#define RINOK_THREAD(x) { WRes __result_ = (x); if(__result_ != 0) return __result_; }
-
-HRESULT CThreadInfo::Create()
-{
- RINOK_THREAD(StreamWasFinishedEvent.Create());
- RINOK_THREAD(WaitingWasStartedEvent.Create());
- RINOK_THREAD(CanWriteEvent.Create());
- RINOK_THREAD(Thread.Create(MFThread, this));
- return S_OK;
-}
-
-void CThreadInfo::FinishStream(bool needLeave)
-{
- Encoder->StreamWasFinished = true;
- StreamWasFinishedEvent.Set();
- if (needLeave)
- Encoder->CS.Leave();
- Encoder->CanStartWaitingEvent.Lock();
- WaitingWasStartedEvent.Set();
-}
-
-DWORD CThreadInfo::ThreadFunc()
-{
- for (;;)
- {
- Encoder->CanProcessEvent.Lock();
- Encoder->CS.Enter();
- if (Encoder->CloseThreads)
- {
- Encoder->CS.Leave();
- return 0;
- }
- if (Encoder->StreamWasFinished)
- {
- FinishStream(true);
- continue;
- }
- HRESULT res = S_OK;
- bool needLeave = true;
- try
- {
- UInt32 blockSize = Encoder->ReadRleBlock(m_Block);
- m_PackSize = Encoder->m_InStream.GetProcessedSize();
- m_BlockIndex = Encoder->NextBlockIndex;
- if (++Encoder->NextBlockIndex == Encoder->NumThreads)
- Encoder->NextBlockIndex = 0;
- if (blockSize == 0)
- {
- FinishStream(true);
- continue;
- }
- Encoder->CS.Leave();
- needLeave = false;
- res = EncodeBlock3(blockSize);
- }
- catch(const CInBufferException &e) { res = e.ErrorCode; }
- catch(const COutBufferException &e) { res = e.ErrorCode; }
- catch(...) { res = E_FAIL; }
- if (res != S_OK)
- {
- Encoder->Result = res;
- FinishStream(needLeave);
- continue;
- }
- }
-}
-
-#endif
-
-CEncoder::CEncoder():
- NumPasses(1),
- m_OptimizeNumTables(false),
- m_BlockSizeMult(kBlockSizeMultMax)
-{
- #ifndef _7ZIP_ST
- ThreadsInfo = 0;
- m_NumThreadsPrev = 0;
- NumThreads = 1;
- #endif
-}
-
-#ifndef _7ZIP_ST
-CEncoder::~CEncoder()
-{
- Free();
-}
-
-HRESULT CEncoder::Create()
-{
- RINOK_THREAD(CanProcessEvent.CreateIfNotCreated());
- RINOK_THREAD(CanStartWaitingEvent.CreateIfNotCreated());
- if (ThreadsInfo != 0 && m_NumThreadsPrev == NumThreads)
- return S_OK;
- try
- {
- Free();
- MtMode = (NumThreads > 1);
- m_NumThreadsPrev = NumThreads;
- ThreadsInfo = new CThreadInfo[NumThreads];
- if (ThreadsInfo == 0)
- return E_OUTOFMEMORY;
- }
- catch(...) { return E_OUTOFMEMORY; }
- for (UInt32 t = 0; t < NumThreads; t++)
- {
- CThreadInfo &ti = ThreadsInfo[t];
- ti.Encoder = this;
- if (MtMode)
- {
- HRESULT res = ti.Create();
- if (res != S_OK)
- {
- NumThreads = t;
- Free();
- return res;
- }
- }
- }
- return S_OK;
-}
-
-void CEncoder::Free()
-{
- if (!ThreadsInfo)
- return;
- CloseThreads = true;
- CanProcessEvent.Set();
- for (UInt32 t = 0; t < NumThreads; t++)
- {
- CThreadInfo &ti = ThreadsInfo[t];
- if (MtMode)
- ti.Thread.Wait();
- ti.Free();
- }
- delete []ThreadsInfo;
- ThreadsInfo = 0;
-}
-#endif
-
-UInt32 CEncoder::ReadRleBlock(Byte *buffer)
-{
- UInt32 i = 0;
- Byte prevByte;
- if (m_InStream.ReadByte(prevByte))
- {
- UInt32 blockSize = m_BlockSizeMult * kBlockSizeStep - 1;
- int numReps = 1;
- buffer[i++] = prevByte;
- while (i < blockSize) // "- 1" to support RLE
- {
- Byte b;
- if (!m_InStream.ReadByte(b))
- break;
- if (b != prevByte)
- {
- if (numReps >= kRleModeRepSize)
- buffer[i++] = (Byte)(numReps - kRleModeRepSize);
- buffer[i++] = b;
- numReps = 1;
- prevByte = b;
- continue;
- }
- numReps++;
- if (numReps <= kRleModeRepSize)
- buffer[i++] = b;
- else if (numReps == kRleModeRepSize + 255)
- {
- buffer[i++] = (Byte)(numReps - kRleModeRepSize);
- numReps = 0;
- }
- }
- // it's to support original BZip2 decoder
- if (numReps >= kRleModeRepSize)
- buffer[i++] = (Byte)(numReps - kRleModeRepSize);
- }
- return i;
-}
-
-void CThreadInfo::WriteBits2(UInt32 value, UInt32 numBits)
- { m_OutStreamCurrent->WriteBits(value, numBits); }
-void CThreadInfo::WriteByte2(Byte b) { WriteBits2(b , 8); }
-void CThreadInfo::WriteBit2(bool v) { WriteBits2((v ? 1 : 0), 1); }
-void CThreadInfo::WriteCrc2(UInt32 v)
-{
- for (int i = 0; i < 4; i++)
- WriteByte2(((Byte)(v >> (24 - i * 8))));
-}
-
-void CEncoder::WriteBits(UInt32 value, UInt32 numBits)
- { m_OutStream.WriteBits(value, numBits); }
-void CEncoder::WriteByte(Byte b) { WriteBits(b , 8); }
-void CEncoder::WriteBit(bool v) { WriteBits((v ? 1 : 0), 1); }
-void CEncoder::WriteCrc(UInt32 v)
-{
- for (int i = 0; i < 4; i++)
- WriteByte(((Byte)(v >> (24 - i * 8))));
-}
-
-
-// blockSize > 0
-void CThreadInfo::EncodeBlock(const Byte *block, UInt32 blockSize)
-{
- WriteBit2(false); // Randomised = false
-
- {
- UInt32 origPtr = BlockSort(m_BlockSorterIndex, block, blockSize);
- // if (m_BlockSorterIndex[origPtr] != 0) throw 1;
- m_BlockSorterIndex[origPtr] = blockSize;
- WriteBits2(origPtr, kNumOrigBits);
- }
-
- CMtf8Encoder mtf;
- int numInUse = 0;
- {
- bool inUse[256];
- bool inUse16[16];
- UInt32 i;
- for (i = 0; i < 256; i++)
- inUse[i] = false;
- for (i = 0; i < 16; i++)
- inUse16[i] = false;
- for (i = 0; i < blockSize; i++)
- inUse[block[i]] = true;
- for (i = 0; i < 256; i++)
- if (inUse[i])
- {
- inUse16[i >> 4] = true;
- mtf.Buf[numInUse++] = (Byte)i;
- }
- for (i = 0; i < 16; i++)
- WriteBit2(inUse16[i]);
- for (i = 0; i < 256; i++)
- if (inUse16[i >> 4])
- WriteBit2(inUse[i]);
- }
- int alphaSize = numInUse + 2;
-
- Byte *mtfs = m_MtfArray;
- UInt32 mtfArraySize = 0;
- UInt32 symbolCounts[kMaxAlphaSize];
- {
- for (int i = 0; i < kMaxAlphaSize; i++)
- symbolCounts[i] = 0;
- }
-
- {
- UInt32 rleSize = 0;
- UInt32 i = 0;
- const UInt32 *bsIndex = m_BlockSorterIndex;
- block--;
- do
- {
- int pos = mtf.FindAndMove(block[bsIndex[i]]);
- if (pos == 0)
- rleSize++;
- else
- {
- while (rleSize != 0)
- {
- rleSize--;
- mtfs[mtfArraySize++] = (Byte)(rleSize & 1);
- symbolCounts[rleSize & 1]++;
- rleSize >>= 1;
- }
- if (pos >= 0xFE)
- {
- mtfs[mtfArraySize++] = 0xFF;
- mtfs[mtfArraySize++] = (Byte)(pos - 0xFE);
- }
- else
- mtfs[mtfArraySize++] = (Byte)(pos + 1);
- symbolCounts[pos + 1]++;
- }
- }
- while (++i < blockSize);
-
- while (rleSize != 0)
- {
- rleSize--;
- mtfs[mtfArraySize++] = (Byte)(rleSize & 1);
- symbolCounts[rleSize & 1]++;
- rleSize >>= 1;
- }
-
- if (alphaSize < 256)
- mtfs[mtfArraySize++] = (Byte)(alphaSize - 1);
- else
- {
- mtfs[mtfArraySize++] = 0xFF;
- mtfs[mtfArraySize++] = (Byte)(alphaSize - 256);
- }
- symbolCounts[alphaSize - 1]++;
- }
-
- UInt32 numSymbols = 0;
- {
- for (int i = 0; i < kMaxAlphaSize; i++)
- numSymbols += symbolCounts[i];
- }
-
- int bestNumTables = kNumTablesMin;
- UInt32 bestPrice = 0xFFFFFFFF;
- UInt32 startPos = m_OutStreamCurrent->GetPos();
- Byte startCurByte = m_OutStreamCurrent->GetCurByte();
- for (int nt = kNumTablesMin; nt <= kNumTablesMax + 1; nt++)
- {
- int numTables;
-
- if(m_OptimizeNumTables)
- {
- m_OutStreamCurrent->SetPos(startPos);
- m_OutStreamCurrent->SetCurState((startPos & 7), startCurByte);
- if (nt <= kNumTablesMax)
- numTables = nt;
- else
- numTables = bestNumTables;
- }
- else
- {
- if (numSymbols < 200) numTables = 2;
- else if (numSymbols < 600) numTables = 3;
- else if (numSymbols < 1200) numTables = 4;
- else if (numSymbols < 2400) numTables = 5;
- else numTables = 6;
- }
-
- WriteBits2(numTables, kNumTablesBits);
-
- UInt32 numSelectors = (numSymbols + kGroupSize - 1) / kGroupSize;
- WriteBits2(numSelectors, kNumSelectorsBits);
-
- {
- UInt32 remFreq = numSymbols;
- int gs = 0;
- int t = numTables;
- do
- {
- UInt32 tFreq = remFreq / t;
- int ge = gs;
- UInt32 aFreq = 0;
- while (aFreq < tFreq) // && ge < alphaSize)
- aFreq += symbolCounts[ge++];
-
- if (ge - 1 > gs && t != numTables && t != 1 && (((numTables - t) & 1) == 1))
- aFreq -= symbolCounts[--ge];
-
- Byte *lens = Lens[t - 1];
- int i = 0;
- do
- lens[i] = (i >= gs && i < ge) ? 0 : 1;
- while (++i < alphaSize);
- gs = ge;
- remFreq -= aFreq;
- }
- while(--t != 0);
- }
-
-
- for (int pass = 0; pass < kNumHuffPasses; pass++)
- {
- {
- int t = 0;
- do
- memset(Freqs[t], 0, sizeof(Freqs[t]));
- while(++t < numTables);
- }
-
- {
- UInt32 mtfPos = 0;
- UInt32 g = 0;
- do
- {
- UInt32 symbols[kGroupSize];
- int i = 0;
- do
- {
- UInt32 symbol = mtfs[mtfPos++];
- if (symbol >= 0xFF)
- symbol += mtfs[mtfPos++];
- symbols[i] = symbol;
- }
- while (++i < kGroupSize && mtfPos < mtfArraySize);
-
- UInt32 bestPrice = 0xFFFFFFFF;
- int t = 0;
- do
- {
- const Byte *lens = Lens[t];
- UInt32 price = 0;
- int j = 0;
- do
- price += lens[symbols[j]];
- while (++j < i);
- if (price < bestPrice)
- {
- m_Selectors[g] = (Byte)t;
- bestPrice = price;
- }
- }
- while(++t < numTables);
- UInt32 *freqs = Freqs[m_Selectors[g++]];
- int j = 0;
- do
- freqs[symbols[j]]++;
- while (++j < i);
- }
- while (mtfPos < mtfArraySize);
- }
-
- int t = 0;
- do
- {
- UInt32 *freqs = Freqs[t];
- int i = 0;
- do
- if (freqs[i] == 0)
- freqs[i] = 1;
- while(++i < alphaSize);
- Huffman_Generate(freqs, Codes[t], Lens[t], kMaxAlphaSize, kMaxHuffmanLenForEncoding);
- }
- while(++t < numTables);
- }
-
- {
- Byte mtfSel[kNumTablesMax];
- {
- int t = 0;
- do
- mtfSel[t] = (Byte)t;
- while(++t < numTables);
- }
-
- UInt32 i = 0;
- do
- {
- Byte sel = m_Selectors[i];
- int pos;
- for (pos = 0; mtfSel[pos] != sel; pos++)
- WriteBit2(true);
- WriteBit2(false);
- for (; pos > 0; pos--)
- mtfSel[pos] = mtfSel[pos - 1];
- mtfSel[0] = sel;
- }
- while(++i < numSelectors);
- }
-
- {
- int t = 0;
- do
- {
- const Byte *lens = Lens[t];
- UInt32 len = lens[0];
- WriteBits2(len, kNumLevelsBits);
- int i = 0;
- do
- {
- UInt32 level = lens[i];
- while (len != level)
- {
- WriteBit2(true);
- if (len < level)
- {
- WriteBit2(false);
- len++;
- }
- else
- {
- WriteBit2(true);
- len--;
- }
- }
- WriteBit2(false);
- }
- while (++i < alphaSize);
- }
- while(++t < numTables);
- }
-
- {
- UInt32 groupSize = 0;
- UInt32 groupIndex = 0;
- const Byte *lens = 0;
- const UInt32 *codes = 0;
- UInt32 mtfPos = 0;
- do
- {
- UInt32 symbol = mtfs[mtfPos++];
- if (symbol >= 0xFF)
- symbol += mtfs[mtfPos++];
- if (groupSize == 0)
- {
- groupSize = kGroupSize;
- int t = m_Selectors[groupIndex++];
- lens = Lens[t];
- codes = Codes[t];
- }
- groupSize--;
- m_OutStreamCurrent->WriteBits(codes[symbol], lens[symbol]);
- }
- while (mtfPos < mtfArraySize);
- }
-
- if (!m_OptimizeNumTables)
- break;
- UInt32 price = m_OutStreamCurrent->GetPos() - startPos;
- if (price <= bestPrice)
- {
- if (nt == kNumTablesMax)
- break;
- bestPrice = price;
- bestNumTables = nt;
- }
- }
-}
-
-// blockSize > 0
-UInt32 CThreadInfo::EncodeBlockWithHeaders(const Byte *block, UInt32 blockSize)
-{
- WriteByte2(kBlockSig0);
- WriteByte2(kBlockSig1);
- WriteByte2(kBlockSig2);
- WriteByte2(kBlockSig3);
- WriteByte2(kBlockSig4);
- WriteByte2(kBlockSig5);
-
- CBZip2Crc crc;
- int numReps = 0;
- Byte prevByte = block[0];
- UInt32 i = 0;
- do
- {
- Byte b = block[i];
- if (numReps == kRleModeRepSize)
- {
- for (; b > 0; b--)
- crc.UpdateByte(prevByte);
- numReps = 0;
- continue;
- }
- if (prevByte == b)
- numReps++;
- else
- {
- numReps = 1;
- prevByte = b;
- }
- crc.UpdateByte(b);
- }
- while (++i < blockSize);
- UInt32 crcRes = crc.GetDigest();
- WriteCrc2(crcRes);
- EncodeBlock(block, blockSize);
- return crcRes;
-}
-
-void CThreadInfo::EncodeBlock2(const Byte *block, UInt32 blockSize, UInt32 numPasses)
-{
- UInt32 numCrcs = m_NumCrcs;
- bool needCompare = false;
-
- UInt32 startBytePos = m_OutStreamCurrent->GetBytePos();
- UInt32 startPos = m_OutStreamCurrent->GetPos();
- Byte startCurByte = m_OutStreamCurrent->GetCurByte();
- Byte endCurByte = 0;
- UInt32 endPos = 0;
- if (numPasses > 1 && blockSize >= (1 << 10))
- {
- UInt32 blockSize0 = blockSize / 2;
- for (;(block[blockSize0] == block[blockSize0 - 1] ||
- block[blockSize0 - 1] == block[blockSize0 - 2]) &&
- blockSize0 < blockSize; blockSize0++);
- if (blockSize0 < blockSize)
- {
- EncodeBlock2(block, blockSize0, numPasses - 1);
- EncodeBlock2(block + blockSize0, blockSize - blockSize0, numPasses - 1);
- endPos = m_OutStreamCurrent->GetPos();
- endCurByte = m_OutStreamCurrent->GetCurByte();
- if ((endPos & 7) > 0)
- WriteBits2(0, 8 - (endPos & 7));
- m_OutStreamCurrent->SetCurState((startPos & 7), startCurByte);
- needCompare = true;
- }
- }
-
- UInt32 startBytePos2 = m_OutStreamCurrent->GetBytePos();
- UInt32 startPos2 = m_OutStreamCurrent->GetPos();
- UInt32 crcVal = EncodeBlockWithHeaders(block, blockSize);
- UInt32 endPos2 = m_OutStreamCurrent->GetPos();
-
- if (needCompare)
- {
- UInt32 size2 = endPos2 - startPos2;
- if (size2 < endPos - startPos)
- {
- UInt32 numBytes = m_OutStreamCurrent->GetBytePos() - startBytePos2;
- Byte *buffer = m_OutStreamCurrent->GetStream();
- for (UInt32 i = 0; i < numBytes; i++)
- buffer[startBytePos + i] = buffer[startBytePos2 + i];
- m_OutStreamCurrent->SetPos(startPos + endPos2 - startPos2);
- m_NumCrcs = numCrcs;
- m_CRCs[m_NumCrcs++] = crcVal;
- }
- else
- {
- m_OutStreamCurrent->SetPos(endPos);
- m_OutStreamCurrent->SetCurState((endPos & 7), endCurByte);
- }
- }
- else
- {
- m_NumCrcs = numCrcs;
- m_CRCs[m_NumCrcs++] = crcVal;
- }
-}
-
-HRESULT CThreadInfo::EncodeBlock3(UInt32 blockSize)
-{
- CMsbfEncoderTemp outStreamTemp;
- outStreamTemp.SetStream(m_TempArray);
- outStreamTemp.Init();
- m_OutStreamCurrent = &outStreamTemp;
-
- m_NumCrcs = 0;
-
- EncodeBlock2(m_Block, blockSize, Encoder->NumPasses);
-
- #ifndef _7ZIP_ST
- if (Encoder->MtMode)
- Encoder->ThreadsInfo[m_BlockIndex].CanWriteEvent.Lock();
- #endif
- for (UInt32 i = 0; i < m_NumCrcs; i++)
- Encoder->CombinedCrc.Update(m_CRCs[i]);
- Encoder->WriteBytes(m_TempArray, outStreamTemp.GetPos(), outStreamTemp.GetCurByte());
- HRESULT res = S_OK;
- #ifndef _7ZIP_ST
- if (Encoder->MtMode)
- {
- UInt32 blockIndex = m_BlockIndex + 1;
- if (blockIndex == Encoder->NumThreads)
- blockIndex = 0;
-
- if (Encoder->Progress)
- {
- UInt64 unpackSize = Encoder->m_OutStream.GetProcessedSize();
- res = Encoder->Progress->SetRatioInfo(&m_PackSize, &unpackSize);
- }
-
- Encoder->ThreadsInfo[blockIndex].CanWriteEvent.Set();
- }
- #endif
- return res;
-}
-
-void CEncoder::WriteBytes(const Byte *data, UInt32 sizeInBits, Byte lastByte)
-{
- UInt32 bytesSize = (sizeInBits / 8);
- for (UInt32 i = 0; i < bytesSize; i++)
- m_OutStream.WriteBits(data[i], 8);
- WriteBits(lastByte, (sizeInBits & 7));
-}
-
-
-HRESULT CEncoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- #ifndef _7ZIP_ST
- Progress = progress;
- RINOK(Create());
- for (UInt32 t = 0; t < NumThreads; t++)
- #endif
- {
- #ifndef _7ZIP_ST
- CThreadInfo &ti = ThreadsInfo[t];
- if (MtMode)
- {
- RINOK(ti.StreamWasFinishedEvent.Reset());
- RINOK(ti.WaitingWasStartedEvent.Reset());
- RINOK(ti.CanWriteEvent.Reset());
- }
- #else
- CThreadInfo &ti = ThreadsInfo;
- ti.Encoder = this;
- #endif
-
- ti.m_OptimizeNumTables = m_OptimizeNumTables;
-
- if (!ti.Alloc())
- return E_OUTOFMEMORY;
- }
-
-
- if (!m_InStream.Create(kBufferSize))
- return E_OUTOFMEMORY;
- if (!m_OutStream.Create(kBufferSize))
- return E_OUTOFMEMORY;
-
-
- m_InStream.SetStream(inStream);
- m_InStream.Init();
-
- m_OutStream.SetStream(outStream);
- m_OutStream.Init();
-
- CFlusher flusher(this);
-
- CombinedCrc.Init();
- #ifndef _7ZIP_ST
- NextBlockIndex = 0;
- StreamWasFinished = false;
- CloseThreads = false;
- CanStartWaitingEvent.Reset();
- #endif
-
- WriteByte(kArSig0);
- WriteByte(kArSig1);
- WriteByte(kArSig2);
- WriteByte((Byte)(kArSig3 + m_BlockSizeMult));
-
- #ifndef _7ZIP_ST
-
- if (MtMode)
- {
- ThreadsInfo[0].CanWriteEvent.Set();
- Result = S_OK;
- CanProcessEvent.Set();
- UInt32 t;
- for (t = 0; t < NumThreads; t++)
- ThreadsInfo[t].StreamWasFinishedEvent.Lock();
- CanProcessEvent.Reset();
- CanStartWaitingEvent.Set();
- for (t = 0; t < NumThreads; t++)
- ThreadsInfo[t].WaitingWasStartedEvent.Lock();
- CanStartWaitingEvent.Reset();
- RINOK(Result);
- }
- else
- #endif
- {
- for (;;)
- {
- CThreadInfo &ti =
- #ifndef _7ZIP_ST
- ThreadsInfo[0];
- #else
- ThreadsInfo;
- #endif
- UInt32 blockSize = ReadRleBlock(ti.m_Block);
- if (blockSize == 0)
- break;
- RINOK(ti.EncodeBlock3(blockSize));
- if (progress)
- {
- UInt64 packSize = m_InStream.GetProcessedSize();
- UInt64 unpackSize = m_OutStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &unpackSize));
- }
- }
- }
- WriteByte(kFinSig0);
- WriteByte(kFinSig1);
- WriteByte(kFinSig2);
- WriteByte(kFinSig3);
- WriteByte(kFinSig4);
- WriteByte(kFinSig5);
-
- WriteCrc(CombinedCrc.GetDigest());
- return Flush();
-}
-
-STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const COutBufferException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-HRESULT CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
-{
- for(UInt32 i = 0; i < numProps; i++)
- {
- const PROPVARIANT &prop = props[i];
- switch(propIDs[i])
- {
- case NCoderPropID::kNumPasses:
- {
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- UInt32 numPasses = prop.ulVal;
- if (numPasses == 0)
- numPasses = 1;
- if (numPasses > kNumPassesMax)
- numPasses = kNumPassesMax;
- NumPasses = numPasses;
- m_OptimizeNumTables = (NumPasses > 1);
- break;
- }
- case NCoderPropID::kDictionarySize:
- {
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- UInt32 dictionary = prop.ulVal / kBlockSizeStep;
- if (dictionary < kBlockSizeMultMin)
- dictionary = kBlockSizeMultMin;
- else if (dictionary > kBlockSizeMultMax)
- dictionary = kBlockSizeMultMax;
- m_BlockSizeMult = dictionary;
- break;
- }
- case NCoderPropID::kNumThreads:
- {
- #ifndef _7ZIP_ST
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- NumThreads = prop.ulVal;
- if (NumThreads < 1)
- NumThreads = 1;
- #endif
- break;
- }
- default:
- return E_INVALIDARG;
- }
- }
- return S_OK;
-}
-
-#ifndef _7ZIP_ST
-STDMETHODIMP CEncoder::SetNumberOfThreads(UInt32 numThreads)
-{
- NumThreads = numThreads;
- if (NumThreads < 1)
- NumThreads = 1;
- return S_OK;
-}
-#endif
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Encoder.h b/src/libs/7zip/win/CPP/7zip/Compress/BZip2Encoder.h
deleted file mode 100644
index a863172fe..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Encoder.h
+++ /dev/null
@@ -1,245 +0,0 @@
-// BZip2Encoder.h
-
-#ifndef __COMPRESS_BZIP2_ENCODER_H
-#define __COMPRESS_BZIP2_ENCODER_H
-
-#include "../../Common/Defs.h"
-#include "../../Common/MyCom.h"
-
-#ifndef _7ZIP_ST
-#include "../../Windows/Synchronization.h"
-#include "../../Windows/Thread.h"
-#endif
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/OutBuffer.h"
-
-#include "BitmEncoder.h"
-#include "BZip2Const.h"
-#include "BZip2Crc.h"
-
-namespace NCompress {
-namespace NBZip2 {
-
-class CMsbfEncoderTemp
-{
- UInt32 m_Pos;
- int m_BitPos;
- Byte m_CurByte;
- Byte *Buffer;
-public:
- void SetStream(Byte *buffer) { Buffer = buffer; }
- Byte *GetStream() const { return Buffer; }
-
- void Init()
- {
- m_Pos = 0;
- m_BitPos = 8;
- m_CurByte = 0;
- }
-
- void Flush()
- {
- if (m_BitPos < 8)
- WriteBits(0, m_BitPos);
- }
-
- void WriteBits(UInt32 value, int numBits)
- {
- while (numBits > 0)
- {
- int numNewBits = MyMin(numBits, m_BitPos);
- numBits -= numNewBits;
-
- m_CurByte <<= numNewBits;
- UInt32 newBits = value >> numBits;
- m_CurByte |= Byte(newBits);
- value -= (newBits << numBits);
-
- m_BitPos -= numNewBits;
-
- if (m_BitPos == 0)
- {
- Buffer[m_Pos++] = m_CurByte;
- m_BitPos = 8;
- }
- }
- }
-
- UInt32 GetBytePos() const { return m_Pos ; }
- UInt32 GetPos() const { return m_Pos * 8 + (8 - m_BitPos); }
- Byte GetCurByte() const { return m_CurByte; }
- void SetPos(UInt32 bitPos)
- {
- m_Pos = bitPos / 8;
- m_BitPos = 8 - ((int)bitPos & 7);
- }
- void SetCurState(int bitPos, Byte curByte)
- {
- m_BitPos = 8 - bitPos;
- m_CurByte = curByte;
- }
-};
-
-class CEncoder;
-
-const int kNumPassesMax = 10;
-
-class CThreadInfo
-{
-public:
- Byte *m_Block;
-private:
- Byte *m_MtfArray;
- Byte *m_TempArray;
- UInt32 *m_BlockSorterIndex;
-
- CMsbfEncoderTemp *m_OutStreamCurrent;
-
- Byte Lens[kNumTablesMax][kMaxAlphaSize];
- UInt32 Freqs[kNumTablesMax][kMaxAlphaSize];
- UInt32 Codes[kNumTablesMax][kMaxAlphaSize];
-
- Byte m_Selectors[kNumSelectorsMax];
-
- UInt32 m_CRCs[1 << kNumPassesMax];
- UInt32 m_NumCrcs;
-
- UInt32 m_BlockIndex;
-
- void WriteBits2(UInt32 value, UInt32 numBits);
- void WriteByte2(Byte b);
- void WriteBit2(bool v);
- void WriteCrc2(UInt32 v);
-
- void EncodeBlock(const Byte *block, UInt32 blockSize);
- UInt32 EncodeBlockWithHeaders(const Byte *block, UInt32 blockSize);
- void EncodeBlock2(const Byte *block, UInt32 blockSize, UInt32 numPasses);
-public:
- bool m_OptimizeNumTables;
- CEncoder *Encoder;
- #ifndef _7ZIP_ST
- NWindows::CThread Thread;
-
- NWindows::NSynchronization::CAutoResetEvent StreamWasFinishedEvent;
- NWindows::NSynchronization::CAutoResetEvent WaitingWasStartedEvent;
-
- // it's not member of this thread. We just need one event per thread
- NWindows::NSynchronization::CAutoResetEvent CanWriteEvent;
-
- UInt64 m_PackSize;
-
- Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
- HRESULT Create();
- void FinishStream(bool needLeave);
- DWORD ThreadFunc();
- #endif
-
- CThreadInfo(): m_BlockSorterIndex(0), m_Block(0) {}
- ~CThreadInfo() { Free(); }
- bool Alloc();
- void Free();
-
- HRESULT EncodeBlock3(UInt32 blockSize);
-};
-
-class CEncoder :
- public ICompressCoder,
- public ICompressSetCoderProperties,
- #ifndef _7ZIP_ST
- public ICompressSetCoderMt,
- #endif
- public CMyUnknownImp
-{
- UInt32 m_BlockSizeMult;
- bool m_OptimizeNumTables;
-
- UInt32 m_NumPassesPrev;
-
- UInt32 m_NumThreadsPrev;
-public:
- CInBuffer m_InStream;
- Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
- CBitmEncoder<COutBuffer> m_OutStream;
- UInt32 NumPasses;
- CBZip2CombinedCrc CombinedCrc;
-
- #ifndef _7ZIP_ST
- CThreadInfo *ThreadsInfo;
- NWindows::NSynchronization::CManualResetEvent CanProcessEvent;
- NWindows::NSynchronization::CCriticalSection CS;
- UInt32 NumThreads;
- bool MtMode;
- UInt32 NextBlockIndex;
-
- bool CloseThreads;
- bool StreamWasFinished;
- NWindows::NSynchronization::CManualResetEvent CanStartWaitingEvent;
-
- HRESULT Result;
- ICompressProgressInfo *Progress;
- #else
- CThreadInfo ThreadsInfo;
- #endif
-
- UInt32 ReadRleBlock(Byte *buffer);
- void WriteBytes(const Byte *data, UInt32 sizeInBits, Byte lastByte);
-
- void WriteBits(UInt32 value, UInt32 numBits);
- void WriteByte(Byte b);
- void WriteBit(bool v);
- void WriteCrc(UInt32 v);
-
- #ifndef _7ZIP_ST
- HRESULT Create();
- void Free();
- #endif
-
-public:
- CEncoder();
- #ifndef _7ZIP_ST
- ~CEncoder();
- #endif
-
- HRESULT Flush() { return m_OutStream.Flush(); }
-
- void ReleaseStreams()
- {
- m_InStream.ReleaseStream();
- m_OutStream.ReleaseStream();
- }
-
- class CFlusher
- {
- CEncoder *_coder;
- public:
- CFlusher(CEncoder *coder): _coder(coder) {}
- ~CFlusher()
- {
- _coder->ReleaseStreams();
- }
- };
-
- #ifndef _7ZIP_ST
- MY_UNKNOWN_IMP2(ICompressSetCoderMt, ICompressSetCoderProperties)
- #else
- MY_UNKNOWN_IMP1(ICompressSetCoderProperties)
- #endif
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
-
- #ifndef _7ZIP_ST
- STDMETHOD(SetNumberOfThreads)(UInt32 numThreads);
- #endif
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Register.cpp b/src/libs/7zip/win/CPP/7zip/Compress/BZip2Register.cpp
deleted file mode 100644
index ef14204b0..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BZip2Register.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// BZip2Register.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "BZip2Decoder.h"
-
-static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NBZip2::CDecoder); }
-#if !defined(EXTRACT_ONLY) && !defined(BZIP2_EXTRACT_ONLY)
-#include "BZip2Encoder.h"
-static void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NBZip2::CEncoder); }
-#else
-#define CreateCodecOut 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodec, CreateCodecOut, 0x040202, L"BZip2", 1, false };
-
-REGISTER_CODEC(BZip2)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BitlDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/BitlDecoder.cpp
deleted file mode 100644
index 78665be8f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BitlDecoder.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-// BitlDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "BitlDecoder.h"
-
-namespace NBitl {
-
-Byte kInvertTable[256];
-
-struct CInverterTableInitializer
-{
- CInverterTableInitializer()
- {
- for (int i = 0; i < 256; i++)
- {
- int x = ((i & 0x55) << 1) | ((i & 0xAA) >> 1);
- x = ((x & 0x33) << 2) | ((x & 0xCC) >> 2);
- kInvertTable[i] = (Byte)(((x & 0x0F) << 4) | ((x & 0xF0) >> 4));
- }
- }
-} g_InverterTableInitializer;
-
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BitlDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/BitlDecoder.h
deleted file mode 100644
index ff373bac6..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BitlDecoder.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// BitlDecoder.h -- the Least Significant Bit of byte is First
-
-#ifndef __BITL_DECODER_H
-#define __BITL_DECODER_H
-
-#include "../IStream.h"
-
-namespace NBitl {
-
-const unsigned kNumBigValueBits = 8 * 4;
-const unsigned kNumValueBytes = 3;
-const unsigned kNumValueBits = 8 * kNumValueBytes;
-
-const UInt32 kMask = (1 << kNumValueBits) - 1;
-
-extern Byte kInvertTable[256];
-
-template<class TInByte>
-class CBaseDecoder
-{
-protected:
- unsigned m_BitPos;
- UInt32 m_Value;
- TInByte m_Stream;
-public:
- UInt32 NumExtraBytes;
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream); }
- void ReleaseStream() { m_Stream.ReleaseStream(); }
- void Init()
- {
- m_Stream.Init();
- m_BitPos = kNumBigValueBits;
- m_Value = 0;
- NumExtraBytes = 0;
- }
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() + NumExtraBytes - (kNumBigValueBits - m_BitPos) / 8; }
-
- void Normalize()
- {
- for (; m_BitPos >= 8; m_BitPos -= 8)
- {
- Byte b = 0;
- if (!m_Stream.ReadByte(b))
- {
- b = 0xFF; // check it
- NumExtraBytes++;
- }
- m_Value = (b << (kNumBigValueBits - m_BitPos)) | m_Value;
- }
- }
-
- UInt32 ReadBits(unsigned numBits)
- {
- Normalize();
- UInt32 res = m_Value & ((1 << numBits) - 1);
- m_BitPos += numBits;
- m_Value >>= numBits;
- return res;
- }
-
- bool ExtraBitsWereRead() const
- {
- if (NumExtraBytes == 0)
- return false;
- return ((UInt32)(kNumBigValueBits - m_BitPos) < (NumExtraBytes << 3));
- }
-};
-
-template<class TInByte>
-class CDecoder: public CBaseDecoder<TInByte>
-{
- UInt32 m_NormalValue;
-
-public:
- void Init()
- {
- CBaseDecoder<TInByte>::Init();
- m_NormalValue = 0;
- }
-
- void Normalize()
- {
- for (; this->m_BitPos >= 8; this->m_BitPos -= 8)
- {
- Byte b = 0;
- if (!this->m_Stream.ReadByte(b))
- {
- b = 0xFF; // check it
- this->NumExtraBytes++;
- }
- m_NormalValue = (b << (kNumBigValueBits - this->m_BitPos)) | m_NormalValue;
- this->m_Value = (this->m_Value << 8) | kInvertTable[b];
- }
- }
-
- UInt32 GetValue(unsigned numBits)
- {
- Normalize();
- return ((this->m_Value >> (8 - this->m_BitPos)) & kMask) >> (kNumValueBits - numBits);
- }
-
- void MovePos(unsigned numBits)
- {
- this->m_BitPos += numBits;
- m_NormalValue >>= numBits;
- }
-
- UInt32 ReadBits(unsigned numBits)
- {
- Normalize();
- UInt32 res = m_NormalValue & ((1 << numBits) - 1);
- MovePos(numBits);
- return res;
- }
-
- void AlignToByte() { MovePos((32 - this->m_BitPos) & 7); }
-
- Byte ReadByte()
- {
- if (this->m_BitPos == kNumBigValueBits)
- {
- Byte b = 0;
- if (!this->m_Stream.ReadByte(b))
- {
- b = 0xFF;
- this->NumExtraBytes++;
- }
- return b;
- }
- {
- Byte b = (Byte)(m_NormalValue & 0xFF);
- MovePos(8);
- return b;
- }
- }
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BitlEncoder.h b/src/libs/7zip/win/CPP/7zip/Compress/BitlEncoder.h
deleted file mode 100644
index 7de575456..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BitlEncoder.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// BitlEncoder.h -- the Least Significant Bit of byte is First
-
-#ifndef __BITL_ENCODER_H
-#define __BITL_ENCODER_H
-
-#include "../Common/OutBuffer.h"
-
-class CBitlEncoder
-{
- COutBuffer m_Stream;
- unsigned m_BitPos;
- Byte m_CurByte;
-public:
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialOutStream *outStream) { m_Stream.SetStream(outStream); }
- void ReleaseStream() { m_Stream.ReleaseStream(); }
- UInt32 GetBitPosition() const { return (8 - m_BitPos); }
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() + (8 - m_BitPos + 7) /8; }
- void Init()
- {
- m_Stream.Init();
- m_BitPos = 8;
- m_CurByte = 0;
- }
- HRESULT Flush()
- {
- FlushByte();
- return m_Stream.Flush();
- }
- void FlushByte()
- {
- if (m_BitPos < 8)
- m_Stream.WriteByte(m_CurByte);
- m_BitPos = 8;
- m_CurByte = 0;
- }
- void WriteBits(UInt32 value, unsigned numBits)
- {
- while (numBits > 0)
- {
- if (numBits < m_BitPos)
- {
- m_CurByte |= (value & ((1 << numBits) - 1)) << (8 - m_BitPos);
- m_BitPos -= numBits;
- return;
- }
- numBits -= m_BitPos;
- m_Stream.WriteByte((Byte)(m_CurByte | (value << (8 - m_BitPos))));
- value >>= m_BitPos;
- m_BitPos = 8;
- m_CurByte = 0;
- }
- }
- void WriteByte(Byte b) { m_Stream.WriteByte(b);}
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BitmDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/BitmDecoder.h
deleted file mode 100644
index 4369b4524..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BitmDecoder.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// BitmDecoder.h -- the Most Significant Bit of byte is First
-
-#ifndef __BITM_DECODER_H
-#define __BITM_DECODER_H
-
-#include "../IStream.h"
-
-namespace NBitm {
-
-const unsigned kNumBigValueBits = 8 * 4;
-const unsigned kNumValueBytes = 3;
-const unsigned kNumValueBits = 8 * kNumValueBytes;
-
-const UInt32 kMask = (1 << kNumValueBits) - 1;
-
-template<class TInByte>
-class CDecoder
-{
- unsigned m_BitPos;
- UInt32 m_Value;
-public:
- TInByte m_Stream;
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream);}
- void ReleaseStream() { m_Stream.ReleaseStream();}
-
- void Init()
- {
- m_Stream.Init();
- m_BitPos = kNumBigValueBits;
- Normalize();
- }
-
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - (kNumBigValueBits - m_BitPos) / 8; }
-
- void Normalize()
- {
- for (;m_BitPos >= 8; m_BitPos -= 8)
- m_Value = (m_Value << 8) | m_Stream.ReadByte();
- }
-
- UInt32 GetValue(unsigned numBits) const
- {
- // return (m_Value << m_BitPos) >> (kNumBigValueBits - numBits);
- return ((m_Value >> (8 - m_BitPos)) & kMask) >> (kNumValueBits - numBits);
- }
-
- void MovePos(unsigned numBits)
- {
- m_BitPos += numBits;
- Normalize();
- }
-
- UInt32 ReadBits(unsigned numBits)
- {
- UInt32 res = GetValue(numBits);
- MovePos(numBits);
- return res;
- }
-
- void AlignToByte() { MovePos((32 - m_BitPos) & 7); }
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BitmEncoder.h b/src/libs/7zip/win/CPP/7zip/Compress/BitmEncoder.h
deleted file mode 100644
index a85dbff89..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BitmEncoder.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// BitmEncoder.h -- the Most Significant Bit of byte is First
-
-#ifndef __BITM_ENCODER_H
-#define __BITM_ENCODER_H
-
-#include "../IStream.h"
-
-template<class TOutByte>
-class CBitmEncoder
-{
- TOutByte m_Stream;
- unsigned m_BitPos;
- Byte m_CurByte;
-public:
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialOutStream *outStream) { m_Stream.SetStream(outStream);}
- void ReleaseStream() { m_Stream.ReleaseStream(); }
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() + (8 - m_BitPos + 7) / 8; }
- void Init()
- {
- m_Stream.Init();
- m_BitPos = 8;
- m_CurByte = 0;
- }
- HRESULT Flush()
- {
- if (m_BitPos < 8)
- WriteBits(0, m_BitPos);
- return m_Stream.Flush();
- }
- void WriteBits(UInt32 value, unsigned numBits)
- {
- while (numBits > 0)
- {
- if (numBits < m_BitPos)
- {
- m_CurByte |= ((Byte)value << (m_BitPos -= numBits));
- return;
- }
- numBits -= m_BitPos;
- UInt32 newBits = (value >> numBits);
- value -= (newBits << numBits);
- m_Stream.WriteByte((Byte)(m_CurByte | newBits));
- m_BitPos = 8;
- m_CurByte = 0;
- }
- }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Deflate64Register.cpp b/src/libs/7zip/win/CPP/7zip/Compress/Deflate64Register.cpp
deleted file mode 100644
index 509e675a5..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Deflate64Register.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// Deflate64Register.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "DeflateDecoder.h"
-
-static void *CreateCodecDeflate64() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NDecoder::CCOMCoder64); }
-#if !defined(EXTRACT_ONLY) && !defined(DEFLATE_EXTRACT_ONLY)
-#include "DeflateEncoder.h"
-static void *CreateCodecOutDeflate64() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NEncoder::CCOMCoder64); }
-#else
-#define CreateCodecOutDeflate64 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodecDeflate64, CreateCodecOutDeflate64, 0x040109, L"Deflate64", 1, false };
-
-REGISTER_CODEC(Deflate64)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/DeflateConst.h b/src/libs/7zip/win/CPP/7zip/Compress/DeflateConst.h
deleted file mode 100644
index 00e5ab8bf..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/DeflateConst.h
+++ /dev/null
@@ -1,134 +0,0 @@
-// DeflateConst.h
-
-#ifndef __DEFLATE_CONST_H
-#define __DEFLATE_CONST_H
-
-namespace NCompress {
-namespace NDeflate {
-
-const int kNumHuffmanBits = 15;
-
-const UInt32 kHistorySize32 = (1 << 15);
-const UInt32 kHistorySize64 = (1 << 16);
-
-const UInt32 kDistTableSize32 = 30;
-const UInt32 kDistTableSize64 = 32;
-
-const UInt32 kNumLenSymbols32 = 256;
-const UInt32 kNumLenSymbols64 = 255; // don't change it. It must be <= 255.
-const UInt32 kNumLenSymbolsMax = kNumLenSymbols32;
-
-const UInt32 kNumLenSlots = 29;
-
-const UInt32 kFixedDistTableSize = 32;
-const UInt32 kFixedLenTableSize = 31;
-
-const UInt32 kSymbolEndOfBlock = 0x100;
-const UInt32 kSymbolMatch = kSymbolEndOfBlock + 1;
-
-const UInt32 kMainTableSize = kSymbolMatch + kNumLenSlots;
-const UInt32 kFixedMainTableSize = kSymbolMatch + kFixedLenTableSize;
-
-const UInt32 kLevelTableSize = 19;
-
-const UInt32 kTableDirectLevels = 16;
-const UInt32 kTableLevelRepNumber = kTableDirectLevels;
-const UInt32 kTableLevel0Number = kTableLevelRepNumber + 1;
-const UInt32 kTableLevel0Number2 = kTableLevel0Number + 1;
-
-const UInt32 kLevelMask = 0xF;
-
-const Byte kLenStart32[kFixedLenTableSize] =
- {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 255, 0, 0};
-const Byte kLenStart64[kFixedLenTableSize] =
- {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 0, 0, 0};
-
-const Byte kLenDirectBits32[kFixedLenTableSize] =
- {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0};
-const Byte kLenDirectBits64[kFixedLenTableSize] =
- {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 16, 0, 0};
-
-const UInt32 kDistStart[kDistTableSize64] =
- {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,
- 1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768,49152};
-const Byte kDistDirectBits[kDistTableSize64] =
- {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14};
-
-const Byte kLevelDirectBits[3] = {2, 3, 7};
-
-const Byte kCodeLengthAlphabetOrder[kLevelTableSize] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
-
-const UInt32 kMatchMinLen = 3;
-const UInt32 kMatchMaxLen32 = kNumLenSymbols32 + kMatchMinLen - 1; //256 + 2
-const UInt32 kMatchMaxLen64 = kNumLenSymbols64 + kMatchMinLen - 1; //255 + 2
-const UInt32 kMatchMaxLen = kMatchMaxLen32;
-
-const int kFinalBlockFieldSize = 1;
-
-namespace NFinalBlockField
-{
- enum
- {
- kNotFinalBlock = 0,
- kFinalBlock = 1
- };
-}
-
-const int kBlockTypeFieldSize = 2;
-
-namespace NBlockType
-{
- enum
- {
- kStored = 0,
- kFixedHuffman = 1,
- kDynamicHuffman = 2
- };
-}
-
-const int kNumLenCodesFieldSize = 5;
-const int kNumDistCodesFieldSize = 5;
-const int kNumLevelCodesFieldSize = 4;
-
-const UInt32 kNumLitLenCodesMin = 257;
-const UInt32 kNumDistCodesMin = 1;
-const UInt32 kNumLevelCodesMin = 4;
-
-const int kLevelFieldSize = 3;
-
-const int kStoredBlockLengthFieldSize = 16;
-
-struct CLevels
-{
- Byte litLenLevels[kFixedMainTableSize];
- Byte distLevels[kFixedDistTableSize];
-
- void SubClear()
- {
- UInt32 i;
- for(i = kNumLitLenCodesMin; i < kFixedMainTableSize; i++)
- litLenLevels[i] = 0;
- for(i = 0; i < kFixedDistTableSize; i++)
- distLevels[i] = 0;
- }
-
- void SetFixedLevels()
- {
- int i;
-
- for (i = 0; i < 144; i++)
- litLenLevels[i] = 8;
- for (; i < 256; i++)
- litLenLevels[i] = 9;
- for (; i < 280; i++)
- litLenLevels[i] = 7;
- for (; i < 288; i++)
- litLenLevels[i] = 8;
- for (i = 0; i < kFixedDistTableSize; i++) // test it: InfoZip only uses kDistTableSize
- distLevels[i] = 5;
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/DeflateDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/DeflateDecoder.cpp
deleted file mode 100644
index 2848cd812..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/DeflateDecoder.cpp
+++ /dev/null
@@ -1,353 +0,0 @@
-// DeflateDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "DeflateDecoder.h"
-
-namespace NCompress {
-namespace NDeflate {
-namespace NDecoder {
-
-static const int kLenIdFinished = -1;
-static const int kLenIdNeedInit = -2;
-
-CCoder::CCoder(bool deflate64Mode, bool deflateNSIS):
- _deflate64Mode(deflate64Mode),
- _deflateNSIS(deflateNSIS),
- _keepHistory(false),
- _needInitInStream(true),
- ZlibMode(false) {}
-
-UInt32 CCoder::ReadBits(int numBits)
-{
- return m_InBitStream.ReadBits(numBits);
-}
-
-bool CCoder::DeCodeLevelTable(Byte *values, int numSymbols)
-{
- int i = 0;
- do
- {
- UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);
- if (number < kTableDirectLevels)
- values[i++] = (Byte)number;
- else if (number < kLevelTableSize)
- {
- if (number == kTableLevelRepNumber)
- {
- if (i == 0)
- return false;
- int num = ReadBits(2) + 3;
- for (; num > 0 && i < numSymbols; num--, i++)
- values[i] = values[i - 1];
- }
- else
- {
- int num;
- if (number == kTableLevel0Number)
- num = ReadBits(3) + 3;
- else
- num = ReadBits(7) + 11;
- for (;num > 0 && i < numSymbols; num--)
- values[i++] = 0;
- }
- }
- else
- return false;
- }
- while(i < numSymbols);
- return true;
-}
-
-#define RIF(x) { if (!(x)) return false; }
-
-bool CCoder::ReadTables(void)
-{
- m_FinalBlock = (ReadBits(kFinalBlockFieldSize) == NFinalBlockField::kFinalBlock);
- UInt32 blockType = ReadBits(kBlockTypeFieldSize);
- if (blockType > NBlockType::kDynamicHuffman)
- return false;
-
- if (blockType == NBlockType::kStored)
- {
- m_StoredMode = true;
- m_InBitStream.AlignToByte();
- m_StoredBlockSize = ReadBits(kStoredBlockLengthFieldSize);
- if (_deflateNSIS)
- return true;
- return (m_StoredBlockSize == (UInt16)~ReadBits(kStoredBlockLengthFieldSize));
- }
-
- m_StoredMode = false;
-
- CLevels levels;
- if (blockType == NBlockType::kFixedHuffman)
- {
- levels.SetFixedLevels();
- _numDistLevels = _deflate64Mode ? kDistTableSize64 : kDistTableSize32;
- }
- else
- {
- int numLitLenLevels = ReadBits(kNumLenCodesFieldSize) + kNumLitLenCodesMin;
- _numDistLevels = ReadBits(kNumDistCodesFieldSize) + kNumDistCodesMin;
- int numLevelCodes = ReadBits(kNumLevelCodesFieldSize) + kNumLevelCodesMin;
-
- if (!_deflate64Mode)
- if (_numDistLevels > kDistTableSize32)
- return false;
-
- Byte levelLevels[kLevelTableSize];
- for (int i = 0; i < kLevelTableSize; i++)
- {
- int position = kCodeLengthAlphabetOrder[i];
- if(i < numLevelCodes)
- levelLevels[position] = (Byte)ReadBits(kLevelFieldSize);
- else
- levelLevels[position] = 0;
- }
-
- RIF(m_LevelDecoder.SetCodeLengths(levelLevels));
-
- Byte tmpLevels[kFixedMainTableSize + kFixedDistTableSize];
- if (!DeCodeLevelTable(tmpLevels, numLitLenLevels + _numDistLevels))
- return false;
-
- levels.SubClear();
- memcpy(levels.litLenLevels, tmpLevels, numLitLenLevels);
- memcpy(levels.distLevels, tmpLevels + numLitLenLevels, _numDistLevels);
- }
- RIF(m_MainDecoder.SetCodeLengths(levels.litLenLevels));
- return m_DistDecoder.SetCodeLengths(levels.distLevels);
-}
-
-HRESULT CCoder::CodeSpec(UInt32 curSize)
-{
- if (_remainLen == kLenIdFinished)
- return S_OK;
- if (_remainLen == kLenIdNeedInit)
- {
- if (!_keepHistory)
- if (!m_OutWindowStream.Create(_deflate64Mode ? kHistorySize64: kHistorySize32))
- return E_OUTOFMEMORY;
- RINOK(InitInStream(_needInitInStream));
- m_OutWindowStream.Init(_keepHistory);
- m_FinalBlock = false;
- _remainLen = 0;
- _needReadTable = true;
- }
-
- if (curSize == 0)
- return S_OK;
-
- while(_remainLen > 0 && curSize > 0)
- {
- _remainLen--;
- Byte b = m_OutWindowStream.GetByte(_rep0);
- m_OutWindowStream.PutByte(b);
- curSize--;
- }
-
- while(curSize > 0)
- {
- if (_needReadTable)
- {
- if (m_FinalBlock)
- {
- _remainLen = kLenIdFinished;
- break;
- }
- if (!ReadTables())
- return S_FALSE;
- _needReadTable = false;
- }
-
- if(m_StoredMode)
- {
- for (; m_StoredBlockSize > 0 && curSize > 0; m_StoredBlockSize--, curSize--)
- m_OutWindowStream.PutByte(m_InBitStream.ReadByte());
- _needReadTable = (m_StoredBlockSize == 0);
- continue;
- }
- while(curSize > 0)
- {
- if (m_InBitStream.NumExtraBytes > 4)
- return S_FALSE;
-
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
- if (number < 0x100)
- {
- m_OutWindowStream.PutByte((Byte)number);
- curSize--;
- continue;
- }
- else if (number == kSymbolEndOfBlock)
- {
- _needReadTable = true;
- break;
- }
- else if (number < kMainTableSize)
- {
- number -= kSymbolMatch;
- UInt32 len;
- {
- int numBits;
- if (_deflate64Mode)
- {
- len = kLenStart64[number];
- numBits = kLenDirectBits64[number];
- }
- else
- {
- len = kLenStart32[number];
- numBits = kLenDirectBits32[number];
- }
- len += kMatchMinLen + m_InBitStream.ReadBits(numBits);
- }
- UInt32 locLen = len;
- if (locLen > curSize)
- locLen = (UInt32)curSize;
- number = m_DistDecoder.DecodeSymbol(&m_InBitStream);
- if (number >= _numDistLevels)
- return S_FALSE;
- UInt32 distance = kDistStart[number] + m_InBitStream.ReadBits(kDistDirectBits[number]);
- if (!m_OutWindowStream.CopyBlock(distance, locLen))
- return S_FALSE;
- curSize -= locLen;
- len -= locLen;
- if (len != 0)
- {
- _remainLen = (Int32)len;
- _rep0 = distance;
- break;
- }
- }
- else
- return S_FALSE;
- }
- }
- return S_OK;
-}
-
-#ifdef _NO_EXCEPTIONS
-
-#define DEFLATE_TRY_BEGIN
-#define DEFLATE_TRY_END
-
-#else
-
-#define DEFLATE_TRY_BEGIN try {
-#define DEFLATE_TRY_END } \
- catch(const CInBufferException &e) { return e.ErrorCode; } \
- catch(const CLzOutWindowException &e) { return e.ErrorCode; } \
- catch(...) { return S_FALSE; }
-
-#endif
-
-HRESULT CCoder::CodeReal(ISequentialOutStream *outStream,
- const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- DEFLATE_TRY_BEGIN
- m_OutWindowStream.SetStream(outStream);
- CCoderReleaser flusher(this);
-
- const UInt64 inStart = _needInitInStream ? 0 : m_InBitStream.GetProcessedSize();
- const UInt64 start = m_OutWindowStream.GetProcessedSize();
- for (;;)
- {
- UInt32 curSize = 1 << 18;
- if (outSize != 0)
- {
- const UInt64 rem = *outSize - (m_OutWindowStream.GetProcessedSize() - start);
- if (curSize > rem)
- curSize = (UInt32)rem;
- }
- if (curSize == 0)
- break;
- RINOK(CodeSpec(curSize));
- if (_remainLen == kLenIdFinished)
- break;
- if (progress != NULL)
- {
- const UInt64 inSize = m_InBitStream.GetProcessedSize() - inStart;
- const UInt64 nowPos64 = m_OutWindowStream.GetProcessedSize() - start;
- RINOK(progress->SetRatioInfo(&inSize, &nowPos64));
- }
- }
- if (_remainLen == kLenIdFinished && ZlibMode)
- {
- m_InBitStream.AlignToByte();
- for (int i = 0; i < 4; i++)
- ZlibFooter[i] = m_InBitStream.ReadByte();
- }
- flusher.NeedFlush = false;
- HRESULT res = Flush();
- if (res == S_OK && InputEofError())
- return S_FALSE;
- return res;
- DEFLATE_TRY_END
-}
-
-HRESULT CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- SetInStream(inStream);
- SetOutStreamSize(outSize);
- HRESULT res = CodeReal(outStream, outSize, progress);
- ReleaseInStream();
- return res;
-}
-
-STDMETHODIMP CCoder::GetInStreamProcessedSize(UInt64 *value)
-{
- if (value == NULL)
- return E_INVALIDARG;
- *value = m_InBitStream.GetProcessedSize();
- return S_OK;
-}
-
-STDMETHODIMP CCoder::SetInStream(ISequentialInStream *inStream)
-{
- m_InBitStream.SetStream(inStream);
- return S_OK;
-}
-
-STDMETHODIMP CCoder::ReleaseInStream()
-{
- m_InBitStream.ReleaseStream();
- return S_OK;
-}
-
-STDMETHODIMP CCoder::SetOutStreamSize(const UInt64 * /* outSize */)
-{
- _remainLen = kLenIdNeedInit;
- _needInitInStream = true;
- m_OutWindowStream.Init(_keepHistory);
- return S_OK;
-}
-
-#ifndef NO_READ_FROM_CODER
-
-STDMETHODIMP CCoder::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- DEFLATE_TRY_BEGIN
- if (processedSize)
- *processedSize = 0;
- const UInt64 startPos = m_OutWindowStream.GetProcessedSize();
- m_OutWindowStream.SetMemStream((Byte *)data);
- RINOK(CodeSpec(size));
- if (processedSize)
- *processedSize = (UInt32)(m_OutWindowStream.GetProcessedSize() - startPos);
- return Flush();
- DEFLATE_TRY_END
-}
-
-#endif
-
-STDMETHODIMP CCoder::CodeResume(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- _remainLen = kLenIdNeedInit;
- m_OutWindowStream.Init(_keepHistory);
- return CodeReal(outStream, outSize, progress);
-}
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/DeflateDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/DeflateDecoder.h
deleted file mode 100644
index 56ab2bea2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/DeflateDecoder.h
+++ /dev/null
@@ -1,157 +0,0 @@
-// DeflateDecoder.h
-
-#ifndef __DEFLATE_DECODER_H
-#define __DEFLATE_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitlDecoder.h"
-#include "DeflateConst.h"
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NDeflate {
-namespace NDecoder {
-
-class CCoder:
- public ICompressCoder,
- public ICompressGetInStreamProcessedSize,
- #ifndef NO_READ_FROM_CODER
- public ICompressSetInStream,
- public ICompressSetOutStreamSize,
- public ISequentialInStream,
- #endif
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- NBitl::CDecoder<CInBuffer> m_InBitStream;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kFixedMainTableSize> m_MainDecoder;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kFixedDistTableSize> m_DistDecoder;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
-
- UInt32 m_StoredBlockSize;
-
- bool m_FinalBlock;
- bool m_StoredMode;
- UInt32 _numDistLevels;
-
-
- bool _deflateNSIS;
- bool _deflate64Mode;
- bool _keepHistory;
- bool _needInitInStream;
- Int32 _remainLen;
- UInt32 _rep0;
- bool _needReadTable;
-
- UInt32 ReadBits(int numBits);
-
- bool DeCodeLevelTable(Byte *values, int numSymbols);
- bool ReadTables();
-
- HRESULT Flush() { return m_OutWindowStream.Flush(); }
- class CCoderReleaser
- {
- CCoder *_coder;
- public:
- bool NeedFlush;
- CCoderReleaser(CCoder *coder): _coder(coder), NeedFlush(true) {}
- ~CCoderReleaser()
- {
- if (NeedFlush)
- _coder->Flush();
- _coder->ReleaseOutStream();
- }
- };
- friend class CCoderReleaser;
-
- HRESULT CodeSpec(UInt32 curSize);
-public:
- bool ZlibMode;
- Byte ZlibFooter[4];
-
- CCoder(bool deflate64Mode, bool deflateNSIS = false);
- virtual ~CCoder() {};
-
- void SetKeepHistory(bool keepHistory) { _keepHistory = keepHistory; }
-
- void ReleaseOutStream()
- {
- m_OutWindowStream.ReleaseStream();
- }
-
- HRESULT CodeReal(ISequentialOutStream *outStream,
- const UInt64 *outSize, ICompressProgressInfo *progress);
-
- #ifndef NO_READ_FROM_CODER
- MY_UNKNOWN_IMP4(
- ICompressGetInStreamProcessedSize,
- ICompressSetInStream,
- ICompressSetOutStreamSize,
- ISequentialInStream
- )
- #else
- MY_UNKNOWN_IMP1(
- ICompressGetInStreamProcessedSize)
- #endif
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
-
- #ifndef NO_READ_FROM_CODER
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- #endif
-
- STDMETHOD(CodeResume)(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- HRESULT InitInStream(bool needInit)
- {
- if (!m_InBitStream.Create(1 << 17))
- return E_OUTOFMEMORY;
- if (needInit)
- {
- m_InBitStream.Init();
- _needInitInStream = false;
- }
- return S_OK;
- }
-
- void AlignToByte() { m_InBitStream.AlignToByte(); }
- Byte ReadByte() { return (Byte)m_InBitStream.ReadBits(8); }
- bool InputEofError() const { return m_InBitStream.ExtraBitsWereRead(); }
- UInt64 GetInputProcessedSize() const { return m_InBitStream.GetProcessedSize(); }
-
- // IGetInStreamProcessedSize
- STDMETHOD(GetInStreamProcessedSize)(UInt64 *value);
-};
-
-class CCOMCoder : public CCoder
-{
-public:
- CCOMCoder(): CCoder(false) {}
-};
-
-class CNsisCOMCoder : public CCoder
-{
-public:
- CNsisCOMCoder(): CCoder(false, true) {}
-};
-
-class CCOMCoder64 : public CCoder
-{
-public:
- CCOMCoder64(): CCoder(true) {}
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/DeflateEncoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/DeflateEncoder.cpp
deleted file mode 100644
index 35a81cae4..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/DeflateEncoder.cpp
+++ /dev/null
@@ -1,986 +0,0 @@
-// DeflateEncoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-#include "../../../C/HuffEnc.h"
-
-#include "Common/ComTry.h"
-
-#include "DeflateEncoder.h"
-
-#undef NO_INLINE
-
-#ifdef _MSC_VER
-#define NO_INLINE MY_NO_INLINE
-#else
-#define NO_INLINE
-#endif
-
-namespace NCompress {
-namespace NDeflate {
-namespace NEncoder {
-
-const int kNumDivPassesMax = 10; // [0, 16); ratio/speed/ram tradeoff; use big value for better compression ratio.
-const UInt32 kNumTables = (1 << kNumDivPassesMax);
-
-static UInt32 kFixedHuffmanCodeBlockSizeMax = (1 << 8); // [0, (1 << 32)); ratio/speed tradeoff; use big value for better compression ratio.
-static UInt32 kDivideCodeBlockSizeMin = (1 << 7); // [1, (1 << 32)); ratio/speed tradeoff; use small value for better compression ratio.
-static UInt32 kDivideBlockSizeMin = (1 << 6); // [1, (1 << 32)); ratio/speed tradeoff; use small value for better compression ratio.
-
-static const UInt32 kMaxUncompressedBlockSize = ((1 << 16) - 1) * 1; // [1, (1 << 32))
-static const UInt32 kMatchArraySize = kMaxUncompressedBlockSize * 10; // [kMatchMaxLen * 2, (1 << 32))
-static const UInt32 kMatchArrayLimit = kMatchArraySize - kMatchMaxLen * 4 * sizeof(UInt16);
-static const UInt32 kBlockUncompressedSizeThreshold = kMaxUncompressedBlockSize -
- kMatchMaxLen - kNumOpts;
-
-static const int kMaxCodeBitLength = 11;
-static const int kMaxLevelBitLength = 7;
-
-static Byte kNoLiteralStatPrice = 11;
-static Byte kNoLenStatPrice = 11;
-static Byte kNoPosStatPrice = 6;
-
-static Byte g_LenSlots[kNumLenSymbolsMax];
-static Byte g_FastPos[1 << 9];
-
-class CFastPosInit
-{
-public:
- CFastPosInit()
- {
- int i;
- for(i = 0; i < kNumLenSlots; i++)
- {
- int c = kLenStart32[i];
- int j = 1 << kLenDirectBits32[i];
- for(int k = 0; k < j; k++, c++)
- g_LenSlots[c] = (Byte)i;
- }
-
- const int kFastSlots = 18;
- int c = 0;
- for (Byte slotFast = 0; slotFast < kFastSlots; slotFast++)
- {
- UInt32 k = (1 << kDistDirectBits[slotFast]);
- for (UInt32 j = 0; j < k; j++, c++)
- g_FastPos[c] = slotFast;
- }
- }
-};
-
-static CFastPosInit g_FastPosInit;
-
-
-inline UInt32 GetPosSlot(UInt32 pos)
-{
- if (pos < 0x200)
- return g_FastPos[pos];
- return g_FastPos[pos >> 8] + 16;
-}
-
-static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
-static void SzFree(void *p, void *address) { p = p; MyFree(address); }
-static ISzAlloc g_Alloc = { SzAlloc, SzFree };
-
-CCoder::CCoder(bool deflate64Mode):
- m_Deflate64Mode(deflate64Mode),
- m_NumPasses(1),
- m_NumDivPasses(1),
- m_NumFastBytes(32),
- _fastMode(false),
- _btMode(true),
- m_OnePosMatchesMemory(0),
- m_DistanceMemory(0),
- m_Created(false),
- m_Values(0),
- m_Tables(0),
- m_MatchFinderCycles(0)
- // m_SetMfPasses(0)
-{
- m_MatchMaxLen = deflate64Mode ? kMatchMaxLen64 : kMatchMaxLen32;
- m_NumLenCombinations = deflate64Mode ? kNumLenSymbols64 : kNumLenSymbols32;
- m_LenStart = deflate64Mode ? kLenStart64 : kLenStart32;
- m_LenDirectBits = deflate64Mode ? kLenDirectBits64 : kLenDirectBits32;
- MatchFinder_Construct(&_lzInWindow);
-}
-
-HRESULT CCoder::Create()
-{
- COM_TRY_BEGIN
- if (m_Values == 0)
- {
- m_Values = (CCodeValue *)MyAlloc((kMaxUncompressedBlockSize) * sizeof(CCodeValue));
- if (m_Values == 0)
- return E_OUTOFMEMORY;
- }
- if (m_Tables == 0)
- {
- m_Tables = (CTables *)MyAlloc((kNumTables) * sizeof(CTables));
- if (m_Tables == 0)
- return E_OUTOFMEMORY;
- }
-
- if (m_IsMultiPass)
- {
- if (m_OnePosMatchesMemory == 0)
- {
- m_OnePosMatchesMemory = (UInt16 *)::MidAlloc(kMatchArraySize * sizeof(UInt16));
- if (m_OnePosMatchesMemory == 0)
- return E_OUTOFMEMORY;
- }
- }
- else
- {
- if (m_DistanceMemory == 0)
- {
- m_DistanceMemory = (UInt16 *)MyAlloc((kMatchMaxLen + 2) * 2 * sizeof(UInt16));
- if (m_DistanceMemory == 0)
- return E_OUTOFMEMORY;
- m_MatchDistances = m_DistanceMemory;
- }
- }
-
- if (!m_Created)
- {
- _lzInWindow.btMode = _btMode ? 1 : 0;
- _lzInWindow.numHashBytes = 3;
- if (!MatchFinder_Create(&_lzInWindow,
- m_Deflate64Mode ? kHistorySize64 : kHistorySize32,
- kNumOpts + kMaxUncompressedBlockSize,
- m_NumFastBytes, m_MatchMaxLen - m_NumFastBytes, &g_Alloc))
- return E_OUTOFMEMORY;
- if (!m_OutStream.Create(1 << 20))
- return E_OUTOFMEMORY;
- }
- if (m_MatchFinderCycles != 0)
- _lzInWindow.cutValue = m_MatchFinderCycles;
- m_Created = true;
- return S_OK;
- COM_TRY_END
-}
-
-HRESULT CCoder::BaseSetEncoderProperties2(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
-{
- for (UInt32 i = 0; i < numProps; i++)
- {
- const PROPVARIANT &prop = props[i];
- switch(propIDs[i])
- {
- case NCoderPropID::kNumPasses:
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- m_NumDivPasses = prop.ulVal;
- if (m_NumDivPasses == 0)
- m_NumDivPasses = 1;
- if (m_NumDivPasses == 1)
- m_NumPasses = 1;
- else if (m_NumDivPasses <= kNumDivPassesMax)
- m_NumPasses = 2;
- else
- {
- m_NumPasses = 2 + (m_NumDivPasses - kNumDivPassesMax);
- m_NumDivPasses = kNumDivPassesMax;
- }
- break;
- case NCoderPropID::kNumFastBytes:
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- m_NumFastBytes = prop.ulVal;
- if(m_NumFastBytes < kMatchMinLen || m_NumFastBytes > m_MatchMaxLen)
- return E_INVALIDARG;
- break;
- case NCoderPropID::kMatchFinderCycles:
- {
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- m_MatchFinderCycles = prop.ulVal;
- break;
- }
- case NCoderPropID::kAlgorithm:
- {
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- UInt32 maximize = prop.ulVal;
- _fastMode = (maximize == 0);
- _btMode = !_fastMode;
- break;
- }
- default:
- return E_INVALIDARG;
- }
- }
- return S_OK;
-}
-
-void CCoder::Free()
-{
- ::MidFree(m_OnePosMatchesMemory); m_OnePosMatchesMemory = 0;
- ::MyFree(m_DistanceMemory); m_DistanceMemory = 0;
- ::MyFree(m_Values); m_Values = 0;
- ::MyFree(m_Tables); m_Tables = 0;
-}
-
-CCoder::~CCoder()
-{
- Free();
- MatchFinder_Free(&_lzInWindow, &g_Alloc);
-}
-
-NO_INLINE void CCoder::GetMatches()
-{
- if (m_IsMultiPass)
- {
- m_MatchDistances = m_OnePosMatchesMemory + m_Pos;
- if (m_SecondPass)
- {
- m_Pos += *m_MatchDistances + 1;
- return;
- }
- }
-
- UInt32 distanceTmp[kMatchMaxLen * 2 + 3];
-
- UInt32 numPairs = (_btMode) ?
- Bt3Zip_MatchFinder_GetMatches(&_lzInWindow, distanceTmp):
- Hc3Zip_MatchFinder_GetMatches(&_lzInWindow, distanceTmp);
-
- *m_MatchDistances = (UInt16)numPairs;
-
- if (numPairs > 0)
- {
- UInt32 i;
- for(i = 0; i < numPairs; i += 2)
- {
- m_MatchDistances[i + 1] = (UInt16)distanceTmp[i];
- m_MatchDistances[i + 2] = (UInt16)distanceTmp[i + 1];
- }
- UInt32 len = distanceTmp[numPairs - 2];
- if (len == m_NumFastBytes && m_NumFastBytes != m_MatchMaxLen)
- {
- UInt32 numAvail = Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) + 1;
- const Byte *pby = Inline_MatchFinder_GetPointerToCurrentPos(&_lzInWindow) - 1;
- const Byte *pby2 = pby - (distanceTmp[numPairs - 1] + 1);
- if (numAvail > m_MatchMaxLen)
- numAvail = m_MatchMaxLen;
- for (; len < numAvail && pby[len] == pby2[len]; len++);
- m_MatchDistances[i - 1] = (UInt16)len;
- }
- }
- if (m_IsMultiPass)
- m_Pos += numPairs + 1;
- if (!m_SecondPass)
- m_AdditionalOffset++;
-}
-
-void CCoder::MovePos(UInt32 num)
-{
- if (!m_SecondPass && num > 0)
- {
- if (_btMode)
- Bt3Zip_MatchFinder_Skip(&_lzInWindow, num);
- else
- Hc3Zip_MatchFinder_Skip(&_lzInWindow, num);
- m_AdditionalOffset += num;
- }
-}
-
-static const UInt32 kIfinityPrice = 0xFFFFFFF;
-
-NO_INLINE UInt32 CCoder::Backward(UInt32 &backRes, UInt32 cur)
-{
- m_OptimumEndIndex = cur;
- UInt32 posMem = m_Optimum[cur].PosPrev;
- UInt16 backMem = m_Optimum[cur].BackPrev;
- do
- {
- UInt32 posPrev = posMem;
- UInt16 backCur = backMem;
- backMem = m_Optimum[posPrev].BackPrev;
- posMem = m_Optimum[posPrev].PosPrev;
- m_Optimum[posPrev].BackPrev = backCur;
- m_Optimum[posPrev].PosPrev = (UInt16)cur;
- cur = posPrev;
- }
- while(cur > 0);
- backRes = m_Optimum[0].BackPrev;
- m_OptimumCurrentIndex = m_Optimum[0].PosPrev;
- return m_OptimumCurrentIndex;
-}
-
-NO_INLINE UInt32 CCoder::GetOptimal(UInt32 &backRes)
-{
- if(m_OptimumEndIndex != m_OptimumCurrentIndex)
- {
- UInt32 len = m_Optimum[m_OptimumCurrentIndex].PosPrev - m_OptimumCurrentIndex;
- backRes = m_Optimum[m_OptimumCurrentIndex].BackPrev;
- m_OptimumCurrentIndex = m_Optimum[m_OptimumCurrentIndex].PosPrev;
- return len;
- }
- m_OptimumCurrentIndex = m_OptimumEndIndex = 0;
-
- GetMatches();
-
- UInt32 numDistancePairs = m_MatchDistances[0];
- if(numDistancePairs == 0)
- return 1;
-
- const UInt16 *matchDistances = m_MatchDistances + 1;
- UInt32 lenMain = matchDistances[numDistancePairs - 2];
-
- if(lenMain > m_NumFastBytes)
- {
- backRes = matchDistances[numDistancePairs - 1];
- MovePos(lenMain - 1);
- return lenMain;
- }
- m_Optimum[1].Price = m_LiteralPrices[Inline_MatchFinder_GetIndexByte(&_lzInWindow, 0 - m_AdditionalOffset)];
- m_Optimum[1].PosPrev = 0;
-
- m_Optimum[2].Price = kIfinityPrice;
- m_Optimum[2].PosPrev = 1;
-
-
- UInt32 offs = 0;
- for(UInt32 i = kMatchMinLen; i <= lenMain; i++)
- {
- UInt32 distance = matchDistances[offs + 1];
- m_Optimum[i].PosPrev = 0;
- m_Optimum[i].BackPrev = (UInt16)distance;
- m_Optimum[i].Price = m_LenPrices[i - kMatchMinLen] + m_PosPrices[GetPosSlot(distance)];
- if (i == matchDistances[offs])
- offs += 2;
- }
-
- UInt32 cur = 0;
- UInt32 lenEnd = lenMain;
- for (;;)
- {
- ++cur;
- if(cur == lenEnd || cur == kNumOptsBase || m_Pos >= kMatchArrayLimit)
- return Backward(backRes, cur);
- GetMatches();
- matchDistances = m_MatchDistances + 1;
-
- UInt32 numDistancePairs = m_MatchDistances[0];
- UInt32 newLen = 0;
- if(numDistancePairs != 0)
- {
- newLen = matchDistances[numDistancePairs - 2];
- if(newLen > m_NumFastBytes)
- {
- UInt32 len = Backward(backRes, cur);
- m_Optimum[cur].BackPrev = matchDistances[numDistancePairs - 1];
- m_OptimumEndIndex = cur + newLen;
- m_Optimum[cur].PosPrev = (UInt16)m_OptimumEndIndex;
- MovePos(newLen - 1);
- return len;
- }
- }
- UInt32 curPrice = m_Optimum[cur].Price;
- UInt32 curAnd1Price = curPrice + m_LiteralPrices[Inline_MatchFinder_GetIndexByte(&_lzInWindow, cur - m_AdditionalOffset)];
- COptimal &optimum = m_Optimum[cur + 1];
- if (curAnd1Price < optimum.Price)
- {
- optimum.Price = curAnd1Price;
- optimum.PosPrev = (UInt16)cur;
- }
- if(numDistancePairs == 0)
- continue;
- while(lenEnd < cur + newLen)
- m_Optimum[++lenEnd].Price = kIfinityPrice;
- offs = 0;
- UInt32 distance = matchDistances[offs + 1];
- curPrice += m_PosPrices[GetPosSlot(distance)];
- for(UInt32 lenTest = kMatchMinLen; ; lenTest++)
- {
- UInt32 curAndLenPrice = curPrice + m_LenPrices[lenTest - kMatchMinLen];
- COptimal &optimum = m_Optimum[cur + lenTest];
- if (curAndLenPrice < optimum.Price)
- {
- optimum.Price = curAndLenPrice;
- optimum.PosPrev = (UInt16)cur;
- optimum.BackPrev = (UInt16)distance;
- }
- if (lenTest == matchDistances[offs])
- {
- offs += 2;
- if (offs == numDistancePairs)
- break;
- curPrice -= m_PosPrices[GetPosSlot(distance)];
- distance = matchDistances[offs + 1];
- curPrice += m_PosPrices[GetPosSlot(distance)];
- }
- }
- }
-}
-
-UInt32 CCoder::GetOptimalFast(UInt32 &backRes)
-{
- GetMatches();
- UInt32 numDistancePairs = m_MatchDistances[0];
- if (numDistancePairs == 0)
- return 1;
- UInt32 lenMain = m_MatchDistances[numDistancePairs - 1];
- backRes = m_MatchDistances[numDistancePairs];
- MovePos(lenMain - 1);
- return lenMain;
-}
-
-void CTables::InitStructures()
-{
- UInt32 i;
- for(i = 0; i < 256; i++)
- litLenLevels[i] = 8;
- litLenLevels[i++] = 13;
- for(;i < kFixedMainTableSize; i++)
- litLenLevels[i] = 5;
- for(i = 0; i < kFixedDistTableSize; i++)
- distLevels[i] = 5;
-}
-
-NO_INLINE void CCoder::LevelTableDummy(const Byte *levels, int numLevels, UInt32 *freqs)
-{
- int prevLen = 0xFF;
- int nextLen = levels[0];
- int count = 0;
- int maxCount = 7;
- int minCount = 4;
- if (nextLen == 0)
- {
- maxCount = 138;
- minCount = 3;
- }
- for (int n = 0; n < numLevels; n++)
- {
- int curLen = nextLen;
- nextLen = (n < numLevels - 1) ? levels[n + 1] : 0xFF;
- count++;
- if (count < maxCount && curLen == nextLen)
- continue;
-
- if (count < minCount)
- freqs[curLen] += (UInt32)count;
- else if (curLen != 0)
- {
- if (curLen != prevLen)
- {
- freqs[curLen]++;
- count--;
- }
- freqs[kTableLevelRepNumber]++;
- }
- else if (count <= 10)
- freqs[kTableLevel0Number]++;
- else
- freqs[kTableLevel0Number2]++;
-
- count = 0;
- prevLen = curLen;
-
- if (nextLen == 0)
- {
- maxCount = 138;
- minCount = 3;
- }
- else if (curLen == nextLen)
- {
- maxCount = 6;
- minCount = 3;
- }
- else
- {
- maxCount = 7;
- minCount = 4;
- }
- }
-}
-
-NO_INLINE void CCoder::WriteBits(UInt32 value, int numBits)
-{
- m_OutStream.WriteBits(value, numBits);
-}
-
-#define WRITE_HF2(codes, lens, i) m_OutStream.WriteBits(codes[i], lens[i])
-#define WRITE_HF(i) WriteBits(codes[i], lens[i])
-
-NO_INLINE void CCoder::LevelTableCode(const Byte *levels, int numLevels, const Byte *lens, const UInt32 *codes)
-{
- int prevLen = 0xFF;
- int nextLen = levels[0];
- int count = 0;
- int maxCount = 7;
- int minCount = 4;
- if (nextLen == 0)
- {
- maxCount = 138;
- minCount = 3;
- }
- for (int n = 0; n < numLevels; n++)
- {
- int curLen = nextLen;
- nextLen = (n < numLevels - 1) ? levels[n + 1] : 0xFF;
- count++;
- if (count < maxCount && curLen == nextLen)
- continue;
-
- if (count < minCount)
- for(int i = 0; i < count; i++)
- WRITE_HF(curLen);
- else if (curLen != 0)
- {
- if (curLen != prevLen)
- {
- WRITE_HF(curLen);
- count--;
- }
- WRITE_HF(kTableLevelRepNumber);
- WriteBits(count - 3, 2);
- }
- else if (count <= 10)
- {
- WRITE_HF(kTableLevel0Number);
- WriteBits(count - 3, 3);
- }
- else
- {
- WRITE_HF(kTableLevel0Number2);
- WriteBits(count - 11, 7);
- }
-
- count = 0;
- prevLen = curLen;
-
- if (nextLen == 0)
- {
- maxCount = 138;
- minCount = 3;
- }
- else if (curLen == nextLen)
- {
- maxCount = 6;
- minCount = 3;
- }
- else
- {
- maxCount = 7;
- minCount = 4;
- }
- }
-}
-
-NO_INLINE void CCoder::MakeTables(unsigned maxHuffLen)
-{
- Huffman_Generate(mainFreqs, mainCodes, m_NewLevels.litLenLevels, kFixedMainTableSize, maxHuffLen);
- Huffman_Generate(distFreqs, distCodes, m_NewLevels.distLevels, kDistTableSize64, maxHuffLen);
-}
-
-NO_INLINE UInt32 Huffman_GetPrice(const UInt32 *freqs, const Byte *lens, UInt32 num)
-{
- UInt32 price = 0;
- UInt32 i;
- for (i = 0; i < num; i++)
- price += lens[i] * freqs[i];
- return price;
-}
-
-NO_INLINE UInt32 Huffman_GetPrice_Spec(const UInt32 *freqs, const Byte *lens, UInt32 num, const Byte *extraBits, UInt32 extraBase)
-{
- return Huffman_GetPrice(freqs, lens, num) +
- Huffman_GetPrice(freqs + extraBase, extraBits, num - extraBase);
-}
-
-NO_INLINE UInt32 CCoder::GetLzBlockPrice() const
-{
- return
- Huffman_GetPrice_Spec(mainFreqs, m_NewLevels.litLenLevels, kFixedMainTableSize, m_LenDirectBits, kSymbolMatch) +
- Huffman_GetPrice_Spec(distFreqs, m_NewLevels.distLevels, kDistTableSize64, kDistDirectBits, 0);
-}
-
-NO_INLINE void CCoder::TryBlock()
-{
- memset(mainFreqs, 0, sizeof(mainFreqs));
- memset(distFreqs, 0, sizeof(distFreqs));
-
- m_ValueIndex = 0;
- UInt32 blockSize = BlockSizeRes;
- BlockSizeRes = 0;
- for (;;)
- {
- if (m_OptimumCurrentIndex == m_OptimumEndIndex)
- {
- if (m_Pos >= kMatchArrayLimit || BlockSizeRes >= blockSize || !m_SecondPass &&
- ((Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) == 0) || m_ValueIndex >= m_ValueBlockSize))
- break;
- }
- UInt32 pos;
- UInt32 len;
- if (_fastMode)
- len = GetOptimalFast(pos);
- else
- len = GetOptimal(pos);
- CCodeValue &codeValue = m_Values[m_ValueIndex++];
- if (len >= kMatchMinLen)
- {
- UInt32 newLen = len - kMatchMinLen;
- codeValue.Len = (UInt16)newLen;
- mainFreqs[kSymbolMatch + g_LenSlots[newLen]]++;
- codeValue.Pos = (UInt16)pos;
- distFreqs[GetPosSlot(pos)]++;
- }
- else
- {
- Byte b = Inline_MatchFinder_GetIndexByte(&_lzInWindow, 0 - m_AdditionalOffset);
- mainFreqs[b]++;
- codeValue.SetAsLiteral();
- codeValue.Pos = b;
- }
- m_AdditionalOffset -= len;
- BlockSizeRes += len;
- }
- mainFreqs[kSymbolEndOfBlock]++;
- m_AdditionalOffset += BlockSizeRes;
- m_SecondPass = true;
-}
-
-NO_INLINE void CCoder::SetPrices(const CLevels &levels)
-{
- if (_fastMode)
- return;
- UInt32 i;
- for(i = 0; i < 256; i++)
- {
- Byte price = levels.litLenLevels[i];
- m_LiteralPrices[i] = ((price != 0) ? price : kNoLiteralStatPrice);
- }
-
- for(i = 0; i < m_NumLenCombinations; i++)
- {
- UInt32 slot = g_LenSlots[i];
- Byte price = levels.litLenLevels[kSymbolMatch + slot];
- m_LenPrices[i] = (Byte)(((price != 0) ? price : kNoLenStatPrice) + m_LenDirectBits[slot]);
- }
-
- for(i = 0; i < kDistTableSize64; i++)
- {
- Byte price = levels.distLevels[i];
- m_PosPrices[i] = (Byte)(((price != 0) ? price: kNoPosStatPrice) + kDistDirectBits[i]);
- }
-}
-
-NO_INLINE void Huffman_ReverseBits(UInt32 *codes, const Byte *lens, UInt32 num)
-{
- for (UInt32 i = 0; i < num; i++)
- {
- UInt32 x = codes[i];
- x = ((x & 0x5555) << 1) | ((x & 0xAAAA) >> 1);
- x = ((x & 0x3333) << 2) | ((x & 0xCCCC) >> 2);
- x = ((x & 0x0F0F) << 4) | ((x & 0xF0F0) >> 4);
- codes[i] = (((x & 0x00FF) << 8) | ((x & 0xFF00) >> 8)) >> (16 - lens[i]);
- }
-}
-
-NO_INLINE void CCoder::WriteBlock()
-{
- Huffman_ReverseBits(mainCodes, m_NewLevels.litLenLevels, kFixedMainTableSize);
- Huffman_ReverseBits(distCodes, m_NewLevels.distLevels, kDistTableSize64);
-
- for (UInt32 i = 0; i < m_ValueIndex; i++)
- {
- const CCodeValue &codeValue = m_Values[i];
- if (codeValue.IsLiteral())
- WRITE_HF2(mainCodes, m_NewLevels.litLenLevels, codeValue.Pos);
- else
- {
- UInt32 len = codeValue.Len;
- UInt32 lenSlot = g_LenSlots[len];
- WRITE_HF2(mainCodes, m_NewLevels.litLenLevels, kSymbolMatch + lenSlot);
- m_OutStream.WriteBits(len - m_LenStart[lenSlot], m_LenDirectBits[lenSlot]);
- UInt32 dist = codeValue.Pos;
- UInt32 posSlot = GetPosSlot(dist);
- WRITE_HF2(distCodes, m_NewLevels.distLevels, posSlot);
- m_OutStream.WriteBits(dist - kDistStart[posSlot], kDistDirectBits[posSlot]);
- }
- }
- WRITE_HF2(mainCodes, m_NewLevels.litLenLevels, kSymbolEndOfBlock);
-}
-
-static UInt32 GetStorePrice(UInt32 blockSize, int bitPosition)
-{
- UInt32 price = 0;
- do
- {
- UInt32 nextBitPosition = (bitPosition + kFinalBlockFieldSize + kBlockTypeFieldSize) & 7;
- int numBitsForAlign = nextBitPosition > 0 ? (8 - nextBitPosition): 0;
- UInt32 curBlockSize = (blockSize < (1 << 16)) ? blockSize : (1 << 16) - 1;
- price += kFinalBlockFieldSize + kBlockTypeFieldSize + numBitsForAlign + (2 + 2) * 8 + curBlockSize * 8;
- bitPosition = 0;
- blockSize -= curBlockSize;
- }
- while(blockSize != 0);
- return price;
-}
-
-void CCoder::WriteStoreBlock(UInt32 blockSize, UInt32 additionalOffset, bool finalBlock)
-{
- do
- {
- UInt32 curBlockSize = (blockSize < (1 << 16)) ? blockSize : (1 << 16) - 1;
- blockSize -= curBlockSize;
- WriteBits((finalBlock && (blockSize == 0) ? NFinalBlockField::kFinalBlock: NFinalBlockField::kNotFinalBlock), kFinalBlockFieldSize);
- WriteBits(NBlockType::kStored, kBlockTypeFieldSize);
- m_OutStream.FlushByte();
- WriteBits((UInt16)curBlockSize, kStoredBlockLengthFieldSize);
- WriteBits((UInt16)~curBlockSize, kStoredBlockLengthFieldSize);
- const Byte *data = Inline_MatchFinder_GetPointerToCurrentPos(&_lzInWindow)- additionalOffset;
- for(UInt32 i = 0; i < curBlockSize; i++)
- m_OutStream.WriteByte(data[i]);
- additionalOffset -= curBlockSize;
- }
- while(blockSize != 0);
-}
-
-NO_INLINE UInt32 CCoder::TryDynBlock(int tableIndex, UInt32 numPasses)
-{
- CTables &t = m_Tables[tableIndex];
- BlockSizeRes = t.BlockSizeRes;
- UInt32 posTemp = t.m_Pos;
- SetPrices(t);
-
- for (UInt32 p = 0; p < numPasses; p++)
- {
- m_Pos = posTemp;
- TryBlock();
- unsigned numHuffBits =
- (m_ValueIndex > 18000 ? 12 :
- (m_ValueIndex > 7000 ? 11 :
- (m_ValueIndex > 2000 ? 10 : 9)));
- MakeTables(numHuffBits);
- SetPrices(m_NewLevels);
- }
-
- (CLevels &)t = m_NewLevels;
-
- m_NumLitLenLevels = kMainTableSize;
- while(m_NumLitLenLevels > kNumLitLenCodesMin && m_NewLevels.litLenLevels[m_NumLitLenLevels - 1] == 0)
- m_NumLitLenLevels--;
-
- m_NumDistLevels = kDistTableSize64;
- while(m_NumDistLevels > kNumDistCodesMin && m_NewLevels.distLevels[m_NumDistLevels - 1] == 0)
- m_NumDistLevels--;
-
- UInt32 levelFreqs[kLevelTableSize];
- memset(levelFreqs, 0, sizeof(levelFreqs));
-
- LevelTableDummy(m_NewLevels.litLenLevels, m_NumLitLenLevels, levelFreqs);
- LevelTableDummy(m_NewLevels.distLevels, m_NumDistLevels, levelFreqs);
-
- Huffman_Generate(levelFreqs, levelCodes, levelLens, kLevelTableSize, kMaxLevelBitLength);
-
- m_NumLevelCodes = kNumLevelCodesMin;
- for (UInt32 i = 0; i < kLevelTableSize; i++)
- {
- Byte level = levelLens[kCodeLengthAlphabetOrder[i]];
- if (level > 0 && i >= m_NumLevelCodes)
- m_NumLevelCodes = i + 1;
- m_LevelLevels[i] = level;
- }
-
- return GetLzBlockPrice() +
- Huffman_GetPrice_Spec(levelFreqs, levelLens, kLevelTableSize, kLevelDirectBits, kTableDirectLevels) +
- kNumLenCodesFieldSize + kNumDistCodesFieldSize + kNumLevelCodesFieldSize +
- m_NumLevelCodes * kLevelFieldSize + kFinalBlockFieldSize + kBlockTypeFieldSize;
-}
-
-NO_INLINE UInt32 CCoder::TryFixedBlock(int tableIndex)
-{
- CTables &t = m_Tables[tableIndex];
- BlockSizeRes = t.BlockSizeRes;
- m_Pos = t.m_Pos;
- m_NewLevels.SetFixedLevels();
- SetPrices(m_NewLevels);
- TryBlock();
- return kFinalBlockFieldSize + kBlockTypeFieldSize + GetLzBlockPrice();
-}
-
-NO_INLINE UInt32 CCoder::GetBlockPrice(int tableIndex, int numDivPasses)
-{
- CTables &t = m_Tables[tableIndex];
- t.StaticMode = false;
- UInt32 price = TryDynBlock(tableIndex, m_NumPasses);
- t.BlockSizeRes = BlockSizeRes;
- UInt32 numValues = m_ValueIndex;
- UInt32 posTemp = m_Pos;
- UInt32 additionalOffsetEnd = m_AdditionalOffset;
-
- if (m_CheckStatic && m_ValueIndex <= kFixedHuffmanCodeBlockSizeMax)
- {
- const UInt32 fixedPrice = TryFixedBlock(tableIndex);
- t.StaticMode = (fixedPrice < price);
- if (t.StaticMode)
- price = fixedPrice;
- }
-
- const UInt32 storePrice = GetStorePrice(BlockSizeRes, 0); // bitPosition
- t.StoreMode = (storePrice <= price);
- if (t.StoreMode)
- price = storePrice;
-
- t.UseSubBlocks = false;
-
- if (numDivPasses > 1 && numValues >= kDivideCodeBlockSizeMin)
- {
- CTables &t0 = m_Tables[(tableIndex << 1)];
- (CLevels &)t0 = t;
- t0.BlockSizeRes = t.BlockSizeRes >> 1;
- t0.m_Pos = t.m_Pos;
- UInt32 subPrice = GetBlockPrice((tableIndex << 1), numDivPasses - 1);
-
- UInt32 blockSize2 = t.BlockSizeRes - t0.BlockSizeRes;
- if (t0.BlockSizeRes >= kDivideBlockSizeMin && blockSize2 >= kDivideBlockSizeMin)
- {
- CTables &t1 = m_Tables[(tableIndex << 1) + 1];
- (CLevels &)t1 = t;
- t1.BlockSizeRes = blockSize2;
- t1.m_Pos = m_Pos;
- m_AdditionalOffset -= t0.BlockSizeRes;
- subPrice += GetBlockPrice((tableIndex << 1) + 1, numDivPasses - 1);
- t.UseSubBlocks = (subPrice < price);
- if (t.UseSubBlocks)
- price = subPrice;
- }
- }
- m_AdditionalOffset = additionalOffsetEnd;
- m_Pos = posTemp;
- return price;
-}
-
-void CCoder::CodeBlock(int tableIndex, bool finalBlock)
-{
- CTables &t = m_Tables[tableIndex];
- if (t.UseSubBlocks)
- {
- CodeBlock((tableIndex << 1), false);
- CodeBlock((tableIndex << 1) + 1, finalBlock);
- }
- else
- {
- if (t.StoreMode)
- WriteStoreBlock(t.BlockSizeRes, m_AdditionalOffset, finalBlock);
- else
- {
- WriteBits((finalBlock ? NFinalBlockField::kFinalBlock: NFinalBlockField::kNotFinalBlock), kFinalBlockFieldSize);
- if (t.StaticMode)
- {
- WriteBits(NBlockType::kFixedHuffman, kBlockTypeFieldSize);
- TryFixedBlock(tableIndex);
- int i;
- const int kMaxStaticHuffLen = 9;
- for (i = 0; i < kFixedMainTableSize; i++)
- mainFreqs[i] = (UInt32)1 << (kMaxStaticHuffLen - m_NewLevels.litLenLevels[i]);
- for (i = 0; i < kFixedDistTableSize; i++)
- distFreqs[i] = (UInt32)1 << (kMaxStaticHuffLen - m_NewLevels.distLevels[i]);
- MakeTables(kMaxStaticHuffLen);
- }
- else
- {
- if (m_NumDivPasses > 1 || m_CheckStatic)
- TryDynBlock(tableIndex, 1);
- WriteBits(NBlockType::kDynamicHuffman, kBlockTypeFieldSize);
- WriteBits(m_NumLitLenLevels - kNumLitLenCodesMin, kNumLenCodesFieldSize);
- WriteBits(m_NumDistLevels - kNumDistCodesMin, kNumDistCodesFieldSize);
- WriteBits(m_NumLevelCodes - kNumLevelCodesMin, kNumLevelCodesFieldSize);
-
- for (UInt32 i = 0; i < m_NumLevelCodes; i++)
- WriteBits(m_LevelLevels[i], kLevelFieldSize);
-
- Huffman_ReverseBits(levelCodes, levelLens, kLevelTableSize);
- LevelTableCode(m_NewLevels.litLenLevels, m_NumLitLenLevels, levelLens, levelCodes);
- LevelTableCode(m_NewLevels.distLevels, m_NumDistLevels, levelLens, levelCodes);
- }
- WriteBlock();
- }
- m_AdditionalOffset -= t.BlockSizeRes;
- }
-}
-
-SRes Read(void *object, void *data, size_t *size)
-{
- const UInt32 kStepSize = (UInt32)1 << 31;
- UInt32 curSize = ((*size < kStepSize) ? (UInt32)*size : kStepSize);
- HRESULT res = ((CSeqInStream *)object)->RealStream->Read(data, curSize, &curSize);
- *size = curSize;
- return (SRes)res;
-}
-
-HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */ , const UInt64 * /* outSize */ , ICompressProgressInfo *progress)
-{
- m_CheckStatic = (m_NumPasses != 1 || m_NumDivPasses != 1);
- m_IsMultiPass = (m_CheckStatic || (m_NumPasses != 1 || m_NumDivPasses != 1));
-
- RINOK(Create());
-
- m_ValueBlockSize = (7 << 10) + (1 << 12) * m_NumDivPasses;
-
- UInt64 nowPos = 0;
-
- _seqInStream.RealStream = inStream;
- _seqInStream.SeqInStream.Read = Read;
- _lzInWindow.stream = &_seqInStream.SeqInStream;
-
- MatchFinder_Init(&_lzInWindow);
- m_OutStream.SetStream(outStream);
- m_OutStream.Init();
-
- CCoderReleaser coderReleaser(this);
-
- m_OptimumEndIndex = m_OptimumCurrentIndex = 0;
-
- CTables &t = m_Tables[1];
- t.m_Pos = 0;
- t.InitStructures();
-
- m_AdditionalOffset = 0;
- do
- {
- t.BlockSizeRes = kBlockUncompressedSizeThreshold;
- m_SecondPass = false;
- GetBlockPrice(1, m_NumDivPasses);
- CodeBlock(1, Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) == 0);
- nowPos += m_Tables[1].BlockSizeRes;
- if (progress != NULL)
- {
- UInt64 packSize = m_OutStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&nowPos, &packSize));
- }
- }
- while (Inline_MatchFinder_GetNumAvailableBytes(&_lzInWindow) != 0);
- if (_lzInWindow.result != SZ_OK)
- return _lzInWindow.result;
- return m_OutStream.Flush();
-}
-
-HRESULT CCoder::BaseCode(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const COutBufferException &e) { return e.ErrorCode; }
- catch(...) { return E_FAIL; }
-}
-
-STDMETHODIMP CCOMCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
- { return BaseCode(inStream, outStream, inSize, outSize, progress); }
-
-STDMETHODIMP CCOMCoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
- { return BaseSetEncoderProperties2(propIDs, props, numProps); }
-
-STDMETHODIMP CCOMCoder64::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
- { return BaseCode(inStream, outStream, inSize, outSize, progress); }
-
-STDMETHODIMP CCOMCoder64::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
- { return BaseSetEncoderProperties2(propIDs, props, numProps); }
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/DeflateEncoder.h b/src/libs/7zip/win/CPP/7zip/Compress/DeflateEncoder.h
deleted file mode 100644
index 71c39e4e5..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/DeflateEncoder.h
+++ /dev/null
@@ -1,211 +0,0 @@
-// DeflateEncoder.h
-
-#ifndef __DEFLATE_ENCODER_H
-#define __DEFLATE_ENCODER_H
-
-#include "../../../C/LzFind.h"
-
-#include "Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "BitlEncoder.h"
-#include "DeflateConst.h"
-
-namespace NCompress {
-namespace NDeflate {
-namespace NEncoder {
-
-struct CCodeValue
-{
- UInt16 Len;
- UInt16 Pos;
- void SetAsLiteral() { Len = (1 << 15); }
- bool IsLiteral() const { return (Len >= (1 << 15)); }
-};
-
-struct COptimal
-{
- UInt32 Price;
- UInt16 PosPrev;
- UInt16 BackPrev;
-};
-
-const UInt32 kNumOptsBase = 1 << 12;
-const UInt32 kNumOpts = kNumOptsBase + kMatchMaxLen;
-
-class CCoder;
-
-struct CTables: public CLevels
-{
- bool UseSubBlocks;
- bool StoreMode;
- bool StaticMode;
- UInt32 BlockSizeRes;
- UInt32 m_Pos;
- void InitStructures();
-};
-
-typedef struct _CSeqInStream
-{
- ISeqInStream SeqInStream;
- CMyComPtr<ISequentialInStream> RealStream;
-} CSeqInStream;
-
-class CCoder
-{
- CMatchFinder _lzInWindow;
- CBitlEncoder m_OutStream;
-
- CSeqInStream _seqInStream;
-
-public:
- CCodeValue *m_Values;
-
- UInt16 *m_MatchDistances;
- UInt32 m_NumFastBytes;
- bool _fastMode;
- bool _btMode;
-
- UInt16 *m_OnePosMatchesMemory;
- UInt16 *m_DistanceMemory;
-
- UInt32 m_Pos;
-
- int m_NumPasses;
- int m_NumDivPasses;
- bool m_CheckStatic;
- bool m_IsMultiPass;
- UInt32 m_ValueBlockSize;
-
- UInt32 m_NumLenCombinations;
- UInt32 m_MatchMaxLen;
- const Byte *m_LenStart;
- const Byte *m_LenDirectBits;
-
- bool m_Created;
- bool m_Deflate64Mode;
-
- Byte m_LevelLevels[kLevelTableSize];
- int m_NumLitLenLevels;
- int m_NumDistLevels;
- UInt32 m_NumLevelCodes;
- UInt32 m_ValueIndex;
-
- bool m_SecondPass;
- UInt32 m_AdditionalOffset;
-
- UInt32 m_OptimumEndIndex;
- UInt32 m_OptimumCurrentIndex;
-
- Byte m_LiteralPrices[256];
- Byte m_LenPrices[kNumLenSymbolsMax];
- Byte m_PosPrices[kDistTableSize64];
-
- CLevels m_NewLevels;
- UInt32 mainFreqs[kFixedMainTableSize];
- UInt32 distFreqs[kDistTableSize64];
- UInt32 mainCodes[kFixedMainTableSize];
- UInt32 distCodes[kDistTableSize64];
- UInt32 levelCodes[kLevelTableSize];
- Byte levelLens[kLevelTableSize];
-
- UInt32 BlockSizeRes;
-
- CTables *m_Tables;
- COptimal m_Optimum[kNumOpts];
-
- UInt32 m_MatchFinderCycles;
- // IMatchFinderSetNumPasses *m_SetMfPasses;
-
- void GetMatches();
- void MovePos(UInt32 num);
- UInt32 Backward(UInt32 &backRes, UInt32 cur);
- UInt32 GetOptimal(UInt32 &backRes);
- UInt32 GetOptimalFast(UInt32 &backRes);
-
- void LevelTableDummy(const Byte *levels, int numLevels, UInt32 *freqs);
-
- void WriteBits(UInt32 value, int numBits);
- void LevelTableCode(const Byte *levels, int numLevels, const Byte *lens, const UInt32 *codes);
-
- void MakeTables(unsigned maxHuffLen);
- UInt32 GetLzBlockPrice() const;
- void TryBlock();
- UInt32 TryDynBlock(int tableIndex, UInt32 numPasses);
-
- UInt32 TryFixedBlock(int tableIndex);
-
- void SetPrices(const CLevels &levels);
- void WriteBlock();
-
- HRESULT Create();
- void Free();
-
- void WriteStoreBlock(UInt32 blockSize, UInt32 additionalOffset, bool finalBlock);
- void WriteTables(bool writeMode, bool finalBlock);
-
- void WriteBlockData(bool writeMode, bool finalBlock);
-
- void ReleaseStreams()
- {
- _seqInStream.RealStream.Release();
- m_OutStream.ReleaseStream();
- }
- class CCoderReleaser
- {
- CCoder *m_Coder;
- public:
- CCoderReleaser(CCoder *coder): m_Coder(coder) {}
- ~CCoderReleaser() { m_Coder->ReleaseStreams(); }
- };
- friend class CCoderReleaser;
-
- UInt32 GetBlockPrice(int tableIndex, int numDivPasses);
- void CodeBlock(int tableIndex, bool finalBlock);
-
-public:
- CCoder(bool deflate64Mode = false);
- ~CCoder();
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- HRESULT BaseCode(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- HRESULT BaseSetEncoderProperties2(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
-};
-
-
-class CCOMCoder :
- public ICompressCoder,
- public ICompressSetCoderProperties,
- public CMyUnknownImp,
- public CCoder
-{
-public:
- MY_UNKNOWN_IMP1(ICompressSetCoderProperties)
- CCOMCoder(): CCoder(false) {};
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
-};
-
-class CCOMCoder64 :
- public ICompressCoder,
- public ICompressSetCoderProperties,
- public CMyUnknownImp,
- public CCoder
-{
-public:
- MY_UNKNOWN_IMP1(ICompressSetCoderProperties)
- CCOMCoder64(): CCoder(true) {};
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/DeflateRegister.cpp b/src/libs/7zip/win/CPP/7zip/Compress/DeflateRegister.cpp
deleted file mode 100644
index 45f55219e..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/DeflateRegister.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// DeflateRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "DeflateDecoder.h"
-
-static void *CreateCodecDeflate() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NDecoder::CCOMCoder); }
-
-#if !defined(EXTRACT_ONLY) && !defined(DEFLATE_EXTRACT_ONLY)
-#include "DeflateEncoder.h"
-static void *CreateCodecOutDeflate() { return (void *)(ICompressCoder *)(new NCompress::NDeflate::NEncoder::CCOMCoder); }
-#else
-#define CreateCodecOutDeflate 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodecDeflate, CreateCodecOutDeflate, 0x040108, L"Deflate", 1, false };
-
-REGISTER_CODEC(Deflate)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/DllExports.cpp b/src/libs/7zip/win/CPP/7zip/Compress/DllExports.cpp
deleted file mode 100644
index 6af7e5ec5..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/DllExports.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-// DllExports.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/MyInitGuid.h"
-
-#include "../ICoder.h"
-
-#include "../Common/RegisterCodec.h"
-
-static const unsigned int kNumCodecsMax = 32;
-unsigned int g_NumCodecs = 0;
-const CCodecInfo *g_Codecs[kNumCodecsMax];
-void RegisterCodec(const CCodecInfo *codecInfo)
-{
- if (g_NumCodecs < kNumCodecsMax)
- g_Codecs[g_NumCodecs++] = codecInfo;
-}
-
-#ifdef _WIN32
-extern "C"
-BOOL WINAPI DllMain(
- #ifdef UNDER_CE
- HANDLE
- #else
- HINSTANCE
- #endif
- , DWORD /* dwReason */, LPVOID /*lpReserved*/)
-{
- return TRUE;
-}
-#endif
-
-static const UInt16 kDecodeId = 0x2790;
-
-DEFINE_GUID(CLSID_CCodec,
-0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
-
-STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject);
-
-STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject)
-{
- return CreateCoder(clsid, iid, outObject);
-}
-
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/DllExports2.cpp b/src/libs/7zip/win/CPP/7zip/Compress/DllExports2.cpp
deleted file mode 100644
index 836f3fa42..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/DllExports2.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-// DllExports.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/MyInitGuid.h"
-
-#include "../ICoder.h"
-
-#include "../Common/RegisterCodec.h"
-
-extern "C"
-BOOL WINAPI DllMain(HINSTANCE /* hInstance */, DWORD /* dwReason */, LPVOID /*lpReserved*/)
-{
- return TRUE;
-}
-
-static const UInt16 kDecodeId = 0x2790;
-
-DEFINE_GUID(CLSID_CCodec,
-0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
-
-STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject);
-
-STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject)
-{
- return CreateCoder(clsid, iid, outObject);
-}
-
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/HuffmanDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/HuffmanDecoder.h
deleted file mode 100644
index 82a1e6f2d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/HuffmanDecoder.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// Compress/HuffmanDecoder.h
-
-#ifndef __COMPRESS_HUFFMAN_DECODER_H
-#define __COMPRESS_HUFFMAN_DECODER_H
-
-#include "../../Common/Types.h"
-
-namespace NCompress {
-namespace NHuffman {
-
-const int kNumTableBits = 9;
-
-template <int kNumBitsMax, UInt32 m_NumSymbols>
-class CDecoder
-{
- UInt32 m_Limits[kNumBitsMax + 1]; // m_Limits[i] = value limit for symbols with length = i
- UInt32 m_Positions[kNumBitsMax + 1]; // m_Positions[i] = index in m_Symbols[] of first symbol with length = i
- UInt32 m_Symbols[m_NumSymbols];
- Byte m_Lengths[1 << kNumTableBits]; // Table oh length for short codes.
-
-public:
-
- bool SetCodeLengths(const Byte *codeLengths)
- {
- int lenCounts[kNumBitsMax + 1];
- UInt32 tmpPositions[kNumBitsMax + 1];
- int i;
- for(i = 1; i <= kNumBitsMax; i++)
- lenCounts[i] = 0;
- UInt32 symbol;
- for (symbol = 0; symbol < m_NumSymbols; symbol++)
- {
- int len = codeLengths[symbol];
- if (len > kNumBitsMax)
- return false;
- lenCounts[len]++;
- m_Symbols[symbol] = 0xFFFFFFFF;
- }
- lenCounts[0] = 0;
- m_Positions[0] = m_Limits[0] = 0;
- UInt32 startPos = 0;
- UInt32 index = 0;
- const UInt32 kMaxValue = (1 << kNumBitsMax);
- for (i = 1; i <= kNumBitsMax; i++)
- {
- startPos += lenCounts[i] << (kNumBitsMax - i);
- if (startPos > kMaxValue)
- return false;
- m_Limits[i] = (i == kNumBitsMax) ? kMaxValue : startPos;
- m_Positions[i] = m_Positions[i - 1] + lenCounts[i - 1];
- tmpPositions[i] = m_Positions[i];
- if(i <= kNumTableBits)
- {
- UInt32 limit = (m_Limits[i] >> (kNumBitsMax - kNumTableBits));
- for (; index < limit; index++)
- m_Lengths[index] = (Byte)i;
- }
- }
- for (symbol = 0; symbol < m_NumSymbols; symbol++)
- {
- int len = codeLengths[symbol];
- if (len != 0)
- m_Symbols[tmpPositions[len]++] = symbol;
- }
- return true;
- }
-
- template <class TBitDecoder>
- UInt32 DecodeSymbol(TBitDecoder *bitStream)
- {
- int numBits;
- UInt32 value = bitStream->GetValue(kNumBitsMax);
- if (value < m_Limits[kNumTableBits])
- numBits = m_Lengths[value >> (kNumBitsMax - kNumTableBits)];
- else
- for (numBits = kNumTableBits + 1; value >= m_Limits[numBits]; numBits++);
- bitStream->MovePos(numBits);
- UInt32 index = m_Positions[numBits] +
- ((value - m_Limits[numBits - 1]) >> (kNumBitsMax - numBits));
- if (index >= m_NumSymbols)
- // throw CDecoderException(); // test it
- return 0xFFFFFFFF;
- return m_Symbols[index];
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ImplodeDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/ImplodeDecoder.cpp
deleted file mode 100644
index f84a013c2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ImplodeDecoder.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-// Implode/Decoder.cpp
-
-#include "StdAfx.h"
-
-#include "ImplodeDecoder.h"
-#include "Common/Defs.h"
-
-namespace NCompress {
-namespace NImplode {
-namespace NDecoder {
-
-class CException
-{
-public:
- enum ECauseType
- {
- kData
- } m_Cause;
- CException(ECauseType cause): m_Cause(cause) {}
-};
-
-static const int kNumDistanceLowDirectBitsForBigDict = 7;
-static const int kNumDistanceLowDirectBitsForSmallDict = 6;
-
-static const int kNumBitsInByte = 8;
-
-// static const int kLevelStructuresNumberFieldSize = kNumBitsInByte;
-static const int kLevelStructuresNumberAdditionalValue = 1;
-
-static const int kNumLevelStructureLevelBits = 4;
-static const int kLevelStructureLevelAdditionalValue = 1;
-
-static const int kNumLevelStructureRepNumberBits = 4;
-static const int kLevelStructureRepNumberAdditionalValue = 1;
-
-
-static const int kLiteralTableSize = (1 << kNumBitsInByte);
-static const int kDistanceTableSize = 64;
-static const int kLengthTableSize = 64;
-
-static const UInt32 kHistorySize =
- (1 << MyMax(kNumDistanceLowDirectBitsForBigDict,
- kNumDistanceLowDirectBitsForSmallDict)) *
- kDistanceTableSize; // = 8 KB;
-
-static const int kNumAdditionalLengthBits = 8;
-
-static const UInt32 kMatchMinLenWhenLiteralsOn = 3;
-static const UInt32 kMatchMinLenWhenLiteralsOff = 2;
-
-static const UInt32 kMatchMinLenMax = MyMax(kMatchMinLenWhenLiteralsOn,
- kMatchMinLenWhenLiteralsOff); // 3
-
-// static const UInt32 kMatchMaxLenMax = kMatchMinLenMax + (kLengthTableSize - 1) + (1 << kNumAdditionalLengthBits) - 1; // or 2
-
-enum
-{
- kMatchId = 0,
- kLiteralId = 1
-};
-
-
-CCoder::CCoder():
- m_LiteralDecoder(kLiteralTableSize),
- m_LengthDecoder(kLengthTableSize),
- m_DistanceDecoder(kDistanceTableSize)
-{
-}
-
-void CCoder::ReleaseStreams()
-{
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
-}
-
-bool CCoder::ReadLevelItems(NImplode::NHuffman::CDecoder &decoder,
- Byte *levels, int numLevelItems)
-{
- int numCodedStructures = m_InBitStream.ReadBits(kNumBitsInByte) +
- kLevelStructuresNumberAdditionalValue;
- int currentIndex = 0;
- for(int i = 0; i < numCodedStructures; i++)
- {
- int level = m_InBitStream.ReadBits(kNumLevelStructureLevelBits) +
- kLevelStructureLevelAdditionalValue;
- int rep = m_InBitStream.ReadBits(kNumLevelStructureRepNumberBits) +
- kLevelStructureRepNumberAdditionalValue;
- if (currentIndex + rep > numLevelItems)
- throw CException(CException::kData);
- for(int j = 0; j < rep; j++)
- levels[currentIndex++] = (Byte)level;
- }
- if (currentIndex != numLevelItems)
- return false;
- return decoder.SetCodeLengths(levels);
-}
-
-
-bool CCoder::ReadTables(void)
-{
- if (m_LiteralsOn)
- {
- Byte literalLevels[kLiteralTableSize];
- if (!ReadLevelItems(m_LiteralDecoder, literalLevels, kLiteralTableSize))
- return false;
- }
-
- Byte lengthLevels[kLengthTableSize];
- if (!ReadLevelItems(m_LengthDecoder, lengthLevels, kLengthTableSize))
- return false;
-
- Byte distanceLevels[kDistanceTableSize];
- return ReadLevelItems(m_DistanceDecoder, distanceLevels, kDistanceTableSize);
-}
-
-class CCoderReleaser
-{
- CCoder *m_Coder;
-public:
- CCoderReleaser(CCoder *coder): m_Coder(coder) {}
- ~CCoderReleaser() { m_Coder->ReleaseStreams(); }
-};
-
-HRESULT CCoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (outSize == NULL)
- return E_INVALIDARG;
- UInt64 pos = 0, unPackSize = *outSize;
-
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(false);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
- CCoderReleaser coderReleaser(this);
-
- if (!ReadTables())
- return S_FALSE;
-
- while(pos < unPackSize)
- {
- if (progress != NULL && pos % (1 << 16) == 0)
- {
- UInt64 packSize = m_InBitStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &pos));
- }
- if(m_InBitStream.ReadBits(1) == kMatchId) // match
- {
- UInt32 lowDistBits = m_InBitStream.ReadBits(m_NumDistanceLowDirectBits);
- UInt32 distance = m_DistanceDecoder.DecodeSymbol(&m_InBitStream);
- if (distance >= kDistanceTableSize)
- return S_FALSE;
- distance = (distance << m_NumDistanceLowDirectBits) + lowDistBits;
- UInt32 lengthSymbol = m_LengthDecoder.DecodeSymbol(&m_InBitStream);
- if (lengthSymbol >= kLengthTableSize)
- return S_FALSE;
- UInt32 length = lengthSymbol + m_MinMatchLength;
- if (lengthSymbol == kLengthTableSize - 1) // special symbol = 63
- length += m_InBitStream.ReadBits(kNumAdditionalLengthBits);
- while(distance >= pos && length > 0)
- {
- m_OutWindowStream.PutByte(0);
- pos++;
- length--;
- }
- if (length > 0)
- m_OutWindowStream.CopyBlock(distance, length);
- pos += length;
- }
- else
- {
- Byte b;
- if (m_LiteralsOn)
- {
- UInt32 temp = m_LiteralDecoder.DecodeSymbol(&m_InBitStream);
- if (temp >= kLiteralTableSize)
- return S_FALSE;
- b = (Byte)temp;
- }
- else
- b = (Byte)m_InBitStream.ReadBits(kNumBitsInByte);
- m_OutWindowStream.PutByte(b);
- pos++;
- }
- }
- if (pos > unPackSize)
- return S_FALSE;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CCoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size < 1)
- return E_INVALIDARG;
- Byte flag = data[0];
- m_BigDictionaryOn = ((flag & 2) != 0);
- m_NumDistanceLowDirectBits = m_BigDictionaryOn ?
- kNumDistanceLowDirectBitsForBigDict:
- kNumDistanceLowDirectBitsForSmallDict;
- m_LiteralsOn = ((flag & 4) != 0);
- m_MinMatchLength = m_LiteralsOn ?
- kMatchMinLenWhenLiteralsOn :
- kMatchMinLenWhenLiteralsOff;
- return S_OK;
-}
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ImplodeDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/ImplodeDecoder.h
deleted file mode 100644
index 7ea1553ee..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ImplodeDecoder.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// ImplodeDecoder.h
-
-#ifndef __COMPRESS_IMPLODE_DECODER_H
-#define __COMPRESS_IMPLODE_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "ImplodeHuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NImplode {
-namespace NDecoder {
-
-class CCoder:
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- NBitl::CDecoder<CInBuffer> m_InBitStream;
-
- NImplode::NHuffman::CDecoder m_LiteralDecoder;
- NImplode::NHuffman::CDecoder m_LengthDecoder;
- NImplode::NHuffman::CDecoder m_DistanceDecoder;
-
- bool m_BigDictionaryOn;
- bool m_LiteralsOn;
-
- int m_NumDistanceLowDirectBits;
- UInt32 m_MinMatchLength;
-
- bool ReadLevelItems(NImplode::NHuffman::CDecoder &table, Byte *levels, int numLevelItems);
- bool ReadTables();
- void DeCodeLevelTable(Byte *newLevels, int numLevels);
-public:
- CCoder();
-
- MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
- void ReleaseStreams();
- HRESULT Flush() { return m_OutWindowStream.Flush(); }
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp
deleted file mode 100644
index 64345e08b..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-// ImplodeHuffmanDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "ImplodeHuffmanDecoder.h"
-
-namespace NCompress {
-namespace NImplode {
-namespace NHuffman {
-
-CDecoder::CDecoder(UInt32 numSymbols):
- m_NumSymbols(numSymbols)
-{
- m_Symbols = new UInt32[m_NumSymbols];
-}
-
-CDecoder::~CDecoder()
-{
- delete []m_Symbols;
-}
-
-bool CDecoder::SetCodeLengths(const Byte *codeLengths)
-{
- // int lenCounts[kNumBitsInLongestCode + 1], tmpPositions[kNumBitsInLongestCode + 1];
- int lenCounts[kNumBitsInLongestCode + 2], tmpPositions[kNumBitsInLongestCode + 1];
- int i;
- for(i = 0; i <= kNumBitsInLongestCode; i++)
- lenCounts[i] = 0;
- UInt32 symbolIndex;
- for (symbolIndex = 0; symbolIndex < m_NumSymbols; symbolIndex++)
- lenCounts[codeLengths[symbolIndex]]++;
- // lenCounts[0] = 0;
-
- // tmpPositions[0] = m_Positions[0] = m_Limitits[0] = 0;
- m_Limitits[kNumBitsInLongestCode + 1] = 0;
- m_Positions[kNumBitsInLongestCode + 1] = 0;
- lenCounts[kNumBitsInLongestCode + 1] = 0;
-
-
- UInt32 startPos = 0;
- static const UInt32 kMaxValue = (1 << kNumBitsInLongestCode);
-
- for (i = kNumBitsInLongestCode; i > 0; i--)
- {
- startPos += lenCounts[i] << (kNumBitsInLongestCode - i);
- if (startPos > kMaxValue)
- return false;
- m_Limitits[i] = startPos;
- m_Positions[i] = m_Positions[i + 1] + lenCounts[i + 1];
- tmpPositions[i] = m_Positions[i] + lenCounts[i];
-
- }
-
- // if _ZIP_MODE do not throw exception for trees containing only one node
- // #ifndef _ZIP_MODE
- if (startPos != kMaxValue)
- return false;
- // #endif
-
- for (symbolIndex = 0; symbolIndex < m_NumSymbols; symbolIndex++)
- if (codeLengths[symbolIndex] != 0)
- m_Symbols[--tmpPositions[codeLengths[symbolIndex]]] = symbolIndex;
- return true;
-}
-
-UInt32 CDecoder::DecodeSymbol(CInBit *inStream)
-{
- UInt32 numBits = 0;
- UInt32 value = inStream->GetValue(kNumBitsInLongestCode);
- int i;
- for(i = kNumBitsInLongestCode; i > 0; i--)
- {
- if (value < m_Limitits[i])
- {
- numBits = i;
- break;
- }
- }
- if (i == 0)
- return 0xFFFFFFFF;
- inStream->MovePos(numBits);
- UInt32 index = m_Positions[numBits] +
- ((value - m_Limitits[numBits + 1]) >> (kNumBitsInLongestCode - numBits));
- if (index >= m_NumSymbols)
- return 0xFFFFFFFF;
- return m_Symbols[index];
-}
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ImplodeHuffmanDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/ImplodeHuffmanDecoder.h
deleted file mode 100644
index 6120a35ab..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ImplodeHuffmanDecoder.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// ImplodeHuffmanDecoder.h
-
-#ifndef __IMPLODE_HUFFMAN_DECODER_H
-#define __IMPLODE_HUFFMAN_DECODER_H
-
-#include "../Common/InBuffer.h"
-
-#include "BitlDecoder.h"
-
-namespace NCompress {
-namespace NImplode {
-namespace NHuffman {
-
-const int kNumBitsInLongestCode = 16;
-
-typedef NBitl::CDecoder<CInBuffer> CInBit;
-
-class CDecoder
-{
- UInt32 m_Limitits[kNumBitsInLongestCode + 2]; // m_Limitits[i] = value limit for symbols with length = i
- UInt32 m_Positions[kNumBitsInLongestCode + 2]; // m_Positions[i] = index in m_Symbols[] of first symbol with length = i
- UInt32 m_NumSymbols; // number of symbols in m_Symbols
- UInt32 *m_Symbols; // symbols: at first with len=1 then 2, ... 15.
-public:
- CDecoder(UInt32 numSymbols);
- ~CDecoder();
-
- bool SetCodeLengths(const Byte *codeLengths);
- UInt32 DecodeSymbol(CInBit *inStream);
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/LzOutWindow.cpp b/src/libs/7zip/win/CPP/7zip/Compress/LzOutWindow.cpp
deleted file mode 100644
index df46295bd..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/LzOutWindow.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-// LzOutWindow.cpp
-
-#include "StdAfx.h"
-
-#include "LzOutWindow.h"
-
-void CLzOutWindow::Init(bool solid)
-{
- if (!solid)
- COutBuffer::Init();
- #ifdef _NO_EXCEPTIONS
- ErrorCode = S_OK;
- #endif
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/LzOutWindow.h b/src/libs/7zip/win/CPP/7zip/Compress/LzOutWindow.h
deleted file mode 100644
index d8d13c225..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/LzOutWindow.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// LzOutWindow.h
-
-#ifndef __LZ_OUT_WINDOW_H
-#define __LZ_OUT_WINDOW_H
-
-#include "../IStream.h"
-
-#include "../Common/OutBuffer.h"
-
-#ifndef _NO_EXCEPTIONS
-typedef COutBufferException CLzOutWindowException;
-#endif
-
-class CLzOutWindow: public COutBuffer
-{
-public:
- void Init(bool solid = false);
-
- // distance >= 0, len > 0,
- bool CopyBlock(UInt32 distance, UInt32 len)
- {
- UInt32 pos = _pos - distance - 1;
- if (distance >= _pos)
- {
- if (!_overDict || distance >= _bufferSize)
- return false;
- pos += _bufferSize;
- }
- if (_limitPos - _pos > len && _bufferSize - pos > len)
- {
- const Byte *src = _buffer + pos;
- Byte *dest = _buffer + _pos;
- _pos += len;
- do
- *dest++ = *src++;
- while(--len != 0);
- }
- else do
- {
- if (pos == _bufferSize)
- pos = 0;
- _buffer[_pos++] = _buffer[pos++];
- if (_pos == _limitPos)
- FlushWithCheck();
- }
- while(--len != 0);
- return true;
- }
-
- void PutByte(Byte b)
- {
- _buffer[_pos++] = b;
- if (_pos == _limitPos)
- FlushWithCheck();
- }
-
- Byte GetByte(UInt32 distance) const
- {
- UInt32 pos = _pos - distance - 1;
- if (pos >= _bufferSize)
- pos += _bufferSize;
- return _buffer[pos];
- }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/LzhDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/LzhDecoder.cpp
deleted file mode 100644
index 6f9b5065e..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/LzhDecoder.cpp
+++ /dev/null
@@ -1,220 +0,0 @@
-// LzhDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "LzhDecoder.h"
-
-#include "Windows/Defs.h"
-
-namespace NCompress{
-namespace NLzh {
-namespace NDecoder {
-
-static const UInt32 kHistorySize = (1 << 16);
-
-static const int kBlockSizeBits = 16;
-static const int kNumCBits = 9;
-static const int kNumLevelBits = 5; // smallest integer such that (1 << kNumLevelBits) > kNumLevelSymbols/
-
-UInt32 CCoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }
-
-HRESULT CCoder::ReadLevelTable()
-{
- int n = ReadBits(kNumLevelBits);
- if (n == 0)
- {
- m_LevelHuffman.Symbol = ReadBits(kNumLevelBits);
- if (m_LevelHuffman.Symbol >= kNumLevelSymbols)
- return S_FALSE;
- }
- else
- {
- if (n > kNumLevelSymbols)
- return S_FALSE;
- m_LevelHuffman.Symbol = -1;
- Byte lens[kNumLevelSymbols];
- int i = 0;
- while (i < n)
- {
- int c = m_InBitStream.ReadBits(3);
- if (c == 7)
- while (ReadBits(1))
- if (c++ > kMaxHuffmanLen)
- return S_FALSE;
- lens[i++] = (Byte)c;
- if (i == kNumSpecLevelSymbols)
- {
- c = ReadBits(2);
- while (--c >= 0)
- lens[i++] = 0;
- }
- }
- while (i < kNumLevelSymbols)
- lens[i++] = 0;
- m_LevelHuffman.SetCodeLengths(lens);
- }
- return S_OK;
-}
-
-HRESULT CCoder::ReadPTable(int numBits)
-{
- int n = ReadBits(numBits);
- if (n == 0)
- {
- m_PHuffmanDecoder.Symbol = ReadBits(numBits);
- if (m_PHuffmanDecoder.Symbol >= kNumDistanceSymbols)
- return S_FALSE;
- }
- else
- {
- if (n > kNumDistanceSymbols)
- return S_FALSE;
- m_PHuffmanDecoder.Symbol = -1;
- Byte lens[kNumDistanceSymbols];
- int i = 0;
- while (i < n)
- {
- int c = m_InBitStream.ReadBits(3);
- if (c == 7)
- while (ReadBits(1))
- {
- if (c > kMaxHuffmanLen)
- return S_FALSE;
- c++;
- }
- lens[i++] = (Byte)c;
- }
- while (i < kNumDistanceSymbols)
- lens[i++] = 0;
- m_PHuffmanDecoder.SetCodeLengths(lens);
- }
- return S_OK;
-}
-
-HRESULT CCoder::ReadCTable()
-{
- int n = ReadBits(kNumCBits);
- if (n == 0)
- {
- m_CHuffmanDecoder.Symbol = ReadBits(kNumCBits);
- if (m_CHuffmanDecoder.Symbol >= kNumCSymbols)
- return S_FALSE;
- }
- else
- {
- if (n > kNumCSymbols)
- return S_FALSE;
- m_CHuffmanDecoder.Symbol = -1;
- Byte lens[kNumCSymbols];
- int i = 0;
- while (i < n)
- {
- int c = m_LevelHuffman.Decode(&m_InBitStream);
- if (c < kNumSpecLevelSymbols)
- {
- if (c == 0)
- c = 1;
- else if (c == 1)
- c = ReadBits(4) + 3;
- else
- c = ReadBits(kNumCBits) + 20;
- while (--c >= 0)
- {
- if (i > kNumCSymbols)
- return S_FALSE;
- lens[i++] = 0;
- }
- }
- else
- lens[i++] = (Byte)(c - 2);
- }
- while (i < kNumCSymbols)
- lens[i++] = 0;
- m_CHuffmanDecoder.SetCodeLengths(lens);
- }
- return S_OK;
-}
-
-STDMETHODIMP CCoder::CodeReal(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 * /* inSize */, const UInt64 *outSize,
- ICompressProgressInfo *progress)
-{
- if (outSize == NULL)
- return E_INVALIDARG;
-
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
-
- UInt64 pos = 0;
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(false);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
-
- CCoderReleaser coderReleaser(this);
-
- int pbit;
- if (m_NumDictBits <= 13)
- pbit = 4;
- else
- pbit = 5;
-
- UInt32 blockSize = 0;
-
- while(pos < *outSize)
- {
- // for (i = 0; i < dictSize; i++) dtext[i] = 0x20;
-
- if (blockSize == 0)
- {
- if (progress != NULL)
- {
- UInt64 packSize = m_InBitStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &pos));
- }
- blockSize = ReadBits(kBlockSizeBits);
- ReadLevelTable();
- ReadCTable();
- RINOK(ReadPTable(pbit));
- }
- blockSize--;
- UInt32 c = m_CHuffmanDecoder.Decode(&m_InBitStream);
- if (c < 256)
- {
- m_OutWindowStream.PutByte((Byte)c);
- pos++;
- }
- else if (c >= kNumCSymbols)
- return S_FALSE;
- else
- {
- // offset = (interface->method == LARC_METHOD_NUM) ? 0x100 - 2 : 0x100 - 3;
- UInt32 len = c - 256 + kMinMatch;
- UInt32 distance = m_PHuffmanDecoder.Decode(&m_InBitStream);
- if (distance != 0)
- distance = (1 << (distance - 1)) + ReadBits(distance - 1);
- if (distance >= pos)
- return S_FALSE;
- if (pos + len > *outSize)
- len = (UInt32)(*outSize - pos);
- pos += len;
- m_OutWindowStream.CopyBlock(distance, len);
- }
- }
- coderReleaser.NeedFlush = false;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CCoder::Code(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress);}
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/LzhDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/LzhDecoder.h
deleted file mode 100644
index ed631e20d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/LzhDecoder.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// LzhDecoder.h
-
-#ifndef __COMPRESS_LZH_DECODER_H
-#define __COMPRESS_LZH_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NLzh {
-namespace NDecoder {
-
-const int kMaxHuffmanLen = 16; // Check it
-
-const int kNumSpecLevelSymbols = 3;
-const int kNumLevelSymbols = kNumSpecLevelSymbols + kMaxHuffmanLen;
-
-const int kDictBitsMax = 16;
-const int kNumDistanceSymbols = kDictBitsMax + 1;
-
-const int kMaxMatch = 256;
-const int kMinMatch = 3;
-const int kNumCSymbols = 256 + kMaxMatch + 2 - kMinMatch;
-
-template <UInt32 m_NumSymbols>
-class CHuffmanDecoder:public NCompress::NHuffman::CDecoder<kMaxHuffmanLen, m_NumSymbols>
-{
-public:
- int Symbol;
- template <class TBitDecoder>
- UInt32 Decode(TBitDecoder *bitStream)
- {
- if (Symbol >= 0)
- return (UInt32)Symbol;
- return DecodeSymbol(bitStream);
- }
-};
-
-class CCoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- NBitm::CDecoder<CInBuffer> m_InBitStream;
-
- int m_NumDictBits;
-
- CHuffmanDecoder<kNumLevelSymbols> m_LevelHuffman;
- CHuffmanDecoder<kNumDistanceSymbols> m_PHuffmanDecoder;
- CHuffmanDecoder<kNumCSymbols> m_CHuffmanDecoder;
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
-
- class CCoderReleaser
- {
- CCoder *m_Coder;
- public:
- bool NeedFlush;
- CCoderReleaser(CCoder *coder): m_Coder(coder), NeedFlush(true) {}
- ~CCoderReleaser()
- {
- if (NeedFlush)
- m_Coder->m_OutWindowStream.Flush();
- m_Coder->ReleaseStreams();
- }
- };
- friend class CCoderReleaser;
-
- void MakeTable(int nchar, Byte *bitlen, int tablebits,
- UInt32 *table, int tablesize);
-
- UInt32 ReadBits(int numBits);
- HRESULT ReadLevelTable();
- HRESULT ReadPTable(int numBits);
- HRESULT ReadCTable();
-
-public:
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(CodeReal)(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress);
-
- void SetDictionary(int numDictBits) { m_NumDictBits = numDictBits; }
- CCoder(): m_NumDictBits(0) {}
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Lzx.h b/src/libs/7zip/win/CPP/7zip/Compress/Lzx.h
deleted file mode 100644
index 09ab7f075..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Lzx.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Lzx.h
-
-#ifndef __COMPRESS_LZX_H
-#define __COMPRESS_LZX_H
-
-namespace NCompress {
-namespace NLzx {
-
-const unsigned kNumHuffmanBits = 16;
-const UInt32 kNumRepDistances = 3;
-
-const UInt32 kNumLenSlots = 8;
-const UInt32 kMatchMinLen = 2;
-const UInt32 kNumLenSymbols = 249;
-const UInt32 kMatchMaxLen = kMatchMinLen + (kNumLenSlots - 1) + kNumLenSymbols - 1;
-
-const unsigned kNumAlignBits = 3;
-const UInt32 kAlignTableSize = 1 << kNumAlignBits;
-
-const UInt32 kNumPosSlots = 50;
-const UInt32 kNumPosLenSlots = kNumPosSlots * kNumLenSlots;
-
-const UInt32 kMainTableSize = 256 + kNumPosLenSlots;
-const UInt32 kLevelTableSize = 20;
-const UInt32 kMaxTableSize = kMainTableSize;
-
-const unsigned kNumBlockTypeBits = 3;
-const unsigned kBlockTypeVerbatim = 1;
-const unsigned kBlockTypeAligned = 2;
-const unsigned kBlockTypeUncompressed = 3;
-
-const unsigned kUncompressedBlockSizeNumBits = 24;
-
-const unsigned kNumBitsForPreTreeLevel = 4;
-
-const unsigned kLevelSymbolZeros = 17;
-const unsigned kLevelSymbolZerosBig = 18;
-const unsigned kLevelSymbolSame = 19;
-
-const unsigned kLevelSymbolZerosStartValue = 4;
-const unsigned kLevelSymbolZerosNumBits = 4;
-
-const unsigned kLevelSymbolZerosBigStartValue = kLevelSymbolZerosStartValue +
- (1 << kLevelSymbolZerosNumBits);
-const unsigned kLevelSymbolZerosBigNumBits = 5;
-
-const unsigned kLevelSymbolSameNumBits = 1;
-const unsigned kLevelSymbolSameStartValue = 4;
-
-const unsigned kNumBitsForAlignLevel = 3;
-
-const unsigned kNumDictionaryBitsMin = 15;
-const unsigned kNumDictionaryBitsMax = 21;
-const UInt32 kDictionarySizeMax = (1 << kNumDictionaryBitsMax);
-
-const unsigned kNumLinearPosSlotBits = 17;
-const UInt32 kNumPowerPosSlots = 0x26;
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Lzx86Converter.cpp b/src/libs/7zip/win/CPP/7zip/Compress/Lzx86Converter.cpp
deleted file mode 100644
index 9e53f18a9..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Lzx86Converter.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-// Lzx86Converter.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/Defs.h"
-
-#include "Lzx86Converter.h"
-
-namespace NCompress {
-namespace NLzx {
-
-static const int kResidue = 6 + 4;
-
-void Cx86ConvertOutStream::MakeTranslation()
-{
- if (m_Pos <= kResidue)
- return;
- UInt32 numBytes = m_Pos - kResidue;
- Byte *buffer = m_Buffer;
- for (UInt32 i = 0; i < numBytes;)
- {
- if (buffer[i++] == 0xE8)
- {
- Int32 absValue = 0;
- int j;
- for(j = 0; j < 4; j++)
- absValue += (UInt32)buffer[i + j] << (j * 8);
- Int32 pos = (Int32)(m_ProcessedSize + i - 1);
- if (absValue >= -pos && absValue < (Int32)m_TranslationSize)
- {
- UInt32 offset = (absValue >= 0) ?
- absValue - pos :
- absValue + m_TranslationSize;
- for(j = 0; j < 4; j++)
- {
- buffer[i + j] = (Byte)(offset & 0xFF);
- offset >>= 8;
- }
- }
- i += 4;
- }
- }
-}
-
-STDMETHODIMP Cx86ConvertOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- if (!m_TranslationMode)
- return m_Stream->Write(data, size, processedSize);
- UInt32 realProcessedSize = 0;
- while (realProcessedSize < size)
- {
- UInt32 writeSize = MyMin(size - realProcessedSize, kUncompressedBlockSize - m_Pos);
- memmove(m_Buffer + m_Pos, (const Byte *)data + realProcessedSize, writeSize);
- m_Pos += writeSize;
- realProcessedSize += writeSize;
- if (m_Pos == kUncompressedBlockSize)
- {
- RINOK(Flush());
- }
- }
- if (processedSize != NULL)
- *processedSize = realProcessedSize;
- return S_OK;
-}
-
-HRESULT Cx86ConvertOutStream::Flush()
-{
- if (m_Pos == 0)
- return S_OK;
- if (m_TranslationMode)
- MakeTranslation();
- UInt32 pos = 0;
- do
- {
- UInt32 processed;
- RINOK(m_Stream->Write(m_Buffer + pos, m_Pos - pos, &processed));
- if (processed == 0)
- return E_FAIL;
- pos += processed;
- }
- while(pos < m_Pos);
- m_ProcessedSize += m_Pos;
- m_Pos = 0;
- m_TranslationMode = (m_TranslationMode && (m_ProcessedSize < (1 << 30)));
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Lzx86Converter.h b/src/libs/7zip/win/CPP/7zip/Compress/Lzx86Converter.h
deleted file mode 100644
index 9f110c29b..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Lzx86Converter.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Lzx86Converter.h
-
-#ifndef __LZX_86_CONVERTER_H
-#define __LZX_86_CONVERTER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../IStream.h"
-
-namespace NCompress {
-namespace NLzx {
-
-const int kUncompressedBlockSize = 1 << 15;
-
-class Cx86ConvertOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialOutStream> m_Stream;
- UInt32 m_ProcessedSize;
- UInt32 m_Pos;
- UInt32 m_TranslationSize;
- bool m_TranslationMode;
- Byte m_Buffer[kUncompressedBlockSize];
-
- void MakeTranslation();
-public:
- void SetStream(ISequentialOutStream *outStream) { m_Stream = outStream; }
- void ReleaseStream() { m_Stream.Release(); }
- void Init(bool translationMode, UInt32 translationSize)
- {
- m_TranslationMode = translationMode;
- m_TranslationSize = translationSize;
- m_ProcessedSize = 0;
- m_Pos = 0;
- }
- HRESULT Flush();
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/LzxDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/LzxDecoder.cpp
deleted file mode 100644
index d1027f1f3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/LzxDecoder.cpp
+++ /dev/null
@@ -1,387 +0,0 @@
-// LzxDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/Defs.h"
-
-#include "LzxDecoder.h"
-
-namespace NCompress {
-namespace NLzx {
-
-const int kLenIdNeedInit = -2;
-
-CDecoder::CDecoder(bool wimMode):
- _keepHistory(false),
- _skipByte(false),
- _wimMode(wimMode)
-{
- m_x86ConvertOutStreamSpec = new Cx86ConvertOutStream;
- m_x86ConvertOutStream = m_x86ConvertOutStreamSpec;
-}
-
-void CDecoder::ReleaseStreams()
-{
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- m_x86ConvertOutStreamSpec->ReleaseStream();
-}
-
-STDMETHODIMP CDecoder::Flush()
-{
- RINOK(m_OutWindowStream.Flush());
- return m_x86ConvertOutStreamSpec->Flush();
-}
-
-UInt32 CDecoder::ReadBits(unsigned numBits) { return m_InBitStream.ReadBits(numBits); }
-
-#define RIF(x) { if (!(x)) return false; }
-
-bool CDecoder::ReadTable(Byte *lastLevels, Byte *newLevels, UInt32 numSymbols)
-{
- Byte levelLevels[kLevelTableSize];
- UInt32 i;
- for (i = 0; i < kLevelTableSize; i++)
- levelLevels[i] = (Byte)ReadBits(kNumBitsForPreTreeLevel);
- RIF(m_LevelDecoder.SetCodeLengths(levelLevels));
- unsigned num = 0;
- Byte symbol = 0;
- for (i = 0; i < numSymbols;)
- {
- if (num != 0)
- {
- lastLevels[i] = newLevels[i] = symbol;
- i++;
- num--;
- continue;
- }
- UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);
- if (number == kLevelSymbolZeros)
- {
- num = kLevelSymbolZerosStartValue + (unsigned)ReadBits(kLevelSymbolZerosNumBits);
- symbol = 0;
- }
- else if (number == kLevelSymbolZerosBig)
- {
- num = kLevelSymbolZerosBigStartValue + (unsigned)ReadBits(kLevelSymbolZerosBigNumBits);
- symbol = 0;
- }
- else if (number == kLevelSymbolSame || number <= kNumHuffmanBits)
- {
- if (number <= kNumHuffmanBits)
- num = 1;
- else
- {
- num = kLevelSymbolSameStartValue + (unsigned)ReadBits(kLevelSymbolSameNumBits);
- number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);
- if (number > kNumHuffmanBits)
- return false;
- }
- symbol = Byte((17 + lastLevels[i] - number) % (kNumHuffmanBits + 1));
- }
- else
- return false;
- }
- return true;
-}
-
-bool CDecoder::ReadTables(void)
-{
- Byte newLevels[kMaxTableSize];
- {
- if (_skipByte)
- m_InBitStream.DirectReadByte();
- m_InBitStream.Normalize();
-
- unsigned blockType = (unsigned)ReadBits(kNumBlockTypeBits);
- if (blockType > kBlockTypeUncompressed)
- return false;
- if (_wimMode)
- if (ReadBits(1) == 1)
- m_UnCompressedBlockSize = (1 << 15);
- else
- m_UnCompressedBlockSize = ReadBits(16);
- else
- m_UnCompressedBlockSize = m_InBitStream.ReadBitsBig(kUncompressedBlockSizeNumBits);
-
- m_IsUncompressedBlock = (blockType == kBlockTypeUncompressed);
-
- _skipByte = (m_IsUncompressedBlock && ((m_UnCompressedBlockSize & 1) != 0));
-
- if (m_IsUncompressedBlock)
- {
- ReadBits(16 - m_InBitStream.GetBitPosition());
- if (!m_InBitStream.ReadUInt32(m_RepDistances[0]))
- return false;
- m_RepDistances[0]--;
- for (unsigned i = 1; i < kNumRepDistances; i++)
- {
- UInt32 rep = 0;
- for (unsigned j = 0; j < 4; j++)
- rep |= (UInt32)m_InBitStream.DirectReadByte() << (8 * j);
- m_RepDistances[i] = rep - 1;
- }
- return true;
- }
- m_AlignIsUsed = (blockType == kBlockTypeAligned);
- if (m_AlignIsUsed)
- {
- for (unsigned i = 0; i < kAlignTableSize; i++)
- newLevels[i] = (Byte)ReadBits(kNumBitsForAlignLevel);
- RIF(m_AlignDecoder.SetCodeLengths(newLevels));
- }
- }
-
- RIF(ReadTable(m_LastMainLevels, newLevels, 256));
- RIF(ReadTable(m_LastMainLevels + 256, newLevels + 256, m_NumPosLenSlots));
- for (UInt32 i = 256 + m_NumPosLenSlots; i < kMainTableSize; i++)
- newLevels[i] = 0;
- RIF(m_MainDecoder.SetCodeLengths(newLevels));
-
- RIF(ReadTable(m_LastLenLevels, newLevels, kNumLenSymbols));
- return m_LenDecoder.SetCodeLengths(newLevels);
-}
-
-class CDecoderFlusher
-{
- CDecoder *m_Decoder;
-public:
- bool NeedFlush;
- CDecoderFlusher(CDecoder *decoder): m_Decoder(decoder), NeedFlush(true) {}
- ~CDecoderFlusher()
- {
- if (NeedFlush)
- m_Decoder->Flush();
- m_Decoder->ReleaseStreams();
- }
-};
-
-
-void CDecoder::ClearPrevLevels()
-{
- unsigned i;
- for (i = 0; i < kMainTableSize; i++)
- m_LastMainLevels[i] = 0;
- for (i = 0; i < kNumLenSymbols; i++)
- m_LastLenLevels[i] = 0;
-}
-
-
-HRESULT CDecoder::CodeSpec(UInt32 curSize)
-{
- if (_remainLen == kLenIdNeedInit)
- {
- _remainLen = 0;
- m_InBitStream.Init();
- if (!_keepHistory || !m_IsUncompressedBlock)
- m_InBitStream.Normalize();
- if (!_keepHistory)
- {
- _skipByte = false;
- m_UnCompressedBlockSize = 0;
- ClearPrevLevels();
- UInt32 i86TranslationSize = 12000000;
- bool translationMode = true;
- if (!_wimMode)
- {
- translationMode = (ReadBits(1) != 0);
- if (translationMode)
- {
- i86TranslationSize = ReadBits(16) << 16;
- i86TranslationSize |= ReadBits(16);
- }
- }
- m_x86ConvertOutStreamSpec->Init(translationMode, i86TranslationSize);
-
- for (unsigned i = 0 ; i < kNumRepDistances; i++)
- m_RepDistances[i] = 0;
- }
- }
-
- while (_remainLen > 0 && curSize > 0)
- {
- m_OutWindowStream.PutByte(m_OutWindowStream.GetByte(m_RepDistances[0]));
- _remainLen--;
- curSize--;
- }
-
- while (curSize > 0)
- {
- if (m_UnCompressedBlockSize == 0)
- if (!ReadTables())
- return S_FALSE;
- UInt32 next = (Int32)MyMin(m_UnCompressedBlockSize, curSize);
- curSize -= next;
- m_UnCompressedBlockSize -= next;
- if (m_IsUncompressedBlock)
- {
- while (next > 0)
- {
- m_OutWindowStream.PutByte(m_InBitStream.DirectReadByte());
- next--;
- }
- }
- else while (next > 0)
- {
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
- if (number < 256)
- {
- m_OutWindowStream.PutByte((Byte)number);
- next--;
- }
- else
- {
- UInt32 posLenSlot = number - 256;
- if (posLenSlot >= m_NumPosLenSlots)
- return S_FALSE;
- UInt32 posSlot = posLenSlot / kNumLenSlots;
- UInt32 lenSlot = posLenSlot % kNumLenSlots;
- UInt32 len = kMatchMinLen + lenSlot;
- if (lenSlot == kNumLenSlots - 1)
- {
- UInt32 lenTemp = m_LenDecoder.DecodeSymbol(&m_InBitStream);
- if (lenTemp >= kNumLenSymbols)
- return S_FALSE;
- len += lenTemp;
- }
-
- if (posSlot < kNumRepDistances)
- {
- UInt32 distance = m_RepDistances[posSlot];
- m_RepDistances[posSlot] = m_RepDistances[0];
- m_RepDistances[0] = distance;
- }
- else
- {
- UInt32 distance;
- unsigned numDirectBits;
- if (posSlot < kNumPowerPosSlots)
- {
- numDirectBits = (unsigned)(posSlot >> 1) - 1;
- distance = ((2 | (posSlot & 1)) << numDirectBits);
- }
- else
- {
- numDirectBits = kNumLinearPosSlotBits;
- distance = ((posSlot - 0x22) << kNumLinearPosSlotBits);
- }
-
- if (m_AlignIsUsed && numDirectBits >= kNumAlignBits)
- {
- distance += (m_InBitStream.ReadBits(numDirectBits - kNumAlignBits) << kNumAlignBits);
- UInt32 alignTemp = m_AlignDecoder.DecodeSymbol(&m_InBitStream);
- if (alignTemp >= kAlignTableSize)
- return S_FALSE;
- distance += alignTemp;
- }
- else
- distance += m_InBitStream.ReadBits(numDirectBits);
- m_RepDistances[2] = m_RepDistances[1];
- m_RepDistances[1] = m_RepDistances[0];
- m_RepDistances[0] = distance - kNumRepDistances;
- }
-
- UInt32 locLen = len;
- if (locLen > next)
- locLen = next;
-
- if (!m_OutWindowStream.CopyBlock(m_RepDistances[0], locLen))
- return S_FALSE;
-
- len -= locLen;
- next -= locLen;
- if (len != 0)
- {
- _remainLen = (int)len;
- return S_OK;
- }
- }
- }
- }
- return S_OK;
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (outSize == NULL)
- return E_INVALIDARG;
- UInt64 size = *outSize;
-
- RINOK(SetInStream(inStream));
- m_x86ConvertOutStreamSpec->SetStream(outStream);
- m_OutWindowStream.SetStream(m_x86ConvertOutStream);
- RINOK(SetOutStreamSize(outSize));
-
- CDecoderFlusher flusher(this);
-
- const UInt64 start = m_OutWindowStream.GetProcessedSize();
- for (;;)
- {
- UInt32 curSize = 1 << 18;
- UInt64 rem = size - (m_OutWindowStream.GetProcessedSize() - start);
- if (curSize > rem)
- curSize = (UInt32)rem;
- if (curSize == 0)
- break;
- RINOK(CodeSpec(curSize));
- if (progress != NULL)
- {
- UInt64 inSize = m_InBitStream.GetProcessedSize();
- UInt64 nowPos64 = m_OutWindowStream.GetProcessedSize() - start;
- RINOK(progress->SetRatioInfo(&inSize, &nowPos64));
- }
- }
- flusher.NeedFlush = false;
- return Flush();
-}
-
-HRESULT CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream)
-{
- m_InBitStream.SetStream(inStream);
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::ReleaseInStream()
-{
- m_InBitStream.ReleaseStream();
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)
-{
- if (outSize == NULL)
- return E_FAIL;
- _remainLen = kLenIdNeedInit;
- m_OutWindowStream.Init(_keepHistory);
- return S_OK;
-}
-
-HRESULT CDecoder::SetParams(unsigned numDictBits)
-{
- if (numDictBits < kNumDictionaryBitsMin || numDictBits > kNumDictionaryBitsMax)
- return E_INVALIDARG;
- UInt32 numPosSlots;
- if (numDictBits < 20)
- numPosSlots = 30 + (numDictBits - 15) * 2;
- else if (numDictBits == 20)
- numPosSlots = 42;
- else
- numPosSlots = 50;
- m_NumPosLenSlots = numPosSlots * kNumLenSlots;
- if (!m_OutWindowStream.Create(kDictionarySizeMax))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 16))
- return E_OUTOFMEMORY;
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/LzxDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/LzxDecoder.h
deleted file mode 100644
index 73a050619..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/LzxDecoder.h
+++ /dev/null
@@ -1,159 +0,0 @@
-// LzxDecoder.h
-
-#ifndef __LZX_DECODER_H
-#define __LZX_DECODER_H
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-#include "Lzx.h"
-#include "Lzx86Converter.h"
-
-namespace NCompress {
-namespace NLzx {
-
-namespace NBitStream {
-
-const unsigned kNumBigValueBits = 8 * 4;
-const unsigned kNumValueBits = 17;
-const UInt32 kBitDecoderValueMask = (1 << kNumValueBits) - 1;
-
-class CDecoder
-{
- CInBuffer m_Stream;
- UInt32 m_Value;
- unsigned m_BitPos;
-public:
- CDecoder() {}
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
-
- void SetStream(ISequentialInStream *s) { m_Stream.SetStream(s); }
- void ReleaseStream() { m_Stream.ReleaseStream(); }
-
- void Init()
- {
- m_Stream.Init();
- m_BitPos = kNumBigValueBits;
- }
-
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - (kNumBigValueBits - m_BitPos) / 8; }
-
- unsigned GetBitPosition() const { return m_BitPos & 0xF; }
-
- void Normalize()
- {
- for (; m_BitPos >= 16; m_BitPos -= 16)
- {
- Byte b0 = m_Stream.ReadByte();
- Byte b1 = m_Stream.ReadByte();
- m_Value = (m_Value << 8) | b1;
- m_Value = (m_Value << 8) | b0;
- }
- }
-
- UInt32 GetValue(unsigned numBits) const
- {
- return ((m_Value >> ((32 - kNumValueBits) - m_BitPos)) & kBitDecoderValueMask) >> (kNumValueBits - numBits);
- }
-
- void MovePos(unsigned numBits)
- {
- m_BitPos += numBits;
- Normalize();
- }
-
- UInt32 ReadBits(unsigned numBits)
- {
- UInt32 res = GetValue(numBits);
- MovePos(numBits);
- return res;
- }
-
- UInt32 ReadBitsBig(unsigned numBits)
- {
- unsigned numBits0 = numBits / 2;
- unsigned numBits1 = numBits - numBits0;
- UInt32 res = ReadBits(numBits0) << numBits1;
- return res + ReadBits(numBits1);
- }
-
- bool ReadUInt32(UInt32 &v)
- {
- if (m_BitPos != 0)
- return false;
- v = ((m_Value >> 16) & 0xFFFF) | ((m_Value << 16) & 0xFFFF0000);
- m_BitPos = kNumBigValueBits;
- return true;
- }
-
- Byte DirectReadByte() { return m_Stream.ReadByte(); }
-
-};
-}
-
-class CDecoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- NBitStream::CDecoder m_InBitStream;
- CLzOutWindow m_OutWindowStream;
-
- UInt32 m_RepDistances[kNumRepDistances];
- UInt32 m_NumPosLenSlots;
-
- bool m_IsUncompressedBlock;
- bool m_AlignIsUsed;
-
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kNumLenSymbols> m_LenDecoder;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kAlignTableSize> m_AlignDecoder;
- NCompress::NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
-
- Byte m_LastMainLevels[kMainTableSize];
- Byte m_LastLenLevels[kNumLenSymbols];
-
- Cx86ConvertOutStream *m_x86ConvertOutStreamSpec;
- CMyComPtr<ISequentialOutStream> m_x86ConvertOutStream;
-
- UInt32 m_UnCompressedBlockSize;
-
- bool _keepHistory;
- int _remainLen;
- bool _skipByte;
-
- bool _wimMode;
-
- UInt32 ReadBits(unsigned numBits);
- bool ReadTable(Byte *lastLevels, Byte *newLevels, UInt32 numSymbols);
- bool ReadTables();
- void ClearPrevLevels();
-
- HRESULT CodeSpec(UInt32 size);
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-public:
- CDecoder(bool wimMode = false);
-
- MY_UNKNOWN_IMP
-
- void ReleaseStreams();
- STDMETHOD(Flush)();
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
-
- HRESULT SetParams(unsigned numDictBits);
- void SetKeepHistory(bool keepHistory) { _keepHistory = keepHistory; }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Mtf8.h b/src/libs/7zip/win/CPP/7zip/Compress/Mtf8.h
deleted file mode 100644
index d15dd4a56..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Mtf8.h
+++ /dev/null
@@ -1,193 +0,0 @@
-// Mtf8.h
-
-#ifndef __COMPRESS_MTF8_H
-#define __COMPRESS_MTF8_H
-
-#include "../../../C/CpuArch.h"
-
-#include "../../Common/Types.h"
-
-namespace NCompress {
-
-struct CMtf8Encoder
-{
- Byte Buf[256];
-
- int FindAndMove(Byte v)
- {
- int pos;
- for (pos = 0; Buf[pos] != v; pos++);
- int resPos = pos;
- for (; pos >= 8; pos -= 8)
- {
- Buf[pos] = Buf[pos - 1];
- Buf[pos - 1] = Buf[pos - 2];
- Buf[pos - 2] = Buf[pos - 3];
- Buf[pos - 3] = Buf[pos - 4];
- Buf[pos - 4] = Buf[pos - 5];
- Buf[pos - 5] = Buf[pos - 6];
- Buf[pos - 6] = Buf[pos - 7];
- Buf[pos - 7] = Buf[pos - 8];
- }
- for (; pos > 0; pos--)
- Buf[pos] = Buf[pos - 1];
- Buf[0] = v;
- return resPos;
- }
-};
-
-/*
-struct CMtf8Decoder
-{
- Byte Buf[256];
-
- void Init(int) {};
- Byte GetHead() const { return Buf[0]; }
- Byte GetAndMove(int pos)
- {
- Byte res = Buf[pos];
- for (; pos >= 8; pos -= 8)
- {
- Buf[pos] = Buf[pos - 1];
- Buf[pos - 1] = Buf[pos - 2];
- Buf[pos - 2] = Buf[pos - 3];
- Buf[pos - 3] = Buf[pos - 4];
- Buf[pos - 4] = Buf[pos - 5];
- Buf[pos - 5] = Buf[pos - 6];
- Buf[pos - 6] = Buf[pos - 7];
- Buf[pos - 7] = Buf[pos - 8];
- }
- for (; pos > 0; pos--)
- Buf[pos] = Buf[pos - 1];
- Buf[0] = res;
- return res;
- }
-};
-*/
-
-#ifdef MY_CPU_64BIT
-typedef UInt64 CMtfVar;
-#define MTF_MOVS 3
-#else
-typedef UInt32 CMtfVar;
-#define MTF_MOVS 2
-#endif
-
-#define MTF_MASK ((1 << MTF_MOVS) - 1)
-
-
-struct CMtf8Decoder
-{
- CMtfVar Buf[256 >> MTF_MOVS];
-
- void StartInit() { memset(Buf, 0, sizeof(Buf)); }
- void Add(unsigned int pos, Byte val) { Buf[pos >> MTF_MOVS] |= ((CMtfVar)val << ((pos & MTF_MASK) << 3)); }
- Byte GetHead() const { return (Byte)Buf[0]; }
- Byte GetAndMove(unsigned int pos)
- {
- UInt32 lim = ((UInt32)pos >> MTF_MOVS);
- pos = (pos & MTF_MASK) << 3;
- CMtfVar prev = (Buf[lim] >> pos) & 0xFF;
-
- UInt32 i = 0;
- if ((lim & 1) != 0)
- {
- CMtfVar next = Buf[0];
- Buf[0] = (next << 8) | prev;
- prev = (next >> (MTF_MASK << 3));
- i = 1;
- lim -= 1;
- }
- for (; i < lim; i += 2)
- {
- CMtfVar n0 = Buf[i];
- CMtfVar n1 = Buf[i + 1];
- Buf[i ] = (n0 << 8) | prev;
- Buf[i + 1] = (n1 << 8) | (n0 >> (MTF_MASK << 3));
- prev = (n1 >> (MTF_MASK << 3));
- }
- CMtfVar next = Buf[i];
- CMtfVar mask = (((CMtfVar)0x100 << pos) - 1);
- Buf[i] = (next & ~mask) | (((next << 8) | prev) & mask);
- return (Byte)Buf[0];
- }
-};
-
-/*
-const int kSmallSize = 64;
-class CMtf8Decoder
-{
- Byte SmallBuffer[kSmallSize];
- int SmallSize;
- Byte Counts[16];
- int Size;
-public:
- Byte Buf[256];
-
- Byte GetHead() const
- {
- if (SmallSize > 0)
- return SmallBuffer[kSmallSize - SmallSize];
- return Buf[0];
- }
-
- void Init(int size)
- {
- Size = size;
- SmallSize = 0;
- for (int i = 0; i < 16; i++)
- {
- Counts[i] = ((size >= 16) ? 16 : size);
- size -= Counts[i];
- }
- }
-
- Byte GetAndMove(int pos)
- {
- if (pos < SmallSize)
- {
- Byte *p = SmallBuffer + kSmallSize - SmallSize;
- Byte res = p[pos];
- for (; pos > 0; pos--)
- p[pos] = p[pos - 1];
- SmallBuffer[kSmallSize - SmallSize] = res;
- return res;
- }
- if (SmallSize == kSmallSize)
- {
- int i = Size - 1;
- int g = 16;
- do
- {
- g--;
- int offset = (g << 4);
- for (int t = Counts[g] - 1; t >= 0; t--, i--)
- Buf[i] = Buf[offset + t];
- }
- while(g != 0);
-
- for (i = kSmallSize - 1; i >= 0; i--)
- Buf[i] = SmallBuffer[i];
- Init(Size);
- }
- pos -= SmallSize;
- int g;
- for (g = 0; pos >= Counts[g]; g++)
- pos -= Counts[g];
- int offset = (g << 4);
- Byte res = Buf[offset + pos];
- for (pos; pos < 16 - 1; pos++)
- Buf[offset + pos] = Buf[offset + pos + 1];
-
- SmallSize++;
- SmallBuffer[kSmallSize - SmallSize] = res;
-
- Counts[g]--;
- return res;
- }
-};
-*/
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/PpmdDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/PpmdDecoder.cpp
deleted file mode 100644
index c02f44f16..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/PpmdDecoder.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-// PpmdDecoder.cpp
-// 2009-03-11 : Igor Pavlov : Public domain
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-#include "../../../C/CpuArch.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "PpmdDecoder.h"
-
-namespace NCompress {
-namespace NPpmd {
-
-static const UInt32 kBufSize = (1 << 20);
-
-enum
-{
- kStatus_NeedInit,
- kStatus_Normal,
- kStatus_Finished,
- kStatus_Error
-};
-
-static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
-static void SzBigFree(void *, void *address) { BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-CDecoder::~CDecoder()
-{
- ::MidFree(_outBuf);
- Ppmd7_Free(&_ppmd, &g_BigAlloc);
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *props, UInt32 size)
-{
- if (size < 5)
- return E_INVALIDARG;
- _order = props[0];
- UInt32 memSize = GetUi32(props + 1);
- if (_order < PPMD7_MIN_ORDER ||
- _order > PPMD7_MAX_ORDER ||
- memSize < PPMD7_MIN_MEM_SIZE ||
- memSize > PPMD7_MAX_MEM_SIZE)
- return E_NOTIMPL;
- if (!_inStream.Alloc(1 << 20))
- return E_OUTOFMEMORY;
- if (!Ppmd7_Alloc(&_ppmd, memSize, &g_BigAlloc))
- return E_OUTOFMEMORY;
- return S_OK;
-}
-
-HRESULT CDecoder::CodeSpec(Byte *memStream, UInt32 size)
-{
- switch(_status)
- {
- case kStatus_Finished: return S_OK;
- case kStatus_Error: return S_FALSE;
- case kStatus_NeedInit:
- _inStream.Init();
- if (!Ppmd7z_RangeDec_Init(&_rangeDec))
- {
- _status = kStatus_Error;
- return S_FALSE;
- }
- _status = kStatus_Normal;
- Ppmd7_Init(&_ppmd, _order);
- break;
- }
- if (_outSizeDefined)
- {
- const UInt64 rem = _outSize - _processedSize;
- if (size > rem)
- size = (UInt32)rem;
- }
-
- UInt32 i;
- int sym = 0;
- for (i = 0; i != size; i++)
- {
- sym = Ppmd7_DecodeSymbol(&_ppmd, &_rangeDec.p);
- if (_inStream.Extra || sym < 0)
- break;
- memStream[i] = (Byte)sym;
- }
-
- _processedSize += i;
- if (_inStream.Extra)
- {
- _status = kStatus_Error;
- return _inStream.Res;
- }
- if (sym < 0)
- _status = (sym < -1) ? kStatus_Error : kStatus_Finished;
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (!_outBuf)
- {
- _outBuf = (Byte *)::MidAlloc(kBufSize);
- if (!_outBuf)
- return E_OUTOFMEMORY;
- }
-
- _inStream.Stream = inStream;
- SetOutStreamSize(outSize);
-
- do
- {
- const UInt64 startPos = _processedSize;
- HRESULT res = CodeSpec(_outBuf, kBufSize);
- size_t processed = (size_t)(_processedSize - startPos);
- RINOK(WriteStream(outStream, _outBuf, processed));
- RINOK(res);
- if (_status == kStatus_Finished)
- break;
- if (progress)
- {
- UInt64 inSize = _inStream.GetProcessed();
- RINOK(progress->SetRatioInfo(&inSize, &_processedSize));
- }
- }
- while (!_outSizeDefined || _processedSize < _outSize);
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)
-{
- _outSizeDefined = (outSize != NULL);
- if (_outSizeDefined)
- _outSize = *outSize;
- _processedSize = 0;
- _status = kStatus_NeedInit;
- return S_OK;
-}
-
-#ifndef NO_READ_FROM_CODER
-
-STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream)
-{
- InSeqStream = inStream;
- _inStream.Stream = inStream;
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::ReleaseInStream()
-{
- InSeqStream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- const UInt64 startPos = _processedSize;
- HRESULT res = CodeSpec((Byte *)data, size);
- if (processedSize)
- *processedSize = (UInt32)(_processedSize - startPos);
- return res;
-}
-
-#endif
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/PpmdDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/PpmdDecoder.h
deleted file mode 100644
index 8ebcd700c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/PpmdDecoder.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// PpmdDecoder.h
-// 2009-03-11 : Igor Pavlov : Public domain
-
-#ifndef __COMPRESS_PPMD_DECODER_H
-#define __COMPRESS_PPMD_DECODER_H
-
-#include "../../../C/Ppmd7.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../Common/CWrappers.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NPpmd {
-
-class CDecoder :
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- #ifndef NO_READ_FROM_CODER
- public ICompressSetInStream,
- public ICompressSetOutStreamSize,
- public ISequentialInStream,
- #endif
- public CMyUnknownImp
-{
- Byte *_outBuf;
- CPpmd7z_RangeDec _rangeDec;
- CByteInBufWrap _inStream;
- CPpmd7 _ppmd;
-
- Byte _order;
- bool _outSizeDefined;
- int _status;
- UInt64 _outSize;
- UInt64 _processedSize;
-
- HRESULT CodeSpec(Byte *memStream, UInt32 size);
-
-public:
-
- #ifndef NO_READ_FROM_CODER
- CMyComPtr<ISequentialInStream> InSeqStream;
- MY_UNKNOWN_IMP4(
- ICompressSetDecoderProperties2,
- ICompressSetInStream,
- ICompressSetOutStreamSize,
- ISequentialInStream)
- #else
- MY_UNKNOWN_IMP1(
- ICompressSetDecoderProperties2)
- #endif
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
- STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
-
- #ifndef NO_READ_FROM_CODER
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- #endif
-
- CDecoder(): _outBuf(NULL), _outSizeDefined(false)
- {
- Ppmd7z_RangeDec_CreateVTable(&_rangeDec);
- _rangeDec.Stream = &_inStream.p;
- Ppmd7_Construct(&_ppmd);
- }
-
- ~CDecoder();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/PpmdEncoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/PpmdEncoder.cpp
deleted file mode 100644
index d823ffe85..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/PpmdEncoder.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-// PpmdEncoder.cpp
-// 2009-03-11 : Igor Pavlov : Public domain
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-#include "../../../C/CpuArch.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "PpmdEncoder.h"
-
-namespace NCompress {
-namespace NPpmd {
-
-static const UInt32 kBufSize = (1 << 20);
-
-static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
-static void SzBigFree(void *, void *address) { BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-CEncoder::CEncoder():
- _inBuf(NULL),
- _usedMemSize(1 << 24),
- _order(6)
-{
- _rangeEnc.Stream = &_outStream.p;
- Ppmd7_Construct(&_ppmd);
-}
-
-CEncoder::~CEncoder()
-{
- ::MidFree(_inBuf);
- Ppmd7_Free(&_ppmd, &g_BigAlloc);
-}
-
-STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
-{
- for (UInt32 i = 0; i < numProps; i++)
- {
- const PROPVARIANT &prop = props[i];
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- UInt32 v = (UInt32)prop.ulVal;
- switch(propIDs[i])
- {
- case NCoderPropID::kUsedMemorySize:
- if (v < (1 << 16) || v > PPMD7_MAX_MEM_SIZE || (v & 3) != 0)
- return E_INVALIDARG;
- _usedMemSize = v;
- break;
- case NCoderPropID::kOrder:
- if (v < 2 || v > 32)
- return E_INVALIDARG;
- _order = (Byte)v;
- break;
- default:
- return E_INVALIDARG;
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
-{
- const UInt32 kPropSize = 5;
- Byte props[kPropSize];
- props[0] = _order;
- SetUi32(props + 1, _usedMemSize);
- return WriteStream(outStream, props, kPropSize);
-}
-
-HRESULT CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- if (!_inBuf)
- {
- _inBuf = (Byte *)::MidAlloc(kBufSize);
- if (!_inBuf)
- return E_OUTOFMEMORY;
- }
- if (!_outStream.Alloc(1 << 20))
- return E_OUTOFMEMORY;
- if (!Ppmd7_Alloc(&_ppmd, _usedMemSize, &g_BigAlloc))
- return E_OUTOFMEMORY;
-
- _outStream.Stream = outStream;
- _outStream.Init();
-
- Ppmd7z_RangeEnc_Init(&_rangeEnc);
- Ppmd7_Init(&_ppmd, _order);
-
- UInt64 processed = 0;
- for (;;)
- {
- UInt32 size;
- RINOK(inStream->Read(_inBuf, kBufSize, &size));
- if (size == 0)
- {
- // We don't write EndMark in PPMD-7z.
- // Ppmd7_EncodeSymbol(&_ppmd, &_rangeEnc, -1);
- Ppmd7z_RangeEnc_FlushData(&_rangeEnc);
- return _outStream.Flush();
- }
- for (UInt32 i = 0; i < size; i++)
- {
- Ppmd7_EncodeSymbol(&_ppmd, &_rangeEnc, _inBuf[i]);
- RINOK(_outStream.Res);
- }
- processed += size;
- if (progress)
- {
- UInt64 outSize = _outStream.GetProcessed();
- RINOK(progress->SetRatioInfo(&processed, &outSize));
- }
- }
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/PpmdEncoder.h b/src/libs/7zip/win/CPP/7zip/Compress/PpmdEncoder.h
deleted file mode 100644
index ed8b37131..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/PpmdEncoder.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// PpmdEncoder.h
-// 2009-03-11 : Igor Pavlov : Public domain
-
-#ifndef __COMPRESS_PPMD_ENCODER_H
-#define __COMPRESS_PPMD_ENCODER_H
-
-#include "../../../C/Ppmd7.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/CWrappers.h"
-
-namespace NCompress {
-namespace NPpmd {
-
-class CEncoder :
- public ICompressCoder,
- public ICompressSetCoderProperties,
- public ICompressWriteCoderProperties,
- public CMyUnknownImp
-{
- Byte *_inBuf;
- CByteOutBufWrap _outStream;
- CPpmd7z_RangeEnc _rangeEnc;
- CPpmd7 _ppmd;
-
- UInt32 _usedMemSize;
- Byte _order;
-
-public:
- MY_UNKNOWN_IMP2(
- ICompressSetCoderProperties,
- ICompressWriteCoderProperties)
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
- STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);
-
- CEncoder();
- ~CEncoder();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/PpmdRegister.cpp b/src/libs/7zip/win/CPP/7zip/Compress/PpmdRegister.cpp
deleted file mode 100644
index 9f59fcdd3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/PpmdRegister.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// PpmdRegister.cpp
-// 2009-05-30 : Igor Pavlov : Public domain
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "PpmdDecoder.h"
-
-static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NPpmd::CDecoder); }
-#ifndef EXTRACT_ONLY
-#include "PpmdEncoder.h"
-static void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NPpmd::CEncoder); }
-#else
-#define CreateCodecOut 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodec, CreateCodecOut, 0x030401, L"PPMD", 1, false };
-
-REGISTER_CODEC(PPMD)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/PpmdZip.cpp b/src/libs/7zip/win/CPP/7zip/Compress/PpmdZip.cpp
deleted file mode 100644
index e83d979c3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/PpmdZip.cpp
+++ /dev/null
@@ -1,223 +0,0 @@
-// PpmdZip.cpp
-// 2010-03-24 : Igor Pavlov : Public domain
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "PpmdZip.h"
-
-namespace NCompress {
-namespace NPpmdZip {
-
-static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
-static void SzBigFree(void *, void *address) { BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-CDecoder::CDecoder(bool fullFileMode):
- _fullFileMode(fullFileMode)
-{
- _ppmd.Stream.In = &_inStream.p;
- Ppmd8_Construct(&_ppmd);
-}
-
-CDecoder::~CDecoder()
-{
- Ppmd8_Free(&_ppmd, &g_BigAlloc);
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (!_outStream.Alloc())
- return E_OUTOFMEMORY;
- if (!_inStream.Alloc(1 << 20))
- return E_OUTOFMEMORY;
-
- _inStream.Stream = inStream;
- _inStream.Init();
-
- {
- Byte buf[2];
- for (int i = 0; i < 2; i++)
- buf[i] = _inStream.ReadByte();
- if (_inStream.Extra)
- return S_FALSE;
-
- UInt32 val = GetUi16(buf);
- UInt32 order = (val & 0xF) + 1;
- UInt32 mem = ((val >> 4) & 0xFF) + 1;
- UInt32 restor = (val >> 12);
- if (order < 2 || restor > 2)
- return S_FALSE;
-
- #ifndef PPMD8_FREEZE_SUPPORT
- if (restor == 2)
- return E_NOTIMPL;
- #endif
-
- if (!Ppmd8_Alloc(&_ppmd, mem << 20, &g_BigAlloc))
- return E_OUTOFMEMORY;
-
- if (!Ppmd8_RangeDec_Init(&_ppmd))
- return S_FALSE;
- Ppmd8_Init(&_ppmd, order, restor);
- }
-
- bool wasFinished = false;
- UInt64 processedSize = 0;
- while (!outSize || processedSize < *outSize)
- {
- size_t size = kBufSize;
- if (outSize != NULL)
- {
- const UInt64 rem = *outSize - processedSize;
- if (size > rem)
- size = (size_t)rem;
- }
- Byte *data = _outStream.Buf;
- size_t i = 0;
- int sym = 0;
- do
- {
- sym = Ppmd8_DecodeSymbol(&_ppmd);
- if (_inStream.Extra || sym < 0)
- break;
- data[i] = (Byte)sym;
- }
- while (++i != size);
- processedSize += i;
-
- RINOK(WriteStream(outStream, _outStream.Buf, i));
-
- RINOK(_inStream.Res);
- if (_inStream.Extra)
- return S_FALSE;
-
- if (sym < 0)
- {
- if (sym != -1)
- return S_FALSE;
- wasFinished = true;
- break;
- }
- if (progress)
- {
- UInt64 inSize = _inStream.GetProcessed();
- RINOK(progress->SetRatioInfo(&inSize, &processedSize));
- }
- }
- RINOK(_inStream.Res);
- if (_fullFileMode)
- {
- if (!wasFinished)
- {
- int res = Ppmd8_DecodeSymbol(&_ppmd);
- RINOK(_inStream.Res);
- if (_inStream.Extra || res != -1)
- return S_FALSE;
- }
- if (!Ppmd8_RangeDec_IsFinishedOK(&_ppmd))
- return S_FALSE;
- }
- return S_OK;
-}
-
-
-// ---------- Encoder ----------
-
-CEncoder::~CEncoder()
-{
- Ppmd8_Free(&_ppmd, &g_BigAlloc);
-}
-
-HRESULT CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
-{
- for (UInt32 i = 0; i < numProps; i++)
- {
- const PROPVARIANT &prop = props[i];
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- UInt32 v = (UInt32)prop.ulVal;
- switch(propIDs[i])
- {
- case NCoderPropID::kAlgorithm:
- if (v > 1)
- return E_INVALIDARG;
- _restor = v;
- break;
- case NCoderPropID::kUsedMemorySize:
- if (v < (1 << 20) || v > (1 << 28))
- return E_INVALIDARG;
- _usedMemInMB = v >> 20;
- break;
- case NCoderPropID::kOrder:
- if (v < PPMD8_MIN_ORDER || v > PPMD8_MAX_ORDER)
- return E_INVALIDARG;
- _order = (Byte)v;
- break;
- default:
- return E_INVALIDARG;
- }
- }
- return S_OK;
-}
-
-CEncoder::CEncoder():
- _usedMemInMB(16),
- _order(6),
- _restor(PPMD8_RESTORE_METHOD_RESTART)
-{
- _ppmd.Stream.Out = &_outStream.p;
- Ppmd8_Construct(&_ppmd);
-}
-
-HRESULT CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- if (!_inStream.Alloc())
- return E_OUTOFMEMORY;
- if (!_outStream.Alloc(1 << 20))
- return E_OUTOFMEMORY;
- if (!Ppmd8_Alloc(&_ppmd, _usedMemInMB << 20, &g_BigAlloc))
- return E_OUTOFMEMORY;
-
- _outStream.Stream = outStream;
- _outStream.Init();
-
- Ppmd8_RangeEnc_Init(&_ppmd);
- Ppmd8_Init(&_ppmd, _order, _restor);
-
- UInt32 val = (UInt32)((_order - 1) + ((_usedMemInMB - 1) << 4) + (_restor << 12));
- _outStream.WriteByte((Byte)(val & 0xFF));
- _outStream.WriteByte((Byte)(val >> 8));
- RINOK(_outStream.Res);
-
- UInt64 processed = 0;
- for (;;)
- {
- UInt32 size;
- RINOK(inStream->Read(_inStream.Buf, kBufSize, &size));
- if (size == 0)
- {
- Ppmd8_EncodeSymbol(&_ppmd, -1);
- Ppmd8_RangeEnc_FlushData(&_ppmd);
- return _outStream.Flush();
- }
- for (UInt32 i = 0; i < size; i++)
- {
- Ppmd8_EncodeSymbol(&_ppmd, _inStream.Buf[i]);
- RINOK(_outStream.Res);
- }
- processed += size;
- if (progress != NULL)
- {
- UInt64 outSize = _outStream.GetProcessed();
- RINOK(progress->SetRatioInfo(&processed, &outSize));
- }
- }
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/PpmdZip.h b/src/libs/7zip/win/CPP/7zip/Compress/PpmdZip.h
deleted file mode 100644
index c2288b5af..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/PpmdZip.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// PpmdZip.h
-// 2010-03-11 : Igor Pavlov : Public domain
-
-#ifndef __COMPRESS_PPMD_ZIP_H
-#define __COMPRESS_PPMD_ZIP_H
-
-#include "../../../C/Alloc.h"
-#include "../../../C/Ppmd8.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../Common/CWrappers.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NPpmdZip {
-
-static const UInt32 kBufSize = (1 << 20);
-
-struct CBuf
-{
- Byte *Buf;
-
- CBuf(): Buf(0) {}
- ~CBuf() { ::MidFree(Buf); }
- bool Alloc()
- {
- if (!Buf)
- Buf = (Byte *)::MidAlloc(kBufSize);
- return (Buf != 0);
- }
-};
-
-class CDecoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- CByteInBufWrap _inStream;
- CBuf _outStream;
- CPpmd8 _ppmd;
- bool _fullFileMode;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- CDecoder(bool fullFileMode);
- ~CDecoder();
-};
-
-class CEncoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- CByteOutBufWrap _outStream;
- CBuf _inStream;
- CPpmd8 _ppmd;
- UInt32 _usedMemInMB;
- unsigned _order;
- unsigned _restor;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- HRESULT SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
- CEncoder();
- ~CEncoder();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/QuantumDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/QuantumDecoder.cpp
deleted file mode 100644
index 501bd0e1f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/QuantumDecoder.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-// QuantumDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/Defs.h"
-
-#include "QuantumDecoder.h"
-
-namespace NCompress {
-namespace NQuantum {
-
-static const int kLenIdNeedInit = -2;
-
-static const unsigned kNumLenSymbols = 27;
-static const unsigned kMatchMinLen = 3;
-static const unsigned kNumSimplePosSlots = 4;
-static const unsigned kNumSimpleLenSlots = 6;
-
-void CDecoder::Init()
-{
- m_Selector.Init(kNumSelectors);
- unsigned i;
- for (i = 0; i < kNumLitSelectors; i++)
- m_Literals[i].Init(kNumLitSymbols);
- unsigned numItems = (_numDictBits == 0 ? 1 : (_numDictBits << 1));
- const unsigned kNumPosSymbolsMax[kNumMatchSelectors] = { 24, 36, 42 };
- for (i = 0; i < kNumMatchSelectors; i++)
- m_PosSlot[i].Init(MyMin(numItems, kNumPosSymbolsMax[i]));
- m_LenSlot.Init(kNumLenSymbols);
-}
-
-HRESULT CDecoder::CodeSpec(UInt32 curSize)
-{
- if (_remainLen == kLenIdNeedInit)
- {
- if (!_keepHistory)
- {
- if (!_outWindowStream.Create((UInt32)1 << _numDictBits))
- return E_OUTOFMEMORY;
- Init();
- }
- if (!_rangeDecoder.Create(1 << 20))
- return E_OUTOFMEMORY;
- _rangeDecoder.Init();
- _remainLen = 0;
- }
- if (curSize == 0)
- return S_OK;
-
- while (_remainLen > 0 && curSize > 0)
- {
- _remainLen--;
- Byte b = _outWindowStream.GetByte(_rep0);
- _outWindowStream.PutByte(b);
- curSize--;
- }
-
- while (curSize > 0)
- {
- if (_rangeDecoder.Stream.WasFinished())
- return S_FALSE;
-
- unsigned selector = m_Selector.Decode(&_rangeDecoder);
- if (selector < kNumLitSelectors)
- {
- Byte b = (Byte)((selector << (8 - kNumLitSelectorBits)) + m_Literals[selector].Decode(&_rangeDecoder));
- _outWindowStream.PutByte(b);
- curSize--;
- }
- else
- {
- selector -= kNumLitSelectors;
- unsigned len = selector + kMatchMinLen;
- if (selector == 2)
- {
- unsigned lenSlot = m_LenSlot.Decode(&_rangeDecoder);
- if (lenSlot >= kNumSimpleLenSlots)
- {
- lenSlot -= 2;
- int numDirectBits = (int)(lenSlot >> 2);
- len += ((4 | (lenSlot & 3)) << numDirectBits) - 2;
- if (numDirectBits < 6)
- len += _rangeDecoder.Stream.ReadBits(numDirectBits);
- }
- else
- len += lenSlot;
- }
- UInt32 rep0 = m_PosSlot[selector].Decode(&_rangeDecoder);
- if (rep0 >= kNumSimplePosSlots)
- {
- int numDirectBits = (int)((rep0 >> 1) - 1);
- rep0 = ((2 | (rep0 & 1)) << numDirectBits) + _rangeDecoder.Stream.ReadBits(numDirectBits);
- }
- unsigned locLen = len;
- if (len > curSize)
- locLen = (unsigned)curSize;
- if (!_outWindowStream.CopyBlock(rep0, locLen))
- return S_FALSE;
- curSize -= locLen;
- len -= locLen;
- if (len != 0)
- {
- _remainLen = (int)len;
- _rep0 = rep0;
- break;
- }
- }
- }
- return _rangeDecoder.Stream.WasFinished() ? S_FALSE : S_OK;
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (outSize == NULL)
- return E_INVALIDARG;
- UInt64 size = *outSize;
-
- SetInStream(inStream);
- _outWindowStream.SetStream(outStream);
- SetOutStreamSize(outSize);
- CDecoderFlusher flusher(this);
-
- const UInt64 start = _outWindowStream.GetProcessedSize();
- for (;;)
- {
- UInt32 curSize = 1 << 18;
- UInt64 rem = size - (_outWindowStream.GetProcessedSize() - start);
- if (curSize > rem)
- curSize = (UInt32)rem;
- if (curSize == 0)
- break;
- RINOK(CodeSpec(curSize));
- if (progress != NULL)
- {
- UInt64 inSize = _rangeDecoder.GetProcessedSize();
- UInt64 nowPos64 = _outWindowStream.GetProcessedSize() - start;
- RINOK(progress->SetRatioInfo(&inSize, &nowPos64));
- }
- }
- flusher.NeedFlush = false;
- return Flush();
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream)
-{
- _rangeDecoder.SetStream(inStream);
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::ReleaseInStream()
-{
- _rangeDecoder.ReleaseStream();
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)
-{
- if (outSize == NULL)
- return E_FAIL;
- _remainLen = kLenIdNeedInit;
- _outWindowStream.Init(_keepHistory);
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/QuantumDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/QuantumDecoder.h
deleted file mode 100644
index e9ab023ba..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/QuantumDecoder.h
+++ /dev/null
@@ -1,264 +0,0 @@
-// QuantumDecoder.h
-
-#ifndef __COMPRESS_QUANTUM_DECODER_H
-#define __COMPRESS_QUANTUM_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NQuantum {
-
-class CStreamBitDecoder
-{
- UInt32 Value;
- CInBuffer Stream;
-public:
- bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *stream) { Stream.SetStream(stream); }
- void ReleaseStream() { Stream.ReleaseStream(); }
-
- void Finish() { Value = 0x10000; }
-
- void Init()
- {
- Stream.Init();
- Value = 0x10000;
- }
-
- UInt64 GetProcessedSize() const { return Stream.GetProcessedSize(); }
- bool WasFinished() const { return Stream.WasFinished(); }
-
- UInt32 ReadBit()
- {
- if (Value >= 0x10000)
- Value = 0x100 | Stream.ReadByte();
- UInt32 res = (Value >> 7) & 1;
- Value <<= 1;
- return res;
- }
-
- UInt32 ReadBits(int numBits) // numBits > 0
- {
- UInt32 res = 0;
- do
- res = (res << 1) | ReadBit();
- while (--numBits != 0);
- return res;
- }
-};
-
-const unsigned kNumLitSelectorBits = 2;
-const unsigned kNumLitSelectors = (1 << kNumLitSelectorBits);
-const unsigned kNumLitSymbols = 1 << (8 - kNumLitSelectorBits);
-const unsigned kNumMatchSelectors = 3;
-const unsigned kNumSelectors = kNumLitSelectors + kNumMatchSelectors;
-const unsigned kNumSymbolsMax = kNumLitSymbols; // 64
-
-namespace NRangeCoder {
-
-class CDecoder
-{
- UInt32 Low;
- UInt32 Range;
- UInt32 Code;
-public:
- CStreamBitDecoder Stream;
- bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *stream) { Stream.SetStream(stream); }
- void ReleaseStream() { Stream.ReleaseStream(); }
-
- void Init()
- {
- Stream.Init();
- Low = 0;
- Range = 0x10000;
- Code = Stream.ReadBits(16);
- }
-
- void Finish()
- {
- // we need these extra two Bit_reads
- Stream.ReadBit();
- Stream.ReadBit();
- Stream.Finish();
- }
-
- UInt64 GetProcessedSize() const { return Stream.GetProcessedSize(); }
-
- UInt32 GetThreshold(UInt32 total) const
- {
- return ((Code + 1) * total - 1) / Range; // & 0xFFFF is not required;
- }
-
- void Decode(UInt32 start, UInt32 end, UInt32 total)
- {
- UInt32 high = Low + end * Range / total - 1;
- UInt32 offset = start * Range / total;
- Code -= offset;
- Low += offset;
- for (;;)
- {
- if ((Low & 0x8000) != (high & 0x8000))
- {
- if ((Low & 0x4000) == 0 || (high & 0x4000) != 0)
- break;
- Low &= 0x3FFF;
- high |= 0x4000;
- }
- Low = (Low << 1) & 0xFFFF;
- high = ((high << 1) | 1) & 0xFFFF;
- Code = ((Code << 1) | Stream.ReadBit());
- }
- Range = high - Low + 1;
- }
-};
-
-const UInt16 kUpdateStep = 8;
-const UInt16 kFreqSumMax = 3800;
-const UInt16 kReorderCountStart = 4;
-const UInt16 kReorderCount = 50;
-
-class CModelDecoder
-{
- unsigned NumItems;
- unsigned ReorderCount;
- UInt16 Freqs[kNumSymbolsMax + 1];
- Byte Values[kNumSymbolsMax];
-public:
- void Init(unsigned numItems)
- {
- NumItems = numItems;
- ReorderCount = kReorderCountStart;
- for (unsigned i = 0; i < numItems; i++)
- {
- Freqs[i] = (UInt16)(numItems - i);
- Values[i] = (Byte)i;
- }
- Freqs[numItems] = 0;
- }
-
- unsigned Decode(CDecoder *rangeDecoder)
- {
- UInt32 threshold = rangeDecoder->GetThreshold(Freqs[0]);
- unsigned i;
- for (i = 1; Freqs[i] > threshold; i++);
- rangeDecoder->Decode(Freqs[i], Freqs[i - 1], Freqs[0]);
- unsigned res = Values[--i];
- do
- Freqs[i] += kUpdateStep;
- while (i-- != 0);
-
- if (Freqs[0] > kFreqSumMax)
- {
- if (--ReorderCount == 0)
- {
- ReorderCount = kReorderCount;
- for (i = 0; i < NumItems; i++)
- Freqs[i] = (UInt16)(((Freqs[i] - Freqs[i + 1]) + 1) >> 1);
- for (i = 0; i < NumItems - 1; i++)
- for (unsigned j = i + 1; j < NumItems; j++)
- if (Freqs[i] < Freqs[j])
- {
- UInt16 tmpFreq = Freqs[i];
- Byte tmpVal = Values[i];
- Freqs[i] = Freqs[j];
- Values[i] = Values[j];
- Freqs[j] = tmpFreq;
- Values[j] = tmpVal;
- }
- do
- Freqs[i] = (UInt16)(Freqs[i] + Freqs[i + 1]);
- while (i-- != 0);
- }
- else
- {
- i = NumItems - 1;
- do
- {
- Freqs[i] >>= 1;
- if (Freqs[i] <= Freqs[i + 1])
- Freqs[i] = (UInt16)(Freqs[i + 1] + 1);
- }
- while (i-- != 0);
- }
- }
- return res;
- }
-};
-
-}
-
-class CDecoder:
- public ICompressCoder,
- public ICompressSetInStream,
- public ICompressSetOutStreamSize,
- public CMyUnknownImp
-{
- CLzOutWindow _outWindowStream;
- NRangeCoder::CDecoder _rangeDecoder;
-
- UInt64 _outSize;
- int _remainLen; // -1 means end of stream. // -2 means need Init
- UInt32 _rep0;
-
- int _numDictBits;
- bool _keepHistory;
-
- NRangeCoder::CModelDecoder m_Selector;
- NRangeCoder::CModelDecoder m_Literals[kNumLitSelectors];
- NRangeCoder::CModelDecoder m_PosSlot[kNumMatchSelectors];
- NRangeCoder::CModelDecoder m_LenSlot;
- void Init();
- HRESULT CodeSpec(UInt32 size);
-public:
- MY_UNKNOWN_IMP2(
- ICompressSetInStream,
- ICompressSetOutStreamSize)
-
- void ReleaseStreams()
- {
- _outWindowStream.ReleaseStream();
- ReleaseInStream();
- }
-
- class CDecoderFlusher
- {
- CDecoder *_decoder;
- public:
- bool NeedFlush;
- CDecoderFlusher(CDecoder *decoder): _decoder(decoder), NeedFlush(true) {}
- ~CDecoderFlusher()
- {
- if (NeedFlush)
- _decoder->Flush();
- _decoder->ReleaseStreams();
- }
- };
-
- HRESULT Flush() { return _outWindowStream.Flush(); }
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
-
- void SetParams(int numDictBits) { _numDictBits = numDictBits; }
- void SetKeepHistory(bool keepHistory) { _keepHistory = keepHistory; }
- CDecoder(): _keepHistory(false) {}
- virtual ~CDecoder() {}
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Rar1Decoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/Rar1Decoder.cpp
deleted file mode 100644
index eadca7b3d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Rar1Decoder.cpp
+++ /dev/null
@@ -1,480 +0,0 @@
-// Rar1Decoder.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#include "StdAfx.h"
-
-#include "Rar1Decoder.h"
-
-namespace NCompress {
-namespace NRar1 {
-
-static UInt32 PosL1[]={0,0,0,2,3,5,7,11,16,20,24,32,32, 256};
-static UInt32 PosL2[]={0,0,0,0,5,7,9,13,18,22,26,34,36, 256};
-static UInt32 PosHf0[]={0,0,0,0,0,8,16,24,33,33,33,33,33, 257};
-static UInt32 PosHf1[]={0,0,0,0,0,0,4,44,60,76,80,80,127, 257};
-static UInt32 PosHf2[]={0,0,0,0,0,0,2,7,53,117,233, 257,0};
-static UInt32 PosHf3[]={0,0,0,0,0,0,0,2,16,218,251, 257,0};
-static UInt32 PosHf4[]={0,0,0,0,0,0,0,0,0,255, 257,0,0};
-
-static const UInt32 kHistorySize = (1 << 16);
-
-class CCoderReleaser
-{
- CDecoder *m_Coder;
-public:
- CCoderReleaser(CDecoder *coder): m_Coder(coder) {}
- ~CCoderReleaser() { m_Coder->ReleaseStreams(); }
-};
-
-CDecoder::CDecoder(): m_IsSolid(false) { }
-
-void CDecoder::InitStructures()
-{
- for(int i = 0; i < kNumRepDists; i++)
- m_RepDists[i] = 0;
- m_RepDistPtr = 0;
- LastLength = 0;
- LastDist = 0;
-}
-
-UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }
-
-HRESULT CDecoder::CopyBlock(UInt32 distance, UInt32 len)
-{
- if (len == 0)
- return S_FALSE;
- m_UnpackSize -= len;
- return m_OutWindowStream.CopyBlock(distance, len) ? S_OK : S_FALSE;
-}
-
-
-UInt32 CDecoder::DecodeNum(const UInt32 *posTab)
-{
- UInt32 startPos = 2;
- UInt32 num = m_InBitStream.GetValue(12);
- for (;;)
- {
- UInt32 cur = (posTab[startPos + 1] - posTab[startPos]) << (12 - startPos);
- if (num < cur)
- break;
- startPos++;
- num -= cur;
- }
- m_InBitStream.MovePos(startPos);
- return((num >> (12 - startPos)) + posTab[startPos]);
-}
-
-static Byte kShortLen1[] = {1,3,4,4,5,6,7,8,8,4,4,5,6,6 };
-static Byte kShortLen1a[] = {1,4,4,4,5,6,7,8,8,4,4,5,6,6,4 };
-static Byte kShortLen2[] = {2,3,3,3,4,4,5,6,6,4,4,5,6,6 };
-static Byte kShortLen2a[] = {2,3,3,4,4,4,5,6,6,4,4,5,6,6,4 };
-static UInt32 kShortXor1[] = {0,0xa0,0xd0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xc0,0x80,0x90,0x98,0x9c,0xb0};
-static UInt32 kShortXor2[] = {0,0x40,0x60,0xa0,0xd0,0xe0,0xf0,0xf8,0xfc,0xc0,0x80,0x90,0x98,0x9c,0xb0};
-
-HRESULT CDecoder::ShortLZ()
-{
- UInt32 len, saveLen, dist;
- int distancePlace;
- Byte *kShortLen;
- const UInt32 *kShortXor;
- NumHuf = 0;
-
- if (LCount == 2)
- {
- if (ReadBits(1))
- return CopyBlock(LastDist, LastLength);
- LCount = 0;
- }
-
- UInt32 bitField = m_InBitStream.GetValue(8);
-
- if (AvrLn1 < 37)
- {
- kShortLen = Buf60 ? kShortLen1a : kShortLen1;
- kShortXor = kShortXor1;
- }
- else
- {
- kShortLen = Buf60 ? kShortLen2a : kShortLen2;
- kShortXor = kShortXor2;
- }
-
- for (len = 0; ((bitField ^ kShortXor[len]) & (~(0xff >> kShortLen[len]))) != 0; len++);
- m_InBitStream.MovePos(kShortLen[len]);
-
- if (len >= 9)
- {
- if (len == 9)
- {
- LCount++;
- return CopyBlock(LastDist, LastLength);
- }
- if (len == 14)
- {
- LCount = 0;
- len = DecodeNum(PosL2) + 5;
- dist = 0x8000 + ReadBits(15) - 1;
- LastLength = len;
- LastDist = dist;
- return CopyBlock(dist, len);
- }
-
- LCount = 0;
- saveLen = len;
- dist = m_RepDists[(m_RepDistPtr - (len - 9)) & 3];
- len = DecodeNum(PosL1) + 2;
- if (len == 0x101 && saveLen == 10)
- {
- Buf60 ^= 1;
- return S_OK;
- }
- if (dist >= 256)
- len++;
- if (dist >= MaxDist3 - 1)
- len++;
- }
- else
- {
- LCount = 0;
- AvrLn1 += len;
- AvrLn1 -= AvrLn1 >> 4;
-
- distancePlace = DecodeNum(PosHf2) & 0xff;
- dist = ChSetA[distancePlace];
- if (--distancePlace != -1)
- {
- PlaceA[dist]--;
- UInt32 lastDistance = ChSetA[distancePlace];
- PlaceA[lastDistance]++;
- ChSetA[distancePlace + 1] = lastDistance;
- ChSetA[distancePlace] = dist;
- }
- len += 2;
- }
- m_RepDists[m_RepDistPtr++] = dist;
- m_RepDistPtr &= 3;
- LastLength = len;
- LastDist = dist;
- return CopyBlock(dist, len);
-}
-
-
-HRESULT CDecoder::LongLZ()
-{
- UInt32 len;
- UInt32 dist;
- UInt32 distancePlace, newDistancePlace;
- UInt32 oldAvr2, oldAvr3;
-
- NumHuf = 0;
- Nlzb += 16;
- if (Nlzb > 0xff)
- {
- Nlzb = 0x90;
- Nhfb >>= 1;
- }
- oldAvr2=AvrLn2;
-
- if (AvrLn2 >= 122)
- len = DecodeNum(PosL2);
- else if (AvrLn2 >= 64)
- len = DecodeNum(PosL1);
- else
- {
- UInt32 bitField = m_InBitStream.GetValue(16);
- if (bitField < 0x100)
- {
- len = bitField;
- m_InBitStream.MovePos(16);
- }
- else
- {
- for (len = 0; ((bitField << len) & 0x8000) == 0; len++)
- ;
- m_InBitStream.MovePos(len + 1);
- }
- }
-
- AvrLn2 += len;
- AvrLn2 -= AvrLn2 >> 5;
-
- if (AvrPlcB > 0x28ff)
- distancePlace = DecodeNum(PosHf2);
- else if (AvrPlcB > 0x6ff)
- distancePlace = DecodeNum(PosHf1);
- else
- distancePlace = DecodeNum(PosHf0);
-
- AvrPlcB += distancePlace;
- AvrPlcB -= AvrPlcB >> 8;
- for (;;)
- {
- dist = ChSetB[distancePlace & 0xff];
- newDistancePlace = NToPlB[dist++ & 0xff]++;
- if (!(dist & 0xff))
- CorrHuff(ChSetB,NToPlB);
- else
- break;
- }
-
- ChSetB[distancePlace] = ChSetB[newDistancePlace];
- ChSetB[newDistancePlace] = dist;
-
- dist = ((dist & 0xff00) >> 1) | ReadBits(7);
-
- oldAvr3 = AvrLn3;
- if (len != 1 && len != 4)
- if (len == 0 && dist <= MaxDist3)
- {
- AvrLn3++;
- AvrLn3 -= AvrLn3 >> 8;
- }
- else
- if (AvrLn3 > 0)
- AvrLn3--;
- len += 3;
- if (dist >= MaxDist3)
- len++;
- if (dist <= 256)
- len += 8;
- if (oldAvr3 > 0xb0 || AvrPlc >= 0x2a00 && oldAvr2 < 0x40)
- MaxDist3 = 0x7f00;
- else
- MaxDist3 = 0x2001;
- m_RepDists[m_RepDistPtr++] = --dist;
- m_RepDistPtr &= 3;
- LastLength = len;
- LastDist = dist;
- return CopyBlock(dist, len);
-}
-
-
-HRESULT CDecoder::HuffDecode()
-{
- UInt32 curByte, newBytePlace;
- UInt32 len;
- UInt32 dist;
- int bytePlace;
-
- if (AvrPlc > 0x75ff) bytePlace = DecodeNum(PosHf4);
- else if (AvrPlc > 0x5dff) bytePlace = DecodeNum(PosHf3);
- else if (AvrPlc > 0x35ff) bytePlace = DecodeNum(PosHf2);
- else if (AvrPlc > 0x0dff) bytePlace = DecodeNum(PosHf1);
- else bytePlace = DecodeNum(PosHf0);
- if (StMode)
- {
- if (--bytePlace == -1)
- {
- if (ReadBits(1))
- {
- NumHuf = StMode = 0;
- return S_OK;
- }
- else
- {
- len = (ReadBits(1)) ? 4 : 3;
- dist = DecodeNum(PosHf2);
- dist = (dist << 5) | ReadBits(5);
- return CopyBlock(dist - 1, len);
- }
- }
- }
- else if (NumHuf++ >= 16 && FlagsCnt == 0)
- StMode = 1;
- bytePlace &= 0xff;
- AvrPlc += bytePlace;
- AvrPlc -= AvrPlc >> 8;
- Nhfb+=16;
- if (Nhfb > 0xff)
- {
- Nhfb=0x90;
- Nlzb >>= 1;
- }
-
- m_UnpackSize --;
- m_OutWindowStream.PutByte((Byte)(ChSet[bytePlace] >> 8));
-
- for (;;)
- {
- curByte = ChSet[bytePlace];
- newBytePlace = NToPl[curByte++ & 0xff]++;
- if ((curByte & 0xff) > 0xa1)
- CorrHuff(ChSet, NToPl);
- else
- break;
- }
-
- ChSet[bytePlace] = ChSet[newBytePlace];
- ChSet[newBytePlace] = curByte;
- return S_OK;
-}
-
-
-void CDecoder::GetFlagsBuf()
-{
- UInt32 flags, newFlagsPlace;
- UInt32 flagsPlace = DecodeNum(PosHf2);
-
- for (;;)
- {
- flags = ChSetC[flagsPlace];
- FlagBuf = flags >> 8;
- newFlagsPlace = NToPlC[flags++ & 0xff]++;
- if ((flags & 0xff) != 0)
- break;
- CorrHuff(ChSetC, NToPlC);
- }
-
- ChSetC[flagsPlace] = ChSetC[newFlagsPlace];
- ChSetC[newFlagsPlace] = flags;
-}
-
-void CDecoder::InitData()
-{
- if (!m_IsSolid)
- {
- AvrPlcB = AvrLn1 = AvrLn2 = AvrLn3 = NumHuf = Buf60 = 0;
- AvrPlc = 0x3500;
- MaxDist3 = 0x2001;
- Nhfb = Nlzb = 0x80;
- }
- FlagsCnt = 0;
- FlagBuf = 0;
- StMode = 0;
- LCount = 0;
-}
-
-void CDecoder::CorrHuff(UInt32 *CharSet,UInt32 *NumToPlace)
-{
- int i;
- for (i = 7; i >= 0; i--)
- for (int j = 0; j < 32; j++, CharSet++)
- *CharSet = (*CharSet & ~0xff) | i;
- memset(NumToPlace, 0, sizeof(NToPl));
- for (i = 6; i >= 0; i--)
- NumToPlace[i] = (7 - i) * 32;
-}
-
-void CDecoder::InitHuff()
-{
- for (UInt32 i = 0; i < 256; i++)
- {
- Place[i] = PlaceA[i] = PlaceB[i] = i;
- PlaceC[i] = (~i + 1) & 0xff;
- ChSet[i] = ChSetB[i] = i << 8;
- ChSetA[i] = i;
- ChSetC[i] = ((~i + 1) & 0xff) << 8;
- }
- memset(NToPl, 0, sizeof(NToPl));
- memset(NToPlB, 0, sizeof(NToPlB));
- memset(NToPlC, 0, sizeof(NToPlC));
- CorrHuff(ChSetB, NToPlB);
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo * /* progress */)
-{
- if (inSize == NULL || outSize == NULL)
- return E_INVALIDARG;
-
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
-
- m_UnpackSize = (Int64)*outSize;
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(m_IsSolid);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
-
- CCoderReleaser coderReleaser(this);
- InitData();
- if (!m_IsSolid)
- {
- InitStructures();
- InitHuff();
- }
- if (m_UnpackSize > 0)
- {
- GetFlagsBuf();
- FlagsCnt = 8;
- }
-
- while (m_UnpackSize > 0)
- {
- if (StMode)
- {
- RINOK(HuffDecode());
- continue;
- }
-
- if (--FlagsCnt < 0)
- {
- GetFlagsBuf();
- FlagsCnt=7;
- }
-
- if (FlagBuf & 0x80)
- {
- FlagBuf <<= 1;
- if (Nlzb > Nhfb)
- {
- RINOK(LongLZ());
- }
- else
- {
- RINOK(HuffDecode());
- }
- }
- else
- {
- FlagBuf <<= 1;
- if (--FlagsCnt < 0)
- {
- GetFlagsBuf();
- FlagsCnt = 7;
- }
- if (FlagBuf & 0x80)
- {
- FlagBuf <<= 1;
- if (Nlzb > Nhfb)
- {
- RINOK(HuffDecode());
- }
- else
- {
- RINOK(LongLZ());
- }
- }
- else
- {
- FlagBuf <<= 1;
- RINOK(ShortLZ());
- }
- }
- }
- if (m_UnpackSize < 0)
- return S_FALSE;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size < 1)
- return E_INVALIDARG;
- m_IsSolid = (data[0] != 0);
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Rar1Decoder.h b/src/libs/7zip/win/CPP/7zip/Compress/Rar1Decoder.h
deleted file mode 100644
index f7c08b386..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Rar1Decoder.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Rar1Decoder.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#ifndef __COMPRESS_RAR1_DECODER_H
-#define __COMPRESS_RAR1_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NRar1 {
-
-const UInt32 kNumRepDists = 4;
-
-typedef NBitm::CDecoder<CInBuffer> CBitDecoder;
-
-class CDecoder :
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public CMyUnknownImp
-{
-public:
- CLzOutWindow m_OutWindowStream;
- CBitDecoder m_InBitStream;
-
- UInt32 m_RepDists[kNumRepDists];
- UInt32 m_RepDistPtr;
-
- UInt32 LastDist;
- UInt32 LastLength;
-
- Int64 m_UnpackSize;
- bool m_IsSolid;
-
- UInt32 ReadBits(int numBits);
- HRESULT CopyBlock(UInt32 distance, UInt32 len);
-
- UInt32 DecodeNum(const UInt32 *posTab);
- HRESULT ShortLZ();
- HRESULT LongLZ();
- HRESULT HuffDecode();
- void GetFlagsBuf();
- void InitData();
- void InitHuff();
- void CorrHuff(UInt32 *CharSet, UInt32 *NumToPlace);
- void OldUnpWriteBuf();
-
- UInt32 ChSet[256],ChSetA[256],ChSetB[256],ChSetC[256];
- UInt32 Place[256],PlaceA[256],PlaceB[256],PlaceC[256];
- UInt32 NToPl[256],NToPlB[256],NToPlC[256];
- UInt32 FlagBuf,AvrPlc,AvrPlcB,AvrLn1,AvrLn2,AvrLn3;
- int Buf60,NumHuf,StMode,LCount,FlagsCnt;
- UInt32 Nhfb,Nlzb,MaxDist3;
-
- void InitStructures();
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-public:
- CDecoder();
-
- MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Rar2Decoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/Rar2Decoder.cpp
deleted file mode 100644
index 4e669bd64..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Rar2Decoder.cpp
+++ /dev/null
@@ -1,391 +0,0 @@
-// Rar2Decoder.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#include "StdAfx.h"
-
-#include "Rar2Decoder.h"
-
-namespace NCompress {
-namespace NRar2 {
-
-namespace NMultimedia {
-
-Byte CFilter::Decode(int &channelDelta, Byte deltaByte)
-{
- D4 = D3;
- D3 = D2;
- D2 = LastDelta - D1;
- D1 = LastDelta;
- int predictedValue = ((8 * LastChar + K1 * D1 + K2 * D2 + K3 * D3 + K4 * D4 + K5 * channelDelta) >> 3);
-
- Byte realValue = (Byte)(predictedValue - deltaByte);
- int i = ((int)(signed char)deltaByte) << 3;
-
- Dif[0] += abs(i);
- Dif[1] += abs(i - D1);
- Dif[2] += abs(i + D1);
- Dif[3] += abs(i - D2);
- Dif[4] += abs(i + D2);
- Dif[5] += abs(i - D3);
- Dif[6] += abs(i + D3);
- Dif[7] += abs(i - D4);
- Dif[8] += abs(i + D4);
- Dif[9] += abs(i - channelDelta);
- Dif[10] += abs(i + channelDelta);
-
- channelDelta = LastDelta = (signed char)(realValue - LastChar);
- LastChar = realValue;
-
- if (((++ByteCount) & 0x1F) == 0)
- {
- UInt32 minDif = Dif[0];
- UInt32 numMinDif = 0;
- Dif[0] = 0;
- for (i = 1; i < sizeof(Dif) / sizeof(Dif[0]); i++)
- {
- if (Dif[i] < minDif)
- {
- minDif = Dif[i];
- numMinDif = i;
- }
- Dif[i] = 0;
- }
- switch(numMinDif)
- {
- case 1: if (K1 >= -16) K1--; break;
- case 2: if (K1 < 16) K1++; break;
- case 3: if (K2 >= -16) K2--; break;
- case 4: if (K2 < 16) K2++; break;
- case 5: if (K3 >= -16) K3--; break;
- case 6: if (K3 < 16) K3++; break;
- case 7: if (K4 >= -16) K4--; break;
- case 8: if (K4 < 16) K4++; break;
- case 9: if (K5 >= -16) K5--; break;
- case 10:if (K5 < 16) K5++; break;
- }
- }
- return realValue;
-}
-}
-
-static const char *kNumberErrorMessage = "Number error";
-
-static const UInt32 kHistorySize = 1 << 20;
-
-static const int kNumStats = 11;
-
-static const UInt32 kWindowReservSize = (1 << 22) + 256;
-
-CDecoder::CDecoder():
- m_IsSolid(false)
-{
-}
-
-void CDecoder::InitStructures()
-{
- m_MmFilter.Init();
- for(int i = 0; i < kNumRepDists; i++)
- m_RepDists[i] = 0;
- m_RepDistPtr = 0;
- m_LastLength = 0;
- memset(m_LastLevels, 0, kMaxTableSize);
-}
-
-UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }
-
-#define RIF(x) { if (!(x)) return false; }
-
-bool CDecoder::ReadTables(void)
-{
- Byte levelLevels[kLevelTableSize];
- Byte newLevels[kMaxTableSize];
- m_AudioMode = (ReadBits(1) == 1);
-
- if (ReadBits(1) == 0)
- memset(m_LastLevels, 0, kMaxTableSize);
- int numLevels;
- if (m_AudioMode)
- {
- m_NumChannels = ReadBits(2) + 1;
- if (m_MmFilter.CurrentChannel >= m_NumChannels)
- m_MmFilter.CurrentChannel = 0;
- numLevels = m_NumChannels * kMMTableSize;
- }
- else
- numLevels = kHeapTablesSizesSum;
-
- int i;
- for (i = 0; i < kLevelTableSize; i++)
- levelLevels[i] = (Byte)ReadBits(4);
- RIF(m_LevelDecoder.SetCodeLengths(levelLevels));
- i = 0;
- while (i < numLevels)
- {
- UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);
- if (number < kTableDirectLevels)
- {
- newLevels[i] = (Byte)((number + m_LastLevels[i]) & kLevelMask);
- i++;
- }
- else
- {
- if (number == kTableLevelRepNumber)
- {
- int t = ReadBits(2) + 3;
- for (int reps = t; reps > 0 && i < numLevels ; reps--, i++)
- newLevels[i] = newLevels[i - 1];
- }
- else
- {
- int num;
- if (number == kTableLevel0Number)
- num = ReadBits(3) + 3;
- else if (number == kTableLevel0Number2)
- num = ReadBits(7) + 11;
- else
- return false;
- for (;num > 0 && i < numLevels; num--)
- newLevels[i++] = 0;
- }
- }
- }
- if (m_AudioMode)
- for (i = 0; i < m_NumChannels; i++)
- {
- RIF(m_MMDecoders[i].SetCodeLengths(&newLevels[i * kMMTableSize]));
- }
- else
- {
- RIF(m_MainDecoder.SetCodeLengths(&newLevels[0]));
- RIF(m_DistDecoder.SetCodeLengths(&newLevels[kMainTableSize]));
- RIF(m_LenDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize]));
- }
- memcpy(m_LastLevels, newLevels, kMaxTableSize);
- return true;
-}
-
-bool CDecoder::ReadLastTables()
-{
- // it differs a little from pure RAR sources;
- // UInt64 ttt = m_InBitStream.GetProcessedSize() + 2;
- // + 2 works for: return 0xFF; in CInBuffer::ReadByte.
- if (m_InBitStream.GetProcessedSize() + 7 <= m_PackSize) // test it: probably incorrect;
- // if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect;
- if (m_AudioMode)
- {
- UInt32 symbol = m_MMDecoders[m_MmFilter.CurrentChannel].DecodeSymbol(&m_InBitStream);
- if (symbol == 256)
- return ReadTables();
- if (symbol >= kMMTableSize)
- return false;
- }
- else
- {
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
- if (number == kReadTableNumber)
- return ReadTables();
- if (number >= kMainTableSize)
- return false;
- }
- return true;
-}
-
-class CCoderReleaser
-{
- CDecoder *m_Coder;
-public:
- CCoderReleaser(CDecoder *coder): m_Coder(coder) {}
- ~CCoderReleaser()
- {
- m_Coder->ReleaseStreams();
- }
-};
-
-bool CDecoder::DecodeMm(UInt32 pos)
-{
- while (pos-- > 0)
- {
- UInt32 symbol = m_MMDecoders[m_MmFilter.CurrentChannel].DecodeSymbol(&m_InBitStream);
- if (symbol == 256)
- return true;
- if (symbol >= kMMTableSize)
- return false;
- /*
- Byte byPredict = m_Predictor.Predict();
- Byte byReal = (Byte)(byPredict - (Byte)symbol);
- m_Predictor.Update(byReal, byPredict);
- */
- Byte byReal = m_MmFilter.Decode((Byte)symbol);
- m_OutWindowStream.PutByte(byReal);
- if (++m_MmFilter.CurrentChannel == m_NumChannels)
- m_MmFilter.CurrentChannel = 0;
- }
- return true;
-}
-
-bool CDecoder::DecodeLz(Int32 pos)
-{
- while (pos > 0)
- {
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
- UInt32 length, distance;
- if (number < 256)
- {
- m_OutWindowStream.PutByte(Byte(number));
- pos--;
- continue;
- }
- else if (number >= kMatchNumber)
- {
- number -= kMatchNumber;
- length = kNormalMatchMinLen + UInt32(kLenStart[number]) +
- m_InBitStream.ReadBits(kLenDirectBits[number]);
- number = m_DistDecoder.DecodeSymbol(&m_InBitStream);
- if (number >= kDistTableSize)
- return false;
- distance = kDistStart[number] + m_InBitStream.ReadBits(kDistDirectBits[number]);
- if (distance >= kDistLimit3)
- {
- length += 2 - ((distance - kDistLimit4) >> 31);
- // length++;
- // if (distance >= kDistLimit4)
- // length++;
- }
- }
- else if (number == kRepBothNumber)
- {
- length = m_LastLength;
- if (length == 0)
- return false;
- distance = m_RepDists[(m_RepDistPtr + 4 - 1) & 3];
- }
- else if (number < kLen2Number)
- {
- distance = m_RepDists[(m_RepDistPtr - (number - kRepNumber + 1)) & 3];
- number = m_LenDecoder.DecodeSymbol(&m_InBitStream);
- if (number >= kLenTableSize)
- return false;
- length = 2 + kLenStart[number] + m_InBitStream.ReadBits(kLenDirectBits[number]);
- if (distance >= kDistLimit2)
- {
- length++;
- if (distance >= kDistLimit3)
- {
- length += 2 - ((distance - kDistLimit4) >> 31);
- // length++;
- // if (distance >= kDistLimit4)
- // length++;
- }
- }
- }
- else if (number < kReadTableNumber)
- {
- number -= kLen2Number;
- distance = kLen2DistStarts[number] +
- m_InBitStream.ReadBits(kLen2DistDirectBits[number]);
- length = 2;
- }
- else if (number == kReadTableNumber)
- return true;
- else
- return false;
- m_RepDists[m_RepDistPtr++ & 3] = distance;
- m_LastLength = length;
- if (!m_OutWindowStream.CopyBlock(distance, length))
- return false;
- pos -= length;
- }
- return true;
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (inSize == NULL || outSize == NULL)
- return E_INVALIDARG;
-
- if (!m_OutWindowStream.Create(kHistorySize))
- return E_OUTOFMEMORY;
- if (!m_InBitStream.Create(1 << 20))
- return E_OUTOFMEMORY;
-
- m_PackSize = *inSize;
-
- UInt64 pos = 0, unPackSize = *outSize;
-
- m_OutWindowStream.SetStream(outStream);
- m_OutWindowStream.Init(m_IsSolid);
- m_InBitStream.SetStream(inStream);
- m_InBitStream.Init();
-
- CCoderReleaser coderReleaser(this);
- if (!m_IsSolid)
- {
- InitStructures();
- if (unPackSize == 0)
- {
- if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect;
- if (!ReadTables())
- return S_FALSE;
- return S_OK;
- }
- if (!ReadTables())
- return S_FALSE;
- }
-
- UInt64 startPos = m_OutWindowStream.GetProcessedSize();
- while(pos < unPackSize)
- {
- UInt32 blockSize = 1 << 20;
- if (blockSize > unPackSize - pos)
- blockSize = (UInt32)(unPackSize - pos);
- UInt64 blockStartPos = m_OutWindowStream.GetProcessedSize();
- if (m_AudioMode)
- {
- if (!DecodeMm(blockSize))
- return S_FALSE;
- }
- else
- {
- if (!DecodeLz((Int32)blockSize))
- return S_FALSE;
- }
- UInt64 globalPos = m_OutWindowStream.GetProcessedSize();
- pos = globalPos - blockStartPos;
- if (pos < blockSize)
- if (!ReadTables())
- return S_FALSE;
- pos = globalPos - startPos;
- if (progress != 0)
- {
- UInt64 packSize = m_InBitStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &pos));
- }
- }
- if (pos > unPackSize)
- return S_FALSE;
-
- if (!ReadLastTables())
- return S_FALSE;
- return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const CLzOutWindowException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size < 1)
- return E_INVALIDARG;
- m_IsSolid = (data[0] != 0);
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Rar2Decoder.h b/src/libs/7zip/win/CPP/7zip/Compress/Rar2Decoder.h
deleted file mode 100644
index 61a8b4dab..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Rar2Decoder.h
+++ /dev/null
@@ -1,174 +0,0 @@
-// Rar2Decoder.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#ifndef __COMPRESS_RAR2_DECODER_H
-#define __COMPRESS_RAR2_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NRar2 {
-
-const UInt32 kNumRepDists = 4;
-const UInt32 kDistTableSize = 48;
-
-const int kMMTableSize = 256 + 1;
-
-const UInt32 kMainTableSize = 298;
-const UInt32 kLenTableSize = 28;
-
-const UInt32 kDistTableStart = kMainTableSize;
-const UInt32 kLenTableStart = kDistTableStart + kDistTableSize;
-
-const UInt32 kHeapTablesSizesSum = kMainTableSize + kDistTableSize + kLenTableSize;
-
-const UInt32 kLevelTableSize = 19;
-
-const UInt32 kMMTablesSizesSum = kMMTableSize * 4;
-
-const UInt32 kMaxTableSize = kMMTablesSizesSum;
-
-const UInt32 kTableDirectLevels = 16;
-const UInt32 kTableLevelRepNumber = kTableDirectLevels;
-const UInt32 kTableLevel0Number = kTableLevelRepNumber + 1;
-const UInt32 kTableLevel0Number2 = kTableLevel0Number + 1;
-
-const UInt32 kLevelMask = 0xF;
-
-
-const UInt32 kRepBothNumber = 256;
-const UInt32 kRepNumber = kRepBothNumber + 1;
-const UInt32 kLen2Number = kRepNumber + 4;
-
-const UInt32 kLen2NumNumbers = 8;
-const UInt32 kReadTableNumber = kLen2Number + kLen2NumNumbers;
-const UInt32 kMatchNumber = kReadTableNumber + 1;
-
-const Byte kLenStart[kLenTableSize] = {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224};
-const Byte kLenDirectBits[kLenTableSize] = {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5};
-
-const UInt32 kDistStart[kDistTableSize] = {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768U,49152U,65536,98304,131072,196608,262144,327680,393216,458752,524288,589824,655360,720896,786432,851968,917504,983040};
-const Byte kDistDirectBits[kDistTableSize] = {0,0,0,0,1,1,2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16};
-
-const Byte kLevelDirectBits[kLevelTableSize] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7};
-
-const Byte kLen2DistStarts[kLen2NumNumbers]={0,4,8,16,32,64,128,192};
-const Byte kLen2DistDirectBits[kLen2NumNumbers]={2,2,3, 4, 5, 6, 6, 6};
-
-const UInt32 kDistLimit2 = 0x101 - 1;
-const UInt32 kDistLimit3 = 0x2000 - 1;
-const UInt32 kDistLimit4 = 0x40000 - 1;
-
-const UInt32 kMatchMaxLen = 255 + 2;
-const UInt32 kMatchMaxLenMax = 255 + 5;
-const UInt32 kNormalMatchMinLen = 3;
-
-namespace NMultimedia {
-
-struct CFilter
-{
- int K1,K2,K3,K4,K5;
- int D1,D2,D3,D4;
- int LastDelta;
- UInt32 Dif[11];
- UInt32 ByteCount;
- int LastChar;
-
- Byte Decode(int &channelDelta, Byte delta);
-
- void Init() { memset(this, 0, sizeof(*this)); }
-
-};
-
-const int kNumChanelsMax = 4;
-
-class CFilter2
-{
-public:
- CFilter m_Filters[kNumChanelsMax];
- int m_ChannelDelta;
- int CurrentChannel;
-
- void Init() { memset(this, 0, sizeof(*this)); }
- Byte Decode(Byte delta)
- {
- return m_Filters[CurrentChannel].Decode(m_ChannelDelta, delta);
- }
-
-};
-
-}
-
-typedef NBitm::CDecoder<CInBuffer> CBitDecoder;
-
-const int kNumHuffmanBits = 15;
-
-class CDecoder :
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public CMyUnknownImp
-{
- CLzOutWindow m_OutWindowStream;
- CBitDecoder m_InBitStream;
- NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kDistTableSize> m_DistDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kLenTableSize> m_LenDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kMMTableSize> m_MMDecoders[NMultimedia::kNumChanelsMax];
- NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
-
- bool m_AudioMode;
-
- NMultimedia::CFilter2 m_MmFilter;
- int m_NumChannels;
-
- UInt32 m_RepDists[kNumRepDists];
- UInt32 m_RepDistPtr;
-
- UInt32 m_LastLength;
-
- Byte m_LastLevels[kMaxTableSize];
-
- UInt64 m_PackSize;
- bool m_IsSolid;
-
- void InitStructures();
- UInt32 ReadBits(int numBits);
- bool ReadTables();
- bool ReadLastTables();
-
- bool DecodeMm(UInt32 pos);
- bool DecodeLz(Int32 pos);
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-public:
- CDecoder();
-
- MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
- void ReleaseStreams()
- {
- m_OutWindowStream.ReleaseStream();
- m_InBitStream.ReleaseStream();
- }
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Rar3Decoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/Rar3Decoder.cpp
deleted file mode 100644
index dde7c6de3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Rar3Decoder.cpp
+++ /dev/null
@@ -1,897 +0,0 @@
-// Rar3Decoder.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-/* This code uses Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "Rar3Decoder.h"
-
-namespace NCompress {
-namespace NRar3 {
-
-static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
-static void SzBigFree(void *, void *address) { BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-static const UInt32 kNumAlignReps = 15;
-
-static const UInt32 kSymbolReadTable = 256;
-static const UInt32 kSymbolRep = 259;
-static const UInt32 kSymbolLen2 = kSymbolRep + kNumReps;
-
-static const Byte kLenStart[kLenTableSize] = {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224};
-static const Byte kLenDirectBits[kLenTableSize] = {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5};
-
-static const Byte kDistDirectBits[kDistTableSize] =
- {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,
- 16,16,16,16,16,16,16,16,16,16,16,16,16,16,
- 18,18,18,18,18,18,18,18,18,18,18,18};
-
-static const Byte kLevelDirectBits[kLevelTableSize] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
-
-static const Byte kLen2DistStarts[kNumLen2Symbols]={0,4,8,16,32,64,128,192};
-static const Byte kLen2DistDirectBits[kNumLen2Symbols]={2,2,3, 4, 5, 6, 6, 6};
-
-static const UInt32 kDistLimit3 = 0x2000 - 2;
-static const UInt32 kDistLimit4 = 0x40000 - 2;
-
-static const UInt32 kNormalMatchMinLen = 3;
-
-static const UInt32 kVmDataSizeMax = 1 << 16;
-static const UInt32 kVmCodeSizeMax = 1 << 16;
-
-extern "C" {
-
-static UInt32 Range_GetThreshold(void *pp, UInt32 total)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- return p->Code / (p->Range /= total);
-}
-
-static void Range_Decode(void *pp, UInt32 start, UInt32 size)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- start *= p->Range;
- p->Low += start;
- p->Code -= start;
- p->Range *= size;
- p->Normalize();
-}
-
-static UInt32 Range_DecodeBit(void *pp, UInt32 size0)
-{
- CRangeDecoder *p = (CRangeDecoder *)pp;
- if (p->Code / (p->Range >>= 14) < size0)
- {
- Range_Decode(p, 0, size0);
- return 0;
- }
- else
- {
- Range_Decode(p, size0, (1 << 14) - size0);
- return 1;
- }
-}
-
-}
-
-CRangeDecoder::CRangeDecoder()
-{
- s.GetThreshold = Range_GetThreshold;
- s.Decode = Range_Decode;
- s.DecodeBit = Range_DecodeBit;
-}
-
-CDecoder::CDecoder():
- _window(0),
- _winPos(0),
- _wrPtr(0),
- _lzSize(0),
- _writtenFileSize(0),
- _vmData(0),
- _vmCode(0),
- m_IsSolid(false)
-{
- Ppmd7_Construct(&_ppmd);
-}
-
-CDecoder::~CDecoder()
-{
- InitFilters();
- ::MidFree(_vmData);
- ::MidFree(_window);
- Ppmd7_Free(&_ppmd, &g_BigAlloc);
-}
-
-HRESULT CDecoder::WriteDataToStream(const Byte *data, UInt32 size)
-{
- return WriteStream(_outStream, data, size);
-}
-
-HRESULT CDecoder::WriteData(const Byte *data, UInt32 size)
-{
- HRESULT res = S_OK;
- if (_writtenFileSize < _unpackSize)
- {
- UInt32 curSize = size;
- UInt64 remain = _unpackSize - _writtenFileSize;
- if (remain < curSize)
- curSize = (UInt32)remain;
- res = WriteDataToStream(data, curSize);
- }
- _writtenFileSize += size;
- return res;
-}
-
-HRESULT CDecoder::WriteArea(UInt32 startPtr, UInt32 endPtr)
-{
- if (startPtr <= endPtr)
- return WriteData(_window + startPtr, endPtr - startPtr);
- RINOK(WriteData(_window + startPtr, kWindowSize - startPtr));
- return WriteData(_window, endPtr);
-}
-
-void CDecoder::ExecuteFilter(int tempFilterIndex, NVm::CBlockRef &outBlockRef)
-{
- CTempFilter *tempFilter = _tempFilters[tempFilterIndex];
- tempFilter->InitR[6] = (UInt32)_writtenFileSize;
- NVm::SetValue32(&tempFilter->GlobalData[0x24], (UInt32)_writtenFileSize);
- NVm::SetValue32(&tempFilter->GlobalData[0x28], (UInt32)(_writtenFileSize >> 32));
- CFilter *filter = _filters[tempFilter->FilterIndex];
- _vm.Execute(filter, tempFilter, outBlockRef, filter->GlobalData);
- delete tempFilter;
- _tempFilters[tempFilterIndex] = 0;
-}
-
-HRESULT CDecoder::WriteBuf()
-{
- UInt32 writtenBorder = _wrPtr;
- UInt32 writeSize = (_winPos - writtenBorder) & kWindowMask;
- for (int i = 0; i < _tempFilters.Size(); i++)
- {
- CTempFilter *filter = _tempFilters[i];
- if (filter == NULL)
- continue;
- if (filter->NextWindow)
- {
- filter->NextWindow = false;
- continue;
- }
- UInt32 blockStart = filter->BlockStart;
- UInt32 blockSize = filter->BlockSize;
- if (((blockStart - writtenBorder) & kWindowMask) < writeSize)
- {
- if (writtenBorder != blockStart)
- {
- RINOK(WriteArea(writtenBorder, blockStart));
- writtenBorder = blockStart;
- writeSize = (_winPos - writtenBorder) & kWindowMask;
- }
- if (blockSize <= writeSize)
- {
- UInt32 blockEnd = (blockStart + blockSize) & kWindowMask;
- if (blockStart < blockEnd || blockEnd == 0)
- _vm.SetMemory(0, _window + blockStart, blockSize);
- else
- {
- UInt32 tailSize = kWindowSize - blockStart;
- _vm.SetMemory(0, _window + blockStart, tailSize);
- _vm.SetMemory(tailSize, _window, blockEnd);
- }
- NVm::CBlockRef outBlockRef;
- ExecuteFilter(i, outBlockRef);
- while (i + 1 < _tempFilters.Size())
- {
- CTempFilter *nextFilter = _tempFilters[i + 1];
- if (nextFilter == NULL || nextFilter->BlockStart != blockStart ||
- nextFilter->BlockSize != outBlockRef.Size || nextFilter->NextWindow)
- break;
- _vm.SetMemory(0, _vm.GetDataPointer(outBlockRef.Offset), outBlockRef.Size);
- ExecuteFilter(++i, outBlockRef);
- }
- WriteDataToStream(_vm.GetDataPointer(outBlockRef.Offset), outBlockRef.Size);
- _writtenFileSize += outBlockRef.Size;
- writtenBorder = blockEnd;
- writeSize = (_winPos - writtenBorder) & kWindowMask;
- }
- else
- {
- for (int j = i; j < _tempFilters.Size(); j++)
- {
- CTempFilter *filter = _tempFilters[j];
- if (filter != NULL && filter->NextWindow)
- filter->NextWindow = false;
- }
- _wrPtr = writtenBorder;
- return S_OK; // check it
- }
- }
- }
-
- _wrPtr = _winPos;
- return WriteArea(writtenBorder, _winPos);
-}
-
-void CDecoder::InitFilters()
-{
- _lastFilter = 0;
- int i;
- for (i = 0; i < _tempFilters.Size(); i++)
- delete _tempFilters[i];
- _tempFilters.Clear();
- for (i = 0; i < _filters.Size(); i++)
- delete _filters[i];
- _filters.Clear();
-}
-
-bool CDecoder::AddVmCode(UInt32 firstByte, UInt32 codeSize)
-{
- CMemBitDecoder inp;
- inp.Init(_vmData, codeSize);
-
- UInt32 filterIndex;
- if (firstByte & 0x80)
- {
- filterIndex = NVm::ReadEncodedUInt32(inp);
- if (filterIndex == 0)
- InitFilters();
- else
- filterIndex--;
- }
- else
- filterIndex = _lastFilter;
- if (filterIndex > (UInt32)_filters.Size())
- return false;
- _lastFilter = filterIndex;
- bool newFilter = (filterIndex == (UInt32)_filters.Size());
-
- CFilter *filter;
- if (newFilter)
- {
- // check if too many filters
- if (filterIndex > 1024)
- return false;
- filter = new CFilter;
- _filters.Add(filter);
- }
- else
- {
- filter = _filters[filterIndex];
- filter->ExecCount++;
- }
-
- int numEmptyItems = 0;
- int i;
- for (i = 0; i < _tempFilters.Size(); i++)
- {
- _tempFilters[i - numEmptyItems] = _tempFilters[i];
- if (_tempFilters[i] == NULL)
- numEmptyItems++;
- if (numEmptyItems > 0)
- _tempFilters[i] = NULL;
- }
- if (numEmptyItems == 0)
- {
- _tempFilters.Add(NULL);
- numEmptyItems = 1;
- }
- CTempFilter *tempFilter = new CTempFilter;
- _tempFilters[_tempFilters.Size() - numEmptyItems] = tempFilter;
- tempFilter->FilterIndex = filterIndex;
- tempFilter->ExecCount = filter->ExecCount;
-
- UInt32 blockStart = NVm::ReadEncodedUInt32(inp);
- if (firstByte & 0x40)
- blockStart += 258;
- tempFilter->BlockStart = (blockStart + _winPos) & kWindowMask;
- if (firstByte & 0x20)
- filter->BlockSize = NVm::ReadEncodedUInt32(inp);
- tempFilter->BlockSize = filter->BlockSize;
- tempFilter->NextWindow = _wrPtr != _winPos && ((_wrPtr - _winPos) & kWindowMask) <= blockStart;
-
- memset(tempFilter->InitR, 0, sizeof(tempFilter->InitR));
- tempFilter->InitR[3] = NVm::kGlobalOffset;
- tempFilter->InitR[4] = tempFilter->BlockSize;
- tempFilter->InitR[5] = tempFilter->ExecCount;
- if (firstByte & 0x10)
- {
- UInt32 initMask = inp.ReadBits(NVm::kNumGpRegs);
- for (int i = 0; i < NVm::kNumGpRegs; i++)
- if (initMask & (1 << i))
- tempFilter->InitR[i] = NVm::ReadEncodedUInt32(inp);
- }
- if (newFilter)
- {
- UInt32 vmCodeSize = NVm::ReadEncodedUInt32(inp);
- if (vmCodeSize >= kVmCodeSizeMax || vmCodeSize == 0)
- return false;
- for (UInt32 i = 0; i < vmCodeSize; i++)
- _vmCode[i] = (Byte)inp.ReadBits(8);
- _vm.PrepareProgram(_vmCode, vmCodeSize, filter);
- }
-
- tempFilter->AllocateEmptyFixedGlobal();
-
- Byte *globalData = &tempFilter->GlobalData[0];
- for (i = 0; i < NVm::kNumGpRegs; i++)
- NVm::SetValue32(&globalData[i * 4], tempFilter->InitR[i]);
- NVm::SetValue32(&globalData[NVm::NGlobalOffset::kBlockSize], tempFilter->BlockSize);
- NVm::SetValue32(&globalData[NVm::NGlobalOffset::kBlockPos], 0); // It was commented. why?
- NVm::SetValue32(&globalData[NVm::NGlobalOffset::kExecCount], tempFilter->ExecCount);
-
- if (firstByte & 8)
- {
- UInt32 dataSize = NVm::ReadEncodedUInt32(inp);
- if (dataSize > NVm::kGlobalSize - NVm::kFixedGlobalSize)
- return false;
- CRecordVector<Byte> &globalData = tempFilter->GlobalData;
- int requredSize = (int)(dataSize + NVm::kFixedGlobalSize);
- if (globalData.Size() < requredSize)
- {
- globalData.Reserve(requredSize);
- for (; globalData.Size() < requredSize; i++)
- globalData.Add(0);
- }
- for (UInt32 i = 0; i < dataSize; i++)
- globalData[NVm::kFixedGlobalSize + i] = (Byte)inp.ReadBits(8);
- }
- return true;
-}
-
-bool CDecoder::ReadVmCodeLZ()
-{
- UInt32 firstByte = ReadBits(8);
- UInt32 length = (firstByte & 7) + 1;
- if (length == 7)
- length = ReadBits(8) + 7;
- else if (length == 8)
- length = ReadBits(16);
- if (length > kVmDataSizeMax)
- return false;
- for (UInt32 i = 0; i < length; i++)
- _vmData[i] = (Byte)ReadBits(8);
- return AddVmCode(firstByte, length);
-}
-
-bool CDecoder::ReadVmCodePPM()
-{
- int firstByte = DecodePpmSymbol();
- if (firstByte < 0)
- return false;
- UInt32 length = (firstByte & 7) + 1;
- if (length == 7)
- {
- int b1 = DecodePpmSymbol();
- if (b1 < 0)
- return false;
- length = b1 + 7;
- }
- else if (length == 8)
- {
- int b1 = DecodePpmSymbol();
- if (b1 < 0)
- return false;
- int b2 = DecodePpmSymbol();
- if (b2 < 0)
- return false;
- length = b1 * 256 + b2;
- }
- if (length > kVmDataSizeMax)
- return false;
- for (UInt32 i = 0; i < length; i++)
- {
- int b = DecodePpmSymbol();
- if (b < 0)
- return false;
- _vmData[i] = (Byte)b;
- }
- return AddVmCode(firstByte, length);
-}
-
-#define RIF(x) { if (!(x)) return S_FALSE; }
-
-UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.bitDecoder.ReadBits(numBits); }
-
-/////////////////////////////////////////////////
-// PPM
-
-HRESULT CDecoder::InitPPM()
-{
- Byte maxOrder = (Byte)ReadBits(7);
-
- bool reset = ((maxOrder & 0x20) != 0);
- int maxMB = 0;
- if (reset)
- maxMB = (Byte)ReadBits(8);
- else
- {
- if (PpmError || !Ppmd7_WasAllocated(&_ppmd))
- return S_FALSE;
- }
- if (maxOrder & 0x40)
- PpmEscChar = (Byte)ReadBits(8);
- m_InBitStream.InitRangeCoder();
- /*
- if (m_InBitStream.m_BitPos != 0)
- return S_FALSE;
- */
- if (reset)
- {
- PpmError = true;
- maxOrder = (maxOrder & 0x1F) + 1;
- if (maxOrder > 16)
- maxOrder = 16 + (maxOrder - 16) * 3;
- if (maxOrder == 1)
- {
- Ppmd7_Free(&_ppmd, &g_BigAlloc);
- return S_FALSE;
- }
- if (!Ppmd7_Alloc(&_ppmd, (maxMB + 1) << 20, &g_BigAlloc))
- return E_OUTOFMEMORY;
- Ppmd7_Init(&_ppmd, maxOrder);
- PpmError = false;
- }
- return S_OK;
-}
-
-int CDecoder::DecodePpmSymbol() { return Ppmd7_DecodeSymbol(&_ppmd, &m_InBitStream.s); }
-
-HRESULT CDecoder::DecodePPM(Int32 num, bool &keepDecompressing)
-{
- keepDecompressing = false;
- if (PpmError)
- return S_FALSE;
- do
- {
- if (((_wrPtr - _winPos) & kWindowMask) < 260 && _wrPtr != _winPos)
- {
- RINOK(WriteBuf());
- if (_writtenFileSize > _unpackSize)
- {
- keepDecompressing = false;
- return S_OK;
- }
- }
- int c = DecodePpmSymbol();
- if (c < 0)
- {
- PpmError = true;
- return S_FALSE;
- }
- if (c == PpmEscChar)
- {
- int nextCh = DecodePpmSymbol();
- if (nextCh < 0)
- {
- PpmError = true;
- return S_FALSE;
- }
- if (nextCh == 0)
- return ReadTables(keepDecompressing);
- if (nextCh == 2 || nextCh == -1)
- return S_OK;
- if (nextCh == 3)
- {
- if (!ReadVmCodePPM())
- {
- PpmError = true;
- return S_FALSE;
- }
- continue;
- }
- if (nextCh == 4 || nextCh == 5)
- {
- UInt32 distance = 0;
- UInt32 length = 4;
- if (nextCh == 4)
- {
- for (int i = 0; i < 3; i++)
- {
- int c = DecodePpmSymbol();
- if (c < 0)
- {
- PpmError = true;
- return S_FALSE;
- }
- distance = (distance << 8) + (Byte)c;
- }
- distance++;
- length += 28;
- }
- int c = DecodePpmSymbol();
- if (c < 0)
- {
- PpmError = true;
- return S_FALSE;
- }
- length += c;
- if (distance >= _lzSize)
- return S_FALSE;
- CopyBlock(distance, length);
- num -= (Int32)length;
- continue;
- }
- }
- PutByte((Byte)c);
- num--;
- }
- while (num >= 0);
- keepDecompressing = true;
- return S_OK;
-}
-
-/////////////////////////////////////////////////
-// LZ
-
-HRESULT CDecoder::ReadTables(bool &keepDecompressing)
-{
- keepDecompressing = true;
- ReadBits((8 - m_InBitStream.bitDecoder.GetBitPosition()) & 7);
- if (ReadBits(1) != 0)
- {
- _lzMode = false;
- return InitPPM();
- }
-
- _lzMode = true;
- PrevAlignBits = 0;
- PrevAlignCount = 0;
-
- Byte levelLevels[kLevelTableSize];
- Byte newLevels[kTablesSizesSum];
-
- if (ReadBits(1) == 0)
- memset(m_LastLevels, 0, kTablesSizesSum);
-
- int i;
- for (i = 0; i < kLevelTableSize; i++)
- {
- UInt32 length = ReadBits(4);
- if (length == 15)
- {
- UInt32 zeroCount = ReadBits(4);
- if (zeroCount != 0)
- {
- zeroCount += 2;
- while (zeroCount-- > 0 && i < kLevelTableSize)
- levelLevels[i++]=0;
- i--;
- continue;
- }
- }
- levelLevels[i] = (Byte)length;
- }
- RIF(m_LevelDecoder.SetCodeLengths(levelLevels));
- i = 0;
- while (i < kTablesSizesSum)
- {
- UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
- if (number < 16)
- {
- newLevels[i] = Byte((number + m_LastLevels[i]) & 15);
- i++;
- }
- else if (number > kLevelTableSize)
- return S_FALSE;
- else
- {
- int num;
- if (((number - 16) & 1) == 0)
- num = ReadBits(3) + 3;
- else
- num = ReadBits(7) + 11;
- if (number < 18)
- {
- if (i == 0)
- return S_FALSE;
- for (; num > 0 && i < kTablesSizesSum; num--, i++)
- newLevels[i] = newLevels[i - 1];
- }
- else
- {
- for (; num > 0 && i < kTablesSizesSum; num--)
- newLevels[i++] = 0;
- }
- }
- }
- TablesRead = true;
-
- // original code has check here:
- /*
- if (InAddr > ReadTop)
- {
- keepDecompressing = false;
- return true;
- }
- */
-
- RIF(m_MainDecoder.SetCodeLengths(&newLevels[0]));
- RIF(m_DistDecoder.SetCodeLengths(&newLevels[kMainTableSize]));
- RIF(m_AlignDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize]));
- RIF(m_LenDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize + kAlignTableSize]));
-
- memcpy(m_LastLevels, newLevels, kTablesSizesSum);
- return S_OK;
-}
-
-class CCoderReleaser
-{
- CDecoder *m_Coder;
-public:
- CCoderReleaser(CDecoder *coder): m_Coder(coder) {}
- ~CCoderReleaser()
- {
- m_Coder->ReleaseStreams();
- }
-};
-
-HRESULT CDecoder::ReadEndOfBlock(bool &keepDecompressing)
-{
- if (ReadBits(1) != 0)
- {
- // old file
- TablesRead = false;
- return ReadTables(keepDecompressing);
- }
- // new file
- keepDecompressing = false;
- TablesRead = (ReadBits(1) == 0);
- return S_OK;
-}
-
-UInt32 kDistStart[kDistTableSize];
-
-class CDistInit
-{
-public:
- CDistInit() { Init(); }
- void Init()
- {
- UInt32 start = 0;
- for (UInt32 i = 0; i < kDistTableSize; i++)
- {
- kDistStart[i] = start;
- start += (1 << kDistDirectBits[i]);
- }
- }
-} g_DistInit;
-
-HRESULT CDecoder::DecodeLZ(bool &keepDecompressing)
-{
- UInt32 rep0 = _reps[0];
- UInt32 rep1 = _reps[1];
- UInt32 rep2 = _reps[2];
- UInt32 rep3 = _reps[3];
- UInt32 length = _lastLength;
- for (;;)
- {
- if (((_wrPtr - _winPos) & kWindowMask) < 260 && _wrPtr != _winPos)
- {
- RINOK(WriteBuf());
- if (_writtenFileSize > _unpackSize)
- {
- keepDecompressing = false;
- return S_OK;
- }
- }
- UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
- if (number < 256)
- {
- PutByte((Byte)number);
- continue;
- }
- else if (number == kSymbolReadTable)
- {
- RINOK(ReadEndOfBlock(keepDecompressing));
- break;
- }
- else if (number == 257)
- {
- if (!ReadVmCodeLZ())
- return S_FALSE;
- continue;
- }
- else if (number == 258)
- {
- if (length == 0)
- return S_FALSE;
- }
- else if (number < kSymbolRep + 4)
- {
- if (number != kSymbolRep)
- {
- UInt32 distance;
- if (number == kSymbolRep + 1)
- distance = rep1;
- else
- {
- if (number == kSymbolRep + 2)
- distance = rep2;
- else
- {
- distance = rep3;
- rep3 = rep2;
- }
- rep2 = rep1;
- }
- rep1 = rep0;
- rep0 = distance;
- }
-
- UInt32 number = m_LenDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
- if (number >= kLenTableSize)
- return S_FALSE;
- length = 2 + kLenStart[number] + m_InBitStream.bitDecoder.ReadBits(kLenDirectBits[number]);
- }
- else
- {
- rep3 = rep2;
- rep2 = rep1;
- rep1 = rep0;
- if (number < 271)
- {
- number -= 263;
- rep0 = kLen2DistStarts[number] + m_InBitStream.bitDecoder.ReadBits(kLen2DistDirectBits[number]);
- length = 2;
- }
- else if (number < 299)
- {
- number -= 271;
- length = kNormalMatchMinLen + (UInt32)kLenStart[number] + m_InBitStream.bitDecoder.ReadBits(kLenDirectBits[number]);
- UInt32 number = m_DistDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
- if (number >= kDistTableSize)
- return S_FALSE;
- rep0 = kDistStart[number];
- int numBits = kDistDirectBits[number];
- if (number >= (kNumAlignBits * 2) + 2)
- {
- if (numBits > kNumAlignBits)
- rep0 += (m_InBitStream.bitDecoder.ReadBits(numBits - kNumAlignBits) << kNumAlignBits);
- if (PrevAlignCount > 0)
- {
- PrevAlignCount--;
- rep0 += PrevAlignBits;
- }
- else
- {
- UInt32 number = m_AlignDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
- if (number < (1 << kNumAlignBits))
- {
- rep0 += number;
- PrevAlignBits = number;
- }
- else if (number == (1 << kNumAlignBits))
- {
- PrevAlignCount = kNumAlignReps;
- rep0 += PrevAlignBits;
- }
- else
- return S_FALSE;
- }
- }
- else
- rep0 += m_InBitStream.bitDecoder.ReadBits(numBits);
- length += ((kDistLimit4 - rep0) >> 31) + ((kDistLimit3 - rep0) >> 31);
- }
- else
- return S_FALSE;
- }
- if (rep0 >= _lzSize)
- return S_FALSE;
- CopyBlock(rep0, length);
- }
- _reps[0] = rep0;
- _reps[1] = rep1;
- _reps[2] = rep2;
- _reps[3] = rep3;
- _lastLength = length;
-
- return S_OK;
-}
-
-HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress)
-{
- _writtenFileSize = 0;
- if (!m_IsSolid)
- {
- _lzSize = 0;
- _winPos = 0;
- _wrPtr = 0;
- for (int i = 0; i < kNumReps; i++)
- _reps[i] = 0;
- _lastLength = 0;
- memset(m_LastLevels, 0, kTablesSizesSum);
- TablesRead = false;
- PpmEscChar = 2;
- PpmError = true;
- InitFilters();
- }
- if (!m_IsSolid || !TablesRead)
- {
- bool keepDecompressing;
- RINOK(ReadTables(keepDecompressing));
- if (!keepDecompressing)
- return S_OK;
- }
-
- for (;;)
- {
- bool keepDecompressing;
- if (_lzMode)
- {
- RINOK(DecodeLZ(keepDecompressing))
- }
- else
- {
- RINOK(DecodePPM(1 << 18, keepDecompressing))
- }
- UInt64 packSize = m_InBitStream.bitDecoder.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &_writtenFileSize));
- if (!keepDecompressing)
- break;
- }
- RINOK(WriteBuf());
- UInt64 packSize = m_InBitStream.bitDecoder.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &_writtenFileSize));
- if (_writtenFileSize < _unpackSize)
- return S_FALSE;
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try
- {
- if (inSize == NULL || outSize == NULL)
- return E_INVALIDARG;
-
- if (_vmData == 0)
- {
- _vmData = (Byte *)::MidAlloc(kVmDataSizeMax + kVmCodeSizeMax);
- if (_vmData == 0)
- return E_OUTOFMEMORY;
- _vmCode = _vmData + kVmDataSizeMax;
- }
-
- if (_window == 0)
- {
- _window = (Byte *)::MidAlloc(kWindowSize);
- if (_window == 0)
- return E_OUTOFMEMORY;
- }
- if (!m_InBitStream.bitDecoder.Create(1 << 20))
- return E_OUTOFMEMORY;
- if (!_vm.Create())
- return E_OUTOFMEMORY;
-
-
- m_InBitStream.bitDecoder.SetStream(inStream);
- m_InBitStream.bitDecoder.Init();
- _outStream = outStream;
-
- CCoderReleaser coderReleaser(this);
- _unpackSize = *outSize;
- return CodeReal(progress);
- }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
- // CNewException is possible here. But probably CNewException is caused
- // by error in data stream.
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size < 1)
- return E_INVALIDARG;
- m_IsSolid = (data[0] != 0);
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Rar3Decoder.h b/src/libs/7zip/win/CPP/7zip/Compress/Rar3Decoder.h
deleted file mode 100644
index 99b647dc7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Rar3Decoder.h
+++ /dev/null
@@ -1,267 +0,0 @@
-// Rar3Decoder.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-/* This code uses Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#ifndef __COMPRESS_RAR3_DECODER_H
-#define __COMPRESS_RAR3_DECODER_H
-
-#include "../../../C/Ppmd7.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "HuffmanDecoder.h"
-#include "Rar3Vm.h"
-
-namespace NCompress {
-namespace NRar3 {
-
-const UInt32 kWindowSize = 1 << 22;
-const UInt32 kWindowMask = (kWindowSize - 1);
-
-const UInt32 kNumReps = 4;
-const UInt32 kNumLen2Symbols = 8;
-const UInt32 kLenTableSize = 28;
-const UInt32 kMainTableSize = 256 + 1 + 1 + 1 + kNumReps + kNumLen2Symbols + kLenTableSize;
-const UInt32 kDistTableSize = 60;
-
-const int kNumAlignBits = 4;
-const UInt32 kAlignTableSize = (1 << kNumAlignBits) + 1;
-
-const UInt32 kLevelTableSize = 20;
-
-const UInt32 kTablesSizesSum = kMainTableSize + kDistTableSize + kAlignTableSize + kLenTableSize;
-
-class CBitDecoder
-{
- UInt32 m_Value;
- unsigned m_BitPos;
-public:
- CInBuffer m_Stream;
- bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
- void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream);}
- void ReleaseStream() { m_Stream.ReleaseStream();}
-
- void Init()
- {
- m_Stream.Init();
- m_BitPos = 0;
- m_Value = 0;
- }
-
- UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - (m_BitPos) / 8; }
- UInt32 GetBitPosition() const { return ((8 - m_BitPos) & 7); }
-
- UInt32 GetValue(unsigned numBits)
- {
- if (m_BitPos < numBits)
- {
- m_BitPos += 8;
- m_Value = (m_Value << 8) | m_Stream.ReadByte();
- if (m_BitPos < numBits)
- {
- m_BitPos += 8;
- m_Value = (m_Value << 8) | m_Stream.ReadByte();
- }
- }
- return m_Value >> (m_BitPos - numBits);
- }
-
- void MovePos(unsigned numBits)
- {
- m_BitPos -= numBits;
- m_Value = m_Value & ((1 << m_BitPos) - 1);
- }
-
- UInt32 ReadBits(unsigned numBits)
- {
- UInt32 res = GetValue(numBits);
- MovePos(numBits);
- return res;
- }
-};
-
-const UInt32 kTopValue = (1 << 24);
-const UInt32 kBot = (1 << 15);
-
-struct CRangeDecoder
-{
- IPpmd7_RangeDec s;
- UInt32 Range;
- UInt32 Code;
- UInt32 Low;
- CBitDecoder bitDecoder;
- SRes Res;
-
-public:
- void InitRangeCoder()
- {
- Code = 0;
- Low = 0;
- Range = 0xFFFFFFFF;
- for (int i = 0; i < 4; i++)
- Code = (Code << 8) | bitDecoder.ReadBits(8);
- }
-
- void Normalize()
- {
- while ((Low ^ (Low + Range)) < kTopValue ||
- Range < kBot && ((Range = (0 - Low) & (kBot - 1)), 1))
- {
- Code = (Code << 8) | bitDecoder.m_Stream.ReadByte();
- Range <<= 8;
- Low <<= 8;
- }
- }
-
- CRangeDecoder();
-};
-
-struct CFilter: public NVm::CProgram
-{
- CRecordVector<Byte> GlobalData;
- UInt32 BlockStart;
- UInt32 BlockSize;
- UInt32 ExecCount;
- CFilter(): BlockStart(0), BlockSize(0), ExecCount(0) {}
-};
-
-struct CTempFilter: public NVm::CProgramInitState
-{
- UInt32 BlockStart;
- UInt32 BlockSize;
- UInt32 ExecCount;
- bool NextWindow;
-
- UInt32 FilterIndex;
-};
-
-const int kNumHuffmanBits = 15;
-
-class CDecoder:
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public CMyUnknownImp
-{
- CRangeDecoder m_InBitStream;
- Byte *_window;
- UInt32 _winPos;
- UInt32 _wrPtr;
- UInt64 _lzSize;
- UInt64 _unpackSize;
- UInt64 _writtenFileSize; // if it's > _unpackSize, then _unpackSize only written
- CMyComPtr<ISequentialOutStream> _outStream;
- NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kDistTableSize> m_DistDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kAlignTableSize> m_AlignDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kLenTableSize> m_LenDecoder;
- NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
-
- UInt32 _reps[kNumReps];
- UInt32 _lastLength;
-
- Byte m_LastLevels[kTablesSizesSum];
-
- Byte *_vmData;
- Byte *_vmCode;
- NVm::CVm _vm;
- CRecordVector<CFilter *> _filters;
- CRecordVector<CTempFilter *> _tempFilters;
- UInt32 _lastFilter;
-
- bool m_IsSolid;
-
- bool _lzMode;
-
- UInt32 PrevAlignBits;
- UInt32 PrevAlignCount;
-
- bool TablesRead;
-
- CPpmd7 _ppmd;
- int PpmEscChar;
- bool PpmError;
-
- HRESULT WriteDataToStream(const Byte *data, UInt32 size);
- HRESULT WriteData(const Byte *data, UInt32 size);
- HRESULT WriteArea(UInt32 startPtr, UInt32 endPtr);
- void ExecuteFilter(int tempFilterIndex, NVm::CBlockRef &outBlockRef);
- HRESULT WriteBuf();
-
- void InitFilters();
- bool AddVmCode(UInt32 firstByte, UInt32 codeSize);
- bool ReadVmCodeLZ();
- bool ReadVmCodePPM();
-
- UInt32 ReadBits(int numBits);
-
- HRESULT InitPPM();
- int DecodePpmSymbol();
- HRESULT DecodePPM(Int32 num, bool &keepDecompressing);
-
- HRESULT ReadTables(bool &keepDecompressing);
- HRESULT ReadEndOfBlock(bool &keepDecompressing);
- HRESULT DecodeLZ(bool &keepDecompressing);
- HRESULT CodeReal(ICompressProgressInfo *progress);
-public:
- CDecoder();
- ~CDecoder();
-
- MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
- void ReleaseStreams()
- {
- _outStream.Release();
- m_InBitStream.bitDecoder.ReleaseStream();
- }
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
- void CopyBlock(UInt32 distance, UInt32 len)
- {
- _lzSize += len;
- UInt32 pos = (_winPos - distance - 1) & kWindowMask;
- Byte *window = _window;
- UInt32 winPos = _winPos;
- if (kWindowSize - winPos > len && kWindowSize - pos > len)
- {
- const Byte *src = window + pos;
- Byte *dest = window + winPos;
- _winPos += len;
- do
- *dest++ = *src++;
- while(--len != 0);
- return;
- }
- do
- {
- window[winPos] = window[pos];
- winPos = (winPos + 1) & kWindowMask;
- pos = (pos + 1) & kWindowMask;
- }
- while(--len != 0);
- _winPos = winPos;
- }
-
- void PutByte(Byte b)
- {
- _window[_winPos] = b;
- _winPos = (_winPos + 1) & kWindowMask;
- _lzSize++;
- }
-
-
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Rar3Vm.cpp b/src/libs/7zip/win/CPP/7zip/Compress/Rar3Vm.cpp
deleted file mode 100644
index 74051dd79..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Rar3Vm.cpp
+++ /dev/null
@@ -1,1091 +0,0 @@
-// Rar3Vm.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-/*
-Note:
- Due to performance considerations Rar VM may set Flags C incorrectly
- for some operands (SHL x, 0, ... ).
- Check implementation of concrete VM command
- to see if it sets flags right.
-*/
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/Alloc.h"
-
-#include "Rar3Vm.h"
-
-namespace NCompress {
-namespace NRar3 {
-
-UInt32 CMemBitDecoder::ReadBits(int numBits)
-{
- UInt32 res = 0;
- for (;;)
- {
- Byte b = _bitPos < _bitSize ? _data[_bitPos >> 3] : 0;
- int avail = (int)(8 - (_bitPos & 7));
- if (numBits <= avail)
- {
- _bitPos += numBits;
- return res | (b >> (avail - numBits)) & ((1 << numBits) - 1);
- }
- numBits -= avail;
- res |= (UInt32)(b & ((1 << avail) - 1)) << numBits;
- _bitPos += avail;
- }
-}
-
-UInt32 CMemBitDecoder::ReadBit() { return ReadBits(1); }
-
-namespace NVm {
-
-static const UInt32 kStackRegIndex = kNumRegs - 1;
-
-static const UInt32 FLAG_C = 1;
-static const UInt32 FLAG_Z = 2;
-static const UInt32 FLAG_S = 0x80000000;
-
-static const Byte CF_OP0 = 0;
-static const Byte CF_OP1 = 1;
-static const Byte CF_OP2 = 2;
-static const Byte CF_OPMASK = 3;
-static const Byte CF_BYTEMODE = 4;
-static const Byte CF_JUMP = 8;
-static const Byte CF_PROC = 16;
-static const Byte CF_USEFLAGS = 32;
-static const Byte CF_CHFLAGS = 64;
-
-static Byte kCmdFlags[]=
-{
- /* CMD_MOV */ CF_OP2 | CF_BYTEMODE,
- /* CMD_CMP */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_ADD */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_SUB */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_JZ */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JNZ */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_INC */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_DEC */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_JMP */ CF_OP1 | CF_JUMP,
- /* CMD_XOR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_AND */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_OR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_TEST */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_JS */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JNS */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JB */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JBE */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JA */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_JAE */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
- /* CMD_PUSH */ CF_OP1,
- /* CMD_POP */ CF_OP1,
- /* CMD_CALL */ CF_OP1 | CF_PROC,
- /* CMD_RET */ CF_OP0 | CF_PROC,
- /* CMD_NOT */ CF_OP1 | CF_BYTEMODE,
- /* CMD_SHL */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_SHR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_SAR */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_NEG */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,
- /* CMD_PUSHA */ CF_OP0,
- /* CMD_POPA */ CF_OP0,
- /* CMD_PUSHF */ CF_OP0 | CF_USEFLAGS,
- /* CMD_POPF */ CF_OP0 | CF_CHFLAGS,
- /* CMD_MOVZX */ CF_OP2,
- /* CMD_MOVSX */ CF_OP2,
- /* CMD_XCHG */ CF_OP2 | CF_BYTEMODE,
- /* CMD_MUL */ CF_OP2 | CF_BYTEMODE,
- /* CMD_DIV */ CF_OP2 | CF_BYTEMODE,
- /* CMD_ADC */ CF_OP2 | CF_BYTEMODE | CF_USEFLAGS | CF_CHFLAGS ,
- /* CMD_SBB */ CF_OP2 | CF_BYTEMODE | CF_USEFLAGS | CF_CHFLAGS ,
- /* CMD_PRINT */ CF_OP0
-};
-
-CVm::CVm(): Mem(NULL) {}
-
-bool CVm::Create()
-{
- if (Mem == NULL)
- Mem = (Byte *)::MyAlloc(kSpaceSize + 4);
- return (Mem != NULL);
-}
-
-CVm::~CVm()
-{
- ::MyFree(Mem);
-}
-
-// CVm::Execute can change CProgram object: it clears progarm if VM returns error.
-
-bool CVm::Execute(CProgram *prg, const CProgramInitState *initState,
- CBlockRef &outBlockRef, CRecordVector<Byte> &outGlobalData)
-{
- memcpy(R, initState->InitR, sizeof(initState->InitR));
- R[kStackRegIndex] = kSpaceSize;
- R[kNumRegs] = 0;
- Flags = 0;
-
- UInt32 globalSize = MyMin((UInt32)initState->GlobalData.Size(), kGlobalSize);
- if (globalSize != 0)
- memcpy(Mem + kGlobalOffset, &initState->GlobalData[0], globalSize);
- UInt32 staticSize = MyMin((UInt32)prg->StaticData.Size(), kGlobalSize - globalSize);
- if (staticSize != 0)
- memcpy(Mem + kGlobalOffset + globalSize, &prg->StaticData[0], staticSize);
-
- bool res = true;
- #ifdef RARVM_STANDARD_FILTERS
- if (prg->StandardFilterIndex >= 0)
- ExecuteStandardFilter(prg->StandardFilterIndex);
- else
- #endif
- {
- res = ExecuteCode(prg);
- if (!res)
- prg->Commands[0].OpCode = CMD_RET;
- }
- UInt32 newBlockPos = GetFixedGlobalValue32(NGlobalOffset::kBlockPos) & kSpaceMask;
- UInt32 newBlockSize = GetFixedGlobalValue32(NGlobalOffset::kBlockSize) & kSpaceMask;
- if (newBlockPos + newBlockSize >= kSpaceSize)
- newBlockPos = newBlockSize = 0;
- outBlockRef.Offset = newBlockPos;
- outBlockRef.Size = newBlockSize;
-
- outGlobalData.Clear();
- UInt32 dataSize = GetFixedGlobalValue32(NGlobalOffset::kGlobalMemOutSize);
- dataSize = MyMin(dataSize, kGlobalSize - kFixedGlobalSize);
- if (dataSize != 0)
- {
- dataSize += kFixedGlobalSize;
- outGlobalData.Reserve(dataSize);
- for (UInt32 i = 0; i < dataSize; i++)
- outGlobalData.Add(Mem[kGlobalOffset + i]);
- }
- return res;
-}
-
-
-#define SET_IP(IP) \
- if ((IP) >= numCommands) return true; \
- if (--maxOpCount <= 0) return false; \
- cmd = commands + (IP);
-
-#define GET_FLAG_S_B(res) (((res) & 0x80) ? FLAG_S : 0)
-#define SET_IP_OP1 { UInt32 val = GetOperand32(&cmd->Op1); SET_IP(val); }
-#define FLAGS_UPDATE_SZ Flags = res == 0 ? FLAG_Z : res & FLAG_S
-#define FLAGS_UPDATE_SZ_B Flags = (res & 0xFF) == 0 ? FLAG_Z : GET_FLAG_S_B(res)
-
-UInt32 CVm::GetOperand32(const COperand *op) const
-{
- switch(op->Type)
- {
- case OP_TYPE_REG: return R[op->Data];
- case OP_TYPE_REGMEM: return GetValue32(&Mem[(op->Base + R[op->Data]) & kSpaceMask]);
- default: return op->Data;
- }
-}
-
-void CVm::SetOperand32(const COperand *op, UInt32 val)
-{
- switch(op->Type)
- {
- case OP_TYPE_REG: R[op->Data] = val; return;
- case OP_TYPE_REGMEM: SetValue32(&Mem[(op->Base + R[op->Data]) & kSpaceMask], val); return;
- }
-}
-
-Byte CVm::GetOperand8(const COperand *op) const
-{
- switch(op->Type)
- {
- case OP_TYPE_REG: return (Byte)R[op->Data];
- case OP_TYPE_REGMEM: return Mem[(op->Base + R[op->Data]) & kSpaceMask];;
- default: return (Byte)op->Data;
- }
-}
-
-void CVm::SetOperand8(const COperand *op, Byte val)
-{
- switch(op->Type)
- {
- case OP_TYPE_REG: R[op->Data] = (R[op->Data] & 0xFFFFFF00) | val; return;
- case OP_TYPE_REGMEM: Mem[(op->Base + R[op->Data]) & kSpaceMask] = val; return;
- }
-}
-
-UInt32 CVm::GetOperand(bool byteMode, const COperand *op) const
-{
- if (byteMode)
- return GetOperand8(op);
- return GetOperand32(op);
-}
-
-void CVm::SetOperand(bool byteMode, const COperand *op, UInt32 val)
-{
- if (byteMode)
- SetOperand8(op, (Byte)(val & 0xFF));
- else
- SetOperand32(op, val);
-}
-
-bool CVm::ExecuteCode(const CProgram *prg)
-{
- Int32 maxOpCount = 25000000;
- const CCommand *commands = &prg->Commands[0];
- const CCommand *cmd = commands;
- UInt32 numCommands = prg->Commands.Size();
- for (;;)
- {
- switch(cmd->OpCode)
- {
- #ifndef RARVM_NO_VM
-
- case CMD_MOV:
- SetOperand32(&cmd->Op1, GetOperand32(&cmd->Op2));
- break;
- case CMD_MOVB:
- SetOperand8(&cmd->Op1, GetOperand8(&cmd->Op2));
- break;
- case CMD_CMP:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- UInt32 res = v1 - GetOperand32(&cmd->Op2);
- Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);
- }
- break;
- case CMD_CMPB:
- {
- Byte v1 = GetOperand8(&cmd->Op1);
- Byte res = v1 - GetOperand8(&cmd->Op2);
- res &= 0xFF;
- Flags = res == 0 ? FLAG_Z : (res > v1) | GET_FLAG_S_B(res);
- }
- break;
- case CMD_ADD:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- UInt32 res = v1 + GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- Flags = (res < v1) | (res == 0 ? FLAG_Z : (res & FLAG_S));
- }
- break;
- case CMD_ADDB:
- {
- Byte v1 = GetOperand8(&cmd->Op1);
- Byte res = v1 + GetOperand8(&cmd->Op2);
- res &= 0xFF;
- SetOperand8(&cmd->Op1, (Byte)res);
- Flags = (res < v1) | (res == 0 ? FLAG_Z : GET_FLAG_S_B(res));
- }
- break;
- case CMD_ADC:
- {
- UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);
- UInt32 FC = (Flags & FLAG_C);
- UInt32 res = v1 + GetOperand(cmd->ByteMode, &cmd->Op2) + FC;
- if (cmd->ByteMode)
- res &= 0xFF;
- SetOperand(cmd->ByteMode, &cmd->Op1, res);
- Flags = (res < v1 || res == v1 && FC) | (res == 0 ? FLAG_Z : (res & FLAG_S));
- }
- break;
- case CMD_SUB:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- UInt32 res = v1 - GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);
- }
- break;
- case CMD_SUBB:
- {
- UInt32 v1 = GetOperand8(&cmd->Op1);
- UInt32 res = v1 - GetOperand8(&cmd->Op2);
- SetOperand8(&cmd->Op1, (Byte)res);
- Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);
- }
- break;
- case CMD_SBB:
- {
- UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);
- UInt32 FC = (Flags & FLAG_C);
- UInt32 res = v1 - GetOperand(cmd->ByteMode, &cmd->Op2) - FC;
- // Flags = res == 0 ? FLAG_Z : (res > v1 || res == v1 && FC) | (res & FLAG_S);
- if (cmd->ByteMode)
- res &= 0xFF;
- SetOperand(cmd->ByteMode, &cmd->Op1, res);
- Flags = (res > v1 || res == v1 && FC) | (res == 0 ? FLAG_Z : (res & FLAG_S));
- }
- break;
- case CMD_INC:
- {
- UInt32 res = GetOperand32(&cmd->Op1) + 1;
- SetOperand32(&cmd->Op1, res);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_INCB:
- {
- Byte res = GetOperand8(&cmd->Op1) + 1;
- SetOperand8(&cmd->Op1, res);;
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_DEC:
- {
- UInt32 res = GetOperand32(&cmd->Op1) - 1;
- SetOperand32(&cmd->Op1, res);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_DECB:
- {
- Byte res = GetOperand8(&cmd->Op1) - 1;
- SetOperand8(&cmd->Op1, res);;
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_XOR:
- {
- UInt32 res = GetOperand32(&cmd->Op1) ^ GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_XORB:
- {
- Byte res = GetOperand8(&cmd->Op1) ^ GetOperand8(&cmd->Op2);
- SetOperand8(&cmd->Op1, res);
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_AND:
- {
- UInt32 res = GetOperand32(&cmd->Op1) & GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_ANDB:
- {
- Byte res = GetOperand8(&cmd->Op1) & GetOperand8(&cmd->Op2);
- SetOperand8(&cmd->Op1, res);
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_OR:
- {
- UInt32 res = GetOperand32(&cmd->Op1) | GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_ORB:
- {
- Byte res = GetOperand8(&cmd->Op1) | GetOperand8(&cmd->Op2);
- SetOperand8(&cmd->Op1, res);
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_TEST:
- {
- UInt32 res = GetOperand32(&cmd->Op1) & GetOperand32(&cmd->Op2);
- FLAGS_UPDATE_SZ;
- }
- break;
- case CMD_TESTB:
- {
- Byte res = GetOperand8(&cmd->Op1) & GetOperand8(&cmd->Op2);
- FLAGS_UPDATE_SZ_B;
- }
- break;
- case CMD_NOT:
- SetOperand(cmd->ByteMode, &cmd->Op1, ~GetOperand(cmd->ByteMode, &cmd->Op1));
- break;
- case CMD_NEG:
- {
- UInt32 res = 0 - GetOperand32(&cmd->Op1);
- SetOperand32(&cmd->Op1, res);
- Flags = res == 0 ? FLAG_Z : FLAG_C | (res & FLAG_S);
- }
- break;
- case CMD_NEGB:
- {
- Byte res = (Byte)(0 - GetOperand8(&cmd->Op1));
- SetOperand8(&cmd->Op1, res);
- Flags = res == 0 ? FLAG_Z : FLAG_C | GET_FLAG_S_B(res);
- }
- break;
-
- case CMD_SHL:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- int v2 = (int)GetOperand32(&cmd->Op2);
- UInt32 res = v1 << v2;
- SetOperand32(&cmd->Op1, res);
- Flags = (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 << (v2 - 1)) & 0x80000000 ? FLAG_C : 0);
- }
- break;
- case CMD_SHLB:
- {
- Byte v1 = GetOperand8(&cmd->Op1);
- int v2 = (int)GetOperand8(&cmd->Op2);
- Byte res = (Byte)(v1 << v2);
- SetOperand8(&cmd->Op1, res);
- Flags = (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 << (v2 - 1)) & 0x80 ? FLAG_C : 0);
- }
- break;
- case CMD_SHR:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- int v2 = (int)GetOperand32(&cmd->Op2);
- UInt32 res = v1 >> v2;
- SetOperand32(&cmd->Op1, res);
- Flags = (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 >> (v2 - 1)) & FLAG_C);
- }
- break;
- case CMD_SHRB:
- {
- Byte v1 = GetOperand8(&cmd->Op1);
- int v2 = (int)GetOperand8(&cmd->Op2);
- Byte res = (Byte)(v1 >> v2);
- SetOperand8(&cmd->Op1, res);
- Flags = (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 >> (v2 - 1)) & FLAG_C);
- }
- break;
- case CMD_SAR:
- {
- UInt32 v1 = GetOperand32(&cmd->Op1);
- int v2 = (int)GetOperand32(&cmd->Op2);
- UInt32 res = UInt32(((Int32)v1) >> v2);
- SetOperand32(&cmd->Op1, res);
- Flags= (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 >> (v2 - 1)) & FLAG_C);
- }
- break;
- case CMD_SARB:
- {
- Byte v1 = GetOperand8(&cmd->Op1);
- int v2 = (int)GetOperand8(&cmd->Op2);
- Byte res = (Byte)(((signed char)v1) >> v2);
- SetOperand8(&cmd->Op1, res);
- Flags= (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 >> (v2 - 1)) & FLAG_C);
- }
- break;
-
- case CMD_JMP:
- SET_IP_OP1;
- continue;
- case CMD_JZ:
- if ((Flags & FLAG_Z) != 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JNZ:
- if ((Flags & FLAG_Z) == 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JS:
- if ((Flags & FLAG_S) != 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JNS:
- if ((Flags & FLAG_S) == 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JB:
- if ((Flags & FLAG_C) != 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JBE:
- if ((Flags & (FLAG_C | FLAG_Z)) != 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JA:
- if ((Flags & (FLAG_C | FLAG_Z)) == 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
- case CMD_JAE:
- if ((Flags & FLAG_C) == 0)
- {
- SET_IP_OP1;
- continue;
- }
- break;
-
- case CMD_PUSH:
- R[kStackRegIndex] -= 4;
- SetValue32(&Mem[R[kStackRegIndex] & kSpaceMask], GetOperand32(&cmd->Op1));
- break;
- case CMD_POP:
- SetOperand32(&cmd->Op1, GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]));
- R[kStackRegIndex] += 4;
- break;
- case CMD_CALL:
- R[kStackRegIndex] -= 4;
- SetValue32(&Mem[R[kStackRegIndex] & kSpaceMask], (UInt32)(cmd - commands + 1));
- SET_IP_OP1;
- continue;
-
- case CMD_PUSHA:
- {
- for (UInt32 i = 0, SP = R[kStackRegIndex] - 4; i < kNumRegs; i++, SP -= 4)
- SetValue32(&Mem[SP & kSpaceMask], R[i]);
- R[kStackRegIndex] -= kNumRegs * 4;
- }
- break;
- case CMD_POPA:
- {
- for (UInt32 i = 0, SP = R[kStackRegIndex]; i < kNumRegs; i++, SP += 4)
- R[kStackRegIndex - i] = GetValue32(&Mem[SP & kSpaceMask]);
- }
- break;
- case CMD_PUSHF:
- R[kStackRegIndex] -= 4;
- SetValue32(&Mem[R[kStackRegIndex]&kSpaceMask], Flags);
- break;
- case CMD_POPF:
- Flags = GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]);
- R[kStackRegIndex] += 4;
- break;
-
- case CMD_MOVZX:
- SetOperand32(&cmd->Op1, GetOperand8(&cmd->Op2));
- break;
- case CMD_MOVSX:
- SetOperand32(&cmd->Op1, (UInt32)(Int32)(signed char)GetOperand8(&cmd->Op2));
- break;
- case CMD_XCHG:
- {
- UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);
- SetOperand(cmd->ByteMode, &cmd->Op1, GetOperand(cmd->ByteMode, &cmd->Op2));
- SetOperand(cmd->ByteMode, &cmd->Op2, v1);
- }
- break;
- case CMD_MUL:
- {
- UInt32 res = GetOperand32(&cmd->Op1) * GetOperand32(&cmd->Op2);
- SetOperand32(&cmd->Op1, res);
- }
- break;
- case CMD_MULB:
- {
- Byte res = GetOperand8(&cmd->Op1) * GetOperand8(&cmd->Op2);
- SetOperand8(&cmd->Op1, res);
- }
- break;
- case CMD_DIV:
- {
- UInt32 divider = GetOperand(cmd->ByteMode, &cmd->Op2);
- if (divider != 0)
- {
- UInt32 res = GetOperand(cmd->ByteMode, &cmd->Op1) / divider;
- SetOperand(cmd->ByteMode, &cmd->Op1, res);
- }
- }
- break;
-
- #endif
-
- case CMD_RET:
- {
- if (R[kStackRegIndex] >= kSpaceSize)
- return true;
- UInt32 ip = GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]);
- SET_IP(ip);
- R[kStackRegIndex] += 4;
- continue;
- }
- case CMD_PRINT:
- break;
- }
- cmd++;
- --maxOpCount;
- }
-}
-
-
-//////////////////////////////////////////////////////
-// Read program
-
-UInt32 ReadEncodedUInt32(CMemBitDecoder &inp)
-{
- switch(inp.ReadBits(2))
- {
- case 0:
- return inp.ReadBits(4);
- case 1:
- {
- UInt32 v = inp.ReadBits(4);
- if (v == 0)
- return 0xFFFFFF00 | inp.ReadBits(8);
- else
- return (v << 4) | inp.ReadBits(4);
- }
- case 2:
- return inp.ReadBits(16);
- default:
- return inp.ReadBits(32);
- }
-}
-
-void CVm::DecodeArg(CMemBitDecoder &inp, COperand &op, bool byteMode)
-{
- if (inp.ReadBit())
- {
- op.Type = OP_TYPE_REG;
- op.Data = inp.ReadBits(kNumRegBits);
- }
- else if (inp.ReadBit() == 0)
- {
- op.Type = OP_TYPE_INT;
- if (byteMode)
- op.Data = inp.ReadBits(8);
- else
- op.Data = ReadEncodedUInt32(inp);
- }
- else
- {
- op.Type = OP_TYPE_REGMEM;
- if (inp.ReadBit() == 0)
- {
- op.Data = inp.ReadBits(kNumRegBits);
- op.Base = 0;
- }
- else
- {
- if (inp.ReadBit() == 0)
- op.Data = inp.ReadBits(kNumRegBits);
- else
- op.Data = kNumRegs;
- op.Base = ReadEncodedUInt32(inp);
- }
- }
-}
-
-void CVm::ReadVmProgram(const Byte *code, UInt32 codeSize, CProgram *prg)
-{
- CMemBitDecoder inp;
- inp.Init(code, codeSize);
-
- prg->StaticData.Clear();
- if (inp.ReadBit())
- {
- UInt32 dataSize = ReadEncodedUInt32(inp) + 1;
- for (UInt32 i = 0; inp.Avail() && i < dataSize; i++)
- prg->StaticData.Add((Byte)inp.ReadBits(8));
- }
- while (inp.Avail())
- {
- prg->Commands.Add(CCommand());
- CCommand *cmd = &prg->Commands.Back();
- if (inp.ReadBit() == 0)
- cmd->OpCode = (ECommand)inp.ReadBits(3);
- else
- cmd->OpCode = (ECommand)(8 + inp.ReadBits(5));
- if (kCmdFlags[cmd->OpCode] & CF_BYTEMODE)
- cmd->ByteMode = (inp.ReadBit()) ? true : false;
- else
- cmd->ByteMode = 0;
- int opNum = (kCmdFlags[cmd->OpCode] & CF_OPMASK);
- if (opNum > 0)
- {
- DecodeArg(inp, cmd->Op1, cmd->ByteMode);
- if (opNum == 2)
- DecodeArg(inp, cmd->Op2, cmd->ByteMode);
- else
- {
- if (cmd->Op1.Type == OP_TYPE_INT && (kCmdFlags[cmd->OpCode] & (CF_JUMP | CF_PROC)))
- {
- int Distance = cmd->Op1.Data;
- if (Distance >= 256)
- Distance -= 256;
- else
- {
- if (Distance >= 136)
- Distance -= 264;
- else if (Distance >= 16)
- Distance -= 8;
- else if (Distance >= 8)
- Distance -= 16;
- Distance += prg->Commands.Size() - 1;
- }
- cmd->Op1.Data = Distance;
- }
- }
- }
- if (cmd->ByteMode)
- {
- switch (cmd->OpCode)
- {
- case CMD_MOV: cmd->OpCode = CMD_MOVB; break;
- case CMD_CMP: cmd->OpCode = CMD_CMPB; break;
- case CMD_ADD: cmd->OpCode = CMD_ADDB; break;
- case CMD_SUB: cmd->OpCode = CMD_SUBB; break;
- case CMD_INC: cmd->OpCode = CMD_INCB; break;
- case CMD_DEC: cmd->OpCode = CMD_DECB; break;
- case CMD_XOR: cmd->OpCode = CMD_XORB; break;
- case CMD_AND: cmd->OpCode = CMD_ANDB; break;
- case CMD_OR: cmd->OpCode = CMD_ORB; break;
- case CMD_TEST: cmd->OpCode = CMD_TESTB; break;
- case CMD_NEG: cmd->OpCode = CMD_NEGB; break;
- case CMD_SHL: cmd->OpCode = CMD_SHLB; break;
- case CMD_SHR: cmd->OpCode = CMD_SHRB; break;
- case CMD_SAR: cmd->OpCode = CMD_SARB; break;
- case CMD_MUL: cmd->OpCode = CMD_MULB; break;
- }
- }
- }
-}
-
-#ifdef RARVM_STANDARD_FILTERS
-
-enum EStandardFilter
-{
- SF_E8,
- SF_E8E9,
- SF_ITANIUM,
- SF_RGB,
- SF_AUDIO,
- SF_DELTA,
- SF_UPCASE
-};
-
-struct StandardFilterSignature
-{
- UInt32 Length;
- UInt32 CRC;
- EStandardFilter Type;
-}
-kStdFilters[]=
-{
- { 53, 0xad576887, SF_E8 },
- { 57, 0x3cd7e57e, SF_E8E9 },
- { 120, 0x3769893f, SF_ITANIUM },
- { 29, 0x0e06077d, SF_DELTA },
- { 149, 0x1c2c5dc8, SF_RGB },
- { 216, 0xbc85e701, SF_AUDIO },
- { 40, 0x46b9c560, SF_UPCASE }
-};
-
-static int FindStandardFilter(const Byte *code, UInt32 codeSize)
-{
- UInt32 crc = CrcCalc(code, codeSize);
- for (int i = 0; i < sizeof(kStdFilters) / sizeof(kStdFilters[0]); i++)
- {
- StandardFilterSignature &sfs = kStdFilters[i];
- if (sfs.CRC == crc && sfs.Length == codeSize)
- return i;
- }
- return -1;
-}
-
-#endif
-
-void CVm::PrepareProgram(const Byte *code, UInt32 codeSize, CProgram *prg)
-{
- Byte xorSum = 0;
- for (UInt32 i = 1; i < codeSize; i++)
- xorSum ^= code[i];
-
- prg->Commands.Clear();
- #ifdef RARVM_STANDARD_FILTERS
- prg->StandardFilterIndex = -1;
- #endif
-
- if (xorSum == code[0] && codeSize > 0)
- {
- #ifdef RARVM_STANDARD_FILTERS
- prg->StandardFilterIndex = FindStandardFilter(code, codeSize);
- if (prg->StandardFilterIndex >= 0)
- return;
- #endif
- // 1 byte for checksum
- ReadVmProgram(code + 1, codeSize - 1, prg);
- }
- prg->Commands.Add(CCommand());
- CCommand *cmd = &prg->Commands.Back();
- cmd->OpCode = CMD_RET;
-}
-
-void CVm::SetMemory(UInt32 pos, const Byte *data, UInt32 dataSize)
-{
- if (pos < kSpaceSize && data != Mem + pos)
- memmove(Mem + pos, data, MyMin(dataSize, kSpaceSize - pos));
-}
-
-#ifdef RARVM_STANDARD_FILTERS
-
-static void E8E9Decode(Byte *data, UInt32 dataSize, UInt32 fileOffset, bool e9)
-{
- if (dataSize <= 4)
- return;
- dataSize -= 4;
- const UInt32 kFileSize = 0x1000000;
- Byte cmpByte2 = (e9 ? 0xE9 : 0xE8);
- for (UInt32 curPos = 0; curPos < dataSize;)
- {
- Byte curByte = *(data++);
- curPos++;
- if (curByte == 0xE8 || curByte == cmpByte2)
- {
- UInt32 offset = curPos + fileOffset;
- UInt32 addr = (Int32)GetValue32(data);
- if (addr < kFileSize)
- SetValue32(data, addr - offset);
- else if ((Int32)addr < 0 && (Int32)(addr + offset) >= 0)
- SetValue32(data, addr + kFileSize);
- data += 4;
- curPos += 4;
- }
- }
-}
-
-static inline UInt32 ItaniumGetOpType(const Byte *data, int bitPos)
-{
- return (data[(unsigned int)bitPos >> 3] >> (bitPos & 7)) & 0xF;
-}
-
-
-static void ItaniumDecode(Byte *data, UInt32 dataSize, UInt32 fileOffset)
-{
- UInt32 curPos = 0;
- fileOffset >>= 4;
- while (curPos < dataSize - 21)
- {
- int b = (data[0] & 0x1F) - 0x10;
- if (b >= 0)
- {
- static Byte kCmdMasks[16] = {4,4,6,6,0,0,7,7,4,4,0,0,4,4,0,0};
- Byte cmdMask = kCmdMasks[b];
- if (cmdMask != 0)
- for (int i = 0; i < 3; i++)
- if (cmdMask & (1 << i))
- {
- int startPos = i * 41 + 18;
- if (ItaniumGetOpType(data, startPos + 24) == 5)
- {
- const UInt32 kMask = 0xFFFFF;
- Byte *p = data + ((unsigned int)startPos >> 3);
- UInt32 bitField = ((UInt32)p[0]) | ((UInt32)p[1] << 8) | ((UInt32)p[2] << 16);
- int inBit = (startPos & 7);
- UInt32 offset = (bitField >> inBit) & kMask;
- UInt32 andMask = ~(kMask << inBit);
- bitField = ((offset - fileOffset) & kMask) << inBit;
- for (int j = 0; j < 3; j++)
- {
- p[j] &= andMask;
- p[j] |= bitField;
- andMask >>= 8;
- bitField >>= 8;
- }
- }
- }
- }
- data += 16;
- curPos += 16;
- fileOffset++;
- }
-}
-
-static void DeltaDecode(Byte *data, UInt32 dataSize, UInt32 numChannels)
-{
- UInt32 srcPos = 0;
- UInt32 border = dataSize * 2;
- for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)
- {
- Byte prevByte = 0;
- for (UInt32 destPos = dataSize + curChannel; destPos < border; destPos += numChannels)
- data[destPos] = (prevByte = prevByte - data[srcPos++]);
- }
-}
-
-static void RgbDecode(Byte *srcData, UInt32 dataSize, UInt32 width, UInt32 posR)
-{
- Byte *destData = srcData + dataSize;
- const UInt32 numChannels = 3;
- for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)
- {
- Byte prevByte = 0;
-
- for (UInt32 i = curChannel; i < dataSize; i+= numChannels)
- {
- unsigned int predicted;
- if (i < width)
- predicted = prevByte;
- else
- {
- unsigned int upperLeftByte = destData[i - width];
- unsigned int upperByte = destData[i - width + 3];
- predicted = prevByte + upperByte - upperLeftByte;
- int pa = abs((int)(predicted - prevByte));
- int pb = abs((int)(predicted - upperByte));
- int pc = abs((int)(predicted - upperLeftByte));
- if (pa <= pb && pa <= pc)
- predicted = prevByte;
- else
- if (pb <= pc)
- predicted = upperByte;
- else
- predicted = upperLeftByte;
- }
- destData[i] = prevByte = (Byte)(predicted - *(srcData++));
- }
- }
- if (dataSize < 3)
- return;
- for (UInt32 i = posR, border = dataSize - 2; i < border; i += 3)
- {
- Byte g = destData[i + 1];
- destData[i] = destData[i] + g;
- destData[i + 2] = destData[i + 2] + g;
- }
-}
-
-static void AudioDecode(Byte *srcData, UInt32 dataSize, UInt32 numChannels)
-{
- Byte *destData = srcData + dataSize;
- for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)
- {
- UInt32 prevByte = 0, prevDelta = 0, dif[7];
- Int32 D1 = 0, D2 = 0, D3;
- Int32 K1 = 0, K2 = 0, K3 = 0;
- memset(dif, 0, sizeof(dif));
-
- for (UInt32 i = curChannel, byteCount = 0; i < dataSize; i += numChannels, byteCount++)
- {
- D3 = D2;
- D2 = prevDelta - D1;
- D1 = prevDelta;
-
- UInt32 predicted = 8 * prevByte + K1 * D1 + K2 * D2 + K3 * D3;
- predicted = (predicted >> 3) & 0xFF;
-
- UInt32 curByte = *(srcData++);
-
- predicted -= curByte;
- destData[i] = (Byte)predicted;
- prevDelta = (UInt32)(Int32)(signed char)(predicted - prevByte);
- prevByte = predicted;
-
- Int32 D = ((Int32)(signed char)curByte) << 3;
-
- dif[0] += abs(D);
- dif[1] += abs(D - D1);
- dif[2] += abs(D + D1);
- dif[3] += abs(D - D2);
- dif[4] += abs(D + D2);
- dif[5] += abs(D - D3);
- dif[6] += abs(D + D3);
-
- if ((byteCount & 0x1F) == 0)
- {
- UInt32 minDif = dif[0], numMinDif = 0;
- dif[0] = 0;
- for (int j = 1; j < sizeof(dif) / sizeof(dif[0]); j++)
- {
- if (dif[j] < minDif)
- {
- minDif = dif[j];
- numMinDif = j;
- }
- dif[j] = 0;
- }
- switch (numMinDif)
- {
- case 1: if (K1 >= -16) K1--; break;
- case 2: if (K1 < 16) K1++; break;
- case 3: if (K2 >= -16) K2--; break;
- case 4: if (K2 < 16) K2++; break;
- case 5: if (K3 >= -16) K3--; break;
- case 6: if (K3 < 16) K3++; break;
- }
- }
- }
- }
-}
-
-static UInt32 UpCaseDecode(Byte *data, UInt32 dataSize)
-{
- UInt32 srcPos = 0, destPos = dataSize;
- while (srcPos < dataSize)
- {
- Byte curByte = data[srcPos++];
- if (curByte == 2 && (curByte = data[srcPos++]) != 2)
- curByte -= 32;
- data[destPos++] = curByte;
- }
- return destPos - dataSize;
-}
-
-void CVm::ExecuteStandardFilter(int filterIndex)
-{
- UInt32 dataSize = R[4];
- if (dataSize >= kGlobalOffset)
- return;
- EStandardFilter filterType = kStdFilters[filterIndex].Type;
-
- switch (filterType)
- {
- case SF_E8:
- case SF_E8E9:
- E8E9Decode(Mem, dataSize, R[6], (filterType == SF_E8E9));
- break;
- case SF_ITANIUM:
- ItaniumDecode(Mem, dataSize, R[6]);
- break;
- case SF_DELTA:
- if (dataSize >= kGlobalOffset / 2)
- break;
- SetBlockPos(dataSize);
- DeltaDecode(Mem, dataSize, R[0]);
- break;
- case SF_RGB:
- if (dataSize >= kGlobalOffset / 2)
- break;
- {
- UInt32 width = R[0];
- if (width <= 3)
- break;
- SetBlockPos(dataSize);
- RgbDecode(Mem, dataSize, width, R[1]);
- }
- break;
- case SF_AUDIO:
- if (dataSize >= kGlobalOffset / 2)
- break;
- SetBlockPos(dataSize);
- AudioDecode(Mem, dataSize, R[0]);
- break;
- case SF_UPCASE:
- if (dataSize >= kGlobalOffset / 2)
- break;
- UInt32 destSize = UpCaseDecode(Mem, dataSize);
- SetBlockSize(destSize);
- SetBlockPos(dataSize);
- break;
- }
-}
-
-#endif
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Rar3Vm.h b/src/libs/7zip/win/CPP/7zip/Compress/Rar3Vm.h
deleted file mode 100644
index c02534c61..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Rar3Vm.h
+++ /dev/null
@@ -1,179 +0,0 @@
-// Rar3Vm.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#ifndef __COMPRESS_RAR3_VM_H
-#define __COMPRESS_RAR3_VM_H
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/MyVector.h"
-#include "Common/Types.h"
-
-#define RARVM_STANDARD_FILTERS
-
-namespace NCompress {
-namespace NRar3 {
-
-class CMemBitDecoder
-{
- const Byte *_data;
- UInt32 _bitSize;
- UInt32 _bitPos;
-public:
- void Init(const Byte *data, UInt32 byteSize)
- {
- _data = data;
- _bitSize = (byteSize << 3);
- _bitPos = 0;
- }
- UInt32 ReadBits(int numBits);
- UInt32 ReadBit();
- bool Avail() const { return (_bitPos < _bitSize); }
-};
-
-namespace NVm {
-
-inline UInt32 GetValue32(const void *addr) { return GetUi32(addr); }
-inline void SetValue32(void *addr, UInt32 value) { SetUi32(addr, value); }
-
-UInt32 ReadEncodedUInt32(CMemBitDecoder &inp);
-
-const int kNumRegBits = 3;
-const UInt32 kNumRegs = 1 << kNumRegBits;
-const UInt32 kNumGpRegs = kNumRegs - 1;
-
-const UInt32 kSpaceSize = 0x40000;
-const UInt32 kSpaceMask = kSpaceSize -1;
-const UInt32 kGlobalOffset = 0x3C000;
-const UInt32 kGlobalSize = 0x2000;
-const UInt32 kFixedGlobalSize = 64;
-
-namespace NGlobalOffset
-{
- const UInt32 kBlockSize = 0x1C;
- const UInt32 kBlockPos = 0x20;
- const UInt32 kExecCount = 0x2C;
- const UInt32 kGlobalMemOutSize = 0x30;
-}
-
-enum ECommand
-{
- CMD_MOV, CMD_CMP, CMD_ADD, CMD_SUB, CMD_JZ, CMD_JNZ, CMD_INC, CMD_DEC,
- CMD_JMP, CMD_XOR, CMD_AND, CMD_OR, CMD_TEST, CMD_JS, CMD_JNS, CMD_JB,
- CMD_JBE, CMD_JA, CMD_JAE, CMD_PUSH, CMD_POP, CMD_CALL, CMD_RET, CMD_NOT,
- CMD_SHL, CMD_SHR, CMD_SAR, CMD_NEG, CMD_PUSHA,CMD_POPA, CMD_PUSHF,CMD_POPF,
- CMD_MOVZX,CMD_MOVSX,CMD_XCHG, CMD_MUL, CMD_DIV, CMD_ADC, CMD_SBB, CMD_PRINT,
-
- CMD_MOVB, CMD_CMPB, CMD_ADDB, CMD_SUBB, CMD_INCB, CMD_DECB,
- CMD_XORB, CMD_ANDB, CMD_ORB, CMD_TESTB,CMD_NEGB,
- CMD_SHLB, CMD_SHRB, CMD_SARB, CMD_MULB
-};
-
-enum EOpType {OP_TYPE_REG, OP_TYPE_INT, OP_TYPE_REGMEM, OP_TYPE_NONE};
-
-// Addr in COperand object can link (point) to CVm object!!!
-
-struct COperand
-{
- EOpType Type;
- UInt32 Data;
- UInt32 Base;
- COperand(): Type(OP_TYPE_NONE), Data(0), Base(0) {}
-};
-
-struct CCommand
-{
- ECommand OpCode;
- bool ByteMode;
- COperand Op1, Op2;
-};
-
-struct CBlockRef
-{
- UInt32 Offset;
- UInt32 Size;
-};
-
-struct CProgram
-{
- CRecordVector<CCommand> Commands;
- #ifdef RARVM_STANDARD_FILTERS
- int StandardFilterIndex;
- #endif
- CRecordVector<Byte> StaticData;
-};
-
-struct CProgramInitState
-{
- UInt32 InitR[kNumGpRegs];
- CRecordVector<Byte> GlobalData;
-
- void AllocateEmptyFixedGlobal()
- {
- GlobalData.Clear();
- GlobalData.Reserve(NVm::kFixedGlobalSize);
- for (UInt32 i = 0; i < NVm::kFixedGlobalSize; i++)
- GlobalData.Add(0);
- }
-};
-
-class CVm
-{
- static UInt32 GetValue(bool byteMode, const void *addr)
- {
- if (byteMode)
- return(*(const Byte *)addr);
- else
- return GetUi32(addr);
- }
-
- static void SetValue(bool byteMode, void *addr, UInt32 value)
- {
- if (byteMode)
- *(Byte *)addr = (Byte)value;
- else
- SetUi32(addr, value);
- }
-
- UInt32 GetFixedGlobalValue32(UInt32 globalOffset) { return GetValue(false, &Mem[kGlobalOffset + globalOffset]); }
-
- void SetBlockSize(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockSize], v); }
- void SetBlockPos(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockPos], v); }
-public:
- static void SetValue(void *addr, UInt32 value) { SetValue(false, addr, value); }
-private:
- UInt32 GetOperand32(const COperand *op) const;
- void SetOperand32(const COperand *op, UInt32 val);
- Byte GetOperand8(const COperand *op) const;
- void SetOperand8(const COperand *op, Byte val);
- UInt32 GetOperand(bool byteMode, const COperand *op) const;
- void SetOperand(bool byteMode, const COperand *op, UInt32 val);
-
- void DecodeArg(CMemBitDecoder &inp, COperand &op, bool byteMode);
-
- bool ExecuteCode(const CProgram *prg);
-
- #ifdef RARVM_STANDARD_FILTERS
- void ExecuteStandardFilter(int filterIndex);
- #endif
-
- Byte *Mem;
- UInt32 R[kNumRegs + 1]; // R[kNumRegs] = 0 always (speed optimization)
- UInt32 Flags;
- void ReadVmProgram(const Byte *code, UInt32 codeSize, CProgram *prg);
-public:
- CVm();
- ~CVm();
- bool Create();
- void PrepareProgram(const Byte *code, UInt32 codeSize, CProgram *prg);
- void SetMemory(UInt32 pos, const Byte *data, UInt32 dataSize);
- bool Execute(CProgram *prg, const CProgramInitState *initState,
- CBlockRef &outBlockRef, CRecordVector<Byte> &outGlobalData);
- const Byte *GetDataPointer(UInt32 offset) const { return Mem + offset; }
-
-};
-
-#endif
-
-}}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/RarCodecsRegister.cpp b/src/libs/7zip/win/CPP/7zip/Compress/RarCodecsRegister.cpp
deleted file mode 100644
index e3f6a05c4..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/RarCodecsRegister.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// RarCodecsRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "Rar1Decoder.h"
-#include "Rar2Decoder.h"
-#include "Rar3Decoder.h"
-
-#define CREATE_CODEC(x) static void *CreateCodec ## x() { return (void *)(ICompressCoder *)(new NCompress::NRar ## x::CDecoder); }
-
-CREATE_CODEC(1)
-CREATE_CODEC(2)
-CREATE_CODEC(3)
-
-#define RAR_CODEC(x, name) { CreateCodec ## x, 0, 0x040300 + x, L"Rar" name, 1, false }
-
-static CCodecInfo g_CodecsInfo[] =
-{
- RAR_CODEC(1, L"1"),
- RAR_CODEC(2, L"2"),
- RAR_CODEC(3, L"3"),
-};
-
-REGISTER_CODECS(Rar)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ShrinkDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/ShrinkDecoder.cpp
deleted file mode 100644
index a89d323c6..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ShrinkDecoder.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-// ShrinkDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/OutBuffer.h"
-
-#include "BitlDecoder.h"
-#include "ShrinkDecoder.h"
-
-namespace NCompress {
-namespace NShrink {
-
-static const UInt32 kBufferSize = (1 << 20);
-static const int kNumMinBits = 9;
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- NBitl::CBaseDecoder<CInBuffer> inBuffer;
- COutBuffer outBuffer;
-
- if (!inBuffer.Create(kBufferSize))
- return E_OUTOFMEMORY;
- inBuffer.SetStream(inStream);
- inBuffer.Init();
-
- if (!outBuffer.Create(kBufferSize))
- return E_OUTOFMEMORY;
- outBuffer.SetStream(outStream);
- outBuffer.Init();
-
- UInt64 prevPos = 0;
- int numBits = kNumMinBits;
- UInt32 head = 257;
- bool needPrev = false;
- UInt32 lastSymbol = 0;
-
- int i;
- for (i = 0; i < kNumItems; i++)
- _parents[i] = 0;
- for (i = 0; i < kNumItems; i++)
- _suffixes[i] = 0;
- for (i = 0; i < 257; i++)
- _isFree[i] = false;
- for (; i < kNumItems; i++)
- _isFree[i] = true;
-
- for (;;)
- {
- UInt32 symbol = inBuffer.ReadBits(numBits);
- if (inBuffer.ExtraBitsWereRead())
- break;
- if (_isFree[symbol])
- return S_FALSE;
- if (symbol == 256)
- {
- UInt32 symbol = inBuffer.ReadBits(numBits);
- if (symbol == 1)
- {
- if (numBits < kNumMaxBits)
- numBits++;
- }
- else if (symbol == 2)
- {
- if (needPrev)
- _isFree[head - 1] = true;
- for (i = 257; i < kNumItems; i++)
- _isParent[i] = false;
- for (i = 257; i < kNumItems; i++)
- if (!_isFree[i])
- _isParent[_parents[i]] = true;
- for (i = 257; i < kNumItems; i++)
- if (!_isParent[i])
- _isFree[i] = true;
- head = 257;
- while (head < kNumItems && !_isFree[head])
- head++;
- if (head < kNumItems)
- {
- needPrev = true;
- _isFree[head] = false;
- _parents[head] = (UInt16)lastSymbol;
- head++;
- }
- }
- else
- return S_FALSE;
- continue;
- }
- UInt32 cur = symbol;
- i = 0;
- int corectionIndex = -1;
- while (cur >= 256)
- {
- if (cur == head - 1)
- corectionIndex = i;
- _stack[i++] = _suffixes[cur];
- cur = _parents[cur];
- }
- _stack[i++] = (Byte)cur;
- if (needPrev)
- {
- _suffixes[head - 1] = (Byte)cur;
- if (corectionIndex >= 0)
- _stack[corectionIndex] = (Byte)cur;
- }
- while (i > 0)
- outBuffer.WriteByte((_stack[--i]));
- while (head < kNumItems && !_isFree[head])
- head++;
- if (head < kNumItems)
- {
- needPrev = true;
- _isFree[head] = false;
- _parents[head] = (UInt16)symbol;
- head++;
- }
- else
- needPrev = false;
- lastSymbol = symbol;
-
- UInt64 nowPos = outBuffer.GetProcessedSize();
- if (progress != NULL && nowPos - prevPos > (1 << 18))
- {
- prevPos = nowPos;
- UInt64 packSize = inBuffer.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &nowPos));
- }
- }
- return outBuffer.Flush();
-}
-
-STDMETHODIMP CDecoder ::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const COutBufferException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ShrinkDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/ShrinkDecoder.h
deleted file mode 100644
index 9bbecd41b..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ShrinkDecoder.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// ShrinkDecoder.h
-
-#ifndef __COMPRESS_SHRINK_DECODER_H
-#define __COMPRESS_SHRINK_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NShrink {
-
-const int kNumMaxBits = 13;
-const UInt32 kNumItems = 1 << kNumMaxBits;
-
-class CDecoder :
- public ICompressCoder,
- public CMyUnknownImp
-{
- UInt16 _parents[kNumItems];
- Byte _suffixes[kNumItems];
- Byte _stack[kNumItems];
- bool _isFree[kNumItems];
- bool _isParent[kNumItems];
-
-public:
- MY_UNKNOWN_IMP
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ZDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/ZDecoder.cpp
deleted file mode 100644
index e28c64518..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ZDecoder.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-// ZDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/InBuffer.h"
-#include "../Common/OutBuffer.h"
-
-#include "ZDecoder.h"
-
-namespace NCompress {
-namespace NZ {
-
-static const UInt32 kBufferSize = (1 << 20);
-static const Byte kNumBitsMask = 0x1F;
-static const Byte kBlockModeMask = 0x80;
-static const int kNumMinBits = 9;
-static const int kNumMaxBits = 16;
-
-void CDecoder::Free()
-{
- MyFree(_parents); _parents = 0;
- MyFree(_suffixes); _suffixes = 0;
- MyFree(_stack); _stack = 0;
-}
-
-CDecoder::~CDecoder() { Free(); }
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- CInBuffer inBuffer;
- COutBuffer outBuffer;
-
- if (!inBuffer.Create(kBufferSize))
- return E_OUTOFMEMORY;
- inBuffer.SetStream(inStream);
- inBuffer.Init();
-
- if (!outBuffer.Create(kBufferSize))
- return E_OUTOFMEMORY;
- outBuffer.SetStream(outStream);
- outBuffer.Init();
-
- int maxbits = _properties & kNumBitsMask;
- if (maxbits < kNumMinBits || maxbits > kNumMaxBits)
- return S_FALSE;
- UInt32 numItems = 1 << maxbits;
- bool blockMode = ((_properties & kBlockModeMask) != 0);
-
- if (maxbits != _numMaxBits || _parents == 0 || _suffixes == 0 || _stack == 0)
- {
- Free();
- _parents = (UInt16 *)MyAlloc(numItems * sizeof(UInt16)); if (_parents == 0) return E_OUTOFMEMORY;
- _suffixes = (Byte *)MyAlloc(numItems * sizeof(Byte)); if (_suffixes == 0) return E_OUTOFMEMORY;
- _stack = (Byte *)MyAlloc(numItems * sizeof(Byte)); if (_stack == 0) return E_OUTOFMEMORY;
- _numMaxBits = maxbits;
- }
-
- UInt64 prevPos = 0;
- int numBits = kNumMinBits;
- UInt32 head = blockMode ? 257 : 256;
-
- bool needPrev = false;
-
- unsigned bitPos = 0;
- unsigned numBufBits = 0;
-
- Byte buf[kNumMaxBits + 4];
-
- _parents[256] = 0; // virus protection
- _suffixes[256] = 0;
-
- for (;;)
- {
- if (numBufBits == bitPos)
- {
- numBufBits = (unsigned)inBuffer.ReadBytes(buf, numBits) * 8;
- bitPos = 0;
- UInt64 nowPos = outBuffer.GetProcessedSize();
- if (progress != NULL && nowPos - prevPos >= (1 << 18))
- {
- prevPos = nowPos;
- UInt64 packSize = inBuffer.GetProcessedSize();
- RINOK(progress->SetRatioInfo(&packSize, &nowPos));
- }
- }
- unsigned bytePos = bitPos >> 3;
- UInt32 symbol = buf[bytePos] | ((UInt32)buf[bytePos + 1] << 8) | ((UInt32)buf[bytePos + 2] << 16);
- symbol >>= (bitPos & 7);
- symbol &= (1 << numBits) - 1;
- bitPos += numBits;
- if (bitPos > numBufBits)
- break;
- if (symbol >= head)
- return S_FALSE;
- if (blockMode && symbol == 256)
- {
- numBufBits = bitPos = 0;
- numBits = kNumMinBits;
- head = 257;
- needPrev = false;
- continue;
- }
- UInt32 cur = symbol;
- int i = 0;
- while (cur >= 256)
- {
- _stack[i++] = _suffixes[cur];
- cur = _parents[cur];
- }
- _stack[i++] = (Byte)cur;
- if (needPrev)
- {
- _suffixes[head - 1] = (Byte)cur;
- if (symbol == head - 1)
- _stack[0] = (Byte)cur;
- }
- do
- outBuffer.WriteByte((_stack[--i]));
- while (i > 0);
- if (head < numItems)
- {
- needPrev = true;
- _parents[head++] = (UInt16)symbol;
- if (head > ((UInt32)1 << numBits))
- {
- if (numBits < maxbits)
- {
- numBufBits = bitPos = 0;
- numBits++;
- }
- }
- }
- else
- needPrev = false;
- }
- return outBuffer.Flush();
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
- catch(const CInBufferException &e) { return e.ErrorCode; }
- catch(const COutBufferException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size < 1)
- return E_INVALIDARG;
- _properties = data[0];
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ZDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/ZDecoder.h
deleted file mode 100644
index 2bd83a177..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ZDecoder.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// ZDecoder.h
-
-#ifndef __COMPRESS_Z_DECODER_H
-#define __COMPRESS_Z_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NZ {
-
-class CDecoder:
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public CMyUnknownImp
-{
- UInt16 *_parents;
- Byte *_suffixes;
- Byte *_stack;
- Byte _properties;
- int _numMaxBits;
-
-public:
- CDecoder(): _parents(0), _suffixes(0), _stack(0), _properties(0), _numMaxBits(0) {};
- ~CDecoder();
- void Free();
-
- MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
- HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ZlibDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/ZlibDecoder.cpp
deleted file mode 100644
index 90d6715db..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ZlibDecoder.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-// ZlibDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "ZlibDecoder.h"
-
-namespace NCompress {
-namespace NZlib {
-
-#define DEFLATE_TRY_BEGIN try {
-#define DEFLATE_TRY_END } catch(...) { return S_FALSE; }
-
-#define ADLER_MOD 65521
-#define ADLER_LOOP_MAX 5550
-
-UInt32 Adler32_Update(UInt32 adler, const Byte *buf, size_t size)
-{
- UInt32 a = adler & 0xFFFF;
- UInt32 b = (adler >> 16) & 0xFFFF;
- while (size > 0)
- {
- unsigned curSize = (size > ADLER_LOOP_MAX) ? ADLER_LOOP_MAX : (unsigned )size;
- unsigned i;
- for (i = 0; i < curSize; i++)
- {
- a += buf[i];
- b += a;
- }
- buf += curSize;
- size -= curSize;
- a %= ADLER_MOD;
- b %= ADLER_MOD;
- }
- return (b << 16) + a;
-}
-
-STDMETHODIMP COutStreamWithAdler::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- HRESULT result = _stream->Write(data, size, &size);
- _adler = Adler32_Update(_adler, (const Byte *)data, size);
- if (processedSize != NULL)
- *processedSize = size;
- return result;
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- DEFLATE_TRY_BEGIN
- if (!AdlerStream)
- AdlerStream = AdlerSpec = new COutStreamWithAdler;
- if (!DeflateDecoder)
- {
- DeflateDecoderSpec = new NDeflate::NDecoder::CCOMCoder;
- DeflateDecoderSpec->ZlibMode = true;
- DeflateDecoder = DeflateDecoderSpec;
- }
-
- Byte buf[2];
- RINOK(ReadStream_FALSE(inStream, buf, 2));
- int method = buf[0] & 0xF;
- if (method != 8)
- return S_FALSE;
- // int dicSize = buf[0] >> 4;
- if ((((UInt32)buf[0] << 8) + buf[1]) % 31 != 0)
- return S_FALSE;
- if ((buf[1] & 0x20) != 0) // dictPresent
- return S_FALSE;
- // int level = (buf[1] >> 6);
-
- AdlerSpec->SetStream(outStream);
- AdlerSpec->Init();
- HRESULT res = DeflateDecoder->Code(inStream, AdlerStream, inSize, outSize, progress);
- AdlerSpec->ReleaseStream();
-
- if (res == S_OK)
- {
- const Byte *p = DeflateDecoderSpec->ZlibFooter;
- UInt32 adler = ((UInt32)p[0] << 24) | ((UInt32)p[1] << 16) | ((UInt32)p[2] << 8) | p[3];
- if (adler != AdlerSpec->GetAdler())
- return S_FALSE;
- }
- return res;
- DEFLATE_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ZlibDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/ZlibDecoder.h
deleted file mode 100644
index 95c110022..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ZlibDecoder.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// ZlibDecoder.h
-
-#ifndef __ZLIB_DECODER_H
-#define __ZLIB_DECODER_H
-
-#include "DeflateDecoder.h"
-
-namespace NCompress {
-namespace NZlib {
-
-const UInt32 ADLER_INIT_VAL = 1;
-
-class COutStreamWithAdler:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialOutStream> _stream;
- UInt32 _adler;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- void SetStream(ISequentialOutStream *stream) { _stream = stream; }
- void ReleaseStream() { _stream.Release(); }
- void Init() { _adler = ADLER_INIT_VAL; }
- UInt32 GetAdler() const { return _adler; }
-};
-
-class CDecoder:
- public ICompressCoder,
- public CMyUnknownImp
-{
- COutStreamWithAdler *AdlerSpec;
- CMyComPtr<ISequentialOutStream> AdlerStream;
-
- NCompress::NDeflate::NDecoder::CCOMCoder *DeflateDecoderSpec;
- CMyComPtr<ICompressCoder> DeflateDecoder;
-public:
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
- UInt64 GetInputProcessedSize() const { return DeflateDecoderSpec->GetInputProcessedSize() + 2; }
-
- MY_UNKNOWN_IMP
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ZlibEncoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/ZlibEncoder.cpp
deleted file mode 100644
index 09235c337..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ZlibEncoder.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-// ZlibEncoder.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "ZlibEncoder.h"
-
-namespace NCompress {
-namespace NZlib {
-
-#define DEFLATE_TRY_BEGIN try {
-#define DEFLATE_TRY_END } catch(...) { return S_FALSE; }
-
-UInt32 Adler32_Update(UInt32 adler, const Byte *buf, size_t size);
-
-STDMETHODIMP CInStreamWithAdler::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- HRESULT result = _stream->Read(data, size, &size);
- _adler = Adler32_Update(_adler, (const Byte *)data, size);
- _size += size;
- if (processedSize != NULL)
- *processedSize = size;
- return result;
-}
-
-void CEncoder::Create()
-{
- if (!DeflateEncoder)
- DeflateEncoder = DeflateEncoderSpec = new NDeflate::NEncoder::CCOMCoder;
-}
-
-STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- DEFLATE_TRY_BEGIN
- if (!AdlerStream)
- AdlerStream = AdlerSpec = new CInStreamWithAdler;
- Create();
-
- {
- Byte buf[2] = { 0x78, 0xDA };
- RINOK(WriteStream(outStream, buf, 2));
- }
-
- AdlerSpec->SetStream(inStream);
- AdlerSpec->Init();
- HRESULT res = DeflateEncoder->Code(AdlerStream, outStream, inSize, NULL, progress);
- AdlerSpec->ReleaseStream();
-
- RINOK(res);
-
- {
- UInt32 a = AdlerSpec->GetAdler();
- Byte buf[4] = { (Byte)(a >> 24), (Byte)(a >> 16), (Byte)(a >> 8), (Byte)(a) };
- return WriteStream(outStream, buf, 4);
- }
- DEFLATE_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ZlibEncoder.h b/src/libs/7zip/win/CPP/7zip/Compress/ZlibEncoder.h
deleted file mode 100644
index 621cc1d08..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ZlibEncoder.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// ZlibEncoder.h
-
-#ifndef __ZLIB_ENCODER_H
-#define __ZLIB_ENCODER_H
-
-#include "DeflateEncoder.h"
-
-namespace NCompress {
-namespace NZlib {
-
-class CInStreamWithAdler:
- public ISequentialInStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialInStream> _stream;
- UInt32 _adler;
- UInt64 _size;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- void SetStream(ISequentialInStream *stream) { _stream = stream; }
- void ReleaseStream() { _stream.Release(); }
- void Init() { _adler = 1; _size = 0; } // ADLER_INIT_VAL
- UInt32 GetAdler() const { return _adler; }
- UInt64 GetSize() const { return _size; }
-};
-
-class CEncoder:
- public ICompressCoder,
- public CMyUnknownImp
-{
- CInStreamWithAdler *AdlerSpec;
- CMyComPtr<ISequentialInStream> AdlerStream;
- CMyComPtr<ICompressCoder> DeflateEncoder;
-public:
- NCompress::NDeflate::NEncoder::CCOMCoder *DeflateEncoderSpec;
-
- void Create();
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- UInt64 GetInputProcessedSize() const { return AdlerSpec->GetSize(); }
-
- MY_UNKNOWN_IMP
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/7zAes.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/7zAes.cpp
deleted file mode 100644
index b686fb61f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/7zAes.cpp
+++ /dev/null
@@ -1,244 +0,0 @@
-// 7zAes.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Sha256.h"
-
-#include "Windows/Synchronization.h"
-
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "7zAes.h"
-#include "MyAes.h"
-
-#ifndef EXTRACT_ONLY
-#include "RandGen.h"
-#endif
-
-using namespace NWindows;
-
-namespace NCrypto {
-namespace NSevenZ {
-
-bool CKeyInfo::IsEqualTo(const CKeyInfo &a) const
-{
- if (SaltSize != a.SaltSize || NumCyclesPower != a.NumCyclesPower)
- return false;
- for (UInt32 i = 0; i < SaltSize; i++)
- if (Salt[i] != a.Salt[i])
- return false;
- return (Password == a.Password);
-}
-
-void CKeyInfo::CalculateDigest()
-{
- if (NumCyclesPower == 0x3F)
- {
- UInt32 pos;
- for (pos = 0; pos < SaltSize; pos++)
- Key[pos] = Salt[pos];
- for (UInt32 i = 0; i < Password.GetCapacity() && pos < kKeySize; i++)
- Key[pos++] = Password[i];
- for (; pos < kKeySize; pos++)
- Key[pos] = 0;
- }
- else
- {
- CSha256 sha;
- Sha256_Init(&sha);
- const UInt64 numRounds = (UInt64)1 << NumCyclesPower;
- Byte temp[8] = { 0,0,0,0,0,0,0,0 };
- for (UInt64 round = 0; round < numRounds; round++)
- {
- Sha256_Update(&sha, Salt, (size_t)SaltSize);
- Sha256_Update(&sha, Password, Password.GetCapacity());
- Sha256_Update(&sha, temp, 8);
- for (int i = 0; i < 8; i++)
- if (++(temp[i]) != 0)
- break;
- }
- Sha256_Final(&sha, Key);
- }
-}
-
-bool CKeyInfoCache::Find(CKeyInfo &key)
-{
- for (int i = 0; i < Keys.Size(); i++)
- {
- const CKeyInfo &cached = Keys[i];
- if (key.IsEqualTo(cached))
- {
- for (int j = 0; j < kKeySize; j++)
- key.Key[j] = cached.Key[j];
- if (i != 0)
- {
- Keys.Insert(0, cached);
- Keys.Delete(i+1);
- }
- return true;
- }
- }
- return false;
-}
-
-void CKeyInfoCache::Add(CKeyInfo &key)
-{
- if (Find(key))
- return;
- if (Keys.Size() >= Size)
- Keys.DeleteBack();
- Keys.Insert(0, key);
-}
-
-static CKeyInfoCache g_GlobalKeyCache(32);
-static NSynchronization::CCriticalSection g_GlobalKeyCacheCriticalSection;
-
-CBase::CBase():
- _cachedKeys(16),
- _ivSize(0)
-{
- for (int i = 0; i < sizeof(_iv); i++)
- _iv[i] = 0;
-}
-
-void CBase::CalculateDigest()
-{
- NSynchronization::CCriticalSectionLock lock(g_GlobalKeyCacheCriticalSection);
- if (_cachedKeys.Find(_key))
- g_GlobalKeyCache.Add(_key);
- else
- {
- if (!g_GlobalKeyCache.Find(_key))
- {
- _key.CalculateDigest();
- g_GlobalKeyCache.Add(_key);
- }
- _cachedKeys.Add(_key);
- }
-}
-
-#ifndef EXTRACT_ONLY
-
-/*
-STDMETHODIMP CEncoder::ResetSalt()
-{
- _key.SaltSize = 4;
- g_RandomGenerator.Generate(_key.Salt, _key.SaltSize);
- return S_OK;
-}
-*/
-
-STDMETHODIMP CEncoder::ResetInitVector()
-{
- _ivSize = 8;
- g_RandomGenerator.Generate(_iv, (unsigned)_ivSize);
- return S_OK;
-}
-
-STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
-{
- // _key.Init();
- for (UInt32 i = _ivSize; i < sizeof(_iv); i++)
- _iv[i] = 0;
-
- UInt32 ivSize = _ivSize;
-
- // _key.NumCyclesPower = 0x3F;
- _key.NumCyclesPower = 19;
-
- Byte firstByte = (Byte)(_key.NumCyclesPower |
- (((_key.SaltSize == 0) ? 0 : 1) << 7) |
- (((ivSize == 0) ? 0 : 1) << 6));
- RINOK(outStream->Write(&firstByte, 1, NULL));
- if (_key.SaltSize == 0 && ivSize == 0)
- return S_OK;
- Byte saltSizeSpec = (Byte)((_key.SaltSize == 0) ? 0 : (_key.SaltSize - 1));
- Byte ivSizeSpec = (Byte)((ivSize == 0) ? 0 : (ivSize - 1));
- Byte secondByte = (Byte)(((saltSizeSpec) << 4) | ivSizeSpec);
- RINOK(outStream->Write(&secondByte, 1, NULL));
- if (_key.SaltSize > 0)
- {
- RINOK(WriteStream(outStream, _key.Salt, _key.SaltSize));
- }
- if (ivSize > 0)
- {
- RINOK(WriteStream(outStream, _iv, ivSize));
- }
- return S_OK;
-}
-
-HRESULT CEncoder::CreateFilter()
-{
- _aesFilter = new CAesCbcEncoder;
- return S_OK;
-}
-
-#endif
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- _key.Init();
- UInt32 i;
- for (i = 0; i < sizeof(_iv); i++)
- _iv[i] = 0;
- if (size == 0)
- return S_OK;
- UInt32 pos = 0;
- Byte firstByte = data[pos++];
-
- _key.NumCyclesPower = firstByte & 0x3F;
- if ((firstByte & 0xC0) == 0)
- return S_OK;
- _key.SaltSize = (firstByte >> 7) & 1;
- UInt32 ivSize = (firstByte >> 6) & 1;
-
- if (pos >= size)
- return E_INVALIDARG;
- Byte secondByte = data[pos++];
-
- _key.SaltSize += (secondByte >> 4);
- ivSize += (secondByte & 0x0F);
-
- if (pos + _key.SaltSize + ivSize > size)
- return E_INVALIDARG;
- for (i = 0; i < _key.SaltSize; i++)
- _key.Salt[i] = data[pos++];
- for (i = 0; i < ivSize; i++)
- _iv[i] = data[pos++];
- return (_key.NumCyclesPower <= 24) ? S_OK : E_NOTIMPL;
-}
-
-STDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
- _key.Password.SetCapacity((size_t)size);
- memcpy(_key.Password, data, (size_t)size);
- return S_OK;
-}
-
-STDMETHODIMP CBaseCoder::Init()
-{
- CalculateDigest();
- if (_aesFilter == 0)
- {
- RINOK(CreateFilter());
- }
- CMyComPtr<ICryptoProperties> cp;
- RINOK(_aesFilter.QueryInterface(IID_ICryptoProperties, &cp));
- RINOK(cp->SetKey(_key.Key, sizeof(_key.Key)));
- RINOK(cp->SetInitVector(_iv, sizeof(_iv)));
- return S_OK;
-}
-
-STDMETHODIMP_(UInt32) CBaseCoder::Filter(Byte *data, UInt32 size)
-{
- return _aesFilter->Filter(data, size);
-}
-
-HRESULT CDecoder::CreateFilter()
-{
- _aesFilter = new CAesCbcDecoder;
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/7zAes.h b/src/libs/7zip/win/CPP/7zip/Crypto/7zAes.h
deleted file mode 100644
index 79d723fae..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/7zAes.h
+++ /dev/null
@@ -1,117 +0,0 @@
-// 7zAes.h
-
-#ifndef __CRYPTO_7Z_AES_H
-#define __CRYPTO_7Z_AES_H
-
-#include "Common/Buffer.h"
-#include "Common/MyCom.h"
-#include "Common/MyVector.h"
-
-#include "../ICoder.h"
-#include "../IPassword.h"
-
-namespace NCrypto {
-namespace NSevenZ {
-
-const int kKeySize = 32;
-
-class CKeyInfo
-{
-public:
- int NumCyclesPower;
- UInt32 SaltSize;
- Byte Salt[16];
- CByteBuffer Password;
- Byte Key[kKeySize];
-
- bool IsEqualTo(const CKeyInfo &a) const;
- void CalculateDigest();
-
- CKeyInfo() { Init(); }
- void Init()
- {
- NumCyclesPower = 0;
- SaltSize = 0;
- for (int i = 0; i < sizeof(Salt); i++)
- Salt[i] = 0;
- }
-};
-
-class CKeyInfoCache
-{
- int Size;
- CObjectVector<CKeyInfo> Keys;
-public:
- CKeyInfoCache(int size): Size(size) {}
- bool Find(CKeyInfo &key);
- // HRESULT Calculate(CKeyInfo &key);
- void Add(CKeyInfo &key);
-};
-
-class CBase
-{
- CKeyInfoCache _cachedKeys;
-protected:
- CKeyInfo _key;
- Byte _iv[16];
- UInt32 _ivSize;
- void CalculateDigest();
- CBase();
-};
-
-class CBaseCoder:
- public ICompressFilter,
- public ICryptoSetPassword,
- public CMyUnknownImp,
- public CBase
-{
-protected:
- CMyComPtr<ICompressFilter> _aesFilter;
-
- virtual HRESULT CreateFilter() = 0;
- #ifndef CRYPTO_AES
- HRESULT CreateFilterFromDLL(REFCLSID clsID);
- #endif
-public:
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
-
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-};
-
-#ifndef EXTRACT_ONLY
-
-class CEncoder:
- public CBaseCoder,
- public ICompressWriteCoderProperties,
- // public ICryptoResetSalt,
- public ICryptoResetInitVector
-{
- virtual HRESULT CreateFilter();
-public:
- MY_UNKNOWN_IMP3(
- ICryptoSetPassword,
- ICompressWriteCoderProperties,
- // ICryptoResetSalt,
- ICryptoResetInitVector)
- STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);
- // STDMETHOD(ResetSalt)();
- STDMETHOD(ResetInitVector)();
-};
-#endif
-
-class CDecoder:
- public CBaseCoder,
- public ICompressSetDecoderProperties2
-{
- virtual HRESULT CreateFilter();
-public:
- MY_UNKNOWN_IMP2(
- ICryptoSetPassword,
- ICompressSetDecoderProperties2)
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/7zAesRegister.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/7zAesRegister.cpp
deleted file mode 100644
index 5e57748f5..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/7zAesRegister.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// 7zAesRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-#include "7zAes.h"
-
-static void *CreateCodec() { return (void *)(ICompressFilter *)(new NCrypto::NSevenZ::CDecoder()); }
-#ifndef EXTRACT_ONLY
-static void *CreateCodecOut() { return (void *)(ICompressFilter *)(new NCrypto::NSevenZ::CEncoder()); }
-#else
-#define CreateCodecOut 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodec, CreateCodecOut, 0x06F10701, L"7zAES", 1, true };
-
-REGISTER_CODEC(7zAES)
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/HmacSha1.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/HmacSha1.cpp
deleted file mode 100644
index a66d62711..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/HmacSha1.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-// HmacSha1.cpp
-
-#include "StdAfx.h"
-
-#include "HmacSha1.h"
-
-namespace NCrypto {
-namespace NSha1 {
-
-void CHmac::SetKey(const Byte *key, size_t keySize)
-{
- Byte keyTemp[kBlockSize];
- size_t i;
- for (i = 0; i < kBlockSize; i++)
- keyTemp[i] = 0;
- if(keySize > kBlockSize)
- {
- _sha.Init();
- _sha.Update(key, keySize);
- _sha.Final(keyTemp);
- keySize = kDigestSize;
- }
- else
- for (i = 0; i < keySize; i++)
- keyTemp[i] = key[i];
- for (i = 0; i < kBlockSize; i++)
- keyTemp[i] ^= 0x36;
- _sha.Init();
- _sha.Update(keyTemp, kBlockSize);
- for (i = 0; i < kBlockSize; i++)
- keyTemp[i] ^= 0x36 ^ 0x5C;
- _sha2.Init();
- _sha2.Update(keyTemp, kBlockSize);
-}
-
-void CHmac::Final(Byte *mac, size_t macSize)
-{
- Byte digest[kDigestSize];
- _sha.Final(digest);
- _sha2.Update(digest, kDigestSize);
- _sha2.Final(digest);
- for(size_t i = 0; i < macSize; i++)
- mac[i] = digest[i];
-}
-
-
-void CHmac32::SetKey(const Byte *key, size_t keySize)
-{
- UInt32 keyTemp[kBlockSizeInWords];
- size_t i;
- for (i = 0; i < kBlockSizeInWords; i++)
- keyTemp[i] = 0;
- if(keySize > kBlockSize)
- {
- CContext sha;
- sha.Init();
- sha.Update(key, keySize);
- Byte digest[kDigestSize];
- sha.Final(digest);
-
- for (int i = 0 ; i < kDigestSizeInWords; i++)
- keyTemp[i] =
- ((UInt32)(digest[i * 4 + 0]) << 24) |
- ((UInt32)(digest[i * 4 + 1]) << 16) |
- ((UInt32)(digest[i * 4 + 2]) << 8) |
- ((UInt32)(digest[i * 4 + 3]));
- keySize = kDigestSizeInWords;
- }
- else
- for (size_t i = 0; i < keySize; i++)
- keyTemp[i / 4] |= (key[i] << (24 - 8 * (i & 3)));
- for (i = 0; i < kBlockSizeInWords; i++)
- keyTemp[i] ^= 0x36363636;
- _sha.Init();
- _sha.Update(keyTemp, kBlockSizeInWords);
- for (i = 0; i < kBlockSizeInWords; i++)
- keyTemp[i] ^= 0x36363636 ^ 0x5C5C5C5C;
- _sha2.Init();
- _sha2.Update(keyTemp, kBlockSizeInWords);
-}
-
-void CHmac32::Final(UInt32 *mac, size_t macSize)
-{
- UInt32 digest[kDigestSizeInWords];
- _sha.Final(digest);
- _sha2.Update(digest, kDigestSizeInWords);
- _sha2.Final(digest);
- for(size_t i = 0; i < macSize; i++)
- mac[i] = digest[i];
-}
-
-void CHmac32::GetLoopXorDigest(UInt32 *mac, UInt32 numIteration)
-{
- UInt32 block[kBlockSizeInWords];
- UInt32 block2[kBlockSizeInWords];
- _sha.PrepareBlock(block, kDigestSizeInWords);
- _sha2.PrepareBlock(block2, kDigestSizeInWords);
- for(unsigned int s = 0; s < kDigestSizeInWords; s++)
- block[s] = mac[s];
- for(UInt32 i = 0; i < numIteration; i++)
- {
- _sha.GetBlockDigest(block, block2);
- _sha2.GetBlockDigest(block2, block);
- for (unsigned int s = 0; s < kDigestSizeInWords; s++)
- mac[s] ^= block[s];
- }
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/HmacSha1.h b/src/libs/7zip/win/CPP/7zip/Crypto/HmacSha1.h
deleted file mode 100644
index d7181329c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/HmacSha1.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// HmacSha1.h
-// Implements HMAC-SHA-1 (RFC2104, FIPS-198)
-
-#ifndef __CRYPTO_HMAC_SHA1_H
-#define __CRYPTO_HMAC_SHA1_H
-
-#include "Sha1.h"
-
-namespace NCrypto {
-namespace NSha1 {
-
-// Use: SetKey(key, keySize); for () Update(data, size); Final(mac, macSize);
-
-class CHmac
-{
- CContext _sha;
- CContext _sha2;
-public:
- void SetKey(const Byte *key, size_t keySize);
- void Update(const Byte *data, size_t dataSize) { _sha.Update(data, dataSize); }
- void Final(Byte *mac, size_t macSize = kDigestSize);
-};
-
-class CHmac32
-{
- CContext32 _sha;
- CContext32 _sha2;
-public:
- void SetKey(const Byte *key, size_t keySize);
- void Update(const UInt32 *data, size_t dataSize) { _sha.Update(data, dataSize); }
- void Final(UInt32 *mac, size_t macSize = kDigestSizeInWords);
-
- // It'sa for hmac function. in,out: mac[kDigestSizeInWords].
- void GetLoopXorDigest(UInt32 *mac, UInt32 numIteration);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/MyAes.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/MyAes.cpp
deleted file mode 100644
index 70a7dccff..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/MyAes.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-// Crypto/MyAes.cpp
-
-#include "StdAfx.h"
-
-#include "MyAes.h"
-
-namespace NCrypto {
-
-struct CAesTabInit { CAesTabInit() { AesGenTables();} } g_AesTabInit;
-
-CAesCbcCoder::CAesCbcCoder()
-{
- _offset = ((0 - (unsigned)(ptrdiff_t)_aes) & 0xF) / sizeof(UInt32);
-}
-
-STDMETHODIMP CAesCbcCoder::Init() { return S_OK; }
-
-STDMETHODIMP_(UInt32) CAesCbcCoder::Filter(Byte *data, UInt32 size)
-{
- if (size == 0)
- return 0;
- if (size < AES_BLOCK_SIZE)
- return AES_BLOCK_SIZE;
- size >>= 4;
- _codeFunc(_aes + _offset, data, size);
- return size << 4;
-}
-
-STDMETHODIMP CAesCbcCoder::SetKey(const Byte *data, UInt32 size)
-{
- if ((size & 0x7) != 0 || size < 16 || size > 32)
- return E_INVALIDARG;
- _setKeyFunc(_aes + _offset + 4, data, size);
- return S_OK;
-}
-
-STDMETHODIMP CAesCbcCoder::SetInitVector(const Byte *data, UInt32 size)
-{
- if (size != AES_BLOCK_SIZE)
- return E_INVALIDARG;
- AesCbc_Init(_aes + _offset, data);
- return S_OK;
-}
-
-CAesCbcEncoder::CAesCbcEncoder() { _codeFunc = g_AesCbc_Encode; _setKeyFunc = Aes_SetKey_Enc; }
-CAesCbcDecoder::CAesCbcDecoder() { _codeFunc = g_AesCbc_Decode; _setKeyFunc = Aes_SetKey_Dec; }
-
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/MyAes.h b/src/libs/7zip/win/CPP/7zip/Crypto/MyAes.h
deleted file mode 100644
index 60b13845f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/MyAes.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Crypto/MyAes.h
-
-#ifndef __CRYPTO_MY_AES_H
-#define __CRYPTO_MY_AES_H
-
-#include "../../../C/Aes.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-namespace NCrypto {
-
-class CAesCbcCoder:
- public ICompressFilter,
- public ICryptoProperties,
- public CMyUnknownImp
-{
-protected:
- AES_CODE_FUNC _codeFunc;
- AES_SET_KEY_FUNC _setKeyFunc;
- unsigned _offset;
- UInt32 _aes[AES_NUM_IVMRK_WORDS + 3];
-public:
- CAesCbcCoder();
- MY_UNKNOWN_IMP1(ICryptoProperties)
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- STDMETHOD(SetKey)(const Byte *data, UInt32 size);
- STDMETHOD(SetInitVector)(const Byte *data, UInt32 size);
-};
-
-struct CAesCbcEncoder: public CAesCbcCoder { CAesCbcEncoder(); };
-struct CAesCbcDecoder: public CAesCbcCoder { CAesCbcDecoder(); };
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp
deleted file mode 100644
index cbbdec89d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-// Pbkdf2HmacSha1.cpp
-
-#include "StdAfx.h"
-
-#include "HmacSha1.h"
-
-namespace NCrypto {
-namespace NSha1 {
-
-void Pbkdf2Hmac(const Byte *pwd, size_t pwdSize, const Byte *salt, size_t saltSize,
- UInt32 numIterations, Byte *key, size_t keySize)
-{
- CHmac baseCtx;
- baseCtx.SetKey(pwd, pwdSize);
- for (UInt32 i = 1; keySize > 0; i++)
- {
- CHmac ctx = baseCtx;
- ctx.Update(salt, saltSize);
- Byte u[kDigestSize] = { (Byte)(i >> 24), (Byte)(i >> 16), (Byte)(i >> 8), (Byte)(i) };
- const unsigned int curSize = (keySize < kDigestSize) ? (unsigned int)keySize : kDigestSize;
- ctx.Update(u, 4);
- ctx.Final(u, kDigestSize);
-
- unsigned int s;
- for (s = 0; s < curSize; s++)
- key[s] = u[s];
-
- for (UInt32 j = numIterations; j > 1; j--)
- {
- ctx = baseCtx;
- ctx.Update(u, kDigestSize);
- ctx.Final(u, kDigestSize);
- for (s = 0; s < curSize; s++)
- key[s] ^= u[s];
- }
-
- key += curSize;
- keySize -= curSize;
- }
-}
-
-void Pbkdf2Hmac32(const Byte *pwd, size_t pwdSize, const UInt32 *salt, size_t saltSize,
- UInt32 numIterations, UInt32 *key, size_t keySize)
-{
- CHmac32 baseCtx;
- baseCtx.SetKey(pwd, pwdSize);
- for (UInt32 i = 1; keySize > 0; i++)
- {
- CHmac32 ctx = baseCtx;
- ctx.Update(salt, saltSize);
- UInt32 u[kDigestSizeInWords] = { i };
- const unsigned int curSize = (keySize < kDigestSizeInWords) ? (unsigned int)keySize : kDigestSizeInWords;
- ctx.Update(u, 1);
- ctx.Final(u, kDigestSizeInWords);
-
- // Speed-optimized code start
- ctx = baseCtx;
- ctx.GetLoopXorDigest(u, numIterations - 1);
- // Speed-optimized code end
-
- unsigned int s;
- for (s = 0; s < curSize; s++)
- key[s] = u[s];
-
- /*
- // Default code start
- for (UInt32 j = numIterations; j > 1; j--)
- {
- ctx = baseCtx;
- ctx.Update(u, kDigestSizeInWords);
- ctx.Final(u, kDigestSizeInWords);
- for (s = 0; s < curSize; s++)
- key[s] ^= u[s];
- }
- // Default code end
- */
-
- key += curSize;
- keySize -= curSize;
- }
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/Pbkdf2HmacSha1.h b/src/libs/7zip/win/CPP/7zip/Crypto/Pbkdf2HmacSha1.h
deleted file mode 100644
index bb90e1214..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/Pbkdf2HmacSha1.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Pbkdf2HmacSha1.h
-// Password-Based Key Derivation Function (RFC 2898, PKCS #5) based on HMAC-SHA-1
-
-#ifndef __CRYPTO_PBKDF2_HMAC_SHA1_H
-#define __CRYPTO_PBKDF2_HMAC_SHA1_H
-
-#include <stddef.h>
-#include "../../Common/Types.h"
-
-namespace NCrypto {
-namespace NSha1 {
-
-void Pbkdf2Hmac(const Byte *pwd, size_t pwdSize, const Byte *salt, size_t saltSize,
- UInt32 numIterations, Byte *key, size_t keySize);
-
-void Pbkdf2Hmac32(const Byte *pwd, size_t pwdSize, const UInt32 *salt, size_t saltSize,
- UInt32 numIterations, UInt32 *key, size_t keySize);
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/RandGen.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/RandGen.cpp
deleted file mode 100644
index e0e2e3abd..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/RandGen.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-// RandGen.cpp
-
-#include "StdAfx.h"
-
-#include <stdio.h>
-#include "Windows/Synchronization.h"
-#include "RandGen.h"
-
-#ifndef _WIN32
-#include <unistd.h>
-#define USE_POSIX_TIME
-#define USE_POSIX_TIME2
-#endif
-
-#ifdef USE_POSIX_TIME
-#include <time.h>
-#ifdef USE_POSIX_TIME2
-#include <sys/time.h>
-#endif
-#endif
-
-// This is not very good random number generator.
-// Please use it only for salt.
-// First generated data block depends from timer and processID.
-// Other generated data blocks depend from previous state
-// Maybe it's possible to restore original timer value from generated value.
-
-void CRandomGenerator::Init()
-{
- NCrypto::NSha1::CContext hash;
- hash.Init();
-
- #ifdef _WIN32
- DWORD w = ::GetCurrentProcessId();
- hash.Update((const Byte *)&w, sizeof(w));
- w = ::GetCurrentThreadId();
- hash.Update((const Byte *)&w, sizeof(w));
- #else
- pid_t pid = getpid();
- hash.Update((const Byte *)&pid, sizeof(pid));
- pid = getppid();
- hash.Update((const Byte *)&pid, sizeof(pid));
- #endif
-
- for (int i = 0; i < 1000; i++)
- {
- #ifdef _WIN32
- LARGE_INTEGER v;
- if (::QueryPerformanceCounter(&v))
- hash.Update((const Byte *)&v.QuadPart, sizeof(v.QuadPart));
- #endif
-
- #ifdef USE_POSIX_TIME
- #ifdef USE_POSIX_TIME2
- timeval v;
- if (gettimeofday(&v, 0) == 0)
- {
- hash.Update((const Byte *)&v.tv_sec, sizeof(v.tv_sec));
- hash.Update((const Byte *)&v.tv_usec, sizeof(v.tv_usec));
- }
- #endif
- time_t v2 = time(NULL);
- hash.Update((const Byte *)&v2, sizeof(v2));
- #endif
-
- DWORD tickCount = ::GetTickCount();
- hash.Update((const Byte *)&tickCount, sizeof(tickCount));
-
- for (int j = 0; j < 100; j++)
- {
- hash.Final(_buff);
- hash.Init();
- hash.Update(_buff, NCrypto::NSha1::kDigestSize);
- }
- }
- hash.Final(_buff);
- _needInit = false;
-}
-
-static NWindows::NSynchronization::CCriticalSection g_CriticalSection;
-
-void CRandomGenerator::Generate(Byte *data, unsigned int size)
-{
- g_CriticalSection.Enter();
- if (_needInit)
- Init();
- while (size > 0)
- {
- NCrypto::NSha1::CContext hash;
-
- hash.Init();
- hash.Update(_buff, NCrypto::NSha1::kDigestSize);
- hash.Final(_buff);
-
- hash.Init();
- UInt32 salt = 0xF672ABD1;
- hash.Update((const Byte *)&salt, sizeof(salt));
- hash.Update(_buff, NCrypto::NSha1::kDigestSize);
- Byte buff[NCrypto::NSha1::kDigestSize];
- hash.Final(buff);
- for (unsigned int i = 0; i < NCrypto::NSha1::kDigestSize && size > 0; i++, size--)
- *data++ = buff[i];
- }
- g_CriticalSection.Leave();
-}
-
-CRandomGenerator g_RandomGenerator;
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/RandGen.h b/src/libs/7zip/win/CPP/7zip/Crypto/RandGen.h
deleted file mode 100644
index 209445c43..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/RandGen.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// RandGen.h
-
-#ifndef __CRYPTO_RAND_GEN_H
-#define __CRYPTO_RAND_GEN_H
-
-#include "Sha1.h"
-
-class CRandomGenerator
-{
- Byte _buff[NCrypto::NSha1::kDigestSize];
- bool _needInit;
-
- void Init();
-public:
- CRandomGenerator(): _needInit(true) {};
- void Generate(Byte *data, unsigned size);
-};
-
-extern CRandomGenerator g_RandomGenerator;
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/Rar20Crypto.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/Rar20Crypto.cpp
deleted file mode 100644
index c2df0e527..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/Rar20Crypto.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-// Crypto/Rar20Crypto.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/CpuArch.h"
-#include "../../../C/RotateDefs.h"
-
-#include "Rar20Crypto.h"
-
-namespace NCrypto {
-namespace NRar20 {
-
-static const int kNumRounds = 32;
-
-static const Byte InitSubstTable[256] = {
- 215, 19,149, 35, 73,197,192,205,249, 28, 16,119, 48,221, 2, 42,
- 232, 1,177,233, 14, 88,219, 25,223,195,244, 90, 87,239,153,137,
- 255,199,147, 70, 92, 66,246, 13,216, 40, 62, 29,217,230, 86, 6,
- 71, 24,171,196,101,113,218,123, 93, 91,163,178,202, 67, 44,235,
- 107,250, 75,234, 49,167,125,211, 83,114,157,144, 32,193,143, 36,
- 158,124,247,187, 89,214,141, 47,121,228, 61,130,213,194,174,251,
- 97,110, 54,229,115, 57,152, 94,105,243,212, 55,209,245, 63, 11,
- 164,200, 31,156, 81,176,227, 21, 76, 99,139,188,127, 17,248, 51,
- 207,120,189,210, 8,226, 41, 72,183,203,135,165,166, 60, 98, 7,
- 122, 38,155,170, 69,172,252,238, 39,134, 59,128,236, 27,240, 80,
- 131, 3, 85,206,145, 79,154,142,159,220,201,133, 74, 64, 20,129,
- 224,185,138,103,173,182, 43, 34,254, 82,198,151,231,180, 58, 10,
- 118, 26,102, 12, 50,132, 22,191,136,111,162,179, 45, 4,148,108,
- 161, 56, 78,126,242,222, 15,175,146, 23, 33,241,181,190, 77,225,
- 0, 46,169,186, 68, 95,237, 65, 53,208,253,168, 9, 18,100, 52,
- 116,184,160, 96,109, 37, 30,106,140,104,150, 5,204,117,112, 84
-};
-
-void CData::UpdateKeys(const Byte *data)
-{
- for (int i = 0; i < 16; i += 4)
- for (int j = 0; j < 4; j++)
- Keys[j] ^= g_CrcTable[data[i + j]];
-}
-
-static void Swap(Byte *b1, Byte *b2)
-{
- Byte b = *b1;
- *b1 = *b2;
- *b2 = b;
-}
-
-void CData::SetPassword(const Byte *password, UInt32 passwordLen)
-{
- Keys[0] = 0xD3A3B879L;
- Keys[1] = 0x3F6D12F7L;
- Keys[2] = 0x7515A235L;
- Keys[3] = 0xA4E7F123L;
-
- Byte psw[256];
- memset(psw, 0, sizeof(psw));
- memcpy(psw, password, passwordLen);
- memcpy(SubstTable, InitSubstTable, sizeof(SubstTable));
-
- for (UInt32 j = 0; j < 256; j++)
- for (UInt32 i = 0; i < passwordLen; i += 2)
- {
- UInt32 n2 = (Byte)g_CrcTable[(psw[i + 1] + j) & 0xFF];
- UInt32 n1 = (Byte)g_CrcTable[(psw[i] - j) & 0xFF];
- for (UInt32 k = 1; (n1 & 0xFF) != n2; n1++, k++)
- Swap(&SubstTable[n1 & 0xFF], &SubstTable[(n1 + i + k) & 0xFF]);
- }
- for (UInt32 i = 0; i < passwordLen; i+= 16)
- EncryptBlock(&psw[i]);
-}
-
-void CData::CryptBlock(Byte *buf, bool encrypt)
-{
- Byte inBuf[16];
- UInt32 A, B, C, D, T, TA, TB;
-
- A = GetUi32(buf + 0) ^ Keys[0];
- B = GetUi32(buf + 4) ^ Keys[1];
- C = GetUi32(buf + 8) ^ Keys[2];
- D = GetUi32(buf + 12) ^ Keys[3];
-
- if (!encrypt)
- memcpy(inBuf, buf, sizeof(inBuf));
-
- for (int i = 0; i < kNumRounds; i++)
- {
- UInt32 key = Keys[(encrypt ? i : (kNumRounds - 1 - i)) & 3];
- T = ((C + rotlFixed(D, 11)) ^ key);
- TA = A ^ SubstLong(T);
- T = ((D ^ rotlFixed(C, 17)) + key);
- TB = B ^ SubstLong(T);
- A = C;
- B = D;
- C = TA;
- D = TB;
- }
-
- SetUi32(buf + 0, C ^ Keys[0]);
- SetUi32(buf + 4, D ^ Keys[1]);
- SetUi32(buf + 8, A ^ Keys[2]);
- SetUi32(buf + 12, B ^ Keys[3]);
-
- UpdateKeys(encrypt ? buf : inBuf);
-}
-
-STDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
- _cipher.SetPassword(data, size);
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::Init()
-{
- return S_OK;
-}
-
-static const UInt32 kBlockSize = 16;
-
-STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)
-{
- if (size == 0)
- return 0;
- if (size < kBlockSize)
- return kBlockSize;
- UInt32 i;
- size -= kBlockSize;
- for (i = 0; i <= size; i += kBlockSize)
- _cipher.DecryptBlock(data + i);
- return i;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/Rar20Crypto.h b/src/libs/7zip/win/CPP/7zip/Crypto/Rar20Crypto.h
deleted file mode 100644
index b9648f59d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/Rar20Crypto.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Crypto/Rar20Crypto.h
-
-#ifndef __CRYPTO_RAR20_CRYPTO_H
-#define __CRYPTO_RAR20_CRYPTO_H
-
-#include "Common/MyCom.h"
-
-#include "../ICoder.h"
-#include "../IPassword.h"
-
-namespace NCrypto {
-namespace NRar20 {
-
-class CData
-{
- Byte SubstTable[256];
- UInt32 Keys[4];
-
- UInt32 SubstLong(UInt32 t)
- {
- return (UInt32)SubstTable[(int)t & 255] |
- ((UInt32)SubstTable[(int)(t >> 8) & 255] << 8) |
- ((UInt32)SubstTable[(int)(t >> 16) & 255] << 16) |
- ((UInt32)SubstTable[(int)(t >> 24) & 255] << 24);
- }
- void UpdateKeys(const Byte *data);
- void CryptBlock(Byte *buf, bool encrypt);
-public:
- void EncryptBlock(Byte *buf) { CryptBlock(buf, true); }
- void DecryptBlock(Byte *buf) { CryptBlock(buf, false); }
- void SetPassword(const Byte *password, UInt32 passwordLen);
-};
-
-class CDecoder:
- public ICompressFilter,
- public ICryptoSetPassword,
- public CMyUnknownImp
-{
- CData _cipher;
-public:
- MY_UNKNOWN_IMP1(ICryptoSetPassword)
-
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/RarAes.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/RarAes.cpp
deleted file mode 100644
index b0f00ea85..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/RarAes.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-// Crypto/RarAes.cpp
-// Note: you must include MyAes.cpp to project to initialize AES tables
-
-#include "StdAfx.h"
-
-#include "RarAes.h"
-#include "Sha1.h"
-
-namespace NCrypto {
-namespace NRar29 {
-
-CDecoder::CDecoder():
- _thereIsSalt(false),
- _needCalculate(true),
- _rar350Mode(false)
-{
- for (int i = 0; i < sizeof(_salt); i++)
- _salt[i] = 0;
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- bool thereIsSaltPrev = _thereIsSalt;
- _thereIsSalt = false;
- if (size == 0)
- return S_OK;
- if (size < 8)
- return E_INVALIDARG;
- _thereIsSalt = true;
- bool same = false;
- if (_thereIsSalt == thereIsSaltPrev)
- {
- same = true;
- if (_thereIsSalt)
- {
- for (unsigned i = 0; i < sizeof(_salt); i++)
- if (_salt[i] != data[i])
- {
- same = false;
- break;
- }
- }
- }
- for (unsigned i = 0; i < sizeof(_salt); i++)
- _salt[i] = data[i];
- if (!_needCalculate && !same)
- _needCalculate = true;
- return S_OK;
-}
-
-static const unsigned kMaxPasswordLength = 127 * 2;
-
-STDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
- if (size > kMaxPasswordLength)
- size = kMaxPasswordLength;
- bool same = false;
- if (size == buffer.GetCapacity())
- {
- same = true;
- for (UInt32 i = 0; i < size; i++)
- if (data[i] != buffer[i])
- {
- same = false;
- break;
- }
- }
- if (!_needCalculate && !same)
- _needCalculate = true;
- buffer.SetCapacity(size);
- memcpy(buffer, data, size);
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::Init()
-{
- Calculate();
- SetKey(aesKey, kRarAesKeySize);
- AesCbc_Init(_aes + _offset, _aesInit);
- return S_OK;
-}
-
-void CDecoder::Calculate()
-{
- if (_needCalculate)
- {
- const unsigned kSaltSize = 8;
-
- Byte rawPassword[kMaxPasswordLength + kSaltSize];
-
- memcpy(rawPassword, buffer, buffer.GetCapacity());
-
- size_t rawLength = buffer.GetCapacity();
-
- if (_thereIsSalt)
- {
- memcpy(rawPassword + rawLength, _salt, kSaltSize);
- rawLength += kSaltSize;
- }
-
- NSha1::CContext sha;
- sha.Init();
-
- // rar reverts hash for sha.
- const unsigned kNumRounds = (1 << 18);
- unsigned i;
- for (i = 0; i < kNumRounds; i++)
- {
- sha.UpdateRar(rawPassword, rawLength, _rar350Mode);
- Byte pswNum[3] = { (Byte)i, (Byte)(i >> 8), (Byte)(i >> 16) };
- sha.UpdateRar(pswNum, 3, _rar350Mode);
- if (i % (kNumRounds / 16) == 0)
- {
- NSha1::CContext shaTemp = sha;
- Byte digest[NSha1::kDigestSize];
- shaTemp.Final(digest);
- _aesInit[i / (kNumRounds / 16)] = (Byte)digest[4 * 4 + 3];
- }
- }
- /*
- // it's test message for sha
- const char *message = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
- sha.Update((const Byte *)message, strlen(message));
- */
- Byte digest[20];
- sha.Final(digest);
- for (i = 0; i < 4; i++)
- for (unsigned j = 0; j < 4; j++)
- aesKey[i * 4 + j] = (digest[i * 4 + 3 - j]);
- }
- _needCalculate = false;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/RarAes.h b/src/libs/7zip/win/CPP/7zip/Crypto/RarAes.h
deleted file mode 100644
index 119cc2336..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/RarAes.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Crypto/RarAes.h
-
-#ifndef __CRYPTO_RAR_AES_H
-#define __CRYPTO_RAR_AES_H
-
-#include "../../../C/Aes.h"
-
-#include "Common/Buffer.h"
-
-#include "../IPassword.h"
-
-#include "MyAes.h"
-
-namespace NCrypto {
-namespace NRar29 {
-
-const UInt32 kRarAesKeySize = 16;
-
-class CDecoder:
- public CAesCbcDecoder,
- public ICompressSetDecoderProperties2,
- public ICryptoSetPassword
-{
- Byte _salt[8];
- bool _thereIsSalt;
- CByteBuffer buffer;
- Byte aesKey[kRarAesKeySize];
- Byte _aesInit[AES_BLOCK_SIZE];
- bool _needCalculate;
- bool _rar350Mode;
-
- void Calculate();
-public:
- MY_UNKNOWN_IMP2(
- ICryptoSetPassword,
- ICompressSetDecoderProperties2)
- STDMETHOD(Init)();
- STDMETHOD(CryptoSetPassword)(const Byte *aData, UInt32 aSize);
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
- CDecoder();
- void SetRar350Mode(bool rar350Mode) { _rar350Mode = rar350Mode; }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/Sha1.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/Sha1.cpp
deleted file mode 100644
index 82ca986c7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/Sha1.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-// Crypto/Sha1.cpp
-// This file is based on public domain
-// Steve Reid and Wei Dai's code from Crypto++
-
-#include "StdAfx.h"
-
-#include "../../../C/RotateDefs.h"
-
-#include "Sha1.h"
-
-namespace NCrypto {
-namespace NSha1 {
-
-// define it for speed optimization
-// #define _SHA1_UNROLL
-
-static const unsigned kNumW =
- #ifdef _SHA1_UNROLL
- 16;
- #else
- 80;
- #endif
-
-
-#define w0(i) (W[(i)] = data[(i)])
-
-#ifdef _SHA1_UNROLL
-#define w1(i) (W[(i)&15] = rotlFixed(W[((i)-3)&15] ^ W[((i)-8)&15] ^ W[((i)-14)&15] ^ W[((i)-16)&15], 1))
-#else
-#define w1(i) (W[(i)] = rotlFixed(W[(i)-3] ^ W[(i)-8] ^ W[(i)-14] ^ W[(i)-16], 1))
-#endif
-
-#define f1(x,y,z) (z^(x&(y^z)))
-#define f2(x,y,z) (x^y^z)
-#define f3(x,y,z) ((x&y)|(z&(x|y)))
-#define f4(x,y,z) (x^y^z)
-
-#define RK1(a,b,c,d,e,i, f, w, k) e += f(b,c,d) + w(i) + k + rotlFixed(a,5); b = rotlFixed(b,30);
-
-#define R0(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f1, w0, 0x5A827999)
-#define R1(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f1, w1, 0x5A827999)
-#define R2(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f2, w1, 0x6ED9EBA1)
-#define R3(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f3, w1, 0x8F1BBCDC)
-#define R4(a,b,c,d,e,i) RK1(a,b,c,d,e,i, f4, w1, 0xCA62C1D6)
-
-#define RX_1_4(rx1, rx4, i) rx1(a,b,c,d,e,i); rx4(e,a,b,c,d,i+1); rx4(d,e,a,b,c,i+2); rx4(c,d,e,a,b,i+3); rx4(b,c,d,e,a,i+4);
-#define RX_5(rx, i) RX_1_4(rx, rx, i);
-
-void CContextBase::Init()
-{
- _state[0] = 0x67452301;
- _state[1] = 0xEFCDAB89;
- _state[2] = 0x98BADCFE;
- _state[3] = 0x10325476;
- _state[4] = 0xC3D2E1F0;
- _count = 0;
-}
-
-void CContextBase::GetBlockDigest(UInt32 *data, UInt32 *destDigest, bool returnRes)
-{
- UInt32 a, b, c, d, e;
- UInt32 W[kNumW];
-
- a = _state[0];
- b = _state[1];
- c = _state[2];
- d = _state[3];
- e = _state[4];
- #ifdef _SHA1_UNROLL
- RX_5(R0, 0); RX_5(R0, 5); RX_5(R0, 10);
- #else
- int i;
- for (i = 0; i < 15; i += 5) { RX_5(R0, i); }
- #endif
-
- RX_1_4(R0, R1, 15);
-
-
- #ifdef _SHA1_UNROLL
- RX_5(R2, 20); RX_5(R2, 25); RX_5(R2, 30); RX_5(R2, 35);
- RX_5(R3, 40); RX_5(R3, 45); RX_5(R3, 50); RX_5(R3, 55);
- RX_5(R4, 60); RX_5(R4, 65); RX_5(R4, 70); RX_5(R4, 75);
- #else
- i = 20;
- for (; i < 40; i += 5) { RX_5(R2, i); }
- for (; i < 60; i += 5) { RX_5(R3, i); }
- for (; i < 80; i += 5) { RX_5(R4, i); }
- #endif
-
- destDigest[0] = _state[0] + a;
- destDigest[1] = _state[1] + b;
- destDigest[2] = _state[2] + c;
- destDigest[3] = _state[3] + d;
- destDigest[4] = _state[4] + e;
-
- if (returnRes)
- for (int i = 0 ; i < 16; i++)
- data[i] = W[kNumW - 16 + i];
-
- // Wipe variables
- // a = b = c = d = e = 0;
-}
-
-void CContextBase::PrepareBlock(UInt32 *block, unsigned size) const
-{
- unsigned curBufferPos = size & 0xF;
- block[curBufferPos++] = 0x80000000;
- while (curBufferPos != (16 - 2))
- block[curBufferPos++] = 0;
- const UInt64 lenInBits = (_count << 9) + ((UInt64)size << 5);
- block[curBufferPos++] = (UInt32)(lenInBits >> 32);
- block[curBufferPos++] = (UInt32)(lenInBits);
-}
-
-void CContext::Update(const Byte *data, size_t size)
-{
- unsigned curBufferPos = _count2;
- while (size--)
- {
- int pos = (int)(curBufferPos & 3);
- if (pos == 0)
- _buffer[curBufferPos >> 2] = 0;
- _buffer[curBufferPos >> 2] |= ((UInt32)*data++) << (8 * (3 - pos));
- if (++curBufferPos == kBlockSize)
- {
- curBufferPos = 0;
- CContextBase::UpdateBlock(_buffer, false);
- }
- }
- _count2 = curBufferPos;
-}
-
-void CContext::UpdateRar(Byte *data, size_t size, bool rar350Mode)
-{
- bool returnRes = false;
- unsigned curBufferPos = _count2;
- while (size--)
- {
- int pos = (int)(curBufferPos & 3);
- if (pos == 0)
- _buffer[curBufferPos >> 2] = 0;
- _buffer[curBufferPos >> 2] |= ((UInt32)*data++) << (8 * (3 - pos));
- if (++curBufferPos == kBlockSize)
- {
- curBufferPos = 0;
- CContextBase::UpdateBlock(_buffer, returnRes);
- if (returnRes)
- for (int i = 0; i < kBlockSizeInWords; i++)
- {
- UInt32 d = _buffer[i];
- data[i * 4 + 0 - kBlockSize] = (Byte)(d);
- data[i * 4 + 1 - kBlockSize] = (Byte)(d >> 8);
- data[i * 4 + 2 - kBlockSize] = (Byte)(d >> 16);
- data[i * 4 + 3 - kBlockSize] = (Byte)(d >> 24);
- }
- returnRes = rar350Mode;
- }
- }
- _count2 = curBufferPos;
-}
-
-void CContext::Final(Byte *digest)
-{
- const UInt64 lenInBits = (_count << 9) + ((UInt64)_count2 << 3);
- unsigned curBufferPos = _count2;
- int pos = (int)(curBufferPos & 3);
- curBufferPos >>= 2;
- if (pos == 0)
- _buffer[curBufferPos] = 0;
- _buffer[curBufferPos++] |= ((UInt32)0x80) << (8 * (3 - pos));
-
- while (curBufferPos != (16 - 2))
- {
- curBufferPos &= 0xF;
- if (curBufferPos == 0)
- UpdateBlock();
- _buffer[curBufferPos++] = 0;
- }
- _buffer[curBufferPos++] = (UInt32)(lenInBits >> 32);
- _buffer[curBufferPos++] = (UInt32)(lenInBits);
- UpdateBlock();
-
- int i;
- for (i = 0; i < kDigestSizeInWords; i++)
- {
- UInt32 state = _state[i] & 0xFFFFFFFF;
- *digest++ = (Byte)(state >> 24);
- *digest++ = (Byte)(state >> 16);
- *digest++ = (Byte)(state >> 8);
- *digest++ = (Byte)(state);
- }
- Init();
-}
-
-///////////////////////////
-// Words version
-
-void CContext32::Update(const UInt32 *data, size_t size)
-{
- while (size--)
- {
- _buffer[_count2++] = *data++;
- if (_count2 == kBlockSizeInWords)
- {
- _count2 = 0;
- UpdateBlock();
- }
- }
-}
-
-void CContext32::Final(UInt32 *digest)
-{
- const UInt64 lenInBits = (_count << 9) + ((UInt64)_count2 << 5);
- unsigned curBufferPos = _count2;
- _buffer[curBufferPos++] = 0x80000000;
- while (curBufferPos != (16 - 2))
- {
- curBufferPos &= 0xF;
- if (curBufferPos == 0)
- UpdateBlock();
- _buffer[curBufferPos++] = 0;
- }
- _buffer[curBufferPos++] = (UInt32)(lenInBits >> 32);
- _buffer[curBufferPos++] = (UInt32)(lenInBits);
- GetBlockDigest(_buffer, digest);
- Init();
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/Sha1.h b/src/libs/7zip/win/CPP/7zip/Crypto/Sha1.h
deleted file mode 100644
index 1bad1f91f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/Sha1.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Crypto/Sha1.h
-// This file is based on public domain
-// Steve Reid and Wei Dai's code from Crypto++
-
-#ifndef __CRYPTO_SHA1_H
-#define __CRYPTO_SHA1_H
-
-#include <stddef.h>
-#include "../../Common/Types.h"
-
-// Sha1 implementation in RAR before version 3.60 has bug:
-// it changes data bytes in some cases.
-// So this class supports both versions: normal_SHA and rar3Mode
-
-namespace NCrypto {
-namespace NSha1 {
-
-const unsigned kBlockSize = 64;
-const unsigned kDigestSize = 20;
-
-const unsigned kBlockSizeInWords = (kBlockSize >> 2);
-const unsigned kDigestSizeInWords = (kDigestSize >> 2);
-
-class CContextBase
-{
-protected:
- UInt32 _state[5];
- UInt64 _count;
- void UpdateBlock(UInt32 *data, bool returnRes = false)
- {
- GetBlockDigest(data, _state, returnRes);
- _count++;
- }
-public:
- void Init();
- void GetBlockDigest(UInt32 *blockData, UInt32 *destDigest, bool returnRes = false);
- // PrepareBlock can be used only when size <= 13. size in Words
- void PrepareBlock(UInt32 *block, unsigned int size) const;
-};
-
-class CContextBase2: public CContextBase
-{
-protected:
- unsigned _count2;
- UInt32 _buffer[kBlockSizeInWords];
- void UpdateBlock() { CContextBase::UpdateBlock(_buffer); }
-public:
- void Init() { CContextBase::Init(); _count2 = 0; }
-};
-
-class CContext: public CContextBase2
-{
-public:
- void Update(const Byte *data, size_t size);
- void UpdateRar(Byte *data, size_t size, bool rar350Mode);
- void Final(Byte *digest);
-};
-
-class CContext32: public CContextBase2
-{
-public:
- void Update(const UInt32 *data, size_t size);
- void Final(UInt32 *digest);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Crypto/StdAfx.h
deleted file mode 100644
index 99a8aa46d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../Common/MyWindows.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/WzAes.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/WzAes.cpp
deleted file mode 100644
index 08a1818c0..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/WzAes.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-// Crypto/WzAes.cpp
-/*
-This code implements Brian Gladman's scheme
-specified in password Based File Encryption Utility.
-
-Note: you must include MyAes.cpp to project to initialize AES tables
-*/
-
-#include "StdAfx.h"
-
-#include "../Common/StreamObjects.h"
-#include "../Common/StreamUtils.h"
-
-#include "Pbkdf2HmacSha1.h"
-#include "RandGen.h"
-#include "WzAes.h"
-
-// define it if you don't want to use speed-optimized version of Pbkdf2HmacSha1
-// #define _NO_WZAES_OPTIMIZATIONS
-
-namespace NCrypto {
-namespace NWzAes {
-
-const unsigned kAesKeySizeMax = 32;
-
-static const UInt32 kNumKeyGenIterations = 1000;
-
-STDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
- if(size > kPasswordSizeMax)
- return E_INVALIDARG;
- _key.Password.SetCapacity(size);
- memcpy(_key.Password, data, size);
- return S_OK;
-}
-
-#ifndef _NO_WZAES_OPTIMIZATIONS
-
-static void BytesToBeUInt32s(const Byte *src, UInt32 *dest, unsigned destSize)
-{
- for (unsigned i = 0; i < destSize; i++)
- dest[i] =
- ((UInt32)(src[i * 4 + 0]) << 24) |
- ((UInt32)(src[i * 4 + 1]) << 16) |
- ((UInt32)(src[i * 4 + 2]) << 8) |
- ((UInt32)(src[i * 4 + 3]));
-}
-
-#endif
-
-STDMETHODIMP CBaseCoder::Init()
-{
- UInt32 keySize = _key.GetKeySize();
- UInt32 keysTotalSize = 2 * keySize + kPwdVerifCodeSize;
- Byte buf[2 * kAesKeySizeMax + kPwdVerifCodeSize];
-
- // for (unsigned ii = 0; ii < 1000; ii++)
- {
- #ifdef _NO_WZAES_OPTIMIZATIONS
-
- NSha1::Pbkdf2Hmac(
- _key.Password, _key.Password.GetCapacity(),
- _key.Salt, _key.GetSaltSize(),
- kNumKeyGenIterations,
- buf, keysTotalSize);
-
- #else
-
- UInt32 buf32[(2 * kAesKeySizeMax + kPwdVerifCodeSize + 3) / 4];
- UInt32 key32SizeTotal = (keysTotalSize + 3) / 4;
- UInt32 salt[kSaltSizeMax * 4];
- UInt32 saltSizeInWords = _key.GetSaltSize() / 4;
- BytesToBeUInt32s(_key.Salt, salt, saltSizeInWords);
- NSha1::Pbkdf2Hmac32(
- _key.Password, _key.Password.GetCapacity(),
- salt, saltSizeInWords,
- kNumKeyGenIterations,
- buf32, key32SizeTotal);
- for (UInt32 j = 0; j < keysTotalSize; j++)
- buf[j] = (Byte)(buf32[j / 4] >> (24 - 8 * (j & 3)));
-
- #endif
- }
-
- _hmac.SetKey(buf + keySize, keySize);
- memcpy(_key.PwdVerifComputed, buf + 2 * keySize, kPwdVerifCodeSize);
-
- AesCtr2_Init(&_aes);
- Aes_SetKey_Enc(_aes.aes + _aes.offset + 8, buf, keySize);
- return S_OK;
-}
-
-HRESULT CEncoder::WriteHeader(ISequentialOutStream *outStream)
-{
- UInt32 saltSize = _key.GetSaltSize();
- g_RandomGenerator.Generate(_key.Salt, saltSize);
- Init();
- RINOK(WriteStream(outStream, _key.Salt, saltSize));
- return WriteStream(outStream, _key.PwdVerifComputed, kPwdVerifCodeSize);
-}
-
-HRESULT CEncoder::WriteFooter(ISequentialOutStream *outStream)
-{
- Byte mac[kMacSize];
- _hmac.Final(mac, kMacSize);
- return WriteStream(outStream, mac, kMacSize);
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- if (size != 1)
- return E_INVALIDARG;
- _key.Init();
- return SetKeyMode(data[0]) ? S_OK : E_INVALIDARG;
-}
-
-HRESULT CDecoder::ReadHeader(ISequentialInStream *inStream)
-{
- UInt32 saltSize = _key.GetSaltSize();
- UInt32 extraSize = saltSize + kPwdVerifCodeSize;
- Byte temp[kSaltSizeMax + kPwdVerifCodeSize];
- RINOK(ReadStream_FAIL(inStream, temp, extraSize));
- UInt32 i;
- for (i = 0; i < saltSize; i++)
- _key.Salt[i] = temp[i];
- for (i = 0; i < kPwdVerifCodeSize; i++)
- _pwdVerifFromArchive[i] = temp[saltSize + i];
- return S_OK;
-}
-
-static bool CompareArrays(const Byte *p1, const Byte *p2, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- if (p1[i] != p2[i])
- return false;
- return true;
-}
-
-bool CDecoder::CheckPasswordVerifyCode()
-{
- return CompareArrays(_key.PwdVerifComputed, _pwdVerifFromArchive, kPwdVerifCodeSize);
-}
-
-HRESULT CDecoder::CheckMac(ISequentialInStream *inStream, bool &isOK)
-{
- isOK = false;
- Byte mac1[kMacSize];
- RINOK(ReadStream_FAIL(inStream, mac1, kMacSize));
- Byte mac2[kMacSize];
- _hmac.Final(mac2, kMacSize);
- isOK = CompareArrays(mac1, mac2, kMacSize);
- return S_OK;
-}
-
-CAesCtr2::CAesCtr2()
-{
- offset = ((0 - (unsigned)(ptrdiff_t)aes) & 0xF) / sizeof(UInt32);
-}
-
-void AesCtr2_Init(CAesCtr2 *p)
-{
- UInt32 *ctr = p->aes + p->offset + 4;
- unsigned i;
- for (i = 0; i < 4; i++)
- ctr[i] = 0;
- p->pos = AES_BLOCK_SIZE;
-}
-
-void AesCtr2_Code(CAesCtr2 *p, Byte *data, SizeT size)
-{
- unsigned pos = p->pos;
- UInt32 *buf32 = p->aes + p->offset;
- if (size == 0)
- return;
- if (pos != AES_BLOCK_SIZE)
- {
- const Byte *buf = (const Byte *)buf32;
- do
- *data++ ^= buf[pos++];
- while (--size != 0 && pos != AES_BLOCK_SIZE);
- }
- if (size >= 16)
- {
- SizeT size2 = size >> 4;
- g_AesCtr_Code(buf32 + 4, data, size2);
- size2 <<= 4;
- data += size2;
- size -= size2;
- pos = AES_BLOCK_SIZE;
- }
- if (size != 0)
- {
- unsigned j;
- const Byte *buf;
- for (j = 0; j < 4; j++)
- buf32[j] = 0;
- g_AesCtr_Code(buf32 + 4, (Byte *)buf32, 1);
- buf = (const Byte *)buf32;
- pos = 0;
- do
- *data++ ^= buf[pos++];
- while (--size != 0 && pos != AES_BLOCK_SIZE);
- }
- p->pos = pos;
-}
-
-STDMETHODIMP_(UInt32) CEncoder::Filter(Byte *data, UInt32 size)
-{
- AesCtr2_Code(&_aes, data, size);
- _hmac.Update(data, size);
- return size;
-}
-
-STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)
-{
- _hmac.Update(data, size);
- AesCtr2_Code(&_aes, data, size);
- return size;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/WzAes.h b/src/libs/7zip/win/CPP/7zip/Crypto/WzAes.h
deleted file mode 100644
index f37fe6440..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/WzAes.h
+++ /dev/null
@@ -1,125 +0,0 @@
-// Crypto/WzAes.h
-/*
-This code implements Brian Gladman's scheme
-specified in password Based File Encryption Utility:
- - AES encryption (128,192,256-bit) in Counter (CTR) mode.
- - HMAC-SHA1 authentication for encrypted data (10 bytes)
- - Keys are derived by PPKDF2(RFC2898)-HMAC-SHA1 from ASCII password and
- Salt (saltSize = aesKeySize / 2).
- - 2 bytes contain Password Verifier's Code
-*/
-
-#ifndef __CRYPTO_WZ_AES_H
-#define __CRYPTO_WZ_AES_H
-
-#include "../../../C/Aes.h"
-
-#include "Common/Buffer.h"
-#include "Common/MyCom.h"
-#include "Common/MyVector.h"
-
-#include "../ICoder.h"
-#include "../IPassword.h"
-
-#include "HmacSha1.h"
-
-namespace NCrypto {
-namespace NWzAes {
-
-const unsigned kSaltSizeMax = 16;
-const unsigned kMacSize = 10;
-
-const UInt32 kPasswordSizeMax = 99; // 128;
-
-// Password Verification Code Size
-const unsigned kPwdVerifCodeSize = 2;
-
-enum EKeySizeMode
-{
- kKeySizeMode_AES128 = 1,
- kKeySizeMode_AES192 = 2,
- kKeySizeMode_AES256 = 3
-};
-
-class CKeyInfo
-{
-public:
- EKeySizeMode KeySizeMode;
- Byte Salt[kSaltSizeMax];
- Byte PwdVerifComputed[kPwdVerifCodeSize];
-
- CByteBuffer Password;
-
- UInt32 GetKeySize() const { return (8 * (KeySizeMode & 3) + 8); }
- UInt32 GetSaltSize() const { return (4 * (KeySizeMode & 3) + 4); }
-
- CKeyInfo() { Init(); }
- void Init() { KeySizeMode = kKeySizeMode_AES256; }
-};
-
-struct CAesCtr2
-{
- unsigned pos;
- unsigned offset;
- UInt32 aes[4 + AES_NUM_IVMRK_WORDS + 3];
- CAesCtr2();
-};
-
-void AesCtr2_Init(CAesCtr2 *p);
-void AesCtr2_Code(CAesCtr2 *p, Byte *data, SizeT size);
-
-class CBaseCoder:
- public ICompressFilter,
- public ICryptoSetPassword,
- public CMyUnknownImp
-{
-protected:
- CKeyInfo _key;
- NSha1::CHmac _hmac;
- Byte _pwdVerifFromArchive[kPwdVerifCodeSize];
- CAesCtr2 _aes;
-
-public:
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) = 0;
-
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-
- UInt32 GetHeaderSize() const { return _key.GetSaltSize() + kPwdVerifCodeSize; }
- bool SetKeyMode(unsigned mode)
- {
- if (mode < kKeySizeMode_AES128 || mode > kKeySizeMode_AES256)
- return false;
- _key.KeySizeMode = (EKeySizeMode)mode;
- return true;
- }
-};
-
-class CEncoder:
- public CBaseCoder
-{
-public:
- MY_UNKNOWN_IMP1(ICryptoSetPassword)
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- HRESULT WriteHeader(ISequentialOutStream *outStream);
- HRESULT WriteFooter(ISequentialOutStream *outStream);
-};
-
-class CDecoder:
- public CBaseCoder,
- public ICompressSetDecoderProperties2
-{
-public:
- MY_UNKNOWN_IMP2(
- ICryptoSetPassword,
- ICompressSetDecoderProperties2)
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
- HRESULT ReadHeader(ISequentialInStream *inStream);
- bool CheckPasswordVerifyCode();
- HRESULT CheckMac(ISequentialInStream *inStream, bool &isOK);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/ZipCrypto.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/ZipCrypto.cpp
deleted file mode 100644
index baaaf98e3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/ZipCrypto.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-// Crypto/ZipCrypto.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "RandGen.h"
-#include "ZipCrypto.h"
-
-namespace NCrypto {
-namespace NZip {
-
-void CCipher::UpdateKeys(Byte b)
-{
- Keys[0] = CRC_UPDATE_BYTE(Keys[0], b);
- Keys[1] = (Keys[1] + (Keys[0] & 0xFF)) * 0x8088405 + 1;
- Keys[2] = CRC_UPDATE_BYTE(Keys[2], (Byte)(Keys[1] >> 24));
-}
-
-STDMETHODIMP CCipher::CryptoSetPassword(const Byte *password, UInt32 passwordLen)
-{
- Keys[0] = 0x12345678;
- Keys[1] = 0x23456789;
- Keys[2] = 0x34567890;
- UInt32 i;
- for (i = 0; i < passwordLen; i++)
- UpdateKeys(password[i]);
- for (i = 0; i < 3; i++)
- Keys2[i] = Keys[i];
- return S_OK;
-}
-
-STDMETHODIMP CCipher::Init()
-{
- return S_OK;
-}
-
-Byte CCipher::DecryptByteSpec()
-{
- UInt32 temp = Keys[2] | 2;
- return (Byte)((temp * (temp ^ 1)) >> 8);
-}
-
-HRESULT CEncoder::WriteHeader(ISequentialOutStream *outStream, UInt32 crc)
-{
- Byte h[kHeaderSize];
- g_RandomGenerator.Generate(h, kHeaderSize - 2);
- h[kHeaderSize - 1] = (Byte)(crc >> 24);
- h[kHeaderSize - 2] = (Byte)(crc >> 16);
- RestoreKeys();
- Filter(h, kHeaderSize);
- return WriteStream(outStream, h, kHeaderSize);
-}
-
-STDMETHODIMP_(UInt32) CEncoder::Filter(Byte *data, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- {
- Byte b = data[i];
- data[i] = (Byte)(b ^ DecryptByteSpec());;
- UpdateKeys(b);
- }
- return size;
-}
-
-HRESULT CDecoder::ReadHeader(ISequentialInStream *inStream)
-{
- Byte h[kHeaderSize];
- RINOK(ReadStream_FAIL(inStream, h, kHeaderSize));
- RestoreKeys();
- Filter(h, kHeaderSize);
- return S_OK;
-}
-
-STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)
-{
- for (UInt32 i = 0; i < size; i++)
- {
- Byte c = (Byte)(data[i] ^ DecryptByteSpec());
- UpdateKeys(c);
- data[i] = c;
- }
- return size;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/ZipCrypto.h b/src/libs/7zip/win/CPP/7zip/Crypto/ZipCrypto.h
deleted file mode 100644
index 6f104beb4..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/ZipCrypto.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Crypto/ZipCrypto.h
-
-#ifndef __CRYPTO_ZIP_CRYPTO_H
-#define __CRYPTO_ZIP_CRYPTO_H
-
-#include "Common/MyCom.h"
-
-#include "../ICoder.h"
-#include "../IPassword.h"
-
-namespace NCrypto {
-namespace NZip {
-
-const unsigned kHeaderSize = 12;
-
-class CCipher:
- public ICompressFilter,
- public ICryptoSetPassword,
- public CMyUnknownImp
-{
- UInt32 Keys[3];
- UInt32 Keys2[3];
-
-protected:
- void UpdateKeys(Byte b);
- Byte DecryptByteSpec();
- void RestoreKeys()
- {
- for (int i = 0; i < 3; i++)
- Keys[i] = Keys2[i];
- }
-
-public:
- STDMETHOD(Init)();
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-};
-
-class CEncoder: public CCipher
-{
-public:
- MY_UNKNOWN_IMP1(ICryptoSetPassword)
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- HRESULT WriteHeader(ISequentialOutStream *outStream, UInt32 crc);
-};
-
-class CDecoder: public CCipher
-{
-public:
- MY_UNKNOWN_IMP1(ICryptoSetPassword)
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- HRESULT ReadHeader(ISequentialInStream *inStream);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/ZipStrong.cpp b/src/libs/7zip/win/CPP/7zip/Crypto/ZipStrong.cpp
deleted file mode 100644
index 1554b3489..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/ZipStrong.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-// Crypto/ZipStrong.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/CpuArch.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "MyAes.h"
-#include "Sha1.h"
-#include "ZipStrong.h"
-
-namespace NCrypto {
-namespace NZipStrong {
-
-static const UInt16 kAES128 = 0x660E;
-
-// DeriveKey* function is similar to CryptDeriveKey() from Windows.
-// But MSDN tells that we need such scheme only if
-// "the required key length is longer than the hash value"
-// but ZipStrong uses it always.
-
-static void DeriveKey2(const Byte *digest, Byte c, Byte *dest)
-{
- Byte buf[64];
- memset(buf, c, 64);
- for (unsigned i = 0; i < NSha1::kDigestSize; i++)
- buf[i] ^= digest[i];
- NSha1::CContext sha;
- sha.Init();
- sha.Update(buf, 64);
- sha.Final(dest);
-}
-
-static void DeriveKey(NSha1::CContext &sha, Byte *key)
-{
- Byte digest[NSha1::kDigestSize];
- sha.Final(digest);
- Byte temp[NSha1::kDigestSize * 2];
- DeriveKey2(digest, 0x36, temp);
- DeriveKey2(digest, 0x5C, temp + NSha1::kDigestSize);
- memcpy(key, temp, 32);
-}
-
-void CKeyInfo::SetPassword(const Byte *data, UInt32 size)
-{
- NSha1::CContext sha;
- sha.Init();
- sha.Update(data, size);
- DeriveKey(sha, MasterKey);
-}
-
-STDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
- _key.SetPassword(data, size);
- return S_OK;
-}
-
-HRESULT CDecoder::ReadHeader(ISequentialInStream *inStream, UInt32 /* crc */, UInt64 /* unpackSize */)
-{
- Byte temp[4];
- RINOK(ReadStream_FALSE(inStream, temp, 2));
- _ivSize = GetUi16(temp);
- if (_ivSize == 0)
- {
- return E_NOTIMPL;
- /*
- SetUi32(_iv, crc);
- for (int i = 0; i < 8; i++)
- _iv[4 + i] = (Byte)(unpackSize >> (8 * i));
- SetUi32(_iv + 12, 0);
- */
- }
- else if (_ivSize == 16)
- {
- RINOK(ReadStream_FALSE(inStream, _iv, _ivSize));
- }
- else
- return E_NOTIMPL;
- RINOK(ReadStream_FALSE(inStream, temp, 4));
- _remSize = GetUi32(temp);
- const UInt32 kAlign = 16;
- if (_remSize < 16 || _remSize > (1 << 18))
- return E_NOTIMPL;
- if (_remSize + kAlign > _buf.GetCapacity())
- {
- _buf.Free();
- _buf.SetCapacity(_remSize + kAlign);
- _bufAligned = (Byte *)((ptrdiff_t)((Byte *)_buf + kAlign - 1) & ~(ptrdiff_t)(kAlign - 1));
- }
- return ReadStream_FALSE(inStream, _bufAligned, _remSize);
-}
-
-HRESULT CDecoder::CheckPassword(bool &passwOK)
-{
- passwOK = false;
- if (_remSize < 16)
- return E_NOTIMPL;
- Byte *p = _bufAligned;
- UInt16 format = GetUi16(p);
- if (format != 3)
- return E_NOTIMPL;
- UInt16 algId = GetUi16(p + 2);
- if (algId < kAES128)
- return E_NOTIMPL;
- algId -= kAES128;
- if (algId > 2)
- return E_NOTIMPL;
- UInt16 bitLen = GetUi16(p + 4);
- UInt16 flags = GetUi16(p + 6);
- if (algId * 64 + 128 != bitLen)
- return E_NOTIMPL;
- _key.KeySize = 16 + algId * 8;
- if ((flags & 1) == 0)
- return E_NOTIMPL;
- if ((flags & 0x4000) != 0)
- {
- // Use 3DES
- return E_NOTIMPL;
- }
-
- UInt32 rdSize = GetUi16(p + 8);
- if ((rdSize & 0xF) != 0 || rdSize + 16 > _remSize)
- return E_NOTIMPL;
- memmove(p, p + 10, rdSize);
- Byte *validData = p + rdSize + 16;
- if (GetUi32(validData - 6) != 0) // reserved
- return E_NOTIMPL;
- UInt32 validSize = GetUi16(validData - 2);
- if ((validSize & 0xF) != 0 || 16 + rdSize + validSize != _remSize)
- return E_NOTIMPL;
-
-
- {
- RINOK(SetKey(_key.MasterKey, _key.KeySize));
- RINOK(SetInitVector(_iv, 16));
- Init();
- Filter(p, rdSize);
- }
-
- Byte fileKey[32];
- NSha1::CContext sha;
- sha.Init();
- sha.Update(_iv, 16);
- sha.Update(p, rdSize - 16); // we don't use last 16 bytes (PAD bytes)
- DeriveKey(sha, fileKey);
-
- RINOK(SetKey(fileKey, _key.KeySize));
- RINOK(SetInitVector(_iv, 16));
- Init();
- Filter(validData, validSize);
-
- if (validSize < 4)
- return E_NOTIMPL;
- validSize -= 4;
- if (GetUi32(validData + validSize) != CrcCalc(validData, validSize))
- return S_OK;
- passwOK = true;
- Init();
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Crypto/ZipStrong.h b/src/libs/7zip/win/CPP/7zip/Crypto/ZipStrong.h
deleted file mode 100644
index 151677ea6..000000000
--- a/src/libs/7zip/win/CPP/7zip/Crypto/ZipStrong.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Crypto/ZipStrong.h
-
-#ifndef __CRYPTO_ZIP_STRONG_H
-#define __CRYPTO_ZIP_STRONG_H
-
-#include "Common/Buffer.h"
-
-#include "../IPassword.h"
-
-#include "MyAes.h"
-
-namespace NCrypto {
-namespace NZipStrong {
-
-struct CKeyInfo
-{
- Byte MasterKey[32];
- UInt32 KeySize;
- void SetPassword(const Byte *data, UInt32 size);
-};
-
-class CBaseCoder:
- public CAesCbcDecoder,
- public ICryptoSetPassword
-{
-protected:
- CKeyInfo _key;
- CByteBuffer _buf;
- Byte *_bufAligned;
-public:
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-};
-
-class CDecoder: public CBaseCoder
-{
- UInt32 _ivSize;
- Byte _iv[16];
- UInt32 _remSize;
-public:
- MY_UNKNOWN_IMP1(ICryptoSetPassword)
- HRESULT ReadHeader(ISequentialInStream *inStream, UInt32 crc, UInt64 unpackSize);
- HRESULT CheckPassword(bool &passwOK);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall.cpp
deleted file mode 100644
index c2685f798..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall.cpp
+++ /dev/null
@@ -1,246 +0,0 @@
-// CompressCall.cpp
-
-#include "StdAfx.h"
-
-#include "Common/IntToString.h"
-#include "Common/MyCom.h"
-#include "Common/Random.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/FileDir.h"
-#include "Windows/FileMapping.h"
-#include "Windows/Process.h"
-#include "Windows/Synchronization.h"
-
-#include "../FileManager/ProgramLocation.h"
-#include "../FileManager/RegistryUtils.h"
-
-#include "CompressCall.h"
-
-using namespace NWindows;
-
-#define MY_TRY_BEGIN try {
-#define MY_TRY_FINISH } \
- catch(...) { ErrorMessageHRESULT(E_FAIL); return E_FAIL; }
-
-static LPCWSTR kShowDialogSwitch = L" -ad";
-static LPCWSTR kEmailSwitch = L" -seml.";
-static LPCWSTR kIncludeSwitch = L" -i";
-static LPCWSTR kArchiveTypeSwitch = L" -t";
-static LPCWSTR kArcIncludeSwitches = L" -an -ai";
-static LPCWSTR kStopSwitchParsing = L" --";
-static LPCWSTR kLargePagesDisable = L" -slp-";
-
-UString GetQuotedString(const UString &s)
-{
- return UString(L'\"') + s + UString(L'\"');
-}
-static void ErrorMessage(LPCWSTR message)
-{
- MessageBoxW(g_HWND, message, L"7-Zip", MB_ICONERROR | MB_OK);
-}
-
-static void ErrorMessageHRESULT(HRESULT res, LPCWSTR s = NULL)
-{
- UString s2 = HResultToMessage(res);
- if (s)
- {
- s2 += L'\n';
- s2 += s;
- }
- ErrorMessage(s2);
-}
-
-static HRESULT MyCreateProcess(LPCWSTR imageName, const UString &params,
- LPCWSTR curDir, bool waitFinish,
- NSynchronization::CBaseEvent *event)
-{
- CProcess process;
- WRes res = process.Create(imageName, params, curDir);
- if (res != 0)
- {
- ErrorMessageHRESULT(res, imageName);
- return res;
- }
- if (waitFinish)
- process.Wait();
- else if (event != NULL)
- {
- HANDLE handles[] = { process, *event };
- ::WaitForMultipleObjects(sizeof(handles) / sizeof(handles[0]), handles, FALSE, INFINITE);
- }
- return S_OK;
-}
-
-static void AddLagePagesSwitch(UString &params)
-{
- if (!ReadLockMemoryEnable())
- params += kLargePagesDisable;
-}
-
-static UString Get7zGuiPath()
-{
- UString path;
- GetProgramFolderPath(path);
- return path + L"7zG.exe";
-}
-
-class CRandNameGenerator
-{
- CRandom _random;
-public:
- CRandNameGenerator() { _random.Init(); }
- UString GenerateName()
- {
- wchar_t temp[16];
- ConvertUInt32ToString((UInt32)_random.Generate(), temp);
- return temp;
- }
-};
-
-static HRESULT CreateMap(const UStringVector &names,
- CFileMapping &fileMapping, NSynchronization::CManualResetEvent &event,
- UString &params)
-{
- UInt32 totalSize = 1;
- for (int i = 0; i < names.Size(); i++)
- totalSize += (names[i].Length() + 1);
- totalSize *= sizeof(wchar_t);
-
- CRandNameGenerator random;
-
- UString mappingName;
- for (;;)
- {
- mappingName = L"7zMap" + random.GenerateName();
-
- WRes res = fileMapping.Create(PAGE_READWRITE, totalSize, GetSystemString(mappingName));
- if (fileMapping.IsCreated() && res == 0)
- break;
- if (res != ERROR_ALREADY_EXISTS)
- return res;
- fileMapping.Close();
- }
-
- UString eventName;
- for (;;)
- {
- eventName = L"7zEvent" + random.GenerateName();
- WRes res = event.CreateWithName(false, GetSystemString(eventName));
- if (event.IsCreated() && res == 0)
- break;
- if (res != ERROR_ALREADY_EXISTS)
- return res;
- event.Close();
- }
-
- params += L'#';
- params += mappingName;
- params += L':';
- wchar_t temp[16];
- ConvertUInt32ToString(totalSize, temp);
- params += temp;
-
- params += L':';
- params += eventName;
-
- LPVOID data = fileMapping.Map(FILE_MAP_WRITE, 0, totalSize);
- if (data == NULL)
- return E_FAIL;
- CFileUnmapper unmapper(data);
- {
- wchar_t *cur = (wchar_t *)data;
- *cur++ = 0;
- for (int i = 0; i < names.Size(); i++)
- {
- const UString &s = names[i];
- int len = s.Length() + 1;
- memcpy(cur, (const wchar_t *)s, len * sizeof(wchar_t));
- cur += len;
- }
- }
- return S_OK;
-}
-
-HRESULT CompressFiles(
- const UString &arcPathPrefix,
- const UString &arcName,
- const UString &arcType,
- const UStringVector &names,
- bool email, bool showDialog, bool waitFinish)
-{
- MY_TRY_BEGIN
- UString params = L'a';
-
- CFileMapping fileMapping;
- NSynchronization::CManualResetEvent event;
- params += kIncludeSwitch;
- RINOK(CreateMap(names, fileMapping, event, params));
-
- if (!arcType.IsEmpty())
- {
- params += kArchiveTypeSwitch;
- params += arcType;
- }
-
- if (email)
- params += kEmailSwitch;
-
- if (showDialog)
- params += kShowDialogSwitch;
-
- AddLagePagesSwitch(params);
-
- params += kStopSwitchParsing;
- params += L' ';
-
- params += GetQuotedString(
- #ifdef UNDER_CE
- arcPathPrefix +
- #endif
- arcName);
-
- return MyCreateProcess(Get7zGuiPath(), params,
- (arcPathPrefix.IsEmpty()? 0: (LPCWSTR)arcPathPrefix), waitFinish, &event);
- MY_TRY_FINISH
-}
-
-static HRESULT ExtractGroupCommand(const UStringVector &arcPaths, UString &params)
-{
- AddLagePagesSwitch(params);
- params += kArcIncludeSwitches;
- CFileMapping fileMapping;
- NSynchronization::CManualResetEvent event;
- RINOK(CreateMap(arcPaths, fileMapping, event, params));
- return MyCreateProcess(Get7zGuiPath(), params, 0, false, &event);
-}
-
-HRESULT ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog)
-{
- MY_TRY_BEGIN
- UString params = L'x';
- if (!outFolder.IsEmpty())
- {
- params += L" -o";
- params += GetQuotedString(outFolder);
- }
- if (showDialog)
- params += kShowDialogSwitch;
- return ExtractGroupCommand(arcPaths, params);
- MY_TRY_FINISH
-}
-
-HRESULT TestArchives(const UStringVector &arcPaths)
-{
- MY_TRY_BEGIN
- UString params = L't';
- return ExtractGroupCommand(arcPaths, params);
- MY_TRY_FINISH
-}
-
-HRESULT Benchmark()
-{
- MY_TRY_BEGIN
- return MyCreateProcess(Get7zGuiPath(), L'b', 0, false, NULL);
- MY_TRY_FINISH
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall.h b/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall.h
deleted file mode 100644
index fc18df57c..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// CompressCall.h
-
-#ifndef __COMPRESS_CALL_H
-#define __COMPRESS_CALL_H
-
-#include "Common/MyString.h"
-
-UString GetQuotedString(const UString &s);
-
-extern HWND g_HWND;
-UString HResultToMessage(HRESULT errorCode);
-
-HRESULT CompressFiles(
- const UString &arcPathPrefix,
- const UString &arcName,
- const UString &arcType,
- const UStringVector &names,
- bool email, bool showDialog, bool waitFinish);
-
-HRESULT ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog);
-HRESULT TestArchives(const UStringVector &arcPaths);
-HRESULT Benchmark();
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall2.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall2.cpp
deleted file mode 100644
index 473f7d933..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/CompressCall2.cpp
+++ /dev/null
@@ -1,178 +0,0 @@
-// CompressCall.cpp
-
-#include "StdAfx.h"
-
-#include "Common/MyException.h"
-
-#include "../../UI/common/ArchiveCommandLine.h"
-
-#include "../../UI/GUI/BenchmarkDialog.h"
-#include "../../UI/GUI/ExtractGUI.h"
-#include "../../UI/GUI/UpdateGUI.h"
-
-#include "../../UI/GUI/ExtractRes.h"
-
-#include "CompressCall.h"
-
-#define MY_TRY_BEGIN try {
-#define MY_TRY_FINISH } \
- catch(CSystemException &e) { result = e.ErrorCode; } \
- catch(...) { result = E_FAIL; } \
- if (result != S_OK && result != E_ABORT) \
- ErrorMessageHRESULT(result);
-
-#define CREATE_CODECS \
- CCodecs *codecs = new CCodecs; \
- CMyComPtr<IUnknown> compressCodecsInfo = codecs; \
- result = codecs->Load(); \
- if (result != S_OK) \
- throw CSystemException(result);
-
-UString GetQuotedString(const UString &s)
-{
- return UString(L'\"') + s + UString(L'\"');
-}
-
-static void ErrorMessage(LPCWSTR message)
-{
- MessageBoxW(g_HWND, message, L"7-Zip", MB_ICONERROR);
-}
-
-static void ErrorMessageHRESULT(HRESULT res)
-{
- ErrorMessage(HResultToMessage(res));
-}
-
-static void ErrorLangMessage(UINT resourceID, UInt32 langID)
-{
- ErrorMessage(LangString(resourceID, langID));
-}
-
-HRESULT CompressFiles(
- const UString &arcPathPrefix,
- const UString &arcName,
- const UString &arcType,
- const UStringVector &names,
- bool email, bool showDialog, bool /* waitFinish */)
-{
- HRESULT result;
- MY_TRY_BEGIN
- CREATE_CODECS
-
- CUpdateCallbackGUI callback;
-
- callback.Init();
-
- CUpdateOptions uo;
- uo.EMailMode = email;
- uo.SetAddActionCommand();
-
- CIntVector formatIndices;
- if (!codecs->FindFormatForArchiveType(arcType, formatIndices))
- {
- ErrorLangMessage(IDS_UNSUPPORTED_ARCHIVE_TYPE, 0x0200060D);
- return E_FAIL;
- }
- if (!uo.Init(codecs, formatIndices, arcPathPrefix + arcName))
- {
- ErrorLangMessage(IDS_UPDATE_NOT_SUPPORTED, 0x02000601);
- return E_FAIL;
- }
-
- NWildcard::CCensor censor;
- for (int i = 0; i < names.Size(); i++)
- censor.AddItem(true, names[i], false);
-
- bool messageWasDisplayed = false;
- result = UpdateGUI(codecs, censor, uo, showDialog, messageWasDisplayed, &callback, g_HWND);
-
- if (result != S_OK)
- {
- if (result != E_ABORT && messageWasDisplayed)
- return E_FAIL;
- throw CSystemException(result);
- }
- if (callback.FailedFiles.Size() > 0)
- {
- if (!messageWasDisplayed)
- throw CSystemException(E_FAIL);
- return E_FAIL;
- }
- MY_TRY_FINISH
- return S_OK;
-}
-
-static HRESULT ExtractGroupCommand(const UStringVector &arcPaths,
- bool showDialog, const UString &outFolder, bool testMode)
-{
- HRESULT result;
- MY_TRY_BEGIN
- CREATE_CODECS
-
- CExtractOptions eo;
- eo.OutputDir = outFolder;
- eo.TestMode = testMode;
-
- CExtractCallbackImp *ecs = new CExtractCallbackImp;
- CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;
-
- ecs->Init();
-
- // eo.CalcCrc = options.CalcCrc;
-
- UStringVector arcPathsSorted;
- UStringVector arcFullPathsSorted;
- {
- NWildcard::CCensor acrCensor;
- for (int i = 0; i < arcPaths.Size(); i++)
- acrCensor.AddItem(true, arcPaths[i], false);
- EnumerateDirItemsAndSort(acrCensor, arcPathsSorted, arcFullPathsSorted);
- }
-
- CIntVector formatIndices;
-
- NWildcard::CCensor censor;
- censor.AddItem(true, L"*", false);
-
- bool messageWasDisplayed = false;
- result = ExtractGUI(codecs, formatIndices, arcPathsSorted, arcFullPathsSorted,
- censor.Pairs.Front().Head, eo, showDialog, messageWasDisplayed, ecs, g_HWND);
- if (result != S_OK)
- {
- if (result != E_ABORT && messageWasDisplayed)
- return E_FAIL;
- throw CSystemException(result);
- }
- return ecs->IsOK() ? S_OK : E_FAIL;
- MY_TRY_FINISH
- return result;
-}
-
-HRESULT ExtractArchives(const UStringVector &arcPaths, const UString &outFolder, bool showDialog)
-{
- return ExtractGroupCommand(arcPaths, showDialog, outFolder, false);
-}
-
-HRESULT TestArchives(const UStringVector &arcPaths)
-{
- return ExtractGroupCommand(arcPaths, true, UString(), true);
-}
-
-HRESULT Benchmark()
-{
- HRESULT result;
- MY_TRY_BEGIN
- CREATE_CODECS
-
- #ifdef EXTERNAL_CODECS
- CObjectVector<CCodecInfoEx> externalCodecs;
- RINOK(LoadExternalCodecs(codecs, externalCodecs));
- #endif
- result = Benchmark(
- #ifdef EXTERNAL_CODECS
- codecs, &externalCodecs,
- #endif
- (UInt32)-1, (UInt32)-1, g_HWND);
- MY_TRY_FINISH
- return result;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/Update.h b/src/libs/7zip/win/CPP/7zip/UI/Common/Update.h
index 49af0092a..ade001303 100644
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/Update.h
+++ b/src/libs/7zip/win/CPP/7zip/UI/Common/Update.h
@@ -116,11 +116,11 @@ struct CUpdateOptions
CUpdateOptions():
UpdateArchiveItself(true),
SfxMode(false),
+ OpenShareForWrite(false),
StdInMode(false),
StdOutMode(false),
EMailMode(false),
- EMailRemoveAfter(false),
- OpenShareForWrite(false)
+ EMailRemoveAfter(false)
{};
void SetAddActionCommand()
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/ZipRegistry.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/ZipRegistry.cpp
deleted file mode 100644
index ac178078a..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/ZipRegistry.cpp
+++ /dev/null
@@ -1,293 +0,0 @@
-// ZipRegistry.cpp
-
-#include "StdAfx.h"
-
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/FileDir.h"
-#include "Windows/Registry.h"
-#include "Windows/Synchronization.h"
-
-#include "ZipRegistry.h"
-
-using namespace NWindows;
-using namespace NRegistry;
-
-static NSynchronization::CCriticalSection g_CS;
-#define CS_LOCK NSynchronization::CCriticalSectionLock lock(g_CS);
-
-static const TCHAR *kCuPrefix = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-Zip") TEXT(STRING_PATH_SEPARATOR);
-
-static CSysString GetKeyPath(const CSysString &path) { return kCuPrefix + path; }
-
-static LONG OpenMainKey(CKey &key, LPCTSTR keyName)
-{
- return key.Open(HKEY_CURRENT_USER, GetKeyPath(keyName), KEY_READ);
-}
-
-static LONG CreateMainKey(CKey &key, LPCTSTR keyName)
-{
- return key.Create(HKEY_CURRENT_USER, GetKeyPath(keyName));
-}
-
-namespace NExtract
-{
-
-static const TCHAR *kKeyName = TEXT("Extraction");
-
-static const TCHAR *kExtractMode = TEXT("ExtractMode");
-static const TCHAR *kOverwriteMode = TEXT("OverwriteMode");
-static const TCHAR *kShowPassword = TEXT("ShowPassword");
-static const TCHAR *kPathHistory = TEXT("PathHistory");
-
-void CInfo::Save() const
-{
- CS_LOCK
- CKey key;
- CreateMainKey(key, kKeyName);
- key.SetValue(kExtractMode, (UInt32)PathMode);
- key.SetValue(kOverwriteMode, (UInt32)OverwriteMode);
- key.SetValue(kShowPassword, ShowPassword);
- key.RecurseDeleteKey(kPathHistory);
- key.SetValue_Strings(kPathHistory, Paths);
-}
-
-
-void CInfo::Load()
-{
- PathMode = NPathMode::kCurrentPathnames;
- OverwriteMode = NOverwriteMode::kAskBefore;
- ShowPassword = false;
- Paths.Clear();
-
- CS_LOCK
- CKey key;
- if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)
- return;
-
- key.GetValue_Strings(kPathHistory, Paths);
- UInt32 v;
- if (key.QueryValue(kExtractMode, v) == ERROR_SUCCESS && v <= NPathMode::kNoPathnames)
- PathMode = (NPathMode::EEnum)v;
- if (key.QueryValue(kOverwriteMode, v) == ERROR_SUCCESS && v <= NOverwriteMode::kAutoRenameExisting)
- OverwriteMode = (NOverwriteMode::EEnum)v;
- key.GetValue_IfOk(kShowPassword, ShowPassword);
-}
-
-}
-
-namespace NCompression
-{
-
-static const TCHAR *kKeyName = TEXT("Compression");
-
-static const TCHAR *kArcHistory = TEXT("ArcHistory");
-static const WCHAR *kArchiver = L"Archiver";
-static const TCHAR *kShowPassword = TEXT("ShowPassword");
-static const TCHAR *kEncryptHeaders = TEXT("EncryptHeaders");
-
-static const TCHAR *kOptionsKeyName = TEXT("Options");
-
-static const TCHAR *kLevel = TEXT("Level");
-static const TCHAR *kDictionary = TEXT("Dictionary");
-static const TCHAR *kOrder = TEXT("Order");
-static const TCHAR *kBlockSize = TEXT("BlockSize");
-static const TCHAR *kNumThreads = TEXT("NumThreads");
-static const WCHAR *kMethod = L"Method";
-static const WCHAR *kOptions = L"Options";
-static const WCHAR *kEncryptionMethod = L"EncryptionMethod";
-
-static void SetRegString(CKey &key, const WCHAR *name, const UString &value)
-{
- if (value.IsEmpty())
- key.DeleteValue(name);
- else
- key.SetValue(name, value);
-}
-
-static void SetRegUInt32(CKey &key, const TCHAR *name, UInt32 value)
-{
- if (value == (UInt32)-1)
- key.DeleteValue(name);
- else
- key.SetValue(name, value);
-}
-
-static void GetRegString(CKey &key, const WCHAR *name, UString &value)
-{
- if (key.QueryValue(name, value) != ERROR_SUCCESS)
- value.Empty();
-}
-
-static void GetRegUInt32(CKey &key, const TCHAR *name, UInt32 &value)
-{
- if (key.QueryValue(name, value) != ERROR_SUCCESS)
- value = (UInt32)-1;
-}
-
-void CInfo::Save() const
-{
- CS_LOCK
-
- CKey key;
- CreateMainKey(key, kKeyName);
- key.SetValue(kLevel, (UInt32)Level);
- key.SetValue(kArchiver, ArcType);
- key.SetValue(kShowPassword, ShowPassword);
- key.SetValue(kEncryptHeaders, EncryptHeaders);
- key.RecurseDeleteKey(kArcHistory);
- key.SetValue_Strings(kArcHistory, ArcPaths);
-
- key.RecurseDeleteKey(kOptionsKeyName);
- {
- CKey optionsKey;
- optionsKey.Create(key, kOptionsKeyName);
- for (int i = 0; i < Formats.Size(); i++)
- {
- const CFormatOptions &fo = Formats[i];
- CKey fk;
- fk.Create(optionsKey, fo.FormatID);
-
- SetRegUInt32(fk, kLevel, fo.Level);
- SetRegUInt32(fk, kDictionary, fo.Dictionary);
- SetRegUInt32(fk, kOrder, fo.Order);
- SetRegUInt32(fk, kBlockSize, fo.BlockLogSize);
- SetRegUInt32(fk, kNumThreads, fo.NumThreads);
-
- SetRegString(fk, kMethod, fo.Method);
- SetRegString(fk, kOptions, fo.Options);
- SetRegString(fk, kEncryptionMethod, fo.EncryptionMethod);
- }
- }
-}
-
-void CInfo::Load()
-{
- ArcPaths.Clear();
- Formats.Clear();
-
- Level = 5;
- ArcType = L"7z";
- ShowPassword = false;
- EncryptHeaders = false;
-
- CS_LOCK
- CKey key;
-
- if (OpenMainKey(key, kKeyName) != ERROR_SUCCESS)
- return;
-
- key.GetValue_Strings(kArcHistory, ArcPaths);
-
- {
- CKey optionsKey;
- if (optionsKey.Open(key, kOptionsKeyName, KEY_READ) == ERROR_SUCCESS)
- {
- CSysStringVector formatIDs;
- optionsKey.EnumKeys(formatIDs);
- for (int i = 0; i < formatIDs.Size(); i++)
- {
- CKey fk;
- CFormatOptions fo;
- fo.FormatID = formatIDs[i];
- if (fk.Open(optionsKey, fo.FormatID, KEY_READ) == ERROR_SUCCESS)
- {
- GetRegString(fk, kOptions, fo.Options);
- GetRegString(fk, kMethod, fo.Method);
- GetRegString(fk, kEncryptionMethod, fo.EncryptionMethod);
-
- GetRegUInt32(fk, kLevel, fo.Level);
- GetRegUInt32(fk, kDictionary, fo.Dictionary);
- GetRegUInt32(fk, kOrder, fo.Order);
- GetRegUInt32(fk, kBlockSize, fo.BlockLogSize);
- GetRegUInt32(fk, kNumThreads, fo.NumThreads);
-
- Formats.Add(fo);
- }
- }
- }
- }
-
- UString a;
- if (key.QueryValue(kArchiver, a) == ERROR_SUCCESS)
- ArcType = a;
- key.GetValue_IfOk(kLevel, Level);
- key.GetValue_IfOk(kShowPassword, ShowPassword);
- key.GetValue_IfOk(kEncryptHeaders, EncryptHeaders);
-}
-
-}
-
-static const TCHAR *kOptionsInfoKeyName = TEXT("Options");
-
-namespace NWorkDir
-{
-static const TCHAR *kWorkDirType = TEXT("WorkDirType");
-static const WCHAR *kWorkDirPath = L"WorkDirPath";
-static const TCHAR *kTempRemovableOnly = TEXT("TempRemovableOnly");
-
-
-void CInfo::Save()const
-{
- CS_LOCK
- CKey key;
- CreateMainKey(key, kOptionsInfoKeyName);
- key.SetValue(kWorkDirType, (UInt32)Mode);
- key.SetValue(kWorkDirPath, Path);
- key.SetValue(kTempRemovableOnly, ForRemovableOnly);
-}
-
-void CInfo::Load()
-{
- SetDefault();
-
- CS_LOCK
- CKey key;
- if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS)
- return;
-
- UInt32 dirType;
- if (key.QueryValue(kWorkDirType, dirType) != ERROR_SUCCESS)
- return;
- switch (dirType)
- {
- case NMode::kSystem:
- case NMode::kCurrent:
- case NMode::kSpecified:
- Mode = (NMode::EEnum)dirType;
- }
- if (key.QueryValue(kWorkDirPath, Path) != ERROR_SUCCESS)
- {
- Path.Empty();
- if (Mode == NMode::kSpecified)
- Mode = NMode::kSystem;
- }
- key.GetValue_IfOk(kTempRemovableOnly, ForRemovableOnly);
-}
-
-}
-
-static const TCHAR *kCascadedMenu = TEXT("CascadedMenu");
-static const TCHAR *kContextMenu = TEXT("ContextMenu");
-
-void CContextMenuInfo::Save() const
-{
- CS_LOCK
- CKey key;
- CreateMainKey(key, kOptionsInfoKeyName);
- key.SetValue(kCascadedMenu, Cascaded);
- key.SetValue(kContextMenu, Flags);
-}
-
-void CContextMenuInfo::Load()
-{
- Cascaded = true;
- Flags = (UInt32)-1;
- CS_LOCK
- CKey key;
- if (OpenMainKey(key, kOptionsInfoKeyName) != ERROR_SUCCESS)
- return;
- key.GetValue_IfOk(kCascadedMenu, Cascaded);
- key.GetValue_IfOk(kContextMenu, Flags);
-}
diff --git a/src/libs/7zip/win/CPP/Common/Lang.cpp b/src/libs/7zip/win/CPP/Common/Lang.cpp
deleted file mode 100644
index 75dfed426..000000000
--- a/src/libs/7zip/win/CPP/Common/Lang.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-// Common/Lang.cpp
-
-#include "StdAfx.h"
-
-#include "Lang.h"
-#include "TextConfig.h"
-
-#include "../Windows/FileIO.h"
-#include "UTFConvert.h"
-#include "Defs.h"
-
-static bool HexStringToNumber(const UString &s, UInt32 &value)
-{
- value = 0;
- if (s.IsEmpty())
- return false;
- for (int i = 0; i < s.Length(); i++)
- {
- wchar_t c = s[i];
- int a;
- if (c >= L'0' && c <= L'9')
- a = c - L'0';
- else if (c >= L'A' && c <= L'F')
- a = 10 + c - L'A';
- else if (c >= L'a' && c <= L'f')
- a = 10 + c - L'a';
- else
- return false;
- value *= 0x10;
- value += a;
- }
- return true;
-}
-
-
-static bool WaitNextLine(const AString &s, int &pos)
-{
- for (; pos < s.Length(); pos++)
- if (s[pos] == 0x0A)
- return true;
- return false;
-}
-
-static int CompareLangItems(void *const *elem1, void *const *elem2, void *)
-{
- const CLangPair &langPair1 = *(*((const CLangPair **)elem1));
- const CLangPair &langPair2 = *(*((const CLangPair **)elem2));
- return MyCompare(langPair1.Value, langPair2.Value);
-}
-
-bool CLang::Open(LPCWSTR fileName)
-{
- _langPairs.Clear();
- NWindows::NFile::NIO::CInFile file;
- if (!file.Open(fileName))
- return false;
- UInt64 length;
- if (!file.GetLength(length))
- return false;
- if (length > (1 << 20))
- return false;
- AString s;
- char *p = s.GetBuffer((int)length + 1);
- UInt32 processed;
- if (!file.Read(p, (UInt32)length, processed))
- return false;
- p[(UInt32)length] = 0;
- s.ReleaseBuffer();
- file.Close();
- int pos = 0;
- if (s.Length() >= 3)
- {
- if (Byte(s[0]) == 0xEF && Byte(s[1]) == 0xBB && Byte(s[2]) == 0xBF)
- pos += 3;
- }
-
- /////////////////////
- // read header
-
- AString stringID = ";!@Lang@!UTF-8!";
- if (s.Mid(pos, stringID.Length()) != stringID)
- return false;
- pos += stringID.Length();
-
- if (!WaitNextLine(s, pos))
- return false;
-
- CObjectVector<CTextConfigPair> pairs;
- if (!GetTextConfig(s.Mid(pos), pairs))
- return false;
-
- _langPairs.Reserve(_langPairs.Size());
- for (int i = 0; i < pairs.Size(); i++)
- {
- CTextConfigPair textConfigPair = pairs[i];
- CLangPair langPair;
- if (!HexStringToNumber(textConfigPair.ID, langPair.Value))
- return false;
- langPair.String = textConfigPair.String;
- _langPairs.Add(langPair);
- }
- _langPairs.Sort(CompareLangItems, NULL);
- return true;
-}
-
-int CLang::FindItem(UInt32 value) const
-{
- int left = 0, right = _langPairs.Size();
- while (left != right)
- {
- UInt32 mid = (left + right) / 2;
- UInt32 midValue = _langPairs[mid].Value;
- if (value == midValue)
- return mid;
- if (value < midValue)
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
-}
-
-bool CLang::GetMessage(UInt32 value, UString &message) const
-{
- int index = FindItem(value);
- if (index < 0)
- return false;
- message = _langPairs[index].String;
- return true;
-}
diff --git a/src/libs/7zip/win/CPP/Common/Lang.h b/src/libs/7zip/win/CPP/Common/Lang.h
deleted file mode 100644
index cf978758e..000000000
--- a/src/libs/7zip/win/CPP/Common/Lang.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Common/Lang.h
-
-#ifndef __COMMON_LANG_H
-#define __COMMON_LANG_H
-
-#include "MyVector.h"
-#include "MyString.h"
-#include "Types.h"
-
-struct CLangPair
-{
- UInt32 Value;
- UString String;
-};
-
-class CLang
-{
- CObjectVector<CLangPair> _langPairs;
-public:
- bool Open(LPCWSTR fileName);
- void Clear() { _langPairs.Clear(); }
- int FindItem(UInt32 value) const;
- bool GetMessage(UInt32 value, UString &message) const;
-};
-
-#endif
-
-
diff --git a/src/libs/7zip/win/CPP/Common/MyMap.cpp b/src/libs/7zip/win/CPP/Common/MyMap.cpp
deleted file mode 100644
index 0ee11e8cd..000000000
--- a/src/libs/7zip/win/CPP/Common/MyMap.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-// MyMap.cpp
-
-#include "StdAfx.h"
-
-#include "MyMap.h"
-
-static const unsigned kNumBitsMax = sizeof(UInt32) * 8;
-
-static UInt32 GetSubBits(UInt32 value, unsigned startPos, unsigned numBits)
-{
- if (startPos == sizeof(value) * 8)
- return 0;
- value >>= startPos;
- if (numBits == sizeof(value) * 8)
- return value;
- return value & (((UInt32)1 << numBits) - 1);
-}
-
-static inline unsigned GetSubBit(UInt32 v, unsigned n) { return (unsigned)(v >> n) & 1; }
-
-bool CMap32::Find(UInt32 key, UInt32 &valueRes) const
-{
- valueRes = (UInt32)(Int32)-1;
- if (Nodes.Size() == 0)
- return false;
- if (Nodes.Size() == 1)
- {
- const CNode &n = Nodes[0];
- if (n.Len == kNumBitsMax)
- {
- valueRes = n.Values[0];
- return (key == n.Key);
- }
- }
-
- int cur = 0;
- unsigned bitPos = kNumBitsMax;
- for (;;)
- {
- const CNode &n = Nodes[cur];
- bitPos -= n.Len;
- if (GetSubBits(key, bitPos, n.Len) != GetSubBits(n.Key, bitPos, n.Len))
- return false;
- unsigned bit = GetSubBit(key, --bitPos);
- if (n.IsLeaf[bit])
- {
- valueRes = n.Values[bit];
- return (key == n.Keys[bit]);
- }
- cur = (int)n.Keys[bit];
- }
-}
-
-bool CMap32::Set(UInt32 key, UInt32 value)
-{
- if (Nodes.Size() == 0)
- {
- CNode n;
- n.Key = n.Keys[0] = n.Keys[1] = key;
- n.Values[0] = n.Values[1] = value;
- n.IsLeaf[0] = n.IsLeaf[1] = 1;
- n.Len = kNumBitsMax;
- Nodes.Add(n);
- return false;
- }
- if (Nodes.Size() == 1)
- {
- CNode &n = Nodes[0];
- if (n.Len == kNumBitsMax)
- {
- if (key == n.Key)
- {
- n.Values[0] = n.Values[1] = value;
- return true;
- }
- unsigned i = kNumBitsMax - 1;
- for (;GetSubBit(key, i) == GetSubBit(n.Key, i); i--);
- n.Len = (UInt16)(kNumBitsMax - (1 + i));
- unsigned newBit = GetSubBit(key, i);
- n.Values[newBit] = value;
- n.Keys[newBit] = key;
- return false;
- }
- }
-
- int cur = 0;
- unsigned bitPos = kNumBitsMax;
- for (;;)
- {
- CNode &n = Nodes[cur];
- bitPos -= n.Len;
- if (GetSubBits(key, bitPos, n.Len) != GetSubBits(n.Key, bitPos, n.Len))
- {
- unsigned i = n.Len - 1;
- for (; GetSubBit(key, bitPos + i) == GetSubBit(n.Key, bitPos + i); i--);
-
- CNode e2(n);
- e2.Len = (UInt16)i;
-
- n.Len = (UInt16)(n.Len - (1 + i));
- unsigned newBit = GetSubBit(key, bitPos + i);
- n.Values[newBit] = value;
- n.IsLeaf[newBit] = 1;
- n.IsLeaf[1 - newBit] = 0;
- n.Keys[newBit] = key;
- n.Keys[1 - newBit] = Nodes.Size();
- Nodes.Add(e2);
- return false;
- }
- unsigned bit = GetSubBit(key, --bitPos);
-
- if (n.IsLeaf[bit])
- {
- if (key == n.Keys[bit])
- {
- n.Values[bit] = value;
- return true;
- }
- unsigned i = bitPos - 1;
- for (;GetSubBit(key, i) == GetSubBit(n.Keys[bit], i); i--);
-
- CNode e2;
-
- unsigned newBit = GetSubBit(key, i);
- e2.Values[newBit] = value;
- e2.Values[1 - newBit] = n.Values[bit];
- e2.IsLeaf[newBit] = e2.IsLeaf[1 - newBit] = 1;
- e2.Keys[newBit] = key;
- e2.Keys[1 - newBit] = e2.Key = n.Keys[bit];
- e2.Len = (UInt16)(bitPos - (1 + i));
-
- n.IsLeaf[bit] = 0;
- n.Keys[bit] = Nodes.Size();
-
- Nodes.Add(e2);
- return false;
- }
- cur = (int)n.Keys[bit];
- }
-}
diff --git a/src/libs/7zip/win/CPP/Common/MyMap.h b/src/libs/7zip/win/CPP/Common/MyMap.h
deleted file mode 100644
index d0dd43f53..000000000
--- a/src/libs/7zip/win/CPP/Common/MyMap.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// MyMap.h
-
-#ifndef __COMMON_MYMAP_H
-#define __COMMON_MYMAP_H
-
-#include "MyVector.h"
-#include "Types.h"
-
-class CMap32
-{
- struct CNode
- {
- UInt32 Key;
- UInt32 Keys[2];
- UInt32 Values[2];
- UInt16 Len;
- Byte IsLeaf[2];
- };
- CRecordVector<CNode> Nodes;
-
-public:
-
- void Clear() { Nodes.Clear(); }
- bool Find(UInt32 key, UInt32 &valueRes) const;
- bool Set(UInt32 key, UInt32 value); // returns true, if there is such key already
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyWindows.cpp b/src/libs/7zip/win/CPP/Common/MyWindows.cpp
deleted file mode 100644
index 1283946c2..000000000
--- a/src/libs/7zip/win/CPP/Common/MyWindows.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-// MyWindows.cpp
-
-#include "StdAfx.h"
-
-#ifndef _WIN32
-
-#include "MyWindows.h"
-#include "Types.h"
-#include <malloc.h>
-
-static inline void *AllocateForBSTR(size_t cb) { return ::malloc(cb); }
-static inline void FreeForBSTR(void *pv) { ::free(pv);}
-
-static UINT MyStringLen(const wchar_t *s)
-{
- UINT i;
- for (i = 0; s[i] != '\0'; i++);
- return i;
-}
-
-BSTR SysAllocStringByteLen(LPCSTR psz, UINT len)
-{
- int realLen = len + sizeof(UINT) + sizeof(OLECHAR) + sizeof(OLECHAR);
- void *p = AllocateForBSTR(realLen);
- if (p == 0)
- return 0;
- *(UINT *)p = len;
- BSTR bstr = (BSTR)((UINT *)p + 1);
- memmove(bstr, psz, len);
- Byte *pb = ((Byte *)bstr) + len;
- for (int i = 0; i < sizeof(OLECHAR) * 2; i++)
- pb[i] = 0;
- return bstr;
-}
-
-BSTR SysAllocString(const OLECHAR *sz)
-{
- if (sz == 0)
- return 0;
- UINT strLen = MyStringLen(sz);
- UINT len = (strLen + 1) * sizeof(OLECHAR);
- void *p = AllocateForBSTR(len + sizeof(UINT));
- if (p == 0)
- return 0;
- *(UINT *)p = strLen;
- BSTR bstr = (BSTR)((UINT *)p + 1);
- memmove(bstr, sz, len);
- return bstr;
-}
-
-void SysFreeString(BSTR bstr)
-{
- if (bstr != 0)
- FreeForBSTR((UINT *)bstr - 1);
-}
-
-UINT SysStringByteLen(BSTR bstr)
-{
- if (bstr == 0)
- return 0;
- return *((UINT *)bstr - 1);
-}
-
-UINT SysStringLen(BSTR bstr)
-{
- return SysStringByteLen(bstr) / sizeof(OLECHAR);
-}
-
-HRESULT VariantClear(VARIANTARG *prop)
-{
- if (prop->vt == VT_BSTR)
- SysFreeString(prop->bstrVal);
- prop->vt = VT_EMPTY;
- return S_OK;
-}
-
-HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src)
-{
- HRESULT res = ::VariantClear(dest);
- if (res != S_OK)
- return res;
- if (src->vt == VT_BSTR)
- {
- dest->bstrVal = SysAllocStringByteLen((LPCSTR)src->bstrVal,
- SysStringByteLen(src->bstrVal));
- if (dest->bstrVal == 0)
- return E_OUTOFMEMORY;
- dest->vt = VT_BSTR;
- }
- else
- *dest = *src;
- return S_OK;
-}
-
-LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2)
-{
- if (ft1->dwHighDateTime < ft2->dwHighDateTime) return -1;
- if (ft1->dwHighDateTime > ft2->dwHighDateTime) return 1;
- if (ft1->dwLowDateTime < ft2->dwLowDateTime) return -1;
- if (ft1->dwLowDateTime > ft2->dwLowDateTime) return 1;
- return 0;
-}
-
-DWORD GetLastError()
-{
- return 0;
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyXml.cpp b/src/libs/7zip/win/CPP/Common/MyXml.cpp
deleted file mode 100644
index 8aa9ce8cd..000000000
--- a/src/libs/7zip/win/CPP/Common/MyXml.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-// MyXml.cpp
-
-#include "StdAfx.h"
-
-#include "MyXml.h"
-
-static bool IsValidChar(char c)
-{
- return
- c >= 'a' && c <= 'z' ||
- c >= 'A' && c <= 'Z' ||
- c >= '0' && c <= '9' ||
- c == '-';
-}
-
-static bool IsSpaceChar(char c)
-{
- return (c == ' ' || c == '\t' || c == 0x0D || c == 0x0A);
-}
-
-#define SKIP_SPACES(s, pos) while (IsSpaceChar(s[pos])) pos++;
-
-static bool ReadProperty(const AString &s, int &pos, CXmlProp &prop)
-{
- prop.Name.Empty();
- prop.Value.Empty();
- for (; pos < s.Length(); pos++)
- {
- char c = s[pos];
- if (!IsValidChar(c))
- break;
- prop.Name += c;
- }
-
- if (prop.Name.IsEmpty())
- return false;
-
- SKIP_SPACES(s, pos);
- if (s[pos++] != '=')
- return false;
-
- SKIP_SPACES(s, pos);
- if (s[pos++] != '\"')
- return false;
-
- while (pos < s.Length())
- {
- char c = s[pos++];
- if (c == '\"')
- return true;
- prop.Value += c;
- }
- return false;
-}
-
-int CXmlItem::FindProperty(const AString &propName) const
-{
- for (int i = 0; i < Props.Size(); i++)
- if (Props[i].Name == propName)
- return i;
- return -1;
-}
-
-AString CXmlItem::GetPropertyValue(const AString &propName) const
-{
- int index = FindProperty(propName);
- if (index >= 0)
- return Props[index].Value;
- return AString();
-}
-
-bool CXmlItem::IsTagged(const AString &tag) const
-{
- return (IsTag && Name == tag);
-}
-
-int CXmlItem::FindSubTag(const AString &tag) const
-{
- for (int i = 0; i < SubItems.Size(); i++)
- if (SubItems[i].IsTagged(tag))
- return i;
- return -1;
-}
-
-AString CXmlItem::GetSubString() const
-{
- if (SubItems.Size() == 1)
- {
- const CXmlItem &item = SubItems[0];
- if (!item.IsTag)
- return item.Name;
- }
- return AString();
-}
-
-AString CXmlItem::GetSubStringForTag(const AString &tag) const
-{
- int index = FindSubTag(tag);
- if (index >= 0)
- return SubItems[index].GetSubString();
- return AString();
-}
-
-bool CXmlItem::ParseItems(const AString &s, int &pos, int numAllowedLevels)
-{
- if (numAllowedLevels == 0)
- return false;
- SubItems.Clear();
- AString finishString = "</";
- for (;;)
- {
- SKIP_SPACES(s, pos);
-
- if (s.Mid(pos, finishString.Length()) == finishString)
- return true;
-
- CXmlItem item;
- if (!item.ParseItem(s, pos, numAllowedLevels - 1))
- return false;
- SubItems.Add(item);
- }
-}
-
-bool CXmlItem::ParseItem(const AString &s, int &pos, int numAllowedLevels)
-{
- SKIP_SPACES(s, pos);
-
- int pos2 = s.Find('<', pos);
- if (pos2 < 0)
- return false;
- if (pos2 != pos)
- {
- IsTag = false;
- Name += s.Mid(pos, pos2 - pos);
- pos = pos2;
- return true;
- }
- IsTag = true;
-
- pos++;
- SKIP_SPACES(s, pos);
-
- for (; pos < s.Length(); pos++)
- {
- char c = s[pos];
- if (!IsValidChar(c))
- break;
- Name += c;
- }
- if (Name.IsEmpty() || pos == s.Length())
- return false;
-
- int posTemp = pos;
- for (;;)
- {
- SKIP_SPACES(s, pos);
- if (s[pos] == '/')
- {
- pos++;
- // SKIP_SPACES(s, pos);
- return (s[pos++] == '>');
- }
- if (s[pos] == '>')
- {
- if (!ParseItems(s, ++pos, numAllowedLevels))
- return false;
- AString finishString = AString("</") + Name + AString(">");
- if (s.Mid(pos, finishString.Length()) != finishString)
- return false;
- pos += finishString.Length();
- return true;
- }
- if (posTemp == pos)
- return false;
-
- CXmlProp prop;
- if (!ReadProperty(s, pos, prop))
- return false;
- Props.Add(prop);
- posTemp = pos;
- }
-}
-
-static bool SkipHeader(const AString &s, int &pos, const AString &startString, const AString &endString)
-{
- SKIP_SPACES(s, pos);
- if (s.Mid(pos, startString.Length()) == startString)
- {
- pos = s.Find(endString, pos);
- if (pos < 0)
- return false;
- pos += endString.Length();
- SKIP_SPACES(s, pos);
- }
- return true;
-}
-
-bool CXml::Parse(const AString &s)
-{
- int pos = 0;
- if (!SkipHeader(s, pos, "<?xml", "?>"))
- return false;
- if (!SkipHeader(s, pos, "<!DOCTYPE", ">"))
- return false;
- if (!Root.ParseItem(s, pos, 1000))
- return false;
- SKIP_SPACES(s, pos);
- return (pos == s.Length() && Root.IsTag);
-}
diff --git a/src/libs/7zip/win/CPP/Common/MyXml.h b/src/libs/7zip/win/CPP/Common/MyXml.h
deleted file mode 100644
index c6e8829ad..000000000
--- a/src/libs/7zip/win/CPP/Common/MyXml.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// MyXml.h
-
-#ifndef __MYXML_H
-#define __MYXML_H
-
-#include "MyString.h"
-
-struct CXmlProp
-{
- AString Name;
- AString Value;
-};
-
-class CXmlItem
-{
- bool ParseItems(const AString &s, int &pos, int numAllowedLevels);
-
-public:
- AString Name;
- bool IsTag;
- CObjectVector<CXmlProp> Props;
- CObjectVector<CXmlItem> SubItems;
-
- bool ParseItem(const AString &s, int &pos, int numAllowedLevels);
-
- bool IsTagged(const AString &tag) const;
- int FindProperty(const AString &propName) const;
- AString GetPropertyValue(const AString &propName) const;
- AString GetSubString() const;
- int FindSubTag(const AString &tag) const;
- AString GetSubStringForTag(const AString &tag) const;
-};
-
-struct CXml
-{
- CXmlItem Root;
- bool Parse(const AString &s);
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/Random.cpp b/src/libs/7zip/win/CPP/Common/Random.cpp
deleted file mode 100644
index 4bd3fcf93..000000000
--- a/src/libs/7zip/win/CPP/Common/Random.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// Common/Random.cpp
-
-#include "StdAfx.h"
-
-#include <stdlib.h>
-
-#ifndef _WIN32
-#include <time.h>
-#endif
-
-#include "Random.h"
-
-void CRandom::Init(unsigned int seed) { srand(seed); }
-
-void CRandom::Init()
-{
- Init((unsigned int)
- #ifdef _WIN32
- GetTickCount()
- #else
- time(NULL)
- #endif
- );
-}
-
-int CRandom::Generate() const { return rand(); }
diff --git a/src/libs/7zip/win/CPP/Common/Random.h b/src/libs/7zip/win/CPP/Common/Random.h
deleted file mode 100644
index ffef20d12..000000000
--- a/src/libs/7zip/win/CPP/Common/Random.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Common/Random.h
-
-#ifndef __COMMON_RANDOM_H
-#define __COMMON_RANDOM_H
-
-class CRandom
-{
-public:
- void Init();
- void Init(unsigned int seed);
- int Generate() const;
-};
-
-#endif
-
-
diff --git a/src/libs/7zip/win/CPP/Common/TextConfig.cpp b/src/libs/7zip/win/CPP/Common/TextConfig.cpp
deleted file mode 100644
index 34fedeb85..000000000
--- a/src/libs/7zip/win/CPP/Common/TextConfig.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-// Common/TextConfig.cpp
-
-#include "StdAfx.h"
-
-#include "TextConfig.h"
-
-#include "Defs.h"
-#include "UTFConvert.h"
-
-static bool IsDelimitChar(char c)
-{
- return (c == ' ' || c == 0x0A || c == 0x0D ||
- c == '\0' || c == '\t');
-}
-
-static AString GetIDString(const char *string, int &finishPos)
-{
- AString result;
- for (finishPos = 0; ; finishPos++)
- {
- char c = string[finishPos];
- if (IsDelimitChar(c) || c == '=')
- break;
- result += c;
- }
- return result;
-}
-
-static bool WaitNextLine(const AString &string, int &pos)
-{
- for (;pos < string.Length(); pos++)
- if (string[pos] == 0x0A)
- return true;
- return false;
-}
-
-static bool SkipSpaces(const AString &string, int &pos)
-{
- for (;pos < string.Length(); pos++)
- {
- char c = string[pos];
- if (!IsDelimitChar(c))
- {
- if (c != ';')
- return true;
- if (!WaitNextLine(string, pos))
- return false;
- }
- }
- return false;
-}
-
-bool GetTextConfig(const AString &string, CObjectVector<CTextConfigPair> &pairs)
-{
- pairs.Clear();
- int pos = 0;
-
- /////////////////////
- // read strings
-
- for (;;)
- {
- if (!SkipSpaces(string, pos))
- break;
- CTextConfigPair pair;
- int finishPos;
- AString temp = GetIDString(((const char *)string) + pos, finishPos);
- if (!ConvertUTF8ToUnicode(temp, pair.ID))
- return false;
- if (finishPos == 0)
- return false;
- pos += finishPos;
- if (!SkipSpaces(string, pos))
- return false;
- if (string[pos] != '=')
- return false;
- pos++;
- if (!SkipSpaces(string, pos))
- return false;
- if (string[pos] != '\"')
- return false;
- pos++;
- AString message;
- for (;;)
- {
- if (pos >= string.Length())
- return false;
- char c = string[pos++];
- if (c == '\"')
- break;
- if (c == '\\')
- {
- char c = string[pos++];
- switch(c)
- {
- case 'n':
- message += '\n';
- break;
- case 't':
- message += '\t';
- break;
- case '\\':
- message += '\\';
- break;
- case '\"':
- message += '\"';
- break;
- default:
- message += '\\';
- message += c;
- break;
- }
- }
- else
- message += c;
- }
- if (!ConvertUTF8ToUnicode(message, pair.String))
- return false;
- pairs.Add(pair);
- }
- return true;
-}
-
-int FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const UString &id)
-{
- for (int i = 0; i < pairs.Size(); i++)
- if (pairs[i].ID.Compare(id) == 0)
- return i;
- return -1;
-}
-
-UString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const UString &id)
-{
- int index = FindTextConfigItem(pairs, id);
- if (index < 0)
- return UString();
- return pairs[index].String;
-}
diff --git a/src/libs/7zip/win/CPP/Common/TextConfig.h b/src/libs/7zip/win/CPP/Common/TextConfig.h
deleted file mode 100644
index a25142a70..000000000
--- a/src/libs/7zip/win/CPP/Common/TextConfig.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Common/TextConfig.h
-
-#ifndef __COMMON_TEXTCONFIG_H
-#define __COMMON_TEXTCONFIG_H
-
-#include "MyVector.h"
-#include "MyString.h"
-
-struct CTextConfigPair
-{
- UString ID;
- UString String;
-};
-
-bool GetTextConfig(const AString &text, CObjectVector<CTextConfigPair> &pairs);
-
-int FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const UString &id);
-UString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const UString &id);
-
-#endif
-
-
diff --git a/src/libs/7zip/win/CPP/Windows/COM.cpp b/src/libs/7zip/win/CPP/Windows/COM.cpp
deleted file mode 100644
index a746de12b..000000000
--- a/src/libs/7zip/win/CPP/Windows/COM.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-// Windows/COM.cpp
-
-#include "StdAfx.h"
-
-#include "Windows/COM.h"
-#include "Common/StringConvert.h"
-
-namespace NWindows {
-namespace NCOM {
-
-// CoInitialize (NULL); must be called!
-
-UString GUIDToStringW(REFGUID guid)
-{
- UString string;
- const int kStringSize = 48;
- StringFromGUID2(guid, string.GetBuffer(kStringSize), kStringSize);
- string.ReleaseBuffer();
- return string;
-}
-
-AString GUIDToStringA(REFGUID guid)
-{
- return UnicodeStringToMultiByte(GUIDToStringW(guid));
-}
-
-HRESULT StringToGUIDW(const wchar_t *string, GUID &classID)
-{
- return CLSIDFromString((wchar_t *)string, &classID);
-}
-
-HRESULT StringToGUIDA(const char *string, GUID &classID)
-{
- return StringToGUIDW(MultiByteToUnicodeString(string), classID);
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/Windows/COM.h b/src/libs/7zip/win/CPP/Windows/COM.h
deleted file mode 100644
index 506bbbc64..000000000
--- a/src/libs/7zip/win/CPP/Windows/COM.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Windows/COM.h
-
-#ifndef __WINDOWS_COM_H
-#define __WINDOWS_COM_H
-
-#include "Common/MyString.h"
-
-namespace NWindows {
-namespace NCOM {
-
-#ifdef _WIN32
-
-class CComInitializer
-{
-public:
- CComInitializer()
- {
- #ifdef UNDER_CE
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
- #else
- // it's single thread. Do we need multithread?
- CoInitialize(NULL);
- #endif
- };
- ~CComInitializer() { CoUninitialize(); };
-};
-
-class CStgMedium
-{
- STGMEDIUM _object;
-public:
- bool _mustBeReleased;
- CStgMedium(): _mustBeReleased(false) {}
- ~CStgMedium() { Free(); }
- void Free()
- {
- if (_mustBeReleased)
- ReleaseStgMedium(&_object);
- _mustBeReleased = false;
- }
- const STGMEDIUM* operator->() const { return &_object;}
- STGMEDIUM* operator->() { return &_object;}
- STGMEDIUM* operator&() { return &_object; }
-};
-
-#endif
-
-//////////////////////////////////
-// GUID <--> String Conversions
-UString GUIDToStringW(REFGUID guid);
-AString GUIDToStringA(REFGUID guid);
-#ifdef UNICODE
- #define GUIDToString GUIDToStringW
-#else
- #define GUIDToString GUIDToStringA
-#endif
-
-HRESULT StringToGUIDW(const wchar_t *string, GUID &classID);
-HRESULT StringToGUIDA(const char *string, GUID &classID);
-#ifdef UNICODE
- #define StringToGUID StringToGUIDW
-#else
- #define StringToGUID StringToGUIDA
-#endif
-
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Clipboard.cpp b/src/libs/7zip/win/CPP/Windows/Clipboard.cpp
deleted file mode 100644
index e1ff62be2..000000000
--- a/src/libs/7zip/win/CPP/Windows/Clipboard.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-// Windows/Clipboard.cpp
-
-#include "StdAfx.h"
-
-#ifdef UNDER_CE
-#include <winuserm.h>
-#endif
-
-#include "Windows/Clipboard.h"
-#include "Windows/Defs.h"
-#include "Windows/Memory.h"
-#include "Windows/Shell.h"
-#include "Windows/Memory.h"
-
-#include "Common/StringConvert.h"
-
-namespace NWindows {
-
-bool CClipboard::Open(HWND wndNewOwner)
-{
- m_Open = BOOLToBool(::OpenClipboard(wndNewOwner));
- return m_Open;
-}
-
-CClipboard::~CClipboard()
-{
- Close();
-}
-
-bool CClipboard::Close()
-{
- if (!m_Open)
- return true;
- m_Open = !BOOLToBool(CloseClipboard());
- return !m_Open;
-}
-
-bool ClipboardIsFormatAvailableHDROP()
-{
- return BOOLToBool(IsClipboardFormatAvailable(CF_HDROP));
-}
-
-/*
-bool ClipboardGetTextString(AString &s)
-{
- s.Empty();
- if (!IsClipboardFormatAvailable(CF_TEXT))
- return false;
- CClipboard clipboard;
-
- if (!clipboard.Open(NULL))
- return false;
-
- HGLOBAL h = ::GetClipboardData(CF_TEXT);
- if (h != NULL)
- {
- NMemory::CGlobalLock globalLock(h);
- const char *p = (const char *)globalLock.GetPointer();
- if (p != NULL)
- {
- s = p;
- return true;
- }
- }
- return false;
-}
-*/
-
-/*
-bool ClipboardGetFileNames(UStringVector &names)
-{
- names.Clear();
- if (!IsClipboardFormatAvailable(CF_HDROP))
- return false;
- CClipboard clipboard;
-
- if (!clipboard.Open(NULL))
- return false;
-
- HGLOBAL h = ::GetClipboardData(CF_HDROP);
- if (h != NULL)
- {
- NMemory::CGlobalLock globalLock(h);
- void *p = (void *)globalLock.GetPointer();
- if (p != NULL)
- {
- NShell::CDrop drop(false);
- drop.Attach((HDROP)p);
- drop.QueryFileNames(names);
- return true;
- }
- }
- return false;
-}
-*/
-
-static bool ClipboardSetData(UINT uFormat, const void *data, size_t size)
-{
- NMemory::CGlobal global;
- if (!global.Alloc(GMEM_DDESHARE | GMEM_MOVEABLE, size))
- return false;
- {
- NMemory::CGlobalLock globalLock(global);
- LPVOID p = globalLock.GetPointer();
- if (p == NULL)
- return false;
- memcpy(p, data, size);
- }
- if (::SetClipboardData(uFormat, global) == NULL)
- return false;
- global.Detach();
- return true;
-}
-
-bool ClipboardSetText(HWND owner, const UString &s)
-{
- CClipboard clipboard;
- if (!clipboard.Open(owner))
- return false;
- if (!::EmptyClipboard())
- return false;
-
- bool res;
- res = ClipboardSetData(CF_UNICODETEXT, (const wchar_t *)s, (s.Length() + 1) * sizeof(wchar_t));
- #ifndef _UNICODE
- AString a;
- a = UnicodeStringToMultiByte(s, CP_ACP);
- res |= ClipboardSetData(CF_TEXT, (const char *)a, (a.Length() + 1) * sizeof(char));
- a = UnicodeStringToMultiByte(s, CP_OEMCP);
- res |= ClipboardSetData(CF_OEMTEXT, (const char *)a, (a.Length() + 1) * sizeof(char));
- #endif
- return res;
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/Windows/Clipboard.h b/src/libs/7zip/win/CPP/Windows/Clipboard.h
deleted file mode 100644
index c80ba5ea7..000000000
--- a/src/libs/7zip/win/CPP/Windows/Clipboard.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Windows/Clipboard.h
-
-#ifndef __CLIPBOARD_H
-#define __CLIPBOARD_H
-
-#include "Common/MyString.h"
-
-namespace NWindows {
-
-class CClipboard
-{
- bool m_Open;
-public:
- CClipboard(): m_Open(false) {};
- ~CClipboard();
- bool Open(HWND wndNewOwner);
- bool Close();
-};
-
-bool ClipboardIsFormatAvailableHDROP();
-
-// bool ClipboardGetFileNames(UStringVector &names);
-// bool ClipboardGetTextString(AString &s);
-bool ClipboardSetText(HWND owner, const UString &s);
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/CommonDialog.cpp b/src/libs/7zip/win/CPP/Windows/CommonDialog.cpp
deleted file mode 100644
index 4ee7412d0..000000000
--- a/src/libs/7zip/win/CPP/Windows/CommonDialog.cpp
+++ /dev/null
@@ -1,184 +0,0 @@
-// Windows/CommonDialog.cpp
-
-#include "StdAfx.h"
-
-#ifdef UNDER_CE
-#include <commdlg.h>
-#endif
-
-#ifndef _UNICODE
-#include "Common/StringConvert.h"
-#endif
-#include "Common/MyCom.h"
-
-#include "Windows/Defs.h"
-
-#include "CommonDialog.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-namespace NWindows{
-
-#ifndef _UNICODE
-class CDoubleZeroStringListA
-{
- CRecordVector<int> m_Indexes;
- AString m_String;
-public:
- void Add(LPCSTR s);
- void SetForBuffer(LPSTR buffer);
-};
-
-void CDoubleZeroStringListA::Add(LPCSTR s)
-{
- m_String += s;
- m_Indexes.Add(m_String.Length());
- m_String += ' ';
-}
-
-void CDoubleZeroStringListA::SetForBuffer(LPSTR buffer)
-{
- MyStringCopy(buffer, (const char *)m_String);
- for (int i = 0; i < m_Indexes.Size(); i++)
- buffer[m_Indexes[i]] = '\0';
-}
-#endif
-
-class CDoubleZeroStringListW
-{
- CRecordVector<int> m_Indexes;
- UString m_String;
-public:
- void Add(LPCWSTR s);
- void SetForBuffer(LPWSTR buffer);
-};
-
-void CDoubleZeroStringListW::Add(LPCWSTR s)
-{
- m_String += s;
- m_Indexes.Add(m_String.Length());
- m_String += L' ';
-}
-
-void CDoubleZeroStringListW::SetForBuffer(LPWSTR buffer)
-{
- MyStringCopy(buffer, (const wchar_t *)m_String);
- for (int i = 0; i < m_Indexes.Size(); i++)
- buffer[m_Indexes[i]] = L'\0';
-}
-
-#define MY_OFN_PROJECT 0x00400000
-#define MY_OFN_SHOW_ALL 0x01000000
-
-bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName,
- LPCWSTR s, UString &resPath
- #ifdef UNDER_CE
- , bool openFolder
- #endif
- )
-{
- const int kBufferSize = MAX_PATH * 2;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- CHAR buffer[kBufferSize];
- MyStringCopy(buffer, (const char *)GetSystemString(fullFileName));
- OPENFILENAME info;
- info.lStructSize = sizeof(info);
- info.hwndOwner = hwnd;
- info.hInstance = 0;
- const int kFilterBufferSize = MAX_PATH;
- CHAR filterBuffer[kFilterBufferSize];
- CDoubleZeroStringListA doubleZeroStringList;
- doubleZeroStringList.Add(GetSystemString(s));
- doubleZeroStringList.Add("*.*");
- doubleZeroStringList.SetForBuffer(filterBuffer);
- info.lpstrFilter = filterBuffer;
-
- info.lpstrCustomFilter = NULL;
- info.nMaxCustFilter = 0;
- info.nFilterIndex = 0;
-
- info.lpstrFile = buffer;
- info.nMaxFile = kBufferSize;
-
- info.lpstrFileTitle = NULL;
- info.nMaxFileTitle = 0;
-
- info.lpstrInitialDir= NULL;
-
- info.lpstrTitle = 0;
- AString titleA;
- if (title != 0)
- {
- titleA = GetSystemString(title);
- info.lpstrTitle = titleA;
- }
-
- info.Flags = OFN_EXPLORER | OFN_HIDEREADONLY;
- info.nFileOffset = 0;
- info.nFileExtension = 0;
- info.lpstrDefExt = NULL;
-
- info.lCustData = 0;
- info.lpfnHook = NULL;
- info.lpTemplateName = NULL;
-
- bool res = BOOLToBool(::GetOpenFileNameA(&info));
- resPath = GetUnicodeString(buffer);
- return res;
- }
- else
- #endif
- {
- WCHAR buffer[kBufferSize];
- MyStringCopy(buffer, fullFileName);
- OPENFILENAMEW info;
- info.lStructSize = sizeof(info);
- info.hwndOwner = hwnd;
- info.hInstance = 0;
- const int kFilterBufferSize = MAX_PATH;
- WCHAR filterBuffer[kFilterBufferSize];
- CDoubleZeroStringListW doubleZeroStringList;
- doubleZeroStringList.Add(s);
- doubleZeroStringList.Add(L"*.*");
- doubleZeroStringList.SetForBuffer(filterBuffer);
- info.lpstrFilter = filterBuffer;
-
- info.lpstrCustomFilter = NULL;
- info.nMaxCustFilter = 0;
- info.nFilterIndex = 0;
-
- info.lpstrFile = buffer;
- info.nMaxFile = kBufferSize;
-
- info.lpstrFileTitle = NULL;
- info.nMaxFileTitle = 0;
-
- info.lpstrInitialDir= NULL;
-
- info.lpstrTitle = title;
-
- info.Flags = OFN_EXPLORER | OFN_HIDEREADONLY
- #ifdef UNDER_CE
- | (openFolder ? (MY_OFN_PROJECT | MY_OFN_SHOW_ALL) : 0)
- #endif
- ;
-
- info.nFileOffset = 0;
- info.nFileExtension = 0;
- info.lpstrDefExt = NULL;
-
- info.lCustData = 0;
- info.lpfnHook = NULL;
- info.lpTemplateName = NULL;
-
- bool res = BOOLToBool(::GetOpenFileNameW(&info));
- resPath = buffer;
- return res;
- }
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/Windows/CommonDialog.h b/src/libs/7zip/win/CPP/Windows/CommonDialog.h
deleted file mode 100644
index f24bb5b24..000000000
--- a/src/libs/7zip/win/CPP/Windows/CommonDialog.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Windows/CommonDialog.h
-
-#ifndef __WINDOWS_COMMON_DIALOG_H
-#define __WINDOWS_COMMON_DIALOG_H
-
-#include "Common/MyString.h"
-
-namespace NWindows{
-
-bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName,
- LPCWSTR s, UString &resPath
- #ifdef UNDER_CE
- , bool openFolder = false
- #endif
-);
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Console.cpp b/src/libs/7zip/win/CPP/Windows/Console.cpp
deleted file mode 100644
index 7773fee22..000000000
--- a/src/libs/7zip/win/CPP/Windows/Console.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-// Windows/Console.cpp
-
-#include "StdAfx.h"
-
-#include "Windows/Console.h"
-
-namespace NWindows{
-namespace NConsole{
-
-}}
diff --git a/src/libs/7zip/win/CPP/Windows/Console.h b/src/libs/7zip/win/CPP/Windows/Console.h
deleted file mode 100644
index 99ae90f1a..000000000
--- a/src/libs/7zip/win/CPP/Windows/Console.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Windows/Console.h
-
-#ifndef __WINDOWS_CONSOLE_H
-#define __WINDOWS_CONSOLE_H
-
-#include "Windows/Defs.h"
-
-namespace NWindows{
-namespace NConsole{
-
-class CBase
-{
-protected:
- HANDLE m_Object;
-public:
- void Attach(HANDLE aHandle) { m_Object = aHandle; };
- bool GetMode(DWORD &aMode)
- { return BOOLToBool(::GetConsoleMode(m_Object, &aMode)); }
- bool SetMode(DWORD aMode)
- { return BOOLToBool(::SetConsoleMode(m_Object, aMode)); }
-};
-
-class CIn: public CBase
-{
-public:
- bool PeekEvents(PINPUT_RECORD anEvents, DWORD aNumEvents, DWORD &aNumEventsRead)
- { return BOOLToBool(::PeekConsoleInput(m_Object, anEvents, aNumEvents, &aNumEventsRead)); }
- bool PeekEvent(INPUT_RECORD &anEvent, DWORD &aNumEventsRead)
- { return PeekEvents(&anEvent, 1, aNumEventsRead); }
- bool ReadEvents(PINPUT_RECORD anEvents, DWORD aNumEvents, DWORD &aNumEventsRead)
- { return BOOLToBool(::ReadConsoleInput(m_Object, anEvents, aNumEvents, &aNumEventsRead)); }
- bool ReadEvent(INPUT_RECORD &anEvent, DWORD &aNumEventsRead)
- { return ReadEvents(&anEvent, 1, aNumEventsRead); }
- bool GetNumberOfEvents(DWORD &aNumberOfEvents)
- { return BOOLToBool(::GetNumberOfConsoleInputEvents(m_Object, &aNumberOfEvents)); }
-
- bool WriteEvents(const INPUT_RECORD *anEvents, DWORD aNumEvents, DWORD &aNumEventsWritten)
- { return BOOLToBool(::WriteConsoleInput(m_Object, anEvents, aNumEvents, &aNumEventsWritten)); }
- bool WriteEvent(const INPUT_RECORD &anEvent, DWORD &aNumEventsWritten)
- { return WriteEvents(&anEvent, 1, aNumEventsWritten); }
-
- bool Read(LPVOID aBuffer, DWORD aNumberOfCharsToRead, DWORD &aNumberOfCharsRead)
- { return BOOLToBool(::ReadConsole(m_Object, aBuffer, aNumberOfCharsToRead, &aNumberOfCharsRead, NULL)); }
-
- bool Flush()
- { return BOOLToBool(::FlushConsoleInputBuffer(m_Object)); }
-
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/FileSystem.cpp b/src/libs/7zip/win/CPP/Windows/FileSystem.cpp
deleted file mode 100644
index 3ebfb7523..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileSystem.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-// Windows/FileSystem.cpp
-
-#include "StdAfx.h"
-
-#include "FileSystem.h"
-#include "Defs.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-namespace NWindows {
-namespace NFile {
-namespace NSystem {
-
-bool MyGetVolumeInformation(
- LPCTSTR rootPathName,
- CSysString &volumeName,
- LPDWORD volumeSerialNumber,
- LPDWORD maximumComponentLength,
- LPDWORD fileSystemFlags,
- CSysString &fileSystemName)
-{
- bool result = BOOLToBool(GetVolumeInformation(
- rootPathName,
- volumeName.GetBuffer(MAX_PATH), MAX_PATH,
- volumeSerialNumber,
- maximumComponentLength,
- fileSystemFlags,
- fileSystemName.GetBuffer(MAX_PATH), MAX_PATH));
- volumeName.ReleaseBuffer();
- fileSystemName.ReleaseBuffer();
- return result;
-}
-
-
-#ifndef _UNICODE
-bool MyGetVolumeInformation(
- LPCWSTR rootPathName,
- UString &volumeName,
- LPDWORD volumeSerialNumber,
- LPDWORD maximumComponentLength,
- LPDWORD fileSystemFlags,
- UString &fileSystemName)
-{
- if (g_IsNT)
- {
- bool result = BOOLToBool(GetVolumeInformationW(
- rootPathName,
- volumeName.GetBuffer(MAX_PATH), MAX_PATH,
- volumeSerialNumber,
- maximumComponentLength,
- fileSystemFlags,
- fileSystemName.GetBuffer(MAX_PATH), MAX_PATH));
- volumeName.ReleaseBuffer();
- fileSystemName.ReleaseBuffer();
- return result;
- }
- AString volumeNameA, fileSystemNameA;
- bool result = MyGetVolumeInformation(GetSystemString(rootPathName), volumeNameA,
- volumeSerialNumber, maximumComponentLength, fileSystemFlags,fileSystemNameA);
- if (result)
- {
- volumeName = GetUnicodeString(volumeNameA);
- fileSystemName = GetUnicodeString(fileSystemNameA);
- }
- return result;
-}
-#endif
-
-typedef BOOL (WINAPI * GetDiskFreeSpaceExPointer)(
- LPCTSTR lpDirectoryName, // directory name
- PULARGE_INTEGER lpFreeBytesAvailable, // bytes available to caller
- PULARGE_INTEGER lpTotalNumberOfBytes, // bytes on disk
- PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk
-);
-
-bool MyGetDiskFreeSpace(LPCTSTR rootPathName,
- UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize)
-{
- GetDiskFreeSpaceExPointer pGetDiskFreeSpaceEx =
- (GetDiskFreeSpaceExPointer)GetProcAddress(
- GetModuleHandle(TEXT("kernel32.dll")), "GetDiskFreeSpaceExA");
-
- bool sizeIsDetected = false;
- if (pGetDiskFreeSpaceEx)
- {
- ULARGE_INTEGER i64FreeBytesToCaller, totalSize2, freeSize2;
- sizeIsDetected = BOOLToBool(pGetDiskFreeSpaceEx(rootPathName,
- &i64FreeBytesToCaller,
- &totalSize2,
- &freeSize2));
- totalSize = totalSize2.QuadPart;
- freeSize = freeSize2.QuadPart;
- }
-
- DWORD numSectorsPerCluster;
- DWORD bytesPerSector;
- DWORD numberOfFreeClusters;
- DWORD totalNumberOfClusters;
-
- if (!::GetDiskFreeSpace(rootPathName,
- &numSectorsPerCluster,
- &bytesPerSector,
- &numberOfFreeClusters,
- &totalNumberOfClusters))
- return false;
-
- clusterSize = (UInt64)bytesPerSector * (UInt64)numSectorsPerCluster;
- if (!sizeIsDetected)
- {
- totalSize = clusterSize * (UInt64)totalNumberOfClusters;
- freeSize = clusterSize * (UInt64)numberOfFreeClusters;
- }
- return true;
-}
-
-#ifndef _UNICODE
-bool MyGetDiskFreeSpace(LPCWSTR rootPathName,
- UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize)
-{
- return MyGetDiskFreeSpace(GetSystemString(rootPathName), clusterSize, totalSize, freeSize);
-}
-#endif
-
-}}}
diff --git a/src/libs/7zip/win/CPP/Windows/FileSystem.h b/src/libs/7zip/win/CPP/Windows/FileSystem.h
deleted file mode 100644
index 727497bbd..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileSystem.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Windows/FileSystem.h
-
-#ifndef __WINDOWS_FILESYSTEM_H
-#define __WINDOWS_FILESYSTEM_H
-
-#include "../Common/MyString.h"
-#include "../Common/Types.h"
-
-#ifndef _UNICODE
-#include "../Common/StringConvert.h"
-#endif
-
-namespace NWindows {
-namespace NFile {
-namespace NSystem {
-
-bool MyGetVolumeInformation(
- LPCTSTR rootPathName,
- CSysString &volumeName,
- LPDWORD volumeSerialNumber,
- LPDWORD maximumComponentLength,
- LPDWORD fileSystemFlags,
- CSysString &fileSystemName);
-
-#ifndef _UNICODE
-bool MyGetVolumeInformation(
- LPCWSTR rootPathName,
- UString &volumeName,
- LPDWORD volumeSerialNumber,
- LPDWORD maximumComponentLength,
- LPDWORD fileSystemFlags,
- UString &fileSystemName);
-#endif
-
-inline UINT MyGetDriveType(LPCTSTR pathName) { return GetDriveType(pathName); }
-#ifndef _UNICODE
-inline UINT MyGetDriveType(LPCWSTR pathName) { return GetDriveType(GetSystemString(pathName)); }
-#endif
-
-bool MyGetDiskFreeSpace(LPCTSTR rootPathName,
- UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize);
-
-#ifndef _UNICODE
-bool MyGetDiskFreeSpace(LPCWSTR rootPathName,
- UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize);
-#endif
-
-}}}
-
-#endif
-
diff --git a/src/libs/7zip/win/CPP/Windows/Memory.cpp b/src/libs/7zip/win/CPP/Windows/Memory.cpp
deleted file mode 100644
index 4c23205e1..000000000
--- a/src/libs/7zip/win/CPP/Windows/Memory.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-// Windows/Memory.cpp
-
-#include "StdAfx.h"
-
-#include "Windows/Memory.h"
-
-namespace NWindows {
-namespace NMemory {
-
-bool CGlobal::Alloc(UINT flags, SIZE_T size)
-{
- HGLOBAL newBlock = ::GlobalAlloc(flags, size);
- if (newBlock == NULL)
- return false;
- m_MemoryHandle = newBlock;
- return true;
-}
-
-bool CGlobal::Free()
-{
- if (m_MemoryHandle == NULL)
- return true;
- m_MemoryHandle = ::GlobalFree(m_MemoryHandle);
- return (m_MemoryHandle == NULL);
-}
-
-bool CGlobal::ReAlloc(SIZE_T size)
-{
- HGLOBAL newBlock = ::GlobalReAlloc(m_MemoryHandle, size, GMEM_MOVEABLE);
- if (newBlock == NULL)
- return false;
- m_MemoryHandle = newBlock;
- return true;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/Windows/Memory.h b/src/libs/7zip/win/CPP/Windows/Memory.h
deleted file mode 100644
index 1984baf6a..000000000
--- a/src/libs/7zip/win/CPP/Windows/Memory.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Windows/Memory.h
-
-#ifndef __WINDOWS_MEMORY_H
-#define __WINDOWS_MEMORY_H
-
-namespace NWindows {
-namespace NMemory {
-
-class CGlobal
-{
- HGLOBAL m_MemoryHandle;
-public:
- CGlobal(): m_MemoryHandle(NULL){};
- ~CGlobal() { Free(); }
- operator HGLOBAL() const { return m_MemoryHandle; };
- void Attach(HGLOBAL hGlobal)
- {
- Free();
- m_MemoryHandle = hGlobal;
- }
- HGLOBAL Detach()
- {
- HGLOBAL h = m_MemoryHandle;
- m_MemoryHandle = NULL;
- return h;
- }
- bool Alloc(UINT flags, SIZE_T size);
- bool Free();
- LPVOID Lock() const { return GlobalLock(m_MemoryHandle); }
- void Unlock() const { GlobalUnlock(m_MemoryHandle); }
- bool ReAlloc(SIZE_T size);
-};
-
-class CGlobalLock
-{
- HGLOBAL m_Global;
- LPVOID m_Pointer;
-public:
- LPVOID GetPointer() const { return m_Pointer; }
- CGlobalLock(HGLOBAL hGlobal): m_Global(hGlobal)
- {
- m_Pointer = GlobalLock(hGlobal);
- };
- ~CGlobalLock()
- {
- if (m_Pointer != NULL)
- GlobalUnlock(m_Global);
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Menu.cpp b/src/libs/7zip/win/CPP/Windows/Menu.cpp
deleted file mode 100644
index 675f86237..000000000
--- a/src/libs/7zip/win/CPP/Windows/Menu.cpp
+++ /dev/null
@@ -1,191 +0,0 @@
-// Windows/Menu.cpp
-
-#include "StdAfx.h"
-
-#ifndef _UNICODE
-#include "Common/StringConvert.h"
-#endif
-#include "Windows/Menu.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-namespace NWindows {
-
-static void ConvertItemToSysForm(const CMenuItem &item, MENUITEMINFOW &si)
-{
- ZeroMemory(&si, sizeof(si));
- si.cbSize = sizeof(si);
- si.fMask = item.fMask;
- si.fType = item.fType;
- si.fState = item.fState;
- si.wID = item.wID;
- si.hSubMenu = item.hSubMenu;
- si.hbmpChecked = item.hbmpChecked;
- si.hbmpUnchecked = item.hbmpUnchecked;
- si.dwItemData = item.dwItemData;
-}
-
-#ifndef _UNICODE
-static void ConvertItemToSysForm(const CMenuItem &item, MENUITEMINFOA &si)
-{
- ZeroMemory(&si, sizeof(si));
- si.cbSize = sizeof(si);
- si.fMask = item.fMask;
- si.fType = item.fType;
- si.fState = item.fState;
- si.wID = item.wID;
- si.hSubMenu = item.hSubMenu;
- si.hbmpChecked = item.hbmpChecked;
- si.hbmpUnchecked = item.hbmpUnchecked;
- si.dwItemData = item.dwItemData;
-}
-#endif
-
-static void ConvertItemToMyForm(const MENUITEMINFOW &si, CMenuItem &item)
-{
- item.fMask = si.fMask;
- item.fType = si.fType;
- item.fState = si.fState;
- item.wID = si.wID;
- item.hSubMenu = si.hSubMenu;
- item.hbmpChecked = si.hbmpChecked;
- item.hbmpUnchecked = si.hbmpUnchecked;
- item.dwItemData = si.dwItemData;
-}
-
-#ifndef _UNICODE
-static void ConvertItemToMyForm(const MENUITEMINFOA &si, CMenuItem &item)
-{
- item.fMask = si.fMask;
- item.fType = si.fType;
- item.fState = si.fState;
- item.wID = si.wID;
- item.hSubMenu = si.hSubMenu;
- item.hbmpChecked = si.hbmpChecked;
- item.hbmpUnchecked = si.hbmpUnchecked;
- item.dwItemData = si.dwItemData;
-}
-#endif
-
-bool CMenu::GetItem(UINT itemIndex, bool byPosition, CMenuItem &item)
-{
- const UINT kMaxSize = 512;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- CHAR s[kMaxSize + 1];
- MENUITEMINFOA si;
- ConvertItemToSysForm(item, si);
- if (item.IsString())
- {
- si.cch = kMaxSize;
- si.dwTypeData = s;
- }
- if (GetItemInfo(itemIndex, byPosition, &si))
- {
- ConvertItemToMyForm(si, item);
- if (item.IsString())
- item.StringValue = GetUnicodeString(s);
- return true;
- }
- }
- else
- #endif
- {
- wchar_t s[kMaxSize + 1];
- MENUITEMINFOW si;
- ConvertItemToSysForm(item, si);
- if (item.IsString())
- {
- si.cch = kMaxSize;
- si.dwTypeData = s;
- }
- if (GetItemInfo(itemIndex, byPosition, &si))
- {
- ConvertItemToMyForm(si, item);
- if (item.IsString())
- item.StringValue = s;
- return true;
- }
- }
- return false;
-}
-
-bool CMenu::SetItem(UINT itemIndex, bool byPosition, const CMenuItem &item)
-{
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- MENUITEMINFOA si;
- ConvertItemToSysForm(item, si);
- AString s;
- if (item.IsString())
- {
- s = GetSystemString(item.StringValue);
- si.dwTypeData = (LPTSTR)(LPCTSTR)s;
- }
- return SetItemInfo(itemIndex, byPosition, &si);
- }
- else
- #endif
- {
- MENUITEMINFOW si;
- ConvertItemToSysForm(item, si);
- if (item.IsString())
- si.dwTypeData = (LPWSTR)(LPCWSTR)item.StringValue;
- return SetItemInfo(itemIndex, byPosition, &si);
- }
-}
-
-bool CMenu::InsertItem(UINT itemIndex, bool byPosition, const CMenuItem &item)
-{
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- MENUITEMINFOA si;
- ConvertItemToSysForm(item, si);
- AString s;
- if (item.IsString())
- {
- s = GetSystemString(item.StringValue);
- si.dwTypeData = (LPTSTR)(LPCTSTR)s;
- }
- return InsertItem(itemIndex, byPosition, &si);
- }
- else
- #endif
- {
- MENUITEMINFOW si;
- ConvertItemToSysForm(item, si);
- if (item.IsString())
- si.dwTypeData = (LPWSTR)(LPCWSTR)item.StringValue;
- #ifdef UNDER_CE
- UINT flags = (item.fType & MFT_SEPARATOR) ? MF_SEPARATOR : MF_STRING;
- UINT id = item.wID;
- if ((item.fMask & MIIM_SUBMENU) != 0)
- {
- flags |= MF_POPUP;
- id = (UINT)item.hSubMenu;
- }
- if (!Insert(itemIndex, flags | (byPosition ? MF_BYPOSITION : MF_BYCOMMAND), id, item.StringValue))
- return false;
- return SetItemInfo(itemIndex, byPosition, &si);
- #else
- return InsertItem(itemIndex, byPosition, &si);
- #endif
- }
-}
-
-#ifndef _UNICODE
-bool CMenu::AppendItem(UINT flags, UINT_PTR newItemID, LPCWSTR newItem)
-{
- if (g_IsNT)
- return BOOLToBool(::AppendMenuW(_menu, flags, newItemID, newItem));
- else
- return AppendItem(flags, newItemID, GetSystemString(newItem));
-}
-#endif
-
-}
diff --git a/src/libs/7zip/win/CPP/Windows/Menu.h b/src/libs/7zip/win/CPP/Windows/Menu.h
deleted file mode 100644
index 2563b9117..000000000
--- a/src/libs/7zip/win/CPP/Windows/Menu.h
+++ /dev/null
@@ -1,153 +0,0 @@
-// Windows/Menu.h
-
-#ifndef __WINDOWS_MENU_H
-#define __WINDOWS_MENU_H
-
-#include "Common/MyString.h"
-#include "Windows/Defs.h"
-
-namespace NWindows {
-
-struct CMenuItem
-{
- UString StringValue;
- UINT fMask;
- UINT fType;
- UINT fState;
- UINT wID;
- HMENU hSubMenu;
- HBITMAP hbmpChecked;
- HBITMAP hbmpUnchecked;
- ULONG_PTR dwItemData;
- // LPTSTR dwTypeData;
- // UINT cch;
- // HBITMAP hbmpItem;
- bool IsString() const // change it MIIM_STRING
- { return ((fMask & MIIM_TYPE) != 0 && (fType == MFT_STRING)); }
- bool IsSeparator() const { return (fType == MFT_SEPARATOR); }
- CMenuItem(): fMask(0), fType(0), fState(0), wID(0), hSubMenu(0), hbmpChecked(0),
- hbmpUnchecked(0), dwItemData(0) {}
-};
-
-class CMenu
-{
- HMENU _menu;
-public:
- CMenu(): _menu(NULL) {};
- operator HMENU() const { return _menu; }
- void Attach(HMENU menu) { _menu = menu; }
-
- HMENU Detach()
- {
- HMENU menu = _menu;
- _menu = NULL;
- return menu;
- }
-
- bool Create()
- {
- _menu = ::CreateMenu();
- return (_menu != NULL);
- }
-
- bool CreatePopup()
- {
- _menu = ::CreatePopupMenu();
- return (_menu != NULL);
- }
-
- bool Destroy()
- {
- if (_menu == NULL)
- return false;
- return BOOLToBool(::DestroyMenu(Detach()));
- }
-
- int GetItemCount()
- {
- #ifdef UNDER_CE
- for (int i = 0;; i++)
- {
- CMenuItem item;
- item.fMask = MIIM_STATE;
- if (!GetItem(i, true, item))
- return i;
- }
- #else
- return GetMenuItemCount(_menu);
- #endif
- }
-
- HMENU GetSubMenu(int pos) { return ::GetSubMenu(_menu, pos); }
- #ifndef UNDER_CE
- bool GetItemString(UINT idItem, UINT flag, CSysString &result)
- {
- result.Empty();
- int len = ::GetMenuString(_menu, idItem, 0, 0, flag);
- len = ::GetMenuString(_menu, idItem, result.GetBuffer(len + 2), len + 1, flag);
- result.ReleaseBuffer();
- return (len != 0);
- }
- UINT GetItemID(int pos) { return ::GetMenuItemID(_menu, pos); }
- UINT GetItemState(UINT id, UINT flags) { return ::GetMenuState(_menu, id, flags); }
- #endif
-
- bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFO itemInfo)
- { return BOOLToBool(::GetMenuItemInfo(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
- bool SetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFO itemInfo)
- { return BOOLToBool(::SetMenuItemInfo(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
-
- bool AppendItem(UINT flags, UINT_PTR newItemID, LPCTSTR newItem)
- { return BOOLToBool(::AppendMenu(_menu, flags, newItemID, newItem)); }
-
- bool Insert(UINT position, UINT flags, UINT_PTR idNewItem, LPCTSTR newItem)
- { return BOOLToBool(::InsertMenu(_menu, position, flags, idNewItem, newItem)); }
-
- #ifndef UNDER_CE
- bool InsertItem(UINT itemIndex, bool byPosition, LPCMENUITEMINFO itemInfo)
- { return BOOLToBool(::InsertMenuItem(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
- #endif
-
- bool RemoveItem(UINT item, UINT flags) { return BOOLToBool(::RemoveMenu(_menu, item, flags)); }
- void RemoveAllItemsFrom(UINT index) { while (RemoveItem(index, MF_BYPOSITION)); }
- void RemoveAllItems() { RemoveAllItemsFrom(0); }
-
- #ifndef _UNICODE
- bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo)
- { return BOOLToBool(::GetMenuItemInfoW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
- bool InsertItem(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo)
- { return BOOLToBool(::InsertMenuItemW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
- bool SetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo)
- { return BOOLToBool(::SetMenuItemInfoW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
- bool AppendItem(UINT flags, UINT_PTR newItemID, LPCWSTR newItem);
- #endif
-
- bool GetItem(UINT itemIndex, bool byPosition, CMenuItem &item);
- bool SetItem(UINT itemIndex, bool byPosition, const CMenuItem &item);
- bool InsertItem(UINT itemIndex, bool byPosition, const CMenuItem &item);
-
- int Track(UINT flags, int x, int y, HWND hWnd) { return ::TrackPopupMenuEx(_menu, flags, x, y, hWnd, NULL); }
-
- bool CheckRadioItem(UINT idFirst, UINT idLast, UINT idCheck, UINT flags)
- { return BOOLToBool(::CheckMenuRadioItem(_menu, idFirst, idLast, idCheck, flags)); }
-
- DWORD CheckItem(UINT id, UINT uCheck) { return ::CheckMenuItem(_menu, id, uCheck); }
- DWORD CheckItemByID(UINT id, bool check) { return CheckItem(id, MF_BYCOMMAND | (check ? MF_CHECKED : MF_UNCHECKED)); }
-
- BOOL EnableItem(UINT uIDEnableItem, UINT uEnable) { return EnableMenuItem(_menu, uIDEnableItem, uEnable); }
-};
-
-class CMenuDestroyer
-{
- CMenu *_menu;
-public:
- CMenuDestroyer(CMenu &menu): _menu(&menu) {}
- CMenuDestroyer(): _menu(0) {}
- ~CMenuDestroyer() { if (_menu) _menu->Destroy(); }
- void Attach(CMenu &menu) { _menu = &menu; }
- void Disable() { _menu = 0; }
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/NationalTime.cpp b/src/libs/7zip/win/CPP/Windows/NationalTime.cpp
deleted file mode 100644
index c231d3ced..000000000
--- a/src/libs/7zip/win/CPP/Windows/NationalTime.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-// Windows/NationalTime.cpp
-
-#include "StdAfx.h"
-
-#include "Windows/NationalTime.h"
-
-namespace NWindows {
-namespace NNational {
-namespace NTime {
-
-bool MyGetTimeFormat(LCID locale, DWORD flags, CONST SYSTEMTIME *time,
- LPCTSTR format, CSysString &resultString)
-{
- resultString.Empty();
- int numChars = ::GetTimeFormat(locale, flags, time, format, NULL, 0);
- if (numChars == 0)
- return false;
- numChars = ::GetTimeFormat(locale, flags, time, format,
- resultString.GetBuffer(numChars), numChars + 1);
- resultString.ReleaseBuffer();
- return (numChars != 0);
-}
-
-bool MyGetDateFormat(LCID locale, DWORD flags, CONST SYSTEMTIME *time,
- LPCTSTR format, CSysString &resultString)
-{
- resultString.Empty();
- int numChars = ::GetDateFormat(locale, flags, time, format, NULL, 0);
- if (numChars == 0)
- return false;
- numChars = ::GetDateFormat(locale, flags, time, format,
- resultString.GetBuffer(numChars), numChars + 1);
- resultString.ReleaseBuffer();
- return (numChars != 0);
-}
-
-}}}
diff --git a/src/libs/7zip/win/CPP/Windows/NationalTime.h b/src/libs/7zip/win/CPP/Windows/NationalTime.h
deleted file mode 100644
index 86e014bf9..000000000
--- a/src/libs/7zip/win/CPP/Windows/NationalTime.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Windows/NationalTime.h
-
-#ifndef __WINDOWS_NATIONALTIME_H
-#define __WINDOWS_NATIONALTIME_H
-
-#include "Common/String.h"
-
-namespace NWindows {
-namespace NNational {
-namespace NTime {
-
-bool MyGetTimeFormat(LCID locale, DWORD flags, CONST SYSTEMTIME *time,
- LPCTSTR format, CSysString &resultString);
-
-bool MyGetDateFormat(LCID locale, DWORD flags, CONST SYSTEMTIME *time,
- LPCTSTR format, CSysString &resultString);
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Net.cpp b/src/libs/7zip/win/CPP/Windows/Net.cpp
deleted file mode 100644
index b0a18732a..000000000
--- a/src/libs/7zip/win/CPP/Windows/Net.cpp
+++ /dev/null
@@ -1,380 +0,0 @@
-// Windows/Net.cpp
-
-#include "StdAfx.h"
-
-#ifndef _UNICODE
-#include "Common/StringConvert.h"
-#endif
-
-#include "Windows/Net.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-namespace NWindows {
-namespace NNet {
-
-DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCE netResource)
-{
- Close();
- DWORD result = ::WNetOpenEnum(scope, type, usage, netResource, &_handle);
- _handleAllocated = (result == NO_ERROR);
- return result;
-}
-
-#ifndef _UNICODE
-DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCEW netResource)
-{
- Close();
- DWORD result = ::WNetOpenEnumW(scope, type, usage, netResource, &_handle);
- _handleAllocated = (result == NO_ERROR);
- return result;
-}
-#endif
-
-static void SetComplexString(bool &defined, CSysString &destString, LPCTSTR srsString)
-{
- defined = (srsString != 0);
- if (defined)
- destString = srsString;
- else
- destString.Empty();
-}
-
-static void ConvertNETRESOURCEToCResource(const NETRESOURCE &netResource, CResource &resource)
-{
- resource.Scope = netResource.dwScope;
- resource.Type = netResource.dwType;
- resource.DisplayType = netResource.dwDisplayType;
- resource.Usage = netResource.dwUsage;
- SetComplexString(resource.LocalNameIsDefined, resource.LocalName, netResource.lpLocalName);
- SetComplexString(resource.RemoteNameIsDefined, resource.RemoteName, netResource.lpRemoteName);
- SetComplexString(resource.CommentIsDefined, resource.Comment, netResource.lpComment);
- SetComplexString(resource.ProviderIsDefined, resource.Provider, netResource.lpProvider);
-}
-
-static void SetComplexString2(LPTSTR *destString, bool defined, const CSysString &srcString)
-{
- if (defined)
- *destString = (TCHAR *)(const TCHAR *)srcString;
- else
- *destString = 0;
-}
-
-static void ConvertCResourceToNETRESOURCE(const CResource &resource, NETRESOURCE &netResource)
-{
- netResource.dwScope = resource.Scope;
- netResource.dwType = resource.Type;
- netResource.dwDisplayType = resource.DisplayType;
- netResource.dwUsage = resource.Usage;
- SetComplexString2(&netResource.lpLocalName, resource.LocalNameIsDefined, resource.LocalName);
- SetComplexString2(&netResource.lpRemoteName, resource.RemoteNameIsDefined, resource.RemoteName);
- SetComplexString2(&netResource.lpComment, resource.CommentIsDefined, resource.Comment);
- SetComplexString2(&netResource.lpProvider, resource.ProviderIsDefined, resource.Provider);
-}
-
-#ifndef _UNICODE
-
-static void SetComplexString(bool &defined, UString &destString, LPCWSTR srsString)
-{
- defined = (srsString != 0);
- if (defined)
- destString = srsString;
- else
- destString.Empty();
-}
-
-static void ConvertNETRESOURCEToCResource(const NETRESOURCEW &netResource, CResourceW &resource)
-{
- resource.Scope = netResource.dwScope;
- resource.Type = netResource.dwType;
- resource.DisplayType = netResource.dwDisplayType;
- resource.Usage = netResource.dwUsage;
- SetComplexString(resource.LocalNameIsDefined, resource.LocalName, netResource.lpLocalName);
- SetComplexString(resource.RemoteNameIsDefined, resource.RemoteName, netResource.lpRemoteName);
- SetComplexString(resource.CommentIsDefined, resource.Comment, netResource.lpComment);
- SetComplexString(resource.ProviderIsDefined, resource.Provider, netResource.lpProvider);
-}
-
-static void SetComplexString2(LPWSTR *destString, bool defined, const UString &srcString)
-{
- if (defined)
- *destString = (WCHAR *)(const WCHAR *)srcString;
- else
- *destString = 0;
-}
-
-static void ConvertCResourceToNETRESOURCE(const CResourceW &resource, NETRESOURCEW &netResource)
-{
- netResource.dwScope = resource.Scope;
- netResource.dwType = resource.Type;
- netResource.dwDisplayType = resource.DisplayType;
- netResource.dwUsage = resource.Usage;
- SetComplexString2(&netResource.lpLocalName, resource.LocalNameIsDefined, resource.LocalName);
- SetComplexString2(&netResource.lpRemoteName, resource.RemoteNameIsDefined, resource.RemoteName);
- SetComplexString2(&netResource.lpComment, resource.CommentIsDefined, resource.Comment);
- SetComplexString2(&netResource.lpProvider, resource.ProviderIsDefined, resource.Provider);
-}
-
-static void ConvertResourceWToResource(const CResourceW &resourceW, CResource &resource)
-{
- *(CResourceBase *)&resource = *(CResourceBase *)&resourceW;
- resource.LocalName = GetSystemString(resourceW.LocalName);
- resource.RemoteName = GetSystemString(resourceW.RemoteName);
- resource.Comment = GetSystemString(resourceW.Comment);
- resource.Provider = GetSystemString(resourceW.Provider);
-}
-
-static void ConvertResourceToResourceW(const CResource &resource, CResourceW &resourceW)
-{
- *(CResourceBase *)&resourceW = *(CResourceBase *)&resource;
- resourceW.LocalName = GetUnicodeString(resource.LocalName);
- resourceW.RemoteName = GetUnicodeString(resource.RemoteName);
- resourceW.Comment = GetUnicodeString(resource.Comment);
- resourceW.Provider = GetUnicodeString(resource.Provider);
-}
-#endif
-
-DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, const CResource *resource)
-{
- NETRESOURCE netResource;
- LPNETRESOURCE pointer;
- if (resource == 0)
- pointer = 0;
- else
- {
- ConvertCResourceToNETRESOURCE(*resource, netResource);
- pointer = &netResource;
- }
- return Open(scope, type, usage, pointer);
-}
-
-#ifndef _UNICODE
-DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, const CResourceW *resource)
-{
- if (g_IsNT)
- {
- NETRESOURCEW netResource;
- LPNETRESOURCEW pointer;
- if (resource == 0)
- pointer = 0;
- else
- {
- ConvertCResourceToNETRESOURCE(*resource, netResource);
- pointer = &netResource;
- }
- return Open(scope, type, usage, pointer);
- }
- CResource *pointer;
- CResource resourceA;
- if (resource == 0)
- pointer = 0;
- else
- {
- ConvertResourceWToResource(*resource, resourceA);
- pointer = &resourceA;
- }
- return Open(scope, type, usage, pointer);
-}
-#endif
-
-DWORD CEnum::Close()
-{
- if (!_handleAllocated)
- return NO_ERROR;
- DWORD result = ::WNetCloseEnum(_handle);
- _handleAllocated = (result != NO_ERROR);
- return result;
-}
-
-DWORD CEnum::Next(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize)
-{
- return ::WNetEnumResource(_handle, lpcCount, lpBuffer, lpBufferSize);
-}
-
-#ifndef _UNICODE
-DWORD CEnum::NextW(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize)
-{
- return ::WNetEnumResourceW(_handle, lpcCount, lpBuffer, lpBufferSize);
-}
-#endif
-
-DWORD CEnum::Next(CResource &resource)
-{
- CByteBuffer byteBuffer;
- const DWORD kBufferSize = 16384;
- byteBuffer.SetCapacity(kBufferSize);
- LPNETRESOURCE lpnrLocal = (LPNETRESOURCE) (BYTE *)(byteBuffer);
- ZeroMemory(lpnrLocal, kBufferSize);
- DWORD bufferSize = kBufferSize;
- DWORD numEntries = 1;
- DWORD result = Next(&numEntries, lpnrLocal, &bufferSize);
- if (result != NO_ERROR)
- return result;
- if (numEntries != 1)
- return (DWORD)E_FAIL;
- ConvertNETRESOURCEToCResource(lpnrLocal[0], resource);
- return result;
-}
-
-#ifndef _UNICODE
-DWORD CEnum::Next(CResourceW &resource)
-{
- if (g_IsNT)
- {
- CByteBuffer byteBuffer;
- const DWORD kBufferSize = 16384;
- byteBuffer.SetCapacity(kBufferSize);
- LPNETRESOURCEW lpnrLocal = (LPNETRESOURCEW) (BYTE *)(byteBuffer);
- ZeroMemory(lpnrLocal, kBufferSize);
- DWORD bufferSize = kBufferSize;
- DWORD numEntries = 1;
- DWORD result = NextW(&numEntries, lpnrLocal, &bufferSize);
- if (result != NO_ERROR)
- return result;
- if (numEntries != 1)
- return (DWORD)E_FAIL;
- ConvertNETRESOURCEToCResource(lpnrLocal[0], resource);
- return result;
- }
- CResource resourceA;
- DWORD result = Next(resourceA);
- ConvertResourceToResourceW(resourceA, resource);
- return result;
-}
-#endif
-
-
-DWORD GetResourceParent(const CResource &resource, CResource &parentResource)
-{
- CByteBuffer byteBuffer;
- const DWORD kBufferSize = 16384;
- byteBuffer.SetCapacity(kBufferSize);
- LPNETRESOURCE lpnrLocal = (LPNETRESOURCE) (BYTE *)(byteBuffer);
- ZeroMemory(lpnrLocal, kBufferSize);
- DWORD bufferSize = kBufferSize;
- NETRESOURCE netResource;
- ConvertCResourceToNETRESOURCE(resource, netResource);
- DWORD result = ::WNetGetResourceParent(&netResource, lpnrLocal, &bufferSize);
- if (result != NO_ERROR)
- return result;
- ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource);
- return result;
-}
-
-#ifndef _UNICODE
-DWORD GetResourceParent(const CResourceW &resource, CResourceW &parentResource)
-{
- if (g_IsNT)
- {
- CByteBuffer byteBuffer;
- const DWORD kBufferSize = 16384;
- byteBuffer.SetCapacity(kBufferSize);
- LPNETRESOURCEW lpnrLocal = (LPNETRESOURCEW) (BYTE *)(byteBuffer);
- ZeroMemory(lpnrLocal, kBufferSize);
- DWORD bufferSize = kBufferSize;
- NETRESOURCEW netResource;
- ConvertCResourceToNETRESOURCE(resource, netResource);
- DWORD result = ::WNetGetResourceParentW(&netResource, lpnrLocal, &bufferSize);
- if (result != NO_ERROR)
- return result;
- ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource);
- return result;
- }
- CResource resourceA, parentResourceA;
- ConvertResourceWToResource(resource, resourceA);
- DWORD result = GetResourceParent(resourceA, parentResourceA);
- ConvertResourceToResourceW(parentResourceA, parentResource);
- return result;
-}
-#endif
-
-DWORD GetResourceInformation(const CResource &resource,
- CResource &destResource, CSysString &systemPathPart)
-{
- CByteBuffer byteBuffer;
- const DWORD kBufferSize = 16384;
- byteBuffer.SetCapacity(kBufferSize);
- LPNETRESOURCE lpnrLocal = (LPNETRESOURCE) (BYTE *)(byteBuffer);
- ZeroMemory(lpnrLocal, kBufferSize);
- DWORD bufferSize = kBufferSize;
- NETRESOURCE netResource;
- ConvertCResourceToNETRESOURCE(resource, netResource);
- LPTSTR lplpSystem;
- DWORD result = ::WNetGetResourceInformation(&netResource,
- lpnrLocal, &bufferSize, &lplpSystem);
- if (result != NO_ERROR)
- return result;
- if (lplpSystem != 0)
- systemPathPart = lplpSystem;
- ConvertNETRESOURCEToCResource(lpnrLocal[0], destResource);
- return result;
-}
-
-#ifndef _UNICODE
-DWORD GetResourceInformation(const CResourceW &resource,
- CResourceW &destResource, UString &systemPathPart)
-{
- if (g_IsNT)
- {
- CByteBuffer byteBuffer;
- const DWORD kBufferSize = 16384;
- byteBuffer.SetCapacity(kBufferSize);
- LPNETRESOURCEW lpnrLocal = (LPNETRESOURCEW) (BYTE *)(byteBuffer);
- ZeroMemory(lpnrLocal, kBufferSize);
- DWORD bufferSize = kBufferSize;
- NETRESOURCEW netResource;
- ConvertCResourceToNETRESOURCE(resource, netResource);
- LPWSTR lplpSystem;
- DWORD result = ::WNetGetResourceInformationW(&netResource,
- lpnrLocal, &bufferSize, &lplpSystem);
- if (result != NO_ERROR)
- return result;
- if (lplpSystem != 0)
- systemPathPart = lplpSystem;
- ConvertNETRESOURCEToCResource(lpnrLocal[0], destResource);
- return result;
- }
- CResource resourceA, destResourceA;
- ConvertResourceWToResource(resource, resourceA);
- AString systemPathPartA;
- DWORD result = GetResourceInformation(resourceA, destResourceA, systemPathPartA);
- ConvertResourceToResourceW(destResourceA, destResource);
- systemPathPart = GetUnicodeString(systemPathPartA);
- return result;
-}
-#endif
-
-DWORD AddConnection2(const CResource &resource,
- LPCTSTR password, LPCTSTR userName, DWORD flags)
-{
- NETRESOURCE netResource;
- ConvertCResourceToNETRESOURCE(resource, netResource);
- return ::WNetAddConnection2(&netResource,
- password, userName, flags);
-}
-
-DWORD AddConnection2(const CResource &resource, LPCTSTR password, LPCTSTR userName, DWORD flags);
-
-#ifndef _UNICODE
-DWORD AddConnection2(const CResourceW &resource, LPCWSTR password, LPCWSTR userName, DWORD flags)
-{
- if (g_IsNT)
- {
- NETRESOURCEW netResource;
- ConvertCResourceToNETRESOURCE(resource, netResource);
- return ::WNetAddConnection2W(&netResource,password, userName, flags);
- }
- CResource resourceA;
- ConvertResourceWToResource(resource, resourceA);
- CSysString passwordA = GetSystemString(password);
- CSysString userNameA = GetSystemString(userName);
- return AddConnection2(resourceA,
- password ? (LPCTSTR)passwordA: 0,
- userName ? (LPCTSTR)userNameA: 0,
- flags);
-}
-#endif
-
-}}
diff --git a/src/libs/7zip/win/CPP/Windows/Net.h b/src/libs/7zip/win/CPP/Windows/Net.h
deleted file mode 100644
index c88b61130..000000000
--- a/src/libs/7zip/win/CPP/Windows/Net.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Windows/Net.h
-
-#ifndef __WINDOWS_NET_H
-#define __WINDOWS_NET_H
-
-#include "Common/Buffer.h"
-#include "Common/MyString.h"
-
-namespace NWindows {
-namespace NNet {
-
-struct CResourceBase
-{
- DWORD Scope;
- DWORD Type;
- DWORD DisplayType;
- DWORD Usage;
- bool LocalNameIsDefined;
- bool RemoteNameIsDefined;
- bool CommentIsDefined;
- bool ProviderIsDefined;
-};
-
-struct CResource: public CResourceBase
-{
- CSysString LocalName;
- CSysString RemoteName;
- CSysString Comment;
- CSysString Provider;
-};
-
-#ifdef _UNICODE
-typedef CResource CResourceW;
-#else
-struct CResourceW: public CResourceBase
-{
- UString LocalName;
- UString RemoteName;
- UString Comment;
- UString Provider;
-};
-#endif
-
-class CEnum
-{
- HANDLE _handle;
- bool _handleAllocated;
- DWORD Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCE netResource);
- DWORD Next(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize);
- #ifndef _UNICODE
- DWORD Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCEW netResource);
- DWORD NextW(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize);
- #endif
-protected:
- bool IsHandleAllocated() const { return _handleAllocated; }
-public:
- CEnum(): _handleAllocated(false) {}
- ~CEnum() { Close(); }
- DWORD Close();
- DWORD Open(DWORD scope, DWORD type, DWORD usage, const CResource *resource);
- DWORD Next(CResource &resource);
- #ifndef _UNICODE
- DWORD Open(DWORD scope, DWORD type, DWORD usage, const CResourceW *resource);
- DWORD Next(CResourceW &resource);
- #endif
-};
-
-DWORD GetResourceParent(const CResource &resource, CResource &parentResource);
-#ifndef _UNICODE
-DWORD GetResourceParent(const CResourceW &resource, CResourceW &parentResource);
-#endif
-
-DWORD GetResourceInformation(const CResource &resource,
- CResource &destResource, CSysString &systemPathPart);
-#ifndef _UNICODE
-DWORD GetResourceInformation(const CResourceW &resource,
- CResourceW &destResource, UString &systemPathPart);
-#endif
-
-DWORD AddConnection2(const CResource &resource, LPCTSTR password, LPCTSTR userName, DWORD flags);
-#ifndef _UNICODE
-DWORD AddConnection2(const CResourceW &resource, LPCWSTR password, LPCWSTR userName, DWORD flags);
-#endif
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Process.cpp b/src/libs/7zip/win/CPP/Windows/Process.cpp
deleted file mode 100644
index 9bcee7d5a..000000000
--- a/src/libs/7zip/win/CPP/Windows/Process.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// Process.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/StringConvert.h"
-
-#include "Process.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-namespace NWindows {
-
-static UString GetQuotedString(const UString &s)
-{
- return UString(L'\"') + s + UString(L'\"');
-}
-
-WRes CProcess::Create(LPCWSTR imageName, const UString &params, LPCWSTR curDir)
-{
- Close();
- const UString params2 =
- #ifndef UNDER_CE
- GetQuotedString(imageName) + L' ' +
- #endif
- params;
- #ifdef UNDER_CE
- curDir = 0;
- #else
- imageName = 0;
- #endif
- PROCESS_INFORMATION pi;
- BOOL result;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- STARTUPINFOA si;
- si.cb = sizeof(si);
- si.lpReserved = 0;
- si.lpDesktop = 0;
- si.lpTitle = 0;
- si.dwFlags = 0;
- si.cbReserved2 = 0;
- si.lpReserved2 = 0;
-
- CSysString curDirA;
- if (curDir != 0)
- curDirA = GetSystemString(curDir);
- result = ::CreateProcessA(NULL, (LPSTR)(LPCSTR)GetSystemString(params2),
- NULL, NULL, FALSE, 0, NULL, ((curDir != 0) ? (LPCSTR)curDirA: 0), &si, &pi);
- }
- else
- #endif
- {
- STARTUPINFOW si;
- si.cb = sizeof(si);
- si.lpReserved = 0;
- si.lpDesktop = 0;
- si.lpTitle = 0;
- si.dwFlags = 0;
- si.cbReserved2 = 0;
- si.lpReserved2 = 0;
-
- result = CreateProcessW(imageName, (LPWSTR)(LPCWSTR)params2,
- NULL, NULL, FALSE, 0, NULL, (LPWSTR)curDir, &si, &pi);
- }
- if (result == 0)
- return ::GetLastError();
- ::CloseHandle(pi.hThread);
- _handle = pi.hProcess;
- return 0;
-}
-
-WRes MyCreateProcess(LPCWSTR imageName, const UString &params)
-{
- CProcess process;
- return process.Create(imageName, params, 0);
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/Windows/Process.h b/src/libs/7zip/win/CPP/Windows/Process.h
deleted file mode 100644
index 5b01c377a..000000000
--- a/src/libs/7zip/win/CPP/Windows/Process.h
+++ /dev/null
@@ -1,100 +0,0 @@
-// Windows/Process.h
-
-#ifndef __WINDOWS_PROCESS_H
-#define __WINDOWS_PROCESS_H
-
-#include <psapi.h>
-
-#include "../Common/MyString.h"
-
-#include "Defs.h"
-#include "Handle.h"
-
-namespace NWindows {
-
-class CProcess: public CHandle
-{
-public:
- bool Open(DWORD desiredAccess, bool inheritHandle, DWORD processId)
- {
- _handle = ::OpenProcess(desiredAccess, inheritHandle, processId);
- return (_handle != 0);
- }
-
- #ifndef UNDER_CE
-
- bool GetExitCodeProcess(LPDWORD lpExitCode) { return BOOLToBool(::GetExitCodeProcess(_handle, lpExitCode)); }
- bool Terminate(UINT exitCode) { return BOOLToBool(::TerminateProcess(_handle, exitCode)); }
- #if(WINVER >= 0x0500)
- DWORD GetGuiResources (DWORD uiFlags) { return ::GetGuiResources(_handle, uiFlags); }
- #endif
- bool SetPriorityClass(DWORD dwPriorityClass) { return BOOLToBool(::SetPriorityClass(_handle, dwPriorityClass)); }
- DWORD GetPriorityClass() { return ::GetPriorityClass(_handle); }
- bool GetIoCounters(PIO_COUNTERS lpIoCounters ) { return BOOLToBool(::GetProcessIoCounters(_handle, lpIoCounters )); }
-
- bool GetTimes(LPFILETIME creationTime, LPFILETIME exitTime, LPFILETIME kernelTime, LPFILETIME userTime)
- { return BOOLToBool(::GetProcessTimes(_handle, creationTime, exitTime, kernelTime, userTime)); }
-
- DWORD WaitForInputIdle(DWORD milliseconds) { return ::WaitForInputIdle(_handle, milliseconds); }
-
- // Debug
-
- bool ReadMemory(LPCVOID baseAddress, LPVOID buffer, SIZE_T size, SIZE_T* numberOfBytesRead)
- { return BOOLToBool(::ReadProcessMemory(_handle, baseAddress, buffer, size, numberOfBytesRead)); }
-
- bool WriteMemory(LPVOID baseAddress, LPCVOID buffer, SIZE_T size, SIZE_T* numberOfBytesWritten)
- { return BOOLToBool(::WriteProcessMemory(_handle, baseAddress, buffer, size, numberOfBytesWritten)); }
-
- bool FlushInstructionCache(LPCVOID baseAddress = 0, SIZE_T size = 0)
- { return BOOLToBool(::FlushInstructionCache(_handle, baseAddress, size)); }
-
- LPVOID VirtualAlloc(LPVOID address, SIZE_T size, DWORD allocationType, DWORD protect)
- { return VirtualAllocEx(_handle, address, size, allocationType, protect); }
-
- bool VirtualFree(LPVOID address, SIZE_T size, DWORD freeType)
- { return BOOLToBool(::VirtualFreeEx(_handle, address, size, freeType)); }
-
- // Process Status API (PSAPI)
-
- bool EmptyWorkingSet()
- { return BOOLToBool(::EmptyWorkingSet(_handle)); }
- bool EnumModules(HMODULE *hModules, DWORD arraySizeInBytes, LPDWORD receivedBytes)
- { return BOOLToBool(::EnumProcessModules(_handle, hModules, arraySizeInBytes, receivedBytes)); }
-
- DWORD MyGetModuleBaseName(HMODULE hModule, LPTSTR baseName, DWORD size)
- { return ::GetModuleBaseName(_handle, hModule, baseName, size); }
- bool MyGetModuleBaseName(HMODULE hModule, CSysString &name)
- {
- const int length = 1000;
- DWORD resultLen = MyGetModuleBaseName(hModule, name.GetBuffer(length), length);
- name.ReleaseBuffer();
- return (resultLen != 0);
- }
-
- DWORD MyGetModuleFileNameEx(HMODULE hModule, LPTSTR baseName, DWORD size)
- { return ::GetModuleFileNameEx(_handle, hModule, baseName, size); }
- bool MyGetModuleFileNameEx(HMODULE hModule, CSysString &name)
- {
- const int length = MAX_PATH + 100;
- DWORD resultLen = MyGetModuleFileNameEx(hModule, name.GetBuffer(length), length);
- name.ReleaseBuffer();
- return (resultLen != 0);
- }
-
- bool GetModuleInformation(HMODULE hModule, LPMODULEINFO moduleInfo)
- { return BOOLToBool(::GetModuleInformation(_handle, hModule, moduleInfo, sizeof(MODULEINFO))); }
- bool GetMemoryInfo(PPROCESS_MEMORY_COUNTERS memCounters)
- { return BOOLToBool(::GetProcessMemoryInfo(_handle, memCounters, sizeof(PROCESS_MEMORY_COUNTERS))); }
-
- #endif
-
- WRes Create(LPCWSTR imageName, const UString &params, LPCWSTR curDir);
-
- DWORD Wait() { return ::WaitForSingleObject(_handle, INFINITE); }
-};
-
-WRes MyCreateProcess(LPCWSTR imageName, const UString &params);
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/ProcessMessages.cpp b/src/libs/7zip/win/CPP/Windows/ProcessMessages.cpp
deleted file mode 100644
index 0f48aee25..000000000
--- a/src/libs/7zip/win/CPP/Windows/ProcessMessages.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-// Windows/ProcessMessages.cpp
-
-#include "StdAfx.h"
-
-#include "ProcessMessages.h"
-
-namespace NWindows {
-
-void ProcessMessages(HWND window)
-{
- MSG msg;
- while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
- {
- if (window == (HWND) NULL || !IsDialogMessage(window, &msg))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/Windows/ProcessMessages.h b/src/libs/7zip/win/CPP/Windows/ProcessMessages.h
deleted file mode 100644
index 63f8ec8a0..000000000
--- a/src/libs/7zip/win/CPP/Windows/ProcessMessages.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Windows/ProcessMessages.h
-
-#ifndef __WINDOWS_PROCESSMESSAGES_H
-#define __WINDOWS_PROCESSMESSAGES_H
-
-namespace NWindows {
-
-void ProcessMessages(HWND window);
-
-}
-
-#endif
-
-
diff --git a/src/libs/7zip/win/CPP/Windows/PropVariantUtils.cpp b/src/libs/7zip/win/CPP/Windows/PropVariantUtils.cpp
deleted file mode 100644
index 0a9cfab7f..000000000
--- a/src/libs/7zip/win/CPP/Windows/PropVariantUtils.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-// PropVariantUtils.cpp
-
-#include "StdAfx.h"
-
-#include "PropVariantUtils.h"
-#include "Common/StringConvert.h"
-#include "Common/IntToString.h"
-
-using namespace NWindows;
-
-static AString GetHex(UInt32 v)
-{
- char sz[32] = { '0', 'x' };
- ConvertUInt64ToString(v, sz + 2, 16);
- return sz;
-}
-
-void StringToProp(const AString &s, NCOM::CPropVariant &prop)
-{
- prop = MultiByteToUnicodeString(s);
-}
-
-void PairToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 value, NCOM::CPropVariant &prop)
-{
- AString s;
- for (unsigned i = 0; i < num; i++)
- {
- const CUInt32PCharPair &p = pairs[i];
- if (p.Value == value)
- s = p.Name;
- }
- if (s.IsEmpty())
- s = GetHex(value);
- StringToProp(s, prop);
-}
-
-AString TypeToString(const char *table[], unsigned num, UInt32 value)
-{
- if (value < num)
- return table[value];
- return GetHex(value);
-}
-
-void TypeToProp(const char *table[], unsigned num, UInt32 value, NCOM::CPropVariant &prop)
-{
- StringToProp(TypeToString(table, num, value), prop);
-}
-
-
-AString FlagsToString(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags)
-{
- AString s;
- for (unsigned i = 0; i < num; i++)
- {
- const CUInt32PCharPair &p = pairs[i];
- UInt32 flag = (UInt32)1 << (unsigned)p.Value;
- if ((flags & flag) != 0)
- {
- if (!s.IsEmpty())
- s += ' ';
- s += p.Name;
- }
- flags &= ~flag;
- }
- if (flags != 0)
- {
- if (!s.IsEmpty())
- s += ' ';
- s += GetHex(flags);
- }
- return s;
-}
-
-void FlagsToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags, NCOM::CPropVariant &prop)
-{
- StringToProp(FlagsToString(pairs, num, flags), prop);
-}
-
diff --git a/src/libs/7zip/win/CPP/Windows/PropVariantUtils.h b/src/libs/7zip/win/CPP/Windows/PropVariantUtils.h
deleted file mode 100644
index 5aaf65cb9..000000000
--- a/src/libs/7zip/win/CPP/Windows/PropVariantUtils.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Windows/PropVariantUtils.h
-
-#ifndef __PROP_VARIANT_UTILS_H
-#define __PROP_VARIANT_UTILS_H
-
-#include "Common/MyString.h"
-#include "PropVariant.h"
-
-struct CUInt32PCharPair
-{
- UInt32 Value;
- const char *Name;
-};
-
-void StringToProp(const AString &s, NWindows::NCOM::CPropVariant &prop);
-void PairToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 value, NWindows::NCOM::CPropVariant &prop);
-
-AString FlagsToString(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags);
-void FlagsToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags, NWindows::NCOM::CPropVariant &prop);
-
-AString TypeToString(const char *table[], unsigned num, UInt32 value);
-void TypeToProp(const char *table[], unsigned num, UInt32 value, NWindows::NCOM::CPropVariant &prop);
-
-#define PAIR_TO_PROP(pairs, value, prop) PairToProp(pairs, sizeof(pairs) / sizeof(pairs[0]), value, prop)
-#define FLAGS_TO_PROP(pairs, value, prop) FlagsToProp(pairs, sizeof(pairs) / sizeof(pairs[0]), value, prop)
-#define TYPE_TO_PROP(table, value, prop) TypeToProp(table, sizeof(table) / sizeof(table[0]), value, prop)
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/ResourceString.cpp b/src/libs/7zip/win/CPP/Windows/ResourceString.cpp
deleted file mode 100644
index 781f03b33..000000000
--- a/src/libs/7zip/win/CPP/Windows/ResourceString.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-// Windows/ResourceString.cpp
-
-#include "StdAfx.h"
-
-#include "Windows/ResourceString.h"
-#ifndef _UNICODE
-#include "Common/StringConvert.h"
-#endif
-
-extern HINSTANCE g_hInstance;
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-namespace NWindows {
-
-CSysString MyLoadString(HINSTANCE hInstance, UINT resourceID)
-{
- CSysString s;
- int size = 256;
- int len;
- do
- {
- size += 256;
- len = ::LoadString(hInstance, resourceID, s.GetBuffer(size - 1), size);
- }
- while (size - len <= 1);
- s.ReleaseBuffer();
- return s;
-}
-
-CSysString MyLoadString(UINT resourceID)
-{
- return MyLoadString(g_hInstance, resourceID);
-}
-
-#ifndef _UNICODE
-UString MyLoadStringW(HINSTANCE hInstance, UINT resourceID)
-{
- if (g_IsNT)
- {
- UString s;
- int size = 256;
- int len;
- do
- {
- size += 256;
- len = ::LoadStringW(hInstance, resourceID, s.GetBuffer(size - 1), size);
- }
- while (size - len <= 1);
- s.ReleaseBuffer();
- return s;
- }
- return GetUnicodeString(MyLoadString(hInstance, resourceID));
-}
-
-UString MyLoadStringW(UINT resourceID)
-{
- return MyLoadStringW(g_hInstance, resourceID);
-}
-
-#endif
-
-}
diff --git a/src/libs/7zip/win/CPP/Windows/ResourceString.h b/src/libs/7zip/win/CPP/Windows/ResourceString.h
deleted file mode 100644
index ac9c5cd5d..000000000
--- a/src/libs/7zip/win/CPP/Windows/ResourceString.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Windows/ResourceString.h
-
-#ifndef __WINDOWS_RESOURCESTRING_H
-#define __WINDOWS_RESOURCESTRING_H
-
-#include "Common/MyString.h"
-
-namespace NWindows {
-
-CSysString MyLoadString(HINSTANCE hInstance, UINT resourceID);
-CSysString MyLoadString(UINT resourceID);
-#ifdef _UNICODE
-inline UString MyLoadStringW(HINSTANCE hInstance, UINT resourceID) { return MyLoadString(hInstance, resourceID); }
-inline UString MyLoadStringW(UINT resourceID) { return MyLoadString(resourceID); }
-#else
-UString MyLoadStringW(HINSTANCE hInstance, UINT resourceID);
-UString MyLoadStringW(UINT resourceID);
-#endif
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Security.cpp b/src/libs/7zip/win/CPP/Windows/Security.cpp
deleted file mode 100644
index 6f5bcad35..000000000
--- a/src/libs/7zip/win/CPP/Windows/Security.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-// Windows/Security.cpp
-
-#include "StdAfx.h"
-
-#include "Security.h"
-
-namespace NWindows {
-namespace NSecurity {
-
-/*
-bool MyLookupAccountSid(LPCTSTR systemName, PSID sid,
- CSysString &accountName, CSysString &domainName, PSID_NAME_USE sidNameUse)
-{
- DWORD accountNameSize = 0, domainNameSize = 0;
-
- if (!::LookupAccountSid(systemName, sid,
- accountName.GetBuffer(0), &accountNameSize,
- domainName.GetBuffer(0), &domainNameSize, sidNameUse))
- {
- if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER)
- return false;
- }
- bool result = BOOLToBool(::LookupAccountSid(systemName, sid,
- accountName.GetBuffer(accountNameSize), &accountNameSize,
- domainName.GetBuffer(domainNameSize), &domainNameSize, sidNameUse));
- accountName.ReleaseBuffer();
- domainName.ReleaseBuffer();
- return result;
-}
-*/
-
-static void SetLsaString(LPWSTR src, PLSA_UNICODE_STRING dest)
-{
- int len = (int)wcslen(src);
- dest->Length = (USHORT)(len * sizeof(WCHAR));
- dest->MaximumLength = (USHORT)((len + 1) * sizeof(WCHAR));
- dest->Buffer = src;
-}
-
-/*
-static void MyLookupSids(CPolicy &policy, PSID ps)
-{
- LSA_REFERENCED_DOMAIN_LIST *referencedDomains = NULL;
- LSA_TRANSLATED_NAME *names = NULL;
- NTSTATUS nts = policy.LookupSids(1, &ps, &referencedDomains, &names);
- int res = LsaNtStatusToWinError(nts);
- LsaFreeMemory(referencedDomains);
- LsaFreeMemory(names);
-}
-*/
-
-#ifndef _UNICODE
-typedef BOOL (WINAPI * LookupAccountNameWP)(
- LPCWSTR lpSystemName,
- LPCWSTR lpAccountName,
- PSID Sid,
- LPDWORD cbSid,
- LPWSTR ReferencedDomainName,
- LPDWORD cchReferencedDomainName,
- PSID_NAME_USE peUse
- );
-#endif
-
-static PSID GetSid(LPWSTR accountName)
-{
- #ifndef _UNICODE
- HMODULE hModule = GetModuleHandle(TEXT("Advapi32.dll"));
- if (hModule == NULL)
- return NULL;
- LookupAccountNameWP lookupAccountNameW = (LookupAccountNameWP)GetProcAddress(hModule, "LookupAccountNameW");
- if (lookupAccountNameW == NULL)
- return NULL;
- #endif
-
- DWORD sidLen = 0, domainLen = 0;
- SID_NAME_USE sidNameUse;
- if (!
- #ifdef _UNICODE
- ::LookupAccountNameW
- #else
- lookupAccountNameW
- #endif
- (NULL, accountName, NULL, &sidLen, NULL, &domainLen, &sidNameUse))
- {
- if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
- {
- PSID pSid = ::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sidLen);
- LPWSTR domainName = (LPWSTR)::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (domainLen + 1) * sizeof(WCHAR));
- BOOL res =
- #ifdef _UNICODE
- ::LookupAccountNameW
- #else
- lookupAccountNameW
- #endif
- (NULL, accountName, pSid, &sidLen, domainName, &domainLen, &sidNameUse);
- ::HeapFree(GetProcessHeap(), 0, domainName);
- if (res)
- return pSid;
- }
- }
- return NULL;
-}
-
-#define MY__SE_LOCK_MEMORY_NAME L"SeLockMemoryPrivilege"
-
-bool AddLockMemoryPrivilege()
-{
- CPolicy policy;
- LSA_OBJECT_ATTRIBUTES attr;
- attr.Length = sizeof(attr);
- attr.RootDirectory = NULL;
- attr.ObjectName = NULL;
- attr.Attributes = 0;
- attr.SecurityDescriptor = NULL;
- attr.SecurityQualityOfService = NULL;
- if (policy.Open(NULL, &attr,
- // GENERIC_WRITE)
- POLICY_ALL_ACCESS)
- // STANDARD_RIGHTS_REQUIRED,
- // GENERIC_READ | GENERIC_EXECUTE | POLICY_VIEW_LOCAL_INFORMATION | POLICY_LOOKUP_NAMES)
- != 0)
- return false;
- LSA_UNICODE_STRING userRights;
- wchar_t s[128] = MY__SE_LOCK_MEMORY_NAME;
- SetLsaString(s, &userRights);
- WCHAR userName[256 + 2];
- DWORD size = 256;
- if (!GetUserNameW(userName, &size))
- return false;
- PSID psid = GetSid(userName);
- if (psid == NULL)
- return false;
- bool res = false;
-
- /*
- PLSA_UNICODE_STRING userRightsArray;
- ULONG countOfRights;
- NTSTATUS status = policy.EnumerateAccountRights(psid, &userRightsArray, &countOfRights);
- if (status != 0)
- return false;
- bool finded = false;
- for (ULONG i = 0; i < countOfRights; i++)
- {
- LSA_UNICODE_STRING &ur = userRightsArray[i];
- if (ur.Length != s.Length() * sizeof(WCHAR))
- continue;
- if (wcsncmp(ur.Buffer, s, s.Length()) != 0)
- continue;
- finded = true;
- res = true;
- break;
- }
- if (!finded)
- */
- {
- /*
- LSA_ENUMERATION_INFORMATION *enums;
- ULONG countReturned;
- NTSTATUS status = policy.EnumerateAccountsWithUserRight(&userRights, &enums, &countReturned);
- if (status == 0)
- {
- for (ULONG i = 0; i < countReturned; i++)
- MyLookupSids(policy, enums[i].Sid);
- if (enums)
- ::LsaFreeMemory(enums);
- res = true;
- }
- */
- NTSTATUS status = policy.AddAccountRights(psid, &userRights);
- if (status == 0)
- res = true;
- // ULONG res = LsaNtStatusToWinError(status);
- }
- HeapFree(GetProcessHeap(), 0, psid);
- return res;
-}
-
-}}
-
diff --git a/src/libs/7zip/win/CPP/Windows/Security.h b/src/libs/7zip/win/CPP/Windows/Security.h
deleted file mode 100644
index ba66de445..000000000
--- a/src/libs/7zip/win/CPP/Windows/Security.h
+++ /dev/null
@@ -1,167 +0,0 @@
-// Windows/Security.h
-
-#ifndef __WINDOWS_SECURITY_H
-#define __WINDOWS_SECURITY_H
-
-#include <NTSecAPI.h>
-
-#include "Defs.h"
-
-namespace NWindows {
-namespace NSecurity {
-
-class CAccessToken
-{
- HANDLE _handle;
-public:
- CAccessToken(): _handle(NULL) {};
- ~CAccessToken() { Close(); }
- bool Close()
- {
- if (_handle == NULL)
- return true;
- bool res = BOOLToBool(::CloseHandle(_handle));
- if (res)
- _handle = NULL;
- return res;
- }
-
- bool OpenProcessToken(HANDLE processHandle, DWORD desiredAccess)
- {
- Close();
- return BOOLToBool(::OpenProcessToken(processHandle, desiredAccess, &_handle));
- }
-
- /*
- bool OpenThreadToken(HANDLE threadHandle, DWORD desiredAccess, bool openAsSelf)
- {
- Close();
- return BOOLToBool(::OpenTreadToken(threadHandle, desiredAccess, BoolToBOOL(anOpenAsSelf), &_handle));
- }
- */
-
- bool AdjustPrivileges(bool disableAllPrivileges, PTOKEN_PRIVILEGES newState,
- DWORD bufferLength, PTOKEN_PRIVILEGES previousState, PDWORD returnLength)
- { return BOOLToBool(::AdjustTokenPrivileges(_handle, BoolToBOOL(disableAllPrivileges),
- newState, bufferLength, previousState, returnLength)); }
-
- bool AdjustPrivileges(bool disableAllPrivileges, PTOKEN_PRIVILEGES newState)
- { return AdjustPrivileges(disableAllPrivileges, newState, 0, NULL, NULL); }
-
- bool AdjustPrivileges(PTOKEN_PRIVILEGES newState)
- { return AdjustPrivileges(false, newState); }
-
-};
-
-#ifndef _UNICODE
-typedef NTSTATUS (NTAPI *LsaOpenPolicyP)(PLSA_UNICODE_STRING SystemName,
- PLSA_OBJECT_ATTRIBUTES ObjectAttributes, ACCESS_MASK DesiredAccess, PLSA_HANDLE PolicyHandle);
-typedef NTSTATUS (NTAPI *LsaCloseP)(LSA_HANDLE ObjectHandle);
-typedef NTSTATUS (NTAPI *LsaAddAccountRightsP)(LSA_HANDLE PolicyHandle,
- PSID AccountSid, PLSA_UNICODE_STRING UserRights, ULONG CountOfRights );
-#define MY_STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002L)
-#endif
-
-struct CPolicy
-{
-protected:
- LSA_HANDLE _handle;
- #ifndef _UNICODE
- HMODULE hModule;
- #endif
-public:
- operator LSA_HANDLE() const { return _handle; }
- CPolicy(): _handle(NULL)
- {
- #ifndef _UNICODE
- hModule = GetModuleHandle(TEXT("Advapi32.dll"));
- #endif
- };
- ~CPolicy() { Close(); }
-
- NTSTATUS Open(PLSA_UNICODE_STRING systemName, PLSA_OBJECT_ATTRIBUTES objectAttributes,
- ACCESS_MASK desiredAccess)
- {
- #ifndef _UNICODE
- if (hModule == NULL)
- return MY_STATUS_NOT_IMPLEMENTED;
- LsaOpenPolicyP lsaOpenPolicy = (LsaOpenPolicyP)GetProcAddress(hModule, "LsaOpenPolicy");
- if (lsaOpenPolicy == NULL)
- return MY_STATUS_NOT_IMPLEMENTED;
- #endif
-
- Close();
- return
- #ifdef _UNICODE
- ::LsaOpenPolicy
- #else
- lsaOpenPolicy
- #endif
- (systemName, objectAttributes, desiredAccess, &_handle);
- }
-
- NTSTATUS Close()
- {
- if (_handle == NULL)
- return 0;
-
- #ifndef _UNICODE
- if (hModule == NULL)
- return MY_STATUS_NOT_IMPLEMENTED;
- LsaCloseP lsaClose = (LsaCloseP)GetProcAddress(hModule, "LsaClose");
- if (lsaClose == NULL)
- return MY_STATUS_NOT_IMPLEMENTED;
- #endif
-
- NTSTATUS res =
- #ifdef _UNICODE
- ::LsaClose
- #else
- lsaClose
- #endif
- (_handle);
- _handle = NULL;
- return res;
- }
-
- NTSTATUS EnumerateAccountsWithUserRight(PLSA_UNICODE_STRING userRights,
- PLSA_ENUMERATION_INFORMATION *enumerationBuffer, PULONG countReturned)
- { return LsaEnumerateAccountsWithUserRight(_handle, userRights, (void **)enumerationBuffer, countReturned); }
-
- NTSTATUS EnumerateAccountRights(PSID sid, PLSA_UNICODE_STRING* userRights, PULONG countOfRights)
- { return ::LsaEnumerateAccountRights(_handle, sid, userRights, countOfRights); }
-
- NTSTATUS LookupSids(ULONG count, PSID* sids,
- PLSA_REFERENCED_DOMAIN_LIST* referencedDomains, PLSA_TRANSLATED_NAME* names)
- { return LsaLookupSids(_handle, count, sids, referencedDomains, names); }
-
- NTSTATUS AddAccountRights(PSID accountSid, PLSA_UNICODE_STRING userRights, ULONG countOfRights)
- {
- #ifndef _UNICODE
- if (hModule == NULL)
- return MY_STATUS_NOT_IMPLEMENTED;
- LsaAddAccountRightsP lsaAddAccountRights = (LsaAddAccountRightsP)GetProcAddress(hModule, "LsaAddAccountRights");
- if (lsaAddAccountRights == NULL)
- return MY_STATUS_NOT_IMPLEMENTED;
- #endif
-
- return
- #ifdef _UNICODE
- ::LsaAddAccountRights
- #else
- lsaAddAccountRights
- #endif
- (_handle, accountSid, userRights, countOfRights);
- }
- NTSTATUS AddAccountRights(PSID accountSid, PLSA_UNICODE_STRING userRights)
- { return AddAccountRights(accountSid, userRights, 1); }
-
- NTSTATUS RemoveAccountRights(PSID accountSid, bool allRights, PLSA_UNICODE_STRING userRights, ULONG countOfRights)
- { return LsaRemoveAccountRights(_handle, accountSid, (BOOLEAN)(allRights ? TRUE : FALSE), userRights, countOfRights); }
-};
-
-bool AddLockMemoryPrivilege();
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Shell.cpp b/src/libs/7zip/win/CPP/Windows/Shell.cpp
deleted file mode 100644
index 010449fb4..000000000
--- a/src/libs/7zip/win/CPP/Windows/Shell.cpp
+++ /dev/null
@@ -1,335 +0,0 @@
-// Windows/Shell.cpp
-
-#include "StdAfx.h"
-
-#include "Common/MyCom.h"
-#ifndef _UNICODE
-#include "Common/StringConvert.h"
-#endif
-
-#include "Windows/COM.h"
-#include "Windows/Shell.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-namespace NWindows {
-namespace NShell {
-
-#ifndef UNDER_CE
-
-// SHGetMalloc is unsupported in Windows Mobile?
-
-void CItemIDList::Free()
-{
- if (m_Object == NULL)
- return;
- CMyComPtr<IMalloc> shellMalloc;
- if (::SHGetMalloc(&shellMalloc) != NOERROR)
- throw 41099;
- shellMalloc->Free(m_Object);
- m_Object = NULL;
-}
-
-/*
-CItemIDList::(LPCITEMIDLIST itemIDList): m_Object(NULL)
- { *this = itemIDList; }
-CItemIDList::(const CItemIDList& itemIDList): m_Object(NULL)
- { *this = itemIDList; }
-
-CItemIDList& CItemIDList::operator=(LPCITEMIDLIST object)
-{
- Free();
- if (object != 0)
- {
- UINT32 size = GetSize(object);
- m_Object = (LPITEMIDLIST)CoTaskMemAlloc(size);
- if (m_Object != NULL)
- MoveMemory(m_Object, object, size);
- }
- return *this;
-}
-
-CItemIDList& CItemIDList::operator=(const CItemIDList &object)
-{
- Free();
- if (object.m_Object != NULL)
- {
- UINT32 size = GetSize(object.m_Object);
- m_Object = (LPITEMIDLIST)CoTaskMemAlloc(size);
- if (m_Object != NULL)
- MoveMemory(m_Object, object.m_Object, size);
- }
- return *this;
-}
-*/
-
-/////////////////////////////
-// CDrop
-
-void CDrop::Attach(HDROP object)
-{
- Free();
- m_Object = object;
- m_Assigned = true;
-}
-
-void CDrop::Free()
-{
- if (m_MustBeFinished && m_Assigned)
- Finish();
- m_Assigned = false;
-}
-
-UINT CDrop::QueryCountOfFiles()
-{
- return QueryFile(0xFFFFFFFF, (LPTSTR)NULL, 0);
-}
-
-UString CDrop::QueryFileName(UINT fileIndex)
-{
- UString fileName;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- AString fileNameA;
- UINT bufferSize = QueryFile(fileIndex, (LPTSTR)NULL, 0);
- QueryFile(fileIndex, fileNameA.GetBuffer(bufferSize + 2), bufferSize + 1);
- fileNameA.ReleaseBuffer();
- fileName = GetUnicodeString(fileNameA);
- }
- else
- #endif
- {
- UINT bufferSize = QueryFile(fileIndex, (LPWSTR)NULL, 0);
- QueryFile(fileIndex, fileName.GetBuffer(bufferSize + 2), bufferSize + 1);
- fileName.ReleaseBuffer();
- }
- return fileName;
-}
-
-void CDrop::QueryFileNames(UStringVector &fileNames)
-{
- fileNames.Clear();
- UINT numFiles = QueryCountOfFiles();
- fileNames.Reserve(numFiles);
- for (UINT i = 0; i < numFiles; i++)
- fileNames.Add(QueryFileName(i));
-}
-
-
-bool GetPathFromIDList(LPCITEMIDLIST itemIDList, CSysString &path)
-{
- bool result = BOOLToBool(::SHGetPathFromIDList(itemIDList, path.GetBuffer(MAX_PATH * 2)));
- path.ReleaseBuffer();
- return result;
-}
-
-#endif
-
-#ifdef UNDER_CE
-
-bool BrowseForFolder(LPBROWSEINFO, CSysString)
-{
- return false;
-}
-
-bool BrowseForFolder(HWND, LPCTSTR, UINT, LPCTSTR, CSysString &)
-{
- return false;
-}
-
-bool BrowseForFolder(HWND owner, LPCTSTR title,
- LPCTSTR initialFolder, CSysString &resultPath)
-{
- /*
- // SHBrowseForFolder doesn't work before CE 6.0 ?
- if (GetProcAddress(LoadLibrary(L"ceshell.dll", L"SHBrowseForFolder") == 0)
- MessageBoxW(0, L"no", L"", 0);
- else
- MessageBoxW(0, L"yes", L"", 0);
- */
- /*
- UString s = L"all files";
- s += L" (*.*)";
- return MyGetOpenFileName(owner, title, initialFolder, s, resultPath, true);
- */
- return false;
-}
-
-#else
-
-bool BrowseForFolder(LPBROWSEINFO browseInfo, CSysString &resultPath)
-{
- NWindows::NCOM::CComInitializer comInitializer;
- LPITEMIDLIST itemIDList = ::SHBrowseForFolder(browseInfo);
- if (itemIDList == NULL)
- return false;
- CItemIDList itemIDListHolder;
- itemIDListHolder.Attach(itemIDList);
- return GetPathFromIDList(itemIDList, resultPath);
-}
-
-
-int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /* lp */, LPARAM data)
-{
- #ifndef UNDER_CE
- switch(uMsg)
- {
- case BFFM_INITIALIZED:
- {
- SendMessage(hwnd, BFFM_SETSELECTION, TRUE, data);
- break;
- }
- /*
- case BFFM_SELCHANGED:
- {
- TCHAR dir[MAX_PATH];
- if (::SHGetPathFromIDList((LPITEMIDLIST) lp , dir))
- SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)dir);
- else
- SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)TEXT(""));
- break;
- }
- */
- default:
- break;
- }
- #endif
- return 0;
-}
-
-
-bool BrowseForFolder(HWND owner, LPCTSTR title, UINT ulFlags,
- LPCTSTR initialFolder, CSysString &resultPath)
-{
- CSysString displayName;
- BROWSEINFO browseInfo;
- browseInfo.hwndOwner = owner;
- browseInfo.pidlRoot = NULL;
-
- // there are Unicode/astring problems in WinCE SDK!!!
- #ifdef UNDER_CE
- browseInfo.pszDisplayName = (LPSTR)displayName.GetBuffer(MAX_PATH);
- browseInfo.lpszTitle = (LPCSTR)title;
- #else
- browseInfo.pszDisplayName = displayName.GetBuffer(MAX_PATH);
- browseInfo.lpszTitle = title;
- #endif
- browseInfo.ulFlags = ulFlags;
- browseInfo.lpfn = (initialFolder != NULL) ? BrowseCallbackProc : NULL;
- browseInfo.lParam = (LPARAM)initialFolder;
- return BrowseForFolder(&browseInfo, resultPath);
-}
-
-bool BrowseForFolder(HWND owner, LPCTSTR title,
- LPCTSTR initialFolder, CSysString &resultPath)
-{
- return BrowseForFolder(owner, title,
- #ifndef UNDER_CE
- BIF_NEWDIALOGSTYLE |
- #endif
- BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT, initialFolder, resultPath);
- // BIF_STATUSTEXT; BIF_USENEWUI (Version 5.0)
-}
-
-#ifndef _UNICODE
-
-typedef BOOL (WINAPI * SHGetPathFromIDListWP)(LPCITEMIDLIST pidl, LPWSTR pszPath);
-
-bool GetPathFromIDList(LPCITEMIDLIST itemIDList, UString &path)
-{
- path.Empty();
- SHGetPathFromIDListWP shGetPathFromIDListW = (SHGetPathFromIDListWP)
- ::GetProcAddress(::GetModuleHandleW(L"shell32.dll"), "SHGetPathFromIDListW");
- if (shGetPathFromIDListW == 0)
- return false;
- bool result = BOOLToBool(shGetPathFromIDListW(itemIDList, path.GetBuffer(MAX_PATH * 2)));
- path.ReleaseBuffer();
- return result;
-}
-
-typedef LPITEMIDLIST (WINAPI * SHBrowseForFolderWP)(LPBROWSEINFOW lpbi);
-
-bool BrowseForFolder(LPBROWSEINFOW browseInfo, UString &resultPath)
-{
- NWindows::NCOM::CComInitializer comInitializer;
- SHBrowseForFolderWP shBrowseForFolderW = (SHBrowseForFolderWP)
- ::GetProcAddress(::GetModuleHandleW(L"shell32.dll"), "SHBrowseForFolderW");
- if (shBrowseForFolderW == 0)
- return false;
- LPITEMIDLIST itemIDList = shBrowseForFolderW(browseInfo);
- if (itemIDList == NULL)
- return false;
- CItemIDList itemIDListHolder;
- itemIDListHolder.Attach(itemIDList);
- return GetPathFromIDList(itemIDList, resultPath);
-}
-
-
-int CALLBACK BrowseCallbackProc2(HWND hwnd, UINT uMsg, LPARAM /* lp */, LPARAM data)
-{
- switch(uMsg)
- {
- case BFFM_INITIALIZED:
- {
- SendMessageW(hwnd, BFFM_SETSELECTIONW, TRUE, data);
- break;
- }
- /*
- case BFFM_SELCHANGED:
- {
- wchar_t dir[MAX_PATH * 2];
-
- if (shGetPathFromIDListW((LPITEMIDLIST)lp , dir))
- SendMessageW(hwnd, BFFM_SETSTATUSTEXTW, 0, (LPARAM)dir);
- else
- SendMessageW(hwnd, BFFM_SETSTATUSTEXTW, 0, (LPARAM)L"");
- break;
- }
- */
- default:
- break;
- }
- return 0;
-}
-
-
-static bool BrowseForFolder(HWND owner, LPCWSTR title, UINT ulFlags,
- LPCWSTR initialFolder, UString &resultPath)
-{
- UString displayName;
- BROWSEINFOW browseInfo;
- browseInfo.hwndOwner = owner;
- browseInfo.pidlRoot = NULL;
- browseInfo.pszDisplayName = displayName.GetBuffer(MAX_PATH);
- browseInfo.lpszTitle = title;
- browseInfo.ulFlags = ulFlags;
- browseInfo.lpfn = (initialFolder != NULL) ? BrowseCallbackProc2 : NULL;
- browseInfo.lParam = (LPARAM)initialFolder;
- return BrowseForFolder(&browseInfo, resultPath);
-}
-
-bool BrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString &resultPath)
-{
- if (g_IsNT)
- return BrowseForFolder(owner, title,
- BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS
- // | BIF_STATUSTEXT // This flag is not supported when BIF_NEWDIALOGSTYLE is specified.
- , initialFolder, resultPath);
- // BIF_STATUSTEXT; BIF_USENEWUI (Version 5.0)
- CSysString s;
- bool res = BrowseForFolder(owner, GetSystemString(title),
- BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS
- // | BIF_STATUSTEXT // This flag is not supported when BIF_NEWDIALOGSTYLE is specified.
- , GetSystemString(initialFolder), s);
- resultPath = GetUnicodeString(s);
- return res;
-}
-
-#endif
-
-#endif
-
-}}
diff --git a/src/libs/7zip/win/CPP/Windows/Shell.h b/src/libs/7zip/win/CPP/Windows/Shell.h
deleted file mode 100644
index d2b39acfe..000000000
--- a/src/libs/7zip/win/CPP/Windows/Shell.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Windows/Shell.h
-
-#ifndef __WINDOWS_SHELL_H
-#define __WINDOWS_SHELL_H
-
-#include <windows.h>
-#include <shlobj.h>
-
-#include "Common/MyString.h"
-#include "Windows/Defs.h"
-
-namespace NWindows{
-namespace NShell{
-
-/////////////////////////
-// CItemIDList
-#ifndef UNDER_CE
-
-class CItemIDList
-{
- LPITEMIDLIST m_Object;
-public:
- CItemIDList(): m_Object(NULL) {}
- // CItemIDList(LPCITEMIDLIST itemIDList);
- // CItemIDList(const CItemIDList& itemIDList);
- ~CItemIDList() { Free(); }
- void Free();
- void Attach(LPITEMIDLIST object)
- {
- Free();
- m_Object = object;
- }
- LPITEMIDLIST Detach()
- {
- LPITEMIDLIST object = m_Object;
- m_Object = NULL;
- return object;
- }
- operator LPITEMIDLIST() { return m_Object;}
- operator LPCITEMIDLIST() const { return m_Object;}
- LPITEMIDLIST* operator&() { return &m_Object; }
- LPITEMIDLIST operator->() { return m_Object; }
-
- // CItemIDList& operator=(LPCITEMIDLIST object);
- // CItemIDList& operator=(const CItemIDList &object);
-};
-
-/////////////////////////////
-// CDrop
-
-class CDrop
-{
- HDROP m_Object;
- bool m_MustBeFinished;
- bool m_Assigned;
- void Free();
-public:
- CDrop(bool mustBeFinished) : m_MustBeFinished(mustBeFinished), m_Assigned(false) {}
- ~CDrop() { Free(); }
-
- void Attach(HDROP object);
- operator HDROP() { return m_Object;}
- bool QueryPoint(LPPOINT point)
- { return BOOLToBool(::DragQueryPoint(m_Object, point)); }
- void Finish() { ::DragFinish(m_Object); }
- UINT QueryFile(UINT fileIndex, LPTSTR fileName, UINT fileNameSize)
- { return ::DragQueryFile(m_Object, fileIndex, fileName, fileNameSize); }
- #ifndef _UNICODE
- UINT QueryFile(UINT fileIndex, LPWSTR fileName, UINT fileNameSize)
- { return ::DragQueryFileW(m_Object, fileIndex, fileName, fileNameSize); }
- #endif
- UINT QueryCountOfFiles();
- UString QueryFileName(UINT fileIndex);
- void QueryFileNames(UStringVector &fileNames);
-};
-
-#endif
-
-/////////////////////////////
-// Functions
-
-bool GetPathFromIDList(LPCITEMIDLIST itemIDList, CSysString &path);
-bool BrowseForFolder(LPBROWSEINFO lpbi, CSysString &resultPath);
-bool BrowseForFolder(HWND owner, LPCTSTR title, LPCTSTR initialFolder, CSysString &resultPath);
-
-#ifndef _UNICODE
-bool GetPathFromIDList(LPCITEMIDLIST itemIDList, UString &path);
-bool BrowseForFolder(LPBROWSEINFO lpbi, UString &resultPath);
-bool BrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString &resultPath);
-#endif
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Window.cpp b/src/libs/7zip/win/CPP/Windows/Window.cpp
deleted file mode 100644
index 3ad29e6d7..000000000
--- a/src/libs/7zip/win/CPP/Windows/Window.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-// Windows/Window.cpp
-
-#include "StdAfx.h"
-
-#ifndef _UNICODE
-#include "Common/StringConvert.h"
-#endif
-#include "Windows/Window.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-namespace NWindows {
-
-#ifndef _UNICODE
-ATOM MyRegisterClass(CONST WNDCLASSW *wndClass)
-{
- if (g_IsNT)
- return RegisterClassW(wndClass);
- WNDCLASSA wndClassA;
- wndClassA.style = wndClass->style;
- wndClassA.lpfnWndProc = wndClass->lpfnWndProc;
- wndClassA.cbClsExtra = wndClass->cbClsExtra;
- wndClassA.cbWndExtra = wndClass->cbWndExtra;
- wndClassA.hInstance = wndClass->hInstance;
- wndClassA.hIcon = wndClass->hIcon;
- wndClassA.hCursor = wndClass->hCursor;
- wndClassA.hbrBackground = wndClass->hbrBackground;
- AString menuName;
- AString className;
- if (IS_INTRESOURCE(wndClass->lpszMenuName))
- wndClassA.lpszMenuName = (LPCSTR)wndClass->lpszMenuName;
- else
- {
- menuName = GetSystemString(wndClass->lpszMenuName);
- wndClassA.lpszMenuName = menuName;
- }
- if (IS_INTRESOURCE(wndClass->lpszClassName))
- wndClassA.lpszClassName = (LPCSTR)wndClass->lpszClassName;
- else
- {
- className = GetSystemString(wndClass->lpszClassName);
- wndClassA.lpszClassName = className;
- }
- return RegisterClassA(&wndClassA);
-}
-
-bool CWindow::Create(LPCWSTR className,
- LPCWSTR windowName, DWORD style,
- int x, int y, int width, int height,
- HWND parentWindow, HMENU idOrHMenu,
- HINSTANCE instance, LPVOID createParam)
-{
- if (g_IsNT)
- {
- _window = ::CreateWindowW(className, windowName,
- style, x, y, width, height, parentWindow,
- idOrHMenu, instance, createParam);
- return (_window != NULL);
- }
- return Create(GetSystemString(className), GetSystemString(windowName),
- style, x, y, width, height, parentWindow,
- idOrHMenu, instance, createParam);
-}
-
-bool CWindow::CreateEx(DWORD exStyle, LPCWSTR className,
- LPCWSTR windowName, DWORD style,
- int x, int y, int width, int height,
- HWND parentWindow, HMENU idOrHMenu,
- HINSTANCE instance, LPVOID createParam)
-{
- if (g_IsNT)
- {
- _window = ::CreateWindowExW(exStyle, className, windowName,
- style, x, y, width, height, parentWindow,
- idOrHMenu, instance, createParam);
- return (_window != NULL);
- }
- AString classNameA;
- LPCSTR classNameP;
- if (IS_INTRESOURCE(className))
- classNameP = (LPCSTR)className;
- else
- {
- classNameA = GetSystemString(className);
- classNameP = classNameA;
- }
- AString windowNameA;
- LPCSTR windowNameP;
- if (IS_INTRESOURCE(windowName))
- windowNameP = (LPCSTR)windowName;
- else
- {
- windowNameA = GetSystemString(windowName);
- windowNameP = windowNameA;
- }
- return CreateEx(exStyle, classNameP, windowNameP,
- style, x, y, width, height, parentWindow,
- idOrHMenu, instance, createParam);
-}
-
-#endif
-
-#ifndef _UNICODE
-bool MySetWindowText(HWND wnd, LPCWSTR s)
-{
- if (g_IsNT)
- return BOOLToBool(::SetWindowTextW(wnd, s));
- return BOOLToBool(::SetWindowTextA(wnd, UnicodeStringToMultiByte(s)));
-}
-#endif
-
-bool CWindow::GetText(CSysString &s)
-{
- s.Empty();
- int length = GetTextLength();
- if (length == 0)
- return (::GetLastError() == ERROR_SUCCESS);
- length = GetText(s.GetBuffer(length), length + 1);
- s.ReleaseBuffer();
- if (length == 0)
- return (::GetLastError() != ERROR_SUCCESS);
- return true;
-}
-
-#ifndef _UNICODE
-bool CWindow::GetText(UString &s)
-{
- if (g_IsNT)
- {
- s.Empty();
- int length = GetWindowTextLengthW(_window);
- if (length == 0)
- return (::GetLastError() == ERROR_SUCCESS);
- length = GetWindowTextW(_window, s.GetBuffer(length), length + 1);
- s.ReleaseBuffer();
- if (length == 0)
- return (::GetLastError() == ERROR_SUCCESS);
- return true;
- }
- CSysString sysString;
- bool result = GetText(sysString);
- s = GetUnicodeString(sysString);
- return result;
-}
-#endif
-
-
-/*
-bool CWindow::ModifyStyleBase(int styleOffset,
- DWORD remove, DWORD add, UINT flags)
-{
- DWORD style = GetWindowLong(styleOffset);
- DWORD newStyle = (style & ~remove) | add;
- if (style == newStyle)
- return false; // it is not good
-
- SetWindowLong(styleOffset, newStyle);
- if (flags != 0)
- {
- ::SetWindowPos(_window, NULL, 0, 0, 0, 0,
- SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | flags);
- }
- return TRUE;
-}
-*/
-
-}
diff --git a/src/libs/7zip/win/CPP/Windows/Window.h b/src/libs/7zip/win/CPP/Windows/Window.h
deleted file mode 100644
index 729b0f24b..000000000
--- a/src/libs/7zip/win/CPP/Windows/Window.h
+++ /dev/null
@@ -1,261 +0,0 @@
-// Windows/Window.h
-
-#ifndef __WINDOWS_WINDOW_H
-#define __WINDOWS_WINDOW_H
-
-#include "Defs.h"
-#include "Common/MyString.h"
-
-namespace NWindows {
-
-inline ATOM MyRegisterClass(CONST WNDCLASS *wndClass)
- { return ::RegisterClass(wndClass); }
-
-#ifndef _UNICODE
-ATOM MyRegisterClass(CONST WNDCLASSW *wndClass);
-#endif
-
-#ifdef _UNICODE
-inline bool MySetWindowText(HWND wnd, LPCWSTR s) { return BOOLToBool(::SetWindowText(wnd, s)); }
-#else
-bool MySetWindowText(HWND wnd, LPCWSTR s);
-#endif
-
-
-#ifdef UNDER_CE
-#define GWLP_USERDATA GWL_USERDATA
-#define GWLP_WNDPROC GWL_WNDPROC
-#define BTNS_BUTTON TBSTYLE_BUTTON
-#define WC_COMBOBOXW L"ComboBox"
-#define DWLP_MSGRESULT DWL_MSGRESULT
-#endif
-
-class CWindow
-{
-private:
- // bool ModifyStyleBase(int styleOffset, DWORD remove, DWORD add, UINT flags);
-protected:
- HWND _window;
-public:
- CWindow(HWND newWindow = NULL): _window(newWindow){};
- CWindow& operator=(HWND newWindow)
- {
- _window = newWindow;
- return *this;
- }
- operator HWND() const { return _window; }
- void Attach(HWND newWindow) { _window = newWindow; }
- HWND Detach()
- {
- HWND window = _window;
- _window = NULL;
- return window;
- }
-
- bool Foreground() { return BOOLToBool(::SetForegroundWindow(_window)); }
-
- HWND GetParent() const { return ::GetParent(_window); }
- bool GetWindowRect(LPRECT rect) const { return BOOLToBool(::GetWindowRect(_window,rect)); }
- #ifndef UNDER_CE
- bool IsZoomed() const { return BOOLToBool(::IsZoomed(_window)); }
- #endif
- bool ClientToScreen(LPPOINT point) const { return BOOLToBool(::ClientToScreen(_window, point)); }
- bool ScreenToClient(LPPOINT point) const { return BOOLToBool(::ScreenToClient(_window, point)); }
-
- bool CreateEx(DWORD exStyle, LPCTSTR className,
- LPCTSTR windowName, DWORD style,
- int x, int y, int width, int height,
- HWND parentWindow, HMENU idOrHMenu,
- HINSTANCE instance, LPVOID createParam)
- {
- _window = ::CreateWindowEx(exStyle, className, windowName,
- style, x, y, width, height, parentWindow,
- idOrHMenu, instance, createParam);
- return (_window != NULL);
- }
-
- bool Create(LPCTSTR className,
- LPCTSTR windowName, DWORD style,
- int x, int y, int width, int height,
- HWND parentWindow, HMENU idOrHMenu,
- HINSTANCE instance, LPVOID createParam)
- {
- _window = ::CreateWindow(className, windowName,
- style, x, y, width, height, parentWindow,
- idOrHMenu, instance, createParam);
- return (_window != NULL);
- }
-
- #ifndef _UNICODE
- bool Create(LPCWSTR className,
- LPCWSTR windowName, DWORD style,
- int x, int y, int width, int height,
- HWND parentWindow, HMENU idOrHMenu,
- HINSTANCE instance, LPVOID createParam);
- bool CreateEx(DWORD exStyle, LPCWSTR className,
- LPCWSTR windowName, DWORD style,
- int x, int y, int width, int height,
- HWND parentWindow, HMENU idOrHMenu,
- HINSTANCE instance, LPVOID createParam);
- #endif
-
-
- bool Destroy()
- {
- if (_window == NULL)
- return true;
- bool result = BOOLToBool(::DestroyWindow(_window));
- if (result)
- _window = NULL;
- return result;
- }
- bool IsWindow() { return BOOLToBool(::IsWindow(_window)); }
- bool Move(int x, int y, int width, int height, bool repaint = true)
- { return BOOLToBool(::MoveWindow(_window, x, y, width, height, BoolToBOOL(repaint))); }
-
- bool ChangeSubWindowSizeX(HWND hwnd, int xSize)
- {
- RECT rect;
- ::GetWindowRect(hwnd, &rect);
- POINT p1;
- p1.x = rect.left;
- p1.y = rect.top;
- ScreenToClient(&p1);
- return BOOLToBool(::MoveWindow(hwnd, p1.x, p1.y, xSize, rect.bottom - rect.top, TRUE));
- }
-
- void ScreenToClient(RECT *rect)
- {
- POINT p1, p2;
- p1.x = rect->left;
- p1.y = rect->top;
- p2.x = rect->right;
- p2.y = rect->bottom;
- ScreenToClient(&p1);
- ScreenToClient(&p2);
-
- rect->left = p1.x;
- rect->top = p1.y;
- rect->right = p2.x;
- rect->bottom = p2.y;
- }
-
- bool GetClientRect(LPRECT rect) { return BOOLToBool(::GetClientRect(_window, rect)); }
- bool Show(int cmdShow) { return BOOLToBool(::ShowWindow(_window, cmdShow)); }
- #ifndef UNDER_CE
- bool SetPlacement(CONST WINDOWPLACEMENT *placement) { return BOOLToBool(::SetWindowPlacement(_window, placement)); }
- bool GetPlacement(WINDOWPLACEMENT *placement) { return BOOLToBool(::GetWindowPlacement(_window, placement)); }
- #endif
- bool Update() { return BOOLToBool(::UpdateWindow(_window)); }
- bool InvalidateRect(LPCRECT rect, bool backgroundErase = true)
- { return BOOLToBool(::InvalidateRect(_window, rect, BoolToBOOL(backgroundErase))); }
- void SetRedraw(bool redraw = true) { SendMessage(WM_SETREDRAW, BoolToBOOL(redraw), 0); }
-
- LONG_PTR SetStyle(LONG_PTR style) { return SetLongPtr(GWL_STYLE, style); }
- LONG_PTR GetStyle() const { return GetLongPtr(GWL_STYLE); }
- // bool MyIsMaximized() const { return ((GetStyle() & WS_MAXIMIZE) != 0); }
-
- LONG_PTR SetLong(int index, LONG newLongPtr) { return ::SetWindowLong(_window, index, newLongPtr); }
- LONG_PTR GetLong(int index) const { return ::GetWindowLong(_window, index); }
- LONG_PTR SetUserDataLong(LONG newLongPtr) { return SetLong(GWLP_USERDATA, newLongPtr); }
- LONG_PTR GetUserDataLong() const { return GetLong(GWLP_USERDATA); }
-
-
- #ifdef UNDER_CE
-
- LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr) { return SetLong(index, newLongPtr); }
- LONG_PTR GetLongPtr(int index) const { return GetLong(index); }
-
- LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetUserDataLong(newLongPtr); }
- LONG_PTR GetUserDataLongPtr() const { return GetUserDataLong(); }
-
- #else
-
- LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr)
- { return ::SetWindowLongPtr(_window, index,
- #ifndef _WIN64
- (LONG)
- #endif
- newLongPtr); }
- #ifndef _UNICODE
- LONG_PTR SetLongPtrW(int index, LONG_PTR newLongPtr)
- { return ::SetWindowLongPtrW(_window, index,
- #ifndef _WIN64
- (LONG)
- #endif
- newLongPtr); }
- #endif
-
- LONG_PTR GetLongPtr(int index) const { return ::GetWindowLongPtr(_window, index); }
- LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetLongPtr(GWLP_USERDATA, newLongPtr); }
- LONG_PTR GetUserDataLongPtr() const { return GetLongPtr(GWLP_USERDATA); }
-
- #endif
-
- /*
- bool ModifyStyle(HWND hWnd, DWORD remove, DWORD add, UINT flags = 0)
- { return ModifyStyleBase(GWL_STYLE, remove, add, flags); }
- bool ModifyStyleEx(HWND hWnd, DWORD remove, DWORD add, UINT flags = 0)
- { return ModifyStyleBase(GWL_EXSTYLE, remove, add, flags); }
- */
-
- HWND SetFocus() { return ::SetFocus(_window); }
-
- LRESULT SendMessage(UINT message, WPARAM wParam = 0, LPARAM lParam = 0)
- { return ::SendMessage(_window, message, wParam, lParam) ;}
- #ifndef _UNICODE
- LRESULT SendMessageW(UINT message, WPARAM wParam = 0, LPARAM lParam = 0)
- { return ::SendMessageW(_window, message, wParam, lParam) ;}
- #endif
-
- bool PostMessage(UINT message, WPARAM wParam = 0, LPARAM lParam = 0)
- { return BOOLToBool(::PostMessage(_window, message, wParam, lParam)) ;}
- #ifndef _UNICODE
- LRESULT PostMessageW(UINT message, WPARAM wParam = 0, LPARAM lParam = 0)
- { return ::PostMessageW(_window, message, wParam, lParam) ;}
- #endif
-
- bool SetText(LPCTSTR s) { return BOOLToBool(::SetWindowText(_window, s)); }
- #ifndef _UNICODE
- bool CWindow::SetText(LPCWSTR s) { return MySetWindowText(_window, s); }
- #endif
-
- int GetTextLength() const
- { return GetWindowTextLength(_window); }
- UINT GetText(LPTSTR string, int maxCount) const
- { return GetWindowText(_window, string, maxCount); }
- bool GetText(CSysString &s);
- #ifndef _UNICODE
- /*
- UINT GetText(LPWSTR string, int maxCount) const
- { return GetWindowTextW(_window, string, maxCount); }
- */
- bool GetText(UString &s);
- #endif
-
- bool Enable(bool enable)
- { return BOOLToBool(::EnableWindow(_window, BoolToBOOL(enable))); }
-
- bool IsEnabled()
- { return BOOLToBool(::IsWindowEnabled(_window)); }
-
- #ifndef UNDER_CE
- HMENU GetSystemMenu(bool revert)
- { return ::GetSystemMenu(_window, BoolToBOOL(revert)); }
- #endif
-
- UINT_PTR SetTimer(UINT_PTR idEvent, UINT elapse, TIMERPROC timerFunc = 0)
- { return ::SetTimer(_window, idEvent, elapse, timerFunc); }
- bool KillTimer(UINT_PTR idEvent)
- {return BOOLToBool(::KillTimer(_window, idEvent)); }
-
- HICON SetIcon(WPARAM sizeType, HICON icon) { return (HICON)SendMessage(WM_SETICON, sizeType, (LPARAM)icon); }
-};
-
-#define RECT_SIZE_X(r) ((r).right - (r).left)
-#define RECT_SIZE_Y(r) ((r).bottom - (r).top)
-
-}
-
-#endif
-
diff --git a/src/libs/7zip/win/DOC/License.txt b/src/libs/7zip/win/DOC/License.txt
deleted file mode 100644
index a6a721853..000000000
--- a/src/libs/7zip/win/DOC/License.txt
+++ /dev/null
@@ -1,52 +0,0 @@
- 7-Zip source code
- ~~~~~~~~~~~~~~~~~
- License for use and distribution
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- 7-Zip Copyright (C) 1999-2010 Igor Pavlov.
-
- Licenses for files are:
-
- 1) CPP/7zip/Compress/Rar* files: GNU LGPL + unRAR restriction
- 2) All other files: GNU LGPL
-
- The GNU LGPL + unRAR restriction means that you must follow both
- GNU LGPL rules and unRAR restriction rules.
-
-
- 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.
-
-
- --
- Igor Pavlov
diff --git a/src/libs/7zip/win/DOC/copying.txt b/src/libs/7zip/win/DOC/copying.txt
deleted file mode 100644
index 4c3890127..000000000
--- a/src/libs/7zip/win/DOC/copying.txt
+++ /dev/null
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/src/libs/7zip/win/DOC/history.txt b/src/libs/7zip/win/DOC/history.txt
deleted file mode 100644
index 05a9a2165..000000000
--- a/src/libs/7zip/win/DOC/history.txt
+++ /dev/null
@@ -1,456 +0,0 @@
-Sources history of the 7-Zip
-----------------------------
-
-9.18 2010-11-02
--------------------------
-- New small SFX module for installers (C/Util/SfxSetup).
-
-
-9.17 2010-10-04
--------------------------
-- IStream.h::IOutStream::
- STDMETHOD(SetSize)(Int64 newSize) PURE;
- was changed to
- STDMETHOD(SetSize)(UInt64 newSize) PURE;
-
-
-9.09 2009-12-12
--------------------------
-- The bug was fixed:
- Utf16_To_Utf8 funstions in UTFConvert.cpp and 7zMain.c
- incorrectly converted surrogate characters (the code >= 0x10000) to UTF-8.
-
-
-9.05 2009-07-05
--------------------------
-- FileMapping.h::CFileMapping now returns WRes
-
-
-9.04 2009-05-30
--------------------------
-- ICoder.h: NCoderPropID::EEnum values were changed
-
-
-9.02 2009-04-23
--------------------------
-- Bug was fixed: if swap2 filter was requests at compression,
- 7-zip used swap4 filter instead (but id was swap2), so archives were incorrect.
-
-4.61 2008-11-23
--------------------------
-- Bug in ver. 4.58+ was fixed:
- 7-Zip didn't use any -m* switch after -mtc, -mcl or -mcu for .zip archives.
-- Bug in .CAB code was fixed. 7-Zip didn't show some empty files,
- if .CAB archive contains more than one empty file.
-
-
-4.59 2008-07-27
--------------------------
-- Bug was fixed:
- LZMA Encoder in fast compression mode could access memory outside of
- allocated range in some rare cases.
-
-
-4.59 alpha 2008-05-30
--------------------------
-- BUGS was fixed:
- 7zOut.cpp: 7-Zip incorrectly wrote size of property records in some cases.
- 7zIn.cpp: 7-Zip incorrectly work with archive, containg archive properties.
-
-4.58 alpha 9 2008-04-29
--------------------------
-- BUG was fixed: 7-Zip showed incorrect timestamps in ISO files.
-
-
-4.58 alpha 8 2008-04-15
--------------------------
-- BUG in 4.58 alpha 5/6/7 was fixed:
- LZMA encoder worked incorrectly, if lp != 0.
-- Unicode (UTF-8) support for filenames in .ZIP archives. Now there are 3 modes:
- 1) Default mode: 7-Zip uses UTF-8, if the local code page doesn't contain required symbols.
- 2) -mcu switch: 7-Zip uses UTF-8, if there are non-ASCII symbols.
- 3) -mcl switch: 7-Zip uses local code page.
-- Now it's possible to use -mSW- and -mSW+ switches instead of -mSW=off and -mSW=on
-
-
-4.58 alpha 7 2008-04-08
--------------------------
-- BUG was fixed: BZip2Encoder and BZip2Decoder used CEvent objects without
- creating, when BZip2 code was called with one thread (with -mmt1 switch or with
- default switches on single thread CPU).
-- .lzma support.
-- RPM and NSIS support was improved.
-- LZMA now stores only (2 << n) or (3 << n) dictionary size value to LZMA properties.
-
-
-4.58 alpha 6 2008-03-27
--------------------------
-- NTFS time extra in ZIP.
-- New item property - kpidTimeType - VT_UI4 (0 - NTFS, 1 - Unix, 2 - DOS).
-- Static CRC table is not required now for Lzma Encoder (in Lz MatchFinder).
-
-
-4.58 alpha 5 2008-03-19
--------------------------
-- Creation time (-mtc switch) for .7z archives
-- LZMA encoder was converted to ANSI-C
-
-
-4.58 alpha 3 2008-02-25
--------------------------
-- Speed optimizations for LZMA decoding. Now it uses C code instead of C++.
-- 7-Zip now has 128 MB dictionary limit for 32-bit version:
- It's for speed optimization: kNumLogBits = 9 + sizeof(size_t) / 2;
-- TAR: 'D' link flag support.
-- 7-Zip now can unpack multivolume RAR archives created with
- "old style volume names" scheme (-vn switch) and names *.001, *.002, ...
-- Fixed bugs:
- - 7-Zip FM could not copy / move files to root network folders like \\COMPNAME\FOLDERNAME\
- In case of move it removed original files.
- - SFX-WIN: if there are errors, it still could return 0.
- - ZIP (.XPS file) isZip64 && thisDiskNumber16 == 0xFFFF.
- - ZIP name updating:
- If zip file contains extra field and you try to change properties of files,
- 7-zip tries to delete all extra fileds (except for WzAES).
- And that code could hang.
- - 7-Zip GUI didn't suggest BZip2 dictionary size used in previous run.
- - If creation time stamp was included in .RAR archive, 7-zip used creation time stamp
- as modification time stamp.
-
-4.58 alpha 2 2007-12-31
--------------------------
-- Small changes in Deflate and LZMA compression.
-- Some speed optimizations.
-
-
-4.57
-----
-- Bug was fixed:
- Anti item is created for wrong file:
- http://sourceforge.net/forum/forum.php?thread_id=1880366&forum_id=45798
-
-
-4.52 beta 2007-07-32
--------------------------
-- 7-Zip could not decompress some cab files
-- "." dir creating at FAT was fixed / long names
-
-
-4.50 beta 2007-07-24
--------------------------
-- 7-Zip now replaces unsupported filenames (like "nul", "com1") during extracting.
-- New switch for command line version:
- -ssc[-] enables/disables case-sensitive mode.
-- 7z.exe l shows archive comment for zip archives
-- Some bugs were fixed: long paths names shorter than 4.
-- Speed optimizations for AES encryption.
-
-
-
-4.56 beta 2007-09-13
--------------------------
-- some fixes in LZ encoder (LZMA and Deflate) code.
- size_t was replaces to ptrdiff_t.
- size_t version worked incorrectly with some compilers.
-
-
-4.46 beta 2007-05-25
--------------------------
-- CPP Synchronization objects now return HRes (error code) instead of bool.
-
-
-4.45 beta 2007-04-16
--------------------------
-- 7-Zip now uses C version of CRC, so you must call CrcGenerateTable at
- stratup code, or you must add CPP/Common/CRC.cpp to your project.
-- Method ID in .7z now is 63-bit integer (UInt64).
-- Open error messages
-- unRar 1.5 fixed
-- unShrink fixed
-- BUG of 4.43 beta and 4.44 beta was fixed.
- 7-Zip compressing to .zip in multi-threading mode didn't work in some cases.
-
-
-4.44 beta 2007-01-20
--------------------------
-
-- Bug was fixed: LZMAEncoder.cpp::CEncoder::GetOptimumFast
- it was:
- data++
- fixed version:
- data = _matchFinder.GetPointerToCurrentPos(_matchFinderObj) - 1;
- It could lead to very small cpmpression ratio decreasing when block needs move.
-
-
-4.30 beta 2005-11-18
--------------------------
-- Security.h::AddLockMemoryPrivilege - installs "Large pages" feature
-- MemoryLock.h::EnableLockMemoryPrivilege - enables "Large pages" feature
-- Alloc.h::SetLargePageSize - sets optimal LargePageSize size
-
-
-4.27 2005-09-21
--------------------------
-- Some GUIDs/interfaces were changed.
- IStream.h:
- ISequentialInStream::Read now works as old ReadPart
- ISequentialOutStream::Write now works as old WritePart
-
-
-4.26 beta 2005-08-05
--------------------------
-- MyAlloc(0)/BigAlloc(0) now return 0
-
-
-4.25 beta 2005-07-31
--------------------------
-- More 64-bit compatibilty
-
-
-4.24 beta 2005-07-06
--------------------------
-- Common\NewHandler.h: using throw() for code size optimization.
-
-
-4.23 2005-06-29
--------------------------
-- Bug was fixed: memory leak in Cab decoder.
-
-
-4.19 beta 2005-05-21
--------------------------
-- BZip2 code was rewritten. Now 7-Zip doesn't use original BZip2 code.
- Old (original) version was moved to folder 7zip/Compress/BZip2Original/
-
-
-4.14 beta 2005-01-11
--------------------------
-- STL using was reduced
-- 7za now supports Split(001) archves
-
-
-4.10 beta 2004-10-21
--------------------------
-- Codecs now use new interface: ICompressSetDecoderProperties2
-
-
-4.07 beta 2004-10-03
--------------------------
-- some interfaces were changed slightly to support
- -stdin -stdout mode.
-- FilterCoder for simple filters
-- Wildcard censor class was changed.
-- Bug was fixed: when encrypted stream was multiple 16,
- it used additional 16 empty bytes.
-
-
-3.11 2003-10-06
--------------------------
- File functions support unicode strings even
- on Windows 95/98/ME.
-
-
-3.08.02 2003-09-20
--------------------------
- More compatible with GCC.
-
-
-3.08.02 beta 2003-08-20
--------------------------
- Extracting bug in 7zExtract.cpp was fixed.
-
-
-3.08 beta 2003-08-19
--------------------------
- Big source code reconstruction.
-
-
-2.30 Beta 32 2003-05-15
--------------------------
- Small changes in Deflate decoder.
-
-
-2.30 Beta 31 2003-04-29
--------------------------
- Common/NewHandler.cpp
- HeapAlloc in (included to beta 30) was changed to malloc.
- HeapAlloc worked slower in Win95/98/Me.
-
-
-2.30 Beta 30 2003-04-21
--------------------------
- new file: Common/String.cpp
- Common/NewHandler.* were changed
-
-
-2.30 Beta 29 2003-04-07
--------------------------
- Small changes in LZMA code.
-
-
-2.30 Beta 28 2003-02-16
--------------------------
- Processing anti-files was corrected.
-
-
-2.30 Beta 27 2003-01-24
--------------------------
- Project/Archiver/Format/Common/ArchiveInterface.h:
- new IArchiveOpenVolumeCallback interface.
-
-
-2.30 Beta 26 2003-01-12
--------------------------
- SDK/Interface/PropID.h:
- kpidComment now is kpidCommented
-
-
-2.30 Beta 25 2003-01-02
--------------------------
- Main archive interfaces were changed.
-
-
-2.30 Beta 24 2002-11-01
--------------------------
- SDK/Windows/Synchronization.h
- SDK/Windows/Synchronization.cpp
- - some changes.
-
-
-2.30 Beta 23 2002-09-07
--------------------------
- Project/FileManager folder was added.
- Notation of some source files was changed.
-
-
-2.30 Beta 22 2002-08-28
--------------------------
- Project/FileManager folder was added.
- Notation of some source files was changed.
-
-
-
-2.30 Beta 21 2002-07-08
--------------------------
- Project/Compress/LZ/MatchFinder/BinTree/BinTree.h
- Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h
- Project/Compress/LZ/MatchFinder/BinTree/HC.h
- Project/Compress/LZ/MatchFinder/BinTree/HCMain.h
- - RAM requirements for LZMA (7z) compression were reduced.
-
-
-2.30 Beta 20 2002-07-01
--------------------------
-- SDK/Stream/WindowOut.h
- now it uses only required memory (dictionary size).
-- Project/Archiver/Resource
- contains common resurces
-
-
-2.30 Beta 19 2002-04-11
--------------------------
-- SDK/Archive/Rar/Handler.cpp
- supporting RAR29
-
-2.30 Beta 18 2002-03-25
--------------------------
-- SDK/Archive/Cab/MSZipDecoder.cpp
- SDK/Archive/Cab/LZXDecoder.cpp:
- bug with corrupted archives was fixed
-- Project/Compress/LZ/MatchFinder/BinTree/BinTree.h
-- Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h
- some speed optimization (using prefetching)
-
-
-2.30 Beta 17 2002-03-03
--------------------------
-- ARJ suppport.
-
-
-2.30 Beta 16 2002-02-24
--------------------------
-- Project/Compress/LZ/LZMA/Decoder.cpp:
- Bug was fixed: LZMA could not extract more than 4 GB.
-- RPM and CPIO formats.
-- Project/Compress/LZ/LZMA/Encoder.*
- Project/Archiver/Format/7z/OutHandler.cpp
- New fast compression mode for LZMA: -m0a=0.
-- New match finders for LZMA: bt4b, hc3, hc4.
-
-
-2.30 Beta 15 2002-02-17
--------------------------
-- Compression ratio in LZMA was slightly improved:
- Project/Compress/LZ/LZMA/Encoder.*
- Project/Archiver/Format/7z/OutHandler.cpp
-
-
-2.30 Beta 14 2002-02-10
--------------------------
-- Supporting multithreading for LZMA:
- Project/Compress/LZ/MatchFinder/MT
-- Common/String.h:
- CStringBase::Replace function was fixed.
-
-
-2.30 Beta 13 2002-01-27
--------------------------
-- Compress/LZ/MatchFinder/BinTree3.h:
- method
-- Compress/LZ/MatchFinder/BinTreemain.h:
- - one VirtualAlloc array was splitted to
- the for 3 arrays.
- - Hash-functions were changed.
-
-
-
-2.30 Beta 12 2002-01-16
--------------------------
-- Compress/LZ/MatchFinder/BinTreemain.h:
- Compress/LZ/MatchFinder/Patricia.h:
- Compress/PPM/PPMd/SubAlloc.h:
- Beta 11 bugs were fixed:
- - VirtualFree was used incorrectly
- - checking WIN32 instead _WINDOWS.
- Compress/LZ/MatchFinder/Patricia.h:
- Beta 11 bug with deleting m_Hash2Descendants was fixed.
-
-
-2.30 Beta 11 2002-01-15
--------------------------
-- Compress/LZ/MatchFinder/BinTreemain.h:
- Compress/LZ/MatchFinder/Patricia.h:
- Compress/PPM/PPMd/SubAlloc.h:
- using VirtualAlloc for memory allocating
-- Exlorer/ContextMenu.cpp:
- Testing supporting.
- CreateProcess instead WinExec
-- Format/Common/IArchiveHandler.h:
- Exlorer/ProxyHandler.cpp:
- FAR/Plugin.cpp:
- New properties names: Method, HostOS.
-- Exlorer/OverwriteDialog.cpp:
- FAR/OverwriteDialog.cpp:
- Windows/PropVariantConversions.h
- Using National time format was eliminated.
-
-
-
-2.30 Beta 10 2002-01-11
--------------------------
-- Exlorer/ContextMenu.cpp: bug with context menu on
- Windows NT4 in Unicode version was fixed.
-- Format/7z/UpdateArchiveEngine.cpp: bug was fixed -
- Updating in Beta 8 and 9 didn't work.
-- Exlorer/CCompressDialog.cpp: history growing bug was fixed.
-
-
-2.30 Beta 9 2002-01-08
--------------------------
-- SDK/Common/Vector.h: sopporting sorted object vectors .
-- Lang features.
-- Two new match finders: pat3h and pat4h.
-- SDK/Archive/Zip/InEngine.cpp: bug was fixed.
-- SDK/Windows/FileDir.cpp: function CreateComplexDirectory
- was changed.
-
diff --git a/src/libs/7zip/win/DOC/readme.txt b/src/libs/7zip/win/DOC/readme.txt
deleted file mode 100644
index aad462642..000000000
--- a/src/libs/7zip/win/DOC/readme.txt
+++ /dev/null
@@ -1,181 +0,0 @@
-7-Zip 9.20 Sources
-------------------
-
-7-Zip is a file archiver for Windows.
-
-7-Zip Copyright (C) 1999-2010 Igor Pavlov.
-
-
-License Info
-------------
-
-7-Zip is free software distributed under the GNU LGPL
-(except for unRar code).
-read License.txt for more infomation about license.
-
-Notes about unRAR license:
-
-Please check main restriction from unRar license:
-
- 2. The unRAR sources may be used in any software to handle RAR
- archives without limitations free of charge, but 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.
-
-In brief it means:
-1) You can compile and use compiled files under GNU LGPL rules, since
- unRAR license almost has no restrictions for compiled files.
- You can link these compiled files to LGPL programs.
-2) You can fix bugs in source code and use compiled fixed version.
-3) You can not use unRAR sources to re-create the RAR compression algorithm.
-
-
-LZMA SDK
---------
-
-Also this package contains files from LZMA SDK
-you can download LZMA SDK from this page:
-http://www.7-zip.org/sdk.html
-read about addtional licenses for LZMA SDK in file
-DOC/lzma.txt
-
-
-How to compile
---------------
-To compile sources you need Visual C++ 6.0.
-For compiling some files you also need
-new Platform SDK from Microsoft' Site:
-http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
-or
-http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm
-or
-http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
-
-If you use MSVC6, specify SDK directories at top of directories lists:
-Tools / Options / Directories
- - Include files
- - Library files
-
-
-To compile 7-Zip for AMD64 and IA64 you need:
- Windows Server 2003 SP1 Platform SDK from microsoft.com
-
-Also you need Microsoft Macro Assembler:
- - ml.exe for x86
- - ml64.exe for AMD64
-You can use ml.exe from Windows SDK for Windows Vista or some other version.
-
-
-Compiling under Unix/Linux
---------------------------
-Check this site for Posix/Linux version:
-http://sourceforge.net/projects/p7zip/
-
-
-Notes:
-------
-7-Zip consists of COM modules (DLL files).
-But 7-Zip doesn't use standard COM interfaces for creating objects.
-Look at
-7zip\UI\Client7z folder for example of using DLL files of 7-Zip.
-Some DLL files can use other DLL files from 7-Zip.
-If you don't like it, you must use standalone version of DLL.
-To compile standalone version of DLL you must include all used parts
-to project and define some defs.
-For example, 7zip\Bundles\Format7z is a standalone version of 7z.dll
-that works with 7z format. So you can use such DLL in your project
-without additional DLL files.
-
-
-Description of 7-Zip sources package
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-DOC Documentation
----
- 7zFormat.txt - 7z format description
- copying.txt - GNU LGPL license
- unRarLicense.txt - License for unRAR part of source code
- history.txt - Sources history
- Methods.txt - Compression method IDs
- readme.txt - Readme file
- lzma.txt - LZMA SDK description
- 7zip.nsi - installer script for NSIS
-
-
-C - Source code in C
-CPP - Source code in CPP
-
-Common Common modules
-Windows Win32 wrappers
-
-7zip
--------
- Common Common modules for 7-zip
-
- Archive 7-Zip Archive Format Plugins
- --------
- Common
- 7z
- Arj
- BZip2
- Cab
- Cpio
- GZip
- Rar
- Rpm
- Split
- Tar
- Zip
-
- Bundle Modules that are bundles of other modules
- ------
- Alone 7za.exe: Standalone version of 7z
- Alone7z 7zr.exe: Standalone version of 7z that supports only 7z/LZMA/BCJ/BCJ2
- SFXCon 7zCon.sfx: Console 7z SFX module
- SFXWin 7z.sfx: Windows 7z SFX module
- SFXSetup 7zS.sfx: Windows 7z SFX module for Installers
- Format7z 7za.dll: .7z support
- Format7zExtract 7zxa.dll: .7z support, extracting only
- Format7zR 7zr.dll: .7z support, LZMA/BCJ* only
- Format7zExtractR 7zxr.dll: .7z support, LZMA/BCJ* only, extracting only
- Format7zF 7z.dll: all formats
-
- UI
- --
- Agent Intermediary modules for FAR plugin and Explorer plugin
- Console 7z.exe Console version
- Explorer Explorer plugin
- Resource Resources
- Far FAR plugin
- Client7z Test application for 7za.dll
-
- Compress
- --------
- BZip2 BZip2 compressor
- Branch Branch converter
- ByteSwap Byte Swap converter
- Copy Copy coder
- Deflate
- Implode
- Arj
- LZMA
- PPMd Dmitry Shkarin's PPMdH with small changes.
- LZ Lempel - Ziv
-
- Crypto Crypto modules
- ------
- 7zAES Cipher for 7z
- AES AES Cipher
- Rar20 Cipher for Rar 2.0
- RarAES Cipher for Rar 3.0
- Zip Cipher for Zip
-
- FileManager File Manager
-
-
----
-Igor Pavlov
-http://www.7-zip.org
diff --git a/src/libs/7zip/win/DOC/unRarLicense.txt b/src/libs/7zip/win/DOC/unRarLicense.txt
deleted file mode 100644
index 5f78b728d..000000000
--- a/src/libs/7zip/win/DOC/unRarLicense.txt
+++ /dev/null
@@ -1,41 +0,0 @@
- ****** ***** ****** unRAR - free utility for RAR archives
- ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ****** ******* ****** License for use and distribution of
- ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ** ** ** ** ** ** FREE portable version
- ~~~~~~~~~~~~~~~~~~~~~
-
- The source code of unRAR utility is freeware. This means:
-
- 1. All copyrights to RAR and the utility unRAR are exclusively
- owned by the author - Alexander Roshal.
-
- 2. The unRAR sources may be used in any software to handle RAR
- archives without limitations free of charge, but 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.
-
- 3. The unRAR utility may be freely distributed. No person or company
- may charge a fee for the distribution of unRAR without written
- permission from the copyright holder.
-
- 4. THE RAR ARCHIVER AND THE UNRAR UTILITY ARE DISTRIBUTED "AS IS".
- NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. YOU USE AT
- YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS,
- DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING
- OR MISUSING THIS SOFTWARE.
-
- 5. Installing and using the unRAR utility signifies acceptance of
- these terms and conditions of the license.
-
- 6. If you don't agree with terms of the license you must remove
- unRAR files from your storage devices and cease to use the
- utility.
-
- Thank you for your interest in RAR and unRAR.
-
-
- Alexander L. Roshal \ No newline at end of file
diff --git a/src/libs/7zip/win/DOC/Methods.txt b/src/libs/7zip/win/Methods.txt
index f52e7c315..f52e7c315 100644
--- a/src/libs/7zip/win/DOC/Methods.txt
+++ b/src/libs/7zip/win/Methods.txt
diff --git a/src/libs/7zip/win/history.txt b/src/libs/7zip/win/history.txt
new file mode 100644
index 000000000..79abd9cea
--- /dev/null
+++ b/src/libs/7zip/win/history.txt
@@ -0,0 +1,271 @@
+HISTORY of the LZMA SDK
+-----------------------
+
+9.18 beta 2010-11-02
+-------------------------
+- New small SFX module for installers (SfxSetup).
+
+
+9.12 beta 2010-03-24
+-------------------------
+- The BUG in LZMA SDK 9.* was fixed: LZMA2 codec didn't work,
+ if more than 10 threads were used (or more than 20 threads in some modes).
+
+
+9.11 beta 2010-03-15
+-------------------------
+- PPMd compression method support
+
+
+9.09 2009-12-12
+-------------------------
+- The bug was fixed:
+ Utf16_To_Utf8 funstions in UTFConvert.cpp and 7zMain.c
+ incorrectly converted surrogate characters (the code >= 0x10000) to UTF-8.
+- Some bugs were fixed
+
+
+9.06 2009-08-17
+-------------------------
+- Some changes in ANSI-C 7z Decoder interfaces.
+
+
+9.04 2009-05-30
+-------------------------
+- LZMA2 compression method support
+- xz format support
+
+
+4.65 2009-02-03
+-------------------------
+- Some minor fixes
+
+
+4.63 2008-12-31
+-------------------------
+- Some minor fixes
+
+
+4.61 beta 2008-11-23
+-------------------------
+- The bug in ANSI-C LZMA Decoder was fixed:
+ If encoded stream was corrupted, decoder could access memory
+ outside of allocated range.
+- Some changes in ANSI-C 7z Decoder interfaces.
+- LZMA SDK is placed in the public domain.
+
+
+4.60 beta 2008-08-19
+-------------------------
+- Some minor fixes.
+
+
+4.59 beta 2008-08-13
+-------------------------
+- The bug was fixed:
+ LZMA Encoder in fast compression mode could access memory outside of
+ allocated range in some rare cases.
+
+
+4.58 beta 2008-05-05
+-------------------------
+- ANSI-C LZMA Decoder was rewritten for speed optimizations.
+- ANSI-C LZMA Encoder was included to LZMA SDK.
+- C++ LZMA code now is just wrapper over ANSI-C code.
+
+
+4.57 2007-12-12
+-------------------------
+- Speed optimizations in Ñ++ LZMA Decoder.
+- Small changes for more compatibility with some C/C++ compilers.
+
+
+4.49 beta 2007-07-05
+-------------------------
+- .7z ANSI-C Decoder:
+ - now it supports BCJ and BCJ2 filters
+ - now it supports files larger than 4 GB.
+ - now it supports "Last Write Time" field for files.
+- C++ code for .7z archives compressing/decompressing from 7-zip
+ was included to LZMA SDK.
+
+
+4.43 2006-06-04
+-------------------------
+- Small changes for more compatibility with some C/C++ compilers.
+
+
+4.42 2006-05-15
+-------------------------
+- Small changes in .h files in ANSI-C version.
+
+
+4.39 beta 2006-04-14
+-------------------------
+- The bug in versions 4.33b:4.38b was fixed:
+ C++ version of LZMA encoder could not correctly compress
+ files larger than 2 GB with HC4 match finder (-mfhc4).
+
+
+4.37 beta 2005-04-06
+-------------------------
+- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined.
+
+
+4.35 beta 2005-03-02
+-------------------------
+- The bug was fixed in C++ version of LZMA Decoder:
+ If encoded stream was corrupted, decoder could access memory
+ outside of allocated range.
+
+
+4.34 beta 2006-02-27
+-------------------------
+- Compressing speed and memory requirements for compressing were increased
+- LZMA now can use only these match finders: HC4, BT2, BT3, BT4
+
+
+4.32 2005-12-09
+-------------------------
+- Java version of LZMA SDK was included
+
+
+4.30 2005-11-20
+-------------------------
+- Compression ratio was improved in -a2 mode
+- Speed optimizations for compressing in -a2 mode
+- -fb switch now supports values up to 273
+- The bug in 7z_C (7zIn.c) was fixed:
+ It used Alloc/Free functions from different memory pools.
+ So if program used two memory pools, it worked incorrectly.
+- 7z_C: .7z format supporting was improved
+- LZMA# SDK (C#.NET version) was included
+
+
+4.27 (Updated) 2005-09-21
+-------------------------
+- Some GUIDs/interfaces in C++ were changed.
+ IStream.h:
+ ISequentialInStream::Read now works as old ReadPart
+ ISequentialOutStream::Write now works as old WritePart
+
+
+4.27 2005-08-07
+-------------------------
+- The bug in LzmaDecodeSize.c was fixed:
+ if _LZMA_IN_CB and _LZMA_OUT_READ were defined,
+ decompressing worked incorrectly.
+
+
+4.26 2005-08-05
+-------------------------
+- Fixes in 7z_C code and LzmaTest.c:
+ previous versions could work incorrectly,
+ if malloc(0) returns 0
+
+
+4.23 2005-06-29
+-------------------------
+- Small fixes in C++ code
+
+
+4.22 2005-06-10
+-------------------------
+- Small fixes
+
+
+4.21 2005-06-08
+-------------------------
+- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed
+- New additional version of ANSI-C LZMA Decoder with zlib-like interface:
+ - LzmaStateDecode.h
+ - LzmaStateDecode.c
+ - LzmaStateTest.c
+- ANSI-C LZMA Decoder now can decompress files larger than 4 GB
+
+
+4.17 2005-04-18
+-------------------------
+- New example for RAM->RAM compressing/decompressing:
+ LZMA + BCJ (filter for x86 code):
+ - LzmaRam.h
+ - LzmaRam.cpp
+ - LzmaRamDecode.h
+ - LzmaRamDecode.c
+ - -f86 switch for lzma.exe
+
+
+4.16 2005-03-29
+-------------------------
+- The bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder):
+ If _LZMA_OUT_READ was defined, and if encoded stream was corrupted,
+ decoder could access memory outside of allocated range.
+- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster).
+ Old version of LZMA Decoder now is in file LzmaDecodeSize.c.
+ LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c
+- Small speed optimization in LZMA C++ code
+- filter for SPARC's code was added
+- Simplified version of .7z ANSI-C Decoder was included
+
+
+4.06 2004-09-05
+-------------------------
+- The bug in v4.05 was fixed:
+ LZMA-Encoder didn't release output stream in some cases.
+
+
+4.05 2004-08-25
+-------------------------
+- Source code of filters for x86, IA-64, ARM, ARM-Thumb
+ and PowerPC code was included to SDK
+- Some internal minor changes
+
+
+4.04 2004-07-28
+-------------------------
+- More compatibility with some C++ compilers
+
+
+4.03 2004-06-18
+-------------------------
+- "Benchmark" command was added. It measures compressing
+ and decompressing speed and shows rating values.
+ Also it checks hardware errors.
+
+
+4.02 2004-06-10
+-------------------------
+- C++ LZMA Encoder/Decoder code now is more portable
+ and it can be compiled by GCC on Linux.
+
+
+4.01 2004-02-15
+-------------------------
+- Some detection of data corruption was enabled.
+ LzmaDecode.c / RangeDecoderReadByte
+ .....
+ {
+ rd->ExtraBytes = 1;
+ return 0xFF;
+ }
+
+
+4.00 2004-02-13
+-------------------------
+- Original version of LZMA SDK
+
+
+
+HISTORY of the LZMA
+-------------------
+ 2001-2008: Improvements to LZMA compressing/decompressing code,
+ keeping compatibility with original LZMA format
+ 1996-2001: Development of LZMA compression format
+
+ Some milestones:
+
+ 2001-08-30: LZMA compression was added to 7-Zip
+ 1999-01-02: First version of 7-Zip was released
+
+
+End of document
diff --git a/src/libs/7zip/win/installer_framework_changes.txt b/src/libs/7zip/win/installer_framework_changes.txt
deleted file mode 100644
index 2701503f9..000000000
--- a/src/libs/7zip/win/installer_framework_changes.txt
+++ /dev/null
@@ -1,519 +0,0 @@
-There are deleted files and very small changes to get the integration process of new versions very simple.
---diff-filter=M means "modified" and
---diff-filter=D means "deleted" files
-
-=== output of: git diff --diff-filter=M ===
-
-diff --git a/C/AesOpt.c b/C/AesOpt.c
-index 60cfd86..c0bd8bc 100644
---- a/C/AesOpt.c
-+++ b/C/AesOpt.c
-@@ -5,7 +5,7 @@
-
- #ifdef MY_CPU_X86_OR_AMD64
- #if _MSC_VER >= 1500
--#define USE_INTEL_AES
-+//#define USE_INTEL_AES
- #endif
- #endif
-
-diff --git a/CPP/7zip/Common/RegisterArc.h b/CPP/7zip/Common/RegisterArc.h
-index bc2a034..9b8cbd3 100644
---- a/CPP/7zip/Common/RegisterArc.h
-+++ b/CPP/7zip/Common/RegisterArc.h
-@@ -27,6 +27,6 @@ void RegisterArc(const CArcInfo *arcInfo);
-
- #define REGISTER_ARC(x) struct REGISTER_ARC_NAME(x) { \
- REGISTER_ARC_NAME(x)() { RegisterArc(&g_ArcInfo); }}; \
-- static REGISTER_ARC_NAME(x) g_RegisterArc;
--
-+ static REGISTER_ARC_NAME(x) g_RegisterArc; \
-+ void registerArc##x() { static REGISTER_ARC_NAME(x) g_RegisterArc; }
- #endif
-diff --git a/CPP/7zip/Common/RegisterCodec.h b/CPP/7zip/Common/RegisterCodec.h
-index 786b4a4..d53c434 100644
---- a/CPP/7zip/Common/RegisterCodec.h
-+++ b/CPP/7zip/Common/RegisterCodec.h
-@@ -22,12 +22,13 @@ void RegisterCodec(const CCodecInfo *codecInfo);
-
- #define REGISTER_CODEC(x) struct REGISTER_CODEC_NAME(x) { \
- REGISTER_CODEC_NAME(x)() { RegisterCodec(&g_CodecInfo); }}; \
-- static REGISTER_CODEC_NAME(x) g_RegisterCodec;
-+ static REGISTER_CODEC_NAME(x) g_RegisterCodec; \
-+ void registerCodec##x() { static REGISTER_CODEC_NAME(x) g_RegisterCodecs; }
-
- #define REGISTER_CODECS_NAME(x) CRegisterCodecs ## x
- #define REGISTER_CODECS(x) struct REGISTER_CODECS_NAME(x) { \
- REGISTER_CODECS_NAME(x)() { for (int i = 0; i < sizeof(g_CodecsInfo) / sizeof(g_CodecsInfo[0]); i++) \
- RegisterCodec(&g_CodecsInfo[i]); }}; \
-- static REGISTER_CODECS_NAME(x) g_RegisterCodecs;
--
-+ static REGISTER_CODECS_NAME(x) g_RegisterCodecs; \
-+ void registerCodec##x() { static REGISTER_CODECS_NAME(x) g_RegisterCodecs; }
- #endif
-diff --git a/CPP/Common/MyString.h b/CPP/Common/MyString.h
-index eb3c52d..f483e39 100644
---- a/CPP/Common/MyString.h
-+++ b/CPP/Common/MyString.h
-@@ -7,6 +7,8 @@
-
- #include "MyVector.h"
-
-+#include <windows.h>
-+
- template <class T>
- inline int MyStringLen(const T *s)
- {
-
-=== output of: git diff --diff-filter=D --name-only ===
-Asm/arm/7zCrcOpt.asm
-Asm/x86/7zAsm.asm
-Asm/x86/7zCrcOpt.asm
-Asm/x86/AesOpt.asm
-C/Util/7z/7z.dsp
-C/Util/7z/7z.dsw
-C/Util/7z/7zMain.c
-C/Util/7z/makefile
-C/Util/7z/makefile.gcc
-C/Util/Lzma/LzmaUtil.c
-C/Util/Lzma/LzmaUtil.dsp
-C/Util/Lzma/LzmaUtil.dsw
-C/Util/Lzma/makefile
-C/Util/Lzma/makefile.gcc
-C/Util/LzmaLib/LzmaLib.def
-C/Util/LzmaLib/LzmaLib.dsp
-C/Util/LzmaLib/LzmaLib.dsw
-C/Util/LzmaLib/LzmaLibExports.c
-C/Util/LzmaLib/makefile
-C/Util/LzmaLib/resource.rc
-C/Util/SfxSetup/SfxSetup.c
-C/Util/SfxSetup/SfxSetup.dsp
-C/Util/SfxSetup/SfxSetup.dsw
-C/Util/SfxSetup/makefile
-C/Util/SfxSetup/makefile_con
-C/Util/SfxSetup/resource.rc
-C/Util/SfxSetup/setup.ico
-CPP/7zip/Aes.mak
-CPP/7zip/Archive/7z/7z.dsp
-CPP/7zip/Archive/7z/7z.dsw
-CPP/7zip/Archive/7z/makefile
-CPP/7zip/Archive/7z/resource.rc
-CPP/7zip/Archive/Archive.def
-CPP/7zip/Archive/Archive2.def
-CPP/7zip/Archive/Icons/7z.ico
-CPP/7zip/Archive/Icons/arj.ico
-CPP/7zip/Archive/Icons/bz2.ico
-CPP/7zip/Archive/Icons/cab.ico
-CPP/7zip/Archive/Icons/cpio.ico
-CPP/7zip/Archive/Icons/deb.ico
-CPP/7zip/Archive/Icons/dmg.ico
-CPP/7zip/Archive/Icons/fat.ico
-CPP/7zip/Archive/Icons/gz.ico
-CPP/7zip/Archive/Icons/hfs.ico
-CPP/7zip/Archive/Icons/iso.ico
-CPP/7zip/Archive/Icons/lzh.ico
-CPP/7zip/Archive/Icons/lzma.ico
-CPP/7zip/Archive/Icons/ntfs.ico
-CPP/7zip/Archive/Icons/rar.ico
-CPP/7zip/Archive/Icons/rpm.ico
-CPP/7zip/Archive/Icons/split.ico
-CPP/7zip/Archive/Icons/squashfs.ico
-CPP/7zip/Archive/Icons/tar.ico
-CPP/7zip/Archive/Icons/vhd.ico
-CPP/7zip/Archive/Icons/wim.ico
-CPP/7zip/Archive/Icons/xar.ico
-CPP/7zip/Archive/Icons/xz.ico
-CPP/7zip/Archive/Icons/z.ico
-CPP/7zip/Archive/Icons/zip.ico
-CPP/7zip/Archive/makefile
-CPP/7zip/Asm.mak
-CPP/7zip/Bundles/Alone/Alone.dsp
-CPP/7zip/Bundles/Alone/Alone.dsw
-CPP/7zip/Bundles/Alone/StdAfx.cpp
-CPP/7zip/Bundles/Alone/StdAfx.h
-CPP/7zip/Bundles/Alone/afxres.h
-CPP/7zip/Bundles/Alone/makefile
-CPP/7zip/Bundles/Alone/resource.rc
-CPP/7zip/Bundles/Alone7z/StdAfx.cpp
-CPP/7zip/Bundles/Alone7z/StdAfx.h
-CPP/7zip/Bundles/Alone7z/makefile
-CPP/7zip/Bundles/Alone7z/resource.rc
-CPP/7zip/Bundles/Fm/FM.dsp
-CPP/7zip/Bundles/Fm/FM.dsw
-CPP/7zip/Bundles/Fm/StdAfx.cpp
-CPP/7zip/Bundles/Fm/StdAfx.h
-CPP/7zip/Bundles/Fm/makefile
-CPP/7zip/Bundles/Fm/resource.rc
-CPP/7zip/Bundles/Format7z/StdAfx.cpp
-CPP/7zip/Bundles/Format7z/StdAfx.h
-CPP/7zip/Bundles/Format7z/makefile
-CPP/7zip/Bundles/Format7z/resource.rc
-CPP/7zip/Bundles/Format7zExtract/StdAfx.cpp
-CPP/7zip/Bundles/Format7zExtract/StdAfx.h
-CPP/7zip/Bundles/Format7zExtract/makefile
-CPP/7zip/Bundles/Format7zExtract/resource.rc
-CPP/7zip/Bundles/Format7zExtractR/StdAfx.cpp
-CPP/7zip/Bundles/Format7zExtractR/StdAfx.h
-CPP/7zip/Bundles/Format7zExtractR/makefile
-CPP/7zip/Bundles/Format7zExtractR/resource.rc
-CPP/7zip/Bundles/Format7zF/Format7z.dsp
-CPP/7zip/Bundles/Format7zF/Format7z.dsw
-CPP/7zip/Bundles/Format7zF/StdAfx.cpp
-CPP/7zip/Bundles/Format7zF/StdAfx.h
-CPP/7zip/Bundles/Format7zF/makefile
-CPP/7zip/Bundles/Format7zF/resource.rc
-CPP/7zip/Bundles/Format7zR/StdAfx.cpp
-CPP/7zip/Bundles/Format7zR/StdAfx.h
-CPP/7zip/Bundles/Format7zR/makefile
-CPP/7zip/Bundles/Format7zR/resource.rc
-CPP/7zip/Bundles/LzmaCon/LzmaAlone.cpp
-CPP/7zip/Bundles/LzmaCon/LzmaCon.dsp
-CPP/7zip/Bundles/LzmaCon/LzmaCon.dsw
-CPP/7zip/Bundles/LzmaCon/StdAfx.cpp
-CPP/7zip/Bundles/LzmaCon/StdAfx.h
-CPP/7zip/Bundles/LzmaCon/makefile
-CPP/7zip/Bundles/LzmaCon/makefile.gcc
-CPP/7zip/Bundles/SFXCon/7z.ico
-CPP/7zip/Bundles/SFXCon/Main.cpp
-CPP/7zip/Bundles/SFXCon/SFXCon.dsp
-CPP/7zip/Bundles/SFXCon/SFXCon.dsw
-CPP/7zip/Bundles/SFXCon/StdAfx.cpp
-CPP/7zip/Bundles/SFXCon/StdAfx.h
-CPP/7zip/Bundles/SFXCon/makefile
-CPP/7zip/Bundles/SFXCon/resource.rc
-CPP/7zip/Bundles/SFXSetup/ExtractCallback.cpp
-CPP/7zip/Bundles/SFXSetup/ExtractCallback.h
-CPP/7zip/Bundles/SFXSetup/ExtractEngine.cpp
-CPP/7zip/Bundles/SFXSetup/ExtractEngine.h
-CPP/7zip/Bundles/SFXSetup/Main.cpp
-CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp
-CPP/7zip/Bundles/SFXSetup/SFXSetup.dsw
-CPP/7zip/Bundles/SFXSetup/StdAfx.cpp
-CPP/7zip/Bundles/SFXSetup/StdAfx.h
-CPP/7zip/Bundles/SFXSetup/makefile
-CPP/7zip/Bundles/SFXSetup/resource.h
-CPP/7zip/Bundles/SFXSetup/resource.rc
-CPP/7zip/Bundles/SFXSetup/setup.ico
-CPP/7zip/Bundles/SFXWin/7z.ico
-CPP/7zip/Bundles/SFXWin/Main.cpp
-CPP/7zip/Bundles/SFXWin/SFXWin.dsp
-CPP/7zip/Bundles/SFXWin/SFXWin.dsw
-CPP/7zip/Bundles/SFXWin/StdAfx.cpp
-CPP/7zip/Bundles/SFXWin/StdAfx.h
-CPP/7zip/Bundles/SFXWin/makefile
-CPP/7zip/Bundles/SFXWin/resource.h
-CPP/7zip/Bundles/SFXWin/resource.rc
-CPP/7zip/Bundles/makefile
-CPP/7zip/Compress/Codec.def
-CPP/7zip/Compress/makefile
-CPP/7zip/Crc.mak
-CPP/7zip/Crypto/Codec.def
-CPP/7zip/GuiCommon.rc
-CPP/7zip/MyVersionInfo.rc
-CPP/7zip/SubBuild.mak
-CPP/7zip/UI/Agent/Agent.cpp
-CPP/7zip/UI/Agent/Agent.h
-CPP/7zip/UI/Agent/AgentOut.cpp
-CPP/7zip/UI/Agent/AgentProxy.cpp
-CPP/7zip/UI/Agent/AgentProxy.h
-CPP/7zip/UI/Agent/ArchiveFolder.cpp
-CPP/7zip/UI/Agent/ArchiveFolderOpen.cpp
-CPP/7zip/UI/Agent/ArchiveFolderOut.cpp
-CPP/7zip/UI/Agent/IFolderArchive.h
-CPP/7zip/UI/Agent/UpdateCallbackAgent.cpp
-CPP/7zip/UI/Agent/UpdateCallbackAgent.h
-CPP/7zip/UI/Client7z/Client7z.cpp
-CPP/7zip/UI/Client7z/Client7z.dsp
-CPP/7zip/UI/Client7z/Client7z.dsw
-CPP/7zip/UI/Client7z/StdAfx.cpp
-CPP/7zip/UI/Client7z/StdAfx.h
-CPP/7zip/UI/Client7z/makefile
-CPP/7zip/UI/Console/Console.dsp
-CPP/7zip/UI/Console/Console.dsw
-CPP/7zip/UI/Console/makefile
-CPP/7zip/UI/Console/resource.rc
-CPP/7zip/UI/Explorer/7-zip.dll.manifest
-CPP/7zip/UI/Explorer/ContextMenu.cpp
-CPP/7zip/UI/Explorer/ContextMenu.h
-CPP/7zip/UI/Explorer/ContextMenuFlags.h
-CPP/7zip/UI/Explorer/DllExports.cpp
-CPP/7zip/UI/Explorer/Explorer.def
-CPP/7zip/UI/Explorer/Explorer.dsp
-CPP/7zip/UI/Explorer/Explorer.dsw
-CPP/7zip/UI/Explorer/MyMessages.cpp
-CPP/7zip/UI/Explorer/MyMessages.h
-CPP/7zip/UI/Explorer/OptionsDialog.cpp
-CPP/7zip/UI/Explorer/OptionsDialog.h
-CPP/7zip/UI/Explorer/RegistryContextMenu.cpp
-CPP/7zip/UI/Explorer/RegistryContextMenu.h
-CPP/7zip/UI/Explorer/StdAfx.cpp
-CPP/7zip/UI/Explorer/StdAfx.h
-CPP/7zip/UI/Explorer/makefile
-CPP/7zip/UI/Explorer/resource.h
-CPP/7zip/UI/Explorer/resource.rc
-CPP/7zip/UI/Explorer/resource2.rc
-CPP/7zip/UI/Far/ExtractEngine.cpp
-CPP/7zip/UI/Far/ExtractEngine.h
-CPP/7zip/UI/Far/Far.def
-CPP/7zip/UI/Far/Far.dsp
-CPP/7zip/UI/Far/Far.dsw
-CPP/7zip/UI/Far/FarPlugin.h
-CPP/7zip/UI/Far/FarUtils.cpp
-CPP/7zip/UI/Far/FarUtils.h
-CPP/7zip/UI/Far/Main.cpp
-CPP/7zip/UI/Far/Messages.h
-CPP/7zip/UI/Far/OverwriteDialog.cpp
-CPP/7zip/UI/Far/OverwriteDialog.h
-CPP/7zip/UI/Far/Plugin.cpp
-CPP/7zip/UI/Far/Plugin.h
-CPP/7zip/UI/Far/PluginCommon.cpp
-CPP/7zip/UI/Far/PluginDelete.cpp
-CPP/7zip/UI/Far/PluginRead.cpp
-CPP/7zip/UI/Far/PluginWrite.cpp
-CPP/7zip/UI/Far/ProgressBox.cpp
-CPP/7zip/UI/Far/ProgressBox.h
-CPP/7zip/UI/Far/StdAfx.cpp
-CPP/7zip/UI/Far/StdAfx.h
-CPP/7zip/UI/Far/UpdateCallback100.cpp
-CPP/7zip/UI/Far/UpdateCallback100.h
-CPP/7zip/UI/Far/makefile
-CPP/7zip/UI/Far/resource.rc
-CPP/7zip/UI/FileManager/7zFM.exe.manifest
-CPP/7zip/UI/FileManager/7zipLogo.ico
-CPP/7zip/UI/FileManager/AboutDialog.cpp
-CPP/7zip/UI/FileManager/AboutDialog.h
-CPP/7zip/UI/FileManager/AboutDialog.rc
-CPP/7zip/UI/FileManager/AboutDialogRes.h
-CPP/7zip/UI/FileManager/Add.bmp
-CPP/7zip/UI/FileManager/Add2.bmp
-CPP/7zip/UI/FileManager/App.cpp
-CPP/7zip/UI/FileManager/App.h
-CPP/7zip/UI/FileManager/AppState.h
-CPP/7zip/UI/FileManager/BrowseDialog.cpp
-CPP/7zip/UI/FileManager/BrowseDialog.h
-CPP/7zip/UI/FileManager/BrowseDialog.rc
-CPP/7zip/UI/FileManager/BrowseDialogRes.h
-CPP/7zip/UI/FileManager/ClassDefs.cpp
-CPP/7zip/UI/FileManager/ComboDialog.cpp
-CPP/7zip/UI/FileManager/ComboDialog.h
-CPP/7zip/UI/FileManager/ComboDialog.rc
-CPP/7zip/UI/FileManager/ComboDialogRes.h
-CPP/7zip/UI/FileManager/Copy.bmp
-CPP/7zip/UI/FileManager/Copy2.bmp
-CPP/7zip/UI/FileManager/CopyDialog.cpp
-CPP/7zip/UI/FileManager/CopyDialog.h
-CPP/7zip/UI/FileManager/CopyDialog.rc
-CPP/7zip/UI/FileManager/CopyDialogRes.h
-CPP/7zip/UI/FileManager/Delete.bmp
-CPP/7zip/UI/FileManager/Delete2.bmp
-CPP/7zip/UI/FileManager/DialogSize.h
-CPP/7zip/UI/FileManager/EditPage.cpp
-CPP/7zip/UI/FileManager/EditPage.h
-CPP/7zip/UI/FileManager/EditPage.rc
-CPP/7zip/UI/FileManager/EditPage2.rc
-CPP/7zip/UI/FileManager/EditPageRes.h
-CPP/7zip/UI/FileManager/EnumFormatEtc.cpp
-CPP/7zip/UI/FileManager/EnumFormatEtc.h
-CPP/7zip/UI/FileManager/Extract.bmp
-CPP/7zip/UI/FileManager/Extract2.bmp
-CPP/7zip/UI/FileManager/ExtractCallback.cpp
-CPP/7zip/UI/FileManager/ExtractCallback.h
-CPP/7zip/UI/FileManager/FM.cpp
-CPP/7zip/UI/FileManager/FM.dsp
-CPP/7zip/UI/FileManager/FM.dsw
-CPP/7zip/UI/FileManager/FM.ico
-CPP/7zip/UI/FileManager/FSDrives.cpp
-CPP/7zip/UI/FileManager/FSDrives.h
-CPP/7zip/UI/FileManager/FSFolder.cpp
-CPP/7zip/UI/FileManager/FSFolder.h
-CPP/7zip/UI/FileManager/FSFolderCopy.cpp
-CPP/7zip/UI/FileManager/FileFolderPluginOpen.cpp
-CPP/7zip/UI/FileManager/FileFolderPluginOpen.h
-CPP/7zip/UI/FileManager/FilePlugins.cpp
-CPP/7zip/UI/FileManager/FilePlugins.h
-CPP/7zip/UI/FileManager/FoldersPage.cpp
-CPP/7zip/UI/FileManager/FoldersPage.h
-CPP/7zip/UI/FileManager/FoldersPage.rc
-CPP/7zip/UI/FileManager/FoldersPage2.rc
-CPP/7zip/UI/FileManager/FoldersPageRes.h
-CPP/7zip/UI/FileManager/FormatUtils.cpp
-CPP/7zip/UI/FileManager/FormatUtils.h
-CPP/7zip/UI/FileManager/HelpUtils.cpp
-CPP/7zip/UI/FileManager/HelpUtils.h
-CPP/7zip/UI/FileManager/IFolder.h
-CPP/7zip/UI/FileManager/Info.bmp
-CPP/7zip/UI/FileManager/Info2.bmp
-CPP/7zip/UI/FileManager/LangPage.cpp
-CPP/7zip/UI/FileManager/LangPage.h
-CPP/7zip/UI/FileManager/LangPage.rc
-CPP/7zip/UI/FileManager/LangPageRes.h
-CPP/7zip/UI/FileManager/LangUtils.cpp
-CPP/7zip/UI/FileManager/LangUtils.h
-CPP/7zip/UI/FileManager/ListViewDialog.cpp
-CPP/7zip/UI/FileManager/ListViewDialog.h
-CPP/7zip/UI/FileManager/ListViewDialog.rc
-CPP/7zip/UI/FileManager/ListViewDialogRes.h
-CPP/7zip/UI/FileManager/MenuPage.cpp
-CPP/7zip/UI/FileManager/MenuPage.h
-CPP/7zip/UI/FileManager/MenuPage.rc
-CPP/7zip/UI/FileManager/MenuPage2.rc
-CPP/7zip/UI/FileManager/MenuPageRes.h
-CPP/7zip/UI/FileManager/MessagesDialog.cpp
-CPP/7zip/UI/FileManager/MessagesDialog.h
-CPP/7zip/UI/FileManager/MessagesDialog.rc
-CPP/7zip/UI/FileManager/MessagesDialogRes.h
-CPP/7zip/UI/FileManager/Move.bmp
-CPP/7zip/UI/FileManager/Move2.bmp
-CPP/7zip/UI/FileManager/MyCom2.h
-CPP/7zip/UI/FileManager/MyLoadMenu.cpp
-CPP/7zip/UI/FileManager/MyLoadMenu.h
-CPP/7zip/UI/FileManager/NetFolder.cpp
-CPP/7zip/UI/FileManager/NetFolder.h
-CPP/7zip/UI/FileManager/OpenCallback.cpp
-CPP/7zip/UI/FileManager/OpenCallback.h
-CPP/7zip/UI/FileManager/OptionsDialog.cpp
-CPP/7zip/UI/FileManager/OverwriteDialog.cpp
-CPP/7zip/UI/FileManager/OverwriteDialog.h
-CPP/7zip/UI/FileManager/OverwriteDialog.rc
-CPP/7zip/UI/FileManager/OverwriteDialogRes.h
-CPP/7zip/UI/FileManager/Panel.cpp
-CPP/7zip/UI/FileManager/Panel.h
-CPP/7zip/UI/FileManager/PanelCopy.cpp
-CPP/7zip/UI/FileManager/PanelCrc.cpp
-CPP/7zip/UI/FileManager/PanelDrag.cpp
-CPP/7zip/UI/FileManager/PanelFolderChange.cpp
-CPP/7zip/UI/FileManager/PanelItemOpen.cpp
-CPP/7zip/UI/FileManager/PanelItems.cpp
-CPP/7zip/UI/FileManager/PanelKey.cpp
-CPP/7zip/UI/FileManager/PanelListNotify.cpp
-CPP/7zip/UI/FileManager/PanelMenu.cpp
-CPP/7zip/UI/FileManager/PanelOperations.cpp
-CPP/7zip/UI/FileManager/PanelSelect.cpp
-CPP/7zip/UI/FileManager/PanelSort.cpp
-CPP/7zip/UI/FileManager/PanelSplitFile.cpp
-CPP/7zip/UI/FileManager/PasswordDialog.cpp
-CPP/7zip/UI/FileManager/PasswordDialog.h
-CPP/7zip/UI/FileManager/PasswordDialog.rc
-CPP/7zip/UI/FileManager/PasswordDialogRes.h
-CPP/7zip/UI/FileManager/PluginInterface.h
-CPP/7zip/UI/FileManager/PluginLoader.h
-CPP/7zip/UI/FileManager/PluginsPage.cpp
-CPP/7zip/UI/FileManager/PluginsPage.h
-CPP/7zip/UI/FileManager/PluginsPage.rc
-CPP/7zip/UI/FileManager/PluginsPageRes.h
-CPP/7zip/UI/FileManager/ProgramLocation.cpp
-CPP/7zip/UI/FileManager/ProgramLocation.h
-CPP/7zip/UI/FileManager/ProgressDialog.cpp
-CPP/7zip/UI/FileManager/ProgressDialog.h
-CPP/7zip/UI/FileManager/ProgressDialog.rc
-CPP/7zip/UI/FileManager/ProgressDialog2.cpp
-CPP/7zip/UI/FileManager/ProgressDialog2.h
-CPP/7zip/UI/FileManager/ProgressDialog2.rc
-CPP/7zip/UI/FileManager/ProgressDialog2Res.h
-CPP/7zip/UI/FileManager/ProgressDialog2a.rc
-CPP/7zip/UI/FileManager/ProgressDialogRes.h
-CPP/7zip/UI/FileManager/PropertyName.cpp
-CPP/7zip/UI/FileManager/PropertyName.h
-CPP/7zip/UI/FileManager/PropertyName.rc
-CPP/7zip/UI/FileManager/PropertyNameRes.h
-CPP/7zip/UI/FileManager/RegistryAssociations.cpp
-CPP/7zip/UI/FileManager/RegistryAssociations.h
-CPP/7zip/UI/FileManager/RegistryPlugins.cpp
-CPP/7zip/UI/FileManager/RegistryPlugins.h
-CPP/7zip/UI/FileManager/RegistryUtils.cpp
-CPP/7zip/UI/FileManager/RegistryUtils.h
-CPP/7zip/UI/FileManager/RootFolder.cpp
-CPP/7zip/UI/FileManager/RootFolder.h
-CPP/7zip/UI/FileManager/SettingsPage.cpp
-CPP/7zip/UI/FileManager/SettingsPage.h
-CPP/7zip/UI/FileManager/SettingsPage.rc
-CPP/7zip/UI/FileManager/SettingsPage2.rc
-CPP/7zip/UI/FileManager/SettingsPageRes.h
-CPP/7zip/UI/FileManager/SplitDialog.cpp
-CPP/7zip/UI/FileManager/SplitDialog.h
-CPP/7zip/UI/FileManager/SplitDialog.rc
-CPP/7zip/UI/FileManager/SplitDialogRes.h
-CPP/7zip/UI/FileManager/SplitUtils.cpp
-CPP/7zip/UI/FileManager/SplitUtils.h
-CPP/7zip/UI/FileManager/StdAfx.cpp
-CPP/7zip/UI/FileManager/StdAfx.h
-CPP/7zip/UI/FileManager/StringUtils.cpp
-CPP/7zip/UI/FileManager/StringUtils.h
-CPP/7zip/UI/FileManager/SysIconUtils.cpp
-CPP/7zip/UI/FileManager/SysIconUtils.h
-CPP/7zip/UI/FileManager/SystemPage.cpp
-CPP/7zip/UI/FileManager/SystemPage.h
-CPP/7zip/UI/FileManager/SystemPage.rc
-CPP/7zip/UI/FileManager/SystemPageRes.h
-CPP/7zip/UI/FileManager/Test.bmp
-CPP/7zip/UI/FileManager/Test2.bmp
-CPP/7zip/UI/FileManager/TextPairs.cpp
-CPP/7zip/UI/FileManager/TextPairs.h
-CPP/7zip/UI/FileManager/UpdateCallback100.cpp
-CPP/7zip/UI/FileManager/UpdateCallback100.h
-CPP/7zip/UI/FileManager/ViewSettings.cpp
-CPP/7zip/UI/FileManager/ViewSettings.h
-CPP/7zip/UI/FileManager/makefile
-CPP/7zip/UI/FileManager/resource.h
-CPP/7zip/UI/FileManager/resource.rc
-CPP/7zip/UI/FileManager/resourceGui.h
-CPP/7zip/UI/FileManager/resourceGui.rc
-CPP/7zip/UI/GUI/7zG.exe.manifest
-CPP/7zip/UI/GUI/BenchmarkDialog.cpp
-CPP/7zip/UI/GUI/BenchmarkDialog.h
-CPP/7zip/UI/GUI/BenchmarkDialog.rc
-CPP/7zip/UI/GUI/BenchmarkDialogRes.h
-CPP/7zip/UI/GUI/CompressDialog.cpp
-CPP/7zip/UI/GUI/CompressDialog.h
-CPP/7zip/UI/GUI/CompressDialog.rc
-CPP/7zip/UI/GUI/CompressDialogRes.h
-CPP/7zip/UI/GUI/Extract.rc
-CPP/7zip/UI/GUI/ExtractDialog.cpp
-CPP/7zip/UI/GUI/ExtractDialog.h
-CPP/7zip/UI/GUI/ExtractDialog.rc
-CPP/7zip/UI/GUI/ExtractDialogRes.h
-CPP/7zip/UI/GUI/ExtractGUI.cpp
-CPP/7zip/UI/GUI/ExtractGUI.h
-CPP/7zip/UI/GUI/ExtractRes.h
-CPP/7zip/UI/GUI/FM.ico
-CPP/7zip/UI/GUI/GUI.cpp
-CPP/7zip/UI/GUI/GUI.dsp
-CPP/7zip/UI/GUI/GUI.dsw
-CPP/7zip/UI/GUI/StdAfx.cpp
-CPP/7zip/UI/GUI/StdAfx.h
-CPP/7zip/UI/GUI/UpdateCallbackGUI.cpp
-CPP/7zip/UI/GUI/UpdateCallbackGUI.h
-CPP/7zip/UI/GUI/UpdateGUI.cpp
-CPP/7zip/UI/GUI/UpdateGUI.h
-CPP/7zip/UI/GUI/makefile
-CPP/7zip/UI/GUI/resource.rc
-CPP/7zip/UI/GUI/resource2.h
-CPP/7zip/UI/GUI/resource2.rc
-CPP/7zip/UI/makefile
-CPP/7zip/makefile
-CPP/Build.mak
-CPP/Windows/Control/ComboBox.cpp
-CPP/Windows/Control/ComboBox.h
-CPP/Windows/Control/CommandBar.h
-CPP/Windows/Control/Dialog.cpp
-CPP/Windows/Control/Dialog.h
-CPP/Windows/Control/Edit.h
-CPP/Windows/Control/ImageList.cpp
-CPP/Windows/Control/ImageList.h
-CPP/Windows/Control/ListView.cpp
-CPP/Windows/Control/ListView.h
-CPP/Windows/Control/ProgressBar.h
-CPP/Windows/Control/PropertyPage.cpp
-CPP/Windows/Control/PropertyPage.h
-CPP/Windows/Control/ReBar.h
-CPP/Windows/Control/Static.h
-CPP/Windows/Control/StatusBar.h
-CPP/Windows/Control/StdAfx.h
-CPP/Windows/Control/ToolBar.h
-CPP/Windows/Control/Trackbar.h
-CPP/Windows/Control/Window2.cpp
-CPP/Windows/Control/Window2.h
-DOC/7zip.hhp
-DOC/7zip.inf
-DOC/7zip.nsi
-DOC/7zip.wxs
diff --git a/src/libs/7zip/win/DOC/lzma.txt b/src/libs/7zip/win/lzma.txt
index 659323237..659323237 100644
--- a/src/libs/7zip/win/DOC/lzma.txt
+++ b/src/libs/7zip/win/lzma.txt
diff --git a/src/libs/7zip/win/win.pri b/src/libs/7zip/win/win.pri
index dd06a4565..932c567fa 100644
--- a/src/libs/7zip/win/win.pri
+++ b/src/libs/7zip/win/win.pri
@@ -1,84 +1,46 @@
-#$(CONSOLE_OBJS): ../../UI/Console/$(*B).cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/BenchCon.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/ConsoleClose.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/List.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/Main.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/MainAr.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/OpenCallbackConsole.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/PercentPrinter.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/StdAfx.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/UpdateCallbackConsole.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/UserInputUtils.cpp
-
#$(COMMON_OBJS): ../../../Common/$(*B).cpp
-#SOURCES += $$7ZIP_BASE/CPP/Common/CommandLineParser.cpp
-#SOURCES += $$7ZIP_BASE/CPP/Common/CRC.cpp
-#SOURCES += $$7ZIP_BASE/CPP/Common/C_FileIO.cpp
SOURCES += $$7ZIP_BASE/CPP/Common/IntToString.cpp
-#SOURCES += $$7ZIP_BASE/CPP/Common/ListFileUtils.cpp
SOURCES += $$7ZIP_BASE/CPP/Common/MyString.cpp
-SOURCES += $$7ZIP_BASE/CPP/Common/MyVector.cpp
-#SOURCES += $$7ZIP_BASE/CPP/Common/NewHandler.cpp
-#SOURCES += $$7ZIP_BASE/CPP/Common/StdInStream.cpp
-#SOURCES += $$7ZIP_BASE/CPP/Common/StdOutStream.cpp
SOURCES += $$7ZIP_BASE/CPP/Common/StringConvert.cpp
SOURCES += $$7ZIP_BASE/CPP/Common/StringToInt.cpp
-SOURCES += $$7ZIP_BASE/CPP/Common/UTFConvert.cpp
+SOURCES += $$7ZIP_BASE/CPP/Common/MyVector.cpp
SOURCES += $$7ZIP_BASE/CPP/Common/Wildcard.cpp
#$(WIN_OBJS): ../../../Windows/$(*B).cpp
SOURCES += $$7ZIP_BASE/CPP/Windows/DLL.cpp
-#SOURCES += $$7ZIP_BASE/CPP/Windows/Error.cpp
SOURCES += $$7ZIP_BASE/CPP/Windows/FileDir.cpp
SOURCES += $$7ZIP_BASE/CPP/Windows/FileFind.cpp
-SOURCES += $$7ZIP_BASE/CPP/Windows/FileIO.cpp
-#SOURCES += $$7ZIP_BASE/CPP/Windows/FileMapping.cpp
SOURCES += $$7ZIP_BASE/CPP/Windows/FileName.cpp
-#SOURCES += $$7ZIP_BASE/CPP/Windows/MemoryLock.cpp
+SOURCES += $$7ZIP_BASE/CPP/Windows/FileIO.cpp
SOURCES += $$7ZIP_BASE/CPP/Windows/PropVariant.cpp
SOURCES += $$7ZIP_BASE/CPP/Windows/PropVariantConversions.cpp
-#SOURCES += $$7ZIP_BASE/CPP/Windows/Registry.cpp
-#SOURCES += $$7ZIP_BASE/CPP/Windows/Synchronization.cpp
SOURCES += $$7ZIP_BASE/CPP/Windows/System.cpp
SOURCES += $$7ZIP_BASE/CPP/Windows/Time.cpp
#$(7ZIP_COMMON_OBJS): ../../Common/$(*B).cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/CreateCoder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/CWrappers.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/Common/FilePathAutoRename.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Common/FileStreams.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Common/FilterCoder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/InBuffer.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/InOutTempBuffer.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/FileStreams.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Common/FilterCoder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/LimitedStreams.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/LockedStream.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Common/MemBlocks.cpp #added to support more then 7z
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/MethodId.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/MethodProps.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Common/OffsetStream.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/OutBuffer.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Common/OutMemStream.cpp #added to support more then 7z
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/ProgressUtils.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Common/ProgressMt.cpp #added to support more then 7z
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/StreamBinder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/StreamObjects.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/StreamUtils.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Common/VirtThread.cpp
#$(UI_COMMON_OBJS): ../../UI/Common/$(*B).cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveCommandLine.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveName.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/Bench.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/DefaultName.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/EnumDirItems.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/Extract.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/ExtractingFilePath.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/LoadCodecs.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/OpenArchive.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/PropIDUtils.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/SetProperties.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/SortUtils.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/TempFiles.cpp
@@ -87,32 +49,25 @@ SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/UpdateAction.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/UpdateCallback.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/UpdatePair.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/UpdateProduce.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/WorkDir.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/ZipRegistry.cpp
#$(AR_OBJS): ../../Archive/$(*B).cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/ArchiveExports.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/DllExports2.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Bz2Handler.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/DeflateProps.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/GzHandler.cpp #added to support more then 7z
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/LzmaHandler.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/SplitHandler.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/XzHandler.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/ZHandler.cpp #added to support more then 7z
+
+!static:DEF_FILE += $$7ZIP_BASE/CPP/7zip/Archive/Archive.def
+!static:DEF_FILE += $$7ZIP_BASE/CPP/7zip/Archive/Archive2.def
#$(AR_COMMON_OBJS): ../../Archive/Common/$(*B).cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/CoderMixer2.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/CoderMixer2MT.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/CrossThreadProgress.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/DummyOutStream.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/FindSignature.cpp #added to support more then 7z
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/HandlerOut.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/InStreamWithCRC.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/ItemNameUtils.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/MultiStream.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/ParseProperties.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/InStreamWithCRC.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/MultiStream.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/DummyOutStream.cpp
#$(7Z_OBJS): ../../Archive/7z/$(*B).cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zCompressionMode.cpp
@@ -127,135 +82,50 @@ SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zHeader.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zIn.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zOut.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zProperties.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zRegister.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zSpecStream.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zUpdate.cpp
-#SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/StdAfx.cpp
-
-#$(CAB_OBJS): ../../Archive/Cab/$(*B).cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Cab/CabBlockInStream.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Cab/CabHandler.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Cab/CabHeader.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Cab/CabIn.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Cab/CabRegister.cpp
-
-#$(TAR_OBJS): ../../Archive/Tar/$(*B).cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Tar/TarHandler.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Tar/TarHandlerOut.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Tar/TarHeader.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Tar/TarIn.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Tar/TarOut.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Tar/TarRegister.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Tar/TarUpdate.cpp
-
-#$(ZIP_OBJS): ../../Archive/Zip/$(*B).cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipAddCommon.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipHandler.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipHeader.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipIn.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipItem.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipOut.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipUpdate.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Zip/ZipRegister.cpp
+SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zRegister.cpp
#$(COMPRESS_OBJS): ../../Compress/$(*B).cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Bcj2Coder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Bcj2Register.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BcjCoder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BcjRegister.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BitlDecoder.cpp #added to support more then 7z
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BranchCoder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BranchMisc.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BranchRegister.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/ByteSwap.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BZip2Encoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BZip2Decoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BZip2Crc.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/BZip2Register.cpp #added to support more then 7z
-#SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/CodecExports.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/CopyCoder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/CopyRegister.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/DeltaFilter.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/DeflateDecoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/DeflateEncoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Deflate64Register.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/DeflateRegister.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/ImplodeDecoder.cpp #added to support more then 7z
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Lzma2Decoder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Lzma2Encoder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Lzma2Register.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/LzmaDecoder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/LzmaEncoder.cpp
SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/LzmaRegister.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/LzOutWindow.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Lzx86Converter.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/LzxDecoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/PpmdEncoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/PpmdDecoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/PpmdRegister.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/PpmdZip.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/QuantumDecoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/ShrinkDecoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/ZlibDecoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/ZlibEncoder.cpp #added to support more then 7z
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/ZDecoder.cpp #added to support more then 7z
-
-#Crypto is not needed for 7z only
-SOURCES += $$7ZIP_BASE/CPP/7zip/Crypto/7zAes.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Crypto/7zAesRegister.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Crypto/HmacSha1.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Crypto/MyAes.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Crypto/RandGen.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Crypto/Sha1.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Crypto/WzAes.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Crypto/ZipCrypto.cpp
-SOURCES += $$7ZIP_BASE/CPP/7zip/Crypto/ZipStrong.cpp
#$(C_OBJS): ../../../../C/$(*B).c
-#SOURCES += $$7ZIP_BASE/C/7zAlloc.c
-#SOURCES += $$7ZIP_BASE/C/7zBuf.c
-#SOURCES += $$7ZIP_BASE/C/7zBuf2.c
-SOURCES += $$7ZIP_BASE/C/7zCrc.c
-SOURCES += $$7ZIP_BASE/C/7zCrcOpt.c
-#SOURCES += $$7ZIP_BASE/C/7zDec.c
-#SOURCES += $$7ZIP_BASE/C/7zFile.c
-#SOURCES += $$7ZIP_BASE/C/7zIn.c
-SOURCES += $$7ZIP_BASE/C/7zStream.c
-SOURCES += $$7ZIP_BASE/C/Aes.c #added to support more then 7z
-SOURCES += $$7ZIP_BASE/C/AesOpt.c #added to support more then 7z
SOURCES += $$7ZIP_BASE/C/Alloc.c
-#SOURCES += $$7ZIP_BASE/C/Bcj2.c
SOURCES += $$7ZIP_BASE/C/Bra.c
SOURCES += $$7ZIP_BASE/C/Bra86.c
SOURCES += $$7ZIP_BASE/C/BraIA64.c
-SOURCES += $$7ZIP_BASE/C/BwtSort.c #added to support more then 7z
SOURCES += $$7ZIP_BASE/C/CpuArch.c
-SOURCES += $$7ZIP_BASE/C/HuffEnc.c #added to support more then 7z
SOURCES += $$7ZIP_BASE/C/Delta.c
SOURCES += $$7ZIP_BASE/C/LzFind.c
SOURCES += $$7ZIP_BASE/C/LzFindMt.c
SOURCES += $$7ZIP_BASE/C/Lzma2Dec.c
SOURCES += $$7ZIP_BASE/C/Lzma2Enc.c
-#SOURCES += $$7ZIP_BASE/C/Lzma86Dec.c
-#SOURCES += $$7ZIP_BASE/C/Lzma86Enc.c
SOURCES += $$7ZIP_BASE/C/LzmaDec.c
SOURCES += $$7ZIP_BASE/C/LzmaEnc.c
-#SOURCES += $$7ZIP_BASE/C/LzmaLib.c
SOURCES += $$7ZIP_BASE/C/MtCoder.c
-SOURCES += $$7ZIP_BASE/C/Ppmd7.c #added to support more then 7z
-SOURCES += $$7ZIP_BASE/C/Ppmd7Dec.c
-SOURCES += $$7ZIP_BASE/C/Ppmd7Enc.c
-SOURCES += $$7ZIP_BASE/C/Ppmd8.c #added to support more then 7z
-SOURCES += $$7ZIP_BASE/C/Ppmd8Dec.c #added to support more then 7z
-SOURCES += $$7ZIP_BASE/C/Ppmd8Enc.c #added to support more then 7z
-SOURCES += $$7ZIP_BASE/C/Sha256.c
-SOURCES += $$7ZIP_BASE/C/Sort.c #added to support more then 7z
SOURCES += $$7ZIP_BASE/C/Threads.c
+SOURCES += $$7ZIP_BASE/C/7zCrc.c
+SOURCES += $$7ZIP_BASE/C/7zCrcOpt.c
+SOURCES += $$7ZIP_BASE/C/7zStream.c
SOURCES += $$7ZIP_BASE/C/Xz.c
+SOURCES += $$7ZIP_BASE/C/XzIn.c
SOURCES += $$7ZIP_BASE/C/XzCrc64.c
SOURCES += $$7ZIP_BASE/C/XzDec.c
SOURCES += $$7ZIP_BASE/C/XzEnc.c
-SOURCES += $$7ZIP_BASE/C/XzIn.c
+SOURCES += $$7ZIP_BASE/C/Sha256.c
diff --git a/src/libs/installer/addqtcreatorarrayvalueoperation.h b/src/libs/installer/addqtcreatorarrayvalueoperation.h
index 6792b8e88..670dccff8 100644
--- a/src/libs/installer/addqtcreatorarrayvalueoperation.h
+++ b/src/libs/installer/addqtcreatorarrayvalueoperation.h
@@ -39,8 +39,8 @@
**
**************************************************************************/
-#ifndef ADDQTCREATORVALUEOPERATION_H
-#define ADDQTCREATORVALUEOPERATION_H
+#ifndef ADDQTCREATORARRAYVALUEOPERATION_H
+#define ADDQTCREATORARRAYVALUEOPERATION_H
#include "qinstallerglobal.h"
@@ -60,4 +60,4 @@ public:
} // namespace QInstaller
-#endif // ADDQTCREATORVALUEOPERATION_H
+#endif // ADDQTCREATORARRAYVALUEOPERATION_H
diff --git a/src/libs/installer/adminauthorization_win.cpp b/src/libs/installer/adminauthorization_win.cpp
index 20420cef0..03003b21a 100644
--- a/src/libs/installer/adminauthorization_win.cpp
+++ b/src/libs/installer/adminauthorization_win.cpp
@@ -49,6 +49,9 @@
# ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0501
# endif
+# ifndef SEE_MASK_NOASYNC
+# define SEE_MASK_NOASYNC 0x00000100
+# endif
#endif
#include <windows.h>
@@ -99,6 +102,31 @@ bool AdminAuthorization::hasAdminRights()
return isInAdminGroup;
}
+//copied from qsystemerror.cpp in Qt
+static QString windowsErrorString(int errorCode)
+{
+ QString ret;
+ wchar_t *string = 0;
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ errorCode,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPWSTR)&string,
+ 0,
+ NULL);
+ ret = QString::fromWCharArray(string);
+ LocalFree((HLOCAL)string);
+
+ if (ret.isEmpty() && errorCode == ERROR_MOD_NOT_FOUND)
+ ret = QString::fromLatin1("The specified module could not be found.");
+
+ ret.append(QLatin1String(" (0x"));
+ ret.append(QString::number(uint(errorCode), 16).rightJustified(8, QLatin1Char('0')));
+ ret.append(QLatin1String(")"));
+
+ return ret;
+}
+
bool AdminAuthorization::execute(QWidget *, const QString &program, const QStringList &arguments)
{
DeCoInitializer _;
@@ -112,10 +140,16 @@ bool AdminAuthorization::execute(QWidget *, const QString &program, const QStrin
shellExecuteInfo.lpFile = (wchar_t *)file.utf16();
shellExecuteInfo.cbSize = sizeof(SHELLEXECUTEINFOW);
shellExecuteInfo.lpParameters = (wchar_t *)args.utf16();
+ shellExecuteInfo.fMask = SEE_MASK_NOASYNC;
qDebug() << QString::fromLatin1("Starting elevated process %1 with arguments: %2.").arg(file, args);
- ShellExecuteExW(&shellExecuteInfo);
- qDebug() << "Finished starting elevated process.";
- return GetLastError() == ERROR_SUCCESS;
+ if (ShellExecuteExW(&shellExecuteInfo)) {
+ qDebug() << "Finished starting elevated process.";
+ return true;
+ } else {
+ qWarning() << QString::fromLatin1("Error while starting elevated process: %1, "
+ "Error: %2").arg(program, windowsErrorString(GetLastError()));
+ }
+ return false;
}
diff --git a/src/libs/installer/adminauthorization_x11.cpp b/src/libs/installer/adminauthorization_x11.cpp
index 71a66cd83..6d5a52357 100644
--- a/src/libs/installer/adminauthorization_x11.cpp
+++ b/src/libs/installer/adminauthorization_x11.cpp
@@ -194,7 +194,7 @@ bool AdminAuthorization::execute(QWidget *parent, const QString &program, const
const QString line = QString::fromLatin1(buf, bytes);
if (re.indexIn(line) != -1) {
const QString password = getPassword(parent);
- if (password == QString()) {
+ if (password.isEmpty()) {
QByteArray pwd = password.toLatin1();
for (int i = 0; i < 3; ++i) {
::write(masterFD, pwd.data(), pwd.length());
diff --git a/src/libs/installer/binaryformat.cpp b/src/libs/installer/binaryformat.cpp
index 61429b019..1d257a1b4 100644
--- a/src/libs/installer/binaryformat.cpp
+++ b/src/libs/installer/binaryformat.cpp
@@ -256,18 +256,18 @@ qint64 QInstaller::findMagicCookie(QFile *in, quint64 magicCookie)
pre-zipped and gets delivered as it is. If it's a directory, it gets zipped by Archive.
*/
Archive::Archive(const QString &path)
- : m_device(0),
- m_isTempFile(false),
- m_path(path),
- m_name(QFileInfo(path).fileName().toUtf8())
+ : m_device(0)
+ , m_isTempFile(false)
+ , m_path(path)
+ , m_name(QFileInfo(path).fileName().toUtf8())
{
}
Archive::Archive(const QByteArray &identifier, const QByteArray &data)
- : m_device(0),
- m_isTempFile(true),
- m_path(generateTemporaryFileName()),
- m_name(identifier)
+ : m_device(0)
+ , m_isTempFile(true)
+ , m_path(generateTemporaryFileName())
+ , m_name(identifier)
{
QFile file(m_path);
file.open(QIODevice::WriteOnly);
@@ -278,10 +278,10 @@ Archive::Archive(const QByteArray &identifier, const QByteArray &data)
Creates an archive identified by \a identifier providing a data \a segment within a \a device.
*/
Archive::Archive(const QByteArray &identifier, const QSharedPointer<QFile> &device, const Range<qint64> &segment)
- : m_device(device),
- m_segment(segment),
- m_isTempFile(false),
- m_name(identifier)
+ : m_device(device)
+ , m_segment(segment)
+ , m_isTempFile(false)
+ , m_name(identifier)
{
}
diff --git a/src/libs/installer/binaryformat.h b/src/libs/installer/binaryformat.h
index 49be60a06..d255ea8a9 100644
--- a/src/libs/installer/binaryformat.h
+++ b/src/libs/installer/binaryformat.h
@@ -203,7 +203,7 @@ class INSTALLER_EXPORT BinaryContentPrivate : public QSharedData
{
public:
BinaryContentPrivate();
- BinaryContentPrivate(const QString &path);
+ explicit BinaryContentPrivate(const QString &path);
BinaryContentPrivate(const BinaryContentPrivate &other);
~BinaryContentPrivate();
diff --git a/src/libs/installer/binaryformatengine.cpp b/src/libs/installer/binaryformatengine.cpp
index e2fd00b82..416e8ca56 100644
--- a/src/libs/installer/binaryformatengine.cpp
+++ b/src/libs/installer/binaryformatengine.cpp
@@ -49,9 +49,9 @@ class StringListIterator : public QAbstractFileEngineIterator
{
public:
StringListIterator( const QStringList &list, QDir::Filters filters, const QStringList &nameFilters)
- : QAbstractFileEngineIterator(filters, nameFilters),
- list(list),
- index(-1)
+ : QAbstractFileEngineIterator(filters, nameFilters)
+ , list(list)
+ , index(-1)
{
}
diff --git a/src/libs/installer/binaryformatenginehandler.cpp b/src/libs/installer/binaryformatenginehandler.cpp
index e6bf7864f..d872ed229 100644
--- a/src/libs/installer/binaryformatenginehandler.cpp
+++ b/src/libs/installer/binaryformatenginehandler.cpp
@@ -69,8 +69,8 @@ BinaryFormatEngineHandler::BinaryFormatEngineHandler(const ComponentIndex &index
}
BinaryFormatEngineHandler::BinaryFormatEngineHandler(const BinaryFormatEngineHandler &other)
- : QAbstractFileEngineHandler(),
- d(new Private(other.d->index))
+ : QAbstractFileEngineHandler()
+ , d(new Private(other.d->index))
{
s_instance = this;
}
diff --git a/src/libs/installer/component.cpp b/src/libs/installer/component.cpp
index f9e809565..ed815d18a 100644
--- a/src/libs/installer/component.cpp
+++ b/src/libs/installer/component.cpp
@@ -39,14 +39,16 @@
**
**************************************************************************/
#include "component.h"
+#include "scriptengine.h"
#include "errors.h"
#include "fileutils.h"
#include "fsengineclient.h"
+#include "globals.h"
#include "lib7z_facade.h"
-#include "packagemanagercore.h"
-#include "qinstallerglobal.h"
#include "messageboxhandler.h"
+#include "packagemanagercore.h"
+#include "settings.h"
#include <kdupdaterupdatesourcesinfo.h>
#include <kdupdaterupdateoperationfactory.h>
@@ -75,11 +77,132 @@ static const QLatin1String scCurrentState("CurrentState");
static const QLatin1String scForcedInstallation("ForcedInstallation");
/*!
- \class QInstaller::Component
- Component describes a component within the installer.
+ \qmltype Component
+ \inqmlmodule scripting
+
+ \brief Represents an installer component in Qt Script.
+
+ The object represents the component an install script belongs to. It is accessible through the
+ global \c component variable:
+
+ \code
+ function Component()
+ {
+ print("component: " + component.displayName);
+ }
+ \endcode
+*/
+
+/*!
+ \qmlproperty string Component::name
+
+ Returns the name of the component as set in the \c <Name> tag of the package
+ information file.
+*/
+
+/*!
+ \qmlproperty string Component::displayName
+
+ Returns the name of the component as shown in the user interface.
+*/
+
+/*!
+ \qmlproperty boolean Component::selected
+
+ Indicates whether the component is currently selected.
+*/
+
+/*!
+ \qmlproperty boolean Component::autoCreateOperations
+
+ Specifies whether some standard operations for the component should be
+ automatically created when the installation starts. The default is \c true.
+*/
+
+/*!
+ \qmlproperty stringlist Component::archives
+
+ Returns the list of archive URL's (prefixed with \c installer://) registered
+ for the component.
+
+ \sa addDownloadableArchive, removeDownloadableArchive
+*/
+
+/*!
+ \qmlproperty stringlist Component::dependencies
+
+ This read-only property contains components this component depends on.
+*/
+
+/*!
+ \qmlproperty stringlist Component::autoDependencies
+
+ Returns the value of the \c <AutoDependsOn> tag in the package information file.
+*/
+
+/*!
+ \qmlproperty boolean Component::fromOnlineRepository
+
+ Returns whether this component has been loaded from an online repository.
+
+ \sa isFromOnlineRepository
+*/
+
+/*!
+ \qmlproperty url Component::repositoryUrl
+
+ Returns the repository URL the component is downloaded from.
+ When this component is not downloaded from an online repository, returns an empty #QUrl.
+
+*/
+
+/*!
+ \qmlproperty boolean Component::default
+
+ This read-only property indicates if the component is a default one.
+
+ \note Always \c false for virtual components.
+
+ \sa isDefault
*/
/*!
+ \qmlproperty boolean Component::installed
+
+ This read-only property returns if the component is installed.
+
+ \sa isInstalled
+*/
+
+/*!
+ \qmlproperty boolean Component::enabled
+
+ Indicates whether the component is currently enabled. The property is both readable and writable.
+*/
+
+/*!
+ \qmlsignal Component::loaded()
+
+ Emitted when the component has been loaded.
+*/
+
+
+/*!
+ \qmlsignal Component::selectedChanged(boolean isSelected)
+
+ Emitted when the component selection has changed to \a isSelected.
+*/
+
+/*!
+ \qmlsignal Component::valueChanged(string key, string value)
+
+ Emitted when the variable with name \a key has changed to \a value.
+
+ \sa setValue
+*/
+
+
+/*!
Constructor. Creates a new Component inside of \a installer.
*/
Component::Component(PackageManagerCore *core)
@@ -146,15 +269,14 @@ void Component::loadDataFromPackage(const LocalPackage &package)
void Component::loadDataFromPackage(const Package &package)
{
Q_ASSERT(&package);
- Q_ASSERT(!package.name().isEmpty());
setValue(scName, package.data(scName).toString());
setValue(scDisplayName, package.data(scDisplayName).toString());
setValue(scDescription, package.data(scDescription).toString());
setValue(scDefault, package.data(scDefault).toString());
setValue(scAutoDependOn, package.data(scAutoDependOn).toString());
- setValue(scCompressedSize, QString::number(package.compressedSize()));
- setValue(scUncompressedSize, QString::number(package.uncompressedSize()));
+ setValue(scCompressedSize, package.data(scCompressedSize).toString());
+ setValue(scUncompressedSize, package.data(scUncompressedSize).toString());
setValue(scRemoteVersion, package.data(scRemoteVersion).toString());
setValue(scInheritVersion, package.data(scInheritVersion).toString());
setValue(scDependencies, package.data(scDependencies).toString());
@@ -181,14 +303,14 @@ void Component::loadDataFromPackage(const Package &package)
setCheckState(Qt::Checked);
}
- setLocalTempPath(QInstaller::pathFromUrl(package.sourceInfo().url));
- const QStringList uis = package.data(QLatin1String("UserInterfaces")).toString().split(scCommaRegExp,
- QString::SkipEmptyParts);
+ setLocalTempPath(QInstaller::pathFromUrl(package.sourceInfoUrl()));
+ const QStringList uis = package.data(QLatin1String("UserInterfaces")).toString()
+ .split(QInstaller::commaRegExp(), QString::SkipEmptyParts);
if (!uis.isEmpty())
loadUserInterfaces(QDir(QString::fromLatin1("%1/%2").arg(localTempPath(), name())), uis);
- const QStringList qms = package.data(QLatin1String("Translations")).toString().split(scCommaRegExp,
- QString::SkipEmptyParts);
+ const QStringList qms = package.data(QLatin1String("Translations")).toString()
+ .split(QInstaller::commaRegExp(), QString::SkipEmptyParts);
if (!qms.isEmpty())
loadTranslations(QDir(QString::fromLatin1("%1/%2").arg(localTempPath(), name())), qms);
@@ -227,9 +349,11 @@ QHash<QString,QString> Component::variables() const
}
/*!
+ \qmlmethod string Component::value(string key, string value = "")
+
Returns the value of variable name \a key. If \a key is not known yet, \a defaultValue is returned.
Note: If a component is virtual and you ask for the component value with key "Default", it will always
- return false.
+ return \c false.
*/
QString Component::value(const QString &key, const QString &defaultValue) const
{
@@ -239,6 +363,8 @@ QString Component::value(const QString &key, const QString &defaultValue) const
}
/*!
+ \qmlmethod void Component::setValue(string key, string value)
+
Sets the value of the variable with \a key to \a value.
*/
void Component::setValue(const QString &key, const QString &value)
@@ -264,8 +390,8 @@ PackageManagerCore *Component::packageManagerCore() const
}
/*!
- Returns the parent of this component. If this component is com.nokia.sdk.qt, its
- parent is com.nokia.sdk, as far as this exists.
+ Returns the parent of this component. If this component is org.qt-project.sdk.qt, its
+ parent is org.qt-project.sdk, as far as this exists.
*/
Component *Component::parentComponent() const
{
@@ -308,23 +434,22 @@ void Component::removeComponent(Component *component)
}
/*!
- Returns a list of child components. If \a recursive is set to true, the returned list
- contains not only the direct children, but all ancestors. Note: The returned list does include ALL
- children, non virtual components as well as virtual components.
+ Returns a list of child components. If \a kind is set to DirectChildrenOnly, the returned list contains
+ only the direct children, if set to Descendants it will also include all descendants of the components
+ children. Note: The returned list does include ALL children, non virtual components as well as virtual
+ components.
*/
-QList<Component*> Component::childComponents(bool recursive, RunMode runMode) const
+QList<Component *> Component::childComponents(Kind kind) const
{
- QList<Component*> result;
- if (runMode == UpdaterMode)
- return result;
+ if (d->m_core->isUpdater())
+ return QList<Component*>();
- if (!recursive)
- return d->m_allChildComponents;
+ QList<Component *> result = d->m_allChildComponents;
+ if (kind == DirectChildrenOnly)
+ return result;
- foreach (Component *component, d->m_allChildComponents) {
- result.append(component);
- result += component->childComponents(true, runMode);
- }
+ foreach (Component *component, d->m_allChildComponents)
+ result += component->childComponents(kind);
return result;
}
@@ -352,50 +477,25 @@ void Component::loadComponentScript()
}
/*!
- Loads the script at \a fileName into this component's script engine. The installer and all its
+ Loads the script at \a fileName into ScriptEngine. The installer and all its
components as well as other useful stuff are being exported into the script.
Read \link componentscripting Component Scripting \endlink for details.
- \throws Error when either the script at \a fileName couldn't be opened, or the QScriptEngine
+ Throws an error when either the script at \a fileName couldn't be opened, or the QScriptEngine
couldn't evaluate the script.
*/
void Component::loadComponentScript(const QString &fileName)
{
- QFile file(fileName);
- if (!file.open(QIODevice::ReadOnly)) {
- throw Error(tr("Could not open the requested script file at %1: %2.").arg(fileName, file.errorString()));
- }
+ ScriptEngine *scriptEngine = d->m_core->scriptEngine();
- d->scriptEngine()->evaluate(QLatin1String(file.readAll()), fileName);
- if (d->scriptEngine()->hasUncaughtException()) {
- throw Error(tr("Exception while loading the component script: %1")
- .arg(uncaughtExceptionString(d->scriptEngine()/*, QFileInfo(file).absoluteFilePath()*/)));
- }
-
- const QList<Component*> components = d->m_core->availableComponents();
- QScriptValue comps = d->scriptEngine()->newArray(components.count());
- for (int i = 0; i < components.count(); ++i)
- comps.setProperty(i, d->scriptEngine()->newQObject(components[i]));
-
- d->scriptEngine()->globalObject().property(QLatin1String("installer"))
- .setProperty(QLatin1String("components"), comps);
+ // introduce the component object as javascript value and call the name to check that it
+ // was successful
+ QString scriptInjection(QString::fromLatin1(
+ "var component = installer.componentByName('%1'); component.name;").arg(name()));
- QScriptValue comp = d->scriptEngine()->evaluate(QLatin1String("Component"), fileName);
- if (!d->scriptEngine()->hasUncaughtException()) {
- d->m_scriptComponent = comp;
- d->m_scriptComponent.construct();
- }
-
- //evaluate("Component") and construct can have an exception
- if (d->scriptEngine()->hasUncaughtException()) {
- throw Error(tr("Exception while loading the component script: %1")
- .arg(uncaughtExceptionString(d->scriptEngine(), QFileInfo(file).absoluteFilePath())));
- }
+ d->m_scriptContext = scriptEngine->loadInConext(QLatin1String("Component"), fileName, scriptInjection);
emit loaded();
languageChanged();
-
- //Solves a freeze seen on updater/ package manger restart.
- QCoreApplication::processEvents();
}
/*!
@@ -405,58 +505,38 @@ void Component::loadComponentScript(const QString &fileName)
*/
void Component::languageChanged()
{
- callScriptMethod(QLatin1String("retranslateUi"));
-}
-
-/*!
- Tries to call the method with \a name within the script and returns the result. If the method
- doesn't exist, an invalid result is returned. If the method has an uncaught exception, its
- string representation is thrown as an Error exception.
-
- \note The method is not called, if the current script context is the same method, to avoid
- infinite recursion.
-*/
-QScriptValue Component::callScriptMethod(const QString &methodName, const QScriptValueList &arguments) const
-{
- if (!d->m_unexistingScriptMethods.value(methodName, true))
- return QScriptValue();
-
- // don't allow such a recursion
- if (d->scriptEngine()->currentContext()->backtrace().first().startsWith(methodName))
- return QScriptValue();
-
- QScriptValue method = d->m_scriptComponent.property(QString::fromLatin1("prototype"))
- .property(methodName);
- if (!method.isValid()) // this marks the method to be called not any longer
- d->m_unexistingScriptMethods[methodName] = false;
-
- const QScriptValue result = method.call(d->m_scriptComponent, arguments);
- if (!result.isValid())
- return result;
-
- if (d->scriptEngine()->hasUncaughtException())
- throw Error(uncaughtExceptionString(d->scriptEngine()/*, name()*/));
-
- return result;
+ d->m_core->scriptEngine()->callScriptMethod(d->m_scriptContext, QLatin1String("retranslateUi"));
}
/*!
Loads the translations matching the name filters \a qms inside \a directory. Only translations
with a \link QFileInfo::baseName() baseName \endlink matching the current locales \link
QLocale::name() name \endlink are loaded.
- Read \ref componenttranslation for details.
+ Read \l componenttranslation for details.
*/
void Component::loadTranslations(const QDir &directory, const QStringList &qms)
{
QDirIterator it(directory.path(), qms, QDir::Files);
+ const QStringList translations = d->m_core->settings().translations();
+ const QString uiLanguage = QLocale().uiLanguages().value(0, QLatin1String("en_us"))
+ .replace(QLatin1Char('-'), QLatin1Char('_'));
while (it.hasNext()) {
const QString filename = it.next();
- if (QFileInfo(filename).baseName().toLower() != QLocale().name().toLower())
- continue;
+ const QString basename = QFileInfo(filename).baseName();
+ if (!uiLanguage.startsWith(QFileInfo(filename).baseName(), Qt::CaseInsensitive))
+ continue; // do not load the file if it does not match the UI language
+
+ if (!translations.isEmpty()) {
+ bool found = false;
+ foreach (const QString &translation, translations)
+ found |= translation.startsWith(basename, Qt::CaseInsensitive);
+ if (!found) // don't load the file if it does match the UI language but is not allowed to be used
+ continue;
+ }
QScopedPointer<QTranslator> translator(new QTranslator(this));
if (!translator->load(filename))
- throw Error(tr("Could not open the requested translation file at %1").arg(filename));
+ throw Error(tr("Could not open the requested translation file '%1'.").arg(filename));
qApp->installTranslator(translator.take());
}
}
@@ -464,7 +544,7 @@ void Component::loadTranslations(const QDir &directory, const QStringList &qms)
/*!
Loads the user interface files matching the name filters \a uis inside \a directory. The loaded
interface can be accessed via userInterfaces by using the class name set in the ui file.
- Read \ref componentuserinterfaces for details.
+ Read \l componentuserinterfaces for details.
*/
void Component::loadUserInterfaces(const QDir &directory, const QStringList &uis)
{
@@ -480,15 +560,23 @@ void Component::loadUserInterfaces(const QDir &directory, const QStringList &uis
while (it.hasNext()) {
QFile file(it.next());
if (!file.open(QIODevice::ReadOnly)) {
- throw Error(tr("Could not open the requested UI file at %1: %2").arg(it.fileName(),
+ throw Error(tr("Could not open the requested UI file '%1'. Error: %2").arg(it.fileName(),
file.errorString()));
}
static QUiLoader loader;
loader.setTranslationEnabled(true);
loader.setLanguageChangeEnabled(true);
- QWidget *const w = loader.load(&file, MessageBoxHandler::currentBestSuitParent());
- d->m_userInterfaces.insert(w->objectName(), w);
+ QWidget *const widget = loader.load(&file, 0);
+ if (!widget) {
+ throw Error(tr("Could not load the requested UI file '%1'. Error: %2").arg(it.fileName(),
+#if QT_VERSION < 0x050000
+ tr("An error has occurred while reading the UI file.")));
+#else
+ loader.errorString()));
+#endif
+ }
+ d->m_userInterfaces.insert(widget->objectName(), widget);
}
}
@@ -502,7 +590,7 @@ void Component::loadLicenses(const QString &directory, const QHash<QString, QVar
for (it = licenseHash.begin(); it != licenseHash.end(); ++it) {
const QString &fileName = it.value().toString();
- if (!ProductKeyCheck::instance()->isValidLicense(fileName))
+ if (!ProductKeyCheck::instance(d->m_core)->isValidLicenseTextFile(fileName))
continue;
QFileInfo fileInfo(fileName);
@@ -513,7 +601,7 @@ void Component::loadLicenses(const QString &directory, const QHash<QString, QVar
qDebug("Unable to open translated license file. Using untranslated fallback.");
file.setFileName(directory + fileName);
if (!file.open(QIODevice::ReadOnly)) {
- throw Error(tr("Could not open the requested license file at %1: %2").arg(fileName,
+ throw Error(tr("Could not open the requested license file '%1'. Error: %2").arg(fileName,
file.errorString()));
}
}
@@ -523,8 +611,11 @@ void Component::loadLicenses(const QString &directory, const QHash<QString, QVar
}
}
+
/*!
- Contains a list of all user interface class names known to this component.
+ \qmlproperty stringlist Component::userInterfaces
+
+ Returns a list of all user interface class names known to this component.
*/
QStringList Component::userInterfaces() const
{
@@ -537,6 +628,8 @@ QHash<QString, QPair<QString, QString> > Component::licenses() const
}
/*!
+ \qmlmethod QWidget Component::userInterface(string name)
+
Returns the QWidget created for \a name or 0 if the widget already has been deleted or cannot be found.
*/
QWidget *Component::userInterface(const QString &name) const
@@ -545,9 +638,11 @@ QWidget *Component::userInterface(const QString &name) const
}
/*!
+ \qmlmethod void Component::createOperationsForPath(string path)
+
Creates all operations needed to install this component's \a path. \a path is a full qualified
- filename including the component's name. This methods gets called from
- Component::createOperationsForArchive. You can override this method by providing a method with
+ filename including the component's name. This method gets called from
+ Component::createOperationsForArchive. You can override it by providing a method with
the same name in the component script.
\note RSA signature files are omitted by this method.
@@ -565,8 +660,10 @@ void Component::createOperationsForPath(const QString &path)
return;
// the script can override this method
- if (callScriptMethod(QLatin1String("createOperationsForPath"), QScriptValueList() << path).isValid())
+ if (d->m_core->scriptEngine()->callScriptMethod(d->m_scriptContext,
+ QLatin1String("createOperationsForPath"), QScriptValueList() << path).isValid()) {
return;
+ }
QString target;
static const QString prefix = QString::fromLatin1("installer://");
@@ -587,6 +684,8 @@ void Component::createOperationsForPath(const QString &path)
}
/*!
+ \qmlmethod void Component::createOperationsForArchive(string archive)
+
Creates all operations needed to install this component's \a archive. This method gets called
from Component::createOperations. You can override this method by providing a method with the
same name in the component script.
@@ -606,8 +705,10 @@ void Component::createOperationsForArchive(const QString &archive)
return;
// the script can override this method
- if (callScriptMethod(QLatin1String("createOperationsForArchive"), QScriptValueList() << archive).isValid())
+ if (d->m_core->scriptEngine()->callScriptMethod(d->m_scriptContext,
+ QLatin1String("createOperationsForArchive"), QScriptValueList() << archive).isValid()) {
return;
+ }
const bool isZip = Lib7z::isSupportedArchive(archive);
@@ -619,15 +720,34 @@ void Component::createOperationsForArchive(const QString &archive)
}
}
+/*!
+ \qmlmethod void Component::beginInstallation()
+
+ Starts the component installation.
+ You can override this method by providing a method with the same name in the component script.
+
+ \code
+ Component.prototype.beginInstallation = function()
+ {
+ // call default implementation
+ component.beginInstallation();
+ // ...
+ }
+ \endcode
+
+*/
void Component::beginInstallation()
{
// the script can override this method
- if (callScriptMethod(QLatin1String("beginInstallation")).isValid()) {
+ if (d->m_core->scriptEngine()->callScriptMethod(d->m_scriptContext,
+ QLatin1String("beginInstallation")).isValid()) {
return;
}
}
/*!
+ \qmlmethod void Component::createOperations()
+
Creates all operations needed to install this component.
You can override this method by providing a method with the same name in the component script.
@@ -638,7 +758,8 @@ void Component::beginInstallation()
void Component::createOperations()
{
// the script can override this method
- if (callScriptMethod(QLatin1String("createOperations")).isValid()) {
+ if (d->m_core->scriptEngine()->callScriptMethod(d->m_scriptContext,
+ QLatin1String("createOperations")).isValid()) {
d->m_operationsCreated = true;
return;
}
@@ -650,8 +771,10 @@ void Component::createOperations()
}
/*!
+ \qmlmethod void Component::registerPathForUninstallation(string path, boolean wipe = false)
+
Registers the file or directory at \a path for being removed when this component gets uninstalled.
- In case of a directory, this will be recursive. If \a wipe is set to true, the directory will
+ In case of a directory, this will be recursive. If \a wipe is set to \c true, the directory will
also be deleted if it contains changes done by the user after installation.
*/
void Component::registerPathForUninstallation(const QString &path, bool wipe)
@@ -660,6 +783,8 @@ void Component::registerPathForUninstallation(const QString &path, bool wipe)
}
/*!
+ \qmlmethod QList<QPair<string, boolean> > Component::pathesForUninstallation()
+
Returns the list of paths previously registered for uninstallation with
#registerPathForUninstallation.
*/
@@ -682,11 +807,13 @@ QStringList Component::archives() const
}
/*!
+ \qmlmethod void Component::addDownloadableArchive(string path)
+
Adds the archive \a path to this component. This can only be called when this component was
downloaded from an online repository. When adding \a path, it will be downloaded from the
repository when the installation starts.
- Read \ref sec_repogen for details. \sa fromOnlineRepository
+ \sa removeDownloadableArchive, fromOnlineRepository, archives
*/
void Component::addDownloadableArchive(const QString &path)
{
@@ -697,10 +824,12 @@ void Component::addDownloadableArchive(const QString &path)
}
/*!
+ \qmlmethod void Component::removeDownloadableArchive(string path)
+
Removes the archive \a path previously added via addDownloadableArchive from this component.
This can only be called when this component was downloaded from an online repository.
- Read \ref sec_repogen for details.
+ \sa addDownloadableArchive, fromOnlineRepository, archives
*/
void Component::removeDownloadableArchive(const QString &path)
{
@@ -717,7 +846,9 @@ QStringList Component::downloadableArchives() const
}
/*!
- Adds a request for quitting the process @p process before installing/updating/uninstalling the
+ \qmlmethod void Component::addStopProcessForUpdateRequest(string process)
+
+ Adds a request for quitting the process \a process before installing/updating/uninstalling the
component.
*/
void Component::addStopProcessForUpdateRequest(const QString &process)
@@ -726,7 +857,9 @@ void Component::addStopProcessForUpdateRequest(const QString &process)
}
/*!
- Removes the request for quitting the process @p process again.
+ \qmlmethod void Component::removeStopProcessForUpdateRequest(string process)
+
+ Removes the request for quitting the process \a process again.
*/
void Component::removeStopProcessForUpdateRequest(const QString &process)
{
@@ -734,7 +867,9 @@ void Component::removeStopProcessForUpdateRequest(const QString &process)
}
/*!
- Convenience: Add/remove request depending on @p requested (add if @p true, remove if @p false).
+ \qmlmethod void Component::setStopProcessForUpdateRequest(string process, boolean requested)
+
+ Convenience: Add/remove request depending on \a requested (add if \c true, remove if \c false).
*/
void Component::setStopProcessForUpdateRequest(const QString &process, bool requested)
{
@@ -753,7 +888,7 @@ QStringList Component::stopProcessForUpdateRequests() const
}
/*!
- Returns the operations needed to install this component. If autoCreateOperations is true,
+ Returns the operations needed to install this component. If autoCreateOperations is \c true,
createOperations is called, if no operations have been auto-created yet.
*/
OperationList Component::operations() const
@@ -812,7 +947,7 @@ bool Component::operationsCreatedSuccessfully() const
return d->m_operationsCreatedSuccessfully;
}
-Operation *Component::createOperation(const QString &operation, const QString &parameter1,
+Operation *Component::createOperation(const QString &operationName, const QString &parameter1,
const QString &parameter2, const QString &parameter3, const QString &parameter4, const QString &parameter5,
const QString &parameter6, const QString &parameter7, const QString &parameter8, const QString &parameter9,
const QString &parameter10)
@@ -839,36 +974,35 @@ Operation *Component::createOperation(const QString &operation, const QString &p
if (!parameter10.isNull())
arguments.append(parameter10);
- return createOperation(operation, arguments);
+ return createOperation(operationName, arguments);
}
-Operation *Component::createOperation(const QString &operation, const QStringList &parameters)
+Operation *Component::createOperation(const QString &operationName, const QStringList &parameters)
{
- Operation *op = KDUpdater::UpdateOperationFactory::instance().create(operation);
- if (op == 0) {
+ Operation *operation = KDUpdater::UpdateOperationFactory::instance().create(operationName);
+ if (operation == 0) {
const QMessageBox::StandardButton button =
MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
QLatin1String("OperationDoesNotExistError"), tr("Error"), tr("Error: Operation %1 does not exist")
- .arg(operation), QMessageBox::Abort | QMessageBox::Ignore);
+ .arg(operationName), QMessageBox::Abort | QMessageBox::Ignore);
if (button == QMessageBox::Abort)
d->m_operationsCreatedSuccessfully = false;
- return op;
+ return operation;
}
- if (op->name() == QLatin1String("Delete"))
- op->setValue(QLatin1String("performUndo"), false);
- op->setValue(QLatin1String("installer"), qVariantFromValue(d->m_core));
-
- op->setArguments(d->m_core->replaceVariables(parameters));
+ if (operation->name() == QLatin1String("Delete"))
+ operation->setValue(QLatin1String("performUndo"), false);
+ operation->setValue(QLatin1String("installer"), qVariantFromValue(d->m_core));
- return op;
+ operation->setArguments(d->m_core->replaceVariables(parameters));
+ operation->setValue(QLatin1String("component"), name());
+ return operation;
}
/*!
- Creates and adds an installation operation for \a operation. Add any number of \a parameter1,
- \a parameter2, \a parameter3, \a parameter4, \a parameter5 and \a parameter6. The contents of
- the parameters get variables like "@TargetDir@" replaced with their values, if contained.
- \sa installeroperations
+ \qmlmethod boolean Component::addOperation(string operation, string parameter1 = "", string parameter2 = "", ..., string parameter10 = "")
+
+ Convenience method for calling addOperation(string, stringlist) with up to 10 arguments.
*/
bool Component::addOperation(const QString &operation, const QString &parameter1, const QString &parameter2,
const QString &parameter3, const QString &parameter4, const QString &parameter5, const QString &parameter6,
@@ -883,6 +1017,13 @@ bool Component::addOperation(const QString &operation, const QString &parameter1
return false;
}
+/*!
+ \qmlmethod boolean Component::addOperation(string operation, stringlist parameters)
+
+ Creates and adds an installation operation for \a operation. Add any number of parameters.
+ The contents of the parameters get variables like "@TargetDir@" replaced with their values,
+ if contained.
+*/
bool Component::addOperation(const QString &operation, const QStringList &parameters)
{
if (Operation *op = createOperation(operation, parameters)) {
@@ -894,11 +1035,9 @@ bool Component::addOperation(const QString &operation, const QStringList &parame
}
/*!
- Creates and adds an installation operation for \a operation. Add any number of \a parameter1,
- \a parameter2, \a parameter3, \a parameter4, \a parameter5 and \a parameter6. The contents of
- the parameters get variables like "@TargetDir@" replaced with their values, if contained.
- \a operation is executed with elevated rights.
- \sa installeroperations
+ \qmlmethod boolean Component::addElevatedOperation(string operation, string parameter1 = "", string parameter2 = "", ..., string parameter10 = "")
+
+ Convenience method for calling addElevatedOperation(string, stringlist) with up to 10 arguments.
*/
bool Component::addElevatedOperation(const QString &operation, const QString &parameter1,
const QString &parameter2, const QString &parameter3, const QString &parameter4, const QString &parameter5,
@@ -914,6 +1053,14 @@ bool Component::addElevatedOperation(const QString &operation, const QString &pa
return false;
}
+/*!
+ \qmlmethod boolean Component::addElevatedOperation(string operation, stringlist parameters)
+
+ Creates and adds an installation operation for \a operation. Add any number of parameters.
+ The contents of the parameters get variables like "@TargetDir@" replaced with their values,
+ if contained. \a operation is executed with elevated rights.
+
+*/
bool Component::addElevatedOperation(const QString &operation, const QStringList &parameters)
{
if (Operation *op = createOperation(operation, parameters)) {
@@ -926,7 +1073,7 @@ bool Component::addElevatedOperation(const QString &operation, const QStringList
/*!
Specifies whether operations should be automatically created when the installation starts. This
- would be done by calling #createOperations. If you set this to false, it's completely up to the
+ would be done by calling #createOperations. If you set this to \c false, it is completely up to the
component's script to create all operations.
*/
bool Component::autoCreateOperations() const
@@ -934,6 +1081,11 @@ bool Component::autoCreateOperations() const
return d->m_autoCreateOperations;
}
+/*!
+ \qmlmethod void Component::setAutoCreateOperations(boolean autoCreateOperations)
+
+ Setter for the \l autoCreateOperations property.
+ */
void Component::setAutoCreateOperations(bool autoCreateOperations)
{
d->m_autoCreateOperations = autoCreateOperations;
@@ -945,9 +1097,7 @@ bool Component::isVirtual() const
}
/*!
- \property Component::selected
- Specifies whether this component is selected for installation. Get this property's value by using
- %isSelected(), and set it using %setSelected().
+ Specifies whether this component is selected for installation.
*/
bool Component::isSelected() const
{
@@ -967,19 +1117,31 @@ void Component::setValidatorCallbackName(const QString &name)
bool Component::validatePage()
{
if (!validatorCallbackName.isEmpty())
- return callScriptMethod(validatorCallbackName).toBool();
+ return d->m_core->scriptEngine()->callScriptMethod(d->m_scriptContext, validatorCallbackName).toBool();
return true;
}
/*!
+ \qmlmethod void Component::setSelected(boolean selected)
+
Marks the component for installation. Emits the selectedChanged() signal if the check state changes.
+
+ \note This method does not do anything and is deprecated since 1.3.
*/
void Component::setSelected(bool selected)
{
Q_UNUSED(selected)
- qDebug() << Q_FUNC_INFO << QString::fromLatin1("on \"%1\" is deprecated!!!").arg(d->m_componentName);
+ qDebug() << Q_FUNC_INFO << QString::fromLatin1("on '%1' is deprecated.").arg(d->m_componentName);
}
+/*!
+ \qmlmethod void Component::addDependency(string newDependency)
+
+ Adds a new component \a newDependency to the list of dependencies.
+
+ \sa dependencies
+*/
+
void Component::addDependency(const QString &newDependency)
{
QString oldDependencies = d->m_vars.value(scDependencies);
@@ -992,22 +1154,24 @@ void Component::addDependency(const QString &newDependency)
/*!
Contains this component dependencies.
- Read \ref componentdependencies for details.
+ Read \l componentdependencies for details.
*/
QStringList Component::dependencies() const
{
- return d->m_vars.value(scDependencies).split(scCommaRegExp, QString::SkipEmptyParts);
+ return d->m_vars.value(scDependencies).split(QInstaller::commaRegExp(), QString::SkipEmptyParts);
}
QStringList Component::autoDependencies() const
{
QStringList autoDependencyStringList =
- d->m_vars.value(scAutoDependOn).split(scCommaRegExp, QString::SkipEmptyParts);
+ d->m_vars.value(scAutoDependOn).split(QInstaller::commaRegExp(), QString::SkipEmptyParts);
autoDependencyStringList.removeAll(QLatin1String("script"));
return autoDependencyStringList;
}
/*!
+ \qmlmethod void Component::setInstalled()
+
Set's the components state to installed.
*/
void Component::setInstalled()
@@ -1016,8 +1180,10 @@ void Component::setInstalled()
}
/*!
- Determines if the component comes as an auto dependency. Returns true if the component needs to be
- installed.
+ \qmlmethod boolean Component::isAutoDependOn(QSet<string> componentsToInstall)
+
+ Determines if the component comes as an auto dependency. Returns \c true if the component needs
+ to be installed.
*/
bool Component::isAutoDependOn(const QSet<QString> &componentsToInstall) const
{
@@ -1031,7 +1197,8 @@ bool Component::isAutoDependOn(const QSet<QString> &componentsToInstall) const
if (autoDependOnList.first().compare(QLatin1String("script"), Qt::CaseInsensitive) == 0) {
QScriptValue valueFromScript;
try {
- valueFromScript = callScriptMethod(QLatin1String("isAutoDependOn"));
+ valueFromScript = d->m_core->scriptEngine()->callScriptMethod(d->m_scriptContext,
+ QLatin1String("isAutoDependOn"));
} catch (const Error &error) {
MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
QLatin1String("isAutoDependOnError"), tr("Can't resolve isAutoDependOn in %1"
@@ -1063,8 +1230,13 @@ bool Component::isAutoDependOn(const QSet<QString> &componentsToInstall) const
}
/*!
- Determines if the component is a default one. Note: if a component is virtual, this function will always
- return false.
+ \qmlmethod boolean Component::isDefault()
+
+ Indicates if the component is a default one.
+
+ \note Always returns \c false for virtual components.
+
+ \sa default
*/
bool Component::isDefault() const
{
@@ -1075,7 +1247,8 @@ bool Component::isDefault() const
if (d->m_vars.value(scDefault).compare(QLatin1String("script"), Qt::CaseInsensitive) == 0) {
QScriptValue valueFromScript;
try {
- valueFromScript = callScriptMethod(QLatin1String("isDefault"));
+ valueFromScript = d->m_core->scriptEngine()->callScriptMethod(d->m_scriptContext,
+ QLatin1String("isDefault"));
} catch (const Error &error) {
MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
QLatin1String("isDefaultError"), tr("Can't resolve isDefault in %1").arg(name()),
@@ -1092,6 +1265,8 @@ bool Component::isDefault() const
}
/*!
+ \qmlmethod boolean Component::isInstalled()
+
Determines if the component is installed.
*/
bool Component::isInstalled() const
@@ -1100,6 +1275,8 @@ bool Component::isInstalled() const
}
/*!
+ \qmlmethod boolean Component::installationRequested()
+
Determines if the user wants to install the component
*/
bool Component::installationRequested() const
@@ -1108,6 +1285,8 @@ bool Component::installationRequested() const
}
/*!
+ \qmlmethod void Component::setUpdateAvailable(boolean isUpdateAvailable)
+
Sets a flag that the core found an update
*/
void Component::setUpdateAvailable(bool isUpdateAvailable)
@@ -1116,6 +1295,8 @@ void Component::setUpdateAvailable(bool isUpdateAvailable)
}
/*!
+ \qmlmethod boolean Component::updateRequested()
+
Determines if the user wants to install the update for this component
*/
bool Component::updateRequested()
@@ -1124,7 +1305,9 @@ bool Component::updateRequested()
}
/*!
- Returns true if that component will be changed (update/installation/uninstallation)
+ \qmlmethod boolean Component::componentChangeRequested()
+
+ Returns \c true if that component will be changed (update/installation/uninstallation).
*/
bool Component::componentChangeRequested()
{
@@ -1133,6 +1316,8 @@ bool Component::componentChangeRequested()
/*!
+ \qmlmethod void Component::setUninstalled()
+
Sets the component state to uninstalled.
*/
void Component::setUninstalled()
@@ -1141,6 +1326,8 @@ void Component::setUninstalled()
}
/*!
+ \qmlmethod boolean Component::isUninstalled()
+
Determines if the component is uninstalled.
*/
bool Component::isUninstalled() const
@@ -1149,6 +1336,8 @@ bool Component::isUninstalled() const
}
/*!
+ \qmlmethod boolean Component::uninstallationRequested()
+
Determines if the user wants to uninstall the component.
*/
bool Component::uninstallationRequested() const
@@ -1159,10 +1348,11 @@ bool Component::uninstallationRequested() const
}
/*!
- \property Component::fromOnlineRepository
+ \qmlmethod boolean Component::isFromOnlineRepository()
- Determines whether this component has been loaded from an online repository. Get this property's
- value by using %isFromOnlineRepository. \sa addDownloadableArchive
+ Determines whether this component has been loaded from an online repository.
+
+ \sa addDownloadableArchive, fromOnlineRepository
*/
bool Component::isFromOnlineRepository() const
{
@@ -1213,6 +1403,9 @@ void Component::updateModelData(const QString &key, const QString &data)
if (key == scDisplayVersion)
setData(data, LocalDisplayVersion);
+ if (key == scReleaseDate)
+ setData(data, ReleaseDate);
+
if (key == scUncompressedSize) {
quint64 size = d->m_vars.value(scUncompressedSizeSum).toLongLong();
setData(humanReadableSize(size), UncompressedSize);
diff --git a/src/libs/installer/component.h b/src/libs/installer/component.h
index 1c8712145..eefe41ebb 100644
--- a/src/libs/installer/component.h
+++ b/src/libs/installer/component.h
@@ -85,6 +85,12 @@ class INSTALLER_EXPORT Component : public QObject, public QScriptable, public Co
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
public:
+ enum Kind
+ {
+ Descendants = 0x1000, // all descendants of the current component (children, grandchildren, etc.)
+ DirectChildrenOnly = 0x2000 // all child components of the current component
+ };
+
explicit Component(PackageManagerCore *core);
~Component();
@@ -117,7 +123,7 @@ public:
Component *parentComponent() const;
void appendComponent(Component *component);
void removeComponent(Component *component);
- QList<Component*> childComponents(bool recursive, RunMode runMode) const;
+ QList<Component*> childComponents(Component::Kind kind) const;
void loadComponentScript();
@@ -221,23 +227,19 @@ Q_SIGNALS:
void selectedChanged(bool selected);
void valueChanged(const QString &key, const QString &value);
-protected:
- QScriptValue callScriptMethod(const QString &name,
- const QScriptValueList &parameters = QScriptValueList()) const;
-
private Q_SLOTS:
void updateModelData(const QString &key, const QString &value);
private:
void setLocalTempPath(const QString &tempPath);
- Operation *createOperation(const QString &operation, const QString &parameter1 = QString(),
+ Operation *createOperation(const QString &operationName, const QString &parameter1 = QString(),
const QString &parameter2 = QString(), const QString &parameter3 = QString(),
const QString &parameter4 = QString(), const QString &parameter5 = QString(),
const QString &parameter6 = QString(), const QString &parameter7 = QString(),
const QString &parameter8 = QString(), const QString &parameter9 = QString(),
const QString &parameter10 = QString());
- Operation *createOperation(const QString &operation, const QStringList &parameters);
+ Operation *createOperation(const QString &operationName, const QStringList &parameters);
private:
QString validatorCallbackName;
diff --git a/src/libs/installer/component_p.cpp b/src/libs/installer/component_p.cpp
index 162b62c54..560cd6544 100644
--- a/src/libs/installer/component_p.cpp
+++ b/src/libs/installer/component_p.cpp
@@ -59,17 +59,16 @@ namespace QInstaller {
// -- ComponentPrivate
ComponentPrivate::ComponentPrivate(PackageManagerCore *core, Component *qq)
- : q(qq),
- m_core(core),
- m_parentComponent(0),
- m_licenseOperation(0),
- m_minimumProgressOperation(0),
- m_newlyInstalled (false),
- m_operationsCreated(false),
- m_autoCreateOperations(true),
- m_operationsCreatedSuccessfully(true),
- m_updateIsAvailable(false),
- m_scriptEngine(0)
+ : q(qq)
+ , m_core(core)
+ , m_parentComponent(0)
+ , m_licenseOperation(0)
+ , m_minimumProgressOperation(0)
+ , m_newlyInstalled (false)
+ , m_operationsCreated(false)
+ , m_autoCreateOperations(true)
+ , m_operationsCreatedSuccessfully(true)
+ , m_updateIsAvailable(false)
{
}
@@ -88,111 +87,6 @@ ComponentPrivate::~ComponentPrivate()
delete widget.data();
}
-QScriptEngine *ComponentPrivate::scriptEngine()
-{
- if (m_scriptEngine != 0)
- return m_scriptEngine;
-
-
- m_scriptEngine = new QScriptEngine(q);
-
- // register translation stuff
- m_scriptEngine->installTranslatorFunctions();
-
- // register QMessageBox::StandardButton enum in the script connection
- registerMessageBox(m_scriptEngine);
-
- // register ::WizardPage enum in the script connection
- QScriptValue qinstaller = m_scriptEngine->newArray();
- setProperty(qinstaller, QLatin1String("Introduction"), PackageManagerCore::Introduction);
- setProperty(qinstaller, QLatin1String("LicenseCheck"), PackageManagerCore::LicenseCheck);
- setProperty(qinstaller, QLatin1String("TargetDirectory"), PackageManagerCore::TargetDirectory);
- setProperty(qinstaller, QLatin1String("ComponentSelection"), PackageManagerCore::ComponentSelection);
- setProperty(qinstaller, QLatin1String("StartMenuSelection"), PackageManagerCore::StartMenuSelection);
- setProperty(qinstaller, QLatin1String("ReadyForInstallation"), PackageManagerCore::ReadyForInstallation);
- setProperty(qinstaller, QLatin1String("PerformInstallation"), PackageManagerCore::PerformInstallation);
- setProperty(qinstaller, QLatin1String("InstallationFinished"), PackageManagerCore::InstallationFinished);
- setProperty(qinstaller, QLatin1String("End"), PackageManagerCore::End);
-
- // register ::Status enum in the script connection
- setProperty(qinstaller, QLatin1String("Success"), PackageManagerCore::Success);
- setProperty(qinstaller, QLatin1String("Failure"), PackageManagerCore::Failure);
- setProperty(qinstaller, QLatin1String("Running"), PackageManagerCore::Running);
- setProperty(qinstaller, QLatin1String("Canceled"), PackageManagerCore::Canceled);
-
- // maybe used by old scripts
- setProperty(qinstaller, QLatin1String("InstallerFailed"), PackageManagerCore::Failure);
- setProperty(qinstaller, QLatin1String("InstallerSucceeded"), PackageManagerCore::Success);
- setProperty(qinstaller, QLatin1String("InstallerUnfinished"), PackageManagerCore::Unfinished);
- setProperty(qinstaller, QLatin1String("InstallerCanceledByUser"), PackageManagerCore::Canceled);
-
- QScriptValue installerObject = m_scriptEngine->newQObject(m_core);
- installerObject.setProperty(QLatin1String("componentByName"), m_scriptEngine
- ->newFunction(qInstallerComponentByName, 1));
-
- m_scriptEngine->globalObject().setProperty(QLatin1String("QInstaller"), qinstaller);
- m_scriptEngine->globalObject().setProperty(QLatin1String("installer"), installerObject);
-
- // register QDesktopServices in the script connection
- m_scriptEngine->globalObject().setProperty(QLatin1String("QDesktopServices"), getDesktopServices());
- m_scriptEngine->globalObject().setProperty(QLatin1String("component"), m_scriptEngine->newQObject(q));
-
- QScriptValue fileDialog = m_scriptEngine->newArray();
- fileDialog.setProperty(QLatin1String("getExistingDirectory"),
- m_scriptEngine->newFunction(qFileDialogGetExistingDirectory));
- m_scriptEngine->globalObject().setProperty(QLatin1String("QFileDialog"), fileDialog);
-
- return m_scriptEngine;
-}
-
-void ComponentPrivate::setProperty(QScriptValue &scriptValue, const QString &propertyName, int value)
-{
- scriptValue.setProperty(propertyName, m_scriptEngine->newVariant(value));
-}
-
-// -- private
-
-QScriptValue ComponentPrivate::getDesktopServices()
-{
- QScriptValue desktopServices = m_scriptEngine->newArray();
-#if QT_VERSION < 0x050000
- setProperty(desktopServices, QLatin1String("DesktopLocation"), QDesktopServices::DesktopLocation);
- setProperty(desktopServices, QLatin1String("DesktopLocation"), QDesktopServices::DesktopLocation);
- setProperty(desktopServices, QLatin1String("DocumentsLocation"), QDesktopServices::DocumentsLocation);
- setProperty(desktopServices, QLatin1String("FontsLocation"), QDesktopServices::FontsLocation);
- setProperty(desktopServices, QLatin1String("ApplicationsLocation"), QDesktopServices::ApplicationsLocation);
- setProperty(desktopServices, QLatin1String("MusicLocation"), QDesktopServices::MusicLocation);
- setProperty(desktopServices, QLatin1String("MoviesLocation"), QDesktopServices::MoviesLocation);
- setProperty(desktopServices, QLatin1String("PicturesLocation"), QDesktopServices::PicturesLocation);
- setProperty(desktopServices, QLatin1String("TempLocation"), QDesktopServices::TempLocation);
- setProperty(desktopServices, QLatin1String("HomeLocation"), QDesktopServices::HomeLocation);
- setProperty(desktopServices, QLatin1String("DataLocation"), QDesktopServices::DataLocation);
- setProperty(desktopServices, QLatin1String("CacheLocation"), QDesktopServices::CacheLocation);
-#else
- setProperty(desktopServices, QLatin1String("DesktopLocation"), QStandardPaths::DesktopLocation);
- setProperty(desktopServices, QLatin1String("DesktopLocation"), QStandardPaths::DesktopLocation);
- setProperty(desktopServices, QLatin1String("DocumentsLocation"), QStandardPaths::DocumentsLocation);
- setProperty(desktopServices, QLatin1String("FontsLocation"), QStandardPaths::FontsLocation);
- setProperty(desktopServices, QLatin1String("ApplicationsLocation"), QStandardPaths::ApplicationsLocation);
- setProperty(desktopServices, QLatin1String("MusicLocation"), QStandardPaths::MusicLocation);
- setProperty(desktopServices, QLatin1String("MoviesLocation"), QStandardPaths::MoviesLocation);
- setProperty(desktopServices, QLatin1String("PicturesLocation"), QStandardPaths::PicturesLocation);
- setProperty(desktopServices, QLatin1String("TempLocation"), QStandardPaths::TempLocation);
- setProperty(desktopServices, QLatin1String("HomeLocation"), QStandardPaths::HomeLocation);
- setProperty(desktopServices, QLatin1String("DataLocation"), QStandardPaths::DataLocation);
- setProperty(desktopServices, QLatin1String("CacheLocation"), QStandardPaths::CacheLocation);
-#endif
-
- desktopServices.setProperty(QLatin1String("openUrl"),
- m_scriptEngine->newFunction(qDesktopServicesOpenUrl));
- desktopServices.setProperty(QLatin1String("displayName"),
- m_scriptEngine->newFunction(qDesktopServicesDisplayName));
- desktopServices.setProperty(QLatin1String("storageLocation"),
- m_scriptEngine->newFunction(qDesktopServicesStorageLocation));
- return desktopServices;
-}
-
-
// -- ComponentModelHelper
ComponentModelHelper::ComponentModelHelper()
@@ -202,8 +96,8 @@ ComponentModelHelper::ComponentModelHelper()
}
/*!
- Returns the number of child components. Depending if virtual components are visible or not the count might
- differ from what one will get if calling Component::childComponents(...).count().
+ Returns the number of child components. Depending if virtual components are visible or not,
+ the count might differ from what one will get if calling Component::childComponents(...).count().
*/
int ComponentModelHelper::childCount() const
{
@@ -213,49 +107,38 @@ int ComponentModelHelper::childCount() const
}
/*!
- Returns the index of this component as seen from it's parent.
+ Returns the component at index position in the list. Index must be a valid position in
+ the list (i.e., index >= 0 && index < childCount()). Otherwise it returns 0.
*/
-int ComponentModelHelper::indexInParent() const
+Component *ComponentModelHelper::childAt(int index) const
{
- int index = 0;
- if (Component *parent = m_componentPrivate->m_parentComponent->parentComponent())
- index = parent->childComponents(false, AllMode).indexOf(m_componentPrivate->m_parentComponent);
- return (index >= 0 ? index : 0);
+ if (index < 0 && index >= childCount())
+ return 0;
+
+ if (m_componentPrivate->m_core->virtualComponentsVisible())
+ return m_componentPrivate->m_allChildComponents.value(index, 0);
+ return m_componentPrivate->m_childComponents.value(index, 0);
}
/*!
- Returns all children and whose children depending if virtual components are visible or not.
+ Returns all descendants of this component depending if virtual components are visible or not.
*/
-QList<Component*> ComponentModelHelper::childs() const
+QList<Component*> ComponentModelHelper::childItems() const
{
QList<Component*> *components = &m_componentPrivate->m_childComponents;
if (m_componentPrivate->m_core->virtualComponentsVisible())
components = &m_componentPrivate->m_allChildComponents;
QList<Component*> result;
- foreach (Component *component, *components) {
+ foreach (Component *const component, *components) {
result.append(component);
- result += component->childs();
+ result += component->childItems();
}
return result;
}
/*!
- Returns the component at index position in the list. Index must be a valid position in
- the list (i.e., index >= 0 && index < childCount()). Otherwise it returns 0.
-*/
-Component *ComponentModelHelper::childAt(int index) const
-{
- if (index >= 0 && index < childCount()) {
- if (m_componentPrivate->m_core->virtualComponentsVisible())
- return m_componentPrivate->m_allChildComponents.value(index, 0);
- return m_componentPrivate->m_childComponents.value(index, 0);
- }
- return 0;
-}
-
-/*!
- Determines if the components installations status can be changed. The default value is true.
+ Determines if the installation status of the component can be changed. The default value is true.
*/
bool ComponentModelHelper::isEnabled() const
{
@@ -263,7 +146,7 @@ bool ComponentModelHelper::isEnabled() const
}
/*!
- Enables oder disables ability to change the components installations status.
+ Enables or disables the ability to change the installation status of the components.
*/
void ComponentModelHelper::setEnabled(bool enabled)
{
@@ -271,7 +154,7 @@ void ComponentModelHelper::setEnabled(bool enabled)
}
/*!
- Returns whether the component is tristate; that is, if it's checkable with three separate states.
+ Returns whether the component is tri-state; that is, if it's checkable with three separate states.
The default value is false.
*/
bool ComponentModelHelper::isTristate() const
@@ -280,10 +163,10 @@ bool ComponentModelHelper::isTristate() const
}
/*!
- Sets whether the component is tristate. If tristate is true, the component is checkable with three
+ Sets whether the component is tri-state. If tri-state is true, the component is checkable with three
separate states; otherwise, the component is checkable with two states.
- (Note that this also requires that the component is checkable; see isCheckable().)
+ Note: this also requires that the component is checkable. \sa isCheckable()
*/
void ComponentModelHelper::setTristate(bool tristate)
{
diff --git a/src/libs/installer/component_p.h b/src/libs/installer/component_p.h
index 241888a3f..1da9eee1a 100644
--- a/src/libs/installer/component_p.h
+++ b/src/libs/installer/component_p.h
@@ -47,8 +47,7 @@
#include <QtCore/QPointer>
#include <QtCore/QStringList>
#include <QtCore/QUrl>
-
-#include <QtScript/QScriptEngine>
+#include <QScriptValue>
namespace QInstaller {
@@ -63,10 +62,6 @@ public:
explicit ComponentPrivate(PackageManagerCore *core, Component *qq);
~ComponentPrivate();
- QScriptEngine *scriptEngine();
-
- void setProperty(QScriptValue &scriptValue, const QString &propertyName, int value);
-
PackageManagerCore *m_core;
Component *m_parentComponent;
OperationList m_operations;
@@ -82,25 +77,18 @@ public:
QString m_componentName;
QUrl m_repositoryUrl;
QString m_localTempPath;
- QScriptValue m_scriptComponent;
+ QScriptValue m_scriptContext;
QHash<QString, QString> m_vars;
QList<Component*> m_childComponents;
QList<Component*> m_allChildComponents;
QList<Component*> m_virtualChildComponents;
QStringList m_downloadableArchives;
QStringList m_stopProcessForUpdateRequests;
- QHash<QString, bool> m_unexistingScriptMethods;
QHash<QString, QPointer<QWidget> > m_userInterfaces;
// < display name, < file name, file content > >
QHash<QString, QPair<QString, QString> > m_licenses;
QList<QPair<QString, bool> > m_pathesForUninstallation;
-
-private:
- QScriptValue getDesktopServices();
-
-private:
- QScriptEngine* m_scriptEngine;
};
@@ -111,24 +99,24 @@ class INSTALLER_EXPORT ComponentModelHelper
public:
enum Roles {
LocalDisplayVersion = Qt::UserRole + 1,
- RemoteDisplayVersion = LocalDisplayVersion + 1,
- UncompressedSize = RemoteDisplayVersion + 1
+ RemoteDisplayVersion,
+ ReleaseDate,
+ UncompressedSize
};
enum Column {
NameColumn = 0,
InstalledVersionColumn,
NewVersionColumn,
+ ReleaseDateColumn,
UncompressedSizeColumn
};
explicit ComponentModelHelper();
int childCount() const;
- int indexInParent() const;
-
- QList<Component*> childs() const;
Component* childAt(int index) const;
+ QList<Component*> childItems() const;
bool isEnabled() const;
void setEnabled(bool enabled);
diff --git a/src/libs/installer/componentmodel.cpp b/src/libs/installer/componentmodel.cpp
index a87f59c00..080e84d85 100644
--- a/src/libs/installer/componentmodel.cpp
+++ b/src/libs/installer/componentmodel.cpp
@@ -47,17 +47,18 @@
namespace QInstaller {
/*!
- \fn void defaultCheckStateChanged(bool changed)
+ \fn void checkStateChanged(const QModelIndex &index)
- This signal is emitted whenever the default check state of a model is changed. The \a changed value
- indicates whether the model has it's initial checked state or some components changed it's checked state.
+ This signal is emitted whenever the check state of a component is changed. The \a index value indicates
+ the QModelIndex representation of the component as seen from the model.
*/
/*!
- \fn void checkStateChanged(const QModelIndex &index)
+ \fn void checkStateChanged(QInstaller::ComponentModel::ModelState state)
- This signal is emitted whenever the default check state of a component is changed. The \a index value
- indicates the QModelIndex representation of the component as seen from the model.
+ This signal is emitted whenever the check state of a model is changed after all check state
+ calculations have taken place. The \a state value indicates whether the model has its default checked
+ state, all components are checked/ unchecked or some individual components checked state has changed.
*/
@@ -67,12 +68,10 @@ namespace QInstaller {
ComponentModel::ComponentModel(int columns, PackageManagerCore *core)
: QAbstractItemModel(core)
, m_core(core)
- , m_rootIndex(0)
+ , m_modelState(DefaultChecked)
{
m_headerData.insert(0, columns, QVariant());
-
connect(this, SIGNAL(modelReset()), this, SLOT(slotModelReset()));
- connect(this, SIGNAL(checkStateChanged(QModelIndex)), this, SLOT(slotCheckStateChanged(QModelIndex)));
}
/*!
@@ -83,8 +82,25 @@ ComponentModel::~ComponentModel()
}
/*!
- Returns the number of items under the given \a parent. When the parent is valid it means that rowCount is
- returning the number of items of parent.
+ Returns the item flags for the given \a index.
+
+ The class implementation returns a combination of flags that enables the item (Qt::ItemIsEnabled), allows
+ it to be selected (Qt::ItemIsSelectable) and to be checked (Qt::ItemIsUserCheckable).
+*/
+Qt::ItemFlags ComponentModel::flags(const QModelIndex &index) const
+{
+ if (!index.isValid())
+ return Qt::NoItemFlags;
+
+ if (Component *component = componentFromIndex(index))
+ return component->flags();
+
+ return Qt::ItemFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
+}
+
+/*!
+ Returns the number of items under the given \a parent. When the parent is valid it means that rowCount
+ is returning the number of items of parent.
*/
int ComponentModel::rowCount(const QModelIndex &parent) const
{
@@ -160,9 +176,9 @@ QVariant ComponentModel::data(const QModelIndex &index, int role) const
}
/*!
- Sets the \a role data for the item at \a index to \a value. Returns true if successful; otherwise returns
- false. The dataChanged() signal is emitted if the data was successfully set. The checkStateChanged() and
- defaultCheckStateChanged() signal are emitted in addition if the check state of the item is set.
+ Sets the \a role data for the item at \a index to \a value. Returns true if successful;
+ otherwise returns false. The dataChanged() signal is emitted if the data was successfully set.
+ The checkStateChanged() signals are emitted in addition if the check state of the item is set.
*/
bool ComponentModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
@@ -173,14 +189,17 @@ bool ComponentModel::setData(const QModelIndex &index, const QVariant &value, in
if (!component)
return false;
- component->setData(value, role);
-
- emit dataChanged(index, index);
if (role == Qt::CheckStateRole) {
- emit checkStateChanged(index);
- foreach (Component* comp, m_rootComponentList) {
- comp->updateUncompressedSize();
+ ComponentSet nodes = component->childItems().toSet();
+ QSet<QModelIndex> changed = updateCheckedState(nodes << component, Qt::CheckState(value.toInt()));
+ foreach (const QModelIndex &index, changed) {
+ emit dataChanged(index, index);
+ emit checkStateChanged(index);
}
+ updateAndEmitModelState(); // update the internal state
+ } else {
+ component->setData(value, role);
+ emit dataChanged(index, index);
}
return true;
@@ -217,72 +236,69 @@ bool ComponentModel::setHeaderData(int section, Qt::Orientation orientation, con
}
/*!
- Returns the item flags for the given \a index.
-
- The class implementation returns a combination of flags that enables the item (Qt::ItemIsEnabled), allows
- it to be selected (Qt::ItemIsSelectable) and to be checked (Qt::ItemIsUserCheckable).
+ Returns a list of checked components.
*/
-Qt::ItemFlags ComponentModel::flags(const QModelIndex &index) const
+QSet<Component *> ComponentModel::checked() const
{
- if (!index.isValid())
- return Qt::NoItemFlags;
-
- if (Component *component = componentFromIndex(index))
- return component->flags();
+ return m_currentCheckedState[Qt::Checked];
+}
- return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
+/*!
+ Returns a list of partially checked components.
+*/
+QSet<Component *> ComponentModel::partially() const
+{
+ return m_currentCheckedState[Qt::PartiallyChecked];
}
/*!
- Returns a pointer to the PackageManagerCore this model belongs to.
+ Returns a list of unchecked components.
*/
-PackageManagerCore *ComponentModel::packageManagerCore() const
+QSet<Component *> ComponentModel::unchecked() const
{
- return m_core;
+ return m_currentCheckedState[Qt::Unchecked];
}
/*!
- Returns true if no changes to the components checked state have been done, otherwise returns false.
+ Returns a list of components whose check state can't be changed. If package manager core is run with no
+ forced installation argument, the list will always be empty.
*/
-bool ComponentModel::defaultCheckState() const
+QSet<Component *> ComponentModel::uncheckable() const
{
- return m_initialCheckedSet == m_currentCheckedSet;
+ return m_uncheckable;
}
/*!
- Returns true if this model has checked components, otherwise returns false.
+ Returns a pointer to the PackageManagerCore this model belongs to.
*/
-bool ComponentModel::hasCheckedComponents() const
+PackageManagerCore *ComponentModel::core() const
{
- return !m_currentCheckedSet.isEmpty();
+ return m_core;
}
/*!
- Returns a list of checked components.
+ Returns the current state check state of the model.
*/
-QList<Component*> ComponentModel::checkedComponents() const
+ComponentModel::ModelState ComponentModel::checkedState() const
{
- QList<Component*> list;
- foreach (const QString &name, m_currentCheckedSet)
- list.append(componentFromIndex(indexFromComponentName(name)));
- return list;
+ return m_modelState;
}
/*!
- Translates between a given component \a name and it's associated QModelIndex. Returns the QModelIndex that
- represents the component or an invalid QModelIndex if the component does not exist in the model.
+ Translates between a given component \a name and its associated QModelIndex. Returns the QModelIndex
+ that represents the component or an invalid QModelIndex if the component does not exist in the model.
*/
QModelIndex ComponentModel::indexFromComponentName(const QString &name) const
{
if (m_indexByNameCache.isEmpty()) {
for (int i = 0; i < m_rootComponentList.count(); ++i)
- updateCache(index(i, 0, QModelIndex()));
+ collectComponents(m_rootComponentList.at(i), index(i, 0, QModelIndex()));
}
return m_indexByNameCache.value(name, QModelIndex());
}
/*!
- Translates between a given QModelIndex \a index and it's associated Component. Returns the Component if
+ Translates between a given QModelIndex \a index and its associated Component. Returns the component if
the index is valid or 0 if an invalid QModelIndex is given.
*/
Component *ComponentModel::componentFromIndex(const QModelIndex &index) const
@@ -292,242 +308,229 @@ Component *ComponentModel::componentFromIndex(const QModelIndex &index) const
return 0;
}
-// -- public slots
-
-/*!
- Invoking this slot results in an checked state for every component the has a visual representation in the
- model. Note that components are not changed if they are not checkable. The checkStateChanged() and
- defaultCheckStateChanged() signal are emitted.
-*/
-void ComponentModel::selectAll()
-{
- m_currentCheckedSet = m_currentCheckedSet.unite(select(Qt::Checked));
- emit defaultCheckStateChanged(m_initialCheckedSet != m_currentCheckedSet);
-}
-/*!
- Invoking this slot results in an unchecked state for every component the has a visual representation in
- the model. Note that components are not changed if they are not checkable. The checkStateChanged() and
- defaultCheckStateChanged() signal are emitted.
-*/
-void ComponentModel::deselectAll()
-{
- m_currentCheckedSet = m_currentCheckedSet.subtract(select(Qt::Unchecked));
- emit defaultCheckStateChanged(m_initialCheckedSet != m_currentCheckedSet);
-}
+// -- public slots
/*!
- Invoking this slot results in an checked state for every component the has a visual representation in the
- model when the model was setup during setRootComponents() or appendRootComponents(). Note that components
- are not changed it they are not checkable. The checkStateChanged() and defaultCheckStateChanged() signal
- are emitted.
-*/
-void ComponentModel::selectDefault()
-{
- m_currentCheckedSet = m_currentCheckedSet.subtract(select(Qt::Unchecked));
- foreach (const QString &name, m_initialCheckedSet)
- setData(indexFromComponentName(name), Qt::Checked, Qt::CheckStateRole);
- emit defaultCheckStateChanged(m_initialCheckedSet != m_currentCheckedSet);
-}
+ Sets the passed \a rootComponents to be the list of currently shown components.
-/*!
- Set's the passed \a rootComponents to be list of currently shown components. The model is repopulated and
- the individual component checked state is used to show the check mark in front of the visual component
- representation. The modelAboutToBeReset() and modelReset() signals are emitted.
+ The model is repopulated and the individual component checked state is used to show the check mark in
+ front of the visual component representation. The modelAboutToBeReset() and modelReset() signals are
+ emitted.
*/
void ComponentModel::setRootComponents(QList<QInstaller::Component*> rootComponents)
{
beginResetModel();
+ m_uncheckable.clear();
m_indexByNameCache.clear();
m_rootComponentList.clear();
- m_initialCheckedSet.clear();
- m_currentCheckedSet.clear();
-
- m_rootIndex = 0;
- m_rootComponentList = rootComponents;
-
+ m_modelState = DefaultChecked;
+
+ // Initialize these with an empty set for every possible state, cause we compare the hashes later in
+ // updateAndEmitModelState(). The comparison than might lead to wrong results if one of the checked
+ // states is absent initially.
+ m_initialCheckedState[Qt::Checked] = ComponentSet();
+ m_initialCheckedState[Qt::Unchecked] = ComponentSet();
+ m_initialCheckedState[Qt::PartiallyChecked] = ComponentSet();
+ m_currentCheckedState = m_initialCheckedState; // both should be equal
+
+ // show virtual components only in case we run as updater or if the core engine is set to show them
+ const bool showVirtuals = m_core->isUpdater() || m_core->virtualComponentsVisible();
+ foreach (Component *const component, rootComponents) {
+ if ((!showVirtuals) && component->isVirtual())
+ continue;
+ m_rootComponentList.append(component);
+ }
endResetModel();
}
/*!
- Appends the passed \a rootComponents to the currently shown list of components. The model is repopulated
- and the individual component checked state is used to show the check mark in front of the visual component
- representation. Already changed check states on the previous model are preserved. The modelAboutToBeReset()
- and modelReset() signals are emitted.
+ Sets the check state of every component in the model to be \a state.
+
+ The ComponentModel::PartiallyChecked flag is ignored by this function. Note that components are not
+ changed if they are not checkable. The dataChanged() and checkStateChanged() signals are emitted.
*/
-void ComponentModel::appendRootComponents(QList<QInstaller::Component*> rootComponents)
+void ComponentModel::setCheckedState(QInstaller::ComponentModel::ModelStateFlag state)
{
- beginResetModel();
-
- m_indexByNameCache.clear();
+ QSet<QModelIndex> changed;
+ switch (state) {
+ case AllChecked:
+ changed = updateCheckedState(m_currentCheckedState[Qt::Unchecked], Qt::Checked);
+ break;
+ case AllUnchecked:
+ changed = updateCheckedState(m_currentCheckedState[Qt::Checked], Qt::Unchecked);
+ break;
+ case DefaultChecked:
+ // record all changes, to be able to update the UI properly
+ changed = updateCheckedState(m_currentCheckedState[Qt::Checked], Qt::Unchecked);
+ changed += updateCheckedState(m_initialCheckedState[Qt::Checked], Qt::Checked);
+ break;
+ default:
+ break;
+ }
- m_rootIndex = m_rootComponentList.count() - 1;
- m_rootComponentList += rootComponents;
+ if (changed.isEmpty())
+ return;
- endResetModel();
+ // notify about changes done to the model
+ foreach (const QModelIndex &index, changed) {
+ emit dataChanged(index, index);
+ emit checkStateChanged(index);
+ }
+ updateAndEmitModelState(); // update the internal state
}
+
// -- private slots
void ComponentModel::slotModelReset()
{
- QList<QInstaller::Component*> components = m_rootComponentList;
- if (m_core->runMode() == QInstaller::AllMode) {
- for (int i = m_rootIndex; i < m_rootComponentList.count(); ++i)
- components.append(m_rootComponentList.at(i)->childs());
+ ComponentList components = m_rootComponentList;
+ if (!m_core->isUpdater()) {
+ foreach (Component *const component, m_rootComponentList)
+ components += component->childItems();
+ }
+
+ ComponentSet checked;
+ foreach (Component *const component, components) {
+ if (component->checkState() == Qt::Checked)
+ checked.insert(component);
}
- foreach (Component *child, components) {
- if (child->checkState() == Qt::Checked && !child->isTristate())
- m_initialCheckedSet.insert(child->name());
+ updateCheckedState(checked, Qt::Checked);
+ foreach (Component *const component, components) {
+ if (!component->isCheckable())
+ m_uncheckable.insert(component);
+ m_initialCheckedState[component->checkState()].insert(component);
}
- m_currentCheckedSet += m_initialCheckedSet;
- if (m_core->runMode() == QInstaller::AllMode)
- select(Qt::Unchecked);
+ m_currentCheckedState = m_initialCheckedState;
+ updateAndEmitModelState(); // update the internal state
+}
+
+
+// -- private
- foreach (const QString &name, m_currentCheckedSet)
- setData(indexFromComponentName(name), Qt::Checked, Qt::CheckStateRole);
+void ComponentModel::updateAndEmitModelState()
+{
+ m_modelState = ComponentModel::DefaultChecked;
+ if (m_initialCheckedState != m_currentCheckedState)
+ m_modelState = ComponentModel::PartiallyChecked;
+ if (checked().count() == 0 && partially().count() == 0) {
+ m_modelState |= ComponentModel::AllUnchecked;
+ m_modelState &= ~ComponentModel::PartiallyChecked;
+ }
+
+ if (unchecked().count() == 0 && partially().count() == 0) {
+ m_modelState |= ComponentModel::AllChecked;
+ m_modelState &= ~ComponentModel::PartiallyChecked;
+ }
+
+ emit checkStateChanged(m_modelState);
}
+void ComponentModel::collectComponents(Component *const component, const QModelIndex &parent) const
+{
+ m_indexByNameCache.insert(component->name(), parent);
+ for (int i = 0; i < component->childCount(); ++i)
+ collectComponents(component->childAt(i), index(i, 0, parent));
+}
+
+namespace ComponentModelPrivate {
+
+struct NameGreaterThan
+{
+ bool operator() (const Component *lhs, const Component *rhs) const
+ {
+ return lhs->name() > rhs->name();
+ }
+};
+
static Qt::CheckState verifyPartiallyChecked(Component *component)
{
int checked = 0;
int unchecked = 0;
- int virtualChilds = 0;
const int count = component->childCount();
for (int i = 0; i < count; ++i) {
- Component *const child = component->childAt(i);
- if (!child->isVirtual()) {
- switch (component->childAt(i)->checkState()) {
- case Qt::Checked: {
- ++checked;
- } break;
- case Qt::Unchecked: {
- ++unchecked;
- } break;
- default:
- break;
- }
- } else {
- ++virtualChilds;
+ switch (component->childAt(i)->checkState()) {
+ case Qt::Checked: {
+ ++checked;
+ } break;
+ case Qt::Unchecked: {
+ ++unchecked;
+ } break;
+ default:
+ break;
}
}
- if ((checked + virtualChilds) == count)
+ if (checked == count)
return Qt::Checked;
- if ((unchecked + virtualChilds) == count)
+ if (unchecked == count)
return Qt::Unchecked;
return Qt::PartiallyChecked;
}
-void ComponentModel::slotCheckStateChanged(const QModelIndex &index)
-{
- Component *component = componentFromIndex(index);
- if (!component)
- return;
-
- if (component->checkState() == Qt::Checked && !component->isTristate())
- m_currentCheckedSet.insert(component->name());
- else if (component->checkState() == Qt::Unchecked && !component->isTristate())
- m_currentCheckedSet.remove(component->name());
- emit defaultCheckStateChanged(m_initialCheckedSet != m_currentCheckedSet);
-
- if (component->isVirtual())
- return;
-
- const Qt::CheckState state = component->checkState();
- if (component->isTristate()) {
- if (state == Qt::PartiallyChecked) {
- component->setCheckState(verifyPartiallyChecked(component));
- return;
- }
-
- QModelIndexList notCheckable;
- foreach (Component *child, component->childs()) {
- const QModelIndex &idx = indexFromComponentName(child->name());
- if (child->isCheckable()) {
- if (child->checkState() != state && !child->isVirtual())
- setData(idx, state, Qt::CheckStateRole);
- } else {
- notCheckable.append(idx);
- }
- }
-
- if (state == Qt::Unchecked && !notCheckable.isEmpty()) {
- foreach (const QModelIndex &idx, notCheckable)
- setData(idx, idx.data(Qt::CheckStateRole), Qt::CheckStateRole);
- }
- } else {
- QList<Component*> parents;
- while (0 != component->parentComponent()) {
- parents.append(component->parentComponent());
- component = parents.last();
- }
-
- foreach (Component *parent, parents) {
- if (parent->isCheckable()) {
- const QModelIndex &idx = indexFromComponentName(parent->name());
- if (parent->checkState() == Qt::PartiallyChecked) {
- setData(idx, verifyPartiallyChecked(parent), Qt::CheckStateRole);
- } else {
- setData(idx, Qt::PartiallyChecked, Qt::CheckStateRole);
- }
- }
- }
- }
-}
-
-// -- private
+} // namespace ComponentModelPrivate
-QSet<QString> ComponentModel::select(Qt::CheckState state)
+QSet<QModelIndex> ComponentModel::updateCheckedState(const ComponentSet &components, Qt::CheckState state)
{
- QSet<QString> changed;
- for (int i = 0; i < m_rootComponentList.count(); ++i) {
- QSet<QString> tmp;
- QList<Component*> children = m_rootComponentList.at(i)->childs();
- children.prepend(m_rootComponentList.at(i)); // we need to take the root item into account as well
- foreach (Component *child, children) {
- if (child->isCheckable() && !child->isTristate() && child->checkState() != state) {
- tmp.insert(child->name());
- child->setCheckState(state);
+ // get all parent nodes for the components we're going to update
+ ComponentSet nodes = components;
+ foreach (Component *const component, components) {
+ if (Component *parent = component->parentComponent()) {
+ nodes.insert(parent);
+ while (parent->parentComponent() != 0) {
+ parent = parent->parentComponent();
+ nodes.insert(parent);
}
}
- if (!tmp.isEmpty()) {
- changed += tmp;
- setData(index(i, 0, QModelIndex()), state, Qt::CheckStateRole);
- }
}
- return changed;
-}
-void ComponentModel::updateCache(const QModelIndex &parent) const
-{
- const QModelIndexList &list = collectComponents(parent);
- foreach (const QModelIndex &index, list) {
- if (Component *component = componentFromIndex(index))
- m_indexByNameCache.insert(component->name(), index);
- }
- m_indexByNameCache.insert((static_cast<Component*> (parent.internalPointer()))->name(), parent);
-}
-
-QModelIndexList ComponentModel::collectComponents(const QModelIndex &parent) const
-{
- QModelIndexList list;
- for (int i = 0; i < rowCount(parent) ; ++i) {
- const QModelIndex &next = index(i, 0, parent);
- if (Component *component = componentFromIndex(next)) {
- if (component->childCount() > 0)
- list += collectComponents(next);
+ QSet<QModelIndex> changed;
+ // sort the nodes, so we can start in descending order to check node and tri-state nodes properly
+ ComponentList sortedNodes = nodes.toList();
+ std::sort(sortedNodes.begin(), sortedNodes.end(), ComponentModelPrivate::NameGreaterThan());
+ foreach (Component *const node, sortedNodes) {
+ if (!node->isCheckable())
+ continue;
+
+ Qt::CheckState newState = state;
+ const Qt::CheckState recentState = node->checkState();
+ if (node->isTristate())
+ newState = ComponentModelPrivate::verifyPartiallyChecked(node);
+ if (recentState == newState)
+ continue;
+
+ node->setCheckState(newState);
+ changed.insert(indexFromComponentName(node->name()));
+
+ m_currentCheckedState[Qt::Checked].remove(node);
+ m_currentCheckedState[Qt::Unchecked].remove(node);
+ m_currentCheckedState[Qt::PartiallyChecked].remove(node);
+
+ switch (newState) {
+ case Qt::Checked:
+ m_currentCheckedState[Qt::Checked].insert(node);
+ break;
+ case Qt::Unchecked:
+ m_currentCheckedState[Qt::Unchecked].insert(node);
+ break;
+ case Qt::PartiallyChecked:
+ m_currentCheckedState[Qt::PartiallyChecked].insert(node);
+ break;
}
- list.append(next);
}
- return list;
+
+ // update all nodes uncompressed size
+ foreach (Component *const node, m_rootComponentList)
+ node->updateUncompressedSize(); // this is a recursive call
+ return changed;
}
} // namespace QInstaller
diff --git a/src/libs/installer/componentmodel.h b/src/libs/installer/componentmodel.h
index b43bfc75a..a691906a4 100644
--- a/src/libs/installer/componentmodel.h
+++ b/src/libs/installer/componentmodel.h
@@ -57,11 +57,23 @@ class PackageManagerCore;
class INSTALLER_EXPORT ComponentModel : public QAbstractItemModel
{
Q_OBJECT
+ typedef QSet<Component *> ComponentSet;
+ typedef QList<Component *> ComponentList;
public:
+ enum ModelStateFlag {
+ AllChecked = 0x01,
+ AllUnchecked = 0x02,
+ DefaultChecked = 0x04,
+ PartiallyChecked = 0x08
+ };
+ Q_DECLARE_FLAGS(ModelState, ModelStateFlag);
+
explicit ComponentModel(int columns, PackageManagerCore *core = 0);
~ComponentModel();
+ Qt::ItemFlags flags(const QModelIndex &index) const;
+
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
@@ -75,49 +87,50 @@ public:
bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value,
int role = Qt::EditRole);
- Qt::ItemFlags flags(const QModelIndex &index) const;
- PackageManagerCore *packageManagerCore() const;
+ QSet<Component *> checked() const;
+ QSet<Component *> partially() const;
+ QSet<Component *> unchecked() const;
+ QSet<Component *> uncheckable() const;
- bool defaultCheckState() const;
- bool hasCheckedComponents() const;
- QList<Component*> checkedComponents() const;
+ PackageManagerCore *core() const;
+ ComponentModel::ModelState checkedState() const;
QModelIndex indexFromComponentName(const QString &name) const;
Component* componentFromIndex(const QModelIndex &index) const;
public Q_SLOTS:
- void selectAll();
- void deselectAll();
- void selectDefault();
-
void setRootComponents(QList<QInstaller::Component*> rootComponents);
- void appendRootComponents(QList<QInstaller::Component*> rootComponents);
+ void setCheckedState(QInstaller::ComponentModel::ModelStateFlag state);
Q_SIGNALS:
- void defaultCheckStateChanged(bool changed);
void checkStateChanged(const QModelIndex &index);
+ void checkStateChanged(QInstaller::ComponentModel::ModelState state);
private Q_SLOTS:
void slotModelReset();
- void slotCheckStateChanged(const QModelIndex &index);
private:
- QSet<QString> select(Qt::CheckState state);
- void updateCache(const QModelIndex &parent) const;
- QModelIndexList collectComponents(const QModelIndex &parent) const;
+ void updateAndEmitModelState();
+ void collectComponents(Component *const component, const QModelIndex &parent) const;
+ QSet<QModelIndex> updateCheckedState(const ComponentSet &components, Qt::CheckState state);
private:
PackageManagerCore *m_core;
- int m_rootIndex;
+ ModelState m_modelState;
+ ComponentSet m_uncheckable;
QVector<QVariant> m_headerData;
- QSet<QString> m_initialCheckedSet;
- QSet<QString> m_currentCheckedSet;
- QList<Component*> m_rootComponentList;
+ ComponentList m_rootComponentList;
+ QHash<Qt::CheckState, ComponentSet> m_initialCheckedState;
+ QHash<Qt::CheckState, ComponentSet> m_currentCheckedState;
mutable QHash<QString, QPersistentModelIndex> m_indexByNameCache;
};
+Q_DECLARE_OPERATORS_FOR_FLAGS(ComponentModel::ModelState);
} // namespace QInstaller
+Q_DECLARE_METATYPE(QInstaller::ComponentModel::ModelState);
+Q_DECLARE_METATYPE(QInstaller::ComponentModel::ModelStateFlag);
+
#endif // COMPONENTMODEL_H
diff --git a/src/libs/installer/constants.h b/src/libs/installer/constants.h
index 3929681a7..7ea73bbb9 100644
--- a/src/libs/installer/constants.h
+++ b/src/libs/installer/constants.h
@@ -80,6 +80,7 @@ static const QLatin1String scSortingPriority("SortingPriority");
static const QLatin1String scTitle("Title");
static const QLatin1String scPublisher("Publisher");
static const QLatin1String scRunProgram("RunProgram");
+static const QLatin1String scRunProgramArguments("RunProgramArguments");
static const QLatin1String scStartMenuDir("StartMenuDir");
static const QLatin1String scRemoveTargetDir("RemoveTargetDir");
static const QLatin1String scRunProgramDescription("RunProgramDescription");
diff --git a/src/libs/installer/consumeoutputoperation.cpp b/src/libs/installer/consumeoutputoperation.cpp
new file mode 100644
index 000000000..2d3bc1ec0
--- /dev/null
+++ b/src/libs/installer/consumeoutputoperation.cpp
@@ -0,0 +1,158 @@
+/**************************************************************************
+**
+** Copyright (C) 2012-2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
+
+#include "consumeoutputoperation.h"
+#include "packagemanagercore.h"
+#include "utils.h"
+
+#include <QFile>
+#include <QDir>
+#include <QProcess>
+#include <QDebug>
+
+using namespace QInstaller;
+
+ConsumeOutputOperation::ConsumeOutputOperation()
+{
+ setName(QLatin1String("ConsumeOutput"));
+}
+
+void ConsumeOutputOperation::backup()
+{
+}
+
+bool ConsumeOutputOperation::performOperation()
+{
+ // Arguments:
+ // 1. key where the output will be saved
+ // 2. executable path
+ // 3. argument for the executable
+ // 4. more arguments possible ...
+ if (arguments().count() < 3) {
+ setError(InvalidArguments);
+ setErrorString(tr("Invalid arguments in %0: %1 arguments given, %2 expected%3.").arg(name()).arg(
+ arguments().count()).arg(tr("at least 2"), QLatin1String("(<to be saved installer key name>, "
+ "<executable>, [argument1], [argument2], ...)")));
+ return false;
+ }
+
+ PackageManagerCore *const core = value(QLatin1String("installer")).value<PackageManagerCore*>();
+ if (!core) {
+ setError(UserDefinedError);
+ setErrorString(tr("Needed installer object in %1 operation is empty.").arg(name()));
+ return false;
+ }
+
+ const QString installerKeyName = arguments().at(0);
+ if (installerKeyName.isEmpty()) {
+ setError(UserDefinedError);
+ setErrorString(tr("Can not save the output of %1 to an empty installer key value.").arg(
+ arguments().at(1)));
+ return false;
+ }
+
+ QString executablePath = arguments().at(1);
+#ifdef Q_OS_WIN
+ if (!QFile::exists(executablePath))
+ executablePath = executablePath + QLatin1String(".exe");
+#endif
+
+ const QFileInfo executable(executablePath);
+ if (!executable.exists() || !executable.isExecutable()) {
+ setError(UserDefinedError);
+ setErrorString(tr("File '%1' does not exist or is not an executable binary.").arg(
+ QDir::toNativeSeparators(executable.absoluteFilePath())));
+ return false;
+ }
+
+ QByteArray executableOutput;
+ QProcess process;
+
+
+ const QStringList processArguments = arguments().mid(2);
+ // in some cases it is not runable, because another process is blocking it(filewatcher ...)
+ int waitCount = 0;
+ while (executableOutput.isEmpty() && waitCount < 60) {
+
+ process.start(executable.absoluteFilePath(), processArguments, QIODevice::ReadOnly);
+ if (process.waitForFinished(2000)) {
+ if (process.exitStatus() == QProcess::CrashExit) {
+ setError(UserDefinedError);
+ setErrorString(tr("Running '%1' resulted in a crash.").arg(
+ QDir::toNativeSeparators(executable.absoluteFilePath())));
+ return false;
+ }
+ executableOutput.append(process.readAllStandardOutput());
+ }
+ if (executableOutput.isEmpty()) {
+ ++waitCount;
+ static const int waitTimeInMilliSeconds = 500;
+ uiDetachedWait(waitTimeInMilliSeconds);
+ }
+ if (process.state() > QProcess::NotRunning ) {
+ qWarning() << executable.absoluteFilePath() << "process is still running, need to kill it.";
+ process.kill();
+ }
+
+ }
+ if (executableOutput.isEmpty()) {
+ qWarning() << QString::fromLatin1("Can't get any query output from executable: '%1'").arg(
+ executable.absoluteFilePath());
+ }
+ core->setValue(installerKeyName, QString::fromLatin1(executableOutput));
+ return true;
+}
+
+bool ConsumeOutputOperation::undoOperation()
+{
+ return true;
+}
+
+bool ConsumeOutputOperation::testOperation()
+{
+ return true;
+}
+
+Operation *ConsumeOutputOperation::clone() const
+{
+ return new ConsumeOutputOperation();
+}
+
diff --git a/src/libs/installer/consumeoutputoperation.h b/src/libs/installer/consumeoutputoperation.h
new file mode 100644
index 000000000..f776cf35a
--- /dev/null
+++ b/src/libs/installer/consumeoutputoperation.h
@@ -0,0 +1,65 @@
+/**************************************************************************
+**
+** Copyright (C) 2012-2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
+
+#ifndef CONSUMEOUTPUTOPERATION_H
+#define CONSUMEOUTPUTOPERATION_H
+
+#include "qinstallerglobal.h"
+
+namespace QInstaller {
+
+class INSTALLER_EXPORT ConsumeOutputOperation : public Operation
+{
+public:
+ ConsumeOutputOperation();
+
+ void backup();
+ bool performOperation();
+ bool undoOperation();
+ bool testOperation();
+ Operation *clone() const;
+
+private:
+};
+
+} // namespace QInstaller
+
+#endif // CONSUMEOUTPUTOPERATION_H
diff --git a/src/libs/installer/createdesktopentryoperation.cpp b/src/libs/installer/createdesktopentryoperation.cpp
index f7cb30726..cd79bc65d 100644
--- a/src/libs/installer/createdesktopentryoperation.cpp
+++ b/src/libs/installer/createdesktopentryoperation.cpp
@@ -164,7 +164,7 @@ bool CreateDesktopEntryOperation::performOperation()
}
QFile::setPermissions(filename, QFile::ReadOwner | QFile::WriteOwner | QFile::ReadUser | QFile::ReadGroup
- | QFile::ReadOther);
+ | QFile::ReadOther | QFile::ExeOwner | QFile::ExeGroup | QFile::ExeOther);
QTextStream stream(&file);
stream.setCodec("UTF-8");
diff --git a/src/libs/installer/createshortcutoperation.cpp b/src/libs/installer/createshortcutoperation.cpp
index 62f7cfa82..9f9084e05 100644
--- a/src/libs/installer/createshortcutoperation.cpp
+++ b/src/libs/installer/createshortcutoperation.cpp
@@ -79,12 +79,17 @@ struct DeCoInitializer
};
#endif
-struct StartsWithWorkingDirectory
+struct StartsWith
{
- bool operator()(const QString &s)
+ StartsWith(const QString &searchTerm)
+ : m_searchTerm(searchTerm) {}
+
+ bool operator()(const QString &searchString)
{
- return s.startsWith(QLatin1String("workingDirectory="));
+ return searchString.startsWith(m_searchTerm);
}
+
+ QString m_searchTerm;
};
static QString parentDirectory(const QString &current)
@@ -92,23 +97,25 @@ static QString parentDirectory(const QString &current)
return current.mid(0, current.lastIndexOf(QLatin1Char('/')));
}
-static QString takeWorkingDirArgument(QStringList &args)
+static QString takeArgument(const QString argument, QStringList *arguments)
{
- // if the arguments contain an option in the form "workingDirectory=...", find it and consume it
- QStringList::iterator wdiropt = std::find_if (args.begin(), args.end(), StartsWithWorkingDirectory());
- if (wdiropt == args.end())
+ // if the arguments contain an option in the form "argument=...", find it and consume it
+ QStringList::iterator it = std::find_if(arguments->begin(), arguments->end(), StartsWith(argument));
+ if (it == arguments->end())
return QString();
- const QString workingDir = wdiropt->mid(QString::fromLatin1("workingDirectory=").size());
- args.erase(wdiropt);
- return workingDir;
+ const QString value = it->mid(argument.size());
+ arguments->erase(it);
+ return value;
}
static bool createLink(const QString &fileName, const QString &linkName, QString workingDir,
- QString arguments = QString())
+ const QString &arguments = QString(), const QString &iconPath = QString(),
+ const QString &iconId = QString())
{
- bool success = QFile::link(fileName, linkName);
#ifdef Q_OS_WIN
+ bool success = QFile::link(fileName, linkName);
+
if (!success)
return success;
@@ -128,10 +135,12 @@ static bool createLink(const QString &fileName, const QString &linkName, QString
psl->SetWorkingDirectory((wchar_t *)workingDir.utf16());
if (!arguments.isNull())
psl->SetArguments((wchar_t*)arguments.utf16());
+ if (!iconPath.isNull())
+ psl->SetIconLocation((wchar_t*)(iconPath.utf16()), iconId.toInt());
IPersistFile *ppf = NULL;
if (SUCCEEDED(psl->QueryInterface(IID_IPersistFile, (void **)&ppf))) {
- ppf->Save((wchar_t*)QDir::toNativeSeparators(linkName).utf16(), TRUE);
+ ppf->Save((wchar_t*)QDir::toNativeSeparators(linkName).utf16(), true);
ppf->Release();
}
psl->Release();
@@ -145,11 +154,17 @@ static bool createLink(const QString &fileName, const QString &linkName, QString
SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST, pidl, 0);
CoTaskMemFree(pidl);
}
+
+ return success;
#else
Q_UNUSED(arguments)
Q_UNUSED(workingDir)
+ Q_UNUSED(fileName)
+ Q_UNUSED(linkName)
+ Q_UNUSED(iconPath)
+ Q_UNUSED(iconId)
+ return true;
#endif
- return success;
}
@@ -177,12 +192,16 @@ void CreateShortcutOperation::backup()
bool CreateShortcutOperation::performOperation()
{
QStringList args = arguments();
- const QString workingDir = takeWorkingDirArgument(args);
+
+ const QString iconId = takeArgument(QString::fromLatin1("iconId="), &args);
+ const QString iconPath = takeArgument(QString::fromLatin1("iconPath="), &args);
+ const QString workingDir = takeArgument(QString::fromLatin1("workingDirectory="), &args);
if (args.count() != 2 && args.count() != 3) {
setError(InvalidArguments);
setErrorString(tr("Invalid arguments in %0: %1 arguments given, %2 expected%3.")
- .arg(name()).arg(arguments().count()).arg(tr("2 or 3"), tr(" (optional: 'workingDirectory=...')")));
+ .arg(name()).arg(arguments().count()).arg(tr("2 or 3"),
+ tr(" (optional: 'workingDirectory=...', 'iconPath=...', 'iconId=...')")));
return false;
}
@@ -190,10 +209,8 @@ bool CreateShortcutOperation::performOperation()
const QString linkLocation = args.at(1);
const QString targetArguments = args.value(2); //used value because it could be not existing
- const QString linkPath = QFileInfo(linkLocation).absolutePath();
-
- const bool linkPathAlreadyExists = QDir(linkPath).exists();
- const bool created = linkPathAlreadyExists || QDir::root().mkpath(linkPath);
+ const QString linkPath = QFileInfo(linkLocation).absolutePath().trimmed();
+ const bool created = QDir(linkPath).exists() || QDir::root().mkpath(linkPath);
if (!created) {
setError(UserDefinedError);
@@ -219,7 +236,7 @@ bool CreateShortcutOperation::performOperation()
return false;
}
- const bool linked = createLink(linkTarget, linkLocation, workingDir, targetArguments);
+ const bool linked = createLink(linkTarget, linkLocation, workingDir, targetArguments, iconPath, iconId);
if (!linked) {
setError(UserDefinedError);
setErrorString(tr("Could not create link %1: %2").arg(QDir::toNativeSeparators(linkLocation),
diff --git a/src/libs/installer/downloadarchivesjob.cpp b/src/libs/installer/downloadarchivesjob.cpp
index 1cfb2ffec..24fba689a 100644
--- a/src/libs/installer/downloadarchivesjob.cpp
+++ b/src/libs/installer/downloadarchivesjob.cpp
@@ -60,14 +60,14 @@ using namespace KDUpdater;
Creates a new DownloadArchivesJob with \a parent.
*/
DownloadArchivesJob::DownloadArchivesJob(PackageManagerCore *core)
- : KDJob(core),
- m_core(core),
- m_downloader(0),
- m_archivesDownloaded(0),
- m_archivesToDownloadCount(0),
- m_canceled(false),
- m_lastFileProgress(0),
- m_progressChangedTimerId(0)
+ : KDJob(core)
+ , m_core(core)
+ , m_downloader(0)
+ , m_archivesDownloaded(0)
+ , m_archivesToDownloadCount(0)
+ , m_canceled(false)
+ , m_lastFileProgress(0)
+ , m_progressChangedTimerId(0)
{
setCapabilities(Cancelable);
}
diff --git a/src/libs/installer/elevatedexecuteoperation.cpp b/src/libs/installer/elevatedexecuteoperation.cpp
index 0aa8c101d..d797f2077 100644
--- a/src/libs/installer/elevatedexecuteoperation.cpp
+++ b/src/libs/installer/elevatedexecuteoperation.cpp
@@ -54,7 +54,9 @@ class ElevatedExecuteOperation::Private
{
public:
explicit Private(ElevatedExecuteOperation *qq)
- : q(qq), process(0), showStandardError(false)
+ : q(qq)
+ , process(0)
+ , showStandardError(false)
{
}
@@ -202,7 +204,8 @@ bool ElevatedExecuteOperation::Private::run(const QStringList &arguments)
if (!success) {
q->setError(UserDefinedError);
//TODO: pass errorString() through the wrapper */
- q->setErrorString(tr("Execution failed: Could not start: \"%1\"").arg(callstr));
+ q->setErrorString(tr("Execution failed: Could not start: \"%1\"(%2)").arg(callstr,
+ process->errorString()));
returnValue = false;
}
@@ -229,6 +232,12 @@ bool ElevatedExecuteOperation::Private::run(const QStringList &arguments)
} else {
q->setErrorString(customErrorMessage);
}
+
+ QByteArray standardErrorOutput = process->readAllStandardError();
+ // in error case it would be useful to see something in verbose output
+ if (!standardErrorOutput.isEmpty())
+ qWarning() << standardErrorOutput;
+
returnValue = false;
}
@@ -257,7 +266,10 @@ void ElevatedExecuteOperation::Private::readProcessOutput()
}
const QByteArray output = process->readAll();
if (!output.isEmpty()) {
- qDebug() << output;
+ if (q->error() == UserDefinedError)
+ qWarning() << output;
+ else
+ qDebug() << output;
emit q->outputTextChanged(QString::fromLocal8Bit(output));
}
}
diff --git a/src/libs/installer/environmentvariablesoperation.cpp b/src/libs/installer/environmentvariablesoperation.cpp
index de2eae899..192272a8d 100644
--- a/src/libs/installer/environmentvariablesoperation.cpp
+++ b/src/libs/installer/environmentvariablesoperation.cpp
@@ -137,10 +137,10 @@ UpdateOperation::Error undoSetting(const QString &regPath,
bool EnvironmentVariableOperation::performOperation()
{
QStringList args = arguments();
- if (args.count() != 2 && args.count() != 3) {
+ if (args.count() < 2 || args.count() > 4) {
setError(InvalidArguments);
setErrorString(tr("Invalid arguments in %0: %1 arguments given, %2 expected%3.")
- .arg(name()).arg(arguments().count()).arg(tr("2 or 3"), QLatin1String("")));
+ .arg(name()).arg(arguments().count()).arg(tr("2 to 4"), QLatin1String("")));
return false;
}
diff --git a/src/libs/installer/errors.h b/src/libs/installer/errors.h
index 7f5cc9071..18b8ead8f 100644
--- a/src/libs/installer/errors.h
+++ b/src/libs/installer/errors.h
@@ -54,7 +54,10 @@ class Error : public std::runtime_error
public:
explicit Error(const QString &message)
: std::runtime_error(message.toStdString())
- , m_message (message) { qDebug() << "create Error-Exception:" << message; }
+ , m_message (message)
+ {
+ qDebug() << "create Error-Exception:" << message;
+ }
virtual ~Error() throw() {}
QString message() const { return m_message; }
diff --git a/src/libs/installer/extractarchiveoperation_p.h b/src/libs/installer/extractarchiveoperation_p.h
index 44e75a949..4e0632830 100644
--- a/src/libs/installer/extractarchiveoperation_p.h
+++ b/src/libs/installer/extractarchiveoperation_p.h
@@ -117,9 +117,11 @@ public Q_SLOTS:
case PackageManagerCore::Failure:
state = E_FAIL;
break;
- case PackageManagerCore::Unfinished: // fall through
- case PackageManagerCore::Success:
- case PackageManagerCore::Running:
+ default: // fall through
+ // PackageManagerCore::Unfinished, PackageManagerCore::Success, PackageManagerCore::Running
+ // PackageManagerCore::ForceUpdate
+
+ // already set
//state = S_OK;
break;
}
diff --git a/src/libs/installer/fileutils.cpp b/src/libs/installer/fileutils.cpp
index ab7ad6df4..9fb782fec 100644
--- a/src/libs/installer/fileutils.cpp
+++ b/src/libs/installer/fileutils.cpp
@@ -53,6 +53,12 @@
#include <errno.h>
+#ifdef Q_OS_UNIX
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
using namespace QInstaller;
@@ -304,9 +310,9 @@ class RemoveDirectoryThread : public QThread
{
public:
explicit RemoveDirectoryThread(const QString &path, bool ignoreErrors = false, QObject *parent = 0)
- : QThread(parent),
- p(path),
- ignore(ignoreErrors)
+ : QThread(parent)
+ , p(path)
+ , ignore(ignoreErrors)
{
}
@@ -455,7 +461,7 @@ QString QInstaller::createTemporaryDirectory(const QString &templ)
if (!f.open())
throw Error(QObject::tr("Could not create temporary folder for template %1: %2").arg(t, f.errorString()));
const QString path = f.fileName() + QLatin1String("meta");
- qDebug() << "Creating meta data directory at" << path;
+ qDebug() << "\nCreating meta data directory at" << path;
QInstaller::mkpath(path);
return path;
@@ -469,6 +475,7 @@ QString QInstaller::createTemporaryDirectory(const QString &templ)
# endif
#include <windows.h>
+
QString QInstaller::getShortPathName(const QString &name)
{
if (name.isEmpty())
@@ -607,4 +614,31 @@ void QInstaller::setApplicationIcon(const QString &application, const QString &i
EndUpdateResourceW(updateRes, false);
}
+static quint64 symlinkSizeWin(const QString &path)
+{
+ WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
+ if (GetFileAttributesEx((wchar_t*)(path.utf16()), GetFileExInfoStandard, &fileAttributeData) == FALSE)
+ return quint64(0);
+
+ LARGE_INTEGER size;
+ size.LowPart = fileAttributeData.nFileSizeLow;
+ size.HighPart = fileAttributeData.nFileSizeHigh;
+ return quint64(size.QuadPart);
+}
+
#endif
+
+quint64 QInstaller::fileSize(const QFileInfo &info)
+{
+ if (!info.isSymLink())
+ return info.size();
+
+#ifndef Q_OS_WIN
+ struct stat buffer;
+ if (lstat(qPrintable(info.absoluteFilePath()), &buffer) != 0)
+ return quint64(0);
+ return quint64(buffer.st_size);
+#else
+ return symlinkSizeWin(info.absoluteFilePath());
+#endif
+}
diff --git a/src/libs/installer/fileutils.h b/src/libs/installer/fileutils.h
index 0450717cb..9bbcec72a 100644
--- a/src/libs/installer/fileutils.h
+++ b/src/libs/installer/fileutils.h
@@ -49,6 +49,7 @@
QT_BEGIN_NAMESPACE
class QByteArray;
+class QFileInfo;
class QIODevice;
class QUrl;
QT_END_NAMESPACE
@@ -120,6 +121,8 @@ private:
void INSTALLER_EXPORT mkdir(const QString &path);
void INSTALLER_EXPORT mkpath(const QString &path);
+ quint64 INSTALLER_EXPORT fileSize(const QFileInfo &info);
+
#ifdef Q_OS_WIN
QString INSTALLER_EXPORT getLongPathName(const QString &name);
QString INSTALLER_EXPORT getShortPathName(const QString &name);
diff --git a/src/libs/installer/fsengineclient.cpp b/src/libs/installer/fsengineclient.cpp
index c9aff560f..abc686fd9 100644
--- a/src/libs/installer/fsengineclient.cpp
+++ b/src/libs/installer/fsengineclient.cpp
@@ -44,6 +44,8 @@
#include "adminauthorization.h"
#include "messageboxhandler.h"
+#include <QElapsedTimer>
+
#include <QtCore/QCoreApplication>
#include <QtCore/QMutex>
#include <QtCore/QProcess>
@@ -169,9 +171,9 @@ class FSEngineClientIterator : public QAbstractFileEngineIterator
{
public:
FSEngineClientIterator(QDir::Filters filters, const QStringList &nameFilters, const QStringList &files)
- : QAbstractFileEngineIterator(filters, nameFilters),
- entries(files),
- index(-1)
+ : QAbstractFileEngineIterator(filters, nameFilters)
+ , entries(files)
+ , index(-1)
{
}
@@ -588,13 +590,13 @@ class FSEngineClientHandler::Private
{
public:
Private()
- : mutex(QMutex::Recursive),
- port(0),
- startServerAsAdmin(false),
- serverStarted(false),
- serverStarting(false),
- active(false),
- thread(new StillAliveThread)
+ : mutex(QMutex::Recursive)
+ , port(0)
+ , startServerAsAdmin(false)
+ , serverStarted(false)
+ , serverStarting(false)
+ , active(false)
+ , thread(new StillAliveThread)
{
thread->moveToThread(thread);
}
@@ -753,7 +755,7 @@ void FSEngineClientHandler::setActive(bool active)
}
/*!
- Returns, wheter this FSEngineClientHandler is active or not.
+ Returns true when this FSEngineClientHandler is active.
*/
bool FSEngineClientHandler::isActive() const
{
@@ -809,8 +811,14 @@ void FSEngineClientHandler::Private::maybeStartServer()
}
if (serverStarted) {
- QTcpSocket s; // now wait for the socket to arrive
- serverStarted = FSEngineClientHandler::instance().connect(&s);
+ QElapsedTimer t;
+ t.start();
+ while (serverStarting && serverStarted
+ && t.elapsed() < 30000) { // 30 seconds ought to be enough for the app to start
+ QTcpSocket s;
+ if (FSEngineClientHandler::instance().connect(&s))
+ serverStarting = false;
+ }
}
serverStarting = false;
}
diff --git a/src/libs/installer/fsengineserver.cpp b/src/libs/installer/fsengineserver.cpp
index 991681b95..326a2a02a 100644
--- a/src/libs/installer/fsengineserver.cpp
+++ b/src/libs/installer/fsengineserver.cpp
@@ -75,7 +75,7 @@ bool startDetached(const QString &program, const QStringList &args, const QStrin
const QString arguments = QInstaller::createCommandline(program, args);
const bool success = CreateProcess(0, (wchar_t*)arguments.utf16(),
- 0, 0, FALSE, CREATE_UNICODE_ENVIRONMENT | CREATE_NEW_CONSOLE,
+ 0, 0, false, CREATE_UNICODE_ENVIRONMENT | CREATE_NEW_CONSOLE,
0, (wchar_t*)workingDirectory.utf16(),
&startupInfo, &pinfo);
@@ -129,11 +129,11 @@ class FSEngineConnectionThread : public QThread
Q_OBJECT
public:
FSEngineConnectionThread(descriptor_t socketDescriptor, QObject *parent)
- : QThread(parent),
- descriptor(socketDescriptor),
- settings(0),
- process(0),
- signalReceiver(0)
+ : QThread(parent)
+ , descriptor(socketDescriptor)
+ , settings(0)
+ , process(0)
+ , signalReceiver(0)
{}
protected:
@@ -408,6 +408,8 @@ QByteArray FSEngineConnectionThread::handleCommand(const QString &command)
returnStream << process->readAll();
} else if (command == QLatin1String("QProcess::readAllStandardOutput")) {
returnStream << process->readAllStandardOutput();
+ } else if (command == QLatin1String("QProcess::readAllStandardError")) {
+ returnStream << process->readAllStandardError();
} else if (command == QLatin1String("QProcess::startDetached")) {
QString program;
QStringList arguments;
@@ -448,6 +450,8 @@ QByteArray FSEngineConnectionThread::handleCommand(const QString &command)
returnStream << process->waitForStarted(msecs);
} else if (command == QLatin1String("QProcess::workingDirectory")) {
returnStream << process->workingDirectory();
+ } else if (command == QLatin1String("QProcess::errorString")) {
+ returnStream << process->errorString();
} else if (command == QLatin1String("QProcess::write")) {
QByteArray byteArray;
receivedStream >> byteArray;
diff --git a/src/libs/installer/getrepositoriesmetainfojob.cpp b/src/libs/installer/getrepositoriesmetainfojob.cpp
index 996bf4692..c4564e781 100644
--- a/src/libs/installer/getrepositoriesmetainfojob.cpp
+++ b/src/libs/installer/getrepositoriesmetainfojob.cpp
@@ -42,8 +42,8 @@
#include "getrepositoriesmetainfojob.h"
#include "getrepositorymetainfojob.h"
+#include "productkeycheck.h"
#include "packagemanagercore_p.h"
-#include "qinstallerglobal.h"
#include <QtCore/QDebug>
@@ -53,12 +53,12 @@ using namespace QInstaller;
// -- GetRepositoriesMetaInfoJob
-GetRepositoriesMetaInfoJob::GetRepositoriesMetaInfoJob(PackageManagerCorePrivate *corePrivate)
- : KDJob(corePrivate),
- m_canceled(false),
- m_silentRetries(3),
- m_haveIgnoredError(false),
- m_corePrivate(corePrivate)
+GetRepositoriesMetaInfoJob::GetRepositoriesMetaInfoJob(PackageManagerCore *core)
+ : KDJob(core)
+ , m_canceled(false)
+ , m_silentRetries(3)
+ , m_haveIgnoredError(false)
+ , m_core(core)
{
setCapabilities(Cancelable);
}
@@ -119,10 +119,11 @@ bool GetRepositoriesMetaInfoJob::isCanceled() const
void GetRepositoriesMetaInfoJob::doStart()
{
- if ((m_corePrivate->isInstaller() && !m_corePrivate->isOfflineOnly())
- || (m_corePrivate->isUpdater() || m_corePrivate->isPackageManager())) {
- foreach (const Repository &repo, m_corePrivate->m_data.settings().repositories()) {
- if (repo.isEnabled())
+ if ((m_core->isInstaller() && !m_core->isOfflineOnly()) || (m_core->isUpdater()
+ || m_core->isPackageManager())) {
+ const ProductKeyCheck *const productKeyCheck = ProductKeyCheck::instance(m_core);
+ foreach (const Repository &repo, m_core->settings().repositories()) {
+ if (repo.isEnabled() && productKeyCheck->isValidRepository(repo))
m_repositories += repo;
}
}
@@ -157,7 +158,7 @@ void GetRepositoriesMetaInfoJob::fetchNextRepo()
return;
}
- m_job = new GetRepositoryMetaInfoJob(m_corePrivate, this);
+ m_job = new GetRepositoryMetaInfoJob(m_core, this);
connect(m_job, SIGNAL(finished(KDJob*)), this, SLOT(jobFinished(KDJob*)));
connect(m_job, SIGNAL(infoMessage(KDJob*, QString)), this, SIGNAL(infoMessage(KDJob*, QString)));
diff --git a/src/libs/installer/getrepositoriesmetainfojob.h b/src/libs/installer/getrepositoriesmetainfojob.h
index aa381e3a4..2cc53b82a 100644
--- a/src/libs/installer/getrepositoriesmetainfojob.h
+++ b/src/libs/installer/getrepositoriesmetainfojob.h
@@ -59,14 +59,14 @@ namespace KDUpdater {
namespace QInstaller {
class GetRepositoryMetaInfoJob;
-class PackageManagerCorePrivate;
+class PackageManagerCore;
class INSTALLER_EXPORT GetRepositoriesMetaInfoJob : public KDJob
{
Q_OBJECT
public:
- explicit GetRepositoriesMetaInfoJob(PackageManagerCorePrivate *corePrivate);
+ explicit GetRepositoriesMetaInfoJob(PackageManagerCore *core);
QStringList temporaryDirectories() const;
QStringList releaseTemporaryDirectories() const;
@@ -91,7 +91,7 @@ private:
bool m_canceled;
int m_silentRetries;
bool m_haveIgnoredError;
- PackageManagerCorePrivate *m_corePrivate;
+ PackageManagerCore *m_core;
QString m_errorString;
QList<Repository> m_repositories;
diff --git a/src/libs/installer/getrepositorymetainfojob.cpp b/src/libs/installer/getrepositorymetainfojob.cpp
index b0386c223..1c8d07525 100644
--- a/src/libs/installer/getrepositorymetainfojob.cpp
+++ b/src/libs/installer/getrepositorymetainfojob.cpp
@@ -44,22 +44,13 @@
#include "lib7z_facade.h"
#include "messageboxhandler.h"
#include "packagemanagercore_p.h"
-#include "qinstallerglobal.h"
#include "utils.h"
#include "kdupdaterfiledownloader.h"
#include "kdupdaterfiledownloaderfactory.h"
-#include <QtCore/QFile>
-#include <QtCore/QTimer>
-#include <QtCore/QUrl>
+#include <QTimer>
-#include <QMessageBox>
-
-#include <QtNetwork/QAuthenticator>
-
-#include <QtXml/QDomDocument>
-#include <QtXml/QDomElement>
using namespace KDUpdater;
using namespace QInstaller;
@@ -120,14 +111,14 @@ private:
// -- GetRepositoryMetaInfoJob
-GetRepositoryMetaInfoJob::GetRepositoryMetaInfoJob(PackageManagerCorePrivate *corePrivate, QObject *parent)
- : KDJob(parent),
- m_canceled(false),
- m_silentRetries(4),
- m_retriesLeft(m_silentRetries),
- m_downloader(0),
- m_waitForDone(false),
- m_corePrivate(corePrivate)
+GetRepositoryMetaInfoJob::GetRepositoryMetaInfoJob(PackageManagerCore *core, QObject *parent)
+ : KDJob(parent)
+ , m_canceled(false)
+ , m_silentRetries(4)
+ , m_retriesLeft(m_silentRetries)
+ , m_downloader(0)
+ , m_waitForDone(false)
+ , m_core(core)
{
setCapabilities(Cancelable);
}
@@ -276,7 +267,10 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished()
QString err;
QDomDocument doc;
- if (!doc.setContent(&updatesFile, &err)) {
+ const bool success = doc.setContent(&updatesFile, &err);
+ updatesFile.close();
+
+ if (!success) {
const QString msg = tr("Could not fetch a valid version of Updates.xml from repository: %1. "
"Error: %2").arg(m_repository.url().toString(), err);
@@ -337,12 +331,11 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadFinished()
}
if (!repositoryUpdates.isEmpty()) {
- if (m_corePrivate->m_data.settings().updateDefaultRepositories(repositoryUpdates)
- == Settings::UpdatesApplied) {
- if (m_corePrivate->isUpdater() || m_corePrivate->isPackageManager())
- m_corePrivate->writeMaintenanceConfigFiles();
- finished(QInstaller::RepositoryUpdatesReceived, tr("Repository updates received."));
- return;
+ if (m_core->settings().updateDefaultRepositories(repositoryUpdates) == Settings::UpdatesApplied) {
+ if (m_core->isUpdater() || m_core->isPackageManager())
+ m_core->writeMaintenanceConfigFiles();
+ finished(QInstaller::RepositoryUpdatesReceived, tr("Repository updates received."));
+ return;
}
}
}
@@ -379,7 +372,7 @@ void GetRepositoryMetaInfoJob::updatesXmlDownloadError(const QString &err)
{
if (m_retriesLeft <= 0) {
const QString msg = tr("Could not fetch Updates.xml from repository: %1. Error: %2")
- .arg(m_repository.url().toString(), err);
+ .arg(m_repository.displayname(), err);
QMessageBox::StandardButtons buttons = QMessageBox::Retry | QMessageBox::Cancel;
const QMessageBox::StandardButton b =
@@ -544,26 +537,26 @@ void GetRepositoryMetaInfoJob::onAuthenticatorChanged(const QAuthenticator &auth
const QString username = authenticator.user();
const QString password = authenticator.password();
if (username != m_repository.username() || password != m_repository.password()) {
- QSet<Repository> repositories = m_corePrivate->m_data.settings().defaultRepositories();
+ QSet<Repository> repositories = m_core->settings().defaultRepositories();
bool reposChanged = updateRepositories(&repositories, username, password);
if (reposChanged)
- m_corePrivate->m_data.settings().setDefaultRepositories(repositories);
+ m_core->settings().setDefaultRepositories(repositories);
- repositories = m_corePrivate->m_data.settings().temporaryRepositories();
+ repositories = m_core->settings().temporaryRepositories();
reposChanged |= updateRepositories(&repositories, username, password);
if (reposChanged) {
- m_corePrivate->m_data.settings().setTemporaryRepositories(repositories,
- m_corePrivate->m_data.settings().hasReplacementRepos());
+ m_core->settings().setTemporaryRepositories(repositories,
+ m_core->settings().hasReplacementRepos());
}
- repositories = m_corePrivate->m_data.settings().userRepositories();
+ repositories = m_core->settings().userRepositories();
reposChanged |= updateRepositories(&repositories, username, password);
if (reposChanged)
- m_corePrivate->m_data.settings().setUserRepositories(repositories);
+ m_core->settings().setUserRepositories(repositories);
if (reposChanged) {
- if (m_corePrivate->isUpdater() || m_corePrivate->isPackageManager())
- m_corePrivate->writeMaintenanceConfigFiles();
+ if (m_core->isUpdater() || m_core->isPackageManager())
+ m_core->writeMaintenanceConfigFiles();
finished(QInstaller::RepositoryUpdatesReceived, tr("Repository updates received."));
}
}
diff --git a/src/libs/installer/getrepositorymetainfojob.h b/src/libs/installer/getrepositorymetainfojob.h
index 8601742a2..803f8b43f 100644
--- a/src/libs/installer/getrepositorymetainfojob.h
+++ b/src/libs/installer/getrepositorymetainfojob.h
@@ -61,7 +61,7 @@ namespace KDUpdater {
namespace QInstaller {
class GetRepositoriesMetaInfoJob;
-class PackageManagerCorePrivate;
+class PackageManagerCore;
class INSTALLER_EXPORT GetRepositoryMetaInfoJob : public KDJob
{
@@ -70,7 +70,7 @@ class INSTALLER_EXPORT GetRepositoryMetaInfoJob : public KDJob
friend class QInstaller::GetRepositoriesMetaInfoJob;
public:
- explicit GetRepositoryMetaInfoJob(PackageManagerCorePrivate *corePrivate, QObject *parent = 0);
+ explicit GetRepositoryMetaInfoJob(PackageManagerCore *core, QObject *parent = 0);
~GetRepositoryMetaInfoJob();
Repository repository() const;
@@ -119,7 +119,7 @@ private:
bool m_waitForDone;
QThreadPool m_threadPool;
- PackageManagerCorePrivate *m_corePrivate;
+ PackageManagerCore *m_core;
};
} // namespace QInstaller
diff --git a/src/libs/installer/globals.cpp b/src/libs/installer/globals.cpp
new file mode 100644
index 000000000..f0910372d
--- /dev/null
+++ b/src/libs/installer/globals.cpp
@@ -0,0 +1,47 @@
+/**************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
+#include "globals.h"
+
+Q_GLOBAL_STATIC_WITH_ARGS(QRegExp, staticCommaRegExp, (QLatin1String("\\b(,|, )\\b")));
+QRegExp QInstaller::commaRegExp()
+{
+ return *staticCommaRegExp();
+}
diff --git a/src/libs/installer/globals.h b/src/libs/installer/globals.h
new file mode 100644
index 000000000..858c856d5
--- /dev/null
+++ b/src/libs/installer/globals.h
@@ -0,0 +1,54 @@
+/**************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
+#ifndef GLOBALS_H
+#define GLOBALS_H
+
+#include "installer_global.h"
+
+#include <QRegExp>
+
+namespace QInstaller {
+
+QRegExp INSTALLER_EXPORT commaRegExp();
+
+} // QInstaller
+
+#endif // GLOBALS_H
diff --git a/src/libs/installer/graph.h b/src/libs/installer/graph.h
new file mode 100644
index 000000000..59778a440
--- /dev/null
+++ b/src/libs/installer/graph.h
@@ -0,0 +1,158 @@
+/**************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
+
+#ifndef GRAPH_H
+#define GRAPH_H
+
+#include <QHash>
+#include <QList>
+#include <QPair>
+#include <QSet>
+
+namespace QInstaller {
+
+template <class T> class Graph
+{
+public:
+ inline Graph() {}
+ explicit Graph(const QList<T> &nodes)
+ {
+ addNodes(nodes);
+ }
+
+ const QList<T> nodes() const
+ {
+ return m_graph.keys();
+ }
+
+ void addNode(const T &node)
+ {
+ m_graph.insert(node, QSet<T>());
+ }
+
+ void addNodes(const QList<T> &nodes)
+ {
+ foreach (const T &node, nodes)
+ addNode(node);
+ }
+
+ QList<T> edges(const T &node) const
+ {
+ return m_graph.value(node).toList();
+ }
+
+ void addEdge(const T &node, const T &edge)
+ {
+ m_graph[node].insert(edge);
+ }
+
+ void addEdges(const T &node, const QList<T> &edges)
+ {
+ foreach (const T &edge, edges)
+ addEdge(node, edge);
+ }
+
+ bool hasCycle() const
+ {
+ return m_hasCycle;
+ }
+
+ QPair<T, T> cycle() const
+ {
+ return m_cycle;
+ }
+
+ QList<T> sort() const
+ {
+ QSet<T> visitedNodes;
+ QList<T> resolvedNodes;
+
+ m_hasCycle = false;
+ m_cycle = qMakePair(T(), T());
+ foreach (const T &node, nodes())
+ visit(node, &resolvedNodes, &visitedNodes);
+ return resolvedNodes;
+ }
+
+ QList<T> sortReverse() const
+ {
+ QList<T> result = sort();
+ std::reverse(result.begin(), result.end());
+ return result;
+ }
+
+private:
+ void visit(const T &node, QList<T> *const resolvedNodes, QSet<T> *const visitedNodes) const
+ {
+ if (m_hasCycle)
+ return;
+
+ // if we visited this node already
+ if (visitedNodes->contains(node)) {
+ // and if the node is already in the ordered list
+ if (resolvedNodes->contains(node))
+ return;
+
+ m_hasCycle = true;
+ m_cycle.second = node;
+ return; // if not yet in the ordered list, we detected a cycle
+ }
+
+ // mark this node as visited
+ visitedNodes->insert(node);
+
+ m_cycle.first = node;
+ // recursively visit all adjacency
+ foreach (const T &adjacency, edges(node))
+ visit(adjacency, resolvedNodes, visitedNodes);
+
+ // append this node the the ordered list
+ resolvedNodes->append(node);
+ }
+
+private:
+ mutable bool m_hasCycle;
+ QHash<T, QSet<T> > m_graph;
+ mutable QPair<T,T> m_cycle;
+};
+
+}
+#endif // GRAPH_H
diff --git a/src/libs/installer/init.cpp b/src/libs/installer/init.cpp
index 40c396ab4..a8a7f54d8 100644
--- a/src/libs/installer/init.cpp
+++ b/src/libs/installer/init.cpp
@@ -62,18 +62,18 @@
// QtSDK specific
#include "qtpatchoperation.h"
+#include "consumeoutputoperation.h"
#include "setdemospathonqtoperation.h"
#include "setexamplespathonqtoperation.h"
#include "setpluginpathonqtcoreoperation.h"
#include "setimportspathonqtcoreoperation.h"
#include "setpathonqtcoreoperation.h"
-#include "registerqtvqnxoperation.h"
+#include "registerqtincreatorqnxoperation.h"
#include "setqtcreatorvalueoperation.h"
#include "addqtcreatorarrayvalueoperation.h"
#include "registertoolchainoperation.h"
#include "registerdefaultdebuggeroperation.h"
-
#ifdef Q_OS_MAC
# include "macreplaceinstallnamesoperation.h"
#endif // Q_OS_MAC
@@ -83,74 +83,63 @@
#include "kdupdaterupdateoperationfactory.h"
#include "kdupdaterfiledownloaderfactory.h"
-#include <unix/C/7zCrc.h>
+#include "7zCrc.h"
#include <QtPlugin>
#include <iostream>
namespace NArchive {
-namespace NBz2 { void registerArcBZip2(); }
-namespace NGz { void registerArcGZip(); }
-namespace NLzma { namespace NLzmaAr { void registerArcLzma(); } }
-namespace NLzma { namespace NLzma86Ar { void registerArcLzma86(); } }
-namespace NSplit { void registerArcSplit(); }
-namespace NXz { void registerArcxz(); }
-namespace NZ { void registerArcZ(); }
+ namespace NXz {
+ void registerArcxz();
+ }
+ namespace NSplit {
+ void registerArcSplit();
+ }
+ namespace NLzma {
+ namespace NLzmaAr {
+ void registerArcLzma();
+ }
+ namespace NLzma86Ar {
+ void registerArcLzma86();
+ }
+ }
}
void registerArc7z();
-void registerArcCab();
-void registerArcTar();
-void registerArcZip();
-void registerCodecBCJ2();
-void registerCodecBCJ();
void registerCodecBCJ();
-void registerCodecByteSwap();
-void registerCodecBZip2();
-void registerCodecCopy();
-void registerCodecDeflate64();
-void registerCodecDeflate();
-void registerCodecDelta();
-void registerCodecLZMA2();
+void registerCodecBCJ2();
+
void registerCodecLZMA();
-void registerCodecPPMD();
-void registerCodec7zAES();
+void registerCodecLZMA2();
+
+void registerCodecDelta();
+void registerCodecBranch();
+void registerCodecByteSwap();
-using namespace NArchive;
using namespace KDUpdater;
using namespace QInstaller;
static void initArchives()
{
- NBz2::registerArcBZip2();
- NGz::registerArcGZip();
- NLzma::NLzmaAr::registerArcLzma();
- NLzma::NLzma86Ar::registerArcLzma86();
- NSplit::registerArcSplit();
- NXz::registerArcxz();
- NZ::registerArcZ();
+ CrcGenerateTable();
+
registerArc7z();
- registerArcCab();
- registerArcTar();
- registerArcZip();
- registerCodecBCJ2();
- registerCodecBCJ();
registerCodecBCJ();
- registerCodecByteSwap();
- registerCodecBZip2();
- registerCodecCopy();
- registerCodecDeflate64();
- registerCodecDeflate();
- registerCodecDelta();
- registerCodecLZMA2();
+ registerCodecBCJ2();
registerCodecLZMA();
- registerCodecPPMD();
- registerCodec7zAES();
+ registerCodecLZMA2();
- CrcGenerateTable();
+ registerCodecDelta();
+ registerCodecBranch();
+ registerCodecByteSwap();
+
+ NArchive::NXz::registerArcxz();
+ NArchive::NSplit::registerArcSplit();
+ NArchive::NLzma::NLzmaAr::registerArcLzma();
+ NArchive::NLzma::NLzma86Ar::registerArcLzma86();
}
#if defined(QT_STATIC)
@@ -205,8 +194,9 @@ void messageHandler(QtMsgType type, const QMessageLogContext &context, const QSt
{
QByteArray ba = trimAndPrepend(type, msg.toLocal8Bit());
if (type != QtDebugMsg) {
- ba += QByteArray(" (") + context.file + QByteArray(":").append(context.line) + QByteArray(", ")
- + context.function + QByteArray(")");
+ ba += QString(QStringLiteral(" (%1:%2, %3)")).arg(
+ QString::fromLatin1(context.file)).arg(context.line).arg(
+ QString::fromLatin1(context.function)).toLocal8Bit();
}
#endif
@@ -229,8 +219,8 @@ void messageHandler(QtMsgType type, const QMessageLogContext &context, const QSt
void QInstaller::init()
{
-#if defined(QT_STATIC)
::initArchives();
+#if defined(QT_STATIC)
::initResources();
#endif
@@ -254,6 +244,7 @@ void QInstaller::init()
factory.registerUpdateOperation<MinimumProgressOperation>(QLatin1String("MinimumProgress"));
factory.registerUpdateOperation<LicenseOperation>(QLatin1String("License"));
factory.registerUpdateOperation<ApplyProductKeyOperation>(QLatin1String("ApplyProductKey"));
+ factory.registerUpdateOperation<ConsumeOutputOperation>(QLatin1String("ConsumeOutput"));
// QtSDK specific
factory.registerUpdateOperation<RegisterQtInCreatorQNXOperation>(QLatin1String("RegisterQtInCreatorQNX"));
diff --git a/src/libs/installer/installer.pro b/src/libs/installer/installer.pro
index 3308876fb..653b65d6f 100644
--- a/src/libs/installer/installer.pro
+++ b/src/libs/installer/installer.pro
@@ -14,6 +14,10 @@ include(../../../installerfw.pri)
# your files if needed
HEADERS += productkeycheck.h
!isEmpty(PRODUCTKEYCHECK_PRI_FILE) {
+ # use undocumented no_batch config which disable the implicit rules on msvc compilers
+ # this fixes the problem that same cpp files in different directories are overwritting
+ # each other
+ CONFIG += no_batch
include($$PRODUCTKEYCHECK_PRI_FILE)
} else {
SOURCES += productkeycheck.cpp
@@ -44,12 +48,14 @@ HEADERS += packagemanagercore.h \
utils.h \
errors.h \
component.h \
+ scriptengine.h \
componentmodel.h \
qinstallerglobal.h \
qtpatch.h \
persistentsettings.h \
projectexplorer_export.h \
qtpatchoperation.h \
+ consumeoutputoperation.h \
setpathonqtcoreoperation.h \
setdemospathonqtoperation.h \
setexamplespathonqtoperation.h \
@@ -58,7 +64,6 @@ HEADERS += packagemanagercore.h \
replaceoperation.h \
linereplaceoperation.h \
registertoolchainoperation.h \
- registerqtvqnxoperation.h \
setqtcreatorvalueoperation.h \
addqtcreatorarrayvalueoperation.h \
copydirectoryoperation.h \
@@ -104,7 +109,10 @@ HEADERS += packagemanagercore.h \
link.h \
createlinkoperation.h \
packagemanagercoredata.h \
- applyproductkeyoperation.h
+ registerqtincreatorqnxoperation.h \
+ applyproductkeyoperation.h \
+ globals.h \
+ graph.h
SOURCES += packagemanagercore.cpp \
packagemanagercore_p.cpp \
@@ -117,10 +125,12 @@ HEADERS += packagemanagercore.h \
fileutils.cpp \
utils.cpp \
component.cpp \
+ scriptengine.cpp \
componentmodel.cpp \
qtpatch.cpp \
persistentsettings.cpp \
qtpatchoperation.cpp \
+ consumeoutputoperation.cpp \
setpathonqtcoreoperation.cpp \
setdemospathonqtoperation.cpp \
setexamplespathonqtoperation.cpp \
@@ -129,7 +139,6 @@ HEADERS += packagemanagercore.h \
replaceoperation.cpp \
linereplaceoperation.cpp \
registertoolchainoperation.cpp \
- registerqtvqnxoperation.cpp \
setqtcreatorvalueoperation.cpp \
addqtcreatorarrayvalueoperation.cpp \
copydirectoryoperation.cpp \
@@ -173,7 +182,9 @@ HEADERS += packagemanagercore.h \
link.cpp \
createlinkoperation.cpp \
packagemanagercoredata.cpp \
- applyproductkeyoperation.cpp
+ registerqtincreatorqnxoperation.cpp \
+ applyproductkeyoperation.cpp \
+ globals.cpp
RESOURCES += resources/patch_file_lists.qrc \
resources/installer.qrc
@@ -189,7 +200,7 @@ unix:!macx:SOURCES += adminauthorization_x11.cpp
LIBS += -l7z
win32 {
- SOURCES += adminauthorization_win.cpp
+ SOURCES += adminauthorization_win.cpp sysinfo_win.cpp
LIBS += -loleaut32 -luser32 # 7zip
LIBS += -ladvapi32 -lpsapi # kdtools
diff --git a/src/libs/installer/installiconsoperation.cpp b/src/libs/installer/installiconsoperation.cpp
index f46ab5315..dba6d644b 100644
--- a/src/libs/installer/installiconsoperation.cpp
+++ b/src/libs/installer/installiconsoperation.cpp
@@ -45,6 +45,7 @@
#include <QtCore/QDir>
#include <QtCore/QDirIterator>
+#include <QDebug>
#if QT_VERSION >= 0x040600
# include <QProcessEnvironment>
@@ -121,10 +122,6 @@ InstallIconsOperation::InstallIconsOperation()
InstallIconsOperation::~InstallIconsOperation()
{
const QStringList backupFiles = value(QLatin1String("backupfiles")).toStringList();
- for (QStringList::const_iterator it = backupFiles.begin(); it != backupFiles.end(); it += 2) {
- const QString& backup = *(it + 1);
- deleteFileNowOrLater(backup);
- }
}
void InstallIconsOperation::backup()
@@ -164,8 +161,6 @@ bool InstallIconsOperation::performOperation()
QDirIterator it(sourceDir.path(), QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot,
QDirIterator::Subdirectories);
while (it.hasNext()) {
- qApp->processEvents();
-
const int status = core->status();
if (status == PackageManagerCore::Canceled || status == PackageManagerCore::Failure)
return true;
@@ -194,7 +189,7 @@ bool InstallIconsOperation::performOperation()
if (QFile(target).exists()) {
// first backup...
- const QString backup = generateTemporaryFileName(target + QLatin1String("XXXXXX"));
+ const QString backup = generateTemporaryFileName(target);
QFile bf(target);
if (!bf.copy(backup)) {
setError(UserDefinedError);
@@ -251,12 +246,10 @@ bool InstallIconsOperation::performOperation()
bool InstallIconsOperation::undoOperation()
{
- bool success = true;
-
+ QStringList warningMessages;
// first copy back all files to their origin
const QStringList files = value(QLatin1String("files")).toStringList();
for (QStringList::const_iterator it = files.begin(); it != files.end(); it += 2) {
- qApp->processEvents();
const QString& source = *it;
const QString& target = *(it + 1);
@@ -264,10 +257,11 @@ bool InstallIconsOperation::undoOperation()
// first make sure the "source" path is valid
QDir().mkpath(QFileInfo(source).absolutePath());
- // now copy target to source (feels weird, I know...)
- success = QFile::copy(target, source) && success;
- // and remove target
- success = QFile::remove(target) && success;
+ QFile installedTarget(target);
+ if (installedTarget.exists() && !(installedTarget.copy(source) && installedTarget.remove())) {
+ warningMessages << QString::fromLatin1("Could not move file from '%1' to '%2', error: %3)").arg(
+ target, source, installedTarget.errorString());
+ }
}
// then copy back and remove all backuped files
@@ -278,11 +272,17 @@ bool InstallIconsOperation::undoOperation()
// remove the target
if (QFile::exists(target))
- success = deleteFileNowOrLater(target) && success;
+ deleteFileNowOrLater(target);
// then copy the backup onto the target
- success = QFile::copy(backup, target) && success;
+ if (!QFile::copy(backup, target)) {
+ warningMessages << QString::fromLatin1("Could not restore the backup '%1' to '%2'").arg(
+ backup, target);
+ }
+
// finally remove the backp
- success = deleteFileNowOrLater(backup) && success;
+ if (!deleteFileNowOrLater(backup))
+ warningMessages << QString::fromLatin1("Could not remove the backup '%1'").arg(backup);
+
}
// then remove all directories created by us
@@ -290,10 +290,19 @@ bool InstallIconsOperation::undoOperation()
for (QStringList::const_iterator it = createdDirectories.begin(); it != createdDirectories.end(); ++it) {
const QDir dir(*it);
removeSystemGeneratedFiles(dir.absolutePath());
- success = QDir::root().rmdir(dir.path());
+ if (dir.exists() && !QDir::root().rmdir(dir.path()))
+ warningMessages << QString::fromLatin1("Could not remove directory '%1'").arg(dir.path());
+ }
+
+ if (!warningMessages.isEmpty()) {
+ qWarning() << QString::fromLatin1("Undo of operation '%1' with arguments '%2' had some problems.").arg(
+ name(), arguments().join(QLatin1String(", ")));
+ foreach (const QString &message, warningMessages) {
+ qWarning() << message;
+ }
}
- return success;
+ return true;
}
bool InstallIconsOperation::testOperation()
diff --git a/src/libs/installer/lib7z_facade.cpp b/src/libs/installer/lib7z_facade.cpp
index 3695c0038..a818e9a61 100644
--- a/src/libs/installer/lib7z_facade.cpp
+++ b/src/libs/installer/lib7z_facade.cpp
@@ -1,3 +1,43 @@
+/**************************************************************************
+**
+** Copyright (C) 2012-2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
#include "lib7z_facade.h"
#include "errors.h"
@@ -17,12 +57,13 @@
#include "Windows/PropVariant.h"
#include "Windows/PropVariantConversions.h"
-#include <QtCore/QDir>
-#include <QtCore/QFileInfo>
-#include <QtCore/QIODevice>
+#include <QDir>
+#include <QFileInfo>
+#include <QIODevice>
#include <QtCore/QMutexLocker>
-#include <QtCore/QPointer>
-#include <QtCore/QTemporaryFile>
+#include <QPointer>
+#include <QTemporaryFile>
+#include <QReadWriteLock>
#ifdef _MSC_VER
#pragma warning(disable:4297)
@@ -99,9 +140,9 @@ namespace {
*/
struct DirectoryGuard {
explicit DirectoryGuard(const QString &path)
- : m_path(path),
- m_created(false),
- m_released(false)
+ : m_path(path)
+ , m_created(false)
+ , m_released(false)
{
m_path.replace(QLatin1Char('\\'), QLatin1Char('/'));
}
@@ -293,40 +334,39 @@ namespace Lib7z {
class QIODeviceSequentialOutStream : public ISequentialOutStream, public CMyUnknownImp
{
public:
- enum DestructorBehavior{
- CloseAndDeleteIODeviceAtDestructor,
- KeepIODeviceAtItIsAtDestructor
+ enum Behavior {
+ KeepDeviceUntouched,
+ CloseAndDeleteDevice
};
MY_UNKNOWN_IMP
- explicit QIODeviceSequentialOutStream(QIODevice* device, DestructorBehavior behavior);
+ explicit QIODeviceSequentialOutStream(QIODevice* device, Behavior behavior);
~QIODeviceSequentialOutStream();
QString errorString() const;
/* reimp */ STDMETHOD(Write)(const void* data, UInt32 size, UInt32* processedSize);
private:
- QPointer<QIODevice> m_device;
- const DestructorBehavior m_destructorBehavior;
+ Behavior m_behavior;
QString m_errorString;
+ QPointer<QIODevice> m_device;
};
-QIODeviceSequentialOutStream::QIODeviceSequentialOutStream(QIODevice* device, DestructorBehavior behavior)
+QIODeviceSequentialOutStream::QIODeviceSequentialOutStream(QIODevice* device, Behavior behavior)
: ISequentialOutStream()
, CMyUnknownImp()
+ , m_behavior(behavior)
, m_device(device)
- , m_destructorBehavior(behavior)
{
Q_ASSERT(m_device);
- if (!m_device->open(QIODevice::WriteOnly)) {
+ if (!device->isOpen() && !m_device->open(QIODevice::WriteOnly))
m_errorString = m_device->errorString();
- }
}
QIODeviceSequentialOutStream::~QIODeviceSequentialOutStream()
{
- if (m_destructorBehavior == CloseAndDeleteIODeviceAtDestructor) {
+ if (m_behavior == CloseAndDeleteDevice) {
m_device->close();
delete m_device;
m_device = 0;
@@ -724,12 +764,12 @@ class Lib7z::ExtractCallbackImpl : public IArchiveExtractCallback, public CMyUnk
public:
MY_UNKNOWN_IMP
explicit ExtractCallbackImpl(ExtractCallback* qq)
- : q(qq),
- currentIndex(0),
- arc(0),
- total(0),
- completed(0),
- device(0)
+ : q(qq)
+ , currentIndex(0)
+ , arc(0)
+ , total(0)
+ , completed(0)
+ , device(0)
{
}
@@ -751,7 +791,7 @@ public:
*outStream = 0;
if (device != 0) {
QIODeviceSequentialOutStream *qOutStream = new QIODeviceSequentialOutStream(device,
- QIODeviceSequentialOutStream::KeepIODeviceAtItIsAtDestructor);
+ QIODeviceSequentialOutStream::KeepDeviceUntouched);
if (!qOutStream->errorString().isEmpty()) {
Lib7z::setLastError(qOutStream->errorString());
return E_FAIL;
@@ -800,7 +840,7 @@ public:
}
#endif
QIODeviceSequentialOutStream *qOutStream = new QIODeviceSequentialOutStream(
- new QFile(fi.absoluteFilePath()), QIODeviceSequentialOutStream::CloseAndDeleteIODeviceAtDestructor);
+ new QFile(fi.absoluteFilePath()), QIODeviceSequentialOutStream::CloseAndDeleteDevice);
if (!qOutStream->errorString().isEmpty()) {
Lib7z::setLastError(QObject::tr("Could not open file: %1 (%2)").arg(
fi.absoluteFilePath(), qOutStream->errorString()));
@@ -1172,9 +1212,9 @@ class ExtractItemJob::Private
{
public:
Private(ExtractItemJob* qq)
- : q(qq),
- target(0),
- callback(new ExtractCallbackJobImpl(q))
+ : q(qq)
+ , target(0)
+ , callback(new ExtractCallbackJobImpl(q))
{
}
@@ -1361,7 +1401,8 @@ void Lib7z::createArchive(QIODevice* archive, const QStringList &sourcePaths, Up
}
}
-void Lib7z::extractArchive(QIODevice* archive, const File& item, QIODevice* target, ExtractCallback* callback)
+void Lib7z::extractFileFromArchive(QIODevice* archive, const File& item, QIODevice* target,
+ ExtractCallback* callback)
{
assert(archive);
assert(target);
@@ -1398,20 +1439,22 @@ void Lib7z::extractArchive(QIODevice* archive, const File& item, QIODevice* targ
assert(item.path == UString2QString(s).replace(QLatin1Char('\\'), QLatin1Char('/')));
callback->setTarget(target);
- const LONG extractResult = parchive->Extract(&itemIdx, 1, /*testmode=*/1, callback->impl());
+ const LONG extractResult = parchive->Extract(&itemIdx, 1, /*testmode=*/0, callback->impl());
if (extractResult != S_OK)
throw SevenZipException(errorMessageFrom7zResult(extractResult));
} catch (const char *err) {
throw SevenZipException(err);
+ } catch (const Lib7z::SevenZipException& e) {
+ throw e;
} catch (...) {
throw SevenZipException(QObject::tr("Unknown exception caught (%1)")
.arg(QString::fromLatin1(Q_FUNC_INFO)));
}
}
-void Lib7z::extractArchive(QIODevice* archive, const File& item, const QString &targetDirectory,
+void Lib7z::extractFileFromArchive(QIODevice* archive, const File& item, const QString &targetDirectory,
ExtractCallback* callback)
{
assert(archive);
@@ -1428,10 +1471,10 @@ void Lib7z::extractArchive(QIODevice* archive, const File& item, const QString &
throw SevenZipException(QObject::tr("Could not create output file for writing: %1")
.arg(fi.absoluteFilePath()));
}
+ callback->setTarget(&out);
+ extractFileFromArchive(archive, item, &out, callback);
if (item.permissions)
out.setPermissions(item.permissions);
- callback->setTarget(&out);
- extractArchive(archive, item, &out, callback);
outDir.release();
}
@@ -1518,9 +1561,9 @@ void ExtractItemJob::doStart()
if (!d->archive)
throw SevenZipException(tr("Could not list archive: QIODevice not set or already destroyed."));
if (d->target)
- extractArchive(d->archive, d->item, d->target, d->callback);
+ extractFileFromArchive(d->archive, d->item, d->target, d->callback);
else if (!d->item.path.isEmpty())
- extractArchive(d->archive, d->item, d->targetDirectory, d->callback);
+ extractFileFromArchive(d->archive, d->item, d->targetDirectory, d->callback);
else
extractArchive(d->archive, d->targetDirectory, d->callback);
} catch (const SevenZipException& e) {
diff --git a/src/libs/installer/lib7z_facade.h b/src/libs/installer/lib7z_facade.h
index 515d63bba..a783fbd44 100644
--- a/src/libs/installer/lib7z_facade.h
+++ b/src/libs/installer/lib7z_facade.h
@@ -1,17 +1,56 @@
+/**************************************************************************
+**
+** Copyright (C) 2012-2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
#ifndef LIB7Z_FACADE_H
#define LIB7Z_FACADE_H
#include "installer_global.h"
+#include <QCoreApplication>
#include <QDateTime>
-#include <QtCore/QCoreApplication>
-#include <QtCore/QFile>
-#include <QtCore/QPoint>
-#include <QtCore/QRunnable>
-#include <QtCore/QString>
-#include <QtCore/QVector>
-#include <QtCore/QVariant>
-#include <QtCore/QReadWriteLock>
+#include <QFile>
+#include <QPoint>
+#include <QRunnable>
+#include <QString>
+#include <QVariant>
+#include <QVector>
#include "Common/MyWindows.h"
@@ -46,7 +85,6 @@ namespace Lib7z {
QFile::Permissions permissions;
QString path;
- QString name;
QDateTime mtime;
quint64 uncompressedSize;
quint64 compressedSize;
@@ -112,20 +150,32 @@ namespace Lib7z {
void deviceDestroyed(QObject*);
};
- /*
- * @throws Lib7z::SevenZipException
- */
- void INSTALLER_EXPORT extractArchive( QIODevice* archive, const File& item, QIODevice* out, ExtractCallback* callback=0 );
+ /*!
+ Extracts the given File \a file from \a archive into output device \a out using the provided extract
+ callback \a callback.
- /*
- * @throws Lib7z::SevenZipException
- */
- void INSTALLER_EXPORT extractArchive( QIODevice* archive, const File& item, const QString& targetDirectory, ExtractCallback* callback=0 );
+ Throws Lib7z::SevenZipException on error.
+ */
+ void INSTALLER_EXPORT extractFileFromArchive(QIODevice* archive, const File& item, QIODevice* out,
+ ExtractCallback* callback=0 );
- /*
- * @throws Lib7z::SevenZipException
- */
- void INSTALLER_EXPORT extractArchive( QIODevice* archive, const QString& targetDirectory, ExtractCallback* callback=0 );
+ /*!
+ Extracts the given File \a file from \a archive into target directory \a targetDirectory using the
+ provided extract callback \a callback. The output filename is deduced from the \a file path name.
+
+ Throws Lib7z::SevenZipException on error.
+ */
+ void INSTALLER_EXPORT extractFileFromArchive(QIODevice* archive, const File& item,
+ const QString& targetDirectory, ExtractCallback* callback = 0);
+
+ /*!
+ Extracts the given \a archive content into target directory \a targetDirectory using the
+ provided extract callback \a callback. The output filenames are deduced from the \a archive content.
+
+ Throws Lib7z::SevenZipException on error.
+ */
+ void INSTALLER_EXPORT extractArchive(QIODevice* archive, const QString& targetDirectory,
+ ExtractCallback* callback = 0);
/*
* @thows Lib7z::SevenZipException
diff --git a/src/libs/installer/link.h b/src/libs/installer/link.h
index fc8d8fee3..e359c8f91 100644
--- a/src/libs/installer/link.h
+++ b/src/libs/installer/link.h
@@ -47,7 +47,7 @@
class Link
{
public:
- Link(const QString &path);
+ explicit Link(const QString &path);
static Link create(const QString &link, const QString &targetPath);
QString targetPath() const;
bool targetExists();
diff --git a/src/libs/installer/macreplaceinstallnamesoperation.cpp b/src/libs/installer/macreplaceinstallnamesoperation.cpp
index a79072481..fa5e6139a 100644
--- a/src/libs/installer/macreplaceinstallnamesoperation.cpp
+++ b/src/libs/installer/macreplaceinstallnamesoperation.cpp
@@ -198,9 +198,8 @@ void MacReplaceInstallNamesOperation::relocateBinary(const MacBinaryInfo &info,
// change framework ID only if dynamicLibId isn't only the filename, if it has no relative path ("@")
- // and is not existing at the current looking for location
if (!info.dynamicLibId.isEmpty() && (info.dynamicLibId != QFileInfo(info.fileName).fileName())
- && !info.dynamicLibId.contains(QLatin1String("@")) && !QFileInfo(info.dynamicLibId).exists()) {
+ && !info.dynamicLibId.contains(QLatin1String("@"))) {
// error is set inside the execCommand method
if (!execCommand(QLatin1String("install_name_tool"), QStringList(QLatin1String("-id"))
<< info.fileName << info.fileName)) {
diff --git a/src/libs/installer/macreplaceinstallnamesoperation.h b/src/libs/installer/macreplaceinstallnamesoperation.h
index 635f60054..f4b76de6d 100644
--- a/src/libs/installer/macreplaceinstallnamesoperation.h
+++ b/src/libs/installer/macreplaceinstallnamesoperation.h
@@ -39,8 +39,8 @@
**
**************************************************************************/
-#ifndef MACREPLACEINSTALLNAMEOPERATION_H
-#define MACREPLACEINSTALLNAMEOPERATION_H
+#ifndef MACREPLACEINSTALLNAMESOPERATION_H
+#define MACREPLACEINSTALLNAMESOPERATION_H
#include "qinstallerglobal.h"
@@ -85,4 +85,4 @@ private:
} // namespace QInstaller
-#endif // MACREPLACEINSTALLNAMEOPERATION_H
+#endif // MACREPLACEINSTALLNAMESOPERATION_H
diff --git a/src/libs/installer/messageboxhandler.cpp b/src/libs/installer/messageboxhandler.cpp
index cb9a845ff..69fc62570 100644
--- a/src/libs/installer/messageboxhandler.cpp
+++ b/src/libs/installer/messageboxhandler.cpp
@@ -47,76 +47,90 @@
#include <QDialogButtonBox>
#include <QPushButton>
-#include <QtScript/QScriptEngine>
-#include <QtScript/QScriptValue>
+/*!
+ \qmltype QMessageBox
+ \inqmlmodule scripting
-QScriptValue QInstaller::registerMessageBox(QScriptEngine *scriptEngine)
-{
- // register QMessageBox::StandardButton enum in the script connection
- QScriptValue messageBox = scriptEngine->newQObject(MessageBoxHandler::instance());
- messageBox.setProperty(QLatin1String("Ok"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Yes)));
- messageBox.setProperty(QLatin1String("Open"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Open)));
- messageBox.setProperty(QLatin1String("Save"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Save)));
- messageBox.setProperty(QLatin1String("Cancel"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Cancel)));
- messageBox.setProperty(QLatin1String("Close"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Close)));
- messageBox.setProperty(QLatin1String("Discard"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Discard)));
- messageBox.setProperty(QLatin1String("Apply"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Apply)));
- messageBox.setProperty(QLatin1String("Reset"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Reset)));
- messageBox.setProperty(QLatin1String("RestoreDefaults"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::RestoreDefaults)));
- messageBox.setProperty(QLatin1String("Help"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Help)));
- messageBox.setProperty(QLatin1String("SaveAll"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::SaveAll)));
- messageBox.setProperty(QLatin1String("Yes"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Yes)));
- messageBox.setProperty(QLatin1String("YesToAll"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::YesToAll)));
- messageBox.setProperty(QLatin1String("No"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::No)));
- messageBox.setProperty(QLatin1String("NoToAll"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::NoToAll)));
- messageBox.setProperty(QLatin1String("Abort"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Abort)));
- messageBox.setProperty(QLatin1String("Retry"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Retry)));
- messageBox.setProperty(QLatin1String("Ignore"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::Ignore)));
- messageBox.setProperty(QLatin1String("NoButton"),
- scriptEngine->newVariant(static_cast<int>(QMessageBox::NoButton)));
- scriptEngine->globalObject().setProperty(QLatin1String("QMessageBox"), messageBox);
-
- return messageBox;
-}
+ \brief The QMessageBox type provides a modal dialog for informing the
+ user or asking the user a question and receiving an answer.
-using namespace QInstaller;
-template <typename T>
-static QList<T> reversed(const QList<T> &list)
-{
- qFatal("This seems to be broken, check this!!!!");
- // TODO: Figure out what should happen here. See setDefaultAction(...).
-#if 1
- // Note: This does not what the function name implies???
- QList<T> res = list;
- qCopyBackward(list.begin(), list.end(), res.end());
- return res;
-#else
- // Note: This does what the function name implies, but we need to check if this is what we want.
- QList<T> res = list;
- std::reverse(res.begin(), res.end());
- return res;
-#endif
-}
+ \code
+ var result = QMessageBox.question("quit.question", "Installer", "Do you want to quit the installer?",
+ QMessageBox.Yes | QMessageBox.No);
+ if (result == QMessageBox.Yes) {
+ // ...
+ }
+ \endcode
+
+ \section2 Buttons
+
+ QMessageBox defines a list of common buttons:
+ \list
+ \li QMessageBox.Ok
+ \li QMessageBox.Open
+ \li QMessageBox.Save
+ \li QMessageBox.Cancel
+ \li QMessageBox.Close
+ \li QMessageBox.Discard
+ \li QMessageBox.Apply
+ \li QMessageBox.Reset
+ \li QMessageBox.RestoreDefaults
+ \li QMessageBox.Help
+ \li QMessageBox.SaveAll
+ \li QMessageBox.Yes
+ \li QMessageBox.YesToAll
+ \li QMessageBox.No
+ \li QMessageBox.NoToAll
+ \li QMessageBox.Abort
+ \li QMessageBox.Retry
+ \li QMessageBox.Ignore
+ \li QMessageBox.NoButton
+ \endlist
+
+ \section2 Scripted Installations
+
+ Sometimes it is useful to automatically close message boxes, for example during a scripted
+ installation. This can be achieved by calling
+ Installer::setMessageBoxAutomaticAnswer, Installer::autoAcceptMessageBoxes,
+ Installer::autoRejectMessageBoxes. The \c identifier argument in the method calls
+ allows to identify specific message boxes for this purpose.
+ */
+
+
+/*!
+ \qmlmethod Button QMessageBox::critical(string identifier, string title, string text,
+ Buttons buttons = QMessageBox.Ok, Button button
+ = QMessageBox.NoButton)
+
+ Opens a critical message box with the given \a title and \a text.
+*/
+
+/*!
+ \qmlmethod Button QMessageBox::information(string identifier, string title, string text,
+ Buttons buttons = QMessageBox.Ok, Button button
+ = QMessageBox.NoButton)
+
+ Opens an information message box with the given \a title and \a text.
+*/
+
+/*!
+ \qmlmethod Button QMessageBox::question(string identifier, string title, string text,
+ Buttons buttons = QMessageBox.Yes | QMessageBox.No, Button button
+ = QMessageBox.NoButton)
+
+ Opens a question message box with the given \a title and \a text.
+*/
+
+/*!
+ \qmlmethod Button QMessageBox::warning(string identifier, string title, string text,
+ Buttons buttons = QMessageBox.Ok, Button button
+ = QMessageBox.NoButton)
+
+ Opens a warning message box with the given \a title and \a text.
+*/
+using namespace QInstaller;
// -- MessageBoxHandler
@@ -151,6 +165,19 @@ QWidget *MessageBoxHandler::currentBestSuitParent()
return qApp->activeWindow();
}
+QList<QMessageBox::Button> MessageBoxHandler::orderedButtons()
+{
+ static QList<QMessageBox::Button> buttons;
+ if (!buttons.isEmpty())
+ return buttons;
+ buttons << QMessageBox::YesToAll << QMessageBox::Yes << QMessageBox::Ok << QMessageBox::Apply
+ << QMessageBox::SaveAll << QMessageBox::Save <<QMessageBox::Retry << QMessageBox::Ignore
+ << QMessageBox::Help << QMessageBox::RestoreDefaults << QMessageBox::Reset << QMessageBox::Open
+ << QMessageBox::Cancel << QMessageBox::Close << QMessageBox::Abort << QMessageBox::Discard
+ << QMessageBox::No << QMessageBox::NoToAll;
+ return buttons;
+}
+
void MessageBoxHandler::setDefaultAction(DefaultAction defaultAction)
{
if (m_defaultAction == defaultAction)
@@ -159,17 +186,13 @@ void MessageBoxHandler::setDefaultAction(DefaultAction defaultAction)
m_buttonOrder.clear();
if (m_defaultAction != AskUser) {
- m_buttonOrder << QMessageBox::YesToAll << QMessageBox::Yes << QMessageBox::Ok << QMessageBox::Apply
- << QMessageBox::SaveAll << QMessageBox::Save <<QMessageBox::Retry << QMessageBox::Ignore
- << QMessageBox::Help << QMessageBox::RestoreDefaults << QMessageBox::Reset << QMessageBox::Open
- << QMessageBox::Cancel << QMessageBox::Close << QMessageBox::Abort << QMessageBox::Discard
- << QMessageBox::No << QMessageBox::NoToAll;
+ m_buttonOrder = orderedButtons();
}
if (m_defaultAction == Reject) {
// If we want to reject everything, we need the lowest button. For example, if Cancel is existing it
// could use Cancel, but if Close is existing it will use Close.
- m_buttonOrder = reversed(m_buttonOrder);
+ std::reverse(m_buttonOrder.begin(), m_buttonOrder.end());
}
}
diff --git a/src/libs/installer/messageboxhandler.h b/src/libs/installer/messageboxhandler.h
index b0b0fb6f2..bc3edce3b 100644
--- a/src/libs/installer/messageboxhandler.h
+++ b/src/libs/installer/messageboxhandler.h
@@ -51,8 +51,6 @@
namespace QInstaller {
-QScriptValue registerMessageBox(QScriptEngine *scriptEngine);
-
class INSTALLER_EXPORT MessageBoxHandler : public QObject, private QScriptable
{
Q_OBJECT
@@ -110,6 +108,8 @@ public:
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
QMessageBox::StandardButton button = QMessageBox::NoButton) const;
+ static QList<QMessageBox::Button> orderedButtons();
+
private Q_SLOTS:
//this removes the slot from the script area
virtual void deleteLater() {
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp
index cb957f9aa..007354f5d 100644
--- a/src/libs/installer/packagemanagercore.cpp
+++ b/src/libs/installer/packagemanagercore.cpp
@@ -39,6 +39,7 @@
**
**************************************************************************/
#include "packagemanagercore.h"
+#include "packagemanagercore_p.h"
#include "adminauthorization.h"
#include "binaryformat.h"
@@ -47,12 +48,11 @@
#include "downloadarchivesjob.h"
#include "errors.h"
#include "fsengineclient.h"
+#include "globals.h"
#include "getrepositoriesmetainfojob.h"
#include "messageboxhandler.h"
-#include "packagemanagercore_p.h"
#include "packagemanagerproxyfactory.h"
#include "progresscoordinator.h"
-#include "qinstallerglobal.h"
#include "qprocesswrapper.h"
#include "qsettingswrapper.h"
#include "settings.h"
@@ -71,9 +71,6 @@
#include <QDesktopServices>
#include <QFileDialog>
-#include <QtScript/QScriptEngine>
-#include <QtScript/QScriptContext>
-
#include "kdsysinfo.h"
#include "kdupdaterupdateoperationfactory.h"
@@ -85,30 +82,267 @@
# include <QStandardPaths>
#endif
+/*!
+ \qmltype QInstaller
+ \inqmlmodule scripting
+
+ \brief Provides access to the installer from Qt Script.
+
+ Use the \c installer object in the global namespace to access functionality of the installer.
+
+ \section2 Wizard Pages
+
+ The installer has various pre-defined pages that can be used to for example insert pages
+ in a certain place:
+ \list
+ \li QInstaller.Introduction
+ \li QInstaller.TargetDirectory
+ \li QInstaller.ComponentSelection
+ \li QInstaller.LicenseCheck
+ \li QInstaller.StartMenuSelection
+ \li QInstaller.ReadyForInstallation
+ \li QInstaller.PerformInstallation
+ \li QInstaller.InstallationFinished
+ \li QInstaller.End
+ \endlist
+*/
+
+
+/*!
+ \qmlproperty enumeration QInstaller::status
+
+ Status of the installer.
+
+ Possible values are:
+ \list
+ \li QInstaller.Success (deprecated: QInstaller.InstallerSucceeded)
+ \li QInstaller.Failure (deprecated: QInstaller.InstallerFailed)
+ \li QInstaller.Running (deprecated: QInstaller.InstallerFailed)
+ \li QInstaller.Canceled (deprecated: QInstaller.CanceledByUser)
+ \li deprecated: QInstaller.InstallerUnfinished
+ \endlist
+*/
+
+/*!
+ \qmlsignal QInstaller::aboutCalculateComponentsToInstall()
+
+ Emitted before the ordered list of components to install is calculated.
+*/
+
+/*!
+ \qmlsignal QInstaller::componentAdded(Component component)
+
+ Emitted when a new root component has been added.
+
+ \sa rootComponentsAdded, updaterComponentsAdded
+*/
+
+/*!
+ \qmlsignal QInstaller::rootComponentsAdded(list<Component> components)
+
+ Emitted when a new list of root components has been added.
+
+ \sa componentAdded, updaterComponentsAdded
+*/
+
+/*!
+ \qmlsignal QInstaller::updaterComponentsAdded(list<Component> components)
+
+ Emitted when a new list of updater components has been added.
+ \sa componentAdded, rootComponentsAdded
+*/
+
+/*!
+ \qmlsignal QInstaller::componentsAboutToBeCleared()
+
+ Deprecated, and not emitted any more.
+*/
+
+/*!
+ \qmlsignal QInstaller::valueChanged(string key, string value)
+
+ Emitted whenever a value changes.
+
+ \sa setValue
+*/
+
+/*!
+ \qmlsignal QInstaller::statusChanged(Status status)
+
+ Emitted whenever the installer status changes.
+*/
+
+/*!
+ \qmlsignal QInstaller::currentPageChanged(int page)
+
+ Emitted whenever the current page changes.
+*/
+
+/*!
+ \qmlsignal QInstaller::finishButtonClicked()
+
+ Emitted when the user clicks the \uicontrol Finish button of the installer.
+*/
+
+/*!
+ \qmlsignal QInstaller::metaJobInfoMessage(string message)
+
+ Triggered with informative updates of the communication with a remote repository.
+ This is only useful for debugging purposes.
+*/
+
+/*!
+ \qmlsignal QInstaller::startAllComponentsReset()
+
+ Triggered when the list of components starts to get updated.
+
+ \sa finishAllComponentsReset
+*/
+
+/*!
+ \qmlsignal QInstaller::finishAllComponentsReset(list<Component> rootComponents)
+
+ Triggered when the list of new root components has been updated.
+
+ \sa startAllComponentsReset
+*/
+
+/*!
+ \qmlsignal QInstaller::startUpdaterComponentsReset()
+
+ Triggered when components start to get updated during a remote update.
+*/
+
+/*!
+ \qmlsignal QInstaller::finishUpdaterComponentsReset(list<Component> componentsWithUpdates)
+
+ Triggered when the list of available remote updates has been updated.
+*/
+
+/*!
+ \qmlsignal QInstaller::installationStarted()
+
+ Triggered when installation has started.
+
+ \sa installationFinished installationInterrupted
+*/
+
+/*!
+ \qmlsignal QInstaller::installationInterrupted()
+
+ Triggered when installation has been interrupted (cancelled).
+
+ \sa interrupt installationStarted installationFinished
+*/
+
+/*!
+ \qmlsignal QInstaller::installationFinished()
+
+ Triggered when installation has been finished.
+
+ \sa installationStarted installationInterrupted
+*/
+
+/*!
+ \qmlsignal QInstaller::updateFinished()
+
+ Triggered when an update has been finished.
+*/
+
+/*!
+ \qmlsignal QInstaller::uninstallationStarted()
+
+ Triggered when uninstallation has started.
+
+ \sa uninstallationFinished
+*/
+
+/*!
+ \qmlsignal QInstaller::uninstallationFinished()
+
+ Triggered when uninstallation has been finished.
+
+ \sa uninstallationStarted
+*/
+
+/*!
+ \qmlsignal QInstaller::titleMessageChanged(string title)
+
+ Emitted when the text of the installer status (on the PerformInstallation page) changes to
+ \a title.
+*/
+
+/*!
+ \qmlsignal QInstaller::wizardPageInsertionRequested(Widget widget, WizardPage page)
+
+ Emitted when a custom \a widget is about to be inserted into \a page by addWizardPage.
+*/
+
+/*!
+ \qmlsignal QInstaller::wizardPageRemovalRequested(Widget widget)
+
+ Emitted when a \a widget is removed by removeWizardPage.
+*/
+
+/*!
+ \qmlsignal QInstaller::wizardWidgetInsertionRequested(Widget widget, WizardPage page)
+
+ Emitted when a \a widget is inserted into \a page by addWizardPageItem.
+*/
+
+/*!
+ \qmlsignal QInstaller::wizardWidgetRemovalRequested(Widget widget)
+
+ Emitted when a \a widget is removed by removeWizardPageItem.
+*/
+
+/*!
+ \qmlsignal QInstaller::wizardPageVisibilityChangeRequested(bool visible, int page)
+
+ Emitted when the visibility of the page with id \a page changes to \a visible.
+
+ \sa setDefaultPageVisible
+*/
+
+/*!
+ \qmlsignal QInstaller::setValidatorForCustomPageRequested(Componentcomponent, string name,
+ string callbackName)
+
+ Triggered when setValidatorForCustomPage is called.
+*/
+
+/*!
+ \qmlsignal QInstaller::setAutomatedPageSwitchEnabled(bool request)
+
+ Triggered when the automatic switching from PerformInstallation to InstallationFinished page
+ is enabled (\a request = \c true) or disabled (\a request = \c false).
+
+ The automatic switching is disabled automatically when for example the user expands or unexpands
+ the \gui Details section of the PerformInstallation page.
+*/
+
+/*!
+ \qmlsignal QInstaller::coreNetworkSettingsChanged()
+
+ Emitted when the network settings are changed.
+*/
+
+/*!
+ \qmlmethod list<Component> QInstaller::components()
+
+ Returns the list of all components.
+*/
+
using namespace QInstaller;
-static QMutex sModelMutex;
+Q_GLOBAL_STATIC(QMutex, globalModelMutex);
static QFont *sVirtualComponentsFont = 0;
-static QMutex sVirtualComponentsFontMutex;
+Q_GLOBAL_STATIC(QMutex, globalVirtualComponentsFontMutex);
static bool sNoForceInstallation = false;
static bool sVirtualComponentsVisible = false;
static bool sCreateLocalRepositoryFromBinary = false;
-static QScriptValue checkArguments(QScriptContext *context, int amin, int amax)
-{
- if (context->argumentCount() < amin || context->argumentCount() > amax) {
- if (amin != amax) {
- return context->throwError(QObject::tr("Invalid arguments: %1 arguments given, %2 to "
- "%3 expected.").arg(QString::number(context->argumentCount()),
- QString::number(amin), QString::number(amax)));
- }
- return context->throwError(QObject::tr("Invalid arguments: %1 arguments given, %2 expected.")
- .arg(QString::number(context->argumentCount()), QString::number(amin)));
- }
- return QScriptValue();
-}
-
static bool componentMatches(const Component *component, const QString &name,
const QString &version = QString())
{
@@ -131,12 +365,12 @@ Component *PackageManagerCore::subComponentByName(const QInstaller::PackageManag
if (check != 0 && componentMatches(check, name, version))
return check;
- if (installer->runMode() == AllMode) {
+ if (!installer->isUpdater()) {
QList<Component*> rootComponents;
if (check == 0)
rootComponents = installer->rootComponents();
else
- rootComponents = check->childComponents(false, AllMode);
+ rootComponents = check->childComponents(Component::DirectChildrenOnly);
foreach (QInstaller::Component *component, rootComponents) {
Component *const result = subComponentByName(installer, name, version, component);
@@ -154,146 +388,6 @@ Component *PackageManagerCore::subComponentByName(const QInstaller::PackageManag
return 0;
}
-/*!
- Scriptable version of PackageManagerCore::componentByName(QString).
- \sa PackageManagerCore::componentByName
- */
-QScriptValue QInstaller::qInstallerComponentByName(QScriptContext *context, QScriptEngine *engine)
-{
- const QScriptValue check = checkArguments(context, 1, 1);
- if (check.isError())
- return check;
-
- // well... this is our "this" pointer
- PackageManagerCore *const core = dynamic_cast<PackageManagerCore*>(engine->globalObject()
- .property(QLatin1String("installer")).toQObject());
-
- const QString name = context->argument(0).toString();
- return engine->newQObject(core->componentByName(name));
-}
-
-QScriptValue QInstaller::qDesktopServicesOpenUrl(QScriptContext *context, QScriptEngine *engine)
-{
- Q_UNUSED(engine);
- const QScriptValue check = checkArguments(context, 1, 1);
- if (check.isError())
- return check;
- QString url = context->argument(0).toString();
- url.replace(QLatin1String("\\\\"), QLatin1String("/"));
- url.replace(QLatin1String("\\"), QLatin1String("/"));
- return QDesktopServices::openUrl(QUrl::fromUserInput(url));
-}
-
-QScriptValue QInstaller::qDesktopServicesDisplayName(QScriptContext *context, QScriptEngine *engine)
-{
- Q_UNUSED(engine);
- const QScriptValue check = checkArguments(context, 1, 1);
- if (check.isError())
- return check;
-
-#if QT_VERSION < 0x050000
- const QDesktopServices::StandardLocation location =
- static_cast< QDesktopServices::StandardLocation >(context->argument(0).toInt32());
- return QDesktopServices::displayName(location);
-#else
- const QStandardPaths::StandardLocation location =
- static_cast< QStandardPaths::StandardLocation >(context->argument(0).toInt32());
- return QStandardPaths::displayName(location);
-#endif
-}
-
-QScriptValue QInstaller::qDesktopServicesStorageLocation(QScriptContext *context, QScriptEngine *engine)
-{
- Q_UNUSED(engine);
- const QScriptValue check = checkArguments(context, 1, 1);
- if (check.isError())
- return check;
-
-#if QT_VERSION < 0x050000
- const QDesktopServices::StandardLocation location =
- static_cast< QDesktopServices::StandardLocation >(context->argument(0).toInt32());
- return QDesktopServices::storageLocation(location);
-#else
- const QStandardPaths::StandardLocation location =
- static_cast< QStandardPaths::StandardLocation >(context->argument(0).toInt32());
- return QStandardPaths::writableLocation(location);
-#endif
-}
-
-QScriptValue QInstaller::qFileDialogGetExistingDirectory( QScriptContext *context, QScriptEngine *engine )
-{
- Q_UNUSED(engine);
- const QScriptValue check = checkArguments(context, 0, 2);
- if (check.isError())
- return check;
- QString caption;
- QString dir;
- if (context->argumentCount() > 0)
- caption = context->argument(0).toString();
- if (context->argumentCount() > 1)
- dir = context->argument(1).toString();
- return QFileDialog::getExistingDirectory(0, caption, dir);
-}
-
-QString QInstaller::uncaughtExceptionString(QScriptEngine *scriptEngine, const QString &context)
-{
- QString error(QLatin1String("\n\n%1\n\nBacktrace:\n\t%2"));
- if (!context.isEmpty())
- error.prepend(context);
-
- return error.arg(scriptEngine->uncaughtException().toString(), scriptEngine->uncaughtExceptionBacktrace()
- .join(QLatin1String("\n\t")));
-}
-
-
-/*!
- \class QInstaller::PackageManagerCore
- PackageManagerCore forms the core of the installation, update, maintenance and un-installation system.
- */
-
-/*!
- \enum QInstaller::PackageManagerCore::WizardPage
- WizardPage is used to number the different pages known to the Installer GUI.
- */
-
-/*!
- \var QInstaller::PackageManagerCore::Introduction
- I ntroduction page.
- */
-
-/*!
- \var QInstaller::PackageManagerCore::LicenseCheck
- License check page
- */
-/*!
- \var QInstaller::PackageManagerCore::TargetDirectory
- Target directory selection page
- */
-/*!
- \var QInstaller::PackageManagerCore::ComponentSelection
- %Component selection page
- */
-/*!
- \var QInstaller::PackageManagerCore::StartMenuSelection
- Start menu directory selection page - Microsoft Windows only
- */
-/*!
- \var QInstaller::PackageManagerCore::ReadyForInstallation
- "Ready for Installation" page
- */
-/*!
- \var QInstaller::PackageManagerCore::PerformInstallation
- Page shown while performing the installation
- */
-/*!
- \var QInstaller::PackageManagerCore::InstallationFinished
- Page shown when the installation was finished
- */
-/*!
- \var QInstaller::PackageManagerCore::End
- Non-existing page - this value has to be used if you want to insert a page after \a InstallationFinished
- */
-
void PackageManagerCore::writeUninstaller()
{
if (d->m_needToWriteUninstaller) {
@@ -319,6 +413,11 @@ void PackageManagerCore::writeUninstaller()
}
}
+void PackageManagerCore::writeMaintenanceConfigFiles()
+{
+ d->writeMaintenanceConfigFiles();
+}
+
void PackageManagerCore::reset(const QHash<QString, QString> &params)
{
d->m_completeUninstall = false;
@@ -330,6 +429,8 @@ void PackageManagerCore::reset(const QHash<QString, QString> &params)
}
/*!
+ \qmlmethod void QInstaller::setCompleteUninstallation(bool complete)
+
Sets the uninstallation to be \a complete. If \a complete is false, only components deselected
by the user will be uninstalled. This option applies only on uninstallation.
*/
@@ -338,27 +439,60 @@ void PackageManagerCore::setCompleteUninstallation(bool complete)
d->m_completeUninstall = complete;
}
+/*!
+ \qmlmethod void QInstaller::cancelMetaInfoJob()
+
+ Cancels the retrieval of meta information from a remote repository.
+ */
void PackageManagerCore::cancelMetaInfoJob()
{
if (d->m_repoMetaInfoJob)
d->m_repoMetaInfoJob->cancel();
}
+/*!
+ \qmlmethod void QInstaller::componentsToInstallNeedsRecalculation()
+
+ Ensures that component dependencies are re-calculated.
+ */
void PackageManagerCore::componentsToInstallNeedsRecalculation()
{
d->m_componentsToInstallCalculated = false;
}
+/*!
+ \qmlmethod void QInstaller::autoAcceptMessageBoxes()
+
+ Automatically accept all user message boxes.
+
+ \sa autoRejectMessageBoxes, setMessageBoxAutomaticAnswer
+ */
void PackageManagerCore::autoAcceptMessageBoxes()
{
MessageBoxHandler::instance()->setDefaultAction(MessageBoxHandler::Accept);
}
+/*!
+ \qmlmethod void QInstaller::autoRejectMessageBoxes()
+
+ Automatically reject all user message boxes.
+
+ \sa autoAcceptMessageBoxes, setMessageBoxAutomaticAnswer
+ */
void PackageManagerCore::autoRejectMessageBoxes()
{
MessageBoxHandler::instance()->setDefaultAction(MessageBoxHandler::Reject);
}
+/*!
+ \qmlmethod void QInstaller::setMessageBoxAutomaticAnswer(string identifier, int button)
+
+ Automatically close the message box with ID \a identifier as if the user had pressed \a button.
+
+ This can be used for unattended (automatic) installations.
+
+ \sa QMessageBox, autoAcceptMessageBoxes, autoRejectMessageBoxes
+ */
void PackageManagerCore::setMessageBoxAutomaticAnswer(const QString &identifier, int button)
{
MessageBoxHandler::instance()->setAutomaticAnswer(identifier,
@@ -372,6 +506,13 @@ quint64 size(QInstaller::Component *component, const QString &value)
return component->value(value).toLongLong();
}
+/*!
+ \qmlmethod float QInstaller::requiredDiskSpace()
+
+ Returns the estimated amount of disk space in bytes required after installation.
+
+ \sa requiredTemporaryDiskSpace
+ */
quint64 PackageManagerCore::requiredDiskSpace() const
{
quint64 result = 0;
@@ -382,6 +523,13 @@ quint64 PackageManagerCore::requiredDiskSpace() const
return result;
}
+/*!
+ \qmlmethod float QInstaller::requiredTemporaryDiskSpace()
+
+ Returns the estimated required disk space during installation in bytes.
+
+ \sa requiredDiskSpace
+ */
quint64 PackageManagerCore::requiredTemporaryDiskSpace() const
{
quint64 result = 0;
@@ -487,7 +635,7 @@ void PackageManagerCore::rollBackInstallation()
if (!componentName.isEmpty()) {
Component *component = componentByName(componentName);
if (!component)
- component = d->componentsToReplace(runMode()).value(componentName).second;
+ component = d->componentsToReplace().value(componentName).second;
if (component) {
component->setUninstalled();
packages.removePackage(component->name());
@@ -510,12 +658,26 @@ void PackageManagerCore::rollBackInstallation()
packages.writeToDisk();
}
+/*!
+ \qmlmethod boolean Installer::isFileExtensionRegistered(string extension)
+
+ Returns whether a file extension is already registered in the Windows registry. Returns \c false
+ on all other platforms.
+ */
bool PackageManagerCore::isFileExtensionRegistered(const QString &extension) const
{
QSettingsWrapper settings(QLatin1String("HKEY_CLASSES_ROOT"), QSettingsWrapper::NativeFormat);
return settings.value(QString::fromLatin1(".%1/Default").arg(extension)).isValid();
}
+/*!
+ \qmlmethod boolean QInstaller::fileExists(string filePath)
+
+ Returns \c true if the \a filePath exists; otherwise returns \c false.
+
+ \note If the file is a symlink that points to a non existing
+ file, \c false is returned.
+ */
bool PackageManagerCore::fileExists(const QString &filePath) const
{
return QFileInfo(filePath).exists();
@@ -530,6 +692,8 @@ bool PackageManagerCore::fileExists(const QString &filePath) const
PackageManagerCore::PackageManagerCore()
: d(new PackageManagerCorePrivate(this))
{
+ qRegisterMetaType<QInstaller::PackageManagerCore::Status>("QInstaller::PackageManagerCore::Status");
+ qRegisterMetaType<QInstaller::PackageManagerCore::WizardPage>("QInstaller::PackageManagerCore::WizardPage");
}
PackageManagerCore::PackageManagerCore(qint64 magicmaker, const OperationList &performedOperations)
@@ -550,12 +714,16 @@ PackageManagerCore::~PackageManagerCore()
QInstaller::VerboseWriter::instance()->setOutputStream(logFileName);
}
delete d;
+
+ QMutexLocker _(globalVirtualComponentsFontMutex());
+ delete sVirtualComponentsFont;
+ sVirtualComponentsFont = 0;
}
/* static */
QFont PackageManagerCore::virtualComponentsFont()
{
- QMutexLocker _(&sVirtualComponentsFontMutex);
+ QMutexLocker _(globalVirtualComponentsFontMutex());
if (!sVirtualComponentsFont)
sVirtualComponentsFont = new QFont;
return *sVirtualComponentsFont;
@@ -564,7 +732,7 @@ QFont PackageManagerCore::virtualComponentsFont()
/* static */
void PackageManagerCore::setVirtualComponentsFont(const QFont &font)
{
- QMutexLocker _(&sVirtualComponentsFontMutex);
+ QMutexLocker _(globalVirtualComponentsFontMutex());
if (sVirtualComponentsFont)
delete sVirtualComponentsFont;
sVirtualComponentsFont = new QFont(font);
@@ -606,11 +774,6 @@ void PackageManagerCore::setCreateLocalRepositoryFromBinary(bool create)
sCreateLocalRepositoryFromBinary = create;
}
-RunMode PackageManagerCore::runMode() const
-{
- return isUpdater() ? UpdaterMode : AllMode;
-}
-
bool PackageManagerCore::fetchLocalPackagesTree()
{
d->setStatus(Running);
@@ -650,9 +813,8 @@ bool PackageManagerCore::fetchLocalPackagesTree()
updateDisplayVersions(scDisplayVersion);
- emit finishAllComponentsReset();
+ emit finishAllComponentsReset(d->m_rootComponents);
d->setStatus(Success);
- emit setRootComponents(d->m_rootComponents);
return true;
}
@@ -705,8 +867,8 @@ bool PackageManagerCore::fetchRemotePackagesTree()
return false;
}
- if (!ProductKeyCheck::instance()->hasValidKey()) {
- d->setStatus(Failure, ProductKeyCheck::instance()->lastErrorString());
+ if (!ProductKeyCheck::instance(this)->hasValidKey()) {
+ d->setStatus(Failure, ProductKeyCheck::instance(this)->lastErrorString());
return false;
}
@@ -725,9 +887,39 @@ bool PackageManagerCore::fetchRemotePackagesTree()
return false;
bool success = false;
- if (runMode() == AllMode)
+ if (!isUpdater()) {
success = fetchAllPackages(packages, installedPackages);
- else {
+ if (success && !d->statusCanceledOrFailed() && isPackageManager()) {
+ foreach (Package *const update, packages) {
+ if (update->data(scEssential, scFalse).toString().toLower() == scTrue) {
+ const QString name = update->data(scName).toString();
+ if (!installedPackages.contains(name)) {
+ success = false;
+ break; // unusual, the maintenance tool should always be available
+ }
+
+ const LocalPackage localPackage = installedPackages.value(name);
+ const QString updateVersion = update->data(scRemoteVersion).toString();
+ if (KDUpdater::compareVersion(updateVersion, localPackage.version) <= 0)
+ break; // remote version equals or is less than the installed maintenance tool
+
+ const QDate updateDate = update->data(scReleaseDate).toDate();
+ if (localPackage.lastUpdateDate >= updateDate)
+ break; // remote release date equals or is less than the installed maintenance tool
+
+ success = false;
+ break; // we found a newer version of the maintenance tool
+ }
+ }
+
+ if (!success && !d->statusCanceledOrFailed()) {
+ updateDisplayVersions(scRemoteDisplayVersion);
+ d->setStatus(ForceUpdate, tr("There is an important update available, please run the "
+ "updater first."));
+ return false;
+ }
+ }
+ } else {
success = fetchUpdaterPackages(packages, installedPackages);
}
@@ -739,9 +931,16 @@ bool PackageManagerCore::fetchRemotePackagesTree()
}
/*!
+ \qmlmethod boolean QInstaller::addWizardPage(Component component, string name, int page)
+
Adds the widget with objectName() \a name registered by \a component as a new page
into the installer's GUI wizard. The widget is added before \a page.
- \a page has to be a value of \ref QInstaller::PackageManagerCore::WizardPage "WizardPage".
+
+ See \l{Wizard Pages} for the possible values of \a page.
+
+ Returns \c true if the operation succeeded.
+
+ \sa removeWizardPage, setDefaultPageVisible
*/
bool PackageManagerCore::addWizardPage(Component *component, const QString &name, int page)
{
@@ -753,8 +952,14 @@ bool PackageManagerCore::addWizardPage(Component *component, const QString &name
}
/*!
+ \qmlmethod boolean QInstaller::removeWizardPage(Component component, string name)
+
Removes the widget with objectName() \a name previously added to the installer's wizard
by \a component.
+
+ Returns \c true if the operation succeeded.
+
+ \sa addWizardPage, setDefaultPageVisible, wizardPageRemovalRequested
*/
bool PackageManagerCore::removeWizardPage(Component *component, const QString &name)
{
@@ -766,9 +971,15 @@ bool PackageManagerCore::removeWizardPage(Component *component, const QString &n
}
/*!
+ \qmlmethod boolean QInstaller::setDefaultPageVisible(int page, boolean visible)
+
Sets the visibility of the default page with id \a page to \a visible, i.e.
removes or adds it from/to the wizard. This works only for pages which have been
in the installer when it was started.
+
+ Returns \c true.
+
+ \sa addWizardPage, removeWizardPage
*/
bool PackageManagerCore::setDefaultPageVisible(int page, bool visible)
{
@@ -776,6 +987,12 @@ bool PackageManagerCore::setDefaultPageVisible(int page, bool visible)
return true;
}
+/*!
+ \qmlmethod void QInstaller::setValidatorForCustomPage(Component component, string name,
+ string callbackName)
+
+ \sa setValidatorForCustomPageRequested
+ */
void PackageManagerCore::setValidatorForCustomPage(Component *component, const QString &name,
const QString &callbackName)
{
@@ -783,9 +1000,14 @@ void PackageManagerCore::setValidatorForCustomPage(Component *component, const Q
}
/*!
+ \qmlmethod boolean QInstaller::addWizardPageItem(Component component, string name, int page)
+
Adds the widget with objectName() \a name registered by \a component as an GUI element
into the installer's GUI wizard. The widget is added on \a page.
- \a page has to be a value of \ref QInstaller::PackageManagerCore::WizardPage "WizardPage".
+
+ See \l{Wizard Pages} for the possible values of \a page.
+
+ \sa removeWizardPageItem, wizardWidgetInsertionRequested
*/
bool PackageManagerCore::addWizardPageItem(Component *component, const QString &name, int page)
{
@@ -797,8 +1019,12 @@ bool PackageManagerCore::addWizardPageItem(Component *component, const QString &
}
/*!
+ \qmlmethod boolean QInstaller::removeWizardPageItem(Component component, string name)
+
Removes the widget with objectName() \a name previously added to the installer's wizard
by \a component.
+
+ \sa addWizardPageItem
*/
bool PackageManagerCore::removeWizardPageItem(Component *component, const QString &name)
{
@@ -809,6 +1035,13 @@ bool PackageManagerCore::removeWizardPageItem(Component *component, const QStrin
return false;
}
+/*!
+ \qmlmethod void QInstaller::addUserRepositories(stringlist repositories)
+
+ Registers additional \a repositories.
+
+ \sa setTemporaryRepositories
+ */
void PackageManagerCore::addUserRepositories(const QStringList &repositories)
{
QSet<Repository> repositorySet;
@@ -819,8 +1052,12 @@ void PackageManagerCore::addUserRepositories(const QStringList &repositories)
}
/*!
- Sets additional repository for this instance of the installer or updater.
+ \qmlmethod void QInstaller::setTemporaryRepositories(stringlist repositories, boolean replace)
+
+ Sets additional \a repositories for this instance of the installer or updater.
Will be removed after invoking it again.
+
+ \sa addUserRepositories
*/
void PackageManagerCore::setTemporaryRepositories(const QStringList &repositories, bool replace)
{
@@ -847,6 +1084,11 @@ void PackageManagerCore::setTestChecksum(bool test)
d->m_testChecksum = test;
}
+ScriptEngine *PackageManagerCore::scriptEngine()
+{
+ return d->scriptEngine();
+}
+
/*!
Returns the number of components in the list for installer and package manager mode. Might return 0 in
case the engine has only been run in updater mode or no components have been fetched.
@@ -886,6 +1128,8 @@ void PackageManagerCore::appendRootComponent(Component *component)
}
/*!
+ \qmlmethod int QInstaller::updaterComponentCount()
+
Returns the number of components in the list for updater mode. Might return 0 in case the engine has only
been run in installer or package manager mode or no components have been fetched.
*/
@@ -934,13 +1178,15 @@ QList<Component*> PackageManagerCore::availableComponents() const
QList<Component*> result = d->m_rootComponents;
foreach (QInstaller::Component *component, d->m_rootComponents)
- result += component->childComponents(true, AllMode);
+ result += component->childComponents(Component::Descendants);
return result + d->m_rootDependencyReplacements;
}
/*!
+ \qmlmethod Component QInstaller::componentByName(string name)
+
Returns a component matching \a name. \a name can also contains a version requirement.
- E.g. "com.nokia.sdk.qt" returns any component with that name, "com.nokia.sdk.qt->=4.5" requires
+ E.g. "org.qt-project.sdk.qt" returns any component with that name, "org.qt-project.sdk.qt->=4.5" requires
the returned component to have at least version 4.5.
If no component matches the requirement, 0 is returned.
*/
@@ -968,21 +1214,23 @@ bool PackageManagerCore::calculateComponentsToInstall() const
if (!d->m_componentsToInstallCalculated) {
d->clearComponentsToInstall();
QList<Component*> components;
- if (runMode() == UpdaterMode) {
+ if (isUpdater()) {
foreach (Component *component, updaterComponents()) {
if (component->updateRequested())
components.append(component);
}
- } else if (runMode() == AllMode) {
+ } else if (!isUpdater()) {
// relevant means all components which are not replaced
QList<Component*> relevantComponents = rootComponents();
foreach (QInstaller::Component *component, rootComponents())
- relevantComponents += component->childComponents(true, AllMode);
+ relevantComponents += component->childComponents(Component::Descendants);
foreach (Component *component, relevantComponents) {
// ask for all components which will be installed to get all dependencies
- // even dependencies wich are changed without an increased version
- if (component->installationRequested() || (component->isInstalled() && !component->uninstallationRequested()))
- components.append(component);
+ // even dependencies which are changed without an increased version
+ if (component->installationRequested() || (component->isInstalled()
+ && !component->uninstallationRequested())) {
+ components.append(component);
+ }
}
}
@@ -1005,10 +1253,10 @@ QList<Component*> PackageManagerCore::orderedComponentsToInstall() const
*/
bool PackageManagerCore::calculateComponentsToUninstall() const
{
- if (runMode() == UpdaterMode)
+ if (isUpdater())
return true;
- // hack to avoid removeing needed dependencies
+ // hack to avoid removing needed dependencies
QSet<Component*> componentsToInstall = d->m_orderedComponentsToInstall.toSet();
QList<Component*> components;
@@ -1046,7 +1294,7 @@ QString PackageManagerCore::installReason(Component *component) const
}
/*!
- Returns a list of components that dependend on \a component. The list can be empty. Note: Auto
+ Returns a list of components that depend on \a component. The list can be empty. Note: Auto
installed dependencies are not resolved.
*/
QList<Component*> PackageManagerCore::dependees(const Component *_component) const
@@ -1090,21 +1338,25 @@ QList<Component*> PackageManagerCore::dependencies(const Component *component, Q
ComponentModel *PackageManagerCore::defaultComponentModel() const
{
- QMutexLocker _(&sModelMutex);
+ QMutexLocker _(globalModelMutex());
if (!d->m_defaultModel) {
d->m_defaultModel = componentModel(const_cast<PackageManagerCore*> (this),
QLatin1String("AllComponentsModel"));
}
+ connect(this, SIGNAL(finishAllComponentsReset(QList<QInstaller::Component*>)), d->m_defaultModel,
+ SLOT(setRootComponents(QList<QInstaller::Component*>)));
return d->m_defaultModel;
}
ComponentModel *PackageManagerCore::updaterComponentModel() const
{
- QMutexLocker _(&sModelMutex);
+ QMutexLocker _(globalModelMutex());
if (!d->m_updaterModel) {
d->m_updaterModel = componentModel(const_cast<PackageManagerCore*> (this),
QLatin1String("UpdaterComponentsModel"));
}
+ connect(this, SIGNAL(finishUpdaterComponentsReset(QList<QInstaller::Component*>)), d->m_updaterModel,
+ SLOT(setRootComponents(QList<QInstaller::Component*>)));
return d->m_updaterModel;
}
@@ -1114,7 +1366,11 @@ Settings &PackageManagerCore::settings() const
}
/*!
- This method tries to gain admin rights. On success, it returns true.
+ \qmlmethod boolean QInstaller::gainAdminRights()
+
+ Tries to gain admin rights. On success, it returns \c true.
+
+ \sa dropAdminRights
*/
bool PackageManagerCore::gainAdminRights()
{
@@ -1128,7 +1384,11 @@ bool PackageManagerCore::gainAdminRights()
}
/*!
- This method drops gained admin rights.
+ \qmlmethod void QInstaller::dropAdminRights()
+
+ Drops admin rights gained by gainAdminRights.
+
+ \sa gainAdminRights
*/
void PackageManagerCore::dropAdminRights()
{
@@ -1136,7 +1396,9 @@ void PackageManagerCore::dropAdminRights()
}
/*!
- Return true, if a process with \a name is running. On Windows, the comparison
+ \qmlmethod boolean QInstaller::isProcessRunning(string name)
+
+ Returns true, if a process with \a name is running. On Windows, the comparison
is case-insensitive.
*/
bool PackageManagerCore::isProcessRunning(const QString &name) const
@@ -1145,8 +1407,11 @@ bool PackageManagerCore::isProcessRunning(const QString &name) const
}
/*!
- Return true, if a process with \a absoluteFilePath could be killed or isn't running
- Note: this is implemented in a semi blocking way (to keep the main thread to paint the UI)
+ \qmlmethod boolean QInstaller::killProcess(string absoluteFilePath)
+
+ Returns true, if a process with \a absoluteFilePath could be killed or isn't running
+
+ \note This is implemented in a semi blocking way (to keep the main thread to paint the UI).
*/
bool PackageManagerCore::killProcess(const QString &absoluteFilePath) const
{
@@ -1180,11 +1445,30 @@ bool PackageManagerCore::killProcess(const QString &absoluteFilePath) const
}
+/*!
+ \qmlmethod void QInstaller::setDependsOnLocalInstallerBinary()
+
+ Makes sure the installer runs from a local drive. Otherwise the user will get an
+ appropriate error message.
+
+ \note This only works on Windows.
+
+ \sa localInstallerBinaryUsed
+*/
+
void PackageManagerCore::setDependsOnLocalInstallerBinary()
{
d->m_dependsOnLocalInstallerBinary = true;
}
+/*!
+ \qmlmethod boolean QInstaller::localInstallerBinaryUsed()
+
+ Returns \c false if the installer is run on Windows, and the installer has been started from
+ a remote file system drive. Otherwise returns \c true.
+
+ \sa setDependsOnLocalInstallerBinary
+*/
bool PackageManagerCore::localInstallerBinaryUsed()
{
#ifdef Q_OS_WIN
@@ -1194,14 +1478,20 @@ bool PackageManagerCore::localInstallerBinaryUsed()
}
/*!
- Executes a program.
+ \qmlmethod array QInstaller::execute(string program, stringlist arguments = undefined,
+ string stdin = "")
+
+ Starts the program \a program with the arguments \a arguments in a
+ new process and waits for it to finish.
+
+ \a stdin is sent as standard input to the application.
+
+ Returns an empty array if the program could not be executed, otherwise
+ the output of command as the first item, and the return code as the second.
- \param program The program that should be executed.
- \param arguments Optional list of arguments.
- \param stdIn Optional stdin the program reads.
- \return If the command could not be executed, an empty QList, otherwise the output of the
- command as first item, the return code as second item.
\note On Unix, the output is just the output to stdout, not to stderr.
+
+ \sa executeDetached
*/
QList<QVariant> PackageManagerCore::execute(const QString &program, const QStringList &arguments,
const QString &stdIn) const
@@ -1234,12 +1524,24 @@ QList<QVariant> PackageManagerCore::execute(const QString &program, const QStrin
}
/*!
- Executes a program.
+ \qmlmethod boolean QInstaller::executeDetached(string program, stringlist arguments = undefined,
+ string workingDirectory = "")
+
+ Starts the program \a program with the arguments \a arguments in a
+ new process, and detaches from it. Returns \c true on success;
+ otherwise returns \c false. If the installer exits, the
+ detached process will continue to live.
+
+ \note Arguments that contain spaces are not passed to the
+ process as separate arguments.
- \param program The program that should be executed.
- \param arguments Optional list of arguments.
- \param workingDirectory Optional working directory of the forked process.
- \return If the command could not be executed, an false will be returned
+ \b{Unix:} The started process will run in its own session and act
+ like a daemon.
+
+ \b{Windows:} Arguments that contain spaces are wrapped in quotes.
+ The started process will run as a regular standalone process.
+
+ The process will be started in the directory \a workingDirectory.
*/
bool PackageManagerCore::executeDetached(const QString &program, const QStringList &arguments,
@@ -1259,16 +1561,20 @@ bool PackageManagerCore::executeDetached(const QString &program, const QStringLi
/*!
- Returns an environment variable.
+ \qmlmethod string QInstaller::environmentVariable(string name)
+
+ Returns content of an environment variable \a name. An empty string is returned if the
+ environment variable is not set.
*/
QString PackageManagerCore::environmentVariable(const QString &name) const
{
+ if (name.isEmpty())
+ return QString();
+
#ifdef Q_OS_WIN
- const LPCWSTR n = (LPCWSTR) name.utf16();
- LPTSTR buff = (LPTSTR) malloc(4096 * sizeof(TCHAR));
- DWORD getenvret = GetEnvironmentVariable(n, buff, 4096);
- QString value = getenvret != 0 ? QString::fromUtf16((const unsigned short *) buff) : QString();
- free(buff);
+ static TCHAR buffer[32767];
+ DWORD size = GetEnvironmentVariable(LPCWSTR(name.utf16()), buffer, 32767);
+ QString value = QString::fromUtf16((const unsigned short *) buffer, size);
if (value.isEmpty()) {
static QLatin1String userEnvironmentRegistryPath("HKEY_CURRENT_USER\\Environment");
@@ -1281,14 +1587,14 @@ QString PackageManagerCore::environmentVariable(const QString &name) const
}
return value;
#else
- const char *pPath = name.isEmpty() ? 0 : getenv(name.toLatin1());
- return pPath ? QLatin1String(pPath) : QString();
+ return QString::fromUtf8(qgetenv(name.toLatin1()));
#endif
}
/*!
+ \qmlmethod boolean QInstaller::performOperation(string name, stringlist arguments)
+
Instantly performs an operation \a name with \a arguments.
- \sa Component::addOperation
*/
bool PackageManagerCore::performOperation(const QString &name, const QStringList &arguments)
{
@@ -1306,7 +1612,9 @@ bool PackageManagerCore::performOperation(const QString &name, const QStringList
}
/*!
- Returns true when \a version matches the \a requirement.
+ \qmlmethod boolean QInstaller::versionMatches(string version, string requirement)
+
+ Returns \c true when \a version matches the \a requirement.
\a requirement can be a fixed version number or it can be prefix by the comparators '>', '>=',
'<', '<=' and '='.
*/
@@ -1333,10 +1641,15 @@ bool PackageManagerCore::versionMatches(const QString &version, const QString &r
}
/*!
+ \qmlmethod string QInstaller::findLibrary(string name, stringlist paths = [])
+
Finds a library named \a name in \a paths.
If \a paths is empty, it gets filled with platform dependent default paths.
- The resulting path is stored in \a library.
+ The resulting path is returned.
+
This method can be used by scripts to check external dependencies.
+
+ \sa findPath
*/
QString PackageManagerCore::findLibrary(const QString &name, const QStringList &paths)
{
@@ -1362,9 +1675,14 @@ QString PackageManagerCore::findLibrary(const QString &name, const QStringList &
}
/*!
+ \qmlmethod string QInstaller::findPath(string name, stringlist paths = [])
+
Tries to find a file name \a name in one of \a paths.
- The resulting path is stored in \a path.
+ The resulting path is returned.
+
This method can be used by scripts to check external dependencies.
+
+ \sa findLibrary
*/
QString PackageManagerCore::findPath(const QString &name, const QStringList &paths)
{
@@ -1380,8 +1698,11 @@ QString PackageManagerCore::findPath(const QString &name, const QStringList &pat
}
/*!
+ \qmlmethod void QInstaller::setInstallerBaseBinary(string path)
+
Sets the "installerbase" binary to use when writing the package manager/uninstaller.
Set this if an update to installerbase is available.
+
If not set, the executable segment of the running un/installer will be used.
*/
void PackageManagerCore::setInstallerBaseBinary(const QString &path)
@@ -1390,8 +1711,12 @@ void PackageManagerCore::setInstallerBaseBinary(const QString &path)
}
/*!
+ \qmlmethod string QInstaller::value(string key, string defaultValue = "")
+
Returns the installer value for \a key. If \a key is not known to the system, \a defaultValue is
returned. Additionally, on Windows, \a key can be a registry key.
+
+ \sa setValue, containsValue, valueChanged
*/
QString PackageManagerCore::value(const QString &key, const QString &defaultValue) const
{
@@ -1399,7 +1724,11 @@ QString PackageManagerCore::value(const QString &key, const QString &defaultValu
}
/*!
+ \qmlmethod void QInstaller::setValue(string key, string value)
+
Sets the installer value for \a key to \a value.
+
+ \sa value, containsValue, valueChanged
*/
void PackageManagerCore::setValue(const QString &key, const QString &value)
{
@@ -1409,18 +1738,38 @@ void PackageManagerCore::setValue(const QString &key, const QString &value)
}
/*!
- Returns true, when the installer contains a value for \a key.
+ \qmlmethod boolean QInstaller::containsValue(string key)
+
+ Returns \c true if the installer contains a value for \a key.
+
+ \sa value, setValue, valueChanged
*/
bool PackageManagerCore::containsValue(const QString &key) const
{
return d->m_data.contains(key);
}
+/*!
+ \qmlmethod void QInstaller::setSharedFlag(string key, boolean value)
+
+ Sets a shared flag with name \a key to \a value. This is one option
+ to share information between scripts.
+
+ \sa sharedFlag
+*/
void PackageManagerCore::setSharedFlag(const QString &key, bool value)
{
d->m_sharedFlags.insert(key, value);
}
+/*!
+ \qmlmethod boolean QInstaller::sharedFlag(string key)
+
+ Returns shared flag with name \a key. This is one option
+ to share information between scripts.
+
+ \sa setSharedFlag
+*/
bool PackageManagerCore::sharedFlag(const QString &key) const
{
return d->m_sharedFlags.value(key, false);
@@ -1447,7 +1796,7 @@ QString PackageManagerCore::error() const
}
/*!
- Returns true if at least one complete installation/update was successful, even if the user cancelled the
+ Returns \c true if at least one complete installation/update was successful, even if the user cancelled the
newest installation process.
*/
bool PackageManagerCore::finishedWithSuccess() const
@@ -1455,12 +1804,24 @@ bool PackageManagerCore::finishedWithSuccess() const
return d->m_status == PackageManagerCore::Success || d->m_needToWriteUninstaller;
}
+/*!
+ \qmlmethod void QInstaller::interrupt()
+
+ Cancels an ongoing installation.
+
+ \sa installationInterrupted
+ */
void PackageManagerCore::interrupt()
{
setCanceled();
emit installationInterrupted();
}
+/*!
+ \qmlmethod void QInstaller::setCanceled()
+
+ Cancels the installation.
+ */
void PackageManagerCore::setCanceled()
{
cancelMetaInfoJob();
@@ -1506,7 +1867,11 @@ QString PackageManagerCore::installerBinaryPath() const
}
/*!
- Returns true when this is the installer running.
+ \qmlmethod boolean QInstaller::isInstaller()
+
+ Returns \c true if executed in an install step.
+
+ \sa isUninstaller, isUpdater, isPackageManager
*/
bool PackageManagerCore::isInstaller() const
{
@@ -1514,47 +1879,79 @@ bool PackageManagerCore::isInstaller() const
}
/*!
- Returns true if this is an offline-only installer.
+ \qmlmethod boolean QInstaller::isOfflineOnly()
+
+ Returns \c true if this is an offline-only installer.
*/
bool PackageManagerCore::isOfflineOnly() const
{
return d->isOfflineOnly();
}
+/*!
+ \qmlmethod void QInstaller::setUninstaller()
+
+ Forces an uninstaller context.
+
+ \sa isUninstaller, setUpdater, setPackageManager
+*/
void PackageManagerCore::setUninstaller()
{
d->m_magicBinaryMarker = QInstaller::MagicUninstallerMarker;
}
/*!
- Returns true when this is the uninstaller running.
+ \qmlmethod boolean QInstaller::isUninstaller()
+
+ Returns \c true if the script is executed in an uninstall context.
+
+ \sa setUninstaller, isInstaller, isUpdater, isPackageManager
*/
bool PackageManagerCore::isUninstaller() const
{
return d->isUninstaller();
}
+/*!
+ \qmlmethod void QInstaller::setUpdater()
+
+ Forces an updater context.
+
+ \sa isUpdater, setUninstaller, setPackageManager
+*/
void PackageManagerCore::setUpdater()
{
d->m_magicBinaryMarker = QInstaller::MagicUpdaterMarker;
}
/*!
- Returns true when this is neither an installer nor an uninstaller running.
- Must be an updater, then.
+ \qmlmethod boolean QInstaller::isUpdater()
+
+ Returns \c true if the script is executed in an updater context.
+
+ \sa setUpdater, isInstaller, isUninstaller, isPackageManager
*/
bool PackageManagerCore::isUpdater() const
{
return d->isUpdater();
}
+/*!
+ \qmlmethod void QInstaller::setPackageManager()
+
+ Forces a package manager context.
+*/
void PackageManagerCore::setPackageManager()
{
d->m_magicBinaryMarker = QInstaller::MagicPackageManagerMarker;
}
+
/*!
- Returns true when this is the package manager running.
+ \qmlmethod boolean QInstaller::isPackageManager()
+
+ Returns \c true if the script is executed in a package manager context.
+ \sa setPackageManager, isInstaller, isUninstaller, isUpdater
*/
bool PackageManagerCore::isPackageManager() const
{
@@ -1562,7 +1959,9 @@ bool PackageManagerCore::isPackageManager() const
}
/*!
- Runs the installer. Returns true on success, false otherwise.
+ \qmlmethod boolean QInstaller::runInstaller()
+
+ Runs the installer. Returns \c true on success, \c false otherwise.
*/
bool PackageManagerCore::runInstaller()
{
@@ -1570,7 +1969,9 @@ bool PackageManagerCore::runInstaller()
}
/*!
- Runs the uninstaller. Returns true on success, false otherwise.
+ \qmlmethod boolean QInstaller::runUninstaller()
+
+ Runs the uninstaller. Returns \c true on success, \c false otherwise.
*/
bool PackageManagerCore::runUninstaller()
{
@@ -1578,7 +1979,9 @@ bool PackageManagerCore::runUninstaller()
}
/*!
- Runs the package updater. Returns true on success, false otherwise.
+ \qmlmethod boolean QInstaller::runPackageUpdater()
+
+ Runs the package updater. Returns \c true on success, \c false otherwise.
*/
bool PackageManagerCore::runPackageUpdater()
{
@@ -1586,7 +1989,8 @@ bool PackageManagerCore::runPackageUpdater()
}
/*!
- \internal
+ \qmlmethod void QInstaller::languageChanged()
+
Calls languangeChanged on all components.
*/
void PackageManagerCore::languageChanged()
@@ -1646,7 +2050,7 @@ bool PackageManagerCore::updateComponentData(struct Data &data, Component *compo
// add downloadable archive from xml
const QStringList downloadableArchives = data.package->data(scDownloadableArchives).toString()
- .split(scCommaRegExp, QString::SkipEmptyParts);
+ .split(QInstaller::commaRegExp(), QString::SkipEmptyParts);
if (component->isFromOnlineRepository()) {
foreach (const QString downloadableArchive, downloadableArchives)
@@ -1654,7 +2058,7 @@ bool PackageManagerCore::updateComponentData(struct Data &data, Component *compo
}
const QStringList componentsToReplace = data.package->data(scReplaces).toString()
- .split(scCommaRegExp, QString::SkipEmptyParts);
+ .split(QInstaller::commaRegExp(), QString::SkipEmptyParts);
if (!componentsToReplace.isEmpty()) {
// Store the component (this is a component that replaces others) and all components that
@@ -1711,14 +2115,14 @@ void PackageManagerCore::storeReplacedComponents(QHash<QString, Component *> &co
qWarning() << componentName << "- Does not exist in the repositories anymore.";
continue;
}
- if (!component && !d->componentsToReplace(data.runMode).contains(componentName)) {
+ if (!component && !d->componentsToReplace().contains(componentName)) {
component = new Component(this);
component->setValue(scName, componentName);
} else {
component->loadComponentScript();
- d->replacementDependencyComponents(data.runMode).append(component);
+ d->replacementDependencyComponents().append(component);
}
- d->componentsToReplace(data.runMode).insert(componentName, qMakePair(it.key(), component));
+ d->componentsToReplace().insert(componentName, qMakePair(it.key(), component));
}
}
}
@@ -1731,7 +2135,6 @@ bool PackageManagerCore::fetchAllPackages(const PackagesList &remotes, const Loc
QHash<QString, QInstaller::Component*> components;
Data data;
- data.runMode = AllMode;
data.components = &components;
data.installedPackages = &locals;
@@ -1762,8 +2165,7 @@ bool PackageManagerCore::fetchAllPackages(const PackagesList &remotes, const Loc
if (!d->buildComponentTree(components, true))
return false;
- emit finishAllComponentsReset();
- emit setRootComponents(d->m_rootComponents);
+ emit finishAllComponentsReset(d->m_rootComponents);
return true;
}
@@ -1775,7 +2177,6 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const
QHash<QString, QInstaller::Component *> components;
Data data;
- data.runMode = UpdaterMode;
data.components = &components;
data.installedPackages = &locals;
@@ -1804,7 +2205,8 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const
bool isValidUpdate = locals.contains(name);
if (!isValidUpdate && !replaces.isEmpty()) {
- const QStringList possibleNames = replaces.split(scCommaRegExp, QString::SkipEmptyParts);
+ const QStringList possibleNames = replaces.split(QInstaller::commaRegExp(),
+ QString::SkipEmptyParts);
foreach (const QString &possibleName, possibleNames) {
if (locals.contains(possibleName)) {
isValidUpdate = true;
@@ -1813,7 +2215,9 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const
}
}
- if (!isValidUpdate)
+ // break if the update is not valid and if it's not the maintenance tool (we might get an update
+ // for the maintenance tool even if it's not currently installed - possible offline installation)
+ if (!isValidUpdate && (update->data(scEssential, scFalse).toString().toLower() == scFalse))
continue; // Update for not installed package found, skip it.
const LocalPackage &localPackage = locals.value(name);
@@ -1851,14 +2255,18 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const
try {
if (!components.isEmpty()) {
- // load the scripts and append all components w/o parent to the direct list
+ // append all components w/o parent to the direct list
+ foreach (QInstaller::Component *component, components) {
+ appendUpdaterComponent(component);
+ }
+
+ // after everything is set up, load the scripts
foreach (QInstaller::Component *component, components) {
if (d->statusCanceledOrFailed())
return false;
component->loadComponentScript();
component->setCheckState(Qt::Checked);
- appendUpdaterComponent(component);
}
// after everything is set up, check installed components
@@ -1900,7 +2308,7 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const
}
} catch (const Error &error) {
d->clearUpdaterComponentLists();
- emit finishUpdaterComponentsReset();
+ emit finishUpdaterComponentsReset(QList<QInstaller::Component*>());
d->setStatus(Failure, error.message());
// TODO: make sure we remove all message boxes inside the library at some point.
@@ -1909,8 +2317,7 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const
return false;
}
- emit finishUpdaterComponentsReset();
- emit setRootComponents(d->m_updaterComponents);
+ emit finishUpdaterComponentsReset(d->m_updaterComponents);
return true;
}
@@ -1963,7 +2370,7 @@ QString PackageManagerCore::findDisplayVersion(const QString &componentName,
ComponentModel *PackageManagerCore::componentModel(PackageManagerCore *core, const QString &objectName) const
{
- ComponentModel *model = new ComponentModel(4, core);
+ ComponentModel *model = new ComponentModel(5, core);
model->setObjectName(objectName);
model->setHeaderData(ComponentModelHelper::NameColumn, Qt::Horizontal,
@@ -1972,11 +2379,12 @@ ComponentModel *PackageManagerCore::componentModel(PackageManagerCore *core, con
ComponentModel::tr("Installed Version"));
model->setHeaderData(ComponentModelHelper::NewVersionColumn, Qt::Horizontal,
ComponentModel::tr("New Version"));
+ model->setHeaderData(ComponentModelHelper::ReleaseDateColumn, Qt::Horizontal,
+ ComponentModel::tr("Release Date"));
model->setHeaderData(ComponentModelHelper::UncompressedSizeColumn, Qt::Horizontal,
ComponentModel::tr("Size"));
- connect(this, SIGNAL(setRootComponents(QList<QInstaller::Component*>)), model,
- SLOT(setRootComponents(QList<QInstaller::Component*>)));
- connect(model, SIGNAL(defaultCheckStateChanged(bool)), this, SLOT(componentsToInstallNeedsRecalculation()));
+ connect(model, SIGNAL(checkStateChanged(QInstaller::ComponentModel::ModelState)), this,
+ SLOT(componentsToInstallNeedsRecalculation()));
return model;
}
diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h
index 50eb63184..20a3293fa 100644
--- a/src/libs/installer/packagemanagercore.h
+++ b/src/libs/installer/packagemanagercore.h
@@ -57,6 +57,7 @@ namespace QInstaller {
class Component;
class ComponentModel;
+class ScriptEngine;
class PackageManagerCorePrivate;
class Settings;
@@ -81,7 +82,8 @@ public:
Failure = EXIT_FAILURE,
Running,
Canceled,
- Unfinished
+ Unfinished,
+ ForceUpdate
};
Status status() const;
QString error() const;
@@ -121,7 +123,6 @@ public:
bool fetchRemotePackagesTree();
bool run();
- RunMode runMode() const;
void reset(const QHash<QString, QString> &params);
Q_INVOKABLE void setDependsOnLocalInstallerBinary();
@@ -157,6 +158,8 @@ public:
QStringList replaceVariables(const QStringList &str) const;
void writeUninstaller();
+ void writeMaintenanceConfigFiles();
+
QString uninstallerName() const;
QString installerBinaryPath() const;
@@ -174,7 +177,10 @@ public:
Q_INVOKABLE bool fileExists(const QString &filePath) const;
public:
+ ScriptEngine *scriptEngine();
+
// component handling
+
int rootComponentCount() const;
Component *rootComponent(int i) const;
QList<Component*> rootComponents() const;
@@ -268,13 +274,12 @@ Q_SIGNALS:
void finishButtonClicked();
void metaJobInfoMessage(const QString &message);
- void setRootComponents(const QList<QInstaller::Component*> &components);
void startAllComponentsReset();
- void finishAllComponentsReset();
+ void finishAllComponentsReset(const QList<QInstaller::Component*> &rootComponents);
void startUpdaterComponentsReset();
- void finishUpdaterComponentsReset();
+ void finishUpdaterComponentsReset(const QList<QInstaller::Component*> &componentsWithUpdates);
void installationStarted();
void installationInterrupted();
@@ -297,7 +302,6 @@ Q_SIGNALS:
private:
struct Data {
- RunMode runMode;
Package *package;
QHash<QString, Component*> *components;
const LocalPackagesHash *installedPackages;
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp
index 3cc44a7e5..a840d6d1e 100644
--- a/src/libs/installer/packagemanagercore_p.cpp
+++ b/src/libs/installer/packagemanagercore_p.cpp
@@ -43,10 +43,13 @@
#include "adminauthorization.h"
#include "binaryformat.h"
#include "component.h"
+#include "scriptengine.h"
#include "componentmodel.h"
#include "errors.h"
#include "fileutils.h"
#include "fsengineclient.h"
+#include "globals.h"
+#include "graph.h"
#include "messageboxhandler.h"
#include "packagemanagercore.h"
#include "progresscoordinator.h"
@@ -58,7 +61,6 @@
#include "kdupdaterfiledownloaderfactory.h"
#include "kdupdaterupdatesourcesinfo.h"
#include "kdupdaterupdateoperationfactory.h"
-#include "kdupdaterupdatefinder.h"
#include <productkeycheck.h>
@@ -94,7 +96,8 @@ public:
{
if (!m_operation)
return;
- qDebug() << QString::fromLatin1("%1 operation: %2").arg(state, m_operation->name());
+ qDebug() << QString::fromLatin1("%1 %2 operation: %3").arg(state, m_operation->value(
+ QLatin1String("component")).toString(), m_operation->name());
qDebug() << QString::fromLatin1("\t- arguments: %1").arg(m_operation->arguments()
.join(QLatin1String(", ")));
}
@@ -201,6 +204,7 @@ static void deferredRename(const QString &oldName, const QString &newName, bool
PackageManagerCorePrivate::PackageManagerCorePrivate(PackageManagerCore *core)
: m_updateFinder(0)
+ , m_updaterApplication(new DummyConfigurationInterface)
, m_FSEngineClientHandler(0)
, m_core(core)
, m_repoMetaInfoJob(0)
@@ -208,6 +212,7 @@ PackageManagerCorePrivate::PackageManagerCorePrivate(PackageManagerCore *core)
, m_repoFetched(false)
, m_updateSourcesAdded(false)
, m_componentsToInstallCalculated(false)
+ , m_scriptEngine(0)
, m_proxyFactory(0)
, m_defaultModel(0)
, m_updaterModel(0)
@@ -217,6 +222,7 @@ PackageManagerCorePrivate::PackageManagerCorePrivate(PackageManagerCore *core)
PackageManagerCorePrivate::PackageManagerCorePrivate(PackageManagerCore *core, qint64 magicInstallerMaker,
const OperationList &performedOperations)
: m_updateFinder(0)
+ , m_updaterApplication(new DummyConfigurationInterface)
, m_FSEngineClientHandler(initFSEngineClientHandler())
, m_status(PackageManagerCore::Unfinished)
, m_forceRestart(false)
@@ -233,6 +239,7 @@ PackageManagerCorePrivate::PackageManagerCorePrivate(PackageManagerCore *core, q
, m_updateSourcesAdded(false)
, m_magicBinaryMarker(magicInstallerMaker)
, m_componentsToInstallCalculated(false)
+ , m_scriptEngine(0)
, m_proxyFactory(0)
, m_defaultModel(0)
, m_updaterModel(0)
@@ -258,6 +265,7 @@ PackageManagerCorePrivate::~PackageManagerCorePrivate()
m_FSEngineClientHandler->setActive(false);
delete m_updateFinder;
+ delete m_scriptEngine;
delete m_proxyFactory;
delete m_defaultModel;
@@ -373,7 +381,7 @@ bool PackageManagerCorePrivate::buildComponentTree(QHash<QString, Component*> &c
std::sort(m_rootComponents.begin(), m_rootComponents.end(), Component::SortingPriorityGreaterThan());
} catch (const Error &error) {
clearAllComponentLists();
- emit m_core->finishAllComponentsReset();
+ emit m_core->finishAllComponentsReset(QList<QInstaller::Component*>());
setStatus(PackageManagerCore::Failure, error.message());
// TODO: make sure we remove all message boxes inside the library at some point.
@@ -384,6 +392,13 @@ bool PackageManagerCorePrivate::buildComponentTree(QHash<QString, Component*> &c
return true;
}
+ScriptEngine *PackageManagerCorePrivate::scriptEngine()
+{
+ if (!m_scriptEngine)
+ m_scriptEngine = new ScriptEngine(m_core);
+ return m_scriptEngine;
+}
+
void PackageManagerCorePrivate::clearAllComponentLists()
{
qDeleteAll(m_rootComponents);
@@ -422,14 +437,14 @@ void PackageManagerCorePrivate::clearUpdaterComponentLists()
m_componentsToInstallCalculated = false;
}
-QList<Component *> &PackageManagerCorePrivate::replacementDependencyComponents(RunMode mode)
+QList<Component *> &PackageManagerCorePrivate::replacementDependencyComponents()
{
- return mode == AllMode ? m_rootDependencyReplacements : m_updaterDependencyReplacements;
+ return (!isUpdater()) ? m_rootDependencyReplacements : m_updaterDependencyReplacements;
}
-QHash<QString, QPair<Component*, Component*> > &PackageManagerCorePrivate::componentsToReplace(RunMode mode)
+QHash<QString, QPair<Component*, Component*> > &PackageManagerCorePrivate::componentsToReplace()
{
- return mode == AllMode ? m_componentsToReplaceAllMode : m_componentsToReplaceUpdaterMode;
+ return (!isUpdater()) ? m_componentsToReplaceAllMode : m_componentsToReplaceUpdaterMode;
}
void PackageManagerCorePrivate::clearComponentsToInstall()
@@ -453,7 +468,7 @@ bool PackageManagerCorePrivate::appendComponentsToInstall(const QList<Component
relevantComponentForAutoDependOn = m_updaterComponents + m_updaterComponentsDeps;
else {
foreach (QInstaller::Component *component, m_rootComponents)
- relevantComponentForAutoDependOn += component->childComponents(true, AllMode);
+ relevantComponentForAutoDependOn += component->childComponents(Component::Descendants);
}
QList<Component*> notAppendedComponents; // for example components with unresolved dependencies
@@ -557,13 +572,13 @@ QString PackageManagerCorePrivate::installReason(Component *component)
void PackageManagerCorePrivate::initialize(const QHash<QString, QString> &params)
{
- if (!ProductKeyCheck::instance()->hasValidKey()) {
+ if (!ProductKeyCheck::instance(m_core)->hasValidKey()) {
if (m_core->isInstaller()) {
- setStatus(PackageManagerCore::Failure, ProductKeyCheck::instance()->lastErrorString());
+ setStatus(PackageManagerCore::Failure, ProductKeyCheck::instance(m_core)->lastErrorString());
} else {
MessageBoxHandler::warning(MessageBoxHandler::currentBestSuitParent(),
- QLatin1String("ProductKeyCheckError"), ProductKeyCheck::instance()->lastErrorString(),
- ProductKeyCheck::instance()->maintainanceToolDetailErrorNotice(), QMessageBox::Ok);
+ QLatin1String("ProductKeyCheckError"), ProductKeyCheck::instance(m_core)->lastErrorString(),
+ ProductKeyCheck::instance(m_core)->maintainanceToolDetailErrorNotice(), QMessageBox::Ok);
}
}
@@ -617,7 +632,7 @@ void PackageManagerCorePrivate::initialize(const QHash<QString, QString> &params
}
if (!m_repoMetaInfoJob) {
- m_repoMetaInfoJob = new GetRepositoriesMetaInfoJob(this);
+ m_repoMetaInfoJob = new GetRepositoriesMetaInfoJob(m_core);
m_repoMetaInfoJob->setAutoDelete(false);
connect(m_repoMetaInfoJob, SIGNAL(infoMessage(KDJob*, QString)), this, SLOT(infoMessage(KDJob*,
QString)));
@@ -769,13 +784,22 @@ static QSet<Repository> readRepositories(QXmlStreamReader &reader, bool isDefaul
void PackageManagerCorePrivate::writeMaintenanceConfigFiles()
{
+ bool gainedAdminRights = false;
// write current state (variables) to the uninstaller ini file
const QString iniPath = targetDir() + QLatin1Char('/') + m_data.settings().uninstallerIniFile();
+ {
+ QFile tmp(iniPath); // force gaining admin rights in case we haven't done already and we need it
+ if (!tmp.open(QIODevice::ReadWrite) || !tmp.isWritable()) {
+ if (!m_FSEngineClientHandler->isActive()) // check if nobody did it before...
+ gainedAdminRights = m_core->gainAdminRights();
+ }
+ tmp.close();
+ }
QVariantHash variables;
QSettingsWrapper cfg(iniPath, QSettingsWrapper::IniFormat);
foreach (const QString &key, m_data.keys()) {
- if (key != scRunProgramDescription && key != scRunProgram)
+ if (key != scRunProgramDescription && key != scRunProgram && key != scRunProgramArguments)
variables.insert(key, m_data.value(key));
}
cfg.setValue(QLatin1String("Variables"), variables);
@@ -787,6 +811,8 @@ void PackageManagerCorePrivate::writeMaintenanceConfigFiles()
cfg.sync();
if (cfg.status() != QSettingsWrapper::NoError) {
+ if (gainedAdminRights)
+ m_core->dropAdminRights();
const QString reason = cfg.status() == QSettingsWrapper::AccessError ? tr("Access error")
: tr("Format error");
throw Error(tr("Could not write installer configuration to %1: %2").arg(iniPath, reason));
@@ -828,6 +854,9 @@ void PackageManagerCorePrivate::writeMaintenanceConfigFiles()
writer.writeEndElement();
writer.writeEndElement();
}
+
+ if (gainedAdminRights)
+ m_core->dropAdminRights();
}
void PackageManagerCorePrivate::readMaintenanceConfigFiles(const QString &targetDir)
@@ -1301,9 +1330,15 @@ void PackageManagerCorePrivate::writeUninstaller(OperationList performedOperatio
#endif
}
+ performedOperations = sortOperationsBasedOnComponentDependencies(
+ performedOperations);
+
+ m_core->setValue(QLatin1String("installedOperationAreSorted"), QLatin1String("true"));
+
try {
KDSaveFile file(dataFile + QLatin1String(".new"));
openForWrite(&file, file.fileName());
+
writeUninstallerBinaryData(&file, &input, performedOperations, layout);
appendInt64(&file, MagicCookieDat);
file.setPermissions(file.permissions() | QFile::WriteUser | QFile::ReadGroup
@@ -1584,8 +1619,14 @@ bool PackageManagerCorePrivate::runPackageUpdater()
OperationList nonRevertedOperations;
QHash<QString, Component *> componentsByName;
+ // order the operations in the right component dependency order
+ // next loop will save the needed operations in reverse order for uninstallation
+ OperationList performedOperationsOld = m_performedOperationsOld;
+ if (m_core->value(QLatin1String("installedOperationAreSorted")) != QLatin1String("true"))
+ performedOperationsOld = sortOperationsBasedOnComponentDependencies(m_performedOperationsOld);
+
// build a list of undo operations based on the checked state of the component
- foreach (Operation *operation, m_performedOperationsOld) {
+ foreach (Operation *operation, performedOperationsOld) {
const QString &name = operation->value(QLatin1String("component")).toString();
Component *component = componentsByName.value(name, 0);
if (!component)
@@ -1636,6 +1677,7 @@ bool PackageManagerCorePrivate::runPackageUpdater()
continue;
}
+ // uninstallation should be in reverse order so prepend it here
undoOperations.prepend(operation);
updateAdminRights |= operation->value(QLatin1String("admin")).toBool();
}
@@ -1837,7 +1879,6 @@ void PackageManagerCorePrivate::installComponent(Component *component, double pr
// Remember that the operation was performed, that allows us to undo it if a following operation
// fails or if this operation failed but still needs an undo call to cleanup.
addPerformed(operation);
- operation->setValue(QLatin1String("component"), component->name());
}
if (becameAdmin)
@@ -1990,25 +2031,21 @@ void PackageManagerCorePrivate::runUndoOperations(const OperationList &undoOpera
const QString componentName = undoOperation->value(QLatin1String("component")).toString();
if (!componentName.isEmpty()) {
- while (!ok && !ignoreError && m_core->status() != PackageManagerCore::Canceled) {
- const QMessageBox::StandardButton button =
- MessageBoxHandler::warning(MessageBoxHandler::currentBestSuitParent(),
- QLatin1String("installationErrorWithRetry"), tr("Installer Error"),
- tr("Error during uninstallation process:\n%1").arg(undoOperation->errorString()),
- QMessageBox::Retry | QMessageBox::Ignore, QMessageBox::Retry);
-
- if (button == QMessageBox::Retry) {
- ok = performOperationThreaded(undoOperation, Undo);
- } else if (button == QMessageBox::Ignore) {
- ignoreError = true;
- }
- }
- }
-
- if (!componentName.isEmpty()) {
+ while (!ok && !ignoreError && m_core->status() != PackageManagerCore::Canceled) {
+ const QMessageBox::StandardButton button =
+ MessageBoxHandler::warning(MessageBoxHandler::currentBestSuitParent(),
+ QLatin1String("installationErrorWithRetry"), tr("Installer Error"),
+ tr("Error during uninstallation process:\n%1").arg(undoOperation->errorString()),
+ QMessageBox::Retry | QMessageBox::Ignore, QMessageBox::Retry);
+
+ if (button == QMessageBox::Retry)
+ ok = performOperationThreaded(undoOperation, Undo);
+ else if (button == QMessageBox::Ignore)
+ ignoreError = true;
+ }
Component *component = m_core->componentByName(componentName);
if (!component)
- component = componentsToReplace(m_core->runMode()).value(componentName).second;
+ component = componentsToReplace().value(componentName).second;
if (component) {
component->setUninstalled();
packages.removePackage(component->name());
@@ -2041,7 +2078,6 @@ PackagesList PackageManagerCorePrivate::remotePackages()
m_updateFinder = new KDUpdater::UpdateFinder(&m_updaterApplication);
m_updateFinder->setAutoDelete(false);
- m_updateFinder->setUpdateType(KDUpdater::PackageUpdate | KDUpdater::NewPackage);
m_updateFinder->run();
if (m_updateFinder->updates().isEmpty()) {
@@ -2285,8 +2321,8 @@ bool PackageManagerCorePrivate::appendComponentsToUninstall(const QList<Componen
foreach (Component *c, installedComponents) {
const QString replaces = c->value(scReplaces);
- QStringList possibleNames = replaces.split(scCommaRegExp, QString::SkipEmptyParts);
- possibleNames.append(c->name());
+ const QStringList possibleNames = replaces.split(QInstaller::commaRegExp(),
+ QString::SkipEmptyParts) << c->name();
foreach (const QString &possibleName, possibleNames)
autoDependencies.removeAll(possibleName);
}
@@ -2333,6 +2369,37 @@ void PackageManagerCorePrivate::connectOperationCallMethodRequest(Operation *con
}
}
+OperationList PackageManagerCorePrivate::sortOperationsBasedOnComponentDependencies(const OperationList &operationList)
+{
+ OperationList sortedOperations;
+ QHash<QString, OperationList> componentOperationHash;
+
+ // sort component unrelated operations to the beginning
+ foreach (Operation *operation, operationList) {
+ const QString componentName = operation->value(QLatin1String("component")).toString();
+ if (componentName.isEmpty())
+ sortedOperations.append(operation);
+ else {
+ OperationList componentOperationList = componentOperationHash.value(componentName);
+ componentOperationList.append(operation);
+ componentOperationHash.insert(operation->value(QLatin1String("component")).toString(),
+ componentOperationList);
+ }
+ }
+
+ // create the complete component graph
+ Graph<QString> componentGraph;
+ foreach (const Component* componentNode, m_core->availableComponents()) {
+ componentGraph.addNode(componentNode->name());
+ componentGraph.addEdges(componentNode->name(), componentNode->dependencies());
+ }
+
+ foreach (const QString &componentName, componentGraph.sort())
+ sortedOperations.append(componentOperationHash.value(componentName));
+
+ return sortedOperations;
+}
+
void PackageManagerCorePrivate::handleMethodInvocationRequest(const QString &invokableMethodName)
{
QObject *obj = QObject::sender();
diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h
index 9d4a6abab..d5bdc78fd 100644
--- a/src/libs/installer/packagemanagercore_p.h
+++ b/src/libs/installer/packagemanagercore_p.h
@@ -43,18 +43,16 @@
#define PACKAGEMANAGERCORE_P_H
#include "getrepositoriesmetainfojob.h"
-#include "settings.h"
#include "packagemanagercore.h"
#include "packagemanagercoredata.h"
+#include "qinstallerglobal.h"
-#include <kdsysinfo.h>
-#include <kdupdaterapplication.h>
-#include <kdupdaterupdatefinder.h>
+#include "kdsysinfo.h"
+#include "kdupdaterapplication.h"
+#include "kdupdaterfiledownloaderfactory.h"
+#include "kdupdaterupdatefinder.h"
-#include <QtCore/QHash>
-#include <QtCore/QObject>
-#include <QtCore/QPair>
-#include <QtCore/QPointer>
+#include <QObject>
class FSEngineClientHandler;
class KDJob;
@@ -68,9 +66,31 @@ namespace QInstaller {
struct BinaryLayout;
class Component;
+class ScriptEngine;
class ComponentModel;
class TempDirDeleter;
+/*
+ The default configuration interface implementation does call QSettings to save files for later deletion,
+ though according to QSettings there should nothing be written if QSettings is not setup properly (which
+ we do not in our case). Still, caused by a broken QSettings implementation at least on Linux we write an
+ empty config file which resulted in QTIFW-196. To workaround the issue we now use this empty dummy class.
+*/
+class DummyConfigurationInterface : public KDUpdater::ConfigurationInterface
+{
+public:
+ QVariant value(const QString &key) const
+ {
+ Q_UNUSED(key)
+ return QVariant();
+ }
+ void setValue(const QString &key, const QVariant &value)
+ {
+ if (value.isNull())
+ qDebug() << "DummyConfigurationInterface called with key:" << key << "and value:" << value;
+ }
+};
+
class PackageManagerCorePrivate : public QObject
{
Q_OBJECT
@@ -115,10 +135,11 @@ public:
bool buildComponentTree(QHash<QString, Component*> &components, bool loadScript);
+ ScriptEngine *scriptEngine();
void clearAllComponentLists();
void clearUpdaterComponentLists();
- QList<Component*> &replacementDependencyComponents(RunMode mode);
- QHash<QString, QPair<Component*, Component*> > &componentsToReplace(RunMode mode);
+ QList<Component*> &replacementDependencyComponents();
+ QHash<QString, QPair<Component*, Component*> > &componentsToReplace();
void clearComponentsToInstall();
bool appendComponentsToInstall(const QList<Component*> &components);
@@ -146,6 +167,7 @@ public:
int countProgressOperations(const OperationList &operations);
void connectOperationToInstaller(Operation *const operation, double progressOperationPartSize);
void connectOperationCallMethodRequest(Operation *const operation);
+ OperationList sortOperationsBasedOnComponentDependencies(const OperationList &operationList);
Operation *createOwnedOperation(const QString &type);
Operation *takeOwnedOperation(Operation *operation);
@@ -241,6 +263,7 @@ private:
qint64 m_magicBinaryMarker;
bool m_componentsToInstallCalculated;
+ ScriptEngine *m_scriptEngine;
// < name (component to replace), < replacement component, component to replace > >
QHash<QString, QPair<Component*, Component*> > m_componentsToReplaceAllMode;
QHash<QString, QPair<Component*, Component*> > m_componentsToReplaceUpdaterMode;
diff --git a/src/libs/installer/packagemanagercoredata.cpp b/src/libs/installer/packagemanagercoredata.cpp
index 7dbdf4e1a..2294a8086 100644
--- a/src/libs/installer/packagemanagercoredata.cpp
+++ b/src/libs/installer/packagemanagercoredata.cpp
@@ -57,6 +57,8 @@ PackageManagerCoreData::PackageManagerCoreData(const QHash<QString, QString> &va
// in a script or...
m_variables.insert(QLatin1String("rootDir"), QDir::rootPath());
m_variables.insert(QLatin1String("homeDir"), QDir::homePath());
+ m_variables.insert(QLatin1String("RootDir"), QDir::rootPath());
+ m_variables.insert(QLatin1String("HomeDir"), QDir::homePath());
m_variables.insert(scTargetConfigurationFile, QLatin1String("components.xml"));
#ifdef Q_OS_WIN
@@ -90,6 +92,7 @@ PackageManagerCoreData::PackageManagerCoreData(const QHash<QString, QString> &va
m_variables.insert(scTargetConfigurationFile, m_settings.configurationFileName());
m_variables.insert(QLatin1String("LogoPixmap"), m_settings.logo());
m_variables.insert(QLatin1String("WatermarkPixmap"), m_settings.watermark());
+ m_variables.insert(QLatin1String("BannerPixmap"), m_settings.banner());
const QString description = m_settings.runProgramDescription();
if (!description.isEmpty())
@@ -97,6 +100,7 @@ PackageManagerCoreData::PackageManagerCoreData(const QHash<QString, QString> &va
m_variables.insert(scTargetDir, replaceVariables(m_settings.targetDir()));
m_variables.insert(scRunProgram, replaceVariables(m_settings.runProgram()));
+ m_variables.insert(scRunProgramArguments, replaceVariables(m_settings.runProgramArguments()));
m_variables.insert(scRemoveTargetDir, replaceVariables(m_settings.removeTargetDir()));
}
diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp
index 1e01e69ff..4ce38a388 100644
--- a/src/libs/installer/packagemanagergui.cpp
+++ b/src/libs/installer/packagemanagergui.cpp
@@ -46,11 +46,11 @@
#include "fileutils.h"
#include "messageboxhandler.h"
#include "packagemanagercore.h"
-#include "qinstallerglobal.h"
#include "progresscoordinator.h"
#include "performinstallationform.h"
#include "settings.h"
#include "utils.h"
+#include "scriptengine.h"
#include "kdsysinfo.h"
@@ -85,8 +85,6 @@
#include <QScrollBar>
#include <QShowEvent>
-#include <QtScript/QScriptEngine>
-
using namespace KDUpdater;
using namespace QInstaller;
@@ -134,6 +132,7 @@ public:
setObjectName(QLatin1String("Dynamic") + widget->objectName());
setPixmap(QWizard::LogoPixmap, logoPixmap());
setPixmap(QWizard::WatermarkPixmap, QPixmap());
+ setPixmap(QWizard::BannerPixmap, QPixmap());
setLayout(new QVBoxLayout);
setSubTitle(QString());
@@ -216,19 +215,13 @@ public:
QHash<int, QWizardPage*> m_defaultPages;
QHash<int, QString> m_defaultButtonText;
- QScriptValue m_controlScript;
- QScriptEngine m_controlScriptEngine;
+ QScriptValue m_controlScriptContext;
QHash<QWizard::WizardButton, QString> m_wizardButtonTypes;
};
// -- PackageManagerGui
-QScriptEngine *PackageManagerGui::controlScriptEngine() const
-{
- return &d->m_controlScriptEngine;
-}
-
/*!
\class QInstaller::PackageManagerGui
Is the "gui" object in a none interactive installation
@@ -244,7 +237,7 @@ PackageManagerGui::PackageManagerGui(PackageManagerCore *core, QWidget *parent)
setWindowTitle(tr("Maintain %1").arg(m_core->value(scTitle)));
#ifndef Q_OS_MAC
- setWindowIcon(QIcon(m_core->settings().icon()));
+ setWindowIcon(QIcon(m_core->settings().installerWindowIcon()));
#else
setPixmap(QWizard::BackgroundPixmap, m_core->settings().background());
#endif
@@ -292,6 +285,8 @@ PackageManagerGui::PackageManagerGui(PackageManagerCore *core, QWidget *parent)
for (int i = QWizard::BackButton; i < QWizard::CustomButton1; ++i)
d->m_defaultButtonText.insert(i, buttonText(QWizard::WizardButton(i)));
+
+ m_core->scriptEngine()->setGuiQObject(this);
}
PackageManagerGui::~PackageManagerGui()
@@ -311,20 +306,30 @@ QString PackageManagerGui::defaultButtonText(int wizardButton) const
void PackageManagerGui::clickButton(int wb, int delay)
{
- if (QAbstractButton *b = button(static_cast<QWizard::WizardButton>(wb) )) {
+ // transform the FinishButton to CancelButton, because of the needed misuse of the
+ // CancelButton as a FinishButton to have some more control of closing the wizard
+ if (!m_core->isInstaller() && currentId() == PackageManagerCore::InstallationFinished &&
+ wb == QWizard::FinishButton) {
+ wb = QWizard::CancelButton;
+ }
+ if (QAbstractButton *b = button(static_cast<QWizard::WizardButton>(wb) ))
QTimer::singleShot(delay, b, SLOT(click()));
- } else {
+ else
qWarning() << "Button with type: " << d->buttonType(wb) << "not found!";
- }
}
bool PackageManagerGui::isButtonEnabled(int wb)
{
- if (QAbstractButton *b = button(static_cast<QWizard::WizardButton>(wb) )) {
- return b->isEnabled();
- } else {
- qWarning() << "Button with type: " << d->buttonType(wb) << "not found!";
+ // transform the FinishButton to CancelButton, because of the needed misuse of the
+ // CancelButton as a FinishButton to have some more control of closing the wizard
+ if (!m_core->isInstaller() && currentId() == PackageManagerCore::InstallationFinished &&
+ wb == QWizard::FinishButton) {
+ wb = QWizard::CancelButton;
}
+ if (QAbstractButton *b = button(static_cast<QWizard::WizardButton>(wb) ))
+ return b->isEnabled();
+
+ qWarning() << "Button with type: " << d->buttonType(wb) << "not found!";
return false;
}
@@ -350,58 +355,8 @@ void PackageManagerGui::setValidatorForCustomPageRequested(Component *component,
*/
void PackageManagerGui::loadControlScript(const QString &scriptPath)
{
- QFile file(scriptPath);
- if (!file.open(QIODevice::ReadOnly)) {
- throw Error(QObject::tr("Could not open the requested script file at %1: %2")
- .arg(scriptPath, file.errorString()));
- }
-
- QScriptValue installerObject = d->m_controlScriptEngine.newQObject(m_core);
- installerObject.setProperty(QLatin1String("componentByName"), d->m_controlScriptEngine
- .newFunction(qInstallerComponentByName, 1));
-
- d->m_controlScriptEngine.globalObject().setProperty(QLatin1String("installer"),
- installerObject);
- d->m_controlScriptEngine.globalObject().setProperty(QLatin1String("gui"),
- d->m_controlScriptEngine.newQObject(this));
- d->m_controlScriptEngine.globalObject().setProperty(QLatin1String("packagemanagergui"),
- d->m_controlScriptEngine.newQObject(this));
- registerMessageBox(&d->m_controlScriptEngine);
-
-#undef REGISTER_BUTTON
-#define REGISTER_BUTTON(x) buttons.setProperty(QLatin1String(#x), \
- d->m_controlScriptEngine.newVariant(static_cast<int>(QWizard::x)));
-
- QScriptValue buttons = d->m_controlScriptEngine.newArray();
- REGISTER_BUTTON(BackButton)
- REGISTER_BUTTON(NextButton)
- REGISTER_BUTTON(CommitButton)
- REGISTER_BUTTON(FinishButton)
- REGISTER_BUTTON(CancelButton)
- REGISTER_BUTTON(HelpButton)
- REGISTER_BUTTON(CustomButton1)
- REGISTER_BUTTON(CustomButton2)
- REGISTER_BUTTON(CustomButton3)
-
-#undef REGISTER_BUTTON
-
- d->m_controlScriptEngine.globalObject().setProperty(QLatin1String("buttons"), buttons);
-
- d->m_controlScriptEngine.evaluate(QLatin1String(file.readAll()), scriptPath);
- if (d->m_controlScriptEngine.hasUncaughtException()) {
- throw Error(QObject::tr("Exception while loading the control script %1")
- .arg(uncaughtExceptionString(&(d->m_controlScriptEngine)/*, scriptPath*/)));
- }
-
- QScriptValue comp = d->m_controlScriptEngine.evaluate(QLatin1String("Controller"));
- if (d->m_controlScriptEngine.hasUncaughtException()) {
- throw Error(QObject::tr("Exception while loading the control script %1")
- .arg(uncaughtExceptionString(&(d->m_controlScriptEngine)/*, scriptPath*/)));
- }
-
- d->m_controlScript = comp;
- d->m_controlScript.construct();
-
+ d->m_controlScriptContext = m_core->scriptEngine()->loadInConext(
+ QLatin1String("Controller"), scriptPath);
qDebug() << "Loaded control script" << scriptPath;
}
@@ -413,24 +368,18 @@ void PackageManagerGui::slotCurrentPageChanged(int id)
void PackageManagerGui::callControlScriptMethod(const QString &methodName)
{
- if (!d->m_controlScript.isValid())
- return;
-
- QScriptValue method = d->m_controlScript.property(QLatin1String("prototype")).property(methodName);
-
- if (!method.isValid()) {
- qDebug() << "Control script callback" << methodName << "does not exist.";
+ if (!d->m_controlScriptContext.isValid())
return;
- }
-
- qDebug() << "Calling control script callback" << methodName;
-
- method.call(d->m_controlScript);
+ try {
+ QScriptValue returnValue = m_core->scriptEngine()->callScriptMethod(
+ d->m_controlScriptContext, methodName);
- if (d->m_controlScriptEngine.hasUncaughtException()) {
- qCritical()
- << uncaughtExceptionString(&(d->m_controlScriptEngine) /*, QLatin1String("control script")*/);
- // TODO: handle error
+ if (!returnValue.isValid()) {
+ qDebug() << "Control script callback" << methodName << "does not exist.";
+ return;
+ }
+ } catch (const QInstaller::Error &e) {
+ qCritical() << qPrintable(e.message());
}
}
@@ -461,7 +410,6 @@ bool PackageManagerGui::event(QEvent *event)
void PackageManagerGui::showEvent(QShowEvent *event)
{
-#ifndef Q_OS_LINUX
if (!event->spontaneous()) {
foreach (int id, pageIds()) {
const QString subTitle = page(id)->subTitle();
@@ -472,7 +420,6 @@ void PackageManagerGui::showEvent(QShowEvent *event)
}
}
}
-#endif
QWizard::showEvent(event);
QMetaObject::invokeMethod(this, "dependsOnLocalInstallerBinary", Qt::QueuedConnection);
}
@@ -692,6 +639,9 @@ PackageManagerPage::PackageManagerPage(PackageManagerCore *core)
, m_core(core)
, validatorComponent(0)
{
+ setPixmap(QWizard::WatermarkPixmap, watermarkPixmap());
+ setPixmap(QWizard::BannerPixmap, bannerPixmap());
+ setPixmap(QWizard::LogoPixmap, logoPixmap());
}
PackageManagerCore *PackageManagerPage::packageManagerCore() const
@@ -699,44 +649,14 @@ PackageManagerCore *PackageManagerPage::packageManagerCore() const
return m_core;
}
-QVariantHash PackageManagerPage::elementsForPage(const QString &pageName) const
-{
- const QVariant variant = m_core->settings().value(pageName);
-
- QVariantHash hash;
- if (variant.canConvert<QVariantHash>())
- hash = variant.value<QVariantHash>();
- return hash;
-}
-
-QString PackageManagerPage::titleForPage(const QString &pageName, const QString &value) const
-{
- return titleFromHash(m_core->settings().titlesForPage(pageName), value);
-}
-
-QString PackageManagerPage::subTitleForPage(const QString &pageName, const QString &value) const
-{
- return titleFromHash(m_core->settings().subTitlesForPage(pageName), value);
-}
-
-QString PackageManagerPage::titleFromHash(const QVariantHash &hash, const QString &value) const
+QPixmap PackageManagerPage::watermarkPixmap() const
{
- QString defaultValue = hash.value(QLatin1String("Default")).toString();
- if (defaultValue.isEmpty())
- defaultValue = value;
-
- if (m_core->isUpdater())
- return hash.value(QLatin1String("Updater"), defaultValue).toString();
- if (m_core->isInstaller())
- return hash.value(QLatin1String("Installer"), defaultValue).toString();
- if (m_core->isPackageManager())
- return hash.value(QLatin1String("PackageManager"), defaultValue).toString();
- return hash.value(QLatin1String("Uninstaller"), defaultValue).toString();
+ return QPixmap(m_core->value(QLatin1String("WatermarkPixmap")));
}
-QPixmap PackageManagerPage::watermarkPixmap() const
+QPixmap PackageManagerPage::bannerPixmap() const
{
- return QPixmap(m_core->value(QLatin1String("WatermarkPixmap")));
+ return QPixmap(m_core->value(QLatin1String("BannerPixmap")));
}
QPixmap PackageManagerPage::logoPixmap() const
@@ -815,10 +735,13 @@ void PackageManagerPage::setVisible(bool visible)
return;
}
- if (visible)
+ if (visible) {
entering();
- else
+ emit entered();
+ } else {
leaving();
+ emit left();
+ }
}
int PackageManagerPage::nextId() const
@@ -851,16 +774,12 @@ IntroductionPage::IntroductionPage(PackageManagerCore *core)
, m_widget(0)
{
setObjectName(QLatin1String("IntroductionPage"));
- setPixmap(QWizard::WatermarkPixmap, watermarkPixmap());
- setSubTitle(subTitleForPage(QLatin1String("IntroductionPage")));
- setTitle(titleForPage(QLatin1String("IntroductionPage"), tr("Setup - %1")).arg(productName()));
+ setTitle(tr("Setup - %1").arg(productName()));
m_msgLabel = new QLabel(this);
m_msgLabel->setWordWrap(true);
m_msgLabel->setObjectName(QLatin1String("MessageLabel"));
- const QVariantHash hash = elementsForPage(QLatin1String("IntroductionPage"));
- m_msgLabel->setText(hash.value(QLatin1String("MessageLabel"), tr("Welcome to the %1 "
- "Setup Wizard.")).toString().arg(productName()));
+ m_msgLabel->setText(tr("Welcome to the %1 Setup Wizard.").arg(productName()));
QVBoxLayout *layout = new QVBoxLayout(this);
setLayout(layout);
@@ -916,10 +835,9 @@ private:
LicenseAgreementPage::LicenseAgreementPage(PackageManagerCore *core)
: PackageManagerPage(core)
{
- setPixmap(QWizard::LogoPixmap, logoPixmap());
setPixmap(QWizard::WatermarkPixmap, QPixmap());
setObjectName(QLatin1String("LicenseAgreementPage"));
- setTitle(titleForPage(QLatin1String("LicenseAgreementPage"), tr("License Agreement")));
+ setTitle(tr("License Agreement"));
m_licenseListWidget = new QListWidget(this);
m_licenseListWidget->setObjectName(QLatin1String("LicenseListWidget"));
@@ -1046,11 +964,10 @@ void LicenseAgreementPage::updateUi()
rejectButtonText = tr("I do not accept the licenses.");
}
- setSubTitle(subTitleForPage(QLatin1String("LicenseAgreementPage"), subTitleText));
+ setSubTitle(subTitleText);
- const QVariantHash hash = elementsForPage(QLatin1String("LicenseAgreementPage"));
- m_acceptLabel->setText(hash.value(QLatin1String("AcceptLicenseLabel"), acceptButtonText).toString());
- m_rejectLabel->setText(hash.value(QLatin1String("RejectLicenseLabel"), rejectButtonText).toString());
+ m_acceptLabel->setText(acceptButtonText);
+ m_rejectLabel->setText(rejectButtonText);
}
@@ -1072,8 +989,10 @@ public:
{
m_treeView->setObjectName(QLatin1String("ComponentsTreeView"));
- connect(m_allModel, SIGNAL(defaultCheckStateChanged(bool)), q, SLOT(setModified(bool)));
- connect(m_updaterModel, SIGNAL(defaultCheckStateChanged(bool)), q, SLOT(setModified(bool)));
+ connect(m_allModel, SIGNAL(checkStateChanged(QInstaller::ComponentModel::ModelState)), this,
+ SLOT(onModelStateChanged(QInstaller::ComponentModel::ModelState)));
+ connect(m_updaterModel, SIGNAL(checkStateChanged(QInstaller::ComponentModel::ModelState)), this,
+ SLOT(onModelStateChanged(QInstaller::ComponentModel::ModelState)));
QHBoxLayout *hlayout = new QHBoxLayout;
hlayout->addWidget(m_treeView, 3);
@@ -1099,18 +1018,15 @@ public:
m_checkDefault = new QPushButton;
connect(m_checkDefault, SIGNAL(clicked()), this, SLOT(selectDefault()));
- connect(m_allModel, SIGNAL(defaultCheckStateChanged(bool)), m_checkDefault, SLOT(setEnabled(bool)));
- const QVariantHash hash = q->elementsForPage(QLatin1String("ComponentSelectionPage"));
if (m_core->isInstaller()) {
m_checkDefault->setObjectName(QLatin1String("SelectDefaultComponentsButton"));
m_checkDefault->setShortcut(QKeySequence(ComponentSelectionPage::tr("Alt+A", "select default components")));
- m_checkDefault->setText(hash.value(QLatin1String("SelectDefaultComponentsButton"), ComponentSelectionPage::tr("Def&ault"))
- .toString());
+ m_checkDefault->setText(ComponentSelectionPage::tr("Def&ault"));
} else {
m_checkDefault->setEnabled(false);
m_checkDefault->setObjectName(QLatin1String("ResetComponentsButton"));
m_checkDefault->setShortcut(QKeySequence(ComponentSelectionPage::tr("Alt+R", "reset to already installed components")));
- m_checkDefault->setText(hash.value(QLatin1String("ResetComponentsButton"), ComponentSelectionPage::tr("&Reset")).toString());
+ m_checkDefault->setText(ComponentSelectionPage::tr("&Reset"));
}
hlayout = new QHBoxLayout;
hlayout->addWidget(m_checkDefault);
@@ -1120,15 +1036,14 @@ public:
connect(m_checkAll, SIGNAL(clicked()), this, SLOT(selectAll()));
m_checkAll->setObjectName(QLatin1String("SelectAllComponentsButton"));
m_checkAll->setShortcut(QKeySequence(ComponentSelectionPage::tr("Alt+S", "select all components")));
- m_checkAll->setText(hash.value(QLatin1String("SelectAllComponentsButton"), ComponentSelectionPage::tr("&Select All")).toString());
+ m_checkAll->setText(ComponentSelectionPage::tr("&Select All"));
m_uncheckAll = new QPushButton;
hlayout->addWidget(m_uncheckAll);
connect(m_uncheckAll, SIGNAL(clicked()), this, SLOT(deselectAll()));
m_uncheckAll->setObjectName(QLatin1String("DeselectAllComponentsButton"));
m_uncheckAll->setShortcut(QKeySequence(ComponentSelectionPage::tr("Alt+D", "deselect all components")));
- m_uncheckAll->setText(hash.value(QLatin1String("DeselectAllComponentsButton"), ComponentSelectionPage::tr("&Deselect All"))
- .toString());
+ m_uncheckAll->setText(ComponentSelectionPage::tr("&Deselect All"));
hlayout->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::MinimumExpanding,
QSizePolicy::MinimumExpanding));
@@ -1140,9 +1055,7 @@ public:
m_checkDefault->setVisible(m_core->isInstaller() || m_core->isPackageManager());
if (m_treeView->selectionModel()) {
disconnect(m_treeView->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)),
- this, SLOT(currentChanged(QModelIndex)));
- disconnect(m_currentModel, SIGNAL(checkStateChanged(QModelIndex)), this,
- SLOT(currentChanged(QModelIndex)));
+ this, SLOT(currentSelectedChanged(QModelIndex)));
}
m_currentModel = m_core->isUpdater() ? m_updaterModel : m_allModel;
@@ -1166,61 +1079,63 @@ public:
m_treeView->setRootIsDecorated(hasChildren);
connect(m_treeView->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)),
- this, SLOT(currentChanged(QModelIndex)));
- connect(m_currentModel, SIGNAL(checkStateChanged(QModelIndex)), this,
- SLOT(currentChanged(QModelIndex)));
+ this, SLOT(currentSelectedChanged(QModelIndex)));
m_treeView->setCurrentIndex(m_currentModel->index(0, 0));
}
public slots:
- void currentChanged(const QModelIndex &current)
+ void currentSelectedChanged(const QModelIndex &current)
{
- // if there is not selection or the current selected node didn't change, return
- if (!current.isValid() || current != m_treeView->selectionModel()->currentIndex())
+ if (!current.isValid())
return;
+ m_sizeLabel->setText(QString());
m_descriptionLabel->setText(m_currentModel->data(m_currentModel->index(current.row(),
ComponentModelHelper::NameColumn, current.parent()), Qt::ToolTipRole).toString());
- m_sizeLabel->clear();
- if (!m_core->isUninstaller()) {
- Component *component = m_currentModel->componentFromIndex(current);
- if (component && component->updateUncompressedSize() > 0) {
- const QVariantHash hash = q->elementsForPage(QLatin1String("ComponentSelectionPage"));
- m_sizeLabel->setText(hash.value(QLatin1String("ComponentSizeLabel"),
- ComponentSelectionPage::tr("This component will occupy approximately %1 on your hard disk drive.")).toString()
- .arg(m_currentModel->data(m_currentModel->index(current.row(),
- ComponentModelHelper::UncompressedSizeColumn, current.parent())).toString()));
- }
+ Component *component = m_currentModel->componentFromIndex(current);
+ if ((m_core->isUninstaller()) || (!component))
+ return;
+
+ if (component->isSelected() && (component->value(scUncompressedSizeSum).toLongLong() > 0)) {
+ m_sizeLabel->setText(ComponentSelectionPage::tr("This component "
+ "will occupy approximately %1 on your hard disk drive.")
+ .arg(humanReadableSize(component->value(scUncompressedSizeSum).toLongLong())));
}
}
- // TODO: all *select* function ignore the fact that components can be selected inside the tree view as
- // well, which will result in e.g. a disabled button state as long as "ALL" components not
- // unchecked again.
void selectAll()
{
- m_currentModel->selectAll();
-
- m_checkAll->setEnabled(false);
- m_uncheckAll->setEnabled(true);
+ m_currentModel->setCheckedState(ComponentModel::AllChecked);
}
void deselectAll()
{
- m_currentModel->deselectAll();
-
- m_checkAll->setEnabled(true);
- m_uncheckAll->setEnabled(false);
+ m_currentModel->setCheckedState(ComponentModel::AllUnchecked);
}
void selectDefault()
{
- m_currentModel->selectDefault();
+ m_currentModel->setCheckedState(ComponentModel::DefaultChecked);
+ }
- m_checkAll->setEnabled(true);
- m_uncheckAll->setEnabled(true);
+ void onModelStateChanged(QInstaller::ComponentModel::ModelState state)
+ {
+ q->setModified(state.testFlag(ComponentModel::DefaultChecked) == false);
+ // If all components in the checked list are only checkable when run without forced installation, set
+ // ComponentModel::AllUnchecked as well, as we cannot uncheck anything. Helps to keep the UI correct.
+ if ((!m_core->noForceInstallation()) && (m_currentModel->checked() == m_currentModel->uncheckable()))
+ state |= ComponentModel::AllUnchecked;
+
+ // enable the button if the corresponding flag is not set
+ m_checkAll->setEnabled(state.testFlag(ComponentModel::AllChecked) == false);
+ m_uncheckAll->setEnabled(state.testFlag(ComponentModel::AllUnchecked) == false);
+ m_checkDefault->setEnabled(state.testFlag(ComponentModel::DefaultChecked) == false);
+
+ // update the current selected node (important to reflect possible sub-node changes)
+ if (m_treeView->selectionModel())
+ currentSelectedChanged(m_treeView->selectionModel()->currentIndex());
}
public:
@@ -1248,10 +1163,9 @@ ComponentSelectionPage::ComponentSelectionPage(PackageManagerCore *core)
: PackageManagerPage(core)
, d(new Private(this, core))
{
- setPixmap(QWizard::LogoPixmap, logoPixmap());
setPixmap(QWizard::WatermarkPixmap, QPixmap());
setObjectName(QLatin1String("ComponentSelectionPage"));
- setTitle(titleForPage(QLatin1String("ComponentSelectionPage"), tr("Select Components")));
+ setTitle(tr("Select Components"));
}
ComponentSelectionPage::~ComponentSelectionPage()
@@ -1273,7 +1187,7 @@ void ComponentSelectionPage::entering()
if (core->isInstaller()) index = 1;
if (core->isUninstaller()) index = 2;
if (core->isPackageManager()) index = 3;
- setSubTitle(subTitleForPage(QLatin1String("ComponentSelectionPage"), tr(strings[index])));
+ setSubTitle(tr(strings[index]));
d->updateTreeView();
setModified(isComplete());
@@ -1331,8 +1245,8 @@ void ComponentSelectionPage::setModified(bool modified)
bool ComponentSelectionPage::isComplete() const
{
if (packageManagerCore()->isInstaller() || packageManagerCore()->isUpdater())
- return d->m_currentModel->hasCheckedComponents();
- return !d->m_currentModel->defaultCheckState();
+ return d->m_currentModel->checked().count();
+ return d->m_currentModel->checkedState().testFlag(ComponentModel::DefaultChecked) == false;
}
@@ -1341,20 +1255,16 @@ bool ComponentSelectionPage::isComplete() const
TargetDirectoryPage::TargetDirectoryPage(PackageManagerCore *core)
: PackageManagerPage(core)
{
- setPixmap(QWizard::LogoPixmap, logoPixmap());
setPixmap(QWizard::WatermarkPixmap, QPixmap());
setObjectName(QLatin1String("TargetDirectoryPage"));
- setSubTitle(subTitleForPage(QLatin1String("TargetDirectoryPage")));
- setTitle(titleForPage(QLatin1String("TargetDirectoryPage"), tr("Installation Folder")));
+ setTitle(tr("Installation Folder"));
QVBoxLayout *layout = new QVBoxLayout(this);
QLabel *msgLabel = new QLabel(this);
msgLabel->setWordWrap(true);
msgLabel->setObjectName(QLatin1String("MessageLabel"));
- const QVariantHash hash = elementsForPage(QLatin1String("TargetDirectoryPage"));
- msgLabel->setText(hash.value(QLatin1String("MessageLabel"), tr("Please specify the folder "
- "where %1 will be installed.")).toString().arg(productName()));
+ msgLabel->setText(tr("Please specify the folder where %1 will be installed.").arg(productName()));
layout->addWidget(msgLabel);
QHBoxLayout *hlayout = new QHBoxLayout;
@@ -1368,8 +1278,7 @@ TargetDirectoryPage::TargetDirectoryPage(PackageManagerCore *core)
browseButton->setObjectName(QLatin1String("BrowseDirectoryButton"));
connect(browseButton, SIGNAL(clicked()), this, SLOT(dirRequested()));
browseButton->setShortcut(QKeySequence(tr("Alt+R", "browse file system to choose a file")));
- browseButton->setText(hash.value(QLatin1String("BrowseDirectoryButton"), tr("B&rowse..."))
- .toString());
+ browseButton->setText(tr("B&rowse..."));
hlayout->addWidget(browseButton);
layout->addLayout(hlayout);
@@ -1403,12 +1312,10 @@ void TargetDirectoryPage::initializePage()
bool TargetDirectoryPage::validatePage()
{
- const QVariantHash hash = elementsForPage(QLatin1String("TargetDirectoryPage"));
if (targetDir().isEmpty()) {
MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
- QLatin1String("EmptyTargetDirectoryMessage"), tr("Error"), hash
- .value(QLatin1String("EmptyTargetDirectoryMessage"), tr("The install directory cannot be "
- "empty, please specify a valid folder.")).toString(), QMessageBox::Ok);
+ QLatin1String("EmptyTargetDirectoryMessage"), tr("Error"), tr("The install directory cannot be "
+ "empty, please specify a valid folder."), QMessageBox::Ok);
return false;
}
@@ -1421,9 +1328,8 @@ bool TargetDirectoryPage::validatePage()
// it exists, but is not empty
if (dir == QDir::root()) {
MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
- QLatin1String("ForbiddenTargetDirectoryMessage"), tr("Error"), hash
- .value(QLatin1String("ForbiddenTargetDirectoryMessage"), tr("As the install directory is "
- "completely deleted, installing in %1 is forbidden.")).toString().arg(QDir::rootPath()),
+ QLatin1String("ForbiddenTargetDirectoryMessage"), tr("Error"), tr("As the install directory "
+ "is completely deleted on uninstall, installing in %1 is forbidden.").arg(QDir::rootPath()),
QMessageBox::Ok);
return false;
}
@@ -1432,11 +1338,10 @@ bool TargetDirectoryPage::validatePage()
return true;
return MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
- QLatin1String("OverwriteTargetDirectoryMessage"), tr("Warning"), hash
- .value(QLatin1String("OverwriteTargetDirectoryMessage"), tr("You have selected an existing, "
+ QLatin1String("OverwriteTargetDirectoryMessage"), tr("Warning"), tr("You have selected an existing, "
"non-empty folder for installation. Note that it will be completely wiped on uninstallation of "
"this application. It is not advisable to install into this folder as installation might fail. "
- "Do you want to continue?")).toString(), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes;
+ "Do you want to continue?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes;
}
return true;
}
@@ -1456,9 +1361,7 @@ void TargetDirectoryPage::targetDirSelected()
void TargetDirectoryPage::dirRequested()
{
- const QVariantHash hash = elementsForPage(QLatin1String("TargetDirectoryPage"));
- const QString newDirName = QFileDialog::getExistingDirectory(this, hash
- .value(QLatin1String("SelectInstallationFolderCaption"), tr("Select Installation Folder")).toString(),
+ const QString newDirName = QFileDialog::getExistingDirectory(this, tr("Select Installation Folder"),
targetDir());
if (newDirName.isEmpty() || newDirName == targetDir())
return;
@@ -1471,12 +1374,11 @@ void TargetDirectoryPage::dirRequested()
StartMenuDirectoryPage::StartMenuDirectoryPage(PackageManagerCore *core)
: PackageManagerPage(core)
{
- setPixmap(QWizard::LogoPixmap, logoPixmap());
setPixmap(QWizard::WatermarkPixmap, QPixmap());
setObjectName(QLatin1String("StartMenuDirectoryPage"));
- setTitle(titleForPage(QLatin1String("StartMenuDirectoryPage"), tr("Start Menu shortcuts")));
- setSubTitle(subTitleForPage(QLatin1String("StartMenuDirectoryPage"), tr("Select the Start Menu in which "
- "you would like to create the program's shortcuts. You can also enter a name to create a new folder.")));
+ setTitle(tr("Start Menu shortcuts"));
+ setSubTitle(tr("Select the Start Menu in which you would like to create the program's shortcuts. You can "
+ "also enter a name to create a new folder."));
m_lineEdit = new QLineEdit(this);
m_lineEdit->setObjectName(QLatin1String("LineEdit"));
@@ -1531,12 +1433,12 @@ StartMenuDirectoryPage::StartMenuDirectoryPage(PackageManagerCore *core)
QString StartMenuDirectoryPage::startMenuDir() const
{
- return m_lineEdit->text();
+ return m_lineEdit->text().trimmed();
}
void StartMenuDirectoryPage::setStartMenuDir(const QString &startMenuDir)
{
- m_lineEdit->setText(startMenuDir);
+ m_lineEdit->setText(startMenuDir.trimmed());
}
void StartMenuDirectoryPage::leaving()
@@ -1561,10 +1463,8 @@ ReadyForInstallationPage::ReadyForInstallationPage(PackageManagerCore *core)
: PackageManagerPage(core)
, m_msgLabel(new QLabel)
{
- setPixmap(QWizard::LogoPixmap, logoPixmap());
setPixmap(QWizard::WatermarkPixmap, QPixmap());
setObjectName(QLatin1String("ReadyForInstallationPage"));
- setSubTitle(subTitleForPage(QLatin1String("ReadyForInstallationPage")));
QVBoxLayout *baseLayout = new QVBoxLayout();
baseLayout->setObjectName(QLatin1String("BaseLayout"));
@@ -1612,7 +1512,7 @@ void ReadyForInstallationPage::entering()
m_taskDetailsButton->setVisible(false);
m_taskDetailsBrowser->setVisible(false);
setButtonText(QWizard::CommitButton, tr("U&ninstall"));
- setTitle(titleForPage(objectName(), tr("Ready to Uninstall")));
+ setTitle(tr("Ready to Uninstall"));
m_msgLabel->setText(tr("Setup is now ready to begin removing %1 from your computer.<br>"
"<font color=\"red\">The program directory %2 will be deleted completely</font>, "
"including all content in that directory!")
@@ -1622,12 +1522,12 @@ void ReadyForInstallationPage::entering()
return;
} else if (packageManagerCore()->isPackageManager() || packageManagerCore()->isUpdater()) {
setButtonText(QWizard::CommitButton, tr("U&pdate"));
- setTitle(titleForPage(objectName(), tr("Ready to Update Packages")));
+ setTitle(tr("Ready to Update Packages"));
m_msgLabel->setText(tr("Setup is now ready to begin updating your installation."));
} else {
Q_ASSERT(packageManagerCore()->isInstaller());
setButtonText(QWizard::CommitButton, tr("&Install"));
- setTitle(titleForPage(objectName(), tr("Ready to Install")));
+ setTitle(tr("Ready to Install"));
m_msgLabel->setText(tr("Setup is now ready to begin installing %1 on your computer.")
.arg(productName()));
}
@@ -1791,10 +1691,8 @@ PerformInstallationPage::PerformInstallationPage(PackageManagerCore *core)
: PackageManagerPage(core)
, m_performInstallationForm(new PerformInstallationForm(this))
{
- setPixmap(QWizard::LogoPixmap, logoPixmap());
setPixmap(QWizard::WatermarkPixmap, QPixmap());
setObjectName(QLatin1String("PerformInstallationPage"));
- setSubTitle(subTitleForPage(QLatin1String("PerformInstallationPage")));
m_performInstallationForm->setupUi(this);
@@ -1836,17 +1734,17 @@ void PerformInstallationPage::entering()
if (packageManagerCore()->isUninstaller()) {
setButtonText(QWizard::CommitButton, tr("&Uninstall"));
- setTitle(titleForPage(objectName(), tr("Uninstalling %1")).arg(productName()));
+ setTitle(tr("Uninstalling %1").arg(productName()));
QTimer::singleShot(30, packageManagerCore(), SLOT(runUninstaller()));
} else if (packageManagerCore()->isPackageManager() || packageManagerCore()->isUpdater()) {
setButtonText(QWizard::CommitButton, tr("&Update"));
- setTitle(titleForPage(objectName(), tr("Updating components of %1")).arg(productName()));
+ setTitle(tr("Updating components of %1").arg(productName()));
QTimer::singleShot(30, packageManagerCore(), SLOT(runPackageUpdater()));
} else {
setButtonText(QWizard::CommitButton, tr("&Install"));
- setTitle(titleForPage(objectName(), tr("Installing %1")).arg(productName()));
+ setTitle(tr("Installing %1").arg(productName()));
QTimer::singleShot(30, packageManagerCore(), SLOT(runInstaller()));
}
@@ -1913,21 +1811,16 @@ FinishedPage::FinishedPage(PackageManagerCore *core)
, m_commitButton(0)
{
setObjectName(QLatin1String("FinishedPage"));
- setPixmap(QWizard::WatermarkPixmap, watermarkPixmap());
- setSubTitle(subTitleForPage(QLatin1String("FinishedPage")));
- setTitle(titleForPage(QLatin1String("FinishedPage"), tr("Completing the %1 Wizard")).arg(productName()));
+ setTitle(tr("Completing the %1 Wizard").arg(productName()));
m_msgLabel = new QLabel(this);
m_msgLabel->setWordWrap(true);
m_msgLabel->setObjectName(QLatin1String("MessageLabel"));
- const QVariantHash hash = elementsForPage(QLatin1String("FinishedPage"));
#ifdef Q_OS_MAC
- m_msgLabel->setText(hash.value(QLatin1String("MessageLabel"), tr("Click Done to exit the %1 "
- "Wizard.")).toString().arg(productName()));
+ m_msgLabel->setText(tr("Click Done to exit the %1 Wizard.").arg(productName()));
#else
- m_msgLabel->setText(hash.value(QLatin1String("MessageLabel"), tr("Click Finish to exit the "
- "%1 Wizard.")).toString().arg(productName()));
+ m_msgLabel->setText(tr("Click Finish to exit the %1 Wizard.").arg(productName()));
#endif
m_runItCheckBox = new QCheckBox(this);
@@ -1956,6 +1849,13 @@ void FinishedPage::entering()
m_commitButton = cancel;
cancel->setEnabled(true);
cancel->setVisible(true);
+ // we don't use the usual FinishButton so we need to connect the misused CancelButton
+ connect(cancel, SIGNAL(clicked()), gui(), SIGNAL(finishButtonClicked()));
+ connect(cancel, SIGNAL(clicked()), packageManagerCore(), SIGNAL(finishButtonClicked()));
+ // for the moment we don't want the rejected signal connected
+ disconnect(gui(), SIGNAL(rejected()), packageManagerCore(), SLOT(setCanceled()));
+
+ connect(gui()->button(QWizard::CommitButton), SIGNAL(clicked()), this, SLOT(cleanupChangedConnects()));
}
setButtonText(QWizard::CommitButton, tr("Restart"));
setButtonText(QWizard::CancelButton, gui()->defaultButtonText(QWizard::FinishButton));
@@ -2012,13 +1912,26 @@ void FinishedPage::leaving()
void FinishedPage::handleFinishClicked()
{
const QString program = packageManagerCore()->replaceVariables(packageManagerCore()->value(scRunProgram));
+ const QStringList args = packageManagerCore()->replaceVariables(
+ packageManagerCore()->value(scRunProgramArguments)).split(QLatin1Char(' '));
if (!m_runItCheckBox->isChecked() || program.isEmpty())
return;
- qDebug() << "starting" << program;
- QProcess::startDetached(program);
+ qDebug() << "starting" << program << args;
+ QProcess::startDetached(program, args);
}
+void FinishedPage::cleanupChangedConnects()
+{
+ if (QAbstractButton *cancel = gui()->button(QWizard::CancelButton)) {
+ // remove the workaround connect from entering page
+ disconnect(cancel, SIGNAL(clicked()), gui(), SIGNAL(finishButtonClicked()));
+ disconnect(cancel, SIGNAL(clicked()), packageManagerCore(), SIGNAL(finishButtonClicked()));
+ connect(gui(), SIGNAL(rejected()), packageManagerCore(), SLOT(setCanceled()));
+
+ disconnect(gui()->button(QWizard::CommitButton), SIGNAL(clicked()), this, SLOT(cleanupChangedConnects()));
+ }
+}
// -- RestartPage
@@ -2026,10 +1939,7 @@ RestartPage::RestartPage(PackageManagerCore *core)
: PackageManagerPage(core)
{
setObjectName(QLatin1String("RestartPage"));
- setPixmap(QWizard::WatermarkPixmap, watermarkPixmap());
- setSubTitle(subTitleForPage(QLatin1String("RestartPage")));
- setTitle(titleForPage(QLatin1String("RestartPage"), tr("Completing the %1 Setup Wizard"))
- .arg(productName()));
+ setTitle(tr("Completing the %1 Setup Wizard").arg(productName()));
setFinalPage(false);
setCommitPage(false);
diff --git a/src/libs/installer/packagemanagergui.h b/src/libs/installer/packagemanagergui.h
index 5b7bd0615..5c428bf87 100644
--- a/src/libs/installer/packagemanagergui.h
+++ b/src/libs/installer/packagemanagergui.h
@@ -84,8 +84,6 @@ public:
void loadControlScript(const QString& scriptPath);
void callControlScriptMethod(const QString& methodName);
- QScriptEngine *controlScriptEngine() const;
-
Q_INVOKABLE PackageManagerPage* page(int pageId) const;
Q_INVOKABLE QWidget* pageWidgetByObjectName(const QString& name) const;
Q_INVOKABLE QWidget* currentPageWidget() const;
@@ -155,6 +153,7 @@ public:
virtual QPixmap logoPixmap() const;
virtual QString productName() const;
virtual QPixmap watermarkPixmap() const;
+ virtual QPixmap bannerPixmap() const;
virtual bool isComplete() const;
void setComplete(bool complete);
@@ -165,13 +164,12 @@ public:
void setValidatePageComponent(QInstaller::Component *component);
bool validatePage();
+signals:
+ void entered();
+ void left();
protected:
PackageManagerCore *packageManagerCore() const;
- QVariantHash elementsForPage(const QString &pageName) const;
-
- QString titleForPage(const QString &pageName, const QString &value = QString()) const;
- QString subTitleForPage(const QString &pageName, const QString &value = QString()) const;
// Inserts widget into the same layout like a sibling identified
// by its name. Default position is just behind the sibling.
@@ -187,9 +185,6 @@ protected:
bool isConstructing() const { return m_fresh; }
private:
- QString titleFromHash(const QVariantHash &hash, const QString &value = QString()) const;
-
-private:
bool m_fresh;
bool m_complete;
@@ -408,6 +403,7 @@ public:
public Q_SLOTS:
void handleFinishClicked();
+ void cleanupChangedConnects();
protected:
void entering();
diff --git a/src/libs/installer/packagemanagerproxyfactory.h b/src/libs/installer/packagemanagerproxyfactory.h
index 2ddfe7a18..a50605232 100644
--- a/src/libs/installer/packagemanagerproxyfactory.h
+++ b/src/libs/installer/packagemanagerproxyfactory.h
@@ -51,7 +51,7 @@ class PackageManagerCore;
class PackageManagerProxyFactory : public KDUpdater::FileDownloaderProxyFactory
{
public:
- PackageManagerProxyFactory(const PackageManagerCore *const core);
+ explicit PackageManagerProxyFactory(const PackageManagerCore *const core);
PackageManagerProxyFactory *clone() const;
QList<QNetworkProxy> queryProxy(const QNetworkProxyQuery &query = QNetworkProxyQuery());
diff --git a/src/libs/installer/performinstallationform.cpp b/src/libs/installer/performinstallationform.cpp
index fae8eb293..211d8176e 100644
--- a/src/libs/installer/performinstallationform.cpp
+++ b/src/libs/installer/performinstallationform.cpp
@@ -58,12 +58,12 @@ using namespace QInstaller;
// -- PerformInstallationForm
PerformInstallationForm::PerformInstallationForm(QObject *parent)
- : QObject(parent),
- m_progressBar(0),
- m_progressLabel(0),
- m_detailsButton(0),
- m_detailsBrowser(0),
- m_updateTimer(0)
+ : QObject(parent)
+ , m_progressBar(0)
+ , m_progressLabel(0)
+ , m_detailsButton(0)
+ , m_detailsBrowser(0)
+ , m_updateTimer(0)
{
}
diff --git a/src/libs/installer/performinstallationform.h b/src/libs/installer/performinstallationform.h
index f3471ebe2..209afc42d 100644
--- a/src/libs/installer/performinstallationform.h
+++ b/src/libs/installer/performinstallationform.h
@@ -61,7 +61,7 @@ class PerformInstallationForm : public QObject
Q_OBJECT
public:
- PerformInstallationForm(QObject *parent);
+ explicit PerformInstallationForm(QObject *parent);
void setupUi(QWidget *widget);
void setDetailsWidgetVisible(bool visible);
diff --git a/src/libs/installer/productkeycheck.cpp b/src/libs/installer/productkeycheck.cpp
index f975db821..a4af2b6d3 100644
--- a/src/libs/installer/productkeycheck.cpp
+++ b/src/libs/installer/productkeycheck.cpp
@@ -28,12 +28,16 @@
**************************************************************************/
#include <productkeycheck.h>
-
+#include <packagemanagercore.h>
class ProductKeyCheckPrivate
{
+ public:
+ static QPointer<QInstaller::PackageManagerCore> core;
};
+QPointer<QInstaller::PackageManagerCore> ProductKeyCheckPrivate::core = 0;
+
ProductKeyCheck::ProductKeyCheck()
: d(new ProductKeyCheckPrivate())
@@ -45,14 +49,20 @@ ProductKeyCheck::~ProductKeyCheck()
delete d;
}
-ProductKeyCheck *ProductKeyCheck::instance()
+ProductKeyCheck *ProductKeyCheck::instance(QInstaller::PackageManagerCore *core)
+{
+ static ProductKeyCheck instance;
+ if (core)
+ instance.setPackageManagerCore(core);
+ return &instance;
+}
+
+void ProductKeyCheck::setPackageManagerCore(QInstaller::PackageManagerCore *core)
{
- static ProductKeyCheck *instance = 0;
- if (instance == 0)
- instance = new ProductKeyCheck();
- return instance;
+ ProductKeyCheckPrivate::core = core;
}
+
bool ProductKeyCheck::hasValidKey()
{
return true;
@@ -74,7 +84,14 @@ QString ProductKeyCheck::maintainanceToolDetailErrorNotice()
}
// to filter none valid licenses
-bool ProductKeyCheck::isValidLicense(const QString &/*fileName*/)
+bool ProductKeyCheck::isValidLicenseTextFile(const QString &/*fileName*/)
{
return true;
}
+
+
+bool ProductKeyCheck::isValidRepository(const QInstaller::Repository &repository) const
+{
+ Q_UNUSED(repository)
+ return true;
+} \ No newline at end of file
diff --git a/src/libs/installer/productkeycheck.h b/src/libs/installer/productkeycheck.h
index 1ecffc3d2..6d72089e2 100644
--- a/src/libs/installer/productkeycheck.h
+++ b/src/libs/installer/productkeycheck.h
@@ -34,6 +34,12 @@
#include <QString>
#include <QHash>
+#include <QPointer>
+
+namespace QInstaller{
+ class PackageManagerCore;
+ class Repository;
+}
class ProductKeyCheckPrivate;
@@ -41,7 +47,8 @@ class INSTALLER_EXPORT ProductKeyCheck
{
public:
~ProductKeyCheck();
- static ProductKeyCheck *instance();
+ static ProductKeyCheck *instance(QInstaller::PackageManagerCore *core = 0);
+ static void setPackageManagerCore(QInstaller::PackageManagerCore *core);
// was validLicense
bool hasValidKey();
@@ -52,7 +59,10 @@ public:
bool applyKey(const QStringList &arguments);
// to filter none valid licenses
- bool isValidLicense(const QString &fileName);
+ bool isValidLicenseTextFile(const QString &fileName);
+
+ // to filter repositories not matching the license
+ bool isValidRepository(const QInstaller::Repository &repository) const;
private:
ProductKeyCheck();
diff --git a/src/libs/installer/progresscoordinator.cpp b/src/libs/installer/progresscoordinator.cpp
index a0f664357..0850b39d0 100644
--- a/src/libs/installer/progresscoordinator.cpp
+++ b/src/libs/installer/progresscoordinator.cpp
@@ -54,13 +54,13 @@ uint qHash(QPointer<QObject> key)
QT_END_NAMESPACE
ProgressCoordinator::ProgressCoordinator(QObject *parent)
- : QObject(parent),
- m_currentCompletePercentage(0),
- m_currentBasePercentage(0),
- m_manualAddedPercentage(0),
- m_reservedPercentage(0),
- m_undoMode(false),
- m_reachedPercentageBeforeUndo(0)
+ : QObject(parent)
+ , m_currentCompletePercentage(0)
+ , m_currentBasePercentage(0)
+ , m_manualAddedPercentage(0)
+ , m_reservedPercentage(0)
+ , m_undoMode(false)
+ , m_reachedPercentageBeforeUndo(0)
{
// it has to be in the main thread to be able refresh the ui with processEvents
Q_ASSERT(thread() == qApp->thread());
@@ -138,7 +138,7 @@ void ProgressCoordinator::partProgressChanged(double fraction)
}
if (qRound(m_currentCompletePercentage) < qRound(newCurrentCompletePercentage)) {
- qFatal("This should not happen!");
+ qWarning("This should not happen!");
}
m_currentCompletePercentage = newCurrentCompletePercentage;
@@ -171,7 +171,7 @@ void ProgressCoordinator::partProgressChanged(double fraction)
}
if (qRound(m_currentCompletePercentage) > qRound(newCurrentCompletePercentage)) {
- qFatal("This should not happen!");
+ qWarning("This should not happen!");
}
m_currentCompletePercentage = newCurrentCompletePercentage;
diff --git a/src/libs/installer/progresscoordinator.h b/src/libs/installer/progresscoordinator.h
index b1fa0ab67..263b25695 100644
--- a/src/libs/installer/progresscoordinator.h
+++ b/src/libs/installer/progresscoordinator.h
@@ -39,8 +39,8 @@
**
**************************************************************************/
-#ifndef PROGRESSCOORDNINATOR_H
-#define PROGRESSCOORDNINATOR_H
+#ifndef PROGRESSCOORDINATOR_H
+#define PROGRESSCOORDINATOR_H
#include <QtCore/QHash>
#include <QtCore/QObject>
@@ -102,4 +102,4 @@ private:
} //namespace QInstaller
-#endif //PROGRESSCOORDNINATOR_H
+#endif //PROGRESSCOORDINATOR_H
diff --git a/src/libs/installer/qinstallerglobal.h b/src/libs/installer/qinstallerglobal.h
index b7d5d3f3d..427586266 100644
--- a/src/libs/installer/qinstallerglobal.h
+++ b/src/libs/installer/qinstallerglobal.h
@@ -48,23 +48,8 @@
#include <kdupdaterupdateoperation.h>
#include <kdupdaterpackagesinfo.h>
-QT_BEGIN_NAMESPACE
-class QScriptContext;
-class QScriptEngine;
-class QScriptValue;
-QT_END_NAMESPACE
-
-
namespace QInstaller {
-static QRegExp scCommaRegExp(QLatin1String("\\b(,|, )\\b"));
-
-enum INSTALLER_EXPORT RunMode
-{
- AllMode,
- UpdaterMode
-};
-
enum INSTALLER_EXPORT JobError
{
InvalidUrl = 0x24B04,
@@ -86,14 +71,6 @@ typedef QList<QInstaller::Package*> PackagesList;
typedef KDUpdater::PackageInfo LocalPackage;
typedef QHash<QString, LocalPackage> LocalPackagesHash;
-QString INSTALLER_EXPORT uncaughtExceptionString(QScriptEngine *scriptEngine, const QString &context = QString());
-QScriptValue qInstallerComponentByName(QScriptContext *context, QScriptEngine *engine);
-
-QScriptValue qDesktopServicesOpenUrl(QScriptContext *context, QScriptEngine *engine);
-QScriptValue qDesktopServicesDisplayName(QScriptContext *context, QScriptEngine *engine);
-QScriptValue qDesktopServicesStorageLocation(QScriptContext *context, QScriptEngine *engine);
-QScriptValue qFileDialogGetExistingDirectory(QScriptContext *context, QScriptEngine *engine);
-
} // namespace QInstaller
#endif // QINSTALLER_GLOBAL_H
diff --git a/src/libs/installer/qprocesswrapper.cpp b/src/libs/installer/qprocesswrapper.cpp
index 020624425..9544d6682 100644
--- a/src/libs/installer/qprocesswrapper.cpp
+++ b/src/libs/installer/qprocesswrapper.cpp
@@ -54,16 +54,16 @@ class QProcessWrapper::Private
{
public:
Private(QProcessWrapper *qq)
- : q(qq),
- ignoreTimer(false),
- socket(0)
+ : q(qq)
+ , ignoreTimer(false)
+ , socket(0)
{}
bool createSocket()
{
if (!FSEngineClientHandler::instance().isActive())
return false;
- if (socket != 0 && socket->state() == static_cast< int >(QAbstractSocket::ConnectedState))
+ if (socket != 0 && socket->state() == static_cast<int>(QAbstractSocket::ConnectedState))
return true;
if (socket != 0)
delete socket;
@@ -119,8 +119,8 @@ public:
// -- QProcessWrapper
QProcessWrapper::QProcessWrapper(QObject *parent)
- : QObject(parent),
- d(new Private(this))
+ : QObject(parent)
+ , d(new Private(this))
{
connect(&d->process, SIGNAL(bytesWritten(qint64)), SIGNAL(bytesWritten(qint64)));
connect(&d->process, SIGNAL(aboutToClose()), SIGNAL(aboutToClose()));
@@ -293,7 +293,7 @@ int QProcessWrapper::exitCode() const
const Private::TimerBlocker blocker(this);
if (d->createSocket())
return callRemoteMethod<int>(d->stream, QLatin1String("QProcess::exitCode"));
- return static_cast< int>(d->process.exitCode());
+ return static_cast<int>(d->process.exitCode());
}
QProcessWrapper::ExitStatus QProcessWrapper::exitStatus() const
@@ -301,7 +301,7 @@ QProcessWrapper::ExitStatus QProcessWrapper::exitStatus() const
const Private::TimerBlocker blocker(this);
if (d->createSocket())
return callRemoteMethod<QProcessWrapper::ExitStatus>(d->stream, QLatin1String("QProcess::exitStatus"));
- return static_cast< QProcessWrapper::ExitStatus>(d->process.exitStatus());
+ return static_cast<QProcessWrapper::ExitStatus>(d->process.exitStatus());
}
void QProcessWrapper::kill()
@@ -329,6 +329,14 @@ QByteArray QProcessWrapper::readAllStandardOutput()
return d->process.readAllStandardOutput();
}
+QByteArray QProcessWrapper::readAllStandardError()
+{
+ const Private::TimerBlocker blocker(this);
+ if (d->createSocket())
+ return callRemoteMethod<QByteArray>(d->stream, QLatin1String("QProcess::readAllStandardError"));
+ return d->process.readAllStandardError();
+}
+
void QProcessWrapper::start(const QString &param1, const QStringList &param2, QIODevice::OpenMode param3)
{
const Private::TimerBlocker blocker(this);
@@ -352,7 +360,7 @@ QProcessWrapper::ProcessState QProcessWrapper::state() const
const Private::TimerBlocker blocker(this);
if (d->createSocket())
return callRemoteMethod<QProcessWrapper::ProcessState>(d->stream, QLatin1String("QProcess::state"));
- return static_cast< QProcessWrapper::ProcessState>(d->process.state());
+ return static_cast<QProcessWrapper::ProcessState>(d->process.state());
}
void QProcessWrapper::terminate()
@@ -371,7 +379,7 @@ QProcessWrapper::ProcessChannel QProcessWrapper::readChannel() const
return callRemoteMethod<QProcessWrapper::ProcessChannel>(d->stream,
QLatin1String("QProcess::readChannel"));
}
- return static_cast< QProcessWrapper::ProcessChannel>(d->process.readChannel());
+ return static_cast<QProcessWrapper::ProcessChannel>(d->process.readChannel());
}
QProcessWrapper::ProcessChannelMode QProcessWrapper::processChannelMode() const
@@ -381,7 +389,7 @@ QProcessWrapper::ProcessChannelMode QProcessWrapper::processChannelMode() const
return callRemoteMethod<QProcessWrapper::ProcessChannelMode>(d->stream,
QLatin1String("QProcess::processChannelMode"));
}
- return static_cast< QProcessWrapper::ProcessChannelMode>(d->process.processChannelMode());
+ return static_cast<QProcessWrapper::ProcessChannelMode>(d->process.processChannelMode());
}
QString QProcessWrapper::workingDirectory() const
@@ -389,7 +397,15 @@ QString QProcessWrapper::workingDirectory() const
const Private::TimerBlocker blocker(this);
if (d->createSocket())
return callRemoteMethod<QString>(d->stream, QLatin1String("QProcess::workingDirectory"));
- return static_cast< QString>(d->process.workingDirectory());
+ return static_cast<QString>(d->process.workingDirectory());
+}
+
+QString QProcessWrapper::errorString() const
+{
+ const Private::TimerBlocker blocker(this);
+ if (d->createSocket())
+ return callRemoteMethod<QString>(d->stream, QLatin1String("QProcess::errorString"));
+ return static_cast<QString>(d->process.errorString());
}
void QProcessWrapper::setEnvironment(const QStringList &param1)
diff --git a/src/libs/installer/qprocesswrapper.h b/src/libs/installer/qprocesswrapper.h
index c566c3f07..e7caf61f6 100644
--- a/src/libs/installer/qprocesswrapper.h
+++ b/src/libs/installer/qprocesswrapper.h
@@ -84,6 +84,7 @@ public:
void terminate();
QByteArray readAll();
QByteArray readAllStandardOutput();
+ QByteArray readAllStandardError();
void setWorkingDirectory(const QString &dir);
void start(const QString &program);
@@ -100,6 +101,7 @@ public:
bool waitForFinished(int msecs = 30000);
void setEnvironment(const QStringList &environment);
QString workingDirectory() const;
+ QString errorString() const;
qint64 write(const QByteArray &byteArray);
QProcessWrapper::ProcessChannel readChannel() const;
void setReadChannel(QProcessWrapper::ProcessChannel channel);
diff --git a/src/libs/installer/qsettingswrapper.cpp b/src/libs/installer/qsettingswrapper.cpp
index d7cb27828..89f39a14e 100644
--- a/src/libs/installer/qsettingswrapper.cpp
+++ b/src/libs/installer/qsettingswrapper.cpp
@@ -56,38 +56,38 @@ class QSettingsWrapper::Private
{
public:
Private(const QString &organization, const QString &application)
- : native(true),
- settings(organization, application),
- socket(0)
+ : native(true)
+ , settings(organization, application)
+ , socket(0)
{
}
Private(QSettings::Scope scope, const QString &organization, const QString &application)
- : native(true),
- settings(scope, organization, application),
- socket(0)
+ : native(true)
+ , settings(scope, organization, application)
+ , socket(0)
{
}
Private(QSettings::Format format, QSettings::Scope scope, const QString &organization,
const QString &application)
- : native(format == QSettings::NativeFormat),
- settings(format, scope, organization, application),
- socket(0)
+ : native(format == QSettings::NativeFormat)
+ , settings(format, scope, organization, application)
+ , socket(0)
{
}
Private(const QString &fileName, QSettings::Format format)
- : native(format == QSettings::NativeFormat),
- fileName(fileName),
- settings(fileName, format),
- socket(0)
+ : native(format == QSettings::NativeFormat)
+ , fileName(fileName)
+ , settings(fileName, format)
+ , socket(0)
{
}
Private()
- : native(true),
- socket(0)
+ : native(true)
+ , socket(0)
{
}
diff --git a/src/libs/installer/qtpatch.cpp b/src/libs/installer/qtpatch.cpp
index 02795b34b..6581815c2 100644
--- a/src/libs/installer/qtpatch.cpp
+++ b/src/libs/installer/qtpatch.cpp
@@ -40,6 +40,7 @@
**************************************************************************/
#include "qtpatch.h"
+#include "utils.h"
#include <QString>
#include <QStringList>
@@ -52,35 +53,20 @@
#include <QCoreApplication>
#include <QByteArrayMatcher>
-#ifdef Q_OS_WIN
-#include <windows.h> // for Sleep
-#endif
-#ifdef Q_OS_UNIX
-#include <errno.h>
-#include <signal.h>
-#include <time.h>
-#endif
-
-static void sleepCopiedFromQTest(int ms)
+QHash<QString, QByteArray> QtPatch::readQmakeOutput(const QByteArray &data)
{
- if (ms < 0)
- return;
-#ifdef Q_OS_WIN
- Sleep(uint(ms));
-#else
- struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
- nanosleep(&ts, NULL);
-#endif
-}
-
-static void uiDetachedWait(int ms)
-{
- QTime timer;
- timer.start();
- do {
- QCoreApplication::processEvents(QEventLoop::AllEvents, ms);
- sleepCopiedFromQTest(10);
- } while (timer.elapsed() < ms);
+ QHash<QString, QByteArray> qmakeValueHash;
+ QTextStream stream(data, QIODevice::ReadOnly);
+ while (!stream.atEnd()) {
+ const QString line = stream.readLine();
+ const int index = line.indexOf(QLatin1Char(':'));
+ if (index != -1) {
+ QString value = line.mid(index+1);
+ if (value != QLatin1String("**Unknown**") )
+ qmakeValueHash.insert(line.left(index), value.toUtf8());
+ }
+ }
+ return qmakeValueHash;
}
QHash<QString, QByteArray> QtPatch::qmakeValues(const QString &qmakePath, QByteArray *qmakeOutput)
@@ -113,21 +99,12 @@ QHash<QString, QByteArray> QtPatch::qmakeValues(const QString &qmakePath, QByteA
}
QByteArray output = process.readAllStandardOutput();
qmakeOutput->append(output);
- QTextStream stream(&output);
- while (!stream.atEnd()) {
- const QString line = stream.readLine();
- const int index = line.indexOf(QLatin1Char(':'));
- if (index != -1) {
- QString value = line.mid(index+1);
- if (value != QLatin1String("**Unknown**") )
- qmakeValueHash.insert(line.left(index), value.toUtf8());
- }
- }
+ qmakeValueHash = readQmakeOutput(output);
}
if (qmakeValueHash.isEmpty()) {
++waitCount;
static const int waitTimeInMilliSeconds = 500;
- uiDetachedWait(waitTimeInMilliSeconds);
+ QInstaller::uiDetachedWait(waitTimeInMilliSeconds);
}
if (process.state() > QProcess::NotRunning ) {
qDebug() << "qmake process is still running, need to kill it.";
@@ -232,7 +209,7 @@ bool QtPatch::openFileForPatching(QFile *file)
while (!file->open(QFile::ReadWrite) && waitCount < 60) {
++waitCount;
static const int waitTimeInMilliSeconds = 500;
- uiDetachedWait(waitTimeInMilliSeconds);
+ QInstaller::uiDetachedWait(waitTimeInMilliSeconds);
}
return file->openMode() == QFile::ReadWrite;
}
diff --git a/src/libs/installer/qtpatch.h b/src/libs/installer/qtpatch.h
index 5868e6ce2..13c7df84a 100644
--- a/src/libs/installer/qtpatch.h
+++ b/src/libs/installer/qtpatch.h
@@ -50,6 +50,7 @@
namespace QtPatch {
+QHash<QString, QByteArray> INSTALLER_EXPORT readQmakeOutput(const QByteArray &data);
QHash<QString, QByteArray> INSTALLER_EXPORT qmakeValues(const QString &qmakePath, QByteArray *qmakeOutput);
bool INSTALLER_EXPORT patchBinaryFile(const QString &fileName,
diff --git a/src/libs/installer/qtpatchoperation.cpp b/src/libs/installer/qtpatchoperation.cpp
index 9699219ec..e9fbb65c5 100644
--- a/src/libs/installer/qtpatchoperation.cpp
+++ b/src/libs/installer/qtpatchoperation.cpp
@@ -111,7 +111,10 @@ static QHash<QByteArray, QByteArray> generatePatchValueHash(const QByteArray &ne
replaceHash.insert( QByteArray("qt_trnspath=%1").replace("%1", oldValue),
QByteArray("qt_trnspath=%1/translations").replace("%1/", newQtPath + nativeSeperator));
- // This must not be patched. Commenting out to fix QTSDK-429
+ // This must not be patched!
+ // On desktop there should be a correct default path (for example "/etc/xdg"),
+ // but on some other targets you need to use "-sysconfdir </your/default/config/path"
+ // while building Qt to get a correct QT_INSTALL_CONFIGURATION value
// oldValue = qmakeValueHash.value(QLatin1String("QT_INSTALL_CONFIGURATION"));
// replaceMap.insert( QByteArray("qt_stngpath=%1").replace("%1", oldValue),
// QByteArray("qt_stngpath=%1").replace("%1", newQtPath));
@@ -142,6 +145,10 @@ static QHash<QByteArray, QByteArray> generatePatchValueHash(const QByteArray &ne
replaceHash.insert(QByteArray("qt_hdatpath=%1").replace("%1", oldValue),
QByteArray("qt_hdatpath=%1/").replace("%1/", newQtPath));
+ oldValue = qmakeValueHash.value(QLatin1String("QT_HOST_LIBS"));
+ replaceHash.insert(QByteArray("qt_hlibpath=%1").replace("%1", oldValue),
+ QByteArray("qt_hlibpath=%1/lib").replace("%1/", newQtPath + nativeSeperator));
+
return replaceHash;
}
@@ -160,16 +167,34 @@ bool QtPatchOperation::performOperation()
// 1. type
// 2. new/target qtpath
// 3. version if greather Qt4
+ // optional QmakeOutputInstallerKey=<used_installer_value>
// the possible 2 argument case is here to support old syntax
- if (arguments().count() < 2 || arguments().count() > 3) {
+ if (arguments().count() < 2 && arguments().count() > 4) {
setError(InvalidArguments);
setErrorString(tr("Invalid arguments in %0: %1 arguments given, %2 expected%3.")
- .arg(name()).arg(arguments().count()).arg(tr("exactly 3"), QLatin1String("")));
+ .arg(name()).arg(arguments().count()).arg(tr("3 or 4"), QLatin1String("")));
return false;
}
- QString type = arguments().at(0);
+ QStringList args = arguments();
+ QString qmakeOutputInstallerKey;
+ QStringList filteredQmakeOutputInstallerKey = args.filter(QLatin1String("QmakeOutputInstallerKey="),
+ Qt::CaseInsensitive);
+ PackageManagerCore *const core = value(QLatin1String("installer")).value<PackageManagerCore*>();
+ if (!filteredQmakeOutputInstallerKey.isEmpty()) {
+ if (!core) {
+ setError(UserDefinedError);
+ setErrorString(tr("Needed installer object in \"%1\" operation is empty.").arg(name()));
+ return false;
+ }
+ QString qmakeOutputInstallerKeyArgument = filteredQmakeOutputInstallerKey.at(0);
+ qmakeOutputInstallerKey = qmakeOutputInstallerKeyArgument;
+ qmakeOutputInstallerKey.replace(QLatin1String("QmakeOutputInstallerKey="), QString(), Qt::CaseInsensitive);
+ args.removeAll(qmakeOutputInstallerKeyArgument);
+ }
+
+ QString type = args.at(0);
bool isPlatformSupported = type.contains(QLatin1String("linux"), Qt::CaseInsensitive)
|| type.contains(QLatin1String("windows"), Qt::CaseInsensitive)
|| type.contains(QLatin1String("mac"), Qt::CaseInsensitive);
@@ -180,31 +205,42 @@ bool QtPatchOperation::performOperation()
return false;
}
- const QString newQtPathStr = QDir::toNativeSeparators(arguments().at(1));
- const QByteArray newQtPath = newQtPathStr.toUtf8();
+ if (core && !filteredQmakeOutputInstallerKey.isEmpty() && core->value(qmakeOutputInstallerKey).isEmpty()) {
+ setError(UserDefinedError);
+ setErrorString(tr("Could not find the needed QmakeOutputInstallerKey(%1) value on the installer "
+ "object. The ConsumeOutput operation on the valid qmake needs to be called first.").arg(
+ qmakeOutputInstallerKey));
+ return false;
+ }
+ const QString newQtPathStr = QDir::toNativeSeparators(args.at(1));
+ const QByteArray newQtPath = newQtPathStr.toUtf8();
QString qmakePath = QString::fromUtf8(newQtPath) + QLatin1String("/bin/qmake");
#ifdef Q_OS_WIN
qmakePath = qmakePath + QLatin1String(".exe");
#endif
- if (!QFile::exists(qmakePath)) {
- setError(UserDefinedError);
- setErrorString(tr("QMake from the current Qt version \n(%1)is not existing. Please file a bugreport "
- "with this dialog at https://bugreports.qt-project.org.").arg(QDir::toNativeSeparators(qmakePath)));
- return false;
+ QHash<QString, QByteArray> qmakeValueHash;
+ if (core && !core->value(qmakeOutputInstallerKey).isEmpty()) {
+ qmakeValueHash = QtPatch::readQmakeOutput(core->value(qmakeOutputInstallerKey).toLatin1());
+ } else {
+ if (!QFile::exists(qmakePath)) {
+ setError(UserDefinedError);
+ setErrorString(tr("QMake from the current Qt version \n(%1)is not existing. Please file a bugreport "
+ "with this dialog at https://bugreports.qt-project.org.").arg(QDir::toNativeSeparators(qmakePath)));
+ return false;
+ }
+ QByteArray qmakeOutput;
+ qmakeValueHash = QtPatch::qmakeValues(qmakePath, &qmakeOutput);
+ if (qmakeValueHash.isEmpty()) {
+ setError(UserDefinedError);
+ setErrorString(tr("The output of \n%1 -query\nis not parseable. Please file a bugreport with this "
+ "dialog https://bugreports.qt-project.org.\noutput: \"%2\"").arg(QDir::toNativeSeparators(qmakePath),
+ QString::fromUtf8(qmakeOutput)));
+ return false;
+ }
}
- QByteArray qmakeOutput;
- QHash<QString, QByteArray> qmakeValueHash = QtPatch::qmakeValues(qmakePath, &qmakeOutput);
-
- if (qmakeValueHash.isEmpty()) {
- setError(UserDefinedError);
- setErrorString(tr("The output of \n%1 -query\nis not parseable. Please file a bugreport with this "
- "dialog https://bugreports.qt-project.org.\noutput: \"%2\"").arg(QDir::toNativeSeparators(qmakePath),
- QString::fromUtf8(qmakeOutput)));
- return false;
- }
const QByteArray oldQtPath = qmakeValueHash.value(QLatin1String("QT_INSTALL_PREFIX"));
bool oldQtPathFromQMakeIsEmpty = oldQtPath.isEmpty();
@@ -218,19 +254,97 @@ bool QtPatchOperation::performOperation()
}
#ifdef Q_OS_MAC
- // just try to patch here at the beginning to keep the unpatched qmake if mac install_names_tool fails
- MacReplaceInstallNamesOperation operation;
- operation.setArguments(QStringList()
- //can not use the old path which is wrong in the webkit case
- //<< QString::fromUtf8(oldQtPath)
- << QLatin1String("/lib/Qt") // search string
- << newQtPathStr + QLatin1String("/lib/Qt") //replace string
- << newQtPathStr //where
- );
- if (!operation.performOperation()) {
- setError(operation.error());
- setErrorString(operation.errorString());
- return false;
+ // looking for /lib/Qt wasn't enough for all libs and frameworks,
+ // at the Qt4 case we had for example: /lib/libQtCLucene* and /lib/phonon*
+ // so now we find every possible replace string inside dynlib dependencies
+ // and we reduce it to few as possible search strings
+ QStringList possibleSearchStringList;
+ QDirIterator dirIterator(newQtPathStr + QLatin1String("/lib/"));
+ while (dirIterator.hasNext()) {
+ const QString possibleSearchString = QString(dirIterator.next()).remove(newQtPathStr);
+ const QFileInfo fileInfo = dirIterator.fileInfo();
+ if (fileInfo.isSymLink())
+ continue;
+ if (fileInfo.isDir()) {
+ if (possibleSearchString.endsWith(QLatin1String(".framework")))
+ possibleSearchStringList.append(possibleSearchString);
+ else
+ continue;
+ }
+ if (possibleSearchString.endsWith(QLatin1String(".dylib")))
+ possibleSearchStringList.append(possibleSearchString);
+ }
+
+ // now we have this in possibleSearchStringList at Qt 4.8.6
+// "/lib/libQtCLucene.4.8.6.dylib"
+// "/lib/libQtCLucene_debug.4.8.6.dylib"
+// "/lib/phonon.framework"
+// "/lib/QtCore.framework"
+// "/lib/QtDeclarative.framework"
+// "/lib/QtDesigner.framework"
+// "/lib/QtDesignerComponents.framework"
+// "/lib/QtGui.framework"
+// "/lib/QtHelp.framework"
+// "/lib/QtMultimedia.framework"
+// "/lib/QtNetwork.framework"
+// "/lib/QtOpenGL.framework"
+// "/lib/QtScript.framework"
+// "/lib/QtScriptTools.framework"
+// "/lib/QtSql.framework"
+// "/lib/QtSvg.framework"
+// "/lib/QtTest.framework"
+// "/lib/QtWebKit.framework"
+// "/lib/QtXml.framework"
+// "/lib/QtXmlPatterns.framework"
+
+ // so then we reduce the possible filter strings as much as possible
+ QStringList searchStringList;
+
+ // as the minimal search string use the subdirector lib + one letter from the name
+ int minFilterLength = QString(QLatin1String("/lib/")).length() + 1;
+
+ while (!possibleSearchStringList.isEmpty()) {
+ QString firstSearchString = possibleSearchStringList.first();
+ int filterLength = minFilterLength;
+ int lastFilterCount = 0;
+ QString lastFilterString;
+ // now filter as long as we find something more then 1
+ for (; filterLength < firstSearchString.length(); ++filterLength) {
+ QString filterString(firstSearchString.left(filterLength));
+ QStringList filteredStringList(possibleSearchStringList.filter(filterString));
+ // found a valid filter
+ if (lastFilterCount > filteredStringList.count()) {
+ possibleSearchStringList = QList<QString>::fromSet(possibleSearchStringList.toSet() -
+ possibleSearchStringList.filter(lastFilterString).toSet());
+ searchStringList.append(lastFilterString);
+ break;
+ } else if (lastFilterCount == 1){ //in case there is only one we can use the complete name
+ possibleSearchStringList = QList<QString>::fromSet(possibleSearchStringList.toSet() -
+ possibleSearchStringList.filter(firstSearchString).toSet());
+ searchStringList.append(firstSearchString);
+ break;
+ } else {
+ lastFilterCount = possibleSearchStringList.filter(filterString).count();
+ lastFilterString = filterString;
+ }
+ }
+ }
+
+ // in the tested Qt 4.8.6 case we have searchStringList ("/lib/libQtCLucene", "/lib/Qt", "/lib/phonon")
+ foreach (const QString &searchString, searchStringList) {
+ MacReplaceInstallNamesOperation operation;
+ operation.setArguments(QStringList()
+ //can not use the old path which is wrong in the webkit case
+ //<< QString::fromUtf8(oldQtPath)
+ << searchString
+ << newQtPathStr + searchString //replace string
+ << newQtPathStr //where
+ );
+ if (!operation.performOperation()) {
+ setError(operation.error());
+ setErrorString(operation.errorString());
+ return false;
+ }
}
#endif
@@ -239,13 +353,11 @@ bool QtPatchOperation::performOperation()
fileName = QString::fromLatin1(":/files-to-patch-windows");
else if (type == QLatin1String("linux"))
fileName = QString::fromLatin1(":/files-to-patch-linux");
- else if (type == QLatin1String("linux-emb-arm"))
- fileName = QString::fromLatin1(":/files-to-patch-linux-emb-arm");
else if (type == QLatin1String("mac"))
fileName = QString::fromLatin1(":/files-to-patch-macx");
QFile patchFileListFile(fileName);
- QString version = arguments().value(2).toLower();
+ QString version = args.value(2).toLower();
if (!version.isEmpty())
patchFileListFile.setFileName(fileName + QLatin1Char('-') + version);
diff --git a/src/libs/installer/qtpatchoperation.h b/src/libs/installer/qtpatchoperation.h
index f1919f4c6..346466c43 100644
--- a/src/libs/installer/qtpatchoperation.h
+++ b/src/libs/installer/qtpatchoperation.h
@@ -46,7 +46,7 @@
namespace QInstaller {
-class QtPatchOperation : public Operation
+class INSTALLER_EXPORT QtPatchOperation : public Operation
{
public:
QtPatchOperation();
diff --git a/src/libs/installer/registerqtvqnxoperation.cpp b/src/libs/installer/registerqtincreatorqnxoperation.cpp
index b52558145..be99de4c7 100644
--- a/src/libs/installer/registerqtvqnxoperation.cpp
+++ b/src/libs/installer/registerqtincreatorqnxoperation.cpp
@@ -39,7 +39,7 @@
**
**************************************************************************/
-#include "registerqtvqnxoperation.h"
+#include "registerqtincreatorqnxoperation.h"
#include "packagemanagercore.h"
#include "qtcreator_constants.h"
diff --git a/src/libs/installer/registerqtvqnxoperation.h b/src/libs/installer/registerqtincreatorqnxoperation.h
index a5e49656a..5b6a3c9b1 100644
--- a/src/libs/installer/registerqtvqnxoperation.h
+++ b/src/libs/installer/registerqtincreatorqnxoperation.h
@@ -39,8 +39,8 @@
**
**************************************************************************/
-#ifndef REGISTERQTINCREATORVQNXOPERATION_H
-#define REGISTERQTINCREATORVQNXOPERATION_H
+#ifndef REGISTERQTINCREATORQNXOPERATION_H
+#define REGISTERQTINCREATORQNXOPERATION_H
#include "qinstallerglobal.h"
@@ -60,4 +60,4 @@ public:
} // namespace QInstaller
-#endif // REGISTERQTINCREATORVQNXOPERATION_H
+#endif // REGISTERQTINCREATORQNXOPERATION_H
diff --git a/src/libs/installer/resources/files-to-patch-linux-emb-arm b/src/libs/installer/resources/files-to-patch-linux-emb-arm
index a1ba5ccb8..c01fe17a1 100644
--- a/src/libs/installer/resources/files-to-patch-linux-emb-arm
+++ b/src/libs/installer/resources/files-to-patch-linux-emb-arm
@@ -1,5 +1,6 @@
bin/qmake
bin/lrelease
+bin/qdoc
%%
*.la
*.prl
diff --git a/src/libs/installer/resources/files-to-patch-windows-emb-arm b/src/libs/installer/resources/files-to-patch-windows-emb-arm
index 114072689..f0c1c3c73 100644
--- a/src/libs/installer/resources/files-to-patch-windows-emb-arm
+++ b/src/libs/installer/resources/files-to-patch-windows-emb-arm
@@ -1,5 +1,6 @@
bin/qmake.exe
bin/lrelease.exe
+bin/qdoc.exe
%%
*.la
*.prl
diff --git a/src/libs/installer/scriptengine.cpp b/src/libs/installer/scriptengine.cpp
new file mode 100644
index 000000000..b6a8a971a
--- /dev/null
+++ b/src/libs/installer/scriptengine.cpp
@@ -0,0 +1,410 @@
+/**************************************************************************
+**
+** Copyright (C) 2012-2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
+#include "scriptengine.h"
+
+#include "component.h"
+#include "packagemanagercore.h"
+#include "messageboxhandler.h"
+#include "errors.h"
+
+#include <QDesktopServices>
+#include <QFileDialog>
+#include <QMetaEnum>
+#include <QWizard>
+
+using namespace QInstaller;
+
+namespace QInstaller {
+
+QString uncaughtExceptionString(const QScriptEngine *scriptEngine, const QString &context)
+{
+ QString error(QLatin1String("\n\n%1\n\nBacktrace:\n\t%2"));
+ if (!context.isEmpty())
+ error.prepend(context);
+
+ return error.arg(scriptEngine->uncaughtException().toString(), scriptEngine->uncaughtExceptionBacktrace()
+ .join(QLatin1String("\n\t")));
+}
+
+/*!
+ Scriptable version of PackageManagerCore::componentByName(QString).
+ \sa PackageManagerCore::componentByName
+ */
+QScriptValue qInstallerComponentByName(QScriptContext *context, QScriptEngine *engine)
+{
+ const QScriptValue check = checkArguments(context, 1, 1);
+ if (check.isError())
+ return check;
+
+ // well... this is our "this" pointer
+ PackageManagerCore *const core = dynamic_cast<PackageManagerCore*>(engine->globalObject()
+ .property(QLatin1String("installer")).toQObject());
+
+ const QString name = context->argument(0).toString();
+ return engine->newQObject(core->componentByName(name));
+}
+
+QScriptValue checkArguments(QScriptContext *context, int minimalArgumentCount, int maximalArgumentCount)
+{
+ if (context->argumentCount() < minimalArgumentCount || context->argumentCount() > maximalArgumentCount) {
+ if (minimalArgumentCount != maximalArgumentCount) {
+ return context->throwError(QObject::tr("Invalid arguments: %1 arguments given, %2 to "
+ "%3 expected.").arg(QString::number(context->argumentCount()),
+ QString::number(minimalArgumentCount), QString::number(maximalArgumentCount)));
+ }
+ return context->throwError(QObject::tr("Invalid arguments: %1 arguments given, %2 expected.")
+ .arg(QString::number(context->argumentCount()), QString::number(minimalArgumentCount)));
+ }
+ return QScriptValue();
+}
+
+QScriptValue qDesktopServicesOpenUrl(QScriptContext *context, QScriptEngine *engine)
+{
+ Q_UNUSED(engine);
+ const QScriptValue check = checkArguments(context, 1, 1);
+ if (check.isError())
+ return check;
+ QString url = context->argument(0).toString();
+ url.replace(QLatin1String("\\\\"), QLatin1String("/"));
+ url.replace(QLatin1String("\\"), QLatin1String("/"));
+ return QDesktopServices::openUrl(QUrl::fromUserInput(url));
+}
+
+QScriptValue qDesktopServicesDisplayName(QScriptContext *context, QScriptEngine *engine)
+{
+ Q_UNUSED(engine);
+ const QScriptValue check = checkArguments(context, 1, 1);
+ if (check.isError())
+ return check;
+
+#if QT_VERSION < 0x050000
+ const QDesktopServices::StandardLocation location =
+ static_cast< QDesktopServices::StandardLocation >(context->argument(0).toInt32());
+ return QDesktopServices::displayName(location);
+#else
+ const QStandardPaths::StandardLocation location =
+ static_cast< QStandardPaths::StandardLocation >(context->argument(0).toInt32());
+ return QStandardPaths::displayName(location);
+#endif
+}
+
+QScriptValue qDesktopServicesStorageLocation(QScriptContext *context, QScriptEngine *engine)
+{
+ Q_UNUSED(engine);
+ const QScriptValue check = checkArguments(context, 1, 1);
+ if (check.isError())
+ return check;
+
+#if QT_VERSION < 0x050000
+ const QDesktopServices::StandardLocation location =
+ static_cast< QDesktopServices::StandardLocation >(context->argument(0).toInt32());
+ return QDesktopServices::storageLocation(location);
+#else
+ const QStandardPaths::StandardLocation location =
+ static_cast< QStandardPaths::StandardLocation >(context->argument(0).toInt32());
+ return QStandardPaths::writableLocation(location);
+#endif
+}
+
+QScriptValue qFileDialogGetExistingDirectory(QScriptContext *context, QScriptEngine *engine)
+{
+ Q_UNUSED(engine);
+ const QScriptValue check = checkArguments(context, 0, 2);
+ if (check.isError())
+ return check;
+ QString caption;
+ QString dir;
+ if (context->argumentCount() > 0)
+ caption = context->argument(0).toString();
+ if (context->argumentCount() > 1)
+ dir = context->argument(1).toString();
+ return QFileDialog::getExistingDirectory(0, caption, dir);
+}
+
+QScriptValue qFileDialogGetOpenFileName(QScriptContext *context, QScriptEngine *engine)
+{
+ Q_UNUSED(engine);
+ const QScriptValue check = checkArguments(context, 0, 2);
+ if (check.isError())
+ return check;
+ QString caption;
+ QString dir;
+ if (context->argumentCount() > 0)
+ caption = context->argument(0).toString();
+ if (context->argumentCount() > 1)
+ dir = context->argument(1).toString();
+ return QFileDialog::getExistingDirectory(0, caption, dir);
+}
+
+} //namespace QInstaller
+
+
+/*!
+ \class QInstaller::ScriptEngine
+ prepare and run the component scripts
+*/
+ScriptEngine::ScriptEngine(PackageManagerCore *core)
+ : QScriptEngine(core)
+ , m_core(core)
+{
+ // register translation stuff
+ installTranslatorFunctions();
+
+ globalObject().setProperty(QLatin1String("QMessageBox"), generateMessageBoxObject());
+ globalObject().setProperty(QLatin1String("QDesktopServices"), generateDesktopServicesObject());
+ globalObject().setProperty(QLatin1String("QInstaller"), generateQInstallerObject());
+
+ QScriptValue installerObject = newQObject(m_core);
+ installerObject.setProperty(QLatin1String("componentByName"), newFunction(qInstallerComponentByName, 1));
+
+ globalObject().setProperty(QLatin1String("installer"), installerObject);
+
+ QScriptValue fileDialog = newArray();
+ fileDialog.setProperty(QLatin1String("getExistingDirectory"),
+ newFunction(qFileDialogGetExistingDirectory));
+ globalObject().setProperty(QLatin1String("QFileDialog"), fileDialog);
+
+ const QList<Component*> components = m_core->availableComponents();
+ QScriptValue scriptComponentsObject = newArray(components.count());
+ for (int i = 0; i < components.count(); ++i)
+ scriptComponentsObject.setProperty(i, newQObject(components[i]));
+
+ globalObject().property(QLatin1String("installer"))
+ .setProperty(QLatin1String("components"), scriptComponentsObject);
+
+ connect(this, SIGNAL(signalHandlerException(QScriptValue)), SLOT(handleException(QScriptValue)));
+}
+
+ScriptEngine::~ScriptEngine()
+{
+}
+
+void ScriptEngine::setGuiQObject(QObject *guiQObject)
+{
+ if (qobject_cast<QWizard*>(guiQObject)) {
+#undef REGISTER_BUTTON
+#define REGISTER_BUTTON(x) buttons.setProperty(QLatin1String(#x), \
+ newVariant(static_cast<int>(QWizard::x)));
+
+ QScriptValue buttons = newArray();
+ REGISTER_BUTTON(BackButton)
+ REGISTER_BUTTON(NextButton)
+ REGISTER_BUTTON(CommitButton)
+ REGISTER_BUTTON(FinishButton)
+ REGISTER_BUTTON(CancelButton)
+ REGISTER_BUTTON(HelpButton)
+ REGISTER_BUTTON(CustomButton1)
+ REGISTER_BUTTON(CustomButton2)
+ REGISTER_BUTTON(CustomButton3)
+
+#undef REGISTER_BUTTON
+ globalObject().setProperty(QLatin1String("buttons"), buttons);
+ }
+ globalObject().setProperty(QLatin1String("gui"), newQObject(guiQObject));
+}
+
+/*!
+ Loads a script into the given \a context at \a fileName inside the ScriptEngine.
+
+ The installer and all its components as well as other useful stuff are being exported into the script.
+ Read \link componentscripting Component Scripting \endlink for details.
+ \throws Error when either the script at \a fileName couldn't be opened, or the QScriptEngine
+ couldn't evaluate the script.
+*/
+QScriptValue ScriptEngine::loadInConext(const QString &context, const QString &fileName,
+ const QString &scriptInjection)
+{
+ QFile file(fileName);
+ if (!file.open(QIODevice::ReadOnly)) {
+ throw Error(tr("Could not open the requested script file at %1: %2.").arg(
+ fileName, file.errorString()));
+ }
+
+ // create inside closure in one line to keep linenumber in the right order
+ // which is used as a debug output in an exception case
+ // scriptContent will be added as the last arg command to prevent wrong
+ // replacements of %1, %2 or %3 inside the scriptContent
+ QString scriptContent = QString::fromLatin1(
+ "(function() { %1 %3 ; return new %2; })();");
+
+ // merging everything together and as last we are adding the file content to prevent wrong
+ // replacements of %1 %2 or %3 inside the javascript code
+ scriptContent = scriptContent.arg(scriptInjection, context, QLatin1String(file.readAll()));
+ QScriptValue scriptContext = evaluate(scriptContent, fileName);
+
+ if (hasUncaughtException()) {
+ throw Error(tr("Exception while loading the component script: '%1'").arg(
+ uncaughtExceptionString(this, QFileInfo(file).absoluteFilePath())));
+ }
+ if (!scriptContext.isValid()) {
+ throw Error(tr("Could not load the component script inside a script context: '%1'").arg(
+ QFileInfo(file).absoluteFilePath()));
+ }
+ return scriptContext;
+}
+
+void ScriptEngine::handleException(const QScriptValue &value)
+{
+ if (!value.engine())
+ return;
+ throw Error(uncaughtExceptionString(this, tr("Fatal error while evaluating a script.")));
+}
+
+/*!
+ Tries to call the method with \a name within the script and returns the result. If the method
+ doesn't exist, an invalid result is returned. If the method has an uncaught exception, its
+ string representation is thrown as an Error exception.
+
+ \note The method is not called, if the current script context is the same method, to avoid
+ infinite recursion.
+*/
+QScriptValue ScriptEngine::callScriptMethod(const QScriptValue &scriptContext,
+ const QString &methodName, const QScriptValueList &arguments) const
+{
+ // don't allow such a recursion
+ if (currentContext()->backtrace().first().startsWith(methodName))
+ return QScriptValue();
+
+ QScriptValue method = scriptContext.property(methodName);
+ // this marks the method to be called not any longer
+ if (!method.isValid())
+ return QScriptValue();
+
+ const QScriptValue result = method.call(scriptContext, arguments);
+ if (!result.isValid())
+ return result;
+
+ if (hasUncaughtException())
+ throw Error(uncaughtExceptionString(this));
+
+ return result;
+}
+
+
+/*!
+ generates QMessageBox::StandardButton enum as an QScriptValue array
+*/
+QScriptValue ScriptEngine::generateMessageBoxObject()
+{
+ // register QMessageBox::StandardButton enum in the script connection
+ QScriptValue messageBox = newQObject(MessageBoxHandler::instance());
+
+ const QMetaObject &messageBoxMetaObject = QMessageBox::staticMetaObject;
+ int index = messageBoxMetaObject.indexOfEnumerator("StandardButtons");
+
+ QMetaEnum metaEnum = messageBoxMetaObject.enumerator(index);
+ for (int i = 0; i < metaEnum.keyCount(); i++) {
+ int enumValue = metaEnum.value(i);
+ if (enumValue < QMessageBox::FirstButton)
+ continue;
+ messageBox.setProperty(QLatin1String(metaEnum.valueToKey(metaEnum.value(i))), newVariant(enumValue));
+ if (enumValue == QMessageBox::LastButton)
+ break;
+ }
+
+ return messageBox;
+}
+
+QScriptValue ScriptEngine::generateDesktopServicesObject()
+{
+ QScriptValue desktopServices = newArray();
+#if QT_VERSION < 0x050000
+ desktopServices.setProperty(QLatin1String("DesktopLocation"), QDesktopServices::DesktopLocation);
+ desktopServices.setProperty(QLatin1String("DesktopLocation"), QDesktopServices::DesktopLocation);
+ desktopServices.setProperty(QLatin1String("DocumentsLocation"), QDesktopServices::DocumentsLocation);
+ desktopServices.setProperty(QLatin1String("FontsLocation"), QDesktopServices::FontsLocation);
+ desktopServices.setProperty(QLatin1String("ApplicationsLocation"), QDesktopServices::ApplicationsLocation);
+ desktopServices.setProperty(QLatin1String("MusicLocation"), QDesktopServices::MusicLocation);
+ desktopServices.setProperty(QLatin1String("MoviesLocation"), QDesktopServices::MoviesLocation);
+ desktopServices.setProperty(QLatin1String("PicturesLocation"), QDesktopServices::PicturesLocation);
+ desktopServices.setProperty(QLatin1String("TempLocation"), QDesktopServices::TempLocation);
+ desktopServices.setProperty(QLatin1String("HomeLocation"), QDesktopServices::HomeLocation);
+ desktopServices.setProperty(QLatin1String("DataLocation"), QDesktopServices::DataLocation);
+ desktopServices.setProperty(QLatin1String("CacheLocation"), QDesktopServices::CacheLocation);
+#else
+ desktopServices.setProperty(QLatin1String("DesktopLocation"), QStandardPaths::DesktopLocation);
+ desktopServices.setProperty(QLatin1String("DesktopLocation"), QStandardPaths::DesktopLocation);
+ desktopServices.setProperty(QLatin1String("DocumentsLocation"), QStandardPaths::DocumentsLocation);
+ desktopServices.setProperty(QLatin1String("FontsLocation"), QStandardPaths::FontsLocation);
+ desktopServices.setProperty(QLatin1String("ApplicationsLocation"), QStandardPaths::ApplicationsLocation);
+ desktopServices.setProperty(QLatin1String("MusicLocation"), QStandardPaths::MusicLocation);
+ desktopServices.setProperty(QLatin1String("MoviesLocation"), QStandardPaths::MoviesLocation);
+ desktopServices.setProperty(QLatin1String("PicturesLocation"), QStandardPaths::PicturesLocation);
+ desktopServices.setProperty(QLatin1String("TempLocation"), QStandardPaths::TempLocation);
+ desktopServices.setProperty(QLatin1String("HomeLocation"), QStandardPaths::HomeLocation);
+ desktopServices.setProperty(QLatin1String("DataLocation"), QStandardPaths::DataLocation);
+ desktopServices.setProperty(QLatin1String("CacheLocation"), QStandardPaths::CacheLocation);
+#endif
+
+ desktopServices.setProperty(QLatin1String("openUrl"),
+ newFunction(qDesktopServicesOpenUrl));
+ desktopServices.setProperty(QLatin1String("displayName"),
+ newFunction(qDesktopServicesDisplayName));
+ desktopServices.setProperty(QLatin1String("storageLocation"),
+ newFunction(qDesktopServicesStorageLocation));
+ return desktopServices;
+}
+
+QScriptValue ScriptEngine::generateQInstallerObject()
+{
+ // register ::WizardPage enum in the script connection
+ QScriptValue qinstaller = newArray();
+ qinstaller.setProperty(QLatin1String("Introduction"), PackageManagerCore::Introduction);
+ qinstaller.setProperty(QLatin1String("LicenseCheck"), PackageManagerCore::LicenseCheck);
+ qinstaller.setProperty(QLatin1String("TargetDirectory"), PackageManagerCore::TargetDirectory);
+ qinstaller.setProperty(QLatin1String("ComponentSelection"), PackageManagerCore::ComponentSelection);
+ qinstaller.setProperty(QLatin1String("StartMenuSelection"), PackageManagerCore::StartMenuSelection);
+ qinstaller.setProperty(QLatin1String("ReadyForInstallation"), PackageManagerCore::ReadyForInstallation);
+ qinstaller.setProperty(QLatin1String("PerformInstallation"), PackageManagerCore::PerformInstallation);
+ qinstaller.setProperty(QLatin1String("InstallationFinished"), PackageManagerCore::InstallationFinished);
+ qinstaller.setProperty(QLatin1String("End"), PackageManagerCore::End);
+
+ // register ::Status enum in the script connection
+ qinstaller.setProperty(QLatin1String("Success"), PackageManagerCore::Success);
+ qinstaller.setProperty(QLatin1String("Failure"), PackageManagerCore::Failure);
+ qinstaller.setProperty(QLatin1String("Running"), PackageManagerCore::Running);
+ qinstaller.setProperty(QLatin1String("Canceled"), PackageManagerCore::Canceled);
+ qinstaller.setProperty(QLatin1String("Unfinished"), PackageManagerCore::Unfinished);
+ qinstaller.setProperty(QLatin1String("ForceUpdate"), PackageManagerCore::ForceUpdate);
+
+ return qinstaller;
+}
+
diff --git a/src/libs/installer/scriptengine.h b/src/libs/installer/scriptengine.h
new file mode 100644
index 000000000..50c50539b
--- /dev/null
+++ b/src/libs/installer/scriptengine.h
@@ -0,0 +1,88 @@
+/**************************************************************************
+**
+** Copyright (C) 2012-2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
+
+#ifndef SCRIPTENGINE_H
+#define SCRIPTENGINE_H
+
+#include "qinstallerglobal.h"
+
+#include <QtScript/QScriptEngine>
+
+namespace QInstaller {
+
+QString INSTALLER_EXPORT uncaughtExceptionString(const QScriptEngine *scriptEngine, const QString &context = QString());
+QScriptValue INSTALLER_EXPORT qInstallerComponentByName(QScriptContext *context, QScriptEngine *engine);
+
+QScriptValue INSTALLER_EXPORT qDesktopServicesOpenUrl(QScriptContext *context, QScriptEngine *engine);
+QScriptValue INSTALLER_EXPORT qDesktopServicesDisplayName(QScriptContext *context, QScriptEngine *engine);
+QScriptValue INSTALLER_EXPORT qDesktopServicesStorageLocation(QScriptContext *context, QScriptEngine *engine);
+
+QScriptValue INSTALLER_EXPORT qFileDialogGetExistingDirectory(QScriptContext *context, QScriptEngine *engine);
+QScriptValue INSTALLER_EXPORT qFileDialogGetOpenFileName(QScriptContext *context, QScriptEngine *engine);
+
+QScriptValue INSTALLER_EXPORT checkArguments(QScriptContext *context, int minimalArgumentCount, int maximalArgumentCount);
+
+class PackageManagerCore;
+
+class INSTALLER_EXPORT ScriptEngine : public QScriptEngine
+{
+ Q_OBJECT
+ Q_DISABLE_COPY(ScriptEngine)
+
+public:
+ explicit ScriptEngine(PackageManagerCore *core);
+ ~ScriptEngine();
+ void setGuiQObject(QObject *guiQObject);
+ QScriptValue callScriptMethod(const QScriptValue &scriptContext, const QString &methodName,
+ const QScriptValueList &arguments = QScriptValueList()) const;
+
+ QScriptValue loadInConext(const QString &context, const QString &fileName, const QString &scriptInjection = QString());
+private slots:
+ void handleException(const QScriptValue &value);
+private:
+ QScriptValue generateMessageBoxObject();
+ QScriptValue generateDesktopServicesObject();
+ QScriptValue generateQInstallerObject();
+ PackageManagerCore *m_core;
+};
+}
+
+#endif // SCRIPTENGINE_H
diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp
index a6795598a..d8f409f46 100644
--- a/src/libs/installer/settings.cpp
+++ b/src/libs/installer/settings.cpp
@@ -52,10 +52,12 @@
using namespace QInstaller;
static const QLatin1String scIcon("Icon");
+static const QLatin1String scInstallerApplicationIcon("InstallerApplicationIcon");
+static const QLatin1String scInstallerWindowIcon("InstallerWindowIcon");
static const QLatin1String scLogo("Logo");
-static const QLatin1String scPages("Pages");
static const QLatin1String scPrefix("Prefix");
static const QLatin1String scWatermark("Watermark");
+static const QLatin1String scBanner("Banner");
static const QLatin1String scProductUrl("ProductUrl");
static const QLatin1String scBackground("Background");
static const QLatin1String scAdminTargetDir("AdminTargetDir");
@@ -65,6 +67,7 @@ static const QLatin1String scTmpRepositories("TemporaryRepositories");
static const QLatin1String scUninstallerIniFile("UninstallerIniFile");
static const QLatin1String scRemoteRepositories("RemoteRepositories");
static const QLatin1String scDependsOnLocalInstallerBinary("DependsOnLocalInstallerBinary");
+static const QLatin1String scTranslations("Translations");
static const QLatin1String scFtpProxy("FtpProxy");
static const QLatin1String scHttpProxy("HttpProxy");
@@ -95,6 +98,25 @@ static void raiseError(QXmlStreamReader &reader, const QString &error, Settings:
}
}
+static QStringList readTranslations(QXmlStreamReader &reader, Settings::ParseMode parseMode)
+{
+ QStringList translations;
+ while (reader.readNextStartElement()) {
+ if (reader.name() == QLatin1String("Translation")) {
+ translations.append(reader.readElementText().toLower());
+ } else {
+ raiseError(reader, QString::fromLatin1("Unexpected element '%1'.").arg(reader.name().toString()),
+ parseMode);
+ }
+
+ if (!reader.attributes().isEmpty()) {
+ raiseError(reader, QString::fromLatin1("Unexpected attribute for element '%1'.").arg(reader
+ .name().toString()), parseMode);
+ }
+ }
+ return translations;
+}
+
static QSet<Repository> readRepositories(QXmlStreamReader &reader, bool isDefault, Settings::ParseMode parseMode)
{
QSet<Repository> set;
@@ -136,40 +158,6 @@ static QSet<Repository> readRepositories(QXmlStreamReader &reader, bool isDefaul
return set;
}
-static QVariantHash readTitles(QXmlStreamReader &reader)
-{
- QVariantHash hash;
- while (reader.readNextStartElement())
- hash.insert(reader.name().toString(), reader.readElementText(QXmlStreamReader::SkipChildElements));
- return hash;
-}
-
-static QHash<QString, QVariantHash> readPages(QXmlStreamReader &reader, Settings::ParseMode parseMode)
-{
- QHash<QString, QVariantHash> hash;
- while (reader.readNextStartElement()) {
- if (reader.name() == QLatin1String("Page")) {
- QVariantHash pageElements;
- const QString pageName = reader.attributes().value(QLatin1String("name")).toString();
- if (pageName.isEmpty()) {
- raiseError(reader, QLatin1String("Expected non-empty attribute 'name' for element 'Page'."),
- parseMode);
- }
- while (reader.readNextStartElement()) {
- const QString name = reader.name().toString();
- if (name == QLatin1String("Title") || name == QLatin1String("SubTitle"))
- pageElements.insert(name, readTitles(reader));
- else
- pageElements.insert(name, reader.readElementText(QXmlStreamReader::SkipChildElements));
- }
- hash.insert(pageName, pageElements);
- } else {
- raiseError(reader, QString::fromLatin1("Unexpected element '%1'.").arg(reader.name().toString()),
- parseMode);
- }
- }
- return hash;
-}
// -- Settings::Private
@@ -237,16 +225,14 @@ Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix,
QStringList elementList;
elementList << scName << scVersion << scTitle << scPublisher << scProductUrl
<< scTargetDir << scAdminTargetDir
- << scIcon << scLogo << scWatermark << scBackground
+ << scIcon << scInstallerApplicationIcon << scInstallerWindowIcon
+ << scLogo << scWatermark << scBanner << scBackground
<< scStartMenuDir << scUninstallerName << scUninstallerIniFile << scRemoveTargetDir
- << scRunProgram << scRunProgramDescription
+ << scRunProgram << scRunProgramArguments << scRunProgramDescription
<< scDependsOnLocalInstallerBinary
<< scAllowSpaceInPath << scAllowNonAsciiCharacters
<< scRepositorySettingsPageVisible << scTargetConfigurationFile
- << scRemoteRepositories << scPages;
-
- QStringList blackList;
- blackList << scRemoteRepositories << scPages;
+ << scRemoteRepositories << scTranslations;
Settings s;
s.d->m_data.insert(scPrefix, prefix);
@@ -260,22 +246,17 @@ Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix,
parseMode);
}
- if (blackList.contains(name)) {
- if (name == scRemoteRepositories)
- s.addDefaultRepositories(readRepositories(reader, true, parseMode));
+ if (name == scIcon)
+ qWarning() << "Deprecated element 'Icon'.";
- if (name == scPages) {
- qWarning() << "Deprecated element 'Pages'.";
- QHash<QString, QVariantHash> pages = readPages(reader, parseMode);
- const QStringList &keys = pages.keys();
- foreach (const QString &key, keys)
- s.d->m_data.insert(key, pages.value(key));
- }
+ if (s.d->m_data.contains(name))
+ reader.raiseError(QString::fromLatin1("Element '%1' has been defined before.").arg(name));
+
+ if (name == scTranslations) {
+ s.setTranslations(readTranslations(reader, parseMode));
+ } else if (name == scRemoteRepositories) {
+ s.addDefaultRepositories(readRepositories(reader, true, parseMode));
} else {
- if (s.d->m_data.contains(name)) {
- // instead of raising parse mode based error, raise a real error
- reader.raiseError(QString::fromLatin1("Element '%1' has been defined before.").arg(name));
- }
s.d->m_data.insert(name, reader.readElementText(QXmlStreamReader::SkipChildElements));
}
}
@@ -293,6 +274,10 @@ Settings Settings::fromFileAndPrefix(const QString &path, const QString &prefix,
// Add some possible missing values
if (!s.d->m_data.contains(scIcon))
s.d->m_data.insert(scIcon, QLatin1String(":/installer"));
+ if (!s.d->m_data.contains(scInstallerApplicationIcon))
+ s.d->m_data.insert(scInstallerApplicationIcon, s.d->m_data.value(scIcon));
+ if (!s.d->m_data.contains(scInstallerWindowIcon))
+ s.d->m_data.insert(scInstallerWindowIcon, s.d->m_data.value(scIcon).toString() + s.systemIconSuffix());
if (!s.d->m_data.contains(scRemoveTargetDir))
s.d->m_data.insert(scRemoveTargetDir, scTrue);
if (!s.d->m_data.contains(scUninstallerName))
@@ -344,6 +329,11 @@ QString Settings::watermark() const
return d->makeAbsolutePath(d->m_data.value(scWatermark).toString());
}
+QString Settings::banner() const
+{
+ return d->makeAbsolutePath(d->m_data.value(scBanner).toString());
+}
+
QString Settings::background() const
{
return d->makeAbsolutePath(d->m_data.value(scBackground).toString());
@@ -351,15 +341,30 @@ QString Settings::background() const
QString Settings::icon() const
{
- const QString icon = d->makeAbsolutePath(d->m_data.value(scIcon).toString());
+ return d->makeAbsolutePath(d->m_data.value(scIcon).toString() + systemIconSuffix());
+}
+
+QString Settings::installerApplicationIcon() const
+{
+ return d->makeAbsolutePath(d->m_data.value(scInstallerApplicationIcon).toString() + systemIconSuffix());
+}
+
+QString Settings::installerWindowIcon() const
+{
+ return d->makeAbsolutePath(d->m_data.value(scInstallerWindowIcon).toString());
+}
+
+QString Settings::systemIconSuffix() const
+{
#if defined(Q_OS_MAC)
- return icon + QLatin1String(".icns");
+ return QLatin1String(".icns");
#elif defined(Q_OS_WIN)
- return icon + QLatin1String(".ico");
+ return QLatin1String(".ico");
#endif
- return icon + QLatin1String(".png");
+ return QLatin1String(".png");
}
+
QString Settings::removeTargetDir() const
{
return d->m_data.value(scRemoveTargetDir).toString();
@@ -380,6 +385,11 @@ QString Settings::runProgram() const
return d->m_data.value(scRunProgram).toString();
}
+QString Settings::runProgramArguments() const
+{
+ return d->m_data.value(scRunProgramArguments).toString();
+}
+
QString Settings::runProgramDescription() const
{
return d->m_data.value(scRunProgramDescription).toString();
@@ -548,24 +558,6 @@ QVariantList Settings::values(const QString &key, const QVariantList &defaultVal
return list.isEmpty() ? defaultValue : list;
}
-QVariantHash Settings::titlesForPage(const QString &pageName) const
-{
- const QVariantHash hash = d->m_data.value(pageName).toHash();
- const QVariant variant = hash.value(QLatin1String("Title"), QVariant());
- if (!variant.canConvert<QVariantHash>())
- return QVariantHash();
- return variant.value<QVariantHash>();
-}
-
-QVariantHash Settings::subTitlesForPage(const QString &pageName) const
-{
- const QVariantHash hash = d->m_data.value(pageName).toHash();
- const QVariant variant = hash.value(QLatin1String("SubTitle"), QVariant());
- if (!variant.canConvert<QVariantHash>())
- return QVariantHash();
- return variant.value<QVariantHash>();
-}
-
bool Settings::repositorySettingsPageVisible() const
{
return d->m_data.value(scRepositorySettingsPageVisible, true).toBool();
@@ -606,3 +598,17 @@ void Settings::setHttpProxy(const QNetworkProxy &proxy)
{
d->m_data.insert(scHttpProxy, QVariant::fromValue(proxy));
}
+
+QStringList Settings::translations() const
+{
+ const QVariant variant = d->m_data.values(scTranslations);
+ if (variant.canConvert<QStringList>())
+ return variant.value<QStringList>();
+ return QStringList();
+}
+
+void Settings::setTranslations(const QStringList &translations)
+{
+ d->m_data.remove(scTranslations);
+ d->m_data.insert(scTranslations, translations);
+}
diff --git a/src/libs/installer/settings.h b/src/libs/installer/settings.h
index fcea7cb55..85a2ea68e 100644
--- a/src/libs/installer/settings.h
+++ b/src/libs/installer/settings.h
@@ -47,6 +47,7 @@
#include <QtCore/QCoreApplication>
#include <QtCore/QSharedDataPointer>
+#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtNetwork/QNetworkProxy>
@@ -93,13 +94,18 @@ public:
QString publisher() const;
QString url() const;
QString watermark() const;
+ QString banner() const;
QString background() const;
QString icon() const;
+ QString installerApplicationIcon() const;
+ QString installerWindowIcon() const;
+ QString systemIconSuffix() const;
QString applicationName() const;
QString applicationVersion() const;
QString runProgram() const;
+ QString runProgramArguments() const;
QString runProgramDescription() const;
QString startMenuDir() const;
QString targetDir() const;
@@ -135,9 +141,6 @@ public:
QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
QVariantList values(const QString &key, const QVariantList &defaultValue = QVariantList()) const;
- QVariantHash titlesForPage(const QString &pageName) const;
- QVariantHash subTitlesForPage(const QString &pageName) const;
-
bool repositorySettingsPageVisible() const;
Settings::ProxyType proxyType() const;
@@ -149,6 +152,9 @@ public:
QNetworkProxy httpProxy() const;
void setHttpProxy(const QNetworkProxy &proxy);
+ QStringList translations() const;
+ void setTranslations(const QStringList &translations);
+
private:
class Private;
QSharedDataPointer<Private> d;
diff --git a/src/libs/installer/sysinfo_win.cpp b/src/libs/installer/sysinfo_win.cpp
new file mode 100644
index 000000000..618d6cfdb
--- /dev/null
+++ b/src/libs/installer/sysinfo_win.cpp
@@ -0,0 +1,224 @@
+/**************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
+
+#include "kdsysinfo.h"
+
+#include "link.h"
+
+#ifdef Q_CC_MINGW
+# ifndef _WIN32_WINNT
+# define _WIN32_WINNT 0x0501
+# endif
+#endif
+
+#include <windows.h>
+#include <psapi.h>
+#include <tlhelp32.h>
+
+#include <winnetwk.h>
+
+#ifndef Q_CC_MINGW
+#pragma comment(lib, "mpr.lib")
+#endif
+
+#include <QDebug>
+#include <QDir>
+#include <QLibrary>
+
+namespace KDUpdater {
+
+VolumeInfo updateVolumeSizeInformation(const VolumeInfo &info)
+{
+ ULARGE_INTEGER bytesTotal;
+ ULARGE_INTEGER freeBytesPerUser;
+
+ VolumeInfo update = info;
+ if (GetDiskFreeSpaceExA(qPrintable(info.volumeDescriptor()), &freeBytesPerUser, &bytesTotal, NULL)) {
+ update.setSize(bytesTotal.QuadPart);
+ update.setAvailableSize(freeBytesPerUser.QuadPart);
+ }
+ return update;
+}
+
+/*!
+ Returns a list of volume info objects that are mounted as network drive shares.
+*/
+QList<VolumeInfo> networkVolumeInfosFromMountPoints()
+{
+ QList<VolumeInfo> volumes;
+ QFileInfoList drives = QDir::drives();
+ foreach (const QFileInfo &drive, drives) {
+ const QString driveLetter = QDir::toNativeSeparators(drive.canonicalPath());
+ const uint driveType = GetDriveTypeA(qPrintable(driveLetter));
+ switch (driveType) {
+ case DRIVE_REMOTE: {
+ char buffer[1024] = "";
+ DWORD bufferLength = 1024;
+ UNIVERSAL_NAME_INFOA *universalNameInfo = (UNIVERSAL_NAME_INFOA*) &buffer;
+ if (WNetGetUniversalNameA(qPrintable(driveLetter), UNIVERSAL_NAME_INFO_LEVEL,
+ LPVOID(universalNameInfo), &bufferLength) == NO_ERROR) {
+ VolumeInfo info;
+ info.setMountPath(driveLetter);
+ info.setVolumeDescriptor(QLatin1String(universalNameInfo->lpUniversalName));
+ volumes.append(info);
+ }
+ } break;
+
+ default:
+ break;
+ }
+ }
+ return volumes;
+}
+
+/*!
+ Returns a list of volume info objects based on the given \a volumeGUID. The function also solves mounted
+ volume folder paths. It does not return any network drive shares.
+*/
+QList<VolumeInfo> localVolumeInfosFromMountPoints(PTCHAR volumeGUID)
+{
+#ifndef UNICODE
+#define fromWCharArray fromLatin1
+#endif
+ QList<VolumeInfo> volumes;
+ DWORD bufferSize;
+ TCHAR volumeNames[MAX_PATH + 1] = { 0 };
+ if (GetVolumePathNamesForVolumeName(volumeGUID, volumeNames, MAX_PATH, &bufferSize)) {
+ QStringList mountedPaths = QString::fromWCharArray(volumeNames, bufferSize).split(QLatin1Char(char(0)),
+ QString::SkipEmptyParts);
+ foreach (const QString &mountedPath, mountedPaths) {
+ VolumeInfo info;
+ info.setMountPath(mountedPath);
+ info.setVolumeDescriptor(QString::fromWCharArray(volumeGUID));
+ volumes.append(info);
+ }
+ }
+ return volumes;
+#ifndef UNICODE
+#undef fromWCharArray
+#endif
+}
+
+QList<VolumeInfo> mountedVolumes()
+{
+ QList<VolumeInfo> tmp;
+ TCHAR volumeGUID[MAX_PATH + 1] = { 0 };
+ HANDLE handle = FindFirstVolume(volumeGUID, MAX_PATH);
+ if (handle != INVALID_HANDLE_VALUE) {
+ tmp += localVolumeInfosFromMountPoints(volumeGUID);
+ while (FindNextVolume(handle, volumeGUID, MAX_PATH)) {
+ tmp += localVolumeInfosFromMountPoints(volumeGUID);
+ }
+ FindVolumeClose(handle);
+ }
+ tmp += networkVolumeInfosFromMountPoints();
+
+ QList<VolumeInfo> volumes;
+ while (!tmp.isEmpty()) // update volume size information
+ volumes.append(updateVolumeSizeInformation(tmp.takeFirst()));
+ return volumes;
+}
+
+bool pathIsOnLocalDevice(const QString &path)
+{
+ if (!QFileInfo(path).exists())
+ return false;
+
+ if (path.startsWith(QLatin1String("\\\\")))
+ return false;
+
+ QDir dir(path);
+ do {
+ if (QFileInfo(dir, QString()).isSymLink()) {
+ QString currentPath = QFileInfo(dir, QString()).absoluteFilePath();
+ return pathIsOnLocalDevice(Link(currentPath).targetPath());
+ }
+ } while (dir.cdUp());
+
+ const UINT DRIVE_REMOTE_TYPE = 4;
+ if (path.contains(QLatin1Char(':'))) {
+ const QLatin1Char nullTermination('\0');
+ // for example "c:\"
+ const QString driveSearchString = path.left(3) + nullTermination;
+ WCHAR wCharDriveSearchArray[4];
+ driveSearchString.toWCharArray(wCharDriveSearchArray);
+ UINT type = GetDriveType(wCharDriveSearchArray);
+ if (type == DRIVE_REMOTE_TYPE)
+ return false;
+ }
+
+ return true;
+}
+
+bool CALLBACK TerminateAppEnum(HWND hwnd, LPARAM lParam)
+{
+ DWORD dwID;
+ GetWindowThreadProcessId(hwnd, &dwID);
+
+ if (dwID == (DWORD)lParam)
+ PostMessage(hwnd, WM_CLOSE, 0, 0);
+ return true;
+}
+
+bool killProcess(const ProcessInfo &process, int msecs)
+{
+ DWORD dwTimeout = msecs;
+ if (msecs == -1)
+ dwTimeout = INFINITE;
+
+ // If we can't open the process with PROCESS_TERMINATE rights, then we give up immediately.
+ HANDLE hProc = OpenProcess(SYNCHRONIZE | PROCESS_TERMINATE, false, process.id);
+ if (hProc == 0)
+ return false;
+
+ // TerminateAppEnum() posts WM_CLOSE to all windows whose PID matches your process's.
+ EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM)process.id);
+
+ // Wait on the handle. If it signals, great. If it times out, then kill it.
+ bool returnValue = false;
+ if (WaitForSingleObject(hProc, dwTimeout) != WAIT_OBJECT_0)
+ returnValue = TerminateProcess(hProc, 0);
+
+ CloseHandle(hProc);
+ return returnValue;
+}
+
+} \ No newline at end of file
diff --git a/src/libs/installer/utils.cpp b/src/libs/installer/utils.cpp
index 1112bcebb..2b5491f62 100644
--- a/src/libs/installer/utils.cpp
+++ b/src/libs/installer/utils.cpp
@@ -45,6 +45,7 @@
#include <QtCore/QDir>
#include <QtCore/QProcessEnvironment>
#include <QtCore/QVector>
+#include <QCoreApplication>
#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE)
# include "qt_windows.h"
@@ -54,6 +55,39 @@
#include <iostream>
#include <sstream>
+
+#ifdef Q_OS_WIN
+#include <windows.h> // for Sleep
+#endif
+#ifdef Q_OS_UNIX
+#include <errno.h>
+#include <signal.h>
+#include <time.h>
+#endif
+
+namespace {
+void sleepCopiedFromQTest(int ms)
+{
+ if (ms < 0)
+ return;
+#ifdef Q_OS_WIN
+ Sleep(uint(ms));
+#else
+ struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
+ nanosleep(&ts, NULL);
+#endif
+}
+}
+void QInstaller::uiDetachedWait(int ms)
+{
+ QTime timer;
+ timer.start();
+ do {
+ QCoreApplication::processEvents(QEventLoop::AllEvents, ms);
+ sleepCopiedFromQTest(10);
+ } while (timer.elapsed() < ms);
+}
+
static bool verb = false;
void QInstaller::setVerbose(bool v)
diff --git a/src/libs/installer/utils.h b/src/libs/installer/utils.h
index 0d21adbee..229dfe95a 100644
--- a/src/libs/installer/utils.h
+++ b/src/libs/installer/utils.h
@@ -57,6 +57,7 @@ class QIODevice;
QT_END_NAMESPACE
namespace QInstaller {
+ void INSTALLER_EXPORT uiDetachedWait(int ms);
QByteArray INSTALLER_EXPORT calculateHash(QIODevice *device, QCryptographicHash::Algorithm algo);
QByteArray INSTALLER_EXPORT calculateHash(const QString &path, QCryptographicHash::Algorithm algo);
@@ -81,7 +82,7 @@ namespace QInstaller {
{
Q_OBJECT
public:
- VerboseWriter(QObject *parent = 0);
+ explicit VerboseWriter(QObject *parent = 0);
~VerboseWriter();
static VerboseWriter *instance();
diff --git a/src/libs/kdtools/environment.cpp b/src/libs/kdtools/environment.cpp
index 4b031ecc4..5c3eb8bc1 100644
--- a/src/libs/kdtools/environment.cpp
+++ b/src/libs/kdtools/environment.cpp
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
#include "environment.h"
#include <QHash>
diff --git a/src/libs/kdtools/environment.h b/src/libs/kdtools/environment.h
index 917da4f45..94e13e9d8 100644
--- a/src/libs/kdtools/environment.h
+++ b/src/libs/kdtools/environment.h
@@ -1,3 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
#ifndef LIBINSTALLER_ENVIRONMENT_H
#define LIBINSTALLER_ENVIRONMENT_H
diff --git a/src/libs/kdtools/kdgenericfactory.cpp b/src/libs/kdtools/kdgenericfactory.cpp
index 9352f83cd..a45d1089c 100644
--- a/src/libs/kdtools/kdgenericfactory.cpp
+++ b/src/libs/kdtools/kdgenericfactory.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdgenericfactory.h"
@@ -31,7 +50,7 @@
(The exception safety of this class has not been evaluated yet.)
KDGenericFactory is an implemention of of the factory pattern. It can be used to
- "produce" instances of different classes having a common superclass
+ "produce" instances of different classes having a common superclass
T_Product. The user of the
factory registers those producable classes in the factory by using an identifier
(T_Identifier, defaulting to QString). That identifer can then be used to
@@ -44,10 +63,10 @@
\li\link QHash::const_iterator a nested %const_iterator \endlink typedef for an iterator type that when dereferenced has type ((const) reference to) FactoryFunction (Qt convention),
\li\link QHash::insert %insert( T_Identifier, FactoryFunction ) \endlink, which must overwrite any existing entries with the same identifier.
- \li\link QHash::find %find( T_Identifier ) \endlink,
+ \li\link QHash::find %find( T_Identifier ) \endlink,
\li\link QHash::end %end() \endlink,
- \li\link QHash::size %size() \endlink,
- \li\link QHash::remove %remove( T_Identifier ) \endlink, and
+ \li\link QHash::size %size() \endlink,
+ \li\link QHash::remove %remove( T_Identifier ) \endlink, and
\li\link QHash::keys %keys ) \endlink, returning a QList<T_Identifier>.
The only two class templates that currently match this concept are
@@ -59,7 +78,7 @@
instead of just FactoryFunction.
\section general-use General Use
-
+
The following example shows how the general use case of KDGenericFactory looks like:
\code
@@ -87,10 +106,10 @@
// lets create some stuff - here comes our tasty apple:
Fruit* myApple = fruitPlantation.create( "Apple" );
-
+
// and a pear, please:
Fruit* myPear = fruitPlantation.create( "Pear" );
-
+
// ohh - that doesn't work, returns a null pointer:
Fruit* myCherry = fruitPlantation.create( "Cherry" );
}
@@ -106,7 +125,7 @@
/*!
\typedef KDGenericFactory::FactoryFunction
-
+
This typedef defines a factory function producing an object of type T_Product.
*/
@@ -116,7 +135,7 @@
Registers a product of type T, identified by \a name in the factory.
Any type with the same name gets unregistered.
- If a product was registered via this method, it will be created using its
+ If a product was registered via this method, it will be created using its
default constructor.
*/
@@ -153,98 +172,3 @@
type T, identified by \a name. When a product is registered via this method, it will be created
by calling create().
*/
-
-#ifdef KDTOOLSCORE_UNITTESTS
-
-#include <KDUnitTest/test.h>
-
-#include <QStringList>
-#include <QMap>
-
-class Fruit
-{
-public:
- virtual ~Fruit() {}
-};
-
-class Apple : public Fruit
-{
-};
-
-class Pear : public Fruit
-{
-};
-
-std::ostream& operator<<( std::ostream& stream, const QStringList& list )
-{
- stream << "QStringList(";
- for( QStringList::const_iterator it = list.begin(); it != list.end(); ++it )
- {
- stream << " " << it->toLocal8Bit().data();
- if( it + 1 != list.end() )
- stream << ",";
- }
- stream << " )";
- return stream;
-}
-
-class KDGenericFactoryTest : public KDUnitTest::Test {
-public:
- KDGenericFactoryTest() : Test( "KDGenericFactory" ) {}
- void run() {
- doRun<QHash>();
- doRun<QMap>();
- }
-
- template <template <typename U, typename V> class T_Map>
- void doRun();
-};
-
-KDAB_EXPORT_UNITTEST( KDGenericFactoryTest, "kdcoretools" )
-
-template <template <typename U, typename V> class T_Map>
-void KDGenericFactoryTest::doRun() {
-
- {
- KDGenericFactory< Fruit, QString, T_Map > fruitPlantation;
- assertEqual( fruitPlantation.productCount(), 0U );
- assertEqual( fruitPlantation.availableProducts(), QStringList() );
-
- fruitPlantation.template registerProduct< Apple >( QLatin1String( "Apple" ) );
- assertEqual( fruitPlantation.productCount(), 1U );
- assertEqual( fruitPlantation.availableProducts(), QStringList( QLatin1String( "Apple" ) ) );
-
- fruitPlantation.template registerProduct< Pear >( QLatin1String( "Pear" ) );
- assertEqual( fruitPlantation.productCount(), 2U );
-
- Fruit* fruit = 0;
- fruit = fruitPlantation.create( QLatin1String( "Apple" ) );
- assertNotNull( fruit );
- assertNotNull( dynamic_cast< Apple* >( fruit ) );
-
- fruit = fruitPlantation.create( QLatin1String( "Pear" ) );
- assertNotNull( fruit );
- assertNotNull( dynamic_cast< Pear* >( fruit ) );
-
- fruit = fruitPlantation.create( QLatin1String( "Cherry" ) );
- assertNull( fruit );
-
- fruitPlantation.unregisterProduct( QLatin1String( "Apple" ) );
- assertEqual( fruitPlantation.productCount(), 1U );
- assertEqual( fruitPlantation.availableProducts(), QStringList( QLatin1String( "Pear" ) ) );
- fruit = fruitPlantation.create( QLatin1String( "Apple" ) );
- assertNull( fruit );
-
- fruit = fruitPlantation.create( QLatin1String( "Pear" ) );
- assertNotNull( fruit );
- assertNotNull( dynamic_cast< Pear* >( fruit ) );
-
-
- fruitPlantation.unregisterProduct( QLatin1String( "Pear" ) );
- assertEqual( fruitPlantation.productCount(), 0U );
- fruit = fruitPlantation.create( QLatin1String( "Pear" ) );
- assertNull( fruit );
- }
-
-}
-#endif // KDTOOLSCORE_UNITTESTS
diff --git a/src/libs/kdtools/kdgenericfactory.h b/src/libs/kdtools/kdgenericfactory.h
index d12c35785..349c5ee92 100644
--- a/src/libs/kdtools/kdgenericfactory.h
+++ b/src/libs/kdtools/kdgenericfactory.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KDTOOLS__KDGENERICFACTORY_H
#define KDTOOLS__KDGENERICFACTORY_H
diff --git a/src/libs/kdtools/kdjob.cpp b/src/libs/kdtools/kdjob.cpp
index 47a30a836..484cd6dc4 100644
--- a/src/libs/kdtools/kdjob.cpp
+++ b/src/libs/kdtools/kdjob.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdjob.h"
diff --git a/src/libs/kdtools/kdjob.h b/src/libs/kdtools/kdjob.h
index 37f441526..33b0f556d 100644
--- a/src/libs/kdtools/kdjob.h
+++ b/src/libs/kdtools/kdjob.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KDTOOLS_KDJOB_H
#define KDTOOLS_KDJOB_H
diff --git a/src/libs/kdtools/kdlockfile.cpp b/src/libs/kdtools/kdlockfile.cpp
index 3a440b6b0..a647f4eb8 100644
--- a/src/libs/kdtools/kdlockfile.cpp
+++ b/src/libs/kdtools/kdlockfile.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdlockfile.h"
@@ -55,37 +74,3 @@ bool KDLockFile::unlock()
{
return d->unlock();
}
-
-
-#ifdef KDTOOLSCORE_UNITTESTS
-
-#include <KDUnitTest/Test>
-#include <QDebug>
-#include <QDir>
-
-KDAB_UNITTEST_SIMPLE( KDLockFile, "kdcoretools" ) {
- {
- KDLockFile f( QLatin1String("/jlksdfdsfjkldsf-doesnotexist/file") );
- const bool locked = f.lock();
- assertFalse( locked );
- qDebug() << f.errorString();
- assertTrue( !f.errorString().isEmpty() );
- if ( !locked )
- assertTrue( f.unlock() );
- }
- {
- KDLockFile f( QDir::currentPath() + QLatin1String("/kdlockfile-test") );
- const bool locked = f.lock();
- assertTrue( locked );
- if ( !locked )
- qDebug() << f.errorString();
- assertEqual( locked, f.errorString().isEmpty() );
- const bool unlocked = f.unlock();
- assertTrue( unlocked );
- if ( !unlocked )
- qDebug() << f.errorString();
- assertEqual( unlocked, f.errorString().isEmpty() );
- }
-}
-
-#endif // KDTOOLSCORE_UNITTESTS
diff --git a/src/libs/kdtools/kdlockfile.h b/src/libs/kdtools/kdlockfile.h
index 1674070bf..dfa389595 100644
--- a/src/libs/kdtools/kdlockfile.h
+++ b/src/libs/kdtools/kdlockfile.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KDTOOLS_KDLOCKFILE_H
#define KDTOOLS_KDLOCKFILE_H
diff --git a/src/libs/kdtools/kdlockfile_p.h b/src/libs/kdtools/kdlockfile_p.h
index da4c4dc4c..091819997 100644
--- a/src/libs/kdtools/kdlockfile_p.h
+++ b/src/libs/kdtools/kdlockfile_p.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef __KDTOOLSCORE_KDLOCKFILE_P_H__
#define __KDTOOLSCORE_KDLOCKFILE_P_H__
diff --git a/src/libs/kdtools/kdlockfile_unix.cpp b/src/libs/kdtools/kdlockfile_unix.cpp
index 6f362b974..3e0a450b7 100644
--- a/src/libs/kdtools/kdlockfile_unix.cpp
+++ b/src/libs/kdtools/kdlockfile_unix.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdlockfile_p.h"
diff --git a/src/libs/kdtools/kdlockfile_win.cpp b/src/libs/kdtools/kdlockfile_win.cpp
index f139bd0d4..b5c756a8e 100644
--- a/src/libs/kdtools/kdlockfile_win.cpp
+++ b/src/libs/kdtools/kdlockfile_win.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdlockfile.h"
#include "kdlockfile_p.h"
@@ -28,7 +47,7 @@
KDLockFile::Private::~Private()
{
- unlock();
+ unlock();
}
bool KDLockFile::Private::lock()
diff --git a/src/libs/kdtools/kdrunoncechecker.cpp b/src/libs/kdtools/kdrunoncechecker.cpp
index 702016d71..b814ae6f3 100644
--- a/src/libs/kdtools/kdrunoncechecker.cpp
+++ b/src/libs/kdtools/kdrunoncechecker.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdrunoncechecker.h"
#include "kdlockfile.h"
diff --git a/src/libs/kdtools/kdrunoncechecker.h b/src/libs/kdtools/kdrunoncechecker.h
index 127102274..d9d69fc1d 100644
--- a/src/libs/kdtools/kdrunoncechecker.h
+++ b/src/libs/kdtools/kdrunoncechecker.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KDTOOLS_RUNONCECHECKER_H
#define KDTOOLS_RUNONCECHECKER_H
diff --git a/src/libs/kdtools/kdsavefile.cpp b/src/libs/kdtools/kdsavefile.cpp
index 849eef393..483f1b338 100644
--- a/src/libs/kdtools/kdsavefile.cpp
+++ b/src/libs/kdtools/kdsavefile.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdsavefile.h"
@@ -458,73 +477,3 @@ QString KDSaveFile::backupExtension() const
{
return d->backupExtension;
}
-
-/**
- * TODO
- *
- *
- */
-
-#ifdef KDTOOLSCORE_UNITTESTS
-
-#include <KDUnitTest/Test>
-
-KDAB_UNITTEST_SIMPLE( KDSaveFile, "kdcoretools" ) {
- //TODO test contents (needs blocking and checked write() )
- {
- const QString testfile1 = QLatin1String("kdsavefile-test1");
- QByteArray testData("lalalala");
- KDSaveFile saveFile( testfile1 );
- assertTrue( saveFile.open( QIODevice::WriteOnly ) );
- saveFile.write( testData.constData(), testData.size() );
- assertTrue( saveFile.commit() );
- assertTrue( QFile::exists( testfile1 ) );
- assertTrue( QFile::remove( testfile1 ) );
- }
- {
- const QString testfile1 = QLatin1String("kdsavefile-test1");
- QByteArray testData("lalalala");
- KDSaveFile saveFile( testfile1 );
- assertTrue( saveFile.open( QIODevice::WriteOnly ) );
- saveFile.write( testData.constData(), testData.size() );
- saveFile.close();
- assertFalse( QFile::exists( testfile1 ) );
- }
- {
- const QString testfile1 = QLatin1String("kdsavefile-test1");
- QByteArray testData("lalalala");
- KDSaveFile saveFile( testfile1 );
- assertTrue( saveFile.open( QIODevice::WriteOnly ) );
- saveFile.write( testData.constData(), testData.size() );
- assertTrue( saveFile.commit() );
- assertTrue( QFile::exists( testfile1 ) );
-
- KDSaveFile sf2( testfile1 );
- sf2.setBackupExtension( QLatin1String(".bak") );
- assertTrue( sf2.open( QIODevice::WriteOnly ) );
- sf2.write( testData.constData(), testData.size() );
- sf2.commit(); //commit in backup mode (default)
- const QString backup = testfile1 + sf2.backupExtension();
- assertTrue( QFile::exists( backup ) );
- assertTrue( QFile::remove( backup ) );
-
- KDSaveFile sf3( testfile1 );
- sf3.setBackupExtension( QLatin1String(".bak") );
- assertTrue( sf3.open( QIODevice::WriteOnly ) );
- sf3.write( testData.constData(), testData.size() );
- sf3.commit( KDSaveFile::OverwriteExistingFile );
- const QString backup2 = testfile1 + sf3.backupExtension();
- assertFalse( QFile::exists( backup2 ) );
-
- assertTrue( QFile::remove( testfile1 ) );
- }
- {
- const QString testfile1 = QLatin1String("kdsavefile-test1");
- KDSaveFile sf( testfile1 );
- assertFalse( sf.open( QIODevice::ReadOnly ) );
- assertFalse( sf.open( QIODevice::WriteOnly|QIODevice::Append ) );
- assertTrue( sf.open( QIODevice::ReadWrite ) );
- }
-}
-
-#endif // KDTOOLSCORE_UNITTESTS
diff --git a/src/libs/kdtools/kdsavefile.h b/src/libs/kdtools/kdsavefile.h
index 8147459a8..24eee9870 100644
--- a/src/libs/kdtools/kdsavefile.h
+++ b/src/libs/kdtools/kdsavefile.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KDTOOLS_KDSAVEFILE_H
#define KDTOOLS_KDSAVEFILE_H
diff --git a/src/libs/kdtools/kdselfrestarter.cpp b/src/libs/kdtools/kdselfrestarter.cpp
index 22457bd92..e8ffad4ee 100644
--- a/src/libs/kdtools/kdselfrestarter.cpp
+++ b/src/libs/kdtools/kdselfrestarter.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdselfrestarter.h"
@@ -33,11 +52,11 @@ public:
: restartOnQuit(false)
{
executable = QString::fromLocal8Bit(argv[0]);
- workingPath = QDir::currentPath();
+ workingPath = QDir::currentPath();
for (int i = 1; i < argc; ++i)
args << QString::fromLocal8Bit(argv[i]);
}
-
+
Private()
{
executable = qApp->applicationFilePath();
@@ -50,7 +69,7 @@ public:
if (restartOnQuit)
QProcess::startDetached(executable, args, workingPath);
}
-
+
QString executable;
QStringList args;
bool restartOnQuit;
diff --git a/src/libs/kdtools/kdselfrestarter.h b/src/libs/kdtools/kdselfrestarter.h
index bbf46a2b9..34918d644 100644
--- a/src/libs/kdtools/kdselfrestarter.h
+++ b/src/libs/kdtools/kdselfrestarter.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KDTOOLS_KDSELFRESTARTER_H
#define KDTOOLS_KDSELFRESTARTER_H
@@ -33,7 +52,7 @@ public:
static bool restartOnQuit();
static void setRestartOnQuit(bool restart);
-
+
private:
Q_DISABLE_COPY(KDSelfRestarter)
class Private;
diff --git a/src/libs/kdtools/kdsysinfo.cpp b/src/libs/kdtools/kdsysinfo.cpp
index 194e5c5b5..98a0d951e 100644
--- a/src/libs/kdtools/kdsysinfo.cpp
+++ b/src/libs/kdtools/kdsysinfo.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdsysinfo.h"
diff --git a/src/libs/kdtools/kdsysinfo.h b/src/libs/kdtools/kdsysinfo.h
index bab32979a..ccbd4b4b1 100644
--- a/src/libs/kdtools/kdsysinfo.h
+++ b/src/libs/kdtools/kdsysinfo.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KDSYSINFO_H
#define KDSYSINFO_H
diff --git a/src/libs/kdtools/kdsysinfo_mac.cpp b/src/libs/kdtools/kdsysinfo_mac.cpp
index e81b88495..9ca7150b6 100644
--- a/src/libs/kdtools/kdsysinfo_mac.cpp
+++ b/src/libs/kdtools/kdsysinfo_mac.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdsysinfo.h"
diff --git a/src/libs/kdtools/kdsysinfo_win.cpp b/src/libs/kdtools/kdsysinfo_win.cpp
index 10666c8e0..edeeb6879 100644
--- a/src/libs/kdtools/kdsysinfo_win.cpp
+++ b/src/libs/kdtools/kdsysinfo_win.cpp
@@ -1,28 +1,48 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdsysinfo.h"
-#include "link.h"
+#include <QLibrary>
+#include <QStringList>
#ifdef Q_CC_MINGW
# ifndef _WIN32_WINNT
@@ -34,16 +54,6 @@
#include <psapi.h>
#include <tlhelp32.h>
-#include <winnetwk.h>
-
-#ifndef Q_CC_MINGW
-#pragma comment(lib, "mpr.lib")
-#endif
-
-#include <QDebug>
-#include <QDir>
-#include <QLibrary>
-
const int KDSYSINFO_PROCESS_QUERY_LIMITED_INFORMATION = 0x1000;
namespace KDUpdater {
@@ -56,100 +66,6 @@ quint64 installedMemory()
return quint64(status.ullTotalPhys);
}
-VolumeInfo updateVolumeSizeInformation(const VolumeInfo &info)
-{
- ULARGE_INTEGER bytesTotal;
- ULARGE_INTEGER freeBytesPerUser;
-
- VolumeInfo update = info;
- if (GetDiskFreeSpaceExA(qPrintable(info.volumeDescriptor()), &freeBytesPerUser, &bytesTotal, NULL)) {
- update.setSize(bytesTotal.QuadPart);
- update.setAvailableSize(freeBytesPerUser.QuadPart);
- }
- return update;
-}
-
-/*!
- Returns a list of volume info objects that are mounted as network drive shares.
-*/
-QList<VolumeInfo> networkVolumeInfosFromMountPoints()
-{
- QList<VolumeInfo> volumes;
- QFileInfoList drives = QDir::drives();
- foreach (const QFileInfo &drive, drives) {
- const QString driveLetter = QDir::toNativeSeparators(drive.canonicalPath());
- const uint driveType = GetDriveTypeA(qPrintable(driveLetter));
- switch (driveType) {
- case DRIVE_REMOTE: {
- char buffer[1024] = "";
- DWORD bufferLength = 1024;
- UNIVERSAL_NAME_INFOA *universalNameInfo = (UNIVERSAL_NAME_INFOA*) &buffer;
- if (WNetGetUniversalNameA(qPrintable(driveLetter), UNIVERSAL_NAME_INFO_LEVEL,
- LPVOID(universalNameInfo), &bufferLength) == NO_ERROR) {
- VolumeInfo info;
- info.setMountPath(driveLetter);
- info.setVolumeDescriptor(QLatin1String(universalNameInfo->lpUniversalName));
- volumes.append(info);
- }
- } break;
-
- default:
- break;
- }
- }
- return volumes;
-}
-
-/*!
- Returns a list of volume info objects based on the given \a volumeGUID. The function also solves mounted
- volume folder paths. It does not return any network drive shares.
-*/
-QList<VolumeInfo> localVolumeInfosFromMountPoints(PTCHAR volumeGUID)
-{
- QList<VolumeInfo> volumes;
- DWORD bufferSize;
- TCHAR volumeNames[MAX_PATH + 1] = { 0 };
- if (GetVolumePathNamesForVolumeName(volumeGUID, volumeNames, MAX_PATH, &bufferSize)) {
- QStringList mountedPaths =
-#ifdef UNICODE
- QString::fromWCharArray(volumeNames, bufferSize).split(QLatin1Char(char(0)), QString::SkipEmptyParts);
-#else
- QString::fromLatin1(volumeNames, bufferSize).split(QLatin1Char(char(0)), QString::SkipEmptyParts);
-#endif
- foreach (const QString &mountedPath, mountedPaths) {
- VolumeInfo info;
- info.setMountPath(mountedPath);
-#ifdef UNICODE
- info.setVolumeDescriptor(QString::fromWCharArray(volumeGUID));
-#else
- info.setVolumeDescriptor(QString::fromLatin1(volumeGUID));
-#endif
- volumes.append(info);
- }
- }
- return volumes;
-}
-
-QList<VolumeInfo> mountedVolumes()
-{
- QList<VolumeInfo> tmp;
- TCHAR volumeGUID[MAX_PATH + 1] = { 0 };
- HANDLE handle = FindFirstVolume(volumeGUID, MAX_PATH);
- if (handle != INVALID_HANDLE_VALUE) {
- tmp += localVolumeInfosFromMountPoints(volumeGUID);
- while (FindNextVolume(handle, volumeGUID, MAX_PATH)) {
- tmp += localVolumeInfosFromMountPoints(volumeGUID);
- }
- FindVolumeClose(handle);
- }
- tmp += networkVolumeInfosFromMountPoints();
-
- QList<VolumeInfo> volumes;
- while (!tmp.isEmpty()) // update volume size information
- volumes.append(updateVolumeSizeInformation(tmp.takeFirst()));
- return volumes;
-}
-
struct EnumWindowsProcParam
{
QList<ProcessInfo> processes;
@@ -228,74 +144,4 @@ QList<ProcessInfo> runningProcesses()
return param.processes;
}
-bool CALLBACK TerminateAppEnum(HWND hwnd, LPARAM lParam)
-{
- DWORD dwID;
- GetWindowThreadProcessId(hwnd, &dwID);
-
- if (dwID == (DWORD)lParam)
- PostMessage(hwnd, WM_CLOSE, 0, 0);
-
- return true;
-}
-
-bool killProcess(const ProcessInfo &process, int msecs)
-{
- DWORD dwTimeout = msecs;
- if (msecs == -1)
- dwTimeout = INFINITE;
-
- // If we can't open the process with PROCESS_TERMINATE rights,
- // then we give up immediately.
- HANDLE hProc = OpenProcess(SYNCHRONIZE | PROCESS_TERMINATE, FALSE, process.id);
-
- if (hProc == 0)
- return false;
-
- // TerminateAppEnum() posts WM_CLOSE to all windows whose PID
- // matches your process's.
- EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM)process.id);
-
- // Wait on the handle. If it signals, great. If it times out,
- // then you kill it.
- bool returnValue = false;
- if (WaitForSingleObject(hProc, dwTimeout) != WAIT_OBJECT_0)
- returnValue = TerminateProcess(hProc, 0);
-
- CloseHandle(hProc) ;
-
- return returnValue;
-}
-
-bool pathIsOnLocalDevice(const QString &path)
-{
- if (!QFileInfo(path).exists())
- return false;
-
- if (path.startsWith(QLatin1String("\\\\")))
- return false;
-
- QDir dir(path);
- do {
- if (QFileInfo(dir, QString()).isSymLink()) {
- QString currentPath = QFileInfo(dir, QString()).absoluteFilePath();
- return pathIsOnLocalDevice(Link(currentPath).targetPath());
- }
- } while (dir.cdUp());
-
- const UINT DRIVE_REMOTE_TYPE = 4;
- if (path.contains(QLatin1Char(':'))) {
- const QLatin1Char nullTermination('\0');
- // for example "c:\"
- const QString driveSearchString = path.left(3) + nullTermination;
- WCHAR wCharDriveSearchArray[4];
- driveSearchString.toWCharArray(wCharDriveSearchArray);
- UINT type = GetDriveType(wCharDriveSearchArray);
- if (type == DRIVE_REMOTE_TYPE)
- return false;
- }
-
- return true;
-}
-
} // namespace KDUpdater
diff --git a/src/libs/kdtools/kdsysinfo_x11.cpp b/src/libs/kdtools/kdsysinfo_x11.cpp
index 391fb5280..d9a51185c 100644
--- a/src/libs/kdtools/kdsysinfo_x11.cpp
+++ b/src/libs/kdtools/kdsysinfo_x11.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdsysinfo.h"
@@ -67,7 +86,7 @@ QList<VolumeInfo> mountedVolumes()
qCritical("%s: Could not open %s: %s", Q_FUNC_INFO, qPrintable(f.fileName()), qPrintable(f.errorString()));
return result; //better error-handling?
}
-
+
QTextStream stream(&f);
while (true) {
const QString s = stream.readLine();
diff --git a/src/libs/kdtools/kdtools.pri b/src/libs/kdtools/kdtools.pri
index cc9fd52fb..2b98089b9 100644
--- a/src/libs/kdtools/kdtools.pri
+++ b/src/libs/kdtools/kdtools.pri
@@ -36,7 +36,8 @@ HEADERS += $$PWD/kdupdater.h \
$$PWD/kdupdatertask.h \
$$PWD/kdupdaterupdatefinder.h \
$$PWD/kdupdaterupdatesinfo_p.h \
- $$PWD/environment.h
+ $$PWD/environment.h \
+ $$PWD/kdupdaterupdatesinfodata_p.h
SOURCES += $$PWD/kdupdaterapplication.cpp \
$$PWD/kdupdaterfiledownloader.cpp \
diff --git a/src/libs/kdtools/kdtoolsglobal.h b/src/libs/kdtools/kdtoolsglobal.h
index 8ce4d5224..628972fee 100644
--- a/src/libs/kdtools/kdtoolsglobal.h
+++ b/src/libs/kdtools/kdtoolsglobal.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KDTOOLS_KDTOOLSGLOBAL_H
#define KDTOOLS_KDTOOLSGLOBAL_H
diff --git a/src/libs/kdtools/kdupdater.h b/src/libs/kdtools/kdupdater.h
index f28461d9b..4ea6ba842 100644
--- a/src/libs/kdtools/kdupdater.h
+++ b/src/libs/kdtools/kdupdater.h
@@ -1,29 +1,48 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_H
#define KD_UPDATER_H
-#include <kdtoolsglobal.h>
+#include "kdtoolsglobal.h"
namespace KDUpdater
{
@@ -36,16 +55,6 @@ namespace KDUpdater
ECannotStopTask,
EUnknown
};
-
- enum UpdateType {
- PackageUpdate = 0x1,
- CompatUpdate = 0x2,
- NewPackage = 0x4,
- AllUpdate = PackageUpdate | CompatUpdate
- };
- Q_DECLARE_FLAGS( UpdateTypes, UpdateType )
- Q_DECLARE_OPERATORS_FOR_FLAGS( UpdateTypes )
-
KDTOOLS_EXPORT int compareVersion(const QString &v1, const QString &v2);
}
diff --git a/src/libs/kdtools/kdupdaterapplication.cpp b/src/libs/kdtools/kdupdaterapplication.cpp
index 352c33ca8..76290348c 100644
--- a/src/libs/kdtools/kdupdaterapplication.cpp
+++ b/src/libs/kdtools/kdupdaterapplication.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdupdaterapplication.h"
#include "kdupdaterpackagesinfo.h"
@@ -27,7 +46,6 @@
#include <QCoreApplication>
#include <QDebug>
#include <QDir>
-#include <QSettings>
using namespace KDUpdater;
@@ -55,32 +73,6 @@ medium-to-large scale software systems.
\namespace KDUpdater
*/
-ConfigurationInterface::~ConfigurationInterface()
-{
-}
-
-namespace {
-
-class DefaultConfigImpl : public ConfigurationInterface
-{
-public:
- QVariant value(const QString &key) const
- {
- QSettings settings;
- settings.beginGroup(QLatin1String("KDUpdater"));
- return settings.value(key);
- }
-
- void setValue(const QString &key, const QVariant &value)
- {
- QSettings settings;
- settings.beginGroup(QLatin1String("KDUpdater"));
- settings.setValue(key, value);
- }
-};
-
-} // namespace anon
-
/*!
\class KDUpdater::Application kdupdaterapplication.h KDUpdaterApplication
\ingroup kdupdater
@@ -95,7 +87,6 @@ public:
User can also retrieve some information from this class:
\li application name
\li application version
- \li compat level
*/
struct Application::ApplicationData
@@ -103,7 +94,7 @@ struct Application::ApplicationData
explicit ApplicationData(ConfigurationInterface *config) :
packagesInfo(0),
updateSourcesInfo(0),
- configurationInterface(config ? config : new DefaultConfigImpl)
+ configurationInterface(config ? config : new ConfigurationInterface)
{
const QStringList oldFiles = configurationInterface->value(QLatin1String("FilesForDelayedDeletion")).toStringList();
Q_FOREACH(const QString &i, oldFiles) { //TODO this should happen asnyc and report errors, I guess
@@ -122,7 +113,7 @@ struct Application::ApplicationData
delete updateSourcesInfo;
delete configurationInterface;
}
-
+
static Application *instance;
QString applicationDirectory;
@@ -161,7 +152,7 @@ Application::~Application()
}
/*!
- Returns a previousle created Application instance.
+ Returns a previously created Application instance.
*/
Application *Application::instance()
{
@@ -215,17 +206,6 @@ QString Application::applicationVersion() const
return QString();
}
-/*!
- Returns the compat level that this application is in.
-*/
-int Application::compatLevel() const
-{
- if (d->packagesInfo->isValid())
- return d->packagesInfo->compatLevel();
-
- return -1;
-}
-
void Application::addUpdateSource(const QString &name, const QString &title,
const QString &description, const QUrl &url, int priority)
{
@@ -292,7 +272,7 @@ UpdateSourcesInfo* Application::updateSourcesInfo() const
{
return d->updateSourcesInfo;
}
-
+
void Application::printError(int errorCode, const QString &error)
{
qDebug() << errorCode << error;
diff --git a/src/libs/kdtools/kdupdaterapplication.h b/src/libs/kdtools/kdupdaterapplication.h
index b2079fe7c..b9250fdee 100644
--- a/src/libs/kdtools/kdupdaterapplication.h
+++ b/src/libs/kdtools/kdupdaterapplication.h
@@ -1,48 +1,73 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_APPLICATION_H
#define KD_UPDATER_APPLICATION_H
-#include "kdupdater.h"
-#include <QObject>
-#include <QRegExp>
+#include "kdtoolsglobal.h"
-QT_BEGIN_NAMESPACE
-class QUrl;
-QT_END_NAMESPACE
+#include <QSettings>
namespace KDUpdater {
class PackagesInfo;
class UpdateSourcesInfo;
-static QRegExp scCommaRegExp(QLatin1String("\\b(,|, )\\b"));
class ConfigurationInterface
{
public:
- virtual ~ConfigurationInterface();
- virtual QVariant value(const QString &key ) const = 0;
- virtual void setValue(const QString &key, const QVariant &value) = 0;
+ virtual ~ConfigurationInterface() {}
+ virtual QVariant value(const QString &key) const
+ {
+ QSettings settings;
+ settings.beginGroup(QLatin1String("KDUpdater"));
+ return settings.value(key);
+ }
+
+ virtual void setValue(const QString &key, const QVariant &value)
+ {
+ QSettings settings;
+ settings.beginGroup(QLatin1String("KDUpdater"));
+ settings.setValue(key, value);
+ }
};
class KDTOOLS_EXPORT Application : public QObject
@@ -60,7 +85,6 @@ public:
QString applicationName() const;
QString applicationVersion() const;
- int compatLevel() const;
void setPackagesXMLFileName(const QString &fileName);
QString packagesXMLFileName() const;
diff --git a/src/libs/kdtools/kdupdaterfiledownloader.cpp b/src/libs/kdtools/kdupdaterfiledownloader.cpp
index 9ad3861dd..fee2a853e 100644
--- a/src/libs/kdtools/kdupdaterfiledownloader.cpp
+++ b/src/libs/kdtools/kdupdaterfiledownloader.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdupdaterfiledownloader_p.h"
#include "kdupdaterfiledownloaderfactory.h"
@@ -93,6 +112,7 @@ struct KDUpdater::FileDownloader::Private
, m_sampleIndex(0)
, m_downloadSpeed(0)
, m_factory(0)
+ , m_ignoreSslErrors(false)
{
memset(m_samples, 0, sizeof(m_samples));
}
@@ -125,6 +145,7 @@ struct KDUpdater::FileDownloader::Private
QAuthenticator m_authenticator;
FileDownloaderProxyFactory *m_factory;
+ bool m_ignoreSslErrors;
};
KDUpdater::FileDownloader::FileDownloader(const QString &scheme, QObject *parent)
@@ -363,6 +384,12 @@ void KDUpdater::FileDownloader::addCheckSumData(const char *data, int length)
d->m_hash.addData(data, length);
}
+void KDUpdater::FileDownloader::resetCheckSumData()
+{
+ d->m_hash.reset();
+}
+
+
/*!
Returns a copy of the proxy factory that this FileDownloader object is using to determine the proxies to
be used for requests.
@@ -407,6 +434,16 @@ void KDUpdater::FileDownloader::setAuthenticator(const QAuthenticator &authentic
}
}
+bool KDUpdater::FileDownloader::ignoreSslErrors()
+{
+ return d->m_ignoreSslErrors;
+}
+
+void KDUpdater::FileDownloader::setIgnoreSslErrors(bool ignore)
+{
+ d->m_ignoreSslErrors = ignore;
+}
+
// -- KDUpdater::LocalFileDownloader
/*
@@ -778,6 +815,7 @@ struct KDUpdater::HttpDownloader::Private
destination->close();
destination->deleteLater();
destination = 0;
+ q->resetCheckSumData();
}
};
@@ -1024,11 +1062,13 @@ void KDUpdater::HttpDownloader::onAuthenticationRequired(QNetworkReply *reply, Q
}
#ifndef QT_NO_OPENSSL
+
+#include "messageboxhandler.h"
+
// TODO: once we switch to Qt5, use QT_NO_SSL instead of QT_NO_OPENSSL
void KDUpdater::HttpDownloader::onSslErrors(QNetworkReply* reply, const QList<QSslError> &errors)
{
Q_UNUSED(reply)
-
QString errorString;
foreach (const QSslError &error, errors) {
if (!errorString.isEmpty())
@@ -1037,7 +1077,36 @@ void KDUpdater::HttpDownloader::onSslErrors(QNetworkReply* reply, const QList<QS
}
qDebug() << errorString;
- if (!d->aborted)
- httpDone(true);
+ const QStringList arguments = QCoreApplication::arguments();
+ if (arguments.contains(QLatin1String("--script")) || arguments.contains(QLatin1String("Script"))
+ || ignoreSslErrors()) {
+ reply->ignoreSslErrors();
+ return;
+ }
+ // TODO: Remove above code once we have a proper implementation for message box handler supporting
+ // methods used in the following code, right now we return here cause the message box is not scriptable.
+
+ QMessageBox msgBox(MessageBoxHandler::currentBestSuitParent());
+ msgBox.setDetailedText(errorString);
+ msgBox.setIcon(QMessageBox::Warning);
+ msgBox.setWindowModality(Qt::WindowModal);
+ msgBox.setWindowTitle(tr("Secure Connection Failed"));
+ msgBox.setText(tr("There was an error during connection to: %1.").arg(url().toString()));
+ msgBox.setInformativeText(QString::fromLatin1("<ul><li>%1</li><li>%2</li></ul>").arg(tr("This could be "
+ "a problem with the server's configuration, or it could be someone trying to impersonate the "
+ "server."), tr("If you have connected to this server successfully in the past or trust this server, "
+ "the error may be temporary and you can try again.")));
+
+ msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
+ msgBox.setButtonText(QMessageBox::Yes, tr("Try again"));
+ msgBox.setDefaultButton(QMessageBox::Cancel);
+
+ if (msgBox.exec() == QMessageBox::Cancel) {
+ if (!d->aborted)
+ httpDone(true);
+ } else {
+ reply->ignoreSslErrors();
+ KDUpdater::FileDownloaderFactory::instance().setIgnoreSslErrors(true);
+ }
}
#endif
diff --git a/src/libs/kdtools/kdupdaterfiledownloader.h b/src/libs/kdtools/kdupdaterfiledownloader.h
index 5c5fab459..9e5929050 100644
--- a/src/libs/kdtools/kdupdaterfiledownloader.h
+++ b/src/libs/kdtools/kdupdaterfiledownloader.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_FILE_DOWNLOADER_H
#define KD_UPDATER_FILE_DOWNLOADER_H
@@ -32,7 +51,6 @@
namespace KDUpdater {
-class HashVerificationJob;
class FileDownloaderProxyFactory;
class KDTOOLS_EXPORT FileDownloader : public QObject
@@ -79,6 +97,9 @@ public:
QAuthenticator authenticator() const;
void setAuthenticator(const QAuthenticator &authenticator);
+ bool ignoreSslErrors();
+ void setIgnoreSslErrors(bool ignore);
+
public Q_SLOTS:
virtual void cancelDownload();
@@ -122,6 +143,7 @@ protected:
void addCheckSumData(const QByteArray &data);
void addCheckSumData(const char *data, int length);
+ void resetCheckSumData();
private Q_SLOTS:
virtual void doDownload() = 0;
diff --git a/src/libs/kdtools/kdupdaterfiledownloader_p.h b/src/libs/kdtools/kdupdaterfiledownloader_p.h
index 8c540d6af..c5019cae6 100644
--- a/src/libs/kdtools/kdupdaterfiledownloader_p.h
+++ b/src/libs/kdtools/kdupdaterfiledownloader_p.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_FILE_DOWNLOADER_P_H
#define KD_UPDATER_FILE_DOWNLOADER_P_H
diff --git a/src/libs/kdtools/kdupdaterfiledownloaderfactory.cpp b/src/libs/kdtools/kdupdaterfiledownloaderfactory.cpp
index 14f9ecee1..7f6e72efb 100644
--- a/src/libs/kdtools/kdupdaterfiledownloaderfactory.cpp
+++ b/src/libs/kdtools/kdupdaterfiledownloaderfactory.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdupdaterfiledownloaderfactory.h"
#include "kdupdaterfiledownloader_p.h"
@@ -46,6 +65,7 @@ struct FileDownloaderFactory::FileDownloaderFactoryData
~FileDownloaderFactoryData() { delete m_factory; }
bool m_followRedirects;
+ bool m_ignoreSslErrors;
FileDownloaderProxyFactory *m_factory;
};
@@ -71,6 +91,8 @@ FileDownloaderFactory::FileDownloaderFactory()
// TODO: once we switch to Qt5, use QT_NO_SSL instead of QT_NO_OPENSSL
if (QSslSocket::supportsSsl())
registerFileDownloader<HttpDownloader>(QLatin1String("https"));
+ else
+ qWarning() << "Could not register file downloader for https protocol: QSslSocket::supportsSsl() returns false";
#endif
d->m_followRedirects = false;
@@ -92,6 +114,16 @@ void FileDownloaderFactory::setProxyFactory(FileDownloaderProxyFactory *factory)
FileDownloaderFactory::instance().d->m_factory = factory;
}
+bool FileDownloaderFactory::ignoreSslErrors()
+{
+ return FileDownloaderFactory::instance().d->m_ignoreSslErrors;
+}
+
+void FileDownloaderFactory::setIgnoreSslErrors(bool ignore)
+{
+ FileDownloaderFactory::instance().d->m_ignoreSslErrors = ignore;
+}
+
FileDownloaderFactory::~FileDownloaderFactory()
{
delete d;
@@ -109,6 +141,7 @@ FileDownloader *FileDownloaderFactory::create(const QString &scheme, QObject *pa
downloader->setParent(parent);
downloader->setScheme(scheme);
downloader->setFollowRedirects(d->m_followRedirects);
+ downloader->setIgnoreSslErrors(d->m_ignoreSslErrors);
if (d->m_factory)
downloader->setProxyFactory(d->m_factory->clone());
}
diff --git a/src/libs/kdtools/kdupdaterfiledownloaderfactory.h b/src/libs/kdtools/kdupdaterfiledownloaderfactory.h
index e27cb6f7e..a4338e3ce 100644
--- a/src/libs/kdtools/kdupdaterfiledownloaderfactory.h
+++ b/src/libs/kdtools/kdupdaterfiledownloaderfactory.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_FILE_DOWNLOADER_FACTORY_H
#define KD_UPDATER_FILE_DOWNLOADER_FACTORY_H
@@ -66,6 +85,9 @@ public:
static void setProxyFactory(FileDownloaderProxyFactory *factory);
+ static bool ignoreSslErrors();
+ static void setIgnoreSslErrors(bool ignore);
+
private:
FileDownloaderFactory();
diff --git a/src/libs/kdtools/kdupdaterpackagesinfo.cpp b/src/libs/kdtools/kdupdaterpackagesinfo.cpp
index 9ac2b8eac..80c96dc5a 100644
--- a/src/libs/kdtools/kdupdaterpackagesinfo.cpp
+++ b/src/libs/kdtools/kdupdaterpackagesinfo.cpp
@@ -1,26 +1,46 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
#include "kdupdaterpackagesinfo.h"
-#include "kdupdaterapplication.h"
+#include "globals.h"
#include <QFileInfo>
#include <QtXml/QDomDocument>
@@ -65,7 +85,7 @@ using namespace KDUpdater;
*/
/*! \var UpdatePackagesInfo::Error UpdatePackagesInfo::InvalidXmlError
- * The source file contains invalid XML.
+ * The source file contains invalid XML.
*/
/*! \var UpdatePackagesInfo::Error UpdatePackagesInfo::InvalidContentError
@@ -75,18 +95,14 @@ using namespace KDUpdater;
struct PackagesInfo::PackagesInfoData
{
PackagesInfoData() :
- application(0),
error(PackagesInfo::NotYetReadError),
- compatLevel(-1),
modified(false)
{}
- Application *application;
QString errorMessage;
PackagesInfo::Error error;
QString fileName;
QString applicationName;
QString applicationVersion;
- int compatLevel;
bool modified;
QVector<PackageInfo> packageInfoList;
@@ -104,11 +120,10 @@ void PackagesInfo::PackagesInfoData::setInvalidContentError(const QString &detai
/*!
\internal
*/
-PackagesInfo::PackagesInfo(Application *application)
- : QObject(application),
+PackagesInfo::PackagesInfo(QObject *parent)
+ : QObject(parent),
d(new PackagesInfoData())
{
- d->application = application;
}
/*!
@@ -121,15 +136,6 @@ PackagesInfo::~PackagesInfo()
}
/*!
- Returns a pointer to the application, whose package information this class provides
- access to.
-*/
-Application *PackagesInfo::application() const
-{
- return d->application;
-}
-
-/*!
Returns true if the PackagesInfo are valid else false is returned in which case
the \a errorString() method can be used to receive a describing error message.
*/
@@ -233,14 +239,6 @@ PackageInfo PackagesInfo::packageInfo(int index) const
}
/*!
- Returns the compat level of the application.
-*/
-int PackagesInfo::compatLevel() const
-{
- return d->compatLevel;
-}
-
-/*!
This function returns the index of the package whose name is \c pkgName. If no such
package was found, this function returns -1.
*/
@@ -276,7 +274,7 @@ void PackagesInfo::refresh()
d->modified = false;
QFile file(d->fileName);
-
+
// if the file does not exist then we just skip the reading
if (!file.exists()) {
d->error = NotYetReadError;
@@ -331,8 +329,6 @@ void PackagesInfo::refresh()
d->applicationVersion = childNodeE.text();
else if (childNodeE.tagName() == QLatin1String("Package"))
d->addPackageFrom(childNodeE);
- else if (childNodeE.tagName() == QLatin1String("CompatLevel"))
- d->compatLevel = childNodeE.text().toInt();
}
d->error = NoError;
@@ -341,15 +337,6 @@ void PackagesInfo::refresh()
}
/*!
- Sets the application compat level.
-*/
-void PackagesInfo::setCompatLevel(int level)
-{
- d->compatLevel = level;
- d->modified = true;
-}
-
-/*!
Marks the package with \a name as installed in \a version.
*/
bool PackagesInfo::installPackage(const QString &name, const QString &version,
@@ -433,8 +420,6 @@ void PackagesInfo::writeToDisk()
addTextChildHelper(&root, QLatin1String("ApplicationName"), d->applicationName);
addTextChildHelper(&root, QLatin1String("ApplicationVersion"), d->applicationVersion);
- if (d->compatLevel != -1)
- addTextChildHelper(&root, QLatin1String( "CompatLevel" ), QString::number(d->compatLevel));
Q_FOREACH (const PackageInfo &info, d->packageInfoList) {
QDomElement package = doc.createElement(QLatin1String("Package"));
@@ -511,9 +496,10 @@ void PackagesInfo::PackagesInfoData::addPackageFrom(const QDomElement &packageE)
info.virtualComp = childNodeE.text().toLower() == QLatin1String("true") ? true : false;
else if (childNodeE.tagName() == QLatin1String("Size"))
info.uncompressedSize = childNodeE.text().toULongLong();
- else if (childNodeE.tagName() == QLatin1String("Dependencies"))
- info.dependencies = childNodeE.text().split(scCommaRegExp, QString::SkipEmptyParts);
- else if (childNodeE.tagName() == QLatin1String("ForcedInstallation"))
+ else if (childNodeE.tagName() == QLatin1String("Dependencies")) {
+ info.dependencies = childNodeE.text().split(QInstaller::commaRegExp(),
+ QString::SkipEmptyParts);
+ } else if (childNodeE.tagName() == QLatin1String("ForcedInstallation"))
info.forcedInstallation = childNodeE.text().toLower() == QLatin1String( "true" ) ? true : false;
else if (childNodeE.tagName() == QLatin1String("LastUpdateDate"))
info.lastUpdateDate = QDate::fromString(childNodeE.text(), Qt::ISODate);
diff --git a/src/libs/kdtools/kdupdaterpackagesinfo.h b/src/libs/kdtools/kdupdaterpackagesinfo.h
index a70a70568..1fe19aa18 100644
--- a/src/libs/kdtools/kdupdaterpackagesinfo.h
+++ b/src/libs/kdtools/kdupdaterpackagesinfo.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_PACKAGES_INFO_H
#define KD_UPDATER_PACKAGES_INFO_H
@@ -33,9 +52,6 @@
namespace KDUpdater {
-class Application;
-class UpdateInstaller;
-
struct KDTOOLS_EXPORT PackageInfo
{
QString name;
@@ -69,8 +85,6 @@ public:
InvalidContentError
};
- Application *application() const;
-
bool isValid() const;
QString errorString() const;
Error error() const;
@@ -91,9 +105,6 @@ public:
QVector<KDUpdater::PackageInfo> packageInfos() const;
void writeToDisk();
- int compatLevel() const;
- void setCompatLevel(int level);
-
bool installPackage(const QString &pkgName, const QString &version, const QString &title = QString(),
const QString &description = QString(), const QStringList &dependencies = QStringList(),
bool forcedInstallation = false, bool virtualComp = false, quint64 uncompressedSize = 0,
@@ -109,11 +120,10 @@ Q_SIGNALS:
void reset();
protected:
- explicit PackagesInfo(Application *application = 0);
+ friend class Application;
+ explicit PackagesInfo(QObject *parent = 0);
private:
- friend class Application;
- friend class UpdateInstaller;
struct PackagesInfoData;
PackagesInfoData *d;
};
diff --git a/src/libs/kdtools/kdupdatersignatureverificationrunnable.cpp b/src/libs/kdtools/kdupdatersignatureverificationrunnable.cpp
deleted file mode 100644
index 1e00ca43f..000000000
--- a/src/libs/kdtools/kdupdatersignatureverificationrunnable.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
-**
-** This file is part of the KD Tools library.
-**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
-**
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
-**
-**********************************************************************/
-
-#include "kdupdatersignatureverificationrunnable.h"
-#include "kdupdatersignatureverifier.h"
-#include "kdupdatersignatureverificationresult.h"
-
-#include <QByteArray>
-#include <QIODevice>
-#include <QMetaObject>
-#include <QObject>
-#include <QPointer>
-#include <QThreadPool>
-#include <QVariant>
-#include <QVector>
-
-#include <cassert>
-
-using namespace KDUpdater;
-
-class Runnable::Private {
-public:
- QVector<QObject*> receivers;
- QVector<QByteArray> methods;
-};
-
-Runnable::Runnable() : QRunnable(), d( new Private ) {
-}
-
-Runnable::~Runnable() {
- delete d;
-}
-
-
-void Runnable::addResultListener( QObject* receiver, const char* method ) {
- d->receivers.push_back( receiver );
- d->methods.push_back( QByteArray( method ) );
-}
-
-void Runnable::emitResult( const QGenericArgument& arg0,
- const QGenericArgument& arg1,
- const QGenericArgument& arg2,
- const QGenericArgument& arg3,
- const QGenericArgument& arg4,
- const QGenericArgument& arg5,
- const QGenericArgument& arg6,
- const QGenericArgument& arg7,
- const QGenericArgument& arg8,
- const QGenericArgument& arg9 ) {
- assert( d->receivers.size() == d->methods.size() );
- for ( int i = 0; i < d->receivers.size(); ++i ) {
- QMetaObject::invokeMethod( d->receivers[i],
- d->methods[i].constData(),
- Qt::QueuedConnection,
- arg0,
- arg1,
- arg2,
- arg3,
- arg4,
- arg5,
- arg6,
- arg7,
- arg8,
- arg9 );
- }
-}
-
-class SignatureVerificationRunnable::Private {
-public:
- Private() : verifier( 0 ) {}
- const SignatureVerifier* verifier;
- QPointer<QIODevice> device;
- QByteArray signature;
-};
-
-SignatureVerificationRunnable::SignatureVerificationRunnable() : Runnable(), d( new Private ) {
-}
-
-SignatureVerificationRunnable::~SignatureVerificationRunnable() {
- delete d;
-}
-
-const SignatureVerifier* SignatureVerificationRunnable::verifier() const {
- return d->verifier;
-}
-
-void SignatureVerificationRunnable::setVerifier( const SignatureVerifier* verifier ) {
- delete d->verifier;
- d->verifier = verifier ? verifier->clone() : 0;
-}
-
-QByteArray SignatureVerificationRunnable::signature() const {
- return d->signature;
-}
-
-void SignatureVerificationRunnable::setSignature( const QByteArray& sig ) {
- d->signature = sig;
-}
-
-QIODevice* SignatureVerificationRunnable::data() const {
- return d->device;
-}
-
-void SignatureVerificationRunnable::setData( QIODevice* device ) {
- d->device = device;
-}
-
-
-void SignatureVerificationRunnable::run() {
- QThreadPool::globalInstance()->releaseThread();
- const SignatureVerificationResult result = d->verifier->verify( d->device->readAll(), d->signature );
- QThreadPool::globalInstance()->reserveThread();
- delete d->verifier;
- delete d->device;
- emitResult( Q_ARG( KDUpdater::SignatureVerificationResult, result ) );
-}
-
-
diff --git a/src/libs/kdtools/kdupdatersignatureverificationrunnable.h b/src/libs/kdtools/kdupdatersignatureverificationrunnable.h
deleted file mode 100644
index 901689253..000000000
--- a/src/libs/kdtools/kdupdatersignatureverificationrunnable.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
-**
-** This file is part of the KD Tools library.
-**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
-**
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
-**
-**********************************************************************/
-
-#ifndef KDUPDATERSIGNATUREVERIFICATIONJOB_H
-#define KDUPDATERSIGNATUREVERIFICATIONJOB_H
-
-#include <kdtoolsglobal.h>
-
-#include <QtCore/QGenericArgument>
-#include <QtCore/QRunnable>
-
-QT_BEGIN_NAMESPACE
-class QByteArray;
-class QIODevice;
-class QObject;
-template <typename T> class QVector;
-QT_END_NAMESPACE
-
-namespace KDUpdater {
-
-class SignatureVerifier;
-class SignatureVerificationResult;
-
-class Runnable : public QRunnable
-{
-public:
- Runnable();
- ~Runnable();
-
- void addResultListener(QObject *receiver, const char *method);
-
-protected:
- void emitResult(const QGenericArgument &arg0 = QGenericArgument(0),
- const QGenericArgument &arg1 = QGenericArgument(),
- const QGenericArgument &arg2 = QGenericArgument(),
- const QGenericArgument &arg3 = QGenericArgument(),
- const QGenericArgument &arg4 = QGenericArgument(),
- const QGenericArgument &arg5 = QGenericArgument(),
- const QGenericArgument &arg6 = QGenericArgument(),
- const QGenericArgument &arg7 = QGenericArgument(),
- const QGenericArgument &arg8 = QGenericArgument(),
- const QGenericArgument &arg9 = QGenericArgument());
-
-private:
- class Private;
- Private *d;
-};
-
-class SignatureVerificationRunnable : public Runnable
-{
-public:
- explicit SignatureVerificationRunnable();
- ~SignatureVerificationRunnable();
-
- const SignatureVerifier *verifier() const;
- void setVerifier(const SignatureVerifier *verifier);
-
- QByteArray signature() const;
- void setSignature(const QByteArray &sig);
-
- QIODevice *data() const;
- void setData(QIODevice *device);
-
- void run();
-
-private:
- class Private;
- Private *d;
-};
-
-} // namespace KDUpdater
-
-#endif // KDUPDATERSIGNATUREVERIFICATIONJOB_H
diff --git a/src/libs/kdtools/kdupdatertask.cpp b/src/libs/kdtools/kdupdatertask.cpp
index fb8118fbd..187bcdae7 100644
--- a/src/libs/kdtools/kdupdatertask.cpp
+++ b/src/libs/kdtools/kdupdatertask.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdupdatertask.h"
diff --git a/src/libs/kdtools/kdupdatertask.h b/src/libs/kdtools/kdupdatertask.h
index 4b2b2e4f5..3b1f86129 100644
--- a/src/libs/kdtools/kdupdatertask.h
+++ b/src/libs/kdtools/kdupdatertask.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_TASK_H
#define KD_UPDATER_TASK_H
diff --git a/src/libs/kdtools/kdupdaterupdate.cpp b/src/libs/kdtools/kdupdaterupdate.cpp
index 0ae2ebfaf..c6b0775e8 100644
--- a/src/libs/kdtools/kdupdaterupdate.cpp
+++ b/src/libs/kdtools/kdupdaterupdate.cpp
@@ -1,34 +1,45 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdupdaterupdate.h"
-#include "kdupdaterapplication.h"
-#include "kdupdaterupdatesourcesinfo.h"
-#include "kdupdaterfiledownloader_p.h"
-#include "kdupdaterfiledownloaderfactory.h"
-#include "kdupdaterupdateoperations.h"
-#include "kdupdaterupdateoperationfactory.h"
-
-#include <QFile>
using namespace KDUpdater;
@@ -37,124 +48,22 @@ using namespace KDUpdater;
\class KDUpdater::Update kdupdaterupdate.h KDUpdaterUpdate
\brief Represents a single update
- The KDUpdater::Update class contains information and mechanisms to download one update. It is
- created by KDUpdater::UpdateFinder and is used by KDUpdater::UpdateInstaller to download the UpdateFile
+ The KDUpdater::Update class contains information about an update. It is created by KDUpdater::UpdateFinder
corresponding to the update.
- The class makes use of appropriate network protocols (HTTP, HTTPS, FTP, or Local File Copy) to
- download the UpdateFile.
-
The constructor of the KDUpdater::Update class is made protected, because it can be instantiated only by
KDUpdater::UpdateFinder (which is a friend class). The destructor however is public.
*/
-struct Update::UpdateData
-{
- UpdateData(Update *qq) :
- q(qq),
- application(0),
- compressedSize(0),
- uncompressedSize(0)
- {}
-
- Update *q;
- Application *application;
- UpdateSourceInfo sourceInfo;
- QHash<QString, QVariant> data;
- QUrl updateUrl;
- UpdateType type;
- QList<UpdateOperation *> operations;
- QByteArray sha1sum;
-
- quint64 compressedSize;
- quint64 uncompressedSize;
-
- FileDownloader *fileDownloader;
-};
-
/*!
\internal
*/
-Update::Update(Application *application, const UpdateSourceInfo &sourceInfo,
- UpdateType type, const QUrl &updateUrl, const QHash<QString, QVariant> &data,
- quint64 compressedSize, quint64 uncompressedSize, const QByteArray &sha1sum)
- : Task(QLatin1String("Update"), Stoppable, application),
- d(new UpdateData(this))
-{
- d->application = application;
- d->sourceInfo = sourceInfo;
- d->data = data;
- d->updateUrl = updateUrl;
- d->type = type;
-
- d->compressedSize = compressedSize;
- d->uncompressedSize = uncompressedSize;
- d->sha1sum = sha1sum;
-
- d->fileDownloader = FileDownloaderFactory::instance().create(updateUrl.scheme(), this);
- if (d->fileDownloader) {
- d->fileDownloader->setUrl(d->updateUrl);
- d->fileDownloader->setAssumedSha1Sum(d->sha1sum);
- connect(d->fileDownloader, SIGNAL(downloadProgress(double)), this, SLOT(downloadProgress(double)));
- connect(d->fileDownloader, SIGNAL(downloadCanceled()), this, SIGNAL(stopped()));
- connect(d->fileDownloader, SIGNAL(downloadCompleted()), this, SIGNAL(finished()));
- }
-
- switch (type) {
- case NewPackage:
- case PackageUpdate: {
- UpdateOperation *packageOperation = UpdateOperationFactory::instance().create(QLatin1String("UpdatePackage"));
- QStringList args;
- args << data.value(QLatin1String("Name")).toString()
- << data.value(QLatin1String("Version")).toString()
- << data.value(QLatin1String("ReleaseDate")).toString();
- packageOperation->setArguments(args);
- packageOperation->setApplication(application);
- d->operations.append(packageOperation);
- break;
- }
- case CompatUpdate: {
- UpdateOperation *compatOperation = UpdateOperationFactory::instance().create(QLatin1String("UpdateCompatLevel"));
- QStringList args;
- args << data.value(QLatin1String("CompatLevel")).toString();
- compatOperation->setArguments(args);
- compatOperation->setApplication(application);
- d->operations.append(compatOperation);
- break;
- }
- default:
- break;
- }
-}
-
-/*!
- Destructor
-*/
-Update::~Update()
-{
- const QString fileName = this->downloadedFileName();
- if (!fileName.isEmpty())
- QFile::remove(fileName);
- qDeleteAll(d->operations);
- d->operations.clear();
- delete d;
-}
-
-/*!
- Returns the application for which this class is downloading the UpdateFile
-*/
-Application *Update::application() const
-{
- return d->application;
-}
-
-/*!
- Returns the release date of the update downloaded by this class
-*/
-QDate Update::releaseDate() const
+Update::Update(int priority, const QUrl &sourceInfoUrl, const QHash<QString, QVariant> &data)
+ : m_priority(priority)
+ , m_sourceInfoUrl(sourceInfoUrl)
+ , m_data(data)
{
- return d->data.value(QLatin1String("ReleaseDate")).toDate();
}
/*!
@@ -162,150 +71,15 @@ QDate Update::releaseDate() const
*/
QVariant Update::data(const QString &name, const QVariant &defaultValue) const
{
- if (d->data.contains(name))
- return d->data.value(name);
- return defaultValue;
-}
-
-/*!
- Returns the complete URL of the UpdateFile downloaded by this class.
-*/
-QUrl Update::updateUrl() const
-{
- return d->updateUrl;
-}
-
-/*!
- Returns the update source info on which this update was created.
-*/
-UpdateSourceInfo Update::sourceInfo() const
-{
- return d->sourceInfo;
-}
-
-/*!
- * Returns the type of update
- */
-UpdateType Update::type() const
-{
- return d->type;
-}
-
-/*!
- Returns true of the update can be downloaded, false otherwise. The function
- returns false if the URL scheme is not supported by this class.
-*/
-bool Update::canDownload() const
-{
- return d->fileDownloader && d->fileDownloader->canDownload();
-}
-
-/*!
- Returns true of the update has been downloaded. If this function returns true
- the you can use the \ref downloadedFileName() method to get the complete name
- of the downloaded UpdateFile.
-
- \note: The downloaded UpdateFile will be deleted when this class is destroyed
-*/
-bool Update::isDownloaded() const
-{
- return d->fileDownloader && d->fileDownloader->isDownloaded();
-}
-
-/*!
- Returns the name of the downloaded UpdateFile after the download is complete, ie
- when \ref isDownloaded() returns true.
-*/
-QString Update::downloadedFileName() const
-{
- if (d->fileDownloader)
- return d->fileDownloader->downloadedFileName();
-
- return QString();
-}
-
-/*!
- \internal
-*/
-void Update::downloadProgress(double value)
-{
- Q_ASSERT(value <= 1);
- reportProgress(value * 100, tr("Downloading update..."));
+ return m_data.value(name, defaultValue);
}
-/*!
- \internal
-*/
-void Update::downloadCompleted()
+int Update::priority() const
{
- reportProgress(100, tr("Update downloaded"));
- reportDone();
+ return m_priority;
}
-/*!
- \internal
-*/
-void Update::downloadAborted(const QString &msg)
-{
- reportError(msg);
-}
-
-/*!
- \internal
-*/
-void Update::doRun()
-{
- if (d->fileDownloader)
- d->fileDownloader->download();
-}
-
-/*!
- \internal
-*/
-bool Update::doStop()
-{
- if (d->fileDownloader)
- d->fileDownloader->cancelDownload();
- return true;
-}
-
-/*!
- \internal
-*/
-bool Update::doPause()
-{
- return false;
-}
-
-/*!
- \internal
-*/
-bool Update::doResume()
-{
- return false;
-}
-
-/*!
- Returns a list of operations needed by this update. For example, package update needs to change
- the package version, compat update needs to change the compat level...
- */
-QList<UpdateOperation *> Update::operations() const
-{
- return d->operations;
-}
-
-/*!
- * Returns the compressed size of this update's data file.
- */
-quint64 Update::compressedSize() const
-{
- return d->compressedSize;
-}
-
-/*!
- * Returns the uncompressed size of this update's data file.
- */
-quint64 Update::uncompressedSize() const
+QUrl Update::sourceInfoUrl() const
{
- return d->uncompressedSize;
+ return m_sourceInfoUrl;
}
diff --git a/src/libs/kdtools/kdupdaterupdate.h b/src/libs/kdtools/kdupdaterupdate.h
index 17250a71e..ec9c56d24 100644
--- a/src/libs/kdtools/kdupdaterupdate.h
+++ b/src/libs/kdtools/kdupdaterupdate.h
@@ -1,87 +1,69 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_UPDATE_H
#define KD_UPDATER_UPDATE_H
-#include "kdupdater.h"
-#include "kdupdatertask.h"
-
-#include <QUrl>
-#include <QDate>
#include <QHash>
+#include <QUrl>
#include <QVariant>
-#include <QList>
namespace KDUpdater {
-class Application;
-struct UpdateSourceInfo;
-class UpdateFinder;
-class UpdateOperation;
-
-class KDTOOLS_EXPORT Update : public Task
+class Update
{
- Q_OBJECT
-
public:
- ~Update();
+ QVariant data(const QString &name, const QVariant &defaultValue = QVariant()) const;
- Application *application() const;
-
- UpdateType type() const;
- QUrl updateUrl() const;
- QDate releaseDate() const;
- QVariant data(const QString &m_name, const QVariant &defaultValue = QVariant()) const;
- UpdateSourceInfo sourceInfo() const;
-
- bool canDownload() const;
- bool isDownloaded() const;
- void download() { run(); }
- QString downloadedFileName() const;
-
- QList<UpdateOperation *> operations() const;
-
- quint64 compressedSize() const;
- quint64 uncompressedSize() const;
-
-private Q_SLOTS:
- void downloadProgress(double);
- void downloadAborted(const QString &msg);
- void downloadCompleted();
+ int priority() const;
+ QUrl sourceInfoUrl() const;
private:
friend class UpdateFinder;
- struct UpdateData;
- UpdateData *d;
-
- void doRun();
- bool doStop();
- bool doPause();
- bool doResume();
+ Update(int p, const QUrl &sourceInfoUrl, const QHash<QString, QVariant> &data);
- Update(Application *application, const UpdateSourceInfo &sourceInfo,
- UpdateType type, const QUrl &updateUrl, const QHash<QString, QVariant> &data,
- quint64 compressedSize, quint64 uncompressedSize, const QByteArray &sha1sum);
+private:
+ int m_priority;
+ QUrl m_sourceInfoUrl;
+ QHash<QString, QVariant> m_data;
};
} // namespace KDUpdater
diff --git a/src/libs/kdtools/kdupdaterupdatefinder.cpp b/src/libs/kdtools/kdupdaterupdatefinder.cpp
index caa66982e..f37fa9244 100644
--- a/src/libs/kdtools/kdupdaterupdatefinder.cpp
+++ b/src/libs/kdtools/kdupdaterupdatefinder.cpp
@@ -1,36 +1,56 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdupdaterupdatefinder.h"
#include "kdupdaterapplication.h"
#include "kdupdaterupdatesourcesinfo.h"
#include "kdupdaterpackagesinfo.h"
#include "kdupdaterupdate.h"
-#include "kdupdaterfiledownloader_p.h"
+#include "kdupdaterfiledownloader.h"
#include "kdupdaterfiledownloaderfactory.h"
#include "kdupdaterupdatesinfo_p.h"
+#include "globals.h"
+
#include <QCoreApplication>
-#include <QDebug>
using namespace KDUpdater;
@@ -80,11 +100,8 @@ using namespace KDUpdater;
class UpdateFinder::Private
{
public:
- Private(UpdateFinder *qq) :
- q(qq),
- application(0),
- updateType(PackageUpdate)
- {}
+ Private(UpdateFinder *qq)
+ : q(qq), application(0) {}
~Private()
{
@@ -92,11 +109,10 @@ public:
qDeleteAll(updatesInfoList);
qDeleteAll(updateXmlFDList);
}
-
+
UpdateFinder *q;
Application *application;
QList<Update *> updates;
- UpdateTypes updateType;
// Temporary structure that notes down information about updates.
bool cancel;
@@ -111,12 +127,9 @@ public:
bool downloadUpdateXMLFiles();
bool computeApplicableUpdates();
- QList<UpdateInfo> applicableUpdates(UpdatesInfo *updatesInfo,
- bool addNewPackages = false);
- void createUpdateObjects(const UpdateSourceInfo &sourceInfo,
- const QList<UpdateInfo> &updateInfoList);
- bool checkForUpdatePriority(const UpdateSourceInfo &sourceInfo,
- const UpdateInfo &updateInfo);
+ QList<UpdateInfo> applicableUpdates(UpdatesInfo *updatesInfo);
+ void createUpdateObjects(const UpdateSourceInfo &sourceInfo, const QList<UpdateInfo> &updateInfoList);
+ bool checkForUpdatePriority(const UpdateSourceInfo &sourceInfo, const UpdateInfo &updateInfo);
void slotDownloadDone();
};
@@ -174,8 +187,8 @@ void UpdateFinder::Private::computeUpdates()
// 1. Downloading Update XML files from all the update sources
// 2. Matching updates with Package XML and figuring out available updates
- cancel = false;
clear();
+ cancel = false;
// First do some quick sanity checks on the packages info
PackagesInfo *packages = application->packagesInfo();
@@ -257,8 +270,8 @@ bool UpdateFinder::Private::downloadUpdateXMLFiles()
// Create FileDownloader and UpdatesInfo for each update
for (int i = 0; i < updateSources->updateSourceInfoCount(); i++) {
- UpdateSourceInfo info = updateSources->updateSourceInfo(i);
- QUrl updateXmlUrl = QString::fromLatin1("%1/Updates.xml").arg(info.url.toString());
+ const UpdateSourceInfo info = updateSources->updateSourceInfo(i);
+ const QUrl updateXmlUrl = QString::fromLatin1("%1/Updates.xml").arg(info.url.toString());
FileDownloader *downloader = FileDownloaderFactory::instance().create(updateXmlUrl.scheme(), q);
if (!downloader)
@@ -267,82 +280,49 @@ bool UpdateFinder::Private::downloadUpdateXMLFiles()
downloader->setUrl(updateXmlUrl);
downloader->setAutoRemoveDownloadedFile(true);
- UpdatesInfo *updatesInfo = new UpdatesInfo;
updateSourceInfoList.append(info);
updateXmlFDList.append(downloader);
- updatesInfoList.append(updatesInfo);
-
- connect(downloader, SIGNAL(downloadCompleted()),
- q, SLOT(slotDownloadDone()));
- connect(downloader, SIGNAL(downloadCanceled()),
- q, SLOT(slotDownloadDone()));
- connect(downloader, SIGNAL(downloadAborted(QString)),
- q, SLOT(slotDownloadDone()));
+ updatesInfoList.append(new UpdatesInfo);
+
+ connect(downloader, SIGNAL(downloadCompleted()), q, SLOT(slotDownloadDone()));
+ connect(downloader, SIGNAL(downloadCanceled()), q, SLOT(slotDownloadDone()));
+ connect(downloader, SIGNAL(downloadAborted(QString)), q, SLOT(slotDownloadDone()));
}
// Trigger download of Updates.xml file
downloadCompleteCount = 0;
- for (int i = 0; i < updateXmlFDList.count(); i++) {
- FileDownloader *downloader = updateXmlFDList.at(i);
+ foreach (FileDownloader *const downloader, updateXmlFDList)
downloader->download();
- }
// Wait until all downloaders have completed their downloads.
while (true) {
QCoreApplication::processEvents();
if (cancel)
return false;
+
if (downloadCompleteCount == updateXmlFDList.count())
break;
- int pc = computePercent(downloadCompleteCount, updateXmlFDList.count());
- q->reportProgress(pc, tr("Downloading Updates.xml from update sources."));
+ q->reportProgress(computePercent(downloadCompleteCount, updateXmlFDList.count()),
+ tr("Downloading Updates.xml from update sources."));
}
- // All the downloaders have now either downloaded or aborted the
- // download of update XML files.
-
- // Let's now get rid of update sources whose Updates.xml could not be downloaded
- for (int i = 0; i < updateXmlFDList.count(); i++) {
- FileDownloader *downloader = updateXmlFDList.at(i);
- if (downloader->isDownloaded())
- continue;
-
- UpdateSourceInfo info = updateSourceInfoList.at(i);
- QString msg = tr("Could not download updates from %1 ('%2')").arg(info.name, info.url.toString());
- q->reportError(msg);
-
- delete updatesInfoList[i];
- delete downloader;
- updateXmlFDList.removeAt(i);
- updatesInfoList.removeAt(i);
- updateSourceInfoList.removeAt(i);
- --i;
- }
-
- if (updatesInfoList.isEmpty())
- return false;
-
- // Lets parse the downloaded update XML files and get rid of the downloaders.
- for (int i = 0; i < updateXmlFDList.count(); i++) {
- FileDownloader *downloader = updateXmlFDList.at(i);
- UpdatesInfo *updatesInfo = updatesInfoList.at(i);
-
- updatesInfo->setFileName(downloader->downloadedFileName());
-
- if (!updatesInfo->isValid()) {
- QString msg = updatesInfo->errorString();
- q->reportError(msg);
-
- delete updatesInfoList[i];
- delete downloader;
- updateXmlFDList.removeAt(i);
- updatesInfoList.removeAt(i);
- --i;
+ for (int i = updateXmlFDList.count() - 1; i >= 0; --i) {
+ UpdatesInfo *const updatesInfo = updatesInfoList.at(i);
+ FileDownloader *const downloader = updateXmlFDList.takeAt(i);
+ if (downloader->isDownloaded()) {
+ updatesInfo->setFileName(downloader->downloadedFileName());
+ if (!updatesInfo->isValid()) {
+ q->reportError(updatesInfo->errorString());
+ delete updatesInfoList.takeAt(i); // updates info
+ }
+ } else {
+ delete updatesInfoList.takeAt(i); // updates info
+ const UpdateSourceInfo info = updateSourceInfoList.takeAt(i);
+ q->reportError(tr("Could not download updates from %1 ('%2')").arg(info.name, info.url.toString()));
}
+ delete downloader;
}
- qDeleteAll(updateXmlFDList);
- updateXmlFDList.clear();
if (updatesInfoList.isEmpty())
return false;
@@ -361,109 +341,43 @@ bool UpdateFinder::Private::downloadUpdateXMLFiles()
*/
bool UpdateFinder::Private::computeApplicableUpdates()
{
- if (updateType & CompatUpdate) {
- UpdateInfo compatUpdateInfo;
- UpdateSourceInfo compatUpdateSourceInfo;
-
- // Required compat level
- int reqCompatLevel = application->compatLevel() + 1;
-
- q->reportProgress(60, tr("Looking for compatibility update..."));
-
- // We are only interested in compat updates.
- for (int i = 0; i < updatesInfoList.count(); i++) {
- UpdatesInfo *info = updatesInfoList.at(i);
- UpdateSourceInfo updateSource = updateSourceInfoList.at(i);
-
- // If we already have a compat update, just check if the source currently being
- // considered has a higher priority or not.
- if (compatUpdateInfo.data.contains(QLatin1String("CompatLevel")) && updateSource.priority < compatUpdateSourceInfo.priority)
- continue;
-
- // Let's look for compat updates that provide compat level one-higher than
- // the application's current compat level.
- QList<UpdateInfo> updatesInfo = info->updatesInfo(CompatUpdate, reqCompatLevel);
-
- if (updatesInfo.count() == 0)
- continue;
-
- compatUpdateInfo = updatesInfo.at(0);
- compatUpdateSourceInfo = updateSource;
- }
-
- bool found = compatUpdateInfo.data.contains(QLatin1String("CompatLevel"));
- if (found) {
- q->reportProgress(80, tr("Found compatibility update."));
-
- if (compatUpdateInfo.updateFiles.isEmpty()) {
- q->reportError(tr("Update not found."));
- q->reportProgress(100, tr("Update not found."));
- return false;
- }
-
- UpdateFileInfo fileInfo = compatUpdateInfo.updateFiles.at(0);
-
- // Create an update for this entry
- QUrl url = QString::fromLatin1("%1/%2").arg( compatUpdateSourceInfo.url.toString(), fileInfo.fileName);
- Update *update = q->constructUpdate(application, compatUpdateSourceInfo, CompatUpdate,
- url, compatUpdateInfo.data, fileInfo.compressedSize,
- fileInfo.uncompressedSize, fileInfo.sha1sum);
-
- // Register the update
- updates.append(update);
+ for (int i = 0; i < updatesInfoList.count(); i++) {
+ // Fetch updates applicable to this application.
+ QList<UpdateInfo> updates = applicableUpdates(updatesInfoList.at(i));
+ if (!updates.count())
+ continue;
- // Done
- q->reportProgress(100, tr("Compatibility update found."));
- } else {
- q->reportProgress(100, tr("No compatibility updates found."));
- }
- }
- if (updateType & PackageUpdate) {
- // We are looking for normal updates, not compat ones.
- for (int i = 0; i < updatesInfoList.count(); i++) {
- // Fetch updates applicable to this application.
- UpdatesInfo *info = updatesInfoList.at(i);
- QList<UpdateInfo> updates = applicableUpdates(info , updateType & NewPackage);
- if (!updates.count())
- continue;
-
- if (cancel)
- return false;
- UpdateSourceInfo updateSource = updateSourceInfoList.at(i);
+ if (cancel)
+ return false;
+ const UpdateSourceInfo updateSource = updateSourceInfoList.at(i);
- // Create Update objects for updates that have a valid
- // UpdateFile
- createUpdateObjects(updateSource, updates);
- if (cancel)
- return false;
+ // Create Update objects for updates that have a valid
+ // UpdateFile
+ createUpdateObjects(updateSource, updates);
+ if (cancel)
+ return false;
- // Report progress
- int pc = computePercent(i, updatesInfoList.count());
- pc = computeProgressPercentage(51, 100, pc);
- q->reportProgress(pc, tr("Computing applicable updates."));
- }
+ // Report progress
+ q->reportProgress(computeProgressPercentage(51, 100, computePercent(i, updatesInfoList.count())),
+ tr("Computing applicable updates."));
}
q->reportProgress(99, tr("Application updates computed."));
return true;
}
-QList<UpdateInfo> UpdateFinder::Private::applicableUpdates(UpdatesInfo *updatesInfo, bool addNewPackages)
+QList<UpdateInfo> UpdateFinder::Private::applicableUpdates(UpdatesInfo *updatesInfo)
{
- QList<UpdateInfo> retList;
-
- if (!updatesInfo || updatesInfo->updateInfoCount( PackageUpdate ) == 0)
- return retList;
+ const QList<UpdateInfo> dummy;
+ if (!updatesInfo || updatesInfo->updateInfoCount() == 0)
+ return dummy;
PackagesInfo *packages = this->application->packagesInfo();
if (!packages)
- return retList;
+ return dummy;
// Check to see if the updates info contains updates for any application
- bool anyApp = updatesInfo->applicationName() == QLatin1String("{AnyApplication}");
- int appNameIndex = -1;
-
- if (!anyApp) {
+ if (updatesInfo->applicationName() != QLatin1String("{AnyApplication}")) {
// updatesInfo->applicationName() describes one application or a series of
// application names separated by commas.
QString appName = updatesInfo->applicationName();
@@ -471,90 +385,28 @@ QList<UpdateInfo> UpdateFinder::Private::applicableUpdates(UpdatesInfo *updatesI
appName = appName.replace(QLatin1String( " ," ), QLatin1String( "," ));
// Catch hold of app names contained updatesInfo->applicationName()
- QStringList apps = appName.split(scCommaRegExp, QString::SkipEmptyParts);
- appNameIndex = apps.indexOf(this->application->applicationName());
-
- // If the application appName isn't one of the app names, then
- // the updates are not applicable.
- if (appNameIndex < 0)
- return retList;
+ // If the application appName isn't one of the app names, then the updates are not applicable.
+ const QStringList apps = appName.split(QInstaller::commaRegExp(), QString::SkipEmptyParts);
+ if (apps.indexOf(this->application->applicationName()) < 0)
+ return dummy;
}
-
- // Check to see if version numbers match. This means that the version
- // number of the update should be greater than the version number of
- // the package that is currently installed.
- QList<UpdateInfo> updateList = updatesInfo->updatesInfo(PackageUpdate);
- for (int i = 0; i < updatesInfo->updateInfoCount(PackageUpdate); i++) {
- UpdateInfo updateInfo = updateList.at(i);
- if (!addNewPackages) {
- int pkgInfoIdx = packages->findPackageInfo( updateInfo.data.value(QLatin1String("Name")).toString());
- if (pkgInfoIdx < 0)
- continue;
-
- PackageInfo pkgInfo = packages->packageInfo(pkgInfoIdx);
-
- // First check to see if the update version is higher than package version
- QString updateVersion = updateInfo.data.value(QLatin1String("Version")).toString();
- QString pkgVersion = pkgInfo.version;
- if (KDUpdater::compareVersion(updateVersion, pkgVersion) <= 0)
- continue;
-
- // It is quite possible that we may have already installed the update.
- // Lets check the last update date of the package and the release date
- // of the update. This way we can compare and figure out if the update
- // has been installed or not.
- QDate pkgDate = pkgInfo.lastUpdateDate;
- QDate updateDate = updateInfo.data.value(QLatin1String("ReleaseDate")).toDate();
- if (pkgDate > updateDate)
- continue;
- }
-
- // Bingo, we found an update :-)
- retList.append(updateInfo);
- }
-
- return retList;
+ return updatesInfo->updatesInfo();
}
-void UpdateFinder::Private::createUpdateObjects(const UpdateSourceInfo &sourceInfo, const QList<UpdateInfo> &updateInfoList)
+void UpdateFinder::Private::createUpdateObjects(const UpdateSourceInfo &sourceInfo,
+ const QList<UpdateInfo> &updateInfoList)
{
- for (int i = 0; i < updateInfoList.count(); i++) {
- UpdateInfo info = updateInfoList.at(i);
- // Compat level checks
- if (info.data.contains(QLatin1String("RequiredCompatLevel")) &&
- info.data.value(QLatin1String("RequiredCompatLevel")).toInt() != application->compatLevel())
- {
- qDebug().nospace() << "Update \"" << info.data.value( QLatin1String( "Name" ) ).toString()
- << "\" at \"" << sourceInfo.name << "\"(\"" << sourceInfo.url.toString()
- << "\") requires a different compat level";
- continue; // Compatibility level mismatch
- }
-
- // If another update of the same name exists, then use the update coming from
- // a higher priority.
+ foreach (const UpdateInfo &info, updateInfoList) {
+ // If another update of the same name exists, then use the update coming from a higher priority.
if (!checkForUpdatePriority(sourceInfo, info)) {
- qDebug().nospace() << "Skipping Update \""
- << info.data.value(QLatin1String("Name")).toString()
- << "\" from \""
- << sourceInfo.name
- << "\"(\""
- << sourceInfo.url.toString()
- << "\") because an update with the same name was found from a higher priority location";
-
+ qDebug().nospace() << "Skipping Update \"" << info.data.value(QLatin1String("Name")).toString()
+ << "\" from \"" << sourceInfo.name << "\"(\"" << sourceInfo.url.toString()
+ << "\") because an update with the same name was found from a higher priority location";
continue;
}
- if (info.updateFiles.isEmpty())
- continue;
-
- UpdateFileInfo fileInfo = info.updateFiles.at(0);
-
- // Create an update for this entry
- QUrl url(QString::fromLatin1("%1/%2").arg( sourceInfo.url.toString(), fileInfo.fileName));
- Update *update = q->constructUpdate(application, sourceInfo, PackageUpdate, url, info.data, fileInfo.compressedSize, fileInfo.uncompressedSize, fileInfo.sha1sum);
-
- // Register the update
- this->updates.append(update);
+ // Create and register the update
+ this->updates.append(new Update(sourceInfo.priority, sourceInfo.url, info.data));
}
}
@@ -568,14 +420,14 @@ bool UpdateFinder::Private::checkForUpdatePriority(const UpdateSourceInfo &sourc
// Bingo, update was previously found elsewhere.
// If the existing update comes from a higher priority server, then cool :)
- if (update->sourceInfo().priority > sourceInfo.priority)
+ if (update->priority() > sourceInfo.priority)
return false;
// If the existing update has a higher version number, keep it
- if (KDUpdater::compareVersion(update->data(QLatin1String("Version")).toString(),
- updateInfo.data.value(QLatin1String("Version")).toString()) > 0)
- return false;
-
+ if (KDUpdater::compareVersion(update->data(QLatin1String("Version")).toString(), updateInfo.data
+ .value(QLatin1String("Version")).toString()) > 0) {
+ return false;
+ }
// Otherwise the old update must be deleted.
this->updates.removeAll(update);
delete update;
@@ -610,15 +462,6 @@ UpdateFinder::~UpdateFinder()
}
/*!
- Returns a pointer to the update application for which this function computes all
- the updates.
-*/
-Application *UpdateFinder::application() const
-{
- return d->application;
-}
-
-/*!
Returns a list of KDUpdater::Update objects. The update objects returned in this list
are made children of the \ref KDUpdater::Application object associated with this class.
*/
@@ -628,22 +471,6 @@ QList<Update *> UpdateFinder::updates() const
}
/*!
- Looks only for a certain type of update. By default, only package update
-*/
-void UpdateFinder::setUpdateType(UpdateTypes type)
-{
- d->updateType = type;
-}
-
-/*!
- Returns the type of updates searched
-*/
-UpdateTypes UpdateFinder::updateType() const
-{
- return d->updateType;
-}
-
-/*!
\internal
Implemented from \ref KDUpdater::Task::doStart().
@@ -702,16 +529,6 @@ void UpdateFinder::Private::slotDownloadDone()
q->reportProgress( pc, tr("Downloading Updates.xml from update sources.") );
}
-/*!
- \internal
- */
-Update *UpdateFinder::constructUpdate(Application *application, const UpdateSourceInfo &sourceInfo,
- UpdateType type, const QUrl &updateUrl, const QHash<QString, QVariant> &data,
- quint64 compressedSize, quint64 uncompressedSize, const QByteArray &sha1sum )
-{
- return new Update(application, sourceInfo, type, updateUrl, data, compressedSize, uncompressedSize, sha1sum);
-}
-
/*!
\ingroup kdupdater
diff --git a/src/libs/kdtools/kdupdaterupdatefinder.h b/src/libs/kdtools/kdupdaterupdatefinder.h
index 7f5ec1bfb..fc7eaf926 100644
--- a/src/libs/kdtools/kdupdaterupdatefinder.h
+++ b/src/libs/kdtools/kdupdaterupdatefinder.h
@@ -1,70 +1,78 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_UPDATE_FINDER_H
#define KD_UPDATER_UPDATE_FINDER_H
-#include "kdupdater.h"
#include "kdupdatertask.h"
-#include <QList>
#include <QHash>
-
-QT_BEGIN_NAMESPACE
-class QUrl;
-QT_END_NAMESPACE
+#include <QUrl>
namespace KDUpdater {
class Application;
class Update;
-struct UpdateSourceInfo;
class KDTOOLS_EXPORT UpdateFinder : public Task
{
Q_OBJECT
+ class Private;
public:
explicit UpdateFinder(Application *application);
~UpdateFinder();
- Application *application() const;
QList<Update *> updates() const;
- void setUpdateType(UpdateTypes type);
- UpdateTypes updateType() const;
-
private:
void doRun();
bool doStop();
bool doPause();
bool doResume();
- Update *constructUpdate(Application *application, const UpdateSourceInfo &sourceInfo,
- UpdateType type, const QUrl &updateUrl, const QHash<QString, QVariant> &data,
- quint64 compressedSize, quint64 uncompressedSize, const QByteArray &sha1sum);
+ Update *constructUpdate(int priority, const QUrl &sourceInfoUrl, const QHash<QString, QVariant> &data,
+ quint64 compressedSize, quint64 uncompressedSize) const;
private:
- class Private;
Private *d;
Q_PRIVATE_SLOT(d, void slotDownloadDone())
};
diff --git a/src/libs/kdtools/kdupdaterupdateoperation.cpp b/src/libs/kdtools/kdupdaterupdateoperation.cpp
index 40d2e5ada..c1591f467 100644
--- a/src/libs/kdtools/kdupdaterupdateoperation.cpp
+++ b/src/libs/kdtools/kdupdaterupdateoperation.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdupdaterupdateoperation.h"
@@ -38,7 +57,7 @@
update operations. Concrete implementations of this class must perform a single update
operation like copy, move, delete etc.
- \note Two seperate threads cannot be using a single instance of KDUpdater::UpdateOperation
+ \note Two separate threads cannot be using a single instance of KDUpdater::UpdateOperation
at the same time.
*/
@@ -63,7 +82,7 @@ using namespace KDUpdater;
Constructor
*/
UpdateOperation::UpdateOperation()
- : m_error(0), m_application(0)
+ : m_error(0)
{}
/*!
@@ -150,15 +169,6 @@ void UpdateOperation::setArguments(const QStringList &args)
}
/*!
- Sets the Application for this operation.
- This may be used by some operations
-*/
-void UpdateOperation::setApplication(Application *application)
-{
- m_application = application;
-}
-
-/*!
Returns the last set function arguments.
*/
QStringList UpdateOperation::arguments() const
@@ -207,7 +217,6 @@ void UpdateOperation::setError(int error, const QString &errorString)
void UpdateOperation::clear()
{
m_arguments.clear();
- m_application = 0;
}
QStringList UpdateOperation::filesForDelayedDeletion() const
@@ -224,7 +233,7 @@ void UpdateOperation::registerForDelayedDeletion(const QStringList &files)
{
m_delayedDeletionFiles << files;
}
-
+
/*!
Tries to delete \a file. If \a file can't be deleted, it gets registered for delayed deletion.
*/
@@ -235,7 +244,7 @@ bool UpdateOperation::deleteFileNowOrLater(const QString &file, QString *errorSt
if (!QFile::exists(file))
return true;
-
+
const QString backup = backupFileName(file);
QFile f(file);
if (!f.rename(backup)) {
@@ -248,14 +257,6 @@ bool UpdateOperation::deleteFileNowOrLater(const QString &file, QString *errorSt
}
/*!
- Returns a pointer to the current Application
-*/
-Application *UpdateOperation::application() const
-{
- return m_application;
-}
-
-/*!
\fn virtual void KDUpdater::UpdateOperation::backup() = 0;
Subclasses must implement this function to backup any data before performing the action.
diff --git a/src/libs/kdtools/kdupdaterupdateoperation.h b/src/libs/kdtools/kdupdaterupdateoperation.h
index 04f1c4858..cac68d2f1 100644
--- a/src/libs/kdtools/kdupdaterupdateoperation.h
+++ b/src/libs/kdtools/kdupdaterupdateoperation.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_UPDATE_OPERATION_H
#define KD_UPDATER_UPDATE_OPERATION_H
@@ -32,8 +51,6 @@
namespace KDUpdater {
-class Application;
-
class KDTOOLS_EXPORT UpdateOperation
{
Q_DECLARE_TR_FUNCTIONS(UpdateOperation)
@@ -57,7 +74,6 @@ public:
void setValue(const QString &name, const QVariant &value);
void setArguments(const QStringList &args);
- void setApplication(Application *application);
QStringList arguments() const;
void clear();
QString errorString() const;
@@ -76,7 +92,6 @@ public:
protected:
void setName(const QString &name);
- Application *application() const;
void setErrorString(const QString &errorString);
void setError(int error, const QString &errorString = QString());
void registerForDelayedDeletion(const QStringList &files);
@@ -87,7 +102,6 @@ private:
QStringList m_arguments;
QString m_errorString;
int m_error;
- Application *m_application;
QVariantMap m_values;
QStringList m_delayedDeletionFiles;
};
diff --git a/src/libs/kdtools/kdupdaterupdateoperationfactory.cpp b/src/libs/kdtools/kdupdaterupdateoperationfactory.cpp
index aab8f6c2d..ed5c67a8b 100644
--- a/src/libs/kdtools/kdupdaterupdateoperationfactory.cpp
+++ b/src/libs/kdtools/kdupdaterupdateoperationfactory.cpp
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdupdaterupdateoperationfactory.h"
#include "kdupdaterupdateoperations.h"
@@ -68,7 +87,4 @@ UpdateOperationFactory::UpdateOperationFactory()
registerUpdateOperation<RmdirOperation>(QLatin1String("Rmdir"));
registerUpdateOperation<AppendFileOperation>(QLatin1String("AppendFile"));
registerUpdateOperation<PrependFileOperation>(QLatin1String("PrependFile"));
- registerUpdateOperation<ExecuteOperation>(QLatin1String("Execute"));
- registerUpdateOperation<UpdatePackageOperation>(QLatin1String("UpdatePackage"));
- registerUpdateOperation<UpdateCompatOperation>(QLatin1String("UpdateCompat"));
}
diff --git a/src/libs/kdtools/kdupdaterupdateoperationfactory.h b/src/libs/kdtools/kdupdaterupdateoperationfactory.h
index c21727f78..b6e433c80 100644
--- a/src/libs/kdtools/kdupdaterupdateoperationfactory.h
+++ b/src/libs/kdtools/kdupdaterupdateoperationfactory.h
@@ -1,24 +1,43 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_UPDATE_OPERATION_FACTORY_H
#define KD_UPDATER_UPDATE_OPERATION_FACTORY_H
diff --git a/src/libs/kdtools/kdupdaterupdateoperations.cpp b/src/libs/kdtools/kdupdaterupdateoperations.cpp
index 835697040..5a4296242 100644
--- a/src/libs/kdtools/kdupdaterupdateoperations.cpp
+++ b/src/libs/kdtools/kdupdaterupdateoperations.cpp
@@ -1,49 +1,56 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdupdaterupdateoperations.h"
-#include "kdupdaterapplication.h"
-#include "kdupdaterpackagesinfo.h"
-#include "environment.h"
+#include "errors.h"
+#include "fileutils.h"
-#include <QFile>
#include <QDir>
-#include <QDirIterator>
-#include <QProcess>
+#include <QFile>
#include <QTextStream>
-#include <QDebug>
#include <QTemporaryFile>
-
+#include <QFileInfo>
#include <cerrno>
-#define SUPPORT_DETACHED_PROCESS_EXECUTION
-
-#ifdef SUPPORT_DETACHED_PROCESS_EXECUTION
-#ifdef Q_OS_WIN
-#include <windows.h>
-#endif
-#endif
-
using namespace KDUpdater;
static QString errnoToQString(int error)
@@ -85,6 +92,7 @@ static bool removeDirectory(const QString &path, QString *errorString, bool forc
*errorString = errnoToQString(errno);
return success;
}
+
/*
* \internal
* Returns a filename for a temporary file based on \a templateName
@@ -113,67 +121,90 @@ CopyOperation::~CopyOperation()
deleteFileNowOrLater(value(QLatin1String("backupOfExistingDestination")).toString());
}
+QString CopyOperation::sourcePath()
+{
+ return arguments().first();
+}
+
+QString CopyOperation::destinationPath()
+{
+ QString destination = arguments().last();
+
+ // if the target is a directory use the source filename to complete the destination path
+ if (QFileInfo(destination).isDir())
+ destination = QDir(destination).filePath(QFileInfo(sourcePath()).fileName());
+ return destination;
+}
+
+
void CopyOperation::backup()
{
- const QString dest = arguments().last();
- if (!QFile::exists(dest)) {
+ QString destination = destinationPath();
+
+ if (!QFile::exists(destination)) {
clearValue(QLatin1String("backupOfExistingDestination"));
return;
}
- setValue(QLatin1String("backupOfExistingDestination"), backupFileName(dest));
+ setValue(QLatin1String("backupOfExistingDestination"), backupFileName(destination));
- // race condition: The backup file could get created
- // by another process right now. But this is the same
+ // race condition: The backup file could get created by another process right now. But this is the same
// in QFile::copy...
- const bool success = QFile::rename(dest, value(QLatin1String("backupOfExistingDestination")).toString());
- if (!success)
- setError(UserDefinedError, tr("Could not backup file %1.").arg(dest));
+ if (!QFile::rename(destination, value(QLatin1String("backupOfExistingDestination")).toString()))
+ setError(UserDefinedError, tr("Could not backup file %1.").arg(destination));
}
bool CopyOperation::performOperation()
{
- // We need two args to complete the copy operation.
- // First arg provides the complete file name of source
+ // We need two args to complete the copy operation. First arg provides the complete file name of source
// Second arg provides the complete file name of dest
- QStringList args = this->arguments();
- if (args.count() != 2) {
+ if (arguments().count() != 2) {
setError(InvalidArguments);
- setErrorString(tr("Invalid arguments: %1 arguments given, 2 expected.").arg(args.count()));
+ setErrorString(tr("Invalid arguments: %1 arguments given, 2 expected.").arg(arguments().count()));
return false;
}
- QString source = args.first();
- QString dest = args.last();
- // If destination file exists, then we cannot use QFile::copy()
- // because it does not overwrite an existing file. So we remove
- // the destination file.
- if (QFile::exists(dest)) {
- QFile file(dest);
- if (!file.remove()) {
+ QString source = sourcePath();
+ QString destination = destinationPath();
+
+ QFile sourceFile(source);
+ if (!sourceFile.exists()) {
+ setError(UserDefinedError);
+ setErrorString(tr("Could not copy a none existing file: %1").arg(source));
+ return false;
+ }
+ // If destination file exists, we cannot use QFile::copy() because it does not overwrite an existing
+ // file. So we remove the destination file.
+ QFile destinationFile(destination);
+ if (destinationFile.exists()) {
+ if (!destinationFile.remove()) {
setError(UserDefinedError);
- setErrorString(tr("Could not remove destination file %1: %2").arg(dest, file.errorString()));
+ setErrorString(tr("Could not remove destination file %1: %2").arg(destination, destinationFile.errorString()));
return false;
}
}
- QFile file(source);
- const bool copied = file.copy(dest);
+ const bool copied = sourceFile.copy(destination);
if (!copied) {
setError(UserDefinedError);
- setErrorString(tr("Could not copy %1 to %2: %3").arg(source, dest, file.errorString()));
+ setErrorString(tr("Could not copy %1 to %2: %3").arg(source, destination, sourceFile.errorString()));
}
return copied;
}
bool CopyOperation::undoOperation()
{
- const QString dest = arguments().last();
+ QString source = sourcePath();
+ QString destination = destinationPath();
- QFile destF(dest);
+ // if the target is a directory use the source filename to complete the destination path
+ if (QFileInfo(destination).isDir())
+ destination = destination + QDir::separator() + QFileInfo(source).fileName();
+
+ QFile destFile(destination);
// first remove the dest
- if (destF.exists() && !destF.remove()) {
- setError(UserDefinedError, tr("Could not delete file %1: %2").arg(dest, destF.errorString()));
+ if (destFile.exists() && !destFile.remove()) {
+ setError(UserDefinedError, tr("Could not delete file %1: %2").arg(destination, destFile.errorString()));
return false;
}
@@ -182,11 +213,11 @@ bool CopyOperation::undoOperation()
if (!hasValue(QLatin1String("backupOfExistingDestination")))
return true;
- QFile backupF(value(QLatin1String("backupOfExistingDestination")).toString());
+ QFile backupFile(value(QLatin1String("backupOfExistingDestination")).toString());
// otherwise we have to copy the backup back:
- const bool success = backupF.rename(dest);
+ const bool success = backupFile.rename(destination);
if (!success)
- setError(UserDefinedError, tr("Could not restore backup file into %1: %2").arg(dest, backupF.errorString()));
+ setError(UserDefinedError, tr("Could not restore backup file into %1: %2").arg(destination, backupFile.errorString()));
return success;
}
@@ -198,9 +229,9 @@ QDomDocument CopyOperation::toXml() const
// we don't want to save the backupOfExistingDestination
if (!hasValue(QLatin1String("backupOfExistingDestination")))
return UpdateOperation::toXml();
-
+
CopyOperation *const me = const_cast<CopyOperation *>(this);
-
+
const QVariant v = value(QLatin1String("backupOfExistingDestination"));
me->clearValue(QLatin1String("backupOfExistingDestination"));
const QDomDocument xml = UpdateOperation::toXml();
@@ -244,32 +275,26 @@ void MoveOperation::backup()
setValue(QLatin1String("backupOfExistingDestination"), backupFileName(dest));
- // race condition: The backup file could get created
- // by another process right now. But this is the same
+ // race condition: The backup file could get created by another process right now. But this is the same
// in QFile::copy...
- const bool success = QFile::rename(dest, value(QLatin1String("backupOfExistingDestination")).toString());
- if (!success)
+ if (!QFile::rename(dest, value(QLatin1String("backupOfExistingDestination")).toString()))
setError(UserDefinedError, tr("Could not backup file %1.").arg(dest));
}
bool MoveOperation::performOperation()
{
- // We need two args to complete the copy operation.
- // First arg provides the complete file name of source
- // Second arg provides the complete file name of dest
- QStringList args = this->arguments();
+ // We need two args to complete the copy operation. // First arg provides the complete file name of
+ // source, second arg provides the complete file name of dest
+ const QStringList args = this->arguments();
if (args.count() != 2) {
setError(InvalidArguments);
setErrorString(tr("Invalid arguments: %1 arguments given, 2 expected.").arg(args.count()));
return false;
}
- QString source = args.first();
- QString dest = args.last();
-
- // If destination file exists, then we cannot use QFile::copy()
- // because it does not overwrite an existing file. So we remove
- // the destination file.
+ const QString dest = args.last();
+ // If destination file exists, then we cannot use QFile::copy() because it does not overwrite an existing
+ // file. So we remove the destination file.
if (QFile::exists(dest)) {
QFile file(dest);
if (!file.remove(dest)) {
@@ -280,27 +305,23 @@ bool MoveOperation::performOperation()
}
// Copy source to destination.
- QFile file(source);
- const bool copied = file.copy(source, dest);
- if (!copied) {
+ QFile file(args.first());
+ if (!file.copy(dest)) {
setError(UserDefinedError);
- setErrorString(tr("Could not copy %1 to %2: %3").arg(source, dest, file.errorString()));
+ setErrorString(tr("Could not copy %1 to %2: %3").arg(file.fileName(), dest, file.errorString()));
return false;
}
-
- return deleteFileNowOrLater(source);
+ return deleteFileNowOrLater(file.fileName());
}
bool MoveOperation::undoOperation()
{
const QStringList args = arguments();
- const QString& source = args.first();
- const QString& dest = args.last();
-
+ const QString dest = args.last();
// first: copy back the destination to source
QFile destF(dest);
- if (!destF.copy(source)) {
- setError(UserDefinedError, tr("Cannot copy %1 to %2: %3").arg(dest, source, destF.errorString()));
+ if (!destF.copy(args.first())) {
+ setError(UserDefinedError, tr("Cannot copy %1 to %2: %3").arg(dest, args.first(), destF.errorString()));
return false;
}
@@ -317,7 +338,7 @@ bool MoveOperation::undoOperation()
// otherwise we have to copy the backup back:
QFile backupF(value(QLatin1String("backupOfExistingDestination")).toString());
- const bool success = backupF.rename(dest);
+ const bool success = backupF.rename(dest);
if (!success)
setError(UserDefinedError, tr("Cannot restore backup file for %1: %2").arg(dest, backupF.errorString()));
@@ -354,25 +375,22 @@ void DeleteOperation::backup()
{
const QString fileName = arguments().first();
setValue(QLatin1String("backupOfExistingFile"), backupFileName(fileName));
+
QFile file(fileName);
- const bool success = file.copy(value(QLatin1String("backupOfExistingFile")).toString());
- if (!success)
+ if (!file.copy(value(QLatin1String("backupOfExistingFile")).toString()))
setError(UserDefinedError, tr("Cannot create backup of %1: %2").arg(fileName, file.errorString()));
}
bool DeleteOperation::performOperation()
{
- // Requires only one parameter. That is the name of
- // the file to remove.
- QStringList args = this->arguments();
+ // Requires only one parameter. That is the name of the file to remove.
+ const QStringList args = this->arguments();
if (args.count() != 1) {
setError(InvalidArguments);
setErrorString(tr("Invalid arguments: %1 arguments given, 1 expected.").arg(args.count()));
return false;
}
-
- const QString fName = args.first();
- return deleteFileNowOrLater(fName);
+ return deleteFileNowOrLater(args.first());
}
bool DeleteOperation::undoOperation()
@@ -385,7 +403,6 @@ bool DeleteOperation::undoOperation()
const bool success = backupF.copy(fileName) && deleteFileNowOrLater(backupF.fileName());
if (!success)
setError(UserDefinedError, tr("Cannot restore backup file for %1: %2").arg(fileName, backupF.errorString()));
-
return success;
}
@@ -408,9 +425,9 @@ QDomDocument DeleteOperation::toXml() const
// we don't want to save the backupOfExistingFile
if (!hasValue(QLatin1String("backupOfExistingFile")))
return UpdateOperation::toXml();
-
+
DeleteOperation *const me = const_cast<DeleteOperation *>(this);
-
+
const QVariant v = value(QLatin1String("backupOfExistingFile"));
me->clearValue(QLatin1String("backupOfExistingFile"));
const QDomDocument xml = UpdateOperation::toXml();
@@ -460,7 +477,8 @@ bool MkdirOperation::performOperation()
setErrorString(tr("Invalid arguments: %1 arguments given, 1 expected.").arg(args.count()));
return false;
}
- QString dirName = args.first();
+
+ const QString dirName = args.first();
const bool created = QDir::root().mkpath(dirName);
if (!created) {
setError(UserDefinedError);
@@ -520,8 +538,8 @@ MkdirOperation *MkdirOperation::clone() const
RmdirOperation::RmdirOperation()
{
- setValue(QLatin1String("removed"), false);
setName(QLatin1String("Rmdir"));
+ setValue(QLatin1String("removed"), false);
}
void RmdirOperation::backup()
@@ -531,29 +549,27 @@ void RmdirOperation::backup()
bool RmdirOperation::performOperation()
{
- // Requires only one parameter. That is the name of
- // the file to remove.
- QStringList args = this->arguments();
+ // Requires only one parameter. That is the name of the file to remove.
+ const QStringList args = this->arguments();
if (args.count() != 1) {
setError(InvalidArguments);
setErrorString(tr("Invalid arguments: %1 arguments given, 1 expected.").arg(args.count()));
return false;
}
- QString dirName = args.first();
- QDir dir(dirName);
+ QDir dir(args.first());
if (!dir.exists()) {
setError(UserDefinedError);
- setErrorString(tr("Could not remove folder %1: The folder does not exist.").arg(dirName));
+ setErrorString(tr("Could not remove folder %1: The folder does not exist.").arg(args.first()));
return false;
}
errno = 0;
- const bool removed = dir.rmdir(dirName);
+ const bool removed = dir.rmdir(args.first());
setValue(QLatin1String("removed"), removed);
if (!removed) {
setError(UserDefinedError);
- setErrorString(tr("Could not remove folder %1: %2").arg(dirName, errnoToQString(errno)));
+ setErrorString(tr("Could not remove folder %1: %2").arg(args.first(), errnoToQString(errno)));
}
return removed;
}
@@ -563,8 +579,8 @@ bool RmdirOperation::undoOperation()
if (!value(QLatin1String("removed")).toBool())
return true;
- const QFileInfo fi(arguments().first());
errno = 0;
+ const QFileInfo fi(arguments().first());
const bool success = fi.dir().mkdir(fi.fileName());
if( !success)
setError(UserDefinedError, tr("Cannot recreate directory %1: %2").arg(fi.fileName(), errnoToQString(errno)));
@@ -610,34 +626,46 @@ void AppendFileOperation::backup()
bool AppendFileOperation::performOperation()
{
- // This operation takes two arguments. First argument is the name
- // of the file into which a text has to be appended. Second argument
- // is the text to append.
- QStringList args = this->arguments();
+ // This operation takes two arguments. First argument is the name of the file into which a text has to be
+ // appended. Second argument is the text to append.
+ const QStringList args = this->arguments();
if (args.count() != 2) {
setError(InvalidArguments);
- setErrorString(tr("Invalid arguments: %1 arguments given, 2 expected.").arg(args.count()));
+ setErrorString(tr("Invalid arguments in %0: %1 arguments given, %2 expected%3.")
+ .arg(name()).arg(arguments().count()).arg(tr("exactly 2"), QLatin1String("")));
return false;
}
- QString fName = args.first();
- QString text = args.last();
-
+ const QString fName = args.first();
QFile file(fName);
if (!file.open(QFile::Append)) {
// first we rename the file, then we copy it to the real target and open the copy - the renamed original is then marked for deletion
+ bool error = false;
const QString newName = backupFileName(fName);
- if (!QFile::rename(fName, newName) && QFile::copy(newName, fName) && file.open(QFile::Append)) {
+
+ if (!QFile::rename(fName, newName))
+ error = true;
+
+ if (!error && !QFile::copy(newName, fName)) {
+ error = true;
QFile::rename(newName, fName);
+ }
+
+ if (!error && !file.open(QFile::Append)) {
+ error = true;
+ deleteFileNowOrLater(newName);
+ }
+
+ if (error) {
setError(UserDefinedError);
- setErrorString(tr("Could not open file %1 for writing: %2").arg(file.fileName(), file.errorString()));
+ setErrorString(tr("Could not open file '%1' for writing: %2").arg(file.fileName(), file.errorString()));
return false;
}
deleteFileNowOrLater(newName);
}
QTextStream ts(&file);
- ts << text;
+ ts << args.last();
file.close();
return true;
@@ -711,16 +739,14 @@ bool PrependFileOperation::performOperation()
// This operation takes two arguments. First argument is the name
// of the file into which a text has to be appended. Second argument
// is the text to append.
- QStringList args = this->arguments();
+ const QStringList args = this->arguments();
if (args.count() != 2) {
setError(InvalidArguments);
setErrorString(tr("Invalid arguments: %1 arguments given, 2 expected.").arg(args.count()));
return false;
}
- QString fName = args.first();
- QString text = args.last();
-
+ const QString fName = args.first();
// Load the file first.
QFile file(fName);
if (!file.open(QFile::ReadOnly)) {
@@ -728,11 +754,13 @@ bool PrependFileOperation::performOperation()
setErrorString(tr("Could not open file %1 for reading: %2").arg(file.fileName(), file.errorString()));
return false;
}
+
+ // TODO: fix this, use a text stream
QString fContents(QLatin1String(file.readAll()));
file.close();
// Prepend text to the file text
- fContents = text + fContents;
+ fContents = args.last() + fContents;
// Now re-open the file in write only mode.
if (!file.open(QFile::WriteOnly)) {
@@ -790,278 +818,3 @@ PrependFileOperation *PrependFileOperation::clone() const
{
return new PrependFileOperation;
}
-
-
-////////////////////////////////////////////////////////////////////////////
-// KDUpdater::ExecuteOperation
-////////////////////////////////////////////////////////////////////////////
-
-ExecuteOperation::ExecuteOperation()
- : QObject()
-{
- setName(QLatin1String("Execute"));
-}
-
-void ExecuteOperation::backup()
-{
- // this is not possible, since the process can do whatever...
-}
-
-#if defined(SUPPORT_DETACHED_PROCESS_EXECUTION) && defined(Q_OS_WIN)
-// stolen from qprocess_win.cpp
-static QString qt_create_commandline(const QString &program, const QStringList &arguments)
-{
- QString args;
- if (!program.isEmpty()) {
- QString programName = program;
- if (!programName.startsWith(QLatin1Char('\"')) && !programName.endsWith(QLatin1Char('\"')) && programName.contains(QLatin1Char(' ')))
- programName = QLatin1Char('\"') + programName + QLatin1Char('\"');
- programName.replace(QLatin1Char('/'), QLatin1Char('\\'));
-
- // add the prgram as the first arg ... it works better
- args = programName + QLatin1Char(' ');
- }
-
- for (int i = 0; i < arguments.size(); ++i) {
- QString tmp = arguments.at(i);
- // in the case of \" already being in the string the \ must also be escaped
- tmp.replace(QLatin1String("\\\""), QLatin1String("\\\\\""));
- // escape a single " because the arguments will be parsed
- tmp.replace(QLatin1Char('\"'), QLatin1String("\\\""));
- if (tmp.isEmpty() || tmp.contains(QLatin1Char(' ')) || tmp.contains(QLatin1Char('\t'))) {
- // The argument must not end with a \ since this would be interpreted
- // as escaping the quote -- rather put the \ behind the quote: e.g.
- // rather use "foo"\ than "foo\"
- QString endQuote(QLatin1Char('\"'));
- int i = tmp.length();
- while (i > 0 && tmp.at(i - 1) == QLatin1Char('\\')) {
- --i;
- endQuote += QLatin1Char('\\');
- }
- args += QLatin1String(" \"") + tmp.left(i) + endQuote;
- } else {
- args += QLatin1Char(' ') + tmp;
- }
- }
- return args;
-}
-#endif
-
-bool ExecuteOperation::performOperation()
-{
- // This operation receives only one argument. It is the complete
- // command line of the external program to execute.
- QStringList args = this->arguments();
- if (args.isEmpty()) {
- setError(InvalidArguments);
- setErrorString(tr("Invalid arguments: %1 arguments given, 2 expected.").arg(args.count()));
- return false;
- }
-
- QList<int> allowedExitCodes;
-
- QRegExp re(QLatin1String("^\\{((-?\\d+,)*-?\\d+)\\}$"));
- if (re.exactMatch(args.first())) {
- const QStringList numbers = re.cap(1).split(QLatin1Char(','));
- for (QStringList::const_iterator it = numbers.begin(); it != numbers.end(); ++it)
- allowedExitCodes.push_back(it->toInt());
- args.pop_front();
- } else {
- allowedExitCodes.push_back(0);
- }
-
- bool success = false;
-#ifdef SUPPORT_DETACHED_PROCESS_EXECUTION
- // unix style: when there's an ampersand after the command, it's started detached
- if (args.count() >= 2 && args.last() == QLatin1String("&")) {
- args.pop_back();
-#ifdef Q_OS_WIN
- QString arguments = qt_create_commandline(args.front(), args.mid(1));
-
- PROCESS_INFORMATION pinfo;
-
- STARTUPINFOW startupInfo = { sizeof(STARTUPINFO), 0, 0, 0,
- static_cast< ulong >(CW_USEDEFAULT), static_cast< ulong >(CW_USEDEFAULT),
- static_cast< ulong >(CW_USEDEFAULT), static_cast< ulong >(CW_USEDEFAULT),
- 0, 0, 0, STARTF_USESHOWWINDOW, SW_HIDE, 0, 0, 0, 0, 0
- };
- success = CreateProcess(0, (wchar_t*)arguments.utf16(),
- 0, 0, FALSE, CREATE_UNICODE_ENVIRONMENT | CREATE_NEW_CONSOLE, 0,
- 0,
- &startupInfo, &pinfo);
-
-#else
- success = QProcess::startDetached(args.front(), args.mid(1));
-#endif
- }
- else
-#endif
- {
- Environment::instance().applyTo(&process); //apply non-persistent variables
- process.start(args.front(), args.mid(1));
-
- QEventLoop loop;
- QObject::connect(&process, SIGNAL(finished(int, QProcess::ExitStatus)), &loop, SLOT(quit()));
- QObject::connect(&process, SIGNAL(readyRead()), this, SLOT(readProcessOutput()));
- success = process.waitForStarted(-1);
- if (success) {
- loop.exec();
- setValue(QLatin1String("ExitCode"), process.exitCode());
- success = allowedExitCodes.contains(process.exitCode());
- }
- }
- if (!success) {
- setError(UserDefinedError);
- setErrorString(tr("Execution failed: %1").arg(args.join(QLatin1String(" "))));
- }
-
- return success;
-}
-
-/*!
- Cancels the ExecuteOperation. This methods tries to terminate the process
- gracefully by calling QProcess::terminate. After 10 seconds, the process gets killed.
- */
-void ExecuteOperation::cancelOperation()
-{
- if (process.state() == QProcess::Running)
- process.terminate();
- if (!process.waitForFinished(10000))
- process.kill();
-}
-
-void ExecuteOperation::readProcessOutput()
-{
- QByteArray output = process.readAll();
- if (!output.isEmpty())
- emit outputTextChanged(QString::fromLocal8Bit(output));
-}
-
-bool ExecuteOperation::undoOperation()
-{
- // this is not possible, since the process can do whatever...
- return false;
-}
-
-bool ExecuteOperation::testOperation()
-{
- // TODO
- return true;
-}
-
-ExecuteOperation *ExecuteOperation::clone() const
-{
- return new ExecuteOperation;
-}
-
-
-////////////////////////////////////////////////////////////////////////////
-// KDUpdater::UpdatePackageOperation
-////////////////////////////////////////////////////////////////////////////
-
-UpdatePackageOperation::UpdatePackageOperation()
-{
- setName(QLatin1String("UpdatePackage"));
-}
-
-void UpdatePackageOperation::backup()
-{
- const PackageInfo info = application()->packagesInfo()->packageInfo(application()->packagesInfo()->findPackageInfo(arguments().first()));
- setValue(QLatin1String("oldVersion"), info.version);
- setValue(QLatin1String("oldDate"), info.lastUpdateDate);
-}
-
-bool UpdatePackageOperation::performOperation()
-{
- // This operation receives three arguments : the name of the package
- // the new version and the release date
- const QStringList args = this->arguments();
- if (args.count() != 3) {
- setError(InvalidArguments, tr("Invalid arguments: %1 arguments given, 3 expected.").arg(args.count()));
- return false;
- }
-
- const QString &packageName = args.at(0);
- const QString &version = args.at(1);
- const QDate date = QDate::fromString(args.at(2));
- const bool success = application()->packagesInfo()->updatePackage(packageName, version, date);
- if (!success)
- setError(UserDefinedError, tr("Cannot update %1-%2").arg(packageName, version));
-
- return success;
-}
-
-bool UpdatePackageOperation::undoOperation()
-{
- const QString packageName = arguments().first();
- const QString version = arguments().at(1);
- const QString oldVersion = value(QLatin1String("oldVersion")).toString();
- const QDate oldDate = value(QLatin1String("oldDate")).toDate();
- const bool success = application()->packagesInfo()->updatePackage(packageName, oldVersion, oldDate);
- if (!success)
- setError(UserDefinedError, tr("Cannot restore %1-%2").arg(packageName, version));
-
- return success;
-}
-
-bool UpdatePackageOperation::testOperation()
-{
- // TODO
- return true;
-}
-
-UpdatePackageOperation *UpdatePackageOperation::clone() const
-{
- return new UpdatePackageOperation;
-}
-
-
-////////////////////////////////////////////////////////////////////////////
-// KDUpdater::UpdateCompatOperation
-////////////////////////////////////////////////////////////////////////////
-
-UpdateCompatOperation::UpdateCompatOperation()
-{
- setName(QLatin1String("UpdateCompatLevel"));
-}
-
-void UpdateCompatOperation::backup()
-{
- setValue(QLatin1String("oldCompatLevel"), application()->packagesInfo()->compatLevel());
-}
-
-bool UpdateCompatOperation::performOperation()
-{
- // This operation receives one argument : the new compat level
- const QStringList args = this->arguments();
- if (args.count() != 1) {
- setError(InvalidArguments, tr("Invalid arguments: %1 arguments given, 1 expected.").arg(args.count()));
- return false;
- }
-
- const int level = args.first().toInt();
- application()->packagesInfo()->setCompatLevel(level);
- return true;
-}
-
-bool UpdateCompatOperation::undoOperation()
-{
- if (!hasValue(QLatin1String("oldCompatLevel"))) {
- setError(UserDefinedError, tr("Cannot restore previous compat-level"));
- return false;
- }
-
- application()->packagesInfo()->setCompatLevel(value(QLatin1String("oldCompatLevel")).toInt());
- return true;
-}
-
-bool UpdateCompatOperation::testOperation()
-{
- // TODO
- return true;
-}
-
-UpdateCompatOperation *UpdateCompatOperation::clone() const
-{
- return new UpdateCompatOperation;
-}
diff --git a/src/libs/kdtools/kdupdaterupdateoperations.h b/src/libs/kdtools/kdupdaterupdateoperations.h
index 40480d1e1..43a0ff9d2 100644
--- a/src/libs/kdtools/kdupdaterupdateoperations.h
+++ b/src/libs/kdtools/kdupdaterupdateoperations.h
@@ -1,34 +1,49 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_UPDATE_OPERATIONS_H
#define KD_UPDATER_UPDATE_OPERATIONS_H
#include "kdupdaterupdateoperation.h"
-#include <QDir>
-#include <QObject>
-#include <QProcess>
-
namespace KDUpdater {
class KDTOOLS_EXPORT CopyOperation : public UpdateOperation
@@ -44,6 +59,9 @@ public:
CopyOperation *clone() const;
QDomDocument toXml() const;
+private:
+ QString sourcePath();
+ QString destinationPath();
};
class KDTOOLS_EXPORT MoveOperation : public UpdateOperation
@@ -122,56 +140,6 @@ public:
PrependFileOperation *clone() const;
};
-class KDTOOLS_EXPORT ExecuteOperation : public QObject, public UpdateOperation
-{
- Q_OBJECT
-
-public:
- ExecuteOperation();
-
- void backup();
- bool performOperation();
- bool undoOperation();
- bool testOperation();
- ExecuteOperation *clone() const;
-
-public Q_SLOTS:
- void cancelOperation();
-
-private Q_SLOTS:
- void readProcessOutput();
-
-Q_SIGNALS:
- void outputTextChanged(const QString &text);
-
-private:
- QProcess process;
-};
-
-class KDTOOLS_EXPORT UpdatePackageOperation : public UpdateOperation
-{
-public:
- UpdatePackageOperation();
-
- void backup();
- bool performOperation();
- bool undoOperation();
- bool testOperation();
- UpdatePackageOperation *clone() const;
-};
-
-class KDTOOLS_EXPORT UpdateCompatOperation : public UpdateOperation
-{
-public:
- UpdateCompatOperation();
-
- void backup();
- bool performOperation();
- bool undoOperation();
- bool testOperation();
- UpdateCompatOperation *clone() const;
-};
-
} // namespace KDUpdater
#endif // KD_UPDATER_UPDATE_OPERATIONS_H
diff --git a/src/libs/kdtools/kdupdaterupdatesinfo.cpp b/src/libs/kdtools/kdupdaterupdatesinfo.cpp
index b0cc8608b..27c21fb19 100644
--- a/src/libs/kdtools/kdupdaterupdatesinfo.cpp
+++ b/src/libs/kdtools/kdupdaterupdatesinfo.cpp
@@ -1,68 +1,68 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdupdaterupdatesinfo_p.h"
-#include <QCoreApplication>
-#include <QtXml/QDomDocument>
-#include <QtXml/QDomElement>
#include <QFile>
-#include <QSharedData>
#include <QLocale>
+#include <QUrl>
using namespace KDUpdater;
-//
-// UpdatesInfo::UpdatesInfoData
-//
-struct UpdatesInfo::UpdatesInfoData : public QSharedData
+UpdatesInfoData::UpdatesInfoData()
+ : error(UpdatesInfo::NotYetReadError)
{
- Q_DECLARE_TR_FUNCTIONS(KDUpdater::UpdatesInfoData)
-
-public:
- UpdatesInfoData() : error(UpdatesInfo::NotYetReadError), compatLevel(-1) { }
-
- QString errorMessage;
- UpdatesInfo::Error error;
- QString updateXmlFile;
- QString applicationName;
- QString applicationVersion;
- int compatLevel;
- QList<UpdateInfo> updateInfoList;
-
- void parseFile(const QString &updateXmlFile);
- bool parsePackageUpdateElement(const QDomElement &updateE);
- bool parseCompatUpdateElement(const QDomElement &updateE);
+}
- void setInvalidContentError(const QString &detail);
-};
+UpdatesInfoData::~UpdatesInfoData()
+{
+}
-void UpdatesInfo::UpdatesInfoData::setInvalidContentError(const QString &detail)
+void UpdatesInfoData::setInvalidContentError(const QString &detail)
{
error = UpdatesInfo::InvalidContentError;
errorMessage = tr("Updates.xml contains invalid content: %1").arg(detail);
}
-void UpdatesInfo::UpdatesInfoData::parseFile(const QString &updateXmlFile)
+void UpdatesInfoData::parseFile(const QString &updateXmlFile)
{
QFile file(updateXmlFile);
if (!file.open(QFile::ReadOnly)) {
@@ -73,15 +73,11 @@ void UpdatesInfo::UpdatesInfoData::parseFile(const QString &updateXmlFile)
QDomDocument doc;
QString parseErrorMessage;
- int parseErrorLine;
- int parseErrorColumn;
+ int parseErrorLine, parseErrorColumn;
if (!doc.setContent(&file, &parseErrorMessage, &parseErrorLine, &parseErrorColumn)) {
error = UpdatesInfo::InvalidXmlError;
- errorMessage = tr("Parse error in %1 at %2, %3: %4")
- .arg(updateXmlFile,
- QString::number(parseErrorLine),
- QString::number(parseErrorColumn),
- parseErrorMessage);
+ errorMessage = tr("Parse error in %1 at %2, %3: %4").arg(updateXmlFile,
+ QString::number(parseErrorLine), QString::number(parseErrorColumn), parseErrorMessage);
return;
}
@@ -93,8 +89,7 @@ void UpdatesInfo::UpdatesInfoData::parseFile(const QString &updateXmlFile)
QDomNodeList childNodes = rootE.childNodes();
for(int i = 0; i < childNodes.count(); i++) {
- QDomNode childNode = childNodes.at(i);
- QDomElement childE = childNode.toElement();
+ const QDomElement childE = childNodes.at(i).toElement();
if (childE.isNull())
continue;
@@ -102,20 +97,9 @@ void UpdatesInfo::UpdatesInfoData::parseFile(const QString &updateXmlFile)
applicationName = childE.text();
else if (childE.tagName() == QLatin1String("ApplicationVersion"))
applicationVersion = childE.text();
- else if (childE.tagName() == QLatin1String("RequiredCompatLevel"))
- compatLevel = childE.text().toInt();
else if (childE.tagName() == QLatin1String("PackageUpdate")) {
- const bool res = parsePackageUpdateElement(childE);
- if (!res) {
- //error handled in subroutine
- return;
- }
- } else if (childE.tagName() == QLatin1String("CompatUpdate")) {
- const bool res = parseCompatUpdateElement(childE);
- if (!res) {
- //error handled in subroutine
- return;
- }
+ if (!parsePackageUpdateElement(childE))
+ return; //error handled in subroutine
}
}
@@ -123,40 +107,29 @@ void UpdatesInfo::UpdatesInfoData::parseFile(const QString &updateXmlFile)
setInvalidContentError(tr("ApplicationName element is missing."));
return;
}
-
+
if (applicationVersion.isEmpty()) {
setInvalidContentError(tr("ApplicationVersion element is missing."));
return;
}
-
- error = UpdatesInfo::NoError;
+
errorMessage.clear();
+ error = UpdatesInfo::NoError;
}
-bool UpdatesInfo::UpdatesInfoData::parsePackageUpdateElement(const QDomElement &updateE)
+bool UpdatesInfoData::parsePackageUpdateElement(const QDomElement &updateE)
{
if (updateE.isNull())
return false;
UpdateInfo info;
- info.type = PackageUpdate;
-
- QDomNodeList childNodes = updateE.childNodes();
- for (int i = 0; i < childNodes.count(); i++) {
- QDomNode childNode = childNodes.at(i);
- QDomElement childE = childNode.toElement();
+ for (int i = 0; i < updateE.childNodes().count(); i++) {
+ QDomElement childE = updateE.childNodes().at(i).toElement();
if (childE.isNull())
continue;
if (childE.tagName() == QLatin1String("ReleaseNotes")) {
info.data[childE.tagName()] = QUrl(childE.text());
- } else if (childE.tagName() == QLatin1String("UpdateFile")) {
- UpdateFileInfo ufInfo;
- ufInfo.compressedSize = childE.attribute(QLatin1String("CompressedSize")).toLongLong();
- ufInfo.uncompressedSize = childE.attribute(QLatin1String("UncompressedSize")).toLongLong();
- ufInfo.sha1sum = QByteArray::fromHex(childE.attribute(QLatin1String("sha1sum")).toLatin1());
- ufInfo.fileName = childE.text();
- info.updateFiles.append(ufInfo);
} else if (childE.tagName() == QLatin1String("Licenses")) {
QHash<QString, QVariant> licenseHash;
const QDomNodeList licenseNodes = childE.childNodes();
@@ -171,19 +144,20 @@ bool UpdatesInfo::UpdatesInfoData::parsePackageUpdateElement(const QDomElement &
if (!licenseHash.isEmpty())
info.data.insert(QLatin1String("Licenses"), licenseHash);
} else if (childE.tagName() == QLatin1String("Version")) {
- info.data.insert(QLatin1String("inheritVersionFrom"), childE.attribute(QLatin1String("inheritVersionFrom")));
+ info.data.insert(QLatin1String("inheritVersionFrom"),
+ childE.attribute(QLatin1String("inheritVersionFrom")));
info.data[childE.tagName()] = childE.text();
} else if (childE.tagName() == QLatin1String("Description")) {
-
QString languageAttribute = childE.attribute(QLatin1String("xml:lang")).toLower();
-
if (!info.data.contains(QLatin1String("Description")) && (languageAttribute.isEmpty()))
info.data[childE.tagName()] = childE.text();
// overwrite default if we have a language specific description
if (languageAttribute == QLocale().name().toLower())
info.data[childE.tagName()] = childE.text();
-
+ } else if (childE.tagName() == QLatin1String("UpdateFile")) {
+ info.data[QLatin1String("CompressedSize")] = childE.attribute(QLatin1String("CompressedSize"));
+ info.data[QLatin1String("UncompressedSize")] = childE.attribute(QLatin1String("UncompressedSize"));
} else {
info.data[childE.tagName()] = childE.text();
}
@@ -201,55 +175,6 @@ bool UpdatesInfo::UpdatesInfoData::parsePackageUpdateElement(const QDomElement &
setInvalidContentError(tr("PackageUpdate element without ReleaseDate"));
return false;
}
- if (info.updateFiles.isEmpty()) {
- setInvalidContentError(tr("PackageUpdate element without UpdateFile"));
- return false;
- }
-
- updateInfoList.append(info);
- return true;
-}
-
-bool UpdatesInfo::UpdatesInfoData::parseCompatUpdateElement(const QDomElement &updateE)
-{
- if (updateE.isNull())
- return false;
-
- UpdateInfo info;
- info.type = CompatUpdate;
-
- QDomNodeList childNodes = updateE.childNodes();
- for (int i = 0; i < childNodes.count(); i++) {
- QDomNode childNode = childNodes.at(i);
- QDomElement childE = childNode.toElement();
- if (childE.isNull())
- continue;
-
- if (childE.tagName() == QLatin1String("ReleaseNotes")) {
- info.data[childE.tagName()] = QUrl(childE.text());
- } else if (childE.tagName() == QLatin1String("UpdateFile")) {
- UpdateFileInfo ufInfo;
- ufInfo.fileName = childE.text();
- info.updateFiles.append(ufInfo);
- } else {
- info.data[childE.tagName()] = childE.text();
- }
- }
-
- if (!info.data.contains(QLatin1String("CompatLevel"))) {
- setInvalidContentError(tr("CompatUpdate element without CompatLevel"));
- return false;
- }
-
- if (!info.data.contains(QLatin1String("ReleaseDate"))) {
- setInvalidContentError(tr("CompatUpdate element without ReleaseDate"));
- return false;
- }
-
- if (info.updateFiles.isEmpty()) {
- setInvalidContentError(tr("CompatUpdate element without UpdateFile"));
- return false;
- }
updateInfoList.append(info);
return true;
@@ -260,7 +185,7 @@ bool UpdatesInfo::UpdatesInfoData::parseCompatUpdateElement(const QDomElement &u
// UpdatesInfo
//
UpdatesInfo::UpdatesInfo()
- : d(new UpdatesInfo::UpdatesInfoData)
+ : d(new UpdatesInfoData)
{
}
@@ -306,55 +231,19 @@ QString UpdatesInfo::applicationVersion() const
return d->applicationVersion;
}
-int UpdatesInfo::compatLevel() const
-{
- return d->compatLevel;
-}
-
-int UpdatesInfo::updateInfoCount(int type) const
+int UpdatesInfo::updateInfoCount() const
{
- if (type == AllUpdate)
- return d->updateInfoList.count();
-
- int count = 0;
- for (int i = 0; i < d->updateInfoList.count(); ++i) {
- if (d->updateInfoList.at(i).type == type)
- ++count;
- }
- return count;
+ return d->updateInfoList.count();
}
UpdateInfo UpdatesInfo::updateInfo(int index) const
{
if (index < 0 || index >= d->updateInfoList.count())
return UpdateInfo();
-
return d->updateInfoList.at(index);
}
-QList<UpdateInfo> UpdatesInfo::updatesInfo(int type, int compatLevel) const
+QList<UpdateInfo> UpdatesInfo::updatesInfo() const
{
- QList<UpdateInfo> list;
- if (compatLevel == -1) {
- if (type == AllUpdate)
- return d->updateInfoList;
- for (int i = 0; i < d->updateInfoList.count(); ++i) {
- if (d->updateInfoList.at(i).type == type)
- list.append(d->updateInfoList.at(i));
- }
- } else {
- for (int i = 0; i < d->updateInfoList.count(); ++i) {
- UpdateInfo updateInfo = d->updateInfoList.at(i);
- if (updateInfo.type == type) {
- if (updateInfo.type == CompatUpdate) {
- if (updateInfo.data.value(QLatin1String("CompatLevel")) == compatLevel)
- list.append(updateInfo);
- } else {
- if (updateInfo.data.value(QLatin1String("RequiredCompatLevel")) == compatLevel)
- list.append(updateInfo);
- }
- }
- }
- }
- return list;
+ return d->updateInfoList;
}
diff --git a/src/libs/kdtools/kdupdaterupdatesinfo_p.h b/src/libs/kdtools/kdupdaterupdatesinfo_p.h
index 926133eb1..449c851e3 100644
--- a/src/libs/kdtools/kdupdaterupdatesinfo_p.h
+++ b/src/libs/kdtools/kdupdaterupdatesinfo_p.h
@@ -1,65 +1,65 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_UPDATE_INFO_H
#define KD_UPDATER_UPDATE_INFO_H
#include "kdupdater.h"
+#include "kdupdaterupdatesinfodata_p.h"
-#include <QSharedDataPointer>
-#include <QString>
-#include <QDate>
-#include <QList>
-#include <QStringList>
-#include <QUrl>
#include <QHash>
+#include <QSharedData>
#include <QVariant>
-// Classes and structures in this header file are for internal use only.
// They are not a part of the public API
+// Classes and structures in this header file are for internal use only but still exported for auto tests.
namespace KDUpdater {
-struct UpdateFileInfo
-{
- UpdateFileInfo()
- : compressedSize(0),
- uncompressedSize(0)
- {}
-
- QString fileName;
- QByteArray sha1sum;
- quint64 compressedSize;
- quint64 uncompressedSize;
-};
-
-struct UpdateInfo
+struct KDTOOLS_EXPORT UpdateInfo
{
- int type;
QHash<QString, QVariant> data;
- QList<UpdateFileInfo> updateFiles;
};
-class UpdatesInfo
+class KDTOOLS_EXPORT UpdatesInfo
{
public:
enum Error
@@ -75,22 +75,21 @@ public:
~UpdatesInfo();
bool isValid() const;
- QString errorString() const;
+
Error error() const;
+ QString errorString() const;
- void setFileName(const QString &updateXmlFile);
QString fileName() const;
+ void setFileName(const QString &updateXmlFile);
QString applicationName() const;
QString applicationVersion() const;
- int compatLevel() const;
- int updateInfoCount(int type = AllUpdate) const;
+ int updateInfoCount() const;
UpdateInfo updateInfo(int index) const;
- QList<UpdateInfo> updatesInfo(int type = AllUpdate, int compatLevel = -1) const;
+ QList<UpdateInfo> updatesInfo() const;
private:
- struct UpdatesInfoData;
QSharedDataPointer<UpdatesInfoData> d;
};
diff --git a/src/libs/kdtools/kdupdaterupdatesinfodata_p.h b/src/libs/kdtools/kdupdaterupdatesinfodata_p.h
new file mode 100644
index 000000000..c02629aa5
--- /dev/null
+++ b/src/libs/kdtools/kdupdaterupdatesinfodata_p.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef KD_UPDATER_UPDATE_INFO_DATA_H
+#define KD_UPDATER_UPDATE_INFO_DATA_H
+
+#include <QCoreApplication>
+#include <QDomElement>
+#include <QSharedData>
+
+namespace KDUpdater {
+
+struct UpdateInfo;
+
+struct UpdatesInfoData : public QSharedData
+{
+ Q_DECLARE_TR_FUNCTIONS(KDUpdater::UpdatesInfoData)
+
+public:
+ UpdatesInfoData();
+ ~UpdatesInfoData();
+
+ int error;
+ QString errorMessage;
+ QString updateXmlFile;
+ QString applicationName;
+ QString applicationVersion;
+ QList<UpdateInfo> updateInfoList;
+
+ void parseFile(const QString &updateXmlFile);
+ bool parsePackageUpdateElement(const QDomElement &updateE);
+
+ void setInvalidContentError(const QString &detail);
+};
+
+} // namespace KDUpdater
+
+#endif // KD_UPDATER_UPDATE_INFO_DATA_H
diff --git a/src/libs/kdtools/kdupdaterupdatesourcesinfo.cpp b/src/libs/kdtools/kdupdaterupdatesourcesinfo.cpp
index 01f3a96f4..9acd09682 100644
--- a/src/libs/kdtools/kdupdaterupdatesourcesinfo.cpp
+++ b/src/libs/kdtools/kdupdaterupdatesourcesinfo.cpp
@@ -1,27 +1,45 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#include "kdupdaterupdatesourcesinfo.h"
-#include "kdupdaterapplication.h"
#include <QtXml/QDomElement>
#include <QtXml/QDomDocument>
@@ -73,7 +91,7 @@
*/
/*! \var UpdateSourcesInfo::Error UpdateSourcesInfo::InvalidXmlError
- * The source file contains invalid XML.
+ * The source file contains invalid XML.
*/
/*! \var UpdateSourcesInfo::Error UpdateSourcesInfo::InvalidContentError
@@ -97,24 +115,21 @@ struct UpdateSourceInfoPriorityHigherThan
struct UpdateSourcesInfo::UpdateSourcesInfoData
{
- UpdateSourcesInfoData(UpdateSourcesInfo *qq) :
- q(qq),
- error(UpdateSourcesInfo::NotYetReadError),
- application(0),
- modified(false)
+ UpdateSourcesInfoData()
+ : modified(false)
+ , error(UpdateSourcesInfo::NotYetReadError)
{}
- UpdateSourcesInfo *q;
-
- QString errorMessage;
- UpdateSourcesInfo::Error error;
- Application *application;
bool modified;
+ UpdateSourcesInfo::Error error;
+
QString fileName;
+ QString errorMessage;
QList<UpdateSourceInfo> updateSourceInfoList;
void addUpdateSourceFrom(const QDomElement &element);
- void addChildElement(QDomDocument &doc, QDomElement &parentE, const QString &tagName, const QString &text, bool htmlText = false);
+ void addChildElement(QDomDocument &doc, QDomElement &parentE, const QString &tagName,
+ const QString &text, bool htmlText = false);
void setInvalidContentError(const QString &detail);
void clearError();
void saveChanges();
@@ -135,11 +150,10 @@ void UpdateSourcesInfo::UpdateSourcesInfoData::clearError()
/*!
\internal
*/
-UpdateSourcesInfo::UpdateSourcesInfo(Application *application)
- : QObject(application),
- d(new UpdateSourcesInfo::UpdateSourcesInfoData(this))
+UpdateSourcesInfo::UpdateSourcesInfo(QObject *parent)
+ : QObject(parent)
+ , d(new UpdateSourcesInfo::UpdateSourcesInfoData)
{
- d->application = application;
}
/*!
@@ -148,15 +162,6 @@ UpdateSourcesInfo::UpdateSourcesInfo(Application *application)
UpdateSourcesInfo::~UpdateSourcesInfo()
{
d->saveChanges();
- delete d;
-}
-
-/*!
- Returns a pointer to the update application for which this class manages update sources.
-*/
-Application *UpdateSourcesInfo::application() const
-{
- return d->application;
}
/*!
@@ -264,47 +269,6 @@ void UpdateSourcesInfo::removeUpdateSourceInfo(const UpdateSourceInfo &info)
}
/*!
- Removes an update source info at \index in this class. Upon successful removal, the class emits a
- \ref updateSourceInfoRemoved() signal.
-*/
-void UpdateSourcesInfo::removeUpdateSourceInfoAt(int index)
-{
- if (index < 0 || index >= d->updateSourceInfoList.count())
- return;
- UpdateSourceInfo info = d->updateSourceInfoList[index];
- d->updateSourceInfoList.removeAt(index);
- emit updateSourceInfoRemoved(info);
- d->modified = true;
-}
-
-/*!
- Changes the update source info at \c index to \c info. If \c index is equal to the number of
- source info structures in this class (\ref updateSourceInfoCount()) then \c info is appended;
- otherwise the existing info at \c index will be changed.
-
- Depending on what the function does \ref updateSourceInfoAdded() or \ref updateSourceInfoChanged()
- signal is emitted.
-*/
-void UpdateSourcesInfo::setUpdateSourceInfoAt(int index, const UpdateSourceInfo &info)
-{
- if (index < 0 || index > d->updateSourceInfoList.count())
- return;
-
- if (index == d->updateSourceInfoList.count()) {
- d->updateSourceInfoList.append(info);
- emit updateSourceInfoAdded(info);
- } else {
- UpdateSourceInfo oldInfo = d->updateSourceInfoList[index];
- if (info == oldInfo)
- return;
-
- d->updateSourceInfoList[index] = info;
- emit updateSourceInfoChanged(info, oldInfo);
- }
- d->modified = true;
-}
-
-/*!
This slot reloads the update source information from UpdateSources.xml.
*/
void UpdateSourcesInfo::refresh()
@@ -313,14 +277,14 @@ void UpdateSourcesInfo::refresh()
d->updateSourceInfoList.clear();
QFile file(d->fileName);
-
+
// if the file does not exist then we just skip the reading
if (!file.exists()) {
d->clearError();
emit reset();
return;
}
-
+
// Open the XML file
if (!file.open(QFile::ReadOnly)) {
d->errorMessage = tr("Could not read \"%1\"").arg(d->fileName);
@@ -331,35 +295,27 @@ void UpdateSourcesInfo::refresh()
QDomDocument doc;
QString parseErrorMessage;
- int parseErrorLine;
- int parseErrorColumn;
+ int parseErrorLine, parseErrorColumn;
if (!doc.setContent(&file, &parseErrorMessage, &parseErrorLine, &parseErrorColumn)) {
d->error = InvalidXmlError;
- d->errorMessage = tr("XML Parse error in %1 at %2, %3: %4")
- .arg(d->fileName,
- QString::number(parseErrorLine),
- QString::number(parseErrorColumn),
- parseErrorMessage);
+ d->errorMessage = tr("XML Parse error in %1 at %2, %3: %4").arg(d->fileName,
+ QString::number(parseErrorLine), QString::number(parseErrorColumn), parseErrorMessage);
emit reset();
return;
}
// Now parse the XML file.
- QDomElement rootE = doc.documentElement();
+ const QDomElement rootE = doc.documentElement();
if (rootE.tagName() != QLatin1String("UpdateSources")) {
d->setInvalidContentError(tr("Root element %1 unexpected, should be \"UpdateSources\"").arg(rootE.tagName()));
emit reset();
return;
}
- QDomNodeList childNodes = rootE.childNodes();
+ const QDomNodeList childNodes = rootE.childNodes();
for (int i = 0; i < childNodes.count(); i++) {
- QDomNode childNode = childNodes.item(i);
- QDomElement childNodeE = childNode.toElement();
- if (childNodeE.isNull())
- continue;
-
- if (childNodeE.tagName() == QLatin1String("UpdateSource"))
+ QDomElement childNodeE = childNodes.item(i).toElement();
+ if ((!childNodeE.isNull()) && (childNodeE.tagName() == QLatin1String("UpdateSource")))
d->addUpdateSourceFrom(childNodeE);
}
@@ -372,23 +328,20 @@ void UpdateSourcesInfo::UpdateSourcesInfoData::saveChanges()
if (!modified || fileName.isEmpty())
return;
- const bool hadSaveError = error == UpdateSourcesInfo::CouldNotSaveChangesError;
-
- QDomDocument doc;
+ const bool hadSaveError = (error == UpdateSourcesInfo::CouldNotSaveChangesError);
+ QDomDocument doc;
QDomElement rootE = doc.createElement(QLatin1String("UpdateSources"));
doc.appendChild(rootE);
- for (int i = 0; i < updateSourceInfoList.count(); i++) {
- UpdateSourceInfo info = updateSourceInfoList.at(i);
-
+ foreach (const UpdateSourceInfo &info, updateSourceInfoList) {
QDomElement infoE = doc.createElement(QLatin1String("UpdateSource"));
rootE.appendChild(infoE);
addChildElement(doc, infoE, QLatin1String("Name"), info.name);
addChildElement(doc, infoE, QLatin1String("Title"), info.title);
- addChildElement(doc, infoE, QLatin1String("Description"), info.description,
- (info.description.length() && info.description.at(0) == QLatin1Char('<')));
- addChildElement(doc, infoE, QLatin1String("Url"), info.url.toString());
+ addChildElement(doc, infoE, QLatin1String("Description"), info.description,
+ (info.description.length() && info.description.at(0) == QLatin1Char('<')));
+ addChildElement(doc, infoE, QLatin1String("Url"), info.url.toString());
}
QFile file(fileName);
@@ -397,7 +350,7 @@ void UpdateSourcesInfo::UpdateSourcesInfoData::saveChanges()
errorMessage = tr("Could not save changes to \"%1\": %2").arg(fileName, file.errorString());
return;
}
-
+
QTextStream stream(&file);
doc.save(stream, 2);
stream.flush();
@@ -408,11 +361,11 @@ void UpdateSourcesInfo::UpdateSourcesInfoData::saveChanges()
errorMessage = tr("Could not save changes to \"%1\": %2").arg(fileName, file.errorString());
return;
}
-
+
//if there was a write error before, clear the error, as the write was successful now
if (hadSaveError)
clearError();
-
+
modified = false;
}
@@ -421,15 +374,13 @@ void UpdateSourcesInfo::UpdateSourcesInfoData::addUpdateSourceFrom(const QDomEle
if (element.tagName() != QLatin1String("UpdateSource"))
return;
- QDomNodeList childNodes = element.childNodes();
+ const QDomNodeList childNodes = element.childNodes();
if (!childNodes.count())
return;
UpdateSourceInfo info;
-
- for (int i = 0; i<childNodes.count(); i++) {
- QDomNode childNode = childNodes.item(i);
- QDomElement childNodeE = childNode.toElement();
+ for (int i = 0; i < childNodes.count(); ++i) {
+ const QDomElement childNodeE = childNodes.item(i).toElement();
if (childNodeE.isNull())
continue;
@@ -442,22 +393,15 @@ void UpdateSourcesInfo::UpdateSourcesInfoData::addUpdateSourceFrom(const QDomEle
else if (childNodeE.tagName() == QLatin1String("Url"))
info.url = childNodeE.text();
}
-
this->updateSourceInfoList.append(info);
}
-void UpdateSourcesInfo::UpdateSourcesInfoData::addChildElement(QDomDocument &doc, QDomElement &parentE, const QString &tagName, const QString &text, bool htmlText)
+void UpdateSourcesInfo::UpdateSourcesInfoData::addChildElement(QDomDocument &doc, QDomElement &parentE,
+ const QString &tagName, const QString &text, bool htmlText)
{
QDomElement childE = doc.createElement(tagName);
parentE.appendChild(childE);
-
- if (htmlText) {
- QDomCDATASection textE = doc.createCDATASection(text);
- childE.appendChild(textE);
- } else {
- QDomText textE = doc.createTextNode(text);
- childE.appendChild(textE);
- }
+ childE.appendChild(htmlText ? doc.createCDATASection(text) : doc.createTextNode(text));
}
/*!
@@ -491,10 +435,10 @@ void UpdateSourcesInfo::UpdateSourcesInfoData::addChildElement(QDomDocument &doc
namespace KDUpdater {
-bool operator==(const UpdateSourceInfo &lhs, const UpdateSourceInfo &rhs)
+bool operator== (const UpdateSourceInfo &lhs, const UpdateSourceInfo &rhs)
{
- return lhs.name == rhs.name && lhs.title == rhs.title
- && lhs.description == rhs.description && lhs.url == rhs.url;
+ return lhs.name == rhs.name && lhs.title == rhs.title && lhs.description == rhs.description
+ && lhs.url == rhs.url;
}
} // namespace KDUpdater
diff --git a/src/libs/kdtools/kdupdaterupdatesourcesinfo.h b/src/libs/kdtools/kdupdaterupdatesourcesinfo.h
index 2afeda966..23ffaf6a8 100644
--- a/src/libs/kdtools/kdupdaterupdatesourcesinfo.h
+++ b/src/libs/kdtools/kdupdaterupdatesourcesinfo.h
@@ -1,29 +1,48 @@
/****************************************************************************
-** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved.
**
-** This file is part of the KD Tools library.
+** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB)
+** Contact: http://www.qt-project.org/legal
**
-** Licensees holding valid commercial KD Tools licenses may use this file in
-** accordance with the KD Tools Commercial License Agreement provided with
-** the Software.
+** This file is part of the Qt Installer Framework.
**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 and version 3 as published by the
-** Free Software Foundation and appearing in the file LICENSE.LGPL included.
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** Contact info@kdab.com if any conditions of this licensing are not
-** clear to you.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
-**********************************************************************/
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
#ifndef KD_UPDATER_UPDATE_SOURCES_INFO_H
#define KD_UPDATER_UPDATE_SOURCES_INFO_H
-#include "kdupdater.h"
+#include "kdtoolsglobal.h"
#include <QObject>
#include <QVariant>
@@ -31,8 +50,6 @@
namespace KDUpdater {
-class Application;
-
struct KDTOOLS_EXPORT UpdateSourceInfo
{
UpdateSourceInfo() : priority(-1) { }
@@ -68,8 +85,6 @@ public:
CouldNotSaveChangesError
};
- Application *application() const;
-
bool isValid() const;
QString errorString() const;
Error error() const;
@@ -85,11 +100,10 @@ public:
void addUpdateSourceInfo(const UpdateSourceInfo &info);
void removeUpdateSourceInfo(const UpdateSourceInfo &info);
- void removeUpdateSourceInfoAt(int index);
- void setUpdateSourceInfoAt(int index, const UpdateSourceInfo &info);
protected:
- explicit UpdateSourcesInfo(Application *application);
+ friend class Application;
+ explicit UpdateSourcesInfo(QObject *parent = 0);
public Q_SLOTS:
void refresh();
@@ -98,13 +112,10 @@ Q_SIGNALS:
void reset();
void updateSourceInfoAdded(const UpdateSourceInfo &info);
void updateSourceInfoRemoved(const UpdateSourceInfo &info);
- void updateSourceInfoChanged(const UpdateSourceInfo &newInfo,
- const UpdateSourceInfo &oldInfo);
private:
- friend class Application;
struct UpdateSourcesInfoData;
- UpdateSourcesInfoData *d;
+ QScopedPointer<UpdateSourcesInfoData> d;
};
} // namespace KDUpdater