summaryrefslogtreecommitdiffstats
path: root/src/libs/7zip/win
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2022-04-06 13:33:38 +0300
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2022-04-13 11:32:09 +0300
commit96ade47c182bf37a2efca2aa62922e54e5ff1660 (patch)
tree93ceee6c6f8984f563f3dfe83e56f98b66b40f3a /src/libs/7zip/win
parent2d5f0ffaf1278516bbd74e3b60f9849f4c51cffa (diff)
Move LZMA SDK to 3rdparty subdirectory
Also add attribution document. Task-number: QTIFW-2336 Change-Id: I91546bc6c3ace244e4b546b945f40b7d204f7463 Reviewed-by: Katja Marttila <katja.marttila@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'src/libs/7zip/win')
-rw-r--r--src/libs/7zip/win/C/7zCrc.c85
-rw-r--r--src/libs/7zip/win/C/7zCrc.h25
-rw-r--r--src/libs/7zip/win/C/7zCrcOpt.c66
-rw-r--r--src/libs/7zip/win/C/7zStream.c171
-rw-r--r--src/libs/7zip/win/C/7zTypes.h256
-rw-r--r--src/libs/7zip/win/C/7zVersion.h10
-rw-r--r--src/libs/7zip/win/C/Alloc.c127
-rw-r--r--src/libs/7zip/win/C/Alloc.h38
-rw-r--r--src/libs/7zip/win/C/Bra.c135
-rw-r--r--src/libs/7zip/win/C/Bra.h64
-rw-r--r--src/libs/7zip/win/C/Bra86.c82
-rw-r--r--src/libs/7zip/win/C/BraIA64.c69
-rw-r--r--src/libs/7zip/win/C/C.pri48
-rw-r--r--src/libs/7zip/win/C/Compiler.h28
-rw-r--r--src/libs/7zip/win/C/CpuArch.c190
-rw-r--r--src/libs/7zip/win/C/CpuArch.h157
-rw-r--r--src/libs/7zip/win/C/Delta.c64
-rw-r--r--src/libs/7zip/win/C/Delta.h19
-rw-r--r--src/libs/7zip/win/C/LzFind.c763
-rw-r--r--src/libs/7zip/win/C/LzFind.h111
-rw-r--r--src/libs/7zip/win/C/LzFindMt.c794
-rw-r--r--src/libs/7zip/win/C/LzFindMt.h101
-rw-r--r--src/libs/7zip/win/C/LzHash.h54
-rw-r--r--src/libs/7zip/win/C/Lzma2Dec.c352
-rw-r--r--src/libs/7zip/win/C/Lzma2Dec.h80
-rw-r--r--src/libs/7zip/win/C/Lzma2Enc.c493
-rw-r--r--src/libs/7zip/win/C/Lzma2Enc.h62
-rw-r--r--src/libs/7zip/win/C/LzmaDec.c1025
-rw-r--r--src/libs/7zip/win/C/LzmaDec.h227
-rw-r--r--src/libs/7zip/win/C/LzmaEnc.c2278
-rw-r--r--src/libs/7zip/win/C/LzmaEnc.h78
-rw-r--r--src/libs/7zip/win/C/MtCoder.c329
-rw-r--r--src/libs/7zip/win/C/MtCoder.h98
-rw-r--r--src/libs/7zip/win/C/Precomp.h10
-rw-r--r--src/libs/7zip/win/C/RotateDefs.h26
-rw-r--r--src/libs/7zip/win/C/Sha256.c206
-rw-r--r--src/libs/7zip/win/C/Sha256.h26
-rw-r--r--src/libs/7zip/win/C/Threads.c93
-rw-r--r--src/libs/7zip/win/C/Threads.h67
-rw-r--r--src/libs/7zip/win/C/Xz.c90
-rw-r--r--src/libs/7zip/win/C/Xz.h275
-rw-r--r--src/libs/7zip/win/C/XzCrc64.c90
-rw-r--r--src/libs/7zip/win/C/XzCrc64.h26
-rw-r--r--src/libs/7zip/win/C/XzCrc64Opt.c69
-rw-r--r--src/libs/7zip/win/C/XzDec.c909
-rw-r--r--src/libs/7zip/win/C/XzEnc.c522
-rw-r--r--src/libs/7zip/win/C/XzEnc.h39
-rw-r--r--src/libs/7zip/win/C/XzIn.c307
-rw-r--r--src/libs/7zip/win/CPP/7zip/7zip.pri6
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7z.pri30
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zCompressionMode.h49
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zDecode.cpp343
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zDecode.h65
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zEncode.cpp464
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zEncode.h57
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zExtract.cpp262
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderInStream.cpp123
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderInStream.h58
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderOutStream.cpp149
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderOutStream.h58
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandler.cpp753
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandler.h179
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandlerOut.cpp875
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zHeader.cpp19
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zHeader.h101
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zIn.cpp1679
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zIn.h412
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zItem.h186
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zOut.cpp901
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zOut.h319
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zProperties.cpp170
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zProperties.h22
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zRegister.cpp25
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zSpecStream.cpp22
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zSpecStream.h35
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zUpdate.cpp1363
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/7zUpdate.h120
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/7z/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Archive.pri6
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2.cpp119
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2.h179
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2MT.cpp218
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2MT.h83
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/Common.pri19
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/DummyOutStream.cpp17
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/DummyOutStream.h25
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/HandlerOut.cpp141
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/HandlerOut.h65
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/InStreamWithCRC.cpp46
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/InStreamWithCRC.h67
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/ItemNameUtils.cpp88
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/ItemNameUtils.h27
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/MultiStream.cpp191
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/MultiStream.h89
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp18
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithCRC.h37
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/ParseProperties.h6
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/Common/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/IArchive.h476
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/LzmaHandler.cpp604
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/SplitHandler.cpp369
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/Archive/XzHandler.cpp991
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/CWrappers.cpp230
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/CWrappers.h114
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/Common.pri40
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/CreateCoder.cpp391
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/CreateCoder.h127
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/FilePathAutoRename.cpp55
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/FilePathAutoRename.h10
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/FileStreams.cpp435
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/FileStreams.h148
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/FilterCoder.cpp265
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/FilterCoder.h142
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/InBuffer.cpp135
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/InBuffer.h90
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/InOutTempBuffer.cpp119
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/InOutTempBuffer.h46
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/LimitedStreams.cpp349
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/LimitedStreams.h251
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/LockedStream.cpp23
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/LockedStream.h38
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/MethodId.h10
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/MethodProps.cpp441
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/MethodProps.h185
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/OutBuffer.cpp111
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/OutBuffer.h63
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/ProgressUtils.cpp42
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/ProgressUtils.h34
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/PropId.cpp99
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/RegisterArc.h73
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/RegisterCodec.h66
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/StreamBinder.cpp126
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/StreamBinder.h34
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/StreamObjects.cpp250
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/StreamObjects.h140
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/StreamUtils.cpp56
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/StreamUtils.h13
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/UniqBlocks.cpp56
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/UniqBlocks.h30
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/VirtThread.cpp48
-rw-r--r--src/libs/7zip/win/CPP/7zip/Common/VirtThread.h24
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Bcj2Coder.cpp366
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Bcj2Coder.h82
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Bcj2Register.cpp19
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BcjCoder.cpp15
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BcjCoder.h19
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BcjRegister.cpp19
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BranchCoder.cpp19
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BranchCoder.h44
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BranchMisc.cpp21
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BranchMisc.h14
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/BranchRegister.cpp30
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/ByteSwap.cpp73
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Compress.pri30
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/CopyCoder.cpp74
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/CopyCoder.h35
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/CopyRegister.cpp14
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/DeltaFilter.cpp125
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Lzma2Decoder.cpp189
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Lzma2Decoder.h73
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Lzma2Encoder.cpp94
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Lzma2Encoder.h36
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/Lzma2Register.cpp20
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/LzmaDecoder.cpp266
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/LzmaDecoder.h88
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/LzmaEncoder.cpp161
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/LzmaEncoder.h38
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/LzmaRegister.cpp20
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/RangeCoder.h201
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/RangeCoderBit.h114
-rw-r--r--src/libs/7zip/win/CPP/7zip/Compress/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/Guid.txt192
-rw-r--r--src/libs/7zip/win/CPP/7zip/ICoder.h211
-rw-r--r--src/libs/7zip/win/CPP/7zip/IDecl.h15
-rw-r--r--src/libs/7zip/win/CPP/7zip/IPassword.h23
-rw-r--r--src/libs/7zip/win/CPP/7zip/IProgress.h33
-rw-r--r--src/libs/7zip/win/CPP/7zip/IStream.h127
-rw-r--r--src/libs/7zip/win/CPP/7zip/PropID.h124
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveCommandLine.cpp1257
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveCommandLine.h122
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp1191
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveExtractCallback.h299
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp125
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveOpenCallback.h111
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/Common.pri44
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/DefaultName.cpp35
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/DefaultName.h11
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/DirItem.h126
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/EnumDirItems.cpp757
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/EnumDirItems.h27
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/Extract.cpp473
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/Extract.h94
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/ExtractMode.h33
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/ExtractingFilePath.cpp190
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/ExtractingFilePath.h21
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/HashCalc.cpp361
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/HashCalc.h107
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/IFileExtractCallback.h72
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/LoadCodecs.cpp900
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/LoadCodecs.h303
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/OpenArchive.cpp3211
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/OpenArchive.h346
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/PropIDUtils.cpp553
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/PropIDUtils.h17
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/Property.h14
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/SetProperties.cpp80
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/SetProperties.h10
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/SortUtils.cpp23
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/SortUtils.h10
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/TempFiles.cpp21
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/TempFiles.h16
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/Update.cpp1477
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/Update.h188
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/UpdateAction.cpp64
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/UpdateAction.h66
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/UpdateCallback.cpp574
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/UpdateCallback.h122
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/UpdatePair.cpp233
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/UpdatePair.h27
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/UpdateProduce.cpp73
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Common/UpdateProduce.h55
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Console/Console.pri4
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Console/PercentPrinter.cpp102
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Console/PercentPrinter.h30
-rw-r--r--src/libs/7zip/win/CPP/7zip/UI/Console/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/Common/ComTry.h17
-rw-r--r--src/libs/7zip/win/CPP/Common/CommandLineParser.cpp198
-rw-r--r--src/libs/7zip/win/CPP/Common/CommandLineParser.h63
-rw-r--r--src/libs/7zip/win/CPP/Common/Common.h13
-rw-r--r--src/libs/7zip/win/CPP/Common/Common.pri35
-rw-r--r--src/libs/7zip/win/CPP/Common/Defs.h20
-rw-r--r--src/libs/7zip/win/CPP/Common/IntToString.cpp146
-rw-r--r--src/libs/7zip/win/CPP/Common/IntToString.h24
-rw-r--r--src/libs/7zip/win/CPP/Common/ListFileUtils.cpp117
-rw-r--r--src/libs/7zip/win/CPP/Common/ListFileUtils.h14
-rw-r--r--src/libs/7zip/win/CPP/Common/MyBuffer.h237
-rw-r--r--src/libs/7zip/win/CPP/Common/MyCom.h242
-rw-r--r--src/libs/7zip/win/CPP/Common/MyException.h14
-rw-r--r--src/libs/7zip/win/CPP/Common/MyGuidDef.h54
-rw-r--r--src/libs/7zip/win/CPP/Common/MyInitGuid.h45
-rw-r--r--src/libs/7zip/win/CPP/Common/MyString.cpp1215
-rw-r--r--src/libs/7zip/win/CPP/Common/MyString.h525
-rw-r--r--src/libs/7zip/win/CPP/Common/MyTypes.h30
-rw-r--r--src/libs/7zip/win/CPP/Common/MyUnknown.h13
-rw-r--r--src/libs/7zip/win/CPP/Common/MyVector.h615
-rw-r--r--src/libs/7zip/win/CPP/Common/MyWindows.cpp145
-rw-r--r--src/libs/7zip/win/CPP/Common/MyWindows.h216
-rw-r--r--src/libs/7zip/win/CPP/Common/NewHandler.cpp162
-rw-r--r--src/libs/7zip/win/CPP/Common/NewHandler.h68
-rw-r--r--src/libs/7zip/win/CPP/Common/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/Common/StdOutStream.cpp106
-rw-r--r--src/libs/7zip/win/CPP/Common/StdOutStream.h62
-rw-r--r--src/libs/7zip/win/CPP/Common/StringConvert.cpp165
-rw-r--r--src/libs/7zip/win/CPP/Common/StringConvert.h77
-rw-r--r--src/libs/7zip/win/CPP/Common/StringToInt.cpp144
-rw-r--r--src/libs/7zip/win/CPP/Common/StringToInt.h21
-rw-r--r--src/libs/7zip/win/CPP/Common/UTFConvert.cpp176
-rw-r--r--src/libs/7zip/win/CPP/Common/UTFConvert.h12
-rw-r--r--src/libs/7zip/win/CPP/Common/Wildcard.cpp615
-rw-r--r--src/libs/7zip/win/CPP/Common/Wildcard.h157
-rw-r--r--src/libs/7zip/win/CPP/Windows/DLL.cpp110
-rw-r--r--src/libs/7zip/win/CPP/Windows/DLL.h52
-rw-r--r--src/libs/7zip/win/CPP/Windows/Defs.h17
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileDir.cpp583
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileDir.h97
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileFind.cpp579
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileFind.h158
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileIO.cpp432
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileIO.h201
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileLink.cpp426
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileMapping.h66
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileName.cpp687
-rw-r--r--src/libs/7zip/win/CPP/Windows/FileName.h74
-rw-r--r--src/libs/7zip/win/CPP/Windows/Handle.h37
-rw-r--r--src/libs/7zip/win/CPP/Windows/PropVariant.cpp300
-rw-r--r--src/libs/7zip/win/CPP/Windows/PropVariant.h107
-rw-r--r--src/libs/7zip/win/CPP/Windows/PropVariantConv.cpp99
-rw-r--r--src/libs/7zip/win/CPP/Windows/PropVariantConv.h30
-rw-r--r--src/libs/7zip/win/CPP/Windows/SecurityUtils.cpp179
-rw-r--r--src/libs/7zip/win/CPP/Windows/SecurityUtils.h167
-rw-r--r--src/libs/7zip/win/CPP/Windows/StdAfx.h8
-rw-r--r--src/libs/7zip/win/CPP/Windows/Synchronization.cpp10
-rw-r--r--src/libs/7zip/win/CPP/Windows/Synchronization.h164
-rw-r--r--src/libs/7zip/win/CPP/Windows/System.cpp72
-rw-r--r--src/libs/7zip/win/CPP/Windows/System.h16
-rw-r--r--src/libs/7zip/win/CPP/Windows/Thread.h38
-rw-r--r--src/libs/7zip/win/CPP/Windows/TimeUtils.cpp203
-rw-r--r--src/libs/7zip/win/CPP/Windows/TimeUtils.h23
-rw-r--r--src/libs/7zip/win/CPP/Windows/Windows.pri29
-rw-r--r--src/libs/7zip/win/win.pri11
293 files changed, 0 insertions, 56670 deletions
diff --git a/src/libs/7zip/win/C/7zCrc.c b/src/libs/7zip/win/C/7zCrc.c
deleted file mode 100644
index 5f32380dd..000000000
--- a/src/libs/7zip/win/C/7zCrc.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/* 7zCrc.c -- CRC32 init
-2013-11-12 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "7zCrc.h"
-#include "CpuArch.h"
-
-#define kCrcPoly 0xEDB88320
-
-#ifdef MY_CPU_X86_OR_AMD64
- #define CRC_NUM_TABLES 8
- UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table);
-#elif defined(MY_CPU_LE)
- #define CRC_NUM_TABLES 4
-#else
- #define CRC_NUM_TABLES 5
- #define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24))
- UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table);
-#endif
-
-#ifndef MY_CPU_BE
- UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table);
-#endif
-
-typedef UInt32 (MY_FAST_CALL *CRC_FUNC)(UInt32 v, const void *data, size_t size, const UInt32 *table);
-
-CRC_FUNC g_CrcUpdate;
-UInt32 g_CrcTable[256 * CRC_NUM_TABLES];
-
-UInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size)
-{
- return g_CrcUpdate(v, data, size, g_CrcTable);
-}
-
-UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size)
-{
- return g_CrcUpdate(CRC_INIT_VAL, data, size, g_CrcTable) ^ CRC_INIT_VAL;
-}
-
-void MY_FAST_CALL CrcGenerateTable()
-{
- UInt32 i;
- for (i = 0; i < 256; i++)
- {
- UInt32 r = i;
- unsigned j;
- for (j = 0; j < 8; j++)
- r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));
- g_CrcTable[i] = r;
- }
- for (; i < 256 * CRC_NUM_TABLES; i++)
- {
- UInt32 r = g_CrcTable[i - 256];
- g_CrcTable[i] = g_CrcTable[r & 0xFF] ^ (r >> 8);
- }
-
- #ifdef MY_CPU_LE
-
- g_CrcUpdate = CrcUpdateT4;
-
- #if CRC_NUM_TABLES == 8
- if (!CPU_Is_InOrder())
- g_CrcUpdate = CrcUpdateT8;
- #endif
-
- #else
- {
- #ifndef MY_CPU_BE
- UInt32 k = 1;
- if (*(const Byte *)&k == 1)
- g_CrcUpdate = CrcUpdateT4;
- else
- #endif
- {
- for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--)
- {
- UInt32 x = g_CrcTable[i - 256];
- g_CrcTable[i] = CRC_UINT32_SWAP(x);
- }
- g_CrcUpdate = CrcUpdateT1_BeT4;
- }
- }
- #endif
-}
diff --git a/src/libs/7zip/win/C/7zCrc.h b/src/libs/7zip/win/C/7zCrc.h
deleted file mode 100644
index 8fd579587..000000000
--- a/src/libs/7zip/win/C/7zCrc.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* 7zCrc.h -- CRC32 calculation
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __7Z_CRC_H
-#define __7Z_CRC_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-extern UInt32 g_CrcTable[];
-
-/* Call CrcGenerateTable one time before other CRC functions */
-void MY_FAST_CALL CrcGenerateTable(void);
-
-#define CRC_INIT_VAL 0xFFFFFFFF
-#define CRC_GET_DIGEST(crc) ((crc) ^ CRC_INIT_VAL)
-#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))
-
-UInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size);
-UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/7zCrcOpt.c b/src/libs/7zip/win/C/7zCrcOpt.c
deleted file mode 100644
index ce132b5d4..000000000
--- a/src/libs/7zip/win/C/7zCrcOpt.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* 7zCrcOpt.c -- CRC32 calculation
-2013-11-12 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "CpuArch.h"
-
-#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))
-
-#ifndef MY_CPU_BE
-
-UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table)
-{
- const Byte *p = (const Byte *)data;
- for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)
- v = CRC_UPDATE_BYTE_2(v, *p);
- for (; size >= 4; size -= 4, p += 4)
- {
- v ^= *(const UInt32 *)p;
- v =
- table[0x300 + (v & 0xFF)] ^
- table[0x200 + ((v >> 8) & 0xFF)] ^
- table[0x100 + ((v >> 16) & 0xFF)] ^
- table[0x000 + ((v >> 24))];
- }
- for (; size > 0; size--, p++)
- v = CRC_UPDATE_BYTE_2(v, *p);
- return v;
-}
-
-UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table)
-{
- return CrcUpdateT4(v, data, size, table);
-}
-
-#endif
-
-
-#ifndef MY_CPU_LE
-
-#define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24))
-
-UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table)
-{
- const Byte *p = (const Byte *)data;
- for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)
- v = CRC_UPDATE_BYTE_2(v, *p);
- v = CRC_UINT32_SWAP(v);
- table += 0x100;
- for (; size >= 4; size -= 4, p += 4)
- {
- v ^= *(const UInt32 *)p;
- v =
- table[0x000 + (v & 0xFF)] ^
- table[0x100 + ((v >> 8) & 0xFF)] ^
- table[0x200 + ((v >> 16) & 0xFF)] ^
- table[0x300 + ((v >> 24))];
- }
- table -= 0x100;
- v = CRC_UINT32_SWAP(v);
- for (; size > 0; size--, p++)
- v = CRC_UPDATE_BYTE_2(v, *p);
- return v;
-}
-
-#endif
diff --git a/src/libs/7zip/win/C/7zStream.c b/src/libs/7zip/win/C/7zStream.c
deleted file mode 100644
index 88f9c42b1..000000000
--- a/src/libs/7zip/win/C/7zStream.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/* 7zStream.c -- 7z Stream functions
-2013-11-12 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include <string.h>
-
-#include "7zTypes.h"
-
-SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType)
-{
- while (size != 0)
- {
- size_t processed = size;
- RINOK(stream->Read(stream, buf, &processed));
- if (processed == 0)
- return errorType;
- buf = (void *)((Byte *)buf + processed);
- size -= processed;
- }
- return SZ_OK;
-}
-
-SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size)
-{
- return SeqInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF);
-}
-
-SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf)
-{
- size_t processed = 1;
- RINOK(stream->Read(stream, buf, &processed));
- return (processed == 1) ? SZ_OK : SZ_ERROR_INPUT_EOF;
-}
-
-SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset)
-{
- Int64 t = offset;
- return stream->Seek(stream, &t, SZ_SEEK_SET);
-}
-
-SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size)
-{
- const void *lookBuf;
- if (*size == 0)
- return SZ_OK;
- RINOK(stream->Look(stream, &lookBuf, size));
- memcpy(buf, lookBuf, *size);
- return stream->Skip(stream, *size);
-}
-
-SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType)
-{
- while (size != 0)
- {
- size_t processed = size;
- RINOK(stream->Read(stream, buf, &processed));
- if (processed == 0)
- return errorType;
- buf = (void *)((Byte *)buf + processed);
- size -= processed;
- }
- return SZ_OK;
-}
-
-SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size)
-{
- return LookInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF);
-}
-
-static SRes LookToRead_Look_Lookahead(void *pp, const void **buf, size_t *size)
-{
- SRes res = SZ_OK;
- CLookToRead *p = (CLookToRead *)pp;
- size_t size2 = p->size - p->pos;
- if (size2 == 0 && *size > 0)
- {
- p->pos = 0;
- size2 = LookToRead_BUF_SIZE;
- res = p->realStream->Read(p->realStream, p->buf, &size2);
- p->size = size2;
- }
- if (size2 < *size)
- *size = size2;
- *buf = p->buf + p->pos;
- return res;
-}
-
-static SRes LookToRead_Look_Exact(void *pp, const void **buf, size_t *size)
-{
- SRes res = SZ_OK;
- CLookToRead *p = (CLookToRead *)pp;
- size_t size2 = p->size - p->pos;
- if (size2 == 0 && *size > 0)
- {
- p->pos = 0;
- if (*size > LookToRead_BUF_SIZE)
- *size = LookToRead_BUF_SIZE;
- res = p->realStream->Read(p->realStream, p->buf, size);
- size2 = p->size = *size;
- }
- if (size2 < *size)
- *size = size2;
- *buf = p->buf + p->pos;
- return res;
-}
-
-static SRes LookToRead_Skip(void *pp, size_t offset)
-{
- CLookToRead *p = (CLookToRead *)pp;
- p->pos += offset;
- return SZ_OK;
-}
-
-static SRes LookToRead_Read(void *pp, void *buf, size_t *size)
-{
- CLookToRead *p = (CLookToRead *)pp;
- size_t rem = p->size - p->pos;
- if (rem == 0)
- return p->realStream->Read(p->realStream, buf, size);
- if (rem > *size)
- rem = *size;
- memcpy(buf, p->buf + p->pos, rem);
- p->pos += rem;
- *size = rem;
- return SZ_OK;
-}
-
-static SRes LookToRead_Seek(void *pp, Int64 *pos, ESzSeek origin)
-{
- CLookToRead *p = (CLookToRead *)pp;
- p->pos = p->size = 0;
- return p->realStream->Seek(p->realStream, pos, origin);
-}
-
-void LookToRead_CreateVTable(CLookToRead *p, int lookahead)
-{
- p->s.Look = lookahead ?
- LookToRead_Look_Lookahead :
- LookToRead_Look_Exact;
- p->s.Skip = LookToRead_Skip;
- p->s.Read = LookToRead_Read;
- p->s.Seek = LookToRead_Seek;
-}
-
-void LookToRead_Init(CLookToRead *p)
-{
- p->pos = p->size = 0;
-}
-
-static SRes SecToLook_Read(void *pp, void *buf, size_t *size)
-{
- CSecToLook *p = (CSecToLook *)pp;
- return LookInStream_LookRead(p->realStream, buf, size);
-}
-
-void SecToLook_CreateVTable(CSecToLook *p)
-{
- p->s.Read = SecToLook_Read;
-}
-
-static SRes SecToRead_Read(void *pp, void *buf, size_t *size)
-{
- CSecToRead *p = (CSecToRead *)pp;
- return p->realStream->Read(p->realStream, buf, size);
-}
-
-void SecToRead_CreateVTable(CSecToRead *p)
-{
- p->s.Read = SecToRead_Read;
-}
diff --git a/src/libs/7zip/win/C/7zTypes.h b/src/libs/7zip/win/C/7zTypes.h
deleted file mode 100644
index 778413ef4..000000000
--- a/src/libs/7zip/win/C/7zTypes.h
+++ /dev/null
@@ -1,256 +0,0 @@
-/* 7zTypes.h -- Basic types
-2013-11-12 : Igor Pavlov : Public domain */
-
-#ifndef __7Z_TYPES_H
-#define __7Z_TYPES_H
-
-#ifdef _WIN32
-/* #include <windows.h> */
-#endif
-
-#include <stddef.h>
-
-#ifndef EXTERN_C_BEGIN
-#ifdef __cplusplus
-#define EXTERN_C_BEGIN extern "C" {
-#define EXTERN_C_END }
-#else
-#define EXTERN_C_BEGIN
-#define EXTERN_C_END
-#endif
-#endif
-
-EXTERN_C_BEGIN
-
-#define SZ_OK 0
-
-#define SZ_ERROR_DATA 1
-#define SZ_ERROR_MEM 2
-#define SZ_ERROR_CRC 3
-#define SZ_ERROR_UNSUPPORTED 4
-#define SZ_ERROR_PARAM 5
-#define SZ_ERROR_INPUT_EOF 6
-#define SZ_ERROR_OUTPUT_EOF 7
-#define SZ_ERROR_READ 8
-#define SZ_ERROR_WRITE 9
-#define SZ_ERROR_PROGRESS 10
-#define SZ_ERROR_FAIL 11
-#define SZ_ERROR_THREAD 12
-
-#define SZ_ERROR_ARCHIVE 16
-#define SZ_ERROR_NO_ARCHIVE 17
-
-typedef int SRes;
-
-#ifdef _WIN32
-/* typedef DWORD WRes; */
-typedef unsigned WRes;
-#else
-typedef int WRes;
-#endif
-
-#ifndef RINOK
-#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
-#endif
-
-typedef unsigned char Byte;
-typedef short Int16;
-typedef unsigned short UInt16;
-
-#ifdef _LZMA_UINT32_IS_ULONG
-typedef long Int32;
-typedef unsigned long UInt32;
-#else
-typedef int Int32;
-typedef unsigned int UInt32;
-#endif
-
-#ifdef _SZ_NO_INT_64
-
-/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
- NOTES: Some code will work incorrectly in that case! */
-
-typedef long Int64;
-typedef unsigned long UInt64;
-
-#else
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-typedef __int64 Int64;
-typedef unsigned __int64 UInt64;
-#define UINT64_CONST(n) n
-#else
-typedef long long int Int64;
-typedef unsigned long long int UInt64;
-#define UINT64_CONST(n) n ## ULL
-#endif
-
-#endif
-
-#ifdef _LZMA_NO_SYSTEM_SIZE_T
-typedef UInt32 SizeT;
-#else
-typedef size_t SizeT;
-#endif
-
-typedef int Bool;
-#define True 1
-#define False 0
-
-
-#ifdef _WIN32
-#define MY_STD_CALL __stdcall
-#else
-#define MY_STD_CALL
-#endif
-
-#ifdef _MSC_VER
-
-#if _MSC_VER >= 1300
-#define MY_NO_INLINE __declspec(noinline)
-#else
-#define MY_NO_INLINE
-#endif
-
-#define MY_CDECL __cdecl
-#define MY_FAST_CALL __fastcall
-
-#else
-
-#define MY_NO_INLINE
-#define MY_CDECL
-#define MY_FAST_CALL
-
-#endif
-
-
-/* The following interfaces use first parameter as pointer to structure */
-
-typedef struct
-{
- Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */
-} IByteIn;
-
-typedef struct
-{
- void (*Write)(void *p, Byte b);
-} IByteOut;
-
-typedef struct
-{
- SRes (*Read)(void *p, void *buf, size_t *size);
- /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
- (output(*size) < input(*size)) is allowed */
-} ISeqInStream;
-
-/* it can return SZ_ERROR_INPUT_EOF */
-SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);
-SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);
-SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);
-
-typedef struct
-{
- size_t (*Write)(void *p, const void *buf, size_t size);
- /* Returns: result - the number of actually written bytes.
- (result < size) means error */
-} ISeqOutStream;
-
-typedef enum
-{
- SZ_SEEK_SET = 0,
- SZ_SEEK_CUR = 1,
- SZ_SEEK_END = 2
-} ESzSeek;
-
-typedef struct
-{
- SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */
- SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
-} ISeekInStream;
-
-typedef struct
-{
- SRes (*Look)(void *p, const void **buf, size_t *size);
- /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
- (output(*size) > input(*size)) is not allowed
- (output(*size) < input(*size)) is allowed */
- SRes (*Skip)(void *p, size_t offset);
- /* offset must be <= output(*size) of Look */
-
- SRes (*Read)(void *p, void *buf, size_t *size);
- /* reads directly (without buffer). It's same as ISeqInStream::Read */
- SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
-} ILookInStream;
-
-SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);
-SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);
-
-/* reads via ILookInStream::Read */
-SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);
-SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);
-
-#define LookToRead_BUF_SIZE (1 << 14)
-
-typedef struct
-{
- ILookInStream s;
- ISeekInStream *realStream;
- size_t pos;
- size_t size;
- Byte buf[LookToRead_BUF_SIZE];
-} CLookToRead;
-
-void LookToRead_CreateVTable(CLookToRead *p, int lookahead);
-void LookToRead_Init(CLookToRead *p);
-
-typedef struct
-{
- ISeqInStream s;
- ILookInStream *realStream;
-} CSecToLook;
-
-void SecToLook_CreateVTable(CSecToLook *p);
-
-typedef struct
-{
- ISeqInStream s;
- ILookInStream *realStream;
-} CSecToRead;
-
-void SecToRead_CreateVTable(CSecToRead *p);
-
-typedef struct
-{
- SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);
- /* Returns: result. (result != SZ_OK) means break.
- Value (UInt64)(Int64)-1 for size means unknown value. */
-} ICompressProgress;
-
-typedef struct
-{
- void *(*Alloc)(void *p, size_t size);
- void (*Free)(void *p, void *address); /* address can be 0 */
-} ISzAlloc;
-
-#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)
-#define IAlloc_Free(p, a) (p)->Free((p), a)
-
-#ifdef _WIN32
-
-#define CHAR_PATH_SEPARATOR '\\'
-#define WCHAR_PATH_SEPARATOR L'\\'
-#define STRING_PATH_SEPARATOR "\\"
-#define WSTRING_PATH_SEPARATOR L"\\"
-
-#else
-
-#define CHAR_PATH_SEPARATOR '/'
-#define WCHAR_PATH_SEPARATOR L'/'
-#define STRING_PATH_SEPARATOR "/"
-#define WSTRING_PATH_SEPARATOR L"/"
-
-#endif
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/7zVersion.h b/src/libs/7zip/win/C/7zVersion.h
deleted file mode 100644
index 475918352..000000000
--- a/src/libs/7zip/win/C/7zVersion.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#define MY_VER_MAJOR 9
-#define MY_VER_MINOR 38
-#define MY_VER_BUILD 00
-#define MY_VERSION "9.38 beta"
-// #define MY_7ZIP_VERSION "9.38"
-#define MY_DATE "2015-01-03"
-#undef MY_COPYRIGHT
-#undef MY_VERSION_COPYRIGHT_DATE
-#define MY_COPYRIGHT ": Igor Pavlov : Public domain"
-#define MY_VERSION_COPYRIGHT_DATE MY_VERSION " " MY_COPYRIGHT " : " MY_DATE
diff --git a/src/libs/7zip/win/C/Alloc.c b/src/libs/7zip/win/C/Alloc.c
deleted file mode 100644
index 1f3f6c661..000000000
--- a/src/libs/7zip/win/C/Alloc.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* Alloc.c -- Memory allocation functions
-2013-11-12 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#ifdef _WIN32
-#include <windows.h>
-#endif
-#include <stdlib.h>
-
-#include "Alloc.h"
-
-/* #define _SZ_ALLOC_DEBUG */
-
-/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */
-#ifdef _SZ_ALLOC_DEBUG
-#include <stdio.h>
-int g_allocCount = 0;
-int g_allocCountMid = 0;
-int g_allocCountBig = 0;
-#endif
-
-void *MyAlloc(size_t size)
-{
- if (size == 0)
- return 0;
- #ifdef _SZ_ALLOC_DEBUG
- {
- void *p = malloc(size);
- fprintf(stderr, "\nAlloc %10d bytes, count = %10d, addr = %8X", size, g_allocCount++, (unsigned)p);
- return p;
- }
- #else
- return malloc(size);
- #endif
-}
-
-void MyFree(void *address)
-{
- #ifdef _SZ_ALLOC_DEBUG
- if (address != 0)
- fprintf(stderr, "\nFree; count = %10d, addr = %8X", --g_allocCount, (unsigned)address);
- #endif
- free(address);
-}
-
-#ifdef _WIN32
-
-void *MidAlloc(size_t size)
-{
- if (size == 0)
- return 0;
- #ifdef _SZ_ALLOC_DEBUG
- fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++);
- #endif
- return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
-}
-
-void MidFree(void *address)
-{
- #ifdef _SZ_ALLOC_DEBUG
- if (address != 0)
- fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid);
- #endif
- if (address == 0)
- return;
- VirtualFree(address, 0, MEM_RELEASE);
-}
-
-#ifndef MEM_LARGE_PAGES
-#undef _7ZIP_LARGE_PAGES
-#endif
-
-#ifdef _7ZIP_LARGE_PAGES
-SIZE_T g_LargePageSize = 0;
-typedef SIZE_T (WINAPI *GetLargePageMinimumP)();
-#endif
-
-void SetLargePageSize()
-{
- #ifdef _7ZIP_LARGE_PAGES
- SIZE_T size = 0;
- GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP)
- GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum");
- if (largePageMinimum == 0)
- return;
- size = largePageMinimum();
- if (size == 0 || (size & (size - 1)) != 0)
- return;
- g_LargePageSize = size;
- #endif
-}
-
-
-void *BigAlloc(size_t size)
-{
- if (size == 0)
- return 0;
- #ifdef _SZ_ALLOC_DEBUG
- fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++);
- #endif
-
- #ifdef _7ZIP_LARGE_PAGES
- if (g_LargePageSize != 0 && g_LargePageSize <= (1 << 30) && size >= (1 << 18))
- {
- void *res = VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)),
- MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE);
- if (res != 0)
- return res;
- }
- #endif
- return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
-}
-
-void BigFree(void *address)
-{
- #ifdef _SZ_ALLOC_DEBUG
- if (address != 0)
- fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig);
- #endif
-
- if (address == 0)
- return;
- VirtualFree(address, 0, MEM_RELEASE);
-}
-
-#endif
diff --git a/src/libs/7zip/win/C/Alloc.h b/src/libs/7zip/win/C/Alloc.h
deleted file mode 100644
index b8e414367..000000000
--- a/src/libs/7zip/win/C/Alloc.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Alloc.h -- Memory allocation functions
-2009-02-07 : Igor Pavlov : Public domain */
-
-#ifndef __COMMON_ALLOC_H
-#define __COMMON_ALLOC_H
-
-#include <stddef.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void *MyAlloc(size_t size);
-void MyFree(void *address);
-
-#ifdef _WIN32
-
-void SetLargePageSize();
-
-void *MidAlloc(size_t size);
-void MidFree(void *address);
-void *BigAlloc(size_t size);
-void BigFree(void *address);
-
-#else
-
-#define MidAlloc(size) MyAlloc(size)
-#define MidFree(address) MyFree(address)
-#define BigAlloc(size) MyAlloc(size)
-#define BigFree(address) MyFree(address)
-
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/libs/7zip/win/C/Bra.c b/src/libs/7zip/win/C/Bra.c
deleted file mode 100644
index 33f7a391c..000000000
--- a/src/libs/7zip/win/C/Bra.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/* Bra.c -- Converters for RISC code
-2010-04-16 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "Bra.h"
-
-SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
-{
- SizeT i;
- if (size < 4)
- return 0;
- size -= 4;
- ip += 8;
- for (i = 0; i <= size; i += 4)
- {
- if (data[i + 3] == 0xEB)
- {
- UInt32 dest;
- UInt32 src = ((UInt32)data[i + 2] << 16) | ((UInt32)data[i + 1] << 8) | (data[i + 0]);
- src <<= 2;
- if (encoding)
- dest = ip + (UInt32)i + src;
- else
- dest = src - (ip + (UInt32)i);
- dest >>= 2;
- data[i + 2] = (Byte)(dest >> 16);
- data[i + 1] = (Byte)(dest >> 8);
- data[i + 0] = (Byte)dest;
- }
- }
- return i;
-}
-
-SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
-{
- SizeT i;
- if (size < 4)
- return 0;
- size -= 4;
- ip += 4;
- for (i = 0; i <= size; i += 2)
- {
- if ((data[i + 1] & 0xF8) == 0xF0 &&
- (data[i + 3] & 0xF8) == 0xF8)
- {
- UInt32 dest;
- UInt32 src =
- (((UInt32)data[i + 1] & 0x7) << 19) |
- ((UInt32)data[i + 0] << 11) |
- (((UInt32)data[i + 3] & 0x7) << 8) |
- (data[i + 2]);
-
- src <<= 1;
- if (encoding)
- dest = ip + (UInt32)i + src;
- else
- dest = src - (ip + (UInt32)i);
- dest >>= 1;
-
- data[i + 1] = (Byte)(0xF0 | ((dest >> 19) & 0x7));
- data[i + 0] = (Byte)(dest >> 11);
- data[i + 3] = (Byte)(0xF8 | ((dest >> 8) & 0x7));
- data[i + 2] = (Byte)dest;
- i += 2;
- }
- }
- return i;
-}
-
-SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
-{
- SizeT i;
- if (size < 4)
- return 0;
- size -= 4;
- for (i = 0; i <= size; i += 4)
- {
- if ((data[i] >> 2) == 0x12 && (data[i + 3] & 3) == 1)
- {
- UInt32 src = ((UInt32)(data[i + 0] & 3) << 24) |
- ((UInt32)data[i + 1] << 16) |
- ((UInt32)data[i + 2] << 8) |
- ((UInt32)data[i + 3] & (~3));
-
- UInt32 dest;
- if (encoding)
- dest = ip + (UInt32)i + src;
- else
- dest = src - (ip + (UInt32)i);
- data[i + 0] = (Byte)(0x48 | ((dest >> 24) & 0x3));
- data[i + 1] = (Byte)(dest >> 16);
- data[i + 2] = (Byte)(dest >> 8);
- data[i + 3] &= 0x3;
- data[i + 3] |= dest;
- }
- }
- return i;
-}
-
-SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
-{
- UInt32 i;
- if (size < 4)
- return 0;
- size -= 4;
- for (i = 0; i <= size; i += 4)
- {
- if ((data[i] == 0x40 && (data[i + 1] & 0xC0) == 0x00) ||
- (data[i] == 0x7F && (data[i + 1] & 0xC0) == 0xC0))
- {
- UInt32 src =
- ((UInt32)data[i + 0] << 24) |
- ((UInt32)data[i + 1] << 16) |
- ((UInt32)data[i + 2] << 8) |
- ((UInt32)data[i + 3]);
- UInt32 dest;
-
- src <<= 2;
- if (encoding)
- dest = ip + i + src;
- else
- dest = src - (ip + i);
- dest >>= 2;
-
- dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000;
-
- data[i + 0] = (Byte)(dest >> 24);
- data[i + 1] = (Byte)(dest >> 16);
- data[i + 2] = (Byte)(dest >> 8);
- data[i + 3] = (Byte)dest;
- }
- }
- return i;
-}
diff --git a/src/libs/7zip/win/C/Bra.h b/src/libs/7zip/win/C/Bra.h
deleted file mode 100644
index 184c291a7..000000000
--- a/src/libs/7zip/win/C/Bra.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Bra.h -- Branch converters for executables
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __BRA_H
-#define __BRA_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-/*
-These functions convert relative addresses to absolute addresses
-in CALL instructions to increase the compression ratio.
-
- In:
- data - data buffer
- size - size of data
- ip - current virtual Instruction Pinter (IP) value
- state - state variable for x86 converter
- encoding - 0 (for decoding), 1 (for encoding)
-
- Out:
- state - state variable for x86 converter
-
- Returns:
- The number of processed bytes. If you call these functions with multiple calls,
- you must start next call with first byte after block of processed bytes.
-
- Type Endian Alignment LookAhead
-
- x86 little 1 4
- ARMT little 2 2
- ARM little 4 0
- PPC big 4 0
- SPARC big 4 0
- IA64 little 16 0
-
- size must be >= Alignment + LookAhead, if it's not last block.
- If (size < Alignment + LookAhead), converter returns 0.
-
- Example:
-
- UInt32 ip = 0;
- for ()
- {
- ; size must be >= Alignment + LookAhead, if it's not last block
- SizeT processed = Convert(data, size, ip, 1);
- data += processed;
- size -= processed;
- ip += processed;
- }
-*/
-
-#define x86_Convert_Init(state) { state = 0; }
-SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding);
-SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
-SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
-SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
-SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
-SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/Bra86.c b/src/libs/7zip/win/C/Bra86.c
deleted file mode 100644
index 6db15e7ec..000000000
--- a/src/libs/7zip/win/C/Bra86.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Bra86.c -- Converter for x86 code (BCJ)
-2013-11-12 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "Bra.h"
-
-#define Test86MSByte(b) ((((b) + 1) & 0xFE) == 0)
-
-SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding)
-{
- SizeT pos = 0;
- UInt32 mask = *state & 7;
- if (size < 5)
- return 0;
- size -= 4;
- ip += 5;
-
- for (;;)
- {
- Byte *p = data + pos;
- const Byte *limit = data + size;
- for (; p < limit; p++)
- if ((*p & 0xFE) == 0xE8)
- break;
-
- {
- SizeT d = (SizeT)(p - data - pos);
- pos = (SizeT)(p - data);
- if (p >= limit)
- {
- *state = (d > 2 ? 0 : mask >> (unsigned)d);
- return pos;
- }
- if (d > 2)
- mask = 0;
- else
- {
- mask >>= (unsigned)d;
- if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(mask >> 1) + 1])))
- {
- mask = (mask >> 1) | 4;
- pos++;
- continue;
- }
- }
- }
-
- if (Test86MSByte(p[4]))
- {
- UInt32 v = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]);
- UInt32 cur = ip + (UInt32)pos;
- pos += 5;
- if (encoding)
- v += cur;
- else
- v -= cur;
- if (mask != 0)
- {
- unsigned sh = (mask & 6) << 2;
- if (Test86MSByte((Byte)(v >> sh)))
- {
- v ^= (((UInt32)0x100 << sh) - 1);
- if (encoding)
- v += cur;
- else
- v -= cur;
- }
- mask = 0;
- }
- p[1] = (Byte)v;
- p[2] = (Byte)(v >> 8);
- p[3] = (Byte)(v >> 16);
- p[4] = (Byte)(0 - ((v >> 24) & 1));
- }
- else
- {
- mask = (mask >> 1) | 4;
- pos++;
- }
- }
-}
diff --git a/src/libs/7zip/win/C/BraIA64.c b/src/libs/7zip/win/C/BraIA64.c
deleted file mode 100644
index aa1a44e1e..000000000
--- a/src/libs/7zip/win/C/BraIA64.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* BraIA64.c -- Converter for IA-64 code
-2013-11-12 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "Bra.h"
-
-static const Byte kBranchTable[32] =
-{
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 4, 4, 6, 6, 0, 0, 7, 7,
- 4, 4, 0, 0, 4, 4, 0, 0
-};
-
-SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
-{
- SizeT i;
- if (size < 16)
- return 0;
- size -= 16;
- for (i = 0; i <= size; i += 16)
- {
- UInt32 instrTemplate = data[i] & 0x1F;
- UInt32 mask = kBranchTable[instrTemplate];
- UInt32 bitPos = 5;
- int slot;
- for (slot = 0; slot < 3; slot++, bitPos += 41)
- {
- UInt32 bytePos, bitRes;
- UInt64 instruction, instNorm;
- int j;
- if (((mask >> slot) & 1) == 0)
- continue;
- bytePos = (bitPos >> 3);
- bitRes = bitPos & 0x7;
- instruction = 0;
- for (j = 0; j < 6; j++)
- instruction += (UInt64)data[i + j + bytePos] << (8 * j);
-
- instNorm = instruction >> bitRes;
- if (((instNorm >> 37) & 0xF) == 0x5 && ((instNorm >> 9) & 0x7) == 0)
- {
- UInt32 src = (UInt32)((instNorm >> 13) & 0xFFFFF);
- UInt32 dest;
- src |= ((UInt32)(instNorm >> 36) & 1) << 20;
-
- src <<= 4;
-
- if (encoding)
- dest = ip + (UInt32)i + src;
- else
- dest = src - (ip + (UInt32)i);
-
- dest >>= 4;
-
- instNorm &= ~((UInt64)(0x8FFFFF) << 13);
- instNorm |= ((UInt64)(dest & 0xFFFFF) << 13);
- instNorm |= ((UInt64)(dest & 0x100000) << (36 - 20));
-
- instruction &= (1 << bitRes) - 1;
- instruction |= (instNorm << bitRes);
- for (j = 0; j < 6; j++)
- data[i + j + bytePos] = (Byte)(instruction >> (8 * j));
- }
- }
- }
- return i;
-}
diff --git a/src/libs/7zip/win/C/C.pri b/src/libs/7zip/win/C/C.pri
deleted file mode 100644
index 23d688642..000000000
--- a/src/libs/7zip/win/C/C.pri
+++ /dev/null
@@ -1,48 +0,0 @@
-HEADERS += $$7ZIP_BASE/C/7zCrc.h \
- $$7ZIP_BASE/C/7zTypes.h \
- $$7ZIP_BASE/C/7zVersion.h \
- $$7ZIP_BASE/C/Alloc.h \
- $$7ZIP_BASE/C/Bra.h \
- $$7ZIP_BASE/C/Compiler.h \
- $$7ZIP_BASE/C/CpuArch.h \
- $$7ZIP_BASE/C/Delta.h \
- $$7ZIP_BASE/C/LzFind.h \
- $$7ZIP_BASE/C/LzFindMt.h \
- $$7ZIP_BASE/C/LzHash.h \
- $$7ZIP_BASE/C/Lzma2Dec.h \
- $$7ZIP_BASE/C/Lzma2Enc.h \
- $$7ZIP_BASE/C/LzmaDec.h \
- $$7ZIP_BASE/C/LzmaEnc.h \
- $$7ZIP_BASE/C/MtCoder.h \
- $$7ZIP_BASE/C/Precomp.h \
- $$7ZIP_BASE/C/RotateDefs.h \
- $$7ZIP_BASE/C/Sha256.h \
- $$7ZIP_BASE/C/Threads.h \
- $$7ZIP_BASE/C/Xz.h \
- $$7ZIP_BASE/C/XzCrc64.h \
- $$7ZIP_BASE/C/XzEnc.h
-
-SOURCES += $$7ZIP_BASE/C/7zCrc.c \
- $$7ZIP_BASE/C/7zCrcOpt.c \
- $$7ZIP_BASE/C/7zStream.c \
- $$7ZIP_BASE/C/Alloc.c \
- $$7ZIP_BASE/C/Bra.c \
- $$7ZIP_BASE/C/Bra86.c \
- $$7ZIP_BASE/C/BraIA64.c \
- $$7ZIP_BASE/C/CpuArch.c \
- $$7ZIP_BASE/C/Delta.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/Threads.c \
- $$7ZIP_BASE/C/Xz.c \
- $$7ZIP_BASE/C/XzCrc64.c \
- $$7ZIP_BASE/C/XzCrc64Opt.c \
- $$7ZIP_BASE/C/XzDec.c \
- $$7ZIP_BASE/C/XzEnc.c \
- $$7ZIP_BASE/C/XzIn.c
diff --git a/src/libs/7zip/win/C/Compiler.h b/src/libs/7zip/win/C/Compiler.h
deleted file mode 100644
index 6e964897e..000000000
--- a/src/libs/7zip/win/C/Compiler.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Compiler.h -- Compiler ypes
-2013-11-12 : Igor Pavlov : Public domain */
-
-#ifndef __7Z_COMPILER_H
-#define __7Z_COMPILER_H
-
-#ifdef _MSC_VER
-
- #ifdef UNDER_CE
- #define RPC_NO_WINDOWS_H
- /* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */
- #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
- #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int
- #endif
-
- #if _MSC_VER >= 1300
- #pragma warning(disable : 4996) // This function or variable may be unsafe
- #else
- #pragma warning(disable : 4511) // copy constructor could not be generated
- #pragma warning(disable : 4512) // assignment operator could not be generated
- #pragma warning(disable : 4702) // unreachable code
- #pragma warning(disable : 4710) // not inlined
- #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information
- #endif
-
-#endif
-
-#endif
diff --git a/src/libs/7zip/win/C/CpuArch.c b/src/libs/7zip/win/C/CpuArch.c
deleted file mode 100644
index 4feb028a2..000000000
--- a/src/libs/7zip/win/C/CpuArch.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* CpuArch.c -- CPU specific code
-2012-05-29: Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "CpuArch.h"
-
-#ifdef MY_CPU_X86_OR_AMD64
-
-#if (defined(_MSC_VER) && !defined(MY_CPU_AMD64)) || defined(__GNUC__)
-#define USE_ASM
-#endif
-
-#if !defined(USE_ASM) && _MSC_VER >= 1500
-#include <intrin.h>
-#endif
-
-#if defined(USE_ASM) && !defined(MY_CPU_AMD64)
-static UInt32 CheckFlag(UInt32 flag)
-{
- #ifdef _MSC_VER
- __asm pushfd;
- __asm pop EAX;
- __asm mov EDX, EAX;
- __asm xor EAX, flag;
- __asm push EAX;
- __asm popfd;
- __asm pushfd;
- __asm pop EAX;
- __asm xor EAX, EDX;
- __asm push EDX;
- __asm popfd;
- __asm and flag, EAX;
- #else
- __asm__ __volatile__ (
- "pushf\n\t"
- "pop %%EAX\n\t"
- "movl %%EAX,%%EDX\n\t"
- "xorl %0,%%EAX\n\t"
- "push %%EAX\n\t"
- "popf\n\t"
- "pushf\n\t"
- "pop %%EAX\n\t"
- "xorl %%EDX,%%EAX\n\t"
- "push %%EDX\n\t"
- "popf\n\t"
- "andl %%EAX, %0\n\t":
- "=c" (flag) : "c" (flag));
- #endif
- return flag;
-}
-#define CHECK_CPUID_IS_SUPPORTED if (CheckFlag(1 << 18) == 0 || CheckFlag(1 << 21) == 0) return False;
-#else
-#define CHECK_CPUID_IS_SUPPORTED
-#endif
-
-static void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d)
-{
- #ifdef USE_ASM
-
- #ifdef _MSC_VER
-
- UInt32 a2, b2, c2, d2;
- __asm xor EBX, EBX;
- __asm xor ECX, ECX;
- __asm xor EDX, EDX;
- __asm mov EAX, function;
- __asm cpuid;
- __asm mov a2, EAX;
- __asm mov b2, EBX;
- __asm mov c2, ECX;
- __asm mov d2, EDX;
-
- *a = a2;
- *b = b2;
- *c = c2;
- *d = d2;
-
- #else
-
- __asm__ __volatile__ (
- #if defined(MY_CPU_X86) && defined(__PIC__)
- "mov %%ebx, %%edi;"
- "cpuid;"
- "xchgl %%ebx, %%edi;"
- : "=a" (*a) ,
- "=D" (*b) ,
- #else
- "cpuid"
- : "=a" (*a) ,
- "=b" (*b) ,
- #endif
- "=c" (*c) ,
- "=d" (*d)
- : "0" (function)) ;
-
- #endif
-
- #else
-
- int CPUInfo[4];
- __cpuid(CPUInfo, function);
- *a = CPUInfo[0];
- *b = CPUInfo[1];
- *c = CPUInfo[2];
- *d = CPUInfo[3];
-
- #endif
-}
-
-Bool x86cpuid_CheckAndRead(Cx86cpuid *p)
-{
- CHECK_CPUID_IS_SUPPORTED
- MyCPUID(0, &p->maxFunc, &p->vendor[0], &p->vendor[2], &p->vendor[1]);
- MyCPUID(1, &p->ver, &p->b, &p->c, &p->d);
- return True;
-}
-
-static UInt32 kVendors[][3] =
-{
- { 0x756E6547, 0x49656E69, 0x6C65746E},
- { 0x68747541, 0x69746E65, 0x444D4163},
- { 0x746E6543, 0x48727561, 0x736C7561}
-};
-
-int x86cpuid_GetFirm(const Cx86cpuid *p)
-{
- unsigned i;
- for (i = 0; i < sizeof(kVendors) / sizeof(kVendors[i]); i++)
- {
- const UInt32 *v = kVendors[i];
- if (v[0] == p->vendor[0] &&
- v[1] == p->vendor[1] &&
- v[2] == p->vendor[2])
- return (int)i;
- }
- return -1;
-}
-
-Bool CPU_Is_InOrder()
-{
- Cx86cpuid p;
- int firm;
- UInt32 family, model;
- if (!x86cpuid_CheckAndRead(&p))
- return True;
- family = x86cpuid_GetFamily(&p);
- model = x86cpuid_GetModel(&p);
- firm = x86cpuid_GetFirm(&p);
- switch (firm)
- {
- case CPU_FIRM_INTEL: return (family < 6 || (family == 6 && (
- /* Atom CPU */
- model == 0x100C /* 45 nm, N4xx, D4xx, N5xx, D5xx, 230, 330 */
- || model == 0x2006 /* 45 nm, Z6xx */
- || model == 0x2007 /* 32 nm, Z2460 */
- || model == 0x3005 /* 32 nm, Z2760 */
- || model == 0x3006 /* 32 nm, N2xxx, D2xxx */
- )));
- case CPU_FIRM_AMD: return (family < 5 || (family == 5 && (model < 6 || model == 0xA)));
- case CPU_FIRM_VIA: return (family < 6 || (family == 6 && model < 0xF));
- }
- return True;
-}
-
-#if !defined(MY_CPU_AMD64) && defined(_WIN32)
-#include <windows.h>
-static Bool CPU_Sys_Is_SSE_Supported()
-{
- OSVERSIONINFO vi;
- vi.dwOSVersionInfoSize = sizeof(vi);
- if (!GetVersionEx(&vi))
- return False;
- return (vi.dwMajorVersion >= 5);
-}
-#define CHECK_SYS_SSE_SUPPORT if (!CPU_Sys_Is_SSE_Supported()) return False;
-#else
-#define CHECK_SYS_SSE_SUPPORT
-#endif
-
-Bool CPU_Is_Aes_Supported()
-{
- Cx86cpuid p;
- CHECK_SYS_SSE_SUPPORT
- if (!x86cpuid_CheckAndRead(&p))
- return False;
- return (p.c >> 25) & 1;
-}
-
-#endif
diff --git a/src/libs/7zip/win/C/CpuArch.h b/src/libs/7zip/win/C/CpuArch.h
deleted file mode 100644
index 4fee00937..000000000
--- a/src/libs/7zip/win/C/CpuArch.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/* CpuArch.h -- CPU specific code
-2013-11-12: Igor Pavlov : Public domain */
-
-#ifndef __CPU_ARCH_H
-#define __CPU_ARCH_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-/*
-MY_CPU_LE means that CPU is LITTLE ENDIAN.
-If MY_CPU_LE is not defined, we don't know about that property of platform (it can be LITTLE ENDIAN).
-
-MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses.
-If MY_CPU_LE_UNALIGN is not defined, we don't know about these properties of platform.
-*/
-
-#if defined(_M_X64) || defined(_M_AMD64) || defined(__x86_64__)
-#define MY_CPU_AMD64
-#endif
-
-#if defined(MY_CPU_AMD64) || defined(_M_IA64)
-#define MY_CPU_64BIT
-#endif
-
-#if defined(_M_IX86) || defined(__i386__)
-#define MY_CPU_X86
-#endif
-
-#if defined(MY_CPU_X86) || defined(MY_CPU_AMD64)
-#define MY_CPU_X86_OR_AMD64
-#endif
-
-#if defined(MY_CPU_X86) || defined(_M_ARM)
-#define MY_CPU_32BIT
-#endif
-
-#if defined(_WIN32) && defined(_M_ARM)
-#define MY_CPU_ARM_LE
-#endif
-
-#if defined(_WIN32) && defined(_M_IA64)
-#define MY_CPU_IA64_LE
-#endif
-
-#if defined(MY_CPU_X86_OR_AMD64)
-#define MY_CPU_LE_UNALIGN
-#endif
-
-#if defined(MY_CPU_X86_OR_AMD64) || defined(MY_CPU_ARM_LE) || defined(MY_CPU_IA64_LE) || defined(__ARMEL__) || defined(__MIPSEL__) || defined(__LITTLE_ENDIAN__)
-#define MY_CPU_LE
-#endif
-
-#if defined(__BIG_ENDIAN__) || defined(__m68k__) || defined(__ARMEB__) || defined(__MIPSEB__)
-#define MY_CPU_BE
-#endif
-
-#if defined(MY_CPU_LE) && defined(MY_CPU_BE)
-Stop_Compiling_Bad_Endian
-#endif
-
-#ifdef MY_CPU_LE_UNALIGN
-
-#define GetUi16(p) (*(const UInt16 *)(const void *)(p))
-#define GetUi32(p) (*(const UInt32 *)(const void *)(p))
-#define GetUi64(p) (*(const UInt64 *)(const void *)(p))
-#define SetUi16(p, d) *(UInt16 *)(p) = (d);
-#define SetUi32(p, d) *(UInt32 *)(p) = (d);
-#define SetUi64(p, d) *(UInt64 *)(p) = (d);
-
-#else
-
-#define GetUi16(p) (((const Byte *)(p))[0] | ((UInt16)((const Byte *)(p))[1] << 8))
-
-#define GetUi32(p) ( \
- ((const Byte *)(p))[0] | \
- ((UInt32)((const Byte *)(p))[1] << 8) | \
- ((UInt32)((const Byte *)(p))[2] << 16) | \
- ((UInt32)((const Byte *)(p))[3] << 24))
-
-#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32))
-
-#define SetUi16(p, d) { UInt32 _x_ = (d); \
- ((Byte *)(p))[0] = (Byte)_x_; \
- ((Byte *)(p))[1] = (Byte)(_x_ >> 8); }
-
-#define SetUi32(p, d) { UInt32 _x_ = (d); \
- ((Byte *)(p))[0] = (Byte)_x_; \
- ((Byte *)(p))[1] = (Byte)(_x_ >> 8); \
- ((Byte *)(p))[2] = (Byte)(_x_ >> 16); \
- ((Byte *)(p))[3] = (Byte)(_x_ >> 24); }
-
-#define SetUi64(p, d) { UInt64 _x64_ = (d); \
- SetUi32(p, (UInt32)_x64_); \
- SetUi32(((Byte *)(p)) + 4, (UInt32)(_x64_ >> 32)); }
-
-#endif
-
-#if defined(MY_CPU_LE_UNALIGN) && defined(_WIN64) && (_MSC_VER >= 1300)
-
-#include <stdlib.h>
-
-#pragma intrinsic(_byteswap_ulong)
-#pragma intrinsic(_byteswap_uint64)
-#define GetBe32(p) _byteswap_ulong(*(const UInt32 *)(const Byte *)(p))
-#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const Byte *)(p))
-
-#else
-
-#define GetBe32(p) ( \
- ((UInt32)((const Byte *)(p))[0] << 24) | \
- ((UInt32)((const Byte *)(p))[1] << 16) | \
- ((UInt32)((const Byte *)(p))[2] << 8) | \
- ((const Byte *)(p))[3] )
-
-#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4))
-
-#endif
-
-#define GetBe16(p) ((UInt16)(((UInt16)((const Byte *)(p))[0] << 8) | ((const Byte *)(p))[1]))
-
-
-#ifdef MY_CPU_X86_OR_AMD64
-
-typedef struct
-{
- UInt32 maxFunc;
- UInt32 vendor[3];
- UInt32 ver;
- UInt32 b;
- UInt32 c;
- UInt32 d;
-} Cx86cpuid;
-
-enum
-{
- CPU_FIRM_INTEL,
- CPU_FIRM_AMD,
- CPU_FIRM_VIA
-};
-
-Bool x86cpuid_CheckAndRead(Cx86cpuid *p);
-int x86cpuid_GetFirm(const Cx86cpuid *p);
-
-#define x86cpuid_GetFamily(p) (((p)->ver >> 8) & 0xFF00F)
-#define x86cpuid_GetModel(p) (((p)->ver >> 4) & 0xF00F)
-#define x86cpuid_GetStepping(p) ((p)->ver & 0xF)
-
-Bool CPU_Is_InOrder();
-Bool CPU_Is_Aes_Supported();
-
-#endif
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/Delta.c b/src/libs/7zip/win/C/Delta.c
deleted file mode 100644
index e3edd21ed..000000000
--- a/src/libs/7zip/win/C/Delta.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Delta.c -- Delta converter
-2009-05-26 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "Delta.h"
-
-void Delta_Init(Byte *state)
-{
- unsigned i;
- for (i = 0; i < DELTA_STATE_SIZE; i++)
- state[i] = 0;
-}
-
-static void MyMemCpy(Byte *dest, const Byte *src, unsigned size)
-{
- unsigned i;
- for (i = 0; i < size; i++)
- dest[i] = src[i];
-}
-
-void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size)
-{
- Byte buf[DELTA_STATE_SIZE];
- unsigned j = 0;
- MyMemCpy(buf, state, delta);
- {
- SizeT i;
- for (i = 0; i < size;)
- {
- for (j = 0; j < delta && i < size; i++, j++)
- {
- Byte b = data[i];
- data[i] = (Byte)(b - buf[j]);
- buf[j] = b;
- }
- }
- }
- if (j == delta)
- j = 0;
- MyMemCpy(state, buf + j, delta - j);
- MyMemCpy(state + delta - j, buf, j);
-}
-
-void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size)
-{
- Byte buf[DELTA_STATE_SIZE];
- unsigned j = 0;
- MyMemCpy(buf, state, delta);
- {
- SizeT i;
- for (i = 0; i < size;)
- {
- for (j = 0; j < delta && i < size; i++, j++)
- {
- buf[j] = data[i] = (Byte)(buf[j] + data[i]);
- }
- }
- }
- if (j == delta)
- j = 0;
- MyMemCpy(state, buf + j, delta - j);
- MyMemCpy(state + delta - j, buf, j);
-}
diff --git a/src/libs/7zip/win/C/Delta.h b/src/libs/7zip/win/C/Delta.h
deleted file mode 100644
index 2fa54ad67..000000000
--- a/src/libs/7zip/win/C/Delta.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Delta.h -- Delta converter
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __DELTA_H
-#define __DELTA_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-#define DELTA_STATE_SIZE 256
-
-void Delta_Init(Byte *state);
-void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size);
-void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/LzFind.c b/src/libs/7zip/win/C/LzFind.c
deleted file mode 100644
index 9a4d25b80..000000000
--- a/src/libs/7zip/win/C/LzFind.c
+++ /dev/null
@@ -1,763 +0,0 @@
-/* LzFind.c -- Match finder for LZ algorithms
-2009-04-22 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include <string.h>
-
-#include "LzFind.h"
-#include "LzHash.h"
-
-#define kEmptyHashValue 0
-#define kMaxValForNormalize ((UInt32)0xFFFFFFFF)
-#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */
-#define kNormalizeMask (~(kNormalizeStepMin - 1))
-#define kMaxHistorySize ((UInt32)3 << 30)
-
-#define kStartMaxLen 3
-
-static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)
-{
- if (!p->directInput)
- {
- alloc->Free(alloc, p->bufferBase);
- p->bufferBase = 0;
- }
-}
-
-/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */
-
-static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)
-{
- UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
- if (p->directInput)
- {
- p->blockSize = blockSize;
- return 1;
- }
- if (p->bufferBase == 0 || p->blockSize != blockSize)
- {
- LzInWindow_Free(p, alloc);
- p->blockSize = blockSize;
- p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize);
- }
- return (p->bufferBase != 0);
-}
-
-Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
-Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
-
-UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
-
-void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
-{
- p->posLimit -= subValue;
- p->pos -= subValue;
- p->streamPos -= subValue;
-}
-
-static void MatchFinder_ReadBlock(CMatchFinder *p)
-{
- if (p->streamEndWasReached || p->result != SZ_OK)
- return;
- if (p->directInput)
- {
- UInt32 curSize = 0xFFFFFFFF - p->streamPos;
- if (curSize > p->directInputRem)
- curSize = (UInt32)p->directInputRem;
- p->directInputRem -= curSize;
- p->streamPos += curSize;
- if (p->directInputRem == 0)
- p->streamEndWasReached = 1;
- return;
- }
- for (;;)
- {
- Byte *dest = p->buffer + (p->streamPos - p->pos);
- size_t size = (p->bufferBase + p->blockSize - dest);
- if (size == 0)
- return;
- p->result = p->stream->Read(p->stream, dest, &size);
- if (p->result != SZ_OK)
- return;
- if (size == 0)
- {
- p->streamEndWasReached = 1;
- return;
- }
- p->streamPos += (UInt32)size;
- if (p->streamPos - p->pos > p->keepSizeAfter)
- return;
- }
-}
-
-void MatchFinder_MoveBlock(CMatchFinder *p)
-{
- memmove(p->bufferBase,
- p->buffer - p->keepSizeBefore,
- (size_t)(p->streamPos - p->pos + p->keepSizeBefore));
- p->buffer = p->bufferBase + p->keepSizeBefore;
-}
-
-int MatchFinder_NeedMove(CMatchFinder *p)
-{
- if (p->directInput)
- return 0;
- /* if (p->streamEndWasReached) return 0; */
- return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
-}
-
-void MatchFinder_ReadIfRequired(CMatchFinder *p)
-{
- if (p->streamEndWasReached)
- return;
- if (p->keepSizeAfter >= p->streamPos - p->pos)
- MatchFinder_ReadBlock(p);
-}
-
-static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)
-{
- if (MatchFinder_NeedMove(p))
- MatchFinder_MoveBlock(p);
- MatchFinder_ReadBlock(p);
-}
-
-static void MatchFinder_SetDefaultSettings(CMatchFinder *p)
-{
- p->cutValue = 32;
- p->btMode = 1;
- p->numHashBytes = 4;
- p->bigHash = 0;
-}
-
-#define kCrcPoly 0xEDB88320
-
-void MatchFinder_Construct(CMatchFinder *p)
-{
- UInt32 i;
- p->bufferBase = 0;
- p->directInput = 0;
- p->hash = 0;
- MatchFinder_SetDefaultSettings(p);
-
- for (i = 0; i < 256; i++)
- {
- UInt32 r = i;
- int j;
- for (j = 0; j < 8; j++)
- r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));
- p->crc[i] = r;
- }
-}
-
-static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc)
-{
- alloc->Free(alloc, p->hash);
- p->hash = 0;
-}
-
-void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc)
-{
- MatchFinder_FreeThisClassMemory(p, alloc);
- LzInWindow_Free(p, alloc);
-}
-
-static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc)
-{
- size_t sizeInBytes = (size_t)num * sizeof(CLzRef);
- if (sizeInBytes / sizeof(CLzRef) != num)
- return 0;
- return (CLzRef *)alloc->Alloc(alloc, sizeInBytes);
-}
-
-int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
- UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
- ISzAlloc *alloc)
-{
- UInt32 sizeReserv;
- if (historySize > kMaxHistorySize)
- {
- MatchFinder_Free(p, alloc);
- return 0;
- }
- sizeReserv = historySize >> 1;
- if (historySize > ((UInt32)2 << 30))
- sizeReserv = historySize >> 2;
- sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19);
-
- p->keepSizeBefore = historySize + keepAddBufferBefore + 1;
- p->keepSizeAfter = matchMaxLen + keepAddBufferAfter;
- /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */
- if (LzInWindow_Create(p, sizeReserv, alloc))
- {
- UInt32 newCyclicBufferSize = historySize + 1;
- UInt32 hs;
- p->matchMaxLen = matchMaxLen;
- {
- p->fixedHashSize = 0;
- if (p->numHashBytes == 2)
- hs = (1 << 16) - 1;
- else
- {
- hs = historySize - 1;
- hs |= (hs >> 1);
- hs |= (hs >> 2);
- hs |= (hs >> 4);
- hs |= (hs >> 8);
- hs >>= 1;
- hs |= 0xFFFF; /* don't change it! It's required for Deflate */
- if (hs > (1 << 24))
- {
- if (p->numHashBytes == 3)
- hs = (1 << 24) - 1;
- else
- hs >>= 1;
- }
- }
- p->hashMask = hs;
- hs++;
- if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size;
- if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size;
- if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size;
- hs += p->fixedHashSize;
- }
-
- {
- UInt32 prevSize = p->hashSizeSum + p->numSons;
- UInt32 newSize;
- p->historySize = historySize;
- p->hashSizeSum = hs;
- p->cyclicBufferSize = newCyclicBufferSize;
- p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize);
- newSize = p->hashSizeSum + p->numSons;
- if (p->hash != 0 && prevSize == newSize)
- return 1;
- MatchFinder_FreeThisClassMemory(p, alloc);
- p->hash = AllocRefs(newSize, alloc);
- if (p->hash != 0)
- {
- p->son = p->hash + p->hashSizeSum;
- return 1;
- }
- }
- }
- MatchFinder_Free(p, alloc);
- return 0;
-}
-
-static void MatchFinder_SetLimits(CMatchFinder *p)
-{
- UInt32 limit = kMaxValForNormalize - p->pos;
- UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos;
- if (limit2 < limit)
- limit = limit2;
- limit2 = p->streamPos - p->pos;
- if (limit2 <= p->keepSizeAfter)
- {
- if (limit2 > 0)
- limit2 = 1;
- }
- else
- limit2 -= p->keepSizeAfter;
- if (limit2 < limit)
- limit = limit2;
- {
- UInt32 lenLimit = p->streamPos - p->pos;
- if (lenLimit > p->matchMaxLen)
- lenLimit = p->matchMaxLen;
- p->lenLimit = lenLimit;
- }
- p->posLimit = p->pos + limit;
-}
-
-void MatchFinder_Init(CMatchFinder *p)
-{
- UInt32 i;
- for (i = 0; i < p->hashSizeSum; i++)
- p->hash[i] = kEmptyHashValue;
- p->cyclicBufferPos = 0;
- p->buffer = p->bufferBase;
- p->pos = p->streamPos = p->cyclicBufferSize;
- p->result = SZ_OK;
- p->streamEndWasReached = 0;
- MatchFinder_ReadBlock(p);
- MatchFinder_SetLimits(p);
-}
-
-static UInt32 MatchFinder_GetSubValue(CMatchFinder *p)
-{
- return (p->pos - p->historySize - 1) & kNormalizeMask;
-}
-
-void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
-{
- UInt32 i;
- for (i = 0; i < numItems; i++)
- {
- UInt32 value = items[i];
- if (value <= subValue)
- value = kEmptyHashValue;
- else
- value -= subValue;
- items[i] = value;
- }
-}
-
-static void MatchFinder_Normalize(CMatchFinder *p)
-{
- UInt32 subValue = MatchFinder_GetSubValue(p);
- MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons);
- MatchFinder_ReduceOffsets(p, subValue);
-}
-
-static void MatchFinder_CheckLimits(CMatchFinder *p)
-{
- if (p->pos == kMaxValForNormalize)
- MatchFinder_Normalize(p);
- if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos)
- MatchFinder_CheckAndMoveAndRead(p);
- if (p->cyclicBufferPos == p->cyclicBufferSize)
- p->cyclicBufferPos = 0;
- MatchFinder_SetLimits(p);
-}
-
-static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
- UInt32 *distances, UInt32 maxLen)
-{
- son[_cyclicBufferPos] = curMatch;
- for (;;)
- {
- UInt32 delta = pos - curMatch;
- if (cutValue-- == 0 || delta >= _cyclicBufferSize)
- return distances;
- {
- const Byte *pb = cur - delta;
- curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
- if (pb[maxLen] == cur[maxLen] && *pb == *cur)
- {
- UInt32 len = 0;
- while (++len != lenLimit)
- if (pb[len] != cur[len])
- break;
- if (maxLen < len)
- {
- *distances++ = maxLen = len;
- *distances++ = delta - 1;
- if (len == lenLimit)
- return distances;
- }
- }
- }
- }
-}
-
-UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
- UInt32 *distances, UInt32 maxLen)
-{
- CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
- CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
- UInt32 len0 = 0, len1 = 0;
- for (;;)
- {
- UInt32 delta = pos - curMatch;
- if (cutValue-- == 0 || delta >= _cyclicBufferSize)
- {
- *ptr0 = *ptr1 = kEmptyHashValue;
- return distances;
- }
- {
- CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
- const Byte *pb = cur - delta;
- UInt32 len = (len0 < len1 ? len0 : len1);
- if (pb[len] == cur[len])
- {
- if (++len != lenLimit && pb[len] == cur[len])
- while (++len != lenLimit)
- if (pb[len] != cur[len])
- break;
- if (maxLen < len)
- {
- *distances++ = maxLen = len;
- *distances++ = delta - 1;
- if (len == lenLimit)
- {
- *ptr1 = pair[0];
- *ptr0 = pair[1];
- return distances;
- }
- }
- }
- if (pb[len] < cur[len])
- {
- *ptr1 = curMatch;
- ptr1 = pair + 1;
- curMatch = *ptr1;
- len1 = len;
- }
- else
- {
- *ptr0 = curMatch;
- ptr0 = pair;
- curMatch = *ptr0;
- len0 = len;
- }
- }
- }
-}
-
-static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue)
-{
- CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
- CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
- UInt32 len0 = 0, len1 = 0;
- for (;;)
- {
- UInt32 delta = pos - curMatch;
- if (cutValue-- == 0 || delta >= _cyclicBufferSize)
- {
- *ptr0 = *ptr1 = kEmptyHashValue;
- return;
- }
- {
- CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
- const Byte *pb = cur - delta;
- UInt32 len = (len0 < len1 ? len0 : len1);
- if (pb[len] == cur[len])
- {
- while (++len != lenLimit)
- if (pb[len] != cur[len])
- break;
- {
- if (len == lenLimit)
- {
- *ptr1 = pair[0];
- *ptr0 = pair[1];
- return;
- }
- }
- }
- if (pb[len] < cur[len])
- {
- *ptr1 = curMatch;
- ptr1 = pair + 1;
- curMatch = *ptr1;
- len1 = len;
- }
- else
- {
- *ptr0 = curMatch;
- ptr0 = pair;
- curMatch = *ptr0;
- len0 = len;
- }
- }
- }
-}
-
-#define MOVE_POS \
- ++p->cyclicBufferPos; \
- p->buffer++; \
- if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);
-
-#define MOVE_POS_RET MOVE_POS return offset;
-
-static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }
-
-#define GET_MATCHES_HEADER2(minLen, ret_op) \
- UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \
- lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \
- cur = p->buffer;
-
-#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0)
-#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue)
-
-#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue
-
-#define GET_MATCHES_FOOTER(offset, maxLen) \
- offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \
- distances + offset, maxLen) - distances); MOVE_POS_RET;
-
-#define SKIP_FOOTER \
- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;
-
-static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
- UInt32 offset;
- GET_MATCHES_HEADER(2)
- HASH2_CALC;
- curMatch = p->hash[hashValue];
- p->hash[hashValue] = p->pos;
- offset = 0;
- GET_MATCHES_FOOTER(offset, 1)
-}
-
-UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
- UInt32 offset;
- GET_MATCHES_HEADER(3)
- HASH_ZIP_CALC;
- curMatch = p->hash[hashValue];
- p->hash[hashValue] = p->pos;
- offset = 0;
- GET_MATCHES_FOOTER(offset, 2)
-}
-
-static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
- UInt32 hash2Value, delta2, maxLen, offset;
- GET_MATCHES_HEADER(3)
-
- HASH3_CALC;
-
- delta2 = p->pos - p->hash[hash2Value];
- curMatch = p->hash[kFix3HashSize + hashValue];
-
- p->hash[hash2Value] =
- p->hash[kFix3HashSize + hashValue] = p->pos;
-
-
- maxLen = 2;
- offset = 0;
- if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
- {
- for (; maxLen != lenLimit; maxLen++)
- if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
- break;
- distances[0] = maxLen;
- distances[1] = delta2 - 1;
- offset = 2;
- if (maxLen == lenLimit)
- {
- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
- MOVE_POS_RET;
- }
- }
- GET_MATCHES_FOOTER(offset, maxLen)
-}
-
-static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
- UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
- GET_MATCHES_HEADER(4)
-
- HASH4_CALC;
-
- delta2 = p->pos - p->hash[ hash2Value];
- delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
- curMatch = p->hash[kFix4HashSize + hashValue];
-
- p->hash[ hash2Value] =
- p->hash[kFix3HashSize + hash3Value] =
- p->hash[kFix4HashSize + hashValue] = p->pos;
-
- maxLen = 1;
- offset = 0;
- if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
- {
- distances[0] = maxLen = 2;
- distances[1] = delta2 - 1;
- offset = 2;
- }
- if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
- {
- maxLen = 3;
- distances[offset + 1] = delta3 - 1;
- offset += 2;
- delta2 = delta3;
- }
- if (offset != 0)
- {
- for (; maxLen != lenLimit; maxLen++)
- if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
- break;
- distances[offset - 2] = maxLen;
- if (maxLen == lenLimit)
- {
- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
- MOVE_POS_RET;
- }
- }
- if (maxLen < 3)
- maxLen = 3;
- GET_MATCHES_FOOTER(offset, maxLen)
-}
-
-static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
- UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
- GET_MATCHES_HEADER(4)
-
- HASH4_CALC;
-
- delta2 = p->pos - p->hash[ hash2Value];
- delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
- curMatch = p->hash[kFix4HashSize + hashValue];
-
- p->hash[ hash2Value] =
- p->hash[kFix3HashSize + hash3Value] =
- p->hash[kFix4HashSize + hashValue] = p->pos;
-
- maxLen = 1;
- offset = 0;
- if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
- {
- distances[0] = maxLen = 2;
- distances[1] = delta2 - 1;
- offset = 2;
- }
- if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
- {
- maxLen = 3;
- distances[offset + 1] = delta3 - 1;
- offset += 2;
- delta2 = delta3;
- }
- if (offset != 0)
- {
- for (; maxLen != lenLimit; maxLen++)
- if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
- break;
- distances[offset - 2] = maxLen;
- if (maxLen == lenLimit)
- {
- p->son[p->cyclicBufferPos] = curMatch;
- MOVE_POS_RET;
- }
- }
- if (maxLen < 3)
- maxLen = 3;
- offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
- distances + offset, maxLen) - (distances));
- MOVE_POS_RET
-}
-
-UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
- UInt32 offset;
- GET_MATCHES_HEADER(3)
- HASH_ZIP_CALC;
- curMatch = p->hash[hashValue];
- p->hash[hashValue] = p->pos;
- offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
- distances, 2) - (distances));
- MOVE_POS_RET
-}
-
-static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-{
- do
- {
- SKIP_HEADER(2)
- HASH2_CALC;
- curMatch = p->hash[hashValue];
- p->hash[hashValue] = p->pos;
- SKIP_FOOTER
- }
- while (--num != 0);
-}
-
-void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-{
- do
- {
- SKIP_HEADER(3)
- HASH_ZIP_CALC;
- curMatch = p->hash[hashValue];
- p->hash[hashValue] = p->pos;
- SKIP_FOOTER
- }
- while (--num != 0);
-}
-
-static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-{
- do
- {
- UInt32 hash2Value;
- SKIP_HEADER(3)
- HASH3_CALC;
- curMatch = p->hash[kFix3HashSize + hashValue];
- p->hash[hash2Value] =
- p->hash[kFix3HashSize + hashValue] = p->pos;
- SKIP_FOOTER
- }
- while (--num != 0);
-}
-
-static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-{
- do
- {
- UInt32 hash2Value, hash3Value;
- SKIP_HEADER(4)
- HASH4_CALC;
- curMatch = p->hash[kFix4HashSize + hashValue];
- p->hash[ hash2Value] =
- p->hash[kFix3HashSize + hash3Value] = p->pos;
- p->hash[kFix4HashSize + hashValue] = p->pos;
- SKIP_FOOTER
- }
- while (--num != 0);
-}
-
-static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-{
- do
- {
- UInt32 hash2Value, hash3Value;
- SKIP_HEADER(4)
- HASH4_CALC;
- curMatch = p->hash[kFix4HashSize + hashValue];
- p->hash[ hash2Value] =
- p->hash[kFix3HashSize + hash3Value] =
- p->hash[kFix4HashSize + hashValue] = p->pos;
- p->son[p->cyclicBufferPos] = curMatch;
- MOVE_POS
- }
- while (--num != 0);
-}
-
-void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-{
- do
- {
- SKIP_HEADER(3)
- HASH_ZIP_CALC;
- curMatch = p->hash[hashValue];
- p->hash[hashValue] = p->pos;
- p->son[p->cyclicBufferPos] = curMatch;
- MOVE_POS
- }
- while (--num != 0);
-}
-
-void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)
-{
- vTable->Init = (Mf_Init_Func)MatchFinder_Init;
- vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;
- vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;
- vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;
- if (!p->btMode)
- {
- vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;
- vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;
- }
- else if (p->numHashBytes == 2)
- {
- vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;
- vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;
- }
- else if (p->numHashBytes == 3)
- {
- vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;
- vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;
- }
- else
- {
- vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
- vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
- }
-}
diff --git a/src/libs/7zip/win/C/LzFind.h b/src/libs/7zip/win/C/LzFind.h
deleted file mode 100644
index 706143d25..000000000
--- a/src/libs/7zip/win/C/LzFind.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/* LzFind.h -- Match finder for LZ algorithms
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __LZ_FIND_H
-#define __LZ_FIND_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-typedef UInt32 CLzRef;
-
-typedef struct _CMatchFinder
-{
- Byte *buffer;
- UInt32 pos;
- UInt32 posLimit;
- UInt32 streamPos;
- UInt32 lenLimit;
-
- UInt32 cyclicBufferPos;
- UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */
-
- UInt32 matchMaxLen;
- CLzRef *hash;
- CLzRef *son;
- UInt32 hashMask;
- UInt32 cutValue;
-
- Byte *bufferBase;
- ISeqInStream *stream;
- int streamEndWasReached;
-
- UInt32 blockSize;
- UInt32 keepSizeBefore;
- UInt32 keepSizeAfter;
-
- UInt32 numHashBytes;
- int directInput;
- size_t directInputRem;
- int btMode;
- int bigHash;
- UInt32 historySize;
- UInt32 fixedHashSize;
- UInt32 hashSizeSum;
- UInt32 numSons;
- SRes result;
- UInt32 crc[256];
-} CMatchFinder;
-
-#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer)
-#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)])
-
-#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
-
-int MatchFinder_NeedMove(CMatchFinder *p);
-Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);
-void MatchFinder_MoveBlock(CMatchFinder *p);
-void MatchFinder_ReadIfRequired(CMatchFinder *p);
-
-void MatchFinder_Construct(CMatchFinder *p);
-
-/* Conditions:
- historySize <= 3 GB
- keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB
-*/
-int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
- UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
- ISzAlloc *alloc);
-void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);
-void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);
-void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
-
-UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
- UInt32 *distances, UInt32 maxLen);
-
-/*
-Conditions:
- Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func.
- Mf_GetPointerToCurrentPos_Func's result must be used only before any other function
-*/
-
-typedef void (*Mf_Init_Func)(void *object);
-typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index);
-typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object);
-typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object);
-typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances);
-typedef void (*Mf_Skip_Func)(void *object, UInt32);
-
-typedef struct _IMatchFinder
-{
- Mf_Init_Func Init;
- Mf_GetIndexByte_Func GetIndexByte;
- Mf_GetNumAvailableBytes_Func GetNumAvailableBytes;
- Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos;
- Mf_GetMatches_Func GetMatches;
- Mf_Skip_Func Skip;
-} IMatchFinder;
-
-void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);
-
-void MatchFinder_Init(CMatchFinder *p);
-UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
-UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
-void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
-void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/LzFindMt.c b/src/libs/7zip/win/C/LzFindMt.c
deleted file mode 100644
index 8be0adaaf..000000000
--- a/src/libs/7zip/win/C/LzFindMt.c
+++ /dev/null
@@ -1,794 +0,0 @@
-/* LzFindMt.c -- multithreaded Match finder for LZ algorithms
-2014-12-29 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "LzHash.h"
-
-#include "LzFindMt.h"
-
-void MtSync_Construct(CMtSync *p)
-{
- p->wasCreated = False;
- p->csWasInitialized = False;
- p->csWasEntered = False;
- Thread_Construct(&p->thread);
- Event_Construct(&p->canStart);
- Event_Construct(&p->wasStarted);
- Event_Construct(&p->wasStopped);
- Semaphore_Construct(&p->freeSemaphore);
- Semaphore_Construct(&p->filledSemaphore);
-}
-
-void MtSync_GetNextBlock(CMtSync *p)
-{
- if (p->needStart)
- {
- p->numProcessedBlocks = 1;
- p->needStart = False;
- p->stopWriting = False;
- p->exit = False;
- Event_Reset(&p->wasStarted);
- Event_Reset(&p->wasStopped);
-
- Event_Set(&p->canStart);
- Event_Wait(&p->wasStarted);
- }
- else
- {
- CriticalSection_Leave(&p->cs);
- p->csWasEntered = False;
- p->numProcessedBlocks++;
- Semaphore_Release1(&p->freeSemaphore);
- }
- Semaphore_Wait(&p->filledSemaphore);
- CriticalSection_Enter(&p->cs);
- p->csWasEntered = True;
-}
-
-/* MtSync_StopWriting must be called if Writing was started */
-
-void MtSync_StopWriting(CMtSync *p)
-{
- UInt32 myNumBlocks = p->numProcessedBlocks;
- if (!Thread_WasCreated(&p->thread) || p->needStart)
- return;
- p->stopWriting = True;
- if (p->csWasEntered)
- {
- CriticalSection_Leave(&p->cs);
- p->csWasEntered = False;
- }
- Semaphore_Release1(&p->freeSemaphore);
-
- Event_Wait(&p->wasStopped);
-
- while (myNumBlocks++ != p->numProcessedBlocks)
- {
- Semaphore_Wait(&p->filledSemaphore);
- Semaphore_Release1(&p->freeSemaphore);
- }
- p->needStart = True;
-}
-
-void MtSync_Destruct(CMtSync *p)
-{
- if (Thread_WasCreated(&p->thread))
- {
- MtSync_StopWriting(p);
- p->exit = True;
- if (p->needStart)
- Event_Set(&p->canStart);
- Thread_Wait(&p->thread);
- Thread_Close(&p->thread);
- }
- if (p->csWasInitialized)
- {
- CriticalSection_Delete(&p->cs);
- p->csWasInitialized = False;
- }
-
- Event_Close(&p->canStart);
- Event_Close(&p->wasStarted);
- Event_Close(&p->wasStopped);
- Semaphore_Close(&p->freeSemaphore);
- Semaphore_Close(&p->filledSemaphore);
-
- p->wasCreated = False;
-}
-
-#define RINOK_THREAD(x) { if ((x) != 0) return SZ_ERROR_THREAD; }
-
-static SRes MtSync_Create2(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj, UInt32 numBlocks)
-{
- if (p->wasCreated)
- return SZ_OK;
-
- RINOK_THREAD(CriticalSection_Init(&p->cs));
- p->csWasInitialized = True;
-
- RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canStart));
- RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStarted));
- RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStopped));
-
- RINOK_THREAD(Semaphore_Create(&p->freeSemaphore, numBlocks, numBlocks));
- RINOK_THREAD(Semaphore_Create(&p->filledSemaphore, 0, numBlocks));
-
- p->needStart = True;
-
- RINOK_THREAD(Thread_Create(&p->thread, startAddress, obj));
- p->wasCreated = True;
- return SZ_OK;
-}
-
-static SRes MtSync_Create(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj, UInt32 numBlocks)
-{
- SRes res = MtSync_Create2(p, startAddress, obj, numBlocks);
- if (res != SZ_OK)
- MtSync_Destruct(p);
- return res;
-}
-
-void MtSync_Init(CMtSync *p) { p->needStart = True; }
-
-#define kMtMaxValForNormalize 0xFFFFFFFF
-
-#define DEF_GetHeads2(name, v, action) \
-static void GetHeads ## name(const Byte *p, UInt32 pos, \
-UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc) \
-{ action; for (; numHeads != 0; numHeads--) { \
-const UInt32 value = (v); p++; *heads++ = pos - hash[value]; hash[value] = pos++; } }
-
-#define DEF_GetHeads(name, v) DEF_GetHeads2(name, v, ;)
-
-DEF_GetHeads2(2, (p[0] | ((UInt32)p[1] << 8)), hashMask = hashMask; crc = crc; )
-DEF_GetHeads(3, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8)) & hashMask)
-DEF_GetHeads(4, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ (crc[p[3]] << 5)) & hashMask)
-DEF_GetHeads(4b, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ ((UInt32)p[3] << 16)) & hashMask)
-/* DEF_GetHeads(5, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ (crc[p[3]] << 5) ^ (crc[p[4]] << 3)) & hashMask) */
-
-void HashThreadFunc(CMatchFinderMt *mt)
-{
- CMtSync *p = &mt->hashSync;
- for (;;)
- {
- UInt32 numProcessedBlocks = 0;
- Event_Wait(&p->canStart);
- Event_Set(&p->wasStarted);
- for (;;)
- {
- if (p->exit)
- return;
- if (p->stopWriting)
- {
- p->numProcessedBlocks = numProcessedBlocks;
- Event_Set(&p->wasStopped);
- break;
- }
-
- {
- CMatchFinder *mf = mt->MatchFinder;
- if (MatchFinder_NeedMove(mf))
- {
- CriticalSection_Enter(&mt->btSync.cs);
- CriticalSection_Enter(&mt->hashSync.cs);
- {
- const Byte *beforePtr = MatchFinder_GetPointerToCurrentPos(mf);
- const Byte *afterPtr;
- MatchFinder_MoveBlock(mf);
- afterPtr = MatchFinder_GetPointerToCurrentPos(mf);
- mt->pointerToCurPos -= beforePtr - afterPtr;
- mt->buffer -= beforePtr - afterPtr;
- }
- CriticalSection_Leave(&mt->btSync.cs);
- CriticalSection_Leave(&mt->hashSync.cs);
- continue;
- }
-
- Semaphore_Wait(&p->freeSemaphore);
-
- MatchFinder_ReadIfRequired(mf);
- if (mf->pos > (kMtMaxValForNormalize - kMtHashBlockSize))
- {
- UInt32 subValue = (mf->pos - mf->historySize - 1);
- MatchFinder_ReduceOffsets(mf, subValue);
- MatchFinder_Normalize3(subValue, mf->hash + mf->fixedHashSize, mf->hashMask + 1);
- }
- {
- UInt32 *heads = mt->hashBuf + ((numProcessedBlocks++) & kMtHashNumBlocksMask) * kMtHashBlockSize;
- UInt32 num = mf->streamPos - mf->pos;
- heads[0] = 2;
- heads[1] = num;
- if (num >= mf->numHashBytes)
- {
- num = num - mf->numHashBytes + 1;
- if (num > kMtHashBlockSize - 2)
- num = kMtHashBlockSize - 2;
- mt->GetHeadsFunc(mf->buffer, mf->pos, mf->hash + mf->fixedHashSize, mf->hashMask, heads + 2, num, mf->crc);
- heads[0] += num;
- }
- mf->pos += num;
- mf->buffer += num;
- }
- }
-
- Semaphore_Release1(&p->filledSemaphore);
- }
- }
-}
-
-void MatchFinderMt_GetNextBlock_Hash(CMatchFinderMt *p)
-{
- MtSync_GetNextBlock(&p->hashSync);
- p->hashBufPosLimit = p->hashBufPos = ((p->hashSync.numProcessedBlocks - 1) & kMtHashNumBlocksMask) * kMtHashBlockSize;
- p->hashBufPosLimit += p->hashBuf[p->hashBufPos++];
- p->hashNumAvail = p->hashBuf[p->hashBufPos++];
-}
-
-#define kEmptyHashValue 0
-
-/* #define MFMT_GM_INLINE */
-
-#ifdef MFMT_GM_INLINE
-
-#define NO_INLINE MY_FAST_CALL
-
-Int32 NO_INLINE GetMatchesSpecN(UInt32 lenLimit, UInt32 pos, const Byte *cur, CLzRef *son,
- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
- UInt32 *_distances, UInt32 _maxLen, const UInt32 *hash, Int32 limit, UInt32 size, UInt32 *posRes)
-{
- do
- {
- UInt32 *distances = _distances + 1;
- UInt32 curMatch = pos - *hash++;
-
- CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
- CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
- UInt32 len0 = 0, len1 = 0;
- UInt32 cutValue = _cutValue;
- UInt32 maxLen = _maxLen;
- for (;;)
- {
- UInt32 delta = pos - curMatch;
- if (cutValue-- == 0 || delta >= _cyclicBufferSize)
- {
- *ptr0 = *ptr1 = kEmptyHashValue;
- break;
- }
- {
- CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
- const Byte *pb = cur - delta;
- UInt32 len = (len0 < len1 ? len0 : len1);
- if (pb[len] == cur[len])
- {
- if (++len != lenLimit && pb[len] == cur[len])
- while (++len != lenLimit)
- if (pb[len] != cur[len])
- break;
- if (maxLen < len)
- {
- *distances++ = maxLen = len;
- *distances++ = delta - 1;
- if (len == lenLimit)
- {
- *ptr1 = pair[0];
- *ptr0 = pair[1];
- break;
- }
- }
- }
- if (pb[len] < cur[len])
- {
- *ptr1 = curMatch;
- ptr1 = pair + 1;
- curMatch = *ptr1;
- len1 = len;
- }
- else
- {
- *ptr0 = curMatch;
- ptr0 = pair;
- curMatch = *ptr0;
- len0 = len;
- }
- }
- }
- pos++;
- _cyclicBufferPos++;
- cur++;
- {
- UInt32 num = (UInt32)(distances - _distances);
- *_distances = num - 1;
- _distances += num;
- limit -= num;
- }
- }
- while (limit > 0 && --size != 0);
- *posRes = pos;
- return limit;
-}
-
-#endif
-
-void BtGetMatches(CMatchFinderMt *p, UInt32 *distances)
-{
- UInt32 numProcessed = 0;
- UInt32 curPos = 2;
- UInt32 limit = kMtBtBlockSize - (p->matchMaxLen * 2);
- distances[1] = p->hashNumAvail;
- while (curPos < limit)
- {
- if (p->hashBufPos == p->hashBufPosLimit)
- {
- MatchFinderMt_GetNextBlock_Hash(p);
- distances[1] = numProcessed + p->hashNumAvail;
- if (p->hashNumAvail >= p->numHashBytes)
- continue;
- for (; p->hashNumAvail != 0; p->hashNumAvail--)
- distances[curPos++] = 0;
- break;
- }
- {
- UInt32 size = p->hashBufPosLimit - p->hashBufPos;
- UInt32 lenLimit = p->matchMaxLen;
- UInt32 pos = p->pos;
- UInt32 cyclicBufferPos = p->cyclicBufferPos;
- if (lenLimit >= p->hashNumAvail)
- lenLimit = p->hashNumAvail;
- {
- UInt32 size2 = p->hashNumAvail - lenLimit + 1;
- if (size2 < size)
- size = size2;
- size2 = p->cyclicBufferSize - cyclicBufferPos;
- if (size2 < size)
- size = size2;
- }
- #ifndef MFMT_GM_INLINE
- while (curPos < limit && size-- != 0)
- {
- UInt32 *startDistances = distances + curPos;
- UInt32 num = (UInt32)(GetMatchesSpec1(lenLimit, pos - p->hashBuf[p->hashBufPos++],
- pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue,
- startDistances + 1, p->numHashBytes - 1) - startDistances);
- *startDistances = num - 1;
- curPos += num;
- cyclicBufferPos++;
- pos++;
- p->buffer++;
- }
- #else
- {
- UInt32 posRes;
- curPos = limit - GetMatchesSpecN(lenLimit, pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue,
- distances + curPos, p->numHashBytes - 1, p->hashBuf + p->hashBufPos, (Int32)(limit - curPos) , size, &posRes);
- p->hashBufPos += posRes - pos;
- cyclicBufferPos += posRes - pos;
- p->buffer += posRes - pos;
- pos = posRes;
- }
- #endif
-
- numProcessed += pos - p->pos;
- p->hashNumAvail -= pos - p->pos;
- p->pos = pos;
- if (cyclicBufferPos == p->cyclicBufferSize)
- cyclicBufferPos = 0;
- p->cyclicBufferPos = cyclicBufferPos;
- }
- }
- distances[0] = curPos;
-}
-
-void BtFillBlock(CMatchFinderMt *p, UInt32 globalBlockIndex)
-{
- CMtSync *sync = &p->hashSync;
- if (!sync->needStart)
- {
- CriticalSection_Enter(&sync->cs);
- sync->csWasEntered = True;
- }
-
- BtGetMatches(p, p->btBuf + (globalBlockIndex & kMtBtNumBlocksMask) * kMtBtBlockSize);
-
- if (p->pos > kMtMaxValForNormalize - kMtBtBlockSize)
- {
- UInt32 subValue = p->pos - p->cyclicBufferSize;
- MatchFinder_Normalize3(subValue, p->son, p->cyclicBufferSize * 2);
- p->pos -= subValue;
- }
-
- if (!sync->needStart)
- {
- CriticalSection_Leave(&sync->cs);
- sync->csWasEntered = False;
- }
-}
-
-void BtThreadFunc(CMatchFinderMt *mt)
-{
- CMtSync *p = &mt->btSync;
- for (;;)
- {
- UInt32 blockIndex = 0;
- Event_Wait(&p->canStart);
- Event_Set(&p->wasStarted);
- for (;;)
- {
- if (p->exit)
- return;
- if (p->stopWriting)
- {
- p->numProcessedBlocks = blockIndex;
- MtSync_StopWriting(&mt->hashSync);
- Event_Set(&p->wasStopped);
- break;
- }
- Semaphore_Wait(&p->freeSemaphore);
- BtFillBlock(mt, blockIndex++);
- Semaphore_Release1(&p->filledSemaphore);
- }
- }
-}
-
-void MatchFinderMt_Construct(CMatchFinderMt *p)
-{
- p->hashBuf = 0;
- MtSync_Construct(&p->hashSync);
- MtSync_Construct(&p->btSync);
-}
-
-void MatchFinderMt_FreeMem(CMatchFinderMt *p, ISzAlloc *alloc)
-{
- alloc->Free(alloc, p->hashBuf);
- p->hashBuf = 0;
-}
-
-void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc)
-{
- MtSync_Destruct(&p->hashSync);
- MtSync_Destruct(&p->btSync);
- MatchFinderMt_FreeMem(p, alloc);
-}
-
-#define kHashBufferSize (kMtHashBlockSize * kMtHashNumBlocks)
-#define kBtBufferSize (kMtBtBlockSize * kMtBtNumBlocks)
-
-static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE HashThreadFunc2(void *p) { HashThreadFunc((CMatchFinderMt *)p); return 0; }
-static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE BtThreadFunc2(void *p)
-{
- Byte allocaDummy[0x180];
- allocaDummy[0] = 0;
- allocaDummy[1] = allocaDummy[0];
- BtThreadFunc((CMatchFinderMt *)p);
- return 0;
-}
-
-SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore,
- UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc)
-{
- CMatchFinder *mf = p->MatchFinder;
- p->historySize = historySize;
- if (kMtBtBlockSize <= matchMaxLen * 4)
- return SZ_ERROR_PARAM;
- if (p->hashBuf == 0)
- {
- p->hashBuf = (UInt32 *)alloc->Alloc(alloc, (kHashBufferSize + kBtBufferSize) * sizeof(UInt32));
- if (p->hashBuf == 0)
- return SZ_ERROR_MEM;
- p->btBuf = p->hashBuf + kHashBufferSize;
- }
- keepAddBufferBefore += (kHashBufferSize + kBtBufferSize);
- keepAddBufferAfter += kMtHashBlockSize;
- if (!MatchFinder_Create(mf, historySize, keepAddBufferBefore, matchMaxLen, keepAddBufferAfter, alloc))
- return SZ_ERROR_MEM;
-
- RINOK(MtSync_Create(&p->hashSync, HashThreadFunc2, p, kMtHashNumBlocks));
- RINOK(MtSync_Create(&p->btSync, BtThreadFunc2, p, kMtBtNumBlocks));
- return SZ_OK;
-}
-
-/* Call it after ReleaseStream / SetStream */
-void MatchFinderMt_Init(CMatchFinderMt *p)
-{
- CMatchFinder *mf = p->MatchFinder;
- p->btBufPos = p->btBufPosLimit = 0;
- p->hashBufPos = p->hashBufPosLimit = 0;
- MatchFinder_Init(mf);
- p->pointerToCurPos = MatchFinder_GetPointerToCurrentPos(mf);
- p->btNumAvailBytes = 0;
- p->lzPos = p->historySize + 1;
-
- p->hash = mf->hash;
- p->fixedHashSize = mf->fixedHashSize;
- p->crc = mf->crc;
-
- p->son = mf->son;
- p->matchMaxLen = mf->matchMaxLen;
- p->numHashBytes = mf->numHashBytes;
- p->pos = mf->pos;
- p->buffer = mf->buffer;
- p->cyclicBufferPos = mf->cyclicBufferPos;
- p->cyclicBufferSize = mf->cyclicBufferSize;
- p->cutValue = mf->cutValue;
-}
-
-/* ReleaseStream is required to finish multithreading */
-void MatchFinderMt_ReleaseStream(CMatchFinderMt *p)
-{
- MtSync_StopWriting(&p->btSync);
- /* p->MatchFinder->ReleaseStream(); */
-}
-
-void MatchFinderMt_Normalize(CMatchFinderMt *p)
-{
- MatchFinder_Normalize3(p->lzPos - p->historySize - 1, p->hash, p->fixedHashSize);
- p->lzPos = p->historySize + 1;
-}
-
-void MatchFinderMt_GetNextBlock_Bt(CMatchFinderMt *p)
-{
- UInt32 blockIndex;
- MtSync_GetNextBlock(&p->btSync);
- blockIndex = ((p->btSync.numProcessedBlocks - 1) & kMtBtNumBlocksMask);
- p->btBufPosLimit = p->btBufPos = blockIndex * kMtBtBlockSize;
- p->btBufPosLimit += p->btBuf[p->btBufPos++];
- p->btNumAvailBytes = p->btBuf[p->btBufPos++];
- if (p->lzPos >= kMtMaxValForNormalize - kMtBtBlockSize)
- MatchFinderMt_Normalize(p);
-}
-
-const Byte * MatchFinderMt_GetPointerToCurrentPos(CMatchFinderMt *p)
-{
- return p->pointerToCurPos;
-}
-
-#define GET_NEXT_BLOCK_IF_REQUIRED if (p->btBufPos == p->btBufPosLimit) MatchFinderMt_GetNextBlock_Bt(p);
-
-UInt32 MatchFinderMt_GetNumAvailableBytes(CMatchFinderMt *p)
-{
- GET_NEXT_BLOCK_IF_REQUIRED;
- return p->btNumAvailBytes;
-}
-
-Byte MatchFinderMt_GetIndexByte(CMatchFinderMt *p, Int32 index)
-{
- return p->pointerToCurPos[index];
-}
-
-UInt32 * MixMatches2(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances)
-{
- UInt32 hash2Value, curMatch2;
- UInt32 *hash = p->hash;
- const Byte *cur = p->pointerToCurPos;
- UInt32 lzPos = p->lzPos;
- MT_HASH2_CALC
-
- curMatch2 = hash[hash2Value];
- hash[hash2Value] = lzPos;
-
- if (curMatch2 >= matchMinPos)
- if (cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0])
- {
- *distances++ = 2;
- *distances++ = lzPos - curMatch2 - 1;
- }
- return distances;
-}
-
-UInt32 * MixMatches3(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances)
-{
- UInt32 hash2Value, hash3Value, curMatch2, curMatch3;
- UInt32 *hash = p->hash;
- const Byte *cur = p->pointerToCurPos;
- UInt32 lzPos = p->lzPos;
- MT_HASH3_CALC
-
- curMatch2 = hash[ hash2Value];
- curMatch3 = hash[kFix3HashSize + hash3Value];
-
- hash[ hash2Value] =
- hash[kFix3HashSize + hash3Value] =
- lzPos;
-
- if (curMatch2 >= matchMinPos && cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0])
- {
- distances[1] = lzPos - curMatch2 - 1;
- if (cur[(ptrdiff_t)curMatch2 - lzPos + 2] == cur[2])
- {
- distances[0] = 3;
- return distances + 2;
- }
- distances[0] = 2;
- distances += 2;
- }
- if (curMatch3 >= matchMinPos && cur[(ptrdiff_t)curMatch3 - lzPos] == cur[0])
- {
- *distances++ = 3;
- *distances++ = lzPos - curMatch3 - 1;
- }
- return distances;
-}
-
-/*
-UInt32 *MixMatches4(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances)
-{
- UInt32 hash2Value, hash3Value, hash4Value, curMatch2, curMatch3, curMatch4;
- UInt32 *hash = p->hash;
- const Byte *cur = p->pointerToCurPos;
- UInt32 lzPos = p->lzPos;
- MT_HASH4_CALC
-
- curMatch2 = hash[ hash2Value];
- curMatch3 = hash[kFix3HashSize + hash3Value];
- curMatch4 = hash[kFix4HashSize + hash4Value];
-
- hash[ hash2Value] =
- hash[kFix3HashSize + hash3Value] =
- hash[kFix4HashSize + hash4Value] =
- lzPos;
-
- if (curMatch2 >= matchMinPos && cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0])
- {
- distances[1] = lzPos - curMatch2 - 1;
- if (cur[(ptrdiff_t)curMatch2 - lzPos + 2] == cur[2])
- {
- distances[0] = (cur[(ptrdiff_t)curMatch2 - lzPos + 3] == cur[3]) ? 4 : 3;
- return distances + 2;
- }
- distances[0] = 2;
- distances += 2;
- }
- if (curMatch3 >= matchMinPos && cur[(ptrdiff_t)curMatch3 - lzPos] == cur[0])
- {
- distances[1] = lzPos - curMatch3 - 1;
- if (cur[(ptrdiff_t)curMatch3 - lzPos + 3] == cur[3])
- {
- distances[0] = 4;
- return distances + 2;
- }
- distances[0] = 3;
- distances += 2;
- }
-
- if (curMatch4 >= matchMinPos)
- if (
- cur[(ptrdiff_t)curMatch4 - lzPos] == cur[0] &&
- cur[(ptrdiff_t)curMatch4 - lzPos + 3] == cur[3]
- )
- {
- *distances++ = 4;
- *distances++ = lzPos - curMatch4 - 1;
- }
- return distances;
-}
-*/
-
-#define INCREASE_LZ_POS p->lzPos++; p->pointerToCurPos++;
-
-UInt32 MatchFinderMt2_GetMatches(CMatchFinderMt *p, UInt32 *distances)
-{
- const UInt32 *btBuf = p->btBuf + p->btBufPos;
- UInt32 len = *btBuf++;
- p->btBufPos += 1 + len;
- p->btNumAvailBytes--;
- {
- UInt32 i;
- for (i = 0; i < len; i += 2)
- {
- *distances++ = *btBuf++;
- *distances++ = *btBuf++;
- }
- }
- INCREASE_LZ_POS
- return len;
-}
-
-UInt32 MatchFinderMt_GetMatches(CMatchFinderMt *p, UInt32 *distances)
-{
- const UInt32 *btBuf = p->btBuf + p->btBufPos;
- UInt32 len = *btBuf++;
- p->btBufPos += 1 + len;
-
- if (len == 0)
- {
- if (p->btNumAvailBytes-- >= 4)
- len = (UInt32)(p->MixMatchesFunc(p, p->lzPos - p->historySize, distances) - (distances));
- }
- else
- {
- /* Condition: there are matches in btBuf with length < p->numHashBytes */
- UInt32 *distances2;
- p->btNumAvailBytes--;
- distances2 = p->MixMatchesFunc(p, p->lzPos - btBuf[1], distances);
- do
- {
- *distances2++ = *btBuf++;
- *distances2++ = *btBuf++;
- }
- while ((len -= 2) != 0);
- len = (UInt32)(distances2 - (distances));
- }
- INCREASE_LZ_POS
- return len;
-}
-
-#define SKIP_HEADER2_MT do { GET_NEXT_BLOCK_IF_REQUIRED
-#define SKIP_HEADER_MT(n) SKIP_HEADER2_MT if (p->btNumAvailBytes-- >= (n)) { const Byte *cur = p->pointerToCurPos; UInt32 *hash = p->hash;
-#define SKIP_FOOTER_MT } INCREASE_LZ_POS p->btBufPos += p->btBuf[p->btBufPos] + 1; } while (--num != 0);
-
-void MatchFinderMt0_Skip(CMatchFinderMt *p, UInt32 num)
-{
- SKIP_HEADER2_MT { p->btNumAvailBytes--;
- SKIP_FOOTER_MT
-}
-
-void MatchFinderMt2_Skip(CMatchFinderMt *p, UInt32 num)
-{
- SKIP_HEADER_MT(2)
- UInt32 hash2Value;
- MT_HASH2_CALC
- hash[hash2Value] = p->lzPos;
- SKIP_FOOTER_MT
-}
-
-void MatchFinderMt3_Skip(CMatchFinderMt *p, UInt32 num)
-{
- SKIP_HEADER_MT(3)
- UInt32 hash2Value, hash3Value;
- MT_HASH3_CALC
- hash[kFix3HashSize + hash3Value] =
- hash[ hash2Value] =
- p->lzPos;
- SKIP_FOOTER_MT
-}
-
-/*
-void MatchFinderMt4_Skip(CMatchFinderMt *p, UInt32 num)
-{
- SKIP_HEADER_MT(4)
- UInt32 hash2Value, hash3Value, hash4Value;
- MT_HASH4_CALC
- hash[kFix4HashSize + hash4Value] =
- hash[kFix3HashSize + hash3Value] =
- hash[ hash2Value] =
- p->lzPos;
- SKIP_FOOTER_MT
-}
-*/
-
-void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable)
-{
- vTable->Init = (Mf_Init_Func)MatchFinderMt_Init;
- vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinderMt_GetIndexByte;
- vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinderMt_GetNumAvailableBytes;
- vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinderMt_GetPointerToCurrentPos;
- vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches;
- switch(p->MatchFinder->numHashBytes)
- {
- case 2:
- p->GetHeadsFunc = GetHeads2;
- p->MixMatchesFunc = (Mf_Mix_Matches)0;
- vTable->Skip = (Mf_Skip_Func)MatchFinderMt0_Skip;
- vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt2_GetMatches;
- break;
- case 3:
- p->GetHeadsFunc = GetHeads3;
- p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches2;
- vTable->Skip = (Mf_Skip_Func)MatchFinderMt2_Skip;
- break;
- default:
- /* case 4: */
- p->GetHeadsFunc = p->MatchFinder->bigHash ? GetHeads4b : GetHeads4;
- /* p->GetHeadsFunc = GetHeads4; */
- p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches3;
- vTable->Skip = (Mf_Skip_Func)MatchFinderMt3_Skip;
- break;
- /*
- default:
- p->GetHeadsFunc = GetHeads5;
- p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches4;
- vTable->Skip = (Mf_Skip_Func)MatchFinderMt4_Skip;
- break;
- */
- }
-}
diff --git a/src/libs/7zip/win/C/LzFindMt.h b/src/libs/7zip/win/C/LzFindMt.h
deleted file mode 100644
index 65cc12783..000000000
--- a/src/libs/7zip/win/C/LzFindMt.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* LzFindMt.h -- multithreaded Match finder for LZ algorithms
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __LZ_FIND_MT_H
-#define __LZ_FIND_MT_H
-
-#include "LzFind.h"
-#include "Threads.h"
-
-EXTERN_C_BEGIN
-
-#define kMtHashBlockSize (1 << 13)
-#define kMtHashNumBlocks (1 << 3)
-#define kMtHashNumBlocksMask (kMtHashNumBlocks - 1)
-
-#define kMtBtBlockSize (1 << 14)
-#define kMtBtNumBlocks (1 << 6)
-#define kMtBtNumBlocksMask (kMtBtNumBlocks - 1)
-
-typedef struct _CMtSync
-{
- Bool wasCreated;
- Bool needStart;
- Bool exit;
- Bool stopWriting;
-
- CThread thread;
- CAutoResetEvent canStart;
- CAutoResetEvent wasStarted;
- CAutoResetEvent wasStopped;
- CSemaphore freeSemaphore;
- CSemaphore filledSemaphore;
- Bool csWasInitialized;
- Bool csWasEntered;
- CCriticalSection cs;
- UInt32 numProcessedBlocks;
-} CMtSync;
-
-typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances);
-
-/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */
-#define kMtCacheLineDummy 128
-
-typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos,
- UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc);
-
-typedef struct _CMatchFinderMt
-{
- /* LZ */
- const Byte *pointerToCurPos;
- UInt32 *btBuf;
- UInt32 btBufPos;
- UInt32 btBufPosLimit;
- UInt32 lzPos;
- UInt32 btNumAvailBytes;
-
- UInt32 *hash;
- UInt32 fixedHashSize;
- UInt32 historySize;
- const UInt32 *crc;
-
- Mf_Mix_Matches MixMatchesFunc;
-
- /* LZ + BT */
- CMtSync btSync;
- Byte btDummy[kMtCacheLineDummy];
-
- /* BT */
- UInt32 *hashBuf;
- UInt32 hashBufPos;
- UInt32 hashBufPosLimit;
- UInt32 hashNumAvail;
-
- CLzRef *son;
- UInt32 matchMaxLen;
- UInt32 numHashBytes;
- UInt32 pos;
- Byte *buffer;
- UInt32 cyclicBufferPos;
- UInt32 cyclicBufferSize; /* it must be historySize + 1 */
- UInt32 cutValue;
-
- /* BT + Hash */
- CMtSync hashSync;
- /* Byte hashDummy[kMtCacheLineDummy]; */
-
- /* Hash */
- Mf_GetHeads GetHeadsFunc;
- CMatchFinder *MatchFinder;
-} CMatchFinderMt;
-
-void MatchFinderMt_Construct(CMatchFinderMt *p);
-void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc);
-SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore,
- UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc);
-void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable);
-void MatchFinderMt_ReleaseStream(CMatchFinderMt *p);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/LzHash.h b/src/libs/7zip/win/C/LzHash.h
deleted file mode 100644
index f3e89966c..000000000
--- a/src/libs/7zip/win/C/LzHash.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* LzHash.h -- HASH functions for LZ algorithms
-2009-02-07 : Igor Pavlov : Public domain */
-
-#ifndef __LZ_HASH_H
-#define __LZ_HASH_H
-
-#define kHash2Size (1 << 10)
-#define kHash3Size (1 << 16)
-#define kHash4Size (1 << 20)
-
-#define kFix3HashSize (kHash2Size)
-#define kFix4HashSize (kHash2Size + kHash3Size)
-#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size)
-
-#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8);
-
-#define HASH3_CALC { \
- UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
- hash2Value = temp & (kHash2Size - 1); \
- hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; }
-
-#define HASH4_CALC { \
- UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
- hash2Value = temp & (kHash2Size - 1); \
- hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
- hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; }
-
-#define HASH5_CALC { \
- UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
- hash2Value = temp & (kHash2Size - 1); \
- hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
- hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \
- hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \
- hash4Value &= (kHash4Size - 1); }
-
-/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */
-#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF;
-
-
-#define MT_HASH2_CALC \
- hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1);
-
-#define MT_HASH3_CALC { \
- UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
- hash2Value = temp & (kHash2Size - 1); \
- hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); }
-
-#define MT_HASH4_CALC { \
- UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
- hash2Value = temp & (kHash2Size - 1); \
- hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
- hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); }
-
-#endif
diff --git a/src/libs/7zip/win/C/Lzma2Dec.c b/src/libs/7zip/win/C/Lzma2Dec.c
deleted file mode 100644
index e7dcc2725..000000000
--- a/src/libs/7zip/win/C/Lzma2Dec.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/* Lzma2Dec.c -- LZMA2 Decoder
-2010-12-15 : Igor Pavlov : Public domain */
-
-/* #define SHOW_DEBUG_INFO */
-
-#include "Precomp.h"
-
-#ifdef SHOW_DEBUG_INFO
-#include <stdio.h>
-#endif
-
-#include <string.h>
-
-#include "Lzma2Dec.h"
-
-/*
-00000000 - EOS
-00000001 U U - Uncompressed Reset Dic
-00000010 U U - Uncompressed No Reset
-100uuuuu U U P P - LZMA no reset
-101uuuuu U U P P - LZMA reset state
-110uuuuu U U P P S - LZMA reset state + new prop
-111uuuuu U U P P S - LZMA reset state + new prop + reset dic
-
- u, U - Unpack Size
- P - Pack Size
- S - Props
-*/
-
-#define LZMA2_CONTROL_LZMA (1 << 7)
-#define LZMA2_CONTROL_COPY_NO_RESET 2
-#define LZMA2_CONTROL_COPY_RESET_DIC 1
-#define LZMA2_CONTROL_EOF 0
-
-#define LZMA2_IS_UNCOMPRESSED_STATE(p) (((p)->control & LZMA2_CONTROL_LZMA) == 0)
-
-#define LZMA2_GET_LZMA_MODE(p) (((p)->control >> 5) & 3)
-#define LZMA2_IS_THERE_PROP(mode) ((mode) >= 2)
-
-#define LZMA2_LCLP_MAX 4
-#define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11))
-
-#ifdef SHOW_DEBUG_INFO
-#define PRF(x) x
-#else
-#define PRF(x)
-#endif
-
-typedef enum
-{
- LZMA2_STATE_CONTROL,
- LZMA2_STATE_UNPACK0,
- LZMA2_STATE_UNPACK1,
- LZMA2_STATE_PACK0,
- LZMA2_STATE_PACK1,
- LZMA2_STATE_PROP,
- LZMA2_STATE_DATA,
- LZMA2_STATE_DATA_CONT,
- LZMA2_STATE_FINISHED,
- LZMA2_STATE_ERROR
-} ELzma2State;
-
-static SRes Lzma2Dec_GetOldProps(Byte prop, Byte *props)
-{
- UInt32 dicSize;
- if (prop > 40)
- return SZ_ERROR_UNSUPPORTED;
- dicSize = (prop == 40) ? 0xFFFFFFFF : LZMA2_DIC_SIZE_FROM_PROP(prop);
- props[0] = (Byte)LZMA2_LCLP_MAX;
- props[1] = (Byte)(dicSize);
- props[2] = (Byte)(dicSize >> 8);
- props[3] = (Byte)(dicSize >> 16);
- props[4] = (Byte)(dicSize >> 24);
- return SZ_OK;
-}
-
-SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc)
-{
- Byte props[LZMA_PROPS_SIZE];
- RINOK(Lzma2Dec_GetOldProps(prop, props));
- return LzmaDec_AllocateProbs(&p->decoder, props, LZMA_PROPS_SIZE, alloc);
-}
-
-SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc)
-{
- Byte props[LZMA_PROPS_SIZE];
- RINOK(Lzma2Dec_GetOldProps(prop, props));
- return LzmaDec_Allocate(&p->decoder, props, LZMA_PROPS_SIZE, alloc);
-}
-
-void Lzma2Dec_Init(CLzma2Dec *p)
-{
- p->state = LZMA2_STATE_CONTROL;
- p->needInitDic = True;
- p->needInitState = True;
- p->needInitProp = True;
- LzmaDec_Init(&p->decoder);
-}
-
-static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b)
-{
- switch(p->state)
- {
- case LZMA2_STATE_CONTROL:
- p->control = b;
- PRF(printf("\n %4X ", p->decoder.dicPos));
- PRF(printf(" %2X", b));
- if (p->control == 0)
- return LZMA2_STATE_FINISHED;
- if (LZMA2_IS_UNCOMPRESSED_STATE(p))
- {
- if ((p->control & 0x7F) > 2)
- return LZMA2_STATE_ERROR;
- p->unpackSize = 0;
- }
- else
- p->unpackSize = (UInt32)(p->control & 0x1F) << 16;
- return LZMA2_STATE_UNPACK0;
-
- case LZMA2_STATE_UNPACK0:
- p->unpackSize |= (UInt32)b << 8;
- return LZMA2_STATE_UNPACK1;
-
- case LZMA2_STATE_UNPACK1:
- p->unpackSize |= (UInt32)b;
- p->unpackSize++;
- PRF(printf(" %8d", p->unpackSize));
- return (LZMA2_IS_UNCOMPRESSED_STATE(p)) ? LZMA2_STATE_DATA : LZMA2_STATE_PACK0;
-
- case LZMA2_STATE_PACK0:
- p->packSize = (UInt32)b << 8;
- return LZMA2_STATE_PACK1;
-
- case LZMA2_STATE_PACK1:
- p->packSize |= (UInt32)b;
- p->packSize++;
- PRF(printf(" %8d", p->packSize));
- return LZMA2_IS_THERE_PROP(LZMA2_GET_LZMA_MODE(p)) ? LZMA2_STATE_PROP:
- (p->needInitProp ? LZMA2_STATE_ERROR : LZMA2_STATE_DATA);
-
- case LZMA2_STATE_PROP:
- {
- int lc, lp;
- if (b >= (9 * 5 * 5))
- return LZMA2_STATE_ERROR;
- lc = b % 9;
- b /= 9;
- p->decoder.prop.pb = b / 5;
- lp = b % 5;
- if (lc + lp > LZMA2_LCLP_MAX)
- return LZMA2_STATE_ERROR;
- p->decoder.prop.lc = lc;
- p->decoder.prop.lp = lp;
- p->needInitProp = False;
- return LZMA2_STATE_DATA;
- }
- }
- return LZMA2_STATE_ERROR;
-}
-
-static void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT size)
-{
- memcpy(p->dic + p->dicPos, src, size);
- p->dicPos += size;
- if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= size)
- p->checkDicSize = p->prop.dicSize;
- p->processedPos += (UInt32)size;
-}
-
-void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState);
-
-SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit,
- const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
-{
- SizeT inSize = *srcLen;
- *srcLen = 0;
- *status = LZMA_STATUS_NOT_SPECIFIED;
-
- while (p->state != LZMA2_STATE_FINISHED)
- {
- SizeT dicPos = p->decoder.dicPos;
- if (p->state == LZMA2_STATE_ERROR)
- return SZ_ERROR_DATA;
- if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY)
- {
- *status = LZMA_STATUS_NOT_FINISHED;
- return SZ_OK;
- }
- if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT)
- {
- if (*srcLen == inSize)
- {
- *status = LZMA_STATUS_NEEDS_MORE_INPUT;
- return SZ_OK;
- }
- (*srcLen)++;
- p->state = Lzma2Dec_UpdateState(p, *src++);
- continue;
- }
- {
- SizeT destSizeCur = dicLimit - dicPos;
- SizeT srcSizeCur = inSize - *srcLen;
- ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY;
-
- if (p->unpackSize <= destSizeCur)
- {
- destSizeCur = (SizeT)p->unpackSize;
- curFinishMode = LZMA_FINISH_END;
- }
-
- if (LZMA2_IS_UNCOMPRESSED_STATE(p))
- {
- if (*srcLen == inSize)
- {
- *status = LZMA_STATUS_NEEDS_MORE_INPUT;
- return SZ_OK;
- }
-
- if (p->state == LZMA2_STATE_DATA)
- {
- Bool initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC);
- if (initDic)
- p->needInitProp = p->needInitState = True;
- else if (p->needInitDic)
- return SZ_ERROR_DATA;
- p->needInitDic = False;
- LzmaDec_InitDicAndState(&p->decoder, initDic, False);
- }
-
- if (srcSizeCur > destSizeCur)
- srcSizeCur = destSizeCur;
-
- if (srcSizeCur == 0)
- return SZ_ERROR_DATA;
-
- LzmaDec_UpdateWithUncompressed(&p->decoder, src, srcSizeCur);
-
- src += srcSizeCur;
- *srcLen += srcSizeCur;
- p->unpackSize -= (UInt32)srcSizeCur;
- p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT;
- }
- else
- {
- SizeT outSizeProcessed;
- SRes res;
-
- if (p->state == LZMA2_STATE_DATA)
- {
- int mode = LZMA2_GET_LZMA_MODE(p);
- Bool initDic = (mode == 3);
- Bool initState = (mode > 0);
- if ((!initDic && p->needInitDic) || (!initState && p->needInitState))
- return SZ_ERROR_DATA;
-
- LzmaDec_InitDicAndState(&p->decoder, initDic, initState);
- p->needInitDic = False;
- p->needInitState = False;
- p->state = LZMA2_STATE_DATA_CONT;
- }
- if (srcSizeCur > p->packSize)
- srcSizeCur = (SizeT)p->packSize;
-
- res = LzmaDec_DecodeToDic(&p->decoder, dicPos + destSizeCur, src, &srcSizeCur, curFinishMode, status);
-
- src += srcSizeCur;
- *srcLen += srcSizeCur;
- p->packSize -= (UInt32)srcSizeCur;
-
- outSizeProcessed = p->decoder.dicPos - dicPos;
- p->unpackSize -= (UInt32)outSizeProcessed;
-
- RINOK(res);
- if (*status == LZMA_STATUS_NEEDS_MORE_INPUT)
- return res;
-
- if (srcSizeCur == 0 && outSizeProcessed == 0)
- {
- if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK ||
- p->unpackSize != 0 || p->packSize != 0)
- return SZ_ERROR_DATA;
- p->state = LZMA2_STATE_CONTROL;
- }
- if (*status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK)
- *status = LZMA_STATUS_NOT_FINISHED;
- }
- }
- }
- *status = LZMA_STATUS_FINISHED_WITH_MARK;
- return SZ_OK;
-}
-
-SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
-{
- SizeT outSize = *destLen, inSize = *srcLen;
- *srcLen = *destLen = 0;
- for (;;)
- {
- SizeT srcSizeCur = inSize, outSizeCur, dicPos;
- ELzmaFinishMode curFinishMode;
- SRes res;
- if (p->decoder.dicPos == p->decoder.dicBufSize)
- p->decoder.dicPos = 0;
- dicPos = p->decoder.dicPos;
- if (outSize > p->decoder.dicBufSize - dicPos)
- {
- outSizeCur = p->decoder.dicBufSize;
- curFinishMode = LZMA_FINISH_ANY;
- }
- else
- {
- outSizeCur = dicPos + outSize;
- curFinishMode = finishMode;
- }
-
- res = Lzma2Dec_DecodeToDic(p, outSizeCur, src, &srcSizeCur, curFinishMode, status);
- src += srcSizeCur;
- inSize -= srcSizeCur;
- *srcLen += srcSizeCur;
- outSizeCur = p->decoder.dicPos - dicPos;
- memcpy(dest, p->decoder.dic + dicPos, outSizeCur);
- dest += outSizeCur;
- outSize -= outSizeCur;
- *destLen += outSizeCur;
- if (res != 0)
- return res;
- if (outSizeCur == 0 || outSize == 0)
- return SZ_OK;
- }
-}
-
-SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
- Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc)
-{
- CLzma2Dec p;
- SRes res;
- SizeT outSize = *destLen, inSize = *srcLen;
- *destLen = *srcLen = 0;
- *status = LZMA_STATUS_NOT_SPECIFIED;
- Lzma2Dec_Construct(&p);
- RINOK(Lzma2Dec_AllocateProbs(&p, prop, alloc));
- p.decoder.dic = dest;
- p.decoder.dicBufSize = outSize;
- Lzma2Dec_Init(&p);
- *srcLen = inSize;
- res = Lzma2Dec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);
- *destLen = p.decoder.dicPos;
- if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)
- res = SZ_ERROR_INPUT_EOF;
- Lzma2Dec_FreeProbs(&p, alloc);
- return res;
-}
diff --git a/src/libs/7zip/win/C/Lzma2Dec.h b/src/libs/7zip/win/C/Lzma2Dec.h
deleted file mode 100644
index 367daf6b3..000000000
--- a/src/libs/7zip/win/C/Lzma2Dec.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* Lzma2Dec.h -- LZMA2 Decoder
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __LZMA2_DEC_H
-#define __LZMA2_DEC_H
-
-#include "LzmaDec.h"
-
-EXTERN_C_BEGIN
-
-/* ---------- State Interface ---------- */
-
-typedef struct
-{
- CLzmaDec decoder;
- UInt32 packSize;
- UInt32 unpackSize;
- int state;
- Byte control;
- Bool needInitDic;
- Bool needInitState;
- Bool needInitProp;
-} CLzma2Dec;
-
-#define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder)
-#define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc);
-#define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc);
-
-SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc);
-SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc);
-void Lzma2Dec_Init(CLzma2Dec *p);
-
-
-/*
-finishMode:
- It has meaning only if the decoding reaches output limit (*destLen or dicLimit).
- LZMA_FINISH_ANY - use smallest number of input bytes
- LZMA_FINISH_END - read EndOfStream marker after decoding
-
-Returns:
- SZ_OK
- status:
- LZMA_STATUS_FINISHED_WITH_MARK
- LZMA_STATUS_NOT_FINISHED
- LZMA_STATUS_NEEDS_MORE_INPUT
- SZ_ERROR_DATA - Data error
-*/
-
-SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit,
- const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
-
-SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen,
- const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
-
-
-/* ---------- One Call Interface ---------- */
-
-/*
-finishMode:
- It has meaning only if the decoding reaches output limit (*destLen).
- LZMA_FINISH_ANY - use smallest number of input bytes
- LZMA_FINISH_END - read EndOfStream marker after decoding
-
-Returns:
- SZ_OK
- status:
- LZMA_STATUS_FINISHED_WITH_MARK
- LZMA_STATUS_NOT_FINISHED
- SZ_ERROR_DATA - Data error
- SZ_ERROR_MEM - Memory allocation error
- SZ_ERROR_UNSUPPORTED - Unsupported properties
- SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
-*/
-
-SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
- Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/Lzma2Enc.c b/src/libs/7zip/win/C/Lzma2Enc.c
deleted file mode 100644
index 5d67cc344..000000000
--- a/src/libs/7zip/win/C/Lzma2Enc.c
+++ /dev/null
@@ -1,493 +0,0 @@
-/* Lzma2Enc.c -- LZMA2 Encoder
-2012-06-19 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-/* #include <stdio.h> */
-#include <string.h>
-
-/* #define _7ZIP_ST */
-
-#include "Lzma2Enc.h"
-
-#ifndef _7ZIP_ST
-#include "MtCoder.h"
-#else
-#define NUM_MT_CODER_THREADS_MAX 1
-#endif
-
-#define LZMA2_CONTROL_LZMA (1 << 7)
-#define LZMA2_CONTROL_COPY_NO_RESET 2
-#define LZMA2_CONTROL_COPY_RESET_DIC 1
-#define LZMA2_CONTROL_EOF 0
-
-#define LZMA2_LCLP_MAX 4
-
-#define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11))
-
-#define LZMA2_PACK_SIZE_MAX (1 << 16)
-#define LZMA2_COPY_CHUNK_SIZE LZMA2_PACK_SIZE_MAX
-#define LZMA2_UNPACK_SIZE_MAX (1 << 21)
-#define LZMA2_KEEP_WINDOW_SIZE LZMA2_UNPACK_SIZE_MAX
-
-#define LZMA2_CHUNK_SIZE_COMPRESSED_MAX ((1 << 16) + 16)
-
-
-#define PRF(x) /* x */
-
-/* ---------- CLzma2EncInt ---------- */
-
-typedef struct
-{
- CLzmaEncHandle enc;
- UInt64 srcPos;
- Byte props;
- Bool needInitState;
- Bool needInitProp;
-} CLzma2EncInt;
-
-static SRes Lzma2EncInt_Init(CLzma2EncInt *p, const CLzma2EncProps *props)
-{
- Byte propsEncoded[LZMA_PROPS_SIZE];
- SizeT propsSize = LZMA_PROPS_SIZE;
- RINOK(LzmaEnc_SetProps(p->enc, &props->lzmaProps));
- RINOK(LzmaEnc_WriteProperties(p->enc, propsEncoded, &propsSize));
- p->srcPos = 0;
- p->props = propsEncoded[0];
- p->needInitState = True;
- p->needInitProp = True;
- return SZ_OK;
-}
-
-SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, ISeqInStream *inStream, UInt32 keepWindowSize,
- ISzAlloc *alloc, ISzAlloc *allocBig);
-SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
- UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig);
-SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
- Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize);
-const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp);
-void LzmaEnc_Finish(CLzmaEncHandle pp);
-void LzmaEnc_SaveState(CLzmaEncHandle pp);
-void LzmaEnc_RestoreState(CLzmaEncHandle pp);
-
-
-static SRes Lzma2EncInt_EncodeSubblock(CLzma2EncInt *p, Byte *outBuf,
- size_t *packSizeRes, ISeqOutStream *outStream)
-{
- size_t packSizeLimit = *packSizeRes;
- size_t packSize = packSizeLimit;
- UInt32 unpackSize = LZMA2_UNPACK_SIZE_MAX;
- unsigned lzHeaderSize = 5 + (p->needInitProp ? 1 : 0);
- Bool useCopyBlock;
- SRes res;
-
- *packSizeRes = 0;
- if (packSize < lzHeaderSize)
- return SZ_ERROR_OUTPUT_EOF;
- packSize -= lzHeaderSize;
-
- LzmaEnc_SaveState(p->enc);
- res = LzmaEnc_CodeOneMemBlock(p->enc, p->needInitState,
- outBuf + lzHeaderSize, &packSize, LZMA2_PACK_SIZE_MAX, &unpackSize);
-
- PRF(printf("\npackSize = %7d unpackSize = %7d ", packSize, unpackSize));
-
- if (unpackSize == 0)
- return res;
-
- if (res == SZ_OK)
- useCopyBlock = (packSize + 2 >= unpackSize || packSize > (1 << 16));
- else
- {
- if (res != SZ_ERROR_OUTPUT_EOF)
- return res;
- res = SZ_OK;
- useCopyBlock = True;
- }
-
- if (useCopyBlock)
- {
- size_t destPos = 0;
- PRF(printf("################# COPY "));
- while (unpackSize > 0)
- {
- UInt32 u = (unpackSize < LZMA2_COPY_CHUNK_SIZE) ? unpackSize : LZMA2_COPY_CHUNK_SIZE;
- if (packSizeLimit - destPos < u + 3)
- return SZ_ERROR_OUTPUT_EOF;
- outBuf[destPos++] = (Byte)(p->srcPos == 0 ? LZMA2_CONTROL_COPY_RESET_DIC : LZMA2_CONTROL_COPY_NO_RESET);
- outBuf[destPos++] = (Byte)((u - 1) >> 8);
- outBuf[destPos++] = (Byte)(u - 1);
- memcpy(outBuf + destPos, LzmaEnc_GetCurBuf(p->enc) - unpackSize, u);
- unpackSize -= u;
- destPos += u;
- p->srcPos += u;
- if (outStream)
- {
- *packSizeRes += destPos;
- if (outStream->Write(outStream, outBuf, destPos) != destPos)
- return SZ_ERROR_WRITE;
- destPos = 0;
- }
- else
- *packSizeRes = destPos;
- /* needInitState = True; */
- }
- LzmaEnc_RestoreState(p->enc);
- return SZ_OK;
- }
- {
- size_t destPos = 0;
- UInt32 u = unpackSize - 1;
- UInt32 pm = (UInt32)(packSize - 1);
- unsigned mode = (p->srcPos == 0) ? 3 : (p->needInitState ? (p->needInitProp ? 2 : 1) : 0);
-
- PRF(printf(" "));
-
- outBuf[destPos++] = (Byte)(LZMA2_CONTROL_LZMA | (mode << 5) | ((u >> 16) & 0x1F));
- outBuf[destPos++] = (Byte)(u >> 8);
- outBuf[destPos++] = (Byte)u;
- outBuf[destPos++] = (Byte)(pm >> 8);
- outBuf[destPos++] = (Byte)pm;
-
- if (p->needInitProp)
- outBuf[destPos++] = p->props;
-
- p->needInitProp = False;
- p->needInitState = False;
- destPos += packSize;
- p->srcPos += unpackSize;
-
- if (outStream)
- if (outStream->Write(outStream, outBuf, destPos) != destPos)
- return SZ_ERROR_WRITE;
- *packSizeRes = destPos;
- return SZ_OK;
- }
-}
-
-/* ---------- Lzma2 Props ---------- */
-
-void Lzma2EncProps_Init(CLzma2EncProps *p)
-{
- LzmaEncProps_Init(&p->lzmaProps);
- p->numTotalThreads = -1;
- p->numBlockThreads = -1;
- p->blockSize = 0;
-}
-
-void Lzma2EncProps_Normalize(CLzma2EncProps *p)
-{
- int t1, t1n, t2, t3;
- {
- CLzmaEncProps lzmaProps = p->lzmaProps;
- LzmaEncProps_Normalize(&lzmaProps);
- t1n = lzmaProps.numThreads;
- }
-
- t1 = p->lzmaProps.numThreads;
- t2 = p->numBlockThreads;
- t3 = p->numTotalThreads;
-
- if (t2 > NUM_MT_CODER_THREADS_MAX)
- t2 = NUM_MT_CODER_THREADS_MAX;
-
- if (t3 <= 0)
- {
- if (t2 <= 0)
- t2 = 1;
- t3 = t1n * t2;
- }
- else if (t2 <= 0)
- {
- t2 = t3 / t1n;
- if (t2 == 0)
- {
- t1 = 1;
- t2 = t3;
- }
- if (t2 > NUM_MT_CODER_THREADS_MAX)
- t2 = NUM_MT_CODER_THREADS_MAX;
- }
- else if (t1 <= 0)
- {
- t1 = t3 / t2;
- if (t1 == 0)
- t1 = 1;
- }
- else
- t3 = t1n * t2;
-
- p->lzmaProps.numThreads = t1;
-
- LzmaEncProps_Normalize(&p->lzmaProps);
-
- if (p->blockSize == 0)
- {
- UInt32 dictSize = p->lzmaProps.dictSize;
- UInt64 blockSize = (UInt64)dictSize << 2;
- const UInt32 kMinSize = (UInt32)1 << 20;
- const UInt32 kMaxSize = (UInt32)1 << 28;
- if (blockSize < kMinSize) blockSize = kMinSize;
- if (blockSize > kMaxSize) blockSize = kMaxSize;
- if (blockSize < dictSize) blockSize = dictSize;
- p->blockSize = (size_t)blockSize;
- }
- if (t2 > 1)
- {
- UInt64 temp = p->lzmaProps.reduceSize + p->blockSize - 1;
- if (temp > p->lzmaProps.reduceSize)
- {
- UInt64 numBlocks = temp / p->blockSize;
- if (numBlocks < t2)
- {
- t2 = (UInt32)numBlocks;
- t3 = t1 * t2;
- }
- }
- }
- p->numBlockThreads = t2;
- p->numTotalThreads = t3;
-}
-
-static SRes Progress(ICompressProgress *p, UInt64 inSize, UInt64 outSize)
-{
- return (p && p->Progress(p, inSize, outSize) != SZ_OK) ? SZ_ERROR_PROGRESS : SZ_OK;
-}
-
-/* ---------- Lzma2 ---------- */
-
-typedef struct
-{
- Byte propEncoded;
- CLzma2EncProps props;
-
- Byte *outBuf;
-
- ISzAlloc *alloc;
- ISzAlloc *allocBig;
-
- CLzma2EncInt coders[NUM_MT_CODER_THREADS_MAX];
-
- #ifndef _7ZIP_ST
- CMtCoder mtCoder;
- #endif
-
-} CLzma2Enc;
-
-
-/* ---------- Lzma2EncThread ---------- */
-
-static SRes Lzma2Enc_EncodeMt1(CLzma2EncInt *p, CLzma2Enc *mainEncoder,
- ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress)
-{
- UInt64 packTotal = 0;
- SRes res = SZ_OK;
-
- if (mainEncoder->outBuf == 0)
- {
- mainEncoder->outBuf = (Byte *)IAlloc_Alloc(mainEncoder->alloc, LZMA2_CHUNK_SIZE_COMPRESSED_MAX);
- if (mainEncoder->outBuf == 0)
- return SZ_ERROR_MEM;
- }
- RINOK(Lzma2EncInt_Init(p, &mainEncoder->props));
- RINOK(LzmaEnc_PrepareForLzma2(p->enc, inStream, LZMA2_KEEP_WINDOW_SIZE,
- mainEncoder->alloc, mainEncoder->allocBig));
- for (;;)
- {
- size_t packSize = LZMA2_CHUNK_SIZE_COMPRESSED_MAX;
- res = Lzma2EncInt_EncodeSubblock(p, mainEncoder->outBuf, &packSize, outStream);
- if (res != SZ_OK)
- break;
- packTotal += packSize;
- res = Progress(progress, p->srcPos, packTotal);
- if (res != SZ_OK)
- break;
- if (packSize == 0)
- break;
- }
- LzmaEnc_Finish(p->enc);
- if (res == SZ_OK)
- {
- Byte b = 0;
- if (outStream->Write(outStream, &b, 1) != 1)
- return SZ_ERROR_WRITE;
- }
- return res;
-}
-
-#ifndef _7ZIP_ST
-
-typedef struct
-{
- IMtCoderCallback funcTable;
- CLzma2Enc *lzma2Enc;
-} CMtCallbackImp;
-
-static SRes MtCallbackImp_Code(void *pp, unsigned index, Byte *dest, size_t *destSize,
- const Byte *src, size_t srcSize, int finished)
-{
- CMtCallbackImp *imp = (CMtCallbackImp *)pp;
- CLzma2Enc *mainEncoder = imp->lzma2Enc;
- CLzma2EncInt *p = &mainEncoder->coders[index];
-
- SRes res = SZ_OK;
- {
- size_t destLim = *destSize;
- *destSize = 0;
-
- if (srcSize != 0)
- {
- RINOK(Lzma2EncInt_Init(p, &mainEncoder->props));
-
- RINOK(LzmaEnc_MemPrepare(p->enc, src, srcSize, LZMA2_KEEP_WINDOW_SIZE,
- mainEncoder->alloc, mainEncoder->allocBig));
-
- while (p->srcPos < srcSize)
- {
- size_t packSize = destLim - *destSize;
- res = Lzma2EncInt_EncodeSubblock(p, dest + *destSize, &packSize, NULL);
- if (res != SZ_OK)
- break;
- *destSize += packSize;
-
- if (packSize == 0)
- {
- res = SZ_ERROR_FAIL;
- break;
- }
-
- if (MtProgress_Set(&mainEncoder->mtCoder.mtProgress, index, p->srcPos, *destSize) != SZ_OK)
- {
- res = SZ_ERROR_PROGRESS;
- break;
- }
- }
- LzmaEnc_Finish(p->enc);
- if (res != SZ_OK)
- return res;
- }
- if (finished)
- {
- if (*destSize == destLim)
- return SZ_ERROR_OUTPUT_EOF;
- dest[(*destSize)++] = 0;
- }
- }
- return res;
-}
-
-#endif
-
-/* ---------- Lzma2Enc ---------- */
-
-CLzma2EncHandle Lzma2Enc_Create(ISzAlloc *alloc, ISzAlloc *allocBig)
-{
- CLzma2Enc *p = (CLzma2Enc *)alloc->Alloc(alloc, sizeof(CLzma2Enc));
- if (p == 0)
- return NULL;
- Lzma2EncProps_Init(&p->props);
- Lzma2EncProps_Normalize(&p->props);
- p->outBuf = 0;
- p->alloc = alloc;
- p->allocBig = allocBig;
- {
- unsigned i;
- for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++)
- p->coders[i].enc = 0;
- }
- #ifndef _7ZIP_ST
- MtCoder_Construct(&p->mtCoder);
- #endif
-
- return p;
-}
-
-void Lzma2Enc_Destroy(CLzma2EncHandle pp)
-{
- CLzma2Enc *p = (CLzma2Enc *)pp;
- unsigned i;
- for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++)
- {
- CLzma2EncInt *t = &p->coders[i];
- if (t->enc)
- {
- LzmaEnc_Destroy(t->enc, p->alloc, p->allocBig);
- t->enc = 0;
- }
- }
-
- #ifndef _7ZIP_ST
- MtCoder_Destruct(&p->mtCoder);
- #endif
-
- IAlloc_Free(p->alloc, p->outBuf);
- IAlloc_Free(p->alloc, pp);
-}
-
-SRes Lzma2Enc_SetProps(CLzma2EncHandle pp, const CLzma2EncProps *props)
-{
- CLzma2Enc *p = (CLzma2Enc *)pp;
- CLzmaEncProps lzmaProps = props->lzmaProps;
- LzmaEncProps_Normalize(&lzmaProps);
- if (lzmaProps.lc + lzmaProps.lp > LZMA2_LCLP_MAX)
- return SZ_ERROR_PARAM;
- p->props = *props;
- Lzma2EncProps_Normalize(&p->props);
- return SZ_OK;
-}
-
-Byte Lzma2Enc_WriteProperties(CLzma2EncHandle pp)
-{
- CLzma2Enc *p = (CLzma2Enc *)pp;
- unsigned i;
- UInt32 dicSize = LzmaEncProps_GetDictSize(&p->props.lzmaProps);
- for (i = 0; i < 40; i++)
- if (dicSize <= LZMA2_DIC_SIZE_FROM_PROP(i))
- break;
- return (Byte)i;
-}
-
-SRes Lzma2Enc_Encode(CLzma2EncHandle pp,
- ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress)
-{
- CLzma2Enc *p = (CLzma2Enc *)pp;
- int i;
-
- for (i = 0; i < p->props.numBlockThreads; i++)
- {
- CLzma2EncInt *t = &p->coders[i];
- if (t->enc == NULL)
- {
- t->enc = LzmaEnc_Create(p->alloc);
- if (t->enc == NULL)
- return SZ_ERROR_MEM;
- }
- }
-
- #ifndef _7ZIP_ST
- if (p->props.numBlockThreads <= 1)
- #endif
- return Lzma2Enc_EncodeMt1(&p->coders[0], p, outStream, inStream, progress);
-
- #ifndef _7ZIP_ST
-
- {
- CMtCallbackImp mtCallback;
-
- mtCallback.funcTable.Code = MtCallbackImp_Code;
- mtCallback.lzma2Enc = p;
-
- p->mtCoder.progress = progress;
- p->mtCoder.inStream = inStream;
- p->mtCoder.outStream = outStream;
- p->mtCoder.alloc = p->alloc;
- p->mtCoder.mtCallback = &mtCallback.funcTable;
-
- p->mtCoder.blockSize = p->props.blockSize;
- p->mtCoder.destBlockSize = p->props.blockSize + (p->props.blockSize >> 10) + 16;
- p->mtCoder.numThreads = p->props.numBlockThreads;
-
- return MtCoder_Code(&p->mtCoder);
- }
- #endif
-}
diff --git a/src/libs/7zip/win/C/Lzma2Enc.h b/src/libs/7zip/win/C/Lzma2Enc.h
deleted file mode 100644
index f409f184c..000000000
--- a/src/libs/7zip/win/C/Lzma2Enc.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Lzma2Enc.h -- LZMA2 Encoder
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __LZMA2_ENC_H
-#define __LZMA2_ENC_H
-
-#include "LzmaEnc.h"
-
-EXTERN_C_BEGIN
-
-typedef struct
-{
- CLzmaEncProps lzmaProps;
- size_t blockSize;
- int numBlockThreads;
- int numTotalThreads;
-} CLzma2EncProps;
-
-void Lzma2EncProps_Init(CLzma2EncProps *p);
-void Lzma2EncProps_Normalize(CLzma2EncProps *p);
-
-/* ---------- CLzmaEnc2Handle Interface ---------- */
-
-/* Lzma2Enc_* functions can return the following exit codes:
-Returns:
- SZ_OK - OK
- SZ_ERROR_MEM - Memory allocation error
- SZ_ERROR_PARAM - Incorrect paramater in props
- SZ_ERROR_WRITE - Write callback error
- SZ_ERROR_PROGRESS - some break from progress callback
- SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
-*/
-
-typedef void * CLzma2EncHandle;
-
-CLzma2EncHandle Lzma2Enc_Create(ISzAlloc *alloc, ISzAlloc *allocBig);
-void Lzma2Enc_Destroy(CLzma2EncHandle p);
-SRes Lzma2Enc_SetProps(CLzma2EncHandle p, const CLzma2EncProps *props);
-Byte Lzma2Enc_WriteProperties(CLzma2EncHandle p);
-SRes Lzma2Enc_Encode(CLzma2EncHandle p,
- ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress);
-
-/* ---------- One Call Interface ---------- */
-
-/* Lzma2Encode
-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)
-*/
-
-/*
-SRes Lzma2Encode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
- const CLzmaEncProps *props, Byte *propsEncoded, int writeEndMark,
- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
-*/
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/LzmaDec.c b/src/libs/7zip/win/C/LzmaDec.c
deleted file mode 100644
index b1a2ad150..000000000
--- a/src/libs/7zip/win/C/LzmaDec.c
+++ /dev/null
@@ -1,1025 +0,0 @@
-/* LzmaDec.c -- LZMA Decoder
-2015-01-01 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "LzmaDec.h"
-
-#include <string.h>
-
-#define kNumTopBits 24
-#define kTopValue ((UInt32)1 << kNumTopBits)
-
-#define kNumBitModelTotalBits 11
-#define kBitModelTotal (1 << kNumBitModelTotalBits)
-#define kNumMoveBits 5
-
-#define RC_INIT_SIZE 5
-
-#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
-
-#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
-#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
-#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));
-#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \
- { UPDATE_0(p); i = (i + i); A0; } else \
- { UPDATE_1(p); i = (i + i) + 1; A1; }
-#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)
-
-#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }
-#define TREE_DECODE(probs, limit, i) \
- { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
-
-/* #define _LZMA_SIZE_OPT */
-
-#ifdef _LZMA_SIZE_OPT
-#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
-#else
-#define TREE_6_DECODE(probs, i) \
- { i = 1; \
- TREE_GET_BIT(probs, i); \
- TREE_GET_BIT(probs, i); \
- TREE_GET_BIT(probs, i); \
- TREE_GET_BIT(probs, i); \
- TREE_GET_BIT(probs, i); \
- TREE_GET_BIT(probs, i); \
- i -= 0x40; }
-#endif
-
-#define NORMAL_LITER_DEC GET_BIT(prob + symbol, symbol)
-#define MATCHED_LITER_DEC \
- matchByte <<= 1; \
- bit = (matchByte & offs); \
- probLit = prob + offs + bit + symbol; \
- GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)
-
-#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
-
-#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
-#define UPDATE_0_CHECK range = bound;
-#define UPDATE_1_CHECK range -= bound; code -= bound;
-#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \
- { UPDATE_0_CHECK; i = (i + i); A0; } else \
- { UPDATE_1_CHECK; i = (i + i) + 1; A1; }
-#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
-#define TREE_DECODE_CHECK(probs, limit, i) \
- { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
-
-
-#define kNumPosBitsMax 4
-#define kNumPosStatesMax (1 << kNumPosBitsMax)
-
-#define kLenNumLowBits 3
-#define kLenNumLowSymbols (1 << kLenNumLowBits)
-#define kLenNumMidBits 3
-#define kLenNumMidSymbols (1 << kLenNumMidBits)
-#define kLenNumHighBits 8
-#define kLenNumHighSymbols (1 << kLenNumHighBits)
-
-#define LenChoice 0
-#define LenChoice2 (LenChoice + 1)
-#define LenLow (LenChoice2 + 1)
-#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
-#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
-#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
-
-
-#define kNumStates 12
-#define kNumLitStates 7
-
-#define kStartPosModelIndex 4
-#define kEndPosModelIndex 14
-#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
-
-#define kNumPosSlotBits 6
-#define kNumLenToPosStates 4
-
-#define kNumAlignBits 4
-#define kAlignTableSize (1 << kNumAlignBits)
-
-#define kMatchMinLen 2
-#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
-
-#define IsMatch 0
-#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
-#define IsRepG0 (IsRep + kNumStates)
-#define IsRepG1 (IsRepG0 + kNumStates)
-#define IsRepG2 (IsRepG1 + kNumStates)
-#define IsRep0Long (IsRepG2 + kNumStates)
-#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
-#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
-#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
-#define LenCoder (Align + kAlignTableSize)
-#define RepLenCoder (LenCoder + kNumLenProbs)
-#define Literal (RepLenCoder + kNumLenProbs)
-
-#define LZMA_BASE_SIZE 1846
-#define LZMA_LIT_SIZE 768
-
-#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
-
-#if Literal != LZMA_BASE_SIZE
-StopCompilingDueBUG
-#endif
-
-#define LZMA_DIC_MIN (1 << 12)
-
-/* First LZMA-symbol is always decoded.
-And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization
-Out:
- Result:
- SZ_OK - OK
- SZ_ERROR_DATA - Error
- p->remainLen:
- < kMatchSpecLenStart : normal remain
- = kMatchSpecLenStart : finished
- = kMatchSpecLenStart + 1 : Flush marker
- = kMatchSpecLenStart + 2 : State Init Marker
-*/
-
-static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
-{
- CLzmaProb *probs = p->probs;
-
- unsigned state = p->state;
- UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];
- unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
- unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;
- unsigned lc = p->prop.lc;
-
- Byte *dic = p->dic;
- SizeT dicBufSize = p->dicBufSize;
- SizeT dicPos = p->dicPos;
-
- UInt32 processedPos = p->processedPos;
- UInt32 checkDicSize = p->checkDicSize;
- unsigned len = 0;
-
- const Byte *buf = p->buf;
- UInt32 range = p->range;
- UInt32 code = p->code;
-
- do
- {
- CLzmaProb *prob;
- UInt32 bound;
- unsigned ttt;
- unsigned posState = processedPos & pbMask;
-
- prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
- IF_BIT_0(prob)
- {
- unsigned symbol;
- UPDATE_0(prob);
- prob = probs + Literal;
- if (checkDicSize != 0 || processedPos != 0)
- prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +
- (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));
-
- if (state < kNumLitStates)
- {
- state -= (state < 4) ? state : 3;
- symbol = 1;
- #ifdef _LZMA_SIZE_OPT
- do { NORMAL_LITER_DEC } while (symbol < 0x100);
- #else
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- #endif
- }
- else
- {
- unsigned matchByte = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
- unsigned offs = 0x100;
- state -= (state < 10) ? 3 : 6;
- symbol = 1;
- #ifdef _LZMA_SIZE_OPT
- do
- {
- unsigned bit;
- CLzmaProb *probLit;
- MATCHED_LITER_DEC
- }
- while (symbol < 0x100);
- #else
- {
- unsigned bit;
- CLzmaProb *probLit;
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- }
- #endif
- }
- dic[dicPos++] = (Byte)symbol;
- processedPos++;
- continue;
- }
- else
- {
- UPDATE_1(prob);
- prob = probs + IsRep + state;
- IF_BIT_0(prob)
- {
- UPDATE_0(prob);
- state += kNumStates;
- prob = probs + LenCoder;
- }
- else
- {
- UPDATE_1(prob);
- if (checkDicSize == 0 && processedPos == 0)
- return SZ_ERROR_DATA;
- prob = probs + IsRepG0 + state;
- IF_BIT_0(prob)
- {
- UPDATE_0(prob);
- prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
- IF_BIT_0(prob)
- {
- UPDATE_0(prob);
- dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
- dicPos++;
- processedPos++;
- state = state < kNumLitStates ? 9 : 11;
- continue;
- }
- UPDATE_1(prob);
- }
- else
- {
- UInt32 distance;
- UPDATE_1(prob);
- prob = probs + IsRepG1 + state;
- IF_BIT_0(prob)
- {
- UPDATE_0(prob);
- distance = rep1;
- }
- else
- {
- UPDATE_1(prob);
- prob = probs + IsRepG2 + state;
- IF_BIT_0(prob)
- {
- UPDATE_0(prob);
- distance = rep2;
- }
- else
- {
- UPDATE_1(prob);
- distance = rep3;
- rep3 = rep2;
- }
- rep2 = rep1;
- }
- rep1 = rep0;
- rep0 = distance;
- }
- state = state < kNumLitStates ? 8 : 11;
- prob = probs + RepLenCoder;
- }
- {
- unsigned limit, offset;
- CLzmaProb *probLen = prob + LenChoice;
- IF_BIT_0(probLen)
- {
- UPDATE_0(probLen);
- probLen = prob + LenLow + (posState << kLenNumLowBits);
- offset = 0;
- limit = (1 << kLenNumLowBits);
- }
- else
- {
- UPDATE_1(probLen);
- probLen = prob + LenChoice2;
- IF_BIT_0(probLen)
- {
- UPDATE_0(probLen);
- probLen = prob + LenMid + (posState << kLenNumMidBits);
- offset = kLenNumLowSymbols;
- limit = (1 << kLenNumMidBits);
- }
- else
- {
- UPDATE_1(probLen);
- probLen = prob + LenHigh;
- offset = kLenNumLowSymbols + kLenNumMidSymbols;
- limit = (1 << kLenNumHighBits);
- }
- }
- TREE_DECODE(probLen, limit, len);
- len += offset;
- }
-
- if (state >= kNumStates)
- {
- UInt32 distance;
- prob = probs + PosSlot +
- ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
- TREE_6_DECODE(prob, distance);
- if (distance >= kStartPosModelIndex)
- {
- unsigned posSlot = (unsigned)distance;
- int numDirectBits = (int)(((distance >> 1) - 1));
- distance = (2 | (distance & 1));
- if (posSlot < kEndPosModelIndex)
- {
- distance <<= numDirectBits;
- prob = probs + SpecPos + distance - posSlot - 1;
- {
- UInt32 mask = 1;
- unsigned i = 1;
- do
- {
- GET_BIT2(prob + i, i, ; , distance |= mask);
- mask <<= 1;
- }
- while (--numDirectBits != 0);
- }
- }
- else
- {
- numDirectBits -= kNumAlignBits;
- do
- {
- NORMALIZE
- range >>= 1;
-
- {
- UInt32 t;
- code -= range;
- t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */
- distance = (distance << 1) + (t + 1);
- code += range & t;
- }
- /*
- distance <<= 1;
- if (code >= range)
- {
- code -= range;
- distance |= 1;
- }
- */
- }
- while (--numDirectBits != 0);
- prob = probs + Align;
- distance <<= kNumAlignBits;
- {
- unsigned i = 1;
- GET_BIT2(prob + i, i, ; , distance |= 1);
- GET_BIT2(prob + i, i, ; , distance |= 2);
- GET_BIT2(prob + i, i, ; , distance |= 4);
- GET_BIT2(prob + i, i, ; , distance |= 8);
- }
- if (distance == (UInt32)0xFFFFFFFF)
- {
- len += kMatchSpecLenStart;
- state -= kNumStates;
- break;
- }
- }
- }
- rep3 = rep2;
- rep2 = rep1;
- rep1 = rep0;
- rep0 = distance + 1;
- if (checkDicSize == 0)
- {
- if (distance >= processedPos)
- return SZ_ERROR_DATA;
- }
- else if (distance >= checkDicSize)
- return SZ_ERROR_DATA;
- state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
- }
-
- len += kMatchMinLen;
-
- if (limit == dicPos)
- return SZ_ERROR_DATA;
- {
- SizeT rem = limit - dicPos;
- unsigned curLen = ((rem < len) ? (unsigned)rem : len);
- SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);
-
- processedPos += curLen;
-
- len -= curLen;
- if (pos + curLen <= dicBufSize)
- {
- Byte *dest = dic + dicPos;
- ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
- const Byte *lim = dest + curLen;
- dicPos += curLen;
- do
- *(dest) = (Byte)*(dest + src);
- while (++dest != lim);
- }
- else
- {
- do
- {
- dic[dicPos++] = dic[pos];
- if (++pos == dicBufSize)
- pos = 0;
- }
- while (--curLen != 0);
- }
- }
- }
- }
- while (dicPos < limit && buf < bufLimit);
- NORMALIZE;
- p->buf = buf;
- p->range = range;
- p->code = code;
- p->remainLen = len;
- p->dicPos = dicPos;
- p->processedPos = processedPos;
- p->reps[0] = rep0;
- p->reps[1] = rep1;
- p->reps[2] = rep2;
- p->reps[3] = rep3;
- p->state = state;
-
- return SZ_OK;
-}
-
-static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)
-{
- if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)
- {
- Byte *dic = p->dic;
- SizeT dicPos = p->dicPos;
- SizeT dicBufSize = p->dicBufSize;
- unsigned len = p->remainLen;
- UInt32 rep0 = p->reps[0];
- if (limit - dicPos < len)
- len = (unsigned)(limit - dicPos);
-
- if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)
- p->checkDicSize = p->prop.dicSize;
-
- p->processedPos += len;
- p->remainLen -= len;
- while (len != 0)
- {
- len--;
- dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
- dicPos++;
- }
- p->dicPos = dicPos;
- }
-}
-
-static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
-{
- do
- {
- SizeT limit2 = limit;
- if (p->checkDicSize == 0)
- {
- UInt32 rem = p->prop.dicSize - p->processedPos;
- if (limit - p->dicPos > rem)
- limit2 = p->dicPos + rem;
- }
- RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));
- if (p->processedPos >= p->prop.dicSize)
- p->checkDicSize = p->prop.dicSize;
- LzmaDec_WriteRem(p, limit);
- }
- while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);
-
- if (p->remainLen > kMatchSpecLenStart)
- {
- p->remainLen = kMatchSpecLenStart;
- }
- return 0;
-}
-
-typedef enum
-{
- DUMMY_ERROR, /* unexpected end of input stream */
- DUMMY_LIT,
- DUMMY_MATCH,
- DUMMY_REP
-} ELzmaDummy;
-
-static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)
-{
- UInt32 range = p->range;
- UInt32 code = p->code;
- const Byte *bufLimit = buf + inSize;
- CLzmaProb *probs = p->probs;
- unsigned state = p->state;
- ELzmaDummy res;
-
- {
- CLzmaProb *prob;
- UInt32 bound;
- unsigned ttt;
- unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);
-
- prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
- IF_BIT_0_CHECK(prob)
- {
- UPDATE_0_CHECK
-
- /* if (bufLimit - buf >= 7) return DUMMY_LIT; */
-
- prob = probs + Literal;
- if (p->checkDicSize != 0 || p->processedPos != 0)
- prob += (LZMA_LIT_SIZE *
- ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +
- (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));
-
- if (state < kNumLitStates)
- {
- unsigned symbol = 1;
- do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);
- }
- else
- {
- unsigned matchByte = p->dic[p->dicPos - p->reps[0] +
- ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)];
- unsigned offs = 0x100;
- unsigned symbol = 1;
- do
- {
- unsigned bit;
- CLzmaProb *probLit;
- matchByte <<= 1;
- bit = (matchByte & offs);
- probLit = prob + offs + bit + symbol;
- GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)
- }
- while (symbol < 0x100);
- }
- res = DUMMY_LIT;
- }
- else
- {
- unsigned len;
- UPDATE_1_CHECK;
-
- prob = probs + IsRep + state;
- IF_BIT_0_CHECK(prob)
- {
- UPDATE_0_CHECK;
- state = 0;
- prob = probs + LenCoder;
- res = DUMMY_MATCH;
- }
- else
- {
- UPDATE_1_CHECK;
- res = DUMMY_REP;
- prob = probs + IsRepG0 + state;
- IF_BIT_0_CHECK(prob)
- {
- UPDATE_0_CHECK;
- prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
- IF_BIT_0_CHECK(prob)
- {
- UPDATE_0_CHECK;
- NORMALIZE_CHECK;
- return DUMMY_REP;
- }
- else
- {
- UPDATE_1_CHECK;
- }
- }
- else
- {
- UPDATE_1_CHECK;
- prob = probs + IsRepG1 + state;
- IF_BIT_0_CHECK(prob)
- {
- UPDATE_0_CHECK;
- }
- else
- {
- UPDATE_1_CHECK;
- prob = probs + IsRepG2 + state;
- IF_BIT_0_CHECK(prob)
- {
- UPDATE_0_CHECK;
- }
- else
- {
- UPDATE_1_CHECK;
- }
- }
- }
- state = kNumStates;
- prob = probs + RepLenCoder;
- }
- {
- unsigned limit, offset;
- CLzmaProb *probLen = prob + LenChoice;
- IF_BIT_0_CHECK(probLen)
- {
- UPDATE_0_CHECK;
- probLen = prob + LenLow + (posState << kLenNumLowBits);
- offset = 0;
- limit = 1 << kLenNumLowBits;
- }
- else
- {
- UPDATE_1_CHECK;
- probLen = prob + LenChoice2;
- IF_BIT_0_CHECK(probLen)
- {
- UPDATE_0_CHECK;
- probLen = prob + LenMid + (posState << kLenNumMidBits);
- offset = kLenNumLowSymbols;
- limit = 1 << kLenNumMidBits;
- }
- else
- {
- UPDATE_1_CHECK;
- probLen = prob + LenHigh;
- offset = kLenNumLowSymbols + kLenNumMidSymbols;
- limit = 1 << kLenNumHighBits;
- }
- }
- TREE_DECODE_CHECK(probLen, limit, len);
- len += offset;
- }
-
- if (state < 4)
- {
- unsigned posSlot;
- prob = probs + PosSlot +
- ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
- kNumPosSlotBits);
- TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);
- if (posSlot >= kStartPosModelIndex)
- {
- int numDirectBits = ((posSlot >> 1) - 1);
-
- /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */
-
- if (posSlot < kEndPosModelIndex)
- {
- prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;
- }
- else
- {
- numDirectBits -= kNumAlignBits;
- do
- {
- NORMALIZE_CHECK
- range >>= 1;
- code -= range & (((code - range) >> 31) - 1);
- /* if (code >= range) code -= range; */
- }
- while (--numDirectBits != 0);
- prob = probs + Align;
- numDirectBits = kNumAlignBits;
- }
- {
- unsigned i = 1;
- do
- {
- GET_BIT_CHECK(prob + i, i);
- }
- while (--numDirectBits != 0);
- }
- }
- }
- }
- }
- NORMALIZE_CHECK;
- return res;
-}
-
-
-static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
-{
- p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);
- p->range = 0xFFFFFFFF;
- p->needFlush = 0;
-}
-
-void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
-{
- p->needFlush = 1;
- p->remainLen = 0;
- p->tempBufSize = 0;
-
- if (initDic)
- {
- p->processedPos = 0;
- p->checkDicSize = 0;
- p->needInitState = 1;
- }
- if (initState)
- p->needInitState = 1;
-}
-
-void LzmaDec_Init(CLzmaDec *p)
-{
- p->dicPos = 0;
- LzmaDec_InitDicAndState(p, True, True);
-}
-
-static void LzmaDec_InitStateReal(CLzmaDec *p)
-{
- UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp));
- UInt32 i;
- CLzmaProb *probs = p->probs;
- for (i = 0; i < numProbs; i++)
- probs[i] = kBitModelTotal >> 1;
- p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;
- p->state = 0;
- p->needInitState = 0;
-}
-
-SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
- ELzmaFinishMode finishMode, ELzmaStatus *status)
-{
- SizeT inSize = *srcLen;
- (*srcLen) = 0;
- LzmaDec_WriteRem(p, dicLimit);
-
- *status = LZMA_STATUS_NOT_SPECIFIED;
-
- while (p->remainLen != kMatchSpecLenStart)
- {
- int checkEndMarkNow;
-
- if (p->needFlush != 0)
- {
- for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)
- p->tempBuf[p->tempBufSize++] = *src++;
- if (p->tempBufSize < RC_INIT_SIZE)
- {
- *status = LZMA_STATUS_NEEDS_MORE_INPUT;
- return SZ_OK;
- }
- if (p->tempBuf[0] != 0)
- return SZ_ERROR_DATA;
-
- LzmaDec_InitRc(p, p->tempBuf);
- p->tempBufSize = 0;
- }
-
- checkEndMarkNow = 0;
- if (p->dicPos >= dicLimit)
- {
- if (p->remainLen == 0 && p->code == 0)
- {
- *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
- return SZ_OK;
- }
- if (finishMode == LZMA_FINISH_ANY)
- {
- *status = LZMA_STATUS_NOT_FINISHED;
- return SZ_OK;
- }
- if (p->remainLen != 0)
- {
- *status = LZMA_STATUS_NOT_FINISHED;
- return SZ_ERROR_DATA;
- }
- checkEndMarkNow = 1;
- }
-
- if (p->needInitState)
- LzmaDec_InitStateReal(p);
-
- if (p->tempBufSize == 0)
- {
- SizeT processed;
- const Byte *bufLimit;
- if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
- {
- int dummyRes = LzmaDec_TryDummy(p, src, inSize);
- if (dummyRes == DUMMY_ERROR)
- {
- memcpy(p->tempBuf, src, inSize);
- p->tempBufSize = (unsigned)inSize;
- (*srcLen) += inSize;
- *status = LZMA_STATUS_NEEDS_MORE_INPUT;
- return SZ_OK;
- }
- if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
- {
- *status = LZMA_STATUS_NOT_FINISHED;
- return SZ_ERROR_DATA;
- }
- bufLimit = src;
- }
- else
- bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
- p->buf = src;
- if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)
- return SZ_ERROR_DATA;
- processed = (SizeT)(p->buf - src);
- (*srcLen) += processed;
- src += processed;
- inSize -= processed;
- }
- else
- {
- unsigned rem = p->tempBufSize, lookAhead = 0;
- while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)
- p->tempBuf[rem++] = src[lookAhead++];
- p->tempBufSize = rem;
- if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
- {
- int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);
- if (dummyRes == DUMMY_ERROR)
- {
- (*srcLen) += lookAhead;
- *status = LZMA_STATUS_NEEDS_MORE_INPUT;
- return SZ_OK;
- }
- if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
- {
- *status = LZMA_STATUS_NOT_FINISHED;
- return SZ_ERROR_DATA;
- }
- }
- p->buf = p->tempBuf;
- if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)
- return SZ_ERROR_DATA;
- lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));
- (*srcLen) += lookAhead;
- src += lookAhead;
- inSize -= lookAhead;
- p->tempBufSize = 0;
- }
- }
- if (p->code == 0)
- *status = LZMA_STATUS_FINISHED_WITH_MARK;
- return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
-}
-
-SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
-{
- SizeT outSize = *destLen;
- SizeT inSize = *srcLen;
- *srcLen = *destLen = 0;
- for (;;)
- {
- SizeT inSizeCur = inSize, outSizeCur, dicPos;
- ELzmaFinishMode curFinishMode;
- SRes res;
- if (p->dicPos == p->dicBufSize)
- p->dicPos = 0;
- dicPos = p->dicPos;
- if (outSize > p->dicBufSize - dicPos)
- {
- outSizeCur = p->dicBufSize;
- curFinishMode = LZMA_FINISH_ANY;
- }
- else
- {
- outSizeCur = dicPos + outSize;
- curFinishMode = finishMode;
- }
-
- res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
- src += inSizeCur;
- inSize -= inSizeCur;
- *srcLen += inSizeCur;
- outSizeCur = p->dicPos - dicPos;
- memcpy(dest, p->dic + dicPos, outSizeCur);
- dest += outSizeCur;
- outSize -= outSizeCur;
- *destLen += outSizeCur;
- if (res != 0)
- return res;
- if (outSizeCur == 0 || outSize == 0)
- return SZ_OK;
- }
-}
-
-void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
-{
- alloc->Free(alloc, p->probs);
- p->probs = 0;
-}
-
-static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
-{
- alloc->Free(alloc, p->dic);
- p->dic = 0;
-}
-
-void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
-{
- LzmaDec_FreeProbs(p, alloc);
- LzmaDec_FreeDict(p, alloc);
-}
-
-SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
-{
- UInt32 dicSize;
- Byte d;
-
- if (size < LZMA_PROPS_SIZE)
- return SZ_ERROR_UNSUPPORTED;
- else
- dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);
-
- if (dicSize < LZMA_DIC_MIN)
- dicSize = LZMA_DIC_MIN;
- p->dicSize = dicSize;
-
- d = data[0];
- if (d >= (9 * 5 * 5))
- return SZ_ERROR_UNSUPPORTED;
-
- p->lc = d % 9;
- d /= 9;
- p->pb = d / 5;
- p->lp = d % 5;
-
- return SZ_OK;
-}
-
-static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)
-{
- UInt32 numProbs = LzmaProps_GetNumProbs(propNew);
- if (p->probs == 0 || numProbs != p->numProbs)
- {
- LzmaDec_FreeProbs(p, alloc);
- p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));
- p->numProbs = numProbs;
- if (p->probs == 0)
- return SZ_ERROR_MEM;
- }
- return SZ_OK;
-}
-
-SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
-{
- CLzmaProps propNew;
- RINOK(LzmaProps_Decode(&propNew, props, propsSize));
- RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
- p->prop = propNew;
- return SZ_OK;
-}
-
-SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
-{
- CLzmaProps propNew;
- SizeT dicBufSize;
- RINOK(LzmaProps_Decode(&propNew, props, propsSize));
- RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
- dicBufSize = propNew.dicSize;
- if (p->dic == 0 || dicBufSize != p->dicBufSize)
- {
- LzmaDec_FreeDict(p, alloc);
- p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);
- if (p->dic == 0)
- {
- LzmaDec_FreeProbs(p, alloc);
- return SZ_ERROR_MEM;
- }
- }
- p->dicBufSize = dicBufSize;
- p->prop = propNew;
- return SZ_OK;
-}
-
-SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
- const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
- ELzmaStatus *status, ISzAlloc *alloc)
-{
- CLzmaDec p;
- SRes res;
- SizeT outSize = *destLen, inSize = *srcLen;
- *destLen = *srcLen = 0;
- *status = LZMA_STATUS_NOT_SPECIFIED;
- if (inSize < RC_INIT_SIZE)
- return SZ_ERROR_INPUT_EOF;
- LzmaDec_Construct(&p);
- RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc));
- p.dic = dest;
- p.dicBufSize = outSize;
- LzmaDec_Init(&p);
- *srcLen = inSize;
- res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);
- *destLen = p.dicPos;
- if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)
- res = SZ_ERROR_INPUT_EOF;
- LzmaDec_FreeProbs(&p, alloc);
- return res;
-}
diff --git a/src/libs/7zip/win/C/LzmaDec.h b/src/libs/7zip/win/C/LzmaDec.h
deleted file mode 100644
index 63efc351f..000000000
--- a/src/libs/7zip/win/C/LzmaDec.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/* LzmaDec.h -- LZMA Decoder
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __LZMA_DEC_H
-#define __LZMA_DEC_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-/* #define _LZMA_PROB32 */
-/* _LZMA_PROB32 can increase the speed on some CPUs,
- but memory usage for CLzmaDec::probs will be doubled in that case */
-
-#ifdef _LZMA_PROB32
-#define CLzmaProb UInt32
-#else
-#define CLzmaProb UInt16
-#endif
-
-
-/* ---------- LZMA Properties ---------- */
-
-#define LZMA_PROPS_SIZE 5
-
-typedef struct _CLzmaProps
-{
- unsigned lc, lp, pb;
- UInt32 dicSize;
-} CLzmaProps;
-
-/* LzmaProps_Decode - decodes properties
-Returns:
- SZ_OK
- SZ_ERROR_UNSUPPORTED - Unsupported properties
-*/
-
-SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
-
-
-/* ---------- LZMA Decoder state ---------- */
-
-/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
- Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
-
-#define LZMA_REQUIRED_INPUT_MAX 20
-
-typedef struct
-{
- CLzmaProps prop;
- CLzmaProb *probs;
- Byte *dic;
- const Byte *buf;
- UInt32 range, code;
- SizeT dicPos;
- SizeT dicBufSize;
- UInt32 processedPos;
- UInt32 checkDicSize;
- unsigned state;
- UInt32 reps[4];
- unsigned remainLen;
- int needFlush;
- int needInitState;
- UInt32 numProbs;
- unsigned tempBufSize;
- Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
-} CLzmaDec;
-
-#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
-
-void LzmaDec_Init(CLzmaDec *p);
-
-/* There are two types of LZMA streams:
- 0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
- 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
-
-typedef enum
-{
- LZMA_FINISH_ANY, /* finish at any point */
- LZMA_FINISH_END /* block must be finished at the end */
-} ELzmaFinishMode;
-
-/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
-
- You must use LZMA_FINISH_END, when you know that current output buffer
- covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
-
- If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
- and output value of destLen will be less than output buffer size limit.
- You can check status result also.
-
- You can use multiple checks to test data integrity after full decompression:
- 1) Check Result and "status" variable.
- 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
- 3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
- You must use correct finish mode in that case. */
-
-typedef enum
-{
- LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */
- LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */
- LZMA_STATUS_NOT_FINISHED, /* stream was not finished */
- LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */
- LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */
-} ELzmaStatus;
-
-/* ELzmaStatus is used only as output value for function call */
-
-
-/* ---------- Interfaces ---------- */
-
-/* There are 3 levels of interfaces:
- 1) Dictionary Interface
- 2) Buffer Interface
- 3) One Call Interface
- You can select any of these interfaces, but don't mix functions from different
- groups for same object. */
-
-
-/* There are two variants to allocate state for Dictionary Interface:
- 1) LzmaDec_Allocate / LzmaDec_Free
- 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
- You can use variant 2, if you set dictionary buffer manually.
- For Buffer Interface you must always use variant 1.
-
-LzmaDec_Allocate* can return:
- SZ_OK
- SZ_ERROR_MEM - Memory allocation error
- SZ_ERROR_UNSUPPORTED - Unsupported properties
-*/
-
-SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
-void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
-
-SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
-void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
-
-/* ---------- Dictionary Interface ---------- */
-
-/* You can use it, if you want to eliminate the overhead for data copying from
- dictionary to some other external buffer.
- You must work with CLzmaDec variables directly in this interface.
-
- STEPS:
- LzmaDec_Constr()
- LzmaDec_Allocate()
- for (each new stream)
- {
- LzmaDec_Init()
- while (it needs more decompression)
- {
- LzmaDec_DecodeToDic()
- use data from CLzmaDec::dic and update CLzmaDec::dicPos
- }
- }
- LzmaDec_Free()
-*/
-
-/* LzmaDec_DecodeToDic
-
- The decoding to internal dictionary buffer (CLzmaDec::dic).
- You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
-
-finishMode:
- It has meaning only if the decoding reaches output limit (dicLimit).
- LZMA_FINISH_ANY - Decode just dicLimit bytes.
- LZMA_FINISH_END - Stream must be finished after dicLimit.
-
-Returns:
- SZ_OK
- status:
- LZMA_STATUS_FINISHED_WITH_MARK
- LZMA_STATUS_NOT_FINISHED
- LZMA_STATUS_NEEDS_MORE_INPUT
- LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
- SZ_ERROR_DATA - Data error
-*/
-
-SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
- const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
-
-
-/* ---------- Buffer Interface ---------- */
-
-/* It's zlib-like interface.
- See LzmaDec_DecodeToDic description for information about STEPS and return results,
- but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
- to work with CLzmaDec variables manually.
-
-finishMode:
- It has meaning only if the decoding reaches output limit (*destLen).
- LZMA_FINISH_ANY - Decode just destLen bytes.
- LZMA_FINISH_END - Stream must be finished after (*destLen).
-*/
-
-SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
- const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
-
-
-/* ---------- One Call Interface ---------- */
-
-/* LzmaDecode
-
-finishMode:
- It has meaning only if the decoding reaches output limit (*destLen).
- LZMA_FINISH_ANY - Decode just destLen bytes.
- LZMA_FINISH_END - Stream must be finished after (*destLen).
-
-Returns:
- SZ_OK
- status:
- LZMA_STATUS_FINISHED_WITH_MARK
- LZMA_STATUS_NOT_FINISHED
- LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
- SZ_ERROR_DATA - Data error
- SZ_ERROR_MEM - Memory allocation error
- SZ_ERROR_UNSUPPORTED - Unsupported properties
- SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
-*/
-
-SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
- const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
- ELzmaStatus *status, ISzAlloc *alloc);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/LzmaEnc.c b/src/libs/7zip/win/C/LzmaEnc.c
deleted file mode 100644
index bf3cc2ddb..000000000
--- a/src/libs/7zip/win/C/LzmaEnc.c
+++ /dev/null
@@ -1,2278 +0,0 @@
-/* LzmaEnc.c -- LZMA Encoder
-2014-12-29 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include <string.h>
-
-/* #define SHOW_STAT */
-/* #define SHOW_STAT2 */
-
-#if defined(SHOW_STAT) || defined(SHOW_STAT2)
-#include <stdio.h>
-#endif
-
-#include "LzmaEnc.h"
-
-#include "LzFind.h"
-#ifndef _7ZIP_ST
-#include "LzFindMt.h"
-#endif
-
-#ifdef SHOW_STAT
-static unsigned g_STAT_OFFSET = 0;
-#endif
-
-#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1)
-
-#define kBlockSize (9 << 10)
-#define kUnpackBlockSize (1 << 18)
-#define kMatchArraySize (1 << 21)
-#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX)
-
-#define kNumMaxDirectBits (31)
-
-#define kNumTopBits 24
-#define kTopValue ((UInt32)1 << kNumTopBits)
-
-#define kNumBitModelTotalBits 11
-#define kBitModelTotal (1 << kNumBitModelTotalBits)
-#define kNumMoveBits 5
-#define kProbInitValue (kBitModelTotal >> 1)
-
-#define kNumMoveReducingBits 4
-#define kNumBitPriceShiftBits 4
-#define kBitPrice (1 << kNumBitPriceShiftBits)
-
-void LzmaEncProps_Init(CLzmaEncProps *p)
-{
- p->level = 5;
- p->dictSize = p->mc = 0;
- p->reduceSize = (UInt64)(Int64)-1;
- p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1;
- p->writeEndMark = 0;
-}
-
-void LzmaEncProps_Normalize(CLzmaEncProps *p)
-{
- int level = p->level;
- if (level < 0) level = 5;
- p->level = level;
- if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26)));
- if (p->dictSize > p->reduceSize)
- {
- unsigned i;
- for (i = 11; i <= 30; i++)
- {
- if ((UInt32)p->reduceSize <= ((UInt32)2 << i)) { p->dictSize = ((UInt32)2 << i); break; }
- if ((UInt32)p->reduceSize <= ((UInt32)3 << i)) { p->dictSize = ((UInt32)3 << i); break; }
- }
- }
- if (p->lc < 0) p->lc = 3;
- if (p->lp < 0) p->lp = 0;
- if (p->pb < 0) p->pb = 2;
- if (p->algo < 0) p->algo = (level < 5 ? 0 : 1);
- if (p->fb < 0) p->fb = (level < 7 ? 32 : 64);
- if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1);
- if (p->numHashBytes < 0) p->numHashBytes = 4;
- if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1);
- if (p->numThreads < 0)
- p->numThreads =
- #ifndef _7ZIP_ST
- ((p->btMode && p->algo) ? 2 : 1);
- #else
- 1;
- #endif
-}
-
-UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
-{
- CLzmaEncProps props = *props2;
- LzmaEncProps_Normalize(&props);
- return props.dictSize;
-}
-
-/* #define LZMA_LOG_BSR */
-/* Define it for Intel's CPU */
-
-
-#ifdef LZMA_LOG_BSR
-
-#define kDicLogSizeMaxCompress 30
-
-#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }
-
-UInt32 GetPosSlot1(UInt32 pos)
-{
- UInt32 res;
- BSR2_RET(pos, res);
- return res;
-}
-#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
-#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); }
-
-#else
-
-#define kNumLogBits (9 + (int)sizeof(size_t) / 2)
-#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
-
-void LzmaEnc_FastPosInit(Byte *g_FastPos)
-{
- int c = 2, slotFast;
- g_FastPos[0] = 0;
- g_FastPos[1] = 1;
-
- for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++)
- {
- UInt32 k = (1 << ((slotFast >> 1) - 1));
- UInt32 j;
- for (j = 0; j < k; j++, c++)
- g_FastPos[c] = (Byte)slotFast;
- }
-}
-
-#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \
- (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \
- res = p->g_FastPos[pos >> i] + (i * 2); }
-/*
-#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \
- p->g_FastPos[pos >> 6] + 12 : \
- p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; }
-*/
-
-#define GetPosSlot1(pos) p->g_FastPos[pos]
-#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
-#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); }
-
-#endif
-
-
-#define LZMA_NUM_REPS 4
-
-typedef unsigned CState;
-
-typedef struct
-{
- UInt32 price;
-
- CState state;
- int prev1IsChar;
- int prev2;
-
- UInt32 posPrev2;
- UInt32 backPrev2;
-
- UInt32 posPrev;
- UInt32 backPrev;
- UInt32 backs[LZMA_NUM_REPS];
-} COptimal;
-
-#define kNumOpts (1 << 12)
-
-#define kNumLenToPosStates 4
-#define kNumPosSlotBits 6
-#define kDicLogSizeMin 0
-#define kDicLogSizeMax 32
-#define kDistTableSizeMax (kDicLogSizeMax * 2)
-
-
-#define kNumAlignBits 4
-#define kAlignTableSize (1 << kNumAlignBits)
-#define kAlignMask (kAlignTableSize - 1)
-
-#define kStartPosModelIndex 4
-#define kEndPosModelIndex 14
-#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex)
-
-#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
-
-#ifdef _LZMA_PROB32
-#define CLzmaProb UInt32
-#else
-#define CLzmaProb UInt16
-#endif
-
-#define LZMA_PB_MAX 4
-#define LZMA_LC_MAX 8
-#define LZMA_LP_MAX 4
-
-#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX)
-
-
-#define kLenNumLowBits 3
-#define kLenNumLowSymbols (1 << kLenNumLowBits)
-#define kLenNumMidBits 3
-#define kLenNumMidSymbols (1 << kLenNumMidBits)
-#define kLenNumHighBits 8
-#define kLenNumHighSymbols (1 << kLenNumHighBits)
-
-#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
-
-#define LZMA_MATCH_LEN_MIN 2
-#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1)
-
-#define kNumStates 12
-
-typedef struct
-{
- CLzmaProb choice;
- CLzmaProb choice2;
- CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits];
- CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits];
- CLzmaProb high[kLenNumHighSymbols];
-} CLenEnc;
-
-typedef struct
-{
- CLenEnc p;
- UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal];
- UInt32 tableSize;
- UInt32 counters[LZMA_NUM_PB_STATES_MAX];
-} CLenPriceEnc;
-
-typedef struct
-{
- UInt32 range;
- Byte cache;
- UInt64 low;
- UInt64 cacheSize;
- Byte *buf;
- Byte *bufLim;
- Byte *bufBase;
- ISeqOutStream *outStream;
- UInt64 processed;
- SRes res;
-} CRangeEnc;
-
-typedef struct
-{
- CLzmaProb *litProbs;
-
- CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
- CLzmaProb isRep[kNumStates];
- CLzmaProb isRepG0[kNumStates];
- CLzmaProb isRepG1[kNumStates];
- CLzmaProb isRepG2[kNumStates];
- CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
-
- CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
- CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];
- CLzmaProb posAlignEncoder[1 << kNumAlignBits];
-
- CLenPriceEnc lenEnc;
- CLenPriceEnc repLenEnc;
-
- UInt32 reps[LZMA_NUM_REPS];
- UInt32 state;
-} CSaveState;
-
-typedef struct
-{
- IMatchFinder matchFinder;
- void *matchFinderObj;
-
- #ifndef _7ZIP_ST
- Bool mtMode;
- CMatchFinderMt matchFinderMt;
- #endif
-
- CMatchFinder matchFinderBase;
-
- #ifndef _7ZIP_ST
- Byte pad[128];
- #endif
-
- UInt32 optimumEndIndex;
- UInt32 optimumCurrentIndex;
-
- UInt32 longestMatchLength;
- UInt32 numPairs;
- UInt32 numAvail;
- COptimal opt[kNumOpts];
-
- #ifndef LZMA_LOG_BSR
- Byte g_FastPos[1 << kNumLogBits];
- #endif
-
- UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits];
- UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1];
- UInt32 numFastBytes;
- UInt32 additionalOffset;
- UInt32 reps[LZMA_NUM_REPS];
- UInt32 state;
-
- UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax];
- UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances];
- UInt32 alignPrices[kAlignTableSize];
- UInt32 alignPriceCount;
-
- UInt32 distTableSize;
-
- unsigned lc, lp, pb;
- unsigned lpMask, pbMask;
-
- CLzmaProb *litProbs;
-
- CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
- CLzmaProb isRep[kNumStates];
- CLzmaProb isRepG0[kNumStates];
- CLzmaProb isRepG1[kNumStates];
- CLzmaProb isRepG2[kNumStates];
- CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
-
- CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
- CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];
- CLzmaProb posAlignEncoder[1 << kNumAlignBits];
-
- CLenPriceEnc lenEnc;
- CLenPriceEnc repLenEnc;
-
- unsigned lclp;
-
- Bool fastMode;
-
- CRangeEnc rc;
-
- Bool writeEndMark;
- UInt64 nowPos64;
- UInt32 matchPriceCount;
- Bool finished;
- Bool multiThread;
-
- SRes result;
- UInt32 dictSize;
-
- int needInit;
-
- CSaveState saveState;
-} CLzmaEnc;
-
-void LzmaEnc_SaveState(CLzmaEncHandle pp)
-{
- CLzmaEnc *p = (CLzmaEnc *)pp;
- CSaveState *dest = &p->saveState;
- int i;
- dest->lenEnc = p->lenEnc;
- dest->repLenEnc = p->repLenEnc;
- dest->state = p->state;
-
- for (i = 0; i < kNumStates; i++)
- {
- memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
- memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
- }
- for (i = 0; i < kNumLenToPosStates; i++)
- memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
- memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
- memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
- memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
- memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
- memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
- memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
- memcpy(dest->reps, p->reps, sizeof(p->reps));
- memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));
-}
-
-void LzmaEnc_RestoreState(CLzmaEncHandle pp)
-{
- CLzmaEnc *dest = (CLzmaEnc *)pp;
- const CSaveState *p = &dest->saveState;
- int i;
- dest->lenEnc = p->lenEnc;
- dest->repLenEnc = p->repLenEnc;
- dest->state = p->state;
-
- for (i = 0; i < kNumStates; i++)
- {
- memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
- memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
- }
- for (i = 0; i < kNumLenToPosStates; i++)
- memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
- memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
- memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
- memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
- memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
- memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
- memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
- memcpy(dest->reps, p->reps, sizeof(p->reps));
- memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));
-}
-
-SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)
-{
- CLzmaEnc *p = (CLzmaEnc *)pp;
- CLzmaEncProps props = *props2;
- LzmaEncProps_Normalize(&props);
-
- if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX ||
- props.dictSize > ((UInt32)1 << kDicLogSizeMaxCompress) || props.dictSize > ((UInt32)1 << 30))
- return SZ_ERROR_PARAM;
- p->dictSize = props.dictSize;
- {
- unsigned fb = props.fb;
- if (fb < 5)
- fb = 5;
- if (fb > LZMA_MATCH_LEN_MAX)
- fb = LZMA_MATCH_LEN_MAX;
- p->numFastBytes = fb;
- }
- p->lc = props.lc;
- p->lp = props.lp;
- p->pb = props.pb;
- p->fastMode = (props.algo == 0);
- p->matchFinderBase.btMode = props.btMode;
- {
- UInt32 numHashBytes = 4;
- if (props.btMode)
- {
- if (props.numHashBytes < 2)
- numHashBytes = 2;
- else if (props.numHashBytes < 4)
- numHashBytes = props.numHashBytes;
- }
- p->matchFinderBase.numHashBytes = numHashBytes;
- }
-
- p->matchFinderBase.cutValue = props.mc;
-
- p->writeEndMark = props.writeEndMark;
-
- #ifndef _7ZIP_ST
- /*
- if (newMultiThread != _multiThread)
- {
- ReleaseMatchFinder();
- _multiThread = newMultiThread;
- }
- */
- p->multiThread = (props.numThreads > 1);
- #endif
-
- return SZ_OK;
-}
-
-static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5};
-static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};
-static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};
-static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};
-
-#define IsCharState(s) ((s) < 7)
-
-#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1)
-
-#define kInfinityPrice (1 << 30)
-
-static void RangeEnc_Construct(CRangeEnc *p)
-{
- p->outStream = 0;
- p->bufBase = 0;
-}
-
-#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize)
-
-#define RC_BUF_SIZE (1 << 16)
-static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc)
-{
- if (p->bufBase == 0)
- {
- p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE);
- if (p->bufBase == 0)
- return 0;
- p->bufLim = p->bufBase + RC_BUF_SIZE;
- }
- return 1;
-}
-
-static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc)
-{
- alloc->Free(alloc, p->bufBase);
- p->bufBase = 0;
-}
-
-static void RangeEnc_Init(CRangeEnc *p)
-{
- /* Stream.Init(); */
- p->low = 0;
- p->range = 0xFFFFFFFF;
- p->cacheSize = 1;
- p->cache = 0;
-
- p->buf = p->bufBase;
-
- p->processed = 0;
- p->res = SZ_OK;
-}
-
-static void RangeEnc_FlushStream(CRangeEnc *p)
-{
- size_t num;
- if (p->res != SZ_OK)
- return;
- num = p->buf - p->bufBase;
- if (num != p->outStream->Write(p->outStream, p->bufBase, num))
- p->res = SZ_ERROR_WRITE;
- p->processed += num;
- p->buf = p->bufBase;
-}
-
-static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p)
-{
- if ((UInt32)p->low < (UInt32)0xFF000000 || (unsigned)(p->low >> 32) != 0)
- {
- Byte temp = p->cache;
- do
- {
- Byte *buf = p->buf;
- *buf++ = (Byte)(temp + (Byte)(p->low >> 32));
- p->buf = buf;
- if (buf == p->bufLim)
- RangeEnc_FlushStream(p);
- temp = 0xFF;
- }
- while (--p->cacheSize != 0);
- p->cache = (Byte)((UInt32)p->low >> 24);
- }
- p->cacheSize++;
- p->low = (UInt32)p->low << 8;
-}
-
-static void RangeEnc_FlushData(CRangeEnc *p)
-{
- int i;
- for (i = 0; i < 5; i++)
- RangeEnc_ShiftLow(p);
-}
-
-static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, unsigned numBits)
-{
- do
- {
- p->range >>= 1;
- p->low += p->range & (0 - ((value >> --numBits) & 1));
- if (p->range < kTopValue)
- {
- p->range <<= 8;
- RangeEnc_ShiftLow(p);
- }
- }
- while (numBits != 0);
-}
-
-static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol)
-{
- UInt32 ttt = *prob;
- UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt;
- if (symbol == 0)
- {
- p->range = newBound;
- ttt += (kBitModelTotal - ttt) >> kNumMoveBits;
- }
- else
- {
- p->low += newBound;
- p->range -= newBound;
- ttt -= ttt >> kNumMoveBits;
- }
- *prob = (CLzmaProb)ttt;
- if (p->range < kTopValue)
- {
- p->range <<= 8;
- RangeEnc_ShiftLow(p);
- }
-}
-
-static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol)
-{
- symbol |= 0x100;
- do
- {
- RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1);
- symbol <<= 1;
- }
- while (symbol < 0x10000);
-}
-
-static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte)
-{
- UInt32 offs = 0x100;
- symbol |= 0x100;
- do
- {
- matchByte <<= 1;
- RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1);
- symbol <<= 1;
- offs &= ~(matchByte ^ symbol);
- }
- while (symbol < 0x10000);
-}
-
-void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
-{
- UInt32 i;
- for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))
- {
- const int kCyclesBits = kNumBitPriceShiftBits;
- UInt32 w = i;
- UInt32 bitCount = 0;
- int j;
- for (j = 0; j < kCyclesBits; j++)
- {
- w = w * w;
- bitCount <<= 1;
- while (w >= ((UInt32)1 << 16))
- {
- w >>= 1;
- bitCount++;
- }
- }
- ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount);
- }
-}
-
-
-#define GET_PRICE(prob, symbol) \
- p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
-
-#define GET_PRICEa(prob, symbol) \
- ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
-
-#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits]
-#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
-
-#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits]
-#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
-
-static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices)
-{
- UInt32 price = 0;
- symbol |= 0x100;
- do
- {
- price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1);
- symbol <<= 1;
- }
- while (symbol < 0x10000);
- return price;
-}
-
-static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices)
-{
- UInt32 price = 0;
- UInt32 offs = 0x100;
- symbol |= 0x100;
- do
- {
- matchByte <<= 1;
- price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1);
- symbol <<= 1;
- offs &= ~(matchByte ^ symbol);
- }
- while (symbol < 0x10000);
- return price;
-}
-
-
-static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)
-{
- UInt32 m = 1;
- int i;
- for (i = numBitLevels; i != 0;)
- {
- UInt32 bit;
- i--;
- bit = (symbol >> i) & 1;
- RangeEnc_EncodeBit(rc, probs + m, bit);
- m = (m << 1) | bit;
- }
-}
-
-static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)
-{
- UInt32 m = 1;
- int i;
- for (i = 0; i < numBitLevels; i++)
- {
- UInt32 bit = symbol & 1;
- RangeEnc_EncodeBit(rc, probs + m, bit);
- m = (m << 1) | bit;
- symbol >>= 1;
- }
-}
-
-static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)
-{
- UInt32 price = 0;
- symbol |= (1 << numBitLevels);
- while (symbol != 1)
- {
- price += GET_PRICEa(probs[symbol >> 1], symbol & 1);
- symbol >>= 1;
- }
- return price;
-}
-
-static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)
-{
- UInt32 price = 0;
- UInt32 m = 1;
- int i;
- for (i = numBitLevels; i != 0; i--)
- {
- UInt32 bit = symbol & 1;
- symbol >>= 1;
- price += GET_PRICEa(probs[m], bit);
- m = (m << 1) | bit;
- }
- return price;
-}
-
-
-static void LenEnc_Init(CLenEnc *p)
-{
- unsigned i;
- p->choice = p->choice2 = kProbInitValue;
- for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++)
- p->low[i] = kProbInitValue;
- for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++)
- p->mid[i] = kProbInitValue;
- for (i = 0; i < kLenNumHighSymbols; i++)
- p->high[i] = kProbInitValue;
-}
-
-static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState)
-{
- if (symbol < kLenNumLowSymbols)
- {
- RangeEnc_EncodeBit(rc, &p->choice, 0);
- RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol);
- }
- else
- {
- RangeEnc_EncodeBit(rc, &p->choice, 1);
- if (symbol < kLenNumLowSymbols + kLenNumMidSymbols)
- {
- RangeEnc_EncodeBit(rc, &p->choice2, 0);
- RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols);
- }
- else
- {
- RangeEnc_EncodeBit(rc, &p->choice2, 1);
- RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols);
- }
- }
-}
-
-static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices)
-{
- UInt32 a0 = GET_PRICE_0a(p->choice);
- UInt32 a1 = GET_PRICE_1a(p->choice);
- UInt32 b0 = a1 + GET_PRICE_0a(p->choice2);
- UInt32 b1 = a1 + GET_PRICE_1a(p->choice2);
- UInt32 i = 0;
- for (i = 0; i < kLenNumLowSymbols; i++)
- {
- if (i >= numSymbols)
- return;
- prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices);
- }
- for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++)
- {
- if (i >= numSymbols)
- return;
- prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices);
- }
- for (; i < numSymbols; i++)
- prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices);
-}
-
-static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices)
-{
- LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices);
- p->counters[posState] = p->tableSize;
-}
-
-static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices)
-{
- UInt32 posState;
- for (posState = 0; posState < numPosStates; posState++)
- LenPriceEnc_UpdateTable(p, posState, ProbPrices);
-}
-
-static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices)
-{
- LenEnc_Encode(&p->p, rc, symbol, posState);
- if (updatePrice)
- if (--p->counters[posState] == 0)
- LenPriceEnc_UpdateTable(p, posState, ProbPrices);
-}
-
-
-
-
-static void MovePos(CLzmaEnc *p, UInt32 num)
-{
- #ifdef SHOW_STAT
- g_STAT_OFFSET += num;
- printf("\n MovePos %d", num);
- #endif
-
- if (num != 0)
- {
- p->additionalOffset += num;
- p->matchFinder.Skip(p->matchFinderObj, num);
- }
-}
-
-static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes)
-{
- UInt32 lenRes = 0, numPairs;
- p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
- numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches);
-
- #ifdef SHOW_STAT
- printf("\n i = %d numPairs = %d ", g_STAT_OFFSET, numPairs / 2);
- g_STAT_OFFSET++;
- {
- UInt32 i;
- for (i = 0; i < numPairs; i += 2)
- printf("%2d %6d | ", p->matches[i], p->matches[i + 1]);
- }
- #endif
-
- if (numPairs > 0)
- {
- lenRes = p->matches[numPairs - 2];
- if (lenRes == p->numFastBytes)
- {
- const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
- UInt32 distance = p->matches[numPairs - 1] + 1;
- UInt32 numAvail = p->numAvail;
- if (numAvail > LZMA_MATCH_LEN_MAX)
- numAvail = LZMA_MATCH_LEN_MAX;
- {
- const Byte *pby2 = pby - distance;
- for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++);
- }
- }
- }
- p->additionalOffset++;
- *numDistancePairsRes = numPairs;
- return lenRes;
-}
-
-
-#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False;
-#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False;
-#define IsShortRep(p) ((p)->backPrev == 0)
-
-static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState)
-{
- return
- GET_PRICE_0(p->isRepG0[state]) +
- GET_PRICE_0(p->isRep0Long[state][posState]);
-}
-
-static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState)
-{
- UInt32 price;
- if (repIndex == 0)
- {
- price = GET_PRICE_0(p->isRepG0[state]);
- price += GET_PRICE_1(p->isRep0Long[state][posState]);
- }
- else
- {
- price = GET_PRICE_1(p->isRepG0[state]);
- if (repIndex == 1)
- price += GET_PRICE_0(p->isRepG1[state]);
- else
- {
- price += GET_PRICE_1(p->isRepG1[state]);
- price += GET_PRICE(p->isRepG2[state], repIndex - 2);
- }
- }
- return price;
-}
-
-static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState)
-{
- return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] +
- GetPureRepPrice(p, repIndex, state, posState);
-}
-
-static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur)
-{
- UInt32 posMem = p->opt[cur].posPrev;
- UInt32 backMem = p->opt[cur].backPrev;
- p->optimumEndIndex = cur;
- do
- {
- if (p->opt[cur].prev1IsChar)
- {
- MakeAsChar(&p->opt[posMem])
- p->opt[posMem].posPrev = posMem - 1;
- if (p->opt[cur].prev2)
- {
- p->opt[posMem - 1].prev1IsChar = False;
- p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2;
- p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2;
- }
- }
- {
- UInt32 posPrev = posMem;
- UInt32 backCur = backMem;
-
- backMem = p->opt[posPrev].backPrev;
- posMem = p->opt[posPrev].posPrev;
-
- p->opt[posPrev].backPrev = backCur;
- p->opt[posPrev].posPrev = cur;
- cur = posPrev;
- }
- }
- while (cur != 0);
- *backRes = p->opt[0].backPrev;
- p->optimumCurrentIndex = p->opt[0].posPrev;
- return p->optimumCurrentIndex;
-}
-
-#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300)
-
-static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes)
-{
- UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur;
- UInt32 matchPrice, repMatchPrice, normalMatchPrice;
- UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS];
- UInt32 *matches;
- const Byte *data;
- Byte curByte, matchByte;
- if (p->optimumEndIndex != p->optimumCurrentIndex)
- {
- const COptimal *opt = &p->opt[p->optimumCurrentIndex];
- UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex;
- *backRes = opt->backPrev;
- p->optimumCurrentIndex = opt->posPrev;
- return lenRes;
- }
- p->optimumCurrentIndex = p->optimumEndIndex = 0;
-
- if (p->additionalOffset == 0)
- mainLen = ReadMatchDistances(p, &numPairs);
- else
- {
- mainLen = p->longestMatchLength;
- numPairs = p->numPairs;
- }
-
- numAvail = p->numAvail;
- if (numAvail < 2)
- {
- *backRes = (UInt32)(-1);
- return 1;
- }
- if (numAvail > LZMA_MATCH_LEN_MAX)
- numAvail = LZMA_MATCH_LEN_MAX;
-
- data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
- repMaxIndex = 0;
- for (i = 0; i < LZMA_NUM_REPS; i++)
- {
- UInt32 lenTest;
- const Byte *data2;
- reps[i] = p->reps[i];
- data2 = data - (reps[i] + 1);
- if (data[0] != data2[0] || data[1] != data2[1])
- {
- repLens[i] = 0;
- continue;
- }
- for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);
- repLens[i] = lenTest;
- if (lenTest > repLens[repMaxIndex])
- repMaxIndex = i;
- }
- if (repLens[repMaxIndex] >= p->numFastBytes)
- {
- UInt32 lenRes;
- *backRes = repMaxIndex;
- lenRes = repLens[repMaxIndex];
- MovePos(p, lenRes - 1);
- return lenRes;
- }
-
- matches = p->matches;
- if (mainLen >= p->numFastBytes)
- {
- *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;
- MovePos(p, mainLen - 1);
- return mainLen;
- }
- curByte = *data;
- matchByte = *(data - (reps[0] + 1));
-
- if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2)
- {
- *backRes = (UInt32)-1;
- return 1;
- }
-
- p->opt[0].state = (CState)p->state;
-
- posState = (position & p->pbMask);
-
- {
- const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));
- p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) +
- (!IsCharState(p->state) ?
- LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :
- LitEnc_GetPrice(probs, curByte, p->ProbPrices));
- }
-
- MakeAsChar(&p->opt[1]);
-
- matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]);
- repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]);
-
- if (matchByte == curByte)
- {
- UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState);
- if (shortRepPrice < p->opt[1].price)
- {
- p->opt[1].price = shortRepPrice;
- MakeAsShortRep(&p->opt[1]);
- }
- }
- lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]);
-
- if (lenEnd < 2)
- {
- *backRes = p->opt[1].backPrev;
- return 1;
- }
-
- p->opt[1].posPrev = 0;
- for (i = 0; i < LZMA_NUM_REPS; i++)
- p->opt[0].backs[i] = reps[i];
-
- len = lenEnd;
- do
- p->opt[len--].price = kInfinityPrice;
- while (len >= 2);
-
- for (i = 0; i < LZMA_NUM_REPS; i++)
- {
- UInt32 repLen = repLens[i];
- UInt32 price;
- if (repLen < 2)
- continue;
- price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState);
- do
- {
- UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2];
- COptimal *opt = &p->opt[repLen];
- if (curAndLenPrice < opt->price)
- {
- opt->price = curAndLenPrice;
- opt->posPrev = 0;
- opt->backPrev = i;
- opt->prev1IsChar = False;
- }
- }
- while (--repLen >= 2);
- }
-
- normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]);
-
- len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2);
- if (len <= mainLen)
- {
- UInt32 offs = 0;
- while (len > matches[offs])
- offs += 2;
- for (; ; len++)
- {
- COptimal *opt;
- UInt32 distance = matches[offs + 1];
-
- UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN];
- UInt32 lenToPosState = GetLenToPosState(len);
- if (distance < kNumFullDistances)
- curAndLenPrice += p->distancesPrices[lenToPosState][distance];
- else
- {
- UInt32 slot;
- GetPosSlot2(distance, slot);
- curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot];
- }
- opt = &p->opt[len];
- if (curAndLenPrice < opt->price)
- {
- opt->price = curAndLenPrice;
- opt->posPrev = 0;
- opt->backPrev = distance + LZMA_NUM_REPS;
- opt->prev1IsChar = False;
- }
- if (len == matches[offs])
- {
- offs += 2;
- if (offs == numPairs)
- break;
- }
- }
- }
-
- cur = 0;
-
- #ifdef SHOW_STAT2
- if (position >= 0)
- {
- unsigned i;
- printf("\n pos = %4X", position);
- for (i = cur; i <= lenEnd; i++)
- printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price);
- }
- #endif
-
- for (;;)
- {
- UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen;
- UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice;
- Bool nextIsChar;
- Byte curByte, matchByte;
- const Byte *data;
- COptimal *curOpt;
- COptimal *nextOpt;
-
- cur++;
- if (cur == lenEnd)
- return Backward(p, backRes, cur);
-
- newLen = ReadMatchDistances(p, &numPairs);
- if (newLen >= p->numFastBytes)
- {
- p->numPairs = numPairs;
- p->longestMatchLength = newLen;
- return Backward(p, backRes, cur);
- }
- position++;
- curOpt = &p->opt[cur];
- posPrev = curOpt->posPrev;
- if (curOpt->prev1IsChar)
- {
- posPrev--;
- if (curOpt->prev2)
- {
- state = p->opt[curOpt->posPrev2].state;
- if (curOpt->backPrev2 < LZMA_NUM_REPS)
- state = kRepNextStates[state];
- else
- state = kMatchNextStates[state];
- }
- else
- state = p->opt[posPrev].state;
- state = kLiteralNextStates[state];
- }
- else
- state = p->opt[posPrev].state;
- if (posPrev == cur - 1)
- {
- if (IsShortRep(curOpt))
- state = kShortRepNextStates[state];
- else
- state = kLiteralNextStates[state];
- }
- else
- {
- UInt32 pos;
- const COptimal *prevOpt;
- if (curOpt->prev1IsChar && curOpt->prev2)
- {
- posPrev = curOpt->posPrev2;
- pos = curOpt->backPrev2;
- state = kRepNextStates[state];
- }
- else
- {
- pos = curOpt->backPrev;
- if (pos < LZMA_NUM_REPS)
- state = kRepNextStates[state];
- else
- state = kMatchNextStates[state];
- }
- prevOpt = &p->opt[posPrev];
- if (pos < LZMA_NUM_REPS)
- {
- UInt32 i;
- reps[0] = prevOpt->backs[pos];
- for (i = 1; i <= pos; i++)
- reps[i] = prevOpt->backs[i - 1];
- for (; i < LZMA_NUM_REPS; i++)
- reps[i] = prevOpt->backs[i];
- }
- else
- {
- UInt32 i;
- reps[0] = (pos - LZMA_NUM_REPS);
- for (i = 1; i < LZMA_NUM_REPS; i++)
- reps[i] = prevOpt->backs[i - 1];
- }
- }
- curOpt->state = (CState)state;
-
- curOpt->backs[0] = reps[0];
- curOpt->backs[1] = reps[1];
- curOpt->backs[2] = reps[2];
- curOpt->backs[3] = reps[3];
-
- curPrice = curOpt->price;
- nextIsChar = False;
- data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
- curByte = *data;
- matchByte = *(data - (reps[0] + 1));
-
- posState = (position & p->pbMask);
-
- curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]);
- {
- const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));
- curAnd1Price +=
- (!IsCharState(state) ?
- LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :
- LitEnc_GetPrice(probs, curByte, p->ProbPrices));
- }
-
- nextOpt = &p->opt[cur + 1];
-
- if (curAnd1Price < nextOpt->price)
- {
- nextOpt->price = curAnd1Price;
- nextOpt->posPrev = cur;
- MakeAsChar(nextOpt);
- nextIsChar = True;
- }
-
- matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]);
- repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]);
-
- if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0))
- {
- UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState);
- if (shortRepPrice <= nextOpt->price)
- {
- nextOpt->price = shortRepPrice;
- nextOpt->posPrev = cur;
- MakeAsShortRep(nextOpt);
- nextIsChar = True;
- }
- }
- numAvailFull = p->numAvail;
- {
- UInt32 temp = kNumOpts - 1 - cur;
- if (temp < numAvailFull)
- numAvailFull = temp;
- }
-
- if (numAvailFull < 2)
- continue;
- numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes);
-
- if (!nextIsChar && matchByte != curByte) /* speed optimization */
- {
- /* try Literal + rep0 */
- UInt32 temp;
- UInt32 lenTest2;
- const Byte *data2 = data - (reps[0] + 1);
- UInt32 limit = p->numFastBytes + 1;
- if (limit > numAvailFull)
- limit = numAvailFull;
-
- for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++);
- lenTest2 = temp - 1;
- if (lenTest2 >= 2)
- {
- UInt32 state2 = kLiteralNextStates[state];
- UInt32 posStateNext = (position + 1) & p->pbMask;
- UInt32 nextRepMatchPrice = curAnd1Price +
- GET_PRICE_1(p->isMatch[state2][posStateNext]) +
- GET_PRICE_1(p->isRep[state2]);
- /* for (; lenTest2 >= 2; lenTest2--) */
- {
- UInt32 curAndLenPrice;
- COptimal *opt;
- UInt32 offset = cur + 1 + lenTest2;
- while (lenEnd < offset)
- p->opt[++lenEnd].price = kInfinityPrice;
- curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
- opt = &p->opt[offset];
- if (curAndLenPrice < opt->price)
- {
- opt->price = curAndLenPrice;
- opt->posPrev = cur + 1;
- opt->backPrev = 0;
- opt->prev1IsChar = True;
- opt->prev2 = False;
- }
- }
- }
- }
-
- startLen = 2; /* speed optimization */
- {
- UInt32 repIndex;
- for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++)
- {
- UInt32 lenTest;
- UInt32 lenTestTemp;
- UInt32 price;
- const Byte *data2 = data - (reps[repIndex] + 1);
- if (data[0] != data2[0] || data[1] != data2[1])
- continue;
- for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);
- while (lenEnd < cur + lenTest)
- p->opt[++lenEnd].price = kInfinityPrice;
- lenTestTemp = lenTest;
- price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState);
- do
- {
- UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2];
- COptimal *opt = &p->opt[cur + lenTest];
- if (curAndLenPrice < opt->price)
- {
- opt->price = curAndLenPrice;
- opt->posPrev = cur;
- opt->backPrev = repIndex;
- opt->prev1IsChar = False;
- }
- }
- while (--lenTest >= 2);
- lenTest = lenTestTemp;
-
- if (repIndex == 0)
- startLen = lenTest + 1;
-
- /* if (_maxMode) */
- {
- UInt32 lenTest2 = lenTest + 1;
- UInt32 limit = lenTest2 + p->numFastBytes;
- UInt32 nextRepMatchPrice;
- if (limit > numAvailFull)
- limit = numAvailFull;
- for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);
- lenTest2 -= lenTest + 1;
- if (lenTest2 >= 2)
- {
- UInt32 state2 = kRepNextStates[state];
- UInt32 posStateNext = (position + lenTest) & p->pbMask;
- UInt32 curAndLenCharPrice =
- price + p->repLenEnc.prices[posState][lenTest - 2] +
- GET_PRICE_0(p->isMatch[state2][posStateNext]) +
- LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),
- data[lenTest], data2[lenTest], p->ProbPrices);
- state2 = kLiteralNextStates[state2];
- posStateNext = (position + lenTest + 1) & p->pbMask;
- nextRepMatchPrice = curAndLenCharPrice +
- GET_PRICE_1(p->isMatch[state2][posStateNext]) +
- GET_PRICE_1(p->isRep[state2]);
-
- /* for (; lenTest2 >= 2; lenTest2--) */
- {
- UInt32 curAndLenPrice;
- COptimal *opt;
- UInt32 offset = cur + lenTest + 1 + lenTest2;
- while (lenEnd < offset)
- p->opt[++lenEnd].price = kInfinityPrice;
- curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
- opt = &p->opt[offset];
- if (curAndLenPrice < opt->price)
- {
- opt->price = curAndLenPrice;
- opt->posPrev = cur + lenTest + 1;
- opt->backPrev = 0;
- opt->prev1IsChar = True;
- opt->prev2 = True;
- opt->posPrev2 = cur;
- opt->backPrev2 = repIndex;
- }
- }
- }
- }
- }
- }
- /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */
- if (newLen > numAvail)
- {
- newLen = numAvail;
- for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2);
- matches[numPairs] = newLen;
- numPairs += 2;
- }
- if (newLen >= startLen)
- {
- UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]);
- UInt32 offs, curBack, posSlot;
- UInt32 lenTest;
- while (lenEnd < cur + newLen)
- p->opt[++lenEnd].price = kInfinityPrice;
-
- offs = 0;
- while (startLen > matches[offs])
- offs += 2;
- curBack = matches[offs + 1];
- GetPosSlot2(curBack, posSlot);
- for (lenTest = /*2*/ startLen; ; lenTest++)
- {
- UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN];
- UInt32 lenToPosState = GetLenToPosState(lenTest);
- COptimal *opt;
- if (curBack < kNumFullDistances)
- curAndLenPrice += p->distancesPrices[lenToPosState][curBack];
- else
- curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask];
-
- opt = &p->opt[cur + lenTest];
- if (curAndLenPrice < opt->price)
- {
- opt->price = curAndLenPrice;
- opt->posPrev = cur;
- opt->backPrev = curBack + LZMA_NUM_REPS;
- opt->prev1IsChar = False;
- }
-
- if (/*_maxMode && */lenTest == matches[offs])
- {
- /* Try Match + Literal + Rep0 */
- const Byte *data2 = data - (curBack + 1);
- UInt32 lenTest2 = lenTest + 1;
- UInt32 limit = lenTest2 + p->numFastBytes;
- UInt32 nextRepMatchPrice;
- if (limit > numAvailFull)
- limit = numAvailFull;
- for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);
- lenTest2 -= lenTest + 1;
- if (lenTest2 >= 2)
- {
- UInt32 state2 = kMatchNextStates[state];
- UInt32 posStateNext = (position + lenTest) & p->pbMask;
- UInt32 curAndLenCharPrice = curAndLenPrice +
- GET_PRICE_0(p->isMatch[state2][posStateNext]) +
- LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),
- data[lenTest], data2[lenTest], p->ProbPrices);
- state2 = kLiteralNextStates[state2];
- posStateNext = (posStateNext + 1) & p->pbMask;
- nextRepMatchPrice = curAndLenCharPrice +
- GET_PRICE_1(p->isMatch[state2][posStateNext]) +
- GET_PRICE_1(p->isRep[state2]);
-
- /* for (; lenTest2 >= 2; lenTest2--) */
- {
- UInt32 offset = cur + lenTest + 1 + lenTest2;
- UInt32 curAndLenPrice;
- COptimal *opt;
- while (lenEnd < offset)
- p->opt[++lenEnd].price = kInfinityPrice;
- curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
- opt = &p->opt[offset];
- if (curAndLenPrice < opt->price)
- {
- opt->price = curAndLenPrice;
- opt->posPrev = cur + lenTest + 1;
- opt->backPrev = 0;
- opt->prev1IsChar = True;
- opt->prev2 = True;
- opt->posPrev2 = cur;
- opt->backPrev2 = curBack + LZMA_NUM_REPS;
- }
- }
- }
- offs += 2;
- if (offs == numPairs)
- break;
- curBack = matches[offs + 1];
- if (curBack >= kNumFullDistances)
- GetPosSlot2(curBack, posSlot);
- }
- }
- }
- }
-}
-
-#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist))
-
-static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes)
-{
- UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i;
- const Byte *data;
- const UInt32 *matches;
-
- if (p->additionalOffset == 0)
- mainLen = ReadMatchDistances(p, &numPairs);
- else
- {
- mainLen = p->longestMatchLength;
- numPairs = p->numPairs;
- }
-
- numAvail = p->numAvail;
- *backRes = (UInt32)-1;
- if (numAvail < 2)
- return 1;
- if (numAvail > LZMA_MATCH_LEN_MAX)
- numAvail = LZMA_MATCH_LEN_MAX;
- data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
-
- repLen = repIndex = 0;
- for (i = 0; i < LZMA_NUM_REPS; i++)
- {
- UInt32 len;
- const Byte *data2 = data - (p->reps[i] + 1);
- if (data[0] != data2[0] || data[1] != data2[1])
- continue;
- for (len = 2; len < numAvail && data[len] == data2[len]; len++);
- if (len >= p->numFastBytes)
- {
- *backRes = i;
- MovePos(p, len - 1);
- return len;
- }
- if (len > repLen)
- {
- repIndex = i;
- repLen = len;
- }
- }
-
- matches = p->matches;
- if (mainLen >= p->numFastBytes)
- {
- *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;
- MovePos(p, mainLen - 1);
- return mainLen;
- }
-
- mainDist = 0; /* for GCC */
- if (mainLen >= 2)
- {
- mainDist = matches[numPairs - 1];
- while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1)
- {
- if (!ChangePair(matches[numPairs - 3], mainDist))
- break;
- numPairs -= 2;
- mainLen = matches[numPairs - 2];
- mainDist = matches[numPairs - 1];
- }
- if (mainLen == 2 && mainDist >= 0x80)
- mainLen = 1;
- }
-
- if (repLen >= 2 && (
- (repLen + 1 >= mainLen) ||
- (repLen + 2 >= mainLen && mainDist >= (1 << 9)) ||
- (repLen + 3 >= mainLen && mainDist >= (1 << 15))))
- {
- *backRes = repIndex;
- MovePos(p, repLen - 1);
- return repLen;
- }
-
- if (mainLen < 2 || numAvail <= 2)
- return 1;
-
- p->longestMatchLength = ReadMatchDistances(p, &p->numPairs);
- if (p->longestMatchLength >= 2)
- {
- UInt32 newDistance = matches[p->numPairs - 1];
- if ((p->longestMatchLength >= mainLen && newDistance < mainDist) ||
- (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) ||
- (p->longestMatchLength > mainLen + 1) ||
- (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist)))
- return 1;
- }
-
- data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
- for (i = 0; i < LZMA_NUM_REPS; i++)
- {
- UInt32 len, limit;
- const Byte *data2 = data - (p->reps[i] + 1);
- if (data[0] != data2[0] || data[1] != data2[1])
- continue;
- limit = mainLen - 1;
- for (len = 2; len < limit && data[len] == data2[len]; len++);
- if (len >= limit)
- return 1;
- }
- *backRes = mainDist + LZMA_NUM_REPS;
- MovePos(p, mainLen - 2);
- return mainLen;
-}
-
-static void WriteEndMarker(CLzmaEnc *p, UInt32 posState)
-{
- UInt32 len;
- RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);
- RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);
- p->state = kMatchNextStates[p->state];
- len = LZMA_MATCH_LEN_MIN;
- LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
- RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1);
- RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits);
- RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask);
-}
-
-static SRes CheckErrors(CLzmaEnc *p)
-{
- if (p->result != SZ_OK)
- return p->result;
- if (p->rc.res != SZ_OK)
- p->result = SZ_ERROR_WRITE;
- if (p->matchFinderBase.result != SZ_OK)
- p->result = SZ_ERROR_READ;
- if (p->result != SZ_OK)
- p->finished = True;
- return p->result;
-}
-
-static SRes Flush(CLzmaEnc *p, UInt32 nowPos)
-{
- /* ReleaseMFStream(); */
- p->finished = True;
- if (p->writeEndMark)
- WriteEndMarker(p, nowPos & p->pbMask);
- RangeEnc_FlushData(&p->rc);
- RangeEnc_FlushStream(&p->rc);
- return CheckErrors(p);
-}
-
-static void FillAlignPrices(CLzmaEnc *p)
-{
- UInt32 i;
- for (i = 0; i < kAlignTableSize; i++)
- p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices);
- p->alignPriceCount = 0;
-}
-
-static void FillDistancesPrices(CLzmaEnc *p)
-{
- UInt32 tempPrices[kNumFullDistances];
- UInt32 i, lenToPosState;
- for (i = kStartPosModelIndex; i < kNumFullDistances; i++)
- {
- UInt32 posSlot = GetPosSlot1(i);
- UInt32 footerBits = ((posSlot >> 1) - 1);
- UInt32 base = ((2 | (posSlot & 1)) << footerBits);
- tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices);
- }
-
- for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++)
- {
- UInt32 posSlot;
- const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState];
- UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState];
- for (posSlot = 0; posSlot < p->distTableSize; posSlot++)
- posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices);
- for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++)
- posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits);
-
- {
- UInt32 *distancesPrices = p->distancesPrices[lenToPosState];
- UInt32 i;
- for (i = 0; i < kStartPosModelIndex; i++)
- distancesPrices[i] = posSlotPrices[i];
- for (; i < kNumFullDistances; i++)
- distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i];
- }
- }
- p->matchPriceCount = 0;
-}
-
-void LzmaEnc_Construct(CLzmaEnc *p)
-{
- RangeEnc_Construct(&p->rc);
- MatchFinder_Construct(&p->matchFinderBase);
- #ifndef _7ZIP_ST
- MatchFinderMt_Construct(&p->matchFinderMt);
- p->matchFinderMt.MatchFinder = &p->matchFinderBase;
- #endif
-
- {
- CLzmaEncProps props;
- LzmaEncProps_Init(&props);
- LzmaEnc_SetProps(p, &props);
- }
-
- #ifndef LZMA_LOG_BSR
- LzmaEnc_FastPosInit(p->g_FastPos);
- #endif
-
- LzmaEnc_InitPriceTables(p->ProbPrices);
- p->litProbs = 0;
- p->saveState.litProbs = 0;
-}
-
-CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc)
-{
- void *p;
- p = alloc->Alloc(alloc, sizeof(CLzmaEnc));
- if (p != 0)
- LzmaEnc_Construct((CLzmaEnc *)p);
- return p;
-}
-
-void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
-{
- alloc->Free(alloc, p->litProbs);
- alloc->Free(alloc, p->saveState.litProbs);
- p->litProbs = 0;
- p->saveState.litProbs = 0;
-}
-
-void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
-{
- #ifndef _7ZIP_ST
- MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);
- #endif
- MatchFinder_Free(&p->matchFinderBase, allocBig);
- LzmaEnc_FreeLits(p, alloc);
- RangeEnc_Free(&p->rc, alloc);
-}
-
-void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig)
-{
- LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig);
- alloc->Free(alloc, p);
-}
-
-static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize)
-{
- UInt32 nowPos32, startPos32;
- if (p->needInit)
- {
- p->matchFinder.Init(p->matchFinderObj);
- p->needInit = 0;
- }
-
- if (p->finished)
- return p->result;
- RINOK(CheckErrors(p));
-
- nowPos32 = (UInt32)p->nowPos64;
- startPos32 = nowPos32;
-
- if (p->nowPos64 == 0)
- {
- UInt32 numPairs;
- Byte curByte;
- if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)
- return Flush(p, nowPos32);
- ReadMatchDistances(p, &numPairs);
- RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0);
- p->state = kLiteralNextStates[p->state];
- curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset);
- LitEnc_Encode(&p->rc, p->litProbs, curByte);
- p->additionalOffset--;
- nowPos32++;
- }
-
- if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0)
- for (;;)
- {
- UInt32 pos, len, posState;
-
- if (p->fastMode)
- len = GetOptimumFast(p, &pos);
- else
- len = GetOptimum(p, nowPos32, &pos);
-
- #ifdef SHOW_STAT2
- printf("\n pos = %4X, len = %d pos = %d", nowPos32, len, pos);
- #endif
-
- posState = nowPos32 & p->pbMask;
- if (len == 1 && pos == (UInt32)-1)
- {
- Byte curByte;
- CLzmaProb *probs;
- const Byte *data;
-
- RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0);
- data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
- curByte = *data;
- probs = LIT_PROBS(nowPos32, *(data - 1));
- if (IsCharState(p->state))
- LitEnc_Encode(&p->rc, probs, curByte);
- else
- LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1));
- p->state = kLiteralNextStates[p->state];
- }
- else
- {
- RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);
- if (pos < LZMA_NUM_REPS)
- {
- RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1);
- if (pos == 0)
- {
- RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0);
- RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1));
- }
- else
- {
- UInt32 distance = p->reps[pos];
- RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1);
- if (pos == 1)
- RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0);
- else
- {
- RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1);
- RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2);
- if (pos == 3)
- p->reps[3] = p->reps[2];
- p->reps[2] = p->reps[1];
- }
- p->reps[1] = p->reps[0];
- p->reps[0] = distance;
- }
- if (len == 1)
- p->state = kShortRepNextStates[p->state];
- else
- {
- LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
- p->state = kRepNextStates[p->state];
- }
- }
- else
- {
- UInt32 posSlot;
- RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);
- p->state = kMatchNextStates[p->state];
- LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
- pos -= LZMA_NUM_REPS;
- GetPosSlot(pos, posSlot);
- RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot);
-
- if (posSlot >= kStartPosModelIndex)
- {
- UInt32 footerBits = ((posSlot >> 1) - 1);
- UInt32 base = ((2 | (posSlot & 1)) << footerBits);
- UInt32 posReduced = pos - base;
-
- if (posSlot < kEndPosModelIndex)
- RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced);
- else
- {
- RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits);
- RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask);
- p->alignPriceCount++;
- }
- }
- p->reps[3] = p->reps[2];
- p->reps[2] = p->reps[1];
- p->reps[1] = p->reps[0];
- p->reps[0] = pos;
- p->matchPriceCount++;
- }
- }
- p->additionalOffset -= len;
- nowPos32 += len;
- if (p->additionalOffset == 0)
- {
- UInt32 processed;
- if (!p->fastMode)
- {
- if (p->matchPriceCount >= (1 << 7))
- FillDistancesPrices(p);
- if (p->alignPriceCount >= kAlignTableSize)
- FillAlignPrices(p);
- }
- if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)
- break;
- processed = nowPos32 - startPos32;
- if (useLimits)
- {
- if (processed + kNumOpts + 300 >= maxUnpackSize ||
- RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize)
- break;
- }
- else if (processed >= (1 << 15))
- {
- p->nowPos64 += nowPos32 - startPos32;
- return CheckErrors(p);
- }
- }
- }
- p->nowPos64 += nowPos32 - startPos32;
- return Flush(p, nowPos32);
-}
-
-#define kBigHashDicLimit ((UInt32)1 << 24)
-
-static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
-{
- UInt32 beforeSize = kNumOpts;
- if (!RangeEnc_Alloc(&p->rc, alloc))
- return SZ_ERROR_MEM;
- #ifndef _7ZIP_ST
- p->mtMode = (p->multiThread && !p->fastMode && (p->matchFinderBase.btMode != 0));
- #endif
-
- {
- unsigned lclp = p->lc + p->lp;
- if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp)
- {
- LzmaEnc_FreeLits(p, alloc);
- p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));
- p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));
- if (p->litProbs == 0 || p->saveState.litProbs == 0)
- {
- LzmaEnc_FreeLits(p, alloc);
- return SZ_ERROR_MEM;
- }
- p->lclp = lclp;
- }
- }
-
- p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit);
-
- if (beforeSize + p->dictSize < keepWindowSize)
- beforeSize = keepWindowSize - p->dictSize;
-
- #ifndef _7ZIP_ST
- if (p->mtMode)
- {
- RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig));
- p->matchFinderObj = &p->matchFinderMt;
- MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder);
- }
- else
- #endif
- {
- if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig))
- return SZ_ERROR_MEM;
- p->matchFinderObj = &p->matchFinderBase;
- MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder);
- }
- return SZ_OK;
-}
-
-void LzmaEnc_Init(CLzmaEnc *p)
-{
- UInt32 i;
- p->state = 0;
- for (i = 0 ; i < LZMA_NUM_REPS; i++)
- p->reps[i] = 0;
-
- RangeEnc_Init(&p->rc);
-
-
- for (i = 0; i < kNumStates; i++)
- {
- UInt32 j;
- for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++)
- {
- p->isMatch[i][j] = kProbInitValue;
- p->isRep0Long[i][j] = kProbInitValue;
- }
- p->isRep[i] = kProbInitValue;
- p->isRepG0[i] = kProbInitValue;
- p->isRepG1[i] = kProbInitValue;
- p->isRepG2[i] = kProbInitValue;
- }
-
- {
- UInt32 num = 0x300 << (p->lp + p->lc);
- for (i = 0; i < num; i++)
- p->litProbs[i] = kProbInitValue;
- }
-
- {
- for (i = 0; i < kNumLenToPosStates; i++)
- {
- CLzmaProb *probs = p->posSlotEncoder[i];
- UInt32 j;
- for (j = 0; j < (1 << kNumPosSlotBits); j++)
- probs[j] = kProbInitValue;
- }
- }
- {
- for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++)
- p->posEncoders[i] = kProbInitValue;
- }
-
- LenEnc_Init(&p->lenEnc.p);
- LenEnc_Init(&p->repLenEnc.p);
-
- for (i = 0; i < (1 << kNumAlignBits); i++)
- p->posAlignEncoder[i] = kProbInitValue;
-
- p->optimumEndIndex = 0;
- p->optimumCurrentIndex = 0;
- p->additionalOffset = 0;
-
- p->pbMask = (1 << p->pb) - 1;
- p->lpMask = (1 << p->lp) - 1;
-}
-
-void LzmaEnc_InitPrices(CLzmaEnc *p)
-{
- if (!p->fastMode)
- {
- FillDistancesPrices(p);
- FillAlignPrices(p);
- }
-
- p->lenEnc.tableSize =
- p->repLenEnc.tableSize =
- p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN;
- LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices);
- LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices);
-}
-
-static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
-{
- UInt32 i;
- for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++)
- if (p->dictSize <= ((UInt32)1 << i))
- break;
- p->distTableSize = i * 2;
-
- p->finished = False;
- p->result = SZ_OK;
- RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig));
- LzmaEnc_Init(p);
- LzmaEnc_InitPrices(p);
- p->nowPos64 = 0;
- return SZ_OK;
-}
-
-static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream,
- ISzAlloc *alloc, ISzAlloc *allocBig)
-{
- CLzmaEnc *p = (CLzmaEnc *)pp;
- p->matchFinderBase.stream = inStream;
- p->needInit = 1;
- p->rc.outStream = outStream;
- return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);
-}
-
-SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,
- ISeqInStream *inStream, UInt32 keepWindowSize,
- ISzAlloc *alloc, ISzAlloc *allocBig)
-{
- CLzmaEnc *p = (CLzmaEnc *)pp;
- p->matchFinderBase.stream = inStream;
- p->needInit = 1;
- return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
-}
-
-static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)
-{
- p->matchFinderBase.directInput = 1;
- p->matchFinderBase.bufferBase = (Byte *)src;
- p->matchFinderBase.directInputRem = srcLen;
-}
-
-SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
- UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
-{
- CLzmaEnc *p = (CLzmaEnc *)pp;
- LzmaEnc_SetInputBuf(p, src, srcLen);
- p->needInit = 1;
-
- return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
-}
-
-void LzmaEnc_Finish(CLzmaEncHandle pp)
-{
- #ifndef _7ZIP_ST
- CLzmaEnc *p = (CLzmaEnc *)pp;
- if (p->mtMode)
- MatchFinderMt_ReleaseStream(&p->matchFinderMt);
- #else
- pp = pp;
- #endif
-}
-
-typedef struct
-{
- ISeqOutStream funcTable;
- Byte *data;
- SizeT rem;
- Bool overflow;
-} CSeqOutStreamBuf;
-
-static size_t MyWrite(void *pp, const void *data, size_t size)
-{
- CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp;
- if (p->rem < size)
- {
- size = p->rem;
- p->overflow = True;
- }
- memcpy(p->data, data, size);
- p->rem -= size;
- p->data += size;
- return size;
-}
-
-
-UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
-{
- const CLzmaEnc *p = (CLzmaEnc *)pp;
- return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
-}
-
-const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)
-{
- const CLzmaEnc *p = (CLzmaEnc *)pp;
- return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
-}
-
-SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
- Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)
-{
- CLzmaEnc *p = (CLzmaEnc *)pp;
- UInt64 nowPos64;
- SRes res;
- CSeqOutStreamBuf outStream;
-
- outStream.funcTable.Write = MyWrite;
- outStream.data = dest;
- outStream.rem = *destLen;
- outStream.overflow = False;
-
- p->writeEndMark = False;
- p->finished = False;
- p->result = SZ_OK;
-
- if (reInit)
- LzmaEnc_Init(p);
- LzmaEnc_InitPrices(p);
- nowPos64 = p->nowPos64;
- RangeEnc_Init(&p->rc);
- p->rc.outStream = &outStream.funcTable;
-
- res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);
-
- *unpackSize = (UInt32)(p->nowPos64 - nowPos64);
- *destLen -= outStream.rem;
- if (outStream.overflow)
- return SZ_ERROR_OUTPUT_EOF;
-
- return res;
-}
-
-static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)
-{
- SRes res = SZ_OK;
-
- #ifndef _7ZIP_ST
- Byte allocaDummy[0x300];
- allocaDummy[0] = 0;
- allocaDummy[1] = allocaDummy[0];
- #endif
-
- for (;;)
- {
- res = LzmaEnc_CodeOneBlock(p, False, 0, 0);
- if (res != SZ_OK || p->finished != 0)
- break;
- if (progress != 0)
- {
- res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc));
- if (res != SZ_OK)
- {
- res = SZ_ERROR_PROGRESS;
- break;
- }
- }
- }
- LzmaEnc_Finish(p);
- return res;
-}
-
-SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,
- ISzAlloc *alloc, ISzAlloc *allocBig)
-{
- RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));
- return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);
-}
-
-SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)
-{
- CLzmaEnc *p = (CLzmaEnc *)pp;
- int i;
- UInt32 dictSize = p->dictSize;
- if (*size < LZMA_PROPS_SIZE)
- return SZ_ERROR_PARAM;
- *size = LZMA_PROPS_SIZE;
- props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc);
-
- for (i = 11; i <= 30; i++)
- {
- if (dictSize <= ((UInt32)2 << i))
- {
- dictSize = (2 << i);
- break;
- }
- if (dictSize <= ((UInt32)3 << i))
- {
- dictSize = (3 << i);
- break;
- }
- }
-
- for (i = 0; i < 4; i++)
- props[1 + i] = (Byte)(dictSize >> (8 * i));
- return SZ_OK;
-}
-
-SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
- int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
-{
- SRes res;
- CLzmaEnc *p = (CLzmaEnc *)pp;
-
- CSeqOutStreamBuf outStream;
-
- LzmaEnc_SetInputBuf(p, src, srcLen);
-
- outStream.funcTable.Write = MyWrite;
- outStream.data = dest;
- outStream.rem = *destLen;
- outStream.overflow = False;
-
- p->writeEndMark = writeEndMark;
-
- p->rc.outStream = &outStream.funcTable;
- res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig);
- if (res == SZ_OK)
- res = LzmaEnc_Encode2(p, progress);
-
- *destLen -= outStream.rem;
- if (outStream.overflow)
- return SZ_ERROR_OUTPUT_EOF;
- return res;
-}
-
-SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
- const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
-{
- CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);
- SRes res;
- if (p == 0)
- return SZ_ERROR_MEM;
-
- res = LzmaEnc_SetProps(p, props);
- if (res == SZ_OK)
- {
- res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);
- if (res == SZ_OK)
- res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,
- writeEndMark, progress, alloc, allocBig);
- }
-
- LzmaEnc_Destroy(p, alloc, allocBig);
- return res;
-}
diff --git a/src/libs/7zip/win/C/LzmaEnc.h b/src/libs/7zip/win/C/LzmaEnc.h
deleted file mode 100644
index cffe220bb..000000000
--- a/src/libs/7zip/win/C/LzmaEnc.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* LzmaEnc.h -- LZMA Encoder
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __LZMA_ENC_H
-#define __LZMA_ENC_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-#define LZMA_PROPS_SIZE 5
-
-typedef struct _CLzmaEncProps
-{
- int level; /* 0 <= level <= 9 */
- UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version
- (1 << 12) <= dictSize <= (1 << 30) for 64-bit version
- default = (1 << 24) */
- UInt64 reduceSize; /* estimated size of data that will be compressed. default = 0xFFFFFFFF.
- Encoder uses this value to reduce dictionary size */
- int lc; /* 0 <= lc <= 8, default = 3 */
- int lp; /* 0 <= lp <= 4, default = 0 */
- int pb; /* 0 <= pb <= 4, default = 2 */
- int algo; /* 0 - fast, 1 - normal, default = 1 */
- int fb; /* 5 <= fb <= 273, default = 32 */
- int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */
- int numHashBytes; /* 2, 3 or 4, default = 4 */
- UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */
- unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */
- int numThreads; /* 1 or 2, default = 2 */
-} CLzmaEncProps;
-
-void LzmaEncProps_Init(CLzmaEncProps *p);
-void LzmaEncProps_Normalize(CLzmaEncProps *p);
-UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);
-
-
-/* ---------- CLzmaEncHandle Interface ---------- */
-
-/* LzmaEnc_* functions can return the following exit codes:
-Returns:
- SZ_OK - OK
- SZ_ERROR_MEM - Memory allocation error
- SZ_ERROR_PARAM - Incorrect paramater in props
- SZ_ERROR_WRITE - Write callback error.
- SZ_ERROR_PROGRESS - some break from progress callback
- SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
-*/
-
-typedef void * CLzmaEncHandle;
-
-CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc);
-void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);
-SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
-SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
-SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,
- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
-SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
- int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
-
-/* ---------- One Call Interface ---------- */
-
-/* LzmaEncode
-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)
-*/
-
-SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
- const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/MtCoder.c b/src/libs/7zip/win/C/MtCoder.c
deleted file mode 100644
index 3d4dd2d14..000000000
--- a/src/libs/7zip/win/C/MtCoder.c
+++ /dev/null
@@ -1,329 +0,0 @@
-/* MtCoder.c -- Multi-thread Coder
-2010-09-24 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include <stdio.h>
-
-#include "MtCoder.h"
-
-void LoopThread_Construct(CLoopThread *p)
-{
- Thread_Construct(&p->thread);
- Event_Construct(&p->startEvent);
- Event_Construct(&p->finishedEvent);
-}
-
-void LoopThread_Close(CLoopThread *p)
-{
- Thread_Close(&p->thread);
- Event_Close(&p->startEvent);
- Event_Close(&p->finishedEvent);
-}
-
-static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE LoopThreadFunc(void *pp)
-{
- CLoopThread *p = (CLoopThread *)pp;
- for (;;)
- {
- if (Event_Wait(&p->startEvent) != 0)
- return SZ_ERROR_THREAD;
- if (p->stop)
- return 0;
- p->res = p->func(p->param);
- if (Event_Set(&p->finishedEvent) != 0)
- return SZ_ERROR_THREAD;
- }
-}
-
-WRes LoopThread_Create(CLoopThread *p)
-{
- p->stop = 0;
- RINOK(AutoResetEvent_CreateNotSignaled(&p->startEvent));
- RINOK(AutoResetEvent_CreateNotSignaled(&p->finishedEvent));
- return Thread_Create(&p->thread, LoopThreadFunc, p);
-}
-
-WRes LoopThread_StopAndWait(CLoopThread *p)
-{
- p->stop = 1;
- if (Event_Set(&p->startEvent) != 0)
- return SZ_ERROR_THREAD;
- return Thread_Wait(&p->thread);
-}
-
-WRes LoopThread_StartSubThread(CLoopThread *p) { return Event_Set(&p->startEvent); }
-WRes LoopThread_WaitSubThread(CLoopThread *p) { return Event_Wait(&p->finishedEvent); }
-
-static SRes Progress(ICompressProgress *p, UInt64 inSize, UInt64 outSize)
-{
- return (p && p->Progress(p, inSize, outSize) != SZ_OK) ? SZ_ERROR_PROGRESS : SZ_OK;
-}
-
-static void MtProgress_Init(CMtProgress *p, ICompressProgress *progress)
-{
- unsigned i;
- for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++)
- p->inSizes[i] = p->outSizes[i] = 0;
- p->totalInSize = p->totalOutSize = 0;
- p->progress = progress;
- p->res = SZ_OK;
-}
-
-static void MtProgress_Reinit(CMtProgress *p, unsigned index)
-{
- p->inSizes[index] = 0;
- p->outSizes[index] = 0;
-}
-
-#define UPDATE_PROGRESS(size, prev, total) \
- if (size != (UInt64)(Int64)-1) { total += size - prev; prev = size; }
-
-SRes MtProgress_Set(CMtProgress *p, unsigned index, UInt64 inSize, UInt64 outSize)
-{
- SRes res;
- CriticalSection_Enter(&p->cs);
- UPDATE_PROGRESS(inSize, p->inSizes[index], p->totalInSize)
- UPDATE_PROGRESS(outSize, p->outSizes[index], p->totalOutSize)
- if (p->res == SZ_OK)
- p->res = Progress(p->progress, p->totalInSize, p->totalOutSize);
- res = p->res;
- CriticalSection_Leave(&p->cs);
- return res;
-}
-
-static void MtProgress_SetError(CMtProgress *p, SRes res)
-{
- CriticalSection_Enter(&p->cs);
- if (p->res == SZ_OK)
- p->res = res;
- CriticalSection_Leave(&p->cs);
-}
-
-static void MtCoder_SetError(CMtCoder* p, SRes res)
-{
- CriticalSection_Enter(&p->cs);
- if (p->res == SZ_OK)
- p->res = res;
- CriticalSection_Leave(&p->cs);
-}
-
-/* ---------- MtThread ---------- */
-
-void CMtThread_Construct(CMtThread *p, CMtCoder *mtCoder)
-{
- p->mtCoder = mtCoder;
- p->outBuf = 0;
- p->inBuf = 0;
- Event_Construct(&p->canRead);
- Event_Construct(&p->canWrite);
- LoopThread_Construct(&p->thread);
-}
-
-#define RINOK_THREAD(x) { if((x) != 0) return SZ_ERROR_THREAD; }
-
-static void CMtThread_CloseEvents(CMtThread *p)
-{
- Event_Close(&p->canRead);
- Event_Close(&p->canWrite);
-}
-
-static void CMtThread_Destruct(CMtThread *p)
-{
- CMtThread_CloseEvents(p);
-
- if (Thread_WasCreated(&p->thread.thread))
- {
- LoopThread_StopAndWait(&p->thread);
- LoopThread_Close(&p->thread);
- }
-
- if (p->mtCoder->alloc)
- IAlloc_Free(p->mtCoder->alloc, p->outBuf);
- p->outBuf = 0;
-
- if (p->mtCoder->alloc)
- IAlloc_Free(p->mtCoder->alloc, p->inBuf);
- p->inBuf = 0;
-}
-
-#define MY_BUF_ALLOC(buf, size, newSize) \
- if (buf == 0 || size != newSize) \
- { IAlloc_Free(p->mtCoder->alloc, buf); \
- size = newSize; buf = (Byte *)IAlloc_Alloc(p->mtCoder->alloc, size); \
- if (buf == 0) return SZ_ERROR_MEM; }
-
-static SRes CMtThread_Prepare(CMtThread *p)
-{
- MY_BUF_ALLOC(p->inBuf, p->inBufSize, p->mtCoder->blockSize)
- MY_BUF_ALLOC(p->outBuf, p->outBufSize, p->mtCoder->destBlockSize)
-
- p->stopReading = False;
- p->stopWriting = False;
- RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canRead));
- RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canWrite));
-
- return SZ_OK;
-}
-
-static SRes FullRead(ISeqInStream *stream, Byte *data, size_t *processedSize)
-{
- size_t size = *processedSize;
- *processedSize = 0;
- while (size != 0)
- {
- size_t curSize = size;
- SRes res = stream->Read(stream, data, &curSize);
- *processedSize += curSize;
- data += curSize;
- size -= curSize;
- RINOK(res);
- if (curSize == 0)
- return SZ_OK;
- }
- return SZ_OK;
-}
-
-#define GET_NEXT_THREAD(p) &p->mtCoder->threads[p->index == p->mtCoder->numThreads - 1 ? 0 : p->index + 1]
-
-static SRes MtThread_Process(CMtThread *p, Bool *stop)
-{
- CMtThread *next;
- *stop = True;
- if (Event_Wait(&p->canRead) != 0)
- return SZ_ERROR_THREAD;
-
- next = GET_NEXT_THREAD(p);
-
- if (p->stopReading)
- {
- next->stopReading = True;
- return Event_Set(&next->canRead) == 0 ? SZ_OK : SZ_ERROR_THREAD;
- }
-
- {
- size_t size = p->mtCoder->blockSize;
- size_t destSize = p->outBufSize;
-
- RINOK(FullRead(p->mtCoder->inStream, p->inBuf, &size));
- next->stopReading = *stop = (size != p->mtCoder->blockSize);
- if (Event_Set(&next->canRead) != 0)
- return SZ_ERROR_THREAD;
-
- RINOK(p->mtCoder->mtCallback->Code(p->mtCoder->mtCallback, p->index,
- p->outBuf, &destSize, p->inBuf, size, *stop));
-
- MtProgress_Reinit(&p->mtCoder->mtProgress, p->index);
-
- if (Event_Wait(&p->canWrite) != 0)
- return SZ_ERROR_THREAD;
- if (p->stopWriting)
- return SZ_ERROR_FAIL;
- if (p->mtCoder->outStream->Write(p->mtCoder->outStream, p->outBuf, destSize) != destSize)
- return SZ_ERROR_WRITE;
- return Event_Set(&next->canWrite) == 0 ? SZ_OK : SZ_ERROR_THREAD;
- }
-}
-
-static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE ThreadFunc(void *pp)
-{
- CMtThread *p = (CMtThread *)pp;
- for (;;)
- {
- Bool stop;
- CMtThread *next = GET_NEXT_THREAD(p);
- SRes res = MtThread_Process(p, &stop);
- if (res != SZ_OK)
- {
- MtCoder_SetError(p->mtCoder, res);
- MtProgress_SetError(&p->mtCoder->mtProgress, res);
- next->stopReading = True;
- next->stopWriting = True;
- Event_Set(&next->canRead);
- Event_Set(&next->canWrite);
- return res;
- }
- if (stop)
- return 0;
- }
-}
-
-void MtCoder_Construct(CMtCoder* p)
-{
- unsigned i;
- p->alloc = 0;
- for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++)
- {
- CMtThread *t = &p->threads[i];
- t->index = i;
- CMtThread_Construct(t, p);
- }
- CriticalSection_Init(&p->cs);
- CriticalSection_Init(&p->mtProgress.cs);
-}
-
-void MtCoder_Destruct(CMtCoder* p)
-{
- unsigned i;
- for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++)
- CMtThread_Destruct(&p->threads[i]);
- CriticalSection_Delete(&p->cs);
- CriticalSection_Delete(&p->mtProgress.cs);
-}
-
-SRes MtCoder_Code(CMtCoder *p)
-{
- unsigned i, numThreads = p->numThreads;
- SRes res = SZ_OK;
- p->res = SZ_OK;
-
- MtProgress_Init(&p->mtProgress, p->progress);
-
- for (i = 0; i < numThreads; i++)
- {
- RINOK(CMtThread_Prepare(&p->threads[i]));
- }
-
- for (i = 0; i < numThreads; i++)
- {
- CMtThread *t = &p->threads[i];
- CLoopThread *lt = &t->thread;
-
- if (!Thread_WasCreated(&lt->thread))
- {
- lt->func = ThreadFunc;
- lt->param = t;
-
- if (LoopThread_Create(lt) != SZ_OK)
- {
- res = SZ_ERROR_THREAD;
- break;
- }
- }
- }
-
- if (res == SZ_OK)
- {
- unsigned j;
- for (i = 0; i < numThreads; i++)
- {
- CMtThread *t = &p->threads[i];
- if (LoopThread_StartSubThread(&t->thread) != SZ_OK)
- {
- res = SZ_ERROR_THREAD;
- p->threads[0].stopReading = True;
- break;
- }
- }
-
- Event_Set(&p->threads[0].canWrite);
- Event_Set(&p->threads[0].canRead);
-
- for (j = 0; j < i; j++)
- LoopThread_WaitSubThread(&p->threads[j].thread);
- }
-
- for (i = 0; i < numThreads; i++)
- CMtThread_CloseEvents(&p->threads[i]);
- return (res == SZ_OK) ? p->res : res;
-}
diff --git a/src/libs/7zip/win/C/MtCoder.h b/src/libs/7zip/win/C/MtCoder.h
deleted file mode 100644
index e2cbdc3ab..000000000
--- a/src/libs/7zip/win/C/MtCoder.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* MtCoder.h -- Multi-thread Coder
-2009-11-19 : Igor Pavlov : Public domain */
-
-#ifndef __MT_CODER_H
-#define __MT_CODER_H
-
-#include "Threads.h"
-
-EXTERN_C_BEGIN
-
-typedef struct
-{
- CThread thread;
- CAutoResetEvent startEvent;
- CAutoResetEvent finishedEvent;
- int stop;
-
- THREAD_FUNC_TYPE func;
- LPVOID param;
- THREAD_FUNC_RET_TYPE res;
-} CLoopThread;
-
-void LoopThread_Construct(CLoopThread *p);
-void LoopThread_Close(CLoopThread *p);
-WRes LoopThread_Create(CLoopThread *p);
-WRes LoopThread_StopAndWait(CLoopThread *p);
-WRes LoopThread_StartSubThread(CLoopThread *p);
-WRes LoopThread_WaitSubThread(CLoopThread *p);
-
-#ifndef _7ZIP_ST
-#define NUM_MT_CODER_THREADS_MAX 32
-#else
-#define NUM_MT_CODER_THREADS_MAX 1
-#endif
-
-typedef struct
-{
- UInt64 totalInSize;
- UInt64 totalOutSize;
- ICompressProgress *progress;
- SRes res;
- CCriticalSection cs;
- UInt64 inSizes[NUM_MT_CODER_THREADS_MAX];
- UInt64 outSizes[NUM_MT_CODER_THREADS_MAX];
-} CMtProgress;
-
-SRes MtProgress_Set(CMtProgress *p, unsigned index, UInt64 inSize, UInt64 outSize);
-
-struct _CMtCoder;
-
-typedef struct
-{
- struct _CMtCoder *mtCoder;
- Byte *outBuf;
- size_t outBufSize;
- Byte *inBuf;
- size_t inBufSize;
- unsigned index;
- CLoopThread thread;
-
- Bool stopReading;
- Bool stopWriting;
- CAutoResetEvent canRead;
- CAutoResetEvent canWrite;
-} CMtThread;
-
-typedef struct
-{
- SRes (*Code)(void *p, unsigned index, Byte *dest, size_t *destSize,
- const Byte *src, size_t srcSize, int finished);
-} IMtCoderCallback;
-
-typedef struct _CMtCoder
-{
- size_t blockSize;
- size_t destBlockSize;
- unsigned numThreads;
-
- ISeqInStream *inStream;
- ISeqOutStream *outStream;
- ICompressProgress *progress;
- ISzAlloc *alloc;
-
- IMtCoderCallback *mtCallback;
- CCriticalSection cs;
- SRes res;
-
- CMtProgress mtProgress;
- CMtThread threads[NUM_MT_CODER_THREADS_MAX];
-} CMtCoder;
-
-void MtCoder_Construct(CMtCoder* p);
-void MtCoder_Destruct(CMtCoder* p);
-SRes MtCoder_Code(CMtCoder *p);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/Precomp.h b/src/libs/7zip/win/C/Precomp.h
deleted file mode 100644
index e8ff8b40e..000000000
--- a/src/libs/7zip/win/C/Precomp.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Precomp.h -- StdAfx
-2013-11-12 : Igor Pavlov : Public domain */
-
-#ifndef __7Z_PRECOMP_H
-#define __7Z_PRECOMP_H
-
-#include "Compiler.h"
-/* #include "7zTypes.h" */
-
-#endif
diff --git a/src/libs/7zip/win/C/RotateDefs.h b/src/libs/7zip/win/C/RotateDefs.h
deleted file mode 100644
index 1b83e5ea1..000000000
--- a/src/libs/7zip/win/C/RotateDefs.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* RotateDefs.h -- Rotate functions
-2013-11-12 : Igor Pavlov : Public domain */
-
-#ifndef __ROTATE_DEFS_H
-#define __ROTATE_DEFS_H
-
-#ifdef _MSC_VER
-
-#include <stdlib.h>
-
-// #if (_MSC_VER >= 1200)
-#pragma intrinsic(_rotl)
-#pragma intrinsic(_rotr)
-// #endif
-
-#define rotlFixed(x, n) _rotl((x), (n))
-#define rotrFixed(x, n) _rotr((x), (n))
-
-#else
-
-#define rotlFixed(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
-#define rotrFixed(x, n) (((x) >> (n)) | ((x) << (32 - (n))))
-
-#endif
-
-#endif
diff --git a/src/libs/7zip/win/C/Sha256.c b/src/libs/7zip/win/C/Sha256.c
deleted file mode 100644
index 10df0874f..000000000
--- a/src/libs/7zip/win/C/Sha256.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* Crypto/Sha256.c -- SHA-256 Hash
-2010-06-11 : Igor Pavlov : Public domain
-This code is based on public domain code from Wei Dai's Crypto++ library. */
-
-#include "Precomp.h"
-
-#include "RotateDefs.h"
-#include "Sha256.h"
-
-/* define it for speed optimization */
-/* #define _SHA256_UNROLL */
-/* #define _SHA256_UNROLL2 */
-
-void Sha256_Init(CSha256 *p)
-{
- p->state[0] = 0x6a09e667;
- p->state[1] = 0xbb67ae85;
- p->state[2] = 0x3c6ef372;
- p->state[3] = 0xa54ff53a;
- p->state[4] = 0x510e527f;
- p->state[5] = 0x9b05688c;
- p->state[6] = 0x1f83d9ab;
- p->state[7] = 0x5be0cd19;
- p->count = 0;
-}
-
-#define S0(x) (rotrFixed(x, 2) ^ rotrFixed(x,13) ^ rotrFixed(x, 22))
-#define S1(x) (rotrFixed(x, 6) ^ rotrFixed(x,11) ^ rotrFixed(x, 25))
-#define s0(x) (rotrFixed(x, 7) ^ rotrFixed(x,18) ^ (x >> 3))
-#define s1(x) (rotrFixed(x,17) ^ rotrFixed(x,19) ^ (x >> 10))
-
-#define blk0(i) (W[i] = data[i])
-#define blk2(i) (W[i&15] += s1(W[(i-2)&15]) + W[(i-7)&15] + s0(W[(i-15)&15]))
-
-#define Ch(x,y,z) (z^(x&(y^z)))
-#define Maj(x,y,z) ((x&y)|(z&(x|y)))
-
-#define a(i) T[(0-(i))&7]
-#define b(i) T[(1-(i))&7]
-#define c(i) T[(2-(i))&7]
-#define d(i) T[(3-(i))&7]
-#define e(i) T[(4-(i))&7]
-#define f(i) T[(5-(i))&7]
-#define g(i) T[(6-(i))&7]
-#define h(i) T[(7-(i))&7]
-
-
-#ifdef _SHA256_UNROLL2
-
-#define R(a,b,c,d,e,f,g,h, i) h += S1(e) + Ch(e,f,g) + K[i+j] + (j?blk2(i):blk0(i));\
- d += h; h += S0(a) + Maj(a, b, c)
-
-#define RX_8(i) \
- R(a,b,c,d,e,f,g,h, i); \
- R(h,a,b,c,d,e,f,g, i+1); \
- R(g,h,a,b,c,d,e,f, i+2); \
- R(f,g,h,a,b,c,d,e, i+3); \
- R(e,f,g,h,a,b,c,d, i+4); \
- R(d,e,f,g,h,a,b,c, i+5); \
- R(c,d,e,f,g,h,a,b, i+6); \
- R(b,c,d,e,f,g,h,a, i+7)
-
-#else
-
-#define R(i) h(i) += S1(e(i)) + Ch(e(i),f(i),g(i)) + K[i+j] + (j?blk2(i):blk0(i));\
- d(i) += h(i); h(i) += S0(a(i)) + Maj(a(i), b(i), c(i))
-
-#ifdef _SHA256_UNROLL
-
-#define RX_8(i) R(i+0); R(i+1); R(i+2); R(i+3); R(i+4); R(i+5); R(i+6); R(i+7);
-
-#endif
-
-#endif
-
-static const UInt32 K[64] = {
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
- 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
- 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
- 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
- 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
- 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
- 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
- 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
- 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
- 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
- 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
- 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
- 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
-};
-
-static void Sha256_Transform(UInt32 *state, const UInt32 *data)
-{
- UInt32 W[16];
- unsigned j;
- #ifdef _SHA256_UNROLL2
- UInt32 a,b,c,d,e,f,g,h;
- a = state[0];
- b = state[1];
- c = state[2];
- d = state[3];
- e = state[4];
- f = state[5];
- g = state[6];
- h = state[7];
- #else
- UInt32 T[8];
- for (j = 0; j < 8; j++)
- T[j] = state[j];
- #endif
-
- for (j = 0; j < 64; j += 16)
- {
- #if defined(_SHA256_UNROLL) || defined(_SHA256_UNROLL2)
- RX_8(0); RX_8(8);
- #else
- unsigned i;
- for (i = 0; i < 16; i++) { R(i); }
- #endif
- }
-
- #ifdef _SHA256_UNROLL2
- state[0] += a;
- state[1] += b;
- state[2] += c;
- state[3] += d;
- state[4] += e;
- state[5] += f;
- state[6] += g;
- state[7] += h;
- #else
- for (j = 0; j < 8; j++)
- state[j] += T[j];
- #endif
-
- /* Wipe variables */
- /* memset(W, 0, sizeof(W)); */
- /* memset(T, 0, sizeof(T)); */
-}
-
-#undef S0
-#undef S1
-#undef s0
-#undef s1
-
-static void Sha256_WriteByteBlock(CSha256 *p)
-{
- UInt32 data32[16];
- unsigned i;
- for (i = 0; i < 16; i++)
- data32[i] =
- ((UInt32)(p->buffer[i * 4 ]) << 24) +
- ((UInt32)(p->buffer[i * 4 + 1]) << 16) +
- ((UInt32)(p->buffer[i * 4 + 2]) << 8) +
- ((UInt32)(p->buffer[i * 4 + 3]));
- Sha256_Transform(p->state, data32);
-}
-
-void Sha256_Update(CSha256 *p, const Byte *data, size_t size)
-{
- UInt32 curBufferPos = (UInt32)p->count & 0x3F;
- while (size > 0)
- {
- p->buffer[curBufferPos++] = *data++;
- p->count++;
- size--;
- if (curBufferPos == 64)
- {
- curBufferPos = 0;
- Sha256_WriteByteBlock(p);
- }
- }
-}
-
-void Sha256_Final(CSha256 *p, Byte *digest)
-{
- UInt64 lenInBits = (p->count << 3);
- UInt32 curBufferPos = (UInt32)p->count & 0x3F;
- unsigned i;
- p->buffer[curBufferPos++] = 0x80;
- while (curBufferPos != (64 - 8))
- {
- curBufferPos &= 0x3F;
- if (curBufferPos == 0)
- Sha256_WriteByteBlock(p);
- p->buffer[curBufferPos++] = 0;
- }
- for (i = 0; i < 8; i++)
- {
- p->buffer[curBufferPos++] = (Byte)(lenInBits >> 56);
- lenInBits <<= 8;
- }
- Sha256_WriteByteBlock(p);
-
- for (i = 0; i < 8; i++)
- {
- *digest++ = (Byte)(p->state[i] >> 24);
- *digest++ = (Byte)(p->state[i] >> 16);
- *digest++ = (Byte)(p->state[i] >> 8);
- *digest++ = (Byte)(p->state[i]);
- }
- Sha256_Init(p);
-}
diff --git a/src/libs/7zip/win/C/Sha256.h b/src/libs/7zip/win/C/Sha256.h
deleted file mode 100644
index 3f455dbc0..000000000
--- a/src/libs/7zip/win/C/Sha256.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Sha256.h -- SHA-256 Hash
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __CRYPTO_SHA256_H
-#define __CRYPTO_SHA256_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-#define SHA256_DIGEST_SIZE 32
-
-typedef struct
-{
- UInt32 state[8];
- UInt64 count;
- Byte buffer[64];
-} CSha256;
-
-void Sha256_Init(CSha256 *p);
-void Sha256_Update(CSha256 *p, const Byte *data, size_t size);
-void Sha256_Final(CSha256 *p, Byte *digest);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/Threads.c b/src/libs/7zip/win/C/Threads.c
deleted file mode 100644
index 5c67a1e26..000000000
--- a/src/libs/7zip/win/C/Threads.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Threads.c -- multithreading library
-2013-11-12 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#ifndef _WIN32_WCE
-#include <process.h>
-#endif
-
-#include "Threads.h"
-
-static WRes GetError()
-{
- DWORD res = GetLastError();
- return (res) ? (WRes)(res) : 1;
-}
-
-WRes HandleToWRes(HANDLE h) { return (h != 0) ? 0 : GetError(); }
-WRes BOOLToWRes(BOOL v) { return v ? 0 : GetError(); }
-
-WRes HandlePtr_Close(HANDLE *p)
-{
- if (*p != NULL)
- if (!CloseHandle(*p))
- return GetError();
- *p = NULL;
- return 0;
-}
-
-WRes Handle_WaitObject(HANDLE h) { return (WRes)WaitForSingleObject(h, INFINITE); }
-
-WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param)
-{
- /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */
-
- #ifdef UNDER_CE
-
- DWORD threadId;
- *p = CreateThread(0, 0, func, param, 0, &threadId);
-
- #else
-
- unsigned threadId;
- *p = (HANDLE)_beginthreadex(NULL, 0, func, param, 0, &threadId);
-
- #endif
-
- /* maybe we must use errno here, but probably GetLastError() is also OK. */
- return HandleToWRes(*p);
-}
-
-WRes Event_Create(CEvent *p, BOOL manualReset, int signaled)
-{
- *p = CreateEvent(NULL, manualReset, (signaled ? TRUE : FALSE), NULL);
- return HandleToWRes(*p);
-}
-
-WRes Event_Set(CEvent *p) { return BOOLToWRes(SetEvent(*p)); }
-WRes Event_Reset(CEvent *p) { return BOOLToWRes(ResetEvent(*p)); }
-
-WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled) { return Event_Create(p, TRUE, signaled); }
-WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled) { return Event_Create(p, FALSE, signaled); }
-WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) { return ManualResetEvent_Create(p, 0); }
-WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) { return AutoResetEvent_Create(p, 0); }
-
-
-WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount)
-{
- *p = CreateSemaphore(NULL, (LONG)initCount, (LONG)maxCount, NULL);
- return HandleToWRes(*p);
-}
-
-static WRes Semaphore_Release(CSemaphore *p, LONG releaseCount, LONG *previousCount)
- { return BOOLToWRes(ReleaseSemaphore(*p, releaseCount, previousCount)); }
-WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num)
- { return Semaphore_Release(p, (LONG)num, NULL); }
-WRes Semaphore_Release1(CSemaphore *p) { return Semaphore_ReleaseN(p, 1); }
-
-WRes CriticalSection_Init(CCriticalSection *p)
-{
- /* InitializeCriticalSection can raise only STATUS_NO_MEMORY exception */
- #ifdef _MSC_VER
- __try
- #endif
- {
- InitializeCriticalSection(p);
- /* InitializeCriticalSectionAndSpinCount(p, 0); */
- }
- #ifdef _MSC_VER
- __except (EXCEPTION_EXECUTE_HANDLER) { return 1; }
- #endif
- return 0;
-}
diff --git a/src/libs/7zip/win/C/Threads.h b/src/libs/7zip/win/C/Threads.h
deleted file mode 100644
index 9b3e1c556..000000000
--- a/src/libs/7zip/win/C/Threads.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Threads.h -- multithreading library
-2013-11-12 : Igor Pavlov : Public domain */
-
-#ifndef __7Z_THREADS_H
-#define __7Z_THREADS_H
-
-#ifdef _WIN32
-#include <windows.h>
-#endif
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-WRes HandlePtr_Close(HANDLE *h);
-WRes Handle_WaitObject(HANDLE h);
-
-typedef HANDLE CThread;
-#define Thread_Construct(p) *(p) = NULL
-#define Thread_WasCreated(p) (*(p) != NULL)
-#define Thread_Close(p) HandlePtr_Close(p)
-#define Thread_Wait(p) Handle_WaitObject(*(p))
-
-typedef
-#ifdef UNDER_CE
- DWORD
-#else
- unsigned
-#endif
- THREAD_FUNC_RET_TYPE;
-
-#define THREAD_FUNC_CALL_TYPE MY_STD_CALL
-#define THREAD_FUNC_DECL THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE
-typedef THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE * THREAD_FUNC_TYPE)(void *);
-WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param);
-
-typedef HANDLE CEvent;
-typedef CEvent CAutoResetEvent;
-typedef CEvent CManualResetEvent;
-#define Event_Construct(p) *(p) = NULL
-#define Event_IsCreated(p) (*(p) != NULL)
-#define Event_Close(p) HandlePtr_Close(p)
-#define Event_Wait(p) Handle_WaitObject(*(p))
-WRes Event_Set(CEvent *p);
-WRes Event_Reset(CEvent *p);
-WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled);
-WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p);
-WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled);
-WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p);
-
-typedef HANDLE CSemaphore;
-#define Semaphore_Construct(p) (*p) = NULL
-#define Semaphore_Close(p) HandlePtr_Close(p)
-#define Semaphore_Wait(p) Handle_WaitObject(*(p))
-WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount);
-WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num);
-WRes Semaphore_Release1(CSemaphore *p);
-
-typedef CRITICAL_SECTION CCriticalSection;
-WRes CriticalSection_Init(CCriticalSection *p);
-#define CriticalSection_Delete(p) DeleteCriticalSection(p)
-#define CriticalSection_Enter(p) EnterCriticalSection(p)
-#define CriticalSection_Leave(p) LeaveCriticalSection(p)
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/Xz.c b/src/libs/7zip/win/C/Xz.c
deleted file mode 100644
index fbc732a8a..000000000
--- a/src/libs/7zip/win/C/Xz.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Xz.c - Xz
-2009-04-15 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "7zCrc.h"
-#include "CpuArch.h"
-#include "Xz.h"
-#include "XzCrc64.h"
-
-Byte XZ_SIG[XZ_SIG_SIZE] = { 0xFD, '7', 'z', 'X', 'Z', 0 };
-Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE] = { 'Y', 'Z' };
-
-unsigned Xz_WriteVarInt(Byte *buf, UInt64 v)
-{
- unsigned i = 0;
- do
- {
- buf[i++] = (Byte)((v & 0x7F) | 0x80);
- v >>= 7;
- }
- while (v != 0);
- buf[i - 1] &= 0x7F;
- return i;
-}
-
-void Xz_Construct(CXzStream *p)
-{
- p->numBlocks = p->numBlocksAllocated = 0;
- p->blocks = 0;
- p->flags = 0;
-}
-
-void Xz_Free(CXzStream *p, ISzAlloc *alloc)
-{
- alloc->Free(alloc, p->blocks);
- p->numBlocks = p->numBlocksAllocated = 0;
- p->blocks = 0;
-}
-
-unsigned XzFlags_GetCheckSize(CXzStreamFlags f)
-{
- int t = XzFlags_GetCheckType(f);
- return (t == 0) ? 0 : (4 << ((t - 1) / 3));
-}
-
-void XzCheck_Init(CXzCheck *p, int mode)
-{
- p->mode = mode;
- switch (mode)
- {
- case XZ_CHECK_CRC32: p->crc = CRC_INIT_VAL; break;
- case XZ_CHECK_CRC64: p->crc64 = CRC64_INIT_VAL; break;
- case XZ_CHECK_SHA256: Sha256_Init(&p->sha); break;
- }
-}
-
-void XzCheck_Update(CXzCheck *p, const void *data, size_t size)
-{
- switch (p->mode)
- {
- case XZ_CHECK_CRC32: p->crc = CrcUpdate(p->crc, data, size); break;
- case XZ_CHECK_CRC64: p->crc64 = Crc64Update(p->crc64, data, size); break;
- case XZ_CHECK_SHA256: Sha256_Update(&p->sha, (const Byte *)data, size); break;
- }
-}
-
-int XzCheck_Final(CXzCheck *p, Byte *digest)
-{
- switch (p->mode)
- {
- case XZ_CHECK_CRC32:
- SetUi32(digest, CRC_GET_DIGEST(p->crc));
- break;
- case XZ_CHECK_CRC64:
- {
- int i;
- UInt64 v = CRC64_GET_DIGEST(p->crc64);
- for (i = 0; i < 8; i++, v >>= 8)
- digest[i] = (Byte)(v & 0xFF);
- break;
- }
- case XZ_CHECK_SHA256:
- Sha256_Final(&p->sha, digest);
- break;
- default:
- return 0;
- }
- return 1;
-}
diff --git a/src/libs/7zip/win/C/Xz.h b/src/libs/7zip/win/C/Xz.h
deleted file mode 100644
index 9268d5bc6..000000000
--- a/src/libs/7zip/win/C/Xz.h
+++ /dev/null
@@ -1,275 +0,0 @@
-/* Xz.h - Xz interface
-2014-12-30 : Igor Pavlov : Public domain */
-
-#ifndef __XZ_H
-#define __XZ_H
-
-#include "Sha256.h"
-
-EXTERN_C_BEGIN
-
-#define XZ_ID_Subblock 1
-#define XZ_ID_Delta 3
-#define XZ_ID_X86 4
-#define XZ_ID_PPC 5
-#define XZ_ID_IA64 6
-#define XZ_ID_ARM 7
-#define XZ_ID_ARMT 8
-#define XZ_ID_SPARC 9
-#define XZ_ID_LZMA2 0x21
-
-unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value);
-unsigned Xz_WriteVarInt(Byte *buf, UInt64 v);
-
-/* ---------- xz block ---------- */
-
-#define XZ_BLOCK_HEADER_SIZE_MAX 1024
-
-#define XZ_NUM_FILTERS_MAX 4
-#define XZ_BF_NUM_FILTERS_MASK 3
-#define XZ_BF_PACK_SIZE (1 << 6)
-#define XZ_BF_UNPACK_SIZE (1 << 7)
-
-#define XZ_FILTER_PROPS_SIZE_MAX 20
-
-typedef struct
-{
- UInt64 id;
- UInt32 propsSize;
- Byte props[XZ_FILTER_PROPS_SIZE_MAX];
-} CXzFilter;
-
-typedef struct
-{
- UInt64 packSize;
- UInt64 unpackSize;
- Byte flags;
- CXzFilter filters[XZ_NUM_FILTERS_MAX];
-} CXzBlock;
-
-#define XzBlock_GetNumFilters(p) (((p)->flags & XZ_BF_NUM_FILTERS_MASK) + 1)
-#define XzBlock_HasPackSize(p) (((p)->flags & XZ_BF_PACK_SIZE) != 0)
-#define XzBlock_HasUnpackSize(p) (((p)->flags & XZ_BF_UNPACK_SIZE) != 0)
-
-SRes XzBlock_Parse(CXzBlock *p, const Byte *header);
-SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, Bool *isIndex, UInt32 *headerSizeRes);
-
-/* ---------- xz stream ---------- */
-
-#define XZ_SIG_SIZE 6
-#define XZ_FOOTER_SIG_SIZE 2
-
-extern Byte XZ_SIG[XZ_SIG_SIZE];
-extern Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE];
-
-#define XZ_STREAM_FLAGS_SIZE 2
-#define XZ_STREAM_CRC_SIZE 4
-
-#define XZ_STREAM_HEADER_SIZE (XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE)
-#define XZ_STREAM_FOOTER_SIZE (XZ_FOOTER_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE + 4)
-
-#define XZ_CHECK_MASK 0xF
-#define XZ_CHECK_NO 0
-#define XZ_CHECK_CRC32 1
-#define XZ_CHECK_CRC64 4
-#define XZ_CHECK_SHA256 10
-
-typedef struct
-{
- int mode;
- UInt32 crc;
- UInt64 crc64;
- CSha256 sha;
-} CXzCheck;
-
-void XzCheck_Init(CXzCheck *p, int mode);
-void XzCheck_Update(CXzCheck *p, const void *data, size_t size);
-int XzCheck_Final(CXzCheck *p, Byte *digest);
-
-typedef UInt16 CXzStreamFlags;
-
-#define XzFlags_IsSupported(f) ((f) <= XZ_CHECK_MASK)
-#define XzFlags_GetCheckType(f) ((f) & XZ_CHECK_MASK)
-#define XzFlags_HasDataCrc32(f) (Xz_GetCheckType(f) == XZ_CHECK_CRC32)
-unsigned XzFlags_GetCheckSize(CXzStreamFlags f);
-
-SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf);
-SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream);
-
-typedef struct
-{
- UInt64 unpackSize;
- UInt64 totalSize;
-} CXzBlockSizes;
-
-typedef struct
-{
- CXzStreamFlags flags;
- size_t numBlocks;
- size_t numBlocksAllocated;
- CXzBlockSizes *blocks;
- UInt64 startOffset;
-} CXzStream;
-
-void Xz_Construct(CXzStream *p);
-void Xz_Free(CXzStream *p, ISzAlloc *alloc);
-
-#define XZ_SIZE_OVERFLOW ((UInt64)(Int64)-1)
-
-UInt64 Xz_GetUnpackSize(const CXzStream *p);
-UInt64 Xz_GetPackSize(const CXzStream *p);
-
-typedef struct
-{
- size_t num;
- size_t numAllocated;
- CXzStream *streams;
-} CXzs;
-
-void Xzs_Construct(CXzs *p);
-void Xzs_Free(CXzs *p, ISzAlloc *alloc);
-SRes Xzs_ReadBackward(CXzs *p, ILookInStream *inStream, Int64 *startOffset, ICompressProgress *progress, ISzAlloc *alloc);
-
-UInt64 Xzs_GetNumBlocks(const CXzs *p);
-UInt64 Xzs_GetUnpackSize(const CXzs *p);
-
-typedef enum
-{
- CODER_STATUS_NOT_SPECIFIED, /* use main error code instead */
- CODER_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */
- CODER_STATUS_NOT_FINISHED, /* stream was not finished */
- CODER_STATUS_NEEDS_MORE_INPUT /* you must provide more input bytes */
-} ECoderStatus;
-
-typedef enum
-{
- CODER_FINISH_ANY, /* finish at any point */
- CODER_FINISH_END /* block must be finished at the end */
-} ECoderFinishMode;
-
-typedef struct _IStateCoder
-{
- void *p;
- void (*Free)(void *p, ISzAlloc *alloc);
- SRes (*SetProps)(void *p, const Byte *props, size_t propSize, ISzAlloc *alloc);
- void (*Init)(void *p);
- SRes (*Code)(void *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
- int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished);
-} IStateCoder;
-
-#define MIXCODER_NUM_FILTERS_MAX 4
-
-typedef struct
-{
- ISzAlloc *alloc;
- Byte *buf;
- int numCoders;
- int finished[MIXCODER_NUM_FILTERS_MAX - 1];
- size_t pos[MIXCODER_NUM_FILTERS_MAX - 1];
- size_t size[MIXCODER_NUM_FILTERS_MAX - 1];
- UInt64 ids[MIXCODER_NUM_FILTERS_MAX];
- IStateCoder coders[MIXCODER_NUM_FILTERS_MAX];
-} CMixCoder;
-
-void MixCoder_Construct(CMixCoder *p, ISzAlloc *alloc);
-void MixCoder_Free(CMixCoder *p);
-void MixCoder_Init(CMixCoder *p);
-SRes MixCoder_SetFromMethod(CMixCoder *p, int coderIndex, UInt64 methodId);
-SRes MixCoder_Code(CMixCoder *p, Byte *dest, SizeT *destLen,
- const Byte *src, SizeT *srcLen, int srcWasFinished,
- ECoderFinishMode finishMode, ECoderStatus *status);
-
-typedef enum
-{
- XZ_STATE_STREAM_HEADER,
- XZ_STATE_STREAM_INDEX,
- XZ_STATE_STREAM_INDEX_CRC,
- XZ_STATE_STREAM_FOOTER,
- XZ_STATE_STREAM_PADDING,
- XZ_STATE_BLOCK_HEADER,
- XZ_STATE_BLOCK,
- XZ_STATE_BLOCK_FOOTER
-} EXzState;
-
-typedef struct
-{
- EXzState state;
- UInt32 pos;
- unsigned alignPos;
- unsigned indexPreSize;
-
- CXzStreamFlags streamFlags;
-
- UInt32 blockHeaderSize;
- UInt64 packSize;
- UInt64 unpackSize;
-
- UInt64 numBlocks;
- UInt64 indexSize;
- UInt64 indexPos;
- UInt64 padSize;
-
- UInt64 numStartedStreams;
- UInt64 numFinishedStreams;
- UInt64 numTotalBlocks;
-
- UInt32 crc;
- CMixCoder decoder;
- CXzBlock block;
- CXzCheck check;
- CSha256 sha;
- Byte shaDigest[SHA256_DIGEST_SIZE];
- Byte buf[XZ_BLOCK_HEADER_SIZE_MAX];
-} CXzUnpacker;
-
-void XzUnpacker_Construct(CXzUnpacker *p, ISzAlloc *alloc);
-void XzUnpacker_Init(CXzUnpacker *p);
-void XzUnpacker_Free(CXzUnpacker *p);
-
-/*
-finishMode:
- It has meaning only if the decoding reaches output limit (*destLen).
- CODER_FINISH_ANY - use smallest number of input bytes
- CODER_FINISH_END - read EndOfStream marker after decoding
-
-Returns:
- SZ_OK
- status:
- CODER_STATUS_NOT_FINISHED,
- CODER_STATUS_NEEDS_MORE_INPUT - maybe there are more xz streams,
- call XzUnpacker_IsStreamWasFinished to check that current stream was finished
- SZ_ERROR_MEM - Memory allocation error
- SZ_ERROR_DATA - Data error
- SZ_ERROR_UNSUPPORTED - Unsupported method or method properties
- SZ_ERROR_CRC - CRC error
- // SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
-
- SZ_ERROR_NO_ARCHIVE - the error with xz Stream Header with one of the following reasons:
- - xz Stream Signature failure
- - CRC32 of xz Stream Header is failed
- - The size of Stream padding is not multiple of four bytes.
- It's possible to get that error, if xz stream was finished and the stream
- contains some another data. In that case you can call XzUnpacker_GetExtraSize()
- function to get real size of xz stream.
-*/
-
-
-SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
- const Byte *src, SizeT *srcLen, ECoderFinishMode finishMode,
- ECoderStatus *status);
-
-Bool XzUnpacker_IsStreamWasFinished(CXzUnpacker *p);
-
-/*
-Call XzUnpacker_GetExtraSize after XzUnpacker_Code function to detect real size of
-xz stream in two cases:
-XzUnpacker_Code() returns:
- res == SZ_OK && status == CODER_STATUS_NEEDS_MORE_INPUT
- res == SZ_ERROR_NO_ARCHIVE
-*/
-
-UInt64 XzUnpacker_GetExtraSize(CXzUnpacker *p);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/XzCrc64.c b/src/libs/7zip/win/C/XzCrc64.c
deleted file mode 100644
index 2c04c0af4..000000000
--- a/src/libs/7zip/win/C/XzCrc64.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* XzCrc64.c -- CRC64 calculation
-2011-06-28 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "XzCrc64.h"
-#include "CpuArch.h"
-
-#define kCrc64Poly UINT64_CONST(0xC96C5795D7870F42)
-
-#ifdef MY_CPU_LE
- #define CRC_NUM_TABLES 4
-#else
- #define CRC_NUM_TABLES 5
- #define CRC_UINT64_SWAP(v) \
- ((v >> 56) | \
- ((v >> 40) & ((UInt64)0xFF << 8)) | \
- ((v >> 24) & ((UInt64)0xFF << 16)) | \
- ((v >> 8) & ((UInt64)0xFF << 24)) | \
- ((v << 8) & ((UInt64)0xFF << 32)) | \
- ((v << 24) & ((UInt64)0xFF << 40)) | \
- ((v << 40) & ((UInt64)0xFF << 48)) | \
- (v << 56))
- UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table);
-#endif
-
-#ifndef MY_CPU_BE
- UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table);
-#endif
-
-typedef UInt64 (MY_FAST_CALL *CRC_FUNC)(UInt64 v, const void *data, size_t size, const UInt64 *table);
-
-static CRC_FUNC g_Crc64Update;
-UInt64 g_Crc64Table[256 * CRC_NUM_TABLES];
-
-UInt64 MY_FAST_CALL Crc64Update(UInt64 v, const void *data, size_t size)
-{
- return g_Crc64Update(v, data, size, g_Crc64Table);
-}
-
-UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size)
-{
- return g_Crc64Update(CRC64_INIT_VAL, data, size, g_Crc64Table) ^ CRC64_INIT_VAL;
-}
-
-void MY_FAST_CALL Crc64GenerateTable()
-{
- UInt32 i;
- for (i = 0; i < 256; i++)
- {
- UInt64 r = i;
- unsigned j;
- for (j = 0; j < 8; j++)
- r = (r >> 1) ^ (kCrc64Poly & ~((r & 1) - 1));
- g_Crc64Table[i] = r;
- }
- for (; i < 256 * CRC_NUM_TABLES; i++)
- {
- UInt64 r = g_Crc64Table[i - 256];
- g_Crc64Table[i] = g_Crc64Table[r & 0xFF] ^ (r >> 8);
- }
-
- #ifdef MY_CPU_LE
-
- g_Crc64Update = XzCrc64UpdateT4;
-
-
-
-
-
-
- #else
- {
- #ifndef MY_CPU_BE
- UInt32 k = 1;
- if (*(const Byte *)&k == 1)
- g_Crc64Update = XzCrc64UpdateT4;
- else
- #endif
- {
- for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--)
- {
- UInt64 x = g_Crc64Table[i - 256];
- g_Crc64Table[i] = CRC_UINT64_SWAP(x);
- }
- g_Crc64Update = XzCrc64UpdateT1_BeT4;
- }
- }
- #endif
-}
diff --git a/src/libs/7zip/win/C/XzCrc64.h b/src/libs/7zip/win/C/XzCrc64.h
deleted file mode 100644
index 08dbc330c..000000000
--- a/src/libs/7zip/win/C/XzCrc64.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* XzCrc64.h -- CRC64 calculation
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __XZ_CRC64_H
-#define __XZ_CRC64_H
-
-#include <stddef.h>
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-extern UInt64 g_Crc64Table[];
-
-void MY_FAST_CALL Crc64GenerateTable(void);
-
-#define CRC64_INIT_VAL UINT64_CONST(0xFFFFFFFFFFFFFFFF)
-#define CRC64_GET_DIGEST(crc) ((crc) ^ CRC64_INIT_VAL)
-#define CRC64_UPDATE_BYTE(crc, b) (g_Crc64Table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))
-
-UInt64 MY_FAST_CALL Crc64Update(UInt64 crc, const void *data, size_t size);
-UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/XzCrc64Opt.c b/src/libs/7zip/win/C/XzCrc64Opt.c
deleted file mode 100644
index dccae1c19..000000000
--- a/src/libs/7zip/win/C/XzCrc64Opt.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* XzCrc64Opt.c -- CRC64 calculation
-2011-06-28 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "CpuArch.h"
-
-#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))
-
-#ifndef MY_CPU_BE
-
-UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table)
-{
- const Byte *p = (const Byte *)data;
- for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)
- v = CRC_UPDATE_BYTE_2(v, *p);
- for (; size >= 4; size -= 4, p += 4)
- {
- UInt32 d = (UInt32)v ^ *(const UInt32 *)p;
- v = (v >> 32) ^
- table[0x300 + ((d ) & 0xFF)] ^
- table[0x200 + ((d >> 8) & 0xFF)] ^
- table[0x100 + ((d >> 16) & 0xFF)] ^
- table[0x000 + ((d >> 24))];
- }
- for (; size > 0; size--, p++)
- v = CRC_UPDATE_BYTE_2(v, *p);
- return v;
-}
-
-#endif
-
-
-#ifndef MY_CPU_LE
-
-#define CRC_UINT64_SWAP(v) \
- ((v >> 56) | \
- ((v >> 40) & ((UInt64)0xFF << 8)) | \
- ((v >> 24) & ((UInt64)0xFF << 16)) | \
- ((v >> 8) & ((UInt64)0xFF << 24)) | \
- ((v << 8) & ((UInt64)0xFF << 32)) | \
- ((v << 24) & ((UInt64)0xFF << 40)) | \
- ((v << 40) & ((UInt64)0xFF << 48)) | \
- (v << 56))
-
-UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table)
-{
- const Byte *p = (const Byte *)data;
- for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)
- v = CRC_UPDATE_BYTE_2(v, *p);
- v = CRC_UINT64_SWAP(v);
- table += 0x100;
- for (; size >= 4; size -= 4, p += 4)
- {
- UInt32 d = (UInt32)(v >> 32) ^ *(const UInt32 *)p;
- v = (v << 32) ^
- table[0x000 + ((d ) & 0xFF)] ^
- table[0x100 + ((d >> 8) & 0xFF)] ^
- table[0x200 + ((d >> 16) & 0xFF)] ^
- table[0x300 + ((d >> 24))];
- }
- table -= 0x100;
- v = CRC_UINT64_SWAP(v);
- for (; size > 0; size--, p++)
- v = CRC_UPDATE_BYTE_2(v, *p);
- return v;
-}
-
-#endif
diff --git a/src/libs/7zip/win/C/XzDec.c b/src/libs/7zip/win/C/XzDec.c
deleted file mode 100644
index 6eef587d3..000000000
--- a/src/libs/7zip/win/C/XzDec.c
+++ /dev/null
@@ -1,909 +0,0 @@
-/* XzDec.c -- Xz Decode
-2014-12-30 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-/* #define XZ_DUMP */
-
-#ifdef XZ_DUMP
-#include <stdio.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "7zCrc.h"
-#include "Alloc.h"
-#include "Bra.h"
-#include "CpuArch.h"
-#include "Delta.h"
-#include "Lzma2Dec.h"
-
-#ifdef USE_SUBBLOCK
-#include "Bcj3Dec.c"
-#include "SbDec.c"
-#endif
-
-#include "Xz.h"
-
-#define XZ_CHECK_SIZE_MAX 64
-
-#define CODER_BUF_SIZE (1 << 17)
-
-unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value)
-{
- int i, limit;
- *value = 0;
- limit = (maxSize > 9) ? 9 : (int)maxSize;
-
- for (i = 0; i < limit;)
- {
- Byte b = p[i];
- *value |= (UInt64)(b & 0x7F) << (7 * i++);
- if ((b & 0x80) == 0)
- return (b == 0 && i != 1) ? 0 : i;
- }
- return 0;
-}
-
-/* ---------- BraState ---------- */
-
-#define BRA_BUF_SIZE (1 << 14)
-
-typedef struct
-{
- size_t bufPos;
- size_t bufConv;
- size_t bufTotal;
-
- UInt32 methodId;
- int encodeMode;
- UInt32 delta;
- UInt32 ip;
- UInt32 x86State;
- Byte deltaState[DELTA_STATE_SIZE];
-
- Byte buf[BRA_BUF_SIZE];
-} CBraState;
-
-void BraState_Free(void *pp, ISzAlloc *alloc)
-{
- alloc->Free(alloc, pp);
-}
-
-SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc)
-{
- CBraState *p = ((CBraState *)pp);
- alloc = alloc;
- p->ip = 0;
- if (p->methodId == XZ_ID_Delta)
- {
- if (propSize != 1)
- return SZ_ERROR_UNSUPPORTED;
- p->delta = (unsigned)props[0] + 1;
- }
- else
- {
- if (propSize == 4)
- {
- UInt32 v = GetUi32(props);
- switch(p->methodId)
- {
- case XZ_ID_PPC:
- case XZ_ID_ARM:
- case XZ_ID_SPARC:
- if ((v & 3) != 0)
- return SZ_ERROR_UNSUPPORTED;
- break;
- case XZ_ID_ARMT:
- if ((v & 1) != 0)
- return SZ_ERROR_UNSUPPORTED;
- break;
- case XZ_ID_IA64:
- if ((v & 0xF) != 0)
- return SZ_ERROR_UNSUPPORTED;
- break;
- }
- p->ip = v;
- }
- else if (propSize != 0)
- return SZ_ERROR_UNSUPPORTED;
- }
- return SZ_OK;
-}
-
-void BraState_Init(void *pp)
-{
- CBraState *p = ((CBraState *)pp);
- p->bufPos = p->bufConv = p->bufTotal = 0;
- x86_Convert_Init(p->x86State);
- if (p->methodId == XZ_ID_Delta)
- Delta_Init(p->deltaState);
-}
-
-#define CASE_BRA_CONV(isa) case XZ_ID_ ## isa: p->bufConv = isa ## _Convert(p->buf, p->bufTotal, p->ip, p->encodeMode); break;
-
-static SRes BraState_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
- int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished)
-{
- CBraState *p = ((CBraState *)pp);
- SizeT destLenOrig = *destLen;
- SizeT srcLenOrig = *srcLen;
- *destLen = 0;
- *srcLen = 0;
- finishMode = finishMode;
- *wasFinished = 0;
- while (destLenOrig > 0)
- {
- if (p->bufPos != p->bufConv)
- {
- size_t curSize = p->bufConv - p->bufPos;
- if (curSize > destLenOrig)
- curSize = destLenOrig;
- memcpy(dest, p->buf + p->bufPos, curSize);
- p->bufPos += curSize;
- *destLen += curSize;
- dest += curSize;
- destLenOrig -= curSize;
- continue;
- }
- p->bufTotal -= p->bufPos;
- memmove(p->buf, p->buf + p->bufPos, p->bufTotal);
- p->bufPos = 0;
- p->bufConv = 0;
- {
- size_t curSize = BRA_BUF_SIZE - p->bufTotal;
- if (curSize > srcLenOrig)
- curSize = srcLenOrig;
- memcpy(p->buf + p->bufTotal, src, curSize);
- *srcLen += curSize;
- src += curSize;
- srcLenOrig -= curSize;
- p->bufTotal += curSize;
- }
- if (p->bufTotal == 0)
- break;
- switch(p->methodId)
- {
- case XZ_ID_Delta:
- if (p->encodeMode)
- Delta_Encode(p->deltaState, p->delta, p->buf, p->bufTotal);
- else
- Delta_Decode(p->deltaState, p->delta, p->buf, p->bufTotal);
- p->bufConv = p->bufTotal;
- break;
- case XZ_ID_X86:
- p->bufConv = x86_Convert(p->buf, p->bufTotal, p->ip, &p->x86State, p->encodeMode);
- break;
- CASE_BRA_CONV(PPC)
- CASE_BRA_CONV(IA64)
- CASE_BRA_CONV(ARM)
- CASE_BRA_CONV(ARMT)
- CASE_BRA_CONV(SPARC)
- default:
- return SZ_ERROR_UNSUPPORTED;
- }
- p->ip += (UInt32)p->bufConv;
-
- if (p->bufConv == 0)
- {
- if (!srcWasFinished)
- break;
- p->bufConv = p->bufTotal;
- }
- }
- if (p->bufTotal == p->bufPos && srcLenOrig == 0 && srcWasFinished)
- *wasFinished = 1;
- return SZ_OK;
-}
-
-SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAlloc *alloc)
-{
- CBraState *decoder;
- if (id != XZ_ID_Delta &&
- id != XZ_ID_X86 &&
- id != XZ_ID_PPC &&
- id != XZ_ID_IA64 &&
- id != XZ_ID_ARM &&
- id != XZ_ID_ARMT &&
- id != XZ_ID_SPARC)
- return SZ_ERROR_UNSUPPORTED;
- p->p = 0;
- decoder = (CBraState *)alloc->Alloc(alloc, sizeof(CBraState));
- if (decoder == 0)
- return SZ_ERROR_MEM;
- decoder->methodId = (UInt32)id;
- decoder->encodeMode = encodeMode;
- p->p = decoder;
- p->Free = BraState_Free;
- p->SetProps = BraState_SetProps;
- p->Init = BraState_Init;
- p->Code = BraState_Code;
- return SZ_OK;
-}
-
-/* ---------- SbState ---------- */
-
-#ifdef USE_SUBBLOCK
-
-static void SbState_Free(void *pp, ISzAlloc *alloc)
-{
- CSbDec *p = (CSbDec *)pp;
- SbDec_Free(p);
- alloc->Free(alloc, pp);
-}
-
-static SRes SbState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc)
-{
- pp = pp;
- props = props;
- alloc = alloc;
- return (propSize == 0) ? SZ_OK : SZ_ERROR_UNSUPPORTED;
-}
-
-static void SbState_Init(void *pp)
-{
- SbDec_Init((CSbDec *)pp);
-}
-
-static SRes SbState_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
- int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished)
-{
- CSbDec *p = (CSbDec *)pp;
- SRes res;
- srcWasFinished = srcWasFinished;
- p->dest = dest;
- p->destLen = *destLen;
- p->src = src;
- p->srcLen = *srcLen;
- p->finish = finishMode; /* change it */
- res = SbDec_Decode((CSbDec *)pp);
- *destLen -= p->destLen;
- *srcLen -= p->srcLen;
- *wasFinished = (*destLen == 0 && *srcLen == 0); /* change it */
- return res;
-}
-
-SRes SbState_SetFromMethod(IStateCoder *p, ISzAlloc *alloc)
-{
- CSbDec *decoder;
- p->p = 0;
- decoder = alloc->Alloc(alloc, sizeof(CSbDec));
- if (decoder == 0)
- return SZ_ERROR_MEM;
- p->p = decoder;
- p->Free = SbState_Free;
- p->SetProps = SbState_SetProps;
- p->Init = SbState_Init;
- p->Code = SbState_Code;
- SbDec_Construct(decoder);
- SbDec_SetAlloc(decoder, alloc);
- return SZ_OK;
-}
-#endif
-
-/* ---------- Lzma2State ---------- */
-
-static void Lzma2State_Free(void *pp, ISzAlloc *alloc)
-{
- Lzma2Dec_Free((CLzma2Dec *)pp, alloc);
- alloc->Free(alloc, pp);
-}
-
-static SRes Lzma2State_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc)
-{
- if (propSize != 1)
- return SZ_ERROR_UNSUPPORTED;
- return Lzma2Dec_Allocate((CLzma2Dec *)pp, props[0], alloc);
-}
-
-static void Lzma2State_Init(void *pp)
-{
- Lzma2Dec_Init((CLzma2Dec *)pp);
-}
-
-static SRes Lzma2State_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
- int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished)
-{
- ELzmaStatus status;
- /* ELzmaFinishMode fm = (finishMode == LZMA_FINISH_ANY) ? LZMA_FINISH_ANY : LZMA_FINISH_END; */
- SRes res = Lzma2Dec_DecodeToBuf((CLzma2Dec *)pp, dest, destLen, src, srcLen, (ELzmaFinishMode)finishMode, &status);
- srcWasFinished = srcWasFinished;
- *wasFinished = (status == LZMA_STATUS_FINISHED_WITH_MARK);
- return res;
-}
-
-static SRes Lzma2State_SetFromMethod(IStateCoder *p, ISzAlloc *alloc)
-{
- CLzma2Dec *decoder = (CLzma2Dec *)alloc->Alloc(alloc, sizeof(CLzma2Dec));
- p->p = decoder;
- if (decoder == 0)
- return SZ_ERROR_MEM;
- p->Free = Lzma2State_Free;
- p->SetProps = Lzma2State_SetProps;
- p->Init = Lzma2State_Init;
- p->Code = Lzma2State_Code;
- Lzma2Dec_Construct(decoder);
- return SZ_OK;
-}
-
-
-void MixCoder_Construct(CMixCoder *p, ISzAlloc *alloc)
-{
- int i;
- p->alloc = alloc;
- p->buf = 0;
- p->numCoders = 0;
- for (i = 0; i < MIXCODER_NUM_FILTERS_MAX; i++)
- p->coders[i].p = NULL;
-}
-
-void MixCoder_Free(CMixCoder *p)
-{
- int i;
- for (i = 0; i < p->numCoders; i++)
- {
- IStateCoder *sc = &p->coders[i];
- if (p->alloc && sc->p)
- sc->Free(sc->p, p->alloc);
- }
- p->numCoders = 0;
- if (p->buf)
- {
- p->alloc->Free(p->alloc, p->buf);
- p->buf = 0; /* 9.31: the BUG was fixed */
- }
-}
-
-void MixCoder_Init(CMixCoder *p)
-{
- int i;
- for (i = 0; i < p->numCoders - 1; i++)
- {
- p->size[i] = 0;
- p->pos[i] = 0;
- p->finished[i] = 0;
- }
- for (i = 0; i < p->numCoders; i++)
- {
- IStateCoder *coder = &p->coders[i];
- coder->Init(coder->p);
- }
-}
-
-SRes MixCoder_SetFromMethod(CMixCoder *p, int coderIndex, UInt64 methodId)
-{
- IStateCoder *sc = &p->coders[coderIndex];
- p->ids[coderIndex] = methodId;
- switch(methodId)
- {
- case XZ_ID_LZMA2: return Lzma2State_SetFromMethod(sc, p->alloc);
- #ifdef USE_SUBBLOCK
- case XZ_ID_Subblock: return SbState_SetFromMethod(sc, p->alloc);
- #endif
- }
- if (coderIndex == 0)
- return SZ_ERROR_UNSUPPORTED;
- return BraState_SetFromMethod(sc, methodId, 0, p->alloc);
-}
-
-SRes MixCoder_Code(CMixCoder *p, Byte *dest, SizeT *destLen,
- const Byte *src, SizeT *srcLen, int srcWasFinished,
- ECoderFinishMode finishMode, ECoderStatus *status)
-{
- SizeT destLenOrig = *destLen;
- SizeT srcLenOrig = *srcLen;
- Bool allFinished = True;
- *destLen = 0;
- *srcLen = 0;
- *status = CODER_STATUS_NOT_FINISHED;
-
- if (p->buf == 0)
- {
- p->buf = (Byte *)p->alloc->Alloc(p->alloc, CODER_BUF_SIZE * (MIXCODER_NUM_FILTERS_MAX - 1));
- if (p->buf == 0)
- return SZ_ERROR_MEM;
- }
-
- if (p->numCoders != 1)
- finishMode = CODER_FINISH_ANY;
-
- for (;;)
- {
- Bool processed = False;
- int i;
- /*
- if (p->numCoders == 1 && *destLen == destLenOrig && finishMode == LZMA_FINISH_ANY)
- break;
- */
-
- for (i = 0; i < p->numCoders; i++)
- {
- SRes res;
- IStateCoder *coder = &p->coders[i];
- Byte *destCur;
- SizeT destLenCur, srcLenCur;
- const Byte *srcCur;
- int srcFinishedCur;
- int encodingWasFinished;
-
- if (i == 0)
- {
- srcCur = src;
- srcLenCur = srcLenOrig - *srcLen;
- srcFinishedCur = srcWasFinished;
- }
- else
- {
- srcCur = p->buf + (CODER_BUF_SIZE * (i - 1)) + p->pos[i - 1];
- srcLenCur = p->size[i - 1] - p->pos[i - 1];
- srcFinishedCur = p->finished[i - 1];
- }
-
- if (i == p->numCoders - 1)
- {
- destCur = dest;
- destLenCur = destLenOrig - *destLen;
- }
- else
- {
- if (p->pos[i] != p->size[i])
- continue;
- destCur = p->buf + (CODER_BUF_SIZE * i);
- destLenCur = CODER_BUF_SIZE;
- }
-
- res = coder->Code(coder->p, destCur, &destLenCur, srcCur, &srcLenCur, srcFinishedCur, finishMode, &encodingWasFinished);
-
- if (!encodingWasFinished)
- allFinished = False;
-
- if (i == 0)
- {
- *srcLen += srcLenCur;
- src += srcLenCur;
- }
- else
- {
- p->pos[i - 1] += srcLenCur;
- }
-
- if (i == p->numCoders - 1)
- {
- *destLen += destLenCur;
- dest += destLenCur;
- }
- else
- {
- p->size[i] = destLenCur;
- p->pos[i] = 0;
- p->finished[i] = encodingWasFinished;
- }
-
- if (res != SZ_OK)
- return res;
-
- if (destLenCur != 0 || srcLenCur != 0)
- processed = True;
- }
- if (!processed)
- break;
- }
- if (allFinished)
- *status = CODER_STATUS_FINISHED_WITH_MARK;
- return SZ_OK;
-}
-
-SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf)
-{
- *p = (CXzStreamFlags)GetBe16(buf + XZ_SIG_SIZE);
- if (CrcCalc(buf + XZ_SIG_SIZE, XZ_STREAM_FLAGS_SIZE) !=
- GetUi32(buf + XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE))
- return SZ_ERROR_NO_ARCHIVE;
- return XzFlags_IsSupported(*p) ? SZ_OK : SZ_ERROR_UNSUPPORTED;
-}
-
-static Bool Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *buf)
-{
- return
- indexSize == (((UInt64)GetUi32(buf + 4) + 1) << 2) &&
- (GetUi32(buf) == CrcCalc(buf + 4, 6) &&
- flags == GetBe16(buf + 8) &&
- memcmp(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) == 0);
-}
-
-#define READ_VARINT_AND_CHECK(buf, pos, size, res) \
- { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \
- if (s == 0) return SZ_ERROR_ARCHIVE; pos += s; }
-
-
-SRes XzBlock_Parse(CXzBlock *p, const Byte *header)
-{
- unsigned pos;
- int numFilters, i;
- UInt32 headerSize = (UInt32)header[0] << 2;
-
- if (CrcCalc(header, headerSize) != GetUi32(header + headerSize))
- return SZ_ERROR_ARCHIVE;
-
- pos = 1;
- if (pos == headerSize)
- return SZ_ERROR_ARCHIVE;
- p->flags = header[pos++];
-
- if (XzBlock_HasPackSize(p))
- {
- READ_VARINT_AND_CHECK(header, pos, headerSize, &p->packSize);
- if (p->packSize == 0 || p->packSize + headerSize >= (UInt64)1 << 63)
- return SZ_ERROR_ARCHIVE;
- }
-
- if (XzBlock_HasUnpackSize(p))
- READ_VARINT_AND_CHECK(header, pos, headerSize, &p->unpackSize);
-
- numFilters = XzBlock_GetNumFilters(p);
- for (i = 0; i < numFilters; i++)
- {
- CXzFilter *filter = p->filters + i;
- UInt64 size;
- READ_VARINT_AND_CHECK(header, pos, headerSize, &filter->id);
- READ_VARINT_AND_CHECK(header, pos, headerSize, &size);
- if (size > headerSize - pos || size > XZ_FILTER_PROPS_SIZE_MAX)
- return SZ_ERROR_ARCHIVE;
- filter->propsSize = (UInt32)size;
- memcpy(filter->props, header + pos, (size_t)size);
- pos += (unsigned)size;
-
- #ifdef XZ_DUMP
- printf("\nf[%d] = %2X: ", i, filter->id);
- {
- int i;
- for (i = 0; i < size; i++)
- printf(" %2X", filter->props[i]);
- }
- #endif
- }
-
- while (pos < headerSize)
- if (header[pos++] != 0)
- return SZ_ERROR_ARCHIVE;
- return SZ_OK;
-}
-
-SRes XzDec_Init(CMixCoder *p, const CXzBlock *block)
-{
- int i;
- Bool needReInit = True;
- int numFilters = XzBlock_GetNumFilters(block);
- if (numFilters == p->numCoders)
- {
- for (i = 0; i < numFilters; i++)
- if (p->ids[i] != block->filters[numFilters - 1 - i].id)
- break;
- needReInit = (i != numFilters);
- }
- if (needReInit)
- {
- MixCoder_Free(p);
- p->numCoders = numFilters;
- for (i = 0; i < numFilters; i++)
- {
- const CXzFilter *f = &block->filters[numFilters - 1 - i];
- RINOK(MixCoder_SetFromMethod(p, i, f->id));
- }
- }
- for (i = 0; i < numFilters; i++)
- {
- const CXzFilter *f = &block->filters[numFilters - 1 - i];
- IStateCoder *sc = &p->coders[i];
- RINOK(sc->SetProps(sc->p, f->props, f->propsSize, p->alloc));
- }
- MixCoder_Init(p);
- return SZ_OK;
-}
-
-void XzUnpacker_Init(CXzUnpacker *p)
-{
- p->state = XZ_STATE_STREAM_HEADER;
- p->pos = 0;
- p->numStartedStreams = 0;
- p->numFinishedStreams = 0;
- p->numTotalBlocks = 0;
- p->padSize = 0;
-}
-
-void XzUnpacker_Construct(CXzUnpacker *p, ISzAlloc *alloc)
-{
- MixCoder_Construct(&p->decoder, alloc);
- XzUnpacker_Init(p);
-}
-
-void XzUnpacker_Free(CXzUnpacker *p)
-{
- MixCoder_Free(&p->decoder);
-}
-
-SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
- const Byte *src, SizeT *srcLen, ECoderFinishMode finishMode, ECoderStatus *status)
-{
- SizeT destLenOrig = *destLen;
- SizeT srcLenOrig = *srcLen;
- *destLen = 0;
- *srcLen = 0;
- *status = CODER_STATUS_NOT_SPECIFIED;
- for (;;)
- {
- SizeT srcRem = srcLenOrig - *srcLen;
-
- if (p->state == XZ_STATE_BLOCK)
- {
- SizeT destLen2 = destLenOrig - *destLen;
- SizeT srcLen2 = srcLenOrig - *srcLen;
- SRes res;
- if (srcLen2 == 0 && destLen2 == 0)
- {
- *status = CODER_STATUS_NOT_FINISHED;
- return SZ_OK;
- }
-
- res = MixCoder_Code(&p->decoder, dest, &destLen2, src, &srcLen2, False, finishMode, status);
- XzCheck_Update(&p->check, dest, destLen2);
-
- (*srcLen) += srcLen2;
- src += srcLen2;
- p->packSize += srcLen2;
-
- (*destLen) += destLen2;
- dest += destLen2;
- p->unpackSize += destLen2;
-
- RINOK(res);
-
- if (*status == CODER_STATUS_FINISHED_WITH_MARK)
- {
- Byte temp[32];
- unsigned num = Xz_WriteVarInt(temp, p->packSize + p->blockHeaderSize + XzFlags_GetCheckSize(p->streamFlags));
- num += Xz_WriteVarInt(temp + num, p->unpackSize);
- Sha256_Update(&p->sha, temp, num);
- p->indexSize += num;
- p->numBlocks++;
-
- p->state = XZ_STATE_BLOCK_FOOTER;
- p->pos = 0;
- p->alignPos = 0;
- }
- else if (srcLen2 == 0 && destLen2 == 0)
- return SZ_OK;
-
- continue;
- }
-
- if (srcRem == 0)
- {
- *status = CODER_STATUS_NEEDS_MORE_INPUT;
- return SZ_OK;
- }
-
- switch (p->state)
- {
- case XZ_STATE_STREAM_HEADER:
- {
- if (p->pos < XZ_STREAM_HEADER_SIZE)
- {
- if (p->pos < XZ_SIG_SIZE && *src != XZ_SIG[p->pos])
- return SZ_ERROR_NO_ARCHIVE;
- p->buf[p->pos++] = *src++;
- (*srcLen)++;
- }
- else
- {
- RINOK(Xz_ParseHeader(&p->streamFlags, p->buf));
- p->numStartedStreams++;
- p->state = XZ_STATE_BLOCK_HEADER;
- Sha256_Init(&p->sha);
- p->indexSize = 0;
- p->numBlocks = 0;
- p->pos = 0;
- }
- break;
- }
-
- case XZ_STATE_BLOCK_HEADER:
- {
- if (p->pos == 0)
- {
- p->buf[p->pos++] = *src++;
- (*srcLen)++;
- if (p->buf[0] == 0)
- {
- p->indexPreSize = 1 + Xz_WriteVarInt(p->buf + 1, p->numBlocks);
- p->indexPos = p->indexPreSize;
- p->indexSize += p->indexPreSize;
- Sha256_Final(&p->sha, p->shaDigest);
- Sha256_Init(&p->sha);
- p->crc = CrcUpdate(CRC_INIT_VAL, p->buf, p->indexPreSize);
- p->state = XZ_STATE_STREAM_INDEX;
- }
- p->blockHeaderSize = ((UInt32)p->buf[0] << 2) + 4;
- }
- else if (p->pos != p->blockHeaderSize)
- {
- UInt32 cur = p->blockHeaderSize - p->pos;
- if (cur > srcRem)
- cur = (UInt32)srcRem;
- memcpy(p->buf + p->pos, src, cur);
- p->pos += cur;
- (*srcLen) += cur;
- src += cur;
- }
- else
- {
- RINOK(XzBlock_Parse(&p->block, p->buf));
- p->numTotalBlocks++;
- p->state = XZ_STATE_BLOCK;
- p->packSize = 0;
- p->unpackSize = 0;
- XzCheck_Init(&p->check, XzFlags_GetCheckType(p->streamFlags));
- RINOK(XzDec_Init(&p->decoder, &p->block));
- }
- break;
- }
-
- case XZ_STATE_BLOCK_FOOTER:
- {
- if (((p->packSize + p->alignPos) & 3) != 0)
- {
- (*srcLen)++;
- p->alignPos++;
- if (*src++ != 0)
- return SZ_ERROR_CRC;
- }
- else
- {
- UInt32 checkSize = XzFlags_GetCheckSize(p->streamFlags);
- UInt32 cur = checkSize - p->pos;
- if (cur != 0)
- {
- if (cur > srcRem)
- cur = (UInt32)srcRem;
- memcpy(p->buf + p->pos, src, cur);
- p->pos += cur;
- (*srcLen) += cur;
- src += cur;
- }
- else
- {
- Byte digest[XZ_CHECK_SIZE_MAX];
- p->state = XZ_STATE_BLOCK_HEADER;
- p->pos = 0;
- if (XzCheck_Final(&p->check, digest) && memcmp(digest, p->buf, checkSize) != 0)
- return SZ_ERROR_CRC;
- }
- }
- break;
- }
-
- case XZ_STATE_STREAM_INDEX:
- {
- if (p->pos < p->indexPreSize)
- {
- (*srcLen)++;
- if (*src++ != p->buf[p->pos++])
- return SZ_ERROR_CRC;
- }
- else
- {
- if (p->indexPos < p->indexSize)
- {
- UInt64 cur = p->indexSize - p->indexPos;
- if (srcRem > cur)
- srcRem = (SizeT)cur;
- p->crc = CrcUpdate(p->crc, src, srcRem);
- Sha256_Update(&p->sha, src, srcRem);
- (*srcLen) += srcRem;
- src += srcRem;
- p->indexPos += srcRem;
- }
- else if ((p->indexPos & 3) != 0)
- {
- Byte b = *src++;
- p->crc = CRC_UPDATE_BYTE(p->crc, b);
- (*srcLen)++;
- p->indexPos++;
- p->indexSize++;
- if (b != 0)
- return SZ_ERROR_CRC;
- }
- else
- {
- Byte digest[SHA256_DIGEST_SIZE];
- p->state = XZ_STATE_STREAM_INDEX_CRC;
- p->indexSize += 4;
- p->pos = 0;
- Sha256_Final(&p->sha, digest);
- if (memcmp(digest, p->shaDigest, SHA256_DIGEST_SIZE) != 0)
- return SZ_ERROR_CRC;
- }
- }
- break;
- }
-
- case XZ_STATE_STREAM_INDEX_CRC:
- {
- if (p->pos < 4)
- {
- (*srcLen)++;
- p->buf[p->pos++] = *src++;
- }
- else
- {
- p->state = XZ_STATE_STREAM_FOOTER;
- p->pos = 0;
- if (CRC_GET_DIGEST(p->crc) != GetUi32(p->buf))
- return SZ_ERROR_CRC;
- }
- break;
- }
-
- case XZ_STATE_STREAM_FOOTER:
- {
- UInt32 cur = XZ_STREAM_FOOTER_SIZE - p->pos;
- if (cur > srcRem)
- cur = (UInt32)srcRem;
- memcpy(p->buf + p->pos, src, cur);
- p->pos += cur;
- (*srcLen) += cur;
- src += cur;
- if (p->pos == XZ_STREAM_FOOTER_SIZE)
- {
- p->state = XZ_STATE_STREAM_PADDING;
- p->numFinishedStreams++;
- p->padSize = 0;
- if (!Xz_CheckFooter(p->streamFlags, p->indexSize, p->buf))
- return SZ_ERROR_CRC;
- }
- break;
- }
-
- case XZ_STATE_STREAM_PADDING:
- {
- if (*src != 0)
- {
- if (((UInt32)p->padSize & 3) != 0)
- return SZ_ERROR_NO_ARCHIVE;
- p->pos = 0;
- p->state = XZ_STATE_STREAM_HEADER;
- }
- else
- {
- (*srcLen)++;
- src++;
- p->padSize++;
- }
- break;
- }
-
- case XZ_STATE_BLOCK: break; /* to disable GCC warning */
- }
- }
- /*
- if (p->state == XZ_STATE_FINISHED)
- *status = CODER_STATUS_FINISHED_WITH_MARK;
- return SZ_OK;
- */
-}
-
-Bool XzUnpacker_IsStreamWasFinished(CXzUnpacker *p)
-{
- return (p->state == XZ_STATE_STREAM_PADDING) && (((UInt32)p->padSize & 3) == 0);
-}
-
-UInt64 XzUnpacker_GetExtraSize(CXzUnpacker *p)
-{
- UInt64 num = 0;
- if (p->state == XZ_STATE_STREAM_PADDING)
- num += p->padSize;
- else if (p->state == XZ_STATE_STREAM_HEADER)
- num += p->padSize + p->pos;
- return num;
-}
diff --git a/src/libs/7zip/win/C/XzEnc.c b/src/libs/7zip/win/C/XzEnc.c
deleted file mode 100644
index 56680fcd8..000000000
--- a/src/libs/7zip/win/C/XzEnc.c
+++ /dev/null
@@ -1,522 +0,0 @@
-/* XzEnc.c -- Xz Encode
-2014-12-30 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "7zCrc.h"
-#include "Alloc.h"
-#include "Bra.h"
-#include "CpuArch.h"
-#ifdef USE_SUBBLOCK
-#include "Bcj3Enc.c"
-#include "SbFind.c"
-#include "SbEnc.c"
-#endif
-
-#include "XzEnc.h"
-
-static void *SzBigAlloc(void *p, size_t size) { p = p; return BigAlloc(size); }
-static void SzBigFree(void *p, void *address) { p = p; BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-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 };
-
-#define XzBlock_ClearFlags(p) (p)->flags = 0;
-#define XzBlock_SetNumFilters(p, n) (p)->flags |= ((n) - 1);
-#define XzBlock_SetHasPackSize(p) (p)->flags |= XZ_BF_PACK_SIZE;
-#define XzBlock_SetHasUnpackSize(p) (p)->flags |= XZ_BF_UNPACK_SIZE;
-
-static SRes WriteBytes(ISeqOutStream *s, const void *buf, UInt32 size)
-{
- return (s->Write(s, buf, size) == size) ? SZ_OK : SZ_ERROR_WRITE;
-}
-
-static SRes WriteBytesAndCrc(ISeqOutStream *s, const void *buf, UInt32 size, UInt32 *crc)
-{
- *crc = CrcUpdate(*crc, buf, size);
- return WriteBytes(s, buf, size);
-}
-
-SRes Xz_WriteHeader(CXzStreamFlags f, ISeqOutStream *s)
-{
- UInt32 crc;
- Byte header[XZ_STREAM_HEADER_SIZE];
- memcpy(header, XZ_SIG, XZ_SIG_SIZE);
- header[XZ_SIG_SIZE] = (Byte)(f >> 8);
- header[XZ_SIG_SIZE + 1] = (Byte)(f & 0xFF);
- crc = CrcCalc(header + XZ_SIG_SIZE, XZ_STREAM_FLAGS_SIZE);
- SetUi32(header + XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE, crc);
- return WriteBytes(s, header, XZ_STREAM_HEADER_SIZE);
-}
-
-SRes XzBlock_WriteHeader(const CXzBlock *p, ISeqOutStream *s)
-{
- Byte header[XZ_BLOCK_HEADER_SIZE_MAX];
-
- unsigned pos = 1;
- int numFilters, i;
- header[pos++] = p->flags;
-
- if (XzBlock_HasPackSize(p)) pos += Xz_WriteVarInt(header + pos, p->packSize);
- if (XzBlock_HasUnpackSize(p)) pos += Xz_WriteVarInt(header + pos, p->unpackSize);
- numFilters = XzBlock_GetNumFilters(p);
- for (i = 0; i < numFilters; i++)
- {
- const CXzFilter *f = &p->filters[i];
- pos += Xz_WriteVarInt(header + pos, f->id);
- pos += Xz_WriteVarInt(header + pos, f->propsSize);
- memcpy(header + pos, f->props, f->propsSize);
- pos += f->propsSize;
- }
- while((pos & 3) != 0)
- header[pos++] = 0;
- header[0] = (Byte)(pos >> 2);
- SetUi32(header + pos, CrcCalc(header, pos));
- return WriteBytes(s, header, pos + 4);
-}
-
-SRes Xz_WriteFooter(CXzStream *p, ISeqOutStream *s)
-{
- Byte buf[32];
- UInt64 globalPos;
- {
- UInt32 crc = CRC_INIT_VAL;
- unsigned pos = 1 + Xz_WriteVarInt(buf + 1, p->numBlocks);
- size_t i;
-
- globalPos = pos;
- buf[0] = 0;
- RINOK(WriteBytesAndCrc(s, buf, pos, &crc));
- for (i = 0; i < p->numBlocks; i++)
- {
- const CXzBlockSizes *block = &p->blocks[i];
- pos = Xz_WriteVarInt(buf, block->totalSize);
- pos += Xz_WriteVarInt(buf + pos, block->unpackSize);
- globalPos += pos;
- RINOK(WriteBytesAndCrc(s, buf, pos, &crc));
- }
- pos = ((unsigned)globalPos & 3);
- if (pos != 0)
- {
- buf[0] = buf[1] = buf[2] = 0;
- RINOK(WriteBytesAndCrc(s, buf, 4 - pos, &crc));
- globalPos += 4 - pos;
- }
- {
- SetUi32(buf, CRC_GET_DIGEST(crc));
- RINOK(WriteBytes(s, buf, 4));
- globalPos += 4;
- }
- }
-
- {
- UInt32 indexSize = (UInt32)((globalPos >> 2) - 1);
- SetUi32(buf + 4, indexSize);
- buf[8] = (Byte)(p->flags >> 8);
- buf[9] = (Byte)(p->flags & 0xFF);
- SetUi32(buf, CrcCalc(buf + 4, 6));
- memcpy(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE);
- return WriteBytes(s, buf, 12);
- }
-}
-
-SRes Xz_AddIndexRecord(CXzStream *p, UInt64 unpackSize, UInt64 totalSize, ISzAlloc *alloc)
-{
- if (p->blocks == 0 || p->numBlocksAllocated == p->numBlocks)
- {
- size_t num = (p->numBlocks + 1) * 2;
- size_t newSize = sizeof(CXzBlockSizes) * num;
- CXzBlockSizes *blocks;
- if (newSize / sizeof(CXzBlockSizes) != num)
- return SZ_ERROR_MEM;
- blocks = (CXzBlockSizes *)alloc->Alloc(alloc, newSize);
- if (blocks == 0)
- return SZ_ERROR_MEM;
- if (p->numBlocks != 0)
- {
- memcpy(blocks, p->blocks, p->numBlocks * sizeof(CXzBlockSizes));
- Xz_Free(p, alloc);
- }
- p->blocks = blocks;
- p->numBlocksAllocated = num;
- }
- {
- CXzBlockSizes *block = &p->blocks[p->numBlocks++];
- block->totalSize = totalSize;
- block->unpackSize = unpackSize;
- }
- return SZ_OK;
-}
-
-/* ---------- CSeqCheckInStream ---------- */
-
-typedef struct
-{
- ISeqInStream p;
- ISeqInStream *realStream;
- UInt64 processed;
- CXzCheck check;
-} CSeqCheckInStream;
-
-void SeqCheckInStream_Init(CSeqCheckInStream *p, int mode)
-{
- p->processed = 0;
- XzCheck_Init(&p->check, mode);
-}
-
-void SeqCheckInStream_GetDigest(CSeqCheckInStream *p, Byte *digest)
-{
- XzCheck_Final(&p->check, digest);
-}
-
-static SRes SeqCheckInStream_Read(void *pp, void *data, size_t *size)
-{
- CSeqCheckInStream *p = (CSeqCheckInStream *)pp;
- SRes res = p->realStream->Read(p->realStream, data, size);
- XzCheck_Update(&p->check, data, *size);
- p->processed += *size;
- return res;
-}
-
-/* ---------- CSeqSizeOutStream ---------- */
-
-typedef struct
-{
- ISeqOutStream p;
- ISeqOutStream *realStream;
- UInt64 processed;
-} CSeqSizeOutStream;
-
-static size_t MyWrite(void *pp, const void *data, size_t size)
-{
- CSeqSizeOutStream *p = (CSeqSizeOutStream *)pp;
- size = p->realStream->Write(p->realStream, data, size);
- p->processed += size;
- return size;
-}
-
-/* ---------- CSeqInFilter ---------- */
-
-#define FILTER_BUF_SIZE (1 << 20)
-
-typedef struct
-{
- ISeqInStream p;
- ISeqInStream *realStream;
- IStateCoder StateCoder;
- Byte *buf;
- size_t curPos;
- size_t endPos;
- int srcWasFinished;
-} CSeqInFilter;
-
-static SRes SeqInFilter_Read(void *pp, void *data, size_t *size)
-{
- CSeqInFilter *p = (CSeqInFilter *)pp;
- size_t sizeOriginal = *size;
- if (sizeOriginal == 0)
- return SZ_OK;
- *size = 0;
- for (;;)
- {
- if (!p->srcWasFinished && p->curPos == p->endPos)
- {
- p->curPos = 0;
- p->endPos = FILTER_BUF_SIZE;
- RINOK(p->realStream->Read(p->realStream, p->buf, &p->endPos));
- if (p->endPos == 0)
- p->srcWasFinished = 1;
- }
- {
- SizeT srcLen = p->endPos - p->curPos;
- int wasFinished;
- SRes res;
- *size = sizeOriginal;
- res = p->StateCoder.Code(p->StateCoder.p, data, size, p->buf + p->curPos, &srcLen,
- p->srcWasFinished, CODER_FINISH_ANY, &wasFinished);
- p->curPos += srcLen;
- if (*size != 0 || srcLen == 0 || res != 0)
- return res;
- }
- }
-}
-
-static void SeqInFilter_Construct(CSeqInFilter *p)
-{
- p->buf = NULL;
- p->p.Read = SeqInFilter_Read;
-}
-
-static void SeqInFilter_Free(CSeqInFilter *p)
-{
- if (p->buf)
- {
- g_Alloc.Free(&g_Alloc, p->buf);
- p->buf = NULL;
- }
-}
-
-SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAlloc *alloc);
-
-static SRes SeqInFilter_Init(CSeqInFilter *p, const CXzFilter *props)
-{
- if (!p->buf)
- {
- p->buf = g_Alloc.Alloc(&g_Alloc, FILTER_BUF_SIZE);
- if (!p->buf)
- return SZ_ERROR_MEM;
- }
- p->curPos = p->endPos = 0;
- p->srcWasFinished = 0;
- RINOK(BraState_SetFromMethod(&p->StateCoder, props->id, 1, &g_Alloc));
- RINOK(p->StateCoder.SetProps(p->StateCoder.p, props->props, props->propsSize, &g_Alloc));
- p->StateCoder.Init(p->StateCoder.p);
- return SZ_OK;
-}
-
-/* ---------- CSbEncInStream ---------- */
-
-#ifdef USE_SUBBLOCK
-
-typedef struct
-{
- ISeqInStream p;
- ISeqInStream *inStream;
- CSbEnc enc;
-} CSbEncInStream;
-
-static SRes SbEncInStream_Read(void *pp, void *data, size_t *size)
-{
- CSbEncInStream *p = (CSbEncInStream *)pp;
- size_t sizeOriginal = *size;
- if (sizeOriginal == 0)
- return S_OK;
- for (;;)
- {
- if (p->enc.needRead && !p->enc.readWasFinished)
- {
- size_t processed = p->enc.needReadSizeMax;
- RINOK(p->inStream->Read(p->inStream, p->enc.buf + p->enc.readPos, &processed));
- p->enc.readPos += processed;
- if (processed == 0)
- {
- p->enc.readWasFinished = True;
- p->enc.isFinalFinished = True;
- }
- p->enc.needRead = False;
- }
- *size = sizeOriginal;
- RINOK(SbEnc_Read(&p->enc, data, size));
- if (*size != 0 || !p->enc.needRead)
- return S_OK;
- }
-}
-
-void SbEncInStream_Construct(CSbEncInStream *p, ISzAlloc *alloc)
-{
- SbEnc_Construct(&p->enc, alloc);
- p->p.Read = SbEncInStream_Read;
-}
-
-SRes SbEncInStream_Init(CSbEncInStream *p)
-{
- return SbEnc_Init(&p->enc);
-}
-
-void SbEncInStream_Free(CSbEncInStream *p)
-{
- SbEnc_Free(&p->enc);
-}
-
-#endif
-
-
-typedef struct
-{
- CLzma2EncHandle lzma2;
- #ifdef USE_SUBBLOCK
- CSbEncInStream sb;
- #endif
- CSeqInFilter filter;
- ISzAlloc *alloc;
- ISzAlloc *bigAlloc;
-} CLzma2WithFilters;
-
-
-static void Lzma2WithFilters_Construct(CLzma2WithFilters *p, ISzAlloc *alloc, ISzAlloc *bigAlloc)
-{
- p->alloc = alloc;
- p->bigAlloc = bigAlloc;
- p->lzma2 = NULL;
- #ifdef USE_SUBBLOCK
- SbEncInStream_Construct(&p->sb, alloc);
- #endif
- SeqInFilter_Construct(&p->filter);
-}
-
-static SRes Lzma2WithFilters_Create(CLzma2WithFilters *p)
-{
- p->lzma2 = Lzma2Enc_Create(p->alloc, p->bigAlloc);
- if (p->lzma2 == 0)
- return SZ_ERROR_MEM;
- return SZ_OK;
-}
-
-static void Lzma2WithFilters_Free(CLzma2WithFilters *p)
-{
- SeqInFilter_Free(&p->filter);
- #ifdef USE_SUBBLOCK
- SbEncInStream_Free(&p->sb);
- #endif
- if (p->lzma2)
- {
- Lzma2Enc_Destroy(p->lzma2);
- p->lzma2 = NULL;
- }
-}
-
-void XzProps_Init(CXzProps *p)
-{
- p->lzma2Props = 0;
- p->filterProps = 0;
- p->checkId = XZ_CHECK_CRC32;
-}
-
-void XzFilterProps_Init(CXzFilterProps *p)
-{
- p->id = 0;
- p->delta = 0;
- p->ip= 0;
- p->ipDefined = False;
-}
-
-static SRes Xz_Compress(CXzStream *xz, CLzma2WithFilters *lzmaf,
- ISeqOutStream *outStream, ISeqInStream *inStream,
- const CXzProps *props, ICompressProgress *progress)
-{
- xz->flags = (Byte)props->checkId;
-
- RINOK(Lzma2Enc_SetProps(lzmaf->lzma2, props->lzma2Props));
- RINOK(Xz_WriteHeader(xz->flags, outStream));
-
- {
- CSeqCheckInStream checkInStream;
- CSeqSizeOutStream seqSizeOutStream;
- CXzBlock block;
- int filterIndex = 0;
- CXzFilter *filter = NULL;
- const CXzFilterProps *fp = props->filterProps;
-
- XzBlock_ClearFlags(&block);
- XzBlock_SetNumFilters(&block, 1 + (fp ? 1 : 0));
-
- if (fp)
- {
- filter = &block.filters[filterIndex++];
- filter->id = fp->id;
- filter->propsSize = 0;
- if (fp->id == XZ_ID_Delta)
- {
- filter->props[0] = (Byte)(fp->delta - 1);
- filter->propsSize = 1;
- }
- else if (fp->ipDefined)
- {
- SetUi32(filter->props, fp->ip);
- filter->propsSize = 4;
- }
- }
-
- {
- CXzFilter *f = &block.filters[filterIndex++];
- f->id = XZ_ID_LZMA2;
- f->propsSize = 1;
- f->props[0] = Lzma2Enc_WriteProperties(lzmaf->lzma2);
- }
-
- seqSizeOutStream.p.Write = MyWrite;
- seqSizeOutStream.realStream = outStream;
- seqSizeOutStream.processed = 0;
-
- RINOK(XzBlock_WriteHeader(&block, &seqSizeOutStream.p));
-
- checkInStream.p.Read = SeqCheckInStream_Read;
- checkInStream.realStream = inStream;
- SeqCheckInStream_Init(&checkInStream, XzFlags_GetCheckType(xz->flags));
-
- if (fp)
- {
- #ifdef USE_SUBBLOCK
- if (fp->id == XZ_ID_Subblock)
- {
- lzmaf->sb.inStream = &checkInStream.p;
- RINOK(SbEncInStream_Init(&lzmaf->sb));
- }
- else
- #endif
- {
- lzmaf->filter.realStream = &checkInStream.p;
- RINOK(SeqInFilter_Init(&lzmaf->filter, filter));
- }
- }
-
- {
- UInt64 packPos = seqSizeOutStream.processed;
- SRes res = Lzma2Enc_Encode(lzmaf->lzma2, &seqSizeOutStream.p,
- fp ?
- #ifdef USE_SUBBLOCK
- (fp->id == XZ_ID_Subblock) ? &lzmaf->sb.p:
- #endif
- &lzmaf->filter.p:
- &checkInStream.p,
- progress);
- RINOK(res);
- block.unpackSize = checkInStream.processed;
- block.packSize = seqSizeOutStream.processed - packPos;
- }
-
- {
- unsigned padSize = 0;
- Byte buf[128];
- while((((unsigned)block.packSize + padSize) & 3) != 0)
- buf[padSize++] = 0;
- SeqCheckInStream_GetDigest(&checkInStream, buf + padSize);
- RINOK(WriteBytes(&seqSizeOutStream.p, buf, padSize + XzFlags_GetCheckSize(xz->flags)));
- RINOK(Xz_AddIndexRecord(xz, block.unpackSize, seqSizeOutStream.processed - padSize, &g_Alloc));
- }
- }
- return Xz_WriteFooter(xz, outStream);
-}
-
-SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream,
- const CXzProps *props, ICompressProgress *progress)
-{
- SRes res;
- CXzStream xz;
- CLzma2WithFilters lzmaf;
- Xz_Construct(&xz);
- Lzma2WithFilters_Construct(&lzmaf, &g_Alloc, &g_BigAlloc);
- res = Lzma2WithFilters_Create(&lzmaf);
- if (res == SZ_OK)
- res = Xz_Compress(&xz, &lzmaf, outStream, inStream, props, progress);
- Lzma2WithFilters_Free(&lzmaf);
- Xz_Free(&xz, &g_Alloc);
- return res;
-}
-
-SRes Xz_EncodeEmpty(ISeqOutStream *outStream)
-{
- SRes res;
- CXzStream xz;
- Xz_Construct(&xz);
- res = Xz_WriteHeader(xz.flags, outStream);
- if (res == SZ_OK)
- res = Xz_WriteFooter(&xz, outStream);
- Xz_Free(&xz, &g_Alloc);
- return res;
-}
diff --git a/src/libs/7zip/win/C/XzEnc.h b/src/libs/7zip/win/C/XzEnc.h
deleted file mode 100644
index c3c19eca0..000000000
--- a/src/libs/7zip/win/C/XzEnc.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* XzEnc.h -- Xz Encode
-2011-02-07 : Igor Pavlov : Public domain */
-
-#ifndef __XZ_ENC_H
-#define __XZ_ENC_H
-
-#include "Lzma2Enc.h"
-
-#include "Xz.h"
-
-EXTERN_C_BEGIN
-
-typedef struct
-{
- UInt32 id;
- UInt32 delta;
- UInt32 ip;
- int ipDefined;
-} CXzFilterProps;
-
-void XzFilterProps_Init(CXzFilterProps *p);
-
-typedef struct
-{
- const CLzma2EncProps *lzma2Props;
- const CXzFilterProps *filterProps;
- unsigned checkId;
-} CXzProps;
-
-void XzProps_Init(CXzProps *p);
-
-SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream,
- const CXzProps *props, ICompressProgress *progress);
-
-SRes Xz_EncodeEmpty(ISeqOutStream *outStream);
-
-EXTERN_C_END
-
-#endif
diff --git a/src/libs/7zip/win/C/XzIn.c b/src/libs/7zip/win/C/XzIn.c
deleted file mode 100644
index ed9eac31a..000000000
--- a/src/libs/7zip/win/C/XzIn.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/* XzIn.c - Xz input
-2014-12-30 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include <string.h>
-
-#include "7zCrc.h"
-#include "CpuArch.h"
-#include "Xz.h"
-
-SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream)
-{
- Byte sig[XZ_STREAM_HEADER_SIZE];
- RINOK(SeqInStream_Read2(inStream, sig, XZ_STREAM_HEADER_SIZE, SZ_ERROR_NO_ARCHIVE));
- if (memcmp(sig, XZ_SIG, XZ_SIG_SIZE) != 0)
- return SZ_ERROR_NO_ARCHIVE;
- return Xz_ParseHeader(p, sig);
-}
-
-#define READ_VARINT_AND_CHECK(buf, pos, size, res) \
- { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \
- if (s == 0) return SZ_ERROR_ARCHIVE; pos += s; }
-
-SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, Bool *isIndex, UInt32 *headerSizeRes)
-{
- Byte header[XZ_BLOCK_HEADER_SIZE_MAX];
- unsigned headerSize;
- *headerSizeRes = 0;
- RINOK(SeqInStream_ReadByte(inStream, &header[0]));
- headerSize = ((unsigned)header[0] << 2) + 4;
- if (headerSize == 0)
- {
- *headerSizeRes = 1;
- *isIndex = True;
- return SZ_OK;
- }
-
- *isIndex = False;
- *headerSizeRes = headerSize;
- RINOK(SeqInStream_Read(inStream, header + 1, headerSize - 1));
- return XzBlock_Parse(p, header);
-}
-
-#define ADD_SIZE_CHECH(size, val) \
- { UInt64 newSize = size + (val); if (newSize < size) return XZ_SIZE_OVERFLOW; size = newSize; }
-
-UInt64 Xz_GetUnpackSize(const CXzStream *p)
-{
- UInt64 size = 0;
- size_t i;
- for (i = 0; i < p->numBlocks; i++)
- ADD_SIZE_CHECH(size, p->blocks[i].unpackSize);
- return size;
-}
-
-UInt64 Xz_GetPackSize(const CXzStream *p)
-{
- UInt64 size = 0;
- size_t i;
- for (i = 0; i < p->numBlocks; i++)
- ADD_SIZE_CHECH(size, (p->blocks[i].totalSize + 3) & ~(UInt64)3);
- return size;
-}
-
-/*
-SRes XzBlock_ReadFooter(CXzBlock *p, CXzStreamFlags f, ISeqInStream *inStream)
-{
- return SeqInStream_Read(inStream, p->check, XzFlags_GetCheckSize(f));
-}
-*/
-
-static SRes Xz_ReadIndex2(CXzStream *p, const Byte *buf, size_t size, ISzAlloc *alloc)
-{
- size_t i, numBlocks, pos = 1;
- UInt32 crc;
-
- if (size < 5 || buf[0] != 0)
- return SZ_ERROR_ARCHIVE;
-
- size -= 4;
- crc = CrcCalc(buf, size);
- if (crc != GetUi32(buf + size))
- return SZ_ERROR_ARCHIVE;
-
- {
- UInt64 numBlocks64;
- READ_VARINT_AND_CHECK(buf, pos, size, &numBlocks64);
- numBlocks = (size_t)numBlocks64;
- if (numBlocks != numBlocks64 || numBlocks * 2 > size)
- return SZ_ERROR_ARCHIVE;
- }
-
- Xz_Free(p, alloc);
- if (numBlocks != 0)
- {
- p->numBlocks = numBlocks;
- p->numBlocksAllocated = numBlocks;
- p->blocks = alloc->Alloc(alloc, sizeof(CXzBlockSizes) * numBlocks);
- if (p->blocks == 0)
- return SZ_ERROR_MEM;
- for (i = 0; i < numBlocks; i++)
- {
- CXzBlockSizes *block = &p->blocks[i];
- READ_VARINT_AND_CHECK(buf, pos, size, &block->totalSize);
- READ_VARINT_AND_CHECK(buf, pos, size, &block->unpackSize);
- if (block->totalSize == 0)
- return SZ_ERROR_ARCHIVE;
- }
- }
- while ((pos & 3) != 0)
- if (buf[pos++] != 0)
- return SZ_ERROR_ARCHIVE;
- return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE;
-}
-
-static SRes Xz_ReadIndex(CXzStream *p, ILookInStream *stream, UInt64 indexSize, ISzAlloc *alloc)
-{
- SRes res;
- size_t size;
- Byte *buf;
- if (indexSize > ((UInt32)1 << 31))
- return SZ_ERROR_UNSUPPORTED;
- size = (size_t)indexSize;
- if (size != indexSize)
- return SZ_ERROR_UNSUPPORTED;
- buf = alloc->Alloc(alloc, size);
- if (buf == 0)
- return SZ_ERROR_MEM;
- res = LookInStream_Read2(stream, buf, size, SZ_ERROR_UNSUPPORTED);
- if (res == SZ_OK)
- res = Xz_ReadIndex2(p, buf, size, alloc);
- alloc->Free(alloc, buf);
- return res;
-}
-
-static SRes SeekFromCur(ILookInStream *inStream, Int64 *res)
-{
- return inStream->Seek(inStream, res, SZ_SEEK_CUR);
-}
-
-static SRes Xz_ReadBackward(CXzStream *p, ILookInStream *stream, Int64 *startOffset, ISzAlloc *alloc)
-{
- UInt64 indexSize;
- Byte buf[XZ_STREAM_FOOTER_SIZE];
-
- if ((*startOffset & 3) != 0 || *startOffset < XZ_STREAM_FOOTER_SIZE)
- return SZ_ERROR_NO_ARCHIVE;
- *startOffset = -XZ_STREAM_FOOTER_SIZE;
- RINOK(SeekFromCur(stream, startOffset));
-
- RINOK(LookInStream_Read2(stream, buf, XZ_STREAM_FOOTER_SIZE, SZ_ERROR_NO_ARCHIVE));
-
- if (memcmp(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) != 0)
- {
- UInt32 total = 0;
- *startOffset += XZ_STREAM_FOOTER_SIZE;
- for (;;)
- {
- size_t i;
- #define TEMP_BUF_SIZE (1 << 10)
- Byte tempBuf[TEMP_BUF_SIZE];
- if (*startOffset < XZ_STREAM_FOOTER_SIZE || total > (1 << 16))
- return SZ_ERROR_NO_ARCHIVE;
- i = (*startOffset > TEMP_BUF_SIZE) ? TEMP_BUF_SIZE : (size_t)*startOffset;
- total += (UInt32)i;
- *startOffset = -(Int64)i;
- RINOK(SeekFromCur(stream, startOffset));
- RINOK(LookInStream_Read2(stream, tempBuf, i, SZ_ERROR_NO_ARCHIVE));
- for (; i != 0; i--)
- if (tempBuf[i - 1] != 0)
- break;
- if (i != 0)
- {
- if ((i & 3) != 0)
- return SZ_ERROR_NO_ARCHIVE;
- *startOffset += i;
- break;
- }
- }
- if (*startOffset < XZ_STREAM_FOOTER_SIZE)
- return SZ_ERROR_NO_ARCHIVE;
- *startOffset -= XZ_STREAM_FOOTER_SIZE;
- RINOK(stream->Seek(stream, startOffset, SZ_SEEK_SET));
- RINOK(LookInStream_Read2(stream, buf, XZ_STREAM_FOOTER_SIZE, SZ_ERROR_NO_ARCHIVE));
- if (memcmp(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) != 0)
- return SZ_ERROR_NO_ARCHIVE;
- }
-
- p->flags = (CXzStreamFlags)GetBe16(buf + 8);
-
- if (!XzFlags_IsSupported(p->flags))
- return SZ_ERROR_UNSUPPORTED;
-
- if (GetUi32(buf) != CrcCalc(buf + 4, 6))
- return SZ_ERROR_ARCHIVE;
-
- indexSize = ((UInt64)GetUi32(buf + 4) + 1) << 2;
-
- *startOffset = -(Int64)(indexSize + XZ_STREAM_FOOTER_SIZE);
- RINOK(SeekFromCur(stream, startOffset));
-
- RINOK(Xz_ReadIndex(p, stream, indexSize, alloc));
-
- {
- UInt64 totalSize = Xz_GetPackSize(p);
- UInt64 sum = XZ_STREAM_HEADER_SIZE + totalSize + indexSize;
- if (totalSize == XZ_SIZE_OVERFLOW ||
- sum >= ((UInt64)1 << 63) ||
- totalSize >= ((UInt64)1 << 63))
- return SZ_ERROR_ARCHIVE;
- *startOffset = -(Int64)sum;
- RINOK(SeekFromCur(stream, startOffset));
- }
- {
- CXzStreamFlags headerFlags;
- CSecToRead secToRead;
- SecToRead_CreateVTable(&secToRead);
- secToRead.realStream = stream;
-
- RINOK(Xz_ReadHeader(&headerFlags, &secToRead.s));
- return (p->flags == headerFlags) ? SZ_OK : SZ_ERROR_ARCHIVE;
- }
-}
-
-
-/* ---------- Xz Streams ---------- */
-
-void Xzs_Construct(CXzs *p)
-{
- p->num = p->numAllocated = 0;
- p->streams = 0;
-}
-
-void Xzs_Free(CXzs *p, ISzAlloc *alloc)
-{
- size_t i;
- for (i = 0; i < p->num; i++)
- Xz_Free(&p->streams[i], alloc);
- alloc->Free(alloc, p->streams);
- p->num = p->numAllocated = 0;
- p->streams = 0;
-}
-
-UInt64 Xzs_GetNumBlocks(const CXzs *p)
-{
- UInt64 num = 0;
- size_t i;
- for (i = 0; i < p->num; i++)
- num += p->streams[i].numBlocks;
- return num;
-}
-
-UInt64 Xzs_GetUnpackSize(const CXzs *p)
-{
- UInt64 size = 0;
- size_t i;
- for (i = 0; i < p->num; i++)
- ADD_SIZE_CHECH(size, Xz_GetUnpackSize(&p->streams[i]));
- return size;
-}
-
-/*
-UInt64 Xzs_GetPackSize(const CXzs *p)
-{
- UInt64 size = 0;
- size_t i;
- for (i = 0; i < p->num; i++)
- ADD_SIZE_CHECH(size, Xz_GetTotalSize(&p->streams[i]));
- return size;
-}
-*/
-
-SRes Xzs_ReadBackward(CXzs *p, ILookInStream *stream, Int64 *startOffset, ICompressProgress *progress, ISzAlloc *alloc)
-{
- Int64 endOffset = 0;
- RINOK(stream->Seek(stream, &endOffset, SZ_SEEK_END));
- *startOffset = endOffset;
- for (;;)
- {
- CXzStream st;
- SRes res;
- Xz_Construct(&st);
- res = Xz_ReadBackward(&st, stream, startOffset, alloc);
- st.startOffset = *startOffset;
- RINOK(res);
- if (p->num == p->numAllocated)
- {
- size_t newNum = p->num + p->num / 4 + 1;
- Byte *data = (Byte *)alloc->Alloc(alloc, newNum * sizeof(CXzStream));
- if (data == 0)
- return SZ_ERROR_MEM;
- p->numAllocated = newNum;
- if (p->num != 0)
- memcpy(data, p->streams, p->num * sizeof(CXzStream));
- alloc->Free(alloc, p->streams);
- p->streams = (CXzStream *)data;
- }
- p->streams[p->num++] = st;
- if (*startOffset == 0)
- break;
- RINOK(stream->Seek(stream, startOffset, SZ_SEEK_SET));
- if (progress && progress->Progress(progress, endOffset - *startOffset, (UInt64)(Int64)-1) != SZ_OK)
- return SZ_ERROR_PROGRESS;
- }
- return SZ_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/7zip.pri b/src/libs/7zip/win/CPP/7zip/7zip.pri
deleted file mode 100644
index a2b70a1f2..000000000
--- a/src/libs/7zip/win/CPP/7zip/7zip.pri
+++ /dev/null
@@ -1,6 +0,0 @@
-HEADERS += $$7ZIP_BASE/CPP/7zip/ICoder.h \
- $$7ZIP_BASE/CPP/7zip/IDecl.h \
- $$7ZIP_BASE/CPP/7zip/IPassword.h \
- $$7ZIP_BASE/CPP/7zip/IProgress.h \
- $$7ZIP_BASE/CPP/7zip/IStream.h \
- $$7ZIP_BASE/CPP/7zip/PropID.h
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7z.pri b/src/libs/7zip/win/CPP/7zip/Archive/7z/7z.pri
deleted file mode 100644
index 7763cf705..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7z.pri
+++ /dev/null
@@ -1,30 +0,0 @@
-HEADERS += $$7ZIP_BASE/CPP/7zip/Archive/7z/7zCompressionMode.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zDecode.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zEncode.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zFolderInStream.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zFolderOutStream.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zHandler.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zHeader.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zIn.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zItem.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zOut.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zProperties.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zSpecStream.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zUpdate.h \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/StdAfx.h
-
-SOURCES += $$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/7zRegister.cpp \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zSpecStream.cpp \
- $$7ZIP_BASE/CPP/7zip/Archive/7z/7zUpdate.cpp
-
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zCompressionMode.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zCompressionMode.h
deleted file mode 100644
index 5cde97c38..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zCompressionMode.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// 7zCompressionMode.h
-
-#ifndef __7Z_COMPRESSION_MODE_H
-#define __7Z_COMPRESSION_MODE_H
-
-#include "../../Common/MethodId.h"
-#include "../../Common/MethodProps.h"
-
-namespace NArchive {
-namespace N7z {
-
-struct CMethodFull: public CProps
-{
- CMethodId Id;
- UInt32 NumInStreams;
- UInt32 NumOutStreams;
-
- bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); }
-};
-
-struct CBind
-{
- UInt32 InCoder;
- UInt32 InStream;
- UInt32 OutCoder;
- UInt32 OutStream;
-};
-
-struct CCompressionMethodMode
-{
- CObjectVector<CMethodFull> Methods;
- CRecordVector<CBind> Binds;
- #ifndef _7ZIP_ST
- UInt32 NumThreads;
- #endif
- bool PasswordIsDefined;
- UString Password;
-
- bool IsEmpty() const { return (Methods.IsEmpty() && !PasswordIsDefined); }
- CCompressionMethodMode(): PasswordIsDefined(false)
- #ifndef _7ZIP_ST
- , NumThreads(1)
- #endif
- {}
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zDecode.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zDecode.cpp
deleted file mode 100644
index 973966bd3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zDecode.cpp
+++ /dev/null
@@ -1,343 +0,0 @@
-// 7zDecode.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/LockedStream.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamObjects.h"
-
-#include "7zDecode.h"
-
-namespace NArchive {
-namespace N7z {
-
-static void ConvertFolderItemInfoToBindInfo(const CFolder &folder,
- CBindInfoEx &bindInfo)
-{
- bindInfo.Clear();
- bindInfo.BindPairs.ClearAndSetSize(folder.BindPairs.Size());
- unsigned i;
- for (i = 0; i < folder.BindPairs.Size(); i++)
- {
- NCoderMixer::CBindPair &bindPair = bindInfo.BindPairs[i];
- bindPair.InIndex = (UInt32)folder.BindPairs[i].InIndex;
- bindPair.OutIndex = (UInt32)folder.BindPairs[i].OutIndex;
- }
-
- bindInfo.Coders.ClearAndSetSize(folder.Coders.Size());
- bindInfo.CoderMethodIDs.ClearAndSetSize(folder.Coders.Size());
-
- UInt32 outStreamIndex = 0;
- for (i = 0; i < folder.Coders.Size(); i++)
- {
- NCoderMixer::CCoderStreamsInfo &coderStreamsInfo = bindInfo.Coders[i];
- const CCoderInfo &coderInfo = folder.Coders[i];
- coderStreamsInfo.NumInStreams = (UInt32)coderInfo.NumInStreams;
- coderStreamsInfo.NumOutStreams = (UInt32)coderInfo.NumOutStreams;
- bindInfo.CoderMethodIDs[i] = coderInfo.MethodID;
- for (UInt32 j = 0; j < coderStreamsInfo.NumOutStreams; j++, outStreamIndex++)
- if (folder.FindBindPairForOutStream(outStreamIndex) < 0)
- bindInfo.OutStreams.Add(outStreamIndex);
- }
- bindInfo.InStreams.ClearAndSetSize(folder.PackStreams.Size());
- for (i = 0; i < folder.PackStreams.Size(); i++)
- bindInfo.InStreams[i] = (UInt32)folder.PackStreams[i];
-}
-
-static bool AreCodersEqual(const NCoderMixer::CCoderStreamsInfo &a1,
- const NCoderMixer::CCoderStreamsInfo &a2)
-{
- return (a1.NumInStreams == a2.NumInStreams) &&
- (a1.NumOutStreams == a2.NumOutStreams);
-}
-
-static bool AreBindPairsEqual(const NCoderMixer::CBindPair &a1, const NCoderMixer::CBindPair &a2)
-{
- return (a1.InIndex == a2.InIndex) &&
- (a1.OutIndex == a2.OutIndex);
-}
-
-static bool AreBindInfoExEqual(const CBindInfoEx &a1, const CBindInfoEx &a2)
-{
- if (a1.Coders.Size() != a2.Coders.Size())
- return false;
- unsigned i;
- for (i = 0; i < a1.Coders.Size(); i++)
- if (!AreCodersEqual(a1.Coders[i], a2.Coders[i]))
- return false;
- if (a1.BindPairs.Size() != a2.BindPairs.Size())
- return false;
- for (i = 0; i < a1.BindPairs.Size(); i++)
- if (!AreBindPairsEqual(a1.BindPairs[i], a2.BindPairs[i]))
- return false;
- for (i = 0; i < a1.CoderMethodIDs.Size(); i++)
- if (a1.CoderMethodIDs[i] != a2.CoderMethodIDs[i])
- return false;
- if (a1.InStreams.Size() != a2.InStreams.Size())
- return false;
- if (a1.OutStreams.Size() != a2.OutStreams.Size())
- return false;
- return true;
-}
-
-CDecoder::CDecoder(bool multiThread)
-{
- #ifndef _ST_MODE
- multiThread = true;
- #endif
- _multiThread = multiThread;
- _bindInfoExPrevIsDefined = false;
-}
-
-HRESULT CDecoder::Decode(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream,
- UInt64 startPos,
- const CFolders &folders, int folderIndex,
- ISequentialOutStream *outStream,
- ICompressProgressInfo *compressProgress
- _7Z_DECODER_CRYPRO_VARS_DECL
- #if !defined(_7ZIP_ST) && !defined(_SFX)
- , bool mtMode, UInt32 numThreads
- #endif
- )
-{
- const UInt64 *packPositions = &folders.PackPositions[folders.FoStartPackStreamIndex[folderIndex]];
- CFolder folderInfo;
- folders.ParseFolderInfo(folderIndex, folderInfo);
-
- if (!folderInfo.CheckStructure(folders.GetNumFolderUnpackSizes(folderIndex)))
- return E_NOTIMPL;
-
- /*
- We don't need to init isEncrypted and passwordIsDefined
- We must upgrade them only
- #ifndef _NO_CRYPTO
- isEncrypted = false;
- passwordIsDefined = false;
- #endif
- */
-
- CObjectVector< CMyComPtr<ISequentialInStream> > inStreams;
-
- CLockedInStream lockedInStream;
- lockedInStream.Init(inStream);
-
- for (unsigned j = 0; j < folderInfo.PackStreams.Size(); j++)
- {
- CLockedSequentialInStreamImp *lockedStreamImpSpec = new CLockedSequentialInStreamImp;
- CMyComPtr<ISequentialInStream> lockedStreamImp = lockedStreamImpSpec;
- lockedStreamImpSpec->Init(&lockedInStream, startPos + packPositions[j]);
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<ISequentialInStream> inStream = streamSpec;
- streamSpec->SetStream(lockedStreamImp);
- streamSpec->Init(packPositions[j + 1] - packPositions[j]);
- inStreams.Add(inStream);
- }
-
- unsigned numCoders = folderInfo.Coders.Size();
-
- CBindInfoEx bindInfo;
- ConvertFolderItemInfoToBindInfo(folderInfo, bindInfo);
- bool createNewCoders;
- if (!_bindInfoExPrevIsDefined)
- createNewCoders = true;
- else
- createNewCoders = !AreBindInfoExEqual(bindInfo, _bindInfoExPrev);
- if (createNewCoders)
- {
- unsigned i;
- _decoders.Clear();
- // _decoders2.Clear();
-
- _mixerCoder.Release();
-
- if (_multiThread)
- {
- _mixerCoderMTSpec = new NCoderMixer::CCoderMixer2MT;
- _mixerCoder = _mixerCoderMTSpec;
- _mixerCoderCommon = _mixerCoderMTSpec;
- }
- else
- {
- #ifdef _ST_MODE
- _mixerCoderSTSpec = new NCoderMixer::CCoderMixer2ST;
- _mixerCoder = _mixerCoderSTSpec;
- _mixerCoderCommon = _mixerCoderSTSpec;
- #endif
- }
- RINOK(_mixerCoderCommon->SetBindInfo(bindInfo));
-
- for (i = 0; i < numCoders; i++)
- {
- const CCoderInfo &coderInfo = folderInfo.Coders[i];
-
-
- CMyComPtr<ICompressCoder> decoder;
- CMyComPtr<ICompressCoder2> decoder2;
- RINOK(CreateCoder(
- EXTERNAL_CODECS_LOC_VARS
- coderInfo.MethodID, decoder, decoder2, false));
- CMyComPtr<IUnknown> decoderUnknown;
- if (coderInfo.IsSimpleCoder())
- {
- if (decoder == 0)
- return E_NOTIMPL;
-
- decoderUnknown = (IUnknown *)decoder;
-
- if (_multiThread)
- _mixerCoderMTSpec->AddCoder(decoder);
- #ifdef _ST_MODE
- else
- _mixerCoderSTSpec->AddCoder(decoder, false);
- #endif
- }
- else
- {
- if (decoder2 == 0)
- return E_NOTIMPL;
- decoderUnknown = (IUnknown *)decoder2;
- if (_multiThread)
- _mixerCoderMTSpec->AddCoder2(decoder2);
- #ifdef _ST_MODE
- else
- _mixerCoderSTSpec->AddCoder2(decoder2, false);
- #endif
- }
- _decoders.Add(decoderUnknown);
- #ifdef EXTERNAL_CODECS
- CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo;
- decoderUnknown.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo);
- if (setCompressCodecsInfo)
- {
- RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(__externalCodecs->GetCodecs));
- }
- #endif
- }
- _bindInfoExPrev = bindInfo;
- _bindInfoExPrevIsDefined = true;
- }
- unsigned i;
- _mixerCoderCommon->ReInit();
-
- UInt32 packStreamIndex = 0;
- UInt32 unpackStreamIndexStart = folders.FoToCoderUnpackSizes[folderIndex];
- UInt32 unpackStreamIndex = unpackStreamIndexStart;
- UInt32 coderIndex = 0;
- // UInt32 coder2Index = 0;
-
- for (i = 0; i < numCoders; i++)
- {
- const CCoderInfo &coderInfo = folderInfo.Coders[i];
- CMyComPtr<IUnknown> &decoder = _decoders[coderIndex];
-
- {
- CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;
- decoder.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties);
- if (setDecoderProperties)
- {
- const CByteBuffer &props = coderInfo.Props;
- size_t size = props.Size();
- if (size > 0xFFFFFFFF)
- return E_NOTIMPL;
- // if (size > 0)
- {
- RINOK(setDecoderProperties->SetDecoderProperties2((const Byte *)props, (UInt32)size));
- }
- }
- }
-
- #if !defined(_7ZIP_ST) && !defined(_SFX)
- if (mtMode)
- {
- CMyComPtr<ICompressSetCoderMt> setCoderMt;
- decoder.QueryInterface(IID_ICompressSetCoderMt, &setCoderMt);
- if (setCoderMt)
- {
- RINOK(setCoderMt->SetNumberOfThreads(numThreads));
- }
- }
- #endif
-
- #ifndef _NO_CRYPTO
- {
- CMyComPtr<ICryptoSetPassword> cryptoSetPassword;
- decoder.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword);
- if (cryptoSetPassword)
- {
- isEncrypted = true;
- if (!getTextPassword)
- return E_NOTIMPL;
- CMyComBSTR passwordBSTR;
- RINOK(getTextPassword->CryptoGetTextPassword(&passwordBSTR));
- passwordIsDefined = true;
- size_t len = 0;
- if (passwordBSTR)
- len = MyStringLen((BSTR)passwordBSTR);
- CByteBuffer buffer(len * 2);
- for (size_t i = 0; i < len; i++)
- {
- wchar_t c = passwordBSTR[i];
- ((Byte *)buffer)[i * 2] = (Byte)c;
- ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);
- }
- RINOK(cryptoSetPassword->CryptoSetPassword((const Byte *)buffer, (UInt32)buffer.Size()));
- }
- }
- #endif
-
- coderIndex++;
-
- UInt32 numInStreams = (UInt32)coderInfo.NumInStreams;
- UInt32 numOutStreams = (UInt32)coderInfo.NumOutStreams;
- CObjArray<UInt64> packSizes(numInStreams);
- CObjArray<const UInt64 *> packSizesPointers(numInStreams);
- CObjArray<const UInt64 *> unpackSizesPointers(numOutStreams);
- UInt32 j;
-
- for (j = 0; j < numOutStreams; j++, unpackStreamIndex++)
- unpackSizesPointers[j] = &folders.CoderUnpackSizes[unpackStreamIndex];
-
- for (j = 0; j < numInStreams; j++, packStreamIndex++)
- {
- int bindPairIndex = folderInfo.FindBindPairForInStream(packStreamIndex);
- if (bindPairIndex >= 0)
- packSizesPointers[j] = &folders.CoderUnpackSizes[unpackStreamIndexStart + (UInt32)folderInfo.BindPairs[bindPairIndex].OutIndex];
- else
- {
- int index = folderInfo.FindPackStreamArrayIndex(packStreamIndex);
- if (index < 0)
- return S_FALSE; // check it
- packSizes[j] = packPositions[index + 1] - packPositions[index];
- packSizesPointers[j] = &packSizes[j];
- }
- }
-
- _mixerCoderCommon->SetCoderInfo(i, packSizesPointers, unpackSizesPointers);
- }
- UInt32 mainCoder, temp;
- bindInfo.FindOutStream(bindInfo.OutStreams[0], mainCoder, temp);
-
- if (_multiThread)
- _mixerCoderMTSpec->SetProgressCoderIndex(mainCoder);
- /*
- else
- _mixerCoderSTSpec->SetProgressCoderIndex(mainCoder);;
- */
-
- if (numCoders == 0)
- return 0;
- unsigned num = inStreams.Size();
- CObjArray<ISequentialInStream *> inStreamPointers(num);
- for (i = 0; i < num; i++)
- inStreamPointers[i] = inStreams[i];
- ISequentialOutStream *outStreamPointer = outStream;
- return _mixerCoder->Code(
- inStreamPointers, NULL, num,
- &outStreamPointer, NULL, 1,
- compressProgress);
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zDecode.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zDecode.h
deleted file mode 100644
index 54e9d2b52..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zDecode.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// 7zDecode.h
-
-#ifndef __7Z_DECODE_H
-#define __7Z_DECODE_H
-
-#include "../../IStream.h"
-#include "../../IPassword.h"
-
-#include "../Common/CoderMixer2.h"
-#include "../Common/CoderMixer2MT.h"
-#ifdef _ST_MODE
-#include "../Common/CoderMixer2ST.h"
-#endif
-
-#include "../../Common/CreateCoder.h"
-
-#include "7zIn.h"
-
-namespace NArchive {
-namespace N7z {
-
-struct CBindInfoEx: public NCoderMixer::CBindInfo
-{
- CRecordVector<CMethodId> CoderMethodIDs;
- void Clear()
- {
- CBindInfo::Clear();
- CoderMethodIDs.Clear();
- }
-};
-
-class CDecoder
-{
- bool _bindInfoExPrevIsDefined;
- CBindInfoEx _bindInfoExPrev;
-
- bool _multiThread;
- #ifdef _ST_MODE
- NCoderMixer::CCoderMixer2ST *_mixerCoderSTSpec;
- #endif
- NCoderMixer::CCoderMixer2MT *_mixerCoderMTSpec;
- NCoderMixer::CCoderMixer2 *_mixerCoderCommon;
-
- CMyComPtr<ICompressCoder2> _mixerCoder;
- CObjectVector<CMyComPtr<IUnknown> > _decoders;
- // CObjectVector<CMyComPtr<ICompressCoder2> > _decoders2;
-public:
- CDecoder(bool multiThread);
- HRESULT Decode(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream,
- UInt64 startPos,
- const CFolders &folders, int folderIndex,
- ISequentialOutStream *outStream,
- ICompressProgressInfo *compressProgress
- _7Z_DECODER_CRYPRO_VARS_DECL
- #if !defined(_7ZIP_ST) && !defined(_SFX)
- , bool mtMode, UInt32 numThreads
- #endif
- );
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zEncode.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zEncode.cpp
deleted file mode 100644
index 5f1436fc7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zEncode.cpp
+++ /dev/null
@@ -1,464 +0,0 @@
-// 7zEncode.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/FilterCoder.h"
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/InOutTempBuffer.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamObjects.h"
-
-#include "7zEncode.h"
-#include "7zSpecStream.h"
-
-static const UInt64 k_Delta = 0x03;
-static const UInt64 k_BCJ = 0x03030103;
-static const UInt64 k_BCJ2 = 0x0303011B;
-
-namespace NArchive {
-namespace N7z {
-
-static void ConvertBindInfoToFolderItemInfo(const NCoderMixer::CBindInfo &bindInfo,
- const CRecordVector<CMethodId> decompressionMethods,
- CFolder &folder)
-{
- // bindInfo.CoderMethodIDs.Clear();
- // folder.OutStreams.Clear();
- folder.BindPairs.SetSize(bindInfo.BindPairs.Size());
- unsigned i;
- for (i = 0; i < bindInfo.BindPairs.Size(); i++)
- {
- CBindPair &bp = folder.BindPairs[i];
- const NCoderMixer::CBindPair &mixerBp = bindInfo.BindPairs[i];
- bp.InIndex = mixerBp.InIndex;
- bp.OutIndex = mixerBp.OutIndex;
- }
- folder.Coders.SetSize(bindInfo.Coders.Size());
- for (i = 0; i < bindInfo.Coders.Size(); i++)
- {
- CCoderInfo &coderInfo = folder.Coders[i];
- const NCoderMixer::CCoderStreamsInfo &coderStreamsInfo = bindInfo.Coders[i];
- coderInfo.NumInStreams = coderStreamsInfo.NumInStreams;
- coderInfo.NumOutStreams = coderStreamsInfo.NumOutStreams;
- coderInfo.MethodID = decompressionMethods[i];
- // coderInfo.Props can be nonFree;
- }
- folder.PackStreams.SetSize(bindInfo.InStreams.Size());
- for (i = 0; i < bindInfo.InStreams.Size(); i++)
- folder.PackStreams[i] = bindInfo.InStreams[i];
-}
-
-static HRESULT SetCoderProps2(const CProps &props, const UInt64 *dataSizeReduce, IUnknown *coder)
-{
- CMyComPtr<ICompressSetCoderProperties> setCoderProperties;
- coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties);
- if (setCoderProperties)
- return props.SetCoderProps(setCoderProperties, dataSizeReduce);
- return props.AreThereNonOptionalProps() ? E_INVALIDARG : S_OK;
-}
-
-HRESULT CEncoder::CreateMixerCoder(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const UInt64 *inSizeForReduce)
-{
- _mixerCoderSpec = new NCoderMixer::CCoderMixer2MT;
- _mixerCoder = _mixerCoderSpec;
- RINOK(_mixerCoderSpec->SetBindInfo(_bindInfo));
- FOR_VECTOR (i, _options.Methods)
- {
- const CMethodFull &methodFull = _options.Methods[i];
- CCoderInfo &encodingInfo = _codersInfo.AddNew();
- encodingInfo.MethodID = methodFull.Id;
- CMyComPtr<ICompressCoder> encoder;
- CMyComPtr<ICompressCoder2> encoder2;
-
-
- RINOK(CreateCoder(
- EXTERNAL_CODECS_LOC_VARS
- methodFull.Id, encoder, encoder2, true));
-
- if (!encoder && !encoder2)
- return E_FAIL;
-
- CMyComPtr<IUnknown> encoderCommon = encoder ? (IUnknown *)encoder : (IUnknown *)encoder2;
-
- #ifndef _7ZIP_ST
- {
- CMyComPtr<ICompressSetCoderMt> setCoderMt;
- encoderCommon.QueryInterface(IID_ICompressSetCoderMt, &setCoderMt);
- if (setCoderMt)
- {
- RINOK(setCoderMt->SetNumberOfThreads(_options.NumThreads));
- }
- }
- #endif
-
- RINOK(SetCoderProps2(methodFull, inSizeForReduce, encoderCommon));
-
- /*
- CMyComPtr<ICryptoResetSalt> resetSalt;
- encoderCommon.QueryInterface(IID_ICryptoResetSalt, (void **)&resetSalt);
- if (resetSalt)
- {
- resetSalt->ResetSalt();
- }
- */
-
- #ifdef EXTERNAL_CODECS
- CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo;
- encoderCommon.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo);
- if (setCompressCodecsInfo)
- {
- RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(__externalCodecs->GetCodecs));
- }
- #endif
-
- CMyComPtr<ICryptoSetPassword> cryptoSetPassword;
- encoderCommon.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword);
-
- if (cryptoSetPassword)
- {
- const UInt32 sizeInBytes = _options.Password.Len() * 2;
- CByteBuffer buffer(sizeInBytes);
- for (unsigned i = 0; i < _options.Password.Len(); i++)
- {
- wchar_t c = _options.Password[i];
- ((Byte *)buffer)[i * 2] = (Byte)c;
- ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);
- }
- RINOK(cryptoSetPassword->CryptoSetPassword((const Byte *)buffer, sizeInBytes));
- }
-
- if (encoder)
- _mixerCoderSpec->AddCoder(encoder);
- else
- _mixerCoderSpec->AddCoder2(encoder2);
- }
- return S_OK;
-}
-
-HRESULT CEncoder::Encode(
- DECL_EXTERNAL_CODECS_LOC_VARS
- ISequentialInStream *inStream,
- const UInt64 *inStreamSize, const UInt64 *inSizeForReduce,
- CFolder &folderItem,
- CRecordVector<UInt64> &coderUnpackSizes,
- UInt64 &unpackSize,
- ISequentialOutStream *outStream,
- CRecordVector<UInt64> &packSizes,
- ICompressProgressInfo *compressProgress)
-{
- RINOK(EncoderConstr());
-
- if (!_mixerCoderSpec)
- {
- RINOK(CreateMixerCoder(EXTERNAL_CODECS_LOC_VARS inSizeForReduce));
- }
- _mixerCoderSpec->ReInit();
- // _mixerCoderSpec->SetCoderInfo(0, NULL, NULL, progress);
-
- CObjectVector<CInOutTempBuffer> inOutTempBuffers;
- CObjectVector<CSequentialOutTempBufferImp *> tempBufferSpecs;
- CObjectVector<CMyComPtr<ISequentialOutStream> > tempBuffers;
- unsigned numMethods = _bindInfo.Coders.Size();
- unsigned i;
- for (i = 1; i < _bindInfo.OutStreams.Size(); i++)
- {
- CInOutTempBuffer &iotb = inOutTempBuffers.AddNew();
- iotb.Create();
- iotb.InitWriting();
- }
- for (i = 1; i < _bindInfo.OutStreams.Size(); i++)
- {
- CSequentialOutTempBufferImp *tempBufferSpec = new CSequentialOutTempBufferImp;
- CMyComPtr<ISequentialOutStream> tempBuffer = tempBufferSpec;
- tempBufferSpec->Init(&inOutTempBuffers[i - 1]);
- tempBuffers.Add(tempBuffer);
- tempBufferSpecs.Add(tempBufferSpec);
- }
-
- for (i = 0; i < numMethods; i++)
- _mixerCoderSpec->SetCoderInfo(i, NULL, NULL);
-
- if (_bindInfo.InStreams.IsEmpty())
- return E_FAIL;
- UInt32 mainCoderIndex, mainStreamIndex;
- _bindInfo.FindInStream(_bindInfo.InStreams[0], mainCoderIndex, mainStreamIndex);
-
- if (inStreamSize)
- {
- CRecordVector<const UInt64 *> sizePointers;
- for (UInt32 i = 0; i < _bindInfo.Coders[mainCoderIndex].NumInStreams; i++)
- if (i == mainStreamIndex)
- sizePointers.Add(inStreamSize);
- else
- sizePointers.Add(NULL);
- _mixerCoderSpec->SetCoderInfo(mainCoderIndex, &sizePointers.Front(), NULL);
- }
-
-
- // UInt64 outStreamStartPos;
- // RINOK(stream->Seek(0, STREAM_SEEK_CUR, &outStreamStartPos));
-
- CSequentialInStreamSizeCount2 *inStreamSizeCountSpec = new CSequentialInStreamSizeCount2;
- CMyComPtr<ISequentialInStream> inStreamSizeCount = inStreamSizeCountSpec;
- CSequentialOutStreamSizeCount *outStreamSizeCountSpec = NULL;
- CMyComPtr<ISequentialOutStream> outStreamSizeCount;
-
- inStreamSizeCountSpec->Init(inStream);
-
- CRecordVector<ISequentialInStream *> inStreamPointers;
- CRecordVector<ISequentialOutStream *> outStreamPointers;
- inStreamPointers.Add(inStreamSizeCount);
-
- if (_bindInfo.OutStreams.Size() != 0)
- {
- outStreamSizeCountSpec = new CSequentialOutStreamSizeCount;
- outStreamSizeCount = outStreamSizeCountSpec;
- outStreamSizeCountSpec->SetStream(outStream);
- outStreamSizeCountSpec->Init();
- outStreamPointers.Add(outStreamSizeCount);
- }
-
- for (i = 1; i < _bindInfo.OutStreams.Size(); i++)
- outStreamPointers.Add(tempBuffers[i - 1]);
-
- for (i = 0; i < _codersInfo.Size(); i++)
- {
- CCoderInfo &encodingInfo = _codersInfo[i];
-
- CMyComPtr<ICryptoResetInitVector> resetInitVector;
- _mixerCoderSpec->_coders[i].QueryInterface(IID_ICryptoResetInitVector, (void **)&resetInitVector);
- if (resetInitVector)
- {
- resetInitVector->ResetInitVector();
- }
-
- CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties;
- _mixerCoderSpec->_coders[i].QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderProperties);
- if (writeCoderProperties)
- {
- CDynBufSeqOutStream *outStreamSpec = new CDynBufSeqOutStream;
- CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
- outStreamSpec->Init();
- writeCoderProperties->WriteCoderProperties(outStream);
- outStreamSpec->CopyToBuffer(encodingInfo.Props);
- }
- }
-
- UInt32 progressIndex = mainCoderIndex;
-
- for (i = 0; i + 1 < _codersInfo.Size(); i++)
- {
- UInt64 m = _codersInfo[i].MethodID;
- if (m == k_Delta || m == k_BCJ || m == k_BCJ2)
- progressIndex = i + 1;
- }
-
- _mixerCoderSpec->SetProgressCoderIndex(progressIndex);
-
- RINOK(_mixerCoder->Code(&inStreamPointers.Front(), NULL, 1,
- &outStreamPointers.Front(), NULL, outStreamPointers.Size(), compressProgress));
-
- ConvertBindInfoToFolderItemInfo(_decompressBindInfo, _decompressionMethods, folderItem);
-
- if (_bindInfo.OutStreams.Size() != 0)
- packSizes.Add(outStreamSizeCountSpec->GetSize());
-
- for (i = 1; i < _bindInfo.OutStreams.Size(); i++)
- {
- CInOutTempBuffer &inOutTempBuffer = inOutTempBuffers[i - 1];
- RINOK(inOutTempBuffer.WriteToStream(outStream));
- packSizes.Add(inOutTempBuffer.GetDataSize());
- }
-
- unpackSize = 0;
- for (i = 0; i < (int)_bindReverseConverter->NumSrcInStreams; i++)
- {
- int binder = _bindInfo.FindBinderForInStream(
- _bindReverseConverter->DestOutToSrcInMap[i]);
- UInt64 streamSize;
- if (binder < 0)
- {
- streamSize = inStreamSizeCountSpec->GetSize();
- unpackSize = streamSize;
- }
- else
- streamSize = _mixerCoderSpec->GetWriteProcessedSize(binder);
- coderUnpackSizes.Add(streamSize);
- }
- for (i = 0; i < numMethods; i++)
- folderItem.Coders[numMethods - 1 - i].Props = _codersInfo[i].Props;
- return S_OK;
-}
-
-
-CEncoder::CEncoder(const CCompressionMethodMode &options):
- _bindReverseConverter(0),
- _constructed(false)
-{
- if (options.IsEmpty())
- throw 1;
-
- _options = options;
- _mixerCoderSpec = NULL;
-}
-
-HRESULT CEncoder::EncoderConstr()
-{
- if (_constructed)
- return S_OK;
- if (_options.Methods.IsEmpty())
- {
- // it has only password method;
- if (!_options.PasswordIsDefined)
- throw 1;
- if (!_options.Binds.IsEmpty())
- throw 1;
- NCoderMixer::CCoderStreamsInfo coderStreamsInfo;
- CMethodFull method;
-
- method.NumInStreams = 1;
- method.NumOutStreams = 1;
- coderStreamsInfo.NumInStreams = 1;
- coderStreamsInfo.NumOutStreams = 1;
- method.Id = k_AES;
-
- _options.Methods.Add(method);
- _bindInfo.Coders.Add(coderStreamsInfo);
-
- _bindInfo.InStreams.Add(0);
- _bindInfo.OutStreams.Add(0);
- }
- else
- {
-
- UInt32 numInStreams = 0, numOutStreams = 0;
- unsigned i;
- for (i = 0; i < _options.Methods.Size(); i++)
- {
- const CMethodFull &methodFull = _options.Methods[i];
- NCoderMixer::CCoderStreamsInfo coderStreamsInfo;
- coderStreamsInfo.NumInStreams = methodFull.NumOutStreams;
- coderStreamsInfo.NumOutStreams = methodFull.NumInStreams;
- if (_options.Binds.IsEmpty())
- {
- if (i < _options.Methods.Size() - 1)
- {
- NCoderMixer::CBindPair bindPair;
- bindPair.InIndex = numInStreams + coderStreamsInfo.NumInStreams;
- bindPair.OutIndex = numOutStreams;
- _bindInfo.BindPairs.Add(bindPair);
- }
- else if (coderStreamsInfo.NumOutStreams != 0)
- _bindInfo.OutStreams.Insert(0, numOutStreams);
- for (UInt32 j = 1; j < coderStreamsInfo.NumOutStreams; j++)
- _bindInfo.OutStreams.Add(numOutStreams + j);
- }
-
- numInStreams += coderStreamsInfo.NumInStreams;
- numOutStreams += coderStreamsInfo.NumOutStreams;
-
- _bindInfo.Coders.Add(coderStreamsInfo);
- }
-
- if (!_options.Binds.IsEmpty())
- {
- for (i = 0; i < _options.Binds.Size(); i++)
- {
- NCoderMixer::CBindPair bindPair;
- const CBind &bind = _options.Binds[i];
- bindPair.InIndex = _bindInfo.GetCoderInStreamIndex(bind.InCoder) + bind.InStream;
- bindPair.OutIndex = _bindInfo.GetCoderOutStreamIndex(bind.OutCoder) + bind.OutStream;
- _bindInfo.BindPairs.Add(bindPair);
- }
- for (i = 0; i < (int)numOutStreams; i++)
- if (_bindInfo.FindBinderForOutStream(i) == -1)
- _bindInfo.OutStreams.Add(i);
- }
-
- for (i = 0; i < (int)numInStreams; i++)
- if (_bindInfo.FindBinderForInStream(i) == -1)
- _bindInfo.InStreams.Add(i);
-
- if (_bindInfo.InStreams.IsEmpty())
- throw 1; // this is error
-
- // Make main stream first in list
- int inIndex = _bindInfo.InStreams[0];
- for (;;)
- {
- UInt32 coderIndex, coderStreamIndex;
- _bindInfo.FindInStream(inIndex, coderIndex, coderStreamIndex);
- UInt32 outIndex = _bindInfo.GetCoderOutStreamIndex(coderIndex);
- int binder = _bindInfo.FindBinderForOutStream(outIndex);
- if (binder >= 0)
- {
- inIndex = _bindInfo.BindPairs[binder].InIndex;
- continue;
- }
- for (i = 0; i < _bindInfo.OutStreams.Size(); i++)
- if (_bindInfo.OutStreams[i] == outIndex)
- {
- _bindInfo.OutStreams.Delete(i);
- _bindInfo.OutStreams.Insert(0, outIndex);
- break;
- }
- break;
- }
-
- if (_options.PasswordIsDefined)
- {
- unsigned numCryptoStreams = _bindInfo.OutStreams.Size();
-
- for (i = 0; i < numCryptoStreams; i++)
- {
- NCoderMixer::CBindPair bindPair;
- bindPair.InIndex = numInStreams + i;
- bindPair.OutIndex = _bindInfo.OutStreams[i];
- _bindInfo.BindPairs.Add(bindPair);
- }
- _bindInfo.OutStreams.Clear();
-
- /*
- if (numCryptoStreams == 0)
- numCryptoStreams = 1;
- */
-
- for (i = 0; i < numCryptoStreams; i++)
- {
- NCoderMixer::CCoderStreamsInfo coderStreamsInfo;
- CMethodFull method;
- method.NumInStreams = 1;
- method.NumOutStreams = 1;
- coderStreamsInfo.NumInStreams = method.NumOutStreams;
- coderStreamsInfo.NumOutStreams = method.NumInStreams;
- method.Id = k_AES;
-
- _options.Methods.Add(method);
- _bindInfo.Coders.Add(coderStreamsInfo);
- _bindInfo.OutStreams.Add(numOutStreams + i);
- }
- }
-
- }
-
- for (int i = _options.Methods.Size() - 1; i >= 0; i--)
- {
- const CMethodFull &methodFull = _options.Methods[i];
- _decompressionMethods.Add(methodFull.Id);
- }
-
- _bindReverseConverter = new NCoderMixer::CBindReverseConverter(_bindInfo);
- _bindReverseConverter->CreateReverseBindInfo(_decompressBindInfo);
- _constructed = true;
- return S_OK;
-}
-
-CEncoder::~CEncoder()
-{
- delete _bindReverseConverter;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zEncode.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zEncode.h
deleted file mode 100644
index 8e20bdb5f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zEncode.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// 7zEncode.h
-
-#ifndef __7Z_ENCODE_H
-#define __7Z_ENCODE_H
-
-// #include "../../Common/StreamObjects.h"
-
-#include "7zCompressionMode.h"
-
-#include "../Common/CoderMixer2.h"
-#include "../Common/CoderMixer2MT.h"
-#ifdef _ST_MODE
-#include "../Common/CoderMixer2ST.h"
-#endif
-#include "7zItem.h"
-
-#include "../../Common/CreateCoder.h"
-
-namespace NArchive {
-namespace N7z {
-
-class CEncoder
-{
- NCoderMixer::CCoderMixer2MT *_mixerCoderSpec;
- CMyComPtr<ICompressCoder2> _mixerCoder;
-
- CObjectVector<CCoderInfo> _codersInfo;
-
- CCompressionMethodMode _options;
- NCoderMixer::CBindInfo _bindInfo;
- NCoderMixer::CBindInfo _decompressBindInfo;
- NCoderMixer::CBindReverseConverter *_bindReverseConverter;
- CRecordVector<CMethodId> _decompressionMethods;
-
- HRESULT CreateMixerCoder(DECL_EXTERNAL_CODECS_LOC_VARS
- const UInt64 *inSizeForReduce);
-
- bool _constructed;
-public:
- CEncoder(const CCompressionMethodMode &options);
- ~CEncoder();
- HRESULT EncoderConstr();
- HRESULT Encode(
- DECL_EXTERNAL_CODECS_LOC_VARS
- ISequentialInStream *inStream,
- const UInt64 *inStreamSize, const UInt64 *inSizeForReduce,
- CFolder &folderItem,
- CRecordVector<UInt64> &coderUnpackSizes,
- UInt64 &unpackSize,
- ISequentialOutStream *outStream,
- CRecordVector<UInt64> &packSizes,
- ICompressProgressInfo *compressProgress);
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zExtract.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zExtract.cpp
deleted file mode 100644
index bb350455c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zExtract.cpp
+++ /dev/null
@@ -1,262 +0,0 @@
-// 7zExtract.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/ComTry.h"
-
-#include "../../Common/ProgressUtils.h"
-
-#include "7zDecode.h"
-// #include "7z1Decode.h"
-#include "7zFolderOutStream.h"
-#include "7zHandler.h"
-
-namespace NArchive {
-namespace N7z {
-
-struct CExtractFolderInfo
-{
- #ifdef _7Z_VOL
- int VolumeIndex;
- #endif
- CNum FileIndex;
- CNum FolderIndex;
- CBoolVector ExtractStatuses;
- UInt64 UnpackSize;
- CExtractFolderInfo(
- #ifdef _7Z_VOL
- int volumeIndex,
- #endif
- CNum fileIndex, CNum folderIndex):
- #ifdef _7Z_VOL
- VolumeIndex(volumeIndex),
- #endif
- FileIndex(fileIndex),
- FolderIndex(folderIndex),
- UnpackSize(0)
- {
- if (fileIndex != kNumNoIndex)
- {
- ExtractStatuses.ClearAndSetSize(1);
- ExtractStatuses[0] = true;
- }
- };
-};
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
- Int32 testModeSpec, IArchiveExtractCallback *extractCallbackSpec)
-{
- COM_TRY_BEGIN
- bool testMode = (testModeSpec != 0);
- CMyComPtr<IArchiveExtractCallback> extractCallback = extractCallbackSpec;
- UInt64 importantTotalUnpacked = 0;
-
- bool allFilesMode = (numItems == (UInt32)(Int32)-1);
- if (allFilesMode)
- numItems =
- #ifdef _7Z_VOL
- _refs.Size();
- #else
- _db.Files.Size();
- #endif
-
- if (numItems == 0)
- return S_OK;
-
- /*
- if (_volumes.Size() != 1)
- return E_FAIL;
- const CVolume &volume = _volumes.Front();
- const CDbEx &_db = volume.Database;
- IInStream *_inStream = volume.Stream;
- */
-
- CObjectVector<CExtractFolderInfo> extractFolderInfoVector;
- for (UInt32 ii = 0; ii < numItems; ii++)
- {
- // UInt32 fileIndex = allFilesMode ? indexIndex : indices[indexIndex];
- UInt32 ref2Index = allFilesMode ? ii : indices[ii];
- // const CRef2 &ref2 = _refs[ref2Index];
-
- // for (UInt32 ri = 0; ri < ref2.Refs.Size(); ri++)
- {
- #ifdef _7Z_VOL
- // const CRef &ref = ref2.Refs[ri];
- const CRef &ref = _refs[ref2Index];
-
- int volumeIndex = ref.VolumeIndex;
- const CVolume &volume = _volumes[volumeIndex];
- const CDbEx &db = volume.Database;
- UInt32 fileIndex = ref.ItemIndex;
- #else
- const CDbEx &db = _db;
- UInt32 fileIndex = ref2Index;
- #endif
-
- CNum folderIndex = db.FileIndexToFolderIndexMap[fileIndex];
- if (folderIndex == kNumNoIndex)
- {
- extractFolderInfoVector.Add(CExtractFolderInfo(
- #ifdef _7Z_VOL
- volumeIndex,
- #endif
- fileIndex, kNumNoIndex));
- continue;
- }
- if (extractFolderInfoVector.IsEmpty() ||
- folderIndex != extractFolderInfoVector.Back().FolderIndex
- #ifdef _7Z_VOL
- || volumeIndex != extractFolderInfoVector.Back().VolumeIndex
- #endif
- )
- {
- extractFolderInfoVector.Add(CExtractFolderInfo(
- #ifdef _7Z_VOL
- volumeIndex,
- #endif
- kNumNoIndex, folderIndex));
- UInt64 unpackSize = db.GetFolderUnpackSize(folderIndex);
- importantTotalUnpacked += unpackSize;
- extractFolderInfoVector.Back().UnpackSize = unpackSize;
- }
-
- CExtractFolderInfo &efi = extractFolderInfoVector.Back();
-
- // const CFolderInfo &folderInfo = m_dam_Folders[folderIndex];
- CNum startIndex = db.FolderStartFileIndex[folderIndex];
- for (CNum index = efi.ExtractStatuses.Size();
- index <= fileIndex - startIndex; index++)
- {
- // UInt64 unpackSize = _db.Files[startIndex + index].UnpackSize;
- // Count partial_folder_size
- // efi.UnpackSize += unpackSize;
- // importantTotalUnpacked += unpackSize;
- efi.ExtractStatuses.Add(index == fileIndex - startIndex);
- }
- }
- }
-
- RINOK(extractCallback->SetTotal(importantTotalUnpacked));
-
- CDecoder decoder(
- #ifdef _ST_MODE
- false
- #else
- true
- #endif
- );
- // CDecoder1 decoder;
-
- UInt64 totalPacked = 0;
- UInt64 totalUnpacked = 0;
- UInt64 curPacked, curUnpacked;
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(extractCallback, false);
-
- for (unsigned i = 0;; i++, totalUnpacked += curUnpacked, totalPacked += curPacked)
- {
- lps->OutSize = totalUnpacked;
- lps->InSize = totalPacked;
- RINOK(lps->SetCur());
-
- if (i >= extractFolderInfoVector.Size())
- break;
-
- const CExtractFolderInfo &efi = extractFolderInfoVector[i];
- curUnpacked = efi.UnpackSize;
- curPacked = 0;
-
- CFolderOutStream *folderOutStream = new CFolderOutStream;
- CMyComPtr<ISequentialOutStream> outStream(folderOutStream);
-
- #ifdef _7Z_VOL
- const CVolume &volume = _volumes[efi.VolumeIndex];
- const CDbEx &db = volume.Database;
- #else
- const CDbEx &db = _db;
- #endif
-
- CNum startIndex;
- if (efi.FileIndex != kNumNoIndex)
- startIndex = efi.FileIndex;
- else
- startIndex = db.FolderStartFileIndex[efi.FolderIndex];
-
- HRESULT result = folderOutStream->Init(&db,
- #ifdef _7Z_VOL
- volume.StartRef2Index,
- #else
- 0,
- #endif
- startIndex,
- &efi.ExtractStatuses, extractCallback, testMode, _crcSize != 0);
-
- RINOK(result);
-
- if (efi.FileIndex != kNumNoIndex)
- continue;
-
- CNum folderIndex = efi.FolderIndex;
- curPacked = _db.GetFolderFullPackSize(folderIndex);
-
- #ifndef _NO_CRYPTO
- CMyComPtr<ICryptoGetTextPassword> getTextPassword;
- if (extractCallback)
- extractCallback.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword);
- #endif
-
- try
- {
- #ifndef _NO_CRYPTO
- bool isEncrypted = false;
- bool passwordIsDefined = false;
- #endif
-
- HRESULT result = decoder.Decode(
- EXTERNAL_CODECS_VARS
- #ifdef _7Z_VOL
- volume.Stream,
- #else
- _inStream,
- #endif
- db.ArcInfo.DataStartPosition,
- db, folderIndex,
- outStream,
- progress
- _7Z_DECODER_CRYPRO_VARS
- #if !defined(_7ZIP_ST) && !defined(_SFX)
- , true, _numThreads
- #endif
- );
-
- if (result == S_FALSE)
- {
- RINOK(folderOutStream->FlushCorrupted(NExtract::NOperationResult::kDataError));
- continue;
- }
- if (result == E_NOTIMPL)
- {
- RINOK(folderOutStream->FlushCorrupted(NExtract::NOperationResult::kUnsupportedMethod));
- continue;
- }
- if (result != S_OK)
- return result;
- if (folderOutStream->WasWritingFinished() != S_OK)
- {
- RINOK(folderOutStream->FlushCorrupted(NExtract::NOperationResult::kDataError));
- continue;
- }
- }
- catch(...)
- {
- RINOK(folderOutStream->FlushCorrupted(NExtract::NOperationResult::kDataError));
- continue;
- }
- }
- return S_OK;
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderInStream.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderInStream.cpp
deleted file mode 100644
index 3f420a513..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderInStream.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-// 7zFolderInStream.cpp
-
-#include "StdAfx.h"
-
-#include "7zFolderInStream.h"
-
-namespace NArchive {
-namespace N7z {
-
-CFolderInStream::CFolderInStream()
-{
- _inStreamWithHashSpec = new CSequentialInStreamWithCRC;
- _inStreamWithHash = _inStreamWithHashSpec;
-}
-
-void CFolderInStream::Init(IArchiveUpdateCallback *updateCallback,
- const UInt32 *fileIndices, UInt32 numFiles)
-{
- _updateCallback = updateCallback;
- _numFiles = numFiles;
- _fileIndex = 0;
- _fileIndices = fileIndices;
- Processed.Clear();
- CRCs.Clear();
- Sizes.Clear();
- _fileIsOpen = false;
- _currentSizeIsDefined = false;
-}
-
-HRESULT CFolderInStream::OpenStream()
-{
- _filePos = 0;
- while (_fileIndex < _numFiles)
- {
- CMyComPtr<ISequentialInStream> stream;
- HRESULT result = _updateCallback->GetStream(_fileIndices[_fileIndex], &stream);
- if (result != S_OK && result != S_FALSE)
- return result;
- _fileIndex++;
- _inStreamWithHashSpec->SetStream(stream);
- _inStreamWithHashSpec->Init();
- if (stream)
- {
- _fileIsOpen = true;
- CMyComPtr<IStreamGetSize> streamGetSize;
- stream.QueryInterface(IID_IStreamGetSize, &streamGetSize);
- if (streamGetSize)
- {
- RINOK(streamGetSize->GetSize(&_currentSize));
- _currentSizeIsDefined = true;
- }
- return S_OK;
- }
- RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- Sizes.Add(0);
- Processed.Add(result == S_OK);
- AddDigest();
- }
- return S_OK;
-}
-
-void CFolderInStream::AddDigest()
-{
- CRCs.Add(_inStreamWithHashSpec->GetCRC());
-}
-
-HRESULT CFolderInStream::CloseStream()
-{
- RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
- _inStreamWithHashSpec->ReleaseStream();
- _fileIsOpen = false;
- _currentSizeIsDefined = false;
- Processed.Add(true);
- Sizes.Add(_filePos);
- AddDigest();
- return S_OK;
-}
-
-STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != 0)
- *processedSize = 0;
- while (size > 0)
- {
- if (_fileIsOpen)
- {
- UInt32 processed2;
- RINOK(_inStreamWithHash->Read(data, size, &processed2));
- if (processed2 == 0)
- {
- RINOK(CloseStream());
- continue;
- }
- if (processedSize != 0)
- *processedSize = processed2;
- _filePos += processed2;
- break;
- }
- if (_fileIndex >= _numFiles)
- break;
- RINOK(OpenStream());
- }
- return S_OK;
-}
-
-STDMETHODIMP CFolderInStream::GetSubStreamSize(UInt64 subStream, UInt64 *value)
-{
- *value = 0;
- unsigned index2 = (unsigned)subStream;
- if (subStream > Sizes.Size())
- return E_FAIL;
- if (index2 < Sizes.Size())
- {
- *value = Sizes[index2];
- return S_OK;
- }
- if (!_currentSizeIsDefined)
- return S_FALSE;
- *value = _currentSize;
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderInStream.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderInStream.h
deleted file mode 100644
index 4ed4b2dd2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderInStream.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// 7zFolderInStream.h
-
-#ifndef __7Z_FOLDER_IN_STREAM_H
-#define __7Z_FOLDER_IN_STREAM_H
-
-#include "../../ICoder.h"
-#include "../IArchive.h"
-#include "../Common/InStreamWithCRC.h"
-
-#include "7zItem.h"
-
-namespace NArchive {
-namespace N7z {
-
-class CFolderInStream:
- public ISequentialInStream,
- public ICompressGetSubStreamSize,
- public CMyUnknownImp
-{
- CSequentialInStreamWithCRC *_inStreamWithHashSpec;
- CMyComPtr<ISequentialInStream> _inStreamWithHash;
- CMyComPtr<IArchiveUpdateCallback> _updateCallback;
-
- bool _currentSizeIsDefined;
- bool _fileIsOpen;
- UInt64 _currentSize;
- UInt64 _filePos;
- const UInt32 *_fileIndices;
- UInt32 _numFiles;
- UInt32 _fileIndex;
-
- HRESULT OpenStream();
- HRESULT CloseStream();
- void AddDigest();
-
-public:
- CRecordVector<bool> Processed;
- CRecordVector<UInt32> CRCs;
- CRecordVector<UInt64> Sizes;
-
- MY_UNKNOWN_IMP1(ICompressGetSubStreamSize)
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value);
-
- CFolderInStream();
- void Init(IArchiveUpdateCallback *updateCallback, const UInt32 *fileIndices, UInt32 numFiles);
- UInt64 GetFullSize() const
- {
- UInt64 size = 0;
- FOR_VECTOR (i, Sizes)
- size += Sizes[i];
- return size;
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderOutStream.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderOutStream.cpp
deleted file mode 100644
index 847f65bf2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderOutStream.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-// 7zFolderOutStream.cpp
-
-#include "StdAfx.h"
-
-#include "7zFolderOutStream.h"
-
-namespace NArchive {
-namespace N7z {
-
-CFolderOutStream::CFolderOutStream()
-{
- _crcStreamSpec = new COutStreamWithCRC;
- _crcStream = _crcStreamSpec;
-}
-
-HRESULT CFolderOutStream::Init(
- const CDbEx *db,
- UInt32 ref2Offset, UInt32 startIndex,
- const CBoolVector *extractStatuses,
- IArchiveExtractCallback *extractCallback,
- bool testMode, bool checkCrc)
-{
- _db = db;
- _ref2Offset = ref2Offset;
- _startIndex = startIndex;
-
- _extractStatuses = extractStatuses;
- _extractCallback = extractCallback;
- _testMode = testMode;
- _checkCrc = checkCrc;
-
- _currentIndex = 0;
- _fileIsOpen = false;
- return ProcessEmptyFiles();
-}
-
-HRESULT CFolderOutStream::OpenFile()
-{
- Int32 askMode = ((*_extractStatuses)[_currentIndex]) ? (_testMode ?
- NExtract::NAskMode::kTest :
- NExtract::NAskMode::kExtract) :
- NExtract::NAskMode::kSkip;
- CMyComPtr<ISequentialOutStream> realOutStream;
- UInt32 index = _startIndex + _currentIndex;
- RINOK(_extractCallback->GetStream(_ref2Offset + index, &realOutStream, askMode));
- _crcStreamSpec->SetStream(realOutStream);
- _crcStreamSpec->Init(_checkCrc);
- _fileIsOpen = true;
- const CFileItem &fi = _db->Files[index];
- _rem = fi.Size;
- if (askMode == NExtract::NAskMode::kExtract && !realOutStream &&
- !_db->IsItemAnti(index) && !fi.IsDir)
- askMode = NExtract::NAskMode::kSkip;
- return _extractCallback->PrepareOperation(askMode);
-}
-
-HRESULT CFolderOutStream::CloseFileAndSetResult(Int32 res)
-{
- _crcStreamSpec->ReleaseStream();
- _fileIsOpen = false;
- _currentIndex++;
- return _extractCallback->SetOperationResult(res);
-}
-
-HRESULT CFolderOutStream::CloseFileAndSetResult()
-{
- const CFileItem &fi = _db->Files[_startIndex + _currentIndex];
- return CloseFileAndSetResult(
- (fi.IsDir || !fi.CrcDefined || !_checkCrc || fi.Crc == _crcStreamSpec->GetCRC()) ?
- NExtract::NOperationResult::kOK :
- NExtract::NOperationResult::kCRCError);
-}
-
-HRESULT CFolderOutStream::ProcessEmptyFiles()
-{
- while (_currentIndex < _extractStatuses->Size() && _db->Files[_startIndex + _currentIndex].Size == 0)
- {
- RINOK(OpenFile());
- RINOK(CloseFileAndSetResult());
- }
- return S_OK;
-}
-
-STDMETHODIMP CFolderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- while (size != 0)
- {
- if (_fileIsOpen)
- {
- UInt32 cur = size < _rem ? size : (UInt32)_rem;
- RINOK(_crcStream->Write(data, cur, &cur));
- if (cur == 0)
- break;
- data = (const Byte *)data + cur;
- size -= cur;
- _rem -= cur;
- if (processedSize != NULL)
- *processedSize += cur;
- if (_rem == 0)
- {
- RINOK(CloseFileAndSetResult());
- RINOK(ProcessEmptyFiles());
- continue;
- }
- }
- else
- {
- RINOK(ProcessEmptyFiles());
- if (_currentIndex == _extractStatuses->Size())
- {
- // we support partial extracting
- if (processedSize != NULL)
- *processedSize += size;
- break;
- }
- RINOK(OpenFile());
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CFolderOutStream::GetSubStreamSize(UInt64 subStream, UInt64 *value)
-{
- *value = 0;
- if ((int)subStream >= _extractStatuses->Size())
- return S_FALSE;
- *value = _db->Files[_startIndex + (int)subStream].Size;
- return S_OK;
-}
-
-HRESULT CFolderOutStream::FlushCorrupted(Int32 resultEOperationResult)
-{
- while (_currentIndex < _extractStatuses->Size())
- {
- if (_fileIsOpen)
- {
- RINOK(CloseFileAndSetResult(resultEOperationResult));
- }
- else
- {
- RINOK(OpenFile());
- }
- }
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderOutStream.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderOutStream.h
deleted file mode 100644
index cc2d77343..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zFolderOutStream.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// 7zFolderOutStream.h
-
-#ifndef __7Z_FOLDER_OUT_STREAM_H
-#define __7Z_FOLDER_OUT_STREAM_H
-
-#include "../../IStream.h"
-#include "../IArchive.h"
-#include "../Common/OutStreamWithCRC.h"
-
-#include "7zIn.h"
-
-namespace NArchive {
-namespace N7z {
-
-class CFolderOutStream:
- public ISequentialOutStream,
- public ICompressGetSubStreamSize,
- public CMyUnknownImp
-{
- COutStreamWithCRC *_crcStreamSpec;
- CMyComPtr<ISequentialOutStream> _crcStream;
- const CDbEx *_db;
- const CBoolVector *_extractStatuses;
- CMyComPtr<IArchiveExtractCallback> _extractCallback;
- UInt32 _ref2Offset;
- UInt32 _startIndex;
- unsigned _currentIndex;
- bool _testMode;
- bool _checkCrc;
- bool _fileIsOpen;
- UInt64 _rem;
-
- HRESULT OpenFile();
- HRESULT CloseFileAndSetResult(Int32 res);
- HRESULT CloseFileAndSetResult();
- HRESULT ProcessEmptyFiles();
-public:
- MY_UNKNOWN_IMP1(ICompressGetSubStreamSize)
-
- CFolderOutStream();
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value);
-
- HRESULT Init(
- const CDbEx *db,
- UInt32 ref2Offset, UInt32 startIndex,
- const CBoolVector *extractStatuses,
- IArchiveExtractCallback *extractCallback,
- bool testMode, bool checkCrc);
- HRESULT FlushCorrupted(Int32 resultEOperationResult);
- HRESULT WasWritingFinished() const
- { return (_currentIndex == _extractStatuses->Size()) ? S_OK: E_FAIL; }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandler.cpp
deleted file mode 100644
index ed65dc20c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandler.cpp
+++ /dev/null
@@ -1,753 +0,0 @@
-// 7zHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "../../../Common/ComTry.h"
-#include "../../../Common/IntToString.h"
-
-#ifndef __7Z_SET_PROPERTIES
-#include "../../../Windows/System.h"
-#endif
-
-#include "../Common/ItemNameUtils.h"
-
-#include "7zHandler.h"
-#include "7zProperties.h"
-
-#ifdef __7Z_SET_PROPERTIES
-#ifdef EXTRACT_ONLY
-#include "../Common/ParseProperties.h"
-#endif
-#endif
-
-using namespace NWindows;
-using namespace NCOM;
-
-namespace NArchive {
-namespace N7z {
-
-CHandler::CHandler()
-{
- #ifndef _NO_CRYPTO
- _isEncrypted = false;
- _passwordIsDefined = false;
- #endif
-
- #ifdef EXTRACT_ONLY
- _crcSize = 4;
- #ifdef __7Z_SET_PROPERTIES
- _numThreads = NSystem::GetNumberOfProcessors();
- #endif
- #endif
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _db.Files.Size();
- return S_OK;
-}
-
-#ifdef _SFX
-
-IMP_IInArchive_ArcProps_NO_Table
-
-STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProps)
-{
- *numProps = 0;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetPropertyInfo(UInt32 /* index */,
- BSTR * /* name */, PROPID * /* propID */, VARTYPE * /* varType */)
-{
- return E_NOTIMPL;
-}
-
-#else
-
-static const Byte kArcProps[] =
-{
- kpidHeadersSize,
- kpidMethod,
- kpidSolid,
- kpidNumBlocks
- // , kpidIsTree
-};
-
-IMP_IInArchive_ArcProps
-
-static inline char GetHex(unsigned value)
-{
- return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));
-}
-
-static unsigned ConvertMethodIdToString_Back(char *s, UInt64 id)
-{
- int len = 0;
- do
- {
- s[--len] = GetHex((unsigned)id & 0xF); id >>= 4;
- s[--len] = GetHex((unsigned)id & 0xF); id >>= 4;
- }
- while (id != 0);
- return (unsigned)-len;
-}
-
-static void ConvertMethodIdToString(AString &res, UInt64 id)
-{
- const unsigned kLen = 32;
- char s[kLen];
- unsigned len = kLen - 1;
- s[len] = 0;
- res += s + len - ConvertMethodIdToString_Back(s + len, id);
-}
-
-static unsigned GetStringForSizeValue(char *s, UInt32 val)
-{
- unsigned i;
- for (i = 0; i <= 31; i++)
- if (((UInt32)1 << i) == val)
- {
- if (i < 10)
- {
- s[0] = (char)('0' + i);
- s[1] = 0;
- return 1;
- }
- if (i < 20) { s[0] = '1'; s[1] = (char)('0' + i - 10); }
- else if (i < 30) { s[0] = '2'; s[1] = (char)('0' + i - 20); }
- else { s[0] = '3'; s[1] = (char)('0' + i - 30); }
- s[2] = 0;
- return 2;
- }
- char c = 'b';
- if ((val & ((1 << 20) - 1)) == 0) { val >>= 20; c = 'm'; }
- else if ((val & ((1 << 10) - 1)) == 0) { val >>= 10; c = 'k'; }
- ::ConvertUInt32ToString(val, s);
- unsigned pos = MyStringLen(s);
- s[pos++] = c;
- s[pos] = 0;
- return pos;
-}
-
-/*
-static inline void AddHexToString(UString &res, Byte value)
-{
- res += GetHex((Byte)(value >> 4));
- res += GetHex((Byte)(value & 0xF));
-}
-*/
-
-static char *AddProp32(char *s, const char *name, UInt32 v)
-{
- *s++ = ':';
- s = MyStpCpy(s, name);
- ::ConvertUInt32ToString(v, s);
- return s + MyStringLen(s);
-}
-
-void CHandler::AddMethodName(AString &s, UInt64 id)
-{
- UString methodName;
- FindMethod(EXTERNAL_CODECS_VARS id, methodName);
- if (methodName.IsEmpty())
- {
- for (unsigned i = 0; i < methodName.Len(); i++)
- if (methodName[i] >= 0x80)
- {
- methodName.Empty();
- break;
- }
- }
- if (methodName.IsEmpty())
- ConvertMethodIdToString(s, id);
- else
- for (unsigned i = 0; i < methodName.Len(); i++)
- s += (char)methodName[i];
-}
-
-#endif
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- #ifndef _SFX
- COM_TRY_BEGIN
- #endif
- NCOM::CPropVariant prop;
- switch (propID)
- {
- #ifndef _SFX
- case kpidMethod:
- {
- AString s;
- const CParsedMethods &pm = _db.ParsedMethods;
- FOR_VECTOR (i, pm.IDs)
- {
- UInt64 id = pm.IDs[i];
- if (!s.IsEmpty())
- s += ' ';
- char temp[16];
- if (id == k_LZMA2)
- {
- s += "LZMA2:";
- if ((pm.Lzma2Prop & 1) == 0)
- ConvertUInt32ToString((pm.Lzma2Prop >> 1) + 12, temp);
- else
- GetStringForSizeValue(temp, 3 << ((pm.Lzma2Prop >> 1) + 11));
- s += temp;
- }
- else if (id == k_LZMA)
- {
- s += "LZMA:";
- GetStringForSizeValue(temp, pm.LzmaDic);
- s += temp;
- }
- else
- AddMethodName(s, id);
- }
- prop = s;
- break;
- }
- case kpidSolid: prop = _db.IsSolid(); break;
- case kpidNumBlocks: prop = (UInt32)_db.NumFolders; break;
- case kpidHeadersSize: prop = _db.HeadersSize; break;
- case kpidPhySize: prop = _db.PhySize; break;
- case kpidOffset: if (_db.ArcInfo.StartPosition != 0) prop = _db.ArcInfo.StartPosition; break;
- /*
- case kpidIsTree: if (_db.IsTree) prop = true; break;
- case kpidIsAltStream: if (_db.ThereAreAltStreams) prop = true; break;
- case kpidIsAux: if (_db.IsTree) prop = true; break;
- */
- // case kpidError: if (_db.ThereIsHeaderError) prop = "Header error"; break;
- #endif
-
- case kpidWarningFlags:
- {
- UInt32 v = 0;
- if (_db.StartHeaderWasRecovered) v |= kpv_ErrorFlags_HeadersError;
- if (_db.UnsupportedFeatureWarning) v |= kpv_ErrorFlags_UnsupportedFeature;
- if (v != 0)
- prop = v;
- break;
- }
-
- case kpidErrorFlags:
- {
- UInt32 v = 0;
- if (!_db.IsArc) v |= kpv_ErrorFlags_IsNotArc;
- if (_db.ThereIsHeaderError) v |= kpv_ErrorFlags_HeadersError;
- if (_db.UnexpectedEnd) v |= kpv_ErrorFlags_UnexpectedEnd;
- // if (_db.UnsupportedVersion) v |= kpv_ErrorFlags_Unsupported;
- if (_db.UnsupportedFeatureError) v |= kpv_ErrorFlags_UnsupportedFeature;
- prop = v;
- break;
- }
- }
- prop.Detach(value);
- return S_OK;
- #ifndef _SFX
- COM_TRY_END
- #endif
-}
-
-static void SetFileTimeProp_From_UInt64Def(PROPVARIANT *prop, const CUInt64DefVector &v, int index)
-{
- UInt64 value;
- if (v.GetItem(index, value))
- PropVarEm_Set_FileTime64(prop, value);
-}
-
-bool CHandler::IsFolderEncrypted(CNum folderIndex) const
-{
- if (folderIndex == kNumNoIndex)
- return false;
- size_t startPos = _db.FoCodersDataOffset[folderIndex];
- const Byte *p = _db.CodersData + startPos;
- size_t size = _db.FoCodersDataOffset[folderIndex + 1] - startPos;
- CInByte2 inByte;
- inByte.Init(p, size);
-
- CNum numCoders = inByte.ReadNum();
- for (; numCoders != 0; numCoders--)
- {
- Byte mainByte = inByte.ReadByte();
- unsigned idSize = (mainByte & 0xF);
- const Byte *longID = inByte.GetPtr();
- UInt64 id64 = 0;
- for (unsigned j = 0; j < idSize; j++)
- id64 = ((id64 << 8) | longID[j]);
- inByte.SkipDataNoCheck(idSize);
- if (id64 == k_AES)
- return true;
- if ((mainByte & 0x20) != 0)
- inByte.SkipDataNoCheck(inByte.ReadNum());
- }
- return false;
-}
-
-STDMETHODIMP CHandler::GetNumRawProps(UInt32 *numProps)
-{
- *numProps = 0;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetRawPropInfo(UInt32 /* index */, BSTR *name, PROPID *propID)
-{
- *name = NULL;
- *propID = kpidNtSecure;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetParent(UInt32 /* index */, UInt32 *parent, UInt32 *parentType)
-{
- /*
- const CFileItem &file = _db.Files[index];
- *parentType = (file.IsAltStream ? NParentType::kAltStream : NParentType::kDir);
- *parent = (UInt32)(Int32)file.Parent;
- */
- *parentType = NParentType::kDir;
- *parent = (UInt32)(Int32)-1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetRawProp(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType)
-{
- *data = NULL;
- *dataSize = 0;
- *propType = 0;
-
- if (/* _db.IsTree && propID == kpidName ||
- !_db.IsTree && */ propID == kpidPath)
- {
- if (_db.NameOffsets && _db.NamesBuf)
- {
- size_t offset = _db.NameOffsets[index];
- size_t size = (_db.NameOffsets[index + 1] - offset) * 2;
- if (size < ((UInt32)1 << 31))
- {
- *data = (const void *)(_db.NamesBuf + offset * 2);
- *dataSize = (UInt32)size;
- *propType = NPropDataType::kUtf16z;
- }
- }
- return S_OK;
- }
- /*
- if (propID == kpidNtSecure)
- {
- if (index < (UInt32)_db.SecureIDs.Size())
- {
- int id = _db.SecureIDs[index];
- size_t offs = _db.SecureOffsets[id];
- size_t size = _db.SecureOffsets[id + 1] - offs;
- if (size >= 0)
- {
- *data = _db.SecureBuf + offs;
- *dataSize = (UInt32)size;
- *propType = NPropDataType::kRaw;
- }
- }
- }
- */
- return S_OK;
-}
-
-#ifndef _SFX
-
-HRESULT CHandler::SetMethodToProp(CNum folderIndex, PROPVARIANT *prop) const
-{
- PropVariant_Clear(prop);
- if (folderIndex == kNumNoIndex)
- return S_OK;
- // for (int ttt = 0; ttt < 1; ttt++) {
- const unsigned kTempSize = 256;
- char temp[kTempSize];
- unsigned pos = kTempSize;
- temp[--pos] = 0;
-
- size_t startPos = _db.FoCodersDataOffset[folderIndex];
- const Byte *p = _db.CodersData + startPos;
- size_t size = _db.FoCodersDataOffset[folderIndex + 1] - startPos;
- CInByte2 inByte;
- inByte.Init(p, size);
-
- // numCoders == 0 ???
- CNum numCoders = inByte.ReadNum();
- bool needSpace = false;
- for (; numCoders != 0; numCoders--, needSpace = true)
- {
- if (pos < 32) // max size of property
- break;
- Byte mainByte = inByte.ReadByte();
- unsigned idSize = (mainByte & 0xF);
- const Byte *longID = inByte.GetPtr();
- UInt64 id64 = 0;
- for (unsigned j = 0; j < idSize; j++)
- id64 = ((id64 << 8) | longID[j]);
- inByte.SkipDataNoCheck(idSize);
-
- if ((mainByte & 0x10) != 0)
- {
- inByte.ReadNum(); // NumInStreams
- inByte.ReadNum(); // NumOutStreams
- }
-
- CNum propsSize = 0;
- const Byte *props = NULL;
- if ((mainByte & 0x20) != 0)
- {
- propsSize = inByte.ReadNum();
- props = inByte.GetPtr();
- inByte.SkipDataNoCheck(propsSize);
- }
-
- const char *name = NULL;
- char s[32];
- s[0] = 0;
-
- if (id64 <= (UInt32)0xFFFFFFFF)
- {
- UInt32 id = (UInt32)id64;
- if (id == k_LZMA)
- {
- name = "LZMA";
- if (propsSize == 5)
- {
- UInt32 dicSize = GetUi32((const Byte *)props + 1);
- char *dest = s + GetStringForSizeValue(s, dicSize);
- UInt32 d = props[0];
- if (d != 0x5D)
- {
- UInt32 lc = d % 9;
- d /= 9;
- UInt32 pb = d / 5;
- UInt32 lp = d % 5;
- if (lc != 3) dest = AddProp32(dest, "lc", lc);
- if (lp != 0) dest = AddProp32(dest, "lp", lp);
- if (pb != 2) dest = AddProp32(dest, "pb", pb);
- }
- }
- }
- else if (id == k_LZMA2)
- {
- name = "LZMA2";
- if (propsSize == 1)
- {
- Byte p = props[0];
- if ((p & 1) == 0)
- ConvertUInt32ToString((UInt32)((p >> 1) + 12), s);
- else
- GetStringForSizeValue(s, 3 << ((p >> 1) + 11));
- }
- }
- else if (id == k_PPMD)
- {
- name = "PPMD";
- if (propsSize == 5)
- {
- Byte order = *props;
- char *dest = s;
- *dest++ = 'o';
- ConvertUInt32ToString(order, dest);
- dest += MyStringLen(dest);
- dest = MyStpCpy(dest, ":mem");
- GetStringForSizeValue(dest, GetUi32(props + 1));
- }
- }
- else if (id == k_Delta)
- {
- name = "Delta";
- if (propsSize == 1)
- ConvertUInt32ToString((UInt32)props[0] + 1, s);
- }
- else if (id == k_BCJ2) name = "BCJ2";
- else if (id == k_BCJ) name = "BCJ";
- else if (id == k_AES)
- {
- name = "7zAES";
- if (propsSize >= 1)
- {
- Byte firstByte = props[0];
- UInt32 numCyclesPower = firstByte & 0x3F;
- ConvertUInt32ToString(numCyclesPower, s);
- }
- }
- }
-
- if (name)
- {
- unsigned nameLen = MyStringLen(name);
- unsigned propsLen = MyStringLen(s);
- unsigned totalLen = nameLen + propsLen;
- if (propsLen != 0)
- totalLen++;
- if (needSpace)
- totalLen++;
- if (totalLen + 5 >= pos)
- break;
- pos -= totalLen;
- MyStringCopy(temp + pos, name);
- if (propsLen != 0)
- {
- char *dest = temp + pos + nameLen;
- *dest++ = ':';
- MyStringCopy(dest, s);
- }
- if (needSpace)
- temp[pos + totalLen - 1] = ' ';
- }
- else
- {
- UString methodName;
- FindMethod(EXTERNAL_CODECS_VARS id64, methodName);
- if (methodName.IsEmpty())
- {
- for (unsigned j = 0; j < methodName.Len(); j++)
- if (methodName[j] >= 0x80)
- {
- methodName.Empty();
- break;
- }
- }
- if (needSpace)
- temp[--pos] = ' ';
- if (methodName.IsEmpty())
- pos -= ConvertMethodIdToString_Back(temp + pos, id64);
- else
- {
- unsigned len = methodName.Len();
- if (len + 5 > pos)
- break;
- pos -= len;
- for (unsigned i = 0; i < len; i++)
- temp[pos + i] = (char)methodName[i];
- }
- }
- }
- if (numCoders != 0 && pos >= 4)
- {
- temp[--pos] = ' ';
- temp[--pos] = '.';
- temp[--pos] = '.';
- temp[--pos] = '.';
- }
- return PropVarEm_Set_Str(prop, temp + pos);
- // }
-}
-
-#endif
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- PropVariant_Clear(value);
- // COM_TRY_BEGIN
- // NCOM::CPropVariant prop;
-
- /*
- const CRef2 &ref2 = _refs[index];
- if (ref2.Refs.IsEmpty())
- return E_FAIL;
- const CRef &ref = ref2.Refs.Front();
- */
-
- const CFileItem &item = _db.Files[index];
- UInt32 index2 = index;
-
- switch(propID)
- {
- case kpidIsDir: PropVarEm_Set_Bool(value, item.IsDir); break;
- case kpidSize:
- {
- PropVarEm_Set_UInt64(value, item.Size);
- // prop = ref2.Size;
- break;
- }
- case kpidPackSize:
- {
- // prop = ref2.PackSize;
- {
- CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];
- if (folderIndex != kNumNoIndex)
- {
- if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2)
- PropVarEm_Set_UInt64(value, _db.GetFolderFullPackSize(folderIndex));
- /*
- else
- PropVarEm_Set_UInt64(value, 0);
- */
- }
- else
- PropVarEm_Set_UInt64(value, 0);
- }
- break;
- }
- // case kpidIsAux: prop = _db.IsItemAux(index2); break;
- case kpidPosition: { UInt64 v; if (_db.StartPos.GetItem(index2, v)) PropVarEm_Set_UInt64(value, v); break; }
- case kpidCTime: SetFileTimeProp_From_UInt64Def(value, _db.CTime, index2); break;
- case kpidATime: SetFileTimeProp_From_UInt64Def(value, _db.ATime, index2); break;
- case kpidMTime: SetFileTimeProp_From_UInt64Def(value, _db.MTime, index2); break;
- case kpidAttrib: if (item.AttribDefined) PropVarEm_Set_UInt32(value, item.Attrib); break;
- case kpidCRC: if (item.CrcDefined) PropVarEm_Set_UInt32(value, item.Crc); break;
- case kpidEncrypted: PropVarEm_Set_Bool(value, IsFolderEncrypted(_db.FileIndexToFolderIndexMap[index2])); break;
- case kpidIsAnti: PropVarEm_Set_Bool(value, _db.IsItemAnti(index2)); break;
- /*
- case kpidIsAltStream: prop = item.IsAltStream; break;
- case kpidNtSecure:
- {
- int id = _db.SecureIDs[index];
- size_t offs = _db.SecureOffsets[id];
- size_t size = _db.SecureOffsets[id + 1] - offs;
- if (size >= 0)
- {
- prop.SetBlob(_db.SecureBuf + offs, (ULONG)size);
- }
- break;
- }
- */
-
- case kpidPath: return _db.GetPath_Prop(index, value);
- #ifndef _SFX
- case kpidMethod: return SetMethodToProp(_db.FileIndexToFolderIndexMap[index2], value);
- case kpidBlock:
- {
- CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];
- if (folderIndex != kNumNoIndex)
- PropVarEm_Set_UInt32(value, (UInt32)folderIndex);
- }
- break;
- case kpidPackedSize0:
- case kpidPackedSize1:
- case kpidPackedSize2:
- case kpidPackedSize3:
- case kpidPackedSize4:
- {
- /*
- CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];
- if (folderIndex != kNumNoIndex)
- {
- const CFolder &folderInfo = _db.Folders[folderIndex];
- if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2 &&
- folderInfo.PackStreams.Size() > (int)(propID - kpidPackedSize0))
- {
- prop = _db.GetFolderPackStreamSize(folderIndex, propID - kpidPackedSize0);
- }
- else
- prop = (UInt64)0;
- }
- else
- prop = (UInt64)0;
- */
- }
- break;
- #endif
- }
- // prop.Detach(value);
- return S_OK;
- // COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
- const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *openArchiveCallback)
-{
- COM_TRY_BEGIN
- Close();
- #ifndef _SFX
- _fileInfoPopIDs.Clear();
- #endif
-
- try
- {
- CMyComPtr<IArchiveOpenCallback> openArchiveCallbackTemp = openArchiveCallback;
-
- #ifndef _NO_CRYPTO
- CMyComPtr<ICryptoGetTextPassword> getTextPassword;
- if (openArchiveCallback)
- openArchiveCallbackTemp.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword);
- #endif
-
- CInArchive archive;
- _db.IsArc = false;
- RINOK(archive.Open(stream, maxCheckStartPosition));
- _db.IsArc = true;
-
- HRESULT result = archive.ReadDatabase(
- EXTERNAL_CODECS_VARS
- _db
- #ifndef _NO_CRYPTO
- , getTextPassword, _isEncrypted, _passwordIsDefined
- #endif
- );
- RINOK(result);
-
- _inStream = stream;
- }
- catch(...)
- {
- Close();
- // return E_INVALIDARG;
- // we must return out_of_memory here
- return S_FALSE;
- }
- // _inStream = stream;
- #ifndef _SFX
- FillPopIDs();
- #endif
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- COM_TRY_BEGIN
- _inStream.Release();
- _db.Clear();
- #ifndef _NO_CRYPTO
- _isEncrypted = false;
- _passwordIsDefined = false;
- #endif
- return S_OK;
- COM_TRY_END
-}
-
-#ifdef __7Z_SET_PROPERTIES
-#ifdef EXTRACT_ONLY
-
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps)
-{
- COM_TRY_BEGIN
- const UInt32 numProcessors = NSystem::GetNumberOfProcessors();
- _numThreads = numProcessors;
-
- for (UInt32 i = 0; i < numProps; i++)
- {
- UString name = names[i];
- name.MakeLower_Ascii();
- if (name.IsEmpty())
- return E_INVALIDARG;
- const PROPVARIANT &value = values[i];
- UInt32 number;
- int index = ParseStringToUInt32(name, number);
- if (index == 0)
- {
- if (name.IsPrefixedBy(L"mt"))
- {
- RINOK(ParseMtProp(name.Ptr(2), value, numProcessors, _numThreads));
- continue;
- }
- else
- return E_INVALIDARG;
- }
- }
- return S_OK;
- COM_TRY_END
-}
-
-#endif
-#endif
-
-IMPL_ISetCompressCodecsInfo
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandler.h
deleted file mode 100644
index 677a3e10a..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandler.h
+++ /dev/null
@@ -1,179 +0,0 @@
-// 7z/Handler.h
-
-#ifndef __7Z_HANDLER_H
-#define __7Z_HANDLER_H
-
-#include "../../ICoder.h"
-#include "../IArchive.h"
-
-#include "../../Common/CreateCoder.h"
-
-#ifndef EXTRACT_ONLY
-#include "../Common/HandlerOut.h"
-#endif
-
-#include "7zCompressionMode.h"
-#include "7zIn.h"
-
-namespace NArchive {
-namespace N7z {
-
-const UInt32 k_Copy = 0x0;
-const UInt32 k_Delta = 3;
-const UInt32 k_LZMA2 = 0x21;
-const UInt32 k_LZMA = 0x030101;
-const UInt32 k_PPMD = 0x030401;
-const UInt32 k_BCJ = 0x03030103;
-const UInt32 k_BCJ2 = 0x0303011B;
-const UInt32 k_Deflate = 0x040108;
-const UInt32 k_BZip2 = 0x040202;
-
-#ifndef __7Z_SET_PROPERTIES
-
-#ifdef EXTRACT_ONLY
-#if !defined(_7ZIP_ST) && !defined(_SFX)
-#define __7Z_SET_PROPERTIES
-#endif
-#else
-#define __7Z_SET_PROPERTIES
-#endif
-
-#endif
-
-
-#ifndef EXTRACT_ONLY
-
-class COutHandler: public CMultiMethodProps
-{
- HRESULT SetSolidFromString(const UString &s);
- HRESULT SetSolidFromPROPVARIANT(const PROPVARIANT &value);
-public:
- bool _removeSfxBlock;
-
- UInt64 _numSolidFiles;
- UInt64 _numSolidBytes;
- bool _numSolidBytesDefined;
- bool _solidExtension;
-
- bool _compressHeaders;
- bool _encryptHeadersSpecified;
- bool _encryptHeaders;
- // bool _useParents; 9.26
-
- CBoolPair Write_CTime;
- CBoolPair Write_ATime;
- CBoolPair Write_MTime;
-
- bool _volumeMode;
-
- void InitSolidFiles() { _numSolidFiles = (UInt64)(Int64)(-1); }
- void InitSolidSize() { _numSolidBytes = (UInt64)(Int64)(-1); }
- void InitSolid()
- {
- InitSolidFiles();
- InitSolidSize();
- _solidExtension = false;
- _numSolidBytesDefined = false;
- }
-
- void InitProps();
-
- COutHandler() { InitProps(); }
-
- HRESULT SetProperty(const wchar_t *name, const PROPVARIANT &value);
-};
-
-#endif
-
-class CHandler:
- public IInArchive,
- public IArchiveGetRawProps,
- #ifdef __7Z_SET_PROPERTIES
- public ISetProperties,
- #endif
- #ifndef EXTRACT_ONLY
- public IOutArchive,
- #endif
- PUBLIC_ISetCompressCodecsInfo
- public CMyUnknownImp
- #ifndef EXTRACT_ONLY
- , public COutHandler
- #endif
-{
-public:
- MY_QUERYINTERFACE_BEGIN2(IInArchive)
- MY_QUERYINTERFACE_ENTRY(IArchiveGetRawProps)
- #ifdef __7Z_SET_PROPERTIES
- MY_QUERYINTERFACE_ENTRY(ISetProperties)
- #endif
- #ifndef EXTRACT_ONLY
- MY_QUERYINTERFACE_ENTRY(IOutArchive)
- #endif
- QUERY_ENTRY_ISetCompressCodecsInfo
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- INTERFACE_IInArchive(;)
- INTERFACE_IArchiveGetRawProps(;)
-
- #ifdef __7Z_SET_PROPERTIES
- STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps);
- #endif
-
- #ifndef EXTRACT_ONLY
- INTERFACE_IOutArchive(;)
- #endif
-
- DECL_ISetCompressCodecsInfo
-
- CHandler();
-
-private:
- CMyComPtr<IInStream> _inStream;
- NArchive::N7z::CDbEx _db;
- #ifndef _NO_CRYPTO
- bool _isEncrypted;
- bool _passwordIsDefined;
- #endif
-
- #ifdef EXTRACT_ONLY
-
- #ifdef __7Z_SET_PROPERTIES
- UInt32 _numThreads;
- #endif
-
- UInt32 _crcSize;
-
- #else
-
- CRecordVector<CBind> _binds;
-
- HRESULT PropsMethod_To_FullMethod(CMethodFull &dest, const COneMethodInfo &m);
- HRESULT SetHeaderMethod(CCompressionMethodMode &headerMethod);
- void AddDefaultMethod();
- HRESULT SetMainMethod(CCompressionMethodMode &method,
- CObjectVector<COneMethodInfo> &methodsInfo
- #ifndef _7ZIP_ST
- , UInt32 numThreads
- #endif
- );
-
-
- #endif
-
- bool IsFolderEncrypted(CNum folderIndex) const;
- #ifndef _SFX
-
- CRecordVector<UInt64> _fileInfoPopIDs;
- void FillPopIDs();
- void AddMethodName(AString &s, UInt64 id);
- HRESULT SetMethodToProp(CNum folderIndex, PROPVARIANT *prop) const;
-
- #endif
-
- DECL_EXTERNAL_CODECS_VARS
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandlerOut.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandlerOut.cpp
deleted file mode 100644
index 7de5b8140..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHandlerOut.cpp
+++ /dev/null
@@ -1,875 +0,0 @@
-// 7zHandlerOut.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/ComTry.h"
-#include "../../../Common/StringToInt.h"
-#include "../../../Common/Wildcard.h"
-
-#include "../Common/ItemNameUtils.h"
-#include "../Common/ParseProperties.h"
-
-#include "7zHandler.h"
-#include "7zOut.h"
-#include "7zUpdate.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace N7z {
-
-static const wchar_t *k_LZMA_Name = L"LZMA";
-static const wchar_t *kDefaultMethodName = L"LZMA2";
-static const wchar_t *k_Copy_Name = L"Copy";
-
-static const wchar_t *k_MatchFinder_ForHeaders = L"BT2";
-static const UInt32 k_NumFastBytes_ForHeaders = 273;
-static const UInt32 k_Level_ForHeaders = 5;
-static const UInt32 k_Dictionary_ForHeaders =
- #ifdef UNDER_CE
- 1 << 18;
- #else
- 1 << 20;
- #endif
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *type)
-{
- *type = NFileTimeType::kWindows;
- return S_OK;
-}
-
-HRESULT CHandler::PropsMethod_To_FullMethod(CMethodFull &dest, const COneMethodInfo &m)
-{
- if (!FindMethod(
- EXTERNAL_CODECS_VARS
- m.MethodName, dest.Id, dest.NumInStreams, dest.NumOutStreams))
- return E_INVALIDARG;
- (CProps &)dest = (CProps &)m;
- return S_OK;
-}
-
-HRESULT CHandler::SetHeaderMethod(CCompressionMethodMode &headerMethod)
-{
- if (!_compressHeaders)
- return S_OK;
- COneMethodInfo m;
- m.MethodName = k_LZMA_Name;
- m.AddPropString(NCoderPropID::kMatchFinder, k_MatchFinder_ForHeaders);
- m.AddProp32(NCoderPropID::kLevel, k_Level_ForHeaders);
- m.AddProp32(NCoderPropID::kNumFastBytes, k_NumFastBytes_ForHeaders);
- m.AddProp32(NCoderPropID::kDictionarySize, k_Dictionary_ForHeaders);
- m.AddNumThreadsProp(1);
-
- CMethodFull methodFull;
- RINOK(PropsMethod_To_FullMethod(methodFull, m));
- headerMethod.Methods.Add(methodFull);
- return S_OK;
-}
-
-void CHandler::AddDefaultMethod()
-{
- FOR_VECTOR (i, _methods)
- {
- UString &methodName = _methods[i].MethodName;
- if (methodName.IsEmpty())
- methodName = kDefaultMethodName;
- }
- if (_methods.IsEmpty())
- {
- COneMethodInfo m;
- m.MethodName = (GetLevel() == 0 ? k_Copy_Name : kDefaultMethodName);
- _methods.Add(m);
- }
-}
-
-HRESULT CHandler::SetMainMethod(
- CCompressionMethodMode &methodMode,
- CObjectVector<COneMethodInfo> &methods
- #ifndef _7ZIP_ST
- , UInt32 numThreads
- #endif
- )
-{
- AddDefaultMethod();
-
- const UInt64 kSolidBytes_Min = (1 << 24);
- const UInt64 kSolidBytes_Max = ((UInt64)1 << 32) - 1;
-
- bool needSolid = false;
- FOR_VECTOR (i, methods)
- {
- COneMethodInfo &oneMethodInfo = methods[i];
- SetGlobalLevelAndThreads(oneMethodInfo
- #ifndef _7ZIP_ST
- , numThreads
- #endif
- );
-
- CMethodFull methodFull;
- RINOK(PropsMethod_To_FullMethod(methodFull, oneMethodInfo));
- methodMode.Methods.Add(methodFull);
-
- if (methodFull.Id != k_Copy)
- needSolid = true;
-
- if (_numSolidBytesDefined)
- continue;
-
- UInt32 dicSize;
- switch (methodFull.Id)
- {
- case k_LZMA:
- case k_LZMA2: dicSize = oneMethodInfo.Get_Lzma_DicSize(); break;
- case k_PPMD: dicSize = oneMethodInfo.Get_Ppmd_MemSize(); break;
- case k_Deflate: dicSize = (UInt32)1 << 15; break;
- case k_BZip2: dicSize = oneMethodInfo.Get_BZip2_BlockSize(); break;
- default: continue;
- }
- _numSolidBytes = (UInt64)dicSize << 7;
- if (_numSolidBytes < kSolidBytes_Min) _numSolidBytes = kSolidBytes_Min;
- if (_numSolidBytes > kSolidBytes_Max) _numSolidBytes = kSolidBytes_Max;
- _numSolidBytesDefined = true;
- }
-
- if (!_numSolidBytesDefined)
- if (needSolid)
- _numSolidBytes = kSolidBytes_Max;
- else
- _numSolidBytes = 0;
- _numSolidBytesDefined = true;
- return S_OK;
-}
-
-static HRESULT GetTime(IArchiveUpdateCallback *updateCallback, int index, PROPID propID, UInt64 &ft, bool &ftDefined)
-{
- // ft = 0;
- // ftDefined = false;
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(index, propID, &prop));
- if (prop.vt == VT_FILETIME)
- {
- ft = prop.filetime.dwLowDateTime | ((UInt64)prop.filetime.dwHighDateTime << 32);
- ftDefined = true;
- }
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- else
- {
- ft = 0;
- ftDefined = false;
- }
- return S_OK;
-}
-
-/*
-
-#ifdef _WIN32
-static const wchar_t kDirDelimiter1 = L'\\';
-#endif
-static const wchar_t kDirDelimiter2 = L'/';
-
-static inline bool IsCharDirLimiter(wchar_t c)
-{
- return (
- #ifdef _WIN32
- c == kDirDelimiter1 ||
- #endif
- c == kDirDelimiter2);
-}
-
-static int FillSortIndex(CObjectVector<CTreeFolder> &treeFolders, int cur, int curSortIndex)
-{
- CTreeFolder &tf = treeFolders[cur];
- tf.SortIndex = curSortIndex++;
- for (int i = 0; i < tf.SubFolders.Size(); i++)
- curSortIndex = FillSortIndex(treeFolders, tf.SubFolders[i], curSortIndex);
- tf.SortIndexEnd = curSortIndex;
- return curSortIndex;
-}
-
-static int FindSubFolder(const CObjectVector<CTreeFolder> &treeFolders, int cur, const UString &name, int &insertPos)
-{
- const CIntVector &subFolders = treeFolders[cur].SubFolders;
- int left = 0, right = subFolders.Size();
- insertPos = -1;
- for (;;)
- {
- if (left == right)
- {
- insertPos = left;
- return -1;
- }
- int mid = (left + right) / 2;
- int midFolder = subFolders[mid];
- int compare = CompareFileNames(name, treeFolders[midFolder].Name);
- if (compare == 0)
- return midFolder;
- if (compare < 0)
- right = mid;
- else
- left = mid + 1;
- }
-}
-
-static int AddFolder(CObjectVector<CTreeFolder> &treeFolders, int cur, const UString &name)
-{
- int insertPos;
- int folderIndex = FindSubFolder(treeFolders, cur, name, insertPos);
- if (folderIndex < 0)
- {
- folderIndex = treeFolders.Size();
- CTreeFolder &newFolder = treeFolders.AddNew();
- newFolder.Parent = cur;
- newFolder.Name = name;
- treeFolders[cur].SubFolders.Insert(insertPos, folderIndex);
- }
- // else if (treeFolders[folderIndex].IsAltStreamFolder != isAltStreamFolder) throw 1123234234;
- return folderIndex;
-}
-*/
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *updateCallback)
-{
- COM_TRY_BEGIN
-
- const CDbEx *db = 0;
- #ifdef _7Z_VOL
- if (_volumes.Size() > 1)
- return E_FAIL;
- const CVolume *volume = 0;
- if (_volumes.Size() == 1)
- {
- volume = &_volumes.Front();
- db = &volume->Database;
- }
- #else
- if (_inStream != 0)
- db = &_db;
- #endif
-
- /*
- CMyComPtr<IArchiveGetRawProps> getRawProps;
- updateCallback->QueryInterface(IID_IArchiveGetRawProps, (void **)&getRawProps);
-
- CUniqBlocks secureBlocks;
- secureBlocks.AddUniq(NULL, 0);
-
- CObjectVector<CTreeFolder> treeFolders;
- {
- CTreeFolder folder;
- folder.Parent = -1;
- treeFolders.Add(folder);
- }
- */
-
- CObjectVector<CUpdateItem> updateItems;
-
- bool need_CTime = (Write_CTime.Def && Write_CTime.Val);
- bool need_ATime = (Write_ATime.Def && Write_ATime.Val);
- bool need_MTime = (Write_MTime.Def && Write_MTime.Val || !Write_MTime.Def);
- if (db)
- {
- if (!Write_CTime.Def) need_CTime = !db->CTime.Defs.IsEmpty();
- if (!Write_ATime.Def) need_ATime = !db->ATime.Defs.IsEmpty();
- if (!Write_MTime.Def) need_MTime = !db->MTime.Defs.IsEmpty();
- }
-
- UString s;
-
- for (UInt32 i = 0; i < numItems; i++)
- {
- Int32 newData, newProps;
- UInt32 indexInArchive;
- if (!updateCallback)
- return E_FAIL;
- RINOK(updateCallback->GetUpdateItemInfo(i, &newData, &newProps, &indexInArchive));
- CUpdateItem ui;
- ui.NewProps = IntToBool(newProps);
- ui.NewData = IntToBool(newData);
- ui.IndexInArchive = indexInArchive;
- ui.IndexInClient = i;
- ui.IsAnti = false;
- ui.Size = 0;
-
- UString name;
- // bool isAltStream = false;
- if (ui.IndexInArchive != -1)
- {
- if (db == 0 || (unsigned)ui.IndexInArchive >= db->Files.Size())
- return E_INVALIDARG;
- const CFileItem &fi = db->Files[ui.IndexInArchive];
- if (!ui.NewProps)
- {
- _db.GetPath(ui.IndexInArchive, name);
- }
- ui.IsDir = fi.IsDir;
- ui.Size = fi.Size;
- // isAltStream = fi.IsAltStream;
- ui.IsAnti = db->IsItemAnti(ui.IndexInArchive);
-
- if (!ui.NewProps)
- {
- ui.CTimeDefined = db->CTime.GetItem(ui.IndexInArchive, ui.CTime);
- ui.ATimeDefined = db->ATime.GetItem(ui.IndexInArchive, ui.ATime);
- ui.MTimeDefined = db->MTime.GetItem(ui.IndexInArchive, ui.MTime);
- }
- }
-
- if (ui.NewProps)
- {
- bool folderStatusIsDefined;
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(i, kpidAttrib, &prop));
- if (prop.vt == VT_EMPTY)
- ui.AttribDefined = false;
- else if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- else
- {
- ui.Attrib = prop.ulVal;
- ui.AttribDefined = true;
- }
- }
-
- // we need MTime to sort files.
- if (need_CTime) RINOK(GetTime(updateCallback, i, kpidCTime, ui.CTime, ui.CTimeDefined));
- if (need_ATime) RINOK(GetTime(updateCallback, i, kpidATime, ui.ATime, ui.ATimeDefined));
- if (need_MTime) RINOK(GetTime(updateCallback, i, kpidMTime, ui.MTime, ui.MTimeDefined));
-
- /*
- if (getRawProps)
- {
- const void *data;
- UInt32 dataSize;
- UInt32 propType;
-
- getRawProps->GetRawProp(i, kpidNtSecure, &data, &dataSize, &propType);
- if (dataSize != 0 && propType != NPropDataType::kRaw)
- return E_FAIL;
- ui.SecureIndex = secureBlocks.AddUniq((const Byte *)data, dataSize);
- }
- */
-
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(i, kpidPath, &prop));
- if (prop.vt == VT_EMPTY)
- {
- }
- else if (prop.vt != VT_BSTR)
- return E_INVALIDARG;
- else
- {
- name = NItemName::MakeLegalName(prop.bstrVal);
- }
- }
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(i, kpidIsDir, &prop));
- if (prop.vt == VT_EMPTY)
- folderStatusIsDefined = false;
- else if (prop.vt != VT_BOOL)
- return E_INVALIDARG;
- else
- {
- ui.IsDir = (prop.boolVal != VARIANT_FALSE);
- folderStatusIsDefined = true;
- }
- }
-
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(i, kpidIsAnti, &prop));
- if (prop.vt == VT_EMPTY)
- ui.IsAnti = false;
- else if (prop.vt != VT_BOOL)
- return E_INVALIDARG;
- else
- ui.IsAnti = (prop.boolVal != VARIANT_FALSE);
- }
-
- /*
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(i, kpidIsAltStream, &prop));
- if (prop.vt == VT_EMPTY)
- isAltStream = false;
- else if (prop.vt != VT_BOOL)
- return E_INVALIDARG;
- else
- isAltStream = (prop.boolVal != VARIANT_FALSE);
- }
- */
-
- if (ui.IsAnti)
- {
- ui.AttribDefined = false;
-
- ui.CTimeDefined = false;
- ui.ATimeDefined = false;
- ui.MTimeDefined = false;
-
- ui.Size = 0;
- }
-
- if (!folderStatusIsDefined && ui.AttribDefined)
- ui.SetDirStatusFromAttrib();
- }
- else
- {
- /*
- if (_db.SecureIDs.IsEmpty())
- ui.SecureIndex = secureBlocks.AddUniq(NULL, 0);
- else
- {
- int id = _db.SecureIDs[ui.IndexInArchive];
- size_t offs = _db.SecureOffsets[id];
- size_t size = _db.SecureOffsets[id + 1] - offs;
- ui.SecureIndex = secureBlocks.AddUniq(_db.SecureBuf + offs, size);
- }
- */
- }
-
- /*
- {
- int folderIndex = 0;
- if (_useParents)
- {
- int j;
- s.Empty();
- for (j = 0; j < name.Len(); j++)
- {
- wchar_t c = name[j];
- if (IsCharDirLimiter(c))
- {
- folderIndex = AddFolder(treeFolders, folderIndex, s);
- s.Empty();
- continue;
- }
- s += c;
- }
- if (isAltStream)
- {
- int colonPos = s.Find(':');
- if (colonPos < 0)
- {
- // isAltStream = false;
- return E_INVALIDARG;
- }
- UString mainName = s.Left(colonPos);
- int newFolderIndex = AddFolder(treeFolders, folderIndex, mainName);
- if (treeFolders[newFolderIndex].UpdateItemIndex < 0)
- {
- for (int j = updateItems.Size() - 1; j >= 0; j--)
- {
- CUpdateItem &ui2 = updateItems[j];
- if (ui2.ParentFolderIndex == folderIndex
- && ui2.Name == mainName)
- {
- ui2.TreeFolderIndex = newFolderIndex;
- treeFolders[newFolderIndex].UpdateItemIndex = j;
- }
- }
- }
- folderIndex = newFolderIndex;
- s.Delete(0, colonPos + 1);
- }
- ui.Name = s;
- }
- else
- ui.Name = name;
- ui.IsAltStream = isAltStream;
- ui.ParentFolderIndex = folderIndex;
- ui.TreeFolderIndex = -1;
- if (ui.IsDir && !s.IsEmpty())
- {
- ui.TreeFolderIndex = AddFolder(treeFolders, folderIndex, s);
- treeFolders[ui.TreeFolderIndex].UpdateItemIndex = updateItems.Size();
- }
- }
- */
- ui.Name = name;
-
- if (ui.NewData)
- {
- NCOM::CPropVariant prop;
- RINOK(updateCallback->GetProperty(i, kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- ui.Size = (UInt64)prop.uhVal.QuadPart;
- if (ui.Size != 0 && ui.IsAnti)
- return E_INVALIDARG;
- }
- updateItems.Add(ui);
- }
-
- /*
- FillSortIndex(treeFolders, 0, 0);
- for (i = 0; i < (UInt32)updateItems.Size(); i++)
- {
- CUpdateItem &ui = updateItems[i];
- ui.ParentSortIndex = treeFolders[ui.ParentFolderIndex].SortIndex;
- ui.ParentSortIndexEnd = treeFolders[ui.ParentFolderIndex].SortIndexEnd;
- }
- */
-
- CCompressionMethodMode methodMode, headerMethod;
-
- HRESULT res = SetMainMethod(methodMode, _methods
- #ifndef _7ZIP_ST
- , _numThreads
- #endif
- );
- RINOK(res);
- methodMode.Binds = _binds;
-
- RINOK(SetHeaderMethod(headerMethod));
- #ifndef _7ZIP_ST
- methodMode.NumThreads = _numThreads;
- headerMethod.NumThreads = 1;
- #endif
-
- CMyComPtr<ICryptoGetTextPassword2> getPassword2;
- updateCallback->QueryInterface(IID_ICryptoGetTextPassword2, (void **)&getPassword2);
-
- methodMode.PasswordIsDefined = false;
- methodMode.Password.Empty();
- if (getPassword2)
- {
- CMyComBSTR password;
- Int32 passwordIsDefined;
- RINOK(getPassword2->CryptoGetTextPassword2(&passwordIsDefined, &password));
- methodMode.PasswordIsDefined = IntToBool(passwordIsDefined);
- if (methodMode.PasswordIsDefined && (BSTR)password)
- methodMode.Password = password;
- }
-
- bool compressMainHeader = _compressHeaders; // check it
-
- bool encryptHeaders = false;
-
- if (methodMode.PasswordIsDefined)
- {
- if (_encryptHeadersSpecified)
- encryptHeaders = _encryptHeaders;
- #ifndef _NO_CRYPTO
- else
- encryptHeaders = _passwordIsDefined;
- #endif
- compressMainHeader = true;
- if (encryptHeaders)
- {
- headerMethod.PasswordIsDefined = methodMode.PasswordIsDefined;
- headerMethod.Password = methodMode.Password;
- }
- }
-
- if (numItems < 2)
- compressMainHeader = false;
-
- CUpdateOptions options;
- options.Method = &methodMode;
- options.HeaderMethod = (_compressHeaders || encryptHeaders) ? &headerMethod : 0;
- int level = GetLevel();
- options.UseFilters = level != 0 && _autoFilter;
- options.MaxFilter = level >= 8;
-
- options.HeaderOptions.CompressMainHeader = compressMainHeader;
- /*
- options.HeaderOptions.WriteCTime = Write_CTime;
- options.HeaderOptions.WriteATime = Write_ATime;
- options.HeaderOptions.WriteMTime = Write_MTime;
- */
-
- options.NumSolidFiles = _numSolidFiles;
- options.NumSolidBytes = _numSolidBytes;
- options.SolidExtension = _solidExtension;
- options.RemoveSfxBlock = _removeSfxBlock;
- options.VolumeMode = _volumeMode;
-
- COutArchive archive;
- CArchiveDatabaseOut newDatabase;
-
- CMyComPtr<ICryptoGetTextPassword> getPassword;
- updateCallback->QueryInterface(IID_ICryptoGetTextPassword, (void **)&getPassword);
-
- /*
- if (secureBlocks.Sorted.Size() > 1)
- {
- secureBlocks.GetReverseMap();
- for (int i = 0; i < updateItems.Size(); i++)
- {
- int &secureIndex = updateItems[i].SecureIndex;
- secureIndex = secureBlocks.BufIndexToSortedIndex[secureIndex];
- }
- }
- */
-
- res = Update(
- EXTERNAL_CODECS_VARS
- #ifdef _7Z_VOL
- volume ? volume->Stream: 0,
- volume ? db : 0,
- #else
- _inStream,
- db,
- #endif
- updateItems,
- // treeFolders,
- // secureBlocks,
- archive, newDatabase, outStream, updateCallback, options
- #ifndef _NO_CRYPTO
- , getPassword
- #endif
- );
-
- RINOK(res);
-
- updateItems.ClearAndFree();
-
- return archive.WriteDatabase(EXTERNAL_CODECS_VARS
- newDatabase, options.HeaderMethod, options.HeaderOptions);
-
- COM_TRY_END
-}
-
-static HRESULT GetBindInfoPart(UString &srcString, UInt32 &coder, UInt32 &stream)
-{
- stream = 0;
- int index = ParseStringToUInt32(srcString, coder);
- if (index == 0)
- return E_INVALIDARG;
- srcString.Delete(0, index);
- if (srcString[0] == 's')
- {
- srcString.Delete(0);
- int index = ParseStringToUInt32(srcString, stream);
- if (index == 0)
- return E_INVALIDARG;
- srcString.Delete(0, index);
- }
- return S_OK;
-}
-
-void COutHandler::InitProps()
-{
- CMultiMethodProps::Init();
-
- _removeSfxBlock = false;
- _compressHeaders = true;
- _encryptHeadersSpecified = false;
- _encryptHeaders = false;
- // _useParents = false;
-
- Write_CTime.Init();
- Write_ATime.Init();
- Write_MTime.Init();
-
- _volumeMode = false;
- InitSolid();
-}
-
-HRESULT COutHandler::SetSolidFromString(const UString &s)
-{
- UString s2 = s;
- s2.MakeLower_Ascii();
- for (unsigned i = 0; i < s2.Len();)
- {
- const wchar_t *start = ((const wchar_t *)s2) + i;
- const wchar_t *end;
- UInt64 v = ConvertStringToUInt64(start, &end);
- if (start == end)
- {
- if (s2[i++] != 'e')
- return E_INVALIDARG;
- _solidExtension = true;
- continue;
- }
- i += (int)(end - start);
- if (i == s2.Len())
- return E_INVALIDARG;
- wchar_t c = s2[i++];
- if (c == 'f')
- {
- if (v < 1)
- v = 1;
- _numSolidFiles = v;
- }
- else
- {
- unsigned numBits;
- switch (c)
- {
- case 'b': numBits = 0; break;
- case 'k': numBits = 10; break;
- case 'm': numBits = 20; break;
- case 'g': numBits = 30; break;
- case 't': numBits = 40; break;
- default: return E_INVALIDARG;
- }
- _numSolidBytes = (v << numBits);
- _numSolidBytesDefined = true;
- }
- }
- return S_OK;
-}
-
-HRESULT COutHandler::SetSolidFromPROPVARIANT(const PROPVARIANT &value)
-{
- bool isSolid;
- switch (value.vt)
- {
- case VT_EMPTY: isSolid = true; break;
- case VT_BOOL: isSolid = (value.boolVal != VARIANT_FALSE); break;
- case VT_BSTR:
- if (StringToBool(value.bstrVal, isSolid))
- break;
- return SetSolidFromString(value.bstrVal);
- default: return E_INVALIDARG;
- }
- if (isSolid)
- InitSolid();
- else
- _numSolidFiles = 1;
- return S_OK;
-}
-
-static HRESULT PROPVARIANT_to_BoolPair(const PROPVARIANT &prop, CBoolPair &dest)
-{
- RINOK(PROPVARIANT_to_bool(prop, dest.Val));
- dest.Def = true;
- return S_OK;
-}
-
-HRESULT COutHandler::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value)
-{
- UString name = nameSpec;
- name.MakeLower_Ascii();
- if (name.IsEmpty())
- return E_INVALIDARG;
-
- if (name[0] == L's')
- {
- name.Delete(0);
- if (name.IsEmpty())
- return SetSolidFromPROPVARIANT(value);
- if (value.vt != VT_EMPTY)
- return E_INVALIDARG;
- return SetSolidFromString(name);
- }
-
- UInt32 number;
- int index = ParseStringToUInt32(name, number);
- UString realName = name.Ptr(index);
- if (index == 0)
- {
- if (name.IsEqualTo("rsfx")) return PROPVARIANT_to_bool(value, _removeSfxBlock);
- if (name.IsEqualTo("hc")) return PROPVARIANT_to_bool(value, _compressHeaders);
- // if (name.IsEqualToNoCase(L"HS")) return PROPVARIANT_to_bool(value, _useParents);
-
- if (name.IsEqualTo("hcf"))
- {
- bool compressHeadersFull = true;
- RINOK(PROPVARIANT_to_bool(value, compressHeadersFull));
- return compressHeadersFull ? S_OK: E_INVALIDARG;
- }
-
- if (name.IsEqualTo("he"))
- {
- RINOK(PROPVARIANT_to_bool(value, _encryptHeaders));
- _encryptHeadersSpecified = true;
- return S_OK;
- }
-
- if (name.IsEqualTo("tc")) return PROPVARIANT_to_BoolPair(value, Write_CTime);
- if (name.IsEqualTo("ta")) return PROPVARIANT_to_BoolPair(value, Write_ATime);
- if (name.IsEqualTo("tm")) return PROPVARIANT_to_BoolPair(value, Write_MTime);
-
- if (name.IsEqualTo("v")) return PROPVARIANT_to_bool(value, _volumeMode);
- }
- return CMultiMethodProps::SetProperty(name, value);
-}
-
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps)
-{
- COM_TRY_BEGIN
- _binds.Clear();
- InitProps();
-
- for (UInt32 i = 0; i < numProps; i++)
- {
- UString name = names[i];
- name.MakeLower_Ascii();
- if (name.IsEmpty())
- return E_INVALIDARG;
-
- const PROPVARIANT &value = values[i];
-
- if (name[0] == 'b')
- {
- if (value.vt != VT_EMPTY)
- return E_INVALIDARG;
- name.Delete(0);
- CBind bind;
- RINOK(GetBindInfoPart(name, bind.OutCoder, bind.OutStream));
- if (name[0] != ':')
- return E_INVALIDARG;
- name.Delete(0);
- RINOK(GetBindInfoPart(name, bind.InCoder, bind.InStream));
- if (!name.IsEmpty())
- return E_INVALIDARG;
- _binds.Add(bind);
- continue;
- }
-
- RINOK(SetProperty(name, value));
- }
-
- unsigned numEmptyMethods = GetNumEmptyMethods();
- if (numEmptyMethods > 0)
- {
- unsigned k;
- for (k = 0; k < _binds.Size(); k++)
- {
- const CBind &bind = _binds[k];
- if (bind.InCoder < (UInt32)numEmptyMethods ||
- bind.OutCoder < (UInt32)numEmptyMethods)
- return E_INVALIDARG;
- }
- for (k = 0; k < _binds.Size(); k++)
- {
- CBind &bind = _binds[k];
- bind.InCoder -= (UInt32)numEmptyMethods;
- bind.OutCoder -= (UInt32)numEmptyMethods;
- }
- _methods.DeleteFrontal(numEmptyMethods);
- }
-
- AddDefaultMethod();
-
- if (!_filterMethod.MethodName.IsEmpty())
- {
- FOR_VECTOR (k, _binds)
- {
- CBind &bind = _binds[k];
- bind.InCoder++;
- bind.OutCoder++;
- }
- _methods.Insert(0, _filterMethod);
- }
-
- FOR_VECTOR (k, _binds)
- {
- const CBind &bind = _binds[k];
- if (bind.InCoder >= (UInt32)_methods.Size() ||
- bind.OutCoder >= (UInt32)_methods.Size())
- return E_INVALIDARG;
- }
-
- return S_OK;
- COM_TRY_END
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHeader.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHeader.cpp
deleted file mode 100644
index acff2fdd8..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHeader.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// 7zHeader.cpp
-
-#include "StdAfx.h"
-
-#include "7zHeader.h"
-
-namespace NArchive {
-namespace N7z {
-
-Byte kSignature[kSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C};
-#ifdef _7Z_VOL
-Byte kFinishSignature[kSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C + 1};
-#endif
-
-// We can change signature. So file doesn't contain correct signature.
-// struct SignatureInitializer { SignatureInitializer() { kSignature[0]--; } };
-// static SignatureInitializer g_SignatureInitializer;
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHeader.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHeader.h
deleted file mode 100644
index 61dad655d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zHeader.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// 7z/7zHeader.h
-
-#ifndef __7Z_HEADER_H
-#define __7Z_HEADER_H
-
-#include "../../../Common/MyTypes.h"
-
-namespace NArchive {
-namespace N7z {
-
-const unsigned kSignatureSize = 6;
-extern Byte kSignature[kSignatureSize];
-
-// #define _7Z_VOL
-// 7z-MultiVolume is not finished yet.
-// It can work already, but I still do not like some
-// things of that new multivolume format.
-// So please keep it commented.
-
-#ifdef _7Z_VOL
-extern Byte kFinishSignature[kSignatureSize];
-#endif
-
-struct CArchiveVersion
-{
- Byte Major;
- Byte Minor;
-};
-
-const Byte kMajorVersion = 0;
-
-struct CStartHeader
-{
- UInt64 NextHeaderOffset;
- UInt64 NextHeaderSize;
- UInt32 NextHeaderCRC;
-};
-
-const UInt32 kStartHeaderSize = 20;
-
-#ifdef _7Z_VOL
-struct CFinishHeader: public CStartHeader
-{
- UInt64 ArchiveStartOffset; // data offset from end if that struct
- UInt64 AdditionalStartBlockSize; // start signature & start header size
-};
-
-const UInt32 kFinishHeaderSize = kStartHeaderSize + 16;
-#endif
-
-namespace NID
-{
- enum EEnum
- {
- kEnd,
-
- kHeader,
-
- kArchiveProperties,
-
- kAdditionalStreamsInfo,
- kMainStreamsInfo,
- kFilesInfo,
-
- kPackInfo,
- kUnpackInfo,
- kSubStreamsInfo,
-
- kSize,
- kCRC,
-
- kFolder,
-
- kCodersUnpackSize,
- kNumUnpackStream,
-
- kEmptyStream,
- kEmptyFile,
- kAnti,
-
- kName,
- kCTime,
- kATime,
- kMTime,
- kWinAttrib,
- kComment,
-
- kEncodedHeader,
-
- kStartPos,
- kDummy
-
- // kNtSecure,
- // kParent,
- // kIsAux
- };
-}
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zIn.cpp
deleted file mode 100644
index 28ec5e083..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zIn.cpp
+++ /dev/null
@@ -1,1679 +0,0 @@
-// 7zIn.cpp
-
-#include "StdAfx.h"
-
-#ifdef _WIN32
-#include <wchar.h>
-#else
-#include <ctype.h>
-#endif
-
-#include "../../../../C/7zCrc.h"
-#include "../../../../C/CpuArch.h"
-
-#include "../../Common/StreamObjects.h"
-#include "../../Common/StreamUtils.h"
-
-#include "7zDecode.h"
-#include "7zIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-// define FORMAT_7Z_RECOVERY if you want to recover multivolume archives with empty StartHeader
-#ifndef _SFX
-#define FORMAT_7Z_RECOVERY
-#endif
-
-using namespace NWindows;
-using namespace NCOM;
-
-namespace NArchive {
-namespace N7z {
-
-static const UInt32 k_LZMA2 = 0x21;
-static const UInt32 k_LZMA = 0x030101;
-
-static void BoolVector_Fill_False(CBoolVector &v, unsigned size)
-{
- v.ClearAndSetSize(size);
- bool *p = &v[0];
- for (unsigned i = 0; i < size; i++)
- p[i] = false;
-}
-
-static bool BoolVector_GetAndSet(CBoolVector &v, UInt32 index)
-{
- if (index >= (UInt32)v.Size())
- return true;
- bool res = v[index];
- v[index] = true;
- return res;
-}
-
-bool CFolder::CheckStructure(unsigned numUnpackSizes) const
-{
- const unsigned kNumCodersMax = sizeof(UInt32) * 8; // don't change it
- const unsigned kMaskSize = sizeof(UInt32) * 8; // it must be >= kNumCodersMax
- const unsigned kNumBindsMax = 32;
-
- if (Coders.Size() > kNumCodersMax || BindPairs.Size() > kNumBindsMax)
- return false;
-
- {
- CBoolVector v;
- BoolVector_Fill_False(v, BindPairs.Size() + PackStreams.Size());
-
- unsigned i;
- for (i = 0; i < BindPairs.Size(); i++)
- if (BoolVector_GetAndSet(v, BindPairs[i].InIndex))
- return false;
- for (i = 0; i < PackStreams.Size(); i++)
- if (BoolVector_GetAndSet(v, PackStreams[i]))
- return false;
-
- BoolVector_Fill_False(v, numUnpackSizes);
- for (i = 0; i < BindPairs.Size(); i++)
- if (BoolVector_GetAndSet(v, BindPairs[i].OutIndex))
- return false;
- }
-
- UInt32 mask[kMaskSize];
- unsigned i;
- for (i = 0; i < kMaskSize; i++)
- mask[i] = 0;
-
- {
- CUIntVector inStreamToCoder, outStreamToCoder;
- for (i = 0; i < Coders.Size(); i++)
- {
- CNum j;
- const CCoderInfo &coder = Coders[i];
- for (j = 0; j < coder.NumInStreams; j++)
- inStreamToCoder.Add(i);
- for (j = 0; j < coder.NumOutStreams; j++)
- outStreamToCoder.Add(i);
- }
-
- for (i = 0; i < BindPairs.Size(); i++)
- {
- const CBindPair &bp = BindPairs[i];
- mask[inStreamToCoder[bp.InIndex]] |= (1 << outStreamToCoder[bp.OutIndex]);
- }
- }
-
- for (i = 0; i < kMaskSize; i++)
- for (unsigned j = 0; j < kMaskSize; j++)
- if (((1 << j) & mask[i]) != 0)
- mask[i] |= mask[j];
-
- for (i = 0; i < kMaskSize; i++)
- if (((1 << i) & mask[i]) != 0)
- return false;
-
- return true;
-}
-
-class CInArchiveException {};
-class CUnsupportedFeatureException: public CInArchiveException {};
-
-static void ThrowException() { throw CInArchiveException(); }
-static inline void ThrowEndOfData() { ThrowException(); }
-static inline void ThrowUnsupported() { throw CUnsupportedFeatureException(); }
-static inline void ThrowIncorrect() { ThrowException(); }
-
-class CStreamSwitch
-{
- CInArchive *_archive;
- bool _needRemove;
- bool _needUpdatePos;
-public:
- CStreamSwitch(): _needRemove(false), _needUpdatePos(false) {}
- ~CStreamSwitch() { Remove(); }
- void Remove();
- void Set(CInArchive *archive, const Byte *data, size_t size, bool needUpdatePos);
- void Set(CInArchive *archive, const CByteBuffer &byteBuffer);
- void Set(CInArchive *archive, const CObjectVector<CByteBuffer> *dataVector);
-};
-
-void CStreamSwitch::Remove()
-{
- if (_needRemove)
- {
- if (_archive->_inByteBack->GetRem() != 0)
- _archive->ThereIsHeaderError = true;
- _archive->DeleteByteStream(_needUpdatePos);
- _needRemove = false;
- }
-}
-
-void CStreamSwitch::Set(CInArchive *archive, const Byte *data, size_t size, bool needUpdatePos)
-{
- Remove();
- _archive = archive;
- _archive->AddByteStream(data, size);
- _needRemove = true;
- _needUpdatePos = needUpdatePos;
-}
-
-void CStreamSwitch::Set(CInArchive *archive, const CByteBuffer &byteBuffer)
-{
- Set(archive, byteBuffer, byteBuffer.Size(), false);
-}
-
-void CStreamSwitch::Set(CInArchive *archive, const CObjectVector<CByteBuffer> *dataVector)
-{
- Remove();
- Byte external = archive->ReadByte();
- if (external != 0)
- {
- CNum dataIndex = archive->ReadNum();
- if (dataIndex >= dataVector->Size())
- ThrowIncorrect();
- Set(archive, (*dataVector)[dataIndex]);
- }
-}
-
-void CInArchive::AddByteStream(const Byte *buf, size_t size)
-{
- if (_numInByteBufs == kNumBufLevelsMax)
- ThrowIncorrect();
- _inByteBack = &_inByteVector[_numInByteBufs++];
- _inByteBack->Init(buf, size);
-}
-
-
-Byte CInByte2::ReadByte()
-{
- if (_pos >= _size)
- ThrowEndOfData();
- return _buffer[_pos++];
-}
-
-void CInByte2::ReadBytes(Byte *data, size_t size)
-{
- if (size > _size - _pos)
- ThrowEndOfData();
- memcpy(data, _buffer + _pos, size);
- _pos += size;
-}
-
-void CInByte2::SkipData(UInt64 size)
-{
- if (size > _size - _pos)
- ThrowEndOfData();
- _pos += (size_t)size;
-}
-
-void CInByte2::SkipData()
-{
- SkipData(ReadNumber());
-}
-
-static UInt64 ReadNumberSpec(const Byte *p, size_t size, size_t &processed)
-{
- if (size == 0)
- {
- processed = 0;
- return 0;
- }
- Byte firstByte = *p++;
- size--;
- if ((firstByte & 0x80) == 0)
- {
- processed = 1;
- return firstByte;
- }
- Byte mask = 0x40;
- if (size == 0)
- {
- processed = 0;
- return 0;
- }
- UInt64 value = (UInt64)*p;
- p++;
- size--;
- for (unsigned i = 1; i < 8; i++)
- {
- if ((firstByte & mask) == 0)
- {
- UInt64 highPart = firstByte & (mask - 1);
- value += (highPart << (i * 8));
- processed = i + 1;
- return value;
- }
- if (size == 0)
- {
- processed = 0;
- return 0;
- }
- value |= ((UInt64)*p << (i * 8));
- p++;
- size--;
- mask >>= 1;
- }
- processed = 9;
- return value;
-}
-
-UInt64 CInByte2::ReadNumber()
-{
- size_t processed;
- UInt64 res = ReadNumberSpec(_buffer + _pos, _size - _pos, processed);
- if (processed == 0)
- ThrowEndOfData();
- _pos += processed;
- return res;
-}
-
-CNum CInByte2::ReadNum()
-{
- /*
- if (_pos < _size)
- {
- Byte val = _buffer[_pos];
- if ((unsigned)val < 0x80)
- {
- _pos++;
- return (unsigned)val;
- }
- }
- */
- UInt64 value = ReadNumber();
- if (value > kNumMax)
- ThrowUnsupported();
- return (CNum)value;
-}
-
-UInt32 CInByte2::ReadUInt32()
-{
- if (_pos + 4 > _size)
- ThrowEndOfData();
- UInt32 res = Get32(_buffer + _pos);
- _pos += 4;
- return res;
-}
-
-UInt64 CInByte2::ReadUInt64()
-{
- if (_pos + 8 > _size)
- ThrowEndOfData();
- UInt64 res = Get64(_buffer + _pos);
- _pos += 8;
- return res;
-}
-
-#define CHECK_SIGNATURE if (p[0] != '7' || p[1] != 'z' || p[2] != 0xBC || p[3] != 0xAF || p[4] != 0x27 || p[5] != 0x1C) return false;
-
-static inline bool TestSignature(const Byte *p)
-{
- CHECK_SIGNATURE
- return CrcCalc(p + 12, 20) == Get32(p + 8);
-}
-
-#ifdef FORMAT_7Z_RECOVERY
-static inline bool TestSignature2(const Byte *p)
-{
- CHECK_SIGNATURE;
- if (CrcCalc(p + 12, 20) == Get32(p + 8))
- return true;
- for (unsigned i = 8; i < kHeaderSize; i++)
- if (p[i] != 0)
- return false;
- return (p[6] != 0 || p[7] != 0);
-}
-#else
-#define TestSignature2(p) TestSignature(p)
-#endif
-
-HRESULT CInArchive::FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit)
-{
- RINOK(ReadStream_FALSE(stream, _header, kHeaderSize));
-
- if (TestSignature2(_header))
- return S_OK;
- if (searchHeaderSizeLimit && *searchHeaderSizeLimit == 0)
- return S_FALSE;
-
- const UInt32 kBufSize = 1 << 15;
- CByteArr buf(kBufSize);
- memcpy(buf, _header, kHeaderSize);
- UInt64 offset = 0;
-
- for (;;)
- {
- UInt32 readSize = kBufSize - kHeaderSize;
- {
- UInt64 rem = *searchHeaderSizeLimit - offset;
- if (readSize > rem)
- readSize = (UInt32)rem;
- if (readSize == 0)
- return S_FALSE;
- }
- UInt32 processed = 0;
- RINOK(stream->Read(buf + kHeaderSize, readSize, &processed));
- if (processed == 0)
- return S_FALSE;
- for (UInt32 pos = 0;;)
- {
- const Byte *p = buf + pos + 1;
- const Byte *lim = buf + processed;
- for (; p <= lim; p += 4)
- {
- if (p[0] == '7') break;
- if (p[1] == '7') { p += 1; break; }
- if (p[2] == '7') { p += 2; break; }
- if (p[3] == '7') { p += 3; break; }
- };
- if (p > lim)
- break;
- pos = (UInt32)(p - buf);
- if (TestSignature(p))
- {
- memcpy(_header, p, kHeaderSize);
- _arhiveBeginStreamPosition += offset + pos;
- return stream->Seek(_arhiveBeginStreamPosition + kHeaderSize, STREAM_SEEK_SET, NULL);
- }
- }
- offset += processed;
- memmove(buf, buf + processed, kHeaderSize);
- }
-}
-
-// S_FALSE means that file is not archive
-HRESULT CInArchive::Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit)
-{
- HeadersSize = 0;
- Close();
- RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_arhiveBeginStreamPosition))
- RINOK(stream->Seek(0, STREAM_SEEK_END, &_fileEndPosition))
- RINOK(stream->Seek(_arhiveBeginStreamPosition, STREAM_SEEK_SET, NULL))
- RINOK(FindAndReadSignature(stream, searchHeaderSizeLimit));
- _stream = stream;
- return S_OK;
-}
-
-void CInArchive::Close()
-{
- _numInByteBufs = 0;
- _stream.Release();
- ThereIsHeaderError = false;
-}
-
-void CInArchive::ReadArchiveProperties(CInArchiveInfo & /* archiveInfo */)
-{
- for (;;)
- {
- if (ReadID() == NID::kEnd)
- break;
- SkipData();
- }
-}
-
-// CFolder &folder can be non empty. So we must set all fields
-
-void CInByte2::ParseFolder(CFolder &folder)
-{
- CNum numCoders = ReadNum();
-
- folder.Coders.SetSize(numCoders);
-
- CNum numInStreams = 0;
- CNum numOutStreams = 0;
- CNum i;
- for (i = 0; i < numCoders; i++)
- {
- CCoderInfo &coder = folder.Coders[i];
- {
- Byte mainByte = ReadByte();
- if ((mainByte & 0xC0) != 0)
- ThrowUnsupported();
- unsigned idSize = (mainByte & 0xF);
- if (idSize > 8 || idSize > GetRem())
- ThrowUnsupported();
- const Byte *longID = GetPtr();
- UInt64 id = 0;
- for (unsigned j = 0; j < idSize; j++)
- id = ((id << 8) | longID[j]);
- SkipDataNoCheck(idSize);
- coder.MethodID = id;
-
- if ((mainByte & 0x10) != 0)
- {
- coder.NumInStreams = ReadNum();
- coder.NumOutStreams = ReadNum();
- }
- else
- {
- coder.NumInStreams = 1;
- coder.NumOutStreams = 1;
- }
- if ((mainByte & 0x20) != 0)
- {
- CNum propsSize = ReadNum();
- coder.Props.Alloc((size_t)propsSize);
- ReadBytes((Byte *)coder.Props, (size_t)propsSize);
- }
- else
- coder.Props.Free();
- }
- numInStreams += coder.NumInStreams;
- numOutStreams += coder.NumOutStreams;
- }
-
- CNum numBindPairs = numOutStreams - 1;
- folder.BindPairs.SetSize(numBindPairs);
- for (i = 0; i < numBindPairs; i++)
- {
- CBindPair &bp = folder.BindPairs[i];
- bp.InIndex = ReadNum();
- bp.OutIndex = ReadNum();
- }
-
- if (numInStreams < numBindPairs)
- ThrowUnsupported();
- CNum numPackStreams = numInStreams - numBindPairs;
- folder.PackStreams.SetSize(numPackStreams);
- if (numPackStreams == 1)
- {
- for (i = 0; i < numInStreams; i++)
- if (folder.FindBindPairForInStream(i) < 0)
- {
- folder.PackStreams[0] = i;
- break;
- }
- if (i == numInStreams)
- ThrowUnsupported();
- }
- else
- for (i = 0; i < numPackStreams; i++)
- folder.PackStreams[i] = ReadNum();
-}
-
-void CFolders::ParseFolderInfo(unsigned folderIndex, CFolder &folder) const
-{
- size_t startPos = FoCodersDataOffset[folderIndex];
- CInByte2 inByte;
- inByte.Init(CodersData + startPos, FoCodersDataOffset[folderIndex + 1] - startPos);
- inByte.ParseFolder(folder);
- if (inByte.GetRem() != 0)
- throw 20120424;
-}
-
-
-void CDatabase::GetPath(unsigned index, UString &path) const
-{
- path.Empty();
- if (!NameOffsets || !NamesBuf)
- return;
-
- size_t offset = NameOffsets[index];
- size_t size = NameOffsets[index + 1] - offset - 1;
-
- if (size >= (1 << 20))
- return;
-
- wchar_t *s = path.GetBuffer((unsigned)size);
-
- const Byte *p = ((const Byte *)NamesBuf + offset * 2);
-
- #if defined(_WIN32) && defined(MY_CPU_LE)
-
- wmemcpy(s, (const wchar_t *)p, size);
-
- #else
-
- for (size_t i = 0; i < size; i++)
- {
- *s = Get16(p);
- p += 2;
- s++;
- }
-
- #endif
-
- path.ReleaseBuffer((unsigned)size);
-}
-
-HRESULT CDatabase::GetPath_Prop(unsigned index, PROPVARIANT *path) const throw()
-{
- PropVariant_Clear(path);
- if (!NameOffsets || !NamesBuf)
- return S_OK;
-
- size_t offset = NameOffsets[index];
- size_t size = NameOffsets[index + 1] - offset;
-
- if (size >= (1 << 14))
- return S_OK;
-
- RINOK(PropVarEm_Alloc_Bstr(path, (unsigned)size - 1));
- wchar_t *s = path->bstrVal;
-
- const Byte *p = ((const Byte *)NamesBuf + offset * 2);
-
- for (size_t i = 0; i < size; i++)
- {
- wchar_t c = Get16(p);
- p += 2;
- #if WCHAR_PATH_SEPARATOR != L'/'
- if (c == L'/')
- c = WCHAR_PATH_SEPARATOR;
- #endif
- *s++ = c;
- }
-
- return S_OK;
-
- /*
- unsigned cur = index;
- unsigned size = 0;
-
- for (int i = 0;; i++)
- {
- size_t len = NameOffsets[cur + 1] - NameOffsets[cur];
- size += (unsigned)len;
- if (i > 256 || len > (1 << 14) || size > (1 << 14))
- return PropVarEm_Set_Str(path, "[TOO-LONG]");
- cur = Files[cur].Parent;
- if (cur < 0)
- break;
- }
- size--;
-
- RINOK(PropVarEm_Alloc_Bstr(path, size));
- wchar_t *s = path->bstrVal;
- s += size;
- *s = 0;
- cur = index;
-
- for (;;)
- {
- unsigned len = (unsigned)(NameOffsets[cur + 1] - NameOffsets[cur] - 1);
- const Byte *p = (const Byte *)NamesBuf + (NameOffsets[cur + 1] * 2) - 2;
- do
- {
- p -= 2;
- --s;
- wchar_t c = Get16(p);
- if (c == '/')
- c = WCHAR_PATH_SEPARATOR;
- *s = c;
- }
- while (--len);
- const CFileItem &file = Files[cur];
- cur = file.Parent;
- if (cur < 0)
- return S_OK;
- *(--s) = (file.IsAltStream ? ':' : WCHAR_PATH_SEPARATOR);
- }
- */
-}
-
-void CInArchive::WaitId(UInt64 id)
-{
- for (;;)
- {
- UInt64 type = ReadID();
- if (type == id)
- return;
- if (type == NID::kEnd)
- ThrowIncorrect();
- SkipData();
- }
-}
-
-void CInArchive::ReadHashDigests(unsigned numItems, CUInt32DefVector &crcs)
-{
- ReadBoolVector2(numItems, crcs.Defs);
- crcs.Vals.ClearAndSetSize(numItems);
- UInt32 *p = &crcs.Vals[0];
- const bool *defs = &crcs.Defs[0];
- for (unsigned i = 0; i < numItems; i++)
- {
- UInt32 crc = 0;
- if (defs[i])
- crc = ReadUInt32();
- p[i] = crc;
- }
-}
-
-void CInArchive::ReadPackInfo(CFolders &f)
-{
- CNum numPackStreams = ReadNum();
-
- WaitId(NID::kSize);
- f.PackPositions.Alloc(numPackStreams + 1);
- f.NumPackStreams = numPackStreams;
- UInt64 sum = 0;
- for (CNum i = 0; i < numPackStreams; i++)
- {
- f.PackPositions[i] = sum;
- UInt64 packSize = ReadNumber();
- sum += packSize;
- if (sum < packSize)
- ThrowIncorrect();
- }
- f.PackPositions[numPackStreams] = sum;
-
- UInt64 type;
- for (;;)
- {
- type = ReadID();
- if (type == NID::kEnd)
- return;
- if (type == NID::kCRC)
- {
- CUInt32DefVector PackCRCs;
- ReadHashDigests(numPackStreams, PackCRCs);
- continue;
- }
- SkipData();
- }
-}
-
-void CInArchive::ReadUnpackInfo(
- const CObjectVector<CByteBuffer> *dataVector,
- CFolders &folders)
-{
- WaitId(NID::kFolder);
- CNum numFolders = ReadNum();
-
- CNum numCodersOutStreams = 0;
- {
- CStreamSwitch streamSwitch;
- streamSwitch.Set(this, dataVector);
- const Byte *startBufPtr = _inByteBack->GetPtr();
- folders.NumFolders = numFolders;
-
- folders.FoStartPackStreamIndex.Alloc(numFolders + 1);
- folders.FoToMainUnpackSizeIndex.Alloc(numFolders);
- folders.FoCodersDataOffset.Alloc(numFolders + 1);
- folders.FoToCoderUnpackSizes.Alloc(numFolders + 1);
-
- CRecordVector<bool> InStreamUsed;
- CRecordVector<bool> OutStreamUsed;
-
- CNum packStreamIndex = 0;
- CNum fo;
- CInByte2 *inByte = _inByteBack;
- for (fo = 0; fo < numFolders; fo++)
- {
- UInt32 numOutStreams = 0;
- UInt32 indexOfMainStream = 0;
- UInt32 numPackStreams = 0;
- folders.FoCodersDataOffset[fo] = _inByteBack->GetPtr() - startBufPtr;
-
- numOutStreams = 0;
- CNum numInStreams = 0;
- CNum numCoders = inByte->ReadNum();
- for (CNum ci = 0; ci < numCoders; ci++)
- {
- Byte mainByte = inByte->ReadByte();
- if ((mainByte & 0xC0) != 0)
- ThrowUnsupported();
- unsigned idSize = (mainByte & 0xF);
- if (idSize > 8)
- ThrowUnsupported();
- if (idSize > inByte->GetRem())
- ThrowEndOfData();
- const Byte *longID = inByte->GetPtr();
- UInt64 id = 0;
- for (unsigned j = 0; j < idSize; j++)
- id = ((id << 8) | longID[j]);
- inByte->SkipDataNoCheck(idSize);
- if (folders.ParsedMethods.IDs.Size() < 128)
- folders.ParsedMethods.IDs.AddToUniqueSorted(id);
- CNum coderInStreams = 1;
- CNum coderOutStreams = 1;
- if ((mainByte & 0x10) != 0)
- {
- coderInStreams = inByte->ReadNum();
- coderOutStreams = inByte->ReadNum();
- }
- numInStreams += coderInStreams;
- if (numInStreams < coderInStreams)
- ThrowUnsupported();
- numOutStreams += coderOutStreams;
- if (numOutStreams < coderOutStreams)
- ThrowUnsupported();
- if ((mainByte & 0x20) != 0)
- {
- CNum propsSize = inByte->ReadNum();
- if (propsSize > inByte->GetRem())
- ThrowEndOfData();
- if (id == k_LZMA2 && propsSize == 1)
- {
- Byte v = *_inByteBack->GetPtr();
- if (folders.ParsedMethods.Lzma2Prop < v)
- folders.ParsedMethods.Lzma2Prop = v;
- }
- else if (id == k_LZMA && propsSize == 5)
- {
- UInt32 dicSize = GetUi32(_inByteBack->GetPtr() + 1);
- if (folders.ParsedMethods.LzmaDic < dicSize)
- folders.ParsedMethods.LzmaDic = dicSize;
- }
- inByte->SkipDataNoCheck((size_t)propsSize);
- }
- }
-
- if (numOutStreams == 1 && numInStreams == 1)
- {
- indexOfMainStream = 0;
- numPackStreams = 1;
- }
- else
- {
- UInt32 i;
- if (numOutStreams == 0)
- ThrowUnsupported();
- CNum numBindPairs = numOutStreams - 1;
- if (numInStreams < numBindPairs)
- ThrowUnsupported();
- if (numInStreams >= 256 || numOutStreams >= 256)
- ThrowUnsupported();
-
- InStreamUsed.ClearAndSetSize(numInStreams);
- for (i = 0; i < numInStreams; i++)
- InStreamUsed[i] = false;
-
- OutStreamUsed.ClearAndSetSize(numOutStreams);
- for (i = 0; i < numOutStreams; i++)
- OutStreamUsed[i] = false;
-
- for (i = 0; i < numBindPairs; i++)
- {
- CNum index = ReadNum();
- if (index >= numInStreams || InStreamUsed[index])
- ThrowUnsupported();
- InStreamUsed[index] = true;
- index = ReadNum();
- if (index >= numOutStreams || OutStreamUsed[index])
- ThrowUnsupported();
- OutStreamUsed[index] = true;
- }
-
- numPackStreams = numInStreams - numBindPairs;
-
- if (numPackStreams != 1)
- for (i = 0; i < numPackStreams; i++)
- inByte->ReadNum(); // PackStreams
-
- for (i = 0; i < numOutStreams; i++)
- if (!OutStreamUsed[i])
- {
- indexOfMainStream = i;
- break;
- }
- if (i == numOutStreams)
- ThrowUnsupported();
- }
- folders.FoToCoderUnpackSizes[fo] = numCodersOutStreams;
- numCodersOutStreams += numOutStreams;
- folders.FoStartPackStreamIndex[fo] = packStreamIndex;
- packStreamIndex += numPackStreams;
- folders.FoToMainUnpackSizeIndex[fo] = (Byte)indexOfMainStream;
- }
- size_t dataSize = _inByteBack->GetPtr() - startBufPtr;
- folders.FoToCoderUnpackSizes[fo] = numCodersOutStreams;
- folders.FoStartPackStreamIndex[fo] = packStreamIndex;
- folders.FoCodersDataOffset[fo] = _inByteBack->GetPtr() - startBufPtr;
- folders.CodersData.CopyFrom(startBufPtr, dataSize);
- }
-
- WaitId(NID::kCodersUnpackSize);
- folders.CoderUnpackSizes.Alloc(numCodersOutStreams);
- for (CNum i = 0; i < numCodersOutStreams; i++)
- folders.CoderUnpackSizes[i] = ReadNumber();
-
- for (;;)
- {
- UInt64 type = ReadID();
- if (type == NID::kEnd)
- return;
- if (type == NID::kCRC)
- {
- ReadHashDigests(numFolders, folders.FolderCRCs);
- continue;
- }
- SkipData();
- }
-}
-
-void CInArchive::ReadSubStreamsInfo(
- CFolders &folders,
- CRecordVector<UInt64> &unpackSizes,
- CUInt32DefVector &digests)
-{
- folders.NumUnpackStreamsVector.Alloc(folders.NumFolders);
- CNum i;
- for (i = 0; i < folders.NumFolders; i++)
- folders.NumUnpackStreamsVector[i] = 1;
-
- UInt64 type;
-
- for (;;)
- {
- type = ReadID();
- if (type == NID::kNumUnpackStream)
- {
- for (i = 0; i < folders.NumFolders; i++)
- folders.NumUnpackStreamsVector[i] = ReadNum();
- continue;
- }
- if (type == NID::kCRC || type == NID::kSize || type == NID::kEnd)
- break;
- SkipData();
- }
-
- if (type == NID::kSize)
- {
- for (i = 0; i < folders.NumFolders; i++)
- {
- // v3.13 incorrectly worked with empty folders
- // v4.07: we check that folder is empty
- CNum numSubstreams = folders.NumUnpackStreamsVector[i];
- if (numSubstreams == 0)
- continue;
- UInt64 sum = 0;
- for (CNum j = 1; j < numSubstreams; j++)
- {
- UInt64 size = ReadNumber();
- unpackSizes.Add(size);
- sum += size;
- if (sum < size)
- ThrowIncorrect();
- }
- UInt64 folderUnpackSize = folders.GetFolderUnpackSize(i);
- if (folderUnpackSize < sum)
- ThrowIncorrect();
- unpackSizes.Add(folderUnpackSize - sum);
- }
- type = ReadID();
- }
- else
- {
- for (i = 0; i < folders.NumFolders; i++)
- {
- /* v9.26 - v9.29 incorrectly worked:
- if (folders.NumUnpackStreamsVector[i] == 0), it threw error */
- CNum val = folders.NumUnpackStreamsVector[i];
- if (val > 1)
- ThrowIncorrect();
- if (val == 1)
- unpackSizes.Add(folders.GetFolderUnpackSize(i));
- }
- }
-
- unsigned numDigests = 0;
- for (i = 0; i < folders.NumFolders; i++)
- {
- CNum numSubstreams = folders.NumUnpackStreamsVector[i];
- if (numSubstreams != 1 || !folders.FolderCRCs.ValidAndDefined(i))
- numDigests += numSubstreams;
- }
-
- for (;;)
- {
- if (type == NID::kEnd)
- break;
- if (type == NID::kCRC)
- {
- // CUInt32DefVector digests2;
- // ReadHashDigests(numDigests, digests2);
- CBoolVector digests2;
- ReadBoolVector2(numDigests, digests2);
-
- digests.ClearAndSetSize(unpackSizes.Size());
-
- unsigned k = 0;
- unsigned k2 = 0;
-
- for (i = 0; i < folders.NumFolders; i++)
- {
- CNum numSubstreams = folders.NumUnpackStreamsVector[i];
- if (numSubstreams == 1 && folders.FolderCRCs.ValidAndDefined(i))
- {
- digests.Defs[k] = true;
- digests.Vals[k] = folders.FolderCRCs.Vals[i];
- k++;
- }
- else for (CNum j = 0; j < numSubstreams; j++)
- {
- bool defined = digests2[k2++];
- digests.Defs[k] = defined;
- UInt32 crc = 0;
- if (defined)
- crc = ReadUInt32();
- digests.Vals[k] = crc;
- k++;
- }
- }
- // if (k != unpackSizes.Size()) throw 1234567;
- }
- else
- SkipData();
-
- type = ReadID();
- }
-
- if (digests.Defs.Size() != unpackSizes.Size())
- {
- digests.ClearAndSetSize(unpackSizes.Size());
- unsigned k = 0;
- for (i = 0; i < folders.NumFolders; i++)
- {
- CNum numSubstreams = folders.NumUnpackStreamsVector[i];
- if (numSubstreams == 1 && folders.FolderCRCs.ValidAndDefined(i))
- {
- digests.Defs[k] = true;
- digests.Vals[k] = folders.FolderCRCs.Vals[i];
- k++;
- }
- else for (CNum j = 0; j < numSubstreams; j++)
- {
- digests.Defs[k] = false;
- digests.Vals[k] = 0;
- k++;
- }
- }
- }
-}
-
-void CInArchive::ReadStreamsInfo(
- const CObjectVector<CByteBuffer> *dataVector,
- UInt64 &dataOffset,
- CFolders &folders,
- CRecordVector<UInt64> &unpackSizes,
- CUInt32DefVector &digests)
-{
- UInt64 type = ReadID();
-
- if (type == NID::kPackInfo)
- {
- dataOffset = ReadNumber();
- ReadPackInfo(folders);
- type = ReadID();
- }
-
- if (type == NID::kUnpackInfo)
- {
- ReadUnpackInfo(dataVector, folders);
- type = ReadID();
- }
-
- if (folders.NumFolders != 0 && !folders.PackPositions)
- {
- // if there are folders, we need PackPositions also
- folders.PackPositions.Alloc(1);
- folders.PackPositions[0] = 0;
- }
-
- if (type == NID::kSubStreamsInfo)
- {
- ReadSubStreamsInfo(folders, unpackSizes, digests);
- type = ReadID();
- }
- else
- {
- folders.NumUnpackStreamsVector.Alloc(folders.NumFolders);
- /* If digests.Defs.Size() == 0, it means that there are no crcs.
- So we don't need to fill digests with values. */
- // digests.Vals.ClearAndSetSize(folders.NumFolders);
- // BoolVector_Fill_False(digests.Defs, folders.NumFolders);
- for (CNum i = 0; i < folders.NumFolders; i++)
- {
- folders.NumUnpackStreamsVector[i] = 1;
- unpackSizes.Add(folders.GetFolderUnpackSize(i));
- // digests.Vals[i] = 0;
- }
- }
-
- if (type != NID::kEnd)
- ThrowIncorrect();
-}
-
-void CInArchive::ReadBoolVector(unsigned numItems, CBoolVector &v)
-{
- v.ClearAndSetSize(numItems);
- Byte b = 0;
- Byte mask = 0;
- bool *p = &v[0];
- for (unsigned i = 0; i < numItems; i++)
- {
- if (mask == 0)
- {
- b = ReadByte();
- mask = 0x80;
- }
- p[i] = ((b & mask) != 0);
- mask >>= 1;
- }
-}
-
-void CInArchive::ReadBoolVector2(unsigned numItems, CBoolVector &v)
-{
- Byte allAreDefined = ReadByte();
- if (allAreDefined == 0)
- {
- ReadBoolVector(numItems, v);
- return;
- }
- v.ClearAndSetSize(numItems);
- bool *p = &v[0];
- for (unsigned i = 0; i < numItems; i++)
- p[i] = true;
-}
-
-void CInArchive::ReadUInt64DefVector(const CObjectVector<CByteBuffer> &dataVector,
- CUInt64DefVector &v, unsigned numItems)
-{
- ReadBoolVector2(numItems, v.Defs);
-
- CStreamSwitch streamSwitch;
- streamSwitch.Set(this, &dataVector);
-
- v.Vals.ClearAndSetSize(numItems);
- UInt64 *p = &v.Vals[0];
- const bool *defs = &v.Defs[0];
-
- for (unsigned i = 0; i < numItems; i++)
- {
- UInt64 t = 0;
- if (defs[i])
- t = ReadUInt64();
- p[i] = t;
- }
-}
-
-HRESULT CInArchive::ReadAndDecodePackedStreams(
- DECL_EXTERNAL_CODECS_LOC_VARS
- UInt64 baseOffset,
- UInt64 &dataOffset, CObjectVector<CByteBuffer> &dataVector
- _7Z_DECODER_CRYPRO_VARS_DECL
- )
-{
- CFolders folders;
- CRecordVector<UInt64> unpackSizes;
- CUInt32DefVector digests;
-
- ReadStreamsInfo(NULL,
- dataOffset,
- folders,
- unpackSizes,
- digests);
-
- CDecoder decoder(
- #ifdef _ST_MODE
- false
- #else
- true
- #endif
- );
-
- for (CNum i = 0; i < folders.NumFolders; i++)
- {
- CByteBuffer &data = dataVector.AddNew();
- UInt64 unpackSize64 = folders.GetFolderUnpackSize(i);
- size_t unpackSize = (size_t)unpackSize64;
- if (unpackSize != unpackSize64)
- ThrowUnsupported();
- data.Alloc(unpackSize);
-
- CBufPtrSeqOutStream *outStreamSpec = new CBufPtrSeqOutStream;
- CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;
- outStreamSpec->Init(data, unpackSize);
-
- HRESULT result = decoder.Decode(
- EXTERNAL_CODECS_LOC_VARS
- _stream, baseOffset + dataOffset,
- folders, i,
- outStream, NULL
- _7Z_DECODER_CRYPRO_VARS
- #if !defined(_7ZIP_ST) && !defined(_SFX)
- , false, 1
- #endif
- );
- RINOK(result);
-
- if (folders.FolderCRCs.ValidAndDefined(i))
- if (CrcCalc(data, unpackSize) != folders.FolderCRCs.Vals[i])
- ThrowIncorrect();
- }
- HeadersSize += folders.PackPositions[folders.NumPackStreams];
- return S_OK;
-}
-
-HRESULT CInArchive::ReadHeader(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CDbEx &db
- _7Z_DECODER_CRYPRO_VARS_DECL
- )
-{
- UInt64 type = ReadID();
-
- if (type == NID::kArchiveProperties)
- {
- ReadArchiveProperties(db.ArcInfo);
- type = ReadID();
- }
-
- CObjectVector<CByteBuffer> dataVector;
-
- if (type == NID::kAdditionalStreamsInfo)
- {
- HRESULT result = ReadAndDecodePackedStreams(
- EXTERNAL_CODECS_LOC_VARS
- db.ArcInfo.StartPositionAfterHeader,
- db.ArcInfo.DataStartPosition2,
- dataVector
- _7Z_DECODER_CRYPRO_VARS
- );
- RINOK(result);
- db.ArcInfo.DataStartPosition2 += db.ArcInfo.StartPositionAfterHeader;
- type = ReadID();
- }
-
- CRecordVector<UInt64> unpackSizes;
- CUInt32DefVector digests;
-
- if (type == NID::kMainStreamsInfo)
- {
- ReadStreamsInfo(&dataVector,
- db.ArcInfo.DataStartPosition,
- (CFolders &)db,
- unpackSizes,
- digests);
- db.ArcInfo.DataStartPosition += db.ArcInfo.StartPositionAfterHeader;
- type = ReadID();
- }
-
- db.Files.Clear();
-
- if (type == NID::kFilesInfo)
- {
-
- CNum numFiles = ReadNum();
- db.Files.ClearAndSetSize(numFiles);
- CNum i;
- /*
- db.Files.Reserve(numFiles);
- CNum i;
- for (i = 0; i < numFiles; i++)
- db.Files.Add(CFileItem());
- */
-
- db.ArcInfo.FileInfoPopIDs.Add(NID::kSize);
- // if (!db.PackSizes.IsEmpty())
- db.ArcInfo.FileInfoPopIDs.Add(NID::kPackInfo);
- if (numFiles > 0 && !digests.Defs.IsEmpty())
- db.ArcInfo.FileInfoPopIDs.Add(NID::kCRC);
-
- CBoolVector emptyStreamVector;
- BoolVector_Fill_False(emptyStreamVector, (unsigned)numFiles);
- CBoolVector emptyFileVector;
- CBoolVector antiFileVector;
- CNum numEmptyStreams = 0;
-
- for (;;)
- {
- UInt64 type = ReadID();
- if (type == NID::kEnd)
- break;
- UInt64 size = ReadNumber();
- if (size > _inByteBack->GetRem())
- ThrowIncorrect();
- CStreamSwitch switchProp;
- switchProp.Set(this, _inByteBack->GetPtr(), (size_t)size, true);
- bool addPropIdToList = true;
- bool isKnownType = true;
- if (type > ((UInt32)1 << 30))
- isKnownType = false;
- else switch((UInt32)type)
- {
- case NID::kName:
- {
- CStreamSwitch streamSwitch;
- streamSwitch.Set(this, &dataVector);
- size_t rem = _inByteBack->GetRem();
- db.NamesBuf.Alloc(rem);
- ReadBytes(db.NamesBuf, rem);
- db.NameOffsets.Alloc(db.Files.Size() + 1);
- size_t pos = 0;
- unsigned i;
- for (i = 0; i < db.Files.Size(); i++)
- {
- size_t curRem = (rem - pos) / 2;
- const UInt16 *buf = (const UInt16 *)(db.NamesBuf + pos);
- size_t j;
- for (j = 0; j < curRem && buf[j] != 0; j++);
- if (j == curRem)
- ThrowEndOfData();
- db.NameOffsets[i] = pos / 2;
- pos += j * 2 + 2;
- }
- db.NameOffsets[i] = pos / 2;
- if (pos != rem)
- ThereIsHeaderError = true;
- break;
- }
- case NID::kWinAttrib:
- {
- CBoolVector boolVector;
- ReadBoolVector2(db.Files.Size(), boolVector);
- CStreamSwitch streamSwitch;
- streamSwitch.Set(this, &dataVector);
- for (i = 0; i < numFiles; i++)
- {
- CFileItem &file = db.Files[i];
- file.AttribDefined = boolVector[i];
- if (file.AttribDefined)
- file.Attrib = ReadUInt32();
- }
- break;
- }
- /*
- case NID::kIsAux:
- {
- ReadBoolVector(db.Files.Size(), db.IsAux);
- break;
- }
- case NID::kParent:
- {
- db.IsTree = true;
- // CBoolVector boolVector;
- // ReadBoolVector2(db.Files.Size(), boolVector);
- // CStreamSwitch streamSwitch;
- // streamSwitch.Set(this, &dataVector);
- CBoolVector boolVector;
- ReadBoolVector2(db.Files.Size(), boolVector);
-
- db.ThereAreAltStreams = false;
- for (i = 0; i < numFiles; i++)
- {
- CFileItem &file = db.Files[i];
- // file.Parent = -1;
- // if (boolVector[i])
- file.Parent = (int)ReadUInt32();
- file.IsAltStream = !boolVector[i];
- if (file.IsAltStream)
- db.ThereAreAltStreams = true;
- }
- break;
- }
- */
- case NID::kEmptyStream:
- {
- ReadBoolVector(numFiles, emptyStreamVector);
- numEmptyStreams = 0;
- for (i = 0; i < (CNum)emptyStreamVector.Size(); i++)
- if (emptyStreamVector[i])
- numEmptyStreams++;
-
- BoolVector_Fill_False(emptyFileVector, numEmptyStreams);
- BoolVector_Fill_False(antiFileVector, numEmptyStreams);
-
- break;
- }
- case NID::kEmptyFile: ReadBoolVector(numEmptyStreams, emptyFileVector); break;
- case NID::kAnti: ReadBoolVector(numEmptyStreams, antiFileVector); break;
- case NID::kStartPos: ReadUInt64DefVector(dataVector, db.StartPos, (unsigned)numFiles); break;
- case NID::kCTime: ReadUInt64DefVector(dataVector, db.CTime, (unsigned)numFiles); break;
- case NID::kATime: ReadUInt64DefVector(dataVector, db.ATime, (unsigned)numFiles); break;
- case NID::kMTime: ReadUInt64DefVector(dataVector, db.MTime, (unsigned)numFiles); break;
- case NID::kDummy:
- {
- for (UInt64 j = 0; j < size; j++)
- if (ReadByte() != 0)
- ThereIsHeaderError = true;
- addPropIdToList = false;
- break;
- }
- /*
- case NID::kNtSecure:
- {
- try
- {
- {
- CStreamSwitch streamSwitch;
- streamSwitch.Set(this, &dataVector);
- UInt32 numDescriptors = ReadUInt32();
- size_t offset = 0;
- db.SecureOffsets.Clear();
- for (i = 0; i < numDescriptors; i++)
- {
- UInt32 size = ReadUInt32();
- db.SecureOffsets.Add(offset);
- offset += size;
- }
- // ThrowIncorrect();;
- db.SecureOffsets.Add(offset);
- db.SecureBuf.SetCapacity(offset);
- for (i = 0; i < numDescriptors; i++)
- {
- offset = db.SecureOffsets[i];
- ReadBytes(db.SecureBuf + offset, db.SecureOffsets[i + 1] - offset);
- }
- db.SecureIDs.Clear();
- for (unsigned i = 0; i < db.Files.Size(); i++)
- {
- db.SecureIDs.Add(ReadNum());
- // db.SecureIDs.Add(ReadUInt32());
- }
- // ReadUInt32();
- if (_inByteBack->GetRem() != 0)
- ThrowIncorrect();;
- }
- }
- catch(CInArchiveException &)
- {
- ThereIsHeaderError = true;
- addPropIdToList = isKnownType = false;
- db.ClearSecure();
- }
- break;
- }
- */
- default:
- addPropIdToList = isKnownType = false;
- }
- if (isKnownType)
- {
- if (addPropIdToList)
- db.ArcInfo.FileInfoPopIDs.Add(type);
- }
- else
- {
- db.UnsupportedFeatureWarning = true;
- _inByteBack->SkipRem();
- }
- // SkipData worked incorrectly in some versions before v4.59 (7zVer <= 00.02)
- if (_inByteBack->GetRem() != 0)
- ThrowIncorrect();
- }
-
- type = ReadID(); // Read (NID::kEnd) end of headers
-
- CNum emptyFileIndex = 0;
- CNum sizeIndex = 0;
-
- CNum numAntiItems = 0;
- for (i = 0; i < numEmptyStreams; i++)
- if (antiFileVector[i])
- numAntiItems++;
-
- for (i = 0; i < numFiles; i++)
- {
- CFileItem &file = db.Files[i];
- bool isAnti;
- file.HasStream = !emptyStreamVector[i];
- file.Crc = 0;
- if (file.HasStream)
- {
- file.IsDir = false;
- isAnti = false;
- file.Size = unpackSizes[sizeIndex];
- file.CrcDefined = digests.ValidAndDefined(sizeIndex);
- if (file.CrcDefined)
- file.Crc = digests.Vals[sizeIndex];
- sizeIndex++;
- }
- else
- {
- file.IsDir = !emptyFileVector[emptyFileIndex];
- isAnti = antiFileVector[emptyFileIndex];
- emptyFileIndex++;
- file.Size = 0;
- file.CrcDefined = false;
- }
- if (numAntiItems != 0)
- db.IsAnti.Add(isAnti);
- }
- }
- db.FillLinks();
- /*
- if (type != NID::kEnd)
- ThrowIncorrect();
- if (_inByteBack->GetRem() != 0)
- ThrowIncorrect();
- */
- return S_OK;
-}
-
-void CDbEx::FillLinks()
-{
- FolderStartFileIndex.ClearAndSetSize(NumFolders);
-
- FileIndexToFolderIndexMap.ClearAndSetSize(Files.Size());
-
- CNum folderIndex = 0;
- CNum indexInFolder = 0;
- unsigned i;
- for (i = 0; i < Files.Size(); i++)
- {
- bool emptyStream = !Files[i].HasStream;
- if (indexInFolder == 0)
- {
- if (emptyStream)
- {
- FileIndexToFolderIndexMap[i] = kNumNoIndex;
- continue;
- }
- // v3.13 incorrectly worked with empty folders
- // v4.07: we skip empty folders
- for (;;)
- {
- if (folderIndex >= NumFolders)
- ThrowIncorrect();
- FolderStartFileIndex[folderIndex] = i;
- if (NumUnpackStreamsVector[folderIndex] != 0)
- break;
- folderIndex++;
- }
- }
- FileIndexToFolderIndexMap[i] = folderIndex;
- if (emptyStream)
- continue;
- if (++indexInFolder >= NumUnpackStreamsVector[folderIndex])
- {
- folderIndex++;
- indexInFolder = 0;
- }
- }
-
- if (indexInFolder != 0)
- folderIndex++;
- /*
- if (indexInFolder != 0)
- ThrowIncorrect();
- */
- for (;;)
- {
- if (folderIndex >= NumFolders)
- return;
- FolderStartFileIndex[folderIndex] = i;
- /*
- if (NumUnpackStreamsVector[folderIndex] != 0)
- ThrowIncorrect();;
- */
- folderIndex++;
- }
-}
-
-HRESULT CInArchive::ReadDatabase2(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CDbEx &db
- _7Z_DECODER_CRYPRO_VARS_DECL
- )
-{
- db.Clear();
- db.ArcInfo.StartPosition = _arhiveBeginStreamPosition;
-
- db.ArcInfo.Version.Major = _header[6];
- db.ArcInfo.Version.Minor = _header[7];
-
- if (db.ArcInfo.Version.Major != kMajorVersion)
- {
- // db.UnsupportedVersion = true;
- return S_FALSE;
- }
-
- UInt64 nextHeaderOffset = Get64(_header + 12);
- UInt64 nextHeaderSize = Get64(_header + 20);
- UInt32 nextHeaderCRC = Get32(_header + 28);
-
- #ifdef FORMAT_7Z_RECOVERY
- UInt32 crcFromArc = Get32(_header + 8);
- if (crcFromArc == 0 && nextHeaderOffset == 0 && nextHeaderSize == 0 && nextHeaderCRC == 0)
- {
- UInt64 cur, fileSize;
- RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &cur));
- const unsigned kCheckSize = 512;
- Byte buf[kCheckSize];
- RINOK(_stream->Seek(0, STREAM_SEEK_END, &fileSize));
- UInt64 rem = fileSize - cur;
- unsigned checkSize = kCheckSize;
- if (rem < kCheckSize)
- checkSize = (unsigned)(rem);
- if (checkSize < 3)
- return S_FALSE;
- RINOK(_stream->Seek(fileSize - checkSize, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream_FALSE(_stream, buf, (size_t)checkSize));
-
- if (buf[checkSize - 1] != 0)
- return S_FALSE;
-
- unsigned i;
- for (i = checkSize - 2;; i--)
- {
- if (buf[i] == NID::kEncodedHeader && buf[i + 1] == NID::kPackInfo ||
- buf[i] == NID::kHeader && buf[i + 1] == NID::kMainStreamsInfo)
- break;
- if (i == 0)
- return S_FALSE;
- }
- nextHeaderSize = checkSize - i;
- nextHeaderOffset = rem - nextHeaderSize;
- nextHeaderCRC = CrcCalc(buf + i, (size_t)nextHeaderSize);
- RINOK(_stream->Seek(cur, STREAM_SEEK_SET, NULL));
- db.StartHeaderWasRecovered = true;
- }
- else
- #endif
- {
- // Crc was tested already at signature check
- // if (CrcCalc(_header + 12, 20) != crcFromArchive) ThrowIncorrect();
- }
-
- db.ArcInfo.StartPositionAfterHeader = _arhiveBeginStreamPosition + kHeaderSize;
- db.PhySize = kHeaderSize;
-
- db.IsArc = false;
- if ((Int64)nextHeaderOffset < 0 ||
- nextHeaderSize > ((UInt64)1 << 62))
- return S_FALSE;
- if (nextHeaderSize == 0)
- {
- if (nextHeaderOffset != 0)
- return S_FALSE;
- db.IsArc = true;
- return S_OK;
- }
-
- if (!db.StartHeaderWasRecovered)
- db.IsArc = true;
-
- HeadersSize += kHeaderSize + nextHeaderSize;
- db.PhySize = kHeaderSize + nextHeaderOffset + nextHeaderSize;
- if (_fileEndPosition - db.ArcInfo.StartPositionAfterHeader < nextHeaderOffset + nextHeaderSize)
- {
- db.UnexpectedEnd = true;
- return S_FALSE;
- }
- RINOK(_stream->Seek(nextHeaderOffset, STREAM_SEEK_CUR, NULL));
-
- size_t nextHeaderSize_t = (size_t)nextHeaderSize;
- if (nextHeaderSize_t != nextHeaderSize)
- return E_OUTOFMEMORY;
- CByteBuffer buffer2(nextHeaderSize_t);
-
- RINOK(ReadStream_FALSE(_stream, buffer2, nextHeaderSize_t));
-
- if (CrcCalc(buffer2, nextHeaderSize_t) != nextHeaderCRC)
- ThrowIncorrect();
-
- if (!db.StartHeaderWasRecovered)
- db.PhySizeWasConfirmed = true;
-
- CStreamSwitch streamSwitch;
- streamSwitch.Set(this, buffer2);
-
- CObjectVector<CByteBuffer> dataVector;
-
- UInt64 type = ReadID();
- if (type != NID::kHeader)
- {
- if (type != NID::kEncodedHeader)
- ThrowIncorrect();
- HRESULT result = ReadAndDecodePackedStreams(
- EXTERNAL_CODECS_LOC_VARS
- db.ArcInfo.StartPositionAfterHeader,
- db.ArcInfo.DataStartPosition2,
- dataVector
- _7Z_DECODER_CRYPRO_VARS
- );
- RINOK(result);
- if (dataVector.Size() == 0)
- return S_OK;
- if (dataVector.Size() > 1)
- ThrowIncorrect();
- streamSwitch.Remove();
- streamSwitch.Set(this, dataVector.Front());
- if (ReadID() != NID::kHeader)
- ThrowIncorrect();
- }
-
- db.IsArc = true;
-
- db.HeadersSize = HeadersSize;
-
- return ReadHeader(
- EXTERNAL_CODECS_LOC_VARS
- db
- _7Z_DECODER_CRYPRO_VARS
- );
-}
-
-HRESULT CInArchive::ReadDatabase(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CDbEx &db
- _7Z_DECODER_CRYPRO_VARS_DECL
- )
-{
- try
- {
- HRESULT res = ReadDatabase2(
- EXTERNAL_CODECS_LOC_VARS db
- _7Z_DECODER_CRYPRO_VARS
- );
- if (ThereIsHeaderError)
- db.ThereIsHeaderError = true;
- if (res == E_NOTIMPL)
- ThrowUnsupported();
- return res;
- }
- catch(CUnsupportedFeatureException &)
- {
- db.UnsupportedFeatureError = true;
- return S_FALSE;
- }
- catch(CInArchiveException &)
- {
- db.ThereIsHeaderError = true;
- return S_FALSE;
- }
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zIn.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zIn.h
deleted file mode 100644
index 98f61c81e..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zIn.h
+++ /dev/null
@@ -1,412 +0,0 @@
-// 7zIn.h
-
-#ifndef __7Z_IN_H
-#define __7Z_IN_H
-
-#include "../../../Common/MyCom.h"
-
-#include "../../../Windows/PropVariant.h"
-
-#include "../../IPassword.h"
-#include "../../IStream.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/InBuffer.h"
-
-#include "7zItem.h"
-
-namespace NArchive {
-namespace N7z {
-
-/*
- We don't need to init isEncrypted and passwordIsDefined
- We must upgrade them only */
-
-#ifdef _NO_CRYPTO
-#define _7Z_DECODER_CRYPRO_VARS_DECL
-#define _7Z_DECODER_CRYPRO_VARS
-#else
-#define _7Z_DECODER_CRYPRO_VARS_DECL , ICryptoGetTextPassword *getTextPassword, bool &isEncrypted, bool &passwordIsDefined
-#define _7Z_DECODER_CRYPRO_VARS , getTextPassword, isEncrypted, passwordIsDefined
-#endif
-
-struct CParsedMethods
-{
- Byte Lzma2Prop;
- UInt32 LzmaDic;
- CRecordVector<UInt64> IDs;
-
- CParsedMethods(): Lzma2Prop(0), LzmaDic(0) {}
-};
-
-struct CFolders
-{
- CNum NumPackStreams;
- CNum NumFolders;
-
- CObjArray<UInt64> PackPositions; // NumPackStreams + 1
- // CUInt32DefVector PackCRCs; // we don't use PackCRCs now
-
- CUInt32DefVector FolderCRCs; // NumFolders
- CObjArray<CNum> NumUnpackStreamsVector; // NumFolders
-
- CObjArray<UInt64> CoderUnpackSizes; // including unpack sizes of bind coders
- CObjArray<CNum> FoToCoderUnpackSizes; // NumFolders + 1
- CObjArray<CNum> FoStartPackStreamIndex; // NumFolders + 1
- CObjArray<Byte> FoToMainUnpackSizeIndex; // NumFolders
-
- CObjArray<size_t> FoCodersDataOffset; // NumFolders + 1
- CByteBuffer CodersData;
-
- CParsedMethods ParsedMethods;
-
- void ParseFolderInfo(unsigned folderIndex, CFolder &folder) const;
-
- unsigned GetNumFolderUnpackSizes(unsigned folderIndex) const
- {
- return FoToCoderUnpackSizes[folderIndex + 1] - FoToCoderUnpackSizes[folderIndex];
- }
-
- UInt64 GetFolderUnpackSize(unsigned folderIndex) const
- {
- return CoderUnpackSizes[FoToCoderUnpackSizes[folderIndex] + FoToMainUnpackSizeIndex[folderIndex]];
- }
-
- UInt64 GetStreamPackSize(unsigned index) const
- {
- return PackPositions[index + 1] - PackPositions[index];
- }
-
- void Clear()
- {
- NumPackStreams = 0;
- PackPositions.Free();
- // PackCRCs.Clear();
-
- NumFolders = 0;
- FolderCRCs.Clear();
- NumUnpackStreamsVector.Free();
- CoderUnpackSizes.Free();
- FoToCoderUnpackSizes.Free();
- FoStartPackStreamIndex.Free();
- FoToMainUnpackSizeIndex.Free();
- FoCodersDataOffset.Free();
- CodersData.Free();
- }
-};
-
-struct CDatabase: public CFolders
-{
- CRecordVector<CFileItem> Files;
-
- CUInt64DefVector CTime;
- CUInt64DefVector ATime;
- CUInt64DefVector MTime;
- CUInt64DefVector StartPos;
- CRecordVector<bool> IsAnti;
- /*
- CRecordVector<bool> IsAux;
- CByteBuffer SecureBuf;
- CRecordVector<UInt32> SecureIDs;
- */
-
- CByteBuffer NamesBuf;
- CObjArray<size_t> NameOffsets; // numFiles + 1, offsets of utf-16 symbols
-
- /*
- void ClearSecure()
- {
- SecureBuf.Free();
- SecureIDs.Clear();
- }
- */
-
- void Clear()
- {
- CFolders::Clear();
- // ClearSecure();
-
- NamesBuf.Free();
- NameOffsets.Free();
-
- Files.Clear();
- CTime.Clear();
- ATime.Clear();
- MTime.Clear();
- StartPos.Clear();
- IsAnti.Clear();
- // IsAux.Clear();
- }
-
- bool IsSolid() const
- {
- for (CNum i = 0; i < NumFolders; i++)
- if (NumUnpackStreamsVector[i] > 1)
- return true;
- return false;
- }
- bool IsItemAnti(unsigned index) const { return (index < IsAnti.Size() && IsAnti[index]); }
- // bool IsItemAux(unsigned index) const { return (index < IsAux.Size() && IsAux[index]); }
-
- const void * GetName(unsigned index) const
- {
- if (!NameOffsets || !NamesBuf)
- return NULL;
- return (const void *)((const Byte *)NamesBuf + NameOffsets[index] * 2);
- };
-
- void GetPath(unsigned index, UString &path) const;
- HRESULT GetPath_Prop(unsigned index, PROPVARIANT *path) const throw();
-};
-
-struct CInArchiveInfo
-{
- CArchiveVersion Version;
- UInt64 StartPosition;
- UInt64 StartPositionAfterHeader;
- UInt64 DataStartPosition;
- UInt64 DataStartPosition2;
- CRecordVector<UInt64> FileInfoPopIDs;
-
- void Clear()
- {
- StartPosition = 0;
- StartPositionAfterHeader = 0;
- DataStartPosition = 0;
- DataStartPosition2 = 0;
- FileInfoPopIDs.Clear();
- }
-};
-
-struct CDbEx: public CDatabase
-{
- CInArchiveInfo ArcInfo;
- CRecordVector<CNum> FolderStartFileIndex;
- CRecordVector<CNum> FileIndexToFolderIndexMap;
-
- UInt64 HeadersSize;
- UInt64 PhySize;
-
- /*
- CRecordVector<size_t> SecureOffsets;
- bool IsTree;
- bool ThereAreAltStreams;
- */
-
- bool IsArc;
- bool PhySizeWasConfirmed;
-
- bool ThereIsHeaderError;
- bool UnexpectedEnd;
- // bool UnsupportedVersion;
-
- bool StartHeaderWasRecovered;
- bool UnsupportedFeatureWarning;
- bool UnsupportedFeatureError;
-
- /*
- void ClearSecureEx()
- {
- ClearSecure();
- SecureOffsets.Clear();
- }
- */
-
- void Clear()
- {
- IsArc = false;
- PhySizeWasConfirmed = false;
-
- ThereIsHeaderError = false;
- UnexpectedEnd = false;
- // UnsupportedVersion = false;
-
- StartHeaderWasRecovered = false;
- UnsupportedFeatureError = false;
- UnsupportedFeatureWarning = false;
-
- /*
- IsTree = false;
- ThereAreAltStreams = false;
- */
-
- CDatabase::Clear();
-
- // SecureOffsets.Clear();
- ArcInfo.Clear();
- FolderStartFileIndex.Clear();
- FileIndexToFolderIndexMap.Clear();
-
- HeadersSize = 0;
- PhySize = 0;
- }
-
- void FillLinks();
-
- UInt64 GetFolderStreamPos(unsigned folderIndex, unsigned indexInFolder) const
- {
- return ArcInfo.DataStartPosition +
- PackPositions[FoStartPackStreamIndex[folderIndex] + indexInFolder];
- }
-
- UInt64 GetFolderFullPackSize(unsigned folderIndex) const
- {
- return
- PackPositions[FoStartPackStreamIndex[folderIndex + 1]] -
- PackPositions[FoStartPackStreamIndex[folderIndex]];
- }
-
- UInt64 GetFolderPackStreamSize(unsigned folderIndex, unsigned streamIndex) const
- {
- unsigned i = FoStartPackStreamIndex[folderIndex] + streamIndex;
- return PackPositions[i + 1] - PackPositions[i];
- }
-
- UInt64 GetFilePackSize(CNum fileIndex) const
- {
- CNum folderIndex = FileIndexToFolderIndexMap[fileIndex];
- if (folderIndex != kNumNoIndex)
- if (FolderStartFileIndex[folderIndex] == fileIndex)
- return GetFolderFullPackSize(folderIndex);
- return 0;
- }
-};
-
-const unsigned kNumBufLevelsMax = 4;
-
-struct CInByte2
-{
- const Byte *_buffer;
-public:
- size_t _size;
- size_t _pos;
-
- size_t GetRem() const { return _size - _pos; }
- const Byte *GetPtr() const { return _buffer + _pos; }
- void Init(const Byte *buffer, size_t size)
- {
- _buffer = buffer;
- _size = size;
- _pos = 0;
- }
- Byte ReadByte();
- void ReadBytes(Byte *data, size_t size);
- void SkipDataNoCheck(UInt64 size) { _pos += (size_t)size; }
- void SkipData(UInt64 size);
-
- void SkipData();
- void SkipRem() { _pos = _size; }
- UInt64 ReadNumber();
- CNum ReadNum();
- UInt32 ReadUInt32();
- UInt64 ReadUInt64();
-
- void ParseFolder(CFolder &folder);
-};
-
-class CStreamSwitch;
-
-const UInt32 kHeaderSize = 32;
-
-class CInArchive
-{
- friend class CStreamSwitch;
-
- CMyComPtr<IInStream> _stream;
-
- unsigned _numInByteBufs;
- CInByte2 _inByteVector[kNumBufLevelsMax];
-
- CInByte2 *_inByteBack;
- bool ThereIsHeaderError;
-
- UInt64 _arhiveBeginStreamPosition;
- UInt64 _fileEndPosition;
-
- Byte _header[kHeaderSize];
-
- UInt64 HeadersSize;
-
- void AddByteStream(const Byte *buffer, size_t size);
-
- void DeleteByteStream(bool needUpdatePos)
- {
- _numInByteBufs--;
- if (_numInByteBufs > 0)
- {
- _inByteBack = &_inByteVector[_numInByteBufs - 1];
- if (needUpdatePos)
- _inByteBack->_pos += _inByteVector[_numInByteBufs]._pos;
- }
- }
-
-private:
- HRESULT FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
-
- void ReadBytes(Byte *data, size_t size) { _inByteBack->ReadBytes(data, size); }
- Byte ReadByte() { return _inByteBack->ReadByte(); }
- UInt64 ReadNumber() { return _inByteBack->ReadNumber(); }
- CNum ReadNum() { return _inByteBack->ReadNum(); }
- UInt64 ReadID() { return _inByteBack->ReadNumber(); }
- UInt32 ReadUInt32() { return _inByteBack->ReadUInt32(); }
- UInt64 ReadUInt64() { return _inByteBack->ReadUInt64(); }
- void SkipData(UInt64 size) { _inByteBack->SkipData(size); }
- void SkipData() { _inByteBack->SkipData(); }
- void WaitId(UInt64 id);
-
- void ReadArchiveProperties(CInArchiveInfo &archiveInfo);
- void ReadHashDigests(unsigned numItems, CUInt32DefVector &crcs);
-
- void ReadPackInfo(CFolders &f);
-
- void ReadUnpackInfo(
- const CObjectVector<CByteBuffer> *dataVector,
- CFolders &folders);
-
- void ReadSubStreamsInfo(
- CFolders &folders,
- CRecordVector<UInt64> &unpackSizes,
- CUInt32DefVector &digests);
-
- void ReadStreamsInfo(
- const CObjectVector<CByteBuffer> *dataVector,
- UInt64 &dataOffset,
- CFolders &folders,
- CRecordVector<UInt64> &unpackSizes,
- CUInt32DefVector &digests);
-
- void ReadBoolVector(unsigned numItems, CBoolVector &v);
- void ReadBoolVector2(unsigned numItems, CBoolVector &v);
- void ReadUInt64DefVector(const CObjectVector<CByteBuffer> &dataVector,
- CUInt64DefVector &v, unsigned numItems);
- HRESULT ReadAndDecodePackedStreams(
- DECL_EXTERNAL_CODECS_LOC_VARS
- UInt64 baseOffset, UInt64 &dataOffset,
- CObjectVector<CByteBuffer> &dataVector
- _7Z_DECODER_CRYPRO_VARS_DECL
- );
- HRESULT ReadHeader(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CDbEx &db
- _7Z_DECODER_CRYPRO_VARS_DECL
- );
- HRESULT ReadDatabase2(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CDbEx &db
- _7Z_DECODER_CRYPRO_VARS_DECL
- );
-public:
- CInArchive(): _numInByteBufs(0) { }
- HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive
- void Close();
-
- HRESULT ReadDatabase(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CDbEx &db
- _7Z_DECODER_CRYPRO_VARS_DECL
- );
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zItem.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zItem.h
deleted file mode 100644
index c112f83fd..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zItem.h
+++ /dev/null
@@ -1,186 +0,0 @@
-// 7zItem.h
-
-#ifndef __7Z_ITEM_H
-#define __7Z_ITEM_H
-
-#include "../../../Common/MyBuffer.h"
-#include "../../../Common/MyString.h"
-
-#include "../../Common/MethodId.h"
-
-#include "7zHeader.h"
-
-namespace NArchive {
-namespace N7z {
-
-const UInt64 k_AES = 0x06F10701;
-
-typedef UInt32 CNum;
-const CNum kNumMax = 0x7FFFFFFF;
-const CNum kNumNoIndex = 0xFFFFFFFF;
-
-struct CCoderInfo
-{
- CMethodId MethodID;
- CByteBuffer Props;
- CNum NumInStreams;
- CNum NumOutStreams;
-
- bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); }
-};
-
-struct CBindPair
-{
- CNum InIndex;
- CNum OutIndex;
-};
-
-struct CFolder
-{
- CObjArray2<CCoderInfo> Coders;
- CObjArray2<CBindPair> BindPairs;
- CObjArray2<CNum> PackStreams;
-
- CNum GetNumOutStreams() const
- {
- CNum result = 0;
- FOR_VECTOR(i, Coders)
- result += Coders[i].NumOutStreams;
- return result;
- }
-
- int FindBindPairForInStream(CNum inStreamIndex) const
- {
- FOR_VECTOR(i, BindPairs)
- if (BindPairs[i].InIndex == inStreamIndex)
- return i;
- return -1;
- }
- int FindBindPairForOutStream(CNum outStreamIndex) const
- {
- FOR_VECTOR(i, BindPairs)
- if (BindPairs[i].OutIndex == outStreamIndex)
- return i;
- return -1;
- }
- int FindPackStreamArrayIndex(CNum inStreamIndex) const
- {
- FOR_VECTOR(i, PackStreams)
- if (PackStreams[i] == inStreamIndex)
- return i;
- return -1;
- }
-
- int GetIndexOfMainOutStream() const
- {
- for (int i = (int)GetNumOutStreams() - 1; i >= 0; i--)
- if (FindBindPairForOutStream(i) < 0)
- return i;
- throw 1;
- }
-
- bool IsEncrypted() const
- {
- for (int i = Coders.Size() - 1; i >= 0; i--)
- if (Coders[i].MethodID == k_AES)
- return true;
- return false;
- }
-
- bool CheckStructure(unsigned numUnpackSizes) const;
-};
-
-struct CUInt32DefVector
-{
- CBoolVector Defs;
- CRecordVector<UInt32> Vals;
-
- void ClearAndSetSize(unsigned newSize)
- {
- Defs.ClearAndSetSize(newSize);
- Vals.ClearAndSetSize(newSize);
- }
-
- void Clear()
- {
- Defs.Clear();
- Vals.Clear();
- }
-
- void ReserveDown()
- {
- Defs.ReserveDown();
- Vals.ReserveDown();
- }
-
- bool ValidAndDefined(unsigned i) const { return i < Defs.Size() && Defs[i]; }
-};
-
-struct CUInt64DefVector
-{
- CBoolVector Defs;
- CRecordVector<UInt64> Vals;
-
- void Clear()
- {
- Defs.Clear();
- Vals.Clear();
- }
-
- void ReserveDown()
- {
- Defs.ReserveDown();
- Vals.ReserveDown();
- }
-
- bool GetItem(unsigned index, UInt64 &value) const
- {
- if (index < Defs.Size() && Defs[index])
- {
- value = Vals[index];
- return true;
- }
- value = 0;
- return false;
- }
-
- void SetItem(unsigned index, bool defined, UInt64 value);
-
- bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; }
-};
-
-struct CFileItem
-{
- UInt64 Size;
- UInt32 Attrib;
- UInt32 Crc;
- /*
- int Parent;
- bool IsAltStream;
- */
- bool HasStream; // Test it !!! it means that there is
- // stream in some folder. It can be empty stream
- bool IsDir;
- bool CrcDefined;
- bool AttribDefined;
-
- CFileItem():
- /*
- Parent(-1),
- IsAltStream(false),
- */
- HasStream(true),
- IsDir(false),
- CrcDefined(false),
- AttribDefined(false)
- {}
- void SetAttrib(UInt32 attrib)
- {
- AttribDefined = true;
- Attrib = attrib;
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zOut.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zOut.cpp
deleted file mode 100644
index e20858ea7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zOut.cpp
+++ /dev/null
@@ -1,901 +0,0 @@
-// 7zOut.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/7zCrc.h"
-
-#include "../../Common/StreamObjects.h"
-
-#include "7zOut.h"
-
-namespace NArchive {
-namespace N7z {
-
-HRESULT COutArchive::WriteSignature()
-{
- Byte buf[8];
- memcpy(buf, kSignature, kSignatureSize);
- buf[kSignatureSize] = kMajorVersion;
- buf[kSignatureSize + 1] = 4;
- return WriteDirect(buf, 8);
-}
-
-#ifdef _7Z_VOL
-HRESULT COutArchive::WriteFinishSignature()
-{
- RINOK(WriteDirect(kFinishSignature, kSignatureSize));
- CArchiveVersion av;
- av.Major = kMajorVersion;
- av.Minor = 2;
- RINOK(WriteDirectByte(av.Major));
- return WriteDirectByte(av.Minor);
-}
-#endif
-
-static void SetUInt32(Byte *p, UInt32 d)
-{
- for (int i = 0; i < 4; i++, d >>= 8)
- p[i] = (Byte)d;
-}
-
-static void SetUInt64(Byte *p, UInt64 d)
-{
- for (int i = 0; i < 8; i++, d >>= 8)
- p[i] = (Byte)d;
-}
-
-HRESULT COutArchive::WriteStartHeader(const CStartHeader &h)
-{
- Byte buf[24];
- SetUInt64(buf + 4, h.NextHeaderOffset);
- SetUInt64(buf + 12, h.NextHeaderSize);
- SetUInt32(buf + 20, h.NextHeaderCRC);
- SetUInt32(buf, CrcCalc(buf + 4, 20));
- return WriteDirect(buf, 24);
-}
-
-#ifdef _7Z_VOL
-HRESULT COutArchive::WriteFinishHeader(const CFinishHeader &h)
-{
- CCRC crc;
- crc.UpdateUInt64(h.NextHeaderOffset);
- crc.UpdateUInt64(h.NextHeaderSize);
- crc.UpdateUInt32(h.NextHeaderCRC);
- crc.UpdateUInt64(h.ArchiveStartOffset);
- crc.UpdateUInt64(h.AdditionalStartBlockSize);
- RINOK(WriteDirectUInt32(crc.GetDigest()));
- RINOK(WriteDirectUInt64(h.NextHeaderOffset));
- RINOK(WriteDirectUInt64(h.NextHeaderSize));
- RINOK(WriteDirectUInt32(h.NextHeaderCRC));
- RINOK(WriteDirectUInt64(h.ArchiveStartOffset));
- return WriteDirectUInt64(h.AdditionalStartBlockSize);
-}
-#endif
-
-HRESULT COutArchive::Create(ISequentialOutStream *stream, bool endMarker)
-{
- Close();
- #ifdef _7Z_VOL
- // endMarker = false;
- _endMarker = endMarker;
- #endif
- SeqStream = stream;
- if (!endMarker)
- {
- SeqStream.QueryInterface(IID_IOutStream, &Stream);
- if (!Stream)
- {
- return E_NOTIMPL;
- // endMarker = true;
- }
- }
- #ifdef _7Z_VOL
- if (endMarker)
- {
- /*
- CStartHeader sh;
- sh.NextHeaderOffset = (UInt32)(Int32)-1;
- sh.NextHeaderSize = (UInt32)(Int32)-1;
- sh.NextHeaderCRC = 0;
- WriteStartHeader(sh);
- */
- }
- else
- #endif
- {
- if (!Stream)
- return E_FAIL;
- RINOK(WriteSignature());
- RINOK(Stream->Seek(0, STREAM_SEEK_CUR, &_prefixHeaderPos));
- }
- return S_OK;
-}
-
-void COutArchive::Close()
-{
- SeqStream.Release();
- Stream.Release();
-}
-
-HRESULT COutArchive::SkipPrefixArchiveHeader()
-{
- #ifdef _7Z_VOL
- if (_endMarker)
- return S_OK;
- #endif
- Byte buf[24];
- memset(buf, 0, 24);
- return WriteDirect(buf, 24);
-}
-
-UInt64 COutArchive::GetPos() const
-{
- if (_countMode)
- return _countSize;
- if (_writeToStream)
- return _outByte.GetProcessedSize();
- return _outByte2.GetPos();
-}
-
-void COutArchive::WriteBytes(const void *data, size_t size)
-{
- if (_countMode)
- _countSize += size;
- else if (_writeToStream)
- {
- _outByte.WriteBytes(data, size);
- _crc = CrcUpdate(_crc, data, size);
- }
- else
- _outByte2.WriteBytes(data, size);
-}
-
-void COutArchive::WriteByte(Byte b)
-{
- if (_countMode)
- _countSize++;
- else if (_writeToStream)
- {
- _outByte.WriteByte(b);
- _crc = CRC_UPDATE_BYTE(_crc, b);
- }
- else
- _outByte2.WriteByte(b);
-}
-
-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::WriteNumber(UInt64 value)
-{
- Byte firstByte = 0;
- Byte mask = 0x80;
- int i;
- for (i = 0; i < 8; i++)
- {
- if (value < ((UInt64(1) << ( 7 * (i + 1)))))
- {
- firstByte |= Byte(value >> (8 * i));
- break;
- }
- firstByte |= mask;
- mask >>= 1;
- }
- WriteByte(firstByte);
- for (;i > 0; i--)
- {
- WriteByte((Byte)value);
- value >>= 8;
- }
-}
-
-static UInt32 GetBigNumberSize(UInt64 value)
-{
- int i;
- for (i = 1; i < 9; i++)
- if (value < (((UInt64)1 << (i * 7))))
- break;
- return i;
-}
-
-#ifdef _7Z_VOL
-UInt32 COutArchive::GetVolHeadersSize(UInt64 dataSize, int nameLength, bool props)
-{
- UInt32 result = GetBigNumberSize(dataSize) * 2 + 41;
- if (nameLength != 0)
- {
- nameLength = (nameLength + 1) * 2;
- result += nameLength + GetBigNumberSize(nameLength) + 2;
- }
- if (props)
- {
- result += 20;
- }
- if (result >= 128)
- result++;
- result += kSignatureSize + 2 + kFinishHeaderSize;
- return result;
-}
-
-UInt64 COutArchive::GetVolPureSize(UInt64 volSize, int nameLength, bool props)
-{
- UInt32 headersSizeBase = COutArchive::GetVolHeadersSize(1, nameLength, props);
- int testSize;
- if (volSize > headersSizeBase)
- testSize = volSize - headersSizeBase;
- else
- testSize = 1;
- UInt32 headersSize = COutArchive::GetVolHeadersSize(testSize, nameLength, props);
- UInt64 pureSize = 1;
- if (volSize > headersSize)
- pureSize = volSize - headersSize;
- return pureSize;
-}
-#endif
-
-void COutArchive::WriteFolder(const CFolder &folder)
-{
- WriteNumber(folder.Coders.Size());
- unsigned i;
- for (i = 0; i < folder.Coders.Size(); i++)
- {
- const CCoderInfo &coder = folder.Coders[i];
- {
- size_t propsSize = coder.Props.Size();
-
- UInt64 id = coder.MethodID;
- int idSize;
- for (idSize = 1; idSize < sizeof(id); idSize++)
- if ((id >> (8 * idSize)) == 0)
- break;
- Byte longID[15];
- for (int t = idSize - 1; t >= 0 ; t--, id >>= 8)
- longID[t] = (Byte)(id & 0xFF);
- Byte b;
- b = (Byte)(idSize & 0xF);
- bool isComplex = !coder.IsSimpleCoder();
- b |= (isComplex ? 0x10 : 0);
- b |= ((propsSize != 0) ? 0x20 : 0 );
- WriteByte(b);
- WriteBytes(longID, idSize);
- if (isComplex)
- {
- WriteNumber(coder.NumInStreams);
- WriteNumber(coder.NumOutStreams);
- }
- if (propsSize == 0)
- continue;
- WriteNumber(propsSize);
- WriteBytes(coder.Props, propsSize);
- }
- }
- for (i = 0; i < folder.BindPairs.Size(); i++)
- {
- const CBindPair &bindPair = folder.BindPairs[i];
- WriteNumber(bindPair.InIndex);
- WriteNumber(bindPair.OutIndex);
- }
- if (folder.PackStreams.Size() > 1)
- for (i = 0; i < folder.PackStreams.Size(); i++)
- {
- WriteNumber(folder.PackStreams[i]);
- }
-}
-
-void COutArchive::WriteBoolVector(const CBoolVector &boolVector)
-{
- Byte b = 0;
- Byte mask = 0x80;
- FOR_VECTOR (i, boolVector)
- {
- if (boolVector[i])
- b |= mask;
- mask >>= 1;
- if (mask == 0)
- {
- WriteByte(b);
- mask = 0x80;
- b = 0;
- }
- }
- if (mask != 0x80)
- WriteByte(b);
-}
-
-static inline unsigned Bv_GetSizeInBytes(const CBoolVector &v) { return ((unsigned)v.Size() + 7) / 8; }
-
-void COutArchive::WritePropBoolVector(Byte id, const CBoolVector &boolVector)
-{
- WriteByte(id);
- WriteNumber(Bv_GetSizeInBytes(boolVector));
- WriteBoolVector(boolVector);
-}
-
-void COutArchive::WriteHashDigests(const CUInt32DefVector &digests)
-{
- unsigned numDefined = 0;
- unsigned i;
- for (i = 0; i < digests.Defs.Size(); i++)
- if (digests.Defs[i])
- numDefined++;
- if (numDefined == 0)
- return;
-
- WriteByte(NID::kCRC);
- if (numDefined == digests.Defs.Size())
- WriteByte(1);
- else
- {
- WriteByte(0);
- WriteBoolVector(digests.Defs);
- }
- for (i = 0; i < digests.Defs.Size(); i++)
- if (digests.Defs[i])
- WriteUInt32(digests.Vals[i]);
-}
-
-void COutArchive::WritePackInfo(
- UInt64 dataOffset,
- const CRecordVector<UInt64> &packSizes,
- const CUInt32DefVector &packCRCs)
-{
- if (packSizes.IsEmpty())
- return;
- WriteByte(NID::kPackInfo);
- WriteNumber(dataOffset);
- WriteNumber(packSizes.Size());
- WriteByte(NID::kSize);
- FOR_VECTOR (i, packSizes)
- WriteNumber(packSizes[i]);
-
- WriteHashDigests(packCRCs);
-
- WriteByte(NID::kEnd);
-}
-
-void COutArchive::WriteUnpackInfo(const CObjectVector<CFolder> &folders, const COutFolders &outFolders)
-{
- if (folders.IsEmpty())
- return;
-
- WriteByte(NID::kUnpackInfo);
-
- WriteByte(NID::kFolder);
- WriteNumber(folders.Size());
- {
- WriteByte(0);
- FOR_VECTOR (i, folders)
- WriteFolder(folders[i]);
- }
-
- WriteByte(NID::kCodersUnpackSize);
- FOR_VECTOR (i, outFolders.CoderUnpackSizes)
- WriteNumber(outFolders.CoderUnpackSizes[i]);
-
- WriteHashDigests(outFolders.FolderUnpackCRCs);
-
- WriteByte(NID::kEnd);
-}
-
-void COutArchive::WriteSubStreamsInfo(const CObjectVector<CFolder> &folders,
- const COutFolders &outFolders,
- const CRecordVector<UInt64> &unpackSizes,
- const CUInt32DefVector &digests)
-{
- const CRecordVector<CNum> &numUnpackStreamsInFolders = outFolders.NumUnpackStreamsVector;
- WriteByte(NID::kSubStreamsInfo);
-
- unsigned i;
- for (i = 0; i < numUnpackStreamsInFolders.Size(); i++)
- if (numUnpackStreamsInFolders[i] != 1)
- {
- WriteByte(NID::kNumUnpackStream);
- for (i = 0; i < numUnpackStreamsInFolders.Size(); i++)
- WriteNumber(numUnpackStreamsInFolders[i]);
- break;
- }
-
- for (i = 0; i < numUnpackStreamsInFolders.Size(); i++)
- if (numUnpackStreamsInFolders[i] > 1)
- {
- WriteByte(NID::kSize);
- CNum index = 0;
- for (i = 0; i < numUnpackStreamsInFolders.Size(); i++)
- {
- CNum num = numUnpackStreamsInFolders[i];
- for (CNum j = 0; j < num; j++)
- {
- if (j + 1 != num)
- WriteNumber(unpackSizes[index]);
- index++;
- }
- }
- break;
- }
-
- CUInt32DefVector digests2;
-
- unsigned digestIndex = 0;
- for (i = 0; i < folders.Size(); i++)
- {
- unsigned numSubStreams = (unsigned)numUnpackStreamsInFolders[i];
- if (numSubStreams == 1 && outFolders.FolderUnpackCRCs.ValidAndDefined(i))
- digestIndex++;
- else
- for (unsigned j = 0; j < numSubStreams; j++, digestIndex++)
- {
- digests2.Defs.Add(digests.Defs[digestIndex]);
- digests2.Vals.Add(digests.Vals[digestIndex]);
- }
- }
- WriteHashDigests(digests2);
- WriteByte(NID::kEnd);
-}
-
-// 7-Zip 4.50 - 4.58 contain BUG, so they do not support .7z archives with Unknown field.
-
-void COutArchive::SkipAlign(unsigned pos, unsigned alignSize)
-{
- if (!_useAlign)
- return;
- pos += (unsigned)GetPos();
- pos &= (alignSize - 1);
- if (pos == 0)
- return;
- unsigned skip = alignSize - pos;
- if (skip < 2)
- skip += alignSize;
- skip -= 2;
- WriteByte(NID::kDummy);
- WriteByte((Byte)skip);
- for (unsigned i = 0; i < skip; i++)
- WriteByte(0);
-}
-
-void COutArchive::WriteAlignedBoolHeader(const CBoolVector &v, unsigned numDefined, Byte type, unsigned itemSize)
-{
- const unsigned bvSize = (numDefined == v.Size()) ? 0 : Bv_GetSizeInBytes(v);
- const UInt64 dataSize = (UInt64)numDefined * itemSize + bvSize + 2;
- SkipAlign(3 + (unsigned)bvSize + (unsigned)GetBigNumberSize(dataSize), itemSize);
-
- WriteByte(type);
- WriteNumber(dataSize);
- if (numDefined == v.Size())
- WriteByte(1);
- else
- {
- WriteByte(0);
- WriteBoolVector(v);
- }
- WriteByte(0);
-}
-
-void COutArchive::WriteUInt64DefVector(const CUInt64DefVector &v, Byte type)
-{
- unsigned numDefined = 0;
-
- unsigned i;
- for (i = 0; i < v.Defs.Size(); i++)
- if (v.Defs[i])
- numDefined++;
-
- if (numDefined == 0)
- return;
-
- WriteAlignedBoolHeader(v.Defs, numDefined, type, 8);
-
- for (i = 0; i < v.Defs.Size(); i++)
- if (v.Defs[i])
- WriteUInt64(v.Vals[i]);
-}
-
-HRESULT COutArchive::EncodeStream(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CEncoder &encoder, const CByteBuffer &data,
- CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders, COutFolders &outFolders)
-{
- CBufInStream *streamSpec = new CBufInStream;
- CMyComPtr<ISequentialInStream> stream = streamSpec;
- streamSpec->Init(data, data.Size());
- outFolders.FolderUnpackCRCs.Defs.Add(true);
- outFolders.FolderUnpackCRCs.Vals.Add(CrcCalc(data, data.Size()));
- // outFolders.NumUnpackStreamsVector.Add(1);
- UInt64 dataSize64 = data.Size();
- UInt64 unpackSize;
- RINOK(encoder.Encode(
- EXTERNAL_CODECS_LOC_VARS
- stream, NULL, &dataSize64, folders.AddNew(), outFolders.CoderUnpackSizes, unpackSize, SeqStream, packSizes, NULL))
- return S_OK;
-}
-
-void COutArchive::WriteHeader(
- const CArchiveDatabaseOut &db,
- // const CHeaderOptions &headerOptions,
- UInt64 &headerOffset)
-{
- /*
- bool thereIsSecure = (db.SecureBuf.Size() != 0);
- */
- _useAlign = true;
-
- unsigned i;
-
- UInt64 packedSize = 0;
- for (i = 0; i < db.PackSizes.Size(); i++)
- packedSize += db.PackSizes[i];
-
- headerOffset = packedSize;
-
- WriteByte(NID::kHeader);
-
- // Archive Properties
-
- if (db.Folders.Size() > 0)
- {
- WriteByte(NID::kMainStreamsInfo);
- WritePackInfo(0, db.PackSizes, db.PackCRCs);
- WriteUnpackInfo(db.Folders, (const COutFolders &)db);
-
- CRecordVector<UInt64> unpackSizes;
- CUInt32DefVector digests;
- for (i = 0; i < db.Files.Size(); i++)
- {
- const CFileItem &file = db.Files[i];
- if (!file.HasStream)
- continue;
- unpackSizes.Add(file.Size);
- digests.Defs.Add(file.CrcDefined);
- digests.Vals.Add(file.Crc);
- }
-
- WriteSubStreamsInfo(db.Folders, (const COutFolders &)db, unpackSizes, digests);
- WriteByte(NID::kEnd);
- }
-
- if (db.Files.IsEmpty())
- {
- WriteByte(NID::kEnd);
- return;
- }
-
- WriteByte(NID::kFilesInfo);
- WriteNumber(db.Files.Size());
-
- {
- /* ---------- Empty Streams ---------- */
- CBoolVector emptyStreamVector;
- emptyStreamVector.ClearAndSetSize(db.Files.Size());
- unsigned numEmptyStreams = 0;
- for (i = 0; i < db.Files.Size(); i++)
- if (db.Files[i].HasStream)
- emptyStreamVector[i] = false;
- else
- {
- emptyStreamVector[i] = true;
- numEmptyStreams++;
- }
- if (numEmptyStreams != 0)
- {
- WritePropBoolVector(NID::kEmptyStream, emptyStreamVector);
-
- CBoolVector emptyFileVector, antiVector;
- emptyFileVector.ClearAndSetSize(numEmptyStreams);
- antiVector.ClearAndSetSize(numEmptyStreams);
- bool thereAreEmptyFiles = false, thereAreAntiItems = false;
- unsigned cur = 0;
- for (i = 0; i < db.Files.Size(); i++)
- {
- const CFileItem &file = db.Files[i];
- if (file.HasStream)
- continue;
- emptyFileVector[cur] = !file.IsDir;
- if (!file.IsDir)
- thereAreEmptyFiles = true;
- bool isAnti = db.IsItemAnti(i);
- antiVector[cur] = isAnti;
- if (isAnti)
- thereAreAntiItems = true;
- cur++;
- }
-
- if (thereAreEmptyFiles)
- WritePropBoolVector(NID::kEmptyFile, emptyFileVector);
- if (thereAreAntiItems)
- WritePropBoolVector(NID::kAnti, antiVector);
- }
- }
-
-
- {
- /* ---------- Names ---------- */
-
- unsigned numDefined = 0;
- size_t namesDataSize = 0;
- FOR_VECTOR (i, db.Files)
- {
- const UString &name = db.Names[i];
- if (!name.IsEmpty())
- numDefined++;
- namesDataSize += (name.Len() + 1) * 2;
- }
-
- if (numDefined > 0)
- {
- namesDataSize++;
- SkipAlign(2 + GetBigNumberSize(namesDataSize), 16);
-
- WriteByte(NID::kName);
- WriteNumber(namesDataSize);
- WriteByte(0);
- FOR_VECTOR (i, db.Files)
- {
- const UString &name = db.Names[i];
- for (unsigned t = 0; t <= name.Len(); t++)
- {
- wchar_t c = name[t];
- WriteByte((Byte)c);
- WriteByte((Byte)(c >> 8));
- }
- }
- }
- }
-
- /* if (headerOptions.WriteCTime) */ WriteUInt64DefVector(db.CTime, NID::kCTime);
- /* if (headerOptions.WriteATime) */ WriteUInt64DefVector(db.ATime, NID::kATime);
- /* if (headerOptions.WriteMTime) */ WriteUInt64DefVector(db.MTime, NID::kMTime);
- WriteUInt64DefVector(db.StartPos, NID::kStartPos);
-
- {
- /* ---------- Write Attrib ---------- */
- CBoolVector boolVector;
- boolVector.ClearAndSetSize(db.Files.Size());
- unsigned numDefined = 0;
- for (i = 0; i < db.Files.Size(); i++)
- {
- bool defined = db.Files[i].AttribDefined;
- boolVector[i] = defined;
- if (defined)
- numDefined++;
- }
- if (numDefined != 0)
- {
- WriteAlignedBoolHeader(boolVector, numDefined, NID::kWinAttrib, 4);
- for (i = 0; i < db.Files.Size(); i++)
- {
- const CFileItem &file = db.Files[i];
- if (file.AttribDefined)
- WriteUInt32(file.Attrib);
- }
- }
- }
-
- /*
- {
- // ---------- Write IsAux ----------
- unsigned numAux = 0;
- const CBoolVector &isAux = db.IsAux;
- for (i = 0; i < isAux.Size(); i++)
- if (isAux[i])
- numAux++;
- if (numAux > 0)
- {
- const unsigned bvSize = Bv_GetSizeInBytes(isAux);
- WriteByte(NID::kIsAux);
- WriteNumber(bvSize);
- WriteBoolVector(isAux);
- }
- }
-
- {
- // ---------- Write Parent ----------
- CBoolVector boolVector;
- boolVector.Reserve(db.Files.Size());
- unsigned numIsDir = 0;
- unsigned numParentLinks = 0;
- for (i = 0; i < db.Files.Size(); i++)
- {
- const CFileItem &file = db.Files[i];
- bool defined = !file.IsAltStream;
- boolVector.Add(defined);
- if (defined)
- numIsDir++;
- if (file.Parent >= 0)
- numParentLinks++;
- }
- if (numParentLinks > 0)
- {
- // WriteAlignedBoolHeader(boolVector, numDefined, NID::kParent, 4);
- const unsigned bvSize = (numIsDir == boolVector.Size()) ? 0 : Bv_GetSizeInBytes(boolVector);
- const UInt64 dataSize = (UInt64)db.Files.Size() * 4 + bvSize + 1;
- SkipAlign(2 + (unsigned)bvSize + (unsigned)GetBigNumberSize(dataSize), 4);
-
- WriteByte(NID::kParent);
- WriteNumber(dataSize);
- if (numIsDir == boolVector.Size())
- WriteByte(1);
- else
- {
- WriteByte(0);
- WriteBoolVector(boolVector);
- }
- for (i = 0; i < db.Files.Size(); i++)
- {
- const CFileItem &file = db.Files[i];
- // if (file.Parent >= 0)
- WriteUInt32(file.Parent);
- }
- }
- }
-
- if (thereIsSecure)
- {
- UInt64 secureDataSize = 1 + 4 +
- db.SecureBuf.Size() +
- db.SecureSizes.Size() * 4;
- // secureDataSize += db.SecureIDs.Size() * 4;
- for (i = 0; i < db.SecureIDs.Size(); i++)
- secureDataSize += GetBigNumberSize(db.SecureIDs[i]);
- SkipAlign(2 + GetBigNumberSize(secureDataSize), 4);
- WriteByte(NID::kNtSecure);
- WriteNumber(secureDataSize);
- WriteByte(0);
- WriteUInt32(db.SecureSizes.Size());
- for (i = 0; i < db.SecureSizes.Size(); i++)
- WriteUInt32(db.SecureSizes[i]);
- WriteBytes(db.SecureBuf, db.SecureBuf.Size());
- for (i = 0; i < db.SecureIDs.Size(); i++)
- {
- WriteNumber(db.SecureIDs[i]);
- // WriteUInt32(db.SecureIDs[i]);
- }
- }
- */
-
- WriteByte(NID::kEnd); // for files
- WriteByte(NID::kEnd); // for headers
-}
-
-HRESULT COutArchive::WriteDatabase(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const CArchiveDatabaseOut &db,
- const CCompressionMethodMode *options,
- const CHeaderOptions &headerOptions)
-{
- if (!db.CheckNumFiles())
- return E_FAIL;
-
- UInt64 headerOffset;
- UInt32 headerCRC;
- UInt64 headerSize;
- if (db.IsEmpty())
- {
- headerSize = 0;
- headerOffset = 0;
- headerCRC = CrcCalc(0, 0);
- }
- else
- {
- bool encodeHeaders = false;
- if (options != 0)
- if (options->IsEmpty())
- options = 0;
- if (options != 0)
- if (options->PasswordIsDefined || headerOptions.CompressMainHeader)
- encodeHeaders = true;
-
- _outByte.SetStream(SeqStream);
- _outByte.Init();
- _crc = CRC_INIT_VAL;
- _countMode = encodeHeaders;
- _writeToStream = true;
- _countSize = 0;
- WriteHeader(db, /* headerOptions, */ headerOffset);
-
- if (encodeHeaders)
- {
- CByteBuffer buf(_countSize);
- _outByte2.Init((Byte *)buf, _countSize);
-
- _countMode = false;
- _writeToStream = false;
- WriteHeader(db, /* headerOptions, */ headerOffset);
-
- if (_countSize != _outByte2.GetPos())
- return E_FAIL;
-
- CCompressionMethodMode encryptOptions;
- encryptOptions.PasswordIsDefined = options->PasswordIsDefined;
- encryptOptions.Password = options->Password;
- CEncoder encoder(headerOptions.CompressMainHeader ? *options : encryptOptions);
- CRecordVector<UInt64> packSizes;
- CObjectVector<CFolder> folders;
- COutFolders outFolders;
-
- RINOK(EncodeStream(
- EXTERNAL_CODECS_LOC_VARS
- encoder, buf,
- packSizes, folders, outFolders));
-
- _writeToStream = true;
-
- if (folders.Size() == 0)
- throw 1;
-
- WriteID(NID::kEncodedHeader);
- WritePackInfo(headerOffset, packSizes, CUInt32DefVector());
- WriteUnpackInfo(folders, outFolders);
- WriteByte(NID::kEnd);
- FOR_VECTOR (i, packSizes)
- headerOffset += packSizes[i];
- }
- RINOK(_outByte.Flush());
- headerCRC = CRC_GET_DIGEST(_crc);
- headerSize = _outByte.GetProcessedSize();
- }
- #ifdef _7Z_VOL
- if (_endMarker)
- {
- CFinishHeader h;
- h.NextHeaderSize = headerSize;
- h.NextHeaderCRC = headerCRC;
- h.NextHeaderOffset =
- UInt64(0) - (headerSize +
- 4 + kFinishHeaderSize);
- h.ArchiveStartOffset = h.NextHeaderOffset - headerOffset;
- h.AdditionalStartBlockSize = 0;
- RINOK(WriteFinishHeader(h));
- return WriteFinishSignature();
- }
- else
- #endif
- {
- CStartHeader h;
- h.NextHeaderSize = headerSize;
- h.NextHeaderCRC = headerCRC;
- h.NextHeaderOffset = headerOffset;
- RINOK(Stream->Seek(_prefixHeaderPos, STREAM_SEEK_SET, NULL));
- return WriteStartHeader(h);
- }
-}
-
-void CUInt64DefVector::SetItem(unsigned index, bool defined, UInt64 value)
-{
- while (index >= Defs.Size())
- Defs.Add(false);
- Defs[index] = defined;
- if (!defined)
- return;
- while (index >= Vals.Size())
- Vals.Add(0);
- Vals[index] = value;
-}
-
-void CArchiveDatabaseOut::AddFile(const CFileItem &file, const CFileItem2 &file2, const UString &name)
-{
- unsigned index = Files.Size();
- CTime.SetItem(index, file2.CTimeDefined, file2.CTime);
- ATime.SetItem(index, file2.ATimeDefined, file2.ATime);
- MTime.SetItem(index, file2.MTimeDefined, file2.MTime);
- StartPos.SetItem(index, file2.StartPosDefined, file2.StartPos);
- SetItem_Anti(index, file2.IsAnti);
- // SetItem_Aux(index, file2.IsAux);
- Names.Add(name);
- Files.Add(file);
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zOut.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zOut.h
deleted file mode 100644
index 391ca9d02..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zOut.h
+++ /dev/null
@@ -1,319 +0,0 @@
-// 7zOut.h
-
-#ifndef __7Z_OUT_H
-#define __7Z_OUT_H
-
-#include "7zCompressionMode.h"
-#include "7zEncode.h"
-#include "7zHeader.h"
-#include "7zItem.h"
-
-#include "../../Common/OutBuffer.h"
-#include "../../Common/StreamUtils.h"
-
-namespace NArchive {
-namespace N7z {
-
-class CWriteBufferLoc
-{
- Byte *_data;
- size_t _size;
- size_t _pos;
-public:
- CWriteBufferLoc(): _size(0), _pos(0) {}
- void Init(Byte *data, size_t size)
- {
- _data = data;
- _size = size;
- _pos = 0;
- }
- void WriteBytes(const void *data, size_t size)
- {
- if (size > _size - _pos)
- throw 1;
- memcpy(_data + _pos, data, size);
- _pos += size;
- }
- void WriteByte(Byte b)
- {
- if (_size == _pos)
- throw 1;
- _data[_pos++] = b;
- }
- size_t GetPos() const { return _pos; }
-};
-
-struct CHeaderOptions
-{
- bool CompressMainHeader;
- /*
- bool WriteCTime;
- bool WriteATime;
- bool WriteMTime;
- */
-
- CHeaderOptions():
- CompressMainHeader(true)
- /*
- , WriteCTime(false)
- , WriteATime(false)
- , WriteMTime(true)
- */
- {}
-};
-
-
-struct CFileItem2
-{
- UInt64 CTime;
- UInt64 ATime;
- UInt64 MTime;
- UInt64 StartPos;
- bool CTimeDefined;
- bool ATimeDefined;
- bool MTimeDefined;
- bool StartPosDefined;
- bool IsAnti;
- // bool IsAux;
-
- void Init()
- {
- CTimeDefined = false;
- ATimeDefined = false;
- MTimeDefined = false;
- StartPosDefined = false;
- IsAnti = false;
- // IsAux = false;
- }
-};
-
-struct COutFolders
-{
- CUInt32DefVector FolderUnpackCRCs; // Now we use it for headers only.
-
- CRecordVector<CNum> NumUnpackStreamsVector;
- CRecordVector<UInt64> CoderUnpackSizes; // including unpack sizes of bind coders
-
- void OutFoldersClear()
- {
- FolderUnpackCRCs.Clear();
- NumUnpackStreamsVector.Clear();
- CoderUnpackSizes.Clear();
- }
-
- void OutFoldersReserveDown()
- {
- FolderUnpackCRCs.ReserveDown();
- NumUnpackStreamsVector.ReserveDown();
- CoderUnpackSizes.ReserveDown();
- }
-};
-
-struct CArchiveDatabaseOut: public COutFolders
-{
- CRecordVector<UInt64> PackSizes;
- CUInt32DefVector PackCRCs;
- CObjectVector<CFolder> Folders;
-
- CRecordVector<CFileItem> Files;
- UStringVector Names;
- CUInt64DefVector CTime;
- CUInt64DefVector ATime;
- CUInt64DefVector MTime;
- CUInt64DefVector StartPos;
- CRecordVector<bool> IsAnti;
-
- /*
- CRecordVector<bool> IsAux;
-
- CByteBuffer SecureBuf;
- CRecordVector<UInt32> SecureSizes;
- CRecordVector<UInt32> SecureIDs;
-
- void ClearSecure()
- {
- SecureBuf.Free();
- SecureSizes.Clear();
- SecureIDs.Clear();
- }
- */
-
- void Clear()
- {
- OutFoldersClear();
-
- PackSizes.Clear();
- PackCRCs.Clear();
- Folders.Clear();
-
- Files.Clear();
- Names.Clear();
- CTime.Clear();
- ATime.Clear();
- MTime.Clear();
- StartPos.Clear();
- IsAnti.Clear();
-
- /*
- IsAux.Clear();
- ClearSecure();
- */
- }
-
- void ReserveDown()
- {
- OutFoldersReserveDown();
-
- PackSizes.ReserveDown();
- PackCRCs.ReserveDown();
- Folders.ReserveDown();
-
- Files.ReserveDown();
- Names.ReserveDown();
- CTime.ReserveDown();
- ATime.ReserveDown();
- MTime.ReserveDown();
- StartPos.ReserveDown();
- IsAnti.ReserveDown();
-
- /*
- IsAux.ReserveDown();
- */
- }
-
- bool IsEmpty() const
- {
- return (
- PackSizes.IsEmpty() &&
- NumUnpackStreamsVector.IsEmpty() &&
- Folders.IsEmpty() &&
- Files.IsEmpty());
- }
-
- bool CheckNumFiles() const
- {
- unsigned size = Files.Size();
- return (
- CTime.CheckSize(size) &&
- ATime.CheckSize(size) &&
- MTime.CheckSize(size) &&
- StartPos.CheckSize(size) &&
- (size == IsAnti.Size() || IsAnti.Size() == 0));
- }
-
- bool IsItemAnti(unsigned index) const { return (index < IsAnti.Size() && IsAnti[index]); }
- // bool IsItemAux(unsigned index) const { return (index < IsAux.Size() && IsAux[index]); }
-
- void SetItem_Anti(unsigned index, bool isAnti)
- {
- while (index >= IsAnti.Size())
- IsAnti.Add(false);
- IsAnti[index] = isAnti;
- }
- /*
- void SetItem_Aux(unsigned index, bool isAux)
- {
- while (index >= IsAux.Size())
- IsAux.Add(false);
- IsAux[index] = isAux;
- }
- */
-
- void AddFile(const CFileItem &file, const CFileItem2 &file2, const UString &name);
-};
-
-class COutArchive
-{
- UInt64 _prefixHeaderPos;
-
- HRESULT WriteDirect(const void *data, UInt32 size) { return WriteStream(SeqStream, data, size); }
-
- UInt64 GetPos() const;
- void WriteBytes(const void *data, size_t size);
- void WriteBytes(const CByteBuffer &data) { WriteBytes(data, data.Size()); }
- void WriteByte(Byte b);
- void WriteUInt32(UInt32 value);
- void WriteUInt64(UInt64 value);
- void WriteNumber(UInt64 value);
- void WriteID(UInt64 value) { WriteNumber(value); }
-
- void WriteFolder(const CFolder &folder);
- HRESULT WriteFileHeader(const CFileItem &itemInfo);
- void WriteBoolVector(const CBoolVector &boolVector);
- void WritePropBoolVector(Byte id, const CBoolVector &boolVector);
-
- void WriteHashDigests(const CUInt32DefVector &digests);
-
- void WritePackInfo(
- UInt64 dataOffset,
- const CRecordVector<UInt64> &packSizes,
- const CUInt32DefVector &packCRCs);
-
- void WriteUnpackInfo(
- const CObjectVector<CFolder> &folders,
- const COutFolders &outFolders);
-
- void WriteSubStreamsInfo(
- const CObjectVector<CFolder> &folders,
- const COutFolders &outFolders,
- const CRecordVector<UInt64> &unpackSizes,
- const CUInt32DefVector &digests);
-
- void SkipAlign(unsigned pos, unsigned alignSize);
- void WriteAlignedBoolHeader(const CBoolVector &v, unsigned numDefined, Byte type, unsigned itemSize);
- void WriteUInt64DefVector(const CUInt64DefVector &v, Byte type);
-
- HRESULT EncodeStream(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CEncoder &encoder, const CByteBuffer &data,
- CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders, COutFolders &outFolders);
- void WriteHeader(
- const CArchiveDatabaseOut &db,
- // const CHeaderOptions &headerOptions,
- UInt64 &headerOffset);
-
- bool _countMode;
- bool _writeToStream;
- size_t _countSize;
- UInt32 _crc;
- COutBuffer _outByte;
- CWriteBufferLoc _outByte2;
-
- #ifdef _7Z_VOL
- bool _endMarker;
- #endif
-
- bool _useAlign;
-
- HRESULT WriteSignature();
- #ifdef _7Z_VOL
- HRESULT WriteFinishSignature();
- #endif
- HRESULT WriteStartHeader(const CStartHeader &h);
- #ifdef _7Z_VOL
- HRESULT WriteFinishHeader(const CFinishHeader &h);
- #endif
- CMyComPtr<IOutStream> Stream;
-public:
-
- COutArchive() { _outByte.Create(1 << 16); }
- CMyComPtr<ISequentialOutStream> SeqStream;
- HRESULT Create(ISequentialOutStream *stream, bool endMarker);
- void Close();
- HRESULT SkipPrefixArchiveHeader();
- HRESULT WriteDatabase(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const CArchiveDatabaseOut &db,
- const CCompressionMethodMode *options,
- const CHeaderOptions &headerOptions);
-
- #ifdef _7Z_VOL
- static UInt32 GetVolHeadersSize(UInt64 dataSize, int nameLength = 0, bool props = false);
- static UInt64 GetVolPureSize(UInt64 volSize, int nameLength = 0, bool props = false);
- #endif
-
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zProperties.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zProperties.cpp
deleted file mode 100644
index a29f8abe9..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zProperties.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-// 7zProperties.cpp
-
-#include "StdAfx.h"
-
-#include "7zProperties.h"
-#include "7zHeader.h"
-#include "7zHandler.h"
-
-// #define _MULTI_PACK
-
-namespace NArchive {
-namespace N7z {
-
-struct CPropMap
-{
- UInt64 FilePropID;
- STATPROPSTG StatPROPSTG;
-};
-
-static const CPropMap kPropMap[] =
-{
- { NID::kName, { NULL, kpidPath, VT_BSTR } },
- { NID::kSize, { NULL, kpidSize, VT_UI8 } },
- { NID::kPackInfo, { NULL, kpidPackSize, VT_UI8 } },
-
- #ifdef _MULTI_PACK
- { 100, { L"Pack0", kpidPackedSize0, VT_UI8 } },
- { 101, { L"Pack1", kpidPackedSize1, VT_UI8 } },
- { 102, { L"Pack2", kpidPackedSize2, VT_UI8 } },
- { 103, { L"Pack3", kpidPackedSize3, VT_UI8 } },
- { 104, { L"Pack4", kpidPackedSize4, VT_UI8 } },
- #endif
-
- { NID::kCTime, { NULL, kpidCTime, VT_FILETIME } },
- { NID::kMTime, { NULL, kpidMTime, VT_FILETIME } },
- { NID::kATime, { NULL, kpidATime, VT_FILETIME } },
- { NID::kWinAttrib, { NULL, kpidAttrib, VT_UI4 } },
- { NID::kStartPos, { NULL, kpidPosition, VT_UI4 } },
-
- { NID::kCRC, { NULL, kpidCRC, VT_UI4 } },
-
-// { NID::kIsAux, { NULL, kpidIsAux, VT_BOOL } },
- { NID::kAnti, { NULL, kpidIsAnti, VT_BOOL } }
-
- #ifndef _SFX
- ,
- { 97, { NULL,kpidEncrypted, VT_BOOL } },
- { 98, { NULL,kpidMethod, VT_BSTR } },
- { 99, { NULL,kpidBlock, VT_UI4 } }
- #endif
-};
-
-static int FindPropInMap(UInt64 filePropID)
-{
- for (int i = 0; i < ARRAY_SIZE(kPropMap); i++)
- if (kPropMap[i].FilePropID == filePropID)
- return i;
- return -1;
-}
-
-static void CopyOneItem(CRecordVector<UInt64> &src,
- CRecordVector<UInt64> &dest, UInt32 item)
-{
- FOR_VECTOR (i, src)
- if (src[i] == item)
- {
- dest.Add(item);
- src.Delete(i);
- return;
- }
-}
-
-static void RemoveOneItem(CRecordVector<UInt64> &src, UInt32 item)
-{
- FOR_VECTOR (i, src)
- if (src[i] == item)
- {
- src.Delete(i);
- return;
- }
-}
-
-static void InsertToHead(CRecordVector<UInt64> &dest, UInt32 item)
-{
- FOR_VECTOR (i, dest)
- if (dest[i] == item)
- {
- dest.Delete(i);
- break;
- }
- dest.Insert(0, item);
-}
-
-#define COPY_ONE_ITEM(id) CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::id);
-
-void CHandler::FillPopIDs()
-{
- _fileInfoPopIDs.Clear();
-
- #ifdef _7Z_VOL
- if (_volumes.Size() < 1)
- return;
- const CVolume &volume = _volumes.Front();
- const CArchiveDatabaseEx &_db = volume.Database;
- #endif
-
- CRecordVector<UInt64> fileInfoPopIDs = _db.ArcInfo.FileInfoPopIDs;
-
- RemoveOneItem(fileInfoPopIDs, NID::kEmptyStream);
- RemoveOneItem(fileInfoPopIDs, NID::kEmptyFile);
- /*
- RemoveOneItem(fileInfoPopIDs, NID::kParent);
- RemoveOneItem(fileInfoPopIDs, NID::kNtSecure);
- */
-
- COPY_ONE_ITEM(kName);
- COPY_ONE_ITEM(kAnti);
- COPY_ONE_ITEM(kSize);
- COPY_ONE_ITEM(kPackInfo);
- COPY_ONE_ITEM(kCTime);
- COPY_ONE_ITEM(kMTime);
- COPY_ONE_ITEM(kATime);
- COPY_ONE_ITEM(kWinAttrib);
- COPY_ONE_ITEM(kCRC);
- COPY_ONE_ITEM(kComment);
-
- _fileInfoPopIDs += fileInfoPopIDs;
-
- #ifndef _SFX
- _fileInfoPopIDs.Add(97);
- _fileInfoPopIDs.Add(98);
- _fileInfoPopIDs.Add(99);
- #endif
- #ifdef _MULTI_PACK
- _fileInfoPopIDs.Add(100);
- _fileInfoPopIDs.Add(101);
- _fileInfoPopIDs.Add(102);
- _fileInfoPopIDs.Add(103);
- _fileInfoPopIDs.Add(104);
- #endif
-
- #ifndef _SFX
- InsertToHead(_fileInfoPopIDs, NID::kMTime);
- InsertToHead(_fileInfoPopIDs, NID::kPackInfo);
- InsertToHead(_fileInfoPopIDs, NID::kSize);
- InsertToHead(_fileInfoPopIDs, NID::kName);
- #endif
-}
-
-STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProps)
-{
- *numProps = _fileInfoPopIDs.Size();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)
-{
- if ((int)index >= _fileInfoPopIDs.Size())
- return E_INVALIDARG;
- int indexInMap = FindPropInMap(_fileInfoPopIDs[index]);
- if (indexInMap == -1)
- return E_INVALIDARG;
- const STATPROPSTG &srcItem = kPropMap[indexInMap].StatPROPSTG;
- *propID = srcItem.propid;
- *varType = srcItem.vt;
- *name = 0;
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zProperties.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zProperties.h
deleted file mode 100644
index 661817954..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zProperties.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// 7zProperties.h
-
-#ifndef __7Z_PROPERTIES_H
-#define __7Z_PROPERTIES_H
-
-#include "../../PropID.h"
-
-namespace NArchive {
-namespace N7z {
-
-enum
-{
- kpidPackedSize0 = kpidUserDefined,
- kpidPackedSize1,
- kpidPackedSize2,
- kpidPackedSize3,
- kpidPackedSize4
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zRegister.cpp
deleted file mode 100644
index 37ea29d30..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zRegister.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// 7zRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "7zHandler.h"
-
-namespace NArchive {
-namespace N7z {
-
-IMP_CreateArcIn
-IMP_CreateArcOut
-
-static CArcInfo g_ArcInfo =
- { "7z", "7z", 0, 7,
- 6, {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C},
- 0,
- NArcInfoFlags::kFindSignature,
- REF_CreateArc_Pair };
-
-REGISTER_ARC_DEC_SIG(7z)
-// REGISTER_ARC(7z)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zSpecStream.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zSpecStream.cpp
deleted file mode 100644
index 8e45d9875..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zSpecStream.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-// 7zSpecStream.cpp
-
-#include "StdAfx.h"
-
-#include "7zSpecStream.h"
-
-STDMETHODIMP CSequentialInStreamSizeCount2::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize;
- HRESULT result = _stream->Read(data, size, &realProcessedSize);
- _size += realProcessedSize;
- if (processedSize)
- *processedSize = realProcessedSize;
- return result;
-}
-
-STDMETHODIMP CSequentialInStreamSizeCount2::GetSubStreamSize(UInt64 subStream, UInt64 *value)
-{
- if (!_getSubStreamSize)
- return E_NOTIMPL;
- return _getSubStreamSize->GetSubStreamSize(subStream, value);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zSpecStream.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zSpecStream.h
deleted file mode 100644
index 2e26efd5c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zSpecStream.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// 7zSpecStream.h
-
-#ifndef __7Z_SPEC_STREAM_H
-#define __7Z_SPEC_STREAM_H
-
-#include "../../IStream.h"
-#include "../../ICoder.h"
-#include "../../../Common/MyCom.h"
-
-class CSequentialInStreamSizeCount2:
- public ISequentialInStream,
- public ICompressGetSubStreamSize,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialInStream> _stream;
- CMyComPtr<ICompressGetSubStreamSize> _getSubStreamSize;
- UInt64 _size;
-public:
- void Init(ISequentialInStream *stream)
- {
- _stream = stream;
- _getSubStreamSize = 0;
- _stream.QueryInterface(IID_ICompressGetSubStreamSize, &_getSubStreamSize);
- _size = 0;
- }
- UInt64 GetSize() const { return _size; }
-
- MY_UNKNOWN_IMP1(ICompressGetSubStreamSize)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-
- STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value);
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zUpdate.cpp b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zUpdate.cpp
deleted file mode 100644
index 26faf2a18..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zUpdate.cpp
+++ /dev/null
@@ -1,1363 +0,0 @@
-// 7zUpdate.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "../../../Common/Wildcard.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "../Common/ItemNameUtils.h"
-#include "../Common/OutStreamWithCRC.h"
-
-#include "7zDecode.h"
-#include "7zEncode.h"
-#include "7zFolderInStream.h"
-#include "7zHandler.h"
-#include "7zOut.h"
-#include "7zUpdate.h"
-
-namespace NArchive {
-namespace N7z {
-
-#ifdef MY_CPU_X86_OR_AMD64
-#define USE_86_FILTER
-#endif
-
-static HRESULT WriteRange(IInStream *inStream, ISequentialOutStream *outStream,
- UInt64 position, UInt64 size, ICompressProgressInfo *progress)
-{
- RINOK(inStream->Seek(position, STREAM_SEEK_SET, 0));
- CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
- CMyComPtr<CLimitedSequentialInStream> inStreamLimited(streamSpec);
- streamSpec->SetStream(inStream);
- streamSpec->Init(size);
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
- RINOK(copyCoder->Code(inStreamLimited, outStream, NULL, NULL, progress));
- return (copyCoderSpec->TotalSize == size ? S_OK : E_FAIL);
-}
-
-static int GetReverseSlashPos(const UString &name)
-{
- int slashPos = name.ReverseFind(L'/');
- #ifdef _WIN32
- int slash1Pos = name.ReverseFind(L'\\');
- slashPos = MyMax(slashPos, slash1Pos);
- #endif
- return slashPos;
-}
-
-int CUpdateItem::GetExtensionPos() const
-{
- int slashPos = GetReverseSlashPos(Name);
- int dotPos = Name.ReverseFind(L'.');
- if (dotPos < 0 || (dotPos < slashPos && slashPos >= 0))
- return Name.Len();
- return dotPos + 1;
-}
-
-UString CUpdateItem::GetExtension() const
-{
- return Name.Ptr(GetExtensionPos());
-}
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-#define RINOZ_COMP(a, b) RINOZ(MyCompare(a, b))
-
-/*
-static int CompareBuffers(const CByteBuffer &a1, const CByteBuffer &a2)
-{
- size_t c1 = a1.GetCapacity();
- size_t c2 = a2.GetCapacity();
- RINOZ_COMP(c1, c2);
- for (size_t i = 0; i < c1; i++)
- RINOZ_COMP(a1[i], a2[i]);
- return 0;
-}
-
-static int CompareCoders(const CCoderInfo &c1, const CCoderInfo &c2)
-{
- RINOZ_COMP(c1.NumInStreams, c2.NumInStreams);
- RINOZ_COMP(c1.NumOutStreams, c2.NumOutStreams);
- RINOZ_COMP(c1.MethodID, c2.MethodID);
- return CompareBuffers(c1.Props, c2.Props);
-}
-
-static int CompareBindPairs(const CBindPair &b1, const CBindPair &b2)
-{
- RINOZ_COMP(b1.InIndex, b2.InIndex);
- return MyCompare(b1.OutIndex, b2.OutIndex);
-}
-
-static int CompareFolders(const CFolder &f1, const CFolder &f2)
-{
- int s1 = f1.Coders.Size();
- int s2 = f2.Coders.Size();
- RINOZ_COMP(s1, s2);
- int i;
- for (i = 0; i < s1; i++)
- RINOZ(CompareCoders(f1.Coders[i], f2.Coders[i]));
- s1 = f1.BindPairs.Size();
- s2 = f2.BindPairs.Size();
- RINOZ_COMP(s1, s2);
- for (i = 0; i < s1; i++)
- RINOZ(CompareBindPairs(f1.BindPairs[i], f2.BindPairs[i]));
- return 0;
-}
-*/
-
-/*
-static int CompareFiles(const CFileItem &f1, const CFileItem &f2)
-{
- return CompareFileNames(f1.Name, f2.Name);
-}
-*/
-
-struct CFolderRepack
-{
- int FolderIndex;
- int Group;
- CNum NumCopyFiles;
-};
-
-static int CompareFolderRepacks(const CFolderRepack *p1, const CFolderRepack *p2, void * /* param */)
-{
- RINOZ_COMP(p1->Group, p2->Group);
- int i1 = p1->FolderIndex;
- int i2 = p2->FolderIndex;
- /*
- // In that version we don't want to parse folders here, so we don't compare folders
- // probably it must be improved in future
- const CDbEx &db = *(const CDbEx *)param;
- RINOZ(CompareFolders(
- db.Folders[i1],
- db.Folders[i2]));
- */
- return MyCompare(i1, i2);
- /*
- RINOZ_COMP(
- db.NumUnpackStreamsVector[i1],
- db.NumUnpackStreamsVector[i2]);
- if (db.NumUnpackStreamsVector[i1] == 0)
- return 0;
- return CompareFiles(
- db.Files[db.FolderStartFileIndex[i1]],
- db.Files[db.FolderStartFileIndex[i2]]);
- */
-}
-
-/*
- we sort empty files and dirs in such order:
- - Dir.NonAnti (name sorted)
- - File.NonAnti (name sorted)
- - File.Anti (name sorted)
- - Dir.Anti (reverse name sorted)
-*/
-
-static int CompareEmptyItems(const int *p1, const int *p2, void *param)
-{
- const CObjectVector<CUpdateItem> &updateItems = *(const CObjectVector<CUpdateItem> *)param;
- const CUpdateItem &u1 = updateItems[*p1];
- const CUpdateItem &u2 = updateItems[*p2];
- // NonAnti < Anti
- if (u1.IsAnti != u2.IsAnti)
- return (u1.IsAnti ? 1 : -1);
- if (u1.IsDir != u2.IsDir)
- {
- // Dir.NonAnti < File < Dir.Anti
- if (u1.IsDir)
- return (u1.IsAnti ? 1 : -1);
- return (u2.IsAnti ? -1 : 1);
- }
- int n = CompareFileNames(u1.Name, u2.Name);
- return (u1.IsDir && u1.IsAnti) ? -n : n;
-}
-
-static const char *g_Exts =
- " lzma 7z ace arc arj bz bz2 deb lzo lzx gz pak rpm sit tgz tbz tbz2 tgz cab ha lha lzh rar zoo"
- " zip jar ear war msi"
- " 3gp avi mov mpeg mpg mpe wmv"
- " aac ape fla flac la mp3 m4a mp4 ofr ogg pac ra rm rka shn swa tta wv wma wav"
- " swf "
- " chm hxi hxs"
- " gif jpeg jpg jp2 png tiff bmp ico psd psp"
- " awg ps eps cgm dxf svg vrml wmf emf ai md"
- " cad dwg pps key sxi"
- " max 3ds"
- " iso bin nrg mdf img pdi tar cpio xpi"
- " vfd vhd vud vmc vsv"
- " vmdk dsk nvram vmem vmsd vmsn vmss vmtm"
- " inl inc idl acf asa h hpp hxx c cpp cxx rc java cs pas bas vb cls ctl frm dlg def"
- " f77 f f90 f95"
- " asm sql manifest dep "
- " mak clw csproj vcproj sln dsp dsw "
- " class "
- " bat cmd"
- " xml xsd xsl xslt hxk hxc htm html xhtml xht mht mhtml htw asp aspx css cgi jsp shtml"
- " awk sed hta js php php3 php4 php5 phptml pl pm py pyo rb sh tcl vbs"
- " text txt tex ans asc srt reg ini doc docx mcw dot rtf hlp xls xlr xlt xlw ppt pdf"
- " sxc sxd sxi sxg sxw stc sti stw stm odt ott odg otg odp otp ods ots odf"
- " abw afp cwk lwp wpd wps wpt wrf wri"
- " abf afm bdf fon mgf otf pcf pfa snf ttf"
- " dbf mdb nsf ntf wdb db fdb gdb"
- " exe dll ocx vbx sfx sys tlb awx com obj lib out o so "
- " pdb pch idb ncb opt";
-
-static int GetExtIndex(const char *ext)
-{
- int extIndex = 1;
- const char *p = g_Exts;
- for (;;)
- {
- char c = *p++;
- if (c == 0)
- return extIndex;
- if (c == ' ')
- continue;
- int pos = 0;
- for (;;)
- {
- char c2 = ext[pos++];
- if (c2 == 0 && (c == 0 || c == ' '))
- return extIndex;
- if (c != c2)
- break;
- c = *p++;
- }
- extIndex++;
- for (;;)
- {
- if (c == 0)
- return extIndex;
- if (c == ' ')
- break;
- c = *p++;
- }
- }
-}
-
-struct CRefItem
-{
- const CUpdateItem *UpdateItem;
- UInt32 Index;
- UInt32 ExtensionPos;
- UInt32 NamePos;
- unsigned ExtensionIndex;
-
- CRefItem() {};
- CRefItem(UInt32 index, const CUpdateItem &ui, bool sortByType):
- UpdateItem(&ui),
- Index(index),
- ExtensionPos(0),
- NamePos(0),
- ExtensionIndex(0)
- {
- if (sortByType)
- {
- int slashPos = GetReverseSlashPos(ui.Name);
- NamePos = slashPos + 1;
- int dotPos = ui.Name.ReverseFind(L'.');
- if (dotPos < 0 || dotPos < slashPos)
- ExtensionPos = ui.Name.Len();
- else
- {
- ExtensionPos = dotPos + 1;
- if (ExtensionPos != ui.Name.Len())
- {
- AString s;
- for (unsigned pos = ExtensionPos;; pos++)
- {
- wchar_t c = ui.Name[pos];
- if (c >= 0x80)
- break;
- if (c == 0)
- {
- ExtensionIndex = GetExtIndex(s);
- break;
- }
- s += (char)MyCharLower_Ascii((char)c);
- }
- }
- }
- }
- }
-};
-
-struct CSortParam
-{
- // const CObjectVector<CTreeFolder> *TreeFolders;
- bool SortByType;
-};
-
-/*
- we sort files in such order:
- - Dir.NonAnti (name sorted)
- - alt streams
- - Dirs
- - Dir.Anti (reverse name sorted)
-*/
-
-
-static int CompareUpdateItems(const CRefItem *p1, const CRefItem *p2, void *param)
-{
- const CRefItem &a1 = *p1;
- const CRefItem &a2 = *p2;
- const CUpdateItem &u1 = *a1.UpdateItem;
- const CUpdateItem &u2 = *a2.UpdateItem;
-
- /*
- if (u1.IsAltStream != u2.IsAltStream)
- return u1.IsAltStream ? 1 : -1;
- */
-
- // Actually there are no dirs that time. They were stored in other steps
- // So that code is unused?
- if (u1.IsDir != u2.IsDir)
- return u1.IsDir ? 1 : -1;
- if (u1.IsDir)
- {
- if (u1.IsAnti != u2.IsAnti)
- return (u1.IsAnti ? 1 : -1);
- int n = CompareFileNames(u1.Name, u2.Name);
- return -n;
- }
-
- // bool sortByType = *(bool *)param;
- const CSortParam *sortParam = (const CSortParam *)param;
- bool sortByType = sortParam->SortByType;
- if (sortByType)
- {
- RINOZ_COMP(a1.ExtensionIndex, a2.ExtensionIndex);
- RINOZ(CompareFileNames(u1.Name.Ptr(a1.ExtensionPos), u2.Name.Ptr(a2.ExtensionPos)));
- RINOZ(CompareFileNames(u1.Name.Ptr(a1.NamePos), u2.Name.Ptr(a2.NamePos)));
- if (!u1.MTimeDefined && u2.MTimeDefined) return 1;
- if (u1.MTimeDefined && !u2.MTimeDefined) return -1;
- if (u1.MTimeDefined && u2.MTimeDefined) RINOZ_COMP(u1.MTime, u2.MTime);
- RINOZ_COMP(u1.Size, u2.Size);
- }
- /*
- int par1 = a1.UpdateItem->ParentFolderIndex;
- int par2 = a2.UpdateItem->ParentFolderIndex;
- const CTreeFolder &tf1 = (*sortParam->TreeFolders)[par1];
- const CTreeFolder &tf2 = (*sortParam->TreeFolders)[par2];
-
- int b1 = tf1.SortIndex, e1 = tf1.SortIndexEnd;
- int b2 = tf2.SortIndex, e2 = tf2.SortIndexEnd;
- if (b1 < b2)
- {
- if (e1 <= b2)
- return -1;
- // p2 in p1
- int par = par2;
- for (;;)
- {
- const CTreeFolder &tf = (*sortParam->TreeFolders)[par];
- par = tf.Parent;
- if (par == par1)
- {
- RINOZ(CompareFileNames(u1.Name, tf.Name));
- break;
- }
- }
- }
- else if (b2 < b1)
- {
- if (e2 <= b1)
- return 1;
- // p1 in p2
- int par = par1;
- for (;;)
- {
- const CTreeFolder &tf = (*sortParam->TreeFolders)[par];
- par = tf.Parent;
- if (par == par2)
- {
- RINOZ(CompareFileNames(tf.Name, u2.Name));
- break;
- }
- }
- }
- */
- // RINOZ_COMP(a1.UpdateItem->ParentSortIndex, a2.UpdateItem->ParentSortIndex);
- RINOK(CompareFileNames(u1.Name, u2.Name));
- RINOZ_COMP(a1.UpdateItem->IndexInClient, a2.UpdateItem->IndexInClient);
- RINOZ_COMP(a1.UpdateItem->IndexInArchive, a2.UpdateItem->IndexInArchive);
- return 0;
-}
-
-struct CSolidGroup
-{
- CRecordVector<UInt32> Indices;
-};
-
-static const wchar_t *g_ExeExts[] =
-{
- L"dll"
- , L"exe"
- , L"ocx"
- , L"sfx"
- , L"sys"
-};
-
-static bool IsExeExt(const wchar_t *ext)
-{
- for (int i = 0; i < ARRAY_SIZE(g_ExeExts); i++)
- if (MyStringCompareNoCase(ext, g_ExeExts[i]) == 0)
- return true;
- return false;
-}
-
-
-static inline void GetMethodFull(UInt64 methodID, UInt32 numInStreams, CMethodFull &m)
-{
- m.Id = methodID;
- m.NumInStreams = numInStreams;
- m.NumOutStreams = 1;
-}
-
-static void AddBcj2Methods(CCompressionMethodMode &mode)
-{
- CMethodFull m;
- GetMethodFull(k_LZMA, 1, m);
-
- m.AddProp32(NCoderPropID::kDictionarySize, 1 << 20);
- m.AddProp32(NCoderPropID::kNumFastBytes, 128);
- m.AddProp32(NCoderPropID::kNumThreads, 1);
- m.AddProp32(NCoderPropID::kLitPosBits, 2);
- m.AddProp32(NCoderPropID::kLitContextBits, 0);
- // m.AddPropString(NCoderPropID::kMatchFinder, L"BT2");
-
- mode.Methods.Add(m);
- mode.Methods.Add(m);
-
- CBind bind;
- bind.OutCoder = 0;
- bind.InStream = 0;
- bind.InCoder = 1; bind.OutStream = 0; mode.Binds.Add(bind);
- bind.InCoder = 2; bind.OutStream = 1; mode.Binds.Add(bind);
- bind.InCoder = 3; bind.OutStream = 2; mode.Binds.Add(bind);
-}
-
-static void MakeExeMethod(CCompressionMethodMode &mode,
- bool useFilters, bool addFilter, bool bcj2Filter)
-{
- if (!mode.Binds.IsEmpty() || !useFilters || mode.Methods.Size() > 2)
- return;
- if (mode.Methods.Size() == 2)
- {
- if (mode.Methods[0].Id == k_BCJ2)
- AddBcj2Methods(mode);
- return;
- }
- if (!addFilter)
- return;
- bcj2Filter = bcj2Filter;
- #ifdef USE_86_FILTER
- if (bcj2Filter)
- {
- CMethodFull m;
- GetMethodFull(k_BCJ2, 4, m);
- mode.Methods.Insert(0, m);
- AddBcj2Methods(mode);
- }
- else
- {
- CMethodFull m;
- GetMethodFull(k_BCJ, 1, m);
- mode.Methods.Insert(0, m);
- CBind bind;
- bind.OutCoder = 0;
- bind.InStream = 0;
- bind.InCoder = 1;
- bind.OutStream = 0;
- mode.Binds.Add(bind);
- }
- #endif
-}
-
-
-static void FromUpdateItemToFileItem(const CUpdateItem &ui,
- CFileItem &file, CFileItem2 &file2)
-{
- if (ui.AttribDefined)
- file.SetAttrib(ui.Attrib);
-
- file2.CTime = ui.CTime; file2.CTimeDefined = ui.CTimeDefined;
- file2.ATime = ui.ATime; file2.ATimeDefined = ui.ATimeDefined;
- file2.MTime = ui.MTime; file2.MTimeDefined = ui.MTimeDefined;
- file2.IsAnti = ui.IsAnti;
- // file2.IsAux = false;
- file2.StartPosDefined = false;
-
- file.Size = ui.Size;
- file.IsDir = ui.IsDir;
- file.HasStream = ui.HasStream();
- // file.IsAltStream = ui.IsAltStream;
-}
-
-class CFolderOutStream2:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- COutStreamWithCRC *_crcStreamSpec;
- CMyComPtr<ISequentialOutStream> _crcStream;
- const CDbEx *_db;
- const CBoolVector *_extractStatuses;
- CMyComPtr<ISequentialOutStream> _outStream;
- UInt32 _startIndex;
- unsigned _currentIndex;
- bool _fileIsOpen;
- UInt64 _rem;
-
- void OpenFile();
- void CloseFile();
- HRESULT CloseFileAndSetResult();
- HRESULT ProcessEmptyFiles();
-public:
- MY_UNKNOWN_IMP
-
- CFolderOutStream2()
- {
- _crcStreamSpec = new COutStreamWithCRC;
- _crcStream = _crcStreamSpec;
- }
-
- HRESULT Init(const CDbEx *db, UInt32 startIndex,
- const CBoolVector *extractStatuses, ISequentialOutStream *outStream);
- void ReleaseOutStream();
- HRESULT CheckFinishedState() const { return (_currentIndex == _extractStatuses->Size()) ? S_OK: E_FAIL; }
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-HRESULT CFolderOutStream2::Init(const CDbEx *db, UInt32 startIndex,
- const CBoolVector *extractStatuses, ISequentialOutStream *outStream)
-{
- _db = db;
- _startIndex = startIndex;
- _extractStatuses = extractStatuses;
- _outStream = outStream;
-
- _currentIndex = 0;
- _fileIsOpen = false;
- return ProcessEmptyFiles();
-}
-
-void CFolderOutStream2::ReleaseOutStream()
-{
- _outStream.Release();
- _crcStreamSpec->ReleaseStream();
-}
-
-void CFolderOutStream2::OpenFile()
-{
- _crcStreamSpec->SetStream((*_extractStatuses)[_currentIndex] ? _outStream : NULL);
- _crcStreamSpec->Init(true);
- _fileIsOpen = true;
- _rem = _db->Files[_startIndex + _currentIndex].Size;
-}
-
-void CFolderOutStream2::CloseFile()
-{
- _crcStreamSpec->ReleaseStream();
- _fileIsOpen = false;
- _currentIndex++;
-}
-
-HRESULT CFolderOutStream2::CloseFileAndSetResult()
-{
- const CFileItem &file = _db->Files[_startIndex + _currentIndex];
- CloseFile();
- return (file.IsDir || !file.CrcDefined || file.Crc == _crcStreamSpec->GetCRC()) ? S_OK: S_FALSE;
-}
-
-HRESULT CFolderOutStream2::ProcessEmptyFiles()
-{
- while (_currentIndex < _extractStatuses->Size() && _db->Files[_startIndex + _currentIndex].Size == 0)
- {
- OpenFile();
- RINOK(CloseFileAndSetResult());
- }
- return S_OK;
-}
-
-STDMETHODIMP CFolderOutStream2::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- while (size != 0)
- {
- if (_fileIsOpen)
- {
- UInt32 cur = size < _rem ? size : (UInt32)_rem;
- RINOK(_crcStream->Write(data, cur, &cur));
- if (cur == 0)
- break;
- data = (const Byte *)data + cur;
- size -= cur;
- _rem -= cur;
- if (processedSize != NULL)
- *processedSize += cur;
- if (_rem == 0)
- {
- RINOK(CloseFileAndSetResult());
- RINOK(ProcessEmptyFiles());
- continue;
- }
- }
- else
- {
- RINOK(ProcessEmptyFiles());
- if (_currentIndex == _extractStatuses->Size())
- {
- // we don't support partial extracting
- return E_FAIL;
- }
- OpenFile();
- }
- }
- return S_OK;
-}
-
-class CThreadDecoder: public CVirtThread
-{
-public:
- HRESULT Result;
- CMyComPtr<IInStream> InStream;
-
- CFolderOutStream2 *FosSpec;
- CMyComPtr<ISequentialOutStream> Fos;
-
- UInt64 StartPos;
- const CFolders *Folders;
- int FolderIndex;
- #ifndef _NO_CRYPTO
- CMyComPtr<ICryptoGetTextPassword> getTextPassword;
- #endif
-
- DECL_EXTERNAL_CODECS_LOC_VARS2;
- CDecoder Decoder;
-
- #ifndef _7ZIP_ST
- bool MtMode;
- UInt32 NumThreads;
- #endif
-
- CThreadDecoder():
- Decoder(true)
- {
- #ifndef _7ZIP_ST
- MtMode = false;
- NumThreads = 1;
- #endif
- FosSpec = new CFolderOutStream2;
- Fos = FosSpec;
- Result = E_FAIL;
- }
- ~CThreadDecoder() { CVirtThread::WaitThreadFinish(); }
- virtual void Execute();
-};
-
-void CThreadDecoder::Execute()
-{
- try
- {
- #ifndef _NO_CRYPTO
- bool isEncrypted = false;
- bool passwordIsDefined = false;
- #endif
-
- Result = Decoder.Decode(
- EXTERNAL_CODECS_LOC_VARS
- InStream,
- StartPos,
- *Folders, FolderIndex,
- Fos,
- NULL
- _7Z_DECODER_CRYPRO_VARS
- #ifndef _7ZIP_ST
- , MtMode, NumThreads
- #endif
- );
- }
- catch(...)
- {
- Result = E_FAIL;
- }
- if (Result == S_OK)
- Result = FosSpec->CheckFinishedState();
- FosSpec->ReleaseOutStream();
-}
-
-bool static Is86FilteredFolder(const CFolder &f)
-{
- FOR_VECTOR(i, f.Coders)
- {
- CMethodId m = f.Coders[i].MethodID;
- if (m == k_BCJ || m == k_BCJ2)
- return true;
- }
- return false;
-}
-
-#ifndef _NO_CRYPTO
-
-class CCryptoGetTextPassword:
- public ICryptoGetTextPassword,
- public CMyUnknownImp
-{
-public:
- UString Password;
-
- MY_UNKNOWN_IMP
- STDMETHOD(CryptoGetTextPassword)(BSTR *password);
-};
-
-STDMETHODIMP CCryptoGetTextPassword::CryptoGetTextPassword(BSTR *password)
-{
- return StringToBstr(Password, password);
-}
-
-#endif
-
-static const int kNumGroupsMax = 4;
-
-static bool Is86Group(int group) { return (group & 1) != 0; }
-static bool IsEncryptedGroup(int group) { return (group & 2) != 0; }
-static int GetGroupIndex(bool encrypted, int bcjFiltered)
- { return (encrypted ? 2 : 0) + (bcjFiltered ? 1 : 0); }
-
-static void GetFile(const CDatabase &inDb, int index, CFileItem &file, CFileItem2 &file2)
-{
- file = inDb.Files[index];
- file2.CTimeDefined = inDb.CTime.GetItem(index, file2.CTime);
- file2.ATimeDefined = inDb.ATime.GetItem(index, file2.ATime);
- file2.MTimeDefined = inDb.MTime.GetItem(index, file2.MTime);
- file2.StartPosDefined = inDb.StartPos.GetItem(index, file2.StartPos);
- file2.IsAnti = inDb.IsItemAnti(index);
- // file2.IsAux = inDb.IsItemAux(index);
-}
-
-HRESULT Update(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream,
- const CDbEx *db,
- const CObjectVector<CUpdateItem> &updateItems,
- // const CObjectVector<CTreeFolder> &treeFolders,
- // const CUniqBlocks &secureBlocks,
- COutArchive &archive,
- CArchiveDatabaseOut &newDatabase,
- ISequentialOutStream *seqOutStream,
- IArchiveUpdateCallback *updateCallback,
- const CUpdateOptions &options
- #ifndef _NO_CRYPTO
- , ICryptoGetTextPassword *getDecoderPassword
- #endif
- )
-{
- UInt64 numSolidFiles = options.NumSolidFiles;
- if (numSolidFiles == 0)
- numSolidFiles = 1;
-
- // size_t totalSecureDataSize = (size_t)secureBlocks.GetTotalSizeInBytes();
-
- /*
- CMyComPtr<IOutStream> outStream;
- RINOK(seqOutStream->QueryInterface(IID_IOutStream, (void **)&outStream));
- if (!outStream)
- return E_NOTIMPL;
- */
-
- UInt64 startBlockSize = db != 0 ? db->ArcInfo.StartPosition: 0;
- if (startBlockSize > 0 && !options.RemoveSfxBlock)
- {
- RINOK(WriteRange(inStream, seqOutStream, 0, startBlockSize, NULL));
- }
-
- CIntArr fileIndexToUpdateIndexMap;
- CRecordVector<CFolderRepack> folderRefs;
- UInt64 complexity = 0;
- UInt64 inSizeForReduce2 = 0;
- bool needEncryptedRepack = false;
- if (db != 0)
- {
- fileIndexToUpdateIndexMap.Alloc(db->Files.Size());
- unsigned i;
- for (i = 0; i < db->Files.Size(); i++)
- fileIndexToUpdateIndexMap[i] = -1;
-
- for (i = 0; i < updateItems.Size(); i++)
- {
- int index = updateItems[i].IndexInArchive;
- if (index != -1)
- fileIndexToUpdateIndexMap[index] = i;
- }
-
- for (i = 0; i < (int)db->NumFolders; i++)
- {
- CNum indexInFolder = 0;
- CNum numCopyItems = 0;
- CNum numUnpackStreams = db->NumUnpackStreamsVector[i];
- UInt64 repackSize = 0;
- for (CNum fi = db->FolderStartFileIndex[i]; indexInFolder < numUnpackStreams; fi++)
- {
- const CFileItem &file = db->Files[fi];
- if (file.HasStream)
- {
- indexInFolder++;
- int updateIndex = fileIndexToUpdateIndexMap[fi];
- if (updateIndex >= 0 && !updateItems[updateIndex].NewData)
- {
- numCopyItems++;
- repackSize += file.Size;
- }
- }
- }
-
- if (numCopyItems == 0)
- continue;
-
- CFolderRepack rep;
- rep.FolderIndex = i;
- rep.NumCopyFiles = numCopyItems;
- CFolder f;
- db->ParseFolderInfo(i, f);
- bool isEncrypted = f.IsEncrypted();
- rep.Group = GetGroupIndex(isEncrypted, Is86FilteredFolder(f));
- folderRefs.Add(rep);
- if (numCopyItems == numUnpackStreams)
- complexity += db->GetFolderFullPackSize(i);
- else
- {
- complexity += repackSize;
- if (repackSize > inSizeForReduce2)
- inSizeForReduce2 = repackSize;
- if (isEncrypted)
- needEncryptedRepack = true;
- }
- }
- folderRefs.Sort(CompareFolderRepacks, (void *)db);
- }
-
- UInt64 inSizeForReduce = 0;
- unsigned i;
- for (i = 0; i < updateItems.Size(); i++)
- {
- const CUpdateItem &ui = updateItems[i];
- if (ui.NewData)
- {
- complexity += ui.Size;
- if (numSolidFiles != 1)
- inSizeForReduce += ui.Size;
- else if (ui.Size > inSizeForReduce)
- inSizeForReduce = ui.Size;
- }
- }
-
- if (inSizeForReduce2 > inSizeForReduce)
- inSizeForReduce = inSizeForReduce2;
-
- RINOK(updateCallback->SetTotal(complexity));
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(updateCallback, true);
-
- CStreamBinder sb;
- RINOK(sb.CreateEvents());
-
- CThreadDecoder threadDecoder;
- if (!folderRefs.IsEmpty())
- {
- #ifdef EXTERNAL_CODECS
- threadDecoder.__externalCodecs = __externalCodecs;
- #endif
- RINOK(threadDecoder.Create());
- }
-
- CObjectVector<CSolidGroup> groups;
- for (i = 0; i < kNumGroupsMax; i++)
- groups.AddNew();
-
- {
- // ---------- Split files to groups ----------
-
- bool useFilters = options.UseFilters;
- const CCompressionMethodMode &method = *options.Method;
- if (method.Methods.Size() != 1 || method.Binds.Size() != 0)
- useFilters = false;
- for (i = 0; i < updateItems.Size(); i++)
- {
- const CUpdateItem &ui = updateItems[i];
- if (!ui.NewData || !ui.HasStream())
- continue;
- bool filteredGroup = false;
- if (useFilters)
- {
- int dotPos = ui.Name.ReverseFind(L'.');
- if (dotPos >= 0)
- filteredGroup = IsExeExt(ui.Name.Ptr(dotPos + 1));
- }
- groups[GetGroupIndex(method.PasswordIsDefined, filteredGroup)].Indices.Add(i);
- }
- }
-
- #ifndef _NO_CRYPTO
-
- CCryptoGetTextPassword *getPasswordSpec = NULL;
- if (needEncryptedRepack)
- {
- getPasswordSpec = new CCryptoGetTextPassword;
- threadDecoder.getTextPassword = getPasswordSpec;
-
- if (options.Method->PasswordIsDefined)
- getPasswordSpec->Password = options.Method->Password;
- else
- {
- if (!getDecoderPassword)
- return E_NOTIMPL;
- CMyComBSTR password;
- RINOK(getDecoderPassword->CryptoGetTextPassword(&password));
- if ((BSTR)password)
- getPasswordSpec->Password = password;
- }
- }
-
- #endif
-
-
- // ---------- Compress ----------
-
- RINOK(archive.Create(seqOutStream, false));
- RINOK(archive.SkipPrefixArchiveHeader());
-
- /*
- CIntVector treeFolderToArcIndex;
- treeFolderToArcIndex.Reserve(treeFolders.Size());
- for (i = 0; i < treeFolders.Size(); i++)
- treeFolderToArcIndex.Add(-1);
- // ---------- Write Tree (only AUX dirs) ----------
- for (i = 1; i < treeFolders.Size(); i++)
- {
- const CTreeFolder &treeFolder = treeFolders[i];
- CFileItem file;
- CFileItem2 file2;
- file2.Init();
- int secureID = 0;
- if (treeFolder.UpdateItemIndex < 0)
- {
- // we can store virtual dir item wuthout attrib, but we want all items have attrib.
- file.SetAttrib(FILE_ATTRIBUTE_DIRECTORY);
- file2.IsAux = true;
- }
- else
- {
- const CUpdateItem &ui = updateItems[treeFolder.UpdateItemIndex];
- // if item is not dir, then it's parent for alt streams.
- // we will write such items later
- if (!ui.IsDir)
- continue;
- secureID = ui.SecureIndex;
- if (ui.NewProps)
- FromUpdateItemToFileItem(ui, file, file2);
- else
- GetFile(*db, ui.IndexInArchive, file, file2);
- }
- file.Size = 0;
- file.HasStream = false;
- file.IsDir = true;
- file.Parent = treeFolder.Parent;
-
- treeFolderToArcIndex[i] = newDatabase.Files.Size();
- newDatabase.AddFile(file, file2, treeFolder.Name);
-
- if (totalSecureDataSize != 0)
- newDatabase.SecureIDs.Add(secureID);
- }
- */
-
- {
- /* ---------- Write non-AUX dirs and Empty files ---------- */
- CRecordVector<int> emptyRefs;
- for (i = 0; i < updateItems.Size(); i++)
- {
- const CUpdateItem &ui = updateItems[i];
- if (ui.NewData)
- {
- if (ui.HasStream())
- continue;
- }
- else if (ui.IndexInArchive != -1 && db->Files[ui.IndexInArchive].HasStream)
- continue;
- /*
- if (ui.TreeFolderIndex >= 0)
- continue;
- */
- emptyRefs.Add(i);
- }
- emptyRefs.Sort(CompareEmptyItems, (void *)&updateItems);
- for (i = 0; i < emptyRefs.Size(); i++)
- {
- const CUpdateItem &ui = updateItems[emptyRefs[i]];
- CFileItem file;
- CFileItem2 file2;
- UString name;
- if (ui.NewProps)
- {
- FromUpdateItemToFileItem(ui, file, file2);
- name = ui.Name;
- }
- else
- {
- GetFile(*db, ui.IndexInArchive, file, file2);
- db->GetPath(ui.IndexInArchive, name);
- }
-
- /*
- if (totalSecureDataSize != 0)
- newDatabase.SecureIDs.Add(ui.SecureIndex);
- file.Parent = ui.ParentFolderIndex;
- */
- newDatabase.AddFile(file, file2, name);
- }
- }
-
- unsigned folderRefIndex = 0;
- lps->ProgressOffset = 0;
-
- for (int groupIndex = 0; groupIndex < kNumGroupsMax; groupIndex++)
- {
- const CSolidGroup &group = groups[groupIndex];
-
- CCompressionMethodMode method = *options.Method;
- MakeExeMethod(method, options.UseFilters, Is86Group(groupIndex), options.MaxFilter);
-
- if (IsEncryptedGroup(groupIndex))
- {
- if (!method.PasswordIsDefined)
- {
- #ifndef _NO_CRYPTO
- if (getPasswordSpec)
- method.Password = getPasswordSpec->Password;
- #endif
- method.PasswordIsDefined = true;
- }
- }
- else
- {
- method.PasswordIsDefined = false;
- method.Password.Empty();
- }
-
- CEncoder encoder(method);
-
- for (; folderRefIndex < folderRefs.Size(); folderRefIndex++)
- {
- const CFolderRepack &rep = folderRefs[folderRefIndex];
- if (rep.Group != groupIndex)
- break;
- int folderIndex = rep.FolderIndex;
-
- if (rep.NumCopyFiles == db->NumUnpackStreamsVector[folderIndex])
- {
- UInt64 packSize = db->GetFolderFullPackSize(folderIndex);
- RINOK(WriteRange(inStream, archive.SeqStream,
- db->GetFolderStreamPos(folderIndex, 0), packSize, progress));
- lps->ProgressOffset += packSize;
-
- CFolder &folder = newDatabase.Folders.AddNew();
- db->ParseFolderInfo(folderIndex, folder);
- CNum startIndex = db->FoStartPackStreamIndex[folderIndex];
- for (unsigned j = 0; j < folder.PackStreams.Size(); j++)
- {
- newDatabase.PackSizes.Add(db->GetStreamPackSize(startIndex + j));
- // newDatabase.PackCRCsDefined.Add(db.PackCRCsDefined[startIndex + j]);
- // newDatabase.PackCRCs.Add(db.PackCRCs[startIndex + j]);
- }
-
- UInt32 indexStart = db->FoToCoderUnpackSizes[folderIndex];
- UInt32 indexEnd = db->FoToCoderUnpackSizes[folderIndex + 1];
- for (; indexStart < indexEnd; indexStart++)
- newDatabase.CoderUnpackSizes.Add(db->CoderUnpackSizes[indexStart]);
- }
- else
- {
- CBoolVector extractStatuses;
-
- CNum numUnpackStreams = db->NumUnpackStreamsVector[folderIndex];
- CNum indexInFolder = 0;
-
- for (CNum fi = db->FolderStartFileIndex[folderIndex]; indexInFolder < numUnpackStreams; fi++)
- {
- bool needExtract = false;
- if (db->Files[fi].HasStream)
- {
- indexInFolder++;
- int updateIndex = fileIndexToUpdateIndexMap[fi];
- if (updateIndex >= 0 && !updateItems[updateIndex].NewData)
- needExtract = true;
- }
- extractStatuses.Add(needExtract);
- }
-
- unsigned startPackIndex = newDatabase.PackSizes.Size();
- UInt64 curUnpackSize;
- {
- CMyComPtr<ISequentialInStream> sbInStream;
- {
- CMyComPtr<ISequentialOutStream> sbOutStream;
- sb.CreateStreams(&sbInStream, &sbOutStream);
- sb.ReInit();
- RINOK(threadDecoder.FosSpec->Init(db, db->FolderStartFileIndex[folderIndex], &extractStatuses, sbOutStream));
- }
-
- threadDecoder.InStream = inStream;
- threadDecoder.Folders = (const CFolders *)db;
- threadDecoder.FolderIndex = folderIndex;
- threadDecoder.StartPos = db->ArcInfo.DataStartPosition; // db->GetFolderStreamPos(folderIndex, 0);
-
- threadDecoder.Start();
-
- RINOK(encoder.Encode(
- EXTERNAL_CODECS_LOC_VARS
- sbInStream, NULL, &inSizeForReduce,
- newDatabase.Folders.AddNew(), newDatabase.CoderUnpackSizes, curUnpackSize,
- archive.SeqStream, newDatabase.PackSizes, progress));
-
- threadDecoder.WaitExecuteFinish();
- }
-
- RINOK(threadDecoder.Result);
-
- for (; startPackIndex < newDatabase.PackSizes.Size(); startPackIndex++)
- lps->OutSize += newDatabase.PackSizes[startPackIndex];
- lps->InSize += curUnpackSize;
- }
-
- newDatabase.NumUnpackStreamsVector.Add(rep.NumCopyFiles);
-
- CNum numUnpackStreams = db->NumUnpackStreamsVector[folderIndex];
-
- CNum indexInFolder = 0;
- for (CNum fi = db->FolderStartFileIndex[folderIndex]; indexInFolder < numUnpackStreams; fi++)
- {
- CFileItem file;
- CFileItem2 file2;
- GetFile(*db, fi, file, file2);
- UString name;
- db->GetPath(fi, name);
- if (file.HasStream)
- {
- indexInFolder++;
- int updateIndex = fileIndexToUpdateIndexMap[fi];
- if (updateIndex >= 0)
- {
- const CUpdateItem &ui = updateItems[updateIndex];
- if (ui.NewData)
- continue;
- if (ui.NewProps)
- {
- CFileItem uf;
- FromUpdateItemToFileItem(ui, uf, file2);
- uf.Size = file.Size;
- uf.Crc = file.Crc;
- uf.CrcDefined = file.CrcDefined;
- uf.HasStream = file.HasStream;
- file = uf;
- name = ui.Name;
- }
- /*
- file.Parent = ui.ParentFolderIndex;
- if (ui.TreeFolderIndex >= 0)
- treeFolderToArcIndex[ui.TreeFolderIndex] = newDatabase.Files.Size();
- if (totalSecureDataSize != 0)
- newDatabase.SecureIDs.Add(ui.SecureIndex);
- */
- newDatabase.AddFile(file, file2, name);
- }
- }
- }
- }
-
- unsigned numFiles = group.Indices.Size();
- if (numFiles == 0)
- continue;
- CRecordVector<CRefItem> refItems;
- refItems.ClearAndSetSize(numFiles);
- bool sortByType = (numSolidFiles > 1);
- for (i = 0; i < numFiles; i++)
- refItems[i] = CRefItem(group.Indices[i], updateItems[group.Indices[i]], sortByType);
- CSortParam sortParam;
- // sortParam.TreeFolders = &treeFolders;
- sortParam.SortByType = sortByType;
- refItems.Sort(CompareUpdateItems, (void *)&sortParam);
-
- CObjArray<UInt32> indices(numFiles);
-
- for (i = 0; i < numFiles; i++)
- {
- UInt32 index = refItems[i].Index;
- indices[i] = index;
- /*
- const CUpdateItem &ui = updateItems[index];
- CFileItem file;
- if (ui.NewProps)
- FromUpdateItemToFileItem(ui, file);
- else
- file = db.Files[ui.IndexInArchive];
- if (file.IsAnti || file.IsDir)
- return E_FAIL;
- newDatabase.Files.Add(file);
- */
- }
-
- for (i = 0; i < numFiles;)
- {
- UInt64 totalSize = 0;
- int numSubFiles;
- UString prevExtension;
- for (numSubFiles = 0; i + numSubFiles < numFiles &&
- numSubFiles < numSolidFiles; numSubFiles++)
- {
- const CUpdateItem &ui = updateItems[indices[i + numSubFiles]];
- totalSize += ui.Size;
- if (totalSize > options.NumSolidBytes)
- break;
- if (options.SolidExtension)
- {
- UString ext = ui.GetExtension();
- if (numSubFiles == 0)
- prevExtension = ext;
- else
- if (!ext.IsEqualToNoCase(prevExtension))
- break;
- }
- }
- if (numSubFiles < 1)
- numSubFiles = 1;
-
- CFolderInStream *inStreamSpec = new CFolderInStream;
- CMyComPtr<ISequentialInStream> solidInStream(inStreamSpec);
- inStreamSpec->Init(updateCallback, &indices[i], numSubFiles);
-
- unsigned startPackIndex = newDatabase.PackSizes.Size();
- UInt64 curFolderUnpackSize;
- RINOK(encoder.Encode(
- EXTERNAL_CODECS_LOC_VARS
- solidInStream, NULL, &inSizeForReduce,
- newDatabase.Folders.AddNew(), newDatabase.CoderUnpackSizes, curFolderUnpackSize,
- archive.SeqStream, newDatabase.PackSizes, progress));
-
- for (; startPackIndex < newDatabase.PackSizes.Size(); startPackIndex++)
- lps->OutSize += newDatabase.PackSizes[startPackIndex];
-
- lps->InSize += curFolderUnpackSize;
- // for ()
- // newDatabase.PackCRCsDefined.Add(false);
- // newDatabase.PackCRCs.Add(0);
-
- CNum numUnpackStreams = 0;
- for (int subIndex = 0; subIndex < numSubFiles; subIndex++)
- {
- const CUpdateItem &ui = updateItems[indices[i + subIndex]];
- CFileItem file;
- CFileItem2 file2;
- UString name;
- if (ui.NewProps)
- {
- FromUpdateItemToFileItem(ui, file, file2);
- name = ui.Name;
- }
- else
- {
- GetFile(*db, ui.IndexInArchive, file, file2);
- db->GetPath(ui.IndexInArchive, name);
- }
- if (file2.IsAnti || file.IsDir)
- return E_FAIL;
-
- /*
- CFileItem &file = newDatabase.Files[
- startFileIndexInDatabase + i + subIndex];
- */
- if (!inStreamSpec->Processed[subIndex])
- {
- continue;
- // file.Name += L".locked";
- }
-
- file.Crc = inStreamSpec->CRCs[subIndex];
- file.Size = inStreamSpec->Sizes[subIndex];
- if (file.Size != 0)
- {
- file.CrcDefined = true;
- file.HasStream = true;
- numUnpackStreams++;
- }
- else
- {
- file.CrcDefined = false;
- file.HasStream = false;
- }
- /*
- file.Parent = ui.ParentFolderIndex;
- if (ui.TreeFolderIndex >= 0)
- treeFolderToArcIndex[ui.TreeFolderIndex] = newDatabase.Files.Size();
- if (totalSecureDataSize != 0)
- newDatabase.SecureIDs.Add(ui.SecureIndex);
- */
- newDatabase.AddFile(file, file2, name);
- }
- // numUnpackStreams = 0 is very bad case for locked files
- // v3.13 doesn't understand it.
- newDatabase.NumUnpackStreamsVector.Add(numUnpackStreams);
- i += numSubFiles;
- }
- }
-
- if (folderRefIndex != folderRefs.Size())
- return E_FAIL;
-
- RINOK(lps->SetCur());
-
- /*
- folderRefs.ClearAndFree();
- fileIndexToUpdateIndexMap.ClearAndFree();
- groups.ClearAndFree();
- */
-
- /*
- for (i = 0; i < newDatabase.Files.Size(); i++)
- {
- CFileItem &file = newDatabase.Files[i];
- file.Parent = treeFolderToArcIndex[file.Parent];
- }
-
- if (totalSecureDataSize != 0)
- {
- newDatabase.SecureBuf.SetCapacity(totalSecureDataSize);
- size_t pos = 0;
- newDatabase.SecureSizes.Reserve(secureBlocks.Sorted.Size());
- for (i = 0; i < secureBlocks.Sorted.Size(); i++)
- {
- const CByteBuffer &buf = secureBlocks.Bufs[secureBlocks.Sorted[i]];
- size_t size = buf.GetCapacity();
- memcpy(newDatabase.SecureBuf + pos, buf, size);
- newDatabase.SecureSizes.Add((UInt32)size);
- pos += size;
- }
- }
- */
- newDatabase.ReserveDown();
- return S_OK;
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zUpdate.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/7zUpdate.h
deleted file mode 100644
index aee2d5ed3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/7zUpdate.h
+++ /dev/null
@@ -1,120 +0,0 @@
-// 7zUpdate.h
-
-#ifndef __7Z_UPDATE_H
-#define __7Z_UPDATE_H
-
-#include "../IArchive.h"
-
-// #include "../../Common/UniqBlocks.h"
-
-#include "7zCompressionMode.h"
-#include "7zIn.h"
-#include "7zOut.h"
-
-namespace NArchive {
-namespace N7z {
-
-/*
-struct CTreeFolder
-{
- UString Name;
- int Parent;
- CIntVector SubFolders;
- int UpdateItemIndex;
- int SortIndex;
- int SortIndexEnd;
-
- CTreeFolder(): UpdateItemIndex(-1) {}
-};
-*/
-
-struct CUpdateItem
-{
- int IndexInArchive;
- int IndexInClient;
-
- UInt64 CTime;
- UInt64 ATime;
- UInt64 MTime;
-
- UInt64 Size;
- UString Name;
- /*
- bool IsAltStream;
- int ParentFolderIndex;
- int TreeFolderIndex;
- */
-
- // that code is not used in 9.26
- // int ParentSortIndex;
- // int ParentSortIndexEnd;
-
- UInt32 Attrib;
-
- bool NewData;
- bool NewProps;
-
- bool IsAnti;
- bool IsDir;
-
- bool AttribDefined;
- bool CTimeDefined;
- bool ATimeDefined;
- bool MTimeDefined;
-
- // int SecureIndex; // 0 means (no_security)
-
- bool HasStream() const { return !IsDir && !IsAnti && Size != 0; }
-
- CUpdateItem():
- // ParentSortIndex(-1),
- // IsAltStream(false),
- IsAnti(false),
- IsDir(false),
- AttribDefined(false),
- CTimeDefined(false),
- ATimeDefined(false),
- MTimeDefined(false)
- // SecureIndex(0)
- {}
- void SetDirStatusFromAttrib() { IsDir = ((Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0); };
-
- int GetExtensionPos() const;
- UString GetExtension() const;
-};
-
-struct CUpdateOptions
-{
- const CCompressionMethodMode *Method;
- const CCompressionMethodMode *HeaderMethod;
- bool UseFilters;
- bool MaxFilter;
-
- CHeaderOptions HeaderOptions;
-
- UInt64 NumSolidFiles;
- UInt64 NumSolidBytes;
- bool SolidExtension;
- bool RemoveSfxBlock;
- bool VolumeMode;
-};
-
-HRESULT Update(
- DECL_EXTERNAL_CODECS_LOC_VARS
- IInStream *inStream,
- const CDbEx *db,
- const CObjectVector<CUpdateItem> &updateItems,
- // const CObjectVector<CTreeFolder> &treeFolders, // treeFolders[0] is root
- // const CUniqBlocks &secureBlocks,
- COutArchive &archive,
- CArchiveDatabaseOut &newDatabase,
- ISequentialOutStream *seqOutStream,
- IArchiveUpdateCallback *updateCallback,
- const CUpdateOptions &options
- #ifndef _NO_CRYPTO
- , ICryptoGetTextPassword *getDecoderPassword
- #endif
- );
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/7z/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/7z/StdAfx.h
deleted file mode 100644
index 2854ff3e9..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/7z/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/Common.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Archive.pri b/src/libs/7zip/win/CPP/7zip/Archive/Archive.pri
deleted file mode 100644
index e8a1c7832..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Archive.pri
+++ /dev/null
@@ -1,6 +0,0 @@
-HEADERS += $$7ZIP_BASE/CPP/7zip/Archive/IArchive.h \
- $$7ZIP_BASE/CPP/7zip/Archive/StdAfx.h
-
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/LzmaHandler.cpp \
- $$7ZIP_BASE/CPP/7zip/Archive/SplitHandler.cpp \
- $$7ZIP_BASE/CPP/7zip/Archive/XzHandler.cpp
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2.cpp
deleted file mode 100644
index e562fec58..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-// CoderMixer2.cpp
-
-#include "StdAfx.h"
-
-#include "CoderMixer2.h"
-
-namespace NCoderMixer {
-
-CBindReverseConverter::CBindReverseConverter(const CBindInfo &srcBindInfo):
- _srcBindInfo(srcBindInfo)
-{
- srcBindInfo.GetNumStreams(NumSrcInStreams, _numSrcOutStreams);
-
- UInt32 j;
- _srcInToDestOutMap.ClearAndSetSize(NumSrcInStreams);
- DestOutToSrcInMap.ClearAndSetSize(NumSrcInStreams);
-
- for (j = 0; j < NumSrcInStreams; j++)
- {
- _srcInToDestOutMap[j] = 0;
- DestOutToSrcInMap[j] = 0;
- }
-
- _srcOutToDestInMap.ClearAndSetSize(_numSrcOutStreams);
- _destInToSrcOutMap.ClearAndSetSize(_numSrcOutStreams);
-
- for (j = 0; j < _numSrcOutStreams; j++)
- {
- _srcOutToDestInMap[j] = 0;
- _destInToSrcOutMap[j] = 0;
- }
-
- UInt32 destInOffset = 0;
- UInt32 destOutOffset = 0;
- UInt32 srcInOffset = NumSrcInStreams;
- UInt32 srcOutOffset = _numSrcOutStreams;
-
- for (int i = srcBindInfo.Coders.Size() - 1; i >= 0; i--)
- {
- const CCoderStreamsInfo &srcCoderInfo = srcBindInfo.Coders[i];
-
- srcInOffset -= srcCoderInfo.NumInStreams;
- srcOutOffset -= srcCoderInfo.NumOutStreams;
-
- UInt32 j;
- for (j = 0; j < srcCoderInfo.NumInStreams; j++, destOutOffset++)
- {
- UInt32 index = srcInOffset + j;
- _srcInToDestOutMap[index] = destOutOffset;
- DestOutToSrcInMap[destOutOffset] = index;
- }
- for (j = 0; j < srcCoderInfo.NumOutStreams; j++, destInOffset++)
- {
- UInt32 index = srcOutOffset + j;
- _srcOutToDestInMap[index] = destInOffset;
- _destInToSrcOutMap[destInOffset] = index;
- }
- }
-}
-
-void CBindReverseConverter::CreateReverseBindInfo(CBindInfo &destBindInfo)
-{
- destBindInfo.Coders.ClearAndReserve(_srcBindInfo.Coders.Size());
- destBindInfo.BindPairs.ClearAndReserve(_srcBindInfo.BindPairs.Size());
- destBindInfo.InStreams.ClearAndReserve(_srcBindInfo.OutStreams.Size());
- destBindInfo.OutStreams.ClearAndReserve(_srcBindInfo.InStreams.Size());
-
- unsigned i;
- for (i = _srcBindInfo.Coders.Size(); i != 0;)
- {
- i--;
- const CCoderStreamsInfo &srcCoderInfo = _srcBindInfo.Coders[i];
- CCoderStreamsInfo destCoderInfo;
- destCoderInfo.NumInStreams = srcCoderInfo.NumOutStreams;
- destCoderInfo.NumOutStreams = srcCoderInfo.NumInStreams;
- destBindInfo.Coders.AddInReserved(destCoderInfo);
- }
- for (i = _srcBindInfo.BindPairs.Size(); i != 0;)
- {
- i--;
- const CBindPair &srcBindPair = _srcBindInfo.BindPairs[i];
- CBindPair destBindPair;
- destBindPair.InIndex = _srcOutToDestInMap[srcBindPair.OutIndex];
- destBindPair.OutIndex = _srcInToDestOutMap[srcBindPair.InIndex];
- destBindInfo.BindPairs.AddInReserved(destBindPair);
- }
- for (i = 0; i < _srcBindInfo.InStreams.Size(); i++)
- destBindInfo.OutStreams.AddInReserved(_srcInToDestOutMap[_srcBindInfo.InStreams[i]]);
- for (i = 0; i < _srcBindInfo.OutStreams.Size(); i++)
- destBindInfo.InStreams.AddInReserved(_srcOutToDestInMap[_srcBindInfo.OutStreams[i]]);
-}
-
-void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes,
- CRecordVector<const UInt64 *> &sizePointers, UInt32 numItems)
-{
- sizes.ClearAndSetSize(numItems);
- sizePointers.ClearAndSetSize(numItems);
- for (UInt32 i = 0; i < numItems; i++)
- {
- if (!srcSizes || !srcSizes[i])
- {
- sizes[i] = 0;
- sizePointers[i] = NULL;
- }
- else
- {
- sizes[i] = *(srcSizes[i]);
- sizePointers[i] = &sizes[i];
- }
- }
-}
-
-void CCoderInfo2::SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes)
-{
- SetSizes(inSizes, InSizes, InSizePointers, NumInStreams);
- SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams);
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2.h
deleted file mode 100644
index 50e7077ae..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2.h
+++ /dev/null
@@ -1,179 +0,0 @@
-// CoderMixer2.h
-
-#ifndef __CODER_MIXER2_H
-#define __CODER_MIXER2_H
-
-#include "../../../Common/MyCom.h"
-#include "../../../Common/MyVector.h"
-
-#include "../../ICoder.h"
-
-namespace NCoderMixer {
-
-struct CBindPair
-{
- UInt32 InIndex;
- UInt32 OutIndex;
-};
-
-struct CCoderStreamsInfo
-{
- UInt32 NumInStreams;
- UInt32 NumOutStreams;
-};
-
-struct CBindInfo
-{
- CRecordVector<CCoderStreamsInfo> Coders;
- CRecordVector<CBindPair> BindPairs;
- CRecordVector<UInt32> InStreams;
- CRecordVector<UInt32> OutStreams;
-
- void Clear()
- {
- Coders.Clear();
- BindPairs.Clear();
- InStreams.Clear();
- OutStreams.Clear();
- }
-
- /*
- UInt32 GetCoderStartOutStream(UInt32 coderIndex) const
- {
- UInt32 numOutStreams = 0;
- for (UInt32 i = 0; i < coderIndex; i++)
- numOutStreams += Coders[i].NumOutStreams;
- return numOutStreams;
- }
- */
-
-
- void GetNumStreams(UInt32 &numInStreams, UInt32 &numOutStreams) const
- {
- numInStreams = 0;
- numOutStreams = 0;
- FOR_VECTOR (i, Coders)
- {
- const CCoderStreamsInfo &coderStreamsInfo = Coders[i];
- numInStreams += coderStreamsInfo.NumInStreams;
- numOutStreams += coderStreamsInfo.NumOutStreams;
- }
- }
-
- int FindBinderForInStream(UInt32 inStream) const
- {
- FOR_VECTOR (i, BindPairs)
- if (BindPairs[i].InIndex == inStream)
- return i;
- return -1;
- }
- int FindBinderForOutStream(UInt32 outStream) const
- {
- FOR_VECTOR (i, BindPairs)
- if (BindPairs[i].OutIndex == outStream)
- return i;
- return -1;
- }
-
- UInt32 GetCoderInStreamIndex(UInt32 coderIndex) const
- {
- UInt32 streamIndex = 0;
- for (UInt32 i = 0; i < coderIndex; i++)
- streamIndex += Coders[i].NumInStreams;
- return streamIndex;
- }
-
- UInt32 GetCoderOutStreamIndex(UInt32 coderIndex) const
- {
- UInt32 streamIndex = 0;
- for (UInt32 i = 0; i < coderIndex; i++)
- streamIndex += Coders[i].NumOutStreams;
- return streamIndex;
- }
-
-
- void FindInStream(UInt32 streamIndex, UInt32 &coderIndex,
- UInt32 &coderStreamIndex) const
- {
- for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++)
- {
- UInt32 curSize = Coders[coderIndex].NumInStreams;
- if (streamIndex < curSize)
- {
- coderStreamIndex = streamIndex;
- return;
- }
- streamIndex -= curSize;
- }
- throw 1;
- }
- void FindOutStream(UInt32 streamIndex, UInt32 &coderIndex,
- UInt32 &coderStreamIndex) const
- {
- for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++)
- {
- UInt32 curSize = Coders[coderIndex].NumOutStreams;
- if (streamIndex < curSize)
- {
- coderStreamIndex = streamIndex;
- return;
- }
- streamIndex -= curSize;
- }
- throw 1;
- }
-};
-
-class CBindReverseConverter
-{
- UInt32 _numSrcOutStreams;
- NCoderMixer::CBindInfo _srcBindInfo;
- CRecordVector<UInt32> _srcInToDestOutMap;
- CRecordVector<UInt32> _srcOutToDestInMap;
- CRecordVector<UInt32> _destInToSrcOutMap;
-public:
- UInt32 NumSrcInStreams;
- CRecordVector<UInt32> DestOutToSrcInMap;
-
- CBindReverseConverter(const NCoderMixer::CBindInfo &srcBindInfo);
- void CreateReverseBindInfo(NCoderMixer::CBindInfo &destBindInfo);
-};
-
-void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes,
- CRecordVector<const UInt64 *> &sizePointers, UInt32 numItems);
-
-struct CCoderInfo2
-{
- CMyComPtr<ICompressCoder> Coder;
- CMyComPtr<ICompressCoder2> Coder2;
- UInt32 NumInStreams;
- UInt32 NumOutStreams;
-
- CRecordVector<UInt64> InSizes;
- CRecordVector<UInt64> OutSizes;
- CRecordVector<const UInt64 *> InSizePointers;
- CRecordVector<const UInt64 *> OutSizePointers;
-
- CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams):
- NumInStreams(numInStreams),
- NumOutStreams(numOutStreams) {}
- void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes);
-
- HRESULT QueryInterface(REFGUID iid, void** pp) const
- {
- IUnknown *p = Coder ? (IUnknown *)Coder : (IUnknown *)Coder2;
- return p->QueryInterface(iid, pp);
- }
-};
-
-class CCoderMixer2
-{
-public:
- virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) = 0;
- virtual void ReInit() = 0;
- virtual void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) = 0;
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2MT.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2MT.cpp
deleted file mode 100644
index 36b252600..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2MT.cpp
+++ /dev/null
@@ -1,218 +0,0 @@
-// CoderMixer2MT.cpp
-
-#include "StdAfx.h"
-
-#include "CoderMixer2MT.h"
-
-namespace NCoderMixer {
-
-CCoder2::CCoder2(UInt32 numInStreams, UInt32 numOutStreams):
- CCoderInfo2(numInStreams, numOutStreams)
-{
- InStreams.ClearAndReserve(NumInStreams);
- OutStreams.ClearAndReserve(NumOutStreams);
-}
-
-void CCoder2::Execute() { Code(NULL); }
-
-void CCoder2::Code(ICompressProgressInfo *progress)
-{
- InStreamPointers.ClearAndReserve(NumInStreams);
- OutStreamPointers.ClearAndReserve(NumOutStreams);
- UInt32 i;
- for (i = 0; i < NumInStreams; i++)
- {
- if (InSizePointers[i])
- InSizePointers[i] = &InSizes[i];
- InStreamPointers.AddInReserved((ISequentialInStream *)InStreams[i]);
- }
- for (i = 0; i < NumOutStreams; i++)
- {
- if (OutSizePointers[i])
- OutSizePointers[i] = &OutSizes[i];
- OutStreamPointers.AddInReserved((ISequentialOutStream *)OutStreams[i]);
- }
- if (Coder)
- Result = Coder->Code(InStreamPointers[0], OutStreamPointers[0],
- InSizePointers[0], OutSizePointers[0], progress);
- else
- Result = Coder2->Code(&InStreamPointers.Front(), &InSizePointers.Front(), NumInStreams,
- &OutStreamPointers.Front(), &OutSizePointers.Front(), NumOutStreams, progress);
- {
- unsigned i;
- for (i = 0; i < InStreams.Size(); i++)
- InStreams[i].Release();
- for (i = 0; i < OutStreams.Size(); i++)
- OutStreams[i].Release();
- }
-}
-
-/*
-void CCoder2::SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes)
-{
- SetSizes(inSizes, InSizes, InSizePointers, NumInStreams);
- SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams);
-}
-*/
-
-//////////////////////////////////////
-// CCoderMixer2MT
-
-HRESULT CCoderMixer2MT::SetBindInfo(const CBindInfo &bindInfo)
-{
- _bindInfo = bindInfo;
- _streamBinders.Clear();
- FOR_VECTOR (i, _bindInfo.BindPairs)
- {
- RINOK(_streamBinders.AddNew().CreateEvents());
- }
- return S_OK;
-}
-
-void CCoderMixer2MT::AddCoderCommon()
-{
- const CCoderStreamsInfo &c = _bindInfo.Coders[_coders.Size()];
- CCoder2 threadCoderInfo(c.NumInStreams, c.NumOutStreams);
- _coders.Add(threadCoderInfo);
-}
-
-void CCoderMixer2MT::AddCoder(ICompressCoder *coder)
-{
- AddCoderCommon();
- _coders.Back().Coder = coder;
-}
-
-void CCoderMixer2MT::AddCoder2(ICompressCoder2 *coder)
-{
- AddCoderCommon();
- _coders.Back().Coder2 = coder;
-}
-
-
-void CCoderMixer2MT::ReInit()
-{
- FOR_VECTOR (i, _streamBinders)
- _streamBinders[i].ReInit();
-}
-
-
-HRESULT CCoderMixer2MT::Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams)
-{
- /*
- if (_coders.Size() != _bindInfo.Coders.Size())
- throw 0;
- */
- unsigned i;
- for (i = 0; i < _coders.Size(); i++)
- {
- CCoder2 &coderInfo = _coders[i];
- const CCoderStreamsInfo &coderStreamsInfo = _bindInfo.Coders[i];
- coderInfo.InStreams.Clear();
- UInt32 j;
- for (j = 0; j < coderStreamsInfo.NumInStreams; j++)
- coderInfo.InStreams.Add(NULL);
- coderInfo.OutStreams.Clear();
- for (j = 0; j < coderStreamsInfo.NumOutStreams; j++)
- coderInfo.OutStreams.Add(NULL);
- }
-
- for (i = 0; i < _bindInfo.BindPairs.Size(); i++)
- {
- const CBindPair &bindPair = _bindInfo.BindPairs[i];
- UInt32 inCoderIndex, inCoderStreamIndex;
- UInt32 outCoderIndex, outCoderStreamIndex;
- _bindInfo.FindInStream(bindPair.InIndex, inCoderIndex, inCoderStreamIndex);
- _bindInfo.FindOutStream(bindPair.OutIndex, outCoderIndex, outCoderStreamIndex);
-
- _streamBinders[i].CreateStreams(
- &_coders[inCoderIndex].InStreams[inCoderStreamIndex],
- &_coders[outCoderIndex].OutStreams[outCoderStreamIndex]);
-
- CMyComPtr<ICompressSetBufSize> inSetSize, outSetSize;
- _coders[inCoderIndex].QueryInterface(IID_ICompressSetBufSize, (void **)&inSetSize);
- _coders[outCoderIndex].QueryInterface(IID_ICompressSetBufSize, (void **)&outSetSize);
- if (inSetSize && outSetSize)
- {
- const UInt32 kBufSize = 1 << 19;
- inSetSize->SetInBufSize(inCoderStreamIndex, kBufSize);
- outSetSize->SetOutBufSize(outCoderStreamIndex, kBufSize);
- }
- }
-
- for (i = 0; i < _bindInfo.InStreams.Size(); i++)
- {
- UInt32 inCoderIndex, inCoderStreamIndex;
- _bindInfo.FindInStream(_bindInfo.InStreams[i], inCoderIndex, inCoderStreamIndex);
- _coders[inCoderIndex].InStreams[inCoderStreamIndex] = inStreams[i];
- }
-
- for (i = 0; i < _bindInfo.OutStreams.Size(); i++)
- {
- UInt32 outCoderIndex, outCoderStreamIndex;
- _bindInfo.FindOutStream(_bindInfo.OutStreams[i], outCoderIndex, outCoderStreamIndex);
- _coders[outCoderIndex].OutStreams[outCoderStreamIndex] = outStreams[i];
- }
- return S_OK;
-}
-
-HRESULT CCoderMixer2MT::ReturnIfError(HRESULT code)
-{
- FOR_VECTOR (i, _coders)
- if (_coders[i].Result == code)
- return code;
- return S_OK;
-}
-
-STDMETHODIMP CCoderMixer2MT::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;
-
- Init(inStreams, outStreams);
-
- unsigned i;
- for (i = 0; i < _coders.Size(); i++)
- if (i != _progressCoderIndex)
- {
- RINOK(_coders[i].Create());
- }
-
- 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].WaitExecuteFinish();
-
- 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/CoderMixer2MT.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2MT.h
deleted file mode 100644
index 2190cf867..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/CoderMixer2MT.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// CoderMixer2MT.h
-
-#ifndef __CODER_MIXER2_MT_H
-#define __CODER_MIXER2_MT_H
-
-#include "CoderMixer2.h"
-#include "../../../Common/MyCom.h"
-#include "../../Common/StreamBinder.h"
-#include "../../Common/VirtThread.h"
-
-namespace NCoderMixer {
-
-struct CCoder2: public CCoderInfo2, public CVirtThread
-{
- CRecordVector<ISequentialInStream*> InStreamPointers;
- CRecordVector<ISequentialOutStream*> OutStreamPointers;
-
-public:
- HRESULT Result;
- CObjectVector< CMyComPtr<ISequentialInStream> > InStreams;
- CObjectVector< CMyComPtr<ISequentialOutStream> > OutStreams;
-
- CCoder2(UInt32 numInStreams, UInt32 numOutStreams);
- ~CCoder2() { CVirtThread::WaitThreadFinish(); }
- // void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes);
- virtual void Execute();
- void Code(ICompressProgressInfo *progress);
-};
-
-
-/*
- SetBindInfo()
- for each coder
- AddCoder[2]()
- SetProgressIndex(UInt32 coderIndex);
-
- for each file
- {
- ReInit()
- for each coder
- SetCoderInfo
- Code
- }
-*/
-
-class CCoderMixer2MT:
- public ICompressCoder2,
- public CCoderMixer2,
- public CMyUnknownImp
-{
- CBindInfo _bindInfo;
- CObjectVector<CStreamBinder> _streamBinders;
- unsigned _progressCoderIndex;
-
- void AddCoderCommon();
- HRESULT Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams);
- HRESULT ReturnIfError(HRESULT code);
-public:
- CObjectVector<CCoder2> _coders;
- MY_UNKNOWN_IMP
-
- STDMETHOD(Code)(ISequentialInStream **inStreams,
- const UInt64 **inSizes,
- UInt32 numInStreams,
- ISequentialOutStream **outStreams,
- const UInt64 **outSizes,
- UInt32 numOutStreams,
- ICompressProgressInfo *progress);
-
- HRESULT SetBindInfo(const CBindInfo &bindInfo);
- void AddCoder(ICompressCoder *coder);
- void AddCoder2(ICompressCoder2 *coder);
- void SetProgressCoderIndex(unsigned coderIndex) { _progressCoderIndex = coderIndex; }
-
- void ReInit();
- void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes)
- { _coders[coderIndex].SetCoderInfo(inSizes, outSizes); }
- UInt64 GetWriteProcessedSize(UInt32 binderIndex) const
- { return _streamBinders[binderIndex].ProcessedSize; }
-};
-
-}
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/Common.pri b/src/libs/7zip/win/CPP/7zip/Archive/Common/Common.pri
deleted file mode 100644
index e808619d3..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/Common.pri
+++ /dev/null
@@ -1,19 +0,0 @@
-HEADERS += $$7ZIP_BASE/CPP/7zip/Archive/Common/CoderMixer2.h \
- $$7ZIP_BASE/CPP/7zip/Archive/Common/CoderMixer2MT.h \
- $$7ZIP_BASE/CPP/7zip/Archive/Common/DummyOutStream.h \
- $$7ZIP_BASE/CPP/7zip/Archive/Common/HandlerOut.h \
- $$7ZIP_BASE/CPP/7zip/Archive/Common/InStreamWithCRC.h \
- $$7ZIP_BASE/CPP/7zip/Archive/Common/ItemNameUtils.h \
- $$7ZIP_BASE/CPP/7zip/Archive/Common/MultiStream.h \
- $$7ZIP_BASE/CPP/7zip/Archive/Common/OutStreamWithCRC.h \
- $$7ZIP_BASE/CPP/7zip/Archive/Common/ParseProperties.h \
- $$7ZIP_BASE/CPP/7zip/Archive/Common/StdAfx.h
-
-SOURCES += $$7ZIP_BASE/CPP/7zip/Archive/Common/CoderMixer2.cpp \
- $$7ZIP_BASE/CPP/7zip/Archive/Common/CoderMixer2MT.cpp \
- $$7ZIP_BASE/CPP/7zip/Archive/Common/DummyOutStream.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
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/DummyOutStream.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/DummyOutStream.cpp
deleted file mode 100644
index 7c4f54879..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/DummyOutStream.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-// DummyOutStream.cpp
-
-#include "StdAfx.h"
-
-#include "DummyOutStream.h"
-
-STDMETHODIMP CDummyOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize = size;
- HRESULT res = S_OK;
- if (_stream)
- res = _stream->Write(data, size, &realProcessedSize);
- _size += realProcessedSize;
- if (processedSize)
- *processedSize = realProcessedSize;
- return res;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/DummyOutStream.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/DummyOutStream.h
deleted file mode 100644
index b5a51fc07..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/DummyOutStream.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// DummyOutStream.h
-
-#ifndef __DUMMY_OUT_STREAM_H
-#define __DUMMY_OUT_STREAM_H
-
-#include "../../../Common/MyCom.h"
-
-#include "../../IStream.h"
-
-class CDummyOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialOutStream> _stream;
- UInt64 _size;
-public:
- void SetStream(ISequentialOutStream *outStream) { _stream = outStream; }
- void ReleaseStream() { _stream.Release(); }
- void Init() { _size = 0; }
- MY_UNKNOWN_IMP
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- UInt64 GetSize() const { return _size; }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/HandlerOut.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/HandlerOut.cpp
deleted file mode 100644
index 7b875fbd0..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/HandlerOut.cpp
+++ /dev/null
@@ -1,141 +0,0 @@
-// HandlerOut.cpp
-
-#include "StdAfx.h"
-
-#ifndef _7ZIP_ST
-#include "../../../Windows/System.h"
-#endif
-
-#include "../Common/ParseProperties.h"
-
-#include "HandlerOut.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-
-static void SetMethodProp32(COneMethodInfo &m, PROPID propID, UInt32 value)
-{
- if (m.FindProp(propID) < 0)
- m.AddProp32(propID, value);
-}
-
-void CMultiMethodProps::SetGlobalLevelAndThreads(COneMethodInfo &oneMethodInfo
- #ifndef _7ZIP_ST
- , UInt32 numThreads
- #endif
- )
-{
- UInt32 level = _level;
- if (level != (UInt32)(Int32)-1)
- SetMethodProp32(oneMethodInfo, NCoderPropID::kLevel, (UInt32)level);
- #ifndef _7ZIP_ST
- SetMethodProp32(oneMethodInfo, NCoderPropID::kNumThreads, numThreads);
- #endif
-}
-
-void CMultiMethodProps::Init()
-{
- #ifndef _7ZIP_ST
- _numProcessors = _numThreads = NSystem::GetNumberOfProcessors();
- #endif
-
- _level = (UInt32)(Int32)-1;
- _autoFilter = true;
- _crcSize = 4;
- _filterMethod.Clear();
- _methods.Clear();
-}
-
-HRESULT CMultiMethodProps::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value)
-{
- UString name = nameSpec;
- name.MakeLower_Ascii();
- if (name.IsEmpty())
- return E_INVALIDARG;
-
- if (name[0] == 'x')
- {
- name.Delete(0);
- _level = 9;
- return ParsePropToUInt32(name, value, _level);
- }
-
- if (name == L"crc")
- {
- name.Delete(0, 3);
- _crcSize = 4;
- return ParsePropToUInt32(name, value, _crcSize);
- }
-
- UInt32 number;
- int index = ParseStringToUInt32(name, number);
- UString realName = name.Ptr(index);
- if (index == 0)
- {
- if (name.IsPrefixedBy(L"mt"))
- {
- #ifndef _7ZIP_ST
- RINOK(ParseMtProp(name.Ptr(2), value, _numProcessors, _numThreads));
- #endif
- return S_OK;
- }
- if (name.IsEqualTo("f"))
- {
- HRESULT res = PROPVARIANT_to_bool(value, _autoFilter);
- if (res == S_OK)
- return res;
- if (value.vt != VT_BSTR)
- return E_INVALIDARG;
- return _filterMethod.ParseMethodFromPROPVARIANT(L"", value);
- }
- number = 0;
- }
- if (number > 64)
- return E_FAIL;
- for (int j = _methods.Size(); j <= (int)number; j++)
- _methods.Add(COneMethodInfo());
- return _methods[number].ParseMethodFromPROPVARIANT(realName, value);
-}
-
-void CSingleMethodProps::Init()
-{
- Clear();
- #ifndef _7ZIP_ST
- _numProcessors = _numThreads = NWindows::NSystem::GetNumberOfProcessors();
- AddNumThreadsProp(_numThreads);
- #endif
- _level = (UInt32)(Int32)-1;
-}
-
-HRESULT CSingleMethodProps::SetProperties(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps)
-{
- Init();
- for (UInt32 i = 0; i < numProps; i++)
- {
- UString name = names[i];
- name.MakeLower_Ascii();
- if (name.IsEmpty())
- return E_INVALIDARG;
- const PROPVARIANT &value = values[i];
- if (name[0] == L'x')
- {
- UInt32 a = 9;
- RINOK(ParsePropToUInt32(name.Ptr(1), value, a));
- _level = a;
- AddLevelProp(a);
- }
- else if (name.IsPrefixedBy(L"mt"))
- {
- #ifndef _7ZIP_ST
- RINOK(ParseMtProp(name.Ptr(2), value, _numProcessors, _numThreads));
- AddNumThreadsProp(_numThreads);
- #endif
- }
- else
- return ParseMethodFromPROPVARIANT(names[i], value);
- }
- return S_OK;
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/HandlerOut.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/HandlerOut.h
deleted file mode 100644
index eba2a19e1..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/HandlerOut.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// HandlerOut.h
-
-#ifndef __HANDLER_OUT_H
-#define __HANDLER_OUT_H
-
-#include "../../Common/MethodProps.h"
-
-namespace NArchive {
-
-class CMultiMethodProps
-{
- UInt32 _level;
-public:
- #ifndef _7ZIP_ST
- UInt32 _numThreads;
- UInt32 _numProcessors;
- #endif
-
- UInt32 _crcSize;
- CObjectVector<COneMethodInfo> _methods;
- COneMethodInfo _filterMethod;
- bool _autoFilter;
-
- void SetGlobalLevelAndThreads(COneMethodInfo &oneMethodInfo
- #ifndef _7ZIP_ST
- , UInt32 numThreads
- #endif
- );
-
- unsigned GetNumEmptyMethods() const
- {
- unsigned i;
- for (i = 0; i < _methods.Size(); i++)
- if (!_methods[i].IsEmpty())
- break;
- return i;
- }
-
- int GetLevel() const { return _level == (UInt32)(Int32)-1 ? 5 : (int)_level; }
-
- void Init();
-
- CMultiMethodProps() { Init(); }
- HRESULT SetProperty(const wchar_t *name, const PROPVARIANT &value);
-};
-
-class CSingleMethodProps: public COneMethodInfo
-{
- UInt32 _level;
-
-public:
- #ifndef _7ZIP_ST
- UInt32 _numThreads;
- UInt32 _numProcessors;
- #endif
-
- void Init();
- CSingleMethodProps() { Init(); }
- int GetLevel() const { return _level == (UInt32)(Int32)-1 ? 5 : (int)_level; }
- HRESULT SetProperties(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps);
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/InStreamWithCRC.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/InStreamWithCRC.cpp
deleted file mode 100644
index a2d688328..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/InStreamWithCRC.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-// InStreamWithCRC.cpp
-
-#include "StdAfx.h"
-
-#include "InStreamWithCRC.h"
-
-STDMETHODIMP CSequentialInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessed = 0;
- HRESULT result = S_OK;
- if (_stream)
- result = _stream->Read(data, size, &realProcessed);
- _size += realProcessed;
- if (size != 0 && realProcessed == 0)
- _wasFinished = true;
- _crc = CrcUpdate(_crc, data, realProcessed);
- if (processedSize)
- *processedSize = realProcessed;
- return result;
-}
-
-STDMETHODIMP CInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessed = 0;
- HRESULT result = S_OK;
- if (_stream)
- result = _stream->Read(data, size, &realProcessed);
- _size += realProcessed;
- /*
- if (size != 0 && realProcessed == 0)
- _wasFinished = true;
- */
- _crc = CrcUpdate(_crc, data, realProcessed);
- if (processedSize)
- *processedSize = realProcessed;
- return result;
-}
-
-STDMETHODIMP CInStreamWithCRC::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- if (seekOrigin != STREAM_SEEK_SET || offset != 0)
- return E_FAIL;
- _size = 0;
- _crc = CRC_INIT_VAL;
- return _stream->Seek(offset, seekOrigin, newPosition);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/InStreamWithCRC.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/InStreamWithCRC.h
deleted file mode 100644
index 31b761e45..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/InStreamWithCRC.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// InStreamWithCRC.h
-
-#ifndef __IN_STREAM_WITH_CRC_H
-#define __IN_STREAM_WITH_CRC_H
-
-#include "../../../../C/7zCrc.h"
-
-#include "../../../Common/MyCom.h"
-
-#include "../../IStream.h"
-
-class CSequentialInStreamWithCRC:
- public ISequentialInStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-private:
- CMyComPtr<ISequentialInStream> _stream;
- UInt64 _size;
- UInt32 _crc;
- bool _wasFinished;
-public:
- void SetStream(ISequentialInStream *stream) { _stream = stream; }
- void Init()
- {
- _size = 0;
- _wasFinished = false;
- _crc = CRC_INIT_VAL;
- }
- void ReleaseStream() { _stream.Release(); }
- UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); }
- UInt64 GetSize() const { return _size; }
- bool WasFinished() const { return _wasFinished; }
-};
-
-class CInStreamWithCRC:
- public IInStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP1(IInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-private:
- CMyComPtr<IInStream> _stream;
- UInt64 _size;
- UInt32 _crc;
- // bool _wasFinished;
-public:
- void SetStream(IInStream *stream) { _stream = stream; }
- void Init()
- {
- _size = 0;
- // _wasFinished = false;
- _crc = CRC_INIT_VAL;
- }
- void ReleaseStream() { _stream.Release(); }
- UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); }
- UInt64 GetSize() const { return _size; }
- // bool WasFinished() const { return _wasFinished; }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/ItemNameUtils.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/ItemNameUtils.cpp
deleted file mode 100644
index 7cd3037be..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/ItemNameUtils.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-// Archive/Common/ItemNameUtils.cpp
-
-#include "StdAfx.h"
-
-#include "ItemNameUtils.h"
-
-namespace NArchive {
-namespace NItemName {
-
-static const wchar_t kOSDirDelimiter = WCHAR_PATH_SEPARATOR;
-static const wchar_t kDirDelimiter = L'/';
-
-void ReplaceToOsPathSeparator(wchar_t *s)
-{
- #ifdef _WIN32
- for (;;)
- {
- wchar_t c = *s;
- if (c == 0)
- break;
- if (c == kDirDelimiter)
- *s = kOSDirDelimiter;
- s++;
- }
- #endif
-}
-
-UString MakeLegalName(const UString &name)
-{
- UString zipName = name;
- zipName.Replace(kOSDirDelimiter, kDirDelimiter);
- return zipName;
-}
-
-UString GetOSName(const UString &name)
-{
- UString newName = name;
- newName.Replace(kDirDelimiter, kOSDirDelimiter);
- return newName;
-}
-
-UString GetOSName2(const UString &name)
-{
- if (name.IsEmpty())
- return UString();
- UString newName = GetOSName(name);
- if (newName.Back() == kOSDirDelimiter)
- newName.DeleteBack();
- return newName;
-}
-
-void ConvertToOSName2(UString &name)
-{
- if (!name.IsEmpty())
- {
- name.Replace(kDirDelimiter, kOSDirDelimiter);
- if (name.Back() == kOSDirDelimiter)
- name.DeleteBack();
- }
-}
-
-bool HasTailSlash(const AString &name, UINT
- #if defined(_WIN32) && !defined(UNDER_CE)
- codePage
- #endif
- )
-{
- if (name.IsEmpty())
- return false;
- LPCSTR prev =
- #if defined(_WIN32) && !defined(UNDER_CE)
- CharPrevExA((WORD)codePage, name, &name[name.Len()], 0);
- #else
- (LPCSTR)(name) + (name.Len() - 1);
- #endif
- return (*prev == '/');
-}
-
-#ifndef _WIN32
-UString WinNameToOSName(const UString &name)
-{
- UString newName = name;
- newName.Replace(L'\\', kOSDirDelimiter);
- return newName;
-}
-#endif
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/ItemNameUtils.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/ItemNameUtils.h
deleted file mode 100644
index d0dc76a41..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/ItemNameUtils.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Archive/Common/ItemNameUtils.h
-
-#ifndef __ARCHIVE_ITEM_NAME_UTILS_H
-#define __ARCHIVE_ITEM_NAME_UTILS_H
-
-#include "../../../Common/MyString.h"
-
-namespace NArchive {
-namespace NItemName {
-
- void ReplaceToOsPathSeparator(wchar_t *s);
-
- UString MakeLegalName(const UString &name);
- UString GetOSName(const UString &name);
- UString GetOSName2(const UString &name);
- void ConvertToOSName2(UString &name);
- bool HasTailSlash(const AString &name, UINT codePage);
-
- #ifdef _WIN32
- inline UString WinNameToOSName(const UString &name) { return name; }
- #else
- UString WinNameToOSName(const UString &name);
- #endif
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/MultiStream.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/MultiStream.cpp
deleted file mode 100644
index 17f749058..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/MultiStream.cpp
+++ /dev/null
@@ -1,191 +0,0 @@
-// MultiStream.cpp
-
-#include "StdAfx.h"
-
-#include "MultiStream.h"
-
-STDMETHODIMP CMultiStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (size == 0)
- return S_OK;
- if (_pos >= _totalLength)
- return S_OK;
-
- {
- unsigned left = 0, mid = _streamIndex, right = Streams.Size();
- for (;;)
- {
- CSubStreamInfo &m = Streams[mid];
- if (_pos < m.GlobalOffset)
- right = mid;
- else if (_pos >= m.GlobalOffset + m.Size)
- left = mid + 1;
- else
- {
- _streamIndex = mid;
- break;
- }
- mid = (left + right) / 2;
- }
- _streamIndex = mid;
- }
-
- CSubStreamInfo &s = Streams[_streamIndex];
- UInt64 localPos = _pos - s.GlobalOffset;
- if (localPos != s.LocalPos)
- {
- RINOK(s.Stream->Seek(localPos, STREAM_SEEK_SET, &s.LocalPos));
- }
- UInt64 rem = s.Size - localPos;
- if (size > rem)
- size = (UInt32)rem;
- HRESULT result = s.Stream->Read(data, size, &size);
- _pos += size;
- s.LocalPos += size;
- if (processedSize)
- *processedSize = size;
- return result;
-}
-
-STDMETHODIMP CMultiStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: offset += _pos; break;
- case STREAM_SEEK_END: offset += _totalLength; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (offset < 0)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- _pos = offset;
- if (newPosition)
- *newPosition = offset;
- return S_OK;
-}
-
-
-/*
-class COutVolumeStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- unsigned _volIndex;
- UInt64 _volSize;
- UInt64 _curPos;
- CMyComPtr<ISequentialOutStream> _volumeStream;
- COutArchive _archive;
- CCRC _crc;
-
-public:
- MY_UNKNOWN_IMP
-
- CFileItem _file;
- CUpdateOptions _options;
- CMyComPtr<IArchiveUpdateCallback2> VolumeCallback;
- void Init(IArchiveUpdateCallback2 *volumeCallback,
- const UString &name)
- {
- _file.Name = name;
- _file.IsStartPosDefined = true;
- _file.StartPos = 0;
-
- VolumeCallback = volumeCallback;
- _volIndex = 0;
- _volSize = 0;
- }
-
- HRESULT Flush();
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-HRESULT COutVolumeStream::Flush()
-{
- if (_volumeStream)
- {
- _file.UnPackSize = _curPos;
- _file.FileCRC = _crc.GetDigest();
- RINOK(WriteVolumeHeader(_archive, _file, _options));
- _archive.Close();
- _volumeStream.Release();
- _file.StartPos += _file.UnPackSize;
- }
- return S_OK;
-}
-*/
-
-/*
-STDMETHODIMP COutMultiStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- while (size > 0)
- {
- if (_streamIndex >= Streams.Size())
- {
- CSubStreamInfo subStream;
- RINOK(VolumeCallback->GetVolumeSize(Streams.Size(), &subStream.Size));
- RINOK(VolumeCallback->GetVolumeStream(Streams.Size(), &subStream.Stream));
- subStream.Pos = 0;
- Streams.Add(subStream);
- continue;
- }
- CSubStreamInfo &subStream = Streams[_streamIndex];
- if (_offsetPos >= subStream.Size)
- {
- _offsetPos -= subStream.Size;
- _streamIndex++;
- continue;
- }
- if (_offsetPos != subStream.Pos)
- {
- CMyComPtr<IOutStream> outStream;
- RINOK(subStream.Stream.QueryInterface(IID_IOutStream, &outStream));
- RINOK(outStream->Seek(_offsetPos, STREAM_SEEK_SET, NULL));
- subStream.Pos = _offsetPos;
- }
-
- UInt32 curSize = (UInt32)MyMin((UInt64)size, subStream.Size - subStream.Pos);
- UInt32 realProcessed;
- RINOK(subStream.Stream->Write(data, curSize, &realProcessed));
- data = (void *)((Byte *)data + realProcessed);
- size -= realProcessed;
- subStream.Pos += realProcessed;
- _offsetPos += realProcessed;
- _absPos += realProcessed;
- if (_absPos > _length)
- _length = _absPos;
- if (processedSize != NULL)
- *processedSize += realProcessed;
- if (subStream.Pos == subStream.Size)
- {
- _streamIndex++;
- _offsetPos = 0;
- }
- if (realProcessed != curSize && realProcessed == 0)
- return E_FAIL;
- }
- return S_OK;
-}
-
-STDMETHODIMP COutMultiStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: offset += _absPos; break;
- case STREAM_SEEK_END: offset += _length; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (offset < 0)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- _absPos = offset;
- _offsetPos = _absPos;
- _streamIndex = 0;
- if (newPosition)
- *newPosition = offset;
- return S_OK;
-}
-*/
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/MultiStream.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/MultiStream.h
deleted file mode 100644
index 93aff33bf..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/MultiStream.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// MultiStream.h
-
-#ifndef __MULTI_STREAM_H
-#define __MULTI_STREAM_H
-
-#include "../../../Common/MyCom.h"
-#include "../../../Common/MyVector.h"
-
-#include "../../IStream.h"
-
-class CMultiStream:
- public IInStream,
- public CMyUnknownImp
-{
- UInt64 _pos;
- UInt64 _totalLength;
- unsigned _streamIndex;
-
-public:
-
- struct CSubStreamInfo
- {
- CMyComPtr<IInStream> Stream;
- UInt64 Size;
- UInt64 GlobalOffset;
- UInt64 LocalPos;
-
- CSubStreamInfo(): Size(0), GlobalOffset(0), LocalPos(0) {}
- };
-
- CObjectVector<CSubStreamInfo> Streams;
-
- HRESULT Init()
- {
- UInt64 total = 0;
- FOR_VECTOR (i, Streams)
- {
- CSubStreamInfo &s = Streams[i];
- s.GlobalOffset = total;
- total += Streams[i].Size;
- RINOK(s.Stream->Seek(0, STREAM_SEEK_CUR, &s.LocalPos));
- }
- _totalLength = total;
- _pos = 0;
- _streamIndex = 0;
- return S_OK;
- }
-
- MY_UNKNOWN_IMP1(IInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-
-/*
-class COutMultiStream:
- public IOutStream,
- public CMyUnknownImp
-{
- unsigned _streamIndex; // required stream
- UInt64 _offsetPos; // offset from start of _streamIndex index
- UInt64 _absPos;
- UInt64 _length;
-
- struct CSubStreamInfo
- {
- CMyComPtr<ISequentialOutStream> Stream;
- UInt64 Size;
- UInt64 Pos;
- };
- CObjectVector<CSubStreamInfo> Streams;
-public:
- CMyComPtr<IArchiveUpdateCallback2> VolumeCallback;
- void Init()
- {
- _streamIndex = 0;
- _offsetPos = 0;
- _absPos = 0;
- _length = 0;
- }
-
- MY_UNKNOWN_IMP1(IOutStream)
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-*/
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp
deleted file mode 100644
index f955c2254..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// OutStreamWithCRC.cpp
-
-#include "StdAfx.h"
-
-#include "OutStreamWithCRC.h"
-
-STDMETHODIMP COutStreamWithCRC::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- HRESULT result = S_OK;
- if (_stream)
- result = _stream->Write(data, size, &size);
- if (_calculate)
- _crc = CrcUpdate(_crc, data, size);
- _size += size;
- if (processedSize != NULL)
- *processedSize = size;
- return result;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithCRC.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithCRC.h
deleted file mode 100644
index 09b899bbd..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/OutStreamWithCRC.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// OutStreamWithCRC.h
-
-#ifndef __OUT_STREAM_WITH_CRC_H
-#define __OUT_STREAM_WITH_CRC_H
-
-#include "../../../../C/7zCrc.h"
-
-#include "../../../Common/MyCom.h"
-
-#include "../../IStream.h"
-
-class COutStreamWithCRC:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialOutStream> _stream;
- UInt64 _size;
- UInt32 _crc;
- 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;
- _crc = CRC_INIT_VAL;
- }
- void EnableCalc(bool calculate) { _calculate = calculate; }
- void InitCRC() { _crc = CRC_INIT_VAL; }
- UInt64 GetSize() const { return _size; }
- UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/ParseProperties.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/ParseProperties.h
deleted file mode 100644
index 1038a8c02..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/ParseProperties.h
+++ /dev/null
@@ -1,6 +0,0 @@
-// ParseProperties.h
-
-#ifndef __PARSE_PROPERTIES_H
-#define __PARSE_PROPERTIES_H
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Common/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Common/StdAfx.h
deleted file mode 100644
index 2854ff3e9..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/Common/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/Common.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/IArchive.h b/src/libs/7zip/win/CPP/7zip/Archive/IArchive.h
deleted file mode 100644
index a15a97f16..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/IArchive.h
+++ /dev/null
@@ -1,476 +0,0 @@
-// IArchive.h
-
-#ifndef __IARCHIVE_H
-#define __IARCHIVE_H
-
-#include "../IProgress.h"
-#include "../IStream.h"
-#include "../PropID.h"
-
-#define ARCHIVE_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 6, x)
-#define ARCHIVE_INTERFACE(i, x) ARCHIVE_INTERFACE_SUB(i, IUnknown, x)
-
-namespace NFileTimeType
-{
- enum EEnum
- {
- kWindows,
- kUnix,
- kDOS
- };
-}
-
-namespace NArcInfoFlags
-{
- const UInt32 kKeepName = 1 << 0; // keep name of file in archive name
- const UInt32 kAltStreams = 1 << 1; // the handler supports alt streams
- const UInt32 kNtSecure = 1 << 2; // the handler supports NT security
- const UInt32 kFindSignature = 1 << 3; // the handler can find start of archive
- const UInt32 kMultiSignature = 1 << 4; // there are several signatures
- const UInt32 kUseGlobalOffset = 1 << 5; // the seek position of stream must be set as global offset
- const UInt32 kStartOpen = 1 << 6; // call handler for each start position
- const UInt32 kPureStartOpen = 1 << 7; // call handler only for start of file
- const UInt32 kBackwardOpen = 1 << 8; // archive can be open backward
- const UInt32 kPreArc = 1 << 9; // such archive can be stored before real archive (like SFX stub)
- const UInt32 kSymLinks = 1 << 10; // the handler supports symbolic links
- const UInt32 kHardLinks = 1 << 11; // the handler supports hard links
-}
-
-namespace NArchive
-{
- namespace NHandlerPropID
- {
- enum
- {
- kName = 0, // VT_BSTR
- kClassID, // binary GUID in VT_BSTR
- kExtension, // VT_BSTR
- kAddExtension, // VT_BSTR
- kUpdate, // VT_BOOL
- kKeepName, // VT_BOOL
- kSignature, // binary in VT_BSTR
- kMultiSignature, // binary in VT_BSTR
- kSignatureOffset, // VT_UI4
- kAltStreams, // VT_BOOL
- kNtSecure, // VT_BOOL
- kFlags // VT_UI4
- // kVersion // VT_UI4 ((VER_MAJOR << 8) | VER_MINOR)
- };
- }
-
- namespace NExtract
- {
- namespace NAskMode
- {
- enum
- {
- kExtract = 0,
- kTest,
- kSkip
- };
- }
-
- namespace NOperationResult
- {
- enum
- {
- kOK = 0,
- kUnsupportedMethod,
- kDataError,
- kCRCError,
- kUnavailable,
- kUnexpectedEnd,
- kDataAfterEnd,
- kIsNotArc,
- kHeadersError
- };
- }
- }
-
- namespace NUpdate
- {
- namespace NOperationResult
- {
- enum
- {
- kOK = 0
- , // kError
- };
- }
- }
-}
-
-#define INTERFACE_IArchiveOpenCallback(x) \
- STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes) x; \
- STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes) x; \
-
-ARCHIVE_INTERFACE(IArchiveOpenCallback, 0x10)
-{
- INTERFACE_IArchiveOpenCallback(PURE);
-};
-
-/*
-IArchiveExtractCallback::GetStream
- Result:
- (*inStream == NULL) - for directories
- (*inStream == NULL) - if link (hard link or symbolic link) was created
-*/
-
-#define INTERFACE_IArchiveExtractCallback(x) \
- INTERFACE_IProgress(x) \
- STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode) x; \
- STDMETHOD(PrepareOperation)(Int32 askExtractMode) x; \
- STDMETHOD(SetOperationResult)(Int32 resultEOperationResult) x; \
-
-ARCHIVE_INTERFACE_SUB(IArchiveExtractCallback, IProgress, 0x20)
-{
- INTERFACE_IArchiveExtractCallback(PURE)
-};
-
-
-#define INTERFACE_IArchiveOpenVolumeCallback(x) \
- STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value) x; \
- STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream) x; \
-
-ARCHIVE_INTERFACE(IArchiveOpenVolumeCallback, 0x30)
-{
- INTERFACE_IArchiveOpenVolumeCallback(PURE);
-};
-
-
-ARCHIVE_INTERFACE(IInArchiveGetStream, 0x40)
-{
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream) PURE;
-};
-
-
-ARCHIVE_INTERFACE(IArchiveOpenSetSubArchiveName, 0x50)
-{
- STDMETHOD(SetSubArchiveName)(const wchar_t *name) PURE;
-};
-
-
-/*
-IInArchive::Open
- stream
- if (kUseGlobalOffset), stream current position can be non 0.
- if (!kUseGlobalOffset), stream current position is 0.
- if (maxCheckStartPosition == NULL), the handler can try to search archive start in stream
- if (*maxCheckStartPosition == 0), the handler must check only current position as archive start
-
-IInArchive::Extract:
- indices must be sorted
- numItems = (UInt32)(Int32)-1 = 0xFFFFFFFF means "all files"
- testMode != 0 means "test files without writing to outStream"
-
-IInArchive::GetArchiveProperty:
- kpidOffset - start offset of archive.
- VT_EMPTY : means offset = 0.
- VT_UI4, VT_UI8, VT_I8 : result offset; negative values is allowed
- kpidPhySize - size of archive. VT_EMPTY means unknown size.
- kpidPhySize is allowed to be larger than file size. In that case it must show
- supposed size.
-
- kpidIsDeleted:
- kpidIsAltStream:
- kpidIsAux:
- kpidINode:
- must return VARIANT_TRUE (VT_BOOL), if archive can support that property in GetProperty.
-
-
-Notes:
- Don't call IInArchive functions for same IInArchive object from different threads simultaneously.
- Some IInArchive handlers will work incorrectly in that case.
-*/
-
-/* MSVC allows the code where there is throw() in declaration of function,
- but there is no throw() in definition of function. */
-
-#ifdef _MSC_VER
- #define MY_NO_THROW_DECL_ONLY throw()
-#else
- #define MY_NO_THROW_DECL_ONLY
-#endif
-
-#define INTERFACE_IInArchive(x) \
- STDMETHOD(Open)(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openCallback) MY_NO_THROW_DECL_ONLY x; \
- STDMETHOD(Close)() MY_NO_THROW_DECL_ONLY x; \
- STDMETHOD(GetNumberOfItems)(UInt32 *numItems) MY_NO_THROW_DECL_ONLY x; \
- STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) MY_NO_THROW_DECL_ONLY x; \
- STDMETHOD(Extract)(const UInt32* indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback) MY_NO_THROW_DECL_ONLY x; \
- STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value) MY_NO_THROW_DECL_ONLY x; \
- STDMETHOD(GetNumberOfProperties)(UInt32 *numProps) MY_NO_THROW_DECL_ONLY x; \
- STDMETHOD(GetPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) MY_NO_THROW_DECL_ONLY x; \
- STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProps) MY_NO_THROW_DECL_ONLY x; \
- STDMETHOD(GetArchivePropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) MY_NO_THROW_DECL_ONLY x;
-
-ARCHIVE_INTERFACE(IInArchive, 0x60)
-{
- INTERFACE_IInArchive(PURE)
-};
-
-namespace NParentType
-{
- enum
- {
- kDir = 0,
- kAltStream
- };
-};
-
-namespace NPropDataType
-{
- const UInt32 kMask_ZeroEnd = 1 << 4;
- // const UInt32 kMask_BigEndian = 1 << 5;
- const UInt32 kMask_Utf = 1 << 6;
- // const UInt32 kMask_Utf8 = kMask_Utf | 0;
- const UInt32 kMask_Utf16 = kMask_Utf | 1;
- // const UInt32 kMask_Utf32 = kMask_Utf | 2;
-
- const UInt32 kNotDefined = 0;
- const UInt32 kRaw = 1;
- const UInt32 kUtf16z = kMask_Utf16 | kMask_ZeroEnd;
-};
-
-// UTF string (pointer to wchar_t) with zero end and little-endian.
-#define PROP_DATA_TYPE_wchar_t_PTR_Z_LE ((NPropDataType::kMask_Utf | NPropDataType::kMask_ZeroEnd) + (sizeof(wchar_t) >> 1))
-
-/*
-GetRawProp:
- Result:
- S_OK - even if property is not set
-*/
-
-#define INTERFACE_IArchiveGetRawProps(x) \
- STDMETHOD(GetParent)(UInt32 index, UInt32 *parent, UInt32 *parentType) x; \
- STDMETHOD(GetRawProp)(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType) x; \
- STDMETHOD(GetNumRawProps)(UInt32 *numProps) x; \
- STDMETHOD(GetRawPropInfo)(UInt32 index, BSTR *name, PROPID *propID) x;
-
-ARCHIVE_INTERFACE(IArchiveGetRawProps, 0x70)
-{
- INTERFACE_IArchiveGetRawProps(PURE)
-};
-
-#define INTERFACE_IArchiveGetRootProps(x) \
- STDMETHOD(GetRootProp)(PROPID propID, PROPVARIANT *value) x; \
- STDMETHOD(GetRootRawProp)(PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType) x; \
-
-ARCHIVE_INTERFACE(IArchiveGetRootProps, 0x71)
-{
- INTERFACE_IArchiveGetRootProps(PURE)
-};
-
-ARCHIVE_INTERFACE(IArchiveOpenSeq, 0x61)
-{
- STDMETHOD(OpenSeq)(ISequentialInStream *stream) PURE;
-};
-
-/*
- OpenForSize
- Result:
- S_FALSE - is not archive
- ? - DATA error
-*/
-
-/*
-const UInt32 kOpenFlags_RealPhySize = 1 << 0;
-const UInt32 kOpenFlags_NoSeek = 1 << 1;
-// const UInt32 kOpenFlags_BeforeExtract = 1 << 2;
-*/
-
-/*
-Flags:
- 0 - opens archive with IInStream, if IInStream interface is supported
- - if phySize is not available, it doesn't try to make full parse to get phySize
- kOpenFlags_NoSeek - ArcOpen2 function doesn't use IInStream interface, even if it's available
- kOpenFlags_RealPhySize - the handler will try to get PhySize, even if it requires full decompression for file
-
- if handler is not allowed to use IInStream and the flag kOpenFlags_RealPhySize is not specified,
- the handler can return S_OK, but it doesn't check even Signature.
- So next Extract can be called for that sequential stream.
-*/
-
-/*
-ARCHIVE_INTERFACE(IArchiveOpen2, 0x62)
-{
- STDMETHOD(ArcOpen2)(ISequentialInStream *stream, UInt32 flags, IArchiveOpenCallback *openCallback) PURE;
-};
-*/
-
-// ---------- UPDATE ----------
-
-/*
-GetUpdateItemInfo outs:
-*newData *newProps
- 0 0 - Copy data and properties from archive
- 0 1 - Copy data from archive, request new properties
- 1 0 - that combination is unused now
- 1 1 - Request new data and new properties. It can be used even for folders
-
- indexInArchive = -1 if there is no item in archive, or if it doesn't matter.
-
-
-GetStream out:
- Result:
- S_OK:
- (*inStream == NULL) - only for directories
- - the bug was fixed in 9.33: (*Stream == NULL) was in case of anti-file
- (*inStream != NULL) - for any file, even for empty file or anti-file
- S_FALSE - skip that file (don't add item to archive) - (client code can't open stream of that file by some reason)
- (*inStream == NULL)
-
-The order of calling for hard links:
- - GetStream()
- - GetProperty(kpidHardLink)
-
-*/
-
-#define INTERFACE_IArchiveUpdateCallback(x) \
- INTERFACE_IProgress(x); \
- STDMETHOD(GetUpdateItemInfo)(UInt32 index, Int32 *newData, Int32 *newProps, UInt32 *indexInArchive) x; \
- STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream) x; \
- STDMETHOD(SetOperationResult)(Int32 operationResult) x; \
-
-ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback, IProgress, 0x80)
-{
- INTERFACE_IArchiveUpdateCallback(PURE);
-};
-
-#define INTERFACE_IArchiveUpdateCallback2(x) \
- INTERFACE_IArchiveUpdateCallback(x) \
- STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size) x; \
- STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream) x; \
-
-ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback2, IArchiveUpdateCallback, 0x82)
-{
- INTERFACE_IArchiveUpdateCallback2(PURE);
-};
-
-/*
-UpdateItems()
--------------
-
- outStream: output stream. (the handler) MUST support the case when
- Seek position in outStream is not ZERO.
- but the caller calls with empty outStream and seek position is ZERO??
-
- archives with stub:
-
- If archive is open and the handler and (Offset > 0), then the handler
- knows about stub size.
- UpdateItems():
- 1) the handler MUST copy that stub to outStream
- 2) the caller MUST NOT copy the stub to outStream, if
- "rsfx" property is set with SetProperties
-
- the handler must support the case where
- ISequentialOutStream *outStream
-*/
-
-
-#define INTERFACE_IOutArchive(x) \
- STDMETHOD(UpdateItems)(ISequentialOutStream *outStream, UInt32 numItems, IArchiveUpdateCallback *updateCallback) x; \
- STDMETHOD(GetFileTimeType)(UInt32 *type) x;
-
-ARCHIVE_INTERFACE(IOutArchive, 0xA0)
-{
- INTERFACE_IOutArchive(PURE)
-};
-
-
-ARCHIVE_INTERFACE(ISetProperties, 0x03)
-{
- STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps) PURE;
-};
-
-ARCHIVE_INTERFACE(IArchiveKeepModeForNextOpen, 0x04)
-{
- STDMETHOD(KeepModeForNextOpen)() PURE;
-};
-
-/* Exe handler: the handler for executable format (PE, ELF, Mach-O).
- SFX archive: executable stub + some tail data.
- before 9.31: exe handler didn't parse SFX archives as executable format.
- for 9.31+: exe handler parses SFX archives as executable format, only if AllowTail(1) was called */
-
-ARCHIVE_INTERFACE(IArchiveAllowTail, 0x05)
-{
- STDMETHOD(AllowTail)(Int32 allowTail) PURE;
-};
-
-
-#define IMP_IInArchive_GetProp(k) \
- (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \
- { if (index >= ARRAY_SIZE(k)) return E_INVALIDARG; \
- *propID = k[index]; *varType = k7z_PROPID_To_VARTYPE[(unsigned)*propID]; *name = 0; return S_OK; } \
-
-#define IMP_IInArchive_GetProp_WITH_NAME(k) \
- (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \
- { if (index >= ARRAY_SIZE(k)) return E_INVALIDARG; \
- const STATPROPSTG &srcItem = k[index]; \
- *propID = srcItem.propid; *varType = srcItem.vt; \
- if (srcItem.lpwstrName == 0) *name = 0; else *name = ::SysAllocString(srcItem.lpwstrName); return S_OK; } \
-
-#define IMP_IInArchive_Props \
- STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProps) \
- { *numProps = ARRAY_SIZE(kProps); return S_OK; } \
- STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp(kProps)
-
-#define IMP_IInArchive_Props_WITH_NAME \
- STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProps) \
- { *numProps = ARRAY_SIZE(kProps); return S_OK; } \
- STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kProps)
-
-
-#define IMP_IInArchive_ArcProps \
- STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProps) \
- { *numProps = ARRAY_SIZE(kArcProps); return S_OK; } \
- STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp(kArcProps)
-
-#define IMP_IInArchive_ArcProps_WITH_NAME \
- STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProps) \
- { *numProps = ARRAY_SIZE(kArcProps); return S_OK; } \
- STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kArcProps)
-
-#define IMP_IInArchive_ArcProps_NO_Table \
- STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProps) \
- { *numProps = 0; return S_OK; } \
- STDMETHODIMP CHandler::GetArchivePropertyInfo(UInt32, BSTR *, PROPID *, VARTYPE *) \
- { return E_NOTIMPL; } \
-
-#define IMP_IInArchive_ArcProps_NO \
- IMP_IInArchive_ArcProps_NO_Table \
- STDMETHODIMP CHandler::GetArchiveProperty(PROPID, PROPVARIANT *value) \
- { value->vt = VT_EMPTY; return S_OK; }
-
-
-
-#define k_IsArc_Res_NO 0
-#define k_IsArc_Res_YES 1
-#define k_IsArc_Res_NEED_MORE 2
-// #define k_IsArc_Res_YES_LOW_PROB 3
-
-#define API_FUNC_IsArc EXTERN_C UInt32 WINAPI
-#define API_FUNC_static_IsArc extern "C" { static UInt32 WINAPI
-
-extern "C"
-{
- typedef HRESULT (WINAPI *Func_CreateObject)(const GUID *clsID, const GUID *iid, void **outObject);
-
- typedef UInt32 (WINAPI *Func_IsArc)(const Byte *p, size_t size);
- typedef HRESULT (WINAPI *Func_GetIsArc)(UInt32 formatIndex, Func_IsArc *isArc);
-
- typedef HRESULT (WINAPI *Func_GetNumberOfFormats)(UInt32 *numFormats);
- typedef HRESULT (WINAPI *Func_GetHandlerProperty)(PROPID propID, PROPVARIANT *value);
- typedef HRESULT (WINAPI *Func_GetHandlerProperty2)(UInt32 index, PROPID propID, PROPVARIANT *value);
-
- typedef HRESULT (WINAPI *Func_SetCaseSensitive)(Int32 caseSensitive);
- typedef HRESULT (WINAPI *Func_SetLargePageMode)();
-
- typedef IOutArchive * (*Func_CreateOutArchive)();
- typedef IInArchive * (*Func_CreateInArchive)();
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/LzmaHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/LzmaHandler.cpp
deleted file mode 100644
index 279cdefb7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/LzmaHandler.cpp
+++ /dev/null
@@ -1,604 +0,0 @@
-// LzmaHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/CpuArch.h"
-
-#include "../../Common/ComTry.h"
-#include "../../Common/IntToString.h"
-
-#include "../../Windows/PropVariant.h"
-
-#include "../Common/CreateCoder.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/LzmaDecoder.h"
-
-#include "Common/DummyOutStream.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NLzma {
-
-static bool CheckDicSize(const Byte *p)
-{
- UInt32 dicSize = GetUi32(p);
- if (dicSize == 1)
- return true;
- for (unsigned i = 0; i <= 30; i++)
- if (dicSize == ((UInt32)2 << i) || dicSize == ((UInt32)3 << i))
- return true;
- return (dicSize == 0xFFFFFFFF);
-}
-
-static const Byte kProps[] =
-{
- kpidSize,
- kpidPackSize,
- kpidMethod
-};
-
-static const Byte kArcProps[] =
-{
- kpidNumStreams
-};
-
-struct CHeader
-{
- UInt64 Size;
- Byte FilterID;
- Byte LzmaProps[5];
-
- UInt32 GetDicSize() const { return GetUi32(LzmaProps + 1); }
- bool HasSize() const { return (Size != (UInt64)(Int64)-1); }
- bool Parse(const Byte *buf, bool isThereFilter);
-};
-
-bool CHeader::Parse(const Byte *buf, bool isThereFilter)
-{
- FilterID = 0;
- if (isThereFilter)
- FilterID = buf[0];
- const Byte *sig = buf + (isThereFilter ? 1 : 0);
- for (int i = 0; i < 5; i++)
- LzmaProps[i] = sig[i];
- Size = GetUi64(sig + 5);
- return
- LzmaProps[0] < 5 * 5 * 9 &&
- FilterID < 2 &&
- (!HasSize() || Size < ((UInt64)1 << 56))
- && CheckDicSize(LzmaProps + 1);
-}
-
-class CDecoder
-{
- CMyComPtr<ICompressCoder> _lzmaDecoder;
- CMyComPtr<ISequentialOutStream> _bcjStream;
-public:
- NCompress::NLzma::CDecoder *_lzmaDecoderSpec;
-
- ~CDecoder();
- HRESULT Create(DECL_EXTERNAL_CODECS_LOC_VARS
- bool filtered, ISequentialInStream *inStream);
-
- HRESULT Code(const CHeader &header, ISequentialOutStream *outStream, ICompressProgressInfo *progress);
-
- UInt64 GetInputProcessedSize() const { return _lzmaDecoderSpec->GetInputProcessedSize(); }
-
- void ReleaseInStream() { if (_lzmaDecoder) _lzmaDecoderSpec->ReleaseInStream(); }
-
- HRESULT ReadInput(Byte *data, UInt32 size, UInt32 *processedSize)
- { return _lzmaDecoderSpec->ReadFromInputStream(data, size, processedSize); }
-};
-
-static const UInt32 k_BCJ = 0x03030103;
-
-HRESULT CDecoder::Create(
- DECL_EXTERNAL_CODECS_LOC_VARS
- bool filteredMode, ISequentialInStream *inStream)
-{
- if (!_lzmaDecoder)
- {
- _lzmaDecoderSpec = new NCompress::NLzma::CDecoder;
- _lzmaDecoderSpec->FinishStream = true;
- _lzmaDecoder = _lzmaDecoderSpec;
- }
-
- if (filteredMode)
- {
- if (!_bcjStream)
- {
- CMyComPtr<ICompressCoder> coder;
- RINOK(CreateCoder(EXTERNAL_CODECS_LOC_VARS k_BCJ, coder, false));
- if (!coder)
- return E_NOTIMPL;
- coder.QueryInterface(IID_ISequentialOutStream, &_bcjStream);
- if (!_bcjStream)
- return E_NOTIMPL;
- }
- }
-
- return _lzmaDecoderSpec->SetInStream(inStream);
-}
-
-CDecoder::~CDecoder()
-{
- ReleaseInStream();
-}
-
-HRESULT CDecoder::Code(const CHeader &header, ISequentialOutStream *outStream,
- ICompressProgressInfo *progress)
-{
- if (header.FilterID > 1)
- return E_NOTIMPL;
-
- {
- CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;
- _lzmaDecoder.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties);
- if (!setDecoderProperties)
- return E_NOTIMPL;
- RINOK(setDecoderProperties->SetDecoderProperties2(header.LzmaProps, 5));
- }
-
- CMyComPtr<ICompressSetOutStream> setOutStream;
-
- bool filteredMode = (header.FilterID == 1);
-
- if (filteredMode)
- {
- _bcjStream.QueryInterface(IID_ICompressSetOutStream, &setOutStream);
- if (!setOutStream)
- return E_NOTIMPL;
- RINOK(setOutStream->SetOutStream(outStream));
- outStream = _bcjStream;
- }
-
- const UInt64 *Size = header.HasSize() ? &header.Size : NULL;
- HRESULT res = _lzmaDecoderSpec->CodeResume(outStream, Size, progress);
-
- if (filteredMode)
- {
- CMyComPtr<IOutStreamFlush> flush;
- _bcjStream.QueryInterface(IID_IOutStreamFlush, &flush);
- if (flush)
- {
- HRESULT res2 = flush->Flush();
- if (res == S_OK)
- res = res2;
- }
- HRESULT res2 = setOutStream->ReleaseOutStream();
- if (res == S_OK)
- res = res2;
- }
- RINOK(res);
-
- if (header.HasSize())
- if (_lzmaDecoderSpec->GetOutputProcessedSize() != header.Size)
- return S_FALSE;
-
- return S_OK;
-}
-
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- PUBLIC_ISetCompressCodecsInfo
- public CMyUnknownImp
-{
- CHeader _header;
- bool _lzma86;
- CMyComPtr<IInStream> _stream;
- CMyComPtr<ISequentialInStream> _seqStream;
-
- bool _isArc;
- bool _needSeekToStart;
- bool _dataAfterEnd;
- bool _needMoreInput;
-
- bool _packSize_Defined;
- bool _unpackSize_Defined;
- bool _numStreams_Defined;
-
- bool _unsupported;
- bool _dataError;
-
- UInt64 _packSize;
- UInt64 _unpackSize;
- UInt64 _numStreams;
-
- DECL_EXTERNAL_CODECS_VARS
- DECL_ISetCompressCodecsInfo
-
-public:
- MY_QUERYINTERFACE_BEGIN2(IInArchive)
- MY_QUERYINTERFACE_ENTRY(IArchiveOpenSeq)
- QUERY_ENTRY_ISetCompressCodecsInfo
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- INTERFACE_IInArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
-
- CHandler(bool lzma86) { _lzma86 = lzma86; }
-
- unsigned GetHeaderSize() const { return 5 + 8 + (_lzma86 ? 1 : 0); }
-
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch (propID)
- {
- case kpidPhySize: if (_packSize_Defined) prop = _packSize; break;
- case kpidNumStreams: if (_numStreams_Defined) prop = _numStreams; break;
- case kpidUnpackSize: if (_unpackSize_Defined) prop = _unpackSize; break;
- case kpidErrorFlags:
- {
- UInt32 v = 0;
- if (!_isArc) v |= kpv_ErrorFlags_IsNotArc;;
- if (_needMoreInput) v |= kpv_ErrorFlags_UnexpectedEnd;
- if (_dataAfterEnd) v |= kpv_ErrorFlags_DataAfterEnd;
- if (_unsupported) v |= kpv_ErrorFlags_UnsupportedMethod;
- if (_dataError) v |= kpv_ErrorFlags_DataError;
- prop = v;
- }
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-static void DictSizeToString(UInt32 value, char *s)
-{
- for (int i = 0; i <= 31; i++)
- if (((UInt32)1 << i) == value)
- {
- ::ConvertUInt32ToString(i, s);
- return;
- }
- char c = 'b';
- if ((value & ((1 << 20) - 1)) == 0) { value >>= 20; c = 'm'; }
- else if ((value & ((1 << 10) - 1)) == 0) { value >>= 10; c = 'k'; }
- ::ConvertUInt32ToString(value, s);
- s += MyStringLen(s);
- *s++ = c;
- *s = 0;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch (propID)
- {
- case kpidSize: if (_stream && _header.HasSize()) prop = _header.Size; break;
- case kpidPackSize: if (_packSize_Defined) prop = _packSize; break;
- case kpidMethod:
- if (_stream)
- {
- char sz[64];
- char *s = sz;
- if (_header.FilterID != 0)
- s = MyStpCpy(s, "BCJ ");
- s = MyStpCpy(s, "LZMA:");
- DictSizeToString(_header.GetDicSize(), s);
- prop = sz;
- }
- break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-API_FUNC_static_IsArc IsArc_Lzma(const Byte *p, size_t size)
-{
- const UInt32 kHeaderSize = 1 + 4 + 8;
- if (size < kHeaderSize)
- return k_IsArc_Res_NEED_MORE;
- if (p[0] >= 5 * 5 * 9)
- return k_IsArc_Res_NO;
- UInt64 unpackSize = GetUi64(p + 1 + 4);
- if (unpackSize != (UInt64)(Int64)-1)
- {
- if (size >= ((UInt64)1 << 56))
- return k_IsArc_Res_NO;
- }
- if (unpackSize != 0)
- {
- if (size < kHeaderSize + 2)
- return k_IsArc_Res_NEED_MORE;
- if (p[kHeaderSize] != 0)
- return k_IsArc_Res_NO;
- if (unpackSize != (UInt64)(Int64)-1)
- {
- if ((p[kHeaderSize + 1] & 0x80) != 0)
- return k_IsArc_Res_NO;
- }
- }
- if (!CheckDicSize(p + 1))
- // return k_IsArc_Res_YES_LOW_PROB;
- return k_IsArc_Res_NO;
- return k_IsArc_Res_YES;
-}
-}
-
-API_FUNC_static_IsArc IsArc_Lzma86(const Byte *p, size_t size)
-{
- if (size < 1)
- return k_IsArc_Res_NEED_MORE;
- Byte filterID = p[0];
- if (filterID != 0 && filterID != 1)
- return k_IsArc_Res_NO;
- return IsArc_Lzma(p + 1, size - 1);
-}
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *)
-{
- Close();
-
- const UInt32 kBufSize = 1 + 5 + 8 + 2;
- Byte buf[kBufSize];
-
- RINOK(ReadStream_FALSE(inStream, buf, kBufSize));
-
- if (!_header.Parse(buf, _lzma86))
- return S_FALSE;
- const Byte *start = buf + GetHeaderSize();
- if (start[0] != 0 /* || (start[1] & 0x80) != 0 */ ) // empty stream with EOS is not 0x80
- return S_FALSE;
-
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &_packSize));
- if (_packSize >= 24 && _header.Size == 0 && _header.FilterID == 0 && _header.LzmaProps[0] == 0)
- return S_FALSE;
- _isArc = true;
- _stream = inStream;
- _seqStream = inStream;
- _needSeekToStart = true;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- Close();
- _isArc = true;
- _seqStream = stream;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _isArc = false;
- _packSize_Defined = false;
- _unpackSize_Defined = false;
- _numStreams_Defined = false;
-
- _dataAfterEnd = false;
- _needMoreInput = false;
- _unsupported = false;
- _dataError = false;
-
- _packSize = 0;
-
- _needSeekToStart = false;
-
- _stream.Release();
- _seqStream.Release();
- return S_OK;
-}
-
-class CCompressProgressInfoImp:
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
- CMyComPtr<IArchiveOpenCallback> Callback;
-public:
- UInt64 Offset;
-
- MY_UNKNOWN_IMP1(ICompressProgressInfo)
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
- void Init(IArchiveOpenCallback *callback) { Callback = callback; }
-};
-
-STDMETHODIMP CCompressProgressInfoImp::SetRatioInfo(const UInt64 *inSize, const UInt64 * /* outSize */)
-{
- if (Callback)
- {
- UInt64 files = 0;
- UInt64 value = Offset + *inSize;
- return Callback->SetCompleted(&files, &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)(Int32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- if (_packSize_Defined)
- extractCallback->SetTotal(_packSize);
-
-
- 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);
-
- if (_needSeekToStart)
- {
- if (!_stream)
- return E_FAIL;
- RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
- else
- _needSeekToStart = true;
-
- CDecoder decoder;
- HRESULT result = decoder.Create(
- EXTERNAL_CODECS_VARS
- _lzma86, _seqStream);
- RINOK(result);
-
- bool firstItem = true;
-
- UInt64 packSize = 0;
- UInt64 unpackSize = 0;
- UInt64 numStreams = 0;
-
- bool dataAfterEnd = false;
-
- for (;;)
- {
- lps->InSize = packSize;
- lps->OutSize = unpackSize;
- RINOK(lps->SetCur());
-
- const UInt32 kBufSize = 1 + 5 + 8;
- Byte buf[kBufSize];
- const UInt32 headerSize = GetHeaderSize();
- UInt32 processed;
- RINOK(decoder.ReadInput(buf, headerSize, &processed));
- if (processed != headerSize)
- {
- if (processed != 0)
- dataAfterEnd = true;
- break;
- }
-
- CHeader st;
- if (!st.Parse(buf, _lzma86))
- {
- dataAfterEnd = true;
- break;
- }
- numStreams++;
- firstItem = false;
-
- result = decoder.Code(st, outStream, progress);
-
- packSize = decoder.GetInputProcessedSize();
- unpackSize = outStreamSpec->GetSize();
-
- if (result == E_NOTIMPL)
- {
- _unsupported = true;
- result = S_FALSE;
- break;
- }
- if (result == S_FALSE)
- break;
- RINOK(result);
- }
-
- if (firstItem)
- {
- _isArc = false;
- result = S_FALSE;
- }
- else if (result == S_OK || result == S_FALSE)
- {
- if (dataAfterEnd)
- _dataAfterEnd = true;
- else if (decoder._lzmaDecoderSpec->NeedMoreInput)
- _needMoreInput = true;
-
- _packSize = packSize;
- _unpackSize = unpackSize;
- _numStreams = numStreams;
-
- _packSize_Defined = true;
- _unpackSize_Defined = true;
- _numStreams_Defined = true;
- }
-
- Int32 opResult = NExtract::NOperationResult::kOK;
-
- if (!_isArc)
- opResult = NExtract::NOperationResult::kIsNotArc;
- else if (_needMoreInput)
- opResult = NExtract::NOperationResult::kUnexpectedEnd;
- else if (_unsupported)
- opResult = NExtract::NOperationResult::kUnsupportedMethod;
- else if (_dataAfterEnd)
- opResult = NExtract::NOperationResult::kDataAfterEnd;
- else if (result == S_FALSE)
- opResult = NExtract::NOperationResult::kDataError;
- else if (result == S_OK)
- opResult = NExtract::NOperationResult::kOK;
- else
- return result;
-
- outStream.Release();
- return extractCallback->SetOperationResult(opResult);
- COM_TRY_END
-}
-
-IMPL_ISetCompressCodecsInfo
-
-namespace NLzmaAr {
-
-IMP_CreateArcIn_2(CHandler(false))
-
-static CArcInfo g_ArcInfo =
- { "lzma", "lzma", 0, 0xA,
- 0, { 0 },
- // 2, { 0x5D, 0x00 },
- 0,
- NArcInfoFlags::kStartOpen |
- NArcInfoFlags::kKeepName,
- CreateArc, NULL,
- IsArc_Lzma };
-
-REGISTER_ARC(Lzma)
-
-}
-
-namespace NLzma86Ar {
-
-IMP_CreateArcIn_2(CHandler(true))
-
-static CArcInfo g_ArcInfo =
- { "lzma86", "lzma86", 0, 0xB,
- 0, { 0 },
- 0,
- NArcInfoFlags::kKeepName,
- CreateArc, NULL,
- IsArc_Lzma86 };
-
-REGISTER_ARC(Lzma86)
-
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/SplitHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/SplitHandler.cpp
deleted file mode 100644
index db9f49aa0..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/SplitHandler.cpp
+++ /dev/null
@@ -1,369 +0,0 @@
-// SplitHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/ComTry.h"
-#include "../../Common/MyString.h"
-
-#include "../../Windows/PropVariant.h"
-
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-
-#include "../Compress/CopyCoder.h"
-
-#include "Common/MultiStream.h"
-
-using namespace NWindows;
-
-namespace NArchive {
-namespace NSplit {
-
-static const Byte kProps[] =
-{
- kpidPath,
- kpidSize
-};
-
-static const Byte kArcProps[] =
-{
- kpidNumVolumes,
- kpidTotalPhySize
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
- CObjectVector<CMyComPtr<IInStream> > _streams;
- CRecordVector<UInt64> _sizes;
- UString _subName;
- UInt64 _totalSize;
-
- HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback);
-public:
- MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch (propID)
- {
- case kpidMainSubfile: prop = (UInt32)0; break;
- case kpidPhySize: if (!_sizes.IsEmpty()) prop = _sizes[0]; break;
- case kpidTotalPhySize: prop = _totalSize; break;
- case kpidNumVolumes: prop = (UInt32)_streams.Size(); break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-struct CSeqName
-{
- UString _unchangedPart;
- UString _changedPart;
- bool _splitStyle;
-
- UString GetNextName()
- {
- UString newName;
- if (_splitStyle)
- {
- int i;
- int numLetters = _changedPart.Len();
- for (i = numLetters - 1; i >= 0; i--)
- {
- wchar_t c = _changedPart[i];
- if (c == 'z')
- {
- newName.InsertAtFront('a');
- continue;
- }
- else if (c == 'Z')
- {
- newName.InsertAtFront('A');
- continue;
- }
- c++;
- if ((c == 'z' || c == 'Z') && i == 0)
- {
- _unchangedPart += c;
- wchar_t newChar = (c == 'z') ? L'a' : L'A';
- newName.Empty();
- numLetters++;
- for (int k = 0; k < numLetters; k++)
- newName += newChar;
- break;
- }
- newName.InsertAtFront(c);
- i--;
- for (; i >= 0; i--)
- newName.InsertAtFront(_changedPart[i]);
- break;
- }
- }
- else
- {
- int i;
- int numLetters = _changedPart.Len();
- for (i = numLetters - 1; i >= 0; i--)
- {
- wchar_t c = _changedPart[i];
- if (c == '9')
- {
- newName.InsertAtFront('0');
- if (i == 0)
- newName.InsertAtFront('1');
- continue;
- }
- c++;
- newName.InsertAtFront(c);
- i--;
- for (; i >= 0; i--)
- newName.InsertAtFront(_changedPart[i]);
- break;
- }
- }
- _changedPart = newName;
- return _unchangedPart + _changedPart;
- }
-};
-
-HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback)
-{
- Close();
- if (!callback)
- return S_FALSE;
-
- CMyComPtr<IArchiveOpenVolumeCallback> volumeCallback;
- callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&volumeCallback);
- if (!volumeCallback)
- return S_FALSE;
-
- UString name;
- {
- NCOM::CPropVariant prop;
- RINOK(volumeCallback->GetProperty(kpidName, &prop));
- if (prop.vt != VT_BSTR)
- return S_FALSE;
- name = prop.bstrVal;
- }
-
- int dotPos = name.ReverseFind('.');
- const UString prefix = name.Left(dotPos + 1);
- const UString ext = name.Ptr(dotPos + 1);
- UString ext2 = ext;
- ext2.MakeLower_Ascii();
-
- CSeqName seqName;
-
- unsigned numLetters = 2;
- bool splitStyle = false;
-
- if (ext2.Len() >= 2 && StringsAreEqual_Ascii(ext2.RightPtr(2), "aa"))
- {
- splitStyle = true;
- while (numLetters < ext2.Len())
- {
- if (ext2[ext2.Len() - numLetters - 1] != 'a')
- break;
- numLetters++;
- }
- }
- else if (ext.Len() >= 2 && StringsAreEqual_Ascii(ext2.RightPtr(2), "01"))
- {
- while (numLetters < ext2.Len())
- {
- if (ext2[ext2.Len() - numLetters - 1] != '0')
- break;
- numLetters++;
- }
- if (numLetters != ext.Len())
- return S_FALSE;
- }
- else
- return S_FALSE;
-
- seqName._unchangedPart = prefix + ext.Left(ext2.Len() - numLetters);
- seqName._changedPart = ext.RightPtr(numLetters);
- seqName._splitStyle = splitStyle;
-
- if (prefix.Len() < 1)
- _subName = L"file";
- else
- _subName.SetFrom(prefix, prefix.Len() - 1);
-
- UInt64 size;
- {
- NCOM::CPropVariant prop;
- RINOK(volumeCallback->GetProperty(kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- size = prop.uhVal.QuadPart;
- }
-
- _totalSize += size;
- _sizes.Add(size);
- _streams.Add(stream);
-
- {
- UInt64 numFiles = _streams.Size();
- RINOK(callback->SetCompleted(&numFiles, NULL));
- }
-
- for (;;)
- {
- const UString fullName = seqName.GetNextName();
- CMyComPtr<IInStream> nextStream;
- HRESULT result = volumeCallback->GetStream(fullName, &nextStream);
- if (result == S_FALSE)
- break;
- if (result != S_OK)
- return result;
- if (!stream)
- break;
- {
- NCOM::CPropVariant prop;
- RINOK(volumeCallback->GetProperty(kpidSize, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- size = prop.uhVal.QuadPart;
- }
- _totalSize += size;
- _sizes.Add(size);
- _streams.Add(nextStream);
- {
- UInt64 numFiles = _streams.Size();
- RINOK(callback->SetCompleted(&numFiles, NULL));
- }
- }
-
- if (_streams.Size() == 1)
- {
- if (splitStyle)
- return S_FALSE;
- }
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- HRESULT res = Open2(stream, callback);
- if (res != S_OK)
- Close();
- return res;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _totalSize = 0;
- _subName.Empty();
- _streams.Clear();
- _sizes.Clear();
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = _streams.IsEmpty() ? 0 : 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch (propID)
- {
- case kpidPath: prop = _subName; break;
- case kpidSize:
- case kpidPackSize:
- prop = _totalSize;
- 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)(Int32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- UInt64 currentTotalSize = 0;
- RINOK(extractCallback->SetTotal(_totalSize));
- 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);
-
- FOR_VECTOR (i, _streams)
- {
- lps->InSize = lps->OutSize = currentTotalSize;
- RINOK(lps->SetCur());
- IInStream *inStream = _streams[i];
- RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL));
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
- currentTotalSize += copyCoderSpec->TotalSize;
- }
- outStream.Release();
- return extractCallback->SetOperationResult(NExtract::NOperationResult::kOK);
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- if (index != 0)
- return E_INVALIDARG;
- *stream = 0;
- CMultiStream *streamSpec = new CMultiStream;
- CMyComPtr<ISequentialInStream> streamTemp = streamSpec;
- FOR_VECTOR (i, _streams)
- {
- CMultiStream::CSubStreamInfo subStreamInfo;
- subStreamInfo.Stream = _streams[i];
- subStreamInfo.Size = _sizes[i];
- streamSpec->Streams.Add(subStreamInfo);
- }
- streamSpec->Init();
- *stream = streamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-IMP_CreateArcIn
-
-static CArcInfo g_ArcInfo =
- { "Split", "001", 0, 0xEA,
- 0, { 0 },
- 0,
- 0,
- CreateArc };
-
-REGISTER_ARC(Split)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/StdAfx.h
deleted file mode 100644
index 1cbd7feae..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../Common/Common.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/XzHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/XzHandler.cpp
deleted file mode 100644
index 789f41a72..000000000
--- a/src/libs/7zip/win/CPP/7zip/Archive/XzHandler.cpp
+++ /dev/null
@@ -1,991 +0,0 @@
-// XzHandler.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-#include "../../../C/XzCrc64.h"
-#include "../../../C/XzEnc.h"
-
-#include "../../Common/ComTry.h"
-#include "../../Common/Defs.h"
-#include "../../Common/IntToString.h"
-
-#include "../ICoder.h"
-
-#include "../Common/CWrappers.h"
-#include "../Common/ProgressUtils.h"
-#include "../Common/RegisterArc.h"
-#include "../Common/StreamUtils.h"
-
-#include "../Compress/CopyCoder.h"
-
-#include "IArchive.h"
-
-#include "Common/HandlerOut.h"
-
-using namespace NWindows;
-
-namespace NCompress {
-namespace NLzma2 {
-
-HRESULT SetLzma2Prop(PROPID propID, const PROPVARIANT &prop, CLzma2EncProps &lzma2Props);
-
-}}
-
-static void *SzAlloc(void *, size_t size) { return MyAlloc(size); }
-static void SzFree(void *, void *address) { MyFree(address); }
-static ISzAlloc g_Alloc = { SzAlloc, SzFree };
-
-namespace NArchive {
-namespace NXz {
-
-struct CCrc64Gen { CCrc64Gen() { Crc64GenerateTable(); } } g_Crc64TableInit;
-
-static const wchar_t *k_LZMA2_Name = L"LZMA2";
-
-struct CStatInfo
-{
- UInt64 InSize;
- UInt64 OutSize;
- UInt64 PhySize;
-
- UInt64 NumStreams;
- UInt64 NumBlocks;
-
- bool UnpackSize_Defined;
-
- bool NumStreams_Defined;
- bool NumBlocks_Defined;
-
- bool IsArc;
- bool UnexpectedEnd;
- bool DataAfterEnd;
- bool Unsupported;
- bool HeadersError;
- bool DataError;
- bool CrcError;
-
- CStatInfo() { Clear(); }
-
- void Clear()
- {
- InSize = 0;
- OutSize = 0;
- PhySize = 0;
-
- NumStreams = 0;
- NumBlocks = 0;
-
- UnpackSize_Defined = false;
-
- NumStreams_Defined = false;
- NumBlocks_Defined = false;
-
- UnexpectedEnd = false;
- DataAfterEnd = false;
- Unsupported = false;
- HeadersError = false;
- DataError = false;
- CrcError = false;
- IsArc = false;
- }
-
-};
-
-struct IDecodeState: public CStatInfo
-{
- SRes DecodeRes;
-
- IDecodeState(): DecodeRes(SZ_OK) {}
- virtual HRESULT Progress() = 0;
-
- HRESULT Decode(ISequentialInStream *seqInStream, ISequentialOutStream *outStream);
-};
-
-struct CVirtProgress_To_LocalProgress: public IDecodeState
-{
- CLocalProgress *lps;
- CMyComPtr<ICompressProgressInfo> progress;
-
- HRESULT Progress();
-};
-
-HRESULT CVirtProgress_To_LocalProgress::Progress()
-{
- lps->InSize = InSize;
- lps->OutSize = OutSize;
- return lps->SetCur();
-}
-
-
-class CHandler:
- public IInArchive,
- public IArchiveOpenSeq,
- #ifndef EXTRACT_ONLY
- public IOutArchive,
- public ISetProperties,
- public CMultiMethodProps,
- #endif
- public CMyUnknownImp
-{
- CStatInfo _stat;
-
- bool _isArc;
- bool _needSeekToStart;
- bool _phySize_Defined;
-
- CMyComPtr<IInStream> _stream;
- CMyComPtr<ISequentialInStream> _seqStream;
-
- UInt32 _filterId;
- AString _methodsString;
-
- void Init()
- {
- _filterId = 0;
- CMultiMethodProps::Init();
- }
-
- HRESULT Open2(IInStream *inStream, /* UInt32 flags, */ IArchiveOpenCallback *callback);
-
- HRESULT Decode2(ISequentialInStream *seqInStream, ISequentialOutStream *outStream, IDecodeState &progress)
- {
- RINOK(progress.Decode(seqInStream, outStream));
- _stat = progress;
- _phySize_Defined = true;
- return S_OK;
- }
-
-public:
- MY_QUERYINTERFACE_BEGIN2(IInArchive)
- MY_QUERYINTERFACE_ENTRY(IArchiveOpenSeq)
- #ifndef EXTRACT_ONLY
- MY_QUERYINTERFACE_ENTRY(IOutArchive)
- MY_QUERYINTERFACE_ENTRY(ISetProperties)
- #endif
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- INTERFACE_IInArchive(;)
- STDMETHOD(OpenSeq)(ISequentialInStream *stream);
-
- #ifndef EXTRACT_ONLY
- INTERFACE_IOutArchive(;)
- STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps);
- #endif
-
- CHandler();
-};
-
-CHandler::CHandler()
-{
- Init();
-}
-
-static const Byte kProps[] =
-{
- kpidSize,
- kpidPackSize,
- kpidMethod
-};
-
-static const Byte kArcProps[] =
-{
- kpidMethod,
- kpidNumStreams,
- kpidNumBlocks
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-static inline char GetHex(unsigned value)
-{
- return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));
-}
-
-static inline void AddHexToString(AString &s, Byte value)
-{
- s += GetHex(value >> 4);
- s += GetHex(value & 0xF);
-}
-
-static void AddUInt32ToString(AString &s, UInt32 value)
-{
- char temp[16];
- ConvertUInt32ToString(value, temp);
- s += temp;
-}
-
-static void Lzma2PropToString(AString &s, unsigned prop)
-{
- char c = 0;
- UInt32 size;
- if ((prop & 1) == 0)
- size = prop / 2 + 12;
- else
- {
- c = 'k';
- size = (UInt32)(2 | (prop & 1)) << (prop / 2 + 1);
- if (prop > 17)
- {
- size >>= 10;
- c = 'm';
- }
- }
- AddUInt32ToString(s, size);
- if (c != 0)
- s += c;
-}
-
-struct CMethodNamePair
-{
- UInt32 Id;
- const char *Name;
-};
-
-static const CMethodNamePair g_NamePairs[] =
-{
- { XZ_ID_Subblock, "SB" },
- { XZ_ID_Delta, "Delta" },
- { XZ_ID_X86, "BCJ" },
- { XZ_ID_PPC, "PPC" },
- { XZ_ID_IA64, "IA64" },
- { XZ_ID_ARM, "ARM" },
- { XZ_ID_ARMT, "ARMT" },
- { XZ_ID_SPARC, "SPARC" },
- { XZ_ID_LZMA2, "LZMA2" }
-};
-
-static AString GetMethodString(const CXzFilter &f)
-{
- const char *p = NULL;
- for (unsigned i = 0; i < ARRAY_SIZE(g_NamePairs); i++)
- if (g_NamePairs[i].Id == f.id)
- {
- p = g_NamePairs[i].Name;
- break;
- }
- char temp[32];
- if (!p)
- {
- ::ConvertUInt64ToString(f.id, temp);
- p = temp;
- }
-
- AString s = p;
-
- if (f.propsSize > 0)
- {
- s += ':';
- if (f.id == XZ_ID_LZMA2 && f.propsSize == 1)
- Lzma2PropToString(s, f.props[0]);
- else if (f.id == XZ_ID_Delta && f.propsSize == 1)
- AddUInt32ToString(s, (UInt32)f.props[0] + 1);
- else
- {
- s += '[';
- for (UInt32 bi = 0; bi < f.propsSize; bi++)
- AddHexToString(s, f.props[bi]);
- s += ']';
- }
- }
- return s;
-}
-
-static void AddString(AString &dest, const AString &src)
-{
- if (!dest.IsEmpty())
- dest += ' ';
- dest += src;
-}
-
-static const char *kChecks[] =
-{
- "NoCheck"
- , "CRC32"
- , NULL
- , NULL
- , "CRC64"
- , NULL
- , NULL
- , NULL
- , NULL
- , NULL
- , "SHA256"
- , NULL
- , NULL
- , NULL
- , NULL
- , NULL
-};
-
-static AString GetCheckString(const CXzs &xzs)
-{
- size_t i;
- UInt32 mask = 0;
- for (i = 0; i < xzs.num; i++)
- mask |= ((UInt32)1 << XzFlags_GetCheckType(xzs.streams[i].flags));
- AString s;
- for (i = 0; i <= XZ_CHECK_MASK; i++)
- if (((mask >> i) & 1) != 0)
- {
- AString s2;
- if (kChecks[i])
- s2 = kChecks[i];
- else
- {
- s2 = "Check-";
- AddUInt32ToString(s2, (UInt32)i);
- }
- AddString(s, s2);
- }
- return s;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch (propID)
- {
- case kpidPhySize: if (_phySize_Defined) prop = _stat.PhySize; break;
- case kpidNumStreams: if (_stat.NumStreams_Defined) prop = _stat.NumStreams; break;
- case kpidNumBlocks: if (_stat.NumBlocks_Defined) prop = _stat.NumBlocks; break;
- case kpidUnpackSize: if (_stat.UnpackSize_Defined) prop = _stat.OutSize; break;
- case kpidMethod: if (!_methodsString.IsEmpty()) prop = _methodsString; break;
- case kpidErrorFlags:
- {
- UInt32 v = 0;
- if (!_isArc) v |= kpv_ErrorFlags_IsNotArc;;
- if (_stat.UnexpectedEnd) v |= kpv_ErrorFlags_UnexpectedEnd;
- if (_stat.DataAfterEnd) v |= kpv_ErrorFlags_DataAfterEnd;
- if (_stat.HeadersError) v |= kpv_ErrorFlags_HeadersError;
- if (_stat.Unsupported) v |= kpv_ErrorFlags_UnsupportedMethod;
- if (_stat.DataError) v |= kpv_ErrorFlags_DataError;
- if (_stat.CrcError) v |= kpv_ErrorFlags_CrcError;
- prop = v;
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
- *numItems = 1;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- switch (propID)
- {
- case kpidSize: if (_stat.UnpackSize_Defined) prop = _stat.OutSize; break;
- case kpidPackSize: if (_phySize_Defined) prop = _stat.PhySize; break;
- case kpidMethod: if (!_methodsString.IsEmpty()) prop = _methodsString; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-
-struct COpenCallbackWrap
-{
- ICompressProgress p;
- IArchiveOpenCallback *OpenCallback;
- HRESULT Res;
- COpenCallbackWrap(IArchiveOpenCallback *progress);
-};
-
-static SRes OpenCallbackProgress(void *pp, UInt64 inSize, UInt64 /* outSize */)
-{
- COpenCallbackWrap *p = (COpenCallbackWrap *)pp;
- p->Res = p->OpenCallback->SetCompleted(NULL, &inSize);
- return (SRes)p->Res;
-}
-
-COpenCallbackWrap::COpenCallbackWrap(IArchiveOpenCallback *callback)
-{
- p.Progress = OpenCallbackProgress;
- OpenCallback = callback;
- Res = SZ_OK;
-}
-
-struct CXzsCPP
-{
- CXzs p;
- CXzsCPP() { Xzs_Construct(&p); }
- ~CXzsCPP() { Xzs_Free(&p, &g_Alloc); }
-};
-
-
-struct CVirtProgress_To_OpenProgress: public IDecodeState
-{
- IArchiveOpenCallback *Callback;
- UInt64 Offset;
-
- HRESULT Progress();
-};
-
-HRESULT CVirtProgress_To_OpenProgress::Progress()
-{
- if (Callback)
- {
- UInt64 files = 0;
- UInt64 value = Offset + InSize;
- return Callback->SetCompleted(&files, &value);
- }
- return S_OK;
-}
-
-static HRESULT SRes_to_Open_HRESULT(SRes res)
-{
- switch (res)
- {
- case SZ_OK: return S_OK;
- case SZ_ERROR_MEM: return E_OUTOFMEMORY;
- case SZ_ERROR_PROGRESS: return E_ABORT;
- /*
- case SZ_ERROR_UNSUPPORTED:
- case SZ_ERROR_CRC:
- case SZ_ERROR_DATA:
- case SZ_ERROR_ARCHIVE:
- case SZ_ERROR_NO_ARCHIVE:
- return S_FALSE;
- */
- }
- return S_FALSE;
-}
-
-HRESULT CHandler::Open2(IInStream *inStream, /* UInt32 flags, */ IArchiveOpenCallback *callback)
-{
- _needSeekToStart = true;
-
- {
- CXzStreamFlags st;
- CSeqInStreamWrap inStreamWrap(inStream);
- SRes res = Xz_ReadHeader(&st, &inStreamWrap.p);
- if (res != SZ_OK)
- return SRes_to_Open_HRESULT(res);
-
- {
- CXzBlock block;
- Bool isIndex;
- UInt32 headerSizeRes;
- SRes res2 = XzBlock_ReadHeader(&block, &inStreamWrap.p, &isIndex, &headerSizeRes);
- if (res2 == SZ_OK && !isIndex)
- {
- unsigned numFilters = XzBlock_GetNumFilters(&block);
- for (unsigned i = 0; i < numFilters; i++)
- AddString(_methodsString, GetMethodString(block.filters[i]));
- }
- }
- }
-
- RINOK(inStream->Seek(0, STREAM_SEEK_END, &_stat.PhySize));
- RINOK(callback->SetTotal(NULL, &_stat.PhySize));
-
- CSeekInStreamWrap inStreamImp(inStream);
-
- CLookToRead lookStream;
- LookToRead_CreateVTable(&lookStream, True);
- lookStream.realStream = &inStreamImp.p;
- LookToRead_Init(&lookStream);
-
- COpenCallbackWrap openWrap(callback);
-
- CXzsCPP xzs;
- Int64 startPosition;
- SRes res = Xzs_ReadBackward(&xzs.p, &lookStream.s, &startPosition, &openWrap.p, &g_Alloc);
- if (res == SZ_ERROR_PROGRESS)
- return (openWrap.Res == S_OK) ? E_FAIL : openWrap.Res;
- /*
- if (res == SZ_ERROR_NO_ARCHIVE && xzs.p.num > 0)
- res = SZ_OK;
- */
- if (res == SZ_OK && startPosition == 0)
- {
- _phySize_Defined = true;
-
- _stat.OutSize = Xzs_GetUnpackSize(&xzs.p);
- _stat.UnpackSize_Defined = true;
-
- _stat.NumStreams = xzs.p.num;
- _stat.NumStreams_Defined = true;
-
- _stat.NumBlocks = Xzs_GetNumBlocks(&xzs.p);
- _stat.NumBlocks_Defined = true;
-
- AddString(_methodsString, GetCheckString(xzs.p));
- }
- else
- {
- res = SZ_OK;
- }
- RINOK(SRes_to_Open_HRESULT(res));
- _stream = inStream;
- _seqStream = inStream;
- _isArc = true;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *callback)
-{
- COM_TRY_BEGIN
- {
- Close();
- return Open2(inStream, /* 0, */ callback);
- }
- COM_TRY_END
-}
-
-STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream)
-{
- Close();
- _seqStream = stream;
- _isArc = true;
- _needSeekToStart = false;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::Close()
-{
- _stat.Clear();
-
- _isArc = false;
- _needSeekToStart = false;
-
- _phySize_Defined = false;
-
- _methodsString.Empty();
- _stream.Release();
- _seqStream.Release();
- return S_OK;
-}
-
-class CSeekToSeqStream:
- public IInStream,
- public CMyUnknownImp
-{
-public:
- CMyComPtr<ISequentialInStream> Stream;
- MY_UNKNOWN_IMP1(IInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-
-STDMETHODIMP CSeekToSeqStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- return Stream->Read(data, size, processedSize);
-}
-
-STDMETHODIMP CSeekToSeqStream::Seek(Int64, UInt32, UInt64 *) { return E_NOTIMPL; }
-
-struct CXzUnpackerCPP
-{
- Byte *InBuf;
- Byte *OutBuf;
- CXzUnpacker p;
-
- CXzUnpackerCPP(): InBuf(0), OutBuf(0)
- {
- XzUnpacker_Construct(&p, &g_Alloc);
- }
- ~CXzUnpackerCPP()
- {
- XzUnpacker_Free(&p);
- MyFree(InBuf);
- MyFree(OutBuf);
- }
-};
-
-HRESULT IDecodeState::Decode(ISequentialInStream *seqInStream, ISequentialOutStream *outStream)
-{
- const size_t kInBufSize = 1 << 15;
- const size_t kOutBufSize = 1 << 21;
-
- DecodeRes = SZ_OK;
-
- CXzUnpackerCPP xzu;
- XzUnpacker_Init(&xzu.p);
- xzu.InBuf = (Byte *)MyAlloc(kInBufSize);
- xzu.OutBuf = (Byte *)MyAlloc(kOutBufSize);
- if (!xzu.InBuf || !xzu.OutBuf)
- return E_OUTOFMEMORY;
-
- UInt32 inSize = 0;
- SizeT inPos = 0;
- SizeT outPos = 0;
-
- for (;;)
- {
- if (inPos == inSize)
- {
- inPos = inSize = 0;
- RINOK(seqInStream->Read(xzu.InBuf, kInBufSize, &inSize));
- }
-
- SizeT inLen = inSize - inPos;
- SizeT outLen = kOutBufSize - outPos;
- ECoderStatus status;
-
- SRes res = XzUnpacker_Code(&xzu.p,
- xzu.OutBuf + outPos, &outLen,
- xzu.InBuf + inPos, &inLen,
- (inSize == 0 ? CODER_FINISH_END : CODER_FINISH_ANY), &status);
-
- inPos += inLen;
- outPos += outLen;
-
- InSize += inLen;
- OutSize += outLen;
-
- DecodeRes = res;
-
- bool finished = ((inLen == 0 && outLen == 0) || res != SZ_OK);
-
- if (outStream)
- {
- if (outPos == kOutBufSize || finished)
- {
- if (outPos != 0)
- {
- RINOK(WriteStream(outStream, xzu.OutBuf, outPos));
- outPos = 0;
- }
- }
- }
- else
- outPos = 0;
-
- RINOK(Progress());
-
- if (finished)
- {
- PhySize = InSize;
- NumStreams = xzu.p.numStartedStreams;
- if (NumStreams > 0)
- IsArc = true;
- NumBlocks = xzu.p.numTotalBlocks;
-
- UnpackSize_Defined = true;
- NumStreams_Defined = true;
- NumBlocks_Defined = true;
-
- UInt64 extraSize = XzUnpacker_GetExtraSize(&xzu.p);
-
- if (res == SZ_OK)
- {
- if (status == CODER_STATUS_NEEDS_MORE_INPUT)
- {
- extraSize = 0;
- if (!XzUnpacker_IsStreamWasFinished(&xzu.p))
- {
- // finished at padding bytes, but padding is not aligned for 4
- UnexpectedEnd = true;
- res = SZ_ERROR_DATA;
- }
- }
- else // status == CODER_STATUS_NOT_FINISHED
- res = SZ_ERROR_DATA;
- }
- else if (res == SZ_ERROR_NO_ARCHIVE)
- {
- if (InSize == extraSize)
- IsArc = false;
- else
- {
- if (extraSize != 0 || inPos != inSize)
- {
- DataAfterEnd = true;
- res = SZ_OK;
- }
- }
- }
-
- DecodeRes = res;
- PhySize -= extraSize;
-
- switch (res)
- {
- case SZ_OK: break;
- case SZ_ERROR_NO_ARCHIVE: IsArc = false; break;
- case SZ_ERROR_ARCHIVE: HeadersError = true; break;
- case SZ_ERROR_UNSUPPORTED: Unsupported = true; break;
- case SZ_ERROR_CRC: CrcError = true; break;
- case SZ_ERROR_DATA: DataError = true; break;
- default: DataError = true; break;
- }
-
- break;
- }
- }
-
- 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)(Int32)-1 && (numItems != 1 || indices[0] != 0))
- return E_INVALIDARG;
-
- extractCallback->SetTotal(_stat.PhySize);
- 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);
-
- CVirtProgress_To_LocalProgress vp;
- vp.lps = new CLocalProgress;
- vp.progress = vp.lps;
- vp.lps->Init(extractCallback, true);
-
-
- if (_needSeekToStart)
- {
- if (!_stream)
- return E_FAIL;
- RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
- else
- _needSeekToStart = true;
-
- RINOK(Decode2(_seqStream, realOutStream, vp));
-
- Int32 opRes;
-
- if (!vp.IsArc)
- opRes = NExtract::NOperationResult::kIsNotArc;
- else if (vp.UnexpectedEnd)
- opRes = NExtract::NOperationResult::kUnexpectedEnd;
- else if (vp.DataAfterEnd)
- opRes = NExtract::NOperationResult::kDataAfterEnd;
- else if (vp.CrcError)
- opRes = NExtract::NOperationResult::kCRCError;
- else if (vp.Unsupported)
- opRes = NExtract::NOperationResult::kUnsupportedMethod;
- else if (vp.HeadersError)
- opRes = NExtract::NOperationResult::kDataError;
- else if (vp.DataError)
- opRes = NExtract::NOperationResult::kDataError;
- else if (vp.DecodeRes != SZ_OK)
- opRes = NExtract::NOperationResult::kDataError;
- else
- opRes = NExtract::NOperationResult::kOK;
-
- realOutStream.Release();
- return extractCallback->SetOperationResult(opRes);
- COM_TRY_END
-}
-
-#ifndef EXTRACT_ONLY
-
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *timeType)
-{
- *timeType = NFileTimeType::kUnix;
- return S_OK;
-}
-
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,
- IArchiveUpdateCallback *updateCallback)
-{
- CSeqOutStreamWrap seqOutStream(outStream);
-
- if (numItems == 0)
- {
- SRes res = Xz_EncodeEmpty(&seqOutStream.p);
- return SResToHRESULT(res);
- }
-
- 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_EMPTY)
- if (prop.vt != VT_BOOL || prop.boolVal != VARIANT_FALSE)
- 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;
- RINOK(updateCallback->SetTotal(size));
- }
-
- CLzma2EncProps lzma2Props;
- Lzma2EncProps_Init(&lzma2Props);
-
- lzma2Props.lzmaProps.level = GetLevel();
-
- CMyComPtr<ISequentialInStream> fileInStream;
- RINOK(updateCallback->GetStream(0, &fileInStream));
-
- CSeqInStreamWrap seqInStream(fileInStream);
-
- {
- NCOM::CPropVariant prop = (UInt64)size;
- RINOK(NCompress::NLzma2::SetLzma2Prop(NCoderPropID::kReduceSize, prop, lzma2Props));
- }
-
- FOR_VECTOR (i, _methods)
- {
- COneMethodInfo &m = _methods[i];
- SetGlobalLevelAndThreads(m
- #ifndef _7ZIP_ST
- , _numThreads
- #endif
- );
- {
- FOR_VECTOR (j, m.Props)
- {
- const CProp &prop = m.Props[j];
- RINOK(NCompress::NLzma2::SetLzma2Prop(prop.Id, prop.Value, lzma2Props));
- }
- }
- }
-
- #ifndef _7ZIP_ST
- lzma2Props.numTotalThreads = _numThreads;
- #endif
-
- CLocalProgress *lps = new CLocalProgress;
- CMyComPtr<ICompressProgressInfo> progress = lps;
- lps->Init(updateCallback, true);
-
- CCompressProgressWrap progressWrap(progress);
- CXzProps xzProps;
- CXzFilterProps filter;
- XzProps_Init(&xzProps);
- XzFilterProps_Init(&filter);
- xzProps.lzma2Props = &lzma2Props;
- xzProps.filterProps = (_filterId != 0 ? &filter : NULL);
- switch (_crcSize)
- {
- case 0: xzProps.checkId = XZ_CHECK_NO; break;
- case 4: xzProps.checkId = XZ_CHECK_CRC32; break;
- case 8: xzProps.checkId = XZ_CHECK_CRC64; break;
- case 32: xzProps.checkId = XZ_CHECK_SHA256; break;
- default: return E_INVALIDARG;
- }
- filter.id = _filterId;
- if (_filterId == XZ_ID_Delta)
- {
- bool deltaDefined = false;
- FOR_VECTOR (j, _filterMethod.Props)
- {
- const CProp &prop = _filterMethod.Props[j];
- if (prop.Id == NCoderPropID::kDefaultProp && prop.Value.vt == VT_UI4)
- {
- UInt32 delta = (UInt32)prop.Value.ulVal;
- if (delta < 1 || delta > 256)
- return E_INVALIDARG;
- filter.delta = delta;
- deltaDefined = true;
- }
- }
- if (!deltaDefined)
- return E_INVALIDARG;
- }
- SRes res = Xz_Encode(&seqOutStream.p, &seqInStream.p, &xzProps, &progressWrap.p);
- if (res == SZ_OK)
- return updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK);
- return SResToHRESULT(res);
- }
- if (indexInArchive != 0)
- return E_INVALIDARG;
- if (_stream)
- RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL));
- return NCompress::CopyStream(_stream, outStream, NULL);
-}
-
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps)
-{
- COM_TRY_BEGIN
- Init();
- for (UInt32 i = 0; i < numProps; i++)
- {
- RINOK(SetProperty(names[i], values[i]));
- }
-
- if (!_filterMethod.MethodName.IsEmpty())
- {
- unsigned k;
- for (k = 0; k < ARRAY_SIZE(g_NamePairs); k++)
- {
- const CMethodNamePair &pair = g_NamePairs[k];
- if (StringsAreEqualNoCase_Ascii(_filterMethod.MethodName, pair.Name))
- {
- _filterId = pair.Id;
- break;
- }
- }
- if (k == ARRAY_SIZE(g_NamePairs))
- return E_INVALIDARG;
- }
-
- _methods.DeleteFrontal(GetNumEmptyMethods());
- if (_methods.Size() > 1)
- return E_INVALIDARG;
- if (_methods.Size() == 1)
- {
- UString &methodName = _methods[0].MethodName;
- if (methodName.IsEmpty())
- methodName = k_LZMA2_Name;
- else if (!methodName.IsEqualToNoCase(k_LZMA2_Name))
- return E_INVALIDARG;
- }
- return S_OK;
- COM_TRY_END
-}
-
-#endif
-
-IMP_CreateArcIn
-IMP_CreateArcOut
-
-static CArcInfo g_ArcInfo =
- { "xz", "xz txz", "* .tar", 0xC,
- 6, { 0xFD, '7' , 'z', 'X', 'Z', 0 },
- 0,
- NArcInfoFlags::kKeepName,
- REF_CreateArc_Pair };
-
-REGISTER_ARC(xz)
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/CWrappers.cpp b/src/libs/7zip/win/CPP/7zip/Common/CWrappers.cpp
deleted file mode 100644
index a15794e2a..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/CWrappers.cpp
+++ /dev/null
@@ -1,230 +0,0 @@
-// CWrappers.h
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "CWrappers.h"
-
-#include "StreamUtils.h"
-
-#define PROGRESS_UNKNOWN_VALUE ((UInt64)(Int64)-1)
-
-#define CONVERT_PR_VAL(x) (x == PROGRESS_UNKNOWN_VALUE ? NULL : &x)
-
-static SRes CompressProgress(void *pp, UInt64 inSize, UInt64 outSize) throw()
-{
- CCompressProgressWrap *p = (CCompressProgressWrap *)pp;
- p->Res = p->Progress->SetRatioInfo(CONVERT_PR_VAL(inSize), CONVERT_PR_VAL(outSize));
- return (SRes)p->Res;
-}
-
-CCompressProgressWrap::CCompressProgressWrap(ICompressProgressInfo *progress) throw()
-{
- p.Progress = CompressProgress;
- Progress = progress;
- Res = SZ_OK;
-}
-
-static const UInt32 kStreamStepSize = (UInt32)1 << 31;
-
-SRes HRESULT_To_SRes(HRESULT res, SRes defaultRes)
-{
- switch (res)
- {
- case S_OK: return SZ_OK;
- case E_OUTOFMEMORY: return SZ_ERROR_MEM;
- case E_INVALIDARG: return SZ_ERROR_PARAM;
- case E_ABORT: return SZ_ERROR_PROGRESS;
- case S_FALSE: return SZ_ERROR_DATA;
- case E_NOTIMPL: return SZ_ERROR_UNSUPPORTED;
- }
- return defaultRes;
-}
-
-static SRes MyRead(void *object, void *data, size_t *size) throw()
-{
- CSeqInStreamWrap *p = (CSeqInStreamWrap *)object;
- UInt32 curSize = ((*size < kStreamStepSize) ? (UInt32)*size : kStreamStepSize);
- p->Res = (p->Stream->Read(data, curSize, &curSize));
- *size = curSize;
- p->Processed += curSize;
- if (p->Res == S_OK)
- return SZ_OK;
- return HRESULT_To_SRes(p->Res, SZ_ERROR_READ);
-}
-
-static size_t MyWrite(void *object, const void *data, size_t size) throw()
-{
- CSeqOutStreamWrap *p = (CSeqOutStreamWrap *)object;
- if (p->Stream)
- {
- p->Res = WriteStream(p->Stream, data, size);
- if (p->Res != 0)
- return 0;
- }
- else
- p->Res = S_OK;
- p->Processed += size;
- return size;
-}
-
-CSeqInStreamWrap::CSeqInStreamWrap(ISequentialInStream *stream) throw()
-{
- p.Read = MyRead;
- Stream = stream;
- Processed = 0;
-}
-
-CSeqOutStreamWrap::CSeqOutStreamWrap(ISequentialOutStream *stream) throw()
-{
- p.Write = MyWrite;
- Stream = stream;
- Res = SZ_OK;
- Processed = 0;
-}
-
-HRESULT SResToHRESULT(SRes res) throw()
-{
- switch(res)
- {
- case SZ_OK: return S_OK;
- case SZ_ERROR_MEM: return E_OUTOFMEMORY;
- case SZ_ERROR_PARAM: return E_INVALIDARG;
- case SZ_ERROR_PROGRESS: return E_ABORT;
- case SZ_ERROR_DATA: return S_FALSE;
- case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL;
- }
- return E_FAIL;
-}
-
-static SRes InStreamWrap_Read(void *pp, void *data, size_t *size) throw()
-{
- CSeekInStreamWrap *p = (CSeekInStreamWrap *)pp;
- UInt32 curSize = ((*size < kStreamStepSize) ? (UInt32)*size : kStreamStepSize);
- p->Res = p->Stream->Read(data, curSize, &curSize);
- *size = curSize;
- return (p->Res == S_OK) ? SZ_OK : SZ_ERROR_READ;
-}
-
-static SRes InStreamWrap_Seek(void *pp, Int64 *offset, ESzSeek origin) throw()
-{
- CSeekInStreamWrap *p = (CSeekInStreamWrap *)pp;
- UInt32 moveMethod;
- switch(origin)
- {
- case SZ_SEEK_SET: moveMethod = STREAM_SEEK_SET; break;
- case SZ_SEEK_CUR: moveMethod = STREAM_SEEK_CUR; break;
- case SZ_SEEK_END: moveMethod = STREAM_SEEK_END; break;
- default: return SZ_ERROR_PARAM;
- }
- UInt64 newPosition;
- p->Res = p->Stream->Seek(*offset, moveMethod, &newPosition);
- *offset = (Int64)newPosition;
- return (p->Res == S_OK) ? SZ_OK : SZ_ERROR_READ;
-}
-
-CSeekInStreamWrap::CSeekInStreamWrap(IInStream *stream) throw()
-{
- Stream = stream;
- p.Read = InStreamWrap_Read;
- p.Seek = InStreamWrap_Seek;
- Res = S_OK;
-}
-
-
-/* ---------- CByteInBufWrap ---------- */
-
-void CByteInBufWrap::Free() throw()
-{
- ::MidFree(Buf);
- Buf = 0;
-}
-
-bool CByteInBufWrap::Alloc(UInt32 size) throw()
-{
- if (Buf == 0 || size != Size)
- {
- Free();
- Lim = Cur = Buf = (Byte *)::MidAlloc((size_t)size);
- Size = size;
- }
- return (Buf != 0);
-}
-
-Byte CByteInBufWrap::ReadByteFromNewBlock() throw()
-{
- if (Res == S_OK)
- {
- UInt32 avail;
- Processed += (Cur - Buf);
- Res = Stream->Read(Buf, Size, &avail);
- Cur = Buf;
- Lim = Buf + avail;
- if (avail != 0)
- return *Cur++;
- }
- Extra = true;
- return 0;
-}
-
-static Byte Wrap_ReadByte(void *pp) throw()
-{
- CByteInBufWrap *p = (CByteInBufWrap *)pp;
- if (p->Cur != p->Lim)
- return *p->Cur++;
- return p->ReadByteFromNewBlock();
-}
-
-CByteInBufWrap::CByteInBufWrap(): Buf(0)
-{
- p.Read = Wrap_ReadByte;
-}
-
-
-/* ---------- CByteOutBufWrap ---------- */
-
-void CByteOutBufWrap::Free() throw()
-{
- ::MidFree(Buf);
- Buf = 0;
-}
-
-bool CByteOutBufWrap::Alloc(size_t size) throw()
-{
- if (Buf == 0 || size != Size)
- {
- Free();
- Buf = (Byte *)::MidAlloc(size);
- Size = size;
- }
- return (Buf != 0);
-}
-
-HRESULT CByteOutBufWrap::Flush() throw()
-{
- if (Res == S_OK)
- {
- size_t size = (Cur - Buf);
- Res = WriteStream(Stream, Buf, size);
- if (Res == S_OK)
- Processed += size;
- Cur = Buf;
- }
- return Res;
-}
-
-static void Wrap_WriteByte(void *pp, Byte b) throw()
-{
- CByteOutBufWrap *p = (CByteOutBufWrap *)pp;
- Byte *dest = p->Cur;
- *dest = b;
- p->Cur = ++dest;
- if (dest == p->Lim)
- p->Flush();
-}
-
-CByteOutBufWrap::CByteOutBufWrap() throw(): Buf(0)
-{
- p.Write = Wrap_WriteByte;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/CWrappers.h b/src/libs/7zip/win/CPP/7zip/Common/CWrappers.h
deleted file mode 100644
index 4fe7dea3e..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/CWrappers.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// CWrappers.h
-
-#ifndef __C_WRAPPERS_H
-#define __C_WRAPPERS_H
-
-#include "../ICoder.h"
-#include "../../Common/MyCom.h"
-
-struct CCompressProgressWrap
-{
- ICompressProgress p;
- ICompressProgressInfo *Progress;
- HRESULT Res;
-
- CCompressProgressWrap(ICompressProgressInfo *progress) throw();
-};
-
-struct CSeqInStreamWrap
-{
- ISeqInStream p;
- ISequentialInStream *Stream;
- HRESULT Res;
- UInt64 Processed;
-
- CSeqInStreamWrap(ISequentialInStream *stream) throw();
-};
-
-struct CSeekInStreamWrap
-{
- ISeekInStream p;
- IInStream *Stream;
- HRESULT Res;
-
- CSeekInStreamWrap(IInStream *stream) throw();
-};
-
-struct CSeqOutStreamWrap
-{
- ISeqOutStream p;
- ISequentialOutStream *Stream;
- HRESULT Res;
- UInt64 Processed;
-
- CSeqOutStreamWrap(ISequentialOutStream *stream) throw();
-};
-
-HRESULT SResToHRESULT(SRes res) throw();
-
-struct CByteInBufWrap
-{
- IByteIn p;
- const Byte *Cur;
- const Byte *Lim;
- Byte *Buf;
- UInt32 Size;
- ISequentialInStream *Stream;
- UInt64 Processed;
- bool Extra;
- HRESULT Res;
-
- CByteInBufWrap();
- ~CByteInBufWrap() { Free(); }
- void Free() throw();
- bool Alloc(UInt32 size) throw();
- void Init()
- {
- Lim = Cur = Buf;
- Processed = 0;
- Extra = false;
- Res = S_OK;
- }
- UInt64 GetProcessed() const { return Processed + (Cur - Buf); }
- Byte ReadByteFromNewBlock() throw();
- Byte ReadByte()
- {
- if (Cur != Lim)
- return *Cur++;
- return ReadByteFromNewBlock();
- }
-};
-
-struct CByteOutBufWrap
-{
- IByteOut p;
- Byte *Cur;
- const Byte *Lim;
- Byte *Buf;
- size_t Size;
- ISequentialOutStream *Stream;
- UInt64 Processed;
- HRESULT Res;
-
- CByteOutBufWrap() throw();
- ~CByteOutBufWrap() { Free(); }
- void Free() throw();
- bool Alloc(size_t size) throw();
- void Init()
- {
- Cur = Buf;
- Lim = Buf + Size;
- Processed = 0;
- Res = S_OK;
- }
- UInt64 GetProcessed() const { return Processed + (Cur - Buf); }
- HRESULT Flush() throw();
- void WriteByte(Byte b)
- {
- *Cur++ = b;
- if (Cur == Lim)
- Flush();
- }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/Common.pri b/src/libs/7zip/win/CPP/7zip/Common/Common.pri
deleted file mode 100644
index e6b054a24..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/Common.pri
+++ /dev/null
@@ -1,40 +0,0 @@
-HEADERS += $$7ZIP_BASE/CPP/7zip/Common/CWrappers.h \
- $$7ZIP_BASE/CPP/7zip/Common/CreateCoder.h \
- $$7ZIP_BASE/CPP/7zip/Common/FilePathAutoRename.h \
- $$7ZIP_BASE/CPP/7zip/Common/FileStreams.h \
- $$7ZIP_BASE/CPP/7zip/Common/FilterCoder.h \
- $$7ZIP_BASE/CPP/7zip/Common/InBuffer.h \
- $$7ZIP_BASE/CPP/7zip/Common/InOutTempBuffer.h \
- $$7ZIP_BASE/CPP/7zip/Common/LimitedStreams.h \
- $$7ZIP_BASE/CPP/7zip/Common/LockedStream.h \
- $$7ZIP_BASE/CPP/7zip/Common/MethodId.h \
- $$7ZIP_BASE/CPP/7zip/Common/MethodProps.h \
- $$7ZIP_BASE/CPP/7zip/Common/OutBuffer.h \
- $$7ZIP_BASE/CPP/7zip/Common/ProgressUtils.h \
- $$7ZIP_BASE/CPP/7zip/Common/RegisterArc.h \
- $$7ZIP_BASE/CPP/7zip/Common/RegisterCodec.h \
- $$7ZIP_BASE/CPP/7zip/Common/StdAfx.h \
- $$7ZIP_BASE/CPP/7zip/Common/StreamBinder.h \
- $$7ZIP_BASE/CPP/7zip/Common/StreamObjects.h \
- $$7ZIP_BASE/CPP/7zip/Common/StreamUtils.h \
- $$7ZIP_BASE/CPP/7zip/Common/UniqBlocks.h \
- $$7ZIP_BASE/CPP/7zip/Common/VirtThread.h
-
-SOURCES += $$7ZIP_BASE/CPP/7zip/Common/CWrappers.cpp \
- $$7ZIP_BASE/CPP/7zip/Common/CreateCoder.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/MethodProps.cpp \
- $$7ZIP_BASE/CPP/7zip/Common/OutBuffer.cpp \
- $$7ZIP_BASE/CPP/7zip/Common/ProgressUtils.cpp \
- $$7ZIP_BASE/CPP/7zip/Common/PropId.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/UniqBlocks.cpp \
- $$7ZIP_BASE/CPP/7zip/Common/VirtThread.cpp
diff --git a/src/libs/7zip/win/CPP/7zip/Common/CreateCoder.cpp b/src/libs/7zip/win/CPP/7zip/Common/CreateCoder.cpp
deleted file mode 100644
index 01ccbe12a..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/CreateCoder.cpp
+++ /dev/null
@@ -1,391 +0,0 @@
-// CreateCoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../Windows/Defs.h"
-#include "../../Windows/PropVariant.h"
-
-#include "CreateCoder.h"
-
-#include "FilterCoder.h"
-#include "RegisterCodec.h"
-
-static const unsigned int kNumCodecsMax = 64;
-unsigned int g_NumCodecs = 0;
-const CCodecInfo *g_Codecs[kNumCodecsMax];
-void RegisterCodec(const CCodecInfo *codecInfo) throw()
-{
- if (g_NumCodecs < kNumCodecsMax)
- g_Codecs[g_NumCodecs++] = codecInfo;
-}
-
-static const unsigned int kNumHashersMax = 16;
-unsigned int g_NumHashers = 0;
-const CHasherInfo *g_Hashers[kNumHashersMax];
-void RegisterHasher(const CHasherInfo *hashInfo) throw()
-{
- if (g_NumHashers < kNumHashersMax)
- g_Hashers[g_NumHashers++] = hashInfo;
-}
-
-#ifdef EXTERNAL_CODECS
-static HRESULT ReadNumberOfStreams(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, UInt32 &res)
-{
- NWindows::NCOM::CPropVariant prop;
- RINOK(codecsInfo->GetProperty(index, propID, &prop));
- if (prop.vt == VT_EMPTY)
- res = 1;
- else if (prop.vt == VT_UI4)
- res = prop.ulVal;
- else
- return E_INVALIDARG;
- return S_OK;
-}
-
-static HRESULT ReadIsAssignedProp(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, bool &res)
-{
- NWindows::NCOM::CPropVariant prop;
- RINOK(codecsInfo->GetProperty(index, propID, &prop));
- if (prop.vt == VT_EMPTY)
- res = true;
- else if (prop.vt == VT_BOOL)
- res = VARIANT_BOOLToBool(prop.boolVal);
- else
- return E_INVALIDARG;
- return S_OK;
-}
-
-HRESULT CExternalCodecs::LoadCodecs()
-{
- if (GetCodecs)
- {
- UInt32 num;
- RINOK(GetCodecs->GetNumberOfMethods(&num));
- for (UInt32 i = 0; i < num; i++)
- {
- CCodecInfoEx info;
- NWindows::NCOM::CPropVariant prop;
- RINOK(GetCodecs->GetProperty(i, NMethodPropID::kID, &prop));
- // if (prop.vt != VT_BSTR)
- // info.Id.IDSize = (Byte)SysStringByteLen(prop.bstrVal);
- // memcpy(info.Id.ID, prop.bstrVal, info.Id.IDSize);
- if (prop.vt != VT_UI8)
- continue; // old Interface
- info.Id = prop.uhVal.QuadPart;
- prop.Clear();
-
- RINOK(GetCodecs->GetProperty(i, NMethodPropID::kName, &prop));
- if (prop.vt == VT_BSTR)
- info.Name = prop.bstrVal;
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
-
- RINOK(ReadNumberOfStreams(GetCodecs, i, NMethodPropID::kInStreams, info.NumInStreams));
- RINOK(ReadNumberOfStreams(GetCodecs, i, NMethodPropID::kOutStreams, info.NumOutStreams));
- RINOK(ReadIsAssignedProp(GetCodecs, i, NMethodPropID::kEncoderIsAssigned, info.EncoderIsAssigned));
- RINOK(ReadIsAssignedProp(GetCodecs, i, NMethodPropID::kDecoderIsAssigned, info.DecoderIsAssigned));
-
- Codecs.Add(info);
- }
- }
- if (GetHashers)
- {
- UInt32 num = GetHashers->GetNumHashers();
- for (UInt32 i = 0; i < num; i++)
- {
- CHasherInfoEx info;
- NWindows::NCOM::CPropVariant prop;
- RINOK(GetHashers->GetHasherProp(i, NMethodPropID::kID, &prop));
- if (prop.vt != VT_UI8)
- continue;
- info.Id = prop.uhVal.QuadPart;
- prop.Clear();
-
- RINOK(GetHashers->GetHasherProp(i, NMethodPropID::kName, &prop));
- if (prop.vt == VT_BSTR)
- info.Name = prop.bstrVal;
- else if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
-
- Hashers.Add(info);
- }
- }
- return S_OK;
-}
-
-#endif
-
-bool FindMethod(DECL_EXTERNAL_CODECS_LOC_VARS
- const UString &name, CMethodId &methodId, UInt32 &numInStreams, UInt32 &numOutStreams)
-{
- UInt32 i;
- for (i = 0; i < g_NumCodecs; i++)
- {
- const CCodecInfo &codec = *g_Codecs[i];
- if (name.IsEqualToNoCase(codec.Name))
- {
- methodId = codec.Id;
- numInStreams = codec.NumInStreams;
- numOutStreams = 1;
- return true;
- }
- }
- #ifdef EXTERNAL_CODECS
- if (__externalCodecs)
- for (i = 0; i < (UInt32)__externalCodecs->Codecs.Size(); i++)
- {
- const CCodecInfoEx &codec = __externalCodecs->Codecs[i];
- if (codec.Name.IsEqualToNoCase(name))
- {
- methodId = codec.Id;
- numInStreams = codec.NumInStreams;
- numOutStreams = codec.NumOutStreams;
- return true;
- }
- }
- #endif
- return false;
-}
-
-bool FindMethod(DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId, UString &name)
-{
- UInt32 i;
- for (i = 0; i < g_NumCodecs; i++)
- {
- const CCodecInfo &codec = *g_Codecs[i];
- if (methodId == codec.Id)
- {
- name = codec.Name;
- return true;
- }
- }
- #ifdef EXTERNAL_CODECS
- if (__externalCodecs)
- for (i = 0; i < (UInt32)__externalCodecs->Codecs.Size(); i++)
- {
- const CCodecInfoEx &codec = __externalCodecs->Codecs[i];
- if (methodId == codec.Id)
- {
- name = codec.Name;
- return true;
- }
- }
- #endif
- return false;
-}
-
-bool FindHashMethod(DECL_EXTERNAL_CODECS_LOC_VARS
- const UString &name,
- CMethodId &methodId)
-{
- UInt32 i;
- for (i = 0; i < g_NumHashers; i++)
- {
- const CHasherInfo &codec = *g_Hashers[i];
- if (name.IsEqualToNoCase(codec.Name))
- {
- methodId = codec.Id;
- return true;
- }
- }
- #ifdef EXTERNAL_CODECS
- if (__externalCodecs)
- for (i = 0; i < (UInt32)__externalCodecs->Hashers.Size(); i++)
- {
- const CHasherInfoEx &codec = __externalCodecs->Hashers[i];
- if (codec.Name.IsEqualToNoCase(name))
- {
- methodId = codec.Id;
- return true;
- }
- }
- #endif
- return false;
-}
-
-void GetHashMethods(DECL_EXTERNAL_CODECS_LOC_VARS
- CRecordVector<CMethodId> &methods)
-{
- methods.ClearAndSetSize(g_NumHashers);
- UInt32 i;
- for (i = 0; i < g_NumHashers; i++)
- methods[i] = (*g_Hashers[i]).Id;
- #ifdef EXTERNAL_CODECS
- if (__externalCodecs)
- for (i = 0; i < (UInt32)__externalCodecs->Hashers.Size(); i++)
- methods.Add(__externalCodecs->Hashers[i].Id);
- #endif
-}
-
-HRESULT CreateCoder(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId,
- CMyComPtr<ICompressFilter> &filter,
- CMyComPtr<ICompressCoder> &coder,
- CMyComPtr<ICompressCoder2> &coder2,
- bool encode, bool onlyCoder)
-{
- UInt32 i;
- for (i = 0; i < g_NumCodecs; i++)
- {
- const CCodecInfo &codec = *g_Codecs[i];
- if (codec.Id == methodId)
- {
- if (encode)
- {
- if (codec.CreateEncoder)
- {
- void *p = codec.CreateEncoder();
- if (codec.IsFilter) filter = (ICompressFilter *)p;
- else if (codec.NumInStreams == 1) coder = (ICompressCoder *)p;
- else coder2 = (ICompressCoder2 *)p;
- break;
- }
- }
- else
- if (codec.CreateDecoder)
- {
- void *p = codec.CreateDecoder();
- if (codec.IsFilter) filter = (ICompressFilter *)p;
- else if (codec.NumInStreams == 1) coder = (ICompressCoder *)p;
- else coder2 = (ICompressCoder2 *)p;
- break;
- }
- }
- }
-
- #ifdef EXTERNAL_CODECS
- if (!filter && !coder && !coder2 && __externalCodecs)
- for (i = 0; i < (UInt32)__externalCodecs->Codecs.Size(); i++)
- {
- const CCodecInfoEx &codec = __externalCodecs->Codecs[i];
- if (codec.Id == methodId)
- {
- if (encode)
- {
- if (codec.EncoderIsAssigned)
- {
- if (codec.IsSimpleCodec())
- {
- HRESULT result = __externalCodecs->GetCodecs->CreateEncoder(i, &IID_ICompressCoder, (void **)&coder);
- if (result != S_OK && result != E_NOINTERFACE && result != CLASS_E_CLASSNOTAVAILABLE)
- return result;
- if (!coder)
- {
- RINOK(__externalCodecs->GetCodecs->CreateEncoder(i, &IID_ICompressFilter, (void **)&filter));
- }
- }
- else
- {
- RINOK(__externalCodecs->GetCodecs->CreateEncoder(i, &IID_ICompressCoder2, (void **)&coder2));
- }
- break;
- }
- }
- else
- if (codec.DecoderIsAssigned)
- {
- if (codec.IsSimpleCodec())
- {
- HRESULT result = __externalCodecs->GetCodecs->CreateDecoder(i, &IID_ICompressCoder, (void **)&coder);
- if (result != S_OK && result != E_NOINTERFACE && result != CLASS_E_CLASSNOTAVAILABLE)
- return result;
- if (!coder)
- {
- RINOK(__externalCodecs->GetCodecs->CreateDecoder(i, &IID_ICompressFilter, (void **)&filter));
- }
- }
- else
- {
- RINOK(__externalCodecs->GetCodecs->CreateDecoder(i, &IID_ICompressCoder2, (void **)&coder2));
- }
- break;
- }
- }
- }
- #endif
-
- if (onlyCoder && filter)
- {
- CFilterCoder *coderSpec = new CFilterCoder;
- coder = coderSpec;
- coderSpec->Filter = filter;
- }
- return S_OK;
-}
-
-HRESULT CreateCoder(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId,
- CMyComPtr<ICompressCoder> &coder,
- CMyComPtr<ICompressCoder2> &coder2,
- bool encode)
-{
- CMyComPtr<ICompressFilter> filter;
- return CreateCoder(
- EXTERNAL_CODECS_LOC_VARS
- methodId,
- filter, coder, coder2, encode, true);
-}
-
-HRESULT CreateCoder(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId,
- CMyComPtr<ICompressCoder> &coder, bool encode)
-{
- CMyComPtr<ICompressFilter> filter;
- CMyComPtr<ICompressCoder2> coder2;
- return CreateCoder(
- EXTERNAL_CODECS_LOC_VARS
- methodId,
- coder, coder2, encode);
-}
-
-HRESULT CreateFilter(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId,
- CMyComPtr<ICompressFilter> &filter,
- bool encode)
-{
- CMyComPtr<ICompressCoder> coder;
- CMyComPtr<ICompressCoder2> coder2;
- return CreateCoder(
- EXTERNAL_CODECS_LOC_VARS
- methodId,
- filter, coder, coder2, encode, false);
-}
-
-HRESULT CreateHasher(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId,
- UString &name,
- CMyComPtr<IHasher> &hasher)
-{
- UInt32 i;
- for (i = 0; i < g_NumHashers; i++)
- {
- const CHasherInfo &codec = *g_Hashers[i];
- if (codec.Id == methodId)
- {
- hasher = (IHasher *)codec.CreateHasher();
- name = codec.Name;
- break;
- }
- }
-
- #ifdef EXTERNAL_CODECS
- if (!hasher && __externalCodecs)
- for (i = 0; i < (UInt32)__externalCodecs->Hashers.Size(); i++)
- {
- const CHasherInfoEx &codec = __externalCodecs->Hashers[i];
- if (codec.Id == methodId)
- {
- name = codec.Name;
- return __externalCodecs->GetHashers->CreateHasher(i, &hasher);
- }
- }
- #endif
-
- return S_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/CreateCoder.h b/src/libs/7zip/win/CPP/7zip/Common/CreateCoder.h
deleted file mode 100644
index fe1f6ccfe..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/CreateCoder.h
+++ /dev/null
@@ -1,127 +0,0 @@
-// CreateCoder.h
-
-#ifndef __CREATE_CODER_H
-#define __CREATE_CODER_H
-
-#include "../../Common/MyCom.h"
-#include "../../Common/MyString.h"
-#include "../ICoder.h"
-
-#include "MethodId.h"
-
-#ifdef EXTERNAL_CODECS
-
-struct CCodecInfoEx
-{
- UString Name;
- CMethodId Id;
- UInt32 NumInStreams;
- UInt32 NumOutStreams;
- bool EncoderIsAssigned;
- bool DecoderIsAssigned;
-
- bool IsSimpleCodec() const { return NumOutStreams == 1 && NumInStreams == 1; }
- CCodecInfoEx(): EncoderIsAssigned(false), DecoderIsAssigned(false) {}
-};
-
-struct CHasherInfoEx
-{
- UString Name;
- CMethodId Id;
-};
-
-#define PUBLIC_ISetCompressCodecsInfo public ISetCompressCodecsInfo,
-#define QUERY_ENTRY_ISetCompressCodecsInfo MY_QUERYINTERFACE_ENTRY(ISetCompressCodecsInfo)
-#define DECL_ISetCompressCodecsInfo STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo);
-#define IMPL_ISetCompressCodecsInfo2(x) \
-STDMETHODIMP x::SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo) { \
- COM_TRY_BEGIN __externalCodecs.GetCodecs = compressCodecsInfo; return __externalCodecs.LoadCodecs(); COM_TRY_END }
-#define IMPL_ISetCompressCodecsInfo IMPL_ISetCompressCodecsInfo2(CHandler)
-
-struct CExternalCodecs
-{
- CMyComPtr<ICompressCodecsInfo> GetCodecs;
- CMyComPtr<IHashers> GetHashers;
-
- CObjectVector<CCodecInfoEx> Codecs;
- CObjectVector<CHasherInfoEx> Hashers;
-
- HRESULT LoadCodecs();
-};
-
-#define EXTERNAL_CODECS_VARS2 &__externalCodecs
-
-#define DECL_EXTERNAL_CODECS_VARS CExternalCodecs __externalCodecs;
-#define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2,
-
-#define DECL_EXTERNAL_CODECS_LOC_VARS2 const CExternalCodecs *__externalCodecs
-#define EXTERNAL_CODECS_LOC_VARS2 __externalCodecs
-
-#define DECL_EXTERNAL_CODECS_LOC_VARS DECL_EXTERNAL_CODECS_LOC_VARS2,
-#define EXTERNAL_CODECS_LOC_VARS EXTERNAL_CODECS_LOC_VARS2,
-
-#else
-
-#define PUBLIC_ISetCompressCodecsInfo
-#define QUERY_ENTRY_ISetCompressCodecsInfo
-#define DECL_ISetCompressCodecsInfo
-#define IMPL_ISetCompressCodecsInfo
-#define EXTERNAL_CODECS_VARS2
-#define DECL_EXTERNAL_CODECS_VARS
-#define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2
-#define DECL_EXTERNAL_CODECS_LOC_VARS2
-#define EXTERNAL_CODECS_LOC_VARS2
-#define DECL_EXTERNAL_CODECS_LOC_VARS
-#define EXTERNAL_CODECS_LOC_VARS
-
-#endif
-
-bool FindMethod(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const UString &name, CMethodId &methodId, UInt32 &numInStreams, UInt32 &numOutStreams);
-
-bool FindMethod(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId, UString &name);
-
-bool FindHashMethod(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const UString &name, CMethodId &methodId);
-
-void GetHashMethods(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CRecordVector<CMethodId> &methods);
-
-HRESULT CreateCoder(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId,
- CMyComPtr<ICompressFilter> &filter,
- CMyComPtr<ICompressCoder> &coder,
- CMyComPtr<ICompressCoder2> &coder2,
- bool encode, bool onlyCoder);
-
-HRESULT CreateCoder(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId,
- CMyComPtr<ICompressCoder> &coder,
- CMyComPtr<ICompressCoder2> &coder2,
- bool encode);
-
-HRESULT CreateCoder(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId,
- CMyComPtr<ICompressCoder> &coder, bool encode);
-
-HRESULT CreateFilter(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId,
- CMyComPtr<ICompressFilter> &filter,
- bool encode);
-
-HRESULT CreateHasher(
- DECL_EXTERNAL_CODECS_LOC_VARS
- CMethodId methodId,
- UString &name,
- CMyComPtr<IHasher> &hacher);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/FilePathAutoRename.cpp b/src/libs/7zip/win/CPP/7zip/Common/FilePathAutoRename.cpp
deleted file mode 100644
index 958360fac..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/FilePathAutoRename.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-// FilePathAutoRename.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/Defs.h"
-#include "../../Common/IntToString.h"
-
-#include "../../Windows/FileFind.h"
-
-#include "FilePathAutoRename.h"
-
-using namespace NWindows;
-
-static bool MakeAutoName(const FString &name,
- const FString &extension, unsigned value, FString &path)
-{
- FChar number[16];
- ConvertUInt32ToString(value, number);
- path = name;
- path += number;
- path += extension;
- return NFile::NFind::DoesFileOrDirExist(path);
-}
-
-bool AutoRenamePath(FString &fullProcessedPath)
-{
- FString path;
- int dotPos = fullProcessedPath.ReverseFind(FTEXT('.'));
-
- int slashPos = fullProcessedPath.ReverseFind(FTEXT('/'));
- #ifdef _WIN32
- int slash1Pos = fullProcessedPath.ReverseFind(FTEXT('\\'));
- slashPos = MyMax(slashPos, slash1Pos);
- #endif
-
- FString name, extension;
- if (dotPos > slashPos && dotPos > 0)
- {
- name.SetFrom(fullProcessedPath, dotPos);
- extension = fullProcessedPath.Ptr(dotPos);
- }
- else
- name = fullProcessedPath;
- name += L'_';
- unsigned left = 1, right = (1 << 30);
- while (left != right)
- {
- unsigned mid = (left + right) / 2;
- if (MakeAutoName(name, extension, mid, path))
- left = mid + 1;
- else
- right = mid;
- }
- return !MakeAutoName(name, extension, right, fullProcessedPath);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/FilePathAutoRename.h b/src/libs/7zip/win/CPP/7zip/Common/FilePathAutoRename.h
deleted file mode 100644
index 7b576591c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/FilePathAutoRename.h
+++ /dev/null
@@ -1,10 +0,0 @@
-// FilePathAutoRename.h
-
-#ifndef __FILE_PATH_AUTO_RENAME_H
-#define __FILE_PATH_AUTO_RENAME_H
-
-#include "../../Common/MyString.h"
-
-bool AutoRenamePath(FString &fullProcessedPath);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/FileStreams.cpp b/src/libs/7zip/win/CPP/7zip/Common/FileStreams.cpp
deleted file mode 100644
index 77e5463e6..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/FileStreams.cpp
+++ /dev/null
@@ -1,435 +0,0 @@
-// FileStreams.cpp
-
-#include "StdAfx.h"
-
-#ifndef _WIN32
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#endif
-
-#ifdef SUPPORT_DEVICE_FILE
-#include "../../../C/Alloc.h"
-#include "../../Common/Defs.h"
-#endif
-
-#include "FileStreams.h"
-
-static inline HRESULT ConvertBoolToHRESULT(bool result)
-{
- #ifdef _WIN32
- if (result)
- return S_OK;
- DWORD lastError = ::GetLastError();
- if (lastError == 0)
- return E_FAIL;
- return HRESULT_FROM_WIN32(lastError);
- #else
- return result ? S_OK: E_FAIL;
- #endif
-}
-
-#ifdef SUPPORT_DEVICE_FILE
-
-static const UInt32 kClusterSize = 1 << 18;
-CInFileStream::CInFileStream():
- VirtPos(0),
- PhyPos(0),
- Buf(0),
- BufSize(0),
- SupportHardLinks(false)
-{
-}
-
-#endif
-
-CInFileStream::~CInFileStream()
-{
- #ifdef SUPPORT_DEVICE_FILE
- MidFree(Buf);
- #endif
-}
-
-STDMETHODIMP CInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- #ifdef USE_WIN_FILE
-
- #ifdef SUPPORT_DEVICE_FILE
- if (processedSize)
- *processedSize = 0;
- if (size == 0)
- return S_OK;
- if (File.IsDeviceFile)
- {
- if (File.SizeDefined)
- {
- if (VirtPos >= File.Size)
- return VirtPos == File.Size ? S_OK : E_FAIL;
- UInt64 rem = File.Size - VirtPos;
- if (size > rem)
- size = (UInt32)rem;
- }
- for (;;)
- {
- const UInt32 mask = kClusterSize - 1;
- const UInt64 mask2 = ~(UInt64)mask;
- UInt64 alignedPos = VirtPos & mask2;
- if (BufSize > 0 && BufStartPos == alignedPos)
- {
- UInt32 pos = (UInt32)VirtPos & mask;
- if (pos >= BufSize)
- return S_OK;
- UInt32 rem = MyMin(BufSize - pos, size);
- memcpy(data, Buf + pos, rem);
- VirtPos += rem;
- if (processedSize)
- *processedSize += rem;
- return S_OK;
- }
-
- bool useBuf = false;
- if ((VirtPos & mask) != 0 || ((ptrdiff_t)data & mask) != 0 )
- useBuf = true;
- else
- {
- UInt64 end = VirtPos + size;
- if ((end & mask) != 0)
- {
- end &= mask2;
- if (end <= VirtPos)
- useBuf = true;
- else
- size = (UInt32)(end - VirtPos);
- }
- }
- if (!useBuf)
- break;
- if (alignedPos != PhyPos)
- {
- UInt64 realNewPosition;
- bool result = File.Seek(alignedPos, FILE_BEGIN, realNewPosition);
- if (!result)
- return ConvertBoolToHRESULT(result);
- PhyPos = realNewPosition;
- }
-
- BufStartPos = alignedPos;
- UInt32 readSize = kClusterSize;
- if (File.SizeDefined)
- readSize = (UInt32)MyMin(File.Size - PhyPos, (UInt64)kClusterSize);
-
- if (!Buf)
- {
- Buf = (Byte *)MidAlloc(kClusterSize);
- if (!Buf)
- return E_OUTOFMEMORY;
- }
- bool result = File.Read1(Buf, readSize, BufSize);
- if (!result)
- return ConvertBoolToHRESULT(result);
-
- if (BufSize == 0)
- return S_OK;
- PhyPos += BufSize;
- }
-
- if (VirtPos != PhyPos)
- {
- UInt64 realNewPosition;
- bool result = File.Seek(VirtPos, FILE_BEGIN, realNewPosition);
- if (!result)
- return ConvertBoolToHRESULT(result);
- PhyPos = VirtPos = realNewPosition;
- }
- }
- #endif
-
- UInt32 realProcessedSize;
- bool result = File.ReadPart(data, size, realProcessedSize);
- if (processedSize)
- *processedSize = realProcessedSize;
- #ifdef SUPPORT_DEVICE_FILE
- VirtPos += realProcessedSize;
- PhyPos += realProcessedSize;
- #endif
- return ConvertBoolToHRESULT(result);
-
- #else
-
- if (processedSize)
- *processedSize = 0;
- ssize_t res = File.Read(data, (size_t)size);
- if (res == -1)
- return E_FAIL;
- if (processedSize)
- *processedSize = (UInt32)res;
- return S_OK;
-
- #endif
-}
-
-#ifdef UNDER_CE
-STDMETHODIMP CStdInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- size_t s2 = fread(data, 1, size, stdin);
- int error = ferror(stdin);
- if (processedSize)
- *processedSize = s2;
- if (s2 <= size && error == 0)
- return S_OK;
- return E_FAIL;
-}
-#else
-STDMETHODIMP CStdInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- #ifdef _WIN32
-
- DWORD realProcessedSize;
- UInt32 sizeTemp = (1 << 20);
- if (sizeTemp > size)
- sizeTemp = size;
- BOOL res = ::ReadFile(GetStdHandle(STD_INPUT_HANDLE), data, sizeTemp, &realProcessedSize, NULL);
- if (processedSize)
- *processedSize = realProcessedSize;
- if (res == FALSE && GetLastError() == ERROR_BROKEN_PIPE)
- return S_OK;
- return ConvertBoolToHRESULT(res != FALSE);
-
- #else
-
- if (processedSize)
- *processedSize = 0;
- ssize_t res;
- do
- {
- res = read(0, data, (size_t)size);
- }
- while (res < 0 && (errno == EINTR));
- if (res == -1)
- return E_FAIL;
- if (processedSize)
- *processedSize = (UInt32)res;
- return S_OK;
-
- #endif
-}
-
-#endif
-
-STDMETHODIMP CInFileStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- if (seekOrigin >= 3)
- return STG_E_INVALIDFUNCTION;
-
- #ifdef USE_WIN_FILE
-
- #ifdef SUPPORT_DEVICE_FILE
- if (File.IsDeviceFile && (File.SizeDefined || seekOrigin != STREAM_SEEK_END))
- {
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: offset += VirtPos; break;
- case STREAM_SEEK_END: offset += File.Size; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (offset < 0)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- VirtPos = offset;
- if (newPosition)
- *newPosition = offset;
- return S_OK;
- }
- #endif
-
- UInt64 realNewPosition;
- bool result = File.Seek(offset, seekOrigin, realNewPosition);
-
- #ifdef SUPPORT_DEVICE_FILE
- PhyPos = VirtPos = realNewPosition;
- #endif
-
- if (newPosition)
- *newPosition = realNewPosition;
- return ConvertBoolToHRESULT(result);
-
- #else
-
- off_t res = File.Seek((off_t)offset, seekOrigin);
- if (res == -1)
- return E_FAIL;
- if (newPosition)
- *newPosition = (UInt64)res;
- return S_OK;
-
- #endif
-}
-
-STDMETHODIMP CInFileStream::GetSize(UInt64 *size)
-{
- return ConvertBoolToHRESULT(File.GetLength(*size));
-}
-
-#ifdef USE_WIN_FILE
-
-STDMETHODIMP CInFileStream::GetProps(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib)
-{
- BY_HANDLE_FILE_INFORMATION info;
- if (File.GetFileInformation(&info))
- {
- if (size) *size = (((UInt64)info.nFileSizeHigh) << 32) + info.nFileSizeLow;
- if (cTime) *cTime = info.ftCreationTime;
- if (aTime) *aTime = info.ftLastAccessTime;
- if (mTime) *mTime = info.ftLastWriteTime;
- if (attrib) *attrib = info.dwFileAttributes;
- return S_OK;
- }
- return GetLastError();
-}
-
-STDMETHODIMP CInFileStream::GetProps2(CStreamFileProps *props)
-{
- BY_HANDLE_FILE_INFORMATION info;
- if (File.GetFileInformation(&info))
- {
- props->Size = (((UInt64)info.nFileSizeHigh) << 32) + info.nFileSizeLow;
- props->VolID = info.dwVolumeSerialNumber;
- props->FileID_Low = (((UInt64)info.nFileIndexHigh) << 32) + info.nFileIndexLow;
- props->FileID_High = 0;
- props->NumLinks = SupportHardLinks ? info.nNumberOfLinks : 1;
- props->Attrib = info.dwFileAttributes;
- props->CTime = info.ftCreationTime;
- props->ATime = info.ftLastAccessTime;
- props->MTime = info.ftLastWriteTime;
- return S_OK;
- }
- return GetLastError();
-}
-
-#endif
-
-//////////////////////////
-// COutFileStream
-
-HRESULT COutFileStream::Close()
-{
- return ConvertBoolToHRESULT(File.Close());
-}
-
-STDMETHODIMP COutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- #ifdef USE_WIN_FILE
-
- UInt32 realProcessedSize;
- bool result = File.WritePart(data, size, realProcessedSize);
- ProcessedSize += realProcessedSize;
- if (processedSize)
- *processedSize = realProcessedSize;
- return ConvertBoolToHRESULT(result);
-
- #else
-
- if (processedSize)
- *processedSize = 0;
- ssize_t res = File.Write(data, (size_t)size);
- if (res == -1)
- return E_FAIL;
- if (processedSize)
- *processedSize = (UInt32)res;
- ProcessedSize += res;
- return S_OK;
-
- #endif
-}
-
-STDMETHODIMP COutFileStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- if (seekOrigin >= 3)
- return STG_E_INVALIDFUNCTION;
- #ifdef USE_WIN_FILE
-
- UInt64 realNewPosition;
- bool result = File.Seek(offset, seekOrigin, realNewPosition);
- if (newPosition)
- *newPosition = realNewPosition;
- return ConvertBoolToHRESULT(result);
-
- #else
-
- off_t res = File.Seek((off_t)offset, seekOrigin);
- if (res == -1)
- return E_FAIL;
- if (newPosition)
- *newPosition = (UInt64)res;
- return S_OK;
-
- #endif
-}
-
-STDMETHODIMP COutFileStream::SetSize(UInt64 newSize)
-{
- #ifdef USE_WIN_FILE
- UInt64 currentPos;
- if (!File.Seek(0, FILE_CURRENT, currentPos))
- return E_FAIL;
- bool result = File.SetLength(newSize);
- UInt64 currentPos2;
- result = result && File.Seek(currentPos, currentPos2);
- return result ? S_OK : E_FAIL;
- #else
- return E_FAIL;
- #endif
-}
-
-#ifdef UNDER_CE
-STDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- size_t s2 = fwrite(data, 1, size, stdout);
- if (processedSize)
- *processedSize = s2;
- return (s2 == size) ? S_OK : E_FAIL;
-}
-#else
-STDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
-
- #ifdef _WIN32
- UInt32 realProcessedSize;
- BOOL res = TRUE;
- if (size > 0)
- {
- // Seems that Windows doesn't like big amounts writing to stdout.
- // So we limit portions by 32KB.
- UInt32 sizeTemp = (1 << 15);
- if (sizeTemp > size)
- sizeTemp = size;
- res = ::WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
- data, sizeTemp, (DWORD *)&realProcessedSize, NULL);
- size -= realProcessedSize;
- data = (const void *)((const Byte *)data + realProcessedSize);
- if (processedSize)
- *processedSize += realProcessedSize;
- }
- return ConvertBoolToHRESULT(res != FALSE);
-
- #else
-
- ssize_t res;
- do
- {
- res = write(1, data, (size_t)size);
- }
- while (res < 0 && (errno == EINTR));
- if (res == -1)
- return E_FAIL;
- if (processedSize)
- *processedSize = (UInt32)res;
- return S_OK;
-
- return S_OK;
- #endif
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/FileStreams.h b/src/libs/7zip/win/CPP/7zip/Common/FileStreams.h
deleted file mode 100644
index cce71e582..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/FileStreams.h
+++ /dev/null
@@ -1,148 +0,0 @@
-// FileStreams.h
-
-#ifndef __FILE_STREAMS_H
-#define __FILE_STREAMS_H
-
-#ifdef _WIN32
-#define USE_WIN_FILE
-#endif
-
-#include "../../Common/MyString.h"
-
-#ifdef USE_WIN_FILE
-#include "../../Windows/FileIO.h"
-#else
-#include "../../Common/C_FileIO.h"
-#endif
-
-#include "../../Common/MyCom.h"
-
-#include "../IStream.h"
-
-class CInFileStream:
- public IInStream,
- public IStreamGetSize,
- #ifdef USE_WIN_FILE
- public IStreamGetProps,
- public IStreamGetProps2,
- #endif
- public CMyUnknownImp
-{
-public:
- #ifdef USE_WIN_FILE
- NWindows::NFile::NIO::CInFile File;
-
- #ifdef SUPPORT_DEVICE_FILE
- UInt64 VirtPos;
- UInt64 PhyPos;
- UInt64 BufStartPos;
- Byte *Buf;
- UInt32 BufSize;
- #endif
-
- #else
- NC::NFile::NIO::CInFile File;
- #endif
-
- bool SupportHardLinks;
-
- virtual ~CInFileStream();
-
- #ifdef SUPPORT_DEVICE_FILE
- CInFileStream();
- #endif
-
- bool Open(CFSTR fileName)
- {
- return File.Open(fileName);
- }
-
- bool OpenShared(CFSTR fileName, bool shareForWrite)
- {
- return File.OpenShared(fileName, shareForWrite);
- }
-
- MY_QUERYINTERFACE_BEGIN2(IInStream)
- MY_QUERYINTERFACE_ENTRY(IStreamGetSize)
- #ifdef USE_WIN_FILE
- MY_QUERYINTERFACE_ENTRY(IStreamGetProps)
- MY_QUERYINTERFACE_ENTRY(IStreamGetProps2)
- #endif
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-
- STDMETHOD(GetSize)(UInt64 *size);
- #ifdef USE_WIN_FILE
- STDMETHOD(GetProps)(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib);
- STDMETHOD(GetProps2)(CStreamFileProps *props);
- #endif
-};
-
-class CStdInFileStream:
- public ISequentialInStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
-
- virtual ~CStdInFileStream() {}
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-};
-
-class COutFileStream:
- public IOutStream,
- public CMyUnknownImp
-{
-public:
- #ifdef USE_WIN_FILE
- NWindows::NFile::NIO::COutFile File;
- #else
- NC::NFile::NIO::COutFile File;
- #endif
- virtual ~COutFileStream() {}
- bool Create(CFSTR fileName, bool createAlways)
- {
- ProcessedSize = 0;
- return File.Create(fileName, createAlways);
- }
- bool Open(CFSTR fileName, DWORD creationDisposition)
- {
- ProcessedSize = 0;
- return File.Open(fileName, creationDisposition);
- }
-
- HRESULT Close();
-
- UInt64 ProcessedSize;
-
- #ifdef USE_WIN_FILE
- bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime)
- {
- return File.SetTime(cTime, aTime, mTime);
- }
- bool SetMTime(const FILETIME *mTime) { return File.SetMTime(mTime); }
- #endif
-
-
- MY_UNKNOWN_IMP1(IOutStream)
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
- STDMETHOD(SetSize)(UInt64 newSize);
-};
-
-class CStdOutFileStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
-
- virtual ~CStdOutFileStream() {}
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/FilterCoder.cpp b/src/libs/7zip/win/CPP/7zip/Common/FilterCoder.cpp
deleted file mode 100644
index 3a2023b35..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/FilterCoder.cpp
+++ /dev/null
@@ -1,265 +0,0 @@
-// FilterCoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../../Common/Defs.h"
-
-#include "FilterCoder.h"
-#include "StreamUtils.h"
-
-static const UInt32 kBufferSize = 1 << 17;
-
-CFilterCoder::CFilterCoder()
-{
- _buffer = (Byte *)::MidAlloc(kBufferSize);
- if (_buffer == 0)
- throw 1;
-}
-
-CFilterCoder::~CFilterCoder()
-{
- ::MidFree(_buffer);
-}
-
-HRESULT CFilterCoder::WriteWithLimit(ISequentialOutStream *outStream, UInt32 size)
-{
- if (_outSizeIsDefined)
- {
- UInt64 remSize = _outSize - _nowPos64;
- if (size > remSize)
- size = (UInt32)remSize;
- }
- RINOK(WriteStream(outStream, _buffer, size));
- _nowPos64 += size;
- return S_OK;
-}
-
-STDMETHODIMP CFilterCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- RINOK(Init());
- UInt32 bufferPos = 0;
- _outSizeIsDefined = (outSize != 0);
- if (_outSizeIsDefined)
- _outSize = *outSize;
-
- while (!_outSizeIsDefined || _nowPos64 < _outSize)
- {
- size_t processedSize = kBufferSize - bufferPos;
-
- // Change it: It can be optimized using ReadPart
- RINOK(ReadStream(inStream, _buffer + bufferPos, &processedSize));
-
- UInt32 endPos = bufferPos + (UInt32)processedSize;
-
- bufferPos = Filter->Filter(_buffer, endPos);
- if (bufferPos > endPos)
- {
- for (; endPos < bufferPos; endPos++)
- _buffer[endPos] = 0;
- bufferPos = Filter->Filter(_buffer, endPos);
- }
-
- if (bufferPos == 0)
- {
- if (endPos == 0)
- return S_OK;
- return WriteWithLimit(outStream, endPos);
- }
- RINOK(WriteWithLimit(outStream, bufferPos));
- if (progress != NULL)
- {
- RINOK(progress->SetRatioInfo(&_nowPos64, &_nowPos64));
- }
- UInt32 i = 0;
- while (bufferPos < endPos)
- _buffer[i++] = _buffer[bufferPos++];
- bufferPos = i;
- }
- return S_OK;
-}
-
-STDMETHODIMP CFilterCoder::SetOutStream(ISequentialOutStream *outStream)
-{
- _bufferPos = 0;
- _outStream = outStream;
- return Init();
-}
-
-STDMETHODIMP CFilterCoder::ReleaseOutStream()
-{
- _outStream.Release();
- return S_OK;
-}
-
-
-STDMETHODIMP CFilterCoder::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- while (size > 0)
- {
- UInt32 sizeTemp = MyMin(size, kBufferSize - _bufferPos);
- memcpy(_buffer + _bufferPos, data, sizeTemp);
- size -= sizeTemp;
- if (processedSize != NULL)
- *processedSize += sizeTemp;
- data = (const Byte *)data + sizeTemp;
- UInt32 endPos = _bufferPos + sizeTemp;
- _bufferPos = Filter->Filter(_buffer, endPos);
- if (_bufferPos == 0)
- {
- _bufferPos = endPos;
- break;
- }
- if (_bufferPos > endPos)
- {
- if (size != 0)
- return E_FAIL;
- break;
- }
- RINOK(WriteWithLimit(_outStream, _bufferPos));
- UInt32 i = 0;
- while (_bufferPos < endPos)
- _buffer[i++] = _buffer[_bufferPos++];
- _bufferPos = i;
- }
- return S_OK;
-}
-
-STDMETHODIMP CFilterCoder::Flush()
-{
- if (_bufferPos != 0)
- {
- // _buffer contains only data refused by previous Filter->Filter call.
- UInt32 endPos = Filter->Filter(_buffer, _bufferPos);
- if (endPos > _bufferPos)
- {
- for (; _bufferPos < endPos; _bufferPos++)
- _buffer[_bufferPos] = 0;
- if (Filter->Filter(_buffer, endPos) != endPos)
- return E_FAIL;
- }
- RINOK(WriteWithLimit(_outStream, _bufferPos));
- _bufferPos = 0;
- }
- CMyComPtr<IOutStreamFlush> flush;
- _outStream.QueryInterface(IID_IOutStreamFlush, &flush);
- if (flush)
- return flush->Flush();
- return S_OK;
-}
-
-
-void CFilterCoder::SetInStream_NoSubFilterInit(ISequentialInStream *inStream)
-{
- _convertedPosBegin = _convertedPosEnd = _bufferPos = 0;
- _inStream = inStream;
- Init2();
-}
-
-STDMETHODIMP CFilterCoder::SetInStream(ISequentialInStream *inStream)
-{
- SetInStream_NoSubFilterInit(inStream);
- return Init();
-}
-
-STDMETHODIMP CFilterCoder::ReleaseInStream()
-{
- _inStream.Release();
- return S_OK;
-}
-
-STDMETHODIMP CFilterCoder::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- while (size > 0)
- {
- if (_convertedPosBegin != _convertedPosEnd)
- {
- UInt32 sizeTemp = MyMin(size, _convertedPosEnd - _convertedPosBegin);
- memcpy(data, _buffer + _convertedPosBegin, sizeTemp);
- _convertedPosBegin += sizeTemp;
- data = (void *)((Byte *)data + sizeTemp);
- size -= sizeTemp;
- if (processedSize != NULL)
- *processedSize += sizeTemp;
- break;
- }
- UInt32 i;
- for (i = 0; _convertedPosEnd + i < _bufferPos; i++)
- _buffer[i] = _buffer[_convertedPosEnd + i];
- _bufferPos = i;
- _convertedPosBegin = _convertedPosEnd = 0;
- size_t processedSizeTemp = kBufferSize - _bufferPos;
- RINOK(ReadStream(_inStream, _buffer + _bufferPos, &processedSizeTemp));
- _bufferPos += (UInt32)processedSizeTemp;
- _convertedPosEnd = Filter->Filter(_buffer, _bufferPos);
- if (_convertedPosEnd == 0)
- {
- if (_bufferPos == 0)
- break;
- _convertedPosEnd = _bufferPos; // check it
- continue;
- }
- if (_convertedPosEnd > _bufferPos)
- {
- for (; _bufferPos < _convertedPosEnd; _bufferPos++)
- _buffer[_bufferPos] = 0;
- _convertedPosEnd = Filter->Filter(_buffer, _bufferPos);
- }
- }
- return S_OK;
-}
-
-#ifndef _NO_CRYPTO
-
-STDMETHODIMP CFilterCoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
- return _setPassword->CryptoSetPassword(data, size);
-}
-
-STDMETHODIMP CFilterCoder::SetKey(const Byte *data, UInt32 size)
-{
- return _cryptoProperties->SetKey(data, size);
-}
-
-STDMETHODIMP CFilterCoder::SetInitVector(const Byte *data, UInt32 size)
-{
- return _cryptoProperties->SetInitVector(data, size);
-}
-
-#endif
-
-#ifndef EXTRACT_ONLY
-STDMETHODIMP CFilterCoder::SetCoderProperties(const PROPID *propIDs,
- const PROPVARIANT *properties, UInt32 numProperties)
-{
- return _SetCoderProperties->SetCoderProperties(propIDs, properties, numProperties);
-}
-
-STDMETHODIMP CFilterCoder::WriteCoderProperties(ISequentialOutStream *outStream)
-{
- return _writeCoderProperties->WriteCoderProperties(outStream);
-}
-
-/*
-STDMETHODIMP CFilterCoder::ResetSalt()
-{
- return _CryptoResetSalt->ResetSalt();
-}
-*/
-
-STDMETHODIMP CFilterCoder::ResetInitVector()
-{
- return _CryptoResetInitVector->ResetInitVector();
-}
-#endif
-
-STDMETHODIMP CFilterCoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
- return _setDecoderProperties->SetDecoderProperties2(data, size);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/FilterCoder.h b/src/libs/7zip/win/CPP/7zip/Common/FilterCoder.h
deleted file mode 100644
index 2b8f142f5..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/FilterCoder.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// FilterCoder.h
-
-#ifndef __FILTER_CODER_H
-#define __FILTER_CODER_H
-
-#include "../../Common/MyCom.h"
-#include "../ICoder.h"
-#include "../IPassword.h"
-
-#define MY_QUERYINTERFACE_ENTRY_AG(i, sub0, sub) else if (iid == IID_ ## i) \
- { if (!sub) RINOK(sub0->QueryInterface(IID_ ## i, (void **)&sub)) \
- *outObject = (void *)(i *)this; }
-
-class CFilterCoder:
- public ICompressCoder,
- public ICompressSetInStream,
- public ISequentialInStream,
- public ICompressSetOutStream,
- public ISequentialOutStream,
- public IOutStreamFlush,
-
- #ifndef _NO_CRYPTO
- public ICryptoSetPassword,
- public ICryptoProperties,
- #endif
- #ifndef EXTRACT_ONLY
- public ICompressSetCoderProperties,
- public ICompressWriteCoderProperties,
- // public ICryptoResetSalt,
- public ICryptoResetInitVector,
- #endif
- public ICompressSetDecoderProperties2,
- public CMyUnknownImp
-{
-protected:
- Byte *_buffer;
- CMyComPtr<ISequentialInStream> _inStream;
- CMyComPtr<ISequentialOutStream> _outStream;
- UInt32 _bufferPos;
- UInt32 _convertedPosBegin;
- UInt32 _convertedPosEnd;
- bool _outSizeIsDefined;
- UInt64 _outSize;
- UInt64 _nowPos64;
-
- void Init2()
- {
- _nowPos64 = 0;
- _outSizeIsDefined = false;
- }
-
- HRESULT Init()
- {
- Init2();
- return Filter->Init();
- }
-
- CMyComPtr<ICryptoSetPassword> _setPassword;
- CMyComPtr<ICryptoProperties> _cryptoProperties;
- #ifndef EXTRACT_ONLY
- CMyComPtr<ICompressSetCoderProperties> _SetCoderProperties;
- CMyComPtr<ICompressWriteCoderProperties> _writeCoderProperties;
- // CMyComPtr<ICryptoResetSalt> _CryptoResetSalt;
- CMyComPtr<ICryptoResetInitVector> _CryptoResetInitVector;
- #endif
- CMyComPtr<ICompressSetDecoderProperties2> _setDecoderProperties;
-public:
- CMyComPtr<ICompressFilter> Filter;
-
- CFilterCoder();
- ~CFilterCoder();
- HRESULT WriteWithLimit(ISequentialOutStream *outStream, UInt32 size);
-
-public:
- MY_QUERYINTERFACE_BEGIN2(ICompressCoder)
- MY_QUERYINTERFACE_ENTRY(ICompressSetInStream)
- MY_QUERYINTERFACE_ENTRY(ISequentialInStream)
- MY_QUERYINTERFACE_ENTRY(ICompressSetOutStream)
- MY_QUERYINTERFACE_ENTRY(ISequentialOutStream)
- MY_QUERYINTERFACE_ENTRY(IOutStreamFlush)
-
- #ifndef _NO_CRYPTO
- MY_QUERYINTERFACE_ENTRY_AG(ICryptoSetPassword, Filter, _setPassword)
- MY_QUERYINTERFACE_ENTRY_AG(ICryptoProperties, Filter, _cryptoProperties)
- #endif
-
- #ifndef EXTRACT_ONLY
- MY_QUERYINTERFACE_ENTRY_AG(ICompressSetCoderProperties, Filter, _SetCoderProperties)
- MY_QUERYINTERFACE_ENTRY_AG(ICompressWriteCoderProperties, Filter, _writeCoderProperties)
- // MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetSalt, Filter, _CryptoResetSalt)
- MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetInitVector, Filter, _CryptoResetInitVector)
- #endif
-
- MY_QUERYINTERFACE_ENTRY_AG(ICompressSetDecoderProperties2, Filter, _setDecoderProperties)
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); \
- STDMETHOD(SetOutStream)(ISequentialOutStream *outStream);
- STDMETHOD(ReleaseOutStream)();
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Flush)();
-
- #ifndef _NO_CRYPTO
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-
- STDMETHOD(SetKey)(const Byte *data, UInt32 size);
- STDMETHOD(SetInitVector)(const Byte *data, UInt32 size);
- #endif
- #ifndef EXTRACT_ONLY
- STDMETHOD(SetCoderProperties)(const PROPID *propIDs,
- const PROPVARIANT *properties, UInt32 numProperties);
- STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);
- // STDMETHOD(ResetSalt)();
- STDMETHOD(ResetInitVector)();
- #endif
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
- void SetInStream_NoSubFilterInit(ISequentialInStream *inStream);
-
-};
-
-class CInStreamReleaser
-{
-public:
- CFilterCoder *FilterCoder;
- CInStreamReleaser(): FilterCoder(0) {}
- ~CInStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseInStream(); }
-};
-
-class COutStreamReleaser
-{
-public:
- CFilterCoder *FilterCoder;
- COutStreamReleaser(): FilterCoder(0) {}
- ~COutStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseOutStream(); }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/InBuffer.cpp b/src/libs/7zip/win/CPP/7zip/Common/InBuffer.cpp
deleted file mode 100644
index 133d95b38..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/InBuffer.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-// InBuffer.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "InBuffer.h"
-
-CInBufferBase::CInBufferBase() throw():
- _buf(0),
- _bufLim(0),
- _bufBase(0),
- _stream(0),
- _processedSize(0),
- _bufSize(0),
- _wasFinished(false),
- NumExtraBytes(0)
-{}
-
-bool CInBuffer::Create(size_t bufSize) throw()
-{
- const unsigned kMinBlockSize = 1;
- if (bufSize < kMinBlockSize)
- bufSize = kMinBlockSize;
- if (_bufBase != 0 && _bufSize == bufSize)
- return true;
- Free();
- _bufSize = bufSize;
- _bufBase = (Byte *)::MidAlloc(bufSize);
- return (_bufBase != 0);
-}
-
-void CInBuffer::Free() throw()
-{
- ::MidFree(_bufBase);
- _bufBase = 0;
-}
-
-void CInBufferBase::Init() throw()
-{
- _processedSize = 0;
- _buf = _bufBase;
- _bufLim = _buf;
- _wasFinished = false;
- #ifdef _NO_EXCEPTIONS
- ErrorCode = S_OK;
- #endif
- NumExtraBytes = 0;
-}
-
-bool CInBufferBase::ReadBlock()
-{
- #ifdef _NO_EXCEPTIONS
- if (ErrorCode != S_OK)
- return false;
- #endif
- if (_wasFinished)
- return false;
- _processedSize += (_buf - _bufBase);
- _buf = _bufBase;
- _bufLim = _bufBase;
- UInt32 processed;
- // FIX_ME: we can improve it to support (_bufSize >= (1 << 32))
- HRESULT result = _stream->Read(_bufBase, (UInt32)_bufSize, &processed);
- #ifdef _NO_EXCEPTIONS
- ErrorCode = result;
- #else
- if (result != S_OK)
- throw CInBufferException(result);
- #endif
- _bufLim = _buf + processed;
- _wasFinished = (processed == 0);
- return !_wasFinished;
-}
-
-bool CInBufferBase::ReadByte_FromNewBlock(Byte &b)
-{
- if (!ReadBlock())
- {
- NumExtraBytes++;
- b = 0xFF;
- return false;
- }
- b = *_buf++;
- return true;
-}
-
-Byte CInBufferBase::ReadByte_FromNewBlock()
-{
- if (!ReadBlock())
- {
- NumExtraBytes++;
- return 0xFF;
- }
- return *_buf++;
-}
-
-size_t CInBufferBase::ReadBytes(Byte *buf, size_t size)
-{
- if ((size_t)(_bufLim - _buf) >= size)
- {
- const Byte *src = _buf;
- for (size_t i = 0; i < size; i++)
- buf[i] = src[i];
- _buf += size;
- return size;
- }
- for (size_t i = 0; i < size; i++)
- {
- if (_buf >= _bufLim)
- if (!ReadBlock())
- return i;
- buf[i] = *_buf++;
- }
- return size;
-}
-
-size_t CInBufferBase::Skip(size_t size)
-{
- size_t processed = 0;
- for (;;)
- {
- size_t rem = (_bufLim - _buf);
- if (rem >= size)
- {
- _buf += size;
- return processed + size;
- }
- _buf += rem;
- processed += rem;
- size -= rem;
- if (!ReadBlock())
- return processed;
- }
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/InBuffer.h b/src/libs/7zip/win/CPP/7zip/Common/InBuffer.h
deleted file mode 100644
index dd3c66808..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/InBuffer.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// InBuffer.h
-
-#ifndef __IN_BUFFER_H
-#define __IN_BUFFER_H
-
-#include "../../Common/MyException.h"
-#include "../IStream.h"
-
-#ifndef _NO_EXCEPTIONS
-struct CInBufferException: public CSystemException
-{
- CInBufferException(HRESULT errorCode): CSystemException(errorCode) {}
-};
-#endif
-
-class CInBufferBase
-{
-protected:
- Byte *_buf;
- Byte *_bufLim;
- Byte *_bufBase;
-
- ISequentialInStream *_stream;
- UInt64 _processedSize;
- size_t _bufSize; // actually it's number of Bytes for next read. The buf can be larger
- // only up to 32-bits values now are supported!
- bool _wasFinished;
-
- bool ReadBlock();
- bool ReadByte_FromNewBlock(Byte &b);
- Byte ReadByte_FromNewBlock();
-
-public:
- #ifdef _NO_EXCEPTIONS
- HRESULT ErrorCode;
- #endif
- UInt32 NumExtraBytes;
-
- CInBufferBase() throw();
-
- UInt64 GetStreamSize() const { return _processedSize + (_buf - _bufBase); }
- UInt64 GetProcessedSize() const { return _processedSize + NumExtraBytes + (_buf - _bufBase); }
- bool WasFinished() const { return _wasFinished; }
-
- void SetStream(ISequentialInStream *stream) { _stream = stream; }
-
- void SetBuf(Byte *buf, size_t bufSize, size_t end, size_t pos)
- {
- _bufBase = buf;
- _bufSize = bufSize;
- _processedSize = 0;
- _buf = buf + pos;
- _bufLim = buf + end;
- _wasFinished = false;
- #ifdef _NO_EXCEPTIONS
- ErrorCode = S_OK;
- #endif
- NumExtraBytes = 0;
- }
-
- void Init() throw();
-
- bool ReadByte(Byte &b)
- {
- if (_buf >= _bufLim)
- return ReadByte_FromNewBlock(b);
- b = *_buf++;
- return true;
- }
-
- Byte ReadByte()
- {
- if (_buf >= _bufLim)
- return ReadByte_FromNewBlock();
- return *_buf++;
- }
-
- size_t ReadBytes(Byte *buf, size_t size);
- size_t Skip(size_t size);
-};
-
-class CInBuffer: public CInBufferBase
-{
-public:
- ~CInBuffer() { Free(); }
- bool Create(size_t bufSize) throw(); // only up to 32-bits values now are supported!
- void Free() throw();
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/InOutTempBuffer.cpp b/src/libs/7zip/win/CPP/7zip/Common/InOutTempBuffer.cpp
deleted file mode 100644
index be65ba32f..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/InOutTempBuffer.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-// InOutTempBuffer.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-
-#include "../../Common/Defs.h"
-
-#include "InOutTempBuffer.h"
-#include "StreamUtils.h"
-
-using namespace NWindows;
-using namespace NFile;
-using namespace NDir;
-
-static const UInt32 kTempBufSize = (1 << 20);
-
-static CFSTR kTempFilePrefixString = FTEXT("7zt");
-
-CInOutTempBuffer::CInOutTempBuffer(): _buf(NULL) { }
-
-void CInOutTempBuffer::Create()
-{
- if (!_buf)
- _buf = new Byte[kTempBufSize];
-}
-
-CInOutTempBuffer::~CInOutTempBuffer()
-{
- delete []_buf;
-}
-
-void CInOutTempBuffer::InitWriting()
-{
- _bufPos = 0;
- _tempFileCreated = false;
- _size = 0;
- _crc = CRC_INIT_VAL;
-}
-
-bool CInOutTempBuffer::WriteToFile(const void *data, UInt32 size)
-{
- if (size == 0)
- return true;
- if (!_tempFileCreated)
- {
- if (!_tempFile.CreateRandomInTempFolder(kTempFilePrefixString, &_outFile))
- return false;
- _tempFileCreated = true;
- }
- UInt32 processed;
- if (!_outFile.Write(data, size, processed))
- return false;
- _crc = CrcUpdate(_crc, data, processed);
- _size += processed;
- return (processed == size);
-}
-
-bool CInOutTempBuffer::Write(const void *data, UInt32 size)
-{
- if (_bufPos < kTempBufSize)
- {
- UInt32 cur = MyMin(kTempBufSize - _bufPos, size);
- memcpy(_buf + _bufPos, data, cur);
- _crc = CrcUpdate(_crc, data, cur);
- _bufPos += cur;
- size -= cur;
- data = ((const Byte *)data) + cur;
- _size += cur;
- }
- return WriteToFile(data, size);
-}
-
-HRESULT CInOutTempBuffer::WriteToStream(ISequentialOutStream *stream)
-{
- if (!_outFile.Close())
- return E_FAIL;
-
- UInt64 size = 0;
- UInt32 crc = CRC_INIT_VAL;
-
- if (_bufPos > 0)
- {
- RINOK(WriteStream(stream, _buf, _bufPos));
- crc = CrcUpdate(crc, _buf, _bufPos);
- size += _bufPos;
- }
- if (_tempFileCreated)
- {
- NIO::CInFile inFile;
- if (!inFile.Open(_tempFile.GetPath()))
- return E_FAIL;
- while (size < _size)
- {
- UInt32 processed;
- if (!inFile.ReadPart(_buf, kTempBufSize, processed))
- return E_FAIL;
- if (processed == 0)
- break;
- RINOK(WriteStream(stream, _buf, processed));
- crc = CrcUpdate(crc, _buf, processed);
- size += processed;
- }
- }
- return (_crc == crc && size == _size) ? S_OK : E_FAIL;
-}
-
-STDMETHODIMP CSequentialOutTempBufferImp::Write(const void *data, UInt32 size, UInt32 *processed)
-{
- if (!_buf->Write(data, size))
- {
- if (processed != NULL)
- *processed = 0;
- return E_FAIL;
- }
- if (processed != NULL)
- *processed = size;
- return S_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/InOutTempBuffer.h b/src/libs/7zip/win/CPP/7zip/Common/InOutTempBuffer.h
deleted file mode 100644
index 256d72420..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/InOutTempBuffer.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// InOutTempBuffer.h
-
-#ifndef __IN_OUT_TEMP_BUFFER_H
-#define __IN_OUT_TEMP_BUFFER_H
-
-#include "../../Common/MyCom.h"
-#include "../../Windows/FileDir.h"
-
-#include "../IStream.h"
-
-class CInOutTempBuffer
-{
- NWindows::NFile::NDir::CTempFile _tempFile;
- NWindows::NFile::NIO::COutFile _outFile;
- Byte *_buf;
- UInt32 _bufPos;
- bool _tempFileCreated;
- UInt64 _size;
- UInt32 _crc;
-
- bool WriteToFile(const void *data, UInt32 size);
-public:
- CInOutTempBuffer();
- ~CInOutTempBuffer();
- void Create();
-
- void InitWriting();
- bool Write(const void *data, UInt32 size);
-
- HRESULT WriteToStream(ISequentialOutStream *stream);
- UInt64 GetDataSize() const { return _size; }
-};
-
-class CSequentialOutTempBufferImp:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CInOutTempBuffer *_buf;
-public:
- void Init(CInOutTempBuffer *buffer) { _buf = buffer; }
- MY_UNKNOWN_IMP
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/LimitedStreams.cpp b/src/libs/7zip/win/CPP/7zip/Common/LimitedStreams.cpp
deleted file mode 100644
index 5f20dcda4..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/LimitedStreams.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-// LimitedStreams.cpp
-
-#include "StdAfx.h"
-
-#include "LimitedStreams.h"
-#include "../../Common/Defs.h"
-
-STDMETHODIMP CLimitedSequentialInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize = 0;
- UInt32 sizeToRead = (UInt32)MyMin((_size - _pos), (UInt64)size);
- HRESULT result = S_OK;
- if (sizeToRead > 0)
- {
- result = _stream->Read(data, sizeToRead, &realProcessedSize);
- _pos += realProcessedSize;
- if (realProcessedSize == 0)
- _wasFinished = true;
- }
- if (processedSize)
- *processedSize = realProcessedSize;
- return result;
-}
-
-STDMETHODIMP CLimitedInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (_virtPos >= _size)
- {
- // 9.31: Fixed. Windows doesn't return error in ReadFile and IStream->Read in that case.
- return S_OK;
- // return (_virtPos == _size) ? S_OK: E_FAIL; // ERROR_HANDLE_EOF
- }
- UInt64 rem = _size - _virtPos;
- if (rem < size)
- size = (UInt32)rem;
- UInt64 newPos = _startOffset + _virtPos;
- if (newPos != _physPos)
- {
- _physPos = newPos;
- RINOK(SeekToPhys());
- }
- HRESULT res = _stream->Read(data, size, &size);
- if (processedSize)
- *processedSize = size;
- _physPos += size;
- _virtPos += size;
- return res;
-}
-
-STDMETHODIMP CLimitedInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: offset += _virtPos; break;
- case STREAM_SEEK_END: offset += _size; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (offset < 0)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- _virtPos = offset;
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
-}
-
-HRESULT CreateLimitedInStream(IInStream *inStream, UInt64 pos, UInt64 size, ISequentialInStream **resStream)
-{
- *resStream = 0;
- CLimitedInStream *streamSpec = new CLimitedInStream;
- CMyComPtr<ISequentialInStream> streamTemp = streamSpec;
- streamSpec->SetStream(inStream);
- RINOK(streamSpec->InitAndSeek(pos, size));
- streamSpec->SeekToStart();
- *resStream = streamTemp.Detach();
- return S_OK;
-}
-
-STDMETHODIMP CClusterInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (_virtPos >= Size)
- return S_OK;
-
- if (_curRem == 0)
- {
- UInt32 blockSize = (UInt32)1 << BlockSizeLog;
- UInt32 virtBlock = (UInt32)(_virtPos >> BlockSizeLog);
- UInt32 offsetInBlock = (UInt32)_virtPos & (blockSize - 1);
- UInt32 phyBlock = Vector[virtBlock];
- UInt64 newPos = StartOffset + ((UInt64)phyBlock << BlockSizeLog) + offsetInBlock;
- if (newPos != _physPos)
- {
- _physPos = newPos;
- RINOK(SeekToPhys());
- }
- _curRem = blockSize - offsetInBlock;
- for (int i = 1; i < 64 && (virtBlock + i) < (UInt32)Vector.Size() && phyBlock + i == Vector[virtBlock + i]; i++)
- _curRem += (UInt32)1 << BlockSizeLog;
- UInt64 rem = Size - _virtPos;
- if (_curRem > rem)
- _curRem = (UInt32)rem;
- }
- if (size > _curRem)
- size = _curRem;
- HRESULT res = Stream->Read(data, size, &size);
- if (processedSize)
- *processedSize = size;
- _physPos += size;
- _virtPos += size;
- _curRem -= size;
- return res;
-}
-
-STDMETHODIMP CClusterInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: offset += _virtPos; break;
- case STREAM_SEEK_END: offset += Size; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (offset < 0)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- if (_virtPos != (UInt64)offset)
- _curRem = 0;
- _virtPos = offset;
- if (newPosition)
- *newPosition = offset;
- return S_OK;
-}
-
-
-STDMETHODIMP CExtentsStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (_virtPos >= Extents.Back().Virt)
- return S_OK;
- if (size == 0)
- return S_OK;
-
- unsigned left = 0, right = Extents.Size() - 1;
- for (;;)
- {
- unsigned 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;
-}
-
-STDMETHODIMP CExtentsStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: offset += _virtPos; break;
- case STREAM_SEEK_END: offset += Extents.Back().Virt; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (offset < 0)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- _virtPos = offset;
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
-}
-
-
-STDMETHODIMP CLimitedSequentialOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- HRESULT result = S_OK;
- if (processedSize)
- *processedSize = 0;
- if (size > _size)
- {
- if (_size == 0)
- {
- _overflow = true;
- if (!_overflowIsAllowed)
- return E_FAIL;
- if (processedSize)
- *processedSize = size;
- return S_OK;
- }
- size = (UInt32)_size;
- }
- if (_stream)
- result = _stream->Write(data, size, &size);
- _size -= size;
- if (processedSize)
- *processedSize = size;
- return result;
-}
-
-
-STDMETHODIMP CTailInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 cur;
- HRESULT res = Stream->Read(data, size, &cur);
- if (processedSize)
- *processedSize = cur;
- _virtPos += cur;
- return res;
-}
-
-STDMETHODIMP CTailInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: offset += _virtPos; break;
- case STREAM_SEEK_END:
- {
- UInt64 pos = 0;
- RINOK(Stream->Seek(offset, STREAM_SEEK_END, &pos));
- if (pos < Offset)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- _virtPos = pos - Offset;
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
- }
- default: return STG_E_INVALIDFUNCTION;
- }
- if (offset < 0)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- _virtPos = offset;
- if (newPosition)
- *newPosition = _virtPos;
- return Stream->Seek(Offset + _virtPos, STREAM_SEEK_SET, NULL);
-}
-
-STDMETHODIMP CLimitedCachedInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (_virtPos >= _size)
- {
- // 9.31: Fixed. Windows doesn't return error in ReadFile and IStream->Read in that case.
- return S_OK;
- // return (_virtPos == _size) ? S_OK: E_FAIL; // ERROR_HANDLE_EOF
- }
- UInt64 rem = _size - _virtPos;
- if (rem < size)
- size = (UInt32)rem;
-
- UInt64 newPos = _startOffset + _virtPos;
- UInt64 offsetInCache = newPos - _cachePhyPos;
- HRESULT res = S_OK;
- if (newPos >= _cachePhyPos &&
- offsetInCache <= _cacheSize &&
- size <= _cacheSize - (size_t)offsetInCache)
- memcpy(data, _cache + (size_t)offsetInCache, size);
- else
- {
- if (newPos != _physPos)
- {
- _physPos = newPos;
- RINOK(SeekToPhys());
- }
- res = _stream->Read(data, size, &size);
- _physPos += size;
- }
- if (processedSize)
- *processedSize = size;
- _virtPos += size;
- return res;
-}
-
-STDMETHODIMP CLimitedCachedInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: offset += _virtPos; break;
- case STREAM_SEEK_END: offset += _size; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (offset < 0)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- _virtPos = offset;
- if (newPosition)
- *newPosition = _virtPos;
- return S_OK;
-}
-
-STDMETHODIMP CTailOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 cur;
- HRESULT res = Stream->Write(data, size, &cur);
- if (processedSize)
- *processedSize = cur;
- _virtPos += cur;
- if (_virtSize < _virtPos)
- _virtSize = _virtPos;
- return res;
-}
-
-STDMETHODIMP CTailOutStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: offset += _virtPos; break;
- case STREAM_SEEK_END: offset += _virtSize; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (offset < 0)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- _virtPos = offset;
- if (newPosition)
- *newPosition = _virtPos;
- return Stream->Seek(Offset + _virtPos, STREAM_SEEK_SET, NULL);
-}
-
-STDMETHODIMP CTailOutStream::SetSize(UInt64 newSize)
-{
- _virtSize = newSize;
- return Stream->SetSize(Offset + newSize);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/LimitedStreams.h b/src/libs/7zip/win/CPP/7zip/Common/LimitedStreams.h
deleted file mode 100644
index b14616f3b..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/LimitedStreams.h
+++ /dev/null
@@ -1,251 +0,0 @@
-// LimitedStreams.h
-
-#ifndef __LIMITED_STREAMS_H
-#define __LIMITED_STREAMS_H
-
-#include "../../Common/MyBuffer.h"
-#include "../../Common/MyCom.h"
-#include "../../Common/MyVector.h"
-#include "../IStream.h"
-
-class CLimitedSequentialInStream:
- public ISequentialInStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialInStream> _stream;
- UInt64 _size;
- UInt64 _pos;
- bool _wasFinished;
-public:
- void SetStream(ISequentialInStream *stream) { _stream = stream; }
- void ReleaseStream() { _stream.Release(); }
- void Init(UInt64 streamSize)
- {
- _size = streamSize;
- _pos = 0;
- _wasFinished = false;
- }
-
- MY_UNKNOWN_IMP1(ISequentialInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- UInt64 GetSize() const { return _pos; }
- bool WasFinished() const { return _wasFinished; }
-};
-
-class CLimitedInStream:
- public IInStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- UInt64 _virtPos;
- UInt64 _physPos;
- UInt64 _size;
- UInt64 _startOffset;
-
- HRESULT SeekToPhys() { return _stream->Seek(_physPos, STREAM_SEEK_SET, NULL); }
-public:
- void SetStream(IInStream *stream) { _stream = stream; }
- HRESULT InitAndSeek(UInt64 startOffset, UInt64 size)
- {
- _startOffset = startOffset;
- _physPos = startOffset;
- _virtPos = 0;
- _size = size;
- return SeekToPhys();
- }
-
- MY_UNKNOWN_IMP2(ISequentialInStream, IInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-
- HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); }
-};
-
-HRESULT CreateLimitedInStream(IInStream *inStream, UInt64 pos, UInt64 size, ISequentialInStream **resStream);
-
-class CClusterInStream:
- public IInStream,
- public CMyUnknownImp
-{
- UInt64 _virtPos;
- UInt64 _physPos;
- UInt32 _curRem;
-public:
- CMyComPtr<IInStream> Stream;
- UInt64 StartOffset;
- UInt64 Size;
- unsigned BlockSizeLog;
- CRecordVector<UInt32> Vector;
-
- HRESULT SeekToPhys() { return Stream->Seek(_physPos, STREAM_SEEK_SET, NULL); }
-
- HRESULT InitAndSeek()
- {
- _curRem = 0;
- _virtPos = 0;
- _physPos = StartOffset;
- if (Vector.Size() > 0)
- {
- _physPos = StartOffset + (Vector[0] << BlockSizeLog);
- return SeekToPhys();
- }
- return S_OK;
- }
-
- MY_UNKNOWN_IMP2(ISequentialInStream, IInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-
-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_IMP2(ISequentialInStream, 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;
- }
-};
-
-class CLimitedSequentialOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialOutStream> _stream;
- UInt64 _size;
- bool _overflow;
- bool _overflowIsAllowed;
-public:
- MY_UNKNOWN_IMP1(ISequentialOutStream)
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- void SetStream(ISequentialOutStream *stream) { _stream = stream; }
- void ReleaseStream() { _stream.Release(); }
- void Init(UInt64 size, bool overflowIsAllowed = false)
- {
- _size = size;
- _overflow = false;
- _overflowIsAllowed = overflowIsAllowed;
- }
- bool IsFinishedOK() const { return (_size == 0 && !_overflow); }
- UInt64 GetRem() const { return _size; }
-};
-
-
-class CTailInStream:
- public IInStream,
- public CMyUnknownImp
-{
- UInt64 _virtPos;
-public:
- CMyComPtr<IInStream> Stream;
- UInt64 Offset;
-
- void Init()
- {
- _virtPos = 0;
- }
-
- MY_UNKNOWN_IMP2(ISequentialInStream, IInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-
- HRESULT SeekToStart() { return Stream->Seek(Offset, STREAM_SEEK_SET, NULL); }
-};
-
-class CLimitedCachedInStream:
- public IInStream,
- public CMyUnknownImp
-{
- CMyComPtr<IInStream> _stream;
- UInt64 _virtPos;
- UInt64 _physPos;
- UInt64 _size;
- UInt64 _startOffset;
-
- const Byte *_cache;
- size_t _cacheSize;
- size_t _cachePhyPos;
-
-
- HRESULT SeekToPhys() { return _stream->Seek(_physPos, STREAM_SEEK_SET, NULL); }
-public:
- CByteBuffer Buffer;
-
- void SetStream(IInStream *stream) { _stream = stream; }
- void SetCache(size_t cacheSize, size_t cachePos)
- {
- _cache = Buffer;
- _cacheSize = cacheSize;
- _cachePhyPos = cachePos;
- }
-
- HRESULT InitAndSeek(UInt64 startOffset, UInt64 size)
- {
- _startOffset = startOffset;
- _physPos = startOffset;
- _virtPos = 0;
- _size = size;
- return SeekToPhys();
- }
-
- MY_UNKNOWN_IMP2(ISequentialInStream, IInStream)
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-
- HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); }
-};
-
-class CTailOutStream:
- public IOutStream,
- public CMyUnknownImp
-{
- UInt64 _virtPos;
- UInt64 _virtSize;
-public:
- CMyComPtr<IOutStream> Stream;
- UInt64 Offset;
-
- virtual ~CTailOutStream() {}
-
- MY_UNKNOWN_IMP2(ISequentialOutStream, IOutStream)
-
- void Init()
- {
- _virtPos = 0;
- _virtSize = 0;
- }
-
- 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/LockedStream.cpp b/src/libs/7zip/win/CPP/7zip/Common/LockedStream.cpp
deleted file mode 100644
index f05601cb6..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/LockedStream.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-// LockedStream.cpp
-
-#include "StdAfx.h"
-
-#include "LockedStream.h"
-
-HRESULT CLockedInStream::Read(UInt64 startPos, void *data, UInt32 size,
- UInt32 *processedSize)
-{
- NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
- RINOK(_stream->Seek(startPos, STREAM_SEEK_SET, NULL));
- return _stream->Read(data, size, processedSize);
-}
-
-STDMETHODIMP CLockedSequentialInStreamImp::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize = 0;
- HRESULT result = _lockedInStream->Read(_pos, data, size, &realProcessedSize);
- _pos += realProcessedSize;
- if (processedSize != NULL)
- *processedSize = realProcessedSize;
- return result;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/LockedStream.h b/src/libs/7zip/win/CPP/7zip/Common/LockedStream.h
deleted file mode 100644
index 486e4220b..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/LockedStream.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// LockedStream.h
-
-#ifndef __LOCKEDSTREAM_H
-#define __LOCKEDSTREAM_H
-
-#include "../../Windows/Synchronization.h"
-#include "../../Common/MyCom.h"
-#include "../IStream.h"
-
-class CLockedInStream
-{
- CMyComPtr<IInStream> _stream;
- NWindows::NSynchronization::CCriticalSection _criticalSection;
-public:
- void Init(IInStream *stream)
- { _stream = stream; }
- HRESULT Read(UInt64 startPos, void *data, UInt32 size, UInt32 *processedSize);
-};
-
-class CLockedSequentialInStreamImp:
- public ISequentialInStream,
- public CMyUnknownImp
-{
- CLockedInStream *_lockedInStream;
- UInt64 _pos;
-public:
- void Init(CLockedInStream *lockedInStream, UInt64 startPos)
- {
- _lockedInStream = lockedInStream;
- _pos = startPos;
- }
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/MethodId.h b/src/libs/7zip/win/CPP/7zip/Common/MethodId.h
deleted file mode 100644
index 28b615fcd..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/MethodId.h
+++ /dev/null
@@ -1,10 +0,0 @@
-// MethodId.h
-
-#ifndef __7Z_METHOD_ID_H
-#define __7Z_METHOD_ID_H
-
-#include "../../Common/MyTypes.h"
-
-typedef UInt64 CMethodId;
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/MethodProps.cpp b/src/libs/7zip/win/CPP/7zip/Common/MethodProps.cpp
deleted file mode 100644
index ff61995b7..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/MethodProps.cpp
+++ /dev/null
@@ -1,441 +0,0 @@
-// MethodProps.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/StringToInt.h"
-
-#include "MethodProps.h"
-
-using namespace NWindows;
-
-bool StringToBool(const UString &s, bool &res)
-{
- if (s.IsEmpty() || s == L"+" || StringsAreEqualNoCase_Ascii(s, "ON"))
- {
- res = true;
- return true;
- }
- if (s == L"-" || StringsAreEqualNoCase_Ascii(s, "OFF"))
- {
- res = false;
- return true;
- }
- return false;
-}
-
-HRESULT PROPVARIANT_to_bool(const PROPVARIANT &prop, bool &dest)
-{
- switch (prop.vt)
- {
- case VT_EMPTY: dest = true; return S_OK;
- case VT_BOOL: dest = (prop.boolVal != VARIANT_FALSE); return S_OK;
- case VT_BSTR: return StringToBool(prop.bstrVal, dest) ? S_OK : E_INVALIDARG;
- }
- return E_INVALIDARG;
-}
-
-unsigned ParseStringToUInt32(const UString &srcString, UInt32 &number)
-{
- const wchar_t *start = srcString;
- const wchar_t *end;
- number = ConvertStringToUInt32(start, &end);
- return (unsigned)(end - start);
-}
-
-HRESULT ParsePropToUInt32(const UString &name, const PROPVARIANT &prop, UInt32 &resValue)
-{
- // =VT_UI4
- // =VT_EMPTY
- // {stringUInt32}=VT_EMPTY
-
- if (prop.vt == VT_UI4)
- {
- if (!name.IsEmpty())
- return E_INVALIDARG;
- resValue = prop.ulVal;
- return S_OK;
- }
- if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- if (name.IsEmpty())
- return S_OK;
- UInt32 v;
- if (ParseStringToUInt32(name, v) != name.Len())
- return E_INVALIDARG;
- resValue = v;
- return S_OK;
-}
-
-HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads)
-{
- if (name.IsEmpty())
- {
- switch (prop.vt)
- {
- case VT_UI4:
- numThreads = prop.ulVal;
- break;
- default:
- {
- bool val;
- RINOK(PROPVARIANT_to_bool(prop, val));
- numThreads = (val ? defaultNumThreads : 1);
- break;
- }
- }
- return S_OK;
- }
- if (prop.vt != VT_EMPTY)
- return E_INVALIDARG;
- return ParsePropToUInt32(name, prop, numThreads);
-}
-
-static HRESULT StringToDictSize(const UString &s, UInt32 &dicSize)
-{
- const wchar_t *end;
- UInt32 number = ConvertStringToUInt32(s, &end);
- unsigned numDigits = (unsigned)(end - s);
- if (numDigits == 0 || s.Len() > numDigits + 1)
- return E_INVALIDARG;
- const unsigned kLogDictSizeLimit = 32;
- if (s.Len() == numDigits)
- {
- if (number >= kLogDictSizeLimit)
- return E_INVALIDARG;
- dicSize = (UInt32)1 << (unsigned)number;
- return S_OK;
- }
- unsigned numBits;
- switch (MyCharLower_Ascii(s[numDigits]))
- {
- case 'b': dicSize = number; return S_OK;
- case 'k': numBits = 10; break;
- case 'm': numBits = 20; break;
- case 'g': numBits = 30; break;
- default: return E_INVALIDARG;
- }
- if (number >= ((UInt32)1 << (kLogDictSizeLimit - numBits)))
- return E_INVALIDARG;
- dicSize = number << numBits;
- return S_OK;
-}
-
-static HRESULT PROPVARIANT_to_DictSize(const PROPVARIANT &prop, UInt32 &resValue)
-{
- if (prop.vt == VT_UI4)
- {
- UInt32 v = prop.ulVal;
- if (v >= 32)
- return E_INVALIDARG;
- resValue = (UInt32)1 << v;
- return S_OK;
- }
- if (prop.vt == VT_BSTR)
- return StringToDictSize(prop.bstrVal, resValue);
- return E_INVALIDARG;
-}
-
-void CProps::AddProp32(PROPID propid, UInt32 level)
-{
- CProp prop;
- prop.IsOptional = true;
- prop.Id = propid;
- prop.Value = (UInt32)level;
- Props.Add(prop);
-}
-
-class CCoderProps
-{
- PROPID *_propIDs;
- NCOM::CPropVariant *_props;
- unsigned _numProps;
- unsigned _numPropsMax;
-public:
- CCoderProps(unsigned numPropsMax)
- {
- _numPropsMax = numPropsMax;
- _numProps = 0;
- _propIDs = new PROPID[numPropsMax];
- _props = new NCOM::CPropVariant[numPropsMax];
- }
- ~CCoderProps()
- {
- delete []_propIDs;
- delete []_props;
- }
- void AddProp(const CProp &prop);
- HRESULT SetProps(ICompressSetCoderProperties *setCoderProperties)
- {
- return setCoderProperties->SetCoderProperties(_propIDs, _props, _numProps);
- }
-};
-
-void CCoderProps::AddProp(const CProp &prop)
-{
- if (_numProps >= _numPropsMax)
- throw 1;
- _propIDs[_numProps] = prop.Id;
- _props[_numProps] = prop.Value;
- _numProps++;
-}
-
-HRESULT CProps::SetCoderProps(ICompressSetCoderProperties *scp, const UInt64 *dataSizeReduce) const
-{
- CCoderProps coderProps(Props.Size() + (dataSizeReduce ? 1 : 0));
- FOR_VECTOR (i, Props)
- coderProps.AddProp(Props[i]);
- if (dataSizeReduce)
- {
- CProp prop;
- prop.Id = NCoderPropID::kReduceSize;
- prop.Value = *dataSizeReduce;
- coderProps.AddProp(prop);
- }
- return coderProps.SetProps(scp);
-}
-
-
-int CMethodProps::FindProp(PROPID id) const
-{
- for (int i = Props.Size() - 1; i >= 0; i--)
- if (Props[i].Id == id)
- return i;
- return -1;
-}
-
-int CMethodProps::GetLevel() const
-{
- int i = FindProp(NCoderPropID::kLevel);
- if (i < 0)
- return 5;
- if (Props[i].Value.vt != VT_UI4)
- return 9;
- UInt32 level = Props[i].Value.ulVal;
- return level > 9 ? 9 : (int)level;
-}
-
-struct CNameToPropID
-{
- VARTYPE VarType;
- const char *Name;
-};
-
-static const CNameToPropID g_NameToPropID[] =
-{
- { VT_UI4, "" },
- { VT_UI4, "d" },
- { VT_UI4, "mem" },
- { VT_UI4, "o" },
- { VT_UI4, "c" },
- { VT_UI4, "pb" },
- { VT_UI4, "lc" },
- { VT_UI4, "lp" },
- { VT_UI4, "fb" },
- { VT_BSTR, "mf" },
- { VT_UI4, "mc" },
- { VT_UI4, "pass" },
- { VT_UI4, "a" },
- { VT_UI4, "mt" },
- { VT_BOOL, "eos" },
- { VT_UI4, "x" },
- { VT_UI4, "reduceSize" }
-};
-
-static int FindPropIdExact(const UString &name)
-{
- for (unsigned i = 0; i < ARRAY_SIZE(g_NameToPropID); i++)
- if (StringsAreEqualNoCase_Ascii(name, g_NameToPropID[i].Name))
- return i;
- return -1;
-}
-
-static bool ConvertProperty(const PROPVARIANT &srcProp, VARTYPE varType, NCOM::CPropVariant &destProp)
-{
- if (varType == srcProp.vt)
- {
- destProp = srcProp;
- return true;
- }
- if (varType == VT_BOOL)
- {
- bool res;
- if (PROPVARIANT_to_bool(srcProp, res) != S_OK)
- return false;
- destProp = res;
- return true;
- }
- if (srcProp.vt == VT_EMPTY)
- {
- destProp = srcProp;
- return true;
- }
- return false;
-}
-
-static void SplitParams(const UString &srcString, UStringVector &subStrings)
-{
- subStrings.Clear();
- UString s;
- int len = srcString.Len();
- if (len == 0)
- return;
- for (int i = 0; i < len; i++)
- {
- wchar_t c = srcString[i];
- if (c == L':')
- {
- subStrings.Add(s);
- s.Empty();
- }
- else
- s += c;
- }
- subStrings.Add(s);
-}
-
-static void SplitParam(const UString &param, UString &name, UString &value)
-{
- int eqPos = param.Find(L'=');
- if (eqPos >= 0)
- {
- name.SetFrom(param, eqPos);
- value = param.Ptr(eqPos + 1);
- return;
- }
- unsigned i;
- for (i = 0; i < param.Len(); i++)
- {
- wchar_t c = param[i];
- if (c >= L'0' && c <= L'9')
- break;
- }
- name.SetFrom(param, i);
- value = param.Ptr(i);
-}
-
-static bool IsLogSizeProp(PROPID propid)
-{
- switch (propid)
- {
- case NCoderPropID::kDictionarySize:
- case NCoderPropID::kUsedMemorySize:
- case NCoderPropID::kBlockSize:
- case NCoderPropID::kReduceSize:
- return true;
- }
- return false;
-}
-
-HRESULT CMethodProps::SetParam(const UString &name, const UString &value)
-{
- int index = FindPropIdExact(name);
- if (index < 0)
- return E_INVALIDARG;
- const CNameToPropID &nameToPropID = g_NameToPropID[index];
- CProp prop;
- prop.Id = index;
-
- if (IsLogSizeProp(prop.Id))
- {
- UInt32 dicSize;
- RINOK(StringToDictSize(value, dicSize));
- prop.Value = dicSize;
- }
- else
- {
- NCOM::CPropVariant propValue;
- if (nameToPropID.VarType == VT_BSTR)
- propValue = value;
- else if (nameToPropID.VarType == VT_BOOL)
- {
- bool res;
- if (!StringToBool(value, res))
- return E_INVALIDARG;
- propValue = res;
- }
- else if (!value.IsEmpty())
- {
- UInt32 number;
- if (ParseStringToUInt32(value, number) == value.Len())
- propValue = number;
- else
- propValue = value;
- }
- if (!ConvertProperty(propValue, nameToPropID.VarType, prop.Value))
- return E_INVALIDARG;
- }
- Props.Add(prop);
- return S_OK;
-}
-
-HRESULT CMethodProps::ParseParamsFromString(const UString &srcString)
-{
- UStringVector params;
- SplitParams(srcString, params);
- FOR_VECTOR (i, params)
- {
- const UString &param = params[i];
- UString name, value;
- SplitParam(param, name, value);
- RINOK(SetParam(name, value));
- }
- return S_OK;
-}
-
-HRESULT CMethodProps::ParseParamsFromPROPVARIANT(const UString &realName, const PROPVARIANT &value)
-{
- if (realName.Len() == 0)
- {
- // [empty]=method
- return E_INVALIDARG;
- }
- if (value.vt == VT_EMPTY)
- {
- // {realName}=[empty]
- UString name, value;
- SplitParam(realName, name, value);
- return SetParam(name, value);
- }
-
- // {realName}=value
- int index = FindPropIdExact(realName);
- if (index < 0)
- return E_INVALIDARG;
- const CNameToPropID &nameToPropID = g_NameToPropID[index];
- CProp prop;
- prop.Id = index;
-
- if (IsLogSizeProp(prop.Id))
- {
- UInt32 dicSize;
- RINOK(PROPVARIANT_to_DictSize(value, dicSize));
- prop.Value = dicSize;
- }
- else
- {
- if (!ConvertProperty(value, nameToPropID.VarType, prop.Value))
- return E_INVALIDARG;
- }
- Props.Add(prop);
- return S_OK;
-}
-
-HRESULT COneMethodInfo::ParseMethodFromString(const UString &s)
-{
- int splitPos = s.Find(':');
- MethodName = s;
- if (splitPos < 0)
- return S_OK;
- MethodName.DeleteFrom(splitPos);
- return ParseParamsFromString(s.Ptr(splitPos + 1));
-}
-
-HRESULT COneMethodInfo::ParseMethodFromPROPVARIANT(const UString &realName, const PROPVARIANT &value)
-{
- if (!realName.IsEmpty() && !StringsAreEqualNoCase_Ascii(realName, "m"))
- return ParseParamsFromPROPVARIANT(realName, value);
- // -m{N}=method
- if (value.vt != VT_BSTR)
- return E_INVALIDARG;
- return ParseMethodFromString(value.bstrVal);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/MethodProps.h b/src/libs/7zip/win/CPP/7zip/Common/MethodProps.h
deleted file mode 100644
index 39e2ee937..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/MethodProps.h
+++ /dev/null
@@ -1,185 +0,0 @@
-// MethodProps.h
-
-#ifndef __7Z_METHOD_PROPS_H
-#define __7Z_METHOD_PROPS_H
-
-#include "../../Common/MyString.h"
-
-#include "../../Windows/PropVariant.h"
-
-#include "../ICoder.h"
-
-bool StringToBool(const UString &s, bool &res);
-HRESULT PROPVARIANT_to_bool(const PROPVARIANT &prop, bool &dest);
-unsigned ParseStringToUInt32(const UString &srcString, UInt32 &number);
-HRESULT ParsePropToUInt32(const UString &name, const PROPVARIANT &prop, UInt32 &resValue);
-
-HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads);
-
-struct CProp
-{
- PROPID Id;
- bool IsOptional;
- NWindows::NCOM::CPropVariant Value;
- CProp(): IsOptional(false) {}
-};
-
-struct CProps
-{
- CObjectVector<CProp> Props;
-
- void Clear() { Props.Clear(); }
-
- bool AreThereNonOptionalProps() const
- {
- FOR_VECTOR (i, Props)
- if (!Props[i].IsOptional)
- return true;
- return false;
- }
-
- void AddProp32(PROPID propid, UInt32 level);
-
- void AddPropString(PROPID propid, const wchar_t *s)
- {
- CProp prop;
- prop.IsOptional = true;
- prop.Id = propid;
- prop.Value = s;
- Props.Add(prop);
- }
-
- HRESULT SetCoderProps(ICompressSetCoderProperties *scp, const UInt64 *dataSizeReduce) const;
-};
-
-class CMethodProps: public CProps
-{
- HRESULT SetParam(const UString &name, const UString &value);
-public:
- int GetLevel() const;
- int Get_NumThreads() const
- {
- int i = FindProp(NCoderPropID::kNumThreads);
- if (i >= 0)
- if (Props[i].Value.vt == VT_UI4)
- return (int)Props[i].Value.ulVal;
- return -1;
- }
-
- bool Get_DicSize(UInt32 &res) const
- {
- res = 0;
- int i = FindProp(NCoderPropID::kDictionarySize);
- if (i >= 0)
- if (Props[i].Value.vt == VT_UI4)
- {
- res = Props[i].Value.ulVal;
- return true;
- }
- return false;
- }
-
- int FindProp(PROPID id) const;
-
- UInt32 Get_Lzma_Algo() const
- {
- int i = FindProp(NCoderPropID::kAlgorithm);
- if (i >= 0)
- if (Props[i].Value.vt == VT_UI4)
- return Props[i].Value.ulVal;
- return GetLevel() >= 5 ? 1 : 0;
- }
-
- UInt32 Get_Lzma_DicSize() const
- {
- int i = FindProp(NCoderPropID::kDictionarySize);
- if (i >= 0)
- if (Props[i].Value.vt == VT_UI4)
- return Props[i].Value.ulVal;
- int level = GetLevel();
- return level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26));
- }
-
- UInt32 Get_Lzma_NumThreads(bool &fixedNumber) const
- {
- fixedNumber = false;
- int numThreads = Get_NumThreads();
- if (numThreads >= 0)
- {
- fixedNumber = true;
- return numThreads < 2 ? 1 : 2;
- }
- return Get_Lzma_Algo() == 0 ? 1 : 2;
- }
-
- UInt32 Get_BZip2_NumThreads(bool &fixedNumber) const
- {
- fixedNumber = false;
- int numThreads = Get_NumThreads();
- if (numThreads >= 0)
- {
- fixedNumber = true;
- if (numThreads < 1) return 1;
- if (numThreads > 64) return 64;
- return numThreads;
- }
- return 1;
- }
-
- UInt32 Get_BZip2_BlockSize() const
- {
- int i = FindProp(NCoderPropID::kDictionarySize);
- if (i >= 0)
- if (Props[i].Value.vt == VT_UI4)
- {
- UInt32 blockSize = Props[i].Value.ulVal;
- const UInt32 kDicSizeMin = 100000;
- const UInt32 kDicSizeMax = 900000;
- if (blockSize < kDicSizeMin) blockSize = kDicSizeMin;
- if (blockSize > kDicSizeMax) blockSize = kDicSizeMax;
- return blockSize;
- }
- int level = GetLevel();
- return 100000 * (level >= 5 ? 9 : (level >= 1 ? level * 2 - 1: 1));
- }
-
- UInt32 Get_Ppmd_MemSize() const
- {
- int i = FindProp(NCoderPropID::kUsedMemorySize);
- if (i >= 0)
- if (Props[i].Value.vt == VT_UI4)
- return Props[i].Value.ulVal;
- int level = GetLevel();
- return level >= 9 ? (192 << 20) : ((UInt32)1 << (level + 19));
- }
-
- void AddLevelProp(UInt32 level)
- {
- AddProp32(NCoderPropID::kLevel, level);
- }
-
- void AddNumThreadsProp(UInt32 numThreads)
- {
- AddProp32(NCoderPropID::kNumThreads, numThreads);
- }
-
- HRESULT ParseParamsFromString(const UString &srcString);
- HRESULT ParseParamsFromPROPVARIANT(const UString &realName, const PROPVARIANT &value);
-};
-
-class COneMethodInfo: public CMethodProps
-{
-public:
- UString MethodName;
-
- void Clear()
- {
- CMethodProps::Clear();
- MethodName.Empty();
- }
- bool IsEmpty() const { return MethodName.IsEmpty() && Props.IsEmpty(); }
- HRESULT ParseMethodFromPROPVARIANT(const UString &realName, const PROPVARIANT &value);
- HRESULT ParseMethodFromString(const UString &s);
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/OutBuffer.cpp b/src/libs/7zip/win/CPP/7zip/Common/OutBuffer.cpp
deleted file mode 100644
index 4ba34a053..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/OutBuffer.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-// OutBuffer.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "OutBuffer.h"
-
-bool COutBuffer::Create(UInt32 bufSize) throw()
-{
- const UInt32 kMinBlockSize = 1;
- if (bufSize < kMinBlockSize)
- bufSize = kMinBlockSize;
- if (_buf != 0 && _bufSize == bufSize)
- return true;
- Free();
- _bufSize = bufSize;
- _buf = (Byte *)::MidAlloc(bufSize);
- return (_buf != 0);
-}
-
-void COutBuffer::Free() throw()
-{
- ::MidFree(_buf);
- _buf = 0;
-}
-
-void COutBuffer::Init() throw()
-{
- _streamPos = 0;
- _limitPos = _bufSize;
- _pos = 0;
- _processedSize = 0;
- _overDict = false;
- #ifdef _NO_EXCEPTIONS
- ErrorCode = S_OK;
- #endif
-}
-
-UInt64 COutBuffer::GetProcessedSize() const throw()
-{
- UInt64 res = _processedSize + _pos - _streamPos;
- if (_streamPos > _pos)
- res += _bufSize;
- return res;
-}
-
-
-HRESULT COutBuffer::FlushPart() throw()
-{
- // _streamPos < _bufSize
- UInt32 size = (_streamPos >= _pos) ? (_bufSize - _streamPos) : (_pos - _streamPos);
- HRESULT result = S_OK;
- #ifdef _NO_EXCEPTIONS
- result = ErrorCode;
- #endif
- if (_buf2 != 0)
- {
- memcpy(_buf2, _buf + _streamPos, size);
- _buf2 += size;
- }
-
- if (_stream != 0
- #ifdef _NO_EXCEPTIONS
- && (ErrorCode == S_OK)
- #endif
- )
- {
- UInt32 processedSize = 0;
- result = _stream->Write(_buf + _streamPos, size, &processedSize);
- size = processedSize;
- }
- _streamPos += size;
- if (_streamPos == _bufSize)
- _streamPos = 0;
- if (_pos == _bufSize)
- {
- _overDict = true;
- _pos = 0;
- }
- _limitPos = (_streamPos > _pos) ? _streamPos : _bufSize;
- _processedSize += size;
- return result;
-}
-
-HRESULT COutBuffer::Flush() throw()
-{
- #ifdef _NO_EXCEPTIONS
- if (ErrorCode != S_OK)
- return ErrorCode;
- #endif
-
- while (_streamPos != _pos)
- {
- HRESULT result = FlushPart();
- if (result != S_OK)
- return result;
- }
- return S_OK;
-}
-
-void COutBuffer::FlushWithCheck()
-{
- HRESULT result = Flush();
- #ifdef _NO_EXCEPTIONS
- ErrorCode = result;
- #else
- if (result != S_OK)
- throw COutBufferException(result);
- #endif
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/OutBuffer.h b/src/libs/7zip/win/CPP/7zip/Common/OutBuffer.h
deleted file mode 100644
index 0baad3636..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/OutBuffer.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// OutBuffer.h
-
-#ifndef __OUT_BUFFER_H
-#define __OUT_BUFFER_H
-
-#include "../IStream.h"
-#include "../../Common/MyCom.h"
-#include "../../Common/MyException.h"
-
-#ifndef _NO_EXCEPTIONS
-struct COutBufferException: public CSystemException
-{
- COutBufferException(HRESULT errorCode): CSystemException(errorCode) {}
-};
-#endif
-
-class COutBuffer
-{
-protected:
- Byte *_buf;
- UInt32 _pos;
- UInt32 _limitPos;
- UInt32 _streamPos;
- UInt32 _bufSize;
- ISequentialOutStream *_stream;
- UInt64 _processedSize;
- Byte *_buf2;
- bool _overDict;
-
- HRESULT FlushPart() throw();
-public:
- #ifdef _NO_EXCEPTIONS
- HRESULT ErrorCode;
- #endif
-
- COutBuffer(): _buf(0), _pos(0), _stream(0), _buf2(0) {}
- ~COutBuffer() { Free(); }
-
- bool Create(UInt32 bufSize) throw();
- void Free() throw();
-
- void SetMemStream(Byte *buf) { _buf2 = buf; }
- void SetStream(ISequentialOutStream *stream) { _stream = stream; }
- void Init() throw();
- HRESULT Flush() throw();
- void FlushWithCheck();
-
- void WriteByte(Byte b)
- {
- _buf[_pos++] = b;
- if (_pos == _limitPos)
- FlushWithCheck();
- }
- void WriteBytes(const void *data, size_t size)
- {
- for (size_t i = 0; i < size; i++)
- WriteByte(((const Byte *)data)[i]);
- }
-
- UInt64 GetProcessedSize() const throw();
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/ProgressUtils.cpp b/src/libs/7zip/win/CPP/7zip/Common/ProgressUtils.cpp
deleted file mode 100644
index bac45c1c2..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/ProgressUtils.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-// ProgressUtils.cpp
-
-#include "StdAfx.h"
-
-#include "ProgressUtils.h"
-
-CLocalProgress::CLocalProgress()
-{
- ProgressOffset = InSize = OutSize = 0;
- SendRatio = SendProgress = true;
-}
-
-void CLocalProgress::Init(IProgress *progress, bool inSizeIsMain)
-{
- _ratioProgress.Release();
- _progress = progress;
- _progress.QueryInterface(IID_ICompressProgressInfo, &_ratioProgress);
- _inSizeIsMain = inSizeIsMain;
-}
-
-STDMETHODIMP CLocalProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
-{
- UInt64 inSizeNew = InSize, outSizeNew = OutSize;
- if (inSize)
- inSizeNew += (*inSize);
- if (outSize)
- outSizeNew += (*outSize);
- if (SendRatio && _ratioProgress)
- {
- RINOK(_ratioProgress->SetRatioInfo(&inSizeNew, &outSizeNew));
- }
- inSizeNew += ProgressOffset;
- outSizeNew += ProgressOffset;
- if (SendProgress)
- return _progress->SetCompleted(_inSizeIsMain ? &inSizeNew : &outSizeNew);
- return S_OK;
-}
-
-HRESULT CLocalProgress::SetCur()
-{
- return SetRatioInfo(NULL, NULL);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/ProgressUtils.h b/src/libs/7zip/win/CPP/7zip/Common/ProgressUtils.h
deleted file mode 100644
index bae5395c1..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/ProgressUtils.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// ProgressUtils.h
-
-#ifndef __PROGRESSUTILS_H
-#define __PROGRESSUTILS_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-#include "../IProgress.h"
-
-class CLocalProgress:
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
- CMyComPtr<IProgress> _progress;
- CMyComPtr<ICompressProgressInfo> _ratioProgress;
- bool _inSizeIsMain;
-public:
- UInt64 ProgressOffset;
- UInt64 InSize;
- UInt64 OutSize;
- bool SendRatio;
- bool SendProgress;
-
- CLocalProgress();
- void Init(IProgress *progress, bool inSizeIsMain);
- HRESULT SetCur();
-
- MY_UNKNOWN_IMP
-
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/PropId.cpp b/src/libs/7zip/win/CPP/7zip/Common/PropId.cpp
deleted file mode 100644
index 10daef715..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/PropId.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-// PropId.cpp
-
-#include "StdAfx.h"
-
-#include "../PropID.h"
-
-// VARTYPE
-Byte k7z_PROPID_To_VARTYPE[kpid_NUM_DEFINED] =
-{
- VT_EMPTY,
- VT_UI4,
- VT_UI4,
- VT_BSTR,
- VT_BSTR,
- VT_BSTR,
- VT_BOOL,
- VT_UI8,
- VT_UI8,
- VT_UI4,
- VT_FILETIME,
- VT_FILETIME,
- VT_FILETIME,
- VT_BOOL,
- VT_BOOL,
- VT_BOOL,
- VT_BOOL,
- VT_BOOL,
- VT_UI4,
- VT_UI4,
- VT_BSTR,
- VT_BOOL,
- VT_BSTR,
- VT_BSTR,
- VT_BSTR,
- VT_BSTR,
- VT_BSTR,
- VT_UI8,
- VT_BSTR,
- VT_UI8,
- VT_BSTR,
- VT_UI8,
- VT_UI8,
- VT_BSTR, // or VT_UI8 kpidUnpackVer
- VT_UI4, // or VT_UI8 kpidVolume
- VT_BOOL,
- VT_UI8,
- VT_UI8,
- VT_UI8,
- VT_UI8,
- VT_UI4,
- VT_BOOL,
- VT_BOOL,
- VT_BSTR,
- VT_UI8,
- VT_UI8,
- VT_UI4, // kpidChecksum
- VT_BSTR,
- VT_UI8,
- VT_BSTR, // or VT_UI8 kpidId
- VT_BSTR,
- VT_BSTR,
- VT_UI4,
- VT_UI4,
- VT_BSTR,
- VT_BSTR,
- VT_UI8,
- VT_UI8,
- VT_UI4,
- VT_BSTR,
- VT_BSTR,
- VT_BSTR,
- VT_BSTR, // kpidNtSecure
- VT_BOOL,
- VT_BOOL,
- VT_BOOL,
- VT_BOOL,
- VT_BSTR, // SHA-1
- VT_BSTR, // SHA-256
- VT_BSTR,
- VT_UI8,
- VT_UI4,
- VT_UI4,
- VT_BSTR,
- VT_UI8,
- VT_UI8,
- VT_UI8,
- VT_UI8,
- VT_UI8,
- VT_UI8,
- VT_UI8,
- VT_BSTR,
- VT_BSTR,
- VT_BSTR,
- VT_BOOL,
- VT_BOOL,
- VT_BOOL,
- VT_UI8,
- VT_UI8
-};
diff --git a/src/libs/7zip/win/CPP/7zip/Common/RegisterArc.h b/src/libs/7zip/win/CPP/7zip/Common/RegisterArc.h
deleted file mode 100644
index 82bd09673..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/RegisterArc.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// RegisterArc.h
-
-#ifndef __REGISTER_ARC_H
-#define __REGISTER_ARC_H
-
-#include "../Archive/IArchive.h"
-
-#include <mutex>
-
-struct CArcInfo
-{
- const char *Name;
- const char *Ext;
- const char *AddExt;
-
- Byte ClassId;
-
- Byte SignatureSize;
- Byte Signature[20];
- UInt16 SignatureOffset;
-
- UInt16 Flags;
-
- Func_CreateInArchive CreateInArchive;
- Func_CreateOutArchive CreateOutArchive;
- Func_IsArc IsArc;
-
- bool IsMultiSignature() const { return (Flags & NArcInfoFlags::kMultiSignature) != 0; }
-
- std::once_flag once;
-};
-
-void RegisterArc(const CArcInfo *arcInfo) throw();
-
-#define REGISTER_ARC_NAME(x) CRegister ## x
-
-#define REGISTER_ARC(x) struct REGISTER_ARC_NAME(x) \
- { \
- REGISTER_ARC_NAME(x)() \
- { \
- std::call_once(g_ArcInfo.once, [] { RegisterArc(&g_ArcInfo); }); \
- } \
- }; \
- static REGISTER_ARC_NAME(x) g_RegisterArc; \
- void registerArc##x() { static REGISTER_ARC_NAME(x) g_RegisterArc; }
-
-#define REGISTER_ARC_DEC_SIG(x) struct REGISTER_ARC_NAME(x) \
- { \
- REGISTER_ARC_NAME(x)() { \
- std::call_once(g_ArcInfo.once, [] { \
- g_ArcInfo.Signature[0]--; \
- RegisterArc(&g_ArcInfo); \
- }); \
- } \
- }; \
- static REGISTER_ARC_NAME(x) g_RegisterArc; \
- void registerArcDec##x() { static REGISTER_ARC_NAME(x) g_RegisterArc; }
-
-
-#define IMP_CreateArcIn_2(c) \
- static IInArchive *CreateArc() { return new c; }
-
-#define IMP_CreateArcIn IMP_CreateArcIn_2(CHandler)
-
-#ifdef EXTRACT_ONLY
- #define IMP_CreateArcOut
- #define REF_CreateArc_Pair CreateArc, NULL
-#else
- #define IMP_CreateArcOut static IOutArchive *CreateArcOut() { return new CHandler; }
- #define REF_CreateArc_Pair CreateArc, CreateArcOut
-#endif
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/RegisterCodec.h b/src/libs/7zip/win/CPP/7zip/Common/RegisterCodec.h
deleted file mode 100644
index 0c6662a6c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/RegisterCodec.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// RegisterCodec.h
-
-#ifndef __REGISTER_CODEC_H
-#define __REGISTER_CODEC_H
-
-#include "../Common/MethodId.h"
-#include "../ICoder.h"
-
-#include <mutex>
-
-typedef void * (*CreateCodecP)();
-struct CCodecInfo
-{
- CreateCodecP CreateDecoder;
- CreateCodecP CreateEncoder;
- CMethodId Id;
- const wchar_t *Name;
- UInt32 NumInStreams;
- bool IsFilter;
- std::once_flag once;
-};
-
-void RegisterCodec(const CCodecInfo *codecInfo) throw();
-
-#define REGISTER_CODEC_NAME(x) CRegisterCodec ## x
-
-#define REGISTER_CODEC(x) struct REGISTER_CODEC_NAME(x) \
- { \
- REGISTER_CODEC_NAME(x)() \
- { \
- std::call_once(g_CodecInfo.once, [] { RegisterCodec(&g_CodecInfo); }); \
- } \
- }; \
- 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 (unsigned i = 0; i < ARRAY_SIZE(g_CodecsInfo); i++) \
- std::call_once(g_CodecsInfo[i].once, [&i] { RegisterCodec(&g_CodecsInfo[i]); }); \
- } \
- }; \
- static REGISTER_CODECS_NAME(x) g_RegisterCodecs; \
- void registerCodec##x() { static REGISTER_CODECS_NAME(x) g_RegisterCodecs; }
-
-
-struct CHasherInfo
-{
- IHasher * (*CreateHasher)();
- CMethodId Id;
- const wchar_t *Name;
- UInt32 DigestSize;
-};
-
-void RegisterHasher(const CHasherInfo *hasher) throw();
-
-#define REGISTER_HASHER_NAME(x) CRegisterHasher ## x
-
-#define REGISTER_HASHER(x) struct REGISTER_HASHER_NAME(x) { \
- REGISTER_HASHER_NAME(x)() { RegisterHasher(&g_HasherInfo); }}; \
- static REGISTER_HASHER_NAME(x) g_RegisterHasher;
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Common/StdAfx.h
deleted file mode 100644
index 1cbd7feae..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../Common/Common.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/StreamBinder.cpp b/src/libs/7zip/win/CPP/7zip/Common/StreamBinder.cpp
deleted file mode 100644
index 7a4c0ed26..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/StreamBinder.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-// StreamBinder.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/MyCom.h"
-
-#include "StreamBinder.h"
-
-class CBinderInStream:
- public ISequentialInStream,
- public CMyUnknownImp
-{
- CStreamBinder *_binder;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- ~CBinderInStream() { _binder->CloseRead(); }
- CBinderInStream(CStreamBinder *binder): _binder(binder) {}
-};
-
-STDMETHODIMP CBinderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
- { return _binder->Read(data, size, processedSize); }
-
-class CBinderOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CStreamBinder *_binder;
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- ~CBinderOutStream() { _binder->CloseWrite(); }
- CBinderOutStream(CStreamBinder *binder): _binder(binder) {}
-};
-
-STDMETHODIMP CBinderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
- { return _binder->Write(data, size, processedSize); }
-
-
-
-WRes CStreamBinder::CreateEvents()
-{
- RINOK(_canWrite_Event.Create(true));
- RINOK(_canRead_Event.Create());
- return _readingWasClosed_Event.Create();
-}
-
-void CStreamBinder::ReInit()
-{
- _waitWrite = true;
- _canRead_Event.Reset();
- _readingWasClosed_Event.Reset();
- ProcessedSize = 0;
-}
-
-
-void CStreamBinder::CreateStreams(ISequentialInStream **inStream, ISequentialOutStream **outStream)
-{
- _waitWrite = true;
- _bufSize = 0;
- _buf = NULL;
- ProcessedSize = 0;
-
- CBinderInStream *inStreamSpec = new CBinderInStream(this);
- CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec);
- *inStream = inStreamLoc.Detach();
-
- CBinderOutStream *outStreamSpec = new CBinderOutStream(this);
- CMyComPtr<ISequentialOutStream> outStreamLoc(outStreamSpec);
- *outStream = outStreamLoc.Detach();
-}
-
-// (_canRead_Event && _bufSize == 0) means that stream is finished.
-
-HRESULT CStreamBinder::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (size != 0)
- {
- if (_waitWrite)
- {
- RINOK(_canRead_Event.Lock());
- _waitWrite = false;
- }
- if (size > _bufSize)
- size = _bufSize;
- if (size != 0)
- {
- memcpy(data, _buf, size);
- _buf = ((const Byte *)_buf) + size;
- ProcessedSize += size;
- if (processedSize)
- *processedSize = size;
- _bufSize -= size;
- if (_bufSize == 0)
- {
- _waitWrite = true;
- _canRead_Event.Reset();
- _canWrite_Event.Set();
- }
- }
- }
- return S_OK;
-}
-
-HRESULT CStreamBinder::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (size != 0)
- {
- _buf = data;
- _bufSize = size;
- _canWrite_Event.Reset();
- _canRead_Event.Set();
-
- HANDLE events[2] = { _canWrite_Event, _readingWasClosed_Event };
- DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE);
- if (waitResult != WAIT_OBJECT_0 + 0)
- return S_FALSE;
- if (processedSize)
- *processedSize = size;
- }
- return S_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/StreamBinder.h b/src/libs/7zip/win/CPP/7zip/Common/StreamBinder.h
deleted file mode 100644
index f3fb53228..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/StreamBinder.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// StreamBinder.h
-
-#ifndef __STREAM_BINDER_H
-#define __STREAM_BINDER_H
-
-#include "../../Windows/Synchronization.h"
-
-#include "../IStream.h"
-
-class CStreamBinder
-{
- NWindows::NSynchronization::CManualResetEvent _canWrite_Event;
- NWindows::NSynchronization::CManualResetEvent _canRead_Event;
- NWindows::NSynchronization::CManualResetEvent _readingWasClosed_Event;
- bool _waitWrite;
- UInt32 _bufSize;
- const void *_buf;
-public:
- UInt64 ProcessedSize;
-
- WRes CreateEvents();
- void CreateStreams(ISequentialInStream **inStream, ISequentialOutStream **outStream);
- void ReInit();
- HRESULT Read(void *data, UInt32 size, UInt32 *processedSize);
- HRESULT Write(const void *data, UInt32 size, UInt32 *processedSize);
- void CloseRead() { _readingWasClosed_Event.Set(); }
- void CloseWrite()
- {
- // _bufSize must be = 0
- _canRead_Event.Set();
- }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/StreamObjects.cpp b/src/libs/7zip/win/CPP/7zip/Common/StreamObjects.cpp
deleted file mode 100644
index 7721c3a7e..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/StreamObjects.cpp
+++ /dev/null
@@ -1,250 +0,0 @@
-// StreamObjects.cpp
-
-#include "StdAfx.h"
-
-#include <stdlib.h>
-
-#include "../../../C/Alloc.h"
-
-#include "StreamObjects.h"
-
-STDMETHODIMP CBufInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (size == 0)
- return S_OK;
- if (_pos >= _size)
- return S_OK;
- size_t rem = _size - (size_t)_pos;
- if (rem > size)
- rem = (size_t)size;
- memcpy(data, _data + (size_t)_pos, rem);
- _pos += rem;
- if (processedSize)
- *processedSize = (UInt32)rem;
- return S_OK;
-}
-
-STDMETHODIMP CBufInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: offset += _pos; break;
- case STREAM_SEEK_END: offset += _size; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (offset < 0)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- _pos = offset;
- if (newPosition)
- *newPosition = offset;
- return S_OK;
-}
-
-/*
-void Create_BufInStream_WithReference(const void *data, size_t size, ISequentialInStream **stream)
-{
- CBufInStream *inStreamSpec = new CBufInStream;
- CMyComPtr<ISequentialInStream> streamTemp = inStreamSpec;
- inStreamSpec->Init((const Byte *)data, size);
- *stream = streamTemp.Detach();
-}
-*/
-
-void Create_BufInStream_WithNewBuf(const void *data, size_t size, ISequentialInStream **stream)
-{
- CReferenceBuf *referenceBuf = new CReferenceBuf;
- CMyComPtr<IUnknown> ref = referenceBuf;
- referenceBuf->Buf.CopyFrom((const Byte *)data, size);
-
- CBufInStream *inStreamSpec = new CBufInStream;
- CMyComPtr<ISequentialInStream> streamTemp = inStreamSpec;
- inStreamSpec->Init(referenceBuf);
- *stream = streamTemp.Detach();
-}
-
-void CByteDynBuffer::Free() throw()
-{
- free(_buf);
- _buf = 0;
- _capacity = 0;
-}
-
-bool CByteDynBuffer::EnsureCapacity(size_t cap) throw()
-{
- if (cap <= _capacity)
- return true;
- size_t delta;
- if (_capacity > 64)
- delta = _capacity / 4;
- else if (_capacity > 8)
- delta = 16;
- else
- delta = 4;
- cap = MyMax(_capacity + delta, cap);
- Byte *buf = (Byte *)realloc(_buf, cap);
- if (!buf)
- return false;
- _buf = buf;
- _capacity = cap;
- return true;
-}
-
-Byte *CDynBufSeqOutStream::GetBufPtrForWriting(size_t addSize)
-{
- addSize += _size;
- if (addSize < _size)
- return NULL;
- if (!_buffer.EnsureCapacity(addSize))
- return NULL;
- return (Byte *)_buffer + _size;
-}
-
-void CDynBufSeqOutStream::CopyToBuffer(CByteBuffer &dest) const
-{
- dest.CopyFrom((const Byte *)_buffer, _size);
-}
-
-STDMETHODIMP CDynBufSeqOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (size == 0)
- return S_OK;
- Byte *buf = GetBufPtrForWriting(size);
- if (!buf)
- return E_OUTOFMEMORY;
- memcpy(buf, data, size);
- UpdateSize(size);
- if (processedSize)
- *processedSize = size;
- return S_OK;
-}
-
-STDMETHODIMP CBufPtrSeqOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- size_t rem = _size - _pos;
- if (rem > size)
- rem = (size_t)size;
- memcpy(_buffer + _pos, data, rem);
- _pos += rem;
- if (processedSize)
- *processedSize = (UInt32)rem;
- return (rem != 0 || size == 0) ? S_OK : E_FAIL;
-}
-
-STDMETHODIMP CSequentialOutStreamSizeCount::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- UInt32 realProcessedSize;
- HRESULT result = _stream->Write(data, size, &realProcessedSize);
- _size += realProcessedSize;
- if (processedSize)
- *processedSize = realProcessedSize;
- return result;
-}
-
-static const UInt64 kEmptyTag = (UInt64)(Int64)-1;
-
-void CCachedInStream::Free() throw()
-{
- MyFree(_tags);
- _tags = 0;
- MidFree(_data);
- _data = 0;
-}
-
-bool CCachedInStream::Alloc(unsigned blockSizeLog, unsigned numBlocksLog) throw()
-{
- unsigned sizeLog = blockSizeLog + numBlocksLog;
- if (sizeLog >= sizeof(size_t) * 8)
- return false;
- size_t dataSize = (size_t)1 << sizeLog;
- if (_data == 0 || dataSize != _dataSize)
- {
- MidFree(_data);
- _data = (Byte *)MidAlloc(dataSize);
- if (_data == 0)
- return false;
- _dataSize = dataSize;
- }
- if (_tags == 0 || numBlocksLog != _numBlocksLog)
- {
- MyFree(_tags);
- _tags = (UInt64 *)MyAlloc(sizeof(UInt64) << numBlocksLog);
- if (_tags == 0)
- return false;
- _numBlocksLog = numBlocksLog;
- }
- _blockSizeLog = blockSizeLog;
- return true;
-}
-
-void CCachedInStream::Init(UInt64 size) throw()
-{
- _size = size;
- _pos = 0;
- size_t numBlocks = (size_t)1 << _numBlocksLog;
- for (size_t i = 0; i < numBlocks; i++)
- _tags[i] = kEmptyTag;
-}
-
-STDMETHODIMP CCachedInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- if (size == 0)
- return S_OK;
- if (_pos >= _size)
- return S_OK;
-
- {
- UInt64 rem = _size - _pos;
- if (size > rem)
- size = (UInt32)rem;
- }
-
- while (size != 0)
- {
- UInt64 cacheTag = _pos >> _blockSizeLog;
- size_t cacheIndex = (size_t)cacheTag & (((size_t)1 << _numBlocksLog) - 1);
- Byte *p = _data + (cacheIndex << _blockSizeLog);
- if (_tags[cacheIndex] != cacheTag)
- {
- UInt64 remInBlock = _size - (cacheTag << _blockSizeLog);
- size_t blockSize = (size_t)1 << _blockSizeLog;
- if (blockSize > remInBlock)
- blockSize = (size_t)remInBlock;
- RINOK(ReadBlock(cacheTag, p, blockSize));
- _tags[cacheIndex] = cacheTag;
- }
- size_t offset = (size_t)_pos & (((size_t)1 << _blockSizeLog) - 1);
- UInt32 cur = (UInt32)MyMin(((size_t)1 << _blockSizeLog) - offset, (size_t)size);
- memcpy(data, p + offset, cur);
- if (processedSize)
- *processedSize += cur;
- data = (void *)((const Byte *)data + cur);
- _pos += cur;
- size -= cur;
- }
-
- return S_OK;
-}
-
-STDMETHODIMP CCachedInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: break;
- case STREAM_SEEK_CUR: offset += _pos; break;
- case STREAM_SEEK_END: offset += _size; break;
- default: return STG_E_INVALIDFUNCTION;
- }
- if (offset < 0)
- return HRESULT_WIN32_ERROR_NEGATIVE_SEEK;
- _pos = offset;
- if (newPosition)
- *newPosition = offset;
- return S_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/StreamObjects.h b/src/libs/7zip/win/CPP/7zip/Common/StreamObjects.h
deleted file mode 100644
index d0c86b566..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/StreamObjects.h
+++ /dev/null
@@ -1,140 +0,0 @@
-// StreamObjects.h
-
-#ifndef __STREAM_OBJECTS_H
-#define __STREAM_OBJECTS_H
-
-#include "../../Common/MyBuffer.h"
-#include "../../Common/MyCom.h"
-#include "../../Common/MyVector.h"
-
-#include "../IStream.h"
-
-struct CReferenceBuf:
- public IUnknown,
- public CMyUnknownImp
-{
- CByteBuffer Buf;
- MY_UNKNOWN_IMP
-};
-
-class CBufInStream:
- public IInStream,
- public CMyUnknownImp
-{
- const Byte *_data;
- UInt64 _pos;
- size_t _size;
- CMyComPtr<IUnknown> _ref;
-public:
- void Init(const Byte *data, size_t size, IUnknown *ref = 0)
- {
- _data = data;
- _size = size;
- _pos = 0;
- _ref = ref;
- }
- void Init(CReferenceBuf *ref) { Init(ref->Buf, ref->Buf.Size(), ref); }
-
- MY_UNKNOWN_IMP2(ISequentialInStream, IInStream)
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-
-// void Create_BufInStream_WithReference(const void *data, size_t size, ISequentialInStream **stream);
-void Create_BufInStream_WithNewBuf(const void *data, size_t size, ISequentialInStream **stream);
-
-class CByteDynBuffer
-{
- size_t _capacity;
- Byte *_buf;
-public:
- CByteDynBuffer(): _capacity(0), _buf(0) {};
- // there is no copy constructor. So don't copy this object.
- ~CByteDynBuffer() { Free(); }
- void Free() throw();
- size_t GetCapacity() const { return _capacity; }
- operator Byte*() const { return _buf; };
- operator const Byte*() const { return _buf; };
- bool EnsureCapacity(size_t capacity) throw();
-};
-
-class CDynBufSeqOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CByteDynBuffer _buffer;
- size_t _size;
-public:
- CDynBufSeqOutStream(): _size(0) {}
- void Init() { _size = 0; }
- size_t GetSize() const { return _size; }
- const Byte *GetBuffer() const { return _buffer; }
- void CopyToBuffer(CByteBuffer &dest) const;
- Byte *GetBufPtrForWriting(size_t addSize);
- void UpdateSize(size_t addSize) { _size += addSize; }
-
- MY_UNKNOWN_IMP1(ISequentialOutStream)
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-class CBufPtrSeqOutStream:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- Byte *_buffer;
- size_t _size;
- size_t _pos;
-public:
- void Init(Byte *buffer, size_t size)
- {
- _buffer = buffer;
- _pos = 0;
- _size = size;
- }
- size_t GetPos() const { return _pos; }
-
- MY_UNKNOWN_IMP1(ISequentialOutStream)
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-class CSequentialOutStreamSizeCount:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialOutStream> _stream;
- UInt64 _size;
-public:
- void SetStream(ISequentialOutStream *stream) { _stream = stream; }
- void Init() { _size = 0; }
- UInt64 GetSize() const { return _size; }
-
- MY_UNKNOWN_IMP1(ISequentialOutStream)
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-class CCachedInStream:
- public IInStream,
- public CMyUnknownImp
-{
- UInt64 *_tags;
- Byte *_data;
- size_t _dataSize;
- unsigned _blockSizeLog;
- unsigned _numBlocksLog;
- UInt64 _size;
- UInt64 _pos;
-protected:
- virtual HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize) = 0;
-public:
- CCachedInStream(): _tags(0), _data(0) {}
- virtual ~CCachedInStream() { Free(); } // the destructor must be virtual (release calls it) !!!
- void Free() throw();
- bool Alloc(unsigned blockSizeLog, unsigned numBlocksLog) throw();
- void Init(UInt64 size) throw();
-
- MY_UNKNOWN_IMP2(ISequentialInStream, IInStream)
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/StreamUtils.cpp b/src/libs/7zip/win/CPP/7zip/Common/StreamUtils.cpp
deleted file mode 100644
index 1402f4205..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/StreamUtils.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-// StreamUtils.cpp
-
-#include "StdAfx.h"
-
-#include "StreamUtils.h"
-
-static const UInt32 kBlockSize = ((UInt32)1 << 31);
-
-HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *processedSize) throw()
-{
- size_t size = *processedSize;
- *processedSize = 0;
- while (size != 0)
- {
- UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize;
- UInt32 processedSizeLoc;
- HRESULT res = stream->Read(data, curSize, &processedSizeLoc);
- *processedSize += processedSizeLoc;
- data = (void *)((Byte *)data + processedSizeLoc);
- size -= processedSizeLoc;
- RINOK(res);
- if (processedSizeLoc == 0)
- return S_OK;
- }
- return S_OK;
-}
-
-HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size) throw()
-{
- size_t processedSize = size;
- RINOK(ReadStream(stream, data, &processedSize));
- return (size == processedSize) ? S_OK : S_FALSE;
-}
-
-HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size) throw()
-{
- size_t processedSize = size;
- RINOK(ReadStream(stream, data, &processedSize));
- return (size == processedSize) ? S_OK : E_FAIL;
-}
-
-HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size) throw()
-{
- while (size != 0)
- {
- UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize;
- UInt32 processedSizeLoc;
- HRESULT res = stream->Write(data, curSize, &processedSizeLoc);
- data = (const void *)((const Byte *)data + processedSizeLoc);
- size -= processedSizeLoc;
- RINOK(res);
- if (processedSizeLoc == 0)
- return E_FAIL;
- }
- return S_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/StreamUtils.h b/src/libs/7zip/win/CPP/7zip/Common/StreamUtils.h
deleted file mode 100644
index ae914c004..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/StreamUtils.h
+++ /dev/null
@@ -1,13 +0,0 @@
-// StreamUtils.h
-
-#ifndef __STREAM_UTILS_H
-#define __STREAM_UTILS_H
-
-#include "../IStream.h"
-
-HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *size) throw();
-HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size) throw();
-HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size) throw();
-HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size) throw();
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/UniqBlocks.cpp b/src/libs/7zip/win/CPP/7zip/Common/UniqBlocks.cpp
deleted file mode 100644
index 7fcc88f5e..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/UniqBlocks.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-// UniqBlocks.cpp
-
-#include "StdAfx.h"
-
-#include "UniqBlocks.h"
-
-int CUniqBlocks::AddUniq(const Byte *data, size_t size)
-{
- unsigned left = 0, right = Sorted.Size();
- while (left != right)
- {
- unsigned mid = (left + right) / 2;
- int index = Sorted[mid];
- const CByteBuffer &buf = Bufs[index];
- size_t sizeMid = buf.Size();
- if (size < sizeMid)
- right = mid;
- else if (size > sizeMid)
- left = mid + 1;
- else
- {
- int cmp = memcmp(data, buf, size);
- if (cmp == 0)
- return index;
- if (cmp < 0)
- right = mid;
- else
- left = mid + 1;
- }
- }
- int index = Bufs.Size();
- Sorted.Insert(left, index);
- CByteBuffer &buf = Bufs.AddNew();
- buf.CopyFrom(data, size);
- return index;
-}
-
-UInt64 CUniqBlocks::GetTotalSizeInBytes() const
-{
- UInt64 size = 0;
- FOR_VECTOR (i, Bufs)
- size += Bufs[i].Size();
- return size;
-}
-
-void CUniqBlocks::GetReverseMap()
-{
- unsigned num = Sorted.Size();
- BufIndexToSortedIndex.ClearAndSetSize(num);
- int *p = &BufIndexToSortedIndex[0];
- unsigned i;
- for (i = 0; i < num; i++)
- p[i] = 0;
- for (i = 0; i < num; i++)
- p[Sorted[i]] = i;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/UniqBlocks.h b/src/libs/7zip/win/CPP/7zip/Common/UniqBlocks.h
deleted file mode 100644
index 9c08b09f4..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/UniqBlocks.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// UniqBlocks.h
-
-#ifndef __UNIQ_BLOCKS_H
-#define __UNIQ_BLOCKS_H
-
-#include "../../Common/MyTypes.h"
-#include "../../Common/MyBuffer.h"
-#include "../../Common/MyVector.h"
-
-struct CUniqBlocks
-{
- CObjectVector<CByteBuffer> Bufs;
- CIntVector Sorted;
- CIntVector BufIndexToSortedIndex;
-
- int AddUniq(const Byte *data, size_t size);
- UInt64 GetTotalSizeInBytes() const;
- void GetReverseMap();
-
- bool IsOnlyEmpty() const
- {
- if (Bufs.Size() == 0)
- return true;
- if (Bufs.Size() > 1)
- return false;
- return Bufs[0].Size() == 0;
- }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Common/VirtThread.cpp b/src/libs/7zip/win/CPP/7zip/Common/VirtThread.cpp
deleted file mode 100644
index 77e3c1acf..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/VirtThread.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-// VirtThread.cpp
-
-#include "StdAfx.h"
-
-#include "VirtThread.h"
-
-static THREAD_FUNC_DECL CoderThread(void *p)
-{
- for (;;)
- {
- CVirtThread *t = (CVirtThread *)p;
- t->StartEvent.Lock();
- if (t->Exit)
- return 0;
- t->Execute();
- t->FinishedEvent.Set();
- }
-}
-
-WRes CVirtThread::Create()
-{
- RINOK(StartEvent.CreateIfNotCreated());
- RINOK(FinishedEvent.CreateIfNotCreated());
- StartEvent.Reset();
- FinishedEvent.Reset();
- Exit = false;
- if (Thread.IsCreated())
- return S_OK;
- return Thread.Create(CoderThread, this);
-}
-
-void CVirtThread::Start()
-{
- Exit = false;
- StartEvent.Set();
-}
-
-void CVirtThread::WaitThreadFinish()
-{
- Exit = true;
- if (StartEvent.IsCreated())
- StartEvent.Set();
- if (Thread.IsCreated())
- {
- Thread.Wait();
- Thread.Close();
- }
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Common/VirtThread.h b/src/libs/7zip/win/CPP/7zip/Common/VirtThread.h
deleted file mode 100644
index ebee158ca..000000000
--- a/src/libs/7zip/win/CPP/7zip/Common/VirtThread.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// VirtThread.h
-
-#ifndef __VIRT_THREAD_H
-#define __VIRT_THREAD_H
-
-#include "../../Windows/Synchronization.h"
-#include "../../Windows/Thread.h"
-
-struct CVirtThread
-{
- NWindows::NSynchronization::CAutoResetEvent StartEvent;
- NWindows::NSynchronization::CAutoResetEvent FinishedEvent;
- NWindows::CThread Thread;
- bool Exit;
-
- ~CVirtThread() { WaitThreadFinish(); }
- void WaitThreadFinish(); // call it in destructor of child class !
- WRes Create();
- void Start();
- virtual void Execute() = 0;
- void WaitExecuteFinish() { FinishedEvent.Lock(); }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Bcj2Coder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/Bcj2Coder.cpp
deleted file mode 100644
index 9da6b9c28..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Bcj2Coder.cpp
+++ /dev/null
@@ -1,366 +0,0 @@
-// Bcj2Coder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "Bcj2Coder.h"
-
-namespace NCompress {
-namespace NBcj2 {
-
-inline bool IsJcc(Byte b0, Byte b1) { return (b0 == 0x0F && (b1 & 0xF0) == 0x80); }
-inline bool IsJ(Byte b0, Byte b1) { return ((b1 & 0xFE) == 0xE8 || IsJcc(b0, b1)); }
-inline unsigned GetIndex(Byte b0, Byte b1) { return ((b1 == 0xE8) ? b0 : ((b1 == 0xE9) ? 256 : 257)); }
-
-#ifndef EXTRACT_ONLY
-
-static const unsigned kBufSize = 1 << 17;
-
-#define NUM_BITS 2
-#define SIGN_BIT (1 << NUM_BITS)
-#define MASK_HIGH (0x100 - (1 << (NUM_BITS + 1)))
-
-static const UInt32 kDefaultLimit = (1 << (24 + NUM_BITS));
-
-static bool inline Test86MSByte(Byte b)
-{
- return (((b) + SIGN_BIT) & MASK_HIGH) == 0;
-}
-
-CEncoder::~CEncoder()
-{
- ::MidFree(_buf);
-}
-
-HRESULT CEncoder::Flush()
-{
- RINOK(_mainStream.Flush());
- RINOK(_callStream.Flush());
- RINOK(_jumpStream.Flush());
- _rc.FlushData();
- return _rc.FlushStream();
-}
-
-HRESULT CEncoder::CodeReal(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
- ISequentialOutStream **outStreams, const UInt64 ** /* outSizes */, UInt32 numOutStreams,
- ICompressProgressInfo *progress)
-{
- if (numInStreams != 1 || numOutStreams != 4)
- return E_INVALIDARG;
-
- if (!_mainStream.Create(1 << 18)) return E_OUTOFMEMORY;
- if (!_callStream.Create(1 << 18)) return E_OUTOFMEMORY;
- if (!_jumpStream.Create(1 << 18)) return E_OUTOFMEMORY;
- if (!_rc.Create(1 << 20)) return E_OUTOFMEMORY;
- if (_buf == 0)
- {
- _buf = (Byte *)MidAlloc(kBufSize);
- if (_buf == 0)
- return E_OUTOFMEMORY;
- }
-
- bool sizeIsDefined = false;
- UInt64 inSize = 0;
- if (inSizes)
- if (inSizes[0])
- {
- inSize = *inSizes[0];
- if (inSize <= kDefaultLimit)
- sizeIsDefined = true;
- }
-
- ISequentialInStream *inStream = inStreams[0];
-
- _mainStream.SetStream(outStreams[0]); _mainStream.Init();
- _callStream.SetStream(outStreams[1]); _callStream.Init();
- _jumpStream.SetStream(outStreams[2]); _jumpStream.Init();
- _rc.SetStream(outStreams[3]); _rc.Init();
- for (unsigned i = 0; i < 256 + 2; i++)
- _statusEncoder[i].Init();
-
- CMyComPtr<ICompressGetSubStreamSize> getSubStreamSize;
- {
- inStream->QueryInterface(IID_ICompressGetSubStreamSize, (void **)&getSubStreamSize);
- }
-
- UInt32 nowPos = 0;
- UInt64 nowPos64 = 0;
- UInt32 bufPos = 0;
-
- Byte prevByte = 0;
-
- UInt64 subStreamIndex = 0;
- UInt64 subStreamStartPos = 0;
- UInt64 subStreamEndPos = 0;
-
- for (;;)
- {
- UInt32 processedSize = 0;
- for (;;)
- {
- UInt32 size = kBufSize - (bufPos + processedSize);
- UInt32 processedSizeLoc;
- if (size == 0)
- break;
- RINOK(inStream->Read(_buf + bufPos + processedSize, size, &processedSizeLoc));
- if (processedSizeLoc == 0)
- break;
- processedSize += processedSizeLoc;
- }
- UInt32 endPos = bufPos + processedSize;
-
- if (endPos < 5)
- {
- // change it
- for (bufPos = 0; bufPos < endPos; bufPos++)
- {
- Byte b = _buf[bufPos];
- _mainStream.WriteByte(b);
- UInt32 index;
- if (b == 0xE8)
- index = prevByte;
- else if (b == 0xE9)
- index = 256;
- else if (IsJcc(prevByte, b))
- index = 257;
- else
- {
- prevByte = b;
- continue;
- }
- _statusEncoder[index].Encode(&_rc, 0);
- prevByte = b;
- }
- return Flush();
- }
-
- bufPos = 0;
-
- UInt32 limit = endPos - 5;
- while (bufPos <= limit)
- {
- Byte b = _buf[bufPos];
- _mainStream.WriteByte(b);
- if (!IsJ(prevByte, b))
- {
- bufPos++;
- prevByte = b;
- continue;
- }
- Byte nextByte = _buf[bufPos + 4];
- UInt32 src =
- (UInt32(nextByte) << 24) |
- (UInt32(_buf[bufPos + 3]) << 16) |
- (UInt32(_buf[bufPos + 2]) << 8) |
- (_buf[bufPos + 1]);
- UInt32 dest = (nowPos + bufPos + 5) + src;
- // if (Test86MSByte(nextByte))
- bool convert;
- if (getSubStreamSize)
- {
- UInt64 currentPos = (nowPos64 + bufPos);
- while (subStreamEndPos < currentPos)
- {
- UInt64 subStreamSize;
- HRESULT result = getSubStreamSize->GetSubStreamSize(subStreamIndex, &subStreamSize);
- if (result == S_OK)
- {
- subStreamStartPos = subStreamEndPos;
- subStreamEndPos += subStreamSize;
- subStreamIndex++;
- }
- else if (result == S_FALSE || result == E_NOTIMPL)
- {
- getSubStreamSize.Release();
- subStreamStartPos = 0;
- subStreamEndPos = subStreamStartPos - 1;
- }
- else
- return result;
- }
- if (getSubStreamSize == NULL)
- {
- if (sizeIsDefined)
- convert = (dest < inSize);
- else
- convert = Test86MSByte(nextByte);
- }
- else if (subStreamEndPos - subStreamStartPos > kDefaultLimit)
- convert = Test86MSByte(nextByte);
- else
- {
- UInt64 dest64 = (currentPos + 5) + Int64(Int32(src));
- convert = (dest64 >= subStreamStartPos && dest64 < subStreamEndPos);
- }
- }
- else if (sizeIsDefined)
- convert = (dest < inSize);
- else
- convert = Test86MSByte(nextByte);
- unsigned index = GetIndex(prevByte, b);
- if (convert)
- {
- _statusEncoder[index].Encode(&_rc, 1);
- bufPos += 5;
- COutBuffer &s = (b == 0xE8) ? _callStream : _jumpStream;
- for (int i = 24; i >= 0; i -= 8)
- s.WriteByte((Byte)(dest >> i));
- prevByte = nextByte;
- }
- else
- {
- _statusEncoder[index].Encode(&_rc, 0);
- bufPos++;
- prevByte = b;
- }
- }
- nowPos += bufPos;
- nowPos64 += bufPos;
-
- if (progress)
- {
- /*
- const UInt64 compressedSize =
- _mainStream.GetProcessedSize() +
- _callStream.GetProcessedSize() +
- _jumpStream.GetProcessedSize() +
- _rc.GetProcessedSize();
- */
- RINOK(progress->SetRatioInfo(&nowPos64, NULL));
- }
-
- UInt32 i = 0;
- while (bufPos < endPos)
- _buf[i++] = _buf[bufPos++];
- bufPos = i;
- }
-}
-
-STDMETHODIMP CEncoder::Code(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
- ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
- ICompressProgressInfo *progress)
-{
- try
- {
- return CodeReal(inStreams, inSizes, numInStreams, outStreams, outSizes,numOutStreams, progress);
- }
- catch(const COutBufferException &e) { return e.ErrorCode; }
- catch(...) { return S_FALSE; }
-}
-
-#endif
-
-
-STDMETHODIMP CDecoder::SetInBufSize(UInt32 streamIndex, UInt32 size) { _inBufSizes[streamIndex] = size; return S_OK; }
-STDMETHODIMP CDecoder::SetOutBufSize(UInt32 , UInt32 size) { _outBufSize = size; return S_OK; }
-
-CDecoder::CDecoder():
- _outBufSize(1 << 16)
-{
- _inBufSizes[0] = 1 << 20;
- _inBufSizes[1] = 1 << 20;
- _inBufSizes[2] = 1 << 20;
- _inBufSizes[3] = 1 << 20;
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream **inStreams, const UInt64 ** /* inSizes */, UInt32 numInStreams,
- ISequentialOutStream **outStreams, const UInt64 ** /* outSizes */, UInt32 numOutStreams,
- ICompressProgressInfo *progress)
-{
- if (numInStreams != 4 || numOutStreams != 1)
- return E_INVALIDARG;
-
- if (!_mainStream.Create(_inBufSizes[0])) return E_OUTOFMEMORY;
- if (!_callStream.Create(_inBufSizes[1])) return E_OUTOFMEMORY;
- if (!_jumpStream.Create(_inBufSizes[2])) return E_OUTOFMEMORY;
- if (!_rc.Create(_inBufSizes[3])) return E_OUTOFMEMORY;
- if (!_outStream.Create(_outBufSize)) return E_OUTOFMEMORY;
-
- _mainStream.SetStream(inStreams[0]);
- _callStream.SetStream(inStreams[1]);
- _jumpStream.SetStream(inStreams[2]);
- _rc.SetStream(inStreams[3]);
- _outStream.SetStream(outStreams[0]);
-
- _mainStream.Init();
- _callStream.Init();
- _jumpStream.Init();
- _rc.Init();
- _outStream.Init();
-
- for (unsigned i = 0; i < 256 + 2; i++)
- _statusDecoder[i].Init();
-
- Byte prevByte = 0;
- UInt32 processedBytes = 0;
- for (;;)
- {
- if (processedBytes >= (1 << 20) && progress)
- {
- /*
- const UInt64 compressedSize =
- _mainStream.GetProcessedSize() +
- _callStream.GetProcessedSize() +
- _jumpStream.GetProcessedSize() +
- _rc.GetProcessedSize();
- */
- const UInt64 nowPos64 = _outStream.GetProcessedSize();
- RINOK(progress->SetRatioInfo(NULL, &nowPos64));
- processedBytes = 0;
- }
- UInt32 i;
- Byte b = 0;
- const UInt32 kBurstSize = (1 << 18);
- for (i = 0; i < kBurstSize; i++)
- {
- if (!_mainStream.ReadByte(b))
- return _outStream.Flush();
- _outStream.WriteByte(b);
- if (IsJ(prevByte, b))
- break;
- prevByte = b;
- }
- processedBytes += i;
- if (i == kBurstSize)
- continue;
- unsigned index = GetIndex(prevByte, b);
- if (_statusDecoder[index].Decode(&_rc) == 1)
- {
- UInt32 src = 0;
- CInBuffer &s = (b == 0xE8) ? _callStream : _jumpStream;
- for (unsigned i = 0; i < 4; i++)
- {
- Byte b0;
- if (!s.ReadByte(b0))
- return S_FALSE;
- src <<= 8;
- src |= ((UInt32)b0);
- }
- UInt32 dest = src - (UInt32(_outStream.GetProcessedSize()) + 4) ;
- _outStream.WriteByte((Byte)(dest));
- _outStream.WriteByte((Byte)(dest >> 8));
- _outStream.WriteByte((Byte)(dest >> 16));
- _outStream.WriteByte((Byte)(dest >> 24));
- prevByte = (Byte)(dest >> 24);
- processedBytes += 4;
- }
- else
- prevByte = b;
- }
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
- ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
- ICompressProgressInfo *progress)
-{
- try
- {
- return CodeReal(inStreams, inSizes, numInStreams, outStreams, outSizes,numOutStreams, 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/Bcj2Coder.h b/src/libs/7zip/win/CPP/7zip/Compress/Bcj2Coder.h
deleted file mode 100644
index e7bd37951..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Bcj2Coder.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Bcj2Coder.h
-
-#ifndef __COMPRESS_BCJ2_CODER_H
-#define __COMPRESS_BCJ2_CODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "RangeCoderBit.h"
-
-namespace NCompress {
-namespace NBcj2 {
-
-const unsigned kNumMoveBits = 5;
-
-#ifndef EXTRACT_ONLY
-
-class CEncoder:
- public ICompressCoder2,
- public CMyUnknownImp
-{
- Byte *_buf;
-
- COutBuffer _mainStream;
- COutBuffer _callStream;
- COutBuffer _jumpStream;
- NRangeCoder::CEncoder _rc;
- NRangeCoder::CBitEncoder<kNumMoveBits> _statusEncoder[256 + 2];
-
- HRESULT Flush();
-
-public:
- MY_UNKNOWN_IMP
-
- HRESULT CodeReal(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
- ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
- ICompressProgressInfo *progress);
- STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
- ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
- ICompressProgressInfo *progress);
-
- CEncoder(): _buf(0) {};
- ~CEncoder();
-};
-
-#endif
-
-class CDecoder:
- public ICompressCoder2,
- public ICompressSetBufSize,
- public CMyUnknownImp
-{
- CInBuffer _mainStream;
- CInBuffer _callStream;
- CInBuffer _jumpStream;
- NRangeCoder::CDecoder _rc;
- NRangeCoder::CBitDecoder<kNumMoveBits> _statusDecoder[256 + 2];
-
- COutBuffer _outStream;
- UInt32 _inBufSizes[4];
- UInt32 _outBufSize;
-
-public:
- MY_UNKNOWN_IMP1(ICompressSetBufSize);
-
- HRESULT CodeReal(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
- ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
- ICompressProgressInfo *progress);
- STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
- ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
- ICompressProgressInfo *progress);
-
- STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size);
- STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size);
-
- CDecoder();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Bcj2Register.cpp b/src/libs/7zip/win/CPP/7zip/Compress/Bcj2Register.cpp
deleted file mode 100644
index 8eb1e7360..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Bcj2Register.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// Bcj2Register.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "Bcj2Coder.h"
-
-static void *CreateCodec() { return (void *)(ICompressCoder2 *)(new NCompress::NBcj2::CDecoder()); }
-#ifndef EXTRACT_ONLY
-static void *CreateCodecOut() { return (void *)(ICompressCoder2 *)(new NCompress::NBcj2::CEncoder()); }
-#else
-#define CreateCodecOut 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodec, CreateCodecOut, 0x0303011B, L"BCJ2", 4, false };
-
-REGISTER_CODEC(BCJ2)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BcjCoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/BcjCoder.cpp
deleted file mode 100644
index 0e34ef488..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BcjCoder.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// BcjCoder.cpp
-
-#include "StdAfx.h"
-
-#include "BcjCoder.h"
-
-UInt32 CBCJ_x86_Encoder::SubFilter(Byte *data, UInt32 size)
-{
- return (UInt32)::x86_Convert(data, size, _bufferPos, &_prevMask, 1);
-}
-
-UInt32 CBCJ_x86_Decoder::SubFilter(Byte *data, UInt32 size)
-{
- return (UInt32)::x86_Convert(data, size, _bufferPos, &_prevMask, 0);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BcjCoder.h b/src/libs/7zip/win/CPP/7zip/Compress/BcjCoder.h
deleted file mode 100644
index 0754bcd23..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BcjCoder.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// BcjCoder.h
-
-#ifndef __COMPRESS_BCJ_CODER_H
-#define __COMPRESS_BCJ_CODER_H
-
-#include "../../../C/Bra.h"
-
-#include "BranchCoder.h"
-
-struct CBranch86
-{
- UInt32 _prevMask;
- void x86Init() { x86_Convert_Init(_prevMask); }
-};
-
-MyClassB(BCJ_x86, 0x01, 3, CBranch86 ,
- virtual void SubInit() { x86Init(); })
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BcjRegister.cpp b/src/libs/7zip/win/CPP/7zip/Compress/BcjRegister.cpp
deleted file mode 100644
index 648ad8e03..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BcjRegister.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// BcjRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "BcjCoder.h"
-
-static void *CreateCodec() { return (void *)(ICompressFilter *)(new CBCJ_x86_Decoder()); }
-#ifndef EXTRACT_ONLY
-static void *CreateCodecOut() { return (void *)(ICompressFilter *)(new CBCJ_x86_Encoder()); }
-#else
-#define CreateCodecOut 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodec, CreateCodecOut, 0x03030103, L"BCJ", 1, true };
-
-REGISTER_CODEC(BCJ)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BranchCoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/BranchCoder.cpp
deleted file mode 100644
index 431709526..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BranchCoder.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// BranchCoder.cpp
-
-#include "StdAfx.h"
-
-#include "BranchCoder.h"
-
-STDMETHODIMP CBranchConverter::Init()
-{
- _bufferPos = 0;
- SubInit();
- return S_OK;
-}
-
-STDMETHODIMP_(UInt32) CBranchConverter::Filter(Byte *data, UInt32 size)
-{
- UInt32 processedSize = SubFilter(data, size);
- _bufferPos += processedSize;
- return processedSize;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BranchCoder.h b/src/libs/7zip/win/CPP/7zip/Compress/BranchCoder.h
deleted file mode 100644
index 0e3a5c4e1..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BranchCoder.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// BranchCoder.h
-
-#ifndef __COMPRESS_BRANCH_CODER_H
-#define __COMPRESS_BRANCH_CODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-class CBranchConverter:
- public ICompressFilter,
- public CMyUnknownImp
-{
-protected:
- UInt32 _bufferPos;
- virtual void SubInit() {}
- virtual UInt32 SubFilter(Byte *data, UInt32 size) = 0;
-public:
- MY_UNKNOWN_IMP;
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
-};
-
-#define MyClassEncoderA(Name) class C ## Name: public CBranchConverter \
- { public: UInt32 SubFilter(Byte *data, UInt32 size); };
-
-#define MyClassDecoderA(Name) class C ## Name: public CBranchConverter \
- { public: UInt32 SubFilter(Byte *data, UInt32 size); };
-
-#define MyClassEncoderB(Name, ADD_ITEMS, ADD_INIT) class C ## Name: public CBranchConverter, public ADD_ITEMS \
- { public: UInt32 SubFilter(Byte *data, UInt32 size); ADD_INIT};
-
-#define MyClassDecoderB(Name, ADD_ITEMS, ADD_INIT) class C ## Name: public CBranchConverter, public ADD_ITEMS \
- { public: UInt32 SubFilter(Byte *data, UInt32 size); ADD_INIT};
-
-#define MyClassA(Name, id, subId) \
-MyClassEncoderA(Name ## _Encoder) \
-MyClassDecoderA(Name ## _Decoder)
-
-#define MyClassB(Name, id, subId, ADD_ITEMS, ADD_INIT) \
-MyClassEncoderB(Name ## _Encoder, ADD_ITEMS, ADD_INIT) \
-MyClassDecoderB(Name ## _Decoder, ADD_ITEMS, ADD_INIT)
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BranchMisc.cpp b/src/libs/7zip/win/CPP/7zip/Compress/BranchMisc.cpp
deleted file mode 100644
index 239f25138..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BranchMisc.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// BranchMisc.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Bra.h"
-
-#include "BranchMisc.h"
-
-#define SUB_FILTER_IMP2(name, coderStr, coderNum) \
- UInt32 CBC_ ## name ## coderStr::SubFilter(Byte *data, UInt32 size) \
- { return (UInt32)::name ## Convert(data, size, _bufferPos, coderNum); }
-
-#define SUB_FILTER_IMP(name) \
- SUB_FILTER_IMP2(name, Encoder, 1) \
- SUB_FILTER_IMP2(name, Decoder, 0) \
-
-SUB_FILTER_IMP(ARM_)
-SUB_FILTER_IMP(ARMT_)
-SUB_FILTER_IMP(PPC_)
-SUB_FILTER_IMP(SPARC_)
-SUB_FILTER_IMP(IA64_)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BranchMisc.h b/src/libs/7zip/win/CPP/7zip/Compress/BranchMisc.h
deleted file mode 100644
index 81198b21c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BranchMisc.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// BranchMisc.h
-
-#ifndef __COMPRESS_BRANCH_MISC_H
-#define __COMPRESS_BRANCH_MISC_H
-
-#include "BranchCoder.h"
-
-MyClassA(BC_ARM, 0x05, 1)
-MyClassA(BC_ARMT, 0x07, 1)
-MyClassA(BC_PPC, 0x02, 5)
-MyClassA(BC_SPARC, 0x08, 5)
-MyClassA(BC_IA64, 0x04, 1)
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/BranchRegister.cpp b/src/libs/7zip/win/CPP/7zip/Compress/BranchRegister.cpp
deleted file mode 100644
index 380828c6d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/BranchRegister.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-// BranchRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "BranchMisc.h"
-
-#define CREATE_CODEC(x) \
- static void *CreateCodec ## x() { return (void *)(ICompressFilter *)(new C ## x ## _Decoder); } \
- static void *CreateCodec ## x ## Out() { return (void *)(ICompressFilter *)(new C ## x ## _Encoder); }
-
-CREATE_CODEC(BC_PPC)
-CREATE_CODEC(BC_IA64)
-CREATE_CODEC(BC_ARM)
-CREATE_CODEC(BC_ARMT)
-CREATE_CODEC(BC_SPARC)
-
-#define METHOD_ITEM(x, id1, id2, name) { CreateCodec ## x, CreateCodec ## x ## Out, 0x03030000 + (id1 * 256) + id2, name, 1, true }
-
-static CCodecInfo g_CodecsInfo[] =
-{
- METHOD_ITEM(BC_PPC, 0x02, 0x05, L"PPC"),
- METHOD_ITEM(BC_IA64, 0x04, 1, L"IA64"),
- METHOD_ITEM(BC_ARM, 0x05, 1, L"ARM"),
- METHOD_ITEM(BC_ARMT, 0x07, 1, L"ARMT"),
- METHOD_ITEM(BC_SPARC, 0x08, 0x05, L"SPARC")
-};
-
-REGISTER_CODECS(Branch)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/ByteSwap.cpp b/src/libs/7zip/win/CPP/7zip/Compress/ByteSwap.cpp
deleted file mode 100644
index 645b6ffcd..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/ByteSwap.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-// ByteSwap.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/RegisterCodec.h"
-
-class CByteSwap2:
- public ICompressFilter,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
-};
-
-class CByteSwap4:
- public ICompressFilter,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
-};
-
-STDMETHODIMP CByteSwap2::Init() { return S_OK; }
-
-STDMETHODIMP_(UInt32) CByteSwap2::Filter(Byte *data, UInt32 size)
-{
- const UInt32 kStep = 2;
- UInt32 i;
- for (i = 0; i + kStep <= size; i += kStep)
- {
- Byte b = data[i];
- data[i] = data[i + 1];
- data[i + 1] = b;
- }
- return i;
-}
-
-STDMETHODIMP CByteSwap4::Init() { return S_OK; }
-
-STDMETHODIMP_(UInt32) CByteSwap4::Filter(Byte *data, UInt32 size)
-{
- const UInt32 kStep = 4;
- UInt32 i;
- for (i = 0; i + kStep <= size; i += kStep)
- {
- Byte b0 = data[i];
- Byte b1 = data[i + 1];
- data[i] = data[i + 3];
- data[i + 1] = data[i + 2];
- data[i + 2] = b1;
- data[i + 3] = b0;
- }
- return i;
-}
-
-static void *CreateCodec2() { return (void *)(ICompressFilter *)(new CByteSwap2); }
-static void *CreateCodec4() { return (void *)(ICompressFilter *)(new CByteSwap4); }
-
-static CCodecInfo g_CodecsInfo[] =
-{
- { CreateCodec2, CreateCodec2, 0x020302, L"Swap2", 1, true },
- { CreateCodec4, CreateCodec4, 0x020304, L"Swap4", 1, true }
-};
-
-REGISTER_CODECS(ByteSwap)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Compress.pri b/src/libs/7zip/win/CPP/7zip/Compress/Compress.pri
deleted file mode 100644
index db923a868..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Compress.pri
+++ /dev/null
@@ -1,30 +0,0 @@
-HEADERS += $$7ZIP_BASE/CPP/7zip/Compress/Bcj2Coder.h \
- $$7ZIP_BASE/CPP/7zip/Compress/BcjCoder.h \
- $$7ZIP_BASE/CPP/7zip/Compress/BranchCoder.h \
- $$7ZIP_BASE/CPP/7zip/Compress/BranchMisc.h \
- $$7ZIP_BASE/CPP/7zip/Compress/CopyCoder.h \
- $$7ZIP_BASE/CPP/7zip/Compress/Lzma2Decoder.h \
- $$7ZIP_BASE/CPP/7zip/Compress/Lzma2Encoder.h \
- $$7ZIP_BASE/CPP/7zip/Compress/LzmaDecoder.h \
- $$7ZIP_BASE/CPP/7zip/Compress/LzmaEncoder.h \
- $$7ZIP_BASE/CPP/7zip/Compress/RangeCoder.h \
- $$7ZIP_BASE/CPP/7zip/Compress/RangeCoderBit.h \
- $$7ZIP_BASE/CPP/7zip/Compress/StdAfx.h
-
-SOURCES += $$7ZIP_BASE/CPP/7zip/Compress/Bcj2Coder.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/Bcj2Register.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/BcjCoder.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/BcjRegister.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/BranchCoder.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/BranchMisc.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/BranchRegister.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/ByteSwap.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/CopyCoder.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/CopyRegister.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/DeltaFilter.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/Lzma2Decoder.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/Lzma2Encoder.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/Lzma2Register.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/LzmaDecoder.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/LzmaEncoder.cpp \
- $$7ZIP_BASE/CPP/7zip/Compress/LzmaRegister.cpp
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/CopyCoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/CopyCoder.cpp
deleted file mode 100644
index f0863202a..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/CopyCoder.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-// Compress/CopyCoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "CopyCoder.h"
-
-namespace NCompress {
-
-static const UInt32 kBufferSize = 1 << 17;
-
-CCopyCoder::~CCopyCoder()
-{
- ::MidFree(_buffer);
-}
-
-STDMETHODIMP CCopyCoder::Code(ISequentialInStream *inStream,
- ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize,
- ICompressProgressInfo *progress)
-{
- if (!_buffer)
- {
- _buffer = (Byte *)::MidAlloc(kBufferSize);
- if (!_buffer)
- return E_OUTOFMEMORY;
- }
-
- TotalSize = 0;
- for (;;)
- {
- UInt32 size = kBufferSize;
- if (outSize && size > *outSize - TotalSize)
- size = (UInt32)(*outSize - TotalSize);
- RINOK(inStream->Read(_buffer, size, &size));
- if (size == 0)
- break;
- if (outStream)
- {
- RINOK(WriteStream(outStream, _buffer, size));
- }
- TotalSize += size;
- if (progress)
- {
- RINOK(progress->SetRatioInfo(&TotalSize, &TotalSize));
- }
- }
- return S_OK;
-}
-
-STDMETHODIMP CCopyCoder::GetInStreamProcessedSize(UInt64 *value)
-{
- *value = TotalSize;
- return S_OK;
-}
-
-HRESULT CopyStream(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress)
-{
- CMyComPtr<ICompressCoder> copyCoder = new CCopyCoder;
- return copyCoder->Code(inStream, outStream, NULL, NULL, progress);
-}
-
-HRESULT CopyStream_ExactSize(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt64 size, ICompressProgressInfo *progress)
-{
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
- RINOK(copyCoder->Code(inStream, outStream, NULL, &size, progress));
- return copyCoderSpec->TotalSize == size ? S_OK : E_FAIL;
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/CopyCoder.h b/src/libs/7zip/win/CPP/7zip/Compress/CopyCoder.h
deleted file mode 100644
index 5e0bb6436..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/CopyCoder.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Compress/CopyCoder.h
-
-#ifndef __COMPRESS_COPY_CODER_H
-#define __COMPRESS_COPY_CODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-
-class CCopyCoder:
- public ICompressCoder,
- public ICompressGetInStreamProcessedSize,
- public CMyUnknownImp
-{
- Byte *_buffer;
-public:
- UInt64 TotalSize;
- CCopyCoder(): TotalSize(0), _buffer(0) {};
- ~CCopyCoder();
-
- MY_UNKNOWN_IMP1(ICompressGetInStreamProcessedSize)
-
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
- STDMETHOD(GetInStreamProcessedSize)(UInt64 *value);
-};
-
-HRESULT CopyStream(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress);
-HRESULT CopyStream_ExactSize(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt64 size, ICompressProgressInfo *progress);
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/CopyRegister.cpp b/src/libs/7zip/win/CPP/7zip/Compress/CopyRegister.cpp
deleted file mode 100644
index efb9b9e95..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/CopyRegister.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-// CopyRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "CopyCoder.h"
-
-static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::CCopyCoder); }
-
-static CCodecInfo g_CodecInfo =
-{ CreateCodec, CreateCodec, 0x00, L"Copy", 1, false };
-
-REGISTER_CODEC(Copy)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/DeltaFilter.cpp b/src/libs/7zip/win/CPP/7zip/Compress/DeltaFilter.cpp
deleted file mode 100644
index d8378a60e..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/DeltaFilter.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-// DeltaFilter.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Delta.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "BranchCoder.h"
-
-struct CDelta
-{
- unsigned _delta;
- Byte _state[DELTA_STATE_SIZE];
- CDelta(): _delta(1) {}
- void DeltaInit() { Delta_Init(_state); }
-};
-
-class CDeltaEncoder:
- public ICompressFilter,
- public ICompressSetCoderProperties,
- public ICompressWriteCoderProperties,
- CDelta,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP2(ICompressSetCoderProperties, ICompressWriteCoderProperties)
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
- STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);
-};
-
-class CDeltaDecoder:
- public ICompressFilter,
- public ICompressSetDecoderProperties2,
- CDelta,
- public CMyUnknownImp
-{
-public:
- MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
- STDMETHOD(Init)();
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-};
-
-STDMETHODIMP CDeltaEncoder::Init()
-{
- DeltaInit();
- return S_OK;
-}
-
-STDMETHODIMP_(UInt32) CDeltaEncoder::Filter(Byte *data, UInt32 size)
-{
- Delta_Encode(_state, _delta, data, size);
- return size;
-}
-
-STDMETHODIMP CDeltaEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
-{
- UInt32 delta = _delta;
- for (UInt32 i = 0; i < numProps; i++)
- {
- const PROPVARIANT &prop = props[i];
- PROPID propID = propIDs[i];
- if (propID >= NCoderPropID::kReduceSize)
- continue;
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- switch (propID)
- {
- case NCoderPropID::kDefaultProp:
- delta = (UInt32)prop.ulVal;
- if (delta < 1 || delta > 256)
- return E_INVALIDARG;
- break;
- case NCoderPropID::kNumThreads: break;
- case NCoderPropID::kLevel: break;
- default: return E_INVALIDARG;
- }
- }
- _delta = delta;
- return S_OK;
-}
-
-STDMETHODIMP CDeltaEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
-{
- Byte prop = (Byte)(_delta - 1);
- return outStream->Write(&prop, 1, NULL);
-}
-
-STDMETHODIMP CDeltaDecoder::Init()
-{
- DeltaInit();
- return S_OK;
-}
-
-STDMETHODIMP_(UInt32) CDeltaDecoder::Filter(Byte *data, UInt32 size)
-{
- Delta_Decode(_state, _delta, data, size);
- return size;
-}
-
-STDMETHODIMP CDeltaDecoder::SetDecoderProperties2(const Byte *props, UInt32 size)
-{
- if (size != 1)
- return E_INVALIDARG;
- _delta = (unsigned)props[0] + 1;
- return S_OK;
-}
-
-#define CREATE_CODEC(x) \
- static void *CreateCodec ## x() { return (void *)(ICompressFilter *)(new C ## x ## Decoder); } \
- static void *CreateCodec ## x ## Out() { return (void *)(ICompressFilter *)(new C ## x ## Encoder); }
-
-CREATE_CODEC(Delta)
-
-#define METHOD_ITEM(x, id, name) { CreateCodec ## x, CreateCodec ## x ## Out, id, name, 1, true }
-
-static CCodecInfo g_CodecsInfo[] =
-{
- METHOD_ITEM(Delta, 3, L"Delta")
-};
-
-REGISTER_CODECS(Delta)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Decoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Decoder.cpp
deleted file mode 100644
index b20ae5f5e..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Decoder.cpp
+++ /dev/null
@@ -1,189 +0,0 @@
-// Lzma2Decoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "Lzma2Decoder.h"
-
-static HRESULT SResToHRESULT(SRes res)
-{
- switch(res)
- {
- case SZ_OK: return S_OK;
- case SZ_ERROR_MEM: return E_OUTOFMEMORY;
- case SZ_ERROR_PARAM: return E_INVALIDARG;
- // case SZ_ERROR_PROGRESS: return E_ABORT;
- case SZ_ERROR_DATA: return S_FALSE;
- }
- return E_FAIL;
-}
-
-namespace NCompress {
-namespace NLzma2 {
-
-static const UInt32 kInBufSize = 1 << 20;
-
-CDecoder::CDecoder(): _inBuf(0), _outSizeDefined(false)
-{
- Lzma2Dec_Construct(&_state);
-}
-
-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 };
-
-CDecoder::~CDecoder()
-{
- Lzma2Dec_Free(&_state, &g_Alloc);
- MyFree(_inBuf);
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *prop, UInt32 size)
-{
- if (size != 1) return SZ_ERROR_UNSUPPORTED;
- RINOK(SResToHRESULT(Lzma2Dec_Allocate(&_state, prop[0], &g_Alloc)));
- if (_inBuf == 0)
- {
- _inBuf = (Byte *)MyAlloc(kInBufSize);
- if (_inBuf == 0)
- return E_OUTOFMEMORY;
- }
-
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::GetInStreamProcessedSize(UInt64 *value) { *value = _inSizeProcessed; return S_OK; }
-STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) { _inStream = inStream; return S_OK; }
-STDMETHODIMP CDecoder::ReleaseInStream() { _inStream.Release(); return S_OK; }
-
-STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)
-{
- _outSizeDefined = (outSize != NULL);
- if (_outSizeDefined)
- _outSize = *outSize;
-
- Lzma2Dec_Init(&_state);
-
- _inPos = _inSize = 0;
- _inSizeProcessed = _outSizeProcessed = 0;
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 * /* inSize */,
- const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (_inBuf == 0)
- return S_FALSE;
- SetOutStreamSize(outSize);
-
- for (;;)
- {
- if (_inPos == _inSize)
- {
- _inPos = _inSize = 0;
- RINOK(inStream->Read(_inBuf, kInBufSize, &_inSize));
- }
-
- SizeT dicPos = _state.decoder.dicPos;
- SizeT curSize = _state.decoder.dicBufSize - dicPos;
- const UInt32 kStepSize = ((UInt32)1 << 22);
- if (curSize > kStepSize)
- curSize = (SizeT)kStepSize;
-
- ELzmaFinishMode finishMode = LZMA_FINISH_ANY;
- if (_outSizeDefined)
- {
- const UInt64 rem = _outSize - _outSizeProcessed;
- if (rem < curSize)
- {
- curSize = (SizeT)rem;
- /*
- // finishMode = LZMA_FINISH_END;
- we can't use LZMA_FINISH_END here to allow partial decoding
- */
- }
- }
-
- SizeT inSizeProcessed = _inSize - _inPos;
- ELzmaStatus status;
- SRes res = Lzma2Dec_DecodeToDic(&_state, dicPos + curSize, _inBuf + _inPos, &inSizeProcessed, finishMode, &status);
-
- _inPos += (UInt32)inSizeProcessed;
- _inSizeProcessed += inSizeProcessed;
- SizeT outSizeProcessed = _state.decoder.dicPos - dicPos;
- _outSizeProcessed += outSizeProcessed;
-
- bool finished = (inSizeProcessed == 0 && outSizeProcessed == 0);
- bool stopDecoding = (_outSizeDefined && _outSizeProcessed >= _outSize);
-
- if (res != 0 || _state.decoder.dicPos == _state.decoder.dicBufSize || finished || stopDecoding)
- {
- HRESULT res2 = WriteStream(outStream, _state.decoder.dic, _state.decoder.dicPos);
- if (res != 0)
- return S_FALSE;
- RINOK(res2);
- if (stopDecoding)
- return S_OK;
- if (finished)
- return (status == LZMA_STATUS_FINISHED_WITH_MARK ? S_OK : S_FALSE);
- }
- if (_state.decoder.dicPos == _state.decoder.dicBufSize)
- _state.decoder.dicPos = 0;
-
- if (progress != NULL)
- {
- RINOK(progress->SetRatioInfo(&_inSizeProcessed, &_outSizeProcessed));
- }
- }
-}
-
-#ifndef NO_READ_FROM_CODER
-
-STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- do
- {
- if (_inPos == _inSize)
- {
- _inPos = _inSize = 0;
- RINOK(_inStream->Read(_inBuf, kInBufSize, &_inSize));
- }
- {
- SizeT inProcessed = _inSize - _inPos;
-
- if (_outSizeDefined)
- {
- const UInt64 rem = _outSize - _outSizeProcessed;
- if (rem < size)
- size = (UInt32)rem;
- }
-
- SizeT outProcessed = size;
- ELzmaStatus status;
- SRes res = Lzma2Dec_DecodeToBuf(&_state, (Byte *)data, &outProcessed,
- _inBuf + _inPos, &inProcessed, LZMA_FINISH_ANY, &status);
- _inPos += (UInt32)inProcessed;
- _inSizeProcessed += inProcessed;
- _outSizeProcessed += outProcessed;
- size -= (UInt32)outProcessed;
- data = (Byte *)data + outProcessed;
- if (processedSize)
- *processedSize += (UInt32)outProcessed;
- RINOK(SResToHRESULT(res));
- if (inProcessed == 0 && outProcessed == 0)
- return S_OK;
- }
- }
- while (size != 0);
- return S_OK;
-}
-
-#endif
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Decoder.h b/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Decoder.h
deleted file mode 100644
index fd7ca2f39..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Decoder.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Lzma2Decoder.h
-
-#ifndef __LZMA2_DECODER_H
-#define __LZMA2_DECODER_H
-
-#include "../../../C/Lzma2Dec.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NLzma2 {
-
-class CDecoder:
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public ICompressGetInStreamProcessedSize,
- #ifndef NO_READ_FROM_CODER
- public ICompressSetInStream,
- public ICompressSetOutStreamSize,
- public ISequentialInStream,
- #endif
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialInStream> _inStream;
- Byte *_inBuf;
- UInt32 _inPos;
- UInt32 _inSize;
- CLzma2Dec _state;
- bool _outSizeDefined;
- UInt64 _outSize;
- UInt64 _inSizeProcessed;
- UInt64 _outSizeProcessed;
-public:
-
- #ifndef NO_READ_FROM_CODER
- MY_UNKNOWN_IMP5(
- ICompressSetDecoderProperties2,
- ICompressGetInStreamProcessedSize,
- ICompressSetInStream,
- ICompressSetOutStreamSize,
- ISequentialInStream)
- #else
- MY_UNKNOWN_IMP2(
- ICompressSetDecoderProperties2,
- ICompressGetInStreamProcessedSize)
- #endif
-
- STDMETHOD(Code)(ISequentialInStream *inStream,
- ISequentialOutStream *outStream, const UInt64 *_inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress);
-
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
- STDMETHOD(GetInStreamProcessedSize)(UInt64 *value);
-
- 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
-
- CDecoder();
- virtual ~CDecoder();
-
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Encoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Encoder.cpp
deleted file mode 100644
index f867881c0..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Encoder.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-// Lzma2Encoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/CWrappers.h"
-#include "../Common/StreamUtils.h"
-
-#include "Lzma2Encoder.h"
-
-namespace NCompress {
-
-namespace NLzma {
-
-HRESULT SetLzmaProp(PROPID propID, const PROPVARIANT &prop, CLzmaEncProps &ep);
-
-}
-
-namespace NLzma2 {
-
-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 void *SzAlloc(void *, size_t size) { return MyAlloc(size); }
-static void SzFree(void *, void *address) { MyFree(address); }
-static ISzAlloc g_Alloc = { SzAlloc, SzFree };
-
-CEncoder::CEncoder()
-{
- _encoder = 0;
- _encoder = Lzma2Enc_Create(&g_Alloc, &g_BigAlloc);
- if (_encoder == 0)
- throw 1;
-}
-
-CEncoder::~CEncoder()
-{
- if (_encoder != 0)
- Lzma2Enc_Destroy(_encoder);
-}
-
-HRESULT SetLzma2Prop(PROPID propID, const PROPVARIANT &prop, CLzma2EncProps &lzma2Props)
-{
- switch (propID)
- {
- case NCoderPropID::kBlockSize:
- if (prop.vt != VT_UI4) return E_INVALIDARG; lzma2Props.blockSize = prop.ulVal; break;
- case NCoderPropID::kNumThreads:
- if (prop.vt != VT_UI4) return E_INVALIDARG; lzma2Props.numTotalThreads = (int)(prop.ulVal); break;
- default:
- RINOK(NLzma::SetLzmaProp(propID, prop, lzma2Props.lzmaProps));
- }
- return S_OK;
-}
-
-STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs,
- const PROPVARIANT *coderProps, UInt32 numProps)
-{
- CLzma2EncProps lzma2Props;
- Lzma2EncProps_Init(&lzma2Props);
-
- for (UInt32 i = 0; i < numProps; i++)
- {
- RINOK(SetLzma2Prop(propIDs[i], coderProps[i], lzma2Props));
- }
- return SResToHRESULT(Lzma2Enc_SetProps(_encoder, &lzma2Props));
-}
-
-STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
-{
- Byte prop = Lzma2Enc_WriteProperties(_encoder);
- return WriteStream(outStream, &prop, 1);
-}
-
-STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- CSeqInStreamWrap inWrap(inStream);
- CSeqOutStreamWrap outWrap(outStream);
- CCompressProgressWrap progressWrap(progress);
-
- SRes res = Lzma2Enc_Encode(_encoder, &outWrap.p, &inWrap.p, progress ? &progressWrap.p : NULL);
- if (res == SZ_ERROR_READ && inWrap.Res != S_OK)
- return inWrap.Res;
- if (res == SZ_ERROR_WRITE && outWrap.Res != S_OK)
- return outWrap.Res;
- if (res == SZ_ERROR_PROGRESS && progressWrap.Res != S_OK)
- return progressWrap.Res;
- return SResToHRESULT(res);
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Encoder.h b/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Encoder.h
deleted file mode 100644
index 6a2318076..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Encoder.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Lzma2Encoder.h
-
-#ifndef __LZMA2_ENCODER_H
-#define __LZMA2_ENCODER_H
-
-#include "../../../C/Lzma2Enc.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NLzma2 {
-
-class CEncoder:
- public ICompressCoder,
- public ICompressSetCoderProperties,
- public ICompressWriteCoderProperties,
- public CMyUnknownImp
-{
- CLzma2EncHandle _encoder;
-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();
- virtual ~CEncoder();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Register.cpp b/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Register.cpp
deleted file mode 100644
index cace871ef..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/Lzma2Register.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// Lzma2Register.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "Lzma2Decoder.h"
-
-static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NLzma2::CDecoder); }
-#ifndef EXTRACT_ONLY
-#include "Lzma2Encoder.h"
-static void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NLzma2::CEncoder); }
-#else
-#define CreateCodecOut 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodec, CreateCodecOut, 0x21, L"LZMA2", 1, false };
-
-REGISTER_CODEC(LZMA2)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/LzmaDecoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/LzmaDecoder.cpp
deleted file mode 100644
index d378ba668..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/LzmaDecoder.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-// LzmaDecoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "LzmaDecoder.h"
-
-static HRESULT SResToHRESULT(SRes res)
-{
- switch(res)
- {
- case SZ_OK: return S_OK;
- case SZ_ERROR_MEM: return E_OUTOFMEMORY;
- case SZ_ERROR_PARAM: return E_INVALIDARG;
- case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL;
- case SZ_ERROR_DATA: return S_FALSE;
- }
- return E_FAIL;
-}
-
-namespace NCompress {
-namespace NLzma {
-
-CDecoder::CDecoder(): _inBuf(0), _propsWereSet(false), _outSizeDefined(false),
- _inBufSize(1 << 20),
- _outBufSize(1 << 22),
- FinishStream(false),
- NeedMoreInput(false)
-{
- _inSizeProcessed = 0;
- _inPos = _inSize = 0;
- LzmaDec_Construct(&_state);
-}
-
-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 };
-
-CDecoder::~CDecoder()
-{
- LzmaDec_Free(&_state, &g_Alloc);
- MyFree(_inBuf);
-}
-
-STDMETHODIMP CDecoder::SetInBufSize(UInt32 , UInt32 size) { _inBufSize = size; return S_OK; }
-STDMETHODIMP CDecoder::SetOutBufSize(UInt32 , UInt32 size) { _outBufSize = size; return S_OK; }
-
-HRESULT CDecoder::CreateInputBuffer()
-{
- if (_inBuf == 0 || _inBufSize != _inBufSizeAllocated)
- {
- MyFree(_inBuf);
- _inBuf = (Byte *)MyAlloc(_inBufSize);
- if (_inBuf == 0)
- return E_OUTOFMEMORY;
- _inBufSizeAllocated = _inBufSize;
- }
- return S_OK;
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *prop, UInt32 size)
-{
- RINOK(SResToHRESULT(LzmaDec_Allocate(&_state, prop, size, &g_Alloc)));
- _propsWereSet = true;
- return CreateInputBuffer();
-}
-
-void CDecoder::SetOutStreamSizeResume(const UInt64 *outSize)
-{
- _outSizeDefined = (outSize != NULL);
- if (_outSizeDefined)
- _outSize = *outSize;
- _outSizeProcessed = 0;
- _wrPos = 0;
- LzmaDec_Init(&_state);
-}
-
-STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize)
-{
- _inSizeProcessed = 0;
- _inPos = _inSize = 0;
- NeedMoreInput = false;
- SetOutStreamSizeResume(outSize);
- return S_OK;
-}
-
-HRESULT CDecoder::CodeSpec(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress)
-{
- if (_inBuf == 0 || !_propsWereSet)
- return S_FALSE;
-
- UInt64 startInProgress = _inSizeProcessed;
-
- SizeT next = (_state.dicBufSize - _state.dicPos < _outBufSize) ? _state.dicBufSize : (_state.dicPos + _outBufSize);
- for (;;)
- {
- if (_inPos == _inSize)
- {
- _inPos = _inSize = 0;
- RINOK(inStream->Read(_inBuf, _inBufSizeAllocated, &_inSize));
- }
-
- SizeT dicPos = _state.dicPos;
- SizeT curSize = next - dicPos;
-
- ELzmaFinishMode finishMode = LZMA_FINISH_ANY;
- if (_outSizeDefined)
- {
- const UInt64 rem = _outSize - _outSizeProcessed;
- if (rem <= curSize)
- {
- curSize = (SizeT)rem;
- if (FinishStream)
- finishMode = LZMA_FINISH_END;
- }
- }
-
- SizeT inSizeProcessed = _inSize - _inPos;
- ELzmaStatus status;
- SRes res = LzmaDec_DecodeToDic(&_state, dicPos + curSize, _inBuf + _inPos, &inSizeProcessed, finishMode, &status);
-
- _inPos += (UInt32)inSizeProcessed;
- _inSizeProcessed += inSizeProcessed;
- SizeT outSizeProcessed = _state.dicPos - dicPos;
- _outSizeProcessed += outSizeProcessed;
-
- bool finished = (inSizeProcessed == 0 && outSizeProcessed == 0);
- bool stopDecoding = (_outSizeDefined && _outSizeProcessed >= _outSize);
-
- if (res != 0 || _state.dicPos == next || finished || stopDecoding)
- {
- HRESULT res2 = WriteStream(outStream, _state.dic + _wrPos, _state.dicPos - _wrPos);
-
- _wrPos = _state.dicPos;
- if (_state.dicPos == _state.dicBufSize)
- {
- _state.dicPos = 0;
- _wrPos = 0;
- }
- next = (_state.dicBufSize - _state.dicPos < _outBufSize) ? _state.dicBufSize : (_state.dicPos + _outBufSize);
-
- if (res != 0)
- return S_FALSE;
- RINOK(res2);
- if (stopDecoding)
- {
- if (status == LZMA_STATUS_NEEDS_MORE_INPUT)
- NeedMoreInput = true;
- if (FinishStream &&
- status != LZMA_STATUS_FINISHED_WITH_MARK &&
- status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK)
- return S_FALSE;
- return S_OK;
- }
- if (finished)
- {
- if (status == LZMA_STATUS_NEEDS_MORE_INPUT)
- NeedMoreInput = true;
- return (status == LZMA_STATUS_FINISHED_WITH_MARK ? S_OK : S_FALSE);
- }
- }
- if (progress)
- {
- UInt64 inSize = _inSizeProcessed - startInProgress;
- RINOK(progress->SetRatioInfo(&inSize, &_outSizeProcessed));
- }
- }
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- if (_inBuf == 0)
- return E_INVALIDARG;
- SetOutStreamSize(outSize);
- return CodeSpec(inStream, outStream, progress);
-}
-
-#ifndef NO_READ_FROM_CODER
-
-STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) { _inStream = inStream; return S_OK; }
-STDMETHODIMP CDecoder::ReleaseInStream() { _inStream.Release(); return S_OK; }
-
-STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize)
- *processedSize = 0;
- do
- {
- if (_inPos == _inSize)
- {
- _inPos = _inSize = 0;
- RINOK(_inStream->Read(_inBuf, _inBufSizeAllocated, &_inSize));
- }
- {
- SizeT inProcessed = _inSize - _inPos;
-
- if (_outSizeDefined)
- {
- const UInt64 rem = _outSize - _outSizeProcessed;
- if (rem < size)
- size = (UInt32)rem;
- }
-
- SizeT outProcessed = size;
- ELzmaStatus status;
- SRes res = LzmaDec_DecodeToBuf(&_state, (Byte *)data, &outProcessed,
- _inBuf + _inPos, &inProcessed, LZMA_FINISH_ANY, &status);
- _inPos += (UInt32)inProcessed;
- _inSizeProcessed += inProcessed;
- _outSizeProcessed += outProcessed;
- size -= (UInt32)outProcessed;
- data = (Byte *)data + outProcessed;
- if (processedSize)
- *processedSize += (UInt32)outProcessed;
- RINOK(SResToHRESULT(res));
- if (inProcessed == 0 && outProcessed == 0)
- return S_OK;
- }
- }
- while (size != 0);
- return S_OK;
-}
-
-HRESULT CDecoder::CodeResume(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
- SetOutStreamSizeResume(outSize);
- return CodeSpec(_inStream, outStream, progress);
-}
-
-HRESULT CDecoder::ReadFromInputStream(void *data, UInt32 size, UInt32 *processedSize)
-{
- RINOK(CreateInputBuffer());
- if (processedSize)
- *processedSize = 0;
- while (size > 0)
- {
- if (_inPos == _inSize)
- {
- _inPos = _inSize = 0;
- RINOK(_inStream->Read(_inBuf, _inBufSizeAllocated, &_inSize));
- if (_inSize == 0)
- break;
- }
- {
- UInt32 curSize = _inSize - _inPos;
- if (curSize > size)
- curSize = size;
- memcpy(data, _inBuf + _inPos, curSize);
- _inPos += curSize;
- _inSizeProcessed += curSize;
- size -= curSize;
- data = (Byte *)data + curSize;
- if (processedSize)
- *processedSize += curSize;
- }
- }
- return S_OK;
-}
-
-#endif
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/LzmaDecoder.h b/src/libs/7zip/win/CPP/7zip/Compress/LzmaDecoder.h
deleted file mode 100644
index 140c48b9c..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/LzmaDecoder.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// LzmaDecoder.h
-
-#ifndef __LZMA_DECODER_H
-#define __LZMA_DECODER_H
-
-#include "../../../C/LzmaDec.h"
-
-#include "../../Common/MyCom.h"
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NLzma {
-
-class CDecoder:
- public ICompressCoder,
- public ICompressSetDecoderProperties2,
- public ICompressSetBufSize,
- #ifndef NO_READ_FROM_CODER
- public ICompressSetInStream,
- public ICompressSetOutStreamSize,
- public ISequentialInStream,
- #endif
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialInStream> _inStream;
- Byte *_inBuf;
- UInt32 _inPos;
- UInt32 _inSize;
- CLzmaDec _state;
- bool _propsWereSet;
- bool _outSizeDefined;
- UInt64 _outSize;
- UInt64 _inSizeProcessed;
- UInt64 _outSizeProcessed;
-
- UInt32 _inBufSizeAllocated;
- UInt32 _inBufSize;
- UInt32 _outBufSize;
- SizeT _wrPos;
-
- HRESULT CreateInputBuffer();
- HRESULT CodeSpec(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress);
- void SetOutStreamSizeResume(const UInt64 *outSize);
-
-public:
- MY_QUERYINTERFACE_BEGIN2(ICompressCoder)
- MY_QUERYINTERFACE_ENTRY(ICompressSetDecoderProperties2)
- MY_QUERYINTERFACE_ENTRY(ICompressSetBufSize)
- #ifndef NO_READ_FROM_CODER
- MY_QUERYINTERFACE_ENTRY(ICompressSetInStream)
- MY_QUERYINTERFACE_ENTRY(ICompressSetOutStreamSize)
- MY_QUERYINTERFACE_ENTRY(ISequentialInStream)
- #endif
- MY_QUERYINTERFACE_END
- MY_ADDREF_RELEASE
-
- 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);
- STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size);
- STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size);
-
- #ifndef NO_READ_FROM_CODER
-
- STDMETHOD(SetInStream)(ISequentialInStream *inStream);
- STDMETHOD(ReleaseInStream)();
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-
- HRESULT CodeResume(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress);
- HRESULT ReadFromInputStream(void *data, UInt32 size, UInt32 *processedSize);
- UInt64 GetInputProcessedSize() const { return _inSizeProcessed; }
-
- #endif
-
- bool FinishStream; // set it before decoding, if you need to decode full LZMA stream
-
- bool NeedMoreInput; // it's set by decoder, if it needs more input data to decode stream
-
- CDecoder();
- virtual ~CDecoder();
-
- UInt64 GetOutputProcessedSize() const { return _outSizeProcessed; }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/LzmaEncoder.cpp b/src/libs/7zip/win/CPP/7zip/Compress/LzmaEncoder.cpp
deleted file mode 100644
index 484d04523..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/LzmaEncoder.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-// LzmaEncoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/CWrappers.h"
-#include "../Common/StreamUtils.h"
-
-#include "LzmaEncoder.h"
-
-namespace NCompress {
-namespace NLzma {
-
-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 void *SzAlloc(void *, size_t size) { return MyAlloc(size); }
-static void SzFree(void *, void *address) { MyFree(address); }
-static ISzAlloc g_Alloc = { SzAlloc, SzFree };
-
-CEncoder::CEncoder()
-{
- _encoder = 0;
- _encoder = LzmaEnc_Create(&g_Alloc);
- if (_encoder == 0)
- throw 1;
-}
-
-CEncoder::~CEncoder()
-{
- if (_encoder != 0)
- LzmaEnc_Destroy(_encoder, &g_Alloc, &g_BigAlloc);
-}
-
-inline wchar_t GetUpperChar(wchar_t c)
-{
- if (c >= 'a' && c <= 'z')
- c -= 0x20;
- return c;
-}
-
-static int ParseMatchFinder(const wchar_t *s, int *btMode, int *numHashBytes)
-{
- wchar_t c = GetUpperChar(*s++);
- if (c == L'H')
- {
- if (GetUpperChar(*s++) != L'C')
- return 0;
- int numHashBytesLoc = (int)(*s++ - L'0');
- if (numHashBytesLoc < 4 || numHashBytesLoc > 4)
- return 0;
- if (*s++ != 0)
- return 0;
- *btMode = 0;
- *numHashBytes = numHashBytesLoc;
- return 1;
- }
- if (c != L'B')
- return 0;
-
- if (GetUpperChar(*s++) != L'T')
- return 0;
- int numHashBytesLoc = (int)(*s++ - L'0');
- if (numHashBytesLoc < 2 || numHashBytesLoc > 4)
- return 0;
- c = GetUpperChar(*s++);
- if (c != L'\0')
- return 0;
- *btMode = 1;
- *numHashBytes = numHashBytesLoc;
- return 1;
-}
-
-#define SET_PROP_32(_id_, _dest_) case NCoderPropID::_id_: ep._dest_ = v; break;
-
-HRESULT SetLzmaProp(PROPID propID, const PROPVARIANT &prop, CLzmaEncProps &ep)
-{
- if (propID == NCoderPropID::kMatchFinder)
- {
- if (prop.vt != VT_BSTR)
- return E_INVALIDARG;
- return ParseMatchFinder(prop.bstrVal, &ep.btMode, &ep.numHashBytes) ? S_OK : E_INVALIDARG;
- }
- if (propID > NCoderPropID::kReduceSize)
- return S_OK;
- if (propID == NCoderPropID::kReduceSize)
- {
- if (prop.vt == VT_UI8)
- ep.reduceSize = prop.uhVal.QuadPart;
- return S_OK;
- }
- if (prop.vt != VT_UI4)
- return E_INVALIDARG;
- UInt32 v = prop.ulVal;
- switch (propID)
- {
- case NCoderPropID::kDefaultProp: if (v > 31) return E_INVALIDARG; ep.dictSize = (UInt32)1 << (unsigned)v; break;
- SET_PROP_32(kLevel, level)
- SET_PROP_32(kNumFastBytes, fb)
- SET_PROP_32(kMatchFinderCycles, mc)
- SET_PROP_32(kAlgorithm, algo)
- SET_PROP_32(kDictionarySize, dictSize)
- SET_PROP_32(kPosStateBits, pb)
- SET_PROP_32(kLitPosBits, lp)
- SET_PROP_32(kLitContextBits, lc)
- SET_PROP_32(kNumThreads, numThreads)
- default: return E_INVALIDARG;
- }
- return S_OK;
-}
-
-STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs,
- const PROPVARIANT *coderProps, UInt32 numProps)
-{
- CLzmaEncProps props;
- LzmaEncProps_Init(&props);
-
- for (UInt32 i = 0; i < numProps; i++)
- {
- const PROPVARIANT &prop = coderProps[i];
- PROPID propID = propIDs[i];
- switch (propID)
- {
- case NCoderPropID::kEndMarker:
- if (prop.vt != VT_BOOL) return E_INVALIDARG; props.writeEndMark = (prop.boolVal != VARIANT_FALSE); break;
- default:
- RINOK(SetLzmaProp(propID, prop, props));
- }
- }
- return SResToHRESULT(LzmaEnc_SetProps(_encoder, &props));
-}
-
-STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
-{
- Byte props[LZMA_PROPS_SIZE];
- size_t size = LZMA_PROPS_SIZE;
- RINOK(LzmaEnc_WriteProperties(_encoder, props, &size));
- return WriteStream(outStream, props, size);
-}
-
-STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
-{
- CSeqInStreamWrap inWrap(inStream);
- CSeqOutStreamWrap outWrap(outStream);
- CCompressProgressWrap progressWrap(progress);
-
- SRes res = LzmaEnc_Encode(_encoder, &outWrap.p, &inWrap.p, progress ? &progressWrap.p : NULL, &g_Alloc, &g_BigAlloc);
- _inputProcessed = inWrap.Processed;
- if (res == SZ_ERROR_READ && inWrap.Res != S_OK)
- return inWrap.Res;
- if (res == SZ_ERROR_WRITE && outWrap.Res != S_OK)
- return outWrap.Res;
- if (res == SZ_ERROR_PROGRESS && progressWrap.Res != S_OK)
- return progressWrap.Res;
- return SResToHRESULT(res);
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/LzmaEncoder.h b/src/libs/7zip/win/CPP/7zip/Compress/LzmaEncoder.h
deleted file mode 100644
index 7e15a132d..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/LzmaEncoder.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// LzmaEncoder.h
-
-#ifndef __LZMA_ENCODER_H
-#define __LZMA_ENCODER_H
-
-#include "../../../C/LzmaEnc.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-namespace NCompress {
-namespace NLzma {
-
-class CEncoder:
- public ICompressCoder,
- public ICompressSetCoderProperties,
- public ICompressWriteCoderProperties,
- public CMyUnknownImp
-{
- CLzmaEncHandle _encoder;
- UInt64 _inputProcessed;
-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();
- virtual ~CEncoder();
- UInt64 GetInputProcessedSize() const { return _inputProcessed; }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/LzmaRegister.cpp b/src/libs/7zip/win/CPP/7zip/Compress/LzmaRegister.cpp
deleted file mode 100644
index 96ed0baed..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/LzmaRegister.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// LzmaRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "LzmaDecoder.h"
-
-static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NLzma::CDecoder); }
-#ifndef EXTRACT_ONLY
-#include "LzmaEncoder.h"
-static void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NLzma::CEncoder); }
-#else
-#define CreateCodecOut 0
-#endif
-
-static CCodecInfo g_CodecInfo =
- { CreateCodec, CreateCodecOut, 0x030101, L"LZMA", 1, false };
-
-REGISTER_CODEC(LZMA)
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/RangeCoder.h b/src/libs/7zip/win/CPP/7zip/Compress/RangeCoder.h
deleted file mode 100644
index 1555bd705..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/RangeCoder.h
+++ /dev/null
@@ -1,201 +0,0 @@
-// Compress/RangeCoder.h
-// 2013-01-10 : Igor Pavlov : Public domain
-
-#ifndef __COMPRESS_RANGE_CODER_H
-#define __COMPRESS_RANGE_CODER_H
-
-#include "../Common/InBuffer.h"
-#include "../Common/OutBuffer.h"
-
-namespace NCompress {
-namespace NRangeCoder {
-
-const unsigned kNumTopBits = 24;
-const UInt32 kTopValue = (1 << kNumTopBits);
-
-class CEncoder
-{
- UInt32 _cacheSize;
- Byte _cache;
-public:
- UInt64 Low;
- UInt32 Range;
- COutBuffer Stream;
- bool Create(UInt32 bufSize) { return Stream.Create(bufSize); }
-
- void SetStream(ISequentialOutStream *stream) { Stream.SetStream(stream); }
- void Init()
- {
- Stream.Init();
- Low = 0;
- Range = 0xFFFFFFFF;
- _cacheSize = 1;
- _cache = 0;
- }
-
- void FlushData()
- {
- // Low += 1;
- for (int i = 0; i < 5; i++)
- ShiftLow();
- }
-
- HRESULT FlushStream() { return Stream.Flush(); }
-
- void Encode(UInt32 start, UInt32 size, UInt32 total)
- {
- Low += start * (Range /= total);
- Range *= size;
- while (Range < kTopValue)
- {
- Range <<= 8;
- ShiftLow();
- }
- }
-
- void ShiftLow()
- {
- if ((UInt32)Low < (UInt32)0xFF000000 || (unsigned)(Low >> 32) != 0)
- {
- Byte temp = _cache;
- do
- {
- Stream.WriteByte((Byte)(temp + (Byte)(Low >> 32)));
- temp = 0xFF;
- }
- while (--_cacheSize != 0);
- _cache = (Byte)((UInt32)Low >> 24);
- }
- _cacheSize++;
- Low = (UInt32)Low << 8;
- }
-
- void EncodeDirectBits(UInt32 value, int numBits)
- {
- for (numBits--; numBits >= 0; numBits--)
- {
- Range >>= 1;
- Low += Range & (0 - ((value >> numBits) & 1));
- if (Range < kTopValue)
- {
- Range <<= 8;
- ShiftLow();
- }
- }
- }
-
- void EncodeBit(UInt32 size0, UInt32 numTotalBits, UInt32 symbol)
- {
- UInt32 newBound = (Range >> numTotalBits) * size0;
- if (symbol == 0)
- Range = newBound;
- else
- {
- Low += newBound;
- Range -= newBound;
- }
- while (Range < kTopValue)
- {
- Range <<= 8;
- ShiftLow();
- }
- }
-
- UInt64 GetProcessedSize() { return Stream.GetProcessedSize() + _cacheSize + 4; }
-};
-
-class CDecoder
-{
-public:
- CInBuffer Stream;
- UInt32 Range;
- UInt32 Code;
- bool Create(UInt32 bufSize) { return Stream.Create(bufSize); }
-
- void Normalize()
- {
- while (Range < kTopValue)
- {
- Code = (Code << 8) | Stream.ReadByte();
- Range <<= 8;
- }
- }
-
- void SetStream(ISequentialInStream *stream) { Stream.SetStream(stream); }
- void Init()
- {
- Stream.Init();
- Code = 0;
- Range = 0xFFFFFFFF;
- for (int i = 0; i < 5; i++)
- Code = (Code << 8) | Stream.ReadByte();
- }
-
- UInt32 GetThreshold(UInt32 total)
- {
- return (Code) / (Range /= total);
- }
-
- void Decode(UInt32 start, UInt32 size)
- {
- Code -= start * Range;
- Range *= size;
- Normalize();
- }
-
- UInt32 DecodeDirectBits(int numTotalBits)
- {
- UInt32 range = Range;
- UInt32 code = Code;
- UInt32 result = 0;
- for (int i = numTotalBits; i != 0; i--)
- {
- range >>= 1;
- /*
- result <<= 1;
- if (code >= range)
- {
- code -= range;
- result |= 1;
- }
- */
- UInt32 t = (code - range) >> 31;
- code -= range & (t - 1);
- result = (result << 1) | (1 - t);
-
- if (range < kTopValue)
- {
- code = (code << 8) | Stream.ReadByte();
- range <<= 8;
- }
- }
- Range = range;
- Code = code;
- return result;
- }
-
- UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits)
- {
- UInt32 newBound = (Range >> numTotalBits) * size0;
- UInt32 symbol;
- if (Code < newBound)
- {
- symbol = 0;
- Range = newBound;
- }
- else
- {
- symbol = 1;
- Code -= newBound;
- Range -= newBound;
- }
- Normalize();
- return symbol;
- }
-
- UInt64 GetProcessedSize() { return Stream.GetProcessedSize(); }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/RangeCoderBit.h b/src/libs/7zip/win/CPP/7zip/Compress/RangeCoderBit.h
deleted file mode 100644
index 0eddd5586..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/RangeCoderBit.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// Compress/RangeCoderBit.h
-// 2013-01-10 : Igor Pavlov : Public domain
-
-#ifndef __COMPRESS_RANGE_CODER_BIT_H
-#define __COMPRESS_RANGE_CODER_BIT_H
-
-#include "RangeCoder.h"
-
-namespace NCompress {
-namespace NRangeCoder {
-
-const unsigned kNumBitModelTotalBits = 11;
-const UInt32 kBitModelTotal = (1 << kNumBitModelTotalBits);
-
-const unsigned kNumMoveReducingBits = 4;
-
-const unsigned kNumBitPriceShiftBits = 4;
-const UInt32 kBitPrice = 1 << kNumBitPriceShiftBits;
-
-extern UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits];
-
-template <unsigned numMoveBits>
-class CBitModel
-{
-public:
- UInt32 Prob;
- void UpdateModel(UInt32 symbol)
- {
- /*
- Prob -= (Prob + ((symbol - 1) & ((1 << numMoveBits) - 1))) >> numMoveBits;
- Prob += (1 - symbol) << (kNumBitModelTotalBits - numMoveBits);
- */
- if (symbol == 0)
- Prob += (kBitModelTotal - Prob) >> numMoveBits;
- else
- Prob -= (Prob) >> numMoveBits;
- }
-public:
- void Init() { Prob = kBitModelTotal / 2; }
-};
-
-template <unsigned numMoveBits>
-class CBitEncoder: public CBitModel<numMoveBits>
-{
-public:
- void Encode(CEncoder *encoder, UInt32 symbol)
- {
- /*
- encoder->EncodeBit(this->Prob, kNumBitModelTotalBits, symbol);
- this->UpdateModel(symbol);
- */
- UInt32 newBound = (encoder->Range >> kNumBitModelTotalBits) * this->Prob;
- if (symbol == 0)
- {
- encoder->Range = newBound;
- this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits;
- }
- else
- {
- encoder->Low += newBound;
- encoder->Range -= newBound;
- this->Prob -= (this->Prob) >> numMoveBits;
- }
- if (encoder->Range < kTopValue)
- {
- encoder->Range <<= 8;
- encoder->ShiftLow();
- }
- }
- UInt32 GetPrice(UInt32 symbol) const
- {
- return ProbPrices[(this->Prob ^ ((-(int)(Int32)symbol)) & (kBitModelTotal - 1)) >> kNumMoveReducingBits];
- }
- UInt32 GetPrice0() const { return ProbPrices[this->Prob >> kNumMoveReducingBits]; }
- UInt32 GetPrice1() const { return ProbPrices[(this->Prob ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]; }
-};
-
-
-template <unsigned numMoveBits>
-class CBitDecoder: public CBitModel<numMoveBits>
-{
-public:
- UInt32 Decode(CDecoder *decoder)
- {
- UInt32 newBound = (decoder->Range >> kNumBitModelTotalBits) * this->Prob;
- if (decoder->Code < newBound)
- {
- decoder->Range = newBound;
- this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits;
- if (decoder->Range < kTopValue)
- {
- decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte();
- decoder->Range <<= 8;
- }
- return 0;
- }
- else
- {
- decoder->Range -= newBound;
- decoder->Code -= newBound;
- this->Prob -= (this->Prob) >> numMoveBits;
- if (decoder->Range < kTopValue)
- {
- decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte();
- decoder->Range <<= 8;
- }
- return 1;
- }
- }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Compress/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Compress/StdAfx.h
deleted file mode 100644
index 1cbd7feae..000000000
--- a/src/libs/7zip/win/CPP/7zip/Compress/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../Common/Common.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/Guid.txt b/src/libs/7zip/win/CPP/7zip/Guid.txt
deleted file mode 100644
index c1e7446be..000000000
--- a/src/libs/7zip/win/CPP/7zip/Guid.txt
+++ /dev/null
@@ -1,192 +0,0 @@
-{23170F69-40C1-278A-0000-00yy00xx0000}
-
-00 IProgress.h
-
- 05 IProgress
-
-01 IFolderArchive.h
-
- // 05 IArchiveFolder // old
- // 06 IInFolderArchive // old
- 07 IFileExtractCallback.h::IFolderArchiveExtractCallback
- // 0A IOutFolderArchive
- 0B IFolderArchiveUpdateCallback
- 0C Agent.h::IArchiveFolderInternal
- 0D IArchiveFolder
- 0E IInFolderArchive
- 0F IOutFolderArchive
- 20 IFileExtractCallback.h::IGetProp
- 30 IFileExtractCallback.h::IFolderExtractToStreamCallback
-
-03 IStream.h
-
- 01 ISequentialInStream
- 02 ISequentialOutStream
- 03 IInStream
- 04 IOutStream
- 06 IStreamGetSize
- 07 IOutStreamFlush
- 08 IStreamGetProps
- 09 IStreamGetProps2
-
-
-04 ICoder.h
-
- 04 ICompressProgressInfo
- 05 ICompressCoder
- 18 ICompressCoder2
- 20 ICompressSetCoderProperties
- 21 ICompressSetDecoderProperties //
- 22 ICompressSetDecoderProperties2
- 23 ICompressWriteCoderProperties
- 24 ICompressGetInStreamProcessedSize
- 25 ICompressSetCoderMt
- 30 ICompressGetSubStreamSize
- 31 ICompressSetInStream
- 32 ICompressSetOutStream
- 33 ICompressSetInStreamSize
- 34 ICompressSetOutStreamSize
- 35 ICompressSetBufSize
- 40 ICompressFilter
- 60 ICompressCodecsInfo
- 61 ISetCompressCodecsInfo
- 80 ICryptoProperties
- 88 ICryptoResetSalt
- 8C ICryptoResetInitVector
- 90 ICryptoSetPassword
- A0 ICryptoSetCRC
- C0 IHasher
- C1 IHashers
-
-
-05 IPassword.h
-
- 10 ICryptoGetTextPassword
- 11 ICryptoGetTextPassword2
-
-
-06 IArchive.h
-
- 03 ISetProperties
- 04 IArchiveKeepModeForNextOpen
- 05 IArchiveAllowTail
-
- 10 IArchiveOpenCallback
- 20 IArchiveExtractCallback
- 30 IArchiveOpenVolumeCallback
- 40 IInArchiveGetStream
- 50 IArchiveOpenSetSubArchiveName
- 60 IInArchive
- 61 IArchiveOpenSeq
- 70 IArchiveGetRawProps
- 71 IArchiveGetRootProps
-
- 80 IArchiveUpdateCallback
- 82 IArchiveUpdateCallback2
- A0 IOutArchive
-
-
-
-08 IFolder.h
-
- 00 IFolderFolder
- 01 IEnumProperties
- 02 IFolderGetTypeID
- 03 IFolderGetPath
- 04 IFolderWasChanged
- 05 // IFolderReload
- 06 // IFolderOperations old
- 07 IFolderGetSystemIconIndex
- 08 IFolderGetItemFullSize
- 09 IFolderClone
- 0A IFolderSetFlatMode
- 0B IFolderOperationsExtractCallback
- 0C //
- 0D //
- 0E IFolderProperties
- 0F
- 10 IFolderArcProps
- 11 IGetFolderArcProps
- 12 // IFolderOperations
- 13 IFolderOperations
- 14 IFolderCalcItemFullSize
- 15 IFolderCompare
- 16 IFolderGetItemName
-
-
-09 IFolder.h :: FOLDER_MANAGER_INTERFACE
-
- 00 - 04 // old IFolderManager
- 05 IFolderManager
-
-
-// 0A PluginInterface.h
- 00 IInitContextMenu
- 01 IPluginOptionsCallback
- 02 IPluginOptions
-
-
-Handler GUIDs:
-
-{23170F69-40C1-278A-1000-000110xx0000}
-
- 01 Zip
- 02 BZip2
- 03 Rar
- 04 Arj
- 05 Z
- 06 Lzh
- 07 7z
- 08 Cab
- 09 Nsis
- 0A lzma
- 0B lzma86
- 0C xz
- 0D ppmd
-
- CD IHex
- CE Hxs
- CF TE
- D0 UEFIc
- D1 UEFIs
- D2 SquashFS
- D3 CramFS
- D4 APM
- D5 Mslz
- D6 Flv
- D7 Swf
- D8 Swfc
- D9 Ntfs
- DA Fat
- DB Mbr
- DC Vhd
- DD Pe
- DE Elf
- DF Mach-O
- E0 Udf
- E1 Xar
- E2 Mub
- E3 Hfs
- E4 Dmg
- E5 Compound
- E6 Wim
- E7 Iso
- E8
- E9 Chm
- EA Split
- EB Rpm
- EC Deb
- ED Cpio
- EE Tar
- EF GZip
-
-{23170F69-40C1-278A-1000-000100030000} CAgentArchiveHandle
-{23170F69-40C1-278A-1000-000100020000} ContextMenu.h::CZipContextMenu
-
-{23170F69-40C1-278B- old codecs clsids
-
-{23170F69-40C1-278D-1000-000100020000} OptionsDialog.h::CLSID_CSevenZipOptions
-
-{23170F69-40C1-2790-id} Codec Decoders
-{23170F69-40C1-2791-id} Codec Encoders
-{23170F69-40C1-2792-id} Hashers
diff --git a/src/libs/7zip/win/CPP/7zip/ICoder.h b/src/libs/7zip/win/CPP/7zip/ICoder.h
deleted file mode 100644
index 74ee0e453..000000000
--- a/src/libs/7zip/win/CPP/7zip/ICoder.h
+++ /dev/null
@@ -1,211 +0,0 @@
-// ICoder.h
-
-#ifndef __ICODER_H
-#define __ICODER_H
-
-#include "IStream.h"
-
-#define CODER_INTERFACE(i, x) DECL_INTERFACE(i, 4, x)
-
-CODER_INTERFACE(ICompressProgressInfo, 0x04)
-{
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) PURE;
-};
-
-CODER_INTERFACE(ICompressCoder, 0x05)
-{
- STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
- const UInt64 *inSize, const UInt64 *outSize,
- ICompressProgressInfo *progress) PURE;
-};
-
-CODER_INTERFACE(ICompressCoder2, 0x18)
-{
- STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
- ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
- ICompressProgressInfo *progress) PURE;
-};
-
-namespace NCoderPropID
-{
- enum EEnum
- {
- kDefaultProp = 0,
- kDictionarySize,
- kUsedMemorySize,
- kOrder,
- kBlockSize,
- kPosStateBits,
- kLitContextBits,
- kLitPosBits,
- kNumFastBytes,
- kMatchFinder,
- kMatchFinderCycles,
- kNumPasses,
- kAlgorithm,
- kNumThreads,
- kEndMarker,
- kLevel,
- kReduceSize // estimated size of data that will be compressed. Encoder can use this value to reduce dictionary size.
- };
-}
-
-CODER_INTERFACE(ICompressSetCoderProperties, 0x20)
-{
- STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps) PURE;
-};
-
-/*
-CODER_INTERFACE(ICompressSetCoderProperties, 0x21)
-{
- STDMETHOD(SetDecoderProperties)(ISequentialInStream *inStream) PURE;
-};
-*/
-
-CODER_INTERFACE(ICompressSetDecoderProperties2, 0x22)
-{
- STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size) PURE;
-};
-
-CODER_INTERFACE(ICompressWriteCoderProperties, 0x23)
-{
- STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream) PURE;
-};
-
-CODER_INTERFACE(ICompressGetInStreamProcessedSize, 0x24)
-{
- STDMETHOD(GetInStreamProcessedSize)(UInt64 *value) PURE;
-};
-
-CODER_INTERFACE(ICompressSetCoderMt, 0x25)
-{
- STDMETHOD(SetNumberOfThreads)(UInt32 numThreads) PURE;
-};
-
-CODER_INTERFACE(ICompressGetSubStreamSize, 0x30)
-{
- STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value) PURE;
-};
-
-CODER_INTERFACE(ICompressSetInStream, 0x31)
-{
- STDMETHOD(SetInStream)(ISequentialInStream *inStream) PURE;
- STDMETHOD(ReleaseInStream)() PURE;
-};
-
-CODER_INTERFACE(ICompressSetOutStream, 0x32)
-{
- STDMETHOD(SetOutStream)(ISequentialOutStream *outStream) PURE;
- STDMETHOD(ReleaseOutStream)() PURE;
-};
-
-CODER_INTERFACE(ICompressSetInStreamSize, 0x33)
-{
- STDMETHOD(SetInStreamSize)(const UInt64 *inSize) PURE;
-};
-
-CODER_INTERFACE(ICompressSetOutStreamSize, 0x34)
-{
- STDMETHOD(SetOutStreamSize)(const UInt64 *outSize) PURE;
-};
-
-CODER_INTERFACE(ICompressSetBufSize, 0x35)
-{
- STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size) PURE;
- STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size) PURE;
-};
-
-CODER_INTERFACE(ICompressFilter, 0x40)
-{
- STDMETHOD(Init)() PURE;
- STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) PURE;
- // Filter converts as most as possible bytes
- // Filter return outSize (UInt32)
- // if (outSize <= size): Filter have converted outSize bytes
- // if (outSize > size): Filter have not converted anything.
- // and it needs at least outSize bytes to convert one block
- // (it's for crypto block algorithms).
-};
-
-CODER_INTERFACE(ICompressCodecsInfo, 0x60)
-{
- STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods) PURE;
- STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE;
- STDMETHOD(CreateDecoder)(UInt32 index, const GUID *iid, void **coder) PURE;
- STDMETHOD(CreateEncoder)(UInt32 index, const GUID *iid, void **coder) PURE;
-};
-CODER_INTERFACE(ISetCompressCodecsInfo, 0x61)
-{
- STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo) PURE;
-};
-
-CODER_INTERFACE(ICryptoProperties, 0x80)
-{
- STDMETHOD(SetKey)(const Byte *data, UInt32 size) PURE;
- STDMETHOD(SetInitVector)(const Byte *data, UInt32 size) PURE;
-};
-
-/*
-CODER_INTERFACE(ICryptoResetSalt, 0x88)
-{
- STDMETHOD(ResetSalt)() PURE;
-};
-*/
-
-CODER_INTERFACE(ICryptoResetInitVector, 0x8C)
-{
- STDMETHOD(ResetInitVector)() PURE;
-};
-
-CODER_INTERFACE(ICryptoSetPassword, 0x90)
-{
- STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size) PURE;
-};
-
-CODER_INTERFACE(ICryptoSetCRC, 0xA0)
-{
- STDMETHOD(CryptoSetCRC)(UInt32 crc) PURE;
-};
-
-//////////////////////
-// It's for DLL file
-namespace NMethodPropID
-{
- enum EEnum
- {
- kID,
- kName,
- kDecoder,
- kEncoder,
- kInStreams,
- kOutStreams,
- kDescription,
- kDecoderIsAssigned,
- kEncoderIsAssigned,
- kDigestSize
- };
-}
-
-CODER_INTERFACE(IHasher, 0xC0)
-{
- STDMETHOD_(void, Init)() PURE;
- STDMETHOD_(void, Update)(const void *data, UInt32 size) PURE;
- STDMETHOD_(void, Final)(Byte *digest) PURE;
- STDMETHOD_(UInt32, GetDigestSize)() PURE;
-};
-
-CODER_INTERFACE(IHashers, 0xC1)
-{
- STDMETHOD_(UInt32, GetNumHashers)() PURE;
- STDMETHOD(GetHasherProp)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE;
- STDMETHOD(CreateHasher)(UInt32 index, IHasher **hasher) PURE;
-};
-
-extern "C"
-{
- typedef HRESULT (WINAPI *Func_GetNumberOfMethods)(UInt32 *numMethods);
- typedef HRESULT (WINAPI *Func_GetMethodProperty)(UInt32 index, PROPID propID, PROPVARIANT *value);
- typedef HRESULT (WINAPI *Func_GetHashers)(IHashers **hashers);
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/IDecl.h b/src/libs/7zip/win/CPP/7zip/IDecl.h
deleted file mode 100644
index 8316eb3ac..000000000
--- a/src/libs/7zip/win/CPP/7zip/IDecl.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// IDecl.h
-
-#ifndef __IDECL_H
-#define __IDECL_H
-
-#include "../Common/MyUnknown.h"
-
-#define DECL_INTERFACE_SUB(i, base, groupId, subId) \
-DEFINE_GUID(IID_ ## i, \
-0x23170F69, 0x40C1, 0x278A, 0, 0, 0, (groupId), 0, (subId), 0, 0); \
-struct i: public base
-
-#define DECL_INTERFACE(i, groupId, subId) DECL_INTERFACE_SUB(i, IUnknown, groupId, subId)
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/IPassword.h b/src/libs/7zip/win/CPP/7zip/IPassword.h
deleted file mode 100644
index 7ea45537e..000000000
--- a/src/libs/7zip/win/CPP/7zip/IPassword.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// IPassword.h
-
-#ifndef __IPASSWORD_H
-#define __IPASSWORD_H
-
-#include "../Common/MyTypes.h"
-#include "../Common/MyUnknown.h"
-
-#include "IDecl.h"
-
-#define PASSWORD_INTERFACE(i, x) DECL_INTERFACE(i, 5, x)
-
-PASSWORD_INTERFACE(ICryptoGetTextPassword, 0x10)
-{
- STDMETHOD(CryptoGetTextPassword)(BSTR *password) PURE;
-};
-
-PASSWORD_INTERFACE(ICryptoGetTextPassword2, 0x11)
-{
- STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password) PURE;
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/IProgress.h b/src/libs/7zip/win/CPP/7zip/IProgress.h
deleted file mode 100644
index a270e693b..000000000
--- a/src/libs/7zip/win/CPP/7zip/IProgress.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Interface/IProgress.h
-
-#ifndef __IPROGRESS_H
-#define __IPROGRESS_H
-
-#include "../Common/MyTypes.h"
-#include "../Common/MyUnknown.h"
-
-#include "IDecl.h"
-
-#define INTERFACE_IProgress(x) \
- STDMETHOD(SetTotal)(UInt64 total) x; \
- STDMETHOD(SetCompleted)(const UInt64 *completeValue) x; \
-
-DECL_INTERFACE(IProgress, 0, 5)
-{
- INTERFACE_IProgress(PURE)
-};
-
-/*
-// {23170F69-40C1-278A-0000-000000050002}
-DEFINE_GUID(IID_IProgress2,
-0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02);
-MIDL_INTERFACE("23170F69-40C1-278A-0000-000000050002")
-IProgress2: public IUnknown
-{
-public:
- STDMETHOD(SetTotal)(const UInt64 *total) PURE;
- STDMETHOD(SetCompleted)(const UInt64 *completeValue) PURE;
-};
-*/
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/IStream.h b/src/libs/7zip/win/CPP/7zip/IStream.h
deleted file mode 100644
index 48643e7b3..000000000
--- a/src/libs/7zip/win/CPP/7zip/IStream.h
+++ /dev/null
@@ -1,127 +0,0 @@
-// IStream.h
-
-#ifndef __ISTREAM_H
-#define __ISTREAM_H
-
-#include "../Common/MyTypes.h"
-#include "../Common/MyUnknown.h"
-
-#include "IDecl.h"
-
-#define STREAM_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 3, x)
-#define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x)
-
-STREAM_INTERFACE(ISequentialInStream, 0x01)
-{
- STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE;
-
- /*
- The requirement for caller: (processedSize != NULL).
- The callee can allow (processedSize == NULL) for compatibility reasons.
-
- if (size == 0), this function returns S_OK and (*processedSize) is set to 0.
-
- if (size != 0)
- {
- Partial read is allowed: (*processedSize <= avail_size && *processedSize <= size),
- where (avail_size) is the size of remaining bytes in stream.
- If (avail_size != 0), this function must read at least 1 byte: (*processedSize > 0).
- You must call Read() in loop, if you need to read exact amount of data.
- }
-
- If seek pointer before Read() call was changed to position past the end of stream:
- if (seek_pointer >= stream_size), this function returns S_OK and (*processedSize) is set to 0.
-
- ERROR CASES:
- If the function returns error code, then (*processedSize) is size of
- data written to (data) buffer (it can be data before error or data with errors).
- The recommended way for callee to work with reading errors:
- 1) write part of data before error to (data) buffer and return S_OK.
- 2) return error code for further calls of Read().
- */
-};
-
-STREAM_INTERFACE(ISequentialOutStream, 0x02)
-{
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE;
-
- /*
- The requirement for caller: (processedSize != NULL).
- The callee can allow (processedSize == NULL) for compatibility reasons.
-
- if (size != 0)
- {
- Partial write is allowed: (*processedSize <= size),
- but this function must write at least 1 byte: (*processedSize > 0).
- You must call Write() in loop, if you need to write exact amount of data.
- }
-
- ERROR CASES:
- If the function returns error code, then (*processedSize) is size of
- data written from (data) buffer.
- */
-};
-
-#ifdef __HRESULT_FROM_WIN32
-#define HRESULT_WIN32_ERROR_NEGATIVE_SEEK __HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK)
-#else
-#define HRESULT_WIN32_ERROR_NEGATIVE_SEEK HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK)
-#endif
-
-/* Seek() Function
- If you seek before the beginning of the stream, Seek() function returns error code:
- Recommended error code is __HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK).
- or STG_E_INVALIDFUNCTION
-
- It is allowed to seek past the end of the stream.
-
-
- if Seek() returns error, then the value of *newPosition is undefined.
-*/
-
-STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03)
-{
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;
-};
-
-STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04)
-{
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;
- STDMETHOD(SetSize)(UInt64 newSize) PURE;
-};
-
-STREAM_INTERFACE(IStreamGetSize, 0x06)
-{
- STDMETHOD(GetSize)(UInt64 *size) PURE;
-};
-
-STREAM_INTERFACE(IOutStreamFlush, 0x07)
-{
- STDMETHOD(Flush)() PURE;
-};
-
-
-STREAM_INTERFACE(IStreamGetProps, 0x08)
-{
- STDMETHOD(GetProps)(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib) PURE;
-};
-
-struct CStreamFileProps
-{
- UInt64 Size;
- UInt64 VolID;
- UInt64 FileID_Low;
- UInt64 FileID_High;
- UInt32 NumLinks;
- UInt32 Attrib;
- FILETIME CTime;
- FILETIME ATime;
- FILETIME MTime;
-};
-
-STREAM_INTERFACE(IStreamGetProps2, 0x09)
-{
- STDMETHOD(GetProps2)(CStreamFileProps *props) PURE;
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/PropID.h b/src/libs/7zip/win/CPP/7zip/PropID.h
deleted file mode 100644
index 82a7462bb..000000000
--- a/src/libs/7zip/win/CPP/7zip/PropID.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// PropID.h
-
-#ifndef __7ZIP_PROP_ID_H
-#define __7ZIP_PROP_ID_H
-
-#include "../Common/MyTypes.h"
-
-enum
-{
- kpidNoProperty = 0,
- kpidMainSubfile,
- kpidHandlerItemIndex,
- kpidPath,
- kpidName,
- kpidExtension,
- kpidIsDir,
- kpidSize,
- kpidPackSize,
- kpidAttrib,
- kpidCTime,
- kpidATime,
- kpidMTime,
- kpidSolid,
- kpidCommented,
- kpidEncrypted,
- kpidSplitBefore,
- kpidSplitAfter,
- kpidDictionarySize,
- kpidCRC,
- kpidType,
- kpidIsAnti,
- kpidMethod,
- kpidHostOS,
- kpidFileSystem,
- kpidUser,
- kpidGroup,
- kpidBlock,
- kpidComment,
- kpidPosition,
- kpidPrefix,
- kpidNumSubDirs,
- kpidNumSubFiles,
- kpidUnpackVer,
- kpidVolume,
- kpidIsVolume,
- kpidOffset,
- kpidLinks,
- kpidNumBlocks,
- kpidNumVolumes,
- kpidTimeType,
- kpidBit64,
- kpidBigEndian,
- kpidCpu,
- kpidPhySize,
- kpidHeadersSize,
- kpidChecksum,
- kpidCharacts,
- kpidVa,
- kpidId,
- kpidShortName,
- kpidCreatorApp,
- kpidSectorSize,
- kpidPosixAttrib,
- kpidSymLink,
- kpidError,
- kpidTotalSize,
- kpidFreeSpace,
- kpidClusterSize,
- kpidVolumeName,
- kpidLocalName,
- kpidProvider,
- kpidNtSecure,
- kpidIsAltStream,
- kpidIsAux,
- kpidIsDeleted,
- kpidIsTree,
- kpidSha1,
- kpidSha256,
- kpidErrorType,
- kpidNumErrors,
- kpidErrorFlags,
- kpidWarningFlags,
- kpidWarning,
- kpidNumStreams,
- kpidNumAltStreams,
- kpidAltStreamsSize,
- kpidVirtualSize,
- kpidUnpackSize,
- kpidTotalPhySize,
- kpidVolumeIndex,
- kpidSubType,
- kpidShortComment,
- kpidCodePage,
- kpidIsNotArcType,
- kpidPhySizeCantBeDetected,
- kpidZerosTailIsAllowed,
- kpidTailSize,
- kpidEmbeddedStubSize,
- kpidNtReparse,
- kpidHardLink,
- kpidINode,
- kpidStreamId,
-
- kpid_NUM_DEFINED,
-
- kpidUserDefined = 0x10000
-};
-
-extern Byte k7z_PROPID_To_VARTYPE[kpid_NUM_DEFINED]; // VARTYPE
-
-const UInt32 kpv_ErrorFlags_IsNotArc = 1 << 0;
-const UInt32 kpv_ErrorFlags_HeadersError = 1 << 1;
-const UInt32 kpv_ErrorFlags_EncryptedHeadersError = 1 << 2;
-const UInt32 kpv_ErrorFlags_UnavailableStart = 1 << 3;
-const UInt32 kpv_ErrorFlags_UnconfirmedStart = 1 << 4;
-const UInt32 kpv_ErrorFlags_UnexpectedEnd = 1 << 5;
-const UInt32 kpv_ErrorFlags_DataAfterEnd = 1 << 6;
-const UInt32 kpv_ErrorFlags_UnsupportedMethod = 1 << 7;
-const UInt32 kpv_ErrorFlags_UnsupportedFeature = 1 << 8;
-const UInt32 kpv_ErrorFlags_DataError = 1 << 9;
-const UInt32 kpv_ErrorFlags_CrcError = 1 << 10;
-// const UInt32 kpv_ErrorFlags_Unsupported = 1 << 11;
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveCommandLine.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveCommandLine.cpp
deleted file mode 100644
index 769d21604..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveCommandLine.cpp
+++ /dev/null
@@ -1,1257 +0,0 @@
-// ArchiveCommandLine.cpp
-
-#include "StdAfx.h"
-#undef printf
-#undef sprintf
-
-#ifdef _WIN32
-#ifndef UNDER_CE
-#include <io.h>
-#endif
-#endif
-#include <stdio.h>
-
-#include "../../../Common/ListFileUtils.h"
-#include "../../../Common/StringConvert.h"
-#include "../../../Common/StringToInt.h"
-
-#include "../../../Windows/FileDir.h"
-#include "../../../Windows/FileName.h"
-#ifdef _WIN32
-#include "../../../Windows/FileMapping.h"
-#include "../../../Windows/Synchronization.h"
-#endif
-
-#include "ArchiveCommandLine.h"
-#include "EnumDirItems.h"
-#include "SortUtils.h"
-#include "Update.h"
-#include "UpdateAction.h"
-
-extern bool g_CaseSensitive;
-
-#ifdef UNDER_CE
-
-#define MY_IS_TERMINAL(x) false;
-
-#else
-
-#if _MSC_VER >= 1400
-#define MY_isatty_fileno(x) _isatty(_fileno(x))
-#else
-#define MY_isatty_fileno(x) isatty(fileno(x))
-#endif
-
-#define MY_IS_TERMINAL(x) (MY_isatty_fileno(x) != 0);
-
-#endif
-
-using namespace NCommandLineParser;
-using namespace NWindows;
-using namespace NFile;
-
-static bool StringToUInt32(const wchar_t *s, UInt32 &v)
-{
- if (*s == 0)
- return false;
- const wchar_t *end;
- v = ConvertStringToUInt32(s, &end);
- return *end == 0;
-}
-
-static void AddNewLine(UString &s)
-{
- s += L'\n';
-}
-
-CArcCmdLineException::CArcCmdLineException(const char *a, const wchar_t *u)
-{
- (*this) += MultiByteToUnicodeString(a);
- if (u)
- {
- AddNewLine(*this);
- (*this) += u;
- }
-}
-
-int g_CodePage = -1;
-
-namespace NKey {
-enum Enum
-{
- kHelp1 = 0,
- kHelp2,
- kHelp3,
- kDisableHeaders,
- kDisablePercents,
- kArchiveType,
- kYes,
- #ifndef _NO_CRYPTO
- kPassword,
- #endif
- kProperty,
- kOutputDir,
- kWorkingDir,
- kInclude,
- kExclude,
- kArInclude,
- kArExclude,
- kNoArName,
- kUpdate,
- kVolume,
- kRecursed,
- kSfx,
- kStdIn,
- kStdOut,
- kOverwrite,
- kEmail,
- kShowDialog,
- kLargePages,
- kListfileCharSet,
- kConsoleCharSet,
- kTechMode,
- kShareForWrite,
- kCaseSensitive,
- kHash,
- kArcNameMode,
-
- kDisableWildcardParsing,
- kElimDup,
- kFullPathMode,
-
- kHardLinks,
- kSymLinks,
- kNtSecurity,
- kAltStreams,
- kReplaceColonForAltStream,
- kWriteToAltStreamIfColon,
-
- kDeleteAfterCompressing,
- kSetArcMTime,
- kExcludedArcType
-};
-
-}
-
-
-static const wchar_t kRecursedIDChar = 'r';
-static const char *kRecursedPostCharSet = "0-";
-
-static const char *k_ArcNameMode_PostCharSet = "sea";
-
-static inline const EArcNameMode ParseArcNameMode(int postCharIndex)
-{
- switch (postCharIndex)
- {
- case 1: return k_ArcNameMode_Exact;
- case 2: return k_ArcNameMode_Add;
- default: return k_ArcNameMode_Smart;
- }
-}
-
-namespace NRecursedPostCharIndex {
- enum EEnum
- {
- kWildcardRecursionOnly = 0,
- kNoRecursion = 1
- };
-}
-
-static const char kImmediateNameID = '!';
-static const char kMapNameID = '#';
-static const char kFileListID = '@';
-
-static const char kSomeCludePostStringMinSize = 2; // at least <@|!><N>ame must be
-static const char kSomeCludeAfterRecursedPostStringMinSize = 2; // at least <@|!><N>ame must be
-
-static const char *kOverwritePostCharSet = "asut";
-
-NExtract::NOverwriteMode::EEnum k_OverwriteModes[] =
-{
- NExtract::NOverwriteMode::kOverwrite,
- NExtract::NOverwriteMode::kSkip,
- NExtract::NOverwriteMode::kRename,
- NExtract::NOverwriteMode::kRenameExisting
-};
-
-static const CSwitchForm kSwitchForms[] =
-{
- { "?" },
- { "h" },
- { "-help" },
- { "ba" },
- { "bd" },
- { "t", NSwitchType::kString, false, 1 },
- { "y" },
- #ifndef _NO_CRYPTO
- { "p", NSwitchType::kString },
- #endif
- { "m", NSwitchType::kString, true, 1 },
- { "o", NSwitchType::kString, false, 1 },
- { "w", NSwitchType::kString },
- { "i", NSwitchType::kString, true, kSomeCludePostStringMinSize},
- { "x", NSwitchType::kString, true, kSomeCludePostStringMinSize},
- { "ai", NSwitchType::kString, true, kSomeCludePostStringMinSize},
- { "ax", NSwitchType::kString, true, kSomeCludePostStringMinSize},
- { "an" },
- { "u", NSwitchType::kString, true, 1},
- { "v", NSwitchType::kString, true, 1},
- { "r", NSwitchType::kChar, false, 0, kRecursedPostCharSet },
- { "sfx", NSwitchType::kString },
- { "si", NSwitchType::kString },
- { "so" },
- { "ao", NSwitchType::kChar, false, 1, kOverwritePostCharSet},
- { "seml", NSwitchType::kString, false, 0},
- { "ad" },
- { "slp", NSwitchType::kMinus },
- { "scs", NSwitchType::kString },
- { "scc", NSwitchType::kString },
- { "slt" },
- { "ssw" },
- { "ssc", NSwitchType::kMinus },
- { "scrc", NSwitchType::kString, true, 0 },
- { "sa", NSwitchType::kChar, false, 1, k_ArcNameMode_PostCharSet },
-
- { "spd" },
- { "spe", NSwitchType::kMinus },
- { "spf", NSwitchType::kString, false, 0 },
-
- { "snh", NSwitchType::kMinus },
- { "snl", NSwitchType::kMinus },
- { "sni" },
- { "sns", NSwitchType::kMinus },
-
- { "snr" },
- { "snc" },
-
- { "sdel" },
- { "stl" },
- { "stx", NSwitchType::kString, true, 1 }
-};
-
-static const wchar_t *kUniversalWildcard = L"*";
-static const int kMinNonSwitchWords = 1;
-static const int kCommandIndex = 0;
-
-// static const char *kUserErrorMessage = "Incorrect command line";
-static const char *kCannotFindListFile = "Cannot find listfile";
-static const char *kIncorrectListFile = "Incorrect item in listfile.\nCheck charset encoding and -scs switch.";
-// static const char *kIncorrectWildcardInListFile = "Incorrect wildcard in listfile";
-// static const char *kIncorrectWildcardInCommandLine = "Incorrect wildcard in command line";
-static const char *kTerminalOutError = "I won't write compressed data to a terminal";
-static const char *kSameTerminalError = "I won't write data and program's messages to same terminal";
-static const char *kEmptyFilePath = "Empty file path";
-static const char *kCannotFindArchive = "Cannot find archive";
-
-bool CArcCommand::IsFromExtractGroup() const
-{
- switch (CommandType)
- {
- case NCommandType::kTest:
- case NCommandType::kExtract:
- case NCommandType::kExtractFull:
- return true;
- }
- return false;
-}
-
-NExtract::NPathMode::EEnum CArcCommand::GetPathMode() const
-{
- switch (CommandType)
- {
- case NCommandType::kTest:
- case NCommandType::kExtractFull:
- return NExtract::NPathMode::kFullPaths;
- }
- return NExtract::NPathMode::kNoPaths;
-}
-
-bool CArcCommand::IsFromUpdateGroup() const
-{
- switch (CommandType)
- {
- case NCommandType::kAdd:
- case NCommandType::kUpdate:
- case NCommandType::kDelete:
- case NCommandType::kRename:
- return true;
- }
- return false;
-}
-
-static NRecursedType::EEnum GetRecursedTypeFromIndex(int index)
-{
- switch (index)
- {
- case NRecursedPostCharIndex::kWildcardRecursionOnly:
- return NRecursedType::kWildcardOnlyRecursed;
- case NRecursedPostCharIndex::kNoRecursion:
- return NRecursedType::kNonRecursed;
- default:
- return NRecursedType::kRecursed;
- }
-}
-
-static const char *g_Commands = "audtexlbih";
-
-static bool ParseArchiveCommand(const UString &commandString, CArcCommand &command)
-{
- UString s = commandString;
- s.MakeLower_Ascii();
- if (s.Len() == 1)
- {
- if (s[0] > 0x7F)
- return false;
- int index = FindCharPosInString(g_Commands, (char)s[0]);
- if (index < 0)
- return false;
- command.CommandType = (NCommandType::EEnum)index;
- return true;
- }
- if (s.Len() == 2 && s[0] == 'r' && s[1] == 'n')
- {
- command.CommandType = (NCommandType::kRename);
- return true;
- }
- return false;
-}
-
-// ------------------------------------------------------------------
-// filenames functions
-
-static void AddNameToCensor(NWildcard::CCensor &censor,
- const UString &name, bool include, NRecursedType::EEnum type, bool wildcardMatching)
-{
- bool recursed = false;
-
- switch (type)
- {
- case NRecursedType::kWildcardOnlyRecursed:
- recursed = DoesNameContainWildcard(name);
- break;
- case NRecursedType::kRecursed:
- recursed = true;
- break;
- }
- censor.AddPreItem(include, name, recursed, wildcardMatching);
-}
-
-static void AddRenamePair(CObjectVector<CRenamePair> *renamePairs,
- const UString &oldName, const UString &newName, NRecursedType::EEnum type,
- bool wildcardMatching)
-{
- CRenamePair &pair = renamePairs->AddNew();
- pair.OldName = oldName;
- pair.NewName = newName;
- pair.RecursedType = type;
- pair.WildcardParsing = wildcardMatching;
-
- if (!pair.Prepare())
- {
- UString val;
- val += pair.OldName;
- AddNewLine(val);
- val += pair.NewName;
- AddNewLine(val);
- if (type == NRecursedType::kRecursed)
- val += L"-r";
- else if (type == NRecursedType::kRecursed)
- val += L"-r0";
- throw CArcCmdLineException("Unsupported rename command:", val);
- }
-}
-
-static void AddToCensorFromListFile(
- CObjectVector<CRenamePair> *renamePairs,
- NWildcard::CCensor &censor,
- LPCWSTR fileName, bool include, NRecursedType::EEnum type, bool wildcardMatching, Int32 codePage)
-{
- UStringVector names;
- if (!NFind::DoesFileExist(us2fs(fileName)))
- throw CArcCmdLineException(kCannotFindListFile, fileName);
- if (!ReadNamesFromListFile(us2fs(fileName), names, codePage))
- throw CArcCmdLineException(kIncorrectListFile, fileName);
- if (renamePairs)
- {
- if ((names.Size() & 1) != 0)
- throw CArcCmdLineException(kIncorrectListFile, fileName);
- for (unsigned i = 0; i < names.Size(); i += 2)
- {
- // change type !!!!
- AddRenamePair(renamePairs, names[i], names[i + 1], type, wildcardMatching);
- }
- }
- else
- FOR_VECTOR (i, names)
- AddNameToCensor(censor, names[i], include, type, wildcardMatching);
-}
-
-static void AddToCensorFromNonSwitchesStrings(
- CObjectVector<CRenamePair> *renamePairs,
- unsigned startIndex,
- NWildcard::CCensor &censor,
- const UStringVector &nonSwitchStrings, NRecursedType::EEnum type,
- bool wildcardMatching,
- bool thereAreSwitchIncludes, Int32 codePage)
-{
- if ((renamePairs || nonSwitchStrings.Size() == startIndex) && !thereAreSwitchIncludes)
- AddNameToCensor(censor, kUniversalWildcard, true, type,
- true // wildcardMatching
- );
-
- int oldIndex = -1;
-
- for (unsigned i = startIndex; i < nonSwitchStrings.Size(); i++)
- {
- const UString &s = nonSwitchStrings[i];
- if (s.IsEmpty())
- throw CArcCmdLineException(kEmptyFilePath);
- if (s[0] == kFileListID)
- AddToCensorFromListFile(renamePairs, censor, s.Ptr(1), true, type, wildcardMatching, codePage);
- else if (renamePairs)
- {
- if (oldIndex == -1)
- oldIndex = startIndex;
- else
- {
- // NRecursedType::EEnum type is used for global wildcard (-i! switches)
- AddRenamePair(renamePairs, nonSwitchStrings[oldIndex], s, NRecursedType::kNonRecursed, wildcardMatching);
- // AddRenamePair(renamePairs, nonSwitchStrings[oldIndex], s, type);
- oldIndex = -1;
- }
- }
- else
- AddNameToCensor(censor, s, true, type, wildcardMatching);
- }
-
- if (oldIndex != -1)
- {
- throw CArcCmdLineException("There is no second file name for rename pair:", nonSwitchStrings[oldIndex]);
- }
-}
-
-#ifdef _WIN32
-
-struct CEventSetEnd
-{
- UString Name;
-
- CEventSetEnd(const wchar_t *name): Name(name) {}
- ~CEventSetEnd()
- {
- NSynchronization::CManualResetEvent event;
- if (event.Open(EVENT_MODIFY_STATE, false, GetSystemString(Name)) == 0)
- event.Set();
- }
-};
-
-const char *k_IncorrectMapCommand = "Incorrect Map command";
-
-static const char *ParseMapWithPaths(
- NWildcard::CCensor &censor,
- const UString &s2, bool include,
- NRecursedType::EEnum commonRecursedType,
- bool wildcardMatching)
-{
- UString s = s2;
- int pos = s.Find(L':');
- if (pos < 0)
- return k_IncorrectMapCommand;
- int pos2 = s.Find(L':', pos + 1);
- if (pos2 < 0)
- return k_IncorrectMapCommand;
-
- CEventSetEnd eventSetEnd((const wchar_t *)s + (pos2 + 1));
- s.DeleteFrom(pos2);
- UInt32 size;
- if (!StringToUInt32(s.Ptr(pos + 1), size)
- || size < sizeof(wchar_t)
- || size > ((UInt32)1 << 31)
- || size % sizeof(wchar_t) != 0)
- return "Unsupported Map data size";
-
- s.DeleteFrom(pos);
- CFileMapping map;
- if (map.Open(FILE_MAP_READ, GetSystemString(s)) != 0)
- return "Can not open mapping";
- LPVOID data = map.Map(FILE_MAP_READ, 0, size);
- if (!data)
- return "MapViewOfFile error";
- CFileUnmapper unmapper(data);
-
- UString name;
- const wchar_t *p = (const wchar_t *)data;
- if (*p != 0) // data format marker
- return "Unsupported Map data";
- UInt32 numChars = size / sizeof(wchar_t);
- for (UInt32 i = 1; i < numChars; i++)
- {
- wchar_t c = p[i];
- if (c == 0)
- {
- // MessageBoxW(0, name, L"7-Zip", 0);
- AddNameToCensor(censor, name, include, commonRecursedType, wildcardMatching);
- name.Empty();
- }
- else
- name += c;
- }
- if (!name.IsEmpty())
- return "Map data error";
-
- return NULL;
-}
-
-#endif
-
-static void AddSwitchWildcardsToCensor(
- NWildcard::CCensor &censor,
- const UStringVector &strings, bool include,
- NRecursedType::EEnum commonRecursedType,
- bool wildcardMatching,
- Int32 codePage)
-{
- const char *errorMessage = NULL;
- unsigned i;
- for (i = 0; i < strings.Size(); i++)
- {
- const UString &name = strings[i];
- NRecursedType::EEnum recursedType;
- unsigned pos = 0;
-
- if (name.Len() < kSomeCludePostStringMinSize)
- {
- errorMessage = "Too short switch";
- break;
- }
-
- if (::MyCharLower_Ascii(name[pos]) == kRecursedIDChar)
- {
- pos++;
- wchar_t c = name[pos];
- int index = -1;
- if (c <= 0x7F)
- index = FindCharPosInString(kRecursedPostCharSet, (char)c);
- recursedType = GetRecursedTypeFromIndex(index);
- if (index >= 0)
- pos++;
- }
- else
- recursedType = commonRecursedType;
-
- if (name.Len() < pos + kSomeCludeAfterRecursedPostStringMinSize)
- {
- errorMessage = "Too short switch";
- break;
- }
-
- UString tail = name.Ptr(pos + 1);
-
- if (name[pos] == kImmediateNameID)
- AddNameToCensor(censor, tail, include, recursedType, wildcardMatching);
- else if (name[pos] == kFileListID)
- AddToCensorFromListFile(NULL, censor, tail, include, recursedType, wildcardMatching, codePage);
- #ifdef _WIN32
- else if (name[pos] == kMapNameID)
- {
- errorMessage = ParseMapWithPaths(censor, tail, include, recursedType, wildcardMatching);
- if (errorMessage)
- break;
- }
- #endif
- else
- {
- errorMessage = "Incorrect wildcarc type marker";
- break;
- }
- }
- if (i != strings.Size())
- throw CArcCmdLineException(errorMessage, strings[i]);
-}
-
-#ifdef _WIN32
-
-// This code converts all short file names to long file names.
-
-static void ConvertToLongName(const UString &prefix, UString &name)
-{
- if (name.IsEmpty() || DoesNameContainWildcard(name))
- return;
- NFind::CFileInfo fi;
- const FString path = us2fs(prefix + name);
- if (NFile::NName::IsDevicePath(path))
- return;
- if (fi.Find(path))
- name = fs2us(fi.Name);
-}
-
-static void ConvertToLongNames(const UString &prefix, CObjectVector<NWildcard::CItem> &items)
-{
- FOR_VECTOR (i, items)
- {
- NWildcard::CItem &item = items[i];
- if (item.Recursive || item.PathParts.Size() != 1)
- continue;
- if (prefix.IsEmpty() && item.IsDriveItem())
- continue;
- ConvertToLongName(prefix, item.PathParts.Front());
- }
-}
-
-static void ConvertToLongNames(const UString &prefix, NWildcard::CCensorNode &node)
-{
- ConvertToLongNames(prefix, node.IncludeItems);
- ConvertToLongNames(prefix, node.ExcludeItems);
- unsigned i;
- for (i = 0; i < node.SubNodes.Size(); i++)
- {
- UString &name = node.SubNodes[i].Name;
- if (prefix.IsEmpty() && NWildcard::IsDriveColonName(name))
- continue;
- ConvertToLongName(prefix, name);
- }
- // mix folders with same name
- for (i = 0; i < node.SubNodes.Size(); i++)
- {
- NWildcard::CCensorNode &nextNode1 = node.SubNodes[i];
- for (unsigned j = i + 1; j < node.SubNodes.Size();)
- {
- const NWildcard::CCensorNode &nextNode2 = node.SubNodes[j];
- if (nextNode1.Name.IsEqualToNoCase(nextNode2.Name))
- {
- nextNode1.IncludeItems += nextNode2.IncludeItems;
- nextNode1.ExcludeItems += nextNode2.ExcludeItems;
- node.SubNodes.Delete(j);
- }
- else
- j++;
- }
- }
- for (i = 0; i < node.SubNodes.Size(); i++)
- {
- NWildcard::CCensorNode &nextNode = node.SubNodes[i];
- ConvertToLongNames(prefix + nextNode.Name + WCHAR_PATH_SEPARATOR, nextNode);
- }
-}
-
-void ConvertToLongNames(NWildcard::CCensor &censor)
-{
- FOR_VECTOR (i, censor.Pairs)
- {
- NWildcard::CPair &pair = censor.Pairs[i];
- ConvertToLongNames(pair.Prefix, pair.Head);
- }
-}
-
-#endif
-
-/*
-static NUpdateArchive::NPairAction::EEnum GetUpdatePairActionType(int i)
-{
- switch (i)
- {
- case NUpdateArchive::NPairAction::kIgnore: return NUpdateArchive::NPairAction::kIgnore;
- case NUpdateArchive::NPairAction::kCopy: return NUpdateArchive::NPairAction::kCopy;
- case NUpdateArchive::NPairAction::kCompress: return NUpdateArchive::NPairAction::kCompress;
- case NUpdateArchive::NPairAction::kCompressAsAnti: return NUpdateArchive::NPairAction::kCompressAsAnti;
- }
- throw 98111603;
-}
-*/
-
-static const wchar_t *kUpdatePairStateIDSet = L"pqrxyzw";
-static const int kUpdatePairStateNotSupportedActions[] = {2, 2, 1, -1, -1, -1, -1};
-
-static const unsigned kNumUpdatePairActions = 4;
-static const char *kUpdateIgnoreItselfPostStringID = "-";
-static const wchar_t kUpdateNewArchivePostCharID = '!';
-
-
-static bool ParseUpdateCommandString2(const UString &command,
- NUpdateArchive::CActionSet &actionSet, UString &postString)
-{
- for (unsigned i = 0; i < command.Len();)
- {
- wchar_t c = MyCharLower_Ascii(command[i]);
- int statePos = FindCharPosInString(kUpdatePairStateIDSet, c);
- if (statePos < 0)
- {
- postString = command.Ptr(i);
- return true;
- }
- i++;
- if (i >= command.Len())
- return false;
- c = command[i];
- if (c < '0' || c >= '0' + kNumUpdatePairActions)
- return false;
- int actionPos = c - '0';
- actionSet.StateActions[statePos] = (NUpdateArchive::NPairAction::EEnum)(actionPos);
- if (kUpdatePairStateNotSupportedActions[statePos] == actionPos)
- return false;
- i++;
- }
- postString.Empty();
- return true;
-}
-
-static void ParseUpdateCommandString(CUpdateOptions &options,
- const UStringVector &updatePostStrings,
- const NUpdateArchive::CActionSet &defaultActionSet)
-{
- const char *errorMessage = "incorrect update switch command";
- unsigned i;
- for (i = 0; i < updatePostStrings.Size(); i++)
- {
- const UString &updateString = updatePostStrings[i];
- if (updateString.IsEqualTo(kUpdateIgnoreItselfPostStringID))
- {
- if (options.UpdateArchiveItself)
- {
- options.UpdateArchiveItself = false;
- options.Commands.Delete(0);
- }
- }
- else
- {
- NUpdateArchive::CActionSet actionSet = defaultActionSet;
-
- UString postString;
- if (!ParseUpdateCommandString2(updateString, actionSet, postString))
- break;
- if (postString.IsEmpty())
- {
- if (options.UpdateArchiveItself)
- options.Commands[0].ActionSet = actionSet;
- }
- else
- {
- if (postString[0] != kUpdateNewArchivePostCharID)
- break;
- CUpdateArchiveCommand uc;
- UString archivePath = postString.Ptr(1);
- if (archivePath.IsEmpty())
- break;
- uc.UserArchivePath = archivePath;
- uc.ActionSet = actionSet;
- options.Commands.Add(uc);
- }
- }
- }
- if (i != updatePostStrings.Size())
- throw CArcCmdLineException(errorMessage, updatePostStrings[i]);
-}
-
-bool ParseComplexSize(const wchar_t *s, UInt64 &result);
-
-static void SetAddCommandOptions(
- NCommandType::EEnum commandType,
- const CParser &parser,
- CUpdateOptions &options)
-{
- NUpdateArchive::CActionSet defaultActionSet;
- switch (commandType)
- {
- case NCommandType::kAdd:
- defaultActionSet = NUpdateArchive::k_ActionSet_Add;
- break;
- case NCommandType::kDelete:
- defaultActionSet = NUpdateArchive::k_ActionSet_Delete;
- break;
- default:
- defaultActionSet = NUpdateArchive::k_ActionSet_Update;
- }
-
- options.UpdateArchiveItself = true;
-
- options.Commands.Clear();
- CUpdateArchiveCommand updateMainCommand;
- updateMainCommand.ActionSet = defaultActionSet;
- options.Commands.Add(updateMainCommand);
- if (parser[NKey::kUpdate].ThereIs)
- ParseUpdateCommandString(options, parser[NKey::kUpdate].PostStrings,
- defaultActionSet);
- if (parser[NKey::kWorkingDir].ThereIs)
- {
- const UString &postString = parser[NKey::kWorkingDir].PostStrings[0];
- if (postString.IsEmpty())
- NDir::MyGetTempPath(options.WorkingDir);
- else
- options.WorkingDir = us2fs(postString);
- }
- options.SfxMode = parser[NKey::kSfx].ThereIs;
- if (options.SfxMode)
- options.SfxModule = us2fs(parser[NKey::kSfx].PostStrings[0]);
-
- if (parser[NKey::kVolume].ThereIs)
- {
- const UStringVector &sv = parser[NKey::kVolume].PostStrings;
- FOR_VECTOR (i, sv)
- {
- UInt64 size;
- if (!ParseComplexSize(sv[i], size) || size == 0)
- throw CArcCmdLineException("Incorrect volume size:", sv[i]);
- options.VolumesSizes.Add(size);
- }
- }
-}
-
-static void SetMethodOptions(const CParser &parser, CObjectVector<CProperty> &properties)
-{
- if (parser[NKey::kProperty].ThereIs)
- {
- FOR_VECTOR (i, parser[NKey::kProperty].PostStrings)
- {
- CProperty prop;
- prop.Name = parser[NKey::kProperty].PostStrings[i];
- int index = prop.Name.Find(L'=');
- if (index >= 0)
- {
- prop.Value = prop.Name.Ptr(index + 1);
- prop.Name.DeleteFrom(index);
- }
- properties.Add(prop);
- }
- }
-}
-
-CArcCmdLineParser::CArcCmdLineParser(): parser(ARRAY_SIZE(kSwitchForms)) {}
-
-void CArcCmdLineParser::Parse1(const UStringVector &commandStrings,
- CArcCmdLineOptions &options)
-{
- if (!parser.ParseStrings(kSwitchForms, commandStrings))
- throw CArcCmdLineException(parser.ErrorMessage, parser.ErrorLine);
-
- options.IsInTerminal = MY_IS_TERMINAL(stdin);
- options.IsStdOutTerminal = MY_IS_TERMINAL(stdout);
- options.IsStdErrTerminal = MY_IS_TERMINAL(stderr);
- options.StdInMode = parser[NKey::kStdIn].ThereIs;
- options.StdOutMode = parser[NKey::kStdOut].ThereIs;
- options.EnableHeaders = !parser[NKey::kDisableHeaders].ThereIs;
- options.HelpMode = parser[NKey::kHelp1].ThereIs || parser[NKey::kHelp2].ThereIs || parser[NKey::kHelp3].ThereIs;
-
- if (parser[NKey::kCaseSensitive].ThereIs)
- {
- g_CaseSensitive = !parser[NKey::kCaseSensitive].WithMinus;
- options.CaseSensitiveChange = true;
- options.CaseSensitive = g_CaseSensitive;
- }
-
- #ifdef _WIN32
- options.LargePages = false;
- if (parser[NKey::kLargePages].ThereIs)
- {
- options.LargePages = !parser[NKey::kLargePages].WithMinus;
- }
- #endif
-}
-
-struct CCodePagePair
-{
- const char *Name;
- Int32 CodePage;
-};
-
-static const unsigned kNumByteOnlyCodePages = 3;
-
-static CCodePagePair g_CodePagePairs[] =
-{
- { "utf-8", CP_UTF8 },
- { "win", CP_ACP },
- { "dos", CP_OEMCP },
- { "utf-16le", MY__CP_UTF16 },
- { "utf-16be", MY__CP_UTF16BE }
-};
-
-static Int32 FindCharset(const NCommandLineParser::CParser &parser, int keyIndex,
- bool byteOnlyCodePages, Int32 defaultVal)
-{
- if (!parser[keyIndex].ThereIs)
- return defaultVal;
-
- UString name = parser[keyIndex].PostStrings.Back();
- UInt32 v;
- if (StringToUInt32(name, v))
- if (v < ((UInt32)1 << 16))
- return (Int32)v;
- name.MakeLower_Ascii();
- unsigned num = byteOnlyCodePages ? kNumByteOnlyCodePages : ARRAY_SIZE(g_CodePagePairs);
- for (unsigned i = 0;; i++)
- {
- if (i == num) // to disable warnings from different compilers
- throw CArcCmdLineException("Unsupported charset:", name);
- const CCodePagePair &pair = g_CodePagePairs[i];
- if (name.IsEqualTo(pair.Name))
- return pair.CodePage;
- }
-}
-
-void EnumerateDirItemsAndSort(
- bool storeAltStreams,
- NWildcard::CCensor &censor,
- NWildcard::ECensorPathMode censorPathMode,
- const UString &addPathPrefix,
- UStringVector &sortedPaths,
- UStringVector &sortedFullPaths)
-{
- UStringVector paths;
- {
- CDirItems dirItems;
- {
- dirItems.ScanAltStreams = storeAltStreams;
- HRESULT res = EnumerateItems(censor, censorPathMode, addPathPrefix, dirItems, NULL);
- if (res != S_OK || dirItems.ErrorPaths.Size() > 0)
- {
- UString errorPath;
- if (dirItems.ErrorPaths.Size() > 0)
- errorPath = fs2us(dirItems.ErrorPaths[0]);
- throw CArcCmdLineException(kCannotFindArchive,
- dirItems.ErrorPaths.Size() > 0 ? (const wchar_t *)errorPath : NULL);
- }
- }
- FOR_VECTOR (i, dirItems.Items)
- {
- const CDirItem &dirItem = dirItems.Items[i];
- if (!dirItem.IsDir())
- paths.Add(dirItems.GetPhyPath(i));
- }
- }
-
- if (paths.Size() == 0)
- throw CArcCmdLineException(kCannotFindArchive);
-
- UStringVector fullPaths;
-
- unsigned i;
- for (i = 0; i < paths.Size(); i++)
- {
- FString fullPath;
- NFile::NDir::MyGetFullPathName(us2fs(paths[i]), fullPath);
- fullPaths.Add(fs2us(fullPath));
- }
- CUIntVector indices;
- SortFileNames(fullPaths, indices);
- sortedPaths.ClearAndReserve(indices.Size());
- sortedFullPaths.ClearAndReserve(indices.Size());
- for (i = 0; i < indices.Size(); i++)
- {
- unsigned index = indices[i];
- sortedPaths.AddInReserved(paths[index]);
- sortedFullPaths.AddInReserved(fullPaths[index]);
- if (i > 0 && CompareFileNames(sortedFullPaths[i], sortedFullPaths[i - 1]) == 0)
- throw CArcCmdLineException("Duplicate archive path:", sortedFullPaths[i]);
- }
-}
-
-static void SetBoolPair(NCommandLineParser::CParser &parser, unsigned switchID, CBoolPair &bp)
-{
- bp.Def = parser[switchID].ThereIs;
- if (bp.Def)
- bp.Val = !parser[switchID].WithMinus;
-}
-
-void CArcCmdLineParser::Parse2(CArcCmdLineOptions &options)
-{
- const UStringVector &nonSwitchStrings = parser.NonSwitchStrings;
- int numNonSwitchStrings = nonSwitchStrings.Size();
- if (numNonSwitchStrings < kMinNonSwitchWords)
- throw CArcCmdLineException("The command must be spcified");
-
- if (!ParseArchiveCommand(nonSwitchStrings[kCommandIndex], options.Command))
- throw CArcCmdLineException("Unsupported command:", nonSwitchStrings[kCommandIndex]);
-
- options.TechMode = parser[NKey::kTechMode].ThereIs;
- if (parser[NKey::kHash].ThereIs)
- options.HashMethods = parser[NKey::kHash].PostStrings;
-
- if (parser[NKey::kElimDup].ThereIs)
- {
- options.ExtractOptions.ElimDup.Def = true;
- options.ExtractOptions.ElimDup.Val = !parser[NKey::kElimDup].WithMinus;
- }
-
- NWildcard::ECensorPathMode censorPathMode = NWildcard::k_RelatPath;
- bool fullPathMode = parser[NKey::kFullPathMode].ThereIs;
- if (fullPathMode)
- {
- censorPathMode = NWildcard::k_AbsPath;
- const UString &s = parser[NKey::kFullPathMode].PostStrings[0];
- if (!s.IsEmpty())
- {
- if (s == L"2")
- censorPathMode = NWildcard::k_FullPath;
- else
- throw CArcCmdLineException("Unsupported -spf:", s);
- }
- }
-
- NRecursedType::EEnum recursedType;
- if (parser[NKey::kRecursed].ThereIs)
- recursedType = GetRecursedTypeFromIndex(parser[NKey::kRecursed].PostCharIndex);
- else
- recursedType = NRecursedType::kNonRecursed;
-
- bool wildcardMatching = true;
- if (parser[NKey::kDisableWildcardParsing].ThereIs)
- wildcardMatching = false;
-
- g_CodePage = FindCharset(parser, NKey::kConsoleCharSet, true, -1);
- Int32 codePage = FindCharset(parser, NKey::kListfileCharSet, false, CP_UTF8);
-
- bool thereAreSwitchIncludes = false;
-
- if (parser[NKey::kInclude].ThereIs)
- {
- thereAreSwitchIncludes = true;
- AddSwitchWildcardsToCensor(options.Censor,
- parser[NKey::kInclude].PostStrings, true, recursedType, wildcardMatching, codePage);
- }
-
- if (parser[NKey::kExclude].ThereIs)
- AddSwitchWildcardsToCensor(options.Censor,
- parser[NKey::kExclude].PostStrings, false, recursedType, wildcardMatching, codePage);
-
- int curCommandIndex = kCommandIndex + 1;
- bool thereIsArchiveName = !parser[NKey::kNoArName].ThereIs &&
- options.Command.CommandType != NCommandType::kBenchmark &&
- options.Command.CommandType != NCommandType::kInfo &&
- options.Command.CommandType != NCommandType::kHash;
-
- bool isExtractGroupCommand = options.Command.IsFromExtractGroup();
- bool isExtractOrList = isExtractGroupCommand || options.Command.CommandType == NCommandType::kList;
- bool isRename = options.Command.CommandType == NCommandType::kRename;
-
- if ((isExtractOrList || isRename) && options.StdInMode)
- thereIsArchiveName = false;
-
- if (parser[NKey::kArcNameMode].ThereIs)
- options.UpdateOptions.ArcNameMode = ParseArcNameMode(parser[NKey::kArcNameMode].PostCharIndex);
-
- if (thereIsArchiveName)
- {
- if (curCommandIndex >= numNonSwitchStrings)
- throw CArcCmdLineException("Cannot find archive name");
- options.ArchiveName = nonSwitchStrings[curCommandIndex++];
- if (options.ArchiveName.IsEmpty())
- throw CArcCmdLineException("Archive name cannot by empty");
- }
-
- AddToCensorFromNonSwitchesStrings(isRename ? &options.UpdateOptions.RenamePairs : NULL,
- curCommandIndex, options.Censor,
- nonSwitchStrings, recursedType, wildcardMatching,
- thereAreSwitchIncludes, codePage);
-
- options.YesToAll = parser[NKey::kYes].ThereIs;
-
-
- #ifndef _NO_CRYPTO
- options.PasswordEnabled = parser[NKey::kPassword].ThereIs;
- if (options.PasswordEnabled)
- options.Password = parser[NKey::kPassword].PostStrings[0];
- #endif
-
- options.ShowDialog = parser[NKey::kShowDialog].ThereIs;
-
- if (parser[NKey::kArchiveType].ThereIs)
- options.ArcType = parser[NKey::kArchiveType].PostStrings[0];
-
- options.ExcludedArcTypes = parser[NKey::kExcludedArcType].PostStrings;
-
- SetMethodOptions(parser, options.Properties);
-
- options.EnablePercents = !parser[NKey::kDisablePercents].ThereIs;
-
- if (options.EnablePercents)
- {
- if ((options.StdOutMode && !options.IsStdErrTerminal) ||
- (!options.StdOutMode && !options.IsStdOutTerminal))
- options.EnablePercents = false;
- }
-
- if (parser[NKey::kNtSecurity].ThereIs) options.NtSecurity.SetTrueTrue();
-
- SetBoolPair(parser, NKey::kAltStreams, options.AltStreams);
- SetBoolPair(parser, NKey::kHardLinks, options.HardLinks);
- SetBoolPair(parser, NKey::kSymLinks, options.SymLinks);
-
- if (isExtractOrList)
- {
- CExtractOptionsBase &eo = options.ExtractOptions;
-
- {
- CExtractNtOptions &nt = eo.NtOptions;
- nt.NtSecurity = options.NtSecurity;
-
- nt.AltStreams = options.AltStreams;
- if (!options.AltStreams.Def)
- nt.AltStreams.Val = true;
-
- nt.HardLinks = options.HardLinks;
- if (!options.HardLinks.Def)
- nt.HardLinks.Val = true;
-
- nt.SymLinks = options.SymLinks;
- if (!options.SymLinks.Def)
- nt.SymLinks.Val = true;
-
- nt.ReplaceColonForAltStream = parser[NKey::kReplaceColonForAltStream].ThereIs;
- nt.WriteToAltStreamIfColon = parser[NKey::kWriteToAltStreamIfColon].ThereIs;
- }
-
- options.Censor.AddPathsToCensor(NWildcard::k_AbsPath);
- options.Censor.ExtendExclude();
-
- // are there paths that look as non-relative (!Prefix.IsEmpty())
- if (!options.Censor.AllAreRelative())
- throw CArcCmdLineException("Cannot use absolute pathnames for this command");
-
- NWildcard::CCensor arcCensor;
-
- if (parser[NKey::kArInclude].ThereIs)
- AddSwitchWildcardsToCensor(arcCensor, parser[NKey::kArInclude].PostStrings, true, NRecursedType::kNonRecursed, wildcardMatching, codePage);
- if (parser[NKey::kArExclude].ThereIs)
- AddSwitchWildcardsToCensor(arcCensor, parser[NKey::kArExclude].PostStrings, false, NRecursedType::kNonRecursed, wildcardMatching, codePage);
-
- if (thereIsArchiveName)
- AddNameToCensor(arcCensor, options.ArchiveName, true, NRecursedType::kNonRecursed, wildcardMatching);
-
- arcCensor.AddPathsToCensor(NWildcard::k_RelatPath);
-
- #ifdef _WIN32
- ConvertToLongNames(arcCensor);
- #endif
-
- arcCensor.ExtendExclude();
-
- if (options.StdInMode)
- {
- UString arcName = parser[NKey::kStdIn].PostStrings.Front();
- options.ArchivePathsSorted.Add(arcName);
- options.ArchivePathsFullSorted.Add(arcName);
- }
- else
- {
- EnumerateDirItemsAndSort(
- false, // scanAltStreams
- arcCensor,
- NWildcard::k_RelatPath,
- UString(), // addPathPrefix
- options.ArchivePathsSorted,
- options.ArchivePathsFullSorted);
- }
-
- if (isExtractGroupCommand)
- {
- if (options.StdOutMode && options.IsStdOutTerminal && options.IsStdErrTerminal)
- throw CArcCmdLineException(kSameTerminalError);
- if (parser[NKey::kOutputDir].ThereIs)
- {
- eo.OutputDir = us2fs(parser[NKey::kOutputDir].PostStrings[0]);
- NFile::NName::NormalizeDirPathPrefix(eo.OutputDir);
- }
-
- eo.OverwriteMode = NExtract::NOverwriteMode::kAsk;
- if (parser[NKey::kOverwrite].ThereIs)
- {
- eo.OverwriteMode = k_OverwriteModes[parser[NKey::kOverwrite].PostCharIndex];
- eo.OverwriteMode_Force = true;
- }
- else if (options.YesToAll)
- {
- eo.OverwriteMode = NExtract::NOverwriteMode::kOverwrite;
- eo.OverwriteMode_Force = true;
- }
- }
-
- eo.PathMode = options.Command.GetPathMode();
- if (censorPathMode == NWildcard::k_AbsPath)
- {
- eo.PathMode = NExtract::NPathMode::kAbsPaths;
- eo.PathMode_Force = true;
- }
- else if (censorPathMode == NWildcard::k_FullPath)
- {
- eo.PathMode = NExtract::NPathMode::kFullPaths;
- eo.PathMode_Force = true;
- }
- }
- else if (options.Command.IsFromUpdateGroup())
- {
- if (parser[NKey::kArInclude].ThereIs)
- throw CArcCmdLineException("-ai switch is not supported for this command");
-
- CUpdateOptions &updateOptions = options.UpdateOptions;
-
- SetAddCommandOptions(options.Command.CommandType, parser, updateOptions);
-
- updateOptions.MethodMode.Properties = options.Properties;
-
- if (parser[NKey::kShareForWrite].ThereIs)
- updateOptions.OpenShareForWrite = true;
-
- updateOptions.PathMode = censorPathMode;
-
- updateOptions.AltStreams = options.AltStreams;
- updateOptions.NtSecurity = options.NtSecurity;
- updateOptions.HardLinks = options.HardLinks;
- updateOptions.SymLinks = options.SymLinks;
-
- updateOptions.EMailMode = parser[NKey::kEmail].ThereIs;
- if (updateOptions.EMailMode)
- {
- updateOptions.EMailAddress = parser[NKey::kEmail].PostStrings.Front();
- if (updateOptions.EMailAddress.Len() > 0)
- if (updateOptions.EMailAddress[0] == L'.')
- {
- updateOptions.EMailRemoveAfter = true;
- updateOptions.EMailAddress.Delete(0);
- }
- }
-
- updateOptions.StdOutMode = options.StdOutMode;
- updateOptions.StdInMode = options.StdInMode;
-
- updateOptions.DeleteAfterCompressing = parser[NKey::kDeleteAfterCompressing].ThereIs;
- updateOptions.SetArcMTime = parser[NKey::kSetArcMTime].ThereIs;
-
- if (updateOptions.StdOutMode && updateOptions.EMailMode)
- throw CArcCmdLineException("stdout mode and email mode cannot be combined");
- if (updateOptions.StdOutMode && options.IsStdOutTerminal)
- throw CArcCmdLineException(kTerminalOutError);
- if (updateOptions.StdInMode)
- updateOptions.StdInFileName = parser[NKey::kStdIn].PostStrings.Front();
-
- if (options.Command.CommandType == NCommandType::kRename)
- if (updateOptions.Commands.Size() != 1)
- throw CArcCmdLineException("Only one archive can be created with rename command");
- }
- else if (options.Command.CommandType == NCommandType::kBenchmark)
- {
- options.NumIterations = 1;
- if (curCommandIndex < numNonSwitchStrings)
- {
- if (!StringToUInt32(nonSwitchStrings[curCommandIndex], options.NumIterations))
- throw CArcCmdLineException("Incorrect Number of benmchmark iterations", nonSwitchStrings[curCommandIndex]);
- curCommandIndex++;
- }
- }
- else if (options.Command.CommandType == NCommandType::kHash)
- {
- options.Censor.AddPathsToCensor(censorPathMode);
- options.Censor.ExtendExclude();
-
- CHashOptions &hashOptions = options.HashOptions;
- hashOptions.PathMode = censorPathMode;
- hashOptions.Methods = options.HashMethods;
- if (parser[NKey::kShareForWrite].ThereIs)
- hashOptions.OpenShareForWrite = true;
- hashOptions.StdInMode = options.StdInMode;
- hashOptions.AltStreamsMode = options.AltStreams.Val;
- }
- else if (options.Command.CommandType == NCommandType::kInfo)
- {
- }
- else
- throw 9815676711;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveCommandLine.h b/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveCommandLine.h
deleted file mode 100644
index 87e6619e6..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveCommandLine.h
+++ /dev/null
@@ -1,122 +0,0 @@
-// ArchiveCommandLine.h
-
-#ifndef __ARCHIVE_COMMAND_LINE_H
-#define __ARCHIVE_COMMAND_LINE_H
-
-#include "../../../Common/CommandLineParser.h"
-#include "../../../Common/Wildcard.h"
-
-#include "Extract.h"
-#include "HashCalc.h"
-#include "Update.h"
-
-struct CArcCmdLineException: public UString
-{
- CArcCmdLineException(const char *a, const wchar_t *u = NULL);
-};
-
-namespace NCommandType { enum EEnum
-{
- kAdd = 0,
- kUpdate,
- kDelete,
- kTest,
- kExtract,
- kExtractFull,
- kList,
- kBenchmark,
- kInfo,
- kHash,
- kRename
-};}
-
-struct CArcCommand
-{
- NCommandType::EEnum CommandType;
-
- bool IsFromExtractGroup() const;
- bool IsFromUpdateGroup() const;
- bool IsTestCommand() const { return CommandType == NCommandType::kTest; }
- NExtract::NPathMode::EEnum GetPathMode() const;
-};
-
-struct CArcCmdLineOptions
-{
- bool HelpMode;
-
- #ifdef _WIN32
- bool LargePages;
- #endif
- bool CaseSensitiveChange;
- bool CaseSensitive;
-
- bool IsInTerminal;
- bool IsStdOutTerminal;
- bool IsStdErrTerminal;
- bool StdInMode;
- bool StdOutMode;
- bool EnableHeaders;
-
- bool YesToAll;
- bool ShowDialog;
- NWildcard::CCensor Censor;
-
- CArcCommand Command;
- UString ArchiveName;
-
- #ifndef _NO_CRYPTO
- bool PasswordEnabled;
- UString Password;
- #endif
-
- bool TechMode;
-
- UStringVector HashMethods;
-
- bool AppendName;
- UStringVector ArchivePathsSorted;
- UStringVector ArchivePathsFullSorted;
- CObjectVector<CProperty> Properties;
-
- CExtractOptionsBase ExtractOptions;
-
- CBoolPair NtSecurity;
- CBoolPair AltStreams;
- CBoolPair HardLinks;
- CBoolPair SymLinks;
-
- CUpdateOptions UpdateOptions;
- CHashOptions HashOptions;
- UString ArcType;
- UStringVector ExcludedArcTypes;
- bool EnablePercents;
-
- // Benchmark
- UInt32 NumIterations;
-
- CArcCmdLineOptions():
- StdInMode(false),
- StdOutMode(false),
- CaseSensitiveChange(false),
- CaseSensitive(false)
- {};
-};
-
-class CArcCmdLineParser
-{
- NCommandLineParser::CParser parser;
-public:
- CArcCmdLineParser();
- void Parse1(const UStringVector &commandStrings, CArcCmdLineOptions &options);
- void Parse2(CArcCmdLineOptions &options);
-};
-
-void EnumerateDirItemsAndSort(
- bool storeAltStreams,
- NWildcard::CCensor &censor,
- NWildcard::ECensorPathMode pathMode,
- const UString &addPathPrefix,
- UStringVector &sortedPaths,
- UStringVector &sortedFullPaths);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp
deleted file mode 100644
index 250f66797..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp
+++ /dev/null
@@ -1,1191 +0,0 @@
-// ArchiveExtractCallback.cpp
-
-#include "StdAfx.h"
-
-#undef sprintf
-#undef printf
-
-#include "../../../Common/ComTry.h"
-#include "../../../Common/StringConvert.h"
-#include "../../../Common/Wildcard.h"
-
-#include "../../../Windows/FileDir.h"
-#include "../../../Windows/FileFind.h"
-#include "../../../Windows/FileName.h"
-#include "../../../Windows/PropVariant.h"
-#include "../../../Windows/PropVariantConv.h"
-
-#if defined(_WIN32) && !defined(UNDER_CE) && !defined(_SFX)
-#define _USE_SECURITY_CODE
-#include "../../../Windows/SecurityUtils.h"
-#endif
-
-#include "../../Common/FilePathAutoRename.h"
-
-#include "../Common/ExtractingFilePath.h"
-#include "../Common/PropIDUtils.h"
-
-#include "ArchiveExtractCallback.h"
-
-using namespace NWindows;
-using namespace NFile;
-using namespace NDir;
-
-static const char *kCantAutoRename = "Can not create file with auto name";
-static const char *kCantRenameFile = "Can not rename existing file";
-static const char *kCantDeleteOutputFile = "Can not delete output file";
-static const char *kCantDeleteOutputDir = "Can not delete output folder";
-
-
-#ifndef _SFX
-
-STDMETHODIMP COutStreamWithHash::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- HRESULT result = S_OK;
- if (_stream)
- result = _stream->Write(data, size, &size);
- if (_calculate)
- _hash->Update(data, size);
- _size += size;
- if (processedSize)
- *processedSize = size;
- return result;
-}
-
-#endif
-
-#ifdef _USE_SECURITY_CODE
-bool InitLocalPrivileges()
-{
- NSecurity::CAccessToken token;
- if (!token.OpenProcessToken(GetCurrentProcess(),
- TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES))
- return false;
-
- TOKEN_PRIVILEGES tp;
-
- tp.PrivilegeCount = 1;
- tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
-
- if (!::LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &tp.Privileges[0].Luid))
- return false;
- if (!token.AdjustPrivileges(&tp))
- return false;
- return (GetLastError() == ERROR_SUCCESS);
-}
-#endif
-
-#ifdef SUPPORT_LINKS
-
-int CHardLinkNode::Compare(const CHardLinkNode &a) const
-{
- if (StreamId < a.StreamId) return -1;
- if (StreamId > a.StreamId) return 1;
- return MyCompare(INode, a.INode);
-}
-
-HRESULT Archive_Get_HardLinkNode(IInArchive *archive, UInt32 index, CHardLinkNode &h, bool &defined)
-{
- h.INode = 0;
- h.StreamId = (UInt64)(Int64)-1;
- defined = false;
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetProperty(index, kpidINode, &prop));
- if (!ConvertPropVariantToUInt64(prop, h.INode))
- return S_OK;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetProperty(index, kpidStreamId, &prop));
- ConvertPropVariantToUInt64(prop, h.StreamId);
- }
- defined = true;
- return S_OK;
-}
-
-
-HRESULT CArchiveExtractCallback::PrepareHardLinks(const CRecordVector<UInt32> *realIndices)
-{
- _hardLinks.Clear();
-
- if (!_arc->Ask_INode)
- return S_OK;
-
- IInArchive *archive = _arc->Archive;
- CRecordVector<CHardLinkNode> &hardIDs = _hardLinks.IDs;
-
- {
- UInt32 numItems;
- if (realIndices)
- numItems = realIndices->Size();
- else
- {
- RINOK(archive->GetNumberOfItems(&numItems));
- }
-
- for (UInt32 i = 0; i < numItems; i++)
- {
- CHardLinkNode h;
- bool defined;
- RINOK(Archive_Get_HardLinkNode(archive, realIndices ? (*realIndices)[i] : i, h, defined));
- if (defined)
- hardIDs.Add(h);
- }
- }
-
- hardIDs.Sort2();
-
- {
- // wee keep only items that have 2 or more items
- unsigned k = 0;
- unsigned numSame = 1;
- for (unsigned i = 1; i < hardIDs.Size(); i++)
- {
- if (hardIDs[i].Compare(hardIDs[i - 1]) != 0)
- numSame = 1;
- else if (++numSame == 2)
- {
- if (i - 1 != k)
- hardIDs[k] = hardIDs[i - 1];
- k++;
- }
- }
- hardIDs.DeleteFrom(k);
- }
-
- _hardLinks.PrepareLinks();
- return S_OK;
-}
-
-#endif
-
-CArchiveExtractCallback::CArchiveExtractCallback():
- WriteCTime(true),
- WriteATime(true),
- WriteMTime(true),
- _multiArchives(false)
-{
- LocalProgressSpec = new CLocalProgress();
- _localProgress = LocalProgressSpec;
-
- #ifdef _USE_SECURITY_CODE
- _saclEnabled = InitLocalPrivileges();
- #endif
-}
-
-void CArchiveExtractCallback::Init(
- const CExtractNtOptions &ntOptions,
- const NWildcard::CCensorNode *wildcardCensor,
- const CArc *arc,
- IFolderArchiveExtractCallback *extractCallback2,
- bool stdOutMode, bool testMode,
- const FString &directoryPath,
- const UStringVector &removePathParts,
- UInt64 packSize)
-{
- _extractedFolderPaths.Clear();
- _extractedFolderIndices.Clear();
-
- #ifdef SUPPORT_LINKS
- _hardLinks.Clear();
- #endif
-
- _ntOptions = ntOptions;
- _wildcardCensor = wildcardCensor;
-
- _stdOutMode = stdOutMode;
- _testMode = testMode;
- _unpTotal = 1;
- _packTotal = packSize;
-
- _extractCallback2 = extractCallback2;
- _compressProgress.Release();
- _extractCallback2.QueryInterface(IID_ICompressProgressInfo, &_compressProgress);
-
- #ifndef _SFX
-
- _extractCallback2.QueryInterface(IID_IFolderExtractToStreamCallback, &ExtractToStreamCallback);
- if (ExtractToStreamCallback)
- {
- Int32 useStreams = 0;
- if (ExtractToStreamCallback->UseExtractToStream(&useStreams) != S_OK)
- useStreams = 0;
- if (useStreams == 0)
- ExtractToStreamCallback.Release();
- }
-
- #endif
-
- LocalProgressSpec->Init(extractCallback2, true);
- LocalProgressSpec->SendProgress = false;
-
- _removePathParts = removePathParts;
- _baseParentFolder = (UInt32)(Int32)-1;
- _use_baseParentFolder_mode = false;
-
- _arc = arc;
- _directoryPath = directoryPath;
- NName::NormalizeDirPathPrefix(_directoryPath);
- NDir::MyGetFullPathName(directoryPath, _directoryPathFull);
-}
-
-STDMETHODIMP CArchiveExtractCallback::SetTotal(UInt64 size)
-{
- COM_TRY_BEGIN
- _unpTotal = size;
- if (!_multiArchives && _extractCallback2)
- return _extractCallback2->SetTotal(size);
- return S_OK;
- COM_TRY_END
-}
-
-static void NormalizeVals(UInt64 &v1, UInt64 &v2)
-{
- const UInt64 kMax = (UInt64)1 << 31;
- while (v1 > kMax)
- {
- v1 >>= 1;
- v2 >>= 1;
- }
-}
-
-static UInt64 MyMultDiv64(UInt64 unpCur, UInt64 unpTotal, UInt64 packTotal)
-{
- NormalizeVals(packTotal, unpTotal);
- NormalizeVals(unpCur, unpTotal);
- if (unpTotal == 0)
- unpTotal = 1;
- return unpCur * packTotal / unpTotal;
-}
-
-STDMETHODIMP CArchiveExtractCallback::SetCompleted(const UInt64 *completeValue)
-{
- COM_TRY_BEGIN
- if (!_extractCallback2)
- return S_OK;
-
- if (_multiArchives)
- {
- if (completeValue != NULL)
- {
- UInt64 packCur = LocalProgressSpec->InSize + MyMultDiv64(*completeValue, _unpTotal, _packTotal);
- return _extractCallback2->SetCompleted(&packCur);
- }
- }
- return _extractCallback2->SetCompleted(completeValue);
- COM_TRY_END
-}
-
-STDMETHODIMP CArchiveExtractCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
-{
- COM_TRY_BEGIN
- return _localProgress->SetRatioInfo(inSize, outSize);
- COM_TRY_END
-}
-
-#define IS_LETTER_CHAR(c) ((c) >= 'a' && (c) <= 'z' || (c) >= 'A' && (c) <= 'Z')
-
-static inline bool IsDriveName(const UString &s)
-{
- return s.Len() == 2 && s[1] == ':' && IS_LETTER_CHAR(s[0]);
-}
-
-void CArchiveExtractCallback::CreateComplexDirectory(const UStringVector &dirPathParts, FString &fullPath)
-{
- bool isAbsPath = false;
-
- if (!dirPathParts.IsEmpty())
- {
- const UString &s = dirPathParts[0];
- if (s.IsEmpty())
- isAbsPath = true;
- #ifdef _WIN32
- else
- {
- if (dirPathParts.Size() > 1 && IsDriveName(s))
- isAbsPath = true;
- }
- #endif
- }
-
- if (_pathMode == NExtract::NPathMode::kAbsPaths && isAbsPath)
- fullPath.Empty();
- else
- fullPath = _directoryPath;
-
- FOR_VECTOR (i, dirPathParts)
- {
- if (i > 0)
- fullPath += FCHAR_PATH_SEPARATOR;
- const UString &s = dirPathParts[i];
- fullPath += us2fs(s);
- #ifdef _WIN32
- if (_pathMode == NExtract::NPathMode::kAbsPaths)
- if (i == 0 && IsDriveName(s))
- continue;
- #endif
- CreateDir(fullPath);
- }
-}
-
-HRESULT CArchiveExtractCallback::GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined)
-{
- filetimeIsDefined = false;
- NCOM::CPropVariant prop;
- RINOK(_arc->Archive->GetProperty(index, propID, &prop));
- if (prop.vt == VT_FILETIME)
- {
- filetime = prop.filetime;
- filetimeIsDefined = (filetime.dwHighDateTime != 0 || filetime.dwLowDateTime != 0);
- }
- else if (prop.vt != VT_EMPTY)
- return E_FAIL;
- return S_OK;
-}
-
-HRESULT CArchiveExtractCallback::GetUnpackSize()
-{
- return _arc->GetItemSize(_index, _curSize, _curSizeDefined);
-}
-
-HRESULT CArchiveExtractCallback::SendMessageError(const char *message, const FString &path)
-{
- return _extractCallback2->MessageError(
- UString(L"ERROR: ") +
- GetUnicodeString(message) + L": " + fs2us(path));
-}
-
-HRESULT CArchiveExtractCallback::SendMessageError2(const char *message, const FString &path1, const FString &path2)
-{
- return _extractCallback2->MessageError(
- UString(L"ERROR: ") +
- GetUnicodeString(message) + UString(L": ") + fs2us(path1) + UString(L" : ") + fs2us(path2));
-}
-
-#ifndef _SFX
-
-STDMETHODIMP CGetProp::GetProp(PROPID propID, PROPVARIANT *value)
-{
- if (propID == kpidName)
- {
- COM_TRY_BEGIN
- NCOM::CPropVariant prop = Name.Ptr();
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
- }
- return Arc->Archive->GetProperty(IndexInArc, propID, value);
-}
-
-#endif
-
-
-#ifdef SUPPORT_LINKS
-
-static UString GetDirPrefixOf(const UString &src)
-{
- UString s = src;
- if (!s.IsEmpty())
- {
- if (s.Back() == WCHAR_PATH_SEPARATOR)
- s.DeleteBack();
- int pos = s.ReverseFind(WCHAR_PATH_SEPARATOR);
- s.DeleteFrom(pos + 1);
- }
- return s;
-}
-
-static bool IsSafePath(const UString &path)
-{
- UStringVector parts;
- SplitPathToParts(path, parts);
- int level = 0;
- FOR_VECTOR(i, parts)
- {
- const UString &s = parts[i];
- if (s.IsEmpty())
- continue;
- if (s == L".")
- continue;
- if (s == L"..")
- {
- if (level <= 0)
- return false;
- level--;
- }
- else
- level++;
- }
- return level > 0;
-}
-
-#endif
-
-
-STDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode)
-{
- COM_TRY_BEGIN
-
- *outStream = 0;
-
- #ifndef _SFX
- if (_hashStream)
- _hashStreamSpec->ReleaseStream();
- _hashStreamWasUsed = false;
- #endif
-
- _outFileStream.Release();
-
- _encrypted = false;
- _isSplit = false;
- _isAltStream = false;
- _curSize = 0;
- _curSizeDefined = false;
- _index = index;
-
- UString fullPath;
-
- IInArchive *archive = _arc->Archive;
- RINOK(_arc->GetItemPath(index, fullPath));
- RINOK(Archive_IsItem_Folder(archive, index, _fi.IsDir));
-
- _filePath = fullPath;
-
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetProperty(index, kpidPosition, &prop));
- if (prop.vt != VT_EMPTY)
- {
- if (prop.vt != VT_UI8)
- return E_FAIL;
- _position = prop.uhVal.QuadPart;
- _isSplit = true;
- }
- }
-
- #ifdef SUPPORT_LINKS
-
- bool isHardLink = false;
- bool isJunction = false;
- bool isRelative = false;
-
- UString linkPath;
- // RINOK(Archive_GetItemBoolProp(archive, index, kpidIsHardLink, isHardLink));
- // if (isHardLink)
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetProperty(index, kpidHardLink, &prop));
- if (prop.vt == VT_BSTR)
- {
- isHardLink = true;
- linkPath = prop.bstrVal;
- isRelative = false; // TAR: hard links are from root folder of archive
- }
- else if (prop.vt == VT_EMPTY)
- {
- // linkPath.Empty();
- }
- else
- return E_FAIL;
- }
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetProperty(index, kpidSymLink, &prop));
- if (prop.vt == VT_BSTR)
- {
- isHardLink = false;
- linkPath = prop.bstrVal;
- isRelative = true; // TAR: symbolic links are relative
- }
- else if (prop.vt == VT_EMPTY)
- {
- // linkPath.Empty();
- }
- else
- return E_FAIL;
- }
-
- bool isOkReparse = false;
-
- if (linkPath.IsEmpty() && _arc->GetRawProps)
- {
- const void *data;
- UInt32 dataSize;
- UInt32 propType;
- _arc->GetRawProps->GetRawProp(_index, kpidNtReparse, &data, &dataSize, &propType);
- if (dataSize != 0)
- {
- if (propType != NPropDataType::kRaw)
- return E_FAIL;
- UString s;
- CReparseAttr reparse;
- isOkReparse = reparse.Parse((const Byte *)data, dataSize);
- if (isOkReparse)
- {
- isHardLink = false;
- linkPath = reparse.GetPath();
- isJunction = reparse.IsMountPoint();
- isRelative = reparse.IsRelative();
- #ifndef _WIN32
- linkPath.Replace(WCHAR_PATH_SEPARATOR, '/', );
- #endif
- }
- }
- }
-
- if (!linkPath.IsEmpty())
- {
- #ifdef _WIN32
- linkPath.Replace('/', WCHAR_PATH_SEPARATOR);
- #endif
-
- for (;;)
- // while (NName::IsAbsolutePath(linkPath))
- {
- unsigned n = NName::GetRootPrefixSize(linkPath);
- if (n == 0)
- break;
- isRelative = false;
- linkPath.DeleteFrontal(n);
- }
- }
-
- if (!linkPath.IsEmpty() && !isRelative && _removePathParts.Size() != 0)
- {
- UStringVector pathParts;
- SplitPathToParts(linkPath, pathParts);
- bool badPrefix = false;
- FOR_VECTOR (i, _removePathParts)
- {
- if (CompareFileNames(_removePathParts[i], pathParts[i]) != 0)
- {
- badPrefix = true;
- break;
- }
- }
- if (!badPrefix)
- pathParts.DeleteFrontal(_removePathParts.Size());
- linkPath = MakePathNameFromParts(pathParts);
- }
-
- #endif
-
- RINOK(Archive_GetItemBoolProp(archive, index, kpidEncrypted, _encrypted));
-
- RINOK(GetUnpackSize());
-
- RINOK(Archive_IsItem_AltStream(archive, index, _isAltStream));
-
- if (!_ntOptions.AltStreams.Val && _isAltStream)
- return S_OK;
-
- if (_wildcardCensor)
- {
- if (!_wildcardCensor->CheckPath(_isAltStream, fullPath, !_fi.IsDir))
- return S_OK;
- }
-
-
- UStringVector pathParts;
-
- if (_use_baseParentFolder_mode)
- {
- int baseParent = _baseParentFolder;
- if (_pathMode == NExtract::NPathMode::kFullPaths ||
- _pathMode == NExtract::NPathMode::kAbsPaths)
- baseParent = -1;
- RINOK(_arc->GetItemPathToParent(index, baseParent, pathParts));
- if (_pathMode == NExtract::NPathMode::kNoPaths && !pathParts.IsEmpty())
- pathParts.DeleteFrontal(pathParts.Size() - 1);
- }
- else
- {
- SplitPathToParts(fullPath, pathParts);
-
- if (pathParts.IsEmpty())
- return E_FAIL;
- unsigned numRemovePathParts = 0;
-
- switch (_pathMode)
- {
- case NExtract::NPathMode::kCurPaths:
- {
- bool badPrefix = false;
- if (pathParts.Size() <= _removePathParts.Size())
- badPrefix = true;
- else
- {
- FOR_VECTOR (i, _removePathParts)
- {
- if (!_removePathParts[i].IsEqualToNoCase(pathParts[i]))
- {
- badPrefix = true;
- break;
- }
- }
- }
- if (badPrefix)
- {
- if (askExtractMode == NArchive::NExtract::NAskMode::kExtract && !_testMode)
- return E_FAIL;
- }
- else
- numRemovePathParts = _removePathParts.Size();
- break;
- }
- case NExtract::NPathMode::kNoPaths:
- {
- numRemovePathParts = pathParts.Size() - 1;
- break;
- }
- /*
- case NExtract::NPathMode::kFullPaths:
- case NExtract::NPathMode::kAbsPaths:
- break;
- */
- }
-
- pathParts.DeleteFrontal(numRemovePathParts);
- }
-
- #ifndef _SFX
-
- if (ExtractToStreamCallback)
- {
- if (!GetProp)
- {
- GetProp_Spec = new CGetProp;
- GetProp = GetProp_Spec;
- }
- GetProp_Spec->Arc = _arc;
- GetProp_Spec->IndexInArc = index;
- GetProp_Spec->Name = MakePathNameFromParts(pathParts);
-
- return ExtractToStreamCallback->GetStream7(GetProp_Spec->Name, _fi.IsDir, outStream, askExtractMode, GetProp);
- }
-
- #endif
-
- CMyComPtr<ISequentialOutStream> outStreamLoc;
-
-if (askExtractMode == NArchive::NExtract::NAskMode::kExtract && !_testMode)
-{
- if (_stdOutMode)
- {
- outStreamLoc = new CStdOutFileStream;
- }
- else
- {
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetProperty(index, kpidAttrib, &prop));
- if (prop.vt == VT_UI4)
- {
- _fi.Attrib = prop.ulVal;
- _fi.AttribDefined = true;
- }
- else if (prop.vt == VT_EMPTY)
- _fi.AttribDefined = false;
- else
- return E_FAIL;
- }
-
- RINOK(GetTime(index, kpidCTime, _fi.CTime, _fi.CTimeDefined));
- RINOK(GetTime(index, kpidATime, _fi.ATime, _fi.ATimeDefined));
- RINOK(GetTime(index, kpidMTime, _fi.MTime, _fi.MTimeDefined));
-
- bool isAnti = false;
- RINOK(_arc->IsItemAnti(index, isAnti));
-
- bool replace = _isAltStream ?
- _ntOptions.ReplaceColonForAltStream :
- !_ntOptions.WriteToAltStreamIfColon;
-
- if (_pathMode != NExtract::NPathMode::kAbsPaths)
- MakeCorrectPath(_directoryPath.IsEmpty(), pathParts, replace);
- Correct_IfEmptyLastPart(pathParts);
- UString processedPath = MakePathNameFromParts(pathParts);
-
- if (!isAnti)
- {
- if (!_fi.IsDir)
- {
- if (!pathParts.IsEmpty())
- pathParts.DeleteBack();
- }
-
- if (!pathParts.IsEmpty())
- {
- FString fullPathNew;
- CreateComplexDirectory(pathParts, fullPathNew);
- if (_fi.IsDir)
- {
- _extractedFolderPaths.Add(fullPathNew);
- _extractedFolderIndices.Add(index);
- SetDirTime(fullPathNew,
- (WriteCTime && _fi.CTimeDefined) ? &_fi.CTime : NULL,
- (WriteATime && _fi.ATimeDefined) ? &_fi.ATime : NULL,
- (WriteMTime && _fi.MTimeDefined) ? &_fi.MTime : (_arc->MTimeDefined ? &_arc->MTime : NULL));
- }
- }
- }
-
-
- FString fullProcessedPath = us2fs(processedPath);
- if (_pathMode != NExtract::NPathMode::kAbsPaths ||
- !NName::IsAbsolutePath(processedPath))
- fullProcessedPath = _directoryPath + fullProcessedPath;
-
- if (_fi.IsDir)
- {
- _diskFilePath = fullProcessedPath;
- if (isAnti)
- RemoveDir(_diskFilePath);
- #ifdef SUPPORT_LINKS
- if (linkPath.IsEmpty())
- #endif
- return S_OK;
- }
- else if (!_isSplit)
- {
- NFind::CFileInfo fileInfo;
- if (fileInfo.Find(fullProcessedPath))
- {
- switch (_overwriteMode)
- {
- case NExtract::NOverwriteMode::kSkip:
- return S_OK;
- case NExtract::NOverwriteMode::kAsk:
- {
- int slashPos = fullProcessedPath.ReverseFind(FTEXT('/'));
- #ifdef _WIN32
- int slash1Pos = fullProcessedPath.ReverseFind(FTEXT('\\'));
- slashPos = MyMax(slashPos, slash1Pos);
- #endif
- FString realFullProcessedPath = fullProcessedPath.Left(slashPos + 1) + fileInfo.Name;
-
- Int32 overwiteResult;
- RINOK(_extractCallback2->AskOverwrite(
- fs2us(realFullProcessedPath), &fileInfo.MTime, &fileInfo.Size, fullPath,
- _fi.MTimeDefined ? &_fi.MTime : NULL,
- _curSizeDefined ? &_curSize : NULL,
- &overwiteResult))
-
- switch (overwiteResult)
- {
- case NOverwriteAnswer::kCancel: return E_ABORT;
- case NOverwriteAnswer::kNo: return S_OK;
- case NOverwriteAnswer::kNoToAll: _overwriteMode = NExtract::NOverwriteMode::kSkip; return S_OK;
- case NOverwriteAnswer::kYes: break;
- case NOverwriteAnswer::kYesToAll: _overwriteMode = NExtract::NOverwriteMode::kOverwrite; break;
- case NOverwriteAnswer::kAutoRename: _overwriteMode = NExtract::NOverwriteMode::kRename; break;
- default:
- return E_FAIL;
- }
- }
- }
- if (_overwriteMode == NExtract::NOverwriteMode::kRename)
- {
- if (!AutoRenamePath(fullProcessedPath))
- {
- RINOK(SendMessageError(kCantAutoRename, fullProcessedPath));
- return E_FAIL;
- }
- }
- else if (_overwriteMode == NExtract::NOverwriteMode::kRenameExisting)
- {
- FString existPath = fullProcessedPath;
- if (!AutoRenamePath(existPath))
- {
- RINOK(SendMessageError(kCantAutoRename, fullProcessedPath));
- return E_FAIL;
- }
- // MyMoveFile can raname folders. So it's OK to use it folders too
- if (!MyMoveFile(fullProcessedPath, existPath))
- {
- RINOK(SendMessageError(kCantRenameFile, fullProcessedPath));
- return E_FAIL;
- }
- }
- else
- {
- if (fileInfo.IsDir())
- {
- // do we need to delete all files in folder?
- if (!RemoveDir(fullProcessedPath))
- {
- RINOK(SendMessageError(kCantDeleteOutputDir, fullProcessedPath));
- return S_OK;
- }
- }
- else if (!DeleteFileAlways(fullProcessedPath))
- {
- RINOK(SendMessageError(kCantDeleteOutputFile, fullProcessedPath));
- return S_OK;
- // return E_FAIL;
- }
- }
- }
- }
- _diskFilePath = fullProcessedPath;
-
-
- if (!isAnti)
- {
- #ifdef SUPPORT_LINKS
-
- if (!linkPath.IsEmpty())
- {
- #ifndef UNDER_CE
-
- UString relatPath;
- if (isRelative)
- relatPath = GetDirPrefixOf(_filePath);
- relatPath += linkPath;
-
- if (!IsSafePath(relatPath))
- {
- RINOK(SendMessageError("Dangerous link path was ignored", us2fs(relatPath)));
- }
- else
- {
- FString existPath;
- if (isHardLink || !isRelative)
- {
- if (!NName::GetFullPath(_directoryPathFull, us2fs(relatPath), existPath))
- {
- RINOK(SendMessageError("Incorrect path", us2fs(relatPath)));
- }
- }
- else
- {
- existPath = us2fs(linkPath);
- }
-
- if (!existPath.IsEmpty())
- {
- if (isHardLink)
- {
- if (!MyCreateHardLink(fullProcessedPath, existPath))
- {
- RINOK(SendMessageError2("Can not create hard link", fullProcessedPath, existPath));
- // return S_OK;
- }
- }
- else if (_ntOptions.SymLinks.Val)
- {
- // bool isSymLink = true; // = false for junction
- if (_fi.IsDir && !isRelative)
- {
- // if it's before Vista we use Junction Point
- // isJunction = true;
- // convertToAbs = true;
- }
-
- CByteBuffer data;
- if (FillLinkData(data, fs2us(existPath), !isJunction))
- {
- CReparseAttr attr;
- if (!attr.Parse(data, data.Size()))
- {
- return E_FAIL; // "Internal conversion error";
- }
-
- if (!NFile::NIO::SetReparseData(fullProcessedPath, _fi.IsDir, data, (DWORD)data.Size()))
- {
- RINOK(SendMessageError("Can not set reparse data", fullProcessedPath));
- }
- }
- }
- }
- }
-
- #endif
- }
- else
- #endif // SUPPORT_LINKS
- {
- bool needWriteFile = true;
-
- #ifdef SUPPORT_LINKS
- if (!_hardLinks.IDs.IsEmpty())
- {
- CHardLinkNode h;
- bool defined;
- RINOK(Archive_Get_HardLinkNode(archive, index, h, defined));
- if (defined)
- {
- {
- int linkIndex = _hardLinks.IDs.FindInSorted2(h);
- if (linkIndex >= 0)
- {
- FString &hl = _hardLinks.Links[linkIndex];
- if (hl.IsEmpty())
- hl = fullProcessedPath;
- else
- {
- if (!MyCreateHardLink(fullProcessedPath, hl))
- {
- RINOK(SendMessageError2("Can not create hard link", fullProcessedPath, hl));
- return S_OK;
- }
- needWriteFile = false;
- }
- }
- }
- }
- }
- #endif
-
- if (needWriteFile)
- {
- _outFileStreamSpec = new COutFileStream;
- CMyComPtr<ISequentialOutStream> outStreamLoc(_outFileStreamSpec);
- if (!_outFileStreamSpec->Open(fullProcessedPath, _isSplit ? OPEN_ALWAYS: CREATE_ALWAYS))
- {
- // if (::GetLastError() != ERROR_FILE_EXISTS || !isSplit)
- {
- RINOK(SendMessageError("Can not open output file ", fullProcessedPath));
- return S_OK;
- }
- }
- if (_isSplit)
- {
- RINOK(_outFileStreamSpec->Seek(_position, STREAM_SEEK_SET, NULL));
- }
- _outFileStream = outStreamLoc;
- }
- }
- }
-
- outStreamLoc = _outFileStream;
- }
-}
-
- #ifndef _SFX
-
- if (_hashStream)
- {
- if (askExtractMode == NArchive::NExtract::NAskMode::kExtract ||
- askExtractMode == NArchive::NExtract::NAskMode::kTest)
- {
- _hashStreamSpec->SetStream(outStreamLoc);
- outStreamLoc = _hashStream;
- _hashStreamSpec->Init(true);
- _hashStreamWasUsed = true;
- }
- }
-
- #endif
-
- if (outStreamLoc)
- *outStream = outStreamLoc.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CArchiveExtractCallback::PrepareOperation(Int32 askExtractMode)
-{
- COM_TRY_BEGIN
-
- #ifndef _SFX
- if (ExtractToStreamCallback)
- return ExtractToStreamCallback->PrepareOperation7(askExtractMode);
- #endif
-
- _extractMode = false;
- switch (askExtractMode)
- {
- case NArchive::NExtract::NAskMode::kExtract:
- if (_testMode)
- askExtractMode = NArchive::NExtract::NAskMode::kTest;
- else
- _extractMode = true;
- break;
- };
- return _extractCallback2->PrepareOperation(_filePath, _fi.IsDir,
- askExtractMode, _isSplit ? &_position: 0);
- COM_TRY_END
-}
-
-STDMETHODIMP CArchiveExtractCallback::SetOperationResult(Int32 operationResult)
-{
- COM_TRY_BEGIN
-
- #ifndef _SFX
- if (ExtractToStreamCallback)
- return ExtractToStreamCallback->SetOperationResult7(operationResult, _encrypted);
- #endif
-
- #ifndef _SFX
-
- if (_hashStreamWasUsed)
- {
- _hashStreamSpec->_hash->Final(_fi.IsDir, _isAltStream, _filePath);
- _curSize = _hashStreamSpec->GetSize();
- _curSizeDefined = true;
- _hashStreamSpec->ReleaseStream();
- _hashStreamWasUsed = false;
- }
-
- #endif
-
- if (_outFileStream)
- {
- _outFileStreamSpec->SetTime(
- (WriteCTime && _fi.CTimeDefined) ? &_fi.CTime : NULL,
- (WriteATime && _fi.ATimeDefined) ? &_fi.ATime : NULL,
- (WriteMTime && _fi.MTimeDefined) ? &_fi.MTime : (_arc->MTimeDefined ? &_arc->MTime : NULL));
- _curSize = _outFileStreamSpec->ProcessedSize;
- _curSizeDefined = true;
- RINOK(_outFileStreamSpec->Close());
- _outFileStream.Release();
- }
-
- #ifdef _USE_SECURITY_CODE
- if (_ntOptions.NtSecurity.Val && _arc->GetRawProps)
- {
- const void *data;
- UInt32 dataSize;
- UInt32 propType;
- _arc->GetRawProps->GetRawProp(_index, kpidNtSecure, &data, &dataSize, &propType);
- if (dataSize != 0)
- {
- if (propType != NPropDataType::kRaw)
- return E_FAIL;
- if (CheckNtSecure((const Byte *)data, dataSize))
- {
- SECURITY_INFORMATION securInfo = DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION;
- if (_saclEnabled)
- securInfo |= SACL_SECURITY_INFORMATION;
- ::SetFileSecurityW(fs2us(_diskFilePath), securInfo, (PSECURITY_DESCRIPTOR)(void *)data);
- }
- }
- }
- #endif
-
- if (!_curSizeDefined)
- GetUnpackSize();
- if (_curSizeDefined)
- {
- if (_isAltStream)
- AltStreams_UnpackSize += _curSize;
- else
- UnpackSize += _curSize;
- }
-
- if (_fi.IsDir)
- NumFolders++;
- else if (_isAltStream)
- NumAltStreams++;
- else
- NumFiles++;
-
- if (_extractMode && _fi.AttribDefined)
- SetFileAttrib(_diskFilePath, _fi.Attrib);
- RINOK(_extractCallback2->SetOperationResult(operationResult, _encrypted));
- return S_OK;
- COM_TRY_END
-}
-
-/*
-STDMETHODIMP CArchiveExtractCallback::GetInStream(
- const wchar_t *name, ISequentialInStream **inStream)
-{
- COM_TRY_BEGIN
- CInFileStream *inFile = new CInFileStream;
- CMyComPtr<ISequentialInStream> inStreamTemp = inFile;
- if (!inFile->Open(_srcDirectoryPrefix + name))
- return ::GetLastError();
- *inStream = inStreamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-*/
-
-STDMETHODIMP CArchiveExtractCallback::CryptoGetTextPassword(BSTR *password)
-{
- COM_TRY_BEGIN
- if (!_cryptoGetTextPassword)
- {
- RINOK(_extractCallback2.QueryInterface(IID_ICryptoGetTextPassword,
- &_cryptoGetTextPassword));
- }
- return _cryptoGetTextPassword->CryptoGetTextPassword(password);
- COM_TRY_END
-}
-
-
-struct CExtrRefSortPair
-{
- int Len;
- int Index;
-
- int Compare(const CExtrRefSortPair &a) const;
-};
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-int CExtrRefSortPair::Compare(const CExtrRefSortPair &a) const
-{
- RINOZ(-MyCompare(Len, a.Len));
- return MyCompare(Index, a.Index);
-}
-
-static int GetNumSlashes(const FChar *s)
-{
- for (int numSlashes = 0;;)
- {
- FChar c = *s++;
- if (c == 0)
- return numSlashes;
- if (
- #ifdef _WIN32
- c == FTEXT('\\') ||
- #endif
- c == FTEXT('/'))
- numSlashes++;
- }
-}
-
-HRESULT CArchiveExtractCallback::SetDirsTimes()
-{
- CRecordVector<CExtrRefSortPair> pairs;
- pairs.ClearAndSetSize(_extractedFolderPaths.Size());
- unsigned i;
-
- for (i = 0; i < _extractedFolderPaths.Size(); i++)
- {
- CExtrRefSortPair &pair = pairs[i];
- pair.Index = i;
- pair.Len = GetNumSlashes(_extractedFolderPaths[i]);
- }
-
- pairs.Sort2();
-
- for (i = 0; i < pairs.Size(); i++)
- {
- int pairIndex = pairs[i].Index;
- int index = _extractedFolderIndices[pairIndex];
-
- FILETIME CTime;
- FILETIME ATime;
- FILETIME MTime;
-
- bool CTimeDefined;
- bool ATimeDefined;
- bool MTimeDefined;
-
- RINOK(GetTime(index, kpidCTime, CTime, CTimeDefined));
- RINOK(GetTime(index, kpidATime, ATime, ATimeDefined));
- RINOK(GetTime(index, kpidMTime, MTime, MTimeDefined));
-
- // printf("\n%S", _extractedFolderPaths[pairIndex]);
- SetDirTime(_extractedFolderPaths[pairIndex],
- (WriteCTime && CTimeDefined) ? &CTime : NULL,
- (WriteATime && ATimeDefined) ? &ATime : NULL,
- (WriteMTime && MTimeDefined) ? &MTime : (_arc->MTimeDefined ? &_arc->MTime : NULL));
- }
- return S_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveExtractCallback.h b/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveExtractCallback.h
deleted file mode 100644
index fe7ef42bb..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveExtractCallback.h
+++ /dev/null
@@ -1,299 +0,0 @@
-// ArchiveExtractCallback.h
-
-#ifndef __ARCHIVE_EXTRACT_CALLBACK_H
-#define __ARCHIVE_EXTRACT_CALLBACK_H
-
-#include "../../../Common/MyCom.h"
-#include "../../../Common/Wildcard.h"
-
-#include "../../IPassword.h"
-
-#include "../../Common/FileStreams.h"
-#include "../../Common/ProgressUtils.h"
-
-#include "../../Archive/IArchive.h"
-
-#include "ExtractMode.h"
-#include "IFileExtractCallback.h"
-#include "OpenArchive.h"
-
-#include "HashCalc.h"
-
-#ifndef _SFX
-
-class COutStreamWithHash:
- public ISequentialOutStream,
- public CMyUnknownImp
-{
- CMyComPtr<ISequentialOutStream> _stream;
- UInt64 _size;
- bool _calculate;
-public:
- IHashCalc *_hash;
-
- 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)
- {
- InitCRC();
- _size = 0;
- _calculate = calculate;
- }
- void EnableCalc(bool calculate) { _calculate = calculate; }
- void InitCRC() { _hash->InitForNewFile(); }
- UInt64 GetSize() const { return _size; }
-};
-
-#endif
-
-struct CExtractNtOptions
-{
- CBoolPair NtSecurity;
- CBoolPair SymLinks;
- CBoolPair HardLinks;
- CBoolPair AltStreams;
- bool ReplaceColonForAltStream;
- bool WriteToAltStreamIfColon;
-
- CExtractNtOptions():
- ReplaceColonForAltStream(false),
- WriteToAltStreamIfColon(false)
- {
- SymLinks.Val = true;
- HardLinks.Val = true;
- AltStreams.Val = true;
- }
-};
-
-#ifndef _SFX
-
-class CGetProp:
- public IGetProp,
- public CMyUnknownImp
-{
-public:
- const CArc *Arc;
- UInt32 IndexInArc;
- UString Name; // relative path
-
- MY_UNKNOWN_IMP1(IGetProp)
- INTERFACE_IGetProp(;)
-};
-
-#endif
-
-#ifndef _SFX
-#ifndef UNDER_CE
-
-#define SUPPORT_LINKS
-
-#endif
-#endif
-
-
-#ifdef SUPPORT_LINKS
-
-struct CHardLinkNode
-{
- UInt64 StreamId;
- UInt64 INode;
-
- int Compare(const CHardLinkNode &a) const;
-};
-
-class CHardLinks
-{
-public:
- CRecordVector<CHardLinkNode> IDs;
- CObjectVector<FString> Links;
-
- void Clear()
- {
- IDs.Clear();
- Links.Clear();
- }
-
- void PrepareLinks()
- {
- while (Links.Size() < IDs.Size())
- Links.AddNew();
- }
-};
-
-#endif
-
-class CArchiveExtractCallback:
- public IArchiveExtractCallback,
- // public IArchiveVolumeExtractCallback,
- public ICryptoGetTextPassword,
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
- const CArc *_arc;
- CExtractNtOptions _ntOptions;
-
- const NWildcard::CCensorNode *_wildcardCensor;
- CMyComPtr<IFolderArchiveExtractCallback> _extractCallback2;
- CMyComPtr<ICompressProgressInfo> _compressProgress;
- CMyComPtr<ICryptoGetTextPassword> _cryptoGetTextPassword;
- FString _directoryPath;
- FString _directoryPathFull;
- NExtract::NPathMode::EEnum _pathMode;
- NExtract::NOverwriteMode::EEnum _overwriteMode;
-
- #ifndef _SFX
-
- CMyComPtr<IFolderExtractToStreamCallback> ExtractToStreamCallback;
- CGetProp *GetProp_Spec;
- CMyComPtr<IGetProp> GetProp;
-
- #endif
-
- FString _diskFilePath;
- UString _filePath;
- UInt64 _position;
- bool _isSplit;
- bool _isAltStream;
-
- bool _extractMode;
-
- bool WriteCTime;
- bool WriteATime;
- bool WriteMTime;
-
- bool _encrypted;
-
- struct CProcessedFileInfo
- {
- FILETIME CTime;
- FILETIME ATime;
- FILETIME MTime;
- UInt32 Attrib;
-
- bool CTimeDefined;
- bool ATimeDefined;
- bool MTimeDefined;
- bool AttribDefined;
-
- bool IsDir;
- } _fi;
-
- UInt32 _index;
- UInt64 _curSize;
- bool _curSizeDefined;
- COutFileStream *_outFileStreamSpec;
- CMyComPtr<ISequentialOutStream> _outFileStream;
-
- #ifndef _SFX
-
- COutStreamWithHash *_hashStreamSpec;
- CMyComPtr<ISequentialOutStream> _hashStream;
- bool _hashStreamWasUsed;
-
- #endif
-
- UStringVector _removePathParts;
- bool _use_baseParentFolder_mode;
- UInt32 _baseParentFolder;
-
- bool _stdOutMode;
- bool _testMode;
- bool _multiArchives;
-
- CMyComPtr<ICompressProgressInfo> _localProgress;
- UInt64 _packTotal;
- UInt64 _unpTotal;
-
- FStringVector _extractedFolderPaths;
- CRecordVector<UInt32> _extractedFolderIndices;
-
- #if defined(_WIN32) && !defined(UNDER_CE) && !defined(_SFX)
- bool _saclEnabled;
- #endif
-
- void CreateComplexDirectory(const UStringVector &dirPathParts, FString &fullPath);
- HRESULT GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined);
- HRESULT GetUnpackSize();
-
- HRESULT SendMessageError(const char *message, const FString &path);
- HRESULT SendMessageError2(const char *message, const FString &path1, const FString &path2);
-
-public:
-
- CLocalProgress *LocalProgressSpec;
-
- UInt64 NumFolders;
- UInt64 NumFiles;
- UInt64 NumAltStreams;
- UInt64 UnpackSize;
- UInt64 AltStreams_UnpackSize;
-
- MY_UNKNOWN_IMP2(ICryptoGetTextPassword, ICompressProgressInfo)
- // COM_INTERFACE_ENTRY(IArchiveVolumeExtractCallback)
-
- INTERFACE_IArchiveExtractCallback(;)
-
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
-
- // IArchiveVolumeExtractCallback
- // STDMETHOD(GetInStream)(const wchar_t *name, ISequentialInStream **inStream);
-
- STDMETHOD(CryptoGetTextPassword)(BSTR *password);
-
- CArchiveExtractCallback();
-
- void InitForMulti(bool multiArchives,
- NExtract::NPathMode::EEnum pathMode,
- NExtract::NOverwriteMode::EEnum overwriteMode)
- {
- _multiArchives = multiArchives;
- _pathMode = pathMode;
- _overwriteMode = overwriteMode;
- NumFolders = NumFiles = NumAltStreams = UnpackSize = AltStreams_UnpackSize = 0;
- }
-
- #ifndef _SFX
-
- void SetHashMethods(IHashCalc *hash)
- {
- if (!hash)
- return;
- _hashStreamSpec = new COutStreamWithHash;
- _hashStream = _hashStreamSpec;
- _hashStreamSpec->_hash = hash;
- }
-
- #endif
-
- void Init(
- const CExtractNtOptions &ntOptions,
- const NWildcard::CCensorNode *wildcardCensor,
- const CArc *arc,
- IFolderArchiveExtractCallback *extractCallback2,
- bool stdOutMode, bool testMode,
- const FString &directoryPath,
- const UStringVector &removePathParts,
- UInt64 packSize);
-
- #ifdef SUPPORT_LINKS
-private:
- CHardLinks _hardLinks;
-public:
- // call PrepareHardLinks() after Init()
- HRESULT PrepareHardLinks(const CRecordVector<UInt32> *realIndices); // NULL means all items
- #endif
-
- // call it after Init()
-
- void SetBaseParentFolderIndex(UInt32 indexInArc)
- {
- _use_baseParentFolder_mode = true;
- _baseParentFolder = indexInArc;
- }
-
- HRESULT SetDirsTimes();
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp
deleted file mode 100644
index 4157aa4f1..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-// ArchiveOpenCallback.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/ComTry.h"
-
-#include "../../../Windows/FileName.h"
-#include "../../../Windows/PropVariant.h"
-
-#include "../../Common/FileStreams.h"
-
-#include "ArchiveOpenCallback.h"
-
-using namespace NWindows;
-
-STDMETHODIMP COpenCallbackImp::SetTotal(const UInt64 *files, const UInt64 *bytes)
-{
- COM_TRY_BEGIN
- if (ReOpenCallback)
- return ReOpenCallback->SetTotal(files, bytes);
- if (!Callback)
- return S_OK;
- return Callback->Open_SetTotal(files, bytes);
- COM_TRY_END
-}
-
-STDMETHODIMP COpenCallbackImp::SetCompleted(const UInt64 *files, const UInt64 *bytes)
-{
- COM_TRY_BEGIN
- if (ReOpenCallback)
- return ReOpenCallback->SetCompleted(files, bytes);
- if (!Callback)
- return S_OK;
- return Callback->Open_SetCompleted(files, bytes);
- COM_TRY_END
-}
-
-STDMETHODIMP COpenCallbackImp::GetProperty(PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- NCOM::CPropVariant prop;
- if (_subArchiveMode)
- switch(propID)
- {
- case kpidName: prop = _subArchiveName; break;
- }
- else
- switch(propID)
- {
- case kpidName: prop = _fileInfo.Name; break;
- case kpidIsDir: prop = _fileInfo.IsDir(); break;
- case kpidSize: prop = _fileInfo.Size; break;
- case kpidAttrib: prop = (UInt32)_fileInfo.Attrib; break;
- case kpidCTime: prop = _fileInfo.CTime; break;
- case kpidATime: prop = _fileInfo.ATime; break;
- case kpidMTime: prop = _fileInfo.MTime; break;
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-struct CInFileStreamVol: public CInFileStream
-{
- int FileNameIndex;
- COpenCallbackImp *OpenCallbackImp;
- CMyComPtr<IArchiveOpenCallback> OpenCallbackRef;
-
- ~CInFileStreamVol()
- {
- if (OpenCallbackRef)
- OpenCallbackImp->FileNames_WasUsed[FileNameIndex] = false;
- }
-};
-
-STDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, IInStream **inStream)
-{
- COM_TRY_BEGIN
- *inStream = NULL;
- if (_subArchiveMode)
- return S_FALSE;
- if (Callback)
- {
- RINOK(Callback->Open_CheckBreak());
- }
- FString fullPath;
- if (!NFile::NName::GetFullPath(_folderPrefix, us2fs(name), fullPath))
- return S_FALSE;
- if (!_fileInfo.Find(fullPath))
- return S_FALSE;
- if (_fileInfo.IsDir())
- return S_FALSE;
- CInFileStreamVol *inFile = new CInFileStreamVol;
- CMyComPtr<IInStream> inStreamTemp = inFile;
- if (!inFile->Open(fullPath))
- return ::GetLastError();
-
- FileSizes.Add(_fileInfo.Size);
- FileNames.Add(name);
- inFile->FileNameIndex = FileNames_WasUsed.Add(true);
- inFile->OpenCallbackImp = this;
- inFile->OpenCallbackRef = this;
- // TotalSize += _fileInfo.Size;
- *inStream = inStreamTemp.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-#ifndef _NO_CRYPTO
-STDMETHODIMP COpenCallbackImp::CryptoGetTextPassword(BSTR *password)
-{
- COM_TRY_BEGIN
- if (ReOpenCallback)
- {
- CMyComPtr<ICryptoGetTextPassword> getTextPassword;
- ReOpenCallback.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword);
- if (getTextPassword)
- return getTextPassword->CryptoGetTextPassword(password);
- }
- if (!Callback)
- return E_NOTIMPL;
- return Callback->Open_CryptoGetTextPassword(password);
- COM_TRY_END
-}
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveOpenCallback.h b/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveOpenCallback.h
deleted file mode 100644
index 3352eadef..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/ArchiveOpenCallback.h
+++ /dev/null
@@ -1,111 +0,0 @@
-// ArchiveOpenCallback.h
-
-#ifndef __ARCHIVE_OPEN_CALLBACK_H
-#define __ARCHIVE_OPEN_CALLBACK_H
-
-#include "../../../Common/MyCom.h"
-
-#include "../../../Windows/FileFind.h"
-
-#ifndef _NO_CRYPTO
-#include "../../IPassword.h"
-#endif
-#include "../../Archive/IArchive.h"
-
-#ifdef _NO_CRYPTO
-
-#define INTERFACE_IOpenCallbackUI_Crypto(x)
-
-#else
-
-#define INTERFACE_IOpenCallbackUI_Crypto(x) \
- virtual HRESULT Open_CryptoGetTextPassword(BSTR *password) x; \
- virtual HRESULT Open_GetPasswordIfAny(bool &passwordIsDefined, UString &password) x; \
- virtual bool Open_WasPasswordAsked() x; \
- virtual void Open_ClearPasswordWasAskedFlag() x; \
-
-#endif
-
-#define INTERFACE_IOpenCallbackUI(x) \
- virtual HRESULT Open_CheckBreak() x; \
- virtual HRESULT Open_SetTotal(const UInt64 *files, const UInt64 *bytes) x; \
- virtual HRESULT Open_SetCompleted(const UInt64 *files, const UInt64 *bytes) x; \
- INTERFACE_IOpenCallbackUI_Crypto(x)
-
-struct IOpenCallbackUI
-{
- INTERFACE_IOpenCallbackUI(=0)
-};
-
-class COpenCallbackImp:
- public IArchiveOpenCallback,
- public IArchiveOpenVolumeCallback,
- public IArchiveOpenSetSubArchiveName,
- #ifndef _NO_CRYPTO
- public ICryptoGetTextPassword,
- #endif
- public CMyUnknownImp
-{
-public:
- #ifndef _NO_CRYPTO
- MY_UNKNOWN_IMP3(
- IArchiveOpenVolumeCallback,
- ICryptoGetTextPassword,
- IArchiveOpenSetSubArchiveName
- )
- #else
- MY_UNKNOWN_IMP2(
- IArchiveOpenVolumeCallback,
- IArchiveOpenSetSubArchiveName
- )
- #endif
-
- INTERFACE_IArchiveOpenCallback(;)
- INTERFACE_IArchiveOpenVolumeCallback(;)
-
- #ifndef _NO_CRYPTO
- STDMETHOD(CryptoGetTextPassword)(BSTR *password);
- #endif
-
- STDMETHOD(SetSubArchiveName(const wchar_t *name))
- {
- _subArchiveMode = true;
- _subArchiveName = name;
- // TotalSize = 0;
- return S_OK;
- }
-
-private:
- FString _folderPrefix;
- NWindows::NFile::NFind::CFileInfo _fileInfo;
- bool _subArchiveMode;
- UString _subArchiveName;
-
-public:
- UStringVector FileNames;
- CBoolVector FileNames_WasUsed;
- CRecordVector<UInt64> FileSizes;
-
- IOpenCallbackUI *Callback;
- CMyComPtr<IArchiveOpenCallback> ReOpenCallback;
- // UInt64 TotalSize;
-
- COpenCallbackImp(): Callback(NULL) {}
- void Init(const FString &folderPrefix, const FString &fileName)
- {
- _folderPrefix = folderPrefix;
- if (!_fileInfo.Find(_folderPrefix + fileName))
- throw 20121118;
- FileNames.Clear();
- FileNames_WasUsed.Clear();
- FileSizes.Clear();
- _subArchiveMode = false;
- // TotalSize = 0;
- }
- bool SetSecondFileInfo(CFSTR newName)
- {
- return _fileInfo.Find(newName) && !_fileInfo.IsDir();
- }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/Common.pri b/src/libs/7zip/win/CPP/7zip/UI/Common/Common.pri
deleted file mode 100644
index 9d829d2af..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/Common.pri
+++ /dev/null
@@ -1,44 +0,0 @@
-HEADERS += $$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveOpenCallback.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveExtractCallback.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveCommandLine.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/DefaultName.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/DirItem.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/EnumDirItems.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/Extract.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/ExtractMode.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/ExtractingFilePath.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/HashCalc.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/IFileExtractCallback.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/LoadCodecs.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/OpenArchive.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/Property.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/PropIDUtils.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/SetProperties.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/SortUtils.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/StdAfx.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/TempFiles.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/Update.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/UpdateAction.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/UpdateCallback.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/UpdatePair.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/UpdateProduce.h
-
-SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp \
- $$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp \
- $$7ZIP_BASE/CPP/7zip/UI/Common/ArchiveCommandLine.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/HashCalc.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
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/DefaultName.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/DefaultName.cpp
deleted file mode 100644
index ce0b327b5..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/DefaultName.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-// DefaultName.cpp
-
-#include "StdAfx.h"
-
-#include "DefaultName.h"
-
-static UString GetDefaultName3(const UString &fileName,
- const UString &extension, const UString &addSubExtension)
-{
- int extLength = extension.Len();
- int fileNameLength = fileName.Len();
- if (fileNameLength > extLength + 1)
- {
- int dotPos = fileNameLength - (extLength + 1);
- if (fileName[dotPos] == '.')
- if (extension.IsEqualToNoCase(fileName.Ptr(dotPos + 1)))
- return fileName.Left(dotPos) + addSubExtension;
- }
- int dotPos = fileName.ReverseFind(L'.');
- if (dotPos > 0)
- return fileName.Left(dotPos) + addSubExtension;
-
- if (addSubExtension.IsEmpty())
- return fileName + L"~";
- else
- return fileName + addSubExtension;
-}
-
-UString GetDefaultName2(const UString &fileName,
- const UString &extension, const UString &addSubExtension)
-{
- UString name = GetDefaultName3(fileName, extension, addSubExtension);
- name.TrimRight();
- return name;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/DefaultName.h b/src/libs/7zip/win/CPP/7zip/UI/Common/DefaultName.h
deleted file mode 100644
index df1645602..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/DefaultName.h
+++ /dev/null
@@ -1,11 +0,0 @@
-// DefaultName.h
-
-#ifndef __DEFAULT_NAME_H
-#define __DEFAULT_NAME_H
-
-#include "../../../Common/MyString.h"
-
-UString GetDefaultName2(const UString &fileName,
- const UString &extension, const UString &addSubExtension);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/DirItem.h b/src/libs/7zip/win/CPP/7zip/UI/Common/DirItem.h
deleted file mode 100644
index 82203c03a..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/DirItem.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// DirItem.h
-
-#ifndef __DIR_ITEM_H
-#define __DIR_ITEM_H
-
-#include "../../../Common/MyString.h"
-
-#include "../../../Windows/FileFind.h"
-
-#include "../../Common/UniqBlocks.h"
-
-#include "../../Archive/IArchive.h"
-
-struct CDirItem
-{
- UInt64 Size;
- FILETIME CTime;
- FILETIME ATime;
- FILETIME MTime;
- UString Name;
-
- #if defined(_WIN32) && !defined(UNDER_CE)
- // UString ShortName;
- CByteBuffer ReparseData;
- CByteBuffer ReparseData2; // fixed (reduced) absolute links
-
- bool AreReparseData() const { return ReparseData.Size() != 0 || ReparseData2.Size() != 0; }
- #endif
-
- UInt32 Attrib;
- int PhyParent;
- int LogParent;
- int SecureIndex;
-
- bool IsAltStream;
-
- CDirItem(): PhyParent(-1), LogParent(-1), SecureIndex(-1), IsAltStream(false) {}
- bool IsDir() const { return (Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 ; }
-};
-
-class CDirItems
-{
- UStringVector Prefixes;
- CIntVector PhyParents;
- CIntVector LogParents;
-
- UString GetPrefixesPath(const CIntVector &parents, int index, const UString &name) const;
-
- void EnumerateDir(int phyParent, int logParent, const FString &phyPrefix);
-
-public:
- CObjectVector<CDirItem> Items;
-
- bool SymLinks;
-
- bool ScanAltStreams;
- FStringVector ErrorPaths;
- CRecordVector<DWORD> ErrorCodes;
- UInt64 TotalSize;
-
-
- #ifndef UNDER_CE
- void SetLinkInfo(CDirItem &dirItem, const NWindows::NFile::NFind::CFileInfo &fi,
- const FString &phyPrefix);
- #endif
-
- void AddError(const FString &path, DWORD errorCode)
- {
- ErrorCodes.Add(errorCode);
- ErrorPaths.Add(path);
- }
-
- void AddError(const FString &path)
- {
- AddError(path, ::GetLastError());
- }
-
- #if defined(_WIN32) && !defined(UNDER_CE)
-
- CUniqBlocks SecureBlocks;
- CByteBuffer TempSecureBuf;
- bool _saclEnabled;
- bool ReadSecure;
-
- void AddSecurityItem(const FString &path, int &secureIndex);
-
- #endif
-
- CDirItems();
-
- int GetNumFolders() const { return Prefixes.Size(); }
- UString GetPhyPath(unsigned index) const;
- UString GetLogPath(unsigned index) const;
-
- unsigned AddPrefix(int phyParent, int logParent, const UString &prefix);
- void DeleteLastPrefix();
- void EnumerateItems2(
- const FString &phyPrefix,
- const UString &logPrefix,
- const FStringVector &filePaths,
- FStringVector *requestedPaths);
-
- #if defined(_WIN32) && !defined(UNDER_CE)
- void FillFixedReparse();
- #endif
-
- void ReserveDown();
-};
-
-struct CArcItem
-{
- UInt64 Size;
- FILETIME MTime;
- UString Name;
- bool IsDir;
- bool IsAltStream;
- bool SizeDefined;
- bool MTimeDefined;
- bool Censored;
- UInt32 IndexInServer;
- int TimeType;
-
- CArcItem(): IsDir(false), IsAltStream(false), SizeDefined(false), MTimeDefined(false), Censored(false), TimeType(-1) {}
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/EnumDirItems.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/EnumDirItems.cpp
deleted file mode 100644
index 1e9562a0e..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/EnumDirItems.cpp
+++ /dev/null
@@ -1,757 +0,0 @@
-// EnumDirItems.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/Wildcard.h"
-
-#include "../../../Windows/FileDir.h"
-#include "../../../Windows/FileIO.h"
-#include "../../../Windows/FileName.h"
-
-#if defined(_WIN32) && !defined(UNDER_CE)
-#define _USE_SECURITY_CODE
-#include "../../../Windows/SecurityUtils.h"
-#endif
-
-#include "EnumDirItems.h"
-
-using namespace NWindows;
-using namespace NFile;
-using namespace NName;
-
-void AddDirFileInfo(int phyParent, int logParent, int secureIndex,
- const NFind::CFileInfo &fi, CObjectVector<CDirItem> &dirItems)
-{
- CDirItem di;
- di.Size = fi.Size;
- di.CTime = fi.CTime;
- di.ATime = fi.ATime;
- di.MTime = fi.MTime;
- di.Attrib = fi.Attrib;
- di.IsAltStream = fi.IsAltStream;
- di.PhyParent = phyParent;
- di.LogParent = logParent;
- di.SecureIndex = secureIndex;
- di.Name = fs2us(fi.Name);
- #if defined(_WIN32) && !defined(UNDER_CE)
- // di.ShortName = fs2us(fi.ShortName);
- #endif
- dirItems.Add(di);
-}
-
-UString CDirItems::GetPrefixesPath(const CIntVector &parents, int index, const UString &name) const
-{
- UString path;
- unsigned len = name.Len();
- int i;
- for (i = index; i >= 0; i = parents[i])
- len += Prefixes[i].Len();
- unsigned totalLen = len;
- wchar_t *p = path.GetBuffer(len);
- p[len] = 0;
- len -= name.Len();
- memcpy(p + len, (const wchar_t *)name, name.Len() * sizeof(wchar_t));
- for (i = index; i >= 0; i = parents[i])
- {
- const UString &s = Prefixes[i];
- len -= s.Len();
- memcpy(p + len, (const wchar_t *)s, s.Len() * sizeof(wchar_t));
- }
- path.ReleaseBuffer(totalLen);
- return path;
-}
-
-UString CDirItems::GetPhyPath(unsigned index) const
-{
- const CDirItem &di = Items[index];
- return GetPrefixesPath(PhyParents, di.PhyParent, di.Name);
-}
-
-UString CDirItems::GetLogPath(unsigned index) const
-{
- const CDirItem &di = Items[index];
- return GetPrefixesPath(LogParents, di.LogParent, di.Name);
-}
-
-void CDirItems::ReserveDown()
-{
- Prefixes.ReserveDown();
- PhyParents.ReserveDown();
- LogParents.ReserveDown();
- Items.ReserveDown();
-}
-
-unsigned CDirItems::AddPrefix(int phyParent, int logParent, const UString &prefix)
-{
- PhyParents.Add(phyParent);
- LogParents.Add(logParent);
- return Prefixes.Add(prefix);
-}
-
-void CDirItems::DeleteLastPrefix()
-{
- PhyParents.DeleteBack();
- LogParents.DeleteBack();
- Prefixes.DeleteBack();
-}
-
-bool InitLocalPrivileges();
-
-CDirItems::CDirItems():
- SymLinks(false),
- TotalSize(0)
- #ifdef _USE_SECURITY_CODE
- , ReadSecure(false)
- #endif
-{
- #ifdef _USE_SECURITY_CODE
- _saclEnabled = InitLocalPrivileges();
- #endif
-}
-
-#ifdef _USE_SECURITY_CODE
-
-void CDirItems::AddSecurityItem(const FString &path, int &secureIndex)
-{
- secureIndex = -1;
-
- SECURITY_INFORMATION securInfo =
- DACL_SECURITY_INFORMATION |
- GROUP_SECURITY_INFORMATION |
- OWNER_SECURITY_INFORMATION;
- if (_saclEnabled)
- securInfo |= SACL_SECURITY_INFORMATION;
-
- DWORD errorCode = 0;
- DWORD secureSize;
- BOOL res = ::GetFileSecurityW(fs2us(path), securInfo, (PSECURITY_DESCRIPTOR)(Byte *)TempSecureBuf, (DWORD)TempSecureBuf.Size(), &secureSize);
- if (res)
- {
- if (secureSize == 0)
- return;
- if (secureSize > TempSecureBuf.Size())
- errorCode = ERROR_INVALID_FUNCTION;
- }
- else
- {
- errorCode = GetLastError();
- if (errorCode == ERROR_INSUFFICIENT_BUFFER)
- {
- if (secureSize <= TempSecureBuf.Size())
- errorCode = ERROR_INVALID_FUNCTION;
- else
- {
- TempSecureBuf.Alloc(secureSize);
- res = ::GetFileSecurityW(fs2us(path), securInfo, (PSECURITY_DESCRIPTOR)(Byte *)TempSecureBuf, (DWORD)TempSecureBuf.Size(), &secureSize);
- if (res)
- {
- if (secureSize != TempSecureBuf.Size())
- errorCode = ERROR_INVALID_FUNCTION;;
- }
- else
- errorCode = GetLastError();
- }
- }
- }
- if (res)
- {
- secureIndex = SecureBlocks.AddUniq(TempSecureBuf, secureSize);
- return;
- }
- if (errorCode == 0)
- errorCode = ERROR_INVALID_FUNCTION;
- AddError(path, errorCode);
-}
-
-#endif
-
-void CDirItems::EnumerateDir(int phyParent, int logParent, const FString &phyPrefix)
-{
- NFind::CEnumerator enumerator(phyPrefix + FCHAR_ANY_MASK);
- for (;;)
- {
- NFind::CFileInfo fi;
- bool found;
- if (!enumerator.Next(fi, found))
- {
- AddError(phyPrefix);
- return;
- }
- if (!found)
- break;
-
- int secureIndex = -1;
- #ifdef _USE_SECURITY_CODE
- if (ReadSecure)
- AddSecurityItem(phyPrefix + fi.Name, secureIndex);
- #endif
-
- AddDirFileInfo(phyParent, logParent, secureIndex, fi, Items);
-
- if (fi.IsDir())
- {
- const FString name2 = fi.Name + FCHAR_PATH_SEPARATOR;
- unsigned parent = AddPrefix(phyParent, logParent, fs2us(name2));
- EnumerateDir(parent, parent, phyPrefix + name2);
- }
- }
-}
-
-void CDirItems::EnumerateItems2(
- const FString &phyPrefix,
- const UString &logPrefix,
- const FStringVector &filePaths,
- FStringVector *requestedPaths)
-{
- int phyParent = phyPrefix.IsEmpty() ? -1 : AddPrefix(-1, -1, fs2us(phyPrefix));
- int logParent = logPrefix.IsEmpty() ? -1 : AddPrefix(-1, -1, logPrefix);
-
- FOR_VECTOR (i, filePaths)
- {
- const FString &filePath = filePaths[i];
- NFind::CFileInfo fi;
- const FString phyPath = phyPrefix + filePath;
- if (!fi.Find(phyPath))
- {
- AddError(phyPath);
- continue;
- }
- if (requestedPaths)
- requestedPaths->Add(phyPath);
-
- int delimiter = filePath.ReverseFind(FCHAR_PATH_SEPARATOR);
- FString phyPrefixCur;
- int phyParentCur = phyParent;
- if (delimiter >= 0)
- {
- phyPrefixCur.SetFrom(filePath, delimiter + 1);
- phyParentCur = AddPrefix(phyParent, logParent, fs2us(phyPrefixCur));
- }
-
- int secureIndex = -1;
- #ifdef _USE_SECURITY_CODE
- if (ReadSecure)
- AddSecurityItem(phyPath, secureIndex);
- #endif
-
- AddDirFileInfo(phyParentCur, logParent, secureIndex, fi, Items);
-
- if (fi.IsDir())
- {
- const FString name2 = fi.Name + FCHAR_PATH_SEPARATOR;
- unsigned parent = AddPrefix(phyParentCur, logParent, fs2us(name2));
- EnumerateDir(parent, parent, phyPrefix + phyPrefixCur + name2);
- }
- }
- ReserveDown();
-}
-
-
-
-
-
-
-static HRESULT EnumerateDirItems(
- const NWildcard::CCensorNode &curNode,
- int phyParent, int logParent, const FString &phyPrefix,
- const UStringVector &addArchivePrefix,
- CDirItems &dirItems,
- bool enterToSubFolders,
- IEnumDirItemCallback *callback);
-
-static HRESULT EnumerateDirItems_Spec(
- const NWildcard::CCensorNode &curNode,
- int phyParent, int logParent, const FString &curFolderName,
- const FString &phyPrefix,
- const UStringVector &addArchivePrefix,
- CDirItems &dirItems,
- bool enterToSubFolders,
- IEnumDirItemCallback *callback)
-{
- const FString name2 = curFolderName + FCHAR_PATH_SEPARATOR;
- unsigned parent = dirItems.AddPrefix(phyParent, logParent, fs2us(name2));
- unsigned numItems = dirItems.Items.Size();
- HRESULT res = EnumerateDirItems(
- curNode, parent, parent, phyPrefix + name2,
- addArchivePrefix, dirItems, enterToSubFolders, callback);
- if (numItems == dirItems.Items.Size())
- dirItems.DeleteLastPrefix();
- return res;
-}
-
-#ifndef UNDER_CE
-
-static void EnumerateAltStreams(
- const NFind::CFileInfo &fi,
- const NWildcard::CCensorNode &curNode,
- int phyParent, int logParent, const FString &phyPrefix,
- const UStringVector &addArchivePrefix, // prefix from curNode
- CDirItems &dirItems)
-{
- const FString fullPath = phyPrefix + fi.Name;
- NFind::CStreamEnumerator enumerator(fullPath);
- for (;;)
- {
- NFind::CStreamInfo si;
- bool found;
- if (!enumerator.Next(si, found))
- {
- dirItems.AddError(fullPath + FTEXT(":*"), (DWORD)E_FAIL);
- break;
- }
- if (!found)
- break;
- if (si.IsMainStream())
- continue;
- UStringVector addArchivePrefixNew = addArchivePrefix;
- UString reducedName = si.GetReducedName();
- addArchivePrefixNew.Back() += reducedName;
- if (curNode.CheckPathToRoot(false, addArchivePrefixNew, true))
- continue;
- NFind::CFileInfo fi2 = fi;
- fi2.Name += us2fs(reducedName);
- fi2.Size = si.Size;
- fi2.Attrib &= ~FILE_ATTRIBUTE_DIRECTORY;
- fi2.IsAltStream = true;
- AddDirFileInfo(phyParent, logParent, -1, fi2, dirItems.Items);
- dirItems.TotalSize += fi2.Size;
- }
-}
-
-void CDirItems::SetLinkInfo(CDirItem &dirItem, const NFind::CFileInfo &fi,
- const FString &phyPrefix)
-{
- if (!SymLinks || !fi.HasReparsePoint())
- return;
- const FString path = phyPrefix + fi.Name;
- CByteBuffer &buf = dirItem.ReparseData;
- if (NIO::GetReparseData(path, buf))
- {
- CReparseAttr attr;
- if (attr.Parse(buf, buf.Size()))
- return;
- }
- AddError(path);
- buf.Free();
-}
-
-#endif
-
-static HRESULT EnumerateForItem(
- NFind::CFileInfo &fi,
- const NWildcard::CCensorNode &curNode,
- int phyParent, int logParent, const FString &phyPrefix,
- const UStringVector &addArchivePrefix, // prefix from curNode
- CDirItems &dirItems,
- bool enterToSubFolders,
- IEnumDirItemCallback *callback)
-{
- const UString name = fs2us(fi.Name);
- bool enterToSubFolders2 = enterToSubFolders;
- UStringVector addArchivePrefixNew = addArchivePrefix;
- addArchivePrefixNew.Add(name);
- {
- UStringVector addArchivePrefixNewTemp(addArchivePrefixNew);
- if (curNode.CheckPathToRoot(false, addArchivePrefixNewTemp, !fi.IsDir()))
- return S_OK;
- }
- int dirItemIndex = -1;
-
- if (curNode.CheckPathToRoot(true, addArchivePrefixNew, !fi.IsDir()))
- {
- int secureIndex = -1;
- #ifdef _USE_SECURITY_CODE
- if (dirItems.ReadSecure)
- dirItems.AddSecurityItem(phyPrefix + fi.Name, secureIndex);
- #endif
-
- dirItemIndex = dirItems.Items.Size();
- AddDirFileInfo(phyParent, logParent, secureIndex, fi, dirItems.Items);
- dirItems.TotalSize += fi.Size;
- if (fi.IsDir())
- enterToSubFolders2 = true;
- }
-
- #ifndef UNDER_CE
- if (dirItems.ScanAltStreams)
- {
- EnumerateAltStreams(fi, curNode, phyParent, logParent, phyPrefix,
- addArchivePrefixNew, dirItems);
- }
-
- if (dirItemIndex >= 0)
- {
- CDirItem &dirItem = dirItems.Items[dirItemIndex];
- dirItems.SetLinkInfo(dirItem, fi, phyPrefix);
- if (dirItem.ReparseData.Size() != 0)
- return S_OK;
- }
- #endif
-
- if (!fi.IsDir())
- return S_OK;
-
- const NWildcard::CCensorNode *nextNode = 0;
- if (addArchivePrefix.IsEmpty())
- {
- int index = curNode.FindSubNode(name);
- if (index >= 0)
- nextNode = &curNode.SubNodes[index];
- }
- if (!enterToSubFolders2 && nextNode == 0)
- return S_OK;
-
- addArchivePrefixNew = addArchivePrefix;
- if (nextNode == 0)
- {
- nextNode = &curNode;
- addArchivePrefixNew.Add(name);
- }
-
- return EnumerateDirItems_Spec(
- *nextNode, phyParent, logParent, fi.Name, phyPrefix,
- addArchivePrefixNew,
- dirItems,
- enterToSubFolders2, callback);
-}
-
-
-static bool CanUseFsDirect(const NWildcard::CCensorNode &curNode)
-{
- FOR_VECTOR (i, curNode.IncludeItems)
- {
- const NWildcard::CItem &item = curNode.IncludeItems[i];
- if (item.Recursive || item.PathParts.Size() != 1)
- return false;
- const UString &name = item.PathParts.Front();
- if (name.IsEmpty())
- return false;
-
- /* Windows doesn't support file name with wildcard.
- but if another system supports file name with wildcard,
- and wildcard mode is disabled, we can ignore wildcard in name */
- /*
- if (!item.WildcardParsing)
- continue;
- */
- if (DoesNameContainWildcard(name))
- return false;
- }
- return true;
-}
-
-
-static HRESULT EnumerateDirItems(
- const NWildcard::CCensorNode &curNode,
- int phyParent, int logParent, const FString &phyPrefix,
- const UStringVector &addArchivePrefix, // prefix from curNode
- CDirItems &dirItems,
- bool enterToSubFolders,
- IEnumDirItemCallback *callback)
-{
- if (!enterToSubFolders)
- if (curNode.NeedCheckSubDirs())
- enterToSubFolders = true;
- if (callback)
- RINOK(callback->ScanProgress(dirItems.GetNumFolders(), dirItems.Items.Size(), dirItems.TotalSize, fs2us(phyPrefix), true));
-
- // try direct_names case at first
- if (addArchivePrefix.IsEmpty() && !enterToSubFolders)
- {
- if (CanUseFsDirect(curNode))
- {
- // all names are direct (no wildcards)
- // so we don't need file_system's dir enumerator
- CRecordVector<bool> needEnterVector;
- unsigned i;
-
- for (i = 0; i < curNode.IncludeItems.Size(); i++)
- {
- const NWildcard::CItem &item = curNode.IncludeItems[i];
- const UString &name = item.PathParts.Front();
- const FString fullPath = phyPrefix + us2fs(name);
- NFind::CFileInfo fi;
- #ifdef _WIN32
- if (phyPrefix.IsEmpty() && item.IsDriveItem())
- {
- fi.SetAsDir();
- fi.Name = fullPath;
- }
- else
- #endif
- if (!fi.Find(fullPath))
- {
- dirItems.AddError(fullPath);
- continue;
- }
- bool isDir = fi.IsDir();
- if (isDir && !item.ForDir || !isDir && !item.ForFile)
- {
- dirItems.AddError(fullPath, (DWORD)E_FAIL);
- continue;
- }
- {
- UStringVector pathParts;
- pathParts.Add(fs2us(fi.Name));
- if (curNode.CheckPathToRoot(false, pathParts, !isDir))
- continue;
- }
-
- int secureIndex = -1;
- #ifdef _USE_SECURITY_CODE
- if (dirItems.ReadSecure)
- dirItems.AddSecurityItem(fullPath, secureIndex);
- #endif
-
- AddDirFileInfo(phyParent, logParent, secureIndex, fi, dirItems.Items);
-
- #ifndef UNDER_CE
- {
- CDirItem &dirItem = dirItems.Items.Back();
- dirItems.SetLinkInfo(dirItem, fi, phyPrefix);
- if (dirItem.ReparseData.Size() != 0)
- continue;
- }
- #endif
-
- dirItems.TotalSize += fi.Size;
-
- #ifndef UNDER_CE
- if (dirItems.ScanAltStreams)
- {
- UStringVector pathParts;
- pathParts.Add(fs2us(fi.Name));
- EnumerateAltStreams(fi, curNode, phyParent, logParent, phyPrefix,
- pathParts, dirItems);
- }
- #endif
-
- if (!isDir)
- continue;
-
- UStringVector addArchivePrefixNew;
- const NWildcard::CCensorNode *nextNode = 0;
- int index = curNode.FindSubNode(name);
- if (index >= 0)
- {
- for (int t = needEnterVector.Size(); t <= index; t++)
- needEnterVector.Add(true);
- needEnterVector[index] = false;
- nextNode = &curNode.SubNodes[index];
- }
- else
- {
- nextNode = &curNode;
- addArchivePrefixNew.Add(name); // don't change it to fi.Name. It's for shortnames support
- }
-
- RINOK(EnumerateDirItems_Spec(*nextNode, phyParent, logParent, fi.Name, phyPrefix,
- addArchivePrefixNew, dirItems, true, callback));
- }
-
- for (i = 0; i < curNode.SubNodes.Size(); i++)
- {
- if (i < needEnterVector.Size())
- if (!needEnterVector[i])
- continue;
- const NWildcard::CCensorNode &nextNode = curNode.SubNodes[i];
- const FString fullPath = phyPrefix + us2fs(nextNode.Name);
- NFind::CFileInfo fi;
- #ifdef _WIN32
- if (phyPrefix.IsEmpty() && NWildcard::IsDriveColonName(nextNode.Name))
- {
- fi.SetAsDir();
- fi.Name = fullPath;
- }
- else
- #endif
- if (!fi.Find(fullPath))
- {
- if (!nextNode.AreThereIncludeItems())
- continue;
- dirItems.AddError(fullPath);
- continue;
- }
- if (!fi.IsDir())
- {
- dirItems.AddError(fullPath, (DWORD)E_FAIL);
- continue;
- }
-
- RINOK(EnumerateDirItems_Spec(nextNode, phyParent, logParent, fi.Name, phyPrefix,
- UStringVector(), dirItems, false, callback));
- }
-
- return S_OK;
- }
- }
-
- #ifdef _WIN32
- #ifndef UNDER_CE
-
- // scan drives, if wildcard is "*:\"
-
- if (phyPrefix.IsEmpty() && curNode.IncludeItems.Size() > 0)
- {
- unsigned i;
- for (i = 0; i < curNode.IncludeItems.Size(); i++)
- {
- const NWildcard::CItem &item = curNode.IncludeItems[i];
- if (item.PathParts.Size() < 1)
- break;
- const UString &name = item.PathParts.Front();
- if (name.Len() != 2 || name[1] != ':')
- break;
- if (item.PathParts.Size() == 1)
- if (item.ForFile || !item.ForDir)
- break;
- if (NWildcard::IsDriveColonName(name))
- continue;
- if (name[0] != '*' && name[0] != '?')
- break;
- }
- if (i == curNode.IncludeItems.Size())
- {
- FStringVector driveStrings;
- NFind::MyGetLogicalDriveStrings(driveStrings);
- for (i = 0; i < driveStrings.Size(); i++)
- {
- FString driveName = driveStrings[i];
- if (driveName.Len() < 3 || driveName.Back() != '\\')
- return E_FAIL;
- driveName.DeleteBack();
- NFind::CFileInfo fi;
- fi.SetAsDir();
- fi.Name = driveName;
-
- RINOK(EnumerateForItem(fi, curNode, phyParent, logParent, phyPrefix,
- addArchivePrefix, dirItems, enterToSubFolders, callback));
- }
- return S_OK;
- }
- }
-
- #endif
- #endif
-
- NFind::CEnumerator enumerator(phyPrefix + FCHAR_ANY_MASK);
- for (unsigned ttt = 0; ; ttt++)
- {
- NFind::CFileInfo fi;
- bool found;
- if (!enumerator.Next(fi, found))
- {
- dirItems.AddError(phyPrefix);
- break;
- }
- if (!found)
- break;
-
- if (callback && (ttt & 0xFF) == 0xFF)
- RINOK(callback->ScanProgress(dirItems.GetNumFolders(), dirItems.Items.Size(), dirItems.TotalSize, fs2us(phyPrefix), true));
-
- RINOK(EnumerateForItem(fi, curNode, phyParent, logParent, phyPrefix,
- addArchivePrefix, dirItems, enterToSubFolders, callback));
- }
- return S_OK;
-}
-
-HRESULT EnumerateItems(
- const NWildcard::CCensor &censor,
- const NWildcard::ECensorPathMode pathMode,
- const UString &addPathPrefix,
- CDirItems &dirItems,
- IEnumDirItemCallback *callback)
-{
- FOR_VECTOR (i, censor.Pairs)
- {
- const NWildcard::CPair &pair = censor.Pairs[i];
- int phyParent = pair.Prefix.IsEmpty() ? -1 : dirItems.AddPrefix(-1, -1, pair.Prefix);
- int logParent = -1;
-
- if (pathMode == NWildcard::k_AbsPath)
- logParent = phyParent;
- else
- {
- if (!addPathPrefix.IsEmpty())
- logParent = dirItems.AddPrefix(-1, -1, addPathPrefix);
- }
-
- RINOK(EnumerateDirItems(pair.Head, phyParent, logParent, us2fs(pair.Prefix), UStringVector(),
- dirItems,
- false, // enterToSubFolders
- callback));
- }
- dirItems.ReserveDown();
-
- #if defined(_WIN32) && !defined(UNDER_CE)
- dirItems.FillFixedReparse();
- #endif
-
- return S_OK;
-}
-
-#if defined(_WIN32) && !defined(UNDER_CE)
-
-void CDirItems::FillFixedReparse()
-{
- /* imagex/WIM reduces absolute pathes in links (raparse data),
- if we archive non root folder. We do same thing here */
-
- if (!SymLinks)
- return;
-
- FOR_VECTOR(i, Items)
- {
- CDirItem &item = Items[i];
- if (item.ReparseData.Size() == 0)
- continue;
-
- CReparseAttr attr;
- if (!attr.Parse(item.ReparseData, item.ReparseData.Size()))
- continue;
- if (attr.IsRelative())
- continue;
-
- const UString &link = attr.GetPath();
- if (!IsDrivePath(link))
- continue;
- // maybe we need to support networks paths also ?
-
- FString fullPathF;
- if (!NDir::MyGetFullPathName(us2fs(GetPhyPath(i)), fullPathF))
- continue;
- UString fullPath = fs2us(fullPathF);
- const UString logPath = GetLogPath(i);
- if (logPath.Len() >= fullPath.Len())
- continue;
- if (CompareFileNames(logPath, fullPath.RightPtr(logPath.Len())) != 0)
- continue;
-
- const UString prefix = fullPath.Left(fullPath.Len() - logPath.Len());
- if (prefix.Back() != WCHAR_PATH_SEPARATOR)
- continue;
-
- unsigned rootPrefixSize = GetRootPrefixSize(prefix);
- if (rootPrefixSize == 0)
- continue;
- if (rootPrefixSize == prefix.Len())
- continue; // simple case: paths are from root
-
- if (link.Len() <= prefix.Len())
- continue;
-
- if (CompareFileNames(link.Left(prefix.Len()), prefix) != 0)
- continue;
-
- UString newLink = prefix.Left(rootPrefixSize);
- newLink += link.Ptr(prefix.Len());
-
- CByteBuffer data;
- if (!FillLinkData(data, newLink, attr.IsSymLink()))
- continue;
- item.ReparseData2 = data;
- }
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/EnumDirItems.h b/src/libs/7zip/win/CPP/7zip/UI/Common/EnumDirItems.h
deleted file mode 100644
index 803a64e7d..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/EnumDirItems.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// EnumDirItems.h
-
-#ifndef __ENUM_DIR_ITEMS_H
-#define __ENUM_DIR_ITEMS_H
-
-#include "../../../Common/Wildcard.h"
-
-#include "../../../Windows/FileFind.h"
-
-#include "DirItem.h"
-
-void AddDirFileInfo(int phyParent, int logParent, int secureIndex,
- const NWindows::NFile::NFind::CFileInfo &fi, CObjectVector<CDirItem> &dirItems);
-
-struct IEnumDirItemCallback
-{
- virtual HRESULT ScanProgress(UInt64 numFolders, UInt64 numFiles, UInt64 totalSize, const wchar_t *path, bool isDir) = 0;
-};
-
-HRESULT EnumerateItems(
- const NWildcard::CCensor &censor,
- NWildcard::ECensorPathMode pathMode,
- const UString &addPathPrefix,
- CDirItems &dirItems,
- IEnumDirItemCallback *callback);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/Extract.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/Extract.cpp
deleted file mode 100644
index 13d2ad29a..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/Extract.cpp
+++ /dev/null
@@ -1,473 +0,0 @@
-// Extract.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/StringConvert.h"
-
-#include "../../../Windows/FileDir.h"
-#include "../../../Windows/PropVariant.h"
-#include "../../../Windows/PropVariantConv.h"
-
-#include "../Common/ExtractingFilePath.h"
-
-#include "Extract.h"
-#include "SetProperties.h"
-
-using namespace NWindows;
-using namespace NFile;
-using namespace NDir;
-
-static HRESULT DecompressArchive(
- CCodecs *codecs,
- const CArchiveLink &arcLink,
- UInt64 packSize,
- const NWildcard::CCensorNode &wildcardCensor,
- const CExtractOptions &options,
- bool calcCrc,
- IExtractCallbackUI *callback,
- CArchiveExtractCallback *ecs,
- UString &errorMessage,
- UInt64 &stdInProcessed)
-{
- const CArc &arc = arcLink.Arcs.Back();
- stdInProcessed = 0;
- IInArchive *archive = arc.Archive;
- CRecordVector<UInt32> realIndices;
-
- UStringVector removePathParts;
-
- FString outDir = options.OutputDir;
- UString replaceName = arc.DefaultName;
-
- if (arcLink.Arcs.Size() > 1)
- {
- // Most "pe" archives have same name of archive subfile "[0]" or ".rsrc_1".
- // So it extracts different archives to one folder.
- // We will use top level archive name
- const CArc &arc0 = arcLink.Arcs[0];
- if (StringsAreEqualNoCase_Ascii(codecs->Formats[arc0.FormatIndex].Name, "pe"))
- replaceName = arc0.DefaultName;
- }
-
- outDir.Replace(FSTRING_ANY_MASK, us2fs(GetCorrectFsPath(replaceName)));
-
- bool elimIsPossible = false;
- UString elimPrefix; // only pure name without dir delimiter
- FString outDirReduced = outDir;
-
- if (options.ElimDup.Val)
- {
- UString dirPrefix;
- SplitPathToParts_Smart(fs2us(outDir), dirPrefix, elimPrefix);
- if (!elimPrefix.IsEmpty())
- {
- if (IsCharDirLimiter(elimPrefix.Back()))
- elimPrefix.DeleteBack();
- if (!elimPrefix.IsEmpty())
- {
- outDirReduced = us2fs(dirPrefix);
- elimIsPossible = true;
- }
- }
- }
-
- if (!options.StdInMode)
- {
- UInt32 numItems;
- RINOK(archive->GetNumberOfItems(&numItems));
-
- UString filePath;
-
- for (UInt32 i = 0; i < numItems; i++)
- {
- RINOK(arc.GetItemPath(i, filePath));
-
- if (elimIsPossible && options.ElimDup.Val)
- {
- if (!IsPath1PrefixedByPath2(filePath, elimPrefix))
- elimIsPossible = false;
- else
- {
- wchar_t c = filePath[elimPrefix.Len()];
- if (c != 0 && !IsCharDirLimiter(c))
- elimIsPossible = false;
- }
- }
-
- bool isFolder;
- RINOK(Archive_IsItem_Folder(archive, i, isFolder));
- bool isAltStream;
- RINOK(Archive_IsItem_AltStream(archive, i, isAltStream));
- if (!options.NtOptions.AltStreams.Val && isAltStream)
- continue;
- if (!wildcardCensor.CheckPath(isAltStream, filePath, !isFolder))
- continue;
- realIndices.Add(i);
- }
-
- if (realIndices.Size() == 0)
- {
- callback->ThereAreNoFiles();
- return callback->ExtractResult(S_OK);
- }
- }
-
- if (elimIsPossible)
- outDir = outDirReduced;
-
- #ifdef _WIN32
- // GetCorrectFullFsPath doesn't like "..".
- // outDir.TrimRight();
- // outDir = GetCorrectFullFsPath(outDir);
- #endif
-
- if (outDir.IsEmpty())
- outDir = FString(FTEXT(".")) + FString(FSTRING_PATH_SEPARATOR);
- else
- if (!CreateComplexDir(outDir))
- {
- HRESULT res = ::GetLastError();
- if (res == S_OK)
- res = E_FAIL;
- errorMessage = ((UString)L"Can not create output directory ") + fs2us(outDir);
- return res;
- }
-
- ecs->Init(
- options.NtOptions,
- options.StdInMode ? &wildcardCensor : NULL,
- &arc,
- callback,
- options.StdOutMode, options.TestMode,
- outDir,
- removePathParts,
- packSize);
-
-
- #ifdef SUPPORT_LINKS
-
- if (!options.StdInMode &&
- !options.TestMode &&
- options.NtOptions.HardLinks.Val)
- {
- RINOK(ecs->PrepareHardLinks(&realIndices));
- }
-
- #endif
-
-
- HRESULT result;
- Int32 testMode = (options.TestMode && !calcCrc) ? 1: 0;
- if (options.StdInMode)
- {
- result = archive->Extract(NULL, (UInt32)(Int32)-1, testMode, ecs);
- NCOM::CPropVariant prop;
- if (archive->GetArchiveProperty(kpidPhySize, &prop) == S_OK)
- ConvertPropVariantToUInt64(prop, stdInProcessed);
- }
- else
- result = archive->Extract(&realIndices.Front(), realIndices.Size(), testMode, ecs);
- if (result == S_OK && !options.StdInMode)
- result = ecs->SetDirsTimes();
- return callback->ExtractResult(result);
-}
-
-/* v9.31: BUG was fixed:
- Sorted list for file paths was sorted with case insensitive compare function.
- But FindInSorted function did binary search via case sensitive compare function */
-
-int Find_FileName_InSortedVector(const UStringVector &fileName, const UString &name)
-{
- unsigned left = 0, right = fileName.Size();
- while (left != right)
- {
- unsigned mid = (left + right) / 2;
- const UString &midValue = fileName[mid];
- int compare = CompareFileNames(name, midValue);
- if (compare == 0)
- return mid;
- if (compare < 0)
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
-}
-
-HRESULT Extract(
- CCodecs *codecs,
- const CObjectVector<COpenType> &types,
- const CIntVector &excludedFormats,
- UStringVector &arcPaths, UStringVector &arcPathsFull,
- const NWildcard::CCensorNode &wildcardCensor,
- const CExtractOptions &options,
- IOpenCallbackUI *openCallback,
- IExtractCallbackUI *extractCallback,
- #ifndef _SFX
- IHashCalc *hash,
- #endif
- UString &errorMessage,
- CDecompressStat &stat)
-{
- stat.Clear();
- UInt64 totalPackSize = 0;
- CRecordVector<UInt64> arcSizes;
-
- unsigned numArcs = options.StdInMode ? 1 : arcPaths.Size();
-
- unsigned i;
- for (i = 0; i < numArcs; i++)
- {
- NFind::CFileInfo fi;
- fi.Size = 0;
- if (!options.StdInMode)
- {
- const FString &arcPath = us2fs(arcPaths[i]);
- if (!fi.Find(arcPath))
- throw "there is no such archive";
- if (fi.IsDir())
- throw "can't decompress folder";
- }
- arcSizes.Add(fi.Size);
- totalPackSize += fi.Size;
- }
-
- CBoolArr skipArcs(numArcs);
- for (i = 0; i < numArcs; i++)
- skipArcs[i] = false;
-
- CArchiveExtractCallback *ecs = new CArchiveExtractCallback;
- CMyComPtr<IArchiveExtractCallback> ec(ecs);
- bool multi = (numArcs > 1);
- ecs->InitForMulti(multi, options.PathMode, options.OverwriteMode);
- #ifndef _SFX
- ecs->SetHashMethods(hash);
- #endif
-
- if (multi)
- {
- RINOK(extractCallback->SetTotal(totalPackSize));
- }
-
- UInt64 totalPackProcessed = 0;
- bool thereAreNotOpenArcs = false;
-
- for (i = 0; i < numArcs; i++)
- {
- if (skipArcs[i])
- continue;
-
- const UString &arcPath = arcPaths[i];
- NFind::CFileInfo fi;
- if (options.StdInMode)
- {
- fi.Size = 0;
- fi.Attrib = 0;
- }
- else
- {
- if (!fi.Find(us2fs(arcPath)) || fi.IsDir())
- throw "there is no such archive";
- }
-
- #ifndef _NO_CRYPTO
- openCallback->Open_ClearPasswordWasAskedFlag();
- #endif
-
- RINOK(extractCallback->BeforeOpen(arcPath));
- CArchiveLink arcLink;
-
- CObjectVector<COpenType> types2 = types;
- /*
- #ifndef _SFX
- if (types.IsEmpty())
- {
- int pos = arcPath.ReverseFind(L'.');
- if (pos >= 0)
- {
- UString s = arcPath.Ptr(pos + 1);
- int index = codecs->FindFormatForExtension(s);
- if (index >= 0 && s == L"001")
- {
- s = arcPath.Left(pos);
- pos = s.ReverseFind(L'.');
- if (pos >= 0)
- {
- int index2 = codecs->FindFormatForExtension(s.Ptr(pos + 1));
- if (index2 >= 0) // && s.CompareNoCase(L"rar") != 0
- {
- types2.Add(index2);
- types2.Add(index);
- }
- }
- }
- }
- }
- #endif
- */
-
- COpenOptions op;
- #ifndef _SFX
- op.props = &options.Properties;
- #endif
- op.codecs = codecs;
- op.types = &types2;
- op.excludedFormats = &excludedFormats;
- op.stdInMode = options.StdInMode;
- op.stream = NULL;
- op.filePath = arcPath;
- HRESULT result = arcLink.Open2(op, openCallback);
-
- if (result == E_ABORT)
- return result;
-
- bool crypted = false;
- #ifndef _NO_CRYPTO
- crypted = openCallback->Open_WasPasswordAsked();
- #endif
-
- if (arcLink.NonOpen_ErrorInfo.ErrorFormatIndex >= 0)
- result = S_FALSE;
-
- // arcLink.Set_ErrorsText();
- RINOK(extractCallback->OpenResult(arcPath, result, crypted));
-
-
- {
- FOR_VECTOR (r, arcLink.Arcs)
- {
- const CArc &arc = arcLink.Arcs[r];
- const CArcErrorInfo &er = arc.ErrorInfo;
- if (er.IsThereErrorOrWarning())
- {
- RINOK(extractCallback->SetError(r, arc.Path,
- er.GetErrorFlags(), er.ErrorMessage,
- er.GetWarningFlags(), er.WarningMessage));
- }
- }
- }
-
- if (result != S_OK)
- {
- thereAreNotOpenArcs = true;
- if (!options.StdInMode)
- {
- NFind::CFileInfo fi;
- if (fi.Find(us2fs(arcPath)))
- if (!fi.IsDir())
- totalPackProcessed += fi.Size;
- }
- continue;
- }
-
- if (!options.StdInMode)
- {
- // numVolumes += arcLink.VolumePaths.Size();
- // arcLink.VolumesSize;
-
- // totalPackSize -= DeleteUsedFileNamesFromList(arcLink, i + 1, arcPaths, arcPathsFull, &arcSizes);
- // numArcs = arcPaths.Size();
- if (arcLink.VolumePaths.Size() != 0)
- {
- Int64 correctionSize = arcLink.VolumesSize;
- FOR_VECTOR (v, arcLink.VolumePaths)
- {
- int index = Find_FileName_InSortedVector(arcPathsFull, arcLink.VolumePaths[v]);
- if (index >= 0)
- {
- if ((unsigned)index > i)
- {
- skipArcs[index] = true;
- correctionSize -= arcSizes[index];
- }
- }
- }
- if (correctionSize != 0)
- {
- Int64 newPackSize = (Int64)totalPackSize + correctionSize;
- if (newPackSize < 0)
- newPackSize = 0;
- totalPackSize = newPackSize;
- RINOK(extractCallback->SetTotal(totalPackSize));
- }
- }
- }
-
- #ifndef _NO_CRYPTO
- bool passwordIsDefined;
- UString password;
- RINOK(openCallback->Open_GetPasswordIfAny(passwordIsDefined, password));
- if (passwordIsDefined)
- {
- RINOK(extractCallback->SetPassword(password));
- }
- #endif
-
- FOR_VECTOR (k, arcLink.Arcs)
- {
- const CArc &arc = arcLink.Arcs[k];
- const CArcErrorInfo &er = arc.ErrorInfo;
-
- if (er.ErrorFormatIndex >= 0)
- {
- RINOK(extractCallback->OpenTypeWarning(arc.Path,
- codecs->GetFormatNamePtr(arc.FormatIndex),
- codecs->GetFormatNamePtr(er.ErrorFormatIndex)))
- /*
- UString s = L"Can not open the file as [" + codecs->Formats[arc.ErrorFormatIndex].Name + L"] archive\n";
- s += L"The file is open as [" + codecs->Formats[arc.FormatIndex].Name + L"] archive";
- RINOK(extractCallback->MessageError(s));
- */
- }
- {
- const UString &s = er.ErrorMessage;
- if (!s.IsEmpty())
- {
- RINOK(extractCallback->MessageError(s));
- }
- }
- }
-
- CArc &arc = arcLink.Arcs.Back();
- arc.MTimeDefined = (!options.StdInMode && !fi.IsDevice);
- arc.MTime = fi.MTime;
-
- UInt64 packProcessed;
- bool calcCrc =
- #ifndef _SFX
- (hash != NULL);
- #else
- false;
- #endif
-
- RINOK(DecompressArchive(
- codecs,
- arcLink,
- fi.Size + arcLink.VolumesSize,
- wildcardCensor,
- options,
- calcCrc,
- extractCallback, ecs, errorMessage, packProcessed));
- if (!options.StdInMode)
- packProcessed = fi.Size + arcLink.VolumesSize;
- totalPackProcessed += packProcessed;
- ecs->LocalProgressSpec->InSize += packProcessed;
- ecs->LocalProgressSpec->OutSize = ecs->UnpackSize;
- if (!errorMessage.IsEmpty())
- return E_FAIL;
- }
-
- if (multi || thereAreNotOpenArcs)
- {
- RINOK(extractCallback->SetTotal(totalPackSize));
- RINOK(extractCallback->SetCompleted(&totalPackProcessed));
- }
- stat.NumFolders = ecs->NumFolders;
- stat.NumFiles = ecs->NumFiles;
- stat.NumAltStreams = ecs->NumAltStreams;
- stat.UnpackSize = ecs->UnpackSize;
- stat.AltStreams_UnpackSize = ecs->AltStreams_UnpackSize;
- stat.NumArchives = arcPaths.Size();
- stat.PackSize = ecs->LocalProgressSpec->InSize;
- return S_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/Extract.h b/src/libs/7zip/win/CPP/7zip/UI/Common/Extract.h
deleted file mode 100644
index 052b2f7d3..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/Extract.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// Extract.h
-
-#ifndef __EXTRACT_H
-#define __EXTRACT_H
-
-#include "../../../Windows/FileFind.h"
-
-#include "../../Archive/IArchive.h"
-
-#include "ArchiveExtractCallback.h"
-#include "ArchiveOpenCallback.h"
-#include "ExtractMode.h"
-#include "Property.h"
-
-#include "../Common/LoadCodecs.h"
-
-struct CExtractOptionsBase
-{
- CBoolPair ElimDup;
-
- bool PathMode_Force;
- bool OverwriteMode_Force;
- NExtract::NPathMode::EEnum PathMode;
- NExtract::NOverwriteMode::EEnum OverwriteMode;
-
- FString OutputDir;
- CExtractNtOptions NtOptions;
-
- CExtractOptionsBase():
- PathMode_Force(false),
- OverwriteMode_Force(false),
- PathMode(NExtract::NPathMode::kFullPaths),
- OverwriteMode(NExtract::NOverwriteMode::kAsk)
- {}
-};
-
-struct CExtractOptions: public CExtractOptionsBase
-{
- bool StdInMode;
- bool StdOutMode;
- bool YesToAll;
- bool TestMode;
-
- // bool ShowDialog;
- // bool PasswordEnabled;
- // UString Password;
- #ifndef _SFX
- CObjectVector<CProperty> Properties;
- #endif
-
- #ifdef EXTERNAL_CODECS
- CCodecs *Codecs;
- #endif
-
- CExtractOptions():
- TestMode(false),
- StdInMode(false),
- StdOutMode(false),
- YesToAll(false)
- {}
-};
-
-struct CDecompressStat
-{
- UInt64 NumArchives;
- UInt64 UnpackSize;
- UInt64 AltStreams_UnpackSize;
- UInt64 PackSize;
- UInt64 NumFolders;
- UInt64 NumFiles;
- UInt64 NumAltStreams;
-
- void Clear()
- {
- NumArchives = UnpackSize = AltStreams_UnpackSize = PackSize = NumFolders = NumFiles = NumAltStreams = 0;
- }
-};
-
-HRESULT Extract(
- CCodecs *codecs,
- const CObjectVector<COpenType> &types,
- const CIntVector &excludedFormats,
- UStringVector &archivePaths, UStringVector &archivePathsFull,
- const NWildcard::CCensorNode &wildcardCensor,
- const CExtractOptions &options,
- IOpenCallbackUI *openCallback,
- IExtractCallbackUI *extractCallback,
- #ifndef _SFX
- IHashCalc *hash,
- #endif
- UString &errorMessage,
- CDecompressStat &stat);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/ExtractMode.h b/src/libs/7zip/win/CPP/7zip/UI/Common/ExtractMode.h
deleted file mode 100644
index a54376705..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/ExtractMode.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// ExtractMode.h
-
-#ifndef __EXTRACT_MODE_H
-#define __EXTRACT_MODE_H
-
-namespace NExtract {
-
-namespace NPathMode
-{
- enum EEnum
- {
- kFullPaths,
- kCurPaths,
- kNoPaths,
- kAbsPaths
- };
-}
-
-namespace NOverwriteMode
-{
- enum EEnum
- {
- kAsk,
- kOverwrite,
- kSkip,
- kRename,
- kRenameExisting
- };
-}
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/ExtractingFilePath.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/ExtractingFilePath.cpp
deleted file mode 100644
index 852fd5adb..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/ExtractingFilePath.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-// ExtractingFilePath.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/Wildcard.h"
-
-#include "../../../Windows/FileName.h"
-
-#include "ExtractingFilePath.h"
-
-static UString ReplaceIncorrectChars(const UString &s, bool repaceColon)
-{
- #ifdef _WIN32
- UString res;
- bool beforeColon = true;
- {
- for (unsigned i = 0; i < s.Len(); i++)
- {
- wchar_t c = s[i];
- if (beforeColon)
- if (c == '*' || c == '?' || c < 0x20 || c == '<' || c == '>' || c == '|' || c == '"')
- c = '_';
- if (c == ':')
- {
- if (repaceColon)
- c = '_';
- else
- beforeColon = false;
- }
- res += c;
- }
- }
- if (beforeColon)
- {
- for (int i = res.Len() - 1; i >= 0; i--)
- {
- wchar_t c = res[i];
- if (c != '.' && c != ' ')
- break;
- res.ReplaceOneCharAtPos(i, '_');
- }
- }
- return res;
- #else
- return s;
- #endif
-}
-
-#ifdef _WIN32
-
-static const wchar_t *g_ReservedNames[] =
-{
- L"CON", L"PRN", L"AUX", L"NUL"
-};
-
-static bool CheckTail(const UString &name, unsigned len)
-{
- int dotPos = name.Find(L'.');
- if (dotPos < 0)
- dotPos = name.Len();
- UString s = name.Left(dotPos);
- s.TrimRight();
- return s.Len() != len;
-}
-
-static bool CheckNameNum(const UString &name, const wchar_t *reservedName)
-{
- unsigned len = MyStringLen(reservedName);
- if (name.Len() <= len)
- return true;
- if (MyStringCompareNoCase_N(name, reservedName, len) != 0)
- return true;
- wchar_t c = name[len];
- if (c < L'0' || c > L'9')
- return true;
- return CheckTail(name, len + 1);
-}
-
-static bool IsSupportedName(const UString &name)
-{
- for (unsigned i = 0; i < ARRAY_SIZE(g_ReservedNames); i++)
- {
- const wchar_t *reservedName = g_ReservedNames[i];
- unsigned len = MyStringLen(reservedName);
- if (name.Len() < len)
- continue;
- if (MyStringCompareNoCase_N(name, reservedName, len) != 0)
- continue;
- if (!CheckTail(name, len))
- return false;
- }
- if (!CheckNameNum(name, L"COM"))
- return false;
- return CheckNameNum(name, L"LPT");
-}
-
-#endif
-
-static UString GetCorrectFileName(const UString &path, bool repaceColon)
-{
- if (path == L".." || path == L".")
- return UString();
- return ReplaceIncorrectChars(path, repaceColon);
-}
-
-void MakeCorrectPath(bool isPathFromRoot, UStringVector &pathParts, bool replaceAltStreamColon)
-{
- for (unsigned i = 0; i < pathParts.Size();)
- {
- UString &s = pathParts[i];
- #ifdef _WIN32
- bool needReplaceColon = (replaceAltStreamColon || i != pathParts.Size() - 1);
- if (i == 0 && isPathFromRoot && NWindows::NFile::NName::IsDrivePath(s))
- {
- UString s2 = s[0];
- s2 += L'_';
- s2 += GetCorrectFileName(s.Ptr(2), needReplaceColon);
- s = s2;
- }
- else
- s = GetCorrectFileName(s, needReplaceColon);
- #endif
-
- if (s.IsEmpty())
- pathParts.Delete(i);
- else
- {
- #ifdef _WIN32
- if (!IsSupportedName(s))
- s = (UString)L"_" + s;
- #endif
- i++;
- }
- }
-}
-
-UString MakePathNameFromParts(const UStringVector &parts)
-{
- UString result;
- FOR_VECTOR (i, parts)
- {
- if (i != 0)
- result += WCHAR_PATH_SEPARATOR;
- result += parts[i];
- }
- return result;
-}
-
-static const wchar_t *k_EmptyReplaceName = L"[]";
-
-void Correct_IfEmptyLastPart(UStringVector &parts)
-{
- if (parts.IsEmpty())
- parts.Add(k_EmptyReplaceName);
- else
- {
- UString &s = parts.Back();
- if (s.IsEmpty())
- s = k_EmptyReplaceName;
- }
-}
-
-UString GetCorrectFsPath(const UString &path)
-{
- UString res = GetCorrectFileName(path, true);
- #ifdef _WIN32
- if (!IsSupportedName(res))
- res = (UString)L"_" + res;
- #endif
- if (res.IsEmpty())
- res = k_EmptyReplaceName;
- return res;
-}
-
-UString GetCorrectFullFsPath(const UString &path)
-{
- UStringVector parts;
- SplitPathToParts(path, parts);
- FOR_VECTOR (i, parts)
- {
- UString &s = parts[i];
- #ifdef _WIN32
- while (!s.IsEmpty() && (s.Back() == '.' || s.Back() == ' '))
- s.DeleteBack();
- if (!IsSupportedName(s))
- s.InsertAtFront(L'_');
- #endif
- }
- return MakePathNameFromParts(parts);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/ExtractingFilePath.h b/src/libs/7zip/win/CPP/7zip/UI/Common/ExtractingFilePath.h
deleted file mode 100644
index 751248a97..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/ExtractingFilePath.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// ExtractingFilePath.h
-
-#ifndef __EXTRACTING_FILE_PATH_H
-#define __EXTRACTING_FILE_PATH_H
-
-#include "../../../Common/MyString.h"
-
-UString MakePathNameFromParts(const UStringVector &parts);
-
-/* for WIN32:
- if (isRoot == true), and pathParts[0] contains path like "c:name",
- it thinks that "c:" is drive prefix (it's not ":name alt stream) and
- the function changes part to c_name */
-void MakeCorrectPath(bool isPathFromRoot, UStringVector &pathParts, bool replaceAltStreamColon);
-
-UString GetCorrectFsPath(const UString &path);
-UString GetCorrectFullFsPath(const UString &path);
-
-void Correct_IfEmptyLastPart(UStringVector &parts);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/HashCalc.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/HashCalc.cpp
deleted file mode 100644
index 2d13a2af1..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/HashCalc.cpp
+++ /dev/null
@@ -1,361 +0,0 @@
-// HashCalc.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/Alloc.h"
-
-#include "../../../Common/StringToInt.h"
-
-#include "../../Common/FileStreams.h"
-#include "../../Common/StreamUtils.h"
-
-#include "EnumDirItems.h"
-#include "HashCalc.h"
-
-using namespace NWindows;
-
-class CHashMidBuf
-{
- void *_data;
-public:
- CHashMidBuf(): _data(0) {}
- operator void *() { return _data; }
- bool Alloc(size_t size)
- {
- if (_data != 0)
- return false;
- _data = ::MidAlloc(size);
- return _data != 0;
- }
- ~CHashMidBuf() { ::MidFree(_data); }
-};
-
-struct CEnumDirItemCallback_Hash: public IEnumDirItemCallback
-{
- IHashCallbackUI *Callback;
-
- HRESULT ScanProgress(UInt64 numFolders, UInt64 numFiles, UInt64 totalSize, const wchar_t *path, bool isDir)
- {
- return Callback->ScanProgress(numFolders, numFiles, totalSize, path, isDir);
- }
-};
-
-static const wchar_t *k_DefaultHashMethod = L"CRC32";
-
-HRESULT CHashBundle::SetMethods(DECL_EXTERNAL_CODECS_LOC_VARS const UStringVector &hashMethods)
-{
- UStringVector names = hashMethods;
- if (names.IsEmpty())
- names.Add(k_DefaultHashMethod);
-
- CRecordVector<CMethodId> ids;
- CObjectVector<COneMethodInfo> methods;
-
- unsigned i;
- for (i = 0; i < names.Size(); i++)
- {
- COneMethodInfo m;
- RINOK(m.ParseMethodFromString(names[i]));
-
- if (m.MethodName.IsEmpty())
- m.MethodName = k_DefaultHashMethod;
-
- if (m.MethodName == L"*")
- {
- CRecordVector<CMethodId> tempMethods;
- GetHashMethods(EXTERNAL_CODECS_LOC_VARS tempMethods);
- methods.Clear();
- ids.Clear();
- FOR_VECTOR (t, tempMethods)
- {
- int index = ids.AddToUniqueSorted(tempMethods[t]);
- if (ids.Size() != methods.Size())
- methods.Insert(index, m);
- }
- break;
- }
- else
- {
- // m.MethodName.RemoveChar(L'-');
- CMethodId id;
- if (!FindHashMethod(EXTERNAL_CODECS_LOC_VARS m.MethodName, id))
- return E_NOTIMPL;
- int index = ids.AddToUniqueSorted(id);
- if (ids.Size() != methods.Size())
- methods.Insert(index, m);
- }
- }
-
- for (i = 0; i < ids.Size(); i++)
- {
- CMyComPtr<IHasher> hasher;
- UString name;
- RINOK(CreateHasher(EXTERNAL_CODECS_LOC_VARS ids[i], name, hasher));
- if (!hasher)
- throw "Can't create hasher";
- const COneMethodInfo &m = methods[i];
- {
- CMyComPtr<ICompressSetCoderProperties> scp;
- hasher.QueryInterface(IID_ICompressSetCoderProperties, &scp);
- if (scp)
- {
- RINOK(m.SetCoderProps(scp, NULL));
- }
- }
- UInt32 digestSize = hasher->GetDigestSize();
- if (digestSize > k_HashCalc_DigestSize_Max)
- return E_NOTIMPL;
- CHasherState &h = Hashers.AddNew();
- h.Hasher = hasher;
- h.Name = name;
- h.DigestSize = digestSize;
- for (int i = 0; i < k_HashCalc_NumGroups; i++)
- memset(h.Digests[i], 0, digestSize);
- }
- return S_OK;
-}
-
-void CHashBundle::InitForNewFile()
-{
- CurSize = 0;
- FOR_VECTOR (i, Hashers)
- {
- CHasherState &h = Hashers[i];
- h.Hasher->Init();
- memset(h.Digests[k_HashCalc_Index_Current], 0, h.DigestSize);
- }
-}
-
-void CHashBundle::Update(const void *data, UInt32 size)
-{
- CurSize += size;
- FOR_VECTOR (i, Hashers)
- Hashers[i].Hasher->Update(data, size);
-}
-
-void CHashBundle::SetSize(UInt64 size)
-{
- CurSize = size;
-}
-
-static void AddDigests(Byte *dest, const Byte *src, UInt32 size)
-{
- unsigned next = 0;
- for (UInt32 i = 0; i < size; i++)
- {
- next += (unsigned)dest[i] + (unsigned)src[i];
- dest[i] = (Byte)next;
- next >>= 8;
- }
-}
-
-void CHashBundle::Final(bool isDir, bool isAltStream, const UString &path)
-{
- if (isDir)
- NumDirs++;
- else if (isAltStream)
- {
- NumAltStreams++;
- AltStreamsSize += CurSize;
- }
- else
- {
- NumFiles++;
- FilesSize += CurSize;
- }
-
- Byte pre[16];
- memset(pre, 0, sizeof(pre));
- if (isDir)
- pre[0] = 1;
-
- FOR_VECTOR (i, Hashers)
- {
- CHasherState &h = Hashers[i];
- if (!isDir)
- {
- h.Hasher->Final(h.Digests[0]);
- if (!isAltStream)
- AddDigests(h.Digests[k_HashCalc_Index_DataSum], h.Digests[0], h.DigestSize);
- }
-
- h.Hasher->Init();
- h.Hasher->Update(pre, sizeof(pre));
- h.Hasher->Update(h.Digests[0], h.DigestSize);
-
- for (unsigned k = 0; k < path.Len(); k++)
- {
- wchar_t c = path[k];
- Byte temp[2] = { (Byte)(c & 0xFF), (Byte)((c >> 8) & 0xFF) };
- h.Hasher->Update(temp, 2);
- }
-
- Byte tempDigest[k_HashCalc_DigestSize_Max];
- h.Hasher->Final(tempDigest);
- if (!isAltStream)
- AddDigests(h.Digests[k_HashCalc_Index_NamesSum], tempDigest, h.DigestSize);
- AddDigests(h.Digests[k_HashCalc_Index_StreamsSum], tempDigest, h.DigestSize);
- }
-}
-
-
-HRESULT HashCalc(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const NWildcard::CCensor &censor,
- const CHashOptions &options,
- UString &errorInfo,
- IHashCallbackUI *callback)
-{
- CDirItems dirItems;
-
- UInt64 numErrors = 0;
- UInt64 totalBytes = 0;
- if (options.StdInMode)
- {
- CDirItem di;
- di.Size = (UInt64)(Int64)-1;
- di.Attrib = 0;
- di.MTime.dwLowDateTime = 0;
- di.MTime.dwHighDateTime = 0;
- di.CTime = di.ATime = di.MTime;
- dirItems.Items.Add(di);
- }
- else
- {
- CEnumDirItemCallback_Hash enumCallback;
- enumCallback.Callback = callback;
- RINOK(callback->StartScanning());
- dirItems.ScanAltStreams = options.AltStreamsMode;
- HRESULT res = EnumerateItems(censor,
- options.PathMode,
- UString(),
- dirItems, &enumCallback);
- totalBytes = dirItems.TotalSize;
- FOR_VECTOR (i, dirItems.ErrorPaths)
- {
- RINOK(callback->CanNotFindError(fs2us(dirItems.ErrorPaths[i]), dirItems.ErrorCodes[i]));
- }
- numErrors = dirItems.ErrorPaths.Size();
- if (res != S_OK)
- {
- if (res != E_ABORT)
- errorInfo = L"Scanning error";
- return res;
- }
- RINOK(callback->FinishScanning());
- }
-
- unsigned i;
- CHashBundle hb;
- RINOK(hb.SetMethods(EXTERNAL_CODECS_LOC_VARS options.Methods));
- hb.Init();
- hb.NumErrors = numErrors;
-
- if (options.StdInMode)
- {
- RINOK(callback->SetNumFiles(1));
- }
- else
- {
- RINOK(callback->SetTotal(totalBytes));
- }
-
- const UInt32 kBufSize = 1 << 15;
- CHashMidBuf buf;
- if (!buf.Alloc(kBufSize))
- return E_OUTOFMEMORY;
-
- UInt64 completeValue = 0;
-
- RINOK(callback->BeforeFirstFile(hb));
-
- for (i = 0; i < dirItems.Items.Size(); i++)
- {
- CMyComPtr<ISequentialInStream> inStream;
- UString path;
- bool isDir = false;
- bool isAltStream = false;
- if (options.StdInMode)
- {
- inStream = new CStdInFileStream;
- }
- else
- {
- CInFileStream *inStreamSpec = new CInFileStream;
- inStream = inStreamSpec;
- const CDirItem &dirItem = dirItems.Items[i];
- isDir = dirItem.IsDir();
- isAltStream = dirItem.IsAltStream;
- path = dirItems.GetLogPath(i);
- if (!isDir)
- {
- UString phyPath = dirItems.GetPhyPath(i);
- if (!inStreamSpec->OpenShared(us2fs(phyPath), options.OpenShareForWrite))
- {
- HRESULT res = callback->OpenFileError(phyPath, ::GetLastError());
- hb.NumErrors++;
- if (res != S_FALSE)
- return res;
- continue;
- }
- }
- }
- RINOK(callback->GetStream(path, isDir));
- UInt64 fileSize = 0;
-
- hb.InitForNewFile();
- if (!isDir)
- {
- for (UInt32 step = 0;; step++)
- {
- if ((step & 0xFF) == 0)
- RINOK(callback->SetCompleted(&completeValue));
- UInt32 size;
- RINOK(inStream->Read(buf, kBufSize, &size));
- if (size == 0)
- break;
- hb.Update(buf, size);
- fileSize += size;
- completeValue += size;
- }
- }
- hb.Final(isDir, isAltStream, path);
- RINOK(callback->SetOperationResult(fileSize, hb, !isDir));
- RINOK(callback->SetCompleted(&completeValue));
- }
- return callback->AfterLastFile(hb);
-}
-
-
-static inline char GetHex(Byte value)
-{
- return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));
-}
-
-void AddHashHexToString(char *dest, const Byte *data, UInt32 size)
-{
- dest[size * 2] = 0;
- if (!data)
- {
- for (UInt32 i = 0; i < size; i++)
- {
- dest[0] = ' ';
- dest[1] = ' ';
- dest += 2;
- }
- return;
- }
- int step = 2;
- if (size <= 8)
- {
- step = -2;
- dest += size * 2 - 2;
- }
- for (UInt32 i = 0; i < size; i++)
- {
- Byte b = data[i];
- dest[0] = GetHex((Byte)((b >> 4) & 0xF));
- dest[1] = GetHex((Byte)(b & 0xF));
- dest += step;
- }
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/HashCalc.h b/src/libs/7zip/win/CPP/7zip/UI/Common/HashCalc.h
deleted file mode 100644
index 68e2404cc..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/HashCalc.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// HashCalc.h
-
-#ifndef __HASH_CALC_H
-#define __HASH_CALC_H
-
-#include "../../../Common/Wildcard.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/MethodProps.h"
-
-#include "Property.h"
-
-const unsigned k_HashCalc_DigestSize_Max = 64;
-
-const unsigned k_HashCalc_NumGroups = 4;
-
-enum
-{
- k_HashCalc_Index_Current,
- k_HashCalc_Index_DataSum,
- k_HashCalc_Index_NamesSum,
- k_HashCalc_Index_StreamsSum
-};
-
-struct CHasherState
-{
- CMyComPtr<IHasher> Hasher;
- UString Name;
- UInt32 DigestSize;
- Byte Digests[k_HashCalc_NumGroups][k_HashCalc_DigestSize_Max];
-};
-
-struct IHashCalc
-{
- virtual void InitForNewFile() = 0;
- virtual void Update(const void *data, UInt32 size) = 0;
- virtual void SetSize(UInt64 size) = 0;
- virtual void Final(bool isDir, bool isAltStream, const UString &path) = 0;
-};
-
-struct CHashBundle: public IHashCalc
-{
- CObjectVector<CHasherState> Hashers;
-
- UInt64 NumFiles;
- UInt64 NumDirs;
- UInt64 NumAltStreams;
- UInt64 FilesSize;
- UInt64 AltStreamsSize;
- UInt64 NumErrors;
-
- UInt64 CurSize;
-
- HRESULT SetMethods(DECL_EXTERNAL_CODECS_LOC_VARS const UStringVector &methods);
-
- void Init()
- {
- NumFiles = NumDirs = NumAltStreams = FilesSize = AltStreamsSize = NumErrors = 0;
- }
-
- void InitForNewFile();
- void Update(const void *data, UInt32 size);
- void SetSize(UInt64 size);
- void Final(bool isDir, bool isAltStream, const UString &path);
-};
-
-#define INTERFACE_IHashCallbackUI(x) \
- virtual HRESULT StartScanning() x; \
- virtual HRESULT ScanProgress(UInt64 numFolders, UInt64 numFiles, UInt64 totalSize, const wchar_t *path, bool isDir) x; \
- virtual HRESULT CanNotFindError(const wchar_t *name, DWORD systemError) x; \
- virtual HRESULT FinishScanning() x; \
- virtual HRESULT SetNumFiles(UInt64 numFiles) x; \
- virtual HRESULT SetTotal(UInt64 size) x; \
- virtual HRESULT SetCompleted(const UInt64 *completeValue) x; \
- virtual HRESULT CheckBreak() x; \
- virtual HRESULT BeforeFirstFile(const CHashBundle &hb) x; \
- virtual HRESULT GetStream(const wchar_t *name, bool isFolder) x; \
- virtual HRESULT OpenFileError(const wchar_t *name, DWORD systemError) x; \
- virtual HRESULT SetOperationResult(UInt64 fileSize, const CHashBundle &hb, bool showHash) x; \
- virtual HRESULT AfterLastFile(const CHashBundle &hb) x; \
-
-struct IHashCallbackUI
-{
- INTERFACE_IHashCallbackUI(=0)
-};
-
-struct CHashOptions
-{
- UStringVector Methods;
- bool OpenShareForWrite;
- bool StdInMode;
- bool AltStreamsMode;
- NWildcard::ECensorPathMode PathMode;
-
- CHashOptions(): StdInMode(false), OpenShareForWrite(false), AltStreamsMode(false), PathMode(NWildcard::k_RelatPath) {};
-};
-
-HRESULT HashCalc(
- DECL_EXTERNAL_CODECS_LOC_VARS
- const NWildcard::CCensor &censor,
- const CHashOptions &options,
- UString &errorInfo,
- IHashCallbackUI *callback);
-
-void AddHashHexToString(char *dest, const Byte *data, UInt32 size);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/IFileExtractCallback.h b/src/libs/7zip/win/CPP/7zip/UI/Common/IFileExtractCallback.h
deleted file mode 100644
index 7bb852795..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/IFileExtractCallback.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// IFileExtractCallback.h
-
-#ifndef __I_FILE_EXTRACT_CALLBACK_H
-#define __I_FILE_EXTRACT_CALLBACK_H
-
-#include "../../../Common/MyString.h"
-
-#include "../../IDecl.h"
-
-namespace NOverwriteAnswer
-{
- enum EEnum
- {
- kYes,
- kYesToAll,
- kNo,
- kNoToAll,
- kAutoRename,
- kCancel
- };
-}
-
-DECL_INTERFACE_SUB(IFolderArchiveExtractCallback, IProgress, 0x01, 0x07)
-{
-public:
- STDMETHOD(AskOverwrite)(
- const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize,
- const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize,
- Int32 *answer) PURE;
- STDMETHOD(PrepareOperation)(const wchar_t *name, bool isFolder, Int32 askExtractMode, const UInt64 *position) PURE;
- STDMETHOD(MessageError)(const wchar_t *message) PURE;
- STDMETHOD(SetOperationResult)(Int32 operationResult, bool encrypted) PURE;
-};
-
-struct IExtractCallbackUI: IFolderArchiveExtractCallback
-{
- virtual HRESULT BeforeOpen(const wchar_t *name) = 0;
- virtual HRESULT OpenResult(const wchar_t *name, HRESULT result, bool encrypted) = 0;
- virtual HRESULT SetError(int level, const wchar_t *name,
- UInt32 errorFlags, const wchar_t *errors,
- UInt32 warningFlags, const wchar_t *warnings) = 0;
- virtual HRESULT ThereAreNoFiles() = 0;
- virtual HRESULT ExtractResult(HRESULT result) = 0;
- virtual HRESULT OpenTypeWarning(const wchar_t *name, const wchar_t *okType, const wchar_t *errorType) = 0;
-
- #ifndef _NO_CRYPTO
- virtual HRESULT SetPassword(const UString &password) = 0;
- #endif
-};
-
-
-#define INTERFACE_IGetProp(x) \
- STDMETHOD(GetProp)(PROPID propID, PROPVARIANT *value) x; \
-
-DECL_INTERFACE_SUB(IGetProp, IUnknown, 0x01, 0x20)
-{
- INTERFACE_IGetProp(PURE)
-};
-
-#define INTERFACE_IFolderExtractToStreamCallback(x) \
- STDMETHOD(UseExtractToStream)(Int32 *res) x; \
- STDMETHOD(GetStream7)(const wchar_t *name, Int32 isDir, ISequentialOutStream **outStream, Int32 askExtractMode, IGetProp *getProp) x; \
- STDMETHOD(PrepareOperation7)(Int32 askExtractMode) x; \
- STDMETHOD(SetOperationResult7)(Int32 resultEOperationResult, bool encrypted) x; \
-
-DECL_INTERFACE_SUB(IFolderExtractToStreamCallback, IUnknown, 0x01, 0x30)
-{
- INTERFACE_IFolderExtractToStreamCallback(PURE)
-};
-
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/LoadCodecs.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/LoadCodecs.cpp
deleted file mode 100644
index a1d801b04..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/LoadCodecs.cpp
+++ /dev/null
@@ -1,900 +0,0 @@
-// LoadCodecs.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/7zVersion.h"
-
-#include "../../../Common/MyCom.h"
-#include "../../../Common/StringToInt.h"
-#include "../../../Common/StringConvert.h"
-
-#include "../../../Windows/PropVariant.h"
-
-#include "LoadCodecs.h"
-
-using namespace NWindows;
-
-#ifdef NEW_FOLDER_INTERFACE
-#include "../../../Common/StringToInt.h"
-#endif
-
-#include "../../ICoder.h"
-#include "../../Common/RegisterArc.h"
-
-#ifdef EXTERNAL_CODECS
-
-#include "../../../Windows/FileFind.h"
-#include "../../../Windows/DLL.h"
-#ifdef NEW_FOLDER_INTERFACE
-#include "../../../Windows/ResourceString.h"
-static const UINT kIconTypesResId = 100;
-#endif
-
-#ifdef _WIN32
-#include "../../../Windows/FileName.h"
-#include "../../../Windows/Registry.h"
-#endif
-
-using namespace NFile;
-
-#ifdef _WIN32
-extern HINSTANCE g_hInstance;
-#endif
-
-#define kCodecsFolderName FTEXT("Codecs")
-#define kFormatsFolderName FTEXT("Formats")
-static CFSTR kMainDll = FTEXT("7z.dll");
-
-#ifdef _WIN32
-
-static LPCTSTR kRegistryPath = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-zip");
-static LPCWSTR kProgramPathValue = L"Path";
-static LPCWSTR kProgramPath2Value = L"Path"
- #ifdef _WIN64
- L"64";
- #else
- L"32";
- #endif
-
-static bool ReadPathFromRegistry(HKEY baseKey, LPCWSTR value, FString &path)
-{
- NRegistry::CKey key;
- if (key.Open(baseKey, kRegistryPath, KEY_READ) == ERROR_SUCCESS)
- {
- UString pathU;
- if (key.QueryValue(value, pathU) == ERROR_SUCCESS)
- {
- path = us2fs(pathU);
- NName::NormalizeDirPathPrefix(path);
- return NFind::DoesFileExist(path + kMainDll);
- }
- }
- return false;
-}
-
-#endif // _WIN32
-
-#endif // EXTERNAL_CODECS
-
-
-static const unsigned kNumArcsMax = 48;
-static unsigned g_NumArcs = 0;
-static const CArcInfo *g_Arcs[kNumArcsMax];
-
-void RegisterArc(const CArcInfo *arcInfo) throw()
-{
- if (g_NumArcs < kNumArcsMax)
- {
- g_Arcs[g_NumArcs] = arcInfo;
- g_NumArcs++;
- }
-}
-
-static void SplitString(const UString &srcString, UStringVector &destStrings)
-{
- destStrings.Clear();
- UString s;
- unsigned len = srcString.Len();
- if (len == 0)
- return;
- for (unsigned i = 0; i < len; i++)
- {
- wchar_t c = srcString[i];
- if (c == L' ')
- {
- if (!s.IsEmpty())
- {
- destStrings.Add(s);
- s.Empty();
- }
- }
- else
- s += c;
- }
- if (!s.IsEmpty())
- destStrings.Add(s);
-}
-
-int CArcInfoEx::FindExtension(const UString &ext) const
-{
- FOR_VECTOR (i, Exts)
- if (ext.IsEqualToNoCase(Exts[i].Ext))
- return i;
- return -1;
-}
-
-void CArcInfoEx::AddExts(const UString &ext, const UString &addExt)
-{
- UStringVector exts, addExts;
- SplitString(ext, exts);
- SplitString(addExt, addExts);
- FOR_VECTOR (i, exts)
- {
- CArcExtInfo extInfo;
- extInfo.Ext = exts[i];
- if (i < addExts.Size())
- {
- extInfo.AddExt = addExts[i];
- if (extInfo.AddExt == L"*")
- extInfo.AddExt.Empty();
- }
- Exts.Add(extInfo);
- }
-}
-
-#ifndef _SFX
-
-static bool ParseSignatures(const Byte *data, unsigned size, CObjectVector<CByteBuffer> &signatures)
-{
- signatures.Clear();
- while (size > 0)
- {
- unsigned len = *data++;
- size--;
- if (len > size)
- return false;
- signatures.AddNew().CopyFrom(data, len);
- data += len;
- size -= len;
- }
- return true;
-}
-
-#endif // _SFX
-
-#ifdef EXTERNAL_CODECS
-
-static FString GetBaseFolderPrefixFromRegistry()
-{
- FString moduleFolderPrefix = NDLL::GetModuleDirPrefix();
- #ifdef _WIN32
- if (!NFind::DoesFileExist(moduleFolderPrefix + kMainDll) &&
- !NFind::DoesDirExist(moduleFolderPrefix + kCodecsFolderName) &&
- !NFind::DoesDirExist(moduleFolderPrefix + kFormatsFolderName))
- {
- FString path;
- if (ReadPathFromRegistry(HKEY_CURRENT_USER, kProgramPath2Value, path)) return path;
- if (ReadPathFromRegistry(HKEY_LOCAL_MACHINE, kProgramPath2Value, path)) return path;
- if (ReadPathFromRegistry(HKEY_CURRENT_USER, kProgramPathValue, path)) return path;
- if (ReadPathFromRegistry(HKEY_LOCAL_MACHINE, kProgramPathValue, path)) return path;
- }
- #endif
- return moduleFolderPrefix;
-}
-
-static HRESULT GetCoderClass(Func_GetMethodProperty getMethodProperty, UInt32 index,
- PROPID propId, CLSID &clsId, bool &isAssigned)
-{
- NCOM::CPropVariant prop;
- isAssigned = false;
- RINOK(getMethodProperty(index, propId, &prop));
- if (prop.vt == VT_BSTR)
- {
- if (::SysStringByteLen(prop.bstrVal) != sizeof(GUID))
- return E_FAIL;
- isAssigned = true;
- clsId = *(const GUID *)prop.bstrVal;
- }
- else if (prop.vt != VT_EMPTY)
- return E_FAIL;
- return S_OK;
-}
-
-HRESULT CCodecs::LoadCodecs()
-{
- CCodecLib &lib = Libs.Back();
- lib.GetMethodProperty = (Func_GetMethodProperty)lib.Lib.GetProc("GetMethodProperty");
- if (lib.GetMethodProperty)
- {
- UInt32 numMethods = 1;
- Func_GetNumberOfMethods getNumberOfMethodsFunc = (Func_GetNumberOfMethods)lib.Lib.GetProc("GetNumberOfMethods");
- if (getNumberOfMethodsFunc)
- {
- RINOK(getNumberOfMethodsFunc(&numMethods));
- }
- for (UInt32 i = 0; i < numMethods; i++)
- {
- CDllCodecInfo info;
- info.LibIndex = Libs.Size() - 1;
- info.CodecIndex = i;
- RINOK(GetCoderClass(lib.GetMethodProperty, i, NMethodPropID::kEncoder, info.Encoder, info.EncoderIsAssigned));
- RINOK(GetCoderClass(lib.GetMethodProperty, i, NMethodPropID::kDecoder, info.Decoder, info.DecoderIsAssigned));
- Codecs.Add(info);
- }
- }
-
- Func_GetHashers getHashers = (Func_GetHashers)lib.Lib.GetProc("GetHashers");
- if (getHashers)
- {
- RINOK(getHashers(&lib.Hashers));
- if (lib.Hashers)
- {
- UInt32 numMethods = lib.Hashers->GetNumHashers();
- for (UInt32 i = 0; i < numMethods; i++)
- {
- CDllHasherInfo info;
- info.LibIndex = Libs.Size() - 1;
- info.HasherIndex = i;
- Hashers.Add(info);
- }
- }
- }
- return S_OK;
-}
-
-static HRESULT GetProp(
- Func_GetHandlerProperty getProp,
- Func_GetHandlerProperty2 getProp2,
- UInt32 index, PROPID propID, NCOM::CPropVariant &prop)
-{
- if (getProp2)
- return getProp2(index, propID, &prop);;
- return getProp(propID, &prop);
-}
-
-static HRESULT GetProp_Bool(
- Func_GetHandlerProperty getProp,
- Func_GetHandlerProperty2 getProp2,
- UInt32 index, PROPID propID, bool &res)
-{
- res = false;
- NCOM::CPropVariant prop;
- RINOK(GetProp(getProp, getProp2, index, propID, prop));
- if (prop.vt == VT_BOOL)
- res = VARIANT_BOOLToBool(prop.boolVal);
- else if (prop.vt != VT_EMPTY)
- return E_FAIL;
- return S_OK;
-}
-
-static HRESULT GetProp_UInt32(
- Func_GetHandlerProperty getProp,
- Func_GetHandlerProperty2 getProp2,
- UInt32 index, PROPID propID, UInt32 &res, bool &defined)
-{
- res = 0;
- defined = false;
- NCOM::CPropVariant prop;
- RINOK(GetProp(getProp, getProp2, index, propID, prop));
- if (prop.vt == VT_UI4)
- {
- res = prop.ulVal;
- defined = true;
- }
- else if (prop.vt != VT_EMPTY)
- return E_FAIL;
- return S_OK;
-}
-
-static HRESULT GetProp_String(
- Func_GetHandlerProperty getProp,
- Func_GetHandlerProperty2 getProp2,
- UInt32 index, PROPID propID, UString &res)
-{
- res.Empty();
- NCOM::CPropVariant prop;
- RINOK(GetProp(getProp, getProp2, index, propID, prop));
- if (prop.vt == VT_BSTR)
- res = prop.bstrVal;
- else if (prop.vt != VT_EMPTY)
- return E_FAIL;
- return S_OK;
-}
-
-static HRESULT GetProp_RawData(
- Func_GetHandlerProperty getProp,
- Func_GetHandlerProperty2 getProp2,
- UInt32 index, PROPID propID, CByteBuffer &bb)
-{
- bb.Free();
- NCOM::CPropVariant prop;
- RINOK(GetProp(getProp, getProp2, index, propID, prop));
- if (prop.vt == VT_BSTR)
- {
- UINT len = ::SysStringByteLen(prop.bstrVal);
- bb.CopyFrom((const Byte *)prop.bstrVal, len);
- }
- else if (prop.vt != VT_EMPTY)
- return E_FAIL;
- return S_OK;
-}
-
-static const UInt32 kArcFlagsPars[] =
-{
- NArchive::NHandlerPropID::kKeepName, NArcInfoFlags::kKeepName,
- NArchive::NHandlerPropID::kAltStreams, NArcInfoFlags::kAltStreams,
- NArchive::NHandlerPropID::kNtSecure, NArcInfoFlags::kNtSecure
-};
-
-HRESULT CCodecs::LoadFormats()
-{
- const NDLL::CLibrary &lib = Libs.Back().Lib;
-
- Func_GetHandlerProperty getProp = NULL;
- Func_GetHandlerProperty2 getProp2 = (Func_GetHandlerProperty2)lib.GetProc("GetHandlerProperty2");
- Func_GetIsArc getIsArc = (Func_GetIsArc)lib.GetProc("GetIsArc");
-
- UInt32 numFormats = 1;
-
- if (getProp2)
- {
- Func_GetNumberOfFormats getNumberOfFormats = (Func_GetNumberOfFormats)lib.GetProc("GetNumberOfFormats");
- if (getNumberOfFormats)
- {
- RINOK(getNumberOfFormats(&numFormats));
- }
- }
- else
- {
- getProp = (Func_GetHandlerProperty)lib.GetProc("GetHandlerProperty");
- if (!getProp)
- return S_OK;
- }
-
- for (UInt32 i = 0; i < numFormats; i++)
- {
- CArcInfoEx item;
- item.LibIndex = Libs.Size() - 1;
- item.FormatIndex = i;
-
- RINOK(GetProp_String(getProp, getProp2, i, NArchive::NHandlerPropID::kName, item.Name));
-
- {
- NCOM::CPropVariant prop;
- if (GetProp(getProp, getProp2, i, NArchive::NHandlerPropID::kClassID, prop) != S_OK)
- continue;
- if (prop.vt != VT_BSTR)
- continue;
- if (::SysStringByteLen(prop.bstrVal) != sizeof(GUID))
- return E_FAIL;
- item.ClassID = *(const GUID *)prop.bstrVal;
- prop.Clear();
- }
-
- UString ext, addExt;
- RINOK(GetProp_String(getProp, getProp2, i, NArchive::NHandlerPropID::kExtension, ext));
- RINOK(GetProp_String(getProp, getProp2, i, NArchive::NHandlerPropID::kAddExtension, addExt));
- item.AddExts(ext, addExt);
-
- GetProp_Bool(getProp, getProp2, i, NArchive::NHandlerPropID::kUpdate, item.UpdateEnabled);
- bool flags_Defined = false;
- RINOK(GetProp_UInt32(getProp, getProp2, i, NArchive::NHandlerPropID::kFlags, item.Flags, flags_Defined));
- item.NewInterface = flags_Defined;
- if (!flags_Defined) // && item.UpdateEnabled
- {
- // support for DLL version before 9.31:
- for (unsigned j = 0; j < ARRAY_SIZE(kArcFlagsPars); j += 2)
- {
- bool val = false;
- GetProp_Bool(getProp, getProp2, i, kArcFlagsPars[j], val);
- if (val)
- item.Flags |= kArcFlagsPars[j + 1];
- }
- }
-
- CByteBuffer sig;
- RINOK(GetProp_RawData(getProp, getProp2, i, NArchive::NHandlerPropID::kSignature, sig));
- if (sig.Size() != 0)
- item.Signatures.Add(sig);
- else
- {
- RINOK(GetProp_RawData(getProp, getProp2, i, NArchive::NHandlerPropID::kMultiSignature, sig));
- ParseSignatures(sig, (unsigned)sig.Size(), item.Signatures);
- }
-
- bool signatureOffset_Defined;
- RINOK(GetProp_UInt32(getProp, getProp2, i, NArchive::NHandlerPropID::kSignatureOffset, item.SignatureOffset, signatureOffset_Defined));
-
- // bool version_Defined;
- // RINOK(GetProp_UInt32(getProp, getProp2, i, NArchive::NHandlerPropID::kVersion, item.Version, version_Defined));
-
- if (getIsArc)
- getIsArc(i, &item.IsArcFunc);
-
- Formats.Add(item);
- }
- return S_OK;
-}
-
-#ifdef NEW_FOLDER_INTERFACE
-void CCodecIcons::LoadIcons(HMODULE m)
-{
- UString iconTypes;
- MyLoadString(m, kIconTypesResId, iconTypes);
- UStringVector pairs;
- SplitString(iconTypes, pairs);
- FOR_VECTOR (i, pairs)
- {
- const UString &s = pairs[i];
- int pos = s.Find(L':');
- CIconPair iconPair;
- iconPair.IconIndex = -1;
- if (pos < 0)
- pos = s.Len();
- else
- {
- UString num = s.Ptr(pos + 1);
- if (!num.IsEmpty())
- {
- const wchar_t *end;
- iconPair.IconIndex = ConvertStringToUInt32(num, &end);
- if (*end != 0)
- continue;
- }
- }
- iconPair.Ext = s.Left(pos);
- IconPairs.Add(iconPair);
- }
-}
-
-bool CCodecIcons::FindIconIndex(const UString &ext, int &iconIndex) const
-{
- iconIndex = -1;
- FOR_VECTOR (i, IconPairs)
- {
- const CIconPair &pair = IconPairs[i];
- if (ext.IsEqualToNoCase(pair.Ext))
- {
- iconIndex = pair.IconIndex;
- return true;
- }
- }
- return false;
-}
-
-#endif // EXTERNAL_CODECS
-
-#ifdef _7ZIP_LARGE_PAGES
-extern "C"
-{
- extern SIZE_T g_LargePageSize;
-}
-#endif
-
-HRESULT CCodecs::LoadDll(const FString &dllPath, bool needCheckDll)
-{
- if (needCheckDll)
- {
- NDLL::CLibrary library;
- if (!library.LoadEx(dllPath, LOAD_LIBRARY_AS_DATAFILE))
- return S_OK;
- }
- Libs.Add(CCodecLib());
- CCodecLib &lib = Libs.Back();
- lib.Path = dllPath;
- bool used = false;
- HRESULT res = S_OK;
- if (lib.Lib.Load(dllPath))
- {
- #ifdef NEW_FOLDER_INTERFACE
- lib.LoadIcons();
- #endif
-
- #ifdef _7ZIP_LARGE_PAGES
- if (g_LargePageSize != 0)
- {
- Func_SetLargePageMode setLargePageMode = (Func_SetLargePageMode)lib.Lib.GetProc("SetLargePageMode");
- if (setLargePageMode)
- setLargePageMode();
- }
- #endif
-
- if (CaseSensitiveChange)
- {
- Func_SetCaseSensitive setCaseSensitive = (Func_SetCaseSensitive)lib.Lib.GetProc("SetCaseSensitive");
- if (setCaseSensitive)
- setCaseSensitive(CaseSensitive ? 1 : 0);
- }
-
- lib.CreateObject = (Func_CreateObject)lib.Lib.GetProc("CreateObject");
- if (lib.CreateObject)
- {
- unsigned startSize = Codecs.Size() + Hashers.Size();
- res = LoadCodecs();
- used = (startSize != Codecs.Size() + Hashers.Size());
- if (res == S_OK)
- {
- startSize = Formats.Size();
- res = LoadFormats();
- if (startSize != Formats.Size())
- used = true;
- }
- }
- }
- if (!used)
- Libs.DeleteBack();
- return res;
-}
-
-HRESULT CCodecs::LoadDllsFromFolder(const FString &folderPrefix)
-{
- NFile::NFind::CEnumerator enumerator(folderPrefix + FCHAR_ANY_MASK);
- NFile::NFind::CFileInfo fi;
- while (enumerator.Next(fi))
- {
- if (fi.IsDir())
- continue;
- RINOK(LoadDll(folderPrefix + fi.Name, true));
- }
- return S_OK;
-}
-
-#endif
-
-HRESULT CCodecs::Load()
-{
- #ifdef NEW_FOLDER_INTERFACE
- InternalIcons.LoadIcons(g_hInstance);
- #endif
-
- Formats.Clear();
-
- #ifdef EXTERNAL_CODECS
- Codecs.Clear();
- Hashers.Clear();
- #endif
-
- for (UInt32 i = 0; i < g_NumArcs; i++)
- {
- const CArcInfo &arc = *g_Arcs[i];
- CArcInfoEx item;
-
- item.Name.SetFromAscii(arc.Name);
- item.CreateInArchive = arc.CreateInArchive;
- item.IsArcFunc = arc.IsArc;
- item.Flags = arc.Flags;
-
- {
- UString e, ae;
- if (arc.Ext)
- e.SetFromAscii(arc.Ext);
- if (arc.AddExt)
- ae.SetFromAscii(arc.AddExt);
- item.AddExts(e, ae);
- }
-
- #ifndef _SFX
-
- item.CreateOutArchive = arc.CreateOutArchive;
- item.UpdateEnabled = (arc.CreateOutArchive != NULL);
- item.SignatureOffset = arc.SignatureOffset;
- // item.Version = MY_VER_MIX;
- item.NewInterface = true;
-
- if (arc.IsMultiSignature())
- ParseSignatures(arc.Signature, arc.SignatureSize, item.Signatures);
- else
- item.Signatures.AddNew().CopyFrom(arc.Signature, arc.SignatureSize);
-
- #endif
-
- Formats.Add(item);
- }
-
- #ifdef EXTERNAL_CODECS
- const FString baseFolder = GetBaseFolderPrefixFromRegistry();
- RINOK(LoadDll(baseFolder + kMainDll, false));
- RINOK(LoadDllsFromFolder(baseFolder + kCodecsFolderName FSTRING_PATH_SEPARATOR));
- RINOK(LoadDllsFromFolder(baseFolder + kFormatsFolderName FSTRING_PATH_SEPARATOR));
- #endif
-
- return S_OK;
-}
-
-#ifndef _SFX
-
-int CCodecs::FindFormatForArchiveName(const UString &arcPath) const
-{
- int slashPos = arcPath.ReverseFind(WCHAR_PATH_SEPARATOR);
- int dotPos = arcPath.ReverseFind(L'.');
- if (dotPos < 0 || dotPos < slashPos)
- return -1;
- const UString ext = arcPath.Ptr(dotPos + 1);
- if (ext.IsEmpty())
- return -1;
- if (ext.IsEqualToNoCase(L"exe"))
- return -1;
- FOR_VECTOR (i, Formats)
- {
- const CArcInfoEx &arc = Formats[i];
- /*
- if (!arc.UpdateEnabled)
- continue;
- */
- if (arc.FindExtension(ext) >= 0)
- return i;
- }
- return -1;
-}
-
-int CCodecs::FindFormatForExtension(const UString &ext) const
-{
- if (ext.IsEmpty())
- return -1;
- FOR_VECTOR (i, Formats)
- if (Formats[i].FindExtension(ext) >= 0)
- return i;
- return -1;
-}
-
-int CCodecs::FindFormatForArchiveType(const UString &arcType) const
-{
- FOR_VECTOR (i, Formats)
- if (Formats[i].Name.IsEqualToNoCase(arcType))
- return i;
- return -1;
-}
-
-bool CCodecs::FindFormatForArchiveType(const UString &arcType, CIntVector &formatIndices) const
-{
- formatIndices.Clear();
- for (unsigned pos = 0; pos < arcType.Len();)
- {
- int pos2 = arcType.Find('.', pos);
- if (pos2 < 0)
- pos2 = arcType.Len();
- const UString name = arcType.Mid(pos, pos2 - pos);
- if (name.IsEmpty())
- return false;
- int index = FindFormatForArchiveType(name);
- if (index < 0 && name != L"*")
- {
- formatIndices.Clear();
- return false;
- }
- formatIndices.Add(index);
- pos = pos2 + 1;
- }
- return true;
-}
-
-#endif // _SFX
-
-
-#ifdef EXTERNAL_CODECS
-
-// #define EXPORT_CODECS
-
-#ifdef EXPORT_CODECS
-
-extern unsigned g_NumCodecs;
-STDAPI CreateCoder2(bool encode, UInt32 index, const GUID *iid, void **outObject);
-STDAPI GetMethodProperty(UInt32 codecIndex, PROPID propID, PROPVARIANT *value);
-#define NUM_EXPORT_CODECS g_NumCodecs
-
-extern unsigned g_NumHashers;
-STDAPI CreateHasher(UInt32 index, IHasher **hasher);
-STDAPI GetHasherProp(UInt32 codecIndex, PROPID propID, PROPVARIANT *value);
-#define NUM_EXPORT_HASHERS g_NumHashers
-
-#else // EXPORT_CODECS
-
-#define NUM_EXPORT_CODECS 0
-#define NUM_EXPORT_HASHERS 0
-
-#endif // EXPORT_CODECS
-
-STDMETHODIMP CCodecs::GetNumberOfMethods(UInt32 *numMethods)
-{
- *numMethods = NUM_EXPORT_CODECS
- #ifdef EXTERNAL_CODECS
- + Codecs.Size()
- #endif
- ;
- return S_OK;
-}
-
-STDMETHODIMP CCodecs::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- #ifdef EXPORT_CODECS
- if (index < g_NumCodecs)
- return GetMethodProperty(index, propID, value);
- #endif
-
- #ifdef EXTERNAL_CODECS
- const CDllCodecInfo &ci = Codecs[index - NUM_EXPORT_CODECS];
-
- if (propID == NMethodPropID::kDecoderIsAssigned ||
- propID == NMethodPropID::kEncoderIsAssigned)
- {
- NCOM::CPropVariant prop;
- prop = (propID == NMethodPropID::kDecoderIsAssigned) ?
- ci.DecoderIsAssigned :
- ci.EncoderIsAssigned;
- prop.Detach(value);
- return S_OK;
- }
- return Libs[ci.LibIndex].GetMethodProperty(ci.CodecIndex, propID, value);
- #else
- return E_FAIL;
- #endif
-}
-
-STDMETHODIMP CCodecs::CreateDecoder(UInt32 index, const GUID *iid, void **coder)
-{
- #ifdef EXPORT_CODECS
- if (index < g_NumCodecs)
- return CreateCoder2(false, index, iid, coder);
- #endif
- #ifdef EXTERNAL_CODECS
- const CDllCodecInfo &ci = Codecs[index - NUM_EXPORT_CODECS];
- if (ci.DecoderIsAssigned)
- return Libs[ci.LibIndex].CreateObject(&ci.Decoder, iid, (void **)coder);
- return S_OK;
- #else
- return E_FAIL;
- #endif
-}
-
-STDMETHODIMP CCodecs::CreateEncoder(UInt32 index, const GUID *iid, void **coder)
-{
- #ifdef EXPORT_CODECS
- if (index < g_NumCodecs)
- return CreateCoder2(true, index, iid, coder);
- #endif
- #ifdef EXTERNAL_CODECS
- const CDllCodecInfo &ci = Codecs[index - NUM_EXPORT_CODECS];
- if (ci.EncoderIsAssigned)
- return Libs[ci.LibIndex].CreateObject(&ci.Encoder, iid, (void **)coder);
- return S_OK;
- #else
- return E_FAIL;
- #endif
-}
-
-
-STDMETHODIMP_(UInt32) CCodecs::GetNumHashers()
-{
- return NUM_EXPORT_HASHERS
- #ifdef EXTERNAL_CODECS
- + Hashers.Size()
- #endif
- ;
-}
-
-STDMETHODIMP CCodecs::GetHasherProp(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- #ifdef EXPORT_CODECS
- if (index < g_NumHashers)
- return ::GetHasherProp(index, propID, value);
- #endif
-
- #ifdef EXTERNAL_CODECS
- const CDllHasherInfo &ci = Hashers[index - NUM_EXPORT_HASHERS];
- return Libs[ci.LibIndex].Hashers->GetHasherProp(ci.HasherIndex, propID, value);
- #else
- return E_FAIL;
- #endif
-}
-
-STDMETHODIMP CCodecs::CreateHasher(UInt32 index, IHasher **hasher)
-{
- #ifdef EXPORT_CODECS
- if (index < g_NumHashers)
- return CreateHasher(index, hasher);
- #endif
- #ifdef EXTERNAL_CODECS
- const CDllHasherInfo &ci = Hashers[index - NUM_EXPORT_HASHERS];
- return Libs[ci.LibIndex].Hashers->CreateHasher(ci.HasherIndex, hasher);
- #else
- return E_FAIL;
- #endif
-}
-
-int CCodecs::GetCodecLibIndex(UInt32 index)
-{
- #ifdef EXPORT_CODECS
- if (index < g_NumCodecs)
- return -1;
- #endif
- #ifdef EXTERNAL_CODECS
- const CDllCodecInfo &ci = Codecs[index - NUM_EXPORT_CODECS];
- return ci.LibIndex;
- #else
- return -1;
- #endif
-}
-
-int CCodecs::GetHasherLibIndex(UInt32 index)
-{
- #ifdef EXPORT_CODECS
- if (index < g_NumHashers)
- return -1;
- #endif
- #ifdef EXTERNAL_CODECS
- const CDllHasherInfo &ci = Hashers[index - NUM_EXPORT_HASHERS];
- return ci.LibIndex;
- #else
- return -1;
- #endif
-}
-
-bool CCodecs::GetCodecEncoderIsAssigned(UInt32 index)
-{
- #ifdef EXPORT_CODECS
- if (index < g_NumCodecs)
- {
- NCOM::CPropVariant prop;
- if (GetProperty(index, NMethodPropID::kEncoder, &prop) == S_OK)
- if (prop.vt != VT_EMPTY)
- return true;
- return false;
- }
- #endif
- #ifdef EXTERNAL_CODECS
- const CDllCodecInfo &ci = Codecs[index - NUM_EXPORT_CODECS];
- return ci.EncoderIsAssigned;
- #else
- return false;
- #endif
-}
-
-HRESULT CCodecs::GetCodecId(UInt32 index, UInt64 &id)
-{
- NCOM::CPropVariant prop;
- RINOK(GetProperty(index, NMethodPropID::kID, &prop));
- if (prop.vt != VT_UI8)
- return E_INVALIDARG;
- id = prop.uhVal.QuadPart;
- return S_OK;
-}
-
-UString CCodecs::GetCodecName(UInt32 index)
-{
- UString s;
- NCOM::CPropVariant prop;
- if (GetProperty(index, NMethodPropID::kName, &prop) == S_OK)
- if (prop.vt == VT_BSTR)
- s = prop.bstrVal;
- return s;
-}
-
-UInt64 CCodecs::GetHasherId(UInt32 index)
-{
- NCOM::CPropVariant prop;
- RINOK(GetHasherProp(index, NMethodPropID::kID, &prop));
- if (prop.vt != VT_UI8)
- return 0;
- return prop.uhVal.QuadPart;
-}
-
-UString CCodecs::GetHasherName(UInt32 index)
-{
- UString s;
- NCOM::CPropVariant prop;
- if (GetHasherProp(index, NMethodPropID::kName, &prop) == S_OK)
- if (prop.vt == VT_BSTR)
- s = prop.bstrVal;
- return s;
-}
-
-UInt32 CCodecs::GetHasherDigestSize(UInt32 index)
-{
- NCOM::CPropVariant prop;
- RINOK(GetHasherProp(index, NMethodPropID::kDigestSize, &prop));
- if (prop.vt != VT_UI4)
- return 0;
- return prop.ulVal;
-}
-
-#endif // EXTERNAL_CODECS
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/LoadCodecs.h b/src/libs/7zip/win/CPP/7zip/UI/Common/LoadCodecs.h
deleted file mode 100644
index d254ae659..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/LoadCodecs.h
+++ /dev/null
@@ -1,303 +0,0 @@
-// LoadCodecs.h
-
-#ifndef __LOAD_CODECS_H
-#define __LOAD_CODECS_H
-
-#include "../../../Common/MyBuffer.h"
-#include "../../../Common/MyCom.h"
-#include "../../../Common/MyString.h"
-#include "../../../Common/ComTry.h"
-
-#include "../../ICoder.h"
-
-#ifdef EXTERNAL_CODECS
-#include "../../../Windows/DLL.h"
-#endif
-
-struct CDllCodecInfo
-{
- CLSID Encoder;
- CLSID Decoder;
- bool EncoderIsAssigned;
- bool DecoderIsAssigned;
- int LibIndex;
- UInt32 CodecIndex;
-};
-
-struct CDllHasherInfo
-{
- int LibIndex;
- UInt32 HasherIndex;
-};
-
-#include "../../Archive/IArchive.h"
-
-struct CArcExtInfo
-{
- UString Ext;
- UString AddExt;
-
- CArcExtInfo() {}
- CArcExtInfo(const UString &ext): Ext(ext) {}
- CArcExtInfo(const UString &ext, const UString &addExt): Ext(ext), AddExt(addExt) {}
-};
-
-
-struct CArcInfoEx
-{
- UInt32 Flags;
-
- Func_CreateInArchive CreateInArchive;
- Func_IsArc IsArcFunc;
-
- UString Name;
- CObjectVector<CArcExtInfo> Exts;
-
- #ifndef _SFX
- Func_CreateOutArchive CreateOutArchive;
- bool UpdateEnabled;
- bool NewInterface;
- // UInt32 Version;
- UInt32 SignatureOffset;
- CObjectVector<CByteBuffer> Signatures;
- #ifdef NEW_FOLDER_INTERFACE
- UStringVector AssociateExts;
- #endif
- #endif
-
- #ifdef EXTERNAL_CODECS
- int LibIndex;
- UInt32 FormatIndex;
- CLSID ClassID;
- #endif
-
- bool Flags_KeepName() const { return (Flags & NArcInfoFlags::kKeepName) != 0; }
- bool Flags_FindSignature() const { return (Flags & NArcInfoFlags::kFindSignature) != 0; }
-
- bool Flags_AltStreams() const { return (Flags & NArcInfoFlags::kAltStreams) != 0; }
- bool Flags_NtSecure() const { return (Flags & NArcInfoFlags::kNtSecure) != 0; }
- bool Flags_SymLinks() const { return (Flags & NArcInfoFlags::kSymLinks) != 0; }
- bool Flags_HardLinks() const { return (Flags & NArcInfoFlags::kHardLinks) != 0; }
-
- bool Flags_UseGlobalOffset() const { return (Flags & NArcInfoFlags::kUseGlobalOffset) != 0; }
- bool Flags_StartOpen() const { return (Flags & NArcInfoFlags::kStartOpen) != 0; }
- bool Flags_BackwardOpen() const { return (Flags & NArcInfoFlags::kBackwardOpen) != 0; }
- bool Flags_PreArc() const { return (Flags & NArcInfoFlags::kPreArc) != 0; }
- bool Flags_PureStartOpen() const { return (Flags & NArcInfoFlags::kPureStartOpen) != 0; }
-
- UString GetMainExt() const
- {
- if (Exts.IsEmpty())
- return UString();
- return Exts[0].Ext;
- }
- int FindExtension(const UString &ext) const;
-
- /*
- UString GetAllExtensions() const
- {
- UString s;
- for (int i = 0; i < Exts.Size(); i++)
- {
- if (i > 0)
- s += ' ';
- s += Exts[i].Ext;
- }
- return s;
- }
- */
-
- void AddExts(const UString &ext, const UString &addExt);
-
- bool IsSplit() const { return StringsAreEqualNoCase_Ascii(Name, "Split"); }
- // bool IsRar() const { return StringsAreEqualNoCase_Ascii(Name, "Rar"); }
-
- CArcInfoEx():
- Flags(0),
- CreateInArchive(NULL),
- IsArcFunc(NULL)
- #ifndef _SFX
- , CreateOutArchive(NULL)
- , UpdateEnabled(false)
- , NewInterface(false)
- // , Version(0)
- , SignatureOffset(0)
- #endif
- #ifdef EXTERNAL_CODECS
- , LibIndex(-1)
- #endif
- {}
-};
-
-#ifdef EXTERNAL_CODECS
-
-#ifdef NEW_FOLDER_INTERFACE
-struct CCodecIcons
-{
- struct CIconPair
- {
- UString Ext;
- int IconIndex;
- };
- CObjectVector<CIconPair> IconPairs;
- void LoadIcons(HMODULE m);
- bool FindIconIndex(const UString &ext, int &iconIndex) const;
-};
-#endif
-
-struct CCodecLib
- #ifdef NEW_FOLDER_INTERFACE
- : public CCodecIcons
- #endif
-{
- NWindows::NDLL::CLibrary Lib;
- FString Path;
- Func_GetMethodProperty GetMethodProperty;
- Func_CreateObject CreateObject;
- CMyComPtr<IHashers> Hashers;
-
- #ifdef NEW_FOLDER_INTERFACE
- void LoadIcons() { CCodecIcons::LoadIcons((HMODULE)Lib); }
- #endif
-
- CCodecLib(): GetMethodProperty(NULL) {}
-};
-#endif
-
-class CCodecs:
- #ifdef EXTERNAL_CODECS
- public ICompressCodecsInfo,
- public IHashers,
- #else
- public IUnknown,
- #endif
- public CMyUnknownImp
-{
-public:
- #ifdef EXTERNAL_CODECS
- CObjectVector<CCodecLib> Libs;
- CRecordVector<CDllCodecInfo> Codecs;
- CRecordVector<CDllHasherInfo> Hashers;
-
- #ifdef NEW_FOLDER_INTERFACE
- CCodecIcons InternalIcons;
- #endif
-
- HRESULT LoadCodecs();
- HRESULT LoadFormats();
- HRESULT LoadDll(const FString &path, bool needCheckDll);
- HRESULT LoadDllsFromFolder(const FString &folderPrefix);
-
- HRESULT CreateArchiveHandler(const CArcInfoEx &ai, void **archive, bool outHandler) const
- {
- return Libs[ai.LibIndex].CreateObject(&ai.ClassID, outHandler ? &IID_IOutArchive : &IID_IInArchive, (void **)archive);
- }
- #endif
-
-public:
- CObjectVector<CArcInfoEx> Formats;
- bool CaseSensitiveChange;
- bool CaseSensitive;
-
- CCodecs(): CaseSensitiveChange(false), CaseSensitive(false) {}
-
- const wchar_t *GetFormatNamePtr(int formatIndex)
- {
- return formatIndex < 0 ? L"#" : (const wchar_t *)Formats[formatIndex].Name;
- }
-
- HRESULT Load();
-
- #ifndef _SFX
- int FindFormatForArchiveName(const UString &arcPath) const;
- int FindFormatForExtension(const UString &ext) const;
- int FindFormatForArchiveType(const UString &arcType) const;
- bool FindFormatForArchiveType(const UString &arcType, CIntVector &formatIndices) const;
- #endif
-
- #ifdef EXTERNAL_CODECS
-
- MY_UNKNOWN_IMP2(ICompressCodecsInfo, IHashers)
-
- STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods);
- STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value);
- STDMETHOD(CreateDecoder)(UInt32 index, const GUID *interfaceID, void **coder);
- STDMETHOD(CreateEncoder)(UInt32 index, const GUID *interfaceID, void **coder);
-
- STDMETHOD_(UInt32, GetNumHashers)();
- STDMETHOD(GetHasherProp)(UInt32 index, PROPID propID, PROPVARIANT *value);
- STDMETHOD(CreateHasher)(UInt32 index, IHasher **hasher);
-
- #else
-
- MY_UNKNOWN_IMP
-
- #endif // EXTERNAL_CODECS
-
- #ifdef EXTERNAL_CODECS
-
- int GetCodecLibIndex(UInt32 index);
- bool GetCodecEncoderIsAssigned(UInt32 index);
- HRESULT GetCodecId(UInt32 index, UInt64 &id);
- UString GetCodecName(UInt32 index);
-
- int GetHasherLibIndex(UInt32 index);
- UInt64 GetHasherId(UInt32 index);
- UString GetHasherName(UInt32 index);
- UInt32 GetHasherDigestSize(UInt32 index);
-
- #endif
-
- HRESULT CreateInArchive(unsigned formatIndex, CMyComPtr<IInArchive> &archive) const
- {
- const CArcInfoEx &ai = Formats[formatIndex];
- #ifdef EXTERNAL_CODECS
- if (ai.LibIndex < 0)
- #endif
- {
- COM_TRY_BEGIN
- archive = ai.CreateInArchive();
- return S_OK;
- COM_TRY_END
- }
- #ifdef EXTERNAL_CODECS
- return CreateArchiveHandler(ai, (void **)&archive, false);
- #endif
- }
-
- #ifndef _SFX
-
- HRESULT CreateOutArchive(unsigned formatIndex, CMyComPtr<IOutArchive> &archive) const
- {
- const CArcInfoEx &ai = Formats[formatIndex];
- #ifdef EXTERNAL_CODECS
- if (ai.LibIndex < 0)
- #endif
- {
- COM_TRY_BEGIN
- archive = ai.CreateOutArchive();
- return S_OK;
- COM_TRY_END
- }
- #ifdef EXTERNAL_CODECS
- return CreateArchiveHandler(ai, (void **)&archive, true);
- #endif
- }
-
- int FindOutFormatFromName(const UString &name) const
- {
- FOR_VECTOR (i, Formats)
- {
- const CArcInfoEx &arc = Formats[i];
- if (!arc.UpdateEnabled)
- continue;
- if (arc.Name.IsEqualToNoCase(name))
- return i;
- }
- return -1;
- }
-
- #endif // _SFX
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/OpenArchive.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/OpenArchive.cpp
deleted file mode 100644
index 4efbc9cc7..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/OpenArchive.cpp
+++ /dev/null
@@ -1,3211 +0,0 @@
-// OpenArchive.cpp
-
-#include "StdAfx.h"
-
-// #define SHOW_DEBUG_INFO
-
-#ifdef SHOW_DEBUG_INFO
-#include <stdio.h>
-#endif
-
-#include "../../../../C/CpuArch.h"
-
-#include "../../../Common/ComTry.h"
-#include "../../../Common/IntToString.h"
-#include "../../../Common/StringConvert.h"
-#include "../../../Common/StringToInt.h"
-#include "../../../Common/Wildcard.h"
-
-#include "../../../Windows/FileDir.h"
-
-#include "../../Common/FileStreams.h"
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/ProgressUtils.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "DefaultName.h"
-#include "OpenArchive.h"
-
-#ifndef _SFX
-#include "SetProperties.h"
-#endif
-
-#ifdef SHOW_DEBUG_INFO
-#define PRF(x) x
-#else
-#define PRF(x)
-#endif
-
-// increase it, if you need to support larger SFX stubs
-static const UInt64 kMaxCheckStartPosition = 1 << 22;
-
-/*
-Open:
- - formatIndex >= 0 (exact Format)
- 1) Open with main type. Archive handler is allowed to use archive start finder.
- Warning, if there is tail.
-
- - formatIndex = -1 (Parser:0) (default)
- - same as #1 but doesn't return Parser
-
- - formatIndex = -2 (#1)
- - file has supported extension (like a.7z)
- Open with that main type (only starting from start of file).
- - open OK:
- - if there is no tail - return OK
- - if there is tail:
- - archive is not "Self Exe" - return OK with Warning, that there is tail
- - archive is "Self Exe"
- ignore "Self Exe" stub, and tries to open tail
- - tail can be open as archive - shows that archive and stub size property.
- - tail can't be open as archive - shows Parser ???
- - open FAIL:
- Try to open with all other types from offset 0 only.
- If some open type is OK and physical archive size is uequal or larger
- than file size, then return that archive with warning that can not be open as [extension type].
- If extension was EXE, it will try to open as unknown_extension case
- - file has unknown extension (like a.hhh)
- It tries to open via parser code.
- - if there is full archive or tail archive and unknown block or "Self Exe"
- at front, it shows tail archive and stub size property.
- - in another cases, if there is some archive inside file, it returns parser/
- - in another cases, it retuens S_FALSE
-
-
- - formatIndex = -3 (#2)
- - same as #1, but
- - stub (EXE) + archive is open in Parser
-
- - formatIndex = -4 (#3)
- - returns only Parser. skip full file archive. And show other sub-archives
-
- - formatIndex = -5 (#4)
- - returns only Parser. skip full file archive. And show other sub-archives for each byte pos
-
-*/
-
-
-
-
-using namespace NWindows;
-
-/*
-#ifdef _SFX
-#define OPEN_PROPS_PARAM
-#else
-#define OPEN_PROPS_PARAM , props
-#endif
-*/
-
-/*
-CArc::~CArc()
-{
- GetRawProps.Release();
- Archive.Release();
- printf("\nCArc::~CArc()\n");
-}
-*/
-
-#ifndef _SFX
-
-namespace NArchive {
-namespace NParser {
-
-struct CParseItem
-{
- UInt64 Offset;
- UInt64 Size;
- // UInt64 OkSize;
- UString Name;
- UString Extension;
- FILETIME FileTime;
- UString Comment;
- UString ArcType;
-
- bool FileTime_Defined;
- bool UnpackSize_Defined;
- bool NumSubDirs_Defined;
- bool NumSubFiles_Defined;
-
- bool IsSelfExe;
- bool IsNotArcType;
-
- UInt64 UnpackSize;
- UInt64 NumSubDirs;
- UInt64 NumSubFiles;
-
- int FormatIndex;
-
- bool LenIsUnknown;
-
- CParseItem():
- LenIsUnknown(false),
- FileTime_Defined(false),
- UnpackSize_Defined(false),
- NumSubFiles_Defined(false),
- NumSubDirs_Defined(false),
- IsSelfExe(false),
- IsNotArcType(false)
- // OkSize(0)
- {}
-
- /*
- bool IsEqualTo(const CParseItem &item) const
- {
- return Offset == item.Offset && Size == item.Size;
- }
- */
-
- void NormalizeOffset()
- {
- if ((Int64)Offset < 0)
- {
- Size += Offset;
- // OkSize += Offset;
- Offset = 0;
- }
- }
-};
-
-class CHandler:
- public IInArchive,
- public IInArchiveGetStream,
- public CMyUnknownImp
-{
-public:
- CObjectVector<CParseItem> _items;
- UInt64 _maxEndOffset;
- CMyComPtr<IInStream> _stream;
-
- MY_UNKNOWN_IMP2(
- IInArchive,
- IInArchiveGetStream)
-
- INTERFACE_IInArchive(;)
- STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
-
- UInt64 GetLastEnd() const
- {
- if (_items.IsEmpty())
- return 0;
- const CParseItem &back = _items.Back();
- return back.Offset + back.Size;
- }
-
- void AddUnknownItem(UInt64 next);
- int FindInsertPos(const CParseItem &item);
- void AddItem(const CParseItem &item);
- // void Init();
-
- CHandler()
- {
- _maxEndOffset = 0;
- }
-};
-
-int CHandler::FindInsertPos(const CParseItem &item)
-{
- unsigned left = 0, right = _items.Size();
- while (left != right)
- {
- unsigned mid = (left + right) / 2;
- const CParseItem & midItem = _items[mid];
- if (item.Offset < midItem.Offset)
- right = mid;
- else if (item.Offset > midItem.Offset)
- left = mid + 1;
- else if (item.Size < midItem.Size)
- right = mid;
- else if (item.Size > midItem.Size)
- left = mid + 1;
- else
- {
- left = mid + 1;
- // return -1;
- }
- }
- return left;
-}
-
-void CHandler::AddUnknownItem(UInt64 next)
-{
- /*
- UInt64 prevEnd = 0;
- if (!_items.IsEmpty())
- {
- const CParseItem &back = _items.Back();
- prevEnd = back.Offset + back.Size;
- }
- */
- if (_maxEndOffset < next)
- {
- CParseItem item2;
- item2.Offset = _maxEndOffset;
- item2.Size = next - _maxEndOffset;
- _maxEndOffset = next;
- _items.Add(item2);
- }
- else if (_maxEndOffset > next && !_items.IsEmpty())
- {
- CParseItem &back = _items.Back();
- if (back.LenIsUnknown)
- {
- back.Size = next - back.Offset;
- _maxEndOffset = next;
- }
- }
-}
-
-void CHandler::AddItem(const CParseItem &item)
-{
- AddUnknownItem(item.Offset);
- int pos = FindInsertPos(item);
- if (pos >= 0)
- {
- _items.Insert(pos, item);
- UInt64 next = item.Offset + item.Size;
- if (_maxEndOffset < next)
- _maxEndOffset = next;
- }
-}
-
-/*
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidType, VT_BSTR},
- { NULL, kpidComment, VT_BSTR},
- { NULL, kpidOffset, VT_UI8},
- { NULL, kpidUnpackSize, VT_UI8},
-// { NULL, kpidNumSubDirs, VT_UI8},
-};
-*/
-
-static const Byte kProps[] =
-{
- kpidPath,
- kpidSize,
- kpidMTime,
- kpidType,
- kpidComment,
- kpidOffset,
- kpidUnpackSize
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps_NO
-
-STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback * /* openArchiveCallback */)
-{
- COM_TRY_BEGIN
- {
- Close();
- _stream = stream;
- }
- 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
- NCOM::CPropVariant prop;
-
- const CParseItem &item = _items[index];
-
- switch (propID)
- {
- case kpidPath:
- {
- wchar_t sz[32];
- ConvertUInt32ToString(index + 1, sz);
- UString s = sz;
- if (!item.Name.IsEmpty())
- {
- s += L'.';
- s += item.Name;
- }
- if (!item.Extension.IsEmpty())
- {
- s += L'.';
- s += item.Extension;
- }
- prop = s; break;
- }
- case kpidSize:
- case kpidPackSize: prop = item.Size; break;
- case kpidOffset: prop = item.Offset; break;
- case kpidUnpackSize: if (item.UnpackSize_Defined) prop = item.UnpackSize; break;
- case kpidNumSubFiles: if (item.NumSubFiles_Defined) prop = item.NumSubFiles; break;
- case kpidNumSubDirs: if (item.NumSubDirs_Defined) prop = item.NumSubDirs; break;
- case kpidMTime: if (item.FileTime_Defined) prop = item.FileTime; break;
- case kpidComment: if (!item.Comment.IsEmpty()) prop = item.Comment; break;
- case kpidType: if (!item.ArcType.IsEmpty()) prop = item.ArcType; 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
- bool allFilesMode = (numItems == (UInt32)(Int32)-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]].Size;
- extractCallback->SetTotal(totalSize);
-
- totalSize = 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);
-
- NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
- CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
- for (i = 0; i < numItems; i++)
- {
- lps->InSize = totalSize;
- 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 CParseItem &item = _items[index];
-
- RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
- UInt64 unpackSize = item.Size;
- totalSize += unpackSize;
- bool skipMode = false;
- if (!testMode && !realOutStream)
- continue;
- RINOK(extractCallback->PrepareOperation(askMode));
-
- outStreamSpec->SetStream(realOutStream);
- realOutStream.Release();
- outStreamSpec->Init(skipMode ? 0 : unpackSize, true);
-
- Int32 opRes = NExtract::NOperationResult::kOK;
- RINOK(_stream->Seek(item.Offset, STREAM_SEEK_SET, NULL));
- streamSpec->Init(unpackSize);
- RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
-
- if (outStreamSpec->GetRem() != 0)
- opRes = NExtract::NOperationResult::kDataError;
- outStreamSpec->ReleaseStream();
- RINOK(extractCallback->SetOperationResult(opRes));
- }
- return S_OK;
- COM_TRY_END
-}
-
-
-STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
-{
- COM_TRY_BEGIN
- const CParseItem &item = _items[index];
- return CreateLimitedInStream(_stream, item.Offset, item.Size, stream);
- COM_TRY_END
-}
-
-}}
-
-#endif
-
-HRESULT Archive_GetItemBoolProp(IInArchive *arc, UInt32 index, PROPID propID, bool &result) throw()
-{
- NCOM::CPropVariant prop;
- result = false;
- RINOK(arc->GetProperty(index, propID, &prop));
- if (prop.vt == VT_BOOL)
- result = VARIANT_BOOLToBool(prop.boolVal);
- else if (prop.vt != VT_EMPTY)
- return E_FAIL;
- return S_OK;
-}
-
-HRESULT Archive_IsItem_Folder(IInArchive *arc, UInt32 index, bool &result) throw()
-{
- return Archive_GetItemBoolProp(arc, index, kpidIsDir, result);
-}
-
-HRESULT Archive_IsItem_Aux(IInArchive *arc, UInt32 index, bool &result) throw()
-{
- return Archive_GetItemBoolProp(arc, index, kpidIsAux, result);
-}
-
-HRESULT Archive_IsItem_AltStream(IInArchive *arc, UInt32 index, bool &result) throw()
-{
- return Archive_GetItemBoolProp(arc, index, kpidIsAltStream, result);
-}
-
-HRESULT Archive_IsItem_Deleted(IInArchive *arc, UInt32 index, bool &result) throw()
-{
- return Archive_GetItemBoolProp(arc, index, kpidIsDeleted, result);
-}
-
-static HRESULT Archive_GetArcBoolProp(IInArchive *arc, PROPID propid, bool &result)
-{
- NCOM::CPropVariant prop;
- result = false;
- RINOK(arc->GetArchiveProperty(propid, &prop));
- if (prop.vt == VT_BOOL)
- result = VARIANT_BOOLToBool(prop.boolVal);
- else if (prop.vt != VT_EMPTY)
- return E_FAIL;
- return S_OK;
-}
-
-static HRESULT Archive_GetArcProp_UInt(IInArchive *arc, PROPID propid, UInt64 &result, bool &defined)
-{
- defined = false;
- NCOM::CPropVariant prop;
- RINOK(arc->GetArchiveProperty(propid, &prop));
- switch (prop.vt)
- {
- case VT_UI4: result = prop.ulVal; defined = true; break;
- case VT_I4: result = prop.lVal; defined = true; break;
- case VT_UI8: result = (UInt64)prop.uhVal.QuadPart; defined = true; break;
- case VT_I8: result = (UInt64)prop.hVal.QuadPart; defined = true; break;
- case VT_EMPTY: break;
- default: return E_FAIL;
- }
- return S_OK;
-}
-
-static HRESULT Archive_GetArcProp_Int(IInArchive *arc, PROPID propid, Int64 &result, bool &defined)
-{
- defined = false;
- NCOM::CPropVariant prop;
- RINOK(arc->GetArchiveProperty(propid, &prop));
- switch (prop.vt)
- {
- case VT_UI4: result = prop.ulVal; defined = true; break;
- case VT_I4: result = prop.lVal; defined = true; break;
- case VT_UI8: result = (Int64)prop.uhVal.QuadPart; defined = true; break;
- case VT_I8: result = (Int64)prop.hVal.QuadPart; defined = true; break;
- case VT_EMPTY: break;
- default: return E_FAIL;
- }
- return S_OK;
-}
-
-HRESULT CArc::GetItemPathToParent(UInt32 index, UInt32 parent, UStringVector &parts) const
-{
- if (!GetRawProps)
- return E_FAIL;
- UInt32 curIndex = index;
- bool prevWasAltStream = false;
- for (;;)
- {
- UString s;
-
- #ifdef MY_CPU_LE
- const void *p;
- UInt32 size;
- UInt32 propType;
- RINOK(GetRawProps->GetRawProp(curIndex, kpidName, &p, &size, &propType));
- if (p && propType == PROP_DATA_TYPE_wchar_t_PTR_Z_LE)
- s = (const wchar_t *)p;
- else
- #endif
- {
- NCOM::CPropVariant prop;
- RINOK(Archive->GetProperty(curIndex, kpidName, &prop));
- if (prop.vt == VT_BSTR)
- s = prop.bstrVal;
- else if (prop.vt == VT_EMPTY)
- s = L"[Content]";
- else
- return E_FAIL;
- }
-
- if (prevWasAltStream)
- parts[0] = s + L":" + parts[0];
- else
- parts.Insert(0, s);
-
- UInt32 curParent = (UInt32)(Int32)-1;
- UInt32 parentType = 0;
- RINOK(GetRawProps->GetParent(curIndex, &curParent, &parentType));
- if (parent == curParent)
- return S_OK;
- if (curParent == (UInt32)(Int32)-1)
- return E_FAIL;
- prevWasAltStream = (parentType == NParentType::kAltStream);
- curIndex = curParent;
- }
-}
-
-HRESULT CArc::GetItemPath(UInt32 index, UString &result) const
-{
- #ifdef MY_CPU_LE
- if (GetRawProps)
- {
- const void *p;
- UInt32 size;
- UInt32 propType;
- if (!IsTree)
- {
- if (GetRawProps->GetRawProp(index, kpidPath, &p, &size, &propType) == S_OK &&
- propType == NPropDataType::kUtf16z)
- {
- unsigned len = size / 2 - 1;
- wchar_t *s = result.GetBuffer(len);
- for (unsigned i = 0; i < len; i++)
- {
- wchar_t c = GetUi16(p);
- p = (const void *)((const Byte *)p + 2);
- #if WCHAR_PATH_SEPARATOR != L'/'
- if (c == L'/')
- c = WCHAR_PATH_SEPARATOR;
- #endif
- *s++ = c;
- }
- result.ReleaseBuffer(len);
- if (len != 0)
- return S_OK;
- }
- }
- /*
- else if (GetRawProps->GetRawProp(index, kpidName, &p, &size, &propType) == S_OK &&
- p && propType == NPropDataType::kUtf16z)
- {
- UInt32 totalSize = size;
- bool isOK = false;
- {
- UInt32 index2 = index;
- for (;;)
- {
- UInt32 parent = (UInt32)(Int32)-1;
- UInt32 parentType = 0;
- if (GetRawProps->GetParent(index2, &parent, &parentType) != S_OK)
- break;
- if (parent == (UInt32)(Int32)-1)
- {
- isOK = true;
- break;
- }
- index2 = parent;
- UInt32 size2;
- const void *p2;
- if (GetRawProps->GetRawProp(index2, kpidName, &p2, &size2, &propType) != S_OK)
- break;
- totalSize += size2;
- }
- }
-
- if (isOK)
- {
- wchar_t *sz = result.GetBuffer(totalSize / 2);
- UInt32 pos = totalSize - size;
- memcpy((Byte *)sz + pos, p, size - 2);
- UInt32 index2 = index;
- for (;;)
- {
- UInt32 parent = (UInt32)(Int32)-1;
- UInt32 parentType = 0;
- if (GetRawProps->GetParent(index2, &parent, &parentType) != S_OK)
- break;
- if (parent == (UInt32)(Int32)-1)
- break;
- index2 = parent;
- UInt32 size2;
- const void *p2;
- if (GetRawProps->GetRawProp(index2, kpidName, &p2, &size2, &propType) != S_OK)
- break;
- pos -= size2;
- memcpy((Byte *)sz + pos, p2, size2);
- sz[(pos + size2 - 2) / 2] = (parentType == 0) ? WCHAR_PATH_SEPARATOR : L':';
- }
- result.ReleaseBuffer((totalSize - 2) / 2);
- #ifdef _WIN32
- // result.Replace(L'/', WCHAR_PATH_SEPARATOR);
- #endif
- return S_OK;
- }
- }
- */
- }
- #endif
-
- {
- NCOM::CPropVariant prop;
- RINOK(Archive->GetProperty(index, kpidPath, &prop));
- if (prop.vt == VT_BSTR)
- result = prop.bstrVal;
- else if (prop.vt == VT_EMPTY)
- result.Empty();
- else
- return E_FAIL;
- }
-
- if (result.IsEmpty())
- {
- result = DefaultName;
- NCOM::CPropVariant prop;
- RINOK(Archive->GetProperty(index, kpidExtension, &prop));
- if (prop.vt == VT_BSTR)
- {
- result += L'.';
- result += prop.bstrVal;
- }
- else if (prop.vt != VT_EMPTY)
- return E_FAIL;
- }
- return S_OK;
-}
-
-HRESULT CArc::GetItemPath2(UInt32 index, UString &result) const
-{
- RINOK(GetItemPath(index, result));
- if (Ask_Deleted)
- {
- bool isDeleted = false;
- RINOK(Archive_IsItem_Deleted(Archive, index, isDeleted));
- if (isDeleted)
- result.Insert(0, L"[DELETED]" WSTRING_PATH_SEPARATOR);
- }
- return S_OK;
-}
-
-#ifndef _SFX
-
-static HRESULT Archive_GetItem_Size(IInArchive *archive, UInt32 index, UInt64 &size, bool &defined)
-{
- NCOM::CPropVariant prop;
- defined = false;
- size = 0;
- RINOK(archive->GetProperty(index, kpidSize, &prop));
- switch (prop.vt)
- {
- case VT_UI1: size = prop.bVal; break;
- case VT_UI2: size = prop.uiVal; break;
- case VT_UI4: size = prop.ulVal; break;
- case VT_UI8: size = (UInt64)prop.uhVal.QuadPart; break;
- case VT_EMPTY: return S_OK;
- default: return E_FAIL;
- }
- defined = true;
- return S_OK;
-}
-
-#endif
-
-HRESULT CArc::GetItemSize(UInt32 index, UInt64 &size, bool &defined) const
-{
- NCOM::CPropVariant prop;
- defined = false;
- size = 0;
- RINOK(Archive->GetProperty(index, kpidSize, &prop));
- switch (prop.vt)
- {
- case VT_UI1: size = prop.bVal; break;
- case VT_UI2: size = prop.uiVal; break;
- case VT_UI4: size = prop.ulVal; break;
- case VT_UI8: size = (UInt64)prop.uhVal.QuadPart; break;
- case VT_EMPTY: return S_OK;
- default: return E_FAIL;
- }
- defined = true;
- return S_OK;
-}
-
-HRESULT CArc::GetItemMTime(UInt32 index, FILETIME &ft, bool &defined) const
-{
- NCOM::CPropVariant prop;
- defined = false;
- ft.dwHighDateTime = ft.dwLowDateTime = 0;
- RINOK(Archive->GetProperty(index, kpidMTime, &prop));
- if (prop.vt == VT_FILETIME)
- {
- ft = prop.filetime;
- defined = true;
- }
- else if (prop.vt != VT_EMPTY)
- return E_FAIL;
- else if (MTimeDefined)
- {
- ft = MTime;
- defined = true;
- }
- return S_OK;
-}
-
-#ifndef _SFX
-
-static inline bool TestSignature(const Byte *p1, const Byte *p2, size_t size)
-{
- for (size_t i = 0; i < size; i++)
- if (p1[i] != p2[i])
- return false;
- return true;
-}
-
-static void MakeCheckOrder(CCodecs *codecs,
- CIntVector &orderIndices, unsigned numTypes, CIntVector &orderIndices2,
- const Byte *data, size_t dataSize)
-{
- for (unsigned i = 0; i < numTypes; i++)
- {
- int index = orderIndices[i];
- if (index < 0)
- continue;
- const CArcInfoEx &ai = codecs->Formats[index];
- if (ai.SignatureOffset != 0)
- {
- orderIndices2.Add(index);
- orderIndices[i] = -1;
- continue;
- }
-
- const CObjectVector<CByteBuffer> &sigs = ai.Signatures;
- FOR_VECTOR (k, sigs)
- {
- const CByteBuffer &sig = sigs[k];
- if (sig.Size() == 0 && dataSize == 0 ||
- sig.Size() != 0 && sig.Size() <= dataSize &&
- TestSignature(data, sig, sig.Size()))
- {
- orderIndices2.Add(index);
- orderIndices[i] = -1;
- break;
- }
- }
- }
-}
-
-#endif
-
-#ifdef UNDER_CE
- static const unsigned kNumHashBytes = 1;
- #define HASH_VAL(buf, pos) ((buf)[pos])
-#else
- static const unsigned kNumHashBytes = 2;
- #define HASH_VAL(buf, pos) ((buf)[pos] | ((UInt32)(buf)[pos + 1] << 8))
-#endif
-
-
-#ifndef _SFX
-
-static bool IsExeExt(const UString &ext)
-{
- return ext.IsEqualToNoCase(L"exe");
-}
-
-static const char *k_PreArcFormats[] =
-{
- "pe"
- , "elf"
- , "macho"
- , "mub"
- , "te"
-};
-
-static bool IsNameFromList(const UString &s, const char *names[], size_t num)
-{
- for (unsigned i = 0; i < num; i++)
- if (StringsAreEqualNoCase_Ascii(s, names[i]))
- return true;
- return false;
-}
-
-
-static bool IsPreArcFormat(const CArcInfoEx &ai)
-{
- if (ai.Flags_PreArc())
- return true;
- return IsNameFromList(ai.Name, k_PreArcFormats, ARRAY_SIZE(k_PreArcFormats));
-}
-
-static const char *k_Formats_with_simple_signuature[] =
-{
- "7z"
- , "xz"
- , "rar"
- , "bzip2"
- , "gzip"
- , "cab"
- , "wim"
- , "rpm"
- , "vhd"
- , "xar"
-};
-
-static bool IsNewStyleSignature(const CArcInfoEx &ai)
-{
- // if (ai.Version >= 0x91F)
- if (ai.NewInterface)
- return true;
- return IsNameFromList(ai.Name, k_Formats_with_simple_signuature, ARRAY_SIZE(k_Formats_with_simple_signuature));
-}
-
-class CArchiveOpenCallback_Offset:
- public IArchiveOpenCallback,
- #ifndef _NO_CRYPTO
- public ICryptoGetTextPassword,
- #endif
- public CMyUnknownImp
-{
-public:
- CMyComPtr<IArchiveOpenCallback> Callback;
- UInt64 Files;
- UInt64 Offset;
-
- #ifndef _NO_CRYPTO
- CMyComPtr<ICryptoGetTextPassword> GetTextPassword;
- MY_UNKNOWN_IMP2(
- IArchiveOpenCallback,
- ICryptoGetTextPassword)
- #else
- MY_UNKNOWN_IMP1(IArchiveOpenCallback)
- #endif
- STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes);
- STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes);
- #ifndef _NO_CRYPTO
- STDMETHOD(CryptoGetTextPassword)(BSTR *password);
- #endif
-};
-
-#ifndef _NO_CRYPTO
-STDMETHODIMP CArchiveOpenCallback_Offset::CryptoGetTextPassword(BSTR *password)
-{
- COM_TRY_BEGIN
- if (GetTextPassword)
- return GetTextPassword->CryptoGetTextPassword(password);
- return E_NOTIMPL;
- COM_TRY_END
-}
-#endif
-
-STDMETHODIMP CArchiveOpenCallback_Offset::SetTotal(const UInt64 * /* files */, const UInt64 * /* bytes */)
-{
- return S_OK;
-}
-
-STDMETHODIMP CArchiveOpenCallback_Offset::SetCompleted(const UInt64 * /* files */, const UInt64 *bytes)
-{
- if (!Callback)
- return S_OK;
- UInt64 value = Offset;
- if (bytes)
- value += *bytes;
- return Callback->SetCompleted(&Files, &value);
-}
-
-#endif
-
-UInt32 GetOpenArcErrorFlags(const NCOM::CPropVariant &prop, bool *isDefinedProp)
-{
- if (isDefinedProp != NULL)
- *isDefinedProp = false;
-
- switch (prop.vt)
- {
- case VT_UI8: if (isDefinedProp) *isDefinedProp = true; return (UInt32)prop.uhVal.QuadPart;
- case VT_UI4: if (isDefinedProp) *isDefinedProp = true; return prop.ulVal;
- case VT_EMPTY: return 0;
- default: throw 151199;
- }
-}
-
-void CArcErrorInfo::ClearErrors()
-{
- // ErrorFormatIndex = -1; // we don't need to clear ErrorFormatIndex here !!!
-
- ThereIsTail = false;
- UnexpecedEnd = false;
- IgnoreTail = false;
- // NonZerosTail = false;
- ErrorFlags_Defined = false;
- ErrorFlags = 0;
- WarningFlags = 0;
- TailSize = 0;
-
- ErrorMessage.Empty();
- WarningMessage.Empty();
-}
-
-HRESULT CArc::ReadBasicProps(IInArchive *archive, UInt64 startPos, HRESULT openRes)
-{
- // OkPhySize_Defined = false;
- PhySizeDefined = false;
- PhySize = 0;
- Offset = 0;
- AvailPhySize = FileSize - startPos;
-
- ErrorInfo.ClearErrors();
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetArchiveProperty(kpidErrorFlags, &prop));
- ErrorInfo.ErrorFlags = GetOpenArcErrorFlags(prop, &ErrorInfo.ErrorFlags_Defined);
- }
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetArchiveProperty(kpidWarningFlags, &prop));
- ErrorInfo.WarningFlags = GetOpenArcErrorFlags(prop);
- }
-
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetArchiveProperty(kpidError, &prop));
- if (prop.vt != VT_EMPTY)
- ErrorInfo.ErrorMessage = (prop.vt == VT_BSTR) ? prop.bstrVal : L"Unknown error";
- }
-
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetArchiveProperty(kpidWarning, &prop));
- if (prop.vt != VT_EMPTY)
- ErrorInfo.WarningMessage = (prop.vt == VT_BSTR) ? prop.bstrVal : L"Unknown warning";
- }
-
- if (openRes == S_OK || ErrorInfo.IsArc_After_NonOpen())
- {
- RINOK(Archive_GetArcProp_UInt(archive, kpidPhySize, PhySize, PhySizeDefined));
- /*
- RINOK(Archive_GetArcProp_UInt(archive, kpidOkPhySize, OkPhySize, OkPhySize_Defined));
- if (!OkPhySize_Defined)
- {
- OkPhySize_Defined = PhySizeDefined;
- OkPhySize = PhySize;
- }
- */
-
- bool offsetDefined;
- RINOK(Archive_GetArcProp_Int(archive, kpidOffset, Offset, offsetDefined));
-
- Int64 globalOffset = startPos + Offset;
- AvailPhySize = FileSize - globalOffset;
- if (PhySizeDefined)
- {
- UInt64 endPos = globalOffset + PhySize;
- if (endPos < FileSize)
- {
- AvailPhySize = PhySize;
- ErrorInfo.ThereIsTail = true;
- ErrorInfo.TailSize = FileSize - endPos;
- }
- else if (endPos > FileSize)
- ErrorInfo.UnexpecedEnd = true;
- }
- }
-
- return S_OK;
-}
-
-/*
-static PrintNumber(const char *s, int n)
-{
- char temp[100];
- sprintf(temp, "%s %d", s, n);
- OutputDebugStringA(temp);
-}
-*/
-
-HRESULT CArc::PrepareToOpen(const COpenOptions &op, unsigned formatIndex, CMyComPtr<IInArchive> &archive)
-{
- // OutputDebugStringW(L"a1");
- // PrintNumber("formatIndex", formatIndex);
-
- RINOK(op.codecs->CreateInArchive(formatIndex, archive));
- // OutputDebugStringW(L"a2");
- if (!archive)
- return S_OK;
-
- #ifdef EXTERNAL_CODECS
- {
- CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo;
- archive.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo);
- if (setCompressCodecsInfo)
- {
- RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(op.codecs));
- }
- }
- #endif
-
- // OutputDebugStringW(ai.Name);
- // OutputDebugStringW(L"a3");
-
- #ifndef _SFX
- const CArcInfoEx &ai = op.codecs->Formats[formatIndex];
- if (ai.Flags_PreArc())
- {
- /* we notify parsers that extract executables, that they don't need
- to open archive, if there is tail after executable (for SFX cases) */
- CMyComPtr<IArchiveAllowTail> allowTail;
- archive.QueryInterface(IID_IArchiveAllowTail, (void **)&allowTail);
- if (allowTail)
- allowTail->AllowTail(BoolToInt(true));
- }
- if (op.props)
- {
- /*
- FOR_VECTOR (y, op.props)
- {
- const COptionalOpenProperties &optProps = (*op.props)[y];
- if (optProps.FormatName.IsEmpty() || optProps.FormatName.CompareNoCase(ai.Name) == 0)
- {
- RINOK(SetProperties(archive, optProps.Props));
- break;
- }
- }
- */
- RINOK(SetProperties(archive, *op.props));
- }
- #endif
- return S_OK;
-}
-
-#ifndef _SFX
-
-static HRESULT ReadParseItemProps(IInArchive *archive, const CArcInfoEx &ai, NArchive::NParser::CParseItem &pi)
-{
- pi.Extension = ai.GetMainExt();
- pi.FileTime_Defined = false;
- pi.ArcType = ai.Name;
-
- RINOK(Archive_GetArcBoolProp(archive, kpidIsNotArcType, pi.IsNotArcType));
-
- // RINOK(Archive_GetArcBoolProp(archive, kpidIsSelfExe, pi.IsSelfExe));
- pi.IsSelfExe = ai.Flags_PreArc();
-
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetArchiveProperty(kpidMTime, &prop));
- if (prop.vt == VT_FILETIME)
- {
- pi.FileTime_Defined = true;
- pi.FileTime = prop.filetime;
- }
- }
-
- if (!pi.FileTime_Defined)
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetArchiveProperty(kpidCTime, &prop));
- if (prop.vt == VT_FILETIME)
- {
- pi.FileTime_Defined = true;
- pi.FileTime = prop.filetime;
- }
- }
-
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetArchiveProperty(kpidName, &prop));
- if (prop.vt == VT_BSTR)
- {
- pi.Name = prop.bstrVal;
- pi.Extension.Empty();
- }
- else
- {
- RINOK(archive->GetArchiveProperty(kpidExtension, &prop));
- if (prop.vt == VT_BSTR)
- pi.Extension = prop.bstrVal;
- }
- }
-
- {
- NCOM::CPropVariant prop;
- RINOK(archive->GetArchiveProperty(kpidShortComment, &prop));
- if (prop.vt == VT_BSTR)
- pi.Comment = prop.bstrVal;
- }
-
-
- UInt32 numItems;
- RINOK(archive->GetNumberOfItems(&numItems));
-
- // pi.NumSubFiles = numItems;
- // RINOK(Archive_GetArcProp_UInt(archive, kpidUnpackSize, pi.UnpackSize, pi.UnpackSize_Defined));
- // if (!pi.UnpackSize_Defined)
- {
- pi.NumSubFiles = 0;
- pi.NumSubDirs = 0;
- pi.UnpackSize = 0;
- for (UInt32 i = 0; i < numItems; i++)
- {
- UInt64 size = 0;
- bool defined = false;
- Archive_GetItem_Size(archive, i, size, defined);
- if (defined)
- {
- pi.UnpackSize_Defined = true;
- pi.UnpackSize += size;
- }
-
- bool isDir = false;
- Archive_IsItem_Folder(archive, i, isDir);
- if (isDir)
- pi.NumSubDirs++;
- else
- pi.NumSubFiles++;
- }
- if (pi.NumSubDirs != 0)
- pi.NumSubDirs_Defined = true;
- pi.NumSubFiles_Defined = true;
- }
-
- return S_OK;
-}
-
-#endif
-
-HRESULT CArc::CheckZerosTail(const COpenOptions &op, UInt64 offset)
-{
- if (!op.stream)
- return S_OK;
- RINOK(op.stream->Seek(offset, STREAM_SEEK_SET, NULL));
- const UInt32 kBufSize = 1 << 11;
- Byte buf[kBufSize];
-
- for (;;)
- {
- UInt32 processed = 0;
- RINOK(op.stream->Read(buf, kBufSize, &processed));
- if (processed == 0)
- {
- // ErrorInfo.NonZerosTail = false;
- ErrorInfo.IgnoreTail = true;
- return S_OK;
- }
- for (size_t i = 0; i < processed; i++)
- {
- if (buf[i] != 0)
- {
- // ErrorInfo.IgnoreTail = false;
- // ErrorInfo.NonZerosTail = true;
- return S_OK;
- }
- }
- }
-}
-
-#ifndef _SFX
-
-class CExtractCallback_To_OpenCallback:
- public IArchiveExtractCallback,
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
-public:
- CMyComPtr<IArchiveOpenCallback> Callback;
- UInt64 Files;
- UInt64 Offset;
-
- MY_UNKNOWN_IMP2(IArchiveExtractCallback, ICompressProgressInfo)
- INTERFACE_IArchiveExtractCallback(;)
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
- void Init(IArchiveOpenCallback *callback)
- {
- Callback = callback;
- Files = 0;
- Offset = 0;
- }
-};
-
-STDMETHODIMP CExtractCallback_To_OpenCallback::SetTotal(UInt64 /* size */)
-{
- return S_OK;
-}
-
-STDMETHODIMP CExtractCallback_To_OpenCallback::SetCompleted(const UInt64 * /* completeValue */)
-{
- return S_OK;
-}
-
-STDMETHODIMP CExtractCallback_To_OpenCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 * /* outSize */)
-{
- if (Callback)
- {
- UInt64 value = Offset;
- if (inSize)
- value += *inSize;
- return Callback->SetCompleted(&Files, &value);
- }
- return S_OK;
-}
-
-STDMETHODIMP CExtractCallback_To_OpenCallback::GetStream(UInt32 /* index */, ISequentialOutStream **outStream, Int32 /* askExtractMode */)
-{
- *outStream = 0;
- return S_OK;
-}
-
-STDMETHODIMP CExtractCallback_To_OpenCallback::PrepareOperation(Int32 /* askExtractMode */)
-{
- return S_OK;
-}
-
-STDMETHODIMP CExtractCallback_To_OpenCallback::SetOperationResult(Int32 /* operationResult */)
-{
- return S_OK;
-}
-
-static HRESULT OpenArchiveSpec(IInArchive *archive, bool needPhySize,
- IInStream *stream, const UInt64 *maxCheckStartPosition,
- IArchiveOpenCallback *openCallback,
- IArchiveExtractCallback *extractCallback)
-{
- /*
- if (needPhySize)
- {
- CMyComPtr<IArchiveOpen2> open2;
- archive->QueryInterface(IID_IArchiveOpen2, (void **)&open2);
- if (open2)
- return open2->ArcOpen2(stream, kOpenFlags_RealPhySize, openCallback);
- }
- */
- RINOK(archive->Open(stream, maxCheckStartPosition, openCallback));
- if (needPhySize)
- {
- bool phySize_Defined = false;
- UInt64 phySize = 0;
- RINOK(Archive_GetArcProp_UInt(archive, kpidPhySize, phySize, phySize_Defined));
- if (phySize_Defined)
- return S_OK;
-
- bool phySizeCantBeDetected = false;;
- RINOK(Archive_GetArcBoolProp(archive, kpidPhySizeCantBeDetected, phySizeCantBeDetected));
-
- if (!phySizeCantBeDetected)
- {
- RINOK(archive->Extract(0, (UInt32)(Int32)-1, BoolToInt(true), extractCallback));
- }
- }
- return S_OK;
-}
-
-static int FindFormatForArchiveType(CCodecs *codecs, CIntVector orderIndices, const char *name)
-{
- FOR_VECTOR (i, orderIndices)
- if (StringsAreEqualNoCase_Ascii(codecs->Formats[orderIndices[i]].Name, name))
- return i;
- return -1;
-}
-
-#endif
-
-HRESULT CArc::OpenStream2(const COpenOptions &op)
-{
- // fprintf(stdout, "\nOpen: %S", Path); fflush(stdout);
-
- Archive.Release();
- GetRawProps.Release();
- GetRootProps.Release();
-
- ErrorInfo.ClearErrors();
- ErrorInfo.ErrorFormatIndex = -1;
-
- IsParseArc = false;
- ArcStreamOffset = 0;
-
- // OutputDebugStringW(L"1");
- // OutputDebugStringW(Path);
-
- const UString fileName = ExtractFileNameFromPath(Path);
- UString extension;
- {
- int dotPos = fileName.ReverseFind(L'.');
- if (dotPos >= 0)
- extension = fileName.Ptr(dotPos + 1);
- }
-
- CIntVector orderIndices;
-
- bool searchMarkerInHandler = false;
- #ifdef _SFX
- searchMarkerInHandler = true;
- #endif
-
- CBoolArr isMainFormatArr(op.codecs->Formats.Size());
- {
- FOR_VECTOR(i, op.codecs->Formats)
- isMainFormatArr[i] = false;
- }
-
- UInt64 maxStartOffset =
- op.openType.MaxStartOffset_Defined ?
- op.openType.MaxStartOffset :
- kMaxCheckStartPosition;
-
- #ifndef _SFX
- bool isUnknownExt = false;
- #endif
-
- bool isForced = false;
- unsigned numMainTypes = 0;
- int formatIndex = op.openType.FormatIndex;
-
- if (formatIndex >= 0)
- {
- isForced = true;
- orderIndices.Add(formatIndex);
- numMainTypes = 1;
- isMainFormatArr[formatIndex] = true;
-
- searchMarkerInHandler = true;
- }
- else
- {
- unsigned numFinded = 0;
- #ifndef _SFX
- bool isPrearcExt = false;
- #endif
-
- {
- FOR_VECTOR (i, op.codecs->Formats)
- {
- const CArcInfoEx &ai = op.codecs->Formats[i];
-
- if (IgnoreSplit || !op.openType.CanReturnArc)
- if (ai.IsSplit())
- continue;
- if (op.excludedFormats->FindInSorted(i) >= 0)
- continue;
-
- #ifndef _SFX
- if (IsPreArcFormat(ai))
- isPrearcExt = true;
- #endif
-
- if (ai.FindExtension(extension) >= 0)
- {
- // PrintNumber("orderIndices.Insert", i);
- orderIndices.Insert(numFinded++, i);
- isMainFormatArr[i] = true;
- }
- else
- orderIndices.Add(i);
- }
- }
-
- if (!op.stream)
- {
- if (numFinded != 1)
- return E_NOTIMPL;
- orderIndices.DeleteFrom(1);
- }
- // PrintNumber("numFinded", numFinded );
-
- /*
- if (op.openOnlySpecifiedByExtension)
- {
- if (numFinded != 0 && !IsExeExt(extension))
- orderIndices.DeleteFrom(numFinded);
- }
- */
-
- #ifndef _SFX
-
- if (op.stream && orderIndices.Size() >= 2)
- {
- RINOK(op.stream->Seek(0, STREAM_SEEK_SET, NULL));
- CByteBuffer byteBuffer;
- CIntVector orderIndices2;
- if (numFinded == 0 || IsExeExt(extension))
- {
- // signature search was here
- }
- else if (extension == L"000" || extension == L"001")
- {
- int i = FindFormatForArchiveType(op.codecs, orderIndices, "rar");
- if (i >= 0)
- {
- const size_t kBufSize = (1 << 10);
- byteBuffer.Alloc(kBufSize);
- size_t processedSize = kBufSize;
- RINOK(ReadStream(op.stream, byteBuffer, &processedSize));
- if (processedSize >= 16)
- {
- const Byte *buf = byteBuffer;
- const Byte kRarHeader[] = { 0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00 };
- if (TestSignature(buf, kRarHeader, 7) && buf[9] == 0x73 && (buf[10] & 1) != 0)
- {
- orderIndices2.Add(orderIndices[i]);
- orderIndices[i] = -1;
- if (i >= (int)numFinded)
- numFinded++;
- }
- }
- }
- }
- else
- {
- const size_t kBufSize = (1 << 10);
- byteBuffer.Alloc(kBufSize);
- size_t processedSize = kBufSize;
- RINOK(ReadStream(op.stream, byteBuffer, &processedSize));
- if (processedSize == 0)
- return S_FALSE;
-
- /*
- check type order:
- 1) matched extension, no signuature
- 2) matched extension, matched signuature
- // 3) no signuature
- // 4) matched signuature
- */
-
- MakeCheckOrder(op.codecs, orderIndices, numFinded, orderIndices2, NULL, 0);
- MakeCheckOrder(op.codecs, orderIndices, numFinded, orderIndices2, byteBuffer, processedSize);
- // MakeCheckOrder(op.codecs, orderIndices, orderIndices.Size(), orderIndices2, NULL, 0);
- // MakeCheckOrder(op.codecs, orderIndices, orderIndices.Size(), orderIndices2, byteBuffer, processedSize);
- }
-
- FOR_VECTOR (i, orderIndices)
- {
- int val = orderIndices[i];
- if (val != -1)
- orderIndices2.Add(val);
- }
- orderIndices = orderIndices2;
- }
-
- if (orderIndices.Size() >= 2)
- {
- int iIso = FindFormatForArchiveType(op.codecs, orderIndices, "iso");
- int iUdf = FindFormatForArchiveType(op.codecs, orderIndices, "udf");
- if (iUdf > iIso && iIso >= 0)
- {
- int isoIndex = orderIndices[iIso];
- int udfIndex = orderIndices[iUdf];
- orderIndices[iUdf] = isoIndex;
- orderIndices[iIso] = udfIndex;
- }
- }
-
- numMainTypes = numFinded;
- isUnknownExt = (numMainTypes == 0) || isPrearcExt;
-
- #else // _SFX
-
- numMainTypes = orderIndices.Size();
-
- #endif
- }
-
- UInt64 fileSize = 0;
- if (op.stream)
- {
- RINOK(op.stream->Seek(0, STREAM_SEEK_END, &fileSize));
- RINOK(op.stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
- FileSize = fileSize;
-
-
- #ifndef _SFX
-
- CBoolArr skipFrontalFormat(op.codecs->Formats.Size());
- {
- FOR_VECTOR(i, op.codecs->Formats)
- skipFrontalFormat[i] = false;
- }
-
- #endif
-
- const COpenType &mode = op.openType;
-
-
-
-
-
- if (mode.CanReturnArc)
- {
- // ---------- OPEN main type by extenssion ----------
-
- unsigned numCheckTypes = orderIndices.Size();
- if (formatIndex >= 0)
- numCheckTypes = numMainTypes;
-
- for (unsigned i = 0; i < numCheckTypes; i++)
- {
- FormatIndex = orderIndices[i];
- const CArcInfoEx &ai = op.codecs->Formats[FormatIndex];
- // OutputDebugStringW(ai.Name);
-
- bool exactOnly = false;
- if (i >= numMainTypes)
- {
- if (!ai.Flags_BackwardOpen()
- // && !ai.Flags_PureStartOpen()
- )
- continue;
- exactOnly = true;
- }
-
- // Some handlers do not set total bytes. So we set it here
- RINOK(op.callback->SetTotal(NULL, &fileSize));
- if (op.stream)
- {
- RINOK(op.stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
-
- CMyComPtr<IInArchive> archive;
-
- RINOK(PrepareToOpen(op, FormatIndex, archive));
- if (!archive)
- continue;
-
- HRESULT result;
- if (op.stream)
- {
- UInt64 searchLimit = (!exactOnly && searchMarkerInHandler) ? maxStartOffset: 0;
- result = archive->Open(op.stream, &searchLimit, op.callback);
- }
- else
- {
- CMyComPtr<IArchiveOpenSeq> openSeq;
- archive.QueryInterface(IID_IArchiveOpenSeq, (void **)&openSeq);
- if (!openSeq)
- return E_NOTIMPL;
- result = openSeq->OpenSeq(op.seqStream);
- }
-
- RINOK(ReadBasicProps(archive, 0, result));
-
- if (result == S_FALSE)
- {
- bool isArc = ErrorInfo.IsArc_After_NonOpen();
-
- #ifndef _SFX
- // if it's archive, we allow another open attempt for parser
- if (!mode.CanReturnParser || !isArc)
- skipFrontalFormat[FormatIndex] = true;
- #endif
-
- if (exactOnly)
- continue;
-
- if (i == 0 && numMainTypes == 1)
- {
- // we set NonOpenErrorInfo, only if there is only one main format (defined by extension).
- ErrorInfo.ErrorFormatIndex = FormatIndex;
- NonOpen_ErrorInfo = ErrorInfo;
-
- if (!mode.CanReturnParser && isArc)
- {
- // if (formatIndex < 0 && !searchMarkerInHandler)
- {
- // if bad archive was detected, we don't need additional open attempts
- #ifndef _SFX
- if (!IsPreArcFormat(ai) /* || !mode.SkipSfxStub */)
- #endif
- return S_FALSE;
- }
- }
- }
-
- /*
- #ifndef _SFX
- if (IsExeExt(extension) || ai.Flags_PreArc())
- {
- // openOnlyFullArc = false;
- // canReturnTailArc = true;
- // limitSignatureSearch = true;
- }
- #endif
- */
-
- continue;
- }
-
- RINOK(result);
-
- #ifndef _SFX
-
- bool isMainFormat = isMainFormatArr[FormatIndex];
- const COpenSpecFlags &specFlags = mode.GetSpec(isForced, isMainFormat, isUnknownExt);
-
- bool thereIsTail = ErrorInfo.ThereIsTail;
- if (thereIsTail && mode.ZerosTailIsAllowed)
- {
- RINOK(CheckZerosTail(op, Offset + PhySize));
- if (ErrorInfo.IgnoreTail)
- thereIsTail = false;
- }
-
- if (Offset > 0)
- {
- if (exactOnly
- || !searchMarkerInHandler
- || !specFlags.CanReturn_NonStart()
- || (mode.MaxStartOffset_Defined && (UInt64)Offset > mode.MaxStartOffset))
- continue;
- }
- if (thereIsTail)
- {
- if (Offset > 0)
- {
- if (!specFlags.CanReturnMid)
- continue;
- }
- else if (!specFlags.CanReturnFrontal)
- continue;
- }
-
- if (Offset > 0 || thereIsTail)
- {
- if (formatIndex < 0)
- {
- if (IsPreArcFormat(ai))
- {
- // openOnlyFullArc = false;
- // canReturnTailArc = true;
- /*
- if (mode.SkipSfxStub)
- limitSignatureSearch = true;
- */
- // if (mode.SkipSfxStub)
- {
- // skipFrontalFormat[FormatIndex] = true;
- continue;
- }
- }
- }
- }
-
- #endif
-
- Archive = archive;
- return S_OK;
- }
- }
-
-
-
- #ifndef _SFX
-
- if (!op.stream)
- return S_FALSE;
-
- if (formatIndex >= 0 && !mode.CanReturnParser)
- {
- if (mode.MaxStartOffset_Defined)
- {
- if (mode.MaxStartOffset == 0)
- return S_FALSE;
- }
- else
- {
- const CArcInfoEx &ai = op.codecs->Formats[formatIndex];
- if (ai.FindExtension(extension) >= 0)
- {
- const CArcInfoEx &ai = op.codecs->Formats[formatIndex];
- if (ai.Flags_FindSignature() && searchMarkerInHandler)
- return S_FALSE;
- }
- }
- }
-
- NArchive::NParser::CHandler *handlerSpec = new NArchive::NParser::CHandler;
- CMyComPtr<IInArchive> handler = handlerSpec;
-
- CExtractCallback_To_OpenCallback *extractCallback_To_OpenCallback_Spec = new CExtractCallback_To_OpenCallback;
- CMyComPtr<IArchiveExtractCallback> extractCallback_To_OpenCallback = extractCallback_To_OpenCallback_Spec;
- extractCallback_To_OpenCallback_Spec->Init(op.callback);
-
- {
- // ---------- Check all possible START archives ----------
- // this code is better for full file archives than Parser's code.
-
- CByteBuffer byteBuffer;
- bool endOfFile = false;
- size_t processedSize;
- {
- size_t bufSize = 1 << 20; // it must be larger than max signature offset or IsArcFunc offset ((1 << 19) + x for UDF)
- if (bufSize > fileSize)
- {
- bufSize = (size_t)fileSize;
- endOfFile = true;
- }
- byteBuffer.Alloc(bufSize);
- RINOK(op.stream->Seek(0, STREAM_SEEK_SET, NULL));
- processedSize = bufSize;
- RINOK(ReadStream(op.stream, byteBuffer, &processedSize));
- if (processedSize == 0)
- return S_FALSE;
- if (processedSize < bufSize)
- endOfFile = true;
- }
- CUIntVector sortedFormats;
-
- unsigned i;
-
- int splitIndex = -1;
-
- for (i = 0; i < orderIndices.Size(); i++)
- {
- unsigned form = orderIndices[i];
- if (skipFrontalFormat[form])
- continue;
- const CArcInfoEx &ai = op.codecs->Formats[form];
- if (ai.IsSplit())
- {
- splitIndex = form;
- continue;
- }
-
- if (ai.IsArcFunc)
- {
- UInt32 isArcRes = ai.IsArcFunc(byteBuffer, processedSize);
- if (isArcRes == k_IsArc_Res_NO)
- continue;
- if (isArcRes == k_IsArc_Res_NEED_MORE && endOfFile)
- continue;
- // if (isArcRes == k_IsArc_Res_YES_LOW_PROB) continue;
- sortedFormats.Insert(0, form);
- continue;
- }
-
- bool isNewStyleSignature = IsNewStyleSignature(ai);
- bool needCheck = !isNewStyleSignature
- || ai.Signatures.IsEmpty()
- || ai.Flags_PureStartOpen()
- || ai.Flags_StartOpen()
- || ai.Flags_BackwardOpen();
-
- if (isNewStyleSignature && !ai.Signatures.IsEmpty())
- {
- unsigned k;
- for (k = 0; k < ai.Signatures.Size(); k++)
- {
- const CByteBuffer &sig = ai.Signatures[k];
- UInt32 signatureEnd = ai.SignatureOffset + (UInt32)sig.Size();
- if (processedSize < signatureEnd)
- {
- if (!endOfFile)
- needCheck = true;
- }
- else if (memcmp(sig, byteBuffer + ai.SignatureOffset, sig.Size()) == 0)
- break;
- }
- if (k != ai.Signatures.Size())
- {
- sortedFormats.Insert(0, form);
- continue;
- }
- }
- if (needCheck)
- sortedFormats.Add(form);
- }
-
- if (splitIndex >= 0)
- sortedFormats.Insert(0, splitIndex);
-
- for (i = 0; i < sortedFormats.Size(); i++)
- {
- FormatIndex = sortedFormats[i];
- const CArcInfoEx &ai = op.codecs->Formats[FormatIndex];
-
- RINOK(op.callback->SetTotal(NULL, &fileSize));
- RINOK(op.stream->Seek(0, STREAM_SEEK_SET, NULL));
-
- CMyComPtr<IInArchive> archive;
- RINOK(PrepareToOpen(op, FormatIndex, archive));
- if (!archive)
- continue;
-
- PRF(printf("\nSorted Open %S", (const wchar_t *)ai.Name));
- HRESULT result;
- {
- UInt64 searchLimit = 0;
- /*
- if (mode.CanReturnArc)
- result = archive->Open(op.stream, &searchLimit, op.callback);
- else
- */
- result = OpenArchiveSpec(archive, !mode.CanReturnArc, op.stream, &searchLimit, op.callback, extractCallback_To_OpenCallback);
- }
-
- if (result == S_FALSE)
- {
- skipFrontalFormat[FormatIndex] = true;
- // FIXME: maybe we must use LenIsUnknown.
- // printf(" OpenForSize Error");
- continue;
- }
- RINOK(result);
-
- RINOK(ReadBasicProps(archive, 0, result));
-
- if (Offset > 0)
- {
- continue; // good handler doesn't return such Offset > 0
- // but there are some cases like false prefixed PK00 archive, when
- // we can support it?
- }
-
- NArchive::NParser::CParseItem pi;
- pi.Offset = Offset;
- pi.Size = AvailPhySize;
-
- // bool needScan = false;
-
- if (!PhySizeDefined)
- {
- // it's for Z format
- pi.LenIsUnknown = true;
- // needScan = true;
- // phySize = arcRem;
- // nextNeedCheckStartOpen = false;
- }
-
- /*
- if (OkPhySize_Defined)
- pi.OkSize = pi.OkPhySize;
- else
- pi.OkSize = pi.Size;
- */
-
- pi.NormalizeOffset();
- // printf(" phySize = %8d", (unsigned)phySize);
-
-
- if (mode.CanReturnArc)
- {
- bool isMainFormat = isMainFormatArr[FormatIndex];
- const COpenSpecFlags &specFlags = mode.GetSpec(isForced, isMainFormat, isUnknownExt);
- bool openCur = false;
-
- if (!ErrorInfo.ThereIsTail)
- openCur = true;
- else
- {
- if (mode.ZerosTailIsAllowed)
- {
- RINOK(CheckZerosTail(op, Offset + PhySize));
- if (ErrorInfo.IgnoreTail)
- openCur = true;
- }
- if (!openCur)
- {
- openCur = specFlags.CanReturnFrontal;
- if (formatIndex < 0) // format is not forced
- {
- if (IsPreArcFormat(ai))
- {
- // if (mode.SkipSfxStub)
- {
- openCur = false;
- }
- }
- }
- }
- }
-
- if (openCur)
- {
- InStream = op.stream;
- Archive = archive;
- return S_OK;
- }
- }
-
- skipFrontalFormat[FormatIndex] = true;
-
-
- // if (!mode.CanReturnArc)
- /*
- if (!ErrorInfo.ThereIsTail)
- continue;
- */
- if (pi.Offset == 0 && !pi.LenIsUnknown && pi.Size >= FileSize)
- continue;
-
- // printf("\nAdd offset = %d", (int)pi.Offset);
- RINOK(ReadParseItemProps(archive, ai, pi));
- handlerSpec->AddItem(pi);
- }
- }
-
-
-
-
-
- // ---------- PARSER ----------
-
- CUIntVector arc2sig; // formatIndex to signatureIndex
- CUIntVector sig2arc; // signatureIndex to formatIndex;
- {
- unsigned sum = 0;
- FOR_VECTOR (i, op.codecs->Formats)
- {
- arc2sig.Add(sum);
- const CObjectVector<CByteBuffer> &sigs = op.codecs->Formats[i].Signatures;
- sum += sigs.Size();
- FOR_VECTOR (k, sigs)
- sig2arc.Add(i);
- }
- }
-
- {
- CArchiveOpenCallback_Offset *openCallback_Offset_Spec = new CArchiveOpenCallback_Offset;
- CMyComPtr<IArchiveOpenCallback> openCallback_Offset = openCallback_Offset_Spec;
-
- const size_t kBeforeSize = 1 << 16;
- const size_t kAfterSize = 1 << 20;
- const size_t kBufSize = 1 << 22; // it must be more than kBeforeSize + kAfterSize
-
- const UInt32 kNumVals = (UInt32)1 << (kNumHashBytes * 8);
- CByteArr hashBuffer(kNumVals);
- Byte *hash = hashBuffer;
- memset(hash, 0xFF, kNumVals);
- Byte prevs[256];
- memset(prevs, 0xFF, sizeof(prevs));
- if (sig2arc.Size() >= 0xFF)
- return S_FALSE;
-
- CUIntVector difficultFormats;
- CBoolArr difficultBools(256);
- {
- for (unsigned i = 0; i < 256; i++)
- difficultBools[i] = false;
- }
-
- bool thereAreHandlersForSearch = false;
-
- // UInt32 maxSignatureEnd = 0;
-
- FOR_VECTOR (i, orderIndices)
- {
- int index = orderIndices[i];
- if (index < 0)
- continue;
- const CArcInfoEx &ai = op.codecs->Formats[index];
- bool isDifficult = false;
- // if (ai.Version < 0x91F) // we don't use parser with old DLL (before 9.31)
- if (!ai.NewInterface)
- isDifficult = true;
- else
- {
- if (ai.Flags_StartOpen())
- isDifficult = true;
- FOR_VECTOR (k, ai.Signatures)
- {
- const CByteBuffer &sig = ai.Signatures[k];
- /*
- UInt32 signatureEnd = ai.SignatureOffset + (UInt32)sig.Size();
- if (maxSignatureEnd < signatureEnd)
- maxSignatureEnd = signatureEnd;
- */
- if (sig.Size() < kNumHashBytes)
- {
- isDifficult = true;
- continue;
- }
- thereAreHandlersForSearch = true;
- UInt32 v = HASH_VAL(sig, 0);
- unsigned sigIndex = arc2sig[index] + k;
- prevs[sigIndex] = hash[v];
- hash[v] = (Byte)sigIndex;
- }
- }
- if (isDifficult)
- {
- difficultFormats.Add(index);
- difficultBools[index] = true;
- }
- }
-
- if (!thereAreHandlersForSearch)
- {
- // openOnlyFullArc = true;
- // canReturnTailArc = true;
- }
-
- RINOK(op.stream->Seek(0, STREAM_SEEK_SET, NULL));
-
- CLimitedCachedInStream *limitedStreamSpec = new CLimitedCachedInStream;
- CMyComPtr<IInStream> limitedStream = limitedStreamSpec;
- limitedStreamSpec->SetStream(op.stream);
-
- openCallback_Offset_Spec->Callback = op.callback;
-
- #ifndef _NO_CRYPTO
- if (op.callback)
- {
- openCallback_Offset_Spec->Callback.QueryInterface(IID_ICryptoGetTextPassword, &openCallback_Offset_Spec->GetTextPassword);
- }
- #endif
-
- RINOK(op.callback->SetTotal(NULL, &fileSize));
- CByteBuffer &byteBuffer = limitedStreamSpec->Buffer;
- byteBuffer.Alloc(kBufSize);
-
- UInt64 callbackPrev = 0;
- bool needCheckStartOpen = true; // = true, if we need to test all archives types for current pos.
-
- bool endOfFile = false;
- UInt64 bufPhyPos = 0;
- size_t bytesInBuf = 0;
- // UInt64 prevPos = 0;
-
- // ---------- Main Scan Loop ----------
-
- UInt64 pos = 0;
-
- if (!mode.EachPos && handlerSpec->_items.Size() == 1)
- {
- NArchive::NParser::CParseItem &pi = handlerSpec->_items[0];
- if (!pi.LenIsUnknown && pi.Offset == 0)
- pos = pi.Size;
- }
-
- for (;;)
- {
- // printf("\nPos = %d", (int)pos);
- UInt64 posInBuf = pos - bufPhyPos;
-
- // if (pos > ((UInt64)1 << 35)) break;
-
- if (!endOfFile)
- {
- if (bytesInBuf < kBufSize)
- {
- size_t processedSize = kBufSize - bytesInBuf;
- // printf("\nRead ask = %d", (unsigned)processedSize);
- UInt64 seekPos = bufPhyPos + bytesInBuf;
- RINOK(op.stream->Seek(bufPhyPos + bytesInBuf, STREAM_SEEK_SET, NULL));
- RINOK(ReadStream(op.stream, byteBuffer + bytesInBuf, &processedSize));
- // printf(" processed = %d", (unsigned)processedSize);
- if (processedSize == 0)
- {
- fileSize = seekPos;
- endOfFile = true;
- }
- else
- {
- bytesInBuf += processedSize;
- limitedStreamSpec->SetCache(processedSize, (size_t)bufPhyPos);
- }
- continue;
- }
-
- if (bytesInBuf < posInBuf)
- {
- UInt64 skipSize = posInBuf - bytesInBuf;
- if (skipSize <= kBeforeSize)
- {
- size_t keepSize = (size_t)(kBeforeSize - skipSize);
- // printf("\nmemmove skip = %d", (int)keepSize);
- memmove(byteBuffer, byteBuffer + bytesInBuf - keepSize, keepSize);
- bytesInBuf = keepSize;
- bufPhyPos = pos - keepSize;
- continue;
- }
- // printf("\nSkip %d", (int)(skipSize - kBeforeSize));
- // RINOK(op.stream->Seek(skipSize - kBeforeSize, STREAM_SEEK_CUR, NULL));
- bytesInBuf = 0;
- bufPhyPos = pos - kBeforeSize;
- continue;
- }
-
- if (bytesInBuf - posInBuf < kAfterSize)
- {
- size_t beg = (size_t)posInBuf - kBeforeSize;
- // printf("\nmemmove for after beg = %d", (int)beg);
- memmove(byteBuffer, byteBuffer + beg, bytesInBuf - beg);
- bufPhyPos += beg;
- bytesInBuf -= beg;
- continue;
- }
- }
-
- if (pos >= callbackPrev + (1 << 23))
- {
- openCallback_Offset_Spec->Files = handlerSpec->_items.Size();
- openCallback_Offset_Spec->Offset = pos;
- RINOK(openCallback_Offset->SetCompleted(NULL, NULL));
- callbackPrev = pos;
- }
-
- {
- UInt64 endPos = bufPhyPos + bytesInBuf;
- if (fileSize < endPos)
- {
- FileSize = fileSize; // why ????
- fileSize = endPos;
- }
- }
-
- size_t availSize = bytesInBuf - (size_t)posInBuf;
- if (availSize < kNumHashBytes)
- break;
- size_t scanSize = availSize -
- ((availSize >= kAfterSize) ? kAfterSize : kNumHashBytes);
-
- {
- /*
- UInt64 scanLimit = openOnlyFullArc ?
- maxSignatureEnd :
- op.openType.ScanSize + maxSignatureEnd;
- */
- if (!mode.CanReturnParser)
- {
- if (pos > maxStartOffset)
- break;
- UInt64 remScan = maxStartOffset - pos;
- if (scanSize > remScan)
- scanSize = (size_t)remScan;
- }
- }
-
- scanSize++;
-
- const Byte *buf = byteBuffer + (size_t)posInBuf;
- size_t ppp = 0;
-
- if (!needCheckStartOpen)
- {
- for (; ppp < scanSize && hash[HASH_VAL(buf, ppp)] == 0xFF; ppp++);
- pos += ppp;
- if (ppp == scanSize)
- continue;
- }
-
- UInt32 v = HASH_VAL(buf, ppp);
- bool nextNeedCheckStartOpen = true;
- unsigned i = hash[v];
- unsigned indexOfDifficult = 0;
-
- // ---------- Open Loop for Current Pos ----------
- bool wasOpen = false;
-
- for (;;)
- {
- unsigned index;
- bool isDifficult;
- if (needCheckStartOpen && indexOfDifficult < difficultFormats.Size())
- {
- index = difficultFormats[indexOfDifficult++];
- isDifficult = true;
- }
- else
- {
- if (i == 0xFF)
- break;
- index = sig2arc[i];
- unsigned sigIndex = i - arc2sig[index];
- i = prevs[i];
- if (needCheckStartOpen && difficultBools[index])
- continue;
- const CArcInfoEx &ai = op.codecs->Formats[index];
-
- if (pos < ai.SignatureOffset)
- continue;
-
- /*
- if (openOnlyFullArc)
- if (pos != ai.SignatureOffset)
- continue;
- */
-
- const CByteBuffer &sig = ai.Signatures[sigIndex];
-
- if (ppp + sig.Size() > availSize
- || !TestSignature(buf + ppp, sig, sig.Size()))
- continue;
- // printf("\nSignature OK: %10S %8x %5d", (const wchar_t *)ai.Name, (int)pos, (int)(pos - prevPos));
- // prevPos = pos;
- isDifficult = false;
- }
-
- const CArcInfoEx &ai = op.codecs->Formats[index];
-
-
- if ((isDifficult && pos == 0) || ai.SignatureOffset == pos)
- {
- // we don't check same archive second time */
- if (skipFrontalFormat[index])
- continue;
- }
-
- UInt64 startArcPos = pos;
- if (!isDifficult)
- {
- if (pos < ai.SignatureOffset)
- continue;
- startArcPos = pos - ai.SignatureOffset;
- /*
- // we don't need the check for Z files
- if (startArcPos < handlerSpec->GetLastEnd())
- continue;
- */
- }
-
- if (ai.IsArcFunc && startArcPos >= bufPhyPos)
- {
- size_t offsetInBuf = (size_t)(startArcPos - bufPhyPos);
- if (offsetInBuf < bytesInBuf)
- {
- UInt32 isArcRes = ai.IsArcFunc(byteBuffer + offsetInBuf, bytesInBuf - offsetInBuf);
- if (isArcRes == k_IsArc_Res_NO)
- continue;
- if (isArcRes == k_IsArc_Res_NEED_MORE && endOfFile)
- continue;
- /*
- if (isArcRes == k_IsArc_Res_YES_LOW_PROB)
- {
- // if (pos != ai.SignatureOffset)
- continue;
- }
- */
- }
- // printf("\nIsArc OK: %S", (const wchar_t *)ai.Name);
- }
-
- /*
- if (pos == 67109888)
- pos = pos;
- */
- PRF(printf("\npos = %9I64d : %S", pos, (const wchar_t *)ai.Name));
-
- bool isMainFormat = isMainFormatArr[index];
- const COpenSpecFlags &specFlags = mode.GetSpec(isForced, isMainFormat, isUnknownExt);
-
- CMyComPtr<IInArchive> archive;
- RINOK(PrepareToOpen(op, index, archive));
- if (!archive)
- return E_FAIL;
-
- // OutputDebugStringW(ai.Name);
-
- UInt64 rem = fileSize - startArcPos;
-
- UInt64 arcStreamOffset = 0;
-
- if (ai.Flags_UseGlobalOffset())
- {
- limitedStreamSpec->InitAndSeek(0, fileSize);
- limitedStream->Seek(startArcPos, STREAM_SEEK_SET, NULL);
- }
- else
- {
- limitedStreamSpec->InitAndSeek(startArcPos, rem);
- arcStreamOffset = startArcPos;
- }
-
- UInt64 maxCheckStartPosition = 0;
- openCallback_Offset_Spec->Files = handlerSpec->_items.Size();
- openCallback_Offset_Spec->Offset = startArcPos;
- // HRESULT result = archive->Open(limitedStream, &maxCheckStartPosition, openCallback_Offset);
- extractCallback_To_OpenCallback_Spec->Files = 0;
- extractCallback_To_OpenCallback_Spec->Offset = startArcPos;
-
- HRESULT result = OpenArchiveSpec(archive, true, limitedStream, &maxCheckStartPosition, openCallback_Offset, extractCallback_To_OpenCallback);
-
- RINOK(ReadBasicProps(archive, ai.Flags_UseGlobalOffset() ? 0 : startArcPos, result));
-
- bool isOpen = false;
- if (result == S_FALSE)
- {
- if (!mode.CanReturnParser)
- {
- if (formatIndex < 0 && ErrorInfo.IsArc_After_NonOpen())
- {
- ErrorInfo.ErrorFormatIndex = index;
- NonOpen_ErrorInfo = ErrorInfo;
- // if archive was detected, we don't need additional open attempts
- return S_FALSE;
- }
- continue;
- }
- if (!ErrorInfo.IsArc_After_NonOpen() || !PhySizeDefined || PhySize == 0)
- continue;
- }
- else
- {
- isOpen = true;
- RINOK(result);
- PRF(printf(" OK "));
- }
-
- // fprintf(stderr, "\n %8X %S", startArcPos, Path);
- // printf("\nOpen OK: %S", ai.Name);
-
-
- NArchive::NParser::CParseItem pi;
- pi.Offset = startArcPos;
-
- if (ai.Flags_UseGlobalOffset())
- pi.Offset = Offset;
- else if (Offset != 0)
- return E_FAIL;
- UInt64 arcRem = FileSize - pi.Offset;
- UInt64 phySize = arcRem;
- bool phySizeDefined = PhySizeDefined;
- if (phySizeDefined)
- {
- if (pi.Offset + PhySize > FileSize)
- {
- // ErrorInfo.ThereIsTail = true;
- PhySize = FileSize - pi.Offset;
- }
- phySize = PhySize;
- }
- if (phySize == 0 || (UInt64)phySize > ((UInt64)1 << 63))
- return E_FAIL;
-
- /*
- if (!ai.UseGlobalOffset)
- {
- if (phySize > arcRem)
- {
- ThereIsTail = true;
- phySize = arcRem;
- }
- }
- */
-
- bool needScan = false;
-
-
- if (isOpen && !phySizeDefined)
- {
- // it's for Z format
- pi.LenIsUnknown = true;
- needScan = true;
- phySize = arcRem;
- nextNeedCheckStartOpen = false;
- }
-
- pi.Size = phySize;
- /*
- if (OkPhySize_Defined)
- pi.OkSize = OkPhySize;
- */
- pi.NormalizeOffset();
- // printf(" phySize = %8d", (unsigned)phySize);
-
- /*
- if (needSkipFullArc)
- if (pi.Offset == 0 && phySizeDefined && pi.Size >= fileSize)
- continue;
- */
- if (pi.Offset == 0 && !pi.LenIsUnknown && pi.Size >= FileSize)
- {
- // it's possible for dmg archives
- if (!mode.CanReturnArc)
- continue;
- }
-
- if (mode.EachPos)
- pos++;
- else if (needScan)
- {
- pos++;
- /*
- if (!OkPhySize_Defined)
- pos++;
- else
- pos = pi.Offset + pi.OkSize;
- */
- }
- else
- pos = pi.Offset + pi.Size;
-
-
- RINOK(ReadParseItemProps(archive, ai, pi));
-
- if (pi.Offset < startArcPos && !mode.EachPos /* && phySizeDefined */)
- {
- /* It's for DMG format.
- This code deletes all previous items that are included to current item */
-
- while (!handlerSpec->_items.IsEmpty())
- {
- {
- const NArchive::NParser::CParseItem &back = handlerSpec->_items.Back();
- if (back.Offset < pi.Offset)
- break;
- if (back.Offset + back.Size > pi.Offset + pi.Size)
- break;
- }
- handlerSpec->_items.DeleteBack();
- }
- }
-
-
- if (isOpen && mode.CanReturnArc && phySizeDefined)
- {
- // if (pi.Offset + pi.Size >= fileSize)
- bool openCur = false;
-
- bool thereIsTail = ErrorInfo.ThereIsTail;
- if (thereIsTail && mode.ZerosTailIsAllowed)
- {
- RINOK(CheckZerosTail(op, arcStreamOffset + Offset + PhySize));
- if (ErrorInfo.IgnoreTail)
- thereIsTail = false;
- }
-
- if (pi.Offset != 0)
- {
- if (!pi.IsNotArcType)
- if (thereIsTail)
- openCur = specFlags.CanReturnMid;
- else
- openCur = specFlags.CanReturnTail;
- }
- else
- {
- if (!thereIsTail)
- openCur = true;
- else
- openCur = specFlags.CanReturnFrontal;
-
-
- if (formatIndex >= -2)
- openCur = true;
- }
- if (formatIndex < 0 && pi.IsSelfExe /* && mode.SkipSfxStub */)
- openCur = false;
-
- // We open file as SFX, if there is front archive or first archive is "Self Executable"
- if (!openCur && !pi.IsSelfExe && !thereIsTail &&
- (!pi.IsNotArcType || pi.Offset == 0))
- {
- if (handlerSpec->_items.IsEmpty())
- {
- if (specFlags.CanReturnTail)
- openCur = true;
- }
- else if (handlerSpec->_items.Size() == 1)
- {
- if (handlerSpec->_items[0].IsSelfExe)
- {
- if (mode.SpecUnknownExt.CanReturnTail)
- openCur = true;
- }
- }
- }
-
- if (openCur)
- {
- InStream = op.stream;
- Archive = archive;
- FormatIndex = index;
- ArcStreamOffset = arcStreamOffset;
- return S_OK;
- }
- }
-
- /*
- if (openOnlyFullArc)
- {
- ErrorInfo.ClearErrors();
- return S_FALSE;
- }
- */
-
- pi.FormatIndex = index;
-
- // printf("\nAdd offset = %d", (int)pi.Offset);
- handlerSpec->AddItem(pi);
- wasOpen = true;
- break;
- }
- // ---------- End of Open Loop for Current Pos ----------
-
- if (!wasOpen)
- pos++;
- needCheckStartOpen = (nextNeedCheckStartOpen && wasOpen);
- }
- // ---------- End of Main Scan Loop ----------
-
- /*
- if (handlerSpec->_items.Size() == 1)
- {
- const NArchive::NParser::CParseItem &pi = handlerSpec->_items[0];
- if (pi.Size == fileSize && pi.Offset == 0)
- {
- Archive = archive;
- FormatIndex2 = pi.FormatIndex;
- return S_OK;
- }
- }
- */
-
- if (mode.CanReturnParser)
- {
- bool returnParser = (handlerSpec->_items.Size() == 1); // it's possible if fileSize was not correct at start of parsing
- handlerSpec->AddUnknownItem(fileSize);
- if (handlerSpec->_items.Size() == 0)
- return S_FALSE;
- if (returnParser || handlerSpec->_items.Size() != 1)
- {
- // return S_FALSE;
- handlerSpec->_stream = op.stream;
- Archive = handler;
- ErrorInfo.ClearErrors();
- IsParseArc = true;
- FormatIndex = -1; // It's parser
- Offset = 0;
- return S_OK;
- }
- }
- }
-
- #endif
-
- if (!Archive)
- return S_FALSE;
- return S_OK;
-}
-
-HRESULT CArc::OpenStream(const COpenOptions &op)
-{
- RINOK(OpenStream2(op));
- // PrintNumber("op.formatIndex 3", op.formatIndex);
-
- if (Archive)
- {
- GetRawProps.Release();
- GetRootProps.Release();
- Archive->QueryInterface(IID_IArchiveGetRawProps, (void **)&GetRawProps);
- Archive->QueryInterface(IID_IArchiveGetRootProps, (void **)&GetRootProps);
-
- RINOK(Archive_GetArcBoolProp(Archive, kpidIsTree, IsTree));
- RINOK(Archive_GetArcBoolProp(Archive, kpidIsDeleted, Ask_Deleted));
- RINOK(Archive_GetArcBoolProp(Archive, kpidIsAltStream, Ask_AltStream));
- RINOK(Archive_GetArcBoolProp(Archive, kpidIsAux, Ask_Aux));
- RINOK(Archive_GetArcBoolProp(Archive, kpidINode, Ask_INode));
-
- const UString fileName = ExtractFileNameFromPath(Path);
- UString extension;
- {
- int dotPos = fileName.ReverseFind(L'.');
- if (dotPos >= 0)
- extension = fileName.Ptr(dotPos + 1);
- }
-
- DefaultName.Empty();
- if (FormatIndex >= 0)
- {
- const CArcInfoEx &ai = op.codecs->Formats[FormatIndex];
- if (ai.Exts.Size() == 0)
- DefaultName = GetDefaultName2(fileName, L"", L"");
- else
- {
- int subExtIndex = ai.FindExtension(extension);
- if (subExtIndex < 0)
- subExtIndex = 0;
- const CArcExtInfo &extInfo = ai.Exts[subExtIndex];
- DefaultName = GetDefaultName2(fileName, extInfo.Ext, extInfo.AddExt);
- }
- }
- }
-
- return S_OK;
-}
-
-#ifdef _SFX
-
-#ifdef _WIN32
- static const wchar_t *k_ExeExt = L".exe";
- static const unsigned k_ExeExt_Len = 4;
-#else
- static const wchar_t *k_ExeExt = L"";
- static const unsigned k_ExeExt_Len = 0;
-#endif
-
-#endif
-
-HRESULT CArc::OpenStreamOrFile(COpenOptions &op)
-{
- CMyComPtr<IInStream> fileStream;
- CMyComPtr<ISequentialInStream> seqStream;
- CInFileStream *fileStreamSpec = NULL;
- if (op.stdInMode)
- {
- seqStream = new CStdInFileStream;
- op.seqStream = seqStream;
- }
- else if (!op.stream)
- {
- fileStreamSpec = new CInFileStream;
- fileStream = fileStreamSpec;
- Path = filePath;
- if (!fileStreamSpec->Open(us2fs(Path)))
- {
- return GetLastError();
- }
- op.stream = fileStream;
- #ifdef _SFX
- IgnoreSplit = true;
- #endif
- }
-
- /*
- if (callback)
- {
- UInt64 fileSize;
- RINOK(op.stream->Seek(0, STREAM_SEEK_END, &fileSize));
- RINOK(op.callback->SetTotal(NULL, &fileSize))
- }
- */
-
- HRESULT res = OpenStream(op);
- IgnoreSplit = false;
-
- #ifdef _SFX
-
- if (res != S_FALSE
- || !fileStreamSpec
- || !op.callbackSpec
- || NonOpen_ErrorInfo.IsArc_After_NonOpen())
- return res;
- {
- if (filePath.Len() > k_ExeExt_Len
- && MyStringCompareNoCase(filePath.RightPtr(k_ExeExt_Len), k_ExeExt) == 0)
- {
- const UString path2 = filePath.Left(filePath.Len() - k_ExeExt_Len);
- FOR_VECTOR (i, op.codecs->Formats)
- {
- const CArcInfoEx &ai = op.codecs->Formats[i];
- if (ai.IsSplit())
- continue;
- UString path3 = path2;
- path3 += L".";
- path3 += ai.GetMainExt(); // "7z" for SFX.
- Path = path3 + L".001";
- bool isOk = op.callbackSpec->SetSecondFileInfo(us2fs(Path));
- if (!isOk)
- {
- Path = path3;
- isOk = op.callbackSpec->SetSecondFileInfo(us2fs(Path));
- }
- if (isOk)
- {
- if (fileStreamSpec->Open(us2fs(Path)))
- {
- op.stream = fileStream;
- NonOpen_ErrorInfo.ClearErrors_Full();
- if (OpenStream(op) == S_OK)
- return S_OK;
- }
- }
- }
- }
- }
-
- #endif
-
- return res;
-}
-
-void CArchiveLink::KeepModeForNextOpen()
-{
- for (int i = Arcs.Size() - 1; i >= 0; i--)
- {
- CMyComPtr<IArchiveKeepModeForNextOpen> keep;
- Arcs[i].Archive->QueryInterface(IID_IArchiveKeepModeForNextOpen, (void **)&keep);
- if (keep)
- keep->KeepModeForNextOpen();
- }
-}
-
-HRESULT CArchiveLink::Close()
-{
- for (int i = Arcs.Size() - 1; i >= 0; i--)
- {
- RINOK(Arcs[i].Close());
- }
- IsOpen = false;
- // ErrorsText.Empty();
- return S_OK;
-}
-
-void CArchiveLink::Release()
-{
- // NonOpenErrorFormatIndex = -1;
- NonOpen_ErrorInfo.ClearErrors();
- NonOpen_ArcPath.Empty();
- while (!Arcs.IsEmpty())
- Arcs.DeleteBack();
-}
-
-/*
-void CArchiveLink::Set_ErrorsText()
-{
- FOR_VECTOR(i, Arcs)
- {
- const CArc &arc = Arcs[i];
- if (!arc.ErrorFlagsText.IsEmpty())
- {
- if (!ErrorsText.IsEmpty())
- ErrorsText += L'\n';
- ErrorsText += GetUnicodeString(arc.ErrorFlagsText);
- }
- if (!arc.ErrorMessage.IsEmpty())
- {
- if (!ErrorsText.IsEmpty())
- ErrorsText += L'\n';
- ErrorsText += arc.ErrorMessage;
- }
-
- if (!arc.WarningMessage.IsEmpty())
- {
- if (!ErrorsText.IsEmpty())
- ErrorsText += L'\n';
- ErrorsText += arc.WarningMessage;
- }
- }
-}
-*/
-
-HRESULT CArchiveLink::Open(COpenOptions &op)
-{
- Release();
- if (op.types->Size() >= 32)
- return E_NOTIMPL;
-
- HRESULT resSpec;
-
- for (;;)
- {
- resSpec = S_OK;
-
- op.openType = COpenType();
- if (op.types->Size() >= 1)
- {
- COpenType latest;
- if (Arcs.Size() < op.types->Size())
- latest = (*op.types)[op.types->Size() - Arcs.Size() - 1];
- else
- {
- latest = (*op.types)[0];
- if (!latest.Recursive)
- break;
- }
- op.openType = latest;
- }
- else if (Arcs.Size() >= 32)
- break;
-
- /*
- op.formatIndex = -1;
- if (op.types->Size() >= 1)
- {
- int latest;
- if (Arcs.Size() < op.types->Size())
- latest = (*op.types)[op.types->Size() - Arcs.Size() - 1];
- else
- {
- latest = (*op.types)[0];
- if (latest != -2 && latest != -3)
- break;
- }
- if (latest >= 0)
- op.formatIndex = latest;
- else if (latest == -1 || latest == -2)
- {
- // default
- }
- else if (latest == -3)
- op.formatIndex = -2;
- else
- op.formatIndex = latest + 2;
- }
- else if (Arcs.Size() >= 32)
- break;
- */
-
- if (Arcs.IsEmpty())
- {
- CArc arc;
- arc.filePath = op.filePath;
- arc.Path = op.filePath;
- arc.SubfileIndex = (UInt32)(Int32)-1;
- HRESULT result = arc.OpenStreamOrFile(op);
- if (result != S_OK)
- {
- if (result == S_FALSE)
- {
- NonOpen_ErrorInfo = arc.NonOpen_ErrorInfo;
- // NonOpenErrorFormatIndex = arc.ErrorFormatIndex;
- NonOpen_ArcPath = arc.Path;
- }
- return result;
- }
- Arcs.Add(arc);
- continue;
- }
-
- // PrintNumber("op.formatIndex 11", op.formatIndex);
-
- const CArc &arc = Arcs.Back();
-
- if (op.types->Size() > Arcs.Size())
- resSpec = E_NOTIMPL;
-
- UInt32 mainSubfile;
- {
- NCOM::CPropVariant prop;
- RINOK(arc.Archive->GetArchiveProperty(kpidMainSubfile, &prop));
- if (prop.vt == VT_UI4)
- mainSubfile = prop.ulVal;
- else
- break;
- UInt32 numItems;
- RINOK(arc.Archive->GetNumberOfItems(&numItems));
- if (mainSubfile >= numItems)
- break;
- }
-
-
- CMyComPtr<IInArchiveGetStream> getStream;
- if (arc.Archive->QueryInterface(IID_IInArchiveGetStream, (void **)&getStream) != S_OK || !getStream)
- break;
-
- CMyComPtr<ISequentialInStream> subSeqStream;
- if (getStream->GetStream(mainSubfile, &subSeqStream) != S_OK || !subSeqStream)
- break;
-
- CMyComPtr<IInStream> subStream;
- if (subSeqStream.QueryInterface(IID_IInStream, &subStream) != S_OK || !subStream)
- break;
-
- CArc arc2;
- RINOK(arc.GetItemPath(mainSubfile, arc2.Path));
-
- bool zerosTailIsAllowed;
- RINOK(Archive_GetItemBoolProp(arc.Archive, mainSubfile, kpidZerosTailIsAllowed, zerosTailIsAllowed));
-
- CMyComPtr<IArchiveOpenSetSubArchiveName> setSubArchiveName;
- op.callback->QueryInterface(IID_IArchiveOpenSetSubArchiveName, (void **)&setSubArchiveName);
- if (setSubArchiveName)
- setSubArchiveName->SetSubArchiveName(arc2.Path);
-
- arc2.SubfileIndex = mainSubfile;
-
- // CIntVector incl;
- CIntVector excl;
-
- COpenOptions op2;
- #ifndef _SFX
- op2.props = op.props;
- #endif
- op2.codecs = op.codecs;
- // op2.types = &incl;
- op2.openType = op.openType;
- op2.openType.ZerosTailIsAllowed = zerosTailIsAllowed;
- op2.excludedFormats = &excl;
- op2.stdInMode = false;
- op2.stream = subStream;
- op2.filePath = arc2.Path;
- op2.callback = op.callback;
- op2.callbackSpec = op.callbackSpec;
-
-
- HRESULT result = arc2.OpenStream(op2);
- resSpec = (op.types->Size() == 0 ? S_OK : S_FALSE);
- if (result == S_FALSE)
- {
- NonOpen_ErrorInfo = arc2.ErrorInfo;
- NonOpen_ArcPath = arc2.Path;
- break;
- }
- RINOK(result);
- RINOK(arc.GetItemMTime(mainSubfile, arc2.MTime, arc2.MTimeDefined));
- Arcs.Add(arc2);
- }
- IsOpen = !Arcs.IsEmpty();
- return resSpec;
-}
-
-static void SetCallback(const FString &filePath,
- IOpenCallbackUI *callbackUI,
- IArchiveOpenCallback *reOpenCallback,
- CMyComPtr<IArchiveOpenCallback> &callback)
-{
- COpenCallbackImp *openCallbackSpec = new COpenCallbackImp;
- callback = openCallbackSpec;
- openCallbackSpec->Callback = callbackUI;
- openCallbackSpec->ReOpenCallback = reOpenCallback;
-
- FString dirPrefix, fileName;
- NFile::NDir::GetFullPathAndSplit(filePath, dirPrefix, fileName);
- openCallbackSpec->Init(dirPrefix, fileName);
-}
-
-HRESULT CArchiveLink::Open2(COpenOptions &op,
- IOpenCallbackUI *callbackUI)
-{
- VolumesSize = 0;
- COpenCallbackImp *openCallbackSpec = new COpenCallbackImp;
- CMyComPtr<IArchiveOpenCallback> callback = openCallbackSpec;
- openCallbackSpec->Callback = callbackUI;
-
- FString prefix, name;
- if (!op.stream && !op.stdInMode)
- {
- NFile::NDir::GetFullPathAndSplit(us2fs(op.filePath), prefix, name);
- openCallbackSpec->Init(prefix, name);
- }
- else
- {
- openCallbackSpec->SetSubArchiveName(op.filePath);
- }
-
- op.callback = callback;
- op.callbackSpec = openCallbackSpec;
- RINOK(Open(op));
- // VolumePaths.Add(fs2us(prefix + name));
-
- FOR_VECTOR (i, openCallbackSpec->FileNames_WasUsed)
- {
- if (openCallbackSpec->FileNames_WasUsed[i])
- {
- VolumePaths.Add(fs2us(prefix) + openCallbackSpec->FileNames[i]);
- VolumesSize += openCallbackSpec->FileSizes[i];
- }
- }
- // VolumesSize = openCallbackSpec->TotalSize;
- return S_OK;
-}
-
-HRESULT CArc::ReOpen(const COpenOptions &op)
-{
- ErrorInfo.ClearErrors();
- ErrorInfo.ErrorFormatIndex = -1;
-
- UInt64 fileSize = 0;
- if (op.stream)
- {
- RINOK(op.stream->Seek(0, STREAM_SEEK_END, &fileSize));
- RINOK(op.stream->Seek(0, STREAM_SEEK_SET, NULL));
- }
- FileSize = fileSize;
-
- CMyComPtr<IInStream> stream2;
- Int64 globalOffset = GetGlobalOffset();
- if (globalOffset <= 0)
- stream2 = op.stream;
- else
- {
- CTailInStream *tailStreamSpec = new CTailInStream;
- stream2 = tailStreamSpec;
- tailStreamSpec->Stream = op.stream;
- tailStreamSpec->Offset = globalOffset;
- tailStreamSpec->Init();
- RINOK(tailStreamSpec->SeekToStart());
- }
-
- // There are archives with embedded STUBs (like ZIP), so we must support signature scanning
- // But for another archives we can use 0 here. So the code can be fixed !!!
- UInt64 maxStartPosition = kMaxCheckStartPosition;
- HRESULT res = Archive->Open(stream2, &maxStartPosition, op.callback);
-
- if (res == S_OK)
- {
- RINOK(ReadBasicProps(Archive, globalOffset, res));
- ArcStreamOffset = globalOffset;
- if (ArcStreamOffset != 0)
- InStream = op.stream;
- }
- return res;
-}
-
-
-HRESULT CArchiveLink::ReOpen(COpenOptions &op)
-{
- if (Arcs.Size() > 1)
- return E_NOTIMPL;
-
- CObjectVector<COpenType> inc;
- CIntVector excl;
-
- op.types = &inc;
- op.excludedFormats = &excl;
- op.stdInMode = false;
- op.stream = NULL;
- if (Arcs.Size() == 0) // ???
- return Open2(op, NULL);
-
- CMyComPtr<IArchiveOpenCallback> openCallbackNew;
- SetCallback(us2fs(op.filePath), NULL, op.callback, openCallbackNew);
-
- CInFileStream *fileStreamSpec = new CInFileStream;
- CMyComPtr<IInStream> stream(fileStreamSpec);
- if (!fileStreamSpec->Open(us2fs(op.filePath)))
- return GetLastError();
- op.stream = stream;
-
- CArc &arc = Arcs[0];
- HRESULT res = arc.ReOpen(op);
- IsOpen = (res == S_OK);
- return res;
-}
-
-#ifndef _SFX
-
-bool ParseComplexSize(const wchar_t *s, UInt64 &result)
-{
- result = 0;
- const wchar_t *end;
- UInt64 number = ConvertStringToUInt64(s, &end);
- if (end == s)
- return false;
- if (*end == 0)
- {
- result = number;
- return true;
- }
- if (end[1] != 0)
- return false;
- unsigned numBits;
- switch (MyCharLower_Ascii(*end))
- {
- case 'b': result = number; return true;
- case 'k': numBits = 10; break;
- case 'm': numBits = 20; break;
- case 'g': numBits = 30; break;
- case 't': numBits = 40; break;
- default: return false;
- }
- if (number >= ((UInt64)1 << (64 - numBits)))
- return false;
- result = number << numBits;
- return true;
-}
-
-static bool ParseTypeParams(const UString &s, COpenType &type)
-{
- if (s[0] == 0)
- return true;
- if (s[1] == 0)
- {
- switch ((unsigned)(Byte)s[0])
- {
- case 'e': type.EachPos = true; return true;
- case 'a': type.CanReturnArc = true; return true;
- case 'r': type.Recursive = true; return true;
- }
- return false;
- }
- if (s[0] == 's')
- {
- UInt64 result;
- if (!ParseComplexSize(s.Ptr(1), result))
- return false;
- type.MaxStartOffset = result;
- type.MaxStartOffset_Defined = true;
- return true;
- }
-
- return false;
-}
-
-bool ParseType(CCodecs &codecs, const UString &s, COpenType &type)
-{
- int pos2 = s.Find(':');
- UString name;
- if (pos2 < 0)
- {
- name = s;
- pos2 = s.Len();
- }
- else
- {
- name = s.Left(pos2);
- pos2++;
- }
-
- int index = codecs.FindFormatForArchiveType(name);
- type.Recursive = false;
-
- if (index < 0)
- {
- if (name[0] == '*')
- {
- if (name[1] != 0)
- return false;
- }
- else if (name[0] == '#')
- {
- if (name[1] != 0)
- return false;
- type.CanReturnArc = false;
- type.CanReturnParser = true;
- }
- else
- return false;
- }
-
- type.FormatIndex = index;
-
- for (unsigned i = pos2; i < s.Len();)
- {
- int next = s.Find(':', i);
- if (next < 0)
- next = s.Len();
- UString name = s.Mid(i, next - i);
- if (name.IsEmpty())
- return false;
- if (!ParseTypeParams(name, type))
- return false;
- i = next + 1;
- }
-
- return true;
-}
-
-bool ParseOpenTypes(CCodecs &codecs, const UString &s, CObjectVector<COpenType> &types)
-{
- types.Clear();
- for (unsigned pos = 0; pos < s.Len();)
- {
- int pos2 = s.Find('.', pos);
- if (pos2 < 0)
- pos2 = s.Len();
- UString name = s.Mid(pos, pos2 - pos);
- if (name.IsEmpty())
- return false;
- COpenType type;
- if (!ParseType(codecs, name, type))
- return false;
- types.Add(type);
- pos = pos2 + 1;
- }
- return true;
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/OpenArchive.h b/src/libs/7zip/win/CPP/7zip/UI/Common/OpenArchive.h
deleted file mode 100644
index 2ee743adc..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/OpenArchive.h
+++ /dev/null
@@ -1,346 +0,0 @@
-// OpenArchive.h
-
-#ifndef __OPEN_ARCHIVE_H
-#define __OPEN_ARCHIVE_H
-
-#include "../../../Windows/PropVariant.h"
-
-#include "ArchiveOpenCallback.h"
-#include "LoadCodecs.h"
-#include "Property.h"
-
-HRESULT Archive_GetItemBoolProp(IInArchive *arc, UInt32 index, PROPID propID, bool &result) throw();
-HRESULT Archive_IsItem_Folder(IInArchive *arc, UInt32 index, bool &result) throw();
-HRESULT Archive_IsItem_Aux(IInArchive *arc, UInt32 index, bool &result) throw();
-HRESULT Archive_IsItem_AltStream(IInArchive *arc, UInt32 index, bool &result) throw();
-HRESULT Archive_IsItem_Deleted(IInArchive *arc, UInt32 index, bool &deleted) throw();
-
-/*
-struct COptionalOpenProperties
-{
- UString FormatName;
- CObjectVector<CProperty> Props;
-};
-*/
-
-#ifdef _SFX
-#define OPEN_PROPS_DECL
-#else
-#define OPEN_PROPS_DECL const CObjectVector<CProperty> *props;
-// #define OPEN_PROPS_DECL , const CObjectVector<COptionalOpenProperties> *props
-#endif
-
-struct COpenSpecFlags
-{
- // bool CanReturnFull;
- bool CanReturnFrontal;
- bool CanReturnTail;
- bool CanReturnMid;
-
- bool CanReturn_NonStart() const { return CanReturnTail || CanReturnMid; }
-
- COpenSpecFlags():
- // CanReturnFull(true),
- CanReturnFrontal(false),
- CanReturnTail(false),
- CanReturnMid(false)
- {}
-};
-
-struct COpenType
-{
- int FormatIndex;
-
- COpenSpecFlags SpecForcedType;
- COpenSpecFlags SpecMainType;
- COpenSpecFlags SpecWrongExt;
- COpenSpecFlags SpecUnknownExt;
-
- bool Recursive;
-
- bool CanReturnArc;
- bool CanReturnParser;
- bool EachPos;
-
- // bool SkipSfxStub;
- // bool ExeAsUnknown;
-
- bool ZerosTailIsAllowed;
-
- bool MaxStartOffset_Defined;
- UInt64 MaxStartOffset;
-
- const COpenSpecFlags &GetSpec(bool isForced, bool isMain, bool isUnknown) const
- {
- return isForced ? SpecForcedType : (isMain ? SpecMainType : (isUnknown ? SpecUnknownExt : SpecWrongExt));
- }
-
- COpenType():
- FormatIndex(-1),
- Recursive(true),
- EachPos(false),
- CanReturnArc(true),
- CanReturnParser(false),
- // SkipSfxStub(true),
- // ExeAsUnknown(true),
- ZerosTailIsAllowed(false),
- MaxStartOffset_Defined(false),
- MaxStartOffset(0)
- {
- SpecForcedType.CanReturnFrontal = true;
- SpecForcedType.CanReturnTail = true;
- SpecForcedType.CanReturnMid = true;
-
- SpecMainType.CanReturnFrontal = true;
-
- SpecUnknownExt.CanReturnTail = true; // for sfx
- SpecUnknownExt.CanReturnMid = true;
- SpecUnknownExt.CanReturnFrontal = true; // for alt streams of sfx with pad
-
- // ZerosTailIsAllowed = true;
- }
-};
-
-struct COpenOptions
-{
- CCodecs *codecs;
- COpenType openType;
- const CObjectVector<COpenType> *types;
- const CIntVector *excludedFormats;
-
- IInStream *stream;
- ISequentialInStream *seqStream;
- IArchiveOpenCallback *callback;
- COpenCallbackImp *callbackSpec;
- OPEN_PROPS_DECL
- // bool openOnlySpecifiedByExtension,
-
- bool stdInMode;
- UString filePath;
-
- COpenOptions():
- codecs(NULL),
- types(NULL),
- excludedFormats(NULL),
- stream(NULL),
- seqStream(NULL),
- callback(NULL),
- callbackSpec(NULL),
- stdInMode(false)
- {}
-
-};
-
-UInt32 GetOpenArcErrorFlags(const NWindows::NCOM::CPropVariant &prop, bool *isDefinedProp = NULL);
-
-struct CArcErrorInfo
-{
- bool ThereIsTail;
- bool UnexpecedEnd;
- bool IgnoreTail; // all are zeros
- // bool NonZerosTail;
- bool ErrorFlags_Defined;
- UInt32 ErrorFlags;
- UInt32 WarningFlags;
- int ErrorFormatIndex; // - 1 means no Error.
- // if FormatIndex == ErrorFormatIndex, the archive is open with offset
- UInt64 TailSize;
-
- /* if CArc is Open OK with some format:
- - ErrorFormatIndex shows error format index, if extension is incorrect
- - other variables show message and warnings of archive that is open */
-
- UString ErrorMessage;
- UString WarningMessage;
-
- // call IsArc_After_NonOpen only if Open returns S_FALSE
- bool IsArc_After_NonOpen() const
- {
- return (ErrorFlags_Defined && (ErrorFlags & kpv_ErrorFlags_IsNotArc) == 0);
- }
-
-
- CArcErrorInfo():
- ThereIsTail(false),
- UnexpecedEnd(false),
- IgnoreTail(false),
- // NonZerosTail(false),
- ErrorFlags_Defined(false),
- ErrorFlags(0),
- WarningFlags(0),
- ErrorFormatIndex(-1),
- TailSize(0)
- {}
-
- void ClearErrors();
-
- void ClearErrors_Full()
- {
- ErrorFormatIndex = -1;
- ClearErrors();
- }
-
- bool IsThereErrorOrWarning() const
- {
- return ErrorFlags != 0
- || WarningFlags != 0
- || NeedTailWarning()
- || UnexpecedEnd
- || !ErrorMessage.IsEmpty()
- || !WarningMessage.IsEmpty();
- }
-
- bool AreThereErrors() const { return ErrorFlags != 0 || UnexpecedEnd; }
- bool AreThereWarnings() const { return WarningFlags != 0 || NeedTailWarning(); }
-
- bool NeedTailWarning() const { return !IgnoreTail && ThereIsTail; }
-
- UInt32 GetWarningFlags() const
- {
- UInt32 a = WarningFlags;
- if (NeedTailWarning() && (ErrorFlags & kpv_ErrorFlags_DataAfterEnd) == 0)
- a |= kpv_ErrorFlags_DataAfterEnd;
- return a;
- }
-
- UInt32 GetErrorFlags() const
- {
- UInt32 a = ErrorFlags;
- if (UnexpecedEnd)
- a |= kpv_ErrorFlags_UnexpectedEnd;
- return a;
- }
-};
-
-class CArc
-{
- HRESULT PrepareToOpen(const COpenOptions &op, unsigned formatIndex, CMyComPtr<IInArchive> &archive);
- HRESULT CheckZerosTail(const COpenOptions &op, UInt64 offset);
- HRESULT OpenStream2(const COpenOptions &options);
-
-public:
- CMyComPtr<IInArchive> Archive;
- CMyComPtr<IInStream> InStream;
- // we use InStream in 2 cases (ArcStreamOffset != 0):
- // 1) if we use additional cache stream
- // 2) we reopen sfx archive with CTailInStream
-
- CMyComPtr<IArchiveGetRawProps> GetRawProps;
- CMyComPtr<IArchiveGetRootProps> GetRootProps;
-
- CArcErrorInfo ErrorInfo; // for OK archives
- CArcErrorInfo NonOpen_ErrorInfo; // ErrorInfo for mainArchive (false OPEN)
-
- UString Path;
- UString filePath;
- UString DefaultName;
- int FormatIndex; // - 1 means Parser.
- int SubfileIndex;
- FILETIME MTime;
- bool MTimeDefined;
-
- Int64 Offset; // it's offset of start of archive inside stream that is open by Archive Handler
- UInt64 PhySize;
- // UInt64 OkPhySize;
- bool PhySizeDefined;
- // bool OkPhySize_Defined;
- UInt64 FileSize;
- UInt64 AvailPhySize; // PhySize, but it's reduced if exceed end of file
- // bool offsetDefined;
-
- UInt64 ArcStreamOffset; // offset of stream that is open by Archive Handler
- Int64 GetGlobalOffset() const { return ArcStreamOffset + Offset; } // it's global offset of archive
-
- // AString ErrorFlagsText;
-
- bool IsParseArc;
-
- bool IsTree;
-
- bool Ask_Deleted;
- bool Ask_AltStream;
- bool Ask_Aux;
- bool Ask_INode;
-
- bool IgnoreSplit; // don't try split handler
-
- // void Set_ErrorFlagsText();
-
- CArc():
- MTimeDefined(false),
- IsTree(false),
- Ask_Deleted(false),
- Ask_AltStream(false),
- Ask_Aux(false),
- Ask_INode(false),
- IgnoreSplit(false)
- {}
-
- HRESULT ReadBasicProps(IInArchive *archive, UInt64 startPos, HRESULT openRes);
-
- // ~CArc();
-
- HRESULT Close()
- {
- InStream.Release();
- return Archive->Close();
- }
-
- // AltStream's name is concatenated with base file name in one string in parts.Back()
- HRESULT GetItemPathToParent(UInt32 index, UInt32 parent, UStringVector &parts) const;
-
- HRESULT GetItemPath(UInt32 index, UString &result) const;
-
- // GetItemPath2 adds [DELETED] dir prefix for deleted items.
- HRESULT GetItemPath2(UInt32 index, UString &result) const;
-
- HRESULT GetItemSize(UInt32 index, UInt64 &size, bool &defined) const;
- HRESULT GetItemMTime(UInt32 index, FILETIME &ft, bool &defined) const;
- HRESULT IsItemAnti(UInt32 index, bool &result) const
- { return Archive_GetItemBoolProp(Archive, index, kpidIsAnti, result); }
-
-
- HRESULT OpenStream(const COpenOptions &options);
- HRESULT OpenStreamOrFile(COpenOptions &options);
-
- HRESULT ReOpen(const COpenOptions &options);
-
- HRESULT CreateNewTailStream(CMyComPtr<IInStream> &stream);
-};
-
-struct CArchiveLink
-{
- CObjectVector<CArc> Arcs;
- UStringVector VolumePaths;
- UInt64 VolumesSize;
- bool IsOpen;
-
- // int NonOpenErrorFormatIndex; // - 1 means no Error.
- UString NonOpen_ArcPath;
-
- CArcErrorInfo NonOpen_ErrorInfo;
-
- // UString ErrorsText;
- // void Set_ErrorsText();
-
- CArchiveLink(): VolumesSize(0), IsOpen(false) {}
- void KeepModeForNextOpen();
- HRESULT Close();
- void Release();
- ~CArchiveLink() { Release(); }
-
- const CArc *GetArc() const { return &Arcs.Back(); }
- IInArchive *GetArchive() const { return Arcs.Back().Archive; }
- IArchiveGetRawProps *GetArchiveGetRawProps() const { return Arcs.Back().GetRawProps; }
- IArchiveGetRootProps *GetArchiveGetRootProps() const { return Arcs.Back().GetRootProps; }
-
- HRESULT Open(COpenOptions &options);
-
- HRESULT Open2(COpenOptions &options, IOpenCallbackUI *callbackUI);
-
- HRESULT ReOpen(COpenOptions &options);
-};
-
-bool ParseOpenTypes(CCodecs &codecs, const UString &s, CObjectVector<COpenType> &types);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/PropIDUtils.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/PropIDUtils.cpp
deleted file mode 100644
index 8f27cc0d1..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/PropIDUtils.cpp
+++ /dev/null
@@ -1,553 +0,0 @@
-// PropIDUtils.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/CpuArch.h"
-
-#include "../../../Common/IntToString.h"
-#include "../../../Common/StringConvert.h"
-
-#include "../../../Windows/FileFind.h"
-#include "../../../Windows/FileIO.h"
-#include "../../../Windows/PropVariantConv.h"
-
-#include "../../PropID.h"
-
-#include "PropIDUtils.h"
-
-#define Get16(x) GetUi16(x)
-#define Get32(x) GetUi32(x)
-
-using namespace NWindows;
-
-static const char g_WinAttribChars[16 + 1] = "RHS8DAdNTsLCOnE_";
-/*
-0 READONLY
-1 HIDDEN
-2 SYSTEM
-
-4 DIRECTORY
-5 ARCHIVE
-6 DEVICE
-7 NORMAL
-8 TEMPORARY
-9 SPARSE_FILE
-10 REPARSE_POINT
-11 COMPRESSED
-12 OFFLINE
-13 NOT_CONTENT_INDEXED
-14 ENCRYPTED
-
-16 VIRTUAL
-*/
-
-void ConvertWinAttribToString(char *s, UInt32 wa)
-{
- for (int i = 0; i < 16; i++)
- if ((wa & (1 << i)) && i != 7)
- *s++ = g_WinAttribChars[i];
- *s = 0;
-}
-
-static const char kPosixTypes[16] = { '0', 'p', 'c', '3', 'd', '5', 'b', '7', '-', '9', 'l', 'B', 's', 'D', 'E', 'F' };
-#define MY_ATTR_CHAR(a, n, c) ((a) & (1 << (n))) ? c : '-';
-
-void ConvertPropertyToShortString(char *dest, const PROPVARIANT &prop, PROPID propID, bool full) throw()
-{
- *dest = 0;
- if (prop.vt == VT_FILETIME)
- {
- FILETIME localFileTime;
- if ((prop.filetime.dwHighDateTime == 0 &&
- prop.filetime.dwLowDateTime == 0) ||
- !::FileTimeToLocalFileTime(&prop.filetime, &localFileTime))
- return;
- ConvertFileTimeToString(localFileTime, dest, true, full);
- return;
- }
- switch (propID)
- {
- case kpidCRC:
- {
- if (prop.vt != VT_UI4)
- break;
- ConvertUInt32ToHex8Digits(prop.ulVal, dest);
- return;
- }
- case kpidAttrib:
- {
- if (prop.vt != VT_UI4)
- break;
- ConvertWinAttribToString(dest, prop.ulVal);
- return;
- }
- case kpidPosixAttrib:
- {
- if (prop.vt != VT_UI4)
- break;
- UString res;
- UInt32 a = prop.ulVal;
-
- dest[0] = kPosixTypes[(a >> 12) & 0xF];
- for (int i = 6; i >= 0; i -= 3)
- {
- dest[7 - i] = MY_ATTR_CHAR(a, i + 2, 'r');
- dest[8 - i] = MY_ATTR_CHAR(a, i + 1, 'w');
- dest[9 - i] = MY_ATTR_CHAR(a, i + 0, 'x');
- }
- if ((a & 0x800) != 0) dest[3] = ((a & (1 << 6)) ? 's' : 'S');
- if ((a & 0x400) != 0) dest[6] = ((a & (1 << 3)) ? 's' : 'S');
- if ((a & 0x200) != 0) dest[9] = ((a & (1 << 0)) ? 't' : 'T');
- dest[10] = 0;
-
- a &= ~(UInt32)0xFFFF;
- if (a != 0)
- {
- dest[10] = ' ';
- ConvertUInt32ToHex8Digits(a, dest + 11);
- }
- return;
- }
- case kpidINode:
- {
- if (prop.vt != VT_UI8)
- break;
- ConvertUInt32ToString((UInt32)(prop.uhVal.QuadPart >> 48), dest);
- dest += strlen(dest);
- *dest++ = '-';
- UInt64 low = prop.uhVal.QuadPart & (((UInt64)1 << 48) - 1);
- ConvertUInt64ToString(low, dest);
- return;
- }
- case kpidVa:
- {
- UInt64 v = 0;
- if (ConvertPropVariantToUInt64(prop, v))
- {
- dest[0] = '0';
- dest[1] = 'x';
- ConvertUInt64ToHex(prop.ulVal, dest + 2);
- return;
- }
- break;
- }
- }
- ConvertPropVariantToShortString(prop, dest);
-}
-
-void ConvertPropertyToString(UString &dest, const PROPVARIANT &prop, PROPID propID, bool full)
-{
- if (prop.vt == VT_BSTR)
- {
- dest = prop.bstrVal;
- return;
- }
- char temp[64];
- ConvertPropertyToShortString(temp, prop, propID, full);
- int len = MyStringLen(temp);
- wchar_t *str = dest.GetBuffer(len);
- for (int i = 0; i < len; i++)
- str[i] = temp[i];
- dest.ReleaseBuffer(len);
-}
-
-static inline char GetHex(Byte value)
-{
- return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));
-}
-
-#ifndef _SFX
-
-static inline void AddHexToString(AString &res, Byte value)
-{
- res += GetHex((Byte)(value >> 4));
- res += GetHex((Byte)(value & 0xF));
- res += ' ';
-}
-
-/*
-static AString Data_To_Hex(const Byte *data, size_t size)
-{
- AString s;
- for (size_t i = 0; i < size; i++)
- AddHexToString(s, data[i]);
- return s;
-}
-*/
-
-static const char *sidNames[] =
-{
- "0",
- "Dialup",
- "Network",
- "Batch",
- "Interactive",
- "Logon", // S-1-5-5-X-Y
- "Service",
- "Anonymous",
- "Proxy",
- "EnterpriseDC",
- "Self",
- "AuthenticatedUsers",
- "RestrictedCode",
- "TerminalServer",
- "RemoteInteractiveLogon",
- "ThisOrganization",
- "16",
- "IUserIIS",
- "LocalSystem",
- "LocalService",
- "NetworkService",
- "Domains"
-};
-
-struct CSecID2Name
-{
- UInt32 n;
- const char *sz;
-};
-
-const CSecID2Name sid_32_Names[] =
-{
- { 544, "Administrators" },
- { 545, "Users" },
- { 546, "Guests" },
- { 547, "PowerUsers" },
- { 548, "AccountOperators" },
- { 549, "ServerOperators" },
- { 550, "PrintOperators" },
- { 551, "BackupOperators" },
- { 552, "Replicators" },
- { 553, "Backup Operators" },
- { 554, "PreWindows2000CompatibleAccess" },
- { 555, "RemoteDesktopUsers" },
- { 556, "NetworkConfigurationOperators" },
- { 557, "IncomingForestTrustBuilders" },
- { 558, "PerformanceMonitorUsers" },
- { 559, "PerformanceLogUsers" },
- { 560, "WindowsAuthorizationAccessGroup" },
- { 561, "TerminalServerLicenseServers" },
- { 562, "DistributedCOMUsers" },
- { 569, "CryptographicOperators" },
- { 573, "EventLogReaders" },
- { 574, "CertificateServiceDCOMAccess" }
-};
-
-static const CSecID2Name sid_21_Names[] =
-{
- { 500, "Administrator" },
- { 501, "Guest" },
- { 502, "KRBTGT" },
- { 512, "DomainAdmins" },
- { 513, "DomainUsers" },
- { 515, "DomainComputers" },
- { 516, "DomainControllers" },
- { 517, "CertPublishers" },
- { 518, "SchemaAdmins" },
- { 519, "EnterpriseAdmins" },
- { 520, "GroupPolicyCreatorOwners" },
- { 553, "RASandIASServers" },
- { 553, "RASandIASServers" },
- { 571, "AllowedRODCPasswordReplicationGroup" },
- { 572, "DeniedRODCPasswordReplicationGroup" }
-};
-
-struct CServicesToName
-{
- UInt32 n[5];
- const char *sz;
-};
-
-static const CServicesToName services_to_name[] =
-{
- { { 0x38FB89B5, 0xCBC28419, 0x6D236C5C, 0x6E770057, 0x876402C0 } , "TrustedInstaller" }
-};
-
-static void ParseSid(AString &s, const Byte *p, UInt32 lim, UInt32 &sidSize)
-{
- sidSize = 0;
- if (lim < 8)
- {
- s += "ERROR";
- return;
- }
- UInt32 rev = p[0];
- if (rev != 1)
- {
- s += "UNSUPPORTED";
- return;
- }
- UInt32 num = p[1];
- if (8 + num * 4 > lim)
- {
- s += "ERROR";
- return;
- }
- sidSize = 8 + num * 4;
- UInt32 authority = GetBe32(p + 4);
-
- if (p[2] == 0 && p[3] == 0 && authority == 5 && num >= 1)
- {
- UInt32 v0 = Get32(p + 8);
- if (v0 < ARRAY_SIZE(sidNames))
- {
- s += sidNames[v0];
- return;
- }
- if (v0 == 32 && num == 2)
- {
- UInt32 v1 = Get32(p + 12);
- for (int i = 0; i < ARRAY_SIZE(sid_32_Names); i++)
- if (sid_32_Names[i].n == v1)
- {
- s += sid_32_Names[i].sz;
- return;
- }
- }
- if (v0 == 21 && num == 5)
- {
- UInt32 v4 = Get32(p + 8 + 4 * 4);
- for (int i = 0; i < ARRAY_SIZE(sid_21_Names); i++)
- if (sid_21_Names[i].n == v4)
- {
- s += sid_21_Names[i].sz;
- return;
- }
- }
- if (v0 == 80 && num == 6)
- {
- for (int i = 0; i < ARRAY_SIZE(services_to_name); i++)
- {
- const CServicesToName &sn = services_to_name[i];
- int j;
- for (j = 0; j < 5 && sn.n[j] == Get32(p + 8 + 4 + j * 4); j++);
- if (j == 5)
- {
- s += sn.sz;
- return;
- }
- }
- }
- }
-
- char sz[16];
- s += "S-1-";
- if (p[2] == 0 && p[3] == 0)
- {
- ConvertUInt32ToString(authority, sz);
- s += sz;
- }
- else
- {
- s += "0x";
- for (int i = 2; i < 8; i++)
- AddHexToString(s, p[i]);
- }
- for (UInt32 i = 0; i < num; i++)
- {
- s += '-';
- ConvertUInt32ToString(Get32(p + 8 + i * 4), sz);
- s += sz;
- }
-}
-
-static void ParseOwner(AString &s, const Byte *p, UInt32 size, UInt32 pos)
-{
- if (pos > size)
- {
- s += "ERROR";
- return;
- }
- UInt32 sidSize = 0;
- ParseSid(s, p + pos, size - pos, sidSize);
-}
-
-static void AddUInt32ToString(AString &s, UInt32 val)
-{
- char sz[16];
- ConvertUInt32ToString(val, sz);
- s += sz;
-}
-
-static void ParseAcl(AString &s, const Byte *p, UInt32 size, const char *strName, UInt32 flags, UInt32 offset)
-{
- UInt32 control = Get16(p + 2);
- if ((flags & control) == 0)
- return;
- UInt32 pos = Get32(p + offset);
- s += ' ';
- s += strName;
- if (pos >= size)
- return;
- p += pos;
- size -= pos;
- if (size < 8)
- return;
- if (Get16(p) != 2) // revision
- return;
- // UInt32 aclSize = Get16(p + 2);
- UInt32 num = Get32(p + 4);
- AddUInt32ToString(s, num);
- /*
- if (num >= (1 << 16))
- return;
- if (aclSize > size)
- return;
- size = aclSize;
- size -= 8;
- p += 8;
- for (UInt32 i = 0 ; i < num; i++)
- {
- if (size <= 8)
- return;
- // Byte type = p[0];
- // Byte flags = p[1];
- // UInt32 aceSize = Get16(p + 2);
- // UInt32 mask = Get32(p + 4);
- p += 8;
- size -= 8;
-
- UInt32 sidSize = 0;
- s += ' ';
- s += ParseSid(p, size, sidSize);
- if (sidSize == 0)
- return;
- p += sidSize;
- size -= sidSize;
- }
- if (size != 0)
- s += " ERROR";
- */
-}
-
-#define MY_SE_OWNER_DEFAULTED (0x0001)
-#define MY_SE_GROUP_DEFAULTED (0x0002)
-#define MY_SE_DACL_PRESENT (0x0004)
-#define MY_SE_DACL_DEFAULTED (0x0008)
-#define MY_SE_SACL_PRESENT (0x0010)
-#define MY_SE_SACL_DEFAULTED (0x0020)
-#define MY_SE_DACL_AUTO_INHERIT_REQ (0x0100)
-#define MY_SE_SACL_AUTO_INHERIT_REQ (0x0200)
-#define MY_SE_DACL_AUTO_INHERITED (0x0400)
-#define MY_SE_SACL_AUTO_INHERITED (0x0800)
-#define MY_SE_DACL_PROTECTED (0x1000)
-#define MY_SE_SACL_PROTECTED (0x2000)
-#define MY_SE_RM_CONTROL_VALID (0x4000)
-#define MY_SE_SELF_RELATIVE (0x8000)
-
-void ConvertNtSecureToString(const Byte *data, UInt32 size, AString &s)
-{
- s.Empty();
- if (size < 20 || size > (1 << 18))
- {
- s += "ERROR";
- return;
- }
- if (Get16(data) != 1) // revision
- {
- s += "UNSUPPORTED";
- return;
- }
- ParseOwner(s, data, size, Get32(data + 4));
- s += ' ';
- ParseOwner(s, data, size, Get32(data + 8));
- ParseAcl(s, data, size, "s:", MY_SE_SACL_PRESENT, 12);
- ParseAcl(s, data, size, "d:", MY_SE_DACL_PRESENT, 16);
- s += ' ';
- AddUInt32ToString(s, size);
- // s += '\n';
- // s += Data_To_Hex(data, size);
-}
-
-#ifdef _WIN32
-
-static bool CheckSid(const Byte *data, UInt32 size, UInt32 pos)
-{
- if (pos >= size)
- return false;
- size -= pos;
- if (size < 8)
- return false;
- UInt32 rev = data[pos];
- if (rev != 1)
- return false;
- UInt32 num = data[pos + 1];
- return (8 + num * 4 <= size);
-}
-
-static bool CheckAcl(const Byte *p, UInt32 size, UInt32 flags, UInt32 offset)
-{
- UInt32 control = Get16(p + 2);
- if ((flags & control) == 0)
- return true;
- UInt32 pos = Get32(p + offset);
- if (pos >= size)
- return false;
- p += pos;
- size -= pos;
- if (size < 8)
- return false;
- UInt32 aclSize = Get16(p + 2);
- return (aclSize <= size);
-}
-
-bool CheckNtSecure(const Byte *data, UInt32 size)
-{
- if (size < 20)
- return false;
- if (Get16(data) != 1) // revision
- return true; // windows function can handle such error, so we allow it
- if (size > (1 << 18))
- return false;
- if (!CheckSid(data, size, Get32(data + 4))) return false;
- if (!CheckSid(data, size, Get32(data + 8))) return false;
- if (!CheckAcl(data, size, MY_SE_SACL_PRESENT, 12)) return false;
- if (!CheckAcl(data, size, MY_SE_DACL_PRESENT, 16)) return false;
- return true;
-}
-
-#endif
-
-bool ConvertNtReparseToString(const Byte *data, UInt32 size, UString &s)
-{
- s.Empty();
- NFile::CReparseAttr attr;
- if (attr.Parse(data, size))
- {
- if (!attr.IsSymLink())
- s += L"Junction: ";
- s += attr.GetPath();
- if (!attr.IsOkNamePair())
- {
- s += L" : ";
- s += attr.PrintName;
- }
- return true;
- }
-
- if (size < 8)
- return false;
- UInt32 tag = Get32(data);
- UInt32 len = Get16(data + 4);
- if (len + 8 > size)
- return false;
- if (Get16(data + 6) != 0) // padding
- return false;
-
- char hex[16];
- ConvertUInt32ToHex8Digits(tag, hex);
- s.AddAsciiStr(hex);
- s += L' ';
-
- data += 8;
-
- for (UInt32 i = 0; i < len; i++)
- {
- Byte b = ((const Byte *)data)[i];
- s += (wchar_t)GetHex((Byte)((b >> 4) & 0xF));
- s += (wchar_t)GetHex((Byte)(b & 0xF));
- }
- return true;
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/PropIDUtils.h b/src/libs/7zip/win/CPP/7zip/UI/Common/PropIDUtils.h
deleted file mode 100644
index 3ee2981de..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/PropIDUtils.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// PropIDUtils.h
-
-#ifndef __PROPID_UTILS_H
-#define __PROPID_UTILS_H
-
-#include "../../../Common/MyString.h"
-
-// provide at least 64 bytes for buffer including zero-end
-void ConvertPropertyToShortString(char *dest, const PROPVARIANT &propVariant, PROPID propID, bool full = true) throw();
-void ConvertPropertyToString(UString &dest, const PROPVARIANT &propVariant, PROPID propID, bool full = true);
-
-bool ConvertNtReparseToString(const Byte *data, UInt32 size, UString &s);
-void ConvertNtSecureToString(const Byte *data, UInt32 size, AString &s);
-bool CheckNtSecure(const Byte *data, UInt32 size);
-void ConvertWinAttribToString(char *s, UInt32 wa);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/Property.h b/src/libs/7zip/win/CPP/7zip/UI/Common/Property.h
deleted file mode 100644
index 8b57a2a64..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/Property.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Property.h
-
-#ifndef __7Z_PROPERTY_H
-#define __7Z_PROPERTY_H
-
-#include "../../../Common/MyString.h"
-
-struct CProperty
-{
- UString Name;
- UString Value;
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/SetProperties.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/SetProperties.cpp
deleted file mode 100644
index 64b9d92a6..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/SetProperties.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-// SetProperties.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/MyCom.h"
-#include "../../../Common/MyString.h"
-#include "../../../Common/StringToInt.h"
-
-#include "../../../Windows/PropVariant.h"
-
-#include "../../Archive/IArchive.h"
-
-#include "SetProperties.h"
-
-using namespace NWindows;
-using namespace NCOM;
-
-static void ParseNumberString(const UString &s, NCOM::CPropVariant &prop)
-{
- const wchar_t *end;
- UInt64 result = ConvertStringToUInt64(s, &end);
- if (*end != 0 || s.IsEmpty())
- prop = s;
- else if (result <= (UInt32)0xFFFFFFFF)
- prop = (UInt32)result;
- else
- prop = result;
-}
-
-HRESULT SetProperties(IUnknown *unknown, const CObjectVector<CProperty> &properties)
-{
- if (properties.IsEmpty())
- return S_OK;
- CMyComPtr<ISetProperties> setProperties;
- unknown->QueryInterface(IID_ISetProperties, (void **)&setProperties);
- if (!setProperties)
- return S_OK;
-
- UStringVector realNames;
- CPropVariant *values = new CPropVariant[properties.Size()];
- try
- {
- unsigned i;
- for (i = 0; i < properties.Size(); i++)
- {
- const CProperty &property = properties[i];
- NCOM::CPropVariant propVariant;
- UString name = property.Name;
- if (property.Value.IsEmpty())
- {
- if (!name.IsEmpty())
- {
- wchar_t c = name.Back();
- if (c == L'-')
- propVariant = false;
- else if (c == L'+')
- propVariant = true;
- if (propVariant.vt != VT_EMPTY)
- name.DeleteBack();
- }
- }
- else
- ParseNumberString(property.Value, propVariant);
- realNames.Add(name);
- values[i] = propVariant;
- }
- CRecordVector<const wchar_t *> names;
- for (i = 0; i < realNames.Size(); i++)
- names.Add((const wchar_t *)realNames[i]);
-
- RINOK(setProperties->SetProperties(&names.Front(), values, names.Size()));
- }
- catch(...)
- {
- delete []values;
- throw;
- }
- delete []values;
- return S_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/SetProperties.h b/src/libs/7zip/win/CPP/7zip/UI/Common/SetProperties.h
deleted file mode 100644
index 892f1a210..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/SetProperties.h
+++ /dev/null
@@ -1,10 +0,0 @@
-// SetProperties.h
-
-#ifndef __SETPROPERTIES_H
-#define __SETPROPERTIES_H
-
-#include "Property.h"
-
-HRESULT SetProperties(IUnknown *unknown, const CObjectVector<CProperty> &properties);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/SortUtils.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/SortUtils.cpp
deleted file mode 100644
index b7e422a29..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/SortUtils.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-// SortUtils.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/Wildcard.h"
-
-#include "SortUtils.h"
-
-static int CompareStrings(const unsigned *p1, const unsigned *p2, void *param)
-{
- const UStringVector &strings = *(const UStringVector *)param;
- return CompareFileNames(strings[*p1], strings[*p2]);
-}
-
-void SortFileNames(const UStringVector &strings, CUIntVector &indices)
-{
- unsigned numItems = strings.Size();
- indices.ClearAndSetSize(numItems);
- unsigned *vals = &indices[0];
- for (unsigned i = 0; i < numItems; i++)
- vals[i] = i;
- indices.Sort(CompareStrings, (void *)&strings);
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/SortUtils.h b/src/libs/7zip/win/CPP/7zip/UI/Common/SortUtils.h
deleted file mode 100644
index 8e42e0682..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/SortUtils.h
+++ /dev/null
@@ -1,10 +0,0 @@
-// SortUtils.h
-
-#ifndef __SORT_UTLS_H
-#define __SORT_UTLS_H
-
-#include "../../../Common/MyString.h"
-
-void SortFileNames(const UStringVector &strings, CUIntVector &indices);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/StdAfx.h b/src/libs/7zip/win/CPP/7zip/UI/Common/StdAfx.h
deleted file mode 100644
index 2854ff3e9..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/Common.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/TempFiles.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/TempFiles.cpp
deleted file mode 100644
index 0c13ae158..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/TempFiles.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// TempFiles.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Windows/FileDir.h"
-
-#include "TempFiles.h"
-
-using namespace NWindows;
-using namespace NFile;
-
-void CTempFiles::Clear()
-{
- while (!Paths.IsEmpty())
- {
- NDir::DeleteFileAlways(Paths.Back());
- Paths.DeleteBack();
- }
-}
-
-
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/TempFiles.h b/src/libs/7zip/win/CPP/7zip/UI/Common/TempFiles.h
deleted file mode 100644
index 4099e6558..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/TempFiles.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// TempFiles.h
-
-#ifndef __TEMP_FILES_H
-#define __TEMP_FILES_H
-
-#include "../../../Common/MyString.h"
-
-class CTempFiles
-{
- void Clear();
-public:
- FStringVector Paths;
- ~CTempFiles() { Clear(); }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/Update.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/Update.cpp
deleted file mode 100644
index e3d538f10..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/Update.cpp
+++ /dev/null
@@ -1,1477 +0,0 @@
-// Update.cpp
-
-#include "StdAfx.h"
-
-#include "Update.h"
-
-#include "../../../Common/IntToString.h"
-#include "../../../Common/StringConvert.h"
-
-#include "../../../Windows/DLL.h"
-#include "../../../Windows/FileDir.h"
-#include "../../../Windows/FileFind.h"
-#include "../../../Windows/FileName.h"
-#include "../../../Windows/PropVariant.h"
-#include "../../../Windows/PropVariantConv.h"
-#include "../../../Windows/TimeUtils.h"
-
-#include "../../Common/FileStreams.h"
-#include "../../Common/LimitedStreams.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "../Common/DirItem.h"
-#include "../Common/EnumDirItems.h"
-#include "../Common/OpenArchive.h"
-#include "../Common/UpdateProduce.h"
-
-#include "EnumDirItems.h"
-#include "SetProperties.h"
-#include "TempFiles.h"
-#include "UpdateCallback.h"
-
-static const char *kUpdateIsNotSupoorted =
- "update operations are not supported for this archive";
-
-using namespace NWindows;
-using namespace NCOM;
-using namespace NFile;
-using namespace NDir;
-using namespace NName;
-
-static CFSTR kTempFolderPrefix = FTEXT("7zE");
-
-
-static bool DeleteEmptyFolderAndEmptySubFolders(const FString &path)
-{
- NFind::CFileInfo fileInfo;
- FString pathPrefix = path + FCHAR_PATH_SEPARATOR;
- {
- NFind::CEnumerator enumerator(pathPrefix + FCHAR_ANY_MASK);
- while (enumerator.Next(fileInfo))
- {
- if (fileInfo.IsDir())
- if (!DeleteEmptyFolderAndEmptySubFolders(pathPrefix + fileInfo.Name))
- return false;
- }
- }
- /*
- // we don't need clear read-only for folders
- if (!MySetFileAttributes(path, 0))
- return false;
- */
- return RemoveDir(path);
-}
-
-
-using namespace NUpdateArchive;
-
-class COutMultiVolStream:
- public IOutStream,
- public CMyUnknownImp
-{
- unsigned _streamIndex; // required stream
- UInt64 _offsetPos; // offset from start of _streamIndex index
- UInt64 _absPos;
- UInt64 _length;
-
- struct CAltStreamInfo
- {
- COutFileStream *StreamSpec;
- CMyComPtr<IOutStream> Stream;
- FString Name;
- UInt64 Pos;
- UInt64 RealSize;
- };
- CObjectVector<CAltStreamInfo> Streams;
-public:
- // CMyComPtr<IArchiveUpdateCallback2> VolumeCallback;
- CRecordVector<UInt64> Sizes;
- FString Prefix;
- CTempFiles *TempFiles;
-
- void Init()
- {
- _streamIndex = 0;
- _offsetPos = 0;
- _absPos = 0;
- _length = 0;
- }
-
- bool SetMTime(const FILETIME *mTime);
- HRESULT Close();
-
- MY_UNKNOWN_IMP1(IOutStream)
-
- STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
- STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
- STDMETHOD(SetSize)(UInt64 newSize);
-};
-
-// static NSynchronization::CCriticalSection g_TempPathsCS;
-
-HRESULT COutMultiVolStream::Close()
-{
- HRESULT res = S_OK;
- FOR_VECTOR (i, Streams)
- {
- COutFileStream *s = Streams[i].StreamSpec;
- if (s)
- {
- HRESULT res2 = s->Close();
- if (res2 != S_OK)
- res = res2;
- }
- }
- return res;
-}
-
-bool COutMultiVolStream::SetMTime(const FILETIME *mTime)
-{
- bool res = true;
- FOR_VECTOR (i, Streams)
- {
- COutFileStream *s = Streams[i].StreamSpec;
- if (s)
- if (!s->SetMTime(mTime))
- res = false;
- }
- return res;
-}
-
-STDMETHODIMP COutMultiVolStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
- if (processedSize != NULL)
- *processedSize = 0;
- while (size > 0)
- {
- if (_streamIndex >= Streams.Size())
- {
- CAltStreamInfo altStream;
-
- FChar temp[16];
- ConvertUInt32ToString(_streamIndex + 1, temp);
- FString res = temp;
- while (res.Len() < 3)
- res = FString(FTEXT('0')) + res;
- FString name = Prefix + res;
- altStream.StreamSpec = new COutFileStream;
- altStream.Stream = altStream.StreamSpec;
- if (!altStream.StreamSpec->Create(name, false))
- return ::GetLastError();
- {
- // NSynchronization::CCriticalSectionLock lock(g_TempPathsCS);
- TempFiles->Paths.Add(name);
- }
-
- altStream.Pos = 0;
- altStream.RealSize = 0;
- altStream.Name = name;
- Streams.Add(altStream);
- continue;
- }
- CAltStreamInfo &altStream = Streams[_streamIndex];
-
- unsigned index = _streamIndex;
- if (index >= Sizes.Size())
- index = Sizes.Size() - 1;
- UInt64 volSize = Sizes[index];
-
- if (_offsetPos >= volSize)
- {
- _offsetPos -= volSize;
- _streamIndex++;
- continue;
- }
- if (_offsetPos != altStream.Pos)
- {
- // CMyComPtr<IOutStream> outStream;
- // RINOK(altStream.Stream.QueryInterface(IID_IOutStream, &outStream));
- RINOK(altStream.Stream->Seek(_offsetPos, STREAM_SEEK_SET, NULL));
- altStream.Pos = _offsetPos;
- }
-
- UInt32 curSize = (UInt32)MyMin((UInt64)size, volSize - altStream.Pos);
- UInt32 realProcessed;
- RINOK(altStream.Stream->Write(data, curSize, &realProcessed));
- data = (void *)((Byte *)data + realProcessed);
- size -= realProcessed;
- altStream.Pos += realProcessed;
- _offsetPos += realProcessed;
- _absPos += realProcessed;
- if (_absPos > _length)
- _length = _absPos;
- if (_offsetPos > altStream.RealSize)
- altStream.RealSize = _offsetPos;
- if (processedSize != NULL)
- *processedSize += realProcessed;
- if (altStream.Pos == volSize)
- {
- _streamIndex++;
- _offsetPos = 0;
- }
- if (realProcessed == 0 && curSize != 0)
- return E_FAIL;
- break;
- }
- return S_OK;
-}
-
-STDMETHODIMP COutMultiVolStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
-{
- if (seekOrigin >= 3)
- return STG_E_INVALIDFUNCTION;
- switch (seekOrigin)
- {
- case STREAM_SEEK_SET: _absPos = offset; break;
- case STREAM_SEEK_CUR: _absPos += offset; break;
- case STREAM_SEEK_END: _absPos = _length + offset; break;
- }
- _offsetPos = _absPos;
- if (newPosition != NULL)
- *newPosition = _absPos;
- _streamIndex = 0;
- return S_OK;
-}
-
-STDMETHODIMP COutMultiVolStream::SetSize(UInt64 newSize)
-{
- if (newSize < 0)
- return E_INVALIDARG;
- unsigned i = 0;
- while (i < Streams.Size())
- {
- CAltStreamInfo &altStream = Streams[i++];
- if ((UInt64)newSize < altStream.RealSize)
- {
- RINOK(altStream.Stream->SetSize(newSize));
- altStream.RealSize = newSize;
- break;
- }
- newSize -= altStream.RealSize;
- }
- while (i < Streams.Size())
- {
- {
- CAltStreamInfo &altStream = Streams.Back();
- altStream.Stream.Release();
- DeleteFileAlways(altStream.Name);
- }
- Streams.DeleteBack();
- }
- _offsetPos = _absPos;
- _streamIndex = 0;
- _length = newSize;
- return S_OK;
-}
-
-void CArchivePath::ParseFromPath(const UString &path, EArcNameMode mode)
-{
- OriginalPath = path;
-
- SplitPathToParts_2(path, Prefix, Name);
-
- if (mode == k_ArcNameMode_Add)
- return;
- if (mode == k_ArcNameMode_Exact)
- {
- BaseExtension.Empty();
- return;
- }
-
- int dotPos = Name.ReverseFind(L'.');
- if (dotPos < 0)
- return;
- if ((unsigned)dotPos == Name.Len() - 1)
- {
- Name.DeleteBack();
- BaseExtension.Empty();
- return;
- }
- const UString ext = Name.Ptr(dotPos + 1);
- if (BaseExtension.IsEqualToNoCase(ext))
- {
- BaseExtension = ext;
- Name.DeleteFrom(dotPos);
- }
- else
- BaseExtension.Empty();
-}
-
-UString CArchivePath::GetFinalPath() const
-{
- UString path = GetPathWithoutExt();
- if (!BaseExtension.IsEmpty())
- path += UString(L'.') + BaseExtension;
- return path;
-}
-
-UString CArchivePath::GetFinalVolPath() const
-{
- UString path = GetPathWithoutExt();
- if (!BaseExtension.IsEmpty())
- path += UString(L'.') + VolExtension;
- return path;
-}
-
-FString CArchivePath::GetTempPath() const
-{
- FString path = TempPrefix + us2fs(Name);
- if (!BaseExtension.IsEmpty())
- path += FString(FTEXT('.')) + us2fs(BaseExtension);
- path += FTEXT(".tmp");
- path += TempPostfix;
- return path;
-}
-
-static const wchar_t *kDefaultArcType = L"7z";
-static const wchar_t *kDefaultArcExt = L"7z";
-static const wchar_t *kSFXExtension =
- #ifdef _WIN32
- L"exe";
- #else
- L"";
- #endif
-
-bool CUpdateOptions::InitFormatIndex(const CCodecs *codecs,
- const CObjectVector<COpenType> &types, const UString &arcPath)
-{
- if (types.Size() > 1)
- return false;
- // int arcTypeIndex = -1;
- if (types.Size() != 0)
- {
- MethodMode.Type = types[0];
- MethodMode.Type_Defined = true;
- }
- if (MethodMode.Type.FormatIndex < 0)
- {
- // MethodMode.Type = -1;
- MethodMode.Type = COpenType();
- if (ArcNameMode != k_ArcNameMode_Add)
- {
- MethodMode.Type.FormatIndex = codecs->FindFormatForArchiveName(arcPath);
- if (MethodMode.Type.FormatIndex >= 0)
- MethodMode.Type_Defined = true;
- }
- }
- return true;
-}
-
-bool CUpdateOptions::SetArcPath(const CCodecs *codecs, const UString &arcPath)
-{
- UString typeExt;
- int formatIndex = MethodMode.Type.FormatIndex;
- if (formatIndex < 0)
- {
- typeExt = kDefaultArcExt;
- }
- else
- {
- const CArcInfoEx &arcInfo = codecs->Formats[formatIndex];
- if (!arcInfo.UpdateEnabled)
- return false;
- typeExt = arcInfo.GetMainExt();
- }
- UString ext = typeExt;
- if (SfxMode)
- ext = kSFXExtension;
- ArchivePath.BaseExtension = ext;
- ArchivePath.VolExtension = typeExt;
- ArchivePath.ParseFromPath(arcPath, ArcNameMode);
- FOR_VECTOR (i, Commands)
- {
- CUpdateArchiveCommand &uc = Commands[i];
- uc.ArchivePath.BaseExtension = ext;
- uc.ArchivePath.VolExtension = typeExt;
- uc.ArchivePath.ParseFromPath(uc.UserArchivePath, ArcNameMode);
- }
- return true;
-}
-
-/*
-struct CUpdateProduceCallbackImp: public IUpdateProduceCallback
-{
- const CObjectVector<CArcItem> *_arcItems;
- IUpdateCallbackUI *_callback;
-
- CUpdateProduceCallbackImp(const CObjectVector<CArcItem> *a,
- IUpdateCallbackUI *callback): _arcItems(a), _callback(callback) {}
- virtual HRESULT ShowDeleteFile(int arcIndex);
-};
-
-HRESULT CUpdateProduceCallbackImp::ShowDeleteFile(int arcIndex)
-{
- return _callback->ShowDeleteFile((*_arcItems)[arcIndex].Name);
-}
-*/
-
-bool CRenamePair::Prepare()
-{
- if (RecursedType != NRecursedType::kNonRecursed)
- return false;
- if (!WildcardParsing)
- return true;
- return !DoesNameContainWildcard(OldName);
-}
-
-extern bool g_CaseSensitive;
-
-static int CompareTwoNames(const wchar_t *s1, const wchar_t *s2)
-{
- for (int i = 0;; i++)
- {
- wchar_t c1 = s1[i];
- wchar_t c2 = s2[i];
- if (c1 == 0 || c2 == 0)
- return i;
- if (c1 == c2)
- continue;
- if (!g_CaseSensitive && (MyCharUpper(c1) == MyCharUpper(c2)))
- continue;
- if (IsCharDirLimiter(c1) && IsCharDirLimiter(c2))
- continue;
- return i;
- }
-}
-
-bool CRenamePair::GetNewPath(bool isFolder, const UString &src, UString &dest) const
-{
- int num = CompareTwoNames(OldName, src);
- if (OldName[num] == 0)
- {
- if (src[num] != 0 && !IsCharDirLimiter(src[num]) && num != 0 && !IsCharDirLimiter(src[num - 1]))
- return false;
- }
- else
- {
- // OldName[num] != 0
- // OldName = "1\1a.txt"
- // src = "1"
-
- if (!isFolder ||
- src[num] != 0 ||
- !IsCharDirLimiter(OldName[num]) ||
- OldName[num + 1] != 0)
- return false;
- }
- dest = NewName + src.Ptr(num);
- return true;
-}
-
-static int GetReverseSlashPos(const UString &name)
-{
- int slashPos = name.ReverseFind(L'/');
- #ifdef _WIN32
- int slash1Pos = name.ReverseFind(L'\\');
- slashPos = MyMax(slashPos, slash1Pos);
- #endif
- return slashPos;
-}
-
-static HRESULT Compress(
- const CUpdateOptions &options,
- CCodecs *codecs,
- const CActionSet &actionSet,
- const CArc *arc,
- CArchivePath &archivePath,
- const CObjectVector<CArcItem> &arcItems,
- Byte *processedItemsStatuses,
- const CDirItems &dirItems,
- const CDirItem *parentDirItem,
- CTempFiles &tempFiles,
- CUpdateErrorInfo &errorInfo,
- IUpdateCallbackUI *callback)
-{
- CMyComPtr<IOutArchive> outArchive;
- int formatIndex = options.MethodMode.Type.FormatIndex;
- if (arc)
- {
- formatIndex = arc->FormatIndex;
- if (formatIndex < 0)
- return E_NOTIMPL;
- CMyComPtr<IInArchive> archive2 = arc->Archive;
- HRESULT result = archive2.QueryInterface(IID_IOutArchive, &outArchive);
- if (result != S_OK)
- throw kUpdateIsNotSupoorted;
- }
- else
- {
- RINOK(codecs->CreateOutArchive(formatIndex, outArchive));
-
- #ifdef EXTERNAL_CODECS
- {
- CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo;
- outArchive.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo);
- if (setCompressCodecsInfo)
- {
- RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecs));
- }
- }
- #endif
- }
- if (outArchive == 0)
- throw kUpdateIsNotSupoorted;
-
- NFileTimeType::EEnum fileTimeType;
- UInt32 value;
- RINOK(outArchive->GetFileTimeType(&value));
-
- switch (value)
- {
- case NFileTimeType::kWindows:
- case NFileTimeType::kUnix:
- case NFileTimeType::kDOS:
- fileTimeType = (NFileTimeType::EEnum)value;
- break;
- default:
- return E_FAIL;
- }
-
- {
- const CArcInfoEx &arcInfo = codecs->Formats[formatIndex];
- if (options.AltStreams.Val && !arcInfo.Flags_AltStreams())
- return E_NOTIMPL;
- if (options.NtSecurity.Val && !arcInfo.Flags_NtSecure())
- return E_NOTIMPL;
- }
-
- CRecordVector<CUpdatePair2> updatePairs2;
-
- UStringVector newNames;
-
- if (options.RenamePairs.Size() != 0)
- {
- FOR_VECTOR (i, arcItems)
- {
- const CArcItem &ai = arcItems[i];
- bool needRename = false;
- UString dest;
- if (ai.Censored)
- {
- FOR_VECTOR (j, options.RenamePairs)
- {
- const CRenamePair &rp = options.RenamePairs[j];
- if (rp.GetNewPath(ai.IsDir, ai.Name, dest))
- {
- needRename = true;
- break;
- }
- if (ai.IsAltStream)
- {
- int colonPos = ai.Name.ReverseFind(':');
- int slashPosPos = GetReverseSlashPos(ai.Name);
- if (colonPos > slashPosPos)
- {
- UString mainName = ai.Name.Left(colonPos);
- /*
- actually we must improve that code to support cases
- with folder renaming like: rn arc dir1\ dir2\
- */
- if (rp.GetNewPath(false, mainName, dest))
- {
- needRename = true;
- dest += ':';
- dest += ai.Name.Ptr(colonPos + 1);
- break;
- }
- }
- }
- }
- }
- CUpdatePair2 up2;
- up2.SetAs_NoChangeArcItem(ai.IndexInServer);
- if (needRename)
- {
- up2.NewProps = true;
- RINOK(arc->IsItemAnti(i, up2.IsAnti));
- up2.NewNameIndex = newNames.Add(dest);
- }
- updatePairs2.Add(up2);
- }
- }
- else
- {
- CRecordVector<CUpdatePair> updatePairs;
- GetUpdatePairInfoList(dirItems, arcItems, fileTimeType, updatePairs); // must be done only once!!!
- // CUpdateProduceCallbackImp upCallback(&arcItems, callback);
- UpdateProduce(updatePairs, actionSet, updatePairs2, NULL /* &upCallback */);
- }
-
- UInt32 numFiles = 0;
- FOR_VECTOR (i, updatePairs2)
- if (updatePairs2[i].NewData)
- numFiles++;
-
- RINOK(callback->SetNumFiles(numFiles));
-
- CArchiveUpdateCallback *updateCallbackSpec = new CArchiveUpdateCallback;
- CMyComPtr<IArchiveUpdateCallback> updateCallback(updateCallbackSpec);
-
- updateCallbackSpec->ShareForWrite = options.OpenShareForWrite;
- updateCallbackSpec->StdInMode = options.StdInMode;
- updateCallbackSpec->Callback = callback;
-
- if (arc)
- {
- // we set Archive to allow to transfer GetProperty requests back to DLL.
- updateCallbackSpec->Archive = arc->Archive;
- updateCallbackSpec->GetRawProps = arc->GetRawProps;
- updateCallbackSpec->GetRootProps = arc->GetRootProps;
- }
-
- updateCallbackSpec->DirItems = &dirItems;
- updateCallbackSpec->ParentDirItem = parentDirItem;
-
- updateCallbackSpec->StoreNtSecurity = options.NtSecurity.Val;
- updateCallbackSpec->StoreHardLinks = options.HardLinks.Val;
- updateCallbackSpec->StoreSymLinks = options.SymLinks.Val;
-
- updateCallbackSpec->ArcItems = &arcItems;
- updateCallbackSpec->UpdatePairs = &updatePairs2;
-
- updateCallbackSpec->ProcessedItemsStatuses = processedItemsStatuses;
-
- if (options.RenamePairs.Size() != 0)
- updateCallbackSpec->NewNames = &newNames;
-
- CMyComPtr<IOutStream> outSeekStream;
- CMyComPtr<ISequentialOutStream> outStream;
-
- if (!options.StdOutMode)
- {
- FString dirPrefix;
- if (!GetOnlyDirPrefix(us2fs(archivePath.GetFinalPath()), dirPrefix))
- throw 1417161;
- CreateComplexDir(dirPrefix);
- }
-
- COutFileStream *outStreamSpec = NULL;
- COutMultiVolStream *volStreamSpec = NULL;
-
- if (options.VolumesSizes.Size() == 0)
- {
- if (options.StdOutMode)
- outStream = new CStdOutFileStream;
- else
- {
- outStreamSpec = new COutFileStream;
- outSeekStream = outStreamSpec;
- outStream = outSeekStream;
- bool isOK = false;
- FString realPath;
- for (int i = 0; i < (1 << 16); i++)
- {
- if (archivePath.Temp)
- {
- if (i > 0)
- {
- FChar s[16];
- ConvertUInt32ToString(i, s);
- archivePath.TempPostfix = s;
- }
- realPath = archivePath.GetTempPath();
- }
- else
- realPath = us2fs(archivePath.GetFinalPath());
- if (outStreamSpec->Create(realPath, false))
- {
- tempFiles.Paths.Add(realPath);
- isOK = true;
- break;
- }
- if (::GetLastError() != ERROR_FILE_EXISTS)
- break;
- if (!archivePath.Temp)
- break;
- }
- if (!isOK)
- {
- errorInfo.SystemError = ::GetLastError();
- errorInfo.FileName = realPath;
- errorInfo.Message = L"7-Zip cannot open file";
- return E_FAIL;
- }
- }
- }
- else
- {
- if (options.StdOutMode)
- return E_FAIL;
- if (arc && arc->GetGlobalOffset() > 0)
- return E_NOTIMPL;
-
- volStreamSpec = new COutMultiVolStream;
- outSeekStream = volStreamSpec;
- outStream = outSeekStream;
- volStreamSpec->Sizes = options.VolumesSizes;
- volStreamSpec->Prefix = us2fs(archivePath.GetFinalVolPath() + L".");
- volStreamSpec->TempFiles = &tempFiles;
- volStreamSpec->Init();
-
- /*
- updateCallbackSpec->VolumesSizes = volumesSizes;
- updateCallbackSpec->VolName = archivePath.Prefix + archivePath.Name;
- if (!archivePath.VolExtension.IsEmpty())
- updateCallbackSpec->VolExt = UString(L'.') + archivePath.VolExtension;
- */
- }
-
- RINOK(SetProperties(outArchive, options.MethodMode.Properties));
-
- if (options.SfxMode)
- {
- CInFileStream *sfxStreamSpec = new CInFileStream;
- CMyComPtr<IInStream> sfxStream(sfxStreamSpec);
- if (!sfxStreamSpec->Open(options.SfxModule))
- {
- errorInfo.SystemError = ::GetLastError();
- errorInfo.Message = L"7-Zip cannot open SFX module";
- errorInfo.FileName = options.SfxModule;
- return E_FAIL;
- }
-
- CMyComPtr<ISequentialOutStream> sfxOutStream;
- COutFileStream *outStreamSpec = NULL;
- if (options.VolumesSizes.Size() == 0)
- sfxOutStream = outStream;
- else
- {
- outStreamSpec = new COutFileStream;
- sfxOutStream = outStreamSpec;
- FString realPath = us2fs(archivePath.GetFinalPath());
- if (!outStreamSpec->Create(realPath, false))
- {
- errorInfo.SystemError = ::GetLastError();
- errorInfo.FileName = realPath;
- errorInfo.Message = L"7-Zip cannot open file";
- return E_FAIL;
- }
- }
- RINOK(NCompress::CopyStream(sfxStream, sfxOutStream, NULL));
- if (outStreamSpec)
- {
- RINOK(outStreamSpec->Close());
- }
- }
-
- CMyComPtr<ISequentialOutStream> tailStream;
-
- if (options.SfxMode || !arc || arc->ArcStreamOffset == 0)
- tailStream = outStream;
- else
- {
- // Int64 globalOffset = arc->GetGlobalOffset();
- RINOK(arc->InStream->Seek(0, STREAM_SEEK_SET, NULL));
- RINOK(NCompress::CopyStream_ExactSize(arc->InStream, outStream, arc->ArcStreamOffset, NULL));
- if (options.StdOutMode)
- tailStream = outStream;
- else
- {
- CTailOutStream *tailStreamSpec = new CTailOutStream;
- tailStream = tailStreamSpec;
- tailStreamSpec->Stream = outSeekStream;
- tailStreamSpec->Offset = arc->ArcStreamOffset;
- tailStreamSpec->Init();
- }
- }
-
-
- HRESULT result = outArchive->UpdateItems(tailStream, updatePairs2.Size(), updateCallback);
- callback->Finilize();
- RINOK(result);
-
-
- if (options.SetArcMTime)
- {
- FILETIME ft;
- ft.dwLowDateTime = 0;
- ft.dwHighDateTime = 0;
- FOR_VECTOR (i, updatePairs2)
- {
- CUpdatePair2 &pair2 = updatePairs2[i];
- const FILETIME *ft2 = NULL;
- if (pair2.NewProps && pair2.DirIndex >= 0)
- ft2 = &dirItems.Items[pair2.DirIndex].MTime;
- else if (pair2.UseArcProps && pair2.ArcIndex >= 0)
- ft2 = &arcItems[pair2.ArcIndex].MTime;
- if (ft2)
- {
- if (::CompareFileTime(&ft, ft2) < 0)
- ft = *ft2;
- }
- }
- if (ft.dwLowDateTime != 0 || ft.dwHighDateTime != 0)
- {
- if (outStreamSpec)
- outStreamSpec->SetMTime(&ft);
- else if (volStreamSpec)
- volStreamSpec->SetMTime(&ft);;
- }
- }
-
- if (outStreamSpec)
- result = outStreamSpec->Close();
- else if (volStreamSpec)
- result = volStreamSpec->Close();
- return result;
-}
-
-static HRESULT EnumerateInArchiveItems(
- // bool storeStreamsMode,
- const NWildcard::CCensor &censor,
- const CArc &arc,
- CObjectVector<CArcItem> &arcItems)
-{
- arcItems.Clear();
- UInt32 numItems;
- IInArchive *archive = arc.Archive;
- RINOK(archive->GetNumberOfItems(&numItems));
- arcItems.ClearAndReserve(numItems);
- for (UInt32 i = 0; i < numItems; i++)
- {
- CArcItem ai;
-
- RINOK(arc.GetItemPath(i, ai.Name));
- RINOK(Archive_IsItem_Folder(archive, i, ai.IsDir));
- RINOK(Archive_IsItem_AltStream(archive, i, ai.IsAltStream));
- /*
- if (!storeStreamsMode && ai.IsAltStream)
- continue;
- */
- ai.Censored = censor.CheckPath(ai.IsAltStream, ai.Name, !ai.IsDir);
- RINOK(arc.GetItemMTime(i, ai.MTime, ai.MTimeDefined));
- RINOK(arc.GetItemSize(i, ai.Size, ai.SizeDefined));
-
- {
- CPropVariant prop;
- RINOK(archive->GetProperty(i, kpidTimeType, &prop));
- if (prop.vt == VT_UI4)
- {
- ai.TimeType = (int)(NFileTimeType::EEnum)prop.ulVal;
- switch (ai.TimeType)
- {
- case NFileTimeType::kWindows:
- case NFileTimeType::kUnix:
- case NFileTimeType::kDOS:
- break;
- default:
- return E_FAIL;
- }
- }
- }
-
- ai.IndexInServer = i;
- arcItems.AddInReserved(ai);
- }
- return S_OK;
-}
-
-struct CEnumDirItemUpdateCallback: public IEnumDirItemCallback
-{
- IUpdateCallbackUI2 *Callback;
- HRESULT ScanProgress(UInt64 numFolders, UInt64 numFiles, UInt64 totalSize, const wchar_t *path, bool isDir)
- {
- return Callback->ScanProgress(numFolders, numFiles, totalSize, path, isDir);
- }
-};
-
-#if defined(_WIN32) && !defined(UNDER_CE)
-
-#include <mapi.h>
-
-#endif
-
-struct CRefSortPair
-{
- int Len;
- int Index;
-};
-
-#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
-
-static int CompareRefSortPair(const CRefSortPair *a1, const CRefSortPair *a2, void *)
-{
- RINOZ(-MyCompare(a1->Len, a2->Len));
- return MyCompare(a1->Index, a2->Index);
-}
-
-static int GetNumSlashes(const FChar *s)
-{
- for (int numSlashes = 0;;)
- {
- FChar c = *s++;
- if (c == 0)
- return numSlashes;
- if (
- #ifdef _WIN32
- c == FTEXT('\\') ||
- #endif
- c == FTEXT('/'))
- numSlashes++;
- }
-}
-
-#ifdef _WIN32
-void ConvertToLongNames(NWildcard::CCensor &censor);
-#endif
-
-HRESULT UpdateArchive(
- CCodecs *codecs,
- const CObjectVector<COpenType> &types,
- const UString &cmdArcPath2,
- NWildcard::CCensor &censor,
- CUpdateOptions &options,
- CUpdateErrorInfo &errorInfo,
- IOpenCallbackUI *openCallback,
- IUpdateCallbackUI2 *callback,
- bool needSetPath)
-{
- if (options.StdOutMode && options.EMailMode)
- return E_FAIL;
-
- if (types.Size() > 1)
- return E_NOTIMPL;
-
- bool renameMode = !options.RenamePairs.IsEmpty();
- if (renameMode)
- {
- if (options.Commands.Size() != 1)
- return E_FAIL;
- }
-
- if (options.DeleteAfterCompressing)
- {
- if (options.Commands.Size() != 1)
- return E_NOTIMPL;
- const CActionSet &as = options.Commands[0].ActionSet;
- for (int i = 2; i < NPairState::kNumValues; i++)
- if (as.StateActions[i] != NPairAction::kCompress)
- return E_NOTIMPL;
- }
-
- censor.AddPathsToCensor(options.PathMode);
- #ifdef _WIN32
- ConvertToLongNames(censor);
- #endif
- censor.ExtendExclude();
-
-
- if (options.VolumesSizes.Size() > 0 && (options.EMailMode /* || options.SfxMode */))
- return E_NOTIMPL;
-
- if (options.SfxMode)
- {
- CProperty property;
- property.Name = L"rsfx";
- property.Value = L"on";
- options.MethodMode.Properties.Add(property);
- if (options.SfxModule.IsEmpty())
- {
- errorInfo.Message = L"SFX file is not specified";
- return E_FAIL;
- }
- bool found = false;
- if (options.SfxModule.Find(FCHAR_PATH_SEPARATOR) < 0)
- {
- const FString fullName = NDLL::GetModuleDirPrefix() + options.SfxModule;
- if (NFind::DoesFileExist(fullName))
- {
- options.SfxModule = fullName;
- found = true;
- }
- }
- if (!found)
- {
- if (!NFind::DoesFileExist(options.SfxModule))
- {
- errorInfo.SystemError = ::GetLastError();
- errorInfo.Message = L"7-Zip cannot find specified SFX module";
- errorInfo.FileName = options.SfxModule;
- return E_FAIL;
- }
- }
- }
-
- CArchiveLink arcLink;
-
-
- if (needSetPath)
- {
- if (!options.InitFormatIndex(codecs, types, cmdArcPath2) ||
- !options.SetArcPath(codecs, cmdArcPath2))
- return E_NOTIMPL;
- }
- UString arcPath = options.ArchivePath.GetFinalPath();
-
- if (cmdArcPath2.IsEmpty())
- {
- if (options.MethodMode.Type.FormatIndex < 0)
- throw "type of archive is not specified";
- }
- else
- {
- NFind::CFileInfo fi;
- if (!fi.Find(us2fs(arcPath)))
- {
- if (renameMode)
- throw "can't find archive";;
- if (options.MethodMode.Type.FormatIndex < 0)
- {
- if (!options.SetArcPath(codecs, cmdArcPath2))
- return E_NOTIMPL;
- }
- }
- else
- {
- if (fi.IsDir())
- throw "there is no such archive";
- if (fi.IsDevice)
- return E_NOTIMPL;
- if (options.VolumesSizes.Size() > 0)
- return E_NOTIMPL;
- CObjectVector<COpenType> types;
- // change it.
- if (options.MethodMode.Type_Defined)
- types.Add(options.MethodMode.Type);
- // We need to set Properties to open archive only in some cases (WIM archives).
-
- CIntVector excl;
- COpenOptions op;
- #ifndef _SFX
- op.props = &options.MethodMode.Properties;
- #endif
- op.codecs = codecs;
- op.types = &types;
- op.excludedFormats = &excl;
- op.stdInMode = false;
- op.stream = NULL;
- op.filePath = arcPath;
-
- HRESULT result = arcLink.Open2(op, openCallback);
-
- if (result == E_ABORT)
- return result;
-
- const wchar_t *errorArcType = NULL;
- if (arcLink.NonOpen_ErrorInfo.ErrorFormatIndex > 0)
- errorArcType = codecs->Formats[arcLink.NonOpen_ErrorInfo.ErrorFormatIndex].Name;
- RINOK(callback->OpenResult(arcPath, result, errorArcType));
- /*
- if (result == S_FALSE)
- return E_FAIL;
- */
- RINOK(result);
- if (arcLink.VolumePaths.Size() > 1)
- {
- errorInfo.SystemError = (DWORD)E_NOTIMPL;
- errorInfo.Message = L"Updating for multivolume archives is not implemented";
- return E_NOTIMPL;
- }
-
- CArc &arc = arcLink.Arcs.Back();
- arc.MTimeDefined = !fi.IsDevice;
- arc.MTime = fi.MTime;
-
- if (arc.ErrorInfo.ThereIsTail)
- {
- errorInfo.SystemError = (DWORD)E_NOTIMPL;
- errorInfo.Message = L"There is some data block after the end of the archive";
- return E_NOTIMPL;
- }
- if (options.MethodMode.Type.FormatIndex < 0)
- {
- options.MethodMode.Type.FormatIndex = arcLink.GetArc()->FormatIndex;
- if (!options.SetArcPath(codecs, cmdArcPath2))
- return E_NOTIMPL;
- }
- }
- }
-
- if (options.MethodMode.Type.FormatIndex < 0)
- {
- options.MethodMode.Type.FormatIndex = codecs->FindFormatForArchiveType(kDefaultArcType);
- if (options.MethodMode.Type.FormatIndex < 0)
- return E_NOTIMPL;
- }
-
- bool thereIsInArchive = arcLink.IsOpen;
- if (!thereIsInArchive && renameMode)
- return E_FAIL;
-
- CDirItems dirItems;
- CDirItem parentDirItem;
- CDirItem *parentDirItem_Ptr = NULL;
-
- /*
- FStringVector requestedPaths;
- FStringVector *requestedPaths_Ptr = NULL;
- if (options.DeleteAfterCompressing)
- requestedPaths_Ptr = &requestedPaths;
- */
-
- if (options.StdInMode)
- {
- CDirItem di;
- di.Name = options.StdInFileName;
- di.Size = (UInt64)(Int64)-1;
- di.Attrib = 0;
- NTime::GetCurUtcFileTime(di.MTime);
- di.CTime = di.ATime = di.MTime;
- dirItems.Items.Add(di);
- }
- else
- {
- bool needScanning = false;
- if (!renameMode)
- FOR_VECTOR (i, options.Commands)
- if (options.Commands[i].ActionSet.NeedScanning())
- needScanning = true;
- if (needScanning)
- {
- CEnumDirItemUpdateCallback enumCallback;
- enumCallback.Callback = callback;
- RINOK(callback->StartScanning());
-
- dirItems.SymLinks = options.SymLinks.Val;
-
- #if defined(_WIN32) && !defined(UNDER_CE)
- dirItems.ReadSecure = options.NtSecurity.Val;
- #endif
-
- dirItems.ScanAltStreams = options.AltStreams.Val;
- HRESULT res = EnumerateItems(censor,
- options.PathMode,
- options.AddPathPrefix,
- dirItems, &enumCallback);
- FOR_VECTOR (i, dirItems.ErrorPaths)
- {
- RINOK(callback->CanNotFindError(fs2us(dirItems.ErrorPaths[i]), dirItems.ErrorCodes[i]));
- }
- if (res != S_OK)
- {
- if (res != E_ABORT)
- errorInfo.Message = L"Scanning error";
- return res;
- }
- RINOK(callback->FinishScanning());
-
- if (censor.Pairs.Size() == 1)
- {
- NFind::CFileInfo fi;
- FString prefix = us2fs(censor.Pairs[0].Prefix) + FTEXT(".");
- // UString prefix = censor.Pairs[0].Prefix;
- /*
- if (prefix.Back() == WCHAR_PATH_SEPARATOR)
- {
- prefix.DeleteBack();
- }
- */
- if (fi.Find(prefix))
- if (fi.IsDir())
- {
- parentDirItem.Size = fi.Size;
- parentDirItem.CTime = fi.CTime;
- parentDirItem.ATime = fi.ATime;
- parentDirItem.MTime = fi.MTime;
- parentDirItem.Attrib = fi.Attrib;
- parentDirItem_Ptr = &parentDirItem;
-
- int secureIndex = -1;
- #if defined(_WIN32) && !defined(UNDER_CE)
- if (options.NtSecurity.Val)
- dirItems.AddSecurityItem(prefix, secureIndex);
- #endif
- parentDirItem.SecureIndex = secureIndex;
-
- parentDirItem_Ptr = &parentDirItem;
- }
- }
- }
- }
-
- FString tempDirPrefix;
- bool usesTempDir = false;
-
- #ifdef _WIN32
- CTempDir tempDirectory;
- if (options.EMailMode && options.EMailRemoveAfter)
- {
- tempDirectory.Create(kTempFolderPrefix);
- tempDirPrefix = tempDirectory.GetPath();
- NormalizeDirPathPrefix(tempDirPrefix);
- usesTempDir = true;
- }
- #endif
-
- CTempFiles tempFiles;
-
- bool createTempFile = false;
-
- if (!options.StdOutMode && options.UpdateArchiveItself)
- {
- CArchivePath &ap = options.Commands[0].ArchivePath;
- ap = options.ArchivePath;
- // if ((archive != 0 && !usesTempDir) || !options.WorkingDir.IsEmpty())
- if ((thereIsInArchive || !options.WorkingDir.IsEmpty()) && !usesTempDir && options.VolumesSizes.Size() == 0)
- {
- createTempFile = true;
- ap.Temp = true;
- if (!options.WorkingDir.IsEmpty())
- ap.TempPrefix = options.WorkingDir;
- else
- ap.TempPrefix = us2fs(ap.Prefix);
- NormalizeDirPathPrefix(ap.TempPrefix);
- }
- }
-
- unsigned i;
- for (i = 0; i < options.Commands.Size(); i++)
- {
- CArchivePath &ap = options.Commands[i].ArchivePath;
- if (usesTempDir)
- {
- // Check it
- ap.Prefix = fs2us(tempDirPrefix);
- // ap.Temp = true;
- // ap.TempPrefix = tempDirPrefix;
- }
- if (!options.StdOutMode &&
- (i > 0 || !createTempFile))
- {
- const FString path = us2fs(ap.GetFinalPath());
- if (NFind::DoesFileOrDirExist(path))
- {
- errorInfo.SystemError = 0;
- errorInfo.Message = L"The file already exists";
- errorInfo.FileName = path;
- return E_FAIL;
- }
- }
- }
-
- CObjectVector<CArcItem> arcItems;
- if (thereIsInArchive)
- {
- RINOK(EnumerateInArchiveItems(
- // options.StoreAltStreams,
- censor, arcLink.Arcs.Back(), arcItems));
- }
-
- /*
- FStringVector processedFilePaths;
- FStringVector *processedFilePaths_Ptr = NULL;
- if (options.DeleteAfterCompressing)
- processedFilePaths_Ptr = &processedFilePaths;
- */
-
- CByteBuffer processedItems;
- if (options.DeleteAfterCompressing)
- {
- unsigned num = dirItems.Items.Size();
- processedItems.Alloc(num);
- for (i = 0; i < num; i++)
- processedItems[i] = 0;
- }
-
- for (i = 0; i < options.Commands.Size(); i++)
- {
- const CArc *arc = thereIsInArchive ? arcLink.GetArc() : 0;
- // IInArchiveExtra *archiveExtra = thereIsInArchive ? arcLink.GetArchiveExtra() : 0;
- // IArchiveGetRootProps *archiveGetRootProps = thereIsInArchive ? arcLink.GetArchiveGetRootProps() : 0;
- CUpdateArchiveCommand &command = options.Commands[i];
- UString name;
- bool isUpdating;
- if (options.StdOutMode)
- {
- name = L"stdout";
- isUpdating = arc != 0;
- }
- else
- {
- name = command.ArchivePath.GetFinalPath();
- isUpdating = (i == 0 && options.UpdateArchiveItself && arc != 0);
- }
- RINOK(callback->StartArchive(name, isUpdating))
-
- RINOK(Compress(options,
- codecs,
- command.ActionSet,
- arc,
- command.ArchivePath,
- arcItems,
- options.DeleteAfterCompressing ? (Byte *)processedItems : NULL,
-
- dirItems,
- parentDirItem_Ptr,
-
- tempFiles,
- errorInfo, callback));
-
- RINOK(callback->FinishArchive());
- }
-
-
- if (thereIsInArchive)
- {
- RINOK(arcLink.Close());
- arcLink.Release();
- }
-
- tempFiles.Paths.Clear();
- if (createTempFile)
- {
- try
- {
- CArchivePath &ap = options.Commands[0].ArchivePath;
- const FString &tempPath = ap.GetTempPath();
- if (thereIsInArchive)
- if (!DeleteFileAlways(us2fs(arcPath)))
- {
- errorInfo.SystemError = ::GetLastError();
- errorInfo.Message = L"7-Zip cannot delete the file";
- errorInfo.FileName = us2fs(arcPath);
- return E_FAIL;
- }
- if (!MyMoveFile(tempPath, us2fs(arcPath)))
- {
- errorInfo.SystemError = ::GetLastError();
- errorInfo.Message = L"7-Zip cannot move the file";
- errorInfo.FileName = tempPath;
- errorInfo.FileName2 = us2fs(arcPath);
- return E_FAIL;
- }
- }
- catch(...)
- {
- throw;
- }
- }
-
-
- #if defined(_WIN32) && !defined(UNDER_CE)
- if (options.EMailMode)
- {
- NDLL::CLibrary mapiLib;
- if (!mapiLib.Load(FTEXT("Mapi32.dll")))
- {
- errorInfo.SystemError = ::GetLastError();
- errorInfo.Message = L"7-Zip cannot load Mapi32.dll";
- return E_FAIL;
- }
-
- /*
- LPMAPISENDDOCUMENTS fnSend = (LPMAPISENDDOCUMENTS)mapiLib.GetProc("MAPISendDocuments");
- if (fnSend == 0)
- {
- errorInfo.SystemError = ::GetLastError();
- errorInfo.Message = L"7-Zip cannot find MAPISendDocuments function";
- return E_FAIL;
- }
- */
- LPMAPISENDMAIL sendMail = (LPMAPISENDMAIL)mapiLib.GetProc("MAPISendMail");
- if (sendMail == 0)
- {
- errorInfo.SystemError = ::GetLastError();
- errorInfo.Message = L"7-Zip cannot find MAPISendMail function";
- return E_FAIL;
- }
-
- FStringVector fullPaths;
- unsigned i;
- for (i = 0; i < options.Commands.Size(); i++)
- {
- CArchivePath &ap = options.Commands[i].ArchivePath;
- FString arcPath;
- if (!MyGetFullPathName(us2fs(ap.GetFinalPath()), arcPath))
- {
- errorInfo.SystemError = ::GetLastError();
- errorInfo.Message = L"GetFullPathName error";
- return E_FAIL;
- }
- fullPaths.Add(arcPath);
- }
- CCurrentDirRestorer curDirRestorer;
- for (i = 0; i < fullPaths.Size(); i++)
- {
- UString arcPath = fs2us(fullPaths[i]);
- UString fileName = ExtractFileNameFromPath(arcPath);
- AString path = GetAnsiString(arcPath);
- AString name = GetAnsiString(fileName);
- // Warning!!! MAPISendDocuments function changes Current directory
- // fnSend(0, ";", (LPSTR)(LPCSTR)path, (LPSTR)(LPCSTR)name, 0);
-
- MapiFileDesc f;
- memset(&f, 0, sizeof(f));
- f.nPosition = 0xFFFFFFFF;
- f.lpszPathName = (char *)(const char *)path;
- f.lpszFileName = (char *)(const char *)name;
-
- MapiMessage m;
- memset(&m, 0, sizeof(m));
- m.nFileCount = 1;
- m.lpFiles = &f;
-
- const AString addr = GetAnsiString(options.EMailAddress);
- MapiRecipDesc rec;
- if (!addr.IsEmpty())
- {
- memset(&rec, 0, sizeof(rec));
- rec.ulRecipClass = MAPI_TO;
- rec.lpszAddress = (char *)(const char *)addr;
- m.nRecipCount = 1;
- m.lpRecips = &rec;
- }
-
- sendMail((LHANDLE)0, 0, &m, MAPI_DIALOG, 0);
- }
- }
- #endif
-
- if (options.DeleteAfterCompressing)
- {
- CRecordVector<CRefSortPair> pairs;
- FStringVector foldersNames;
- for (i = 0; i < dirItems.Items.Size(); i++)
- {
- const CDirItem &dirItem = dirItems.Items[i];
- FString phyPath = us2fs(dirItems.GetPhyPath(i));
- if (dirItem.IsDir())
- {
- CRefSortPair pair;
- pair.Index = i;
- pair.Len = GetNumSlashes(phyPath);
- pairs.Add(pair);
- }
- else
- {
- if (processedItems[i] != 0 || dirItem.Size == 0)
- {
- DeleteFileAlways(phyPath);
- }
- else
- {
- // file was skipped
- /*
- errorInfo.SystemError = 0;
- errorInfo.Message = L"file was not processed";
- errorInfo.FileName = phyPath;
- return E_FAIL;
- */
- }
- }
- }
-
- pairs.Sort(CompareRefSortPair, NULL);
- for (i = 0; i < pairs.Size(); i++)
- {
- FString phyPath = us2fs(dirItems.GetPhyPath(pairs[i].Index));
- if (NFind::DoesDirExist(phyPath))
- {
- // printf("delete %S\n", phyPath);
- RemoveDir(phyPath);
- }
- }
- }
- return S_OK;
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/Update.h b/src/libs/7zip/win/CPP/7zip/UI/Common/Update.h
deleted file mode 100644
index ff53cd992..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/Update.h
+++ /dev/null
@@ -1,188 +0,0 @@
-// Update.h
-
-#ifndef __COMMON_UPDATE_H
-#define __COMMON_UPDATE_H
-
-#include "../../../Common/Wildcard.h"
-
-#include "ArchiveOpenCallback.h"
-#include "LoadCodecs.h"
-#include "OpenArchive.h"
-#include "Property.h"
-#include "UpdateAction.h"
-#include "UpdateCallback.h"
-
-enum EArcNameMode
-{
- k_ArcNameMode_Smart,
- k_ArcNameMode_Exact,
- k_ArcNameMode_Add,
-};
-
-struct CArchivePath
-{
- UString OriginalPath;
-
- UString Prefix; // path(folder) prefix including slash
- UString Name; // base name
- UString BaseExtension; // archive type extension or "exe" extension
- UString VolExtension; // archive type extension for volumes
-
- bool Temp;
- FString TempPrefix; // path(folder) for temp location
- FString TempPostfix;
-
- CArchivePath(): Temp(false) {};
-
- void ParseFromPath(const UString &path, EArcNameMode mode);
- UString GetPathWithoutExt() const { return Prefix + Name; }
- UString GetFinalPath() const;
- UString GetFinalVolPath() const;
- FString GetTempPath() const;
-};
-
-struct CUpdateArchiveCommand
-{
- UString UserArchivePath;
- CArchivePath ArchivePath;
- NUpdateArchive::CActionSet ActionSet;
-};
-
-struct CCompressionMethodMode
-{
- bool Type_Defined;
- COpenType Type;
- CObjectVector<CProperty> Properties;
-
- CCompressionMethodMode(): Type_Defined(false) {}
-};
-
-namespace NRecursedType { enum EEnum
-{
- kRecursed,
- kWildcardOnlyRecursed,
- kNonRecursed
-};}
-
-struct CRenamePair
-{
- UString OldName;
- UString NewName;
- bool WildcardParsing;
- NRecursedType::EEnum RecursedType;
-
- CRenamePair(): WildcardParsing(true), RecursedType(NRecursedType::kNonRecursed) {}
-
- bool Prepare();
- bool GetNewPath(bool isFolder, const UString &src, UString &dest) const;
-};
-
-struct CUpdateOptions
-{
- CCompressionMethodMode MethodMode;
-
- CObjectVector<CUpdateArchiveCommand> Commands;
- bool UpdateArchiveItself;
- CArchivePath ArchivePath;
- EArcNameMode ArcNameMode;
-
- bool SfxMode;
- FString SfxModule;
-
- bool OpenShareForWrite;
-
- bool StdInMode;
- UString StdInFileName;
- bool StdOutMode;
-
- bool EMailMode;
- bool EMailRemoveAfter;
- UString EMailAddress;
-
- FString WorkingDir;
- NWildcard::ECensorPathMode PathMode;
- UString AddPathPrefix;
-
- CBoolPair NtSecurity;
- CBoolPair AltStreams;
- CBoolPair HardLinks;
- CBoolPair SymLinks;
-
- bool DeleteAfterCompressing;
-
- bool SetArcMTime;
-
- CObjectVector<CRenamePair> RenamePairs;
-
- bool InitFormatIndex(const CCodecs *codecs, const CObjectVector<COpenType> &types, const UString &arcPath);
- bool SetArcPath(const CCodecs *codecs, const UString &arcPath);
-
- CUpdateOptions():
- UpdateArchiveItself(true),
- SfxMode(false),
- StdInMode(false),
- StdOutMode(false),
- EMailMode(false),
- EMailRemoveAfter(false),
- OpenShareForWrite(false),
- ArcNameMode(k_ArcNameMode_Smart),
- PathMode(NWildcard::k_RelatPath),
-
- DeleteAfterCompressing(false),
- SetArcMTime(false)
-
- {};
-
- void SetActionCommand_Add()
- {
- Commands.Clear();
- CUpdateArchiveCommand c;
- c.ActionSet = NUpdateArchive::k_ActionSet_Add;
- Commands.Add(c);
- }
-
- CRecordVector<UInt64> VolumesSizes;
-};
-
-struct CErrorInfo
-{
- DWORD SystemError;
- FString FileName;
- FString FileName2;
- UString Message;
- // UStringVector ErrorPaths;
- // CRecordVector<DWORD> ErrorCodes;
- CErrorInfo(): SystemError(0) {};
-};
-
-struct CUpdateErrorInfo: public CErrorInfo
-{
-};
-
-#define INTERFACE_IUpdateCallbackUI2(x) \
- INTERFACE_IUpdateCallbackUI(x) \
- virtual HRESULT OpenResult(const wchar_t *name, HRESULT result, const wchar_t *errorArcType) x; \
- virtual HRESULT StartScanning() x; \
- virtual HRESULT ScanProgress(UInt64 numFolders, UInt64 numFiles, UInt64 totalSize, const wchar_t *path, bool isDir) x; \
- virtual HRESULT CanNotFindError(const wchar_t *name, DWORD systemError) x; \
- virtual HRESULT FinishScanning() x; \
- virtual HRESULT StartArchive(const wchar_t *name, bool updating) x; \
- virtual HRESULT FinishArchive() x; \
-
-struct IUpdateCallbackUI2: public IUpdateCallbackUI
-{
- INTERFACE_IUpdateCallbackUI2(=0)
-};
-
-HRESULT UpdateArchive(
- CCodecs *codecs,
- const CObjectVector<COpenType> &types,
- const UString &cmdArcPath2,
- NWildcard::CCensor &censor,
- CUpdateOptions &options,
- CUpdateErrorInfo &errorInfo,
- IOpenCallbackUI *openCallback,
- IUpdateCallbackUI2 *callback,
- bool needSetPath);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateAction.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateAction.cpp
deleted file mode 100644
index a80db7212..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateAction.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-// UpdateAction.cpp
-
-#include "StdAfx.h"
-
-#include "UpdateAction.h"
-
-namespace NUpdateArchive {
-
-const CActionSet k_ActionSet_Add =
-{{
- NPairAction::kCopy,
- NPairAction::kCopy,
- NPairAction::kCompress,
- NPairAction::kCompress,
- NPairAction::kCompress,
- NPairAction::kCompress,
- NPairAction::kCompress
-}};
-
-const CActionSet k_ActionSet_Update =
-{{
- NPairAction::kCopy,
- NPairAction::kCopy,
- NPairAction::kCompress,
- NPairAction::kCopy,
- NPairAction::kCompress,
- NPairAction::kCopy,
- NPairAction::kCompress
-}};
-
-const CActionSet k_ActionSet_Fresh =
-{{
- NPairAction::kCopy,
- NPairAction::kCopy,
- NPairAction::kIgnore,
- NPairAction::kCopy,
- NPairAction::kCompress,
- NPairAction::kCopy,
- NPairAction::kCompress
-}};
-
-const CActionSet k_ActionSet_Sync =
-{{
- NPairAction::kCopy,
- NPairAction::kIgnore,
- NPairAction::kCompress,
- NPairAction::kCopy,
- NPairAction::kCompress,
- NPairAction::kCopy,
- NPairAction::kCompress,
-}};
-
-const CActionSet k_ActionSet_Delete =
-{{
- NPairAction::kCopy,
- NPairAction::kIgnore,
- NPairAction::kIgnore,
- NPairAction::kIgnore,
- NPairAction::kIgnore,
- NPairAction::kIgnore,
- NPairAction::kIgnore
-}};
-
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateAction.h b/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateAction.h
deleted file mode 100644
index 8c7609fb4..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateAction.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// UpdateAction.h
-
-#ifndef __UPDATE_ACTION_H
-#define __UPDATE_ACTION_H
-
-namespace NUpdateArchive {
-
- namespace NPairState
- {
- const unsigned kNumValues = 7;
- enum EEnum
- {
- kNotMasked = 0,
- kOnlyInArchive,
- kOnlyOnDisk,
- kNewInArchive,
- kOldInArchive,
- kSameFiles,
- kUnknowNewerFiles
- };
- }
-
- namespace NPairAction
- {
- enum EEnum
- {
- kIgnore = 0,
- kCopy,
- kCompress,
- kCompressAsAnti
- };
- }
-
- struct CActionSet
- {
- NPairAction::EEnum StateActions[NPairState::kNumValues];
-
- const bool IsEqualTo(const CActionSet &a) const
- {
- for (unsigned i = 0; i < NPairState::kNumValues; i++)
- if (StateActions[i] != a.StateActions[i])
- return false;
- return true;
- }
-
- bool NeedScanning() const
- {
- unsigned i;
- for (i = 0; i < NPairState::kNumValues; i++)
- if (StateActions[i] == NPairAction::kCompress)
- return true;
- for (i = 1; i < NPairState::kNumValues; i++)
- if (StateActions[i] != NPairAction::kIgnore)
- return true;
- return false;
- }
- };
-
- extern const CActionSet k_ActionSet_Add;
- extern const CActionSet k_ActionSet_Update;
- extern const CActionSet k_ActionSet_Fresh;
- extern const CActionSet k_ActionSet_Sync;
- extern const CActionSet k_ActionSet_Delete;
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateCallback.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateCallback.cpp
deleted file mode 100644
index e490cde24..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateCallback.cpp
+++ /dev/null
@@ -1,574 +0,0 @@
-// UpdateCallback.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/ComTry.h"
-#include "../../../Common/IntToString.h"
-#include "../../../Common/StringConvert.h"
-#include "../../../Common/Wildcard.h"
-
-#include "../../../Windows/FileDir.h"
-#include "../../../Windows/FileName.h"
-#include "../../../Windows/PropVariant.h"
-#include "../../../Windows/Synchronization.h"
-
-#include "../../Common/FileStreams.h"
-#include "../../Common/StreamObjects.h"
-
-#include "UpdateCallback.h"
-
-#if defined(_WIN32) && !defined(UNDER_CE)
-#define _USE_SECURITY_CODE
-#include "../../../Windows/SecurityUtils.h"
-#endif
-
-using namespace NWindows;
-using namespace NFile;
-
-#ifdef _USE_SECURITY_CODE
-bool InitLocalPrivileges();
-#endif
-
-CArchiveUpdateCallback::CArchiveUpdateCallback():
- Callback(0),
- ShareForWrite(false),
- StdInMode(false),
- DirItems(0),
- ArcItems(0),
- UpdatePairs(0),
- NewNames(0),
- KeepOriginalItemNames(false),
- ProcessedItemsStatuses(NULL),
- ParentDirItem(NULL),
- StoreNtSecurity(false),
- StoreHardLinks(false),
- StoreSymLinks(false),
- _hardIndex_From((UInt32)(Int32)-1)
-{
- #ifdef _USE_SECURITY_CODE
- _saclEnabled = InitLocalPrivileges();
- #endif
-}
-
-
-STDMETHODIMP CArchiveUpdateCallback::SetTotal(UInt64 size)
-{
- COM_TRY_BEGIN
- return Callback->SetTotal(size);
- COM_TRY_END
-}
-
-STDMETHODIMP CArchiveUpdateCallback::SetCompleted(const UInt64 *completeValue)
-{
- COM_TRY_BEGIN
- return Callback->SetCompleted(completeValue);
- COM_TRY_END
-}
-
-STDMETHODIMP CArchiveUpdateCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
-{
- COM_TRY_BEGIN
- return Callback->SetRatioInfo(inSize, outSize);
- COM_TRY_END
-}
-
-
-/*
-static const STATPROPSTG kProps[] =
-{
- { NULL, kpidPath, VT_BSTR},
- { NULL, kpidIsDir, VT_BOOL},
- { NULL, kpidSize, VT_UI8},
- { NULL, kpidCTime, VT_FILETIME},
- { NULL, kpidATime, VT_FILETIME},
- { NULL, kpidMTime, VT_FILETIME},
- { NULL, kpidAttrib, VT_UI4},
- { NULL, kpidIsAnti, VT_BOOL}
-};
-
-STDMETHODIMP CArchiveUpdateCallback::EnumProperties(IEnumSTATPROPSTG **)
-{
- return CStatPropEnumerator::CreateEnumerator(kProps, ARRAY_SIZE(kProps), enumerator);
-}
-*/
-
-STDMETHODIMP CArchiveUpdateCallback::GetUpdateItemInfo(UInt32 index,
- Int32 *newData, Int32 *newProps, UInt32 *indexInArchive)
-{
- COM_TRY_BEGIN
- RINOK(Callback->CheckBreak());
- const CUpdatePair2 &up = (*UpdatePairs)[index];
- if (newData) *newData = BoolToInt(up.NewData);
- if (newProps) *newProps = BoolToInt(up.NewProps);
- if (indexInArchive)
- {
- *indexInArchive = (UInt32)(Int32)-1;
- if (up.ExistInArchive())
- *indexInArchive = (ArcItems == 0) ? up.ArcIndex : (*ArcItems)[up.ArcIndex].IndexInServer;
- }
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CArchiveUpdateCallback::GetRootProp(PROPID propID, PROPVARIANT *value)
-{
- NCOM::CPropVariant prop;
- switch (propID)
- {
- case kpidIsDir: prop = true; break;
- case kpidAttrib: if (ParentDirItem) prop = ParentDirItem->Attrib; break;
- case kpidCTime: if (ParentDirItem) prop = ParentDirItem->CTime; break;
- case kpidATime: if (ParentDirItem) prop = ParentDirItem->ATime; break;
- case kpidMTime: if (ParentDirItem) prop = ParentDirItem->MTime; break;
- }
- prop.Detach(value);
- return S_OK;
-}
-
-STDMETHODIMP CArchiveUpdateCallback::GetParent(UInt32 /* index */, UInt32 *parent, UInt32 *parentType)
-{
- *parentType = NParentType::kDir;
- *parent = (UInt32)(Int32)-1;
- return S_OK;
-}
-
-STDMETHODIMP CArchiveUpdateCallback::GetNumRawProps(UInt32 *numProps)
-{
- *numProps = 0;
- if (StoreNtSecurity)
- *numProps = 1;
- return S_OK;
-}
-
-STDMETHODIMP CArchiveUpdateCallback::GetRawPropInfo(UInt32 /* index */, BSTR *name, PROPID *propID)
-{
- *name = NULL;
- *propID = kpidNtSecure;
- return S_OK;
-}
-
-STDMETHODIMP CArchiveUpdateCallback::GetRootRawProp(PROPID
- #ifdef _USE_SECURITY_CODE
- propID
- #endif
- , const void **data, UInt32 *dataSize, UInt32 *propType)
-{
- *data = 0;
- *dataSize = 0;
- *propType = 0;
- if (!StoreNtSecurity)
- return S_OK;
- #ifdef _USE_SECURITY_CODE
- if (propID == kpidNtSecure)
- {
- if (StdInMode)
- return S_OK;
-
- if (ParentDirItem)
- {
- if (ParentDirItem->SecureIndex < 0)
- return S_OK;
- const CByteBuffer &buf = DirItems->SecureBlocks.Bufs[ParentDirItem->SecureIndex];
- *data = buf;
- *dataSize = (UInt32)buf.Size();
- *propType = NPropDataType::kRaw;
- return S_OK;
- }
-
- if (GetRootProps)
- return GetRootProps->GetRootRawProp(propID, data, dataSize, propType);
- }
- #endif
- return S_OK;
-}
-
-// #ifdef _USE_SECURITY_CODE
-// #endif
-
-STDMETHODIMP CArchiveUpdateCallback::GetRawProp(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType)
-{
- *data = 0;
- *dataSize = 0;
- *propType = 0;
-
- if (propID == kpidNtSecure ||
- propID == kpidNtReparse)
- {
- if (StdInMode)
- return S_OK;
-
- const CUpdatePair2 &up = (*UpdatePairs)[index];
- if (up.UseArcProps && up.ExistInArchive() && GetRawProps)
- return GetRawProps->GetRawProp(
- ArcItems ? (*ArcItems)[up.ArcIndex].IndexInServer : up.ArcIndex,
- propID, data, dataSize, propType);
-
- {
- const CUpdatePair2 &up = (*UpdatePairs)[index];
- /*
- if (!up.NewData)
- return E_FAIL;
- */
- if (up.IsAnti)
- return S_OK;
-
- #ifndef UNDER_CE
- const CDirItem &di = DirItems->Items[up.DirIndex];
- #endif
-
- #ifdef _USE_SECURITY_CODE
- if (propID == kpidNtSecure)
- {
- if (!StoreNtSecurity)
- return S_OK;
- if (di.SecureIndex < 0)
- return S_OK;
- const CByteBuffer &buf = DirItems->SecureBlocks.Bufs[di.SecureIndex];
- *data = buf;
- *dataSize = (UInt32)buf.Size();
- *propType = NPropDataType::kRaw;
- }
- else
- #endif
- {
- // propID == kpidNtReparse
- if (!StoreSymLinks)
- return S_OK;
- #ifndef UNDER_CE
- const CByteBuffer *buf = &di.ReparseData2;
- if (buf->Size() == 0)
- buf = &di.ReparseData;
- if (buf->Size() != 0)
- {
- *data = *buf;
- *dataSize = (UInt32)buf->Size();
- *propType = NPropDataType::kRaw;
- }
- #endif
- }
-
- return S_OK;
- }
- }
-
- return S_OK;
-}
-
-#ifndef UNDER_CE
-
-static UString GetRelativePath(const UString &to, const UString &from)
-{
- UStringVector partsTo, partsFrom;
- SplitPathToParts(to, partsTo);
- SplitPathToParts(from, partsFrom);
-
- unsigned i;
- for (i = 0;; i++)
- {
- if (i + 1 >= partsFrom.Size() ||
- i + 1 >= partsTo.Size())
- break;
- if (CompareFileNames(partsFrom[i], partsTo[i]) != 0)
- break;
- }
-
- if (i == 0)
- {
- #ifdef _WIN32
- if (NName::IsDrivePath(to) ||
- NName::IsDrivePath(from))
- return to;
- #endif
- }
-
- UString s;
- unsigned k;
-
- for (k = i + 1; k < partsFrom.Size(); k++)
- s += L".." WSTRING_PATH_SEPARATOR;
-
- for (k = i; k < partsTo.Size(); k++)
- {
- if (k != i)
- s += WCHAR_PATH_SEPARATOR;
- s += partsTo[k];
- }
-
- return s;
-}
-
-#endif
-
-STDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
-{
- COM_TRY_BEGIN
- const CUpdatePair2 &up = (*UpdatePairs)[index];
- NCOM::CPropVariant prop;
-
- if (up.NewData)
- {
- /*
- if (propID == kpidIsHardLink)
- {
- prop = _isHardLink;
- prop.Detach(value);
- return S_OK;
- }
- */
- if (propID == kpidSymLink)
- {
- if (index == _hardIndex_From)
- {
- prop.Detach(value);
- return S_OK;
- }
- if (up.DirIndex >= 0)
- {
- #ifndef UNDER_CE
- const CDirItem &di = DirItems->Items[up.DirIndex];
- // if (di.IsDir())
- {
- CReparseAttr attr;
- if (attr.Parse(di.ReparseData, di.ReparseData.Size()))
- {
- UString simpleName = attr.GetPath();
- if (attr.IsRelative())
- prop = simpleName;
- else
- {
- const UString phyPath = DirItems->GetPhyPath(up.DirIndex);
- FString fullPath;
- if (NDir::MyGetFullPathName(us2fs(phyPath), fullPath))
- {
- prop = GetRelativePath(simpleName, fs2us(fullPath));
- }
- }
- prop.Detach(value);
- return S_OK;
- }
- }
- #endif
- }
- }
- else if (propID == kpidHardLink)
- {
- if (index == _hardIndex_From)
- {
- const CKeyKeyValPair &pair = _map[_hardIndex_To];
- const CUpdatePair2 &up2 = (*UpdatePairs)[pair.Value];
- prop = DirItems->GetLogPath(up2.DirIndex);
- prop.Detach(value);
- return S_OK;
- }
- if (up.DirIndex >= 0)
- {
- prop.Detach(value);
- return S_OK;
- }
- }
- }
-
- if (up.IsAnti
- && propID != kpidIsDir
- && propID != kpidPath
- && propID != kpidIsAltStream)
- {
- switch (propID)
- {
- case kpidSize: prop = (UInt64)0; break;
- case kpidIsAnti: prop = true; break;
- }
- }
- else if (propID == kpidPath && up.NewNameIndex >= 0)
- prop = (*NewNames)[up.NewNameIndex];
- else if (propID == kpidShortName && up.NewNameIndex >= 0 && up.IsMainRenameItem)
- {
- // we can generate new ShortName here;
- }
- else if ((up.UseArcProps
- || (KeepOriginalItemNames && (propID == kpidPath || propID == kpidIsAltStream)))
- && up.ExistInArchive() && Archive)
- return Archive->GetProperty(ArcItems ? (*ArcItems)[up.ArcIndex].IndexInServer : up.ArcIndex, propID, value);
- else if (up.ExistOnDisk())
- {
- const CDirItem &di = DirItems->Items[up.DirIndex];
- switch (propID)
- {
- case kpidPath: prop = DirItems->GetLogPath(up.DirIndex); break;
- case kpidIsDir: prop = di.IsDir(); break;
- case kpidSize: prop = di.Size; break;
- case kpidAttrib: prop = di.Attrib; break;
- case kpidCTime: prop = di.CTime; break;
- case kpidATime: prop = di.ATime; break;
- case kpidMTime: prop = di.MTime; break;
- case kpidIsAltStream: prop = di.IsAltStream; break;
- #if defined(_WIN32) && !defined(UNDER_CE)
- // case kpidShortName: prop = di.ShortName; break;
- #endif
- }
- }
- prop.Detach(value);
- return S_OK;
- COM_TRY_END
-}
-
-static NSynchronization::CCriticalSection CS;
-
-STDMETHODIMP CArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream **inStream)
-{
- COM_TRY_BEGIN
- *inStream = NULL;
- const CUpdatePair2 &up = (*UpdatePairs)[index];
- if (!up.NewData)
- return E_FAIL;
-
- RINOK(Callback->CheckBreak());
- RINOK(Callback->Finilize());
-
- bool isDir = IsDir(up);
-
- if (up.IsAnti)
- {
- UString name;
- if (up.ArcIndex >= 0)
- name = (*ArcItems)[up.ArcIndex].Name;
- else if (up.DirIndex >= 0)
- name = DirItems->GetLogPath(up.DirIndex);
- RINOK(Callback->GetStream(name, true));
-
- /* 9.33: fixed. Handlers expect real stream object for files, even for anti-file.
- so we return empty stream */
-
- if (!isDir)
- {
- CBufInStream *inStreamSpec = new CBufInStream();
- CMyComPtr<ISequentialInStream> inStreamLoc = inStreamSpec;
- inStreamSpec->Init(NULL, 0);
- *inStream = inStreamLoc.Detach();
- }
- return S_OK;
- }
-
- RINOK(Callback->GetStream(DirItems->GetLogPath(up.DirIndex), false));
-
- if (isDir)
- return S_OK;
-
- if (StdInMode)
- {
- CStdInFileStream *inStreamSpec = new CStdInFileStream;
- CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec);
- *inStream = inStreamLoc.Detach();
- }
- else
- {
- CInFileStream *inStreamSpec = new CInFileStream;
- CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec);
-
- inStreamSpec->SupportHardLinks = StoreHardLinks;
-
- const UString path = DirItems->GetPhyPath(up.DirIndex);
-
- #if defined(_WIN32) && !defined(UNDER_CE)
- if (DirItems->Items[up.DirIndex].AreReparseData())
- {
- if (!inStreamSpec->File.OpenReparse(us2fs(path)))
- {
- return Callback->OpenFileError(path, ::GetLastError());
- }
- }
- else
- #endif
- if (!inStreamSpec->OpenShared(us2fs(path), ShareForWrite))
- {
- return Callback->OpenFileError(path, ::GetLastError());
- }
-
- if (StoreHardLinks)
- {
- CStreamFileProps props;
- if (inStreamSpec->GetProps2(&props) == S_OK)
- {
- if (props.NumLinks > 1)
- {
- CKeyKeyValPair pair;
- pair.Key1 = props.VolID;
- pair.Key2 = props.FileID_Low;
- pair.Value = index;
- unsigned numItems = _map.Size();
- unsigned pairIndex = _map.AddToUniqueSorted2(pair);
- if (numItems == _map.Size())
- {
- // const CKeyKeyValPair &pair2 = _map.Pairs[pairIndex];
- _hardIndex_From = index;
- _hardIndex_To = pairIndex;
- // we could return NULL as stream, but it's better to return real stream
- // return S_OK;
- }
- }
- }
- }
-
- if (ProcessedItemsStatuses)
- {
- NSynchronization::CCriticalSectionLock lock(CS);
- ProcessedItemsStatuses[up.DirIndex] = 1;
- }
- *inStream = inStreamLoc.Detach();
- }
-
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CArchiveUpdateCallback::SetOperationResult(Int32 operationResult)
-{
- COM_TRY_BEGIN
- return Callback->SetOperationResult(operationResult);
- COM_TRY_END
-}
-
-STDMETHODIMP CArchiveUpdateCallback::GetVolumeSize(UInt32 index, UInt64 *size)
-{
- if (VolumesSizes.Size() == 0)
- return S_FALSE;
- if (index >= (UInt32)VolumesSizes.Size())
- index = VolumesSizes.Size() - 1;
- *size = VolumesSizes[index];
- return S_OK;
-}
-
-STDMETHODIMP CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOutStream **volumeStream)
-{
- COM_TRY_BEGIN
- FChar temp[16];
- ConvertUInt32ToString(index + 1, temp);
- FString res = temp;
- while (res.Len() < 2)
- res.InsertAtFront(FTEXT('0'));
- FString fileName = VolName;
- fileName += L'.';
- fileName += res;
- fileName += VolExt;
- COutFileStream *streamSpec = new COutFileStream;
- CMyComPtr<ISequentialOutStream> streamLoc(streamSpec);
- if (!streamSpec->Create(fileName, false))
- return ::GetLastError();
- *volumeStream = streamLoc.Detach();
- return S_OK;
- COM_TRY_END
-}
-
-STDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)
-{
- COM_TRY_BEGIN
- return Callback->CryptoGetTextPassword2(passwordIsDefined, password);
- COM_TRY_END
-}
-
-STDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword(BSTR *password)
-{
- COM_TRY_BEGIN
- return Callback->CryptoGetTextPassword(password);
- COM_TRY_END
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateCallback.h b/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateCallback.h
deleted file mode 100644
index 81982e61d..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateCallback.h
+++ /dev/null
@@ -1,122 +0,0 @@
-// UpdateCallback.h
-
-#ifndef __UPDATE_CALLBACK_H
-#define __UPDATE_CALLBACK_H
-
-#include "../../../Common/MyCom.h"
-
-#include "../../IPassword.h"
-#include "../../ICoder.h"
-
-#include "../Common/UpdatePair.h"
-#include "../Common/UpdateProduce.h"
-
-#define INTERFACE_IUpdateCallbackUI(x) \
- virtual HRESULT SetTotal(UInt64 size) x; \
- virtual HRESULT SetCompleted(const UInt64 *completeValue) x; \
- virtual HRESULT SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) x; \
- virtual HRESULT CheckBreak() x; \
- virtual HRESULT Finilize() x; \
- virtual HRESULT SetNumFiles(UInt64 numFiles) x; \
- virtual HRESULT GetStream(const wchar_t *name, bool isAnti) x; \
- virtual HRESULT OpenFileError(const wchar_t *name, DWORD systemError) x; \
- virtual HRESULT SetOperationResult(Int32 operationResult) x; \
- virtual HRESULT CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password) x; \
- virtual HRESULT CryptoGetTextPassword(BSTR *password) x; \
- /* virtual HRESULT ShowDeleteFile(const wchar_t *name) x; */ \
- /* virtual HRESULT CloseProgress() { return S_OK; }; */
-
-struct IUpdateCallbackUI
-{
- INTERFACE_IUpdateCallbackUI(=0)
-};
-
-struct CKeyKeyValPair
-{
- UInt64 Key1;
- UInt64 Key2;
- unsigned Value;
-
- int Compare(const CKeyKeyValPair &a) const
- {
- if (Key1 < a.Key1) return -1;
- if (Key1 > a.Key1) return 1;
- return MyCompare(Key2, a.Key2);
- }
-};
-
-
-class CArchiveUpdateCallback:
- public IArchiveUpdateCallback2,
- public IArchiveGetRawProps,
- public IArchiveGetRootProps,
- public ICryptoGetTextPassword2,
- public ICryptoGetTextPassword,
- public ICompressProgressInfo,
- public CMyUnknownImp
-{
- #if defined(_WIN32) && !defined(UNDER_CE)
- bool _saclEnabled;
- #endif
- CRecordVector<CKeyKeyValPair> _map;
-
- UInt32 _hardIndex_From;
- UInt32 _hardIndex_To;
-
-public:
- MY_UNKNOWN_IMP6(
- IArchiveUpdateCallback2,
- IArchiveGetRawProps,
- IArchiveGetRootProps,
- ICryptoGetTextPassword2,
- ICryptoGetTextPassword,
- ICompressProgressInfo)
-
- STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
-
- INTERFACE_IArchiveUpdateCallback2(;)
- INTERFACE_IArchiveGetRawProps(;)
- INTERFACE_IArchiveGetRootProps(;)
-
- STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password);
- STDMETHOD(CryptoGetTextPassword)(BSTR *password);
-
- CRecordVector<UInt64> VolumesSizes;
- FString VolName;
- FString VolExt;
-
- IUpdateCallbackUI *Callback;
-
- bool ShareForWrite;
- bool StdInMode;
-
- const CDirItems *DirItems;
- const CDirItem *ParentDirItem;
-
- const CObjectVector<CArcItem> *ArcItems;
- const CRecordVector<CUpdatePair2> *UpdatePairs;
- const UStringVector *NewNames;
- CMyComPtr<IInArchive> Archive;
- CMyComPtr<IArchiveGetRawProps> GetRawProps;
- CMyComPtr<IArchiveGetRootProps> GetRootProps;
-
- bool KeepOriginalItemNames;
- bool StoreNtSecurity;
- bool StoreHardLinks;
- bool StoreSymLinks;
-
- Byte *ProcessedItemsStatuses;
-
- CArchiveUpdateCallback();
-
- bool IsDir(const CUpdatePair2 &up) const
- {
- if (up.DirIndex >= 0)
- return DirItems->Items[up.DirIndex].IsDir();
- else if (up.ArcIndex >= 0)
- return (*ArcItems)[up.ArcIndex].IsDir;
- return false;
- }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdatePair.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/UpdatePair.cpp
deleted file mode 100644
index 95afdd694..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdatePair.cpp
+++ /dev/null
@@ -1,233 +0,0 @@
-// UpdatePair.cpp
-
-#include "StdAfx.h"
-
-#include <time.h>
-
-#include "../../../Common/Wildcard.h"
-
-#include "../../../Windows/TimeUtils.h"
-
-#include "SortUtils.h"
-#include "UpdatePair.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-static int MyCompareTime(NFileTimeType::EEnum fileTimeType, const FILETIME &time1, const FILETIME &time2)
-{
- switch (fileTimeType)
- {
- case NFileTimeType::kWindows:
- return ::CompareFileTime(&time1, &time2);
- case NFileTimeType::kUnix:
- {
- UInt32 unixTime1, unixTime2;
- FileTimeToUnixTime(time1, unixTime1);
- 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;
-}
-
-static const char *k_Duplicate_inArc_Message = "Duplicate filename in archive:";
-static const char *k_Duplicate_inDir_Message = "Duplicate filename on disk:";
-static const char *k_NotCensoredCollision_Message = "Internal file name collision (file on disk, file in archive):";
-
-static void ThrowError(const char *message, const UString &s1, const UString &s2)
-{
- UString m;
- m.SetFromAscii(message);
- m += L'\n'; m += s1;
- m += L'\n'; m += s2;
- throw m;
-}
-
-static int CompareArcItemsBase(const CArcItem &ai1, const CArcItem &ai2)
-{
- int res = CompareFileNames(ai1.Name, ai2.Name);
- if (res != 0)
- return res;
- if (ai1.IsDir != ai2.IsDir)
- return ai1.IsDir ? -1 : 1;
- return 0;
-}
-
-static int CompareArcItems(const unsigned *p1, const unsigned *p2, void *param)
-{
- unsigned i1 = *p1;
- unsigned i2 = *p2;
- const CObjectVector<CArcItem> &arcItems = *(const CObjectVector<CArcItem> *)param;
- int res = CompareArcItemsBase(arcItems[i1], arcItems[i2]);
- if (res != 0)
- return res;
- return MyCompare(i1, i2);
-}
-
-void GetUpdatePairInfoList(
- const CDirItems &dirItems,
- const CObjectVector<CArcItem> &arcItems,
- NFileTimeType::EEnum fileTimeType,
- CRecordVector<CUpdatePair> &updatePairs)
-{
- CUIntVector dirIndices, arcIndices;
-
- unsigned numDirItems = dirItems.Items.Size();
- unsigned numArcItems = arcItems.Size();
-
- CIntArr duplicatedArcItem(numArcItems);
- {
- int *vals = &duplicatedArcItem[0];
- for (unsigned i = 0; i < numArcItems; i++)
- vals[i] = 0;
- }
-
- {
- arcIndices.ClearAndSetSize(numArcItems);
- {
- unsigned *vals = &arcIndices[0];
- for (unsigned i = 0; i < numArcItems; i++)
- vals[i] = i;
- }
- arcIndices.Sort(CompareArcItems, (void *)&arcItems);
- for (unsigned i = 0; i + 1 < numArcItems; i++)
- if (CompareArcItemsBase(
- arcItems[arcIndices[i]],
- arcItems[arcIndices[i + 1]]) == 0)
- {
- duplicatedArcItem[i] = 1;
- duplicatedArcItem[i + 1] = -1;
- }
- }
-
- UStringVector dirNames;
- {
- dirNames.ClearAndReserve(numDirItems);
- unsigned i;
- for (i = 0; i < numDirItems; i++)
- dirNames.AddInReserved(dirItems.GetLogPath(i));
- SortFileNames(dirNames, dirIndices);
- for (i = 0; i + 1 < numDirItems; i++)
- {
- const UString &s1 = dirNames[dirIndices[i]];
- const UString &s2 = dirNames[dirIndices[i + 1]];
- if (CompareFileNames(s1, s2) == 0)
- ThrowError(k_Duplicate_inDir_Message, s1, s2);
- }
- }
-
- unsigned dirIndex = 0;
- unsigned arcIndex = 0;
-
- int prevHostFile = -1;
- const UString *prevHostName = NULL;
-
- while (dirIndex < numDirItems || arcIndex < numArcItems)
- {
- CUpdatePair pair;
-
- int dirIndex2 = -1;
- int arcIndex2 = -1;
- const CDirItem *di = NULL;
- const CArcItem *ai = NULL;
-
- int compareResult = -1;
- const UString *name = NULL;
-
- if (dirIndex < numDirItems)
- {
- dirIndex2 = dirIndices[dirIndex];
- di = &dirItems.Items[dirIndex2];
- }
-
- if (arcIndex < numArcItems)
- {
- arcIndex2 = arcIndices[arcIndex];
- ai = &arcItems[arcIndex2];
- compareResult = 1;
- if (dirIndex < numDirItems)
- {
- compareResult = CompareFileNames(dirNames[dirIndex2], ai->Name);
- if (compareResult == 0)
- {
- if (di->IsDir() != ai->IsDir)
- compareResult = (ai->IsDir ? 1 : -1);
- }
- }
- }
-
- if (compareResult < 0)
- {
- name = &dirNames[dirIndex2];
- pair.State = NUpdateArchive::NPairState::kOnlyOnDisk;
- pair.DirIndex = dirIndex2;
- dirIndex++;
- }
- else if (compareResult > 0)
- {
- name = &ai->Name;
- pair.State = ai->Censored ?
- NUpdateArchive::NPairState::kOnlyInArchive:
- NUpdateArchive::NPairState::kNotMasked;
- pair.ArcIndex = arcIndex2;
- arcIndex++;
- }
- else
- {
- int dupl = duplicatedArcItem[arcIndex];
- if (dupl != 0)
- ThrowError(k_Duplicate_inArc_Message, ai->Name, arcItems[arcIndices[arcIndex + dupl]].Name);
-
- name = &dirNames[dirIndex2];
- if (!ai->Censored)
- ThrowError(k_NotCensoredCollision_Message, *name, ai->Name);
-
- pair.DirIndex = dirIndex2;
- pair.ArcIndex = arcIndex2;
-
- switch (ai->MTimeDefined ? MyCompareTime(
- ai->TimeType != - 1 ? (NFileTimeType::EEnum)ai->TimeType : fileTimeType,
- di->MTime, ai->MTime): 0)
- {
- case -1: pair.State = NUpdateArchive::NPairState::kNewInArchive; break;
- case 1: pair.State = NUpdateArchive::NPairState::kOldInArchive; break;
- default:
- pair.State = (ai->SizeDefined && di->Size == ai->Size) ?
- NUpdateArchive::NPairState::kSameFiles :
- NUpdateArchive::NPairState::kUnknowNewerFiles;
- }
-
- dirIndex++;
- arcIndex++;
- }
-
- if ((di && di->IsAltStream) ||
- (ai && ai->IsAltStream))
- {
- if (prevHostName)
- {
- unsigned hostLen = prevHostName->Len();
- if (name->Len() > hostLen)
- if ((*name)[hostLen] == ':' && CompareFileNames(*prevHostName, name->Left(hostLen)) == 0)
- pair.HostIndex = prevHostFile;
- }
- }
- else
- {
- prevHostFile = updatePairs.Size();
- prevHostName = name;
- }
-
- updatePairs.Add(pair);
- }
-
- updatePairs.ReserveDown();
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdatePair.h b/src/libs/7zip/win/CPP/7zip/UI/Common/UpdatePair.h
deleted file mode 100644
index 296d3b097..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdatePair.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// UpdatePair.h
-
-#ifndef __UPDATE_PAIR_H
-#define __UPDATE_PAIR_H
-
-#include "DirItem.h"
-#include "UpdateAction.h"
-
-#include "../../Archive/IArchive.h"
-
-struct CUpdatePair
-{
- NUpdateArchive::NPairState::EEnum State;
- int ArcIndex;
- int DirIndex;
- int HostIndex; // >= 0 for alt streams only, contains index of host pair
-
- CUpdatePair(): ArcIndex(-1), DirIndex(-1), HostIndex(-1) {}
-};
-
-void GetUpdatePairInfoList(
- const CDirItems &dirItems,
- const CObjectVector<CArcItem> &arcItems,
- NFileTimeType::EEnum fileTimeType,
- CRecordVector<CUpdatePair> &updatePairs);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateProduce.cpp b/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateProduce.cpp
deleted file mode 100644
index 2c4c28583..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateProduce.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-// UpdateProduce.cpp
-
-#include "StdAfx.h"
-
-#include "UpdateProduce.h"
-
-using namespace NUpdateArchive;
-
-static const char *kUpdateActionSetCollision = "Internal collision in update action set";
-
-void UpdateProduce(
- const CRecordVector<CUpdatePair> &updatePairs,
- const CActionSet &actionSet,
- CRecordVector<CUpdatePair2> &operationChain,
- IUpdateProduceCallback *callback)
-{
- FOR_VECTOR (i, updatePairs)
- {
- const CUpdatePair &pair = updatePairs[i];
-
- CUpdatePair2 up2;
- up2.DirIndex = pair.DirIndex;
- up2.ArcIndex = pair.ArcIndex;
- up2.NewData = up2.NewProps = true;
- up2.UseArcProps = false;
-
- switch (actionSet.StateActions[pair.State])
- {
- case NPairAction::kIgnore:
- /*
- if (pair.State != NPairState::kOnlyOnDisk)
- IgnoreArchiveItem(m_ArchiveItems[pair.ArcIndex]);
- // cout << "deleting";
- */
- if (callback)
- callback->ShowDeleteFile(pair.ArcIndex);
- continue;
-
- case NPairAction::kCopy:
- if (pair.State == NPairState::kOnlyOnDisk)
- throw kUpdateActionSetCollision;
- if (pair.State == NPairState::kOnlyInArchive)
- {
- if (pair.HostIndex >= 0)
- {
- /*
- ignore alt stream if
- 1) no such alt stream in Disk
- 2) there is Host file in disk
- */
- if (updatePairs[pair.HostIndex].DirIndex >= 0)
- continue;
- }
- }
- up2.NewData = up2.NewProps = false;
- up2.UseArcProps = true;
- break;
-
- case NPairAction::kCompress:
- if (pair.State == NPairState::kOnlyInArchive ||
- pair.State == NPairState::kNotMasked)
- throw kUpdateActionSetCollision;
- break;
-
- case NPairAction::kCompressAsAnti:
- up2.IsAnti = true;
- up2.UseArcProps = (pair.ArcIndex >= 0);
- break;
- }
- operationChain.Add(up2);
- }
- operationChain.ReserveDown();
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateProduce.h b/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateProduce.h
deleted file mode 100644
index ef7b0f7a3..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Common/UpdateProduce.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// UpdateProduce.h
-
-#ifndef __UPDATE_PRODUCE_H
-#define __UPDATE_PRODUCE_H
-
-#include "UpdatePair.h"
-
-struct CUpdatePair2
-{
- bool NewData;
- bool NewProps;
- bool UseArcProps; // if (UseArcProps && NewProps), we want to change only some properties.
- bool IsAnti; // if (!IsAnti) we use other ways to detect Anti status
-
- int DirIndex;
- int ArcIndex;
- int NewNameIndex;
-
- bool IsMainRenameItem;
-
- void SetAs_NoChangeArcItem(int arcIndex)
- {
- NewData = NewProps = false;
- UseArcProps = true;
- IsAnti = false;
- ArcIndex = arcIndex;
- }
-
- bool ExistOnDisk() const { return DirIndex != -1; }
- bool ExistInArchive() const { return ArcIndex != -1; }
-
- CUpdatePair2():
- NewData(false),
- NewProps(false),
- UseArcProps(false),
- IsAnti(false),
- DirIndex(-1),
- ArcIndex(-1),
- NewNameIndex(-1),
- IsMainRenameItem(false)
- {}
-};
-
-struct IUpdateProduceCallback
-{
- virtual HRESULT ShowDeleteFile(int arcIndex) = 0;
-};
-
-void UpdateProduce(
- const CRecordVector<CUpdatePair> &updatePairs,
- const NUpdateArchive::CActionSet &actionSet,
- CRecordVector<CUpdatePair2> &operationChain,
- IUpdateProduceCallback *callback);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Console/Console.pri b/src/libs/7zip/win/CPP/7zip/UI/Console/Console.pri
deleted file mode 100644
index 14668f8b3..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Console/Console.pri
+++ /dev/null
@@ -1,4 +0,0 @@
-HEADERS += $$7ZIP_BASE/CPP/7zip/UI/Console/PercentPrinter.h \
- $$7ZIP_BASE/CPP/7zip/UI/Common/StdAfx.h
-
-SOURCES += $$7ZIP_BASE/CPP/7zip/UI/Console/PercentPrinter.cpp
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Console/PercentPrinter.cpp b/src/libs/7zip/win/CPP/7zip/UI/Console/PercentPrinter.cpp
deleted file mode 100644
index f2889957a..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Console/PercentPrinter.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-// PercentPrinter.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/Defs.h"
-#include "../../../Common/IntToString.h"
-
-#include "PercentPrinter.h"
-
-static const unsigned kPaddingSize = 2;
-static const unsigned kPercentsSize = 4;
-static const unsigned kMaxExtraSize = kPaddingSize + 32 + kPercentsSize;
-
-static void ClearPrev(char *p, unsigned num)
-{
- unsigned i;
- for (i = 0; i < num; i++) *p++ = '\b';
- for (i = 0; i < num; i++) *p++ = ' ';
- for (i = 0; i < num; i++) *p++ = '\b';
- *p = '\0';
-}
-
-void CPercentPrinter::ClosePrint()
-{
- if (m_NumExtraChars == 0)
- return;
- char s[kMaxExtraSize * 3 + 1];
- ClearPrev(s, m_NumExtraChars);
- (*OutStream) << s;
- m_NumExtraChars = 0;
-}
-
-void CPercentPrinter::PrintString(const char *s)
-{
- ClosePrint();
- (*OutStream) << s;
-}
-
-void CPercentPrinter::PrintString(const wchar_t *s)
-{
- ClosePrint();
- (*OutStream) << s;
-}
-
-void CPercentPrinter::PrintNewLine()
-{
- ClosePrint();
- (*OutStream) << "\n";
-}
-
-void CPercentPrinter::RePrintRatio()
-{
- char s[32];
- unsigned size;
- {
- char c = '%';
- UInt64 value = 0;
- if (m_Total == (UInt64)(Int64)-1)
- {
- value = m_CurValue >> 20;
- c = 'M';
- }
- else if (m_Total != 0)
- value = m_CurValue * 100 / m_Total;
- ConvertUInt64ToString(value, s);
- size = (unsigned)strlen(s);
- s[size++] = c;
- s[size] = '\0';
- }
-
- unsigned extraSize = kPaddingSize + MyMax(size, kPercentsSize);
- if (extraSize < m_NumExtraChars)
- extraSize = m_NumExtraChars;
-
- char fullString[kMaxExtraSize * 3];
- char *p = fullString;
- unsigned i;
- if (m_NumExtraChars == 0)
- {
- for (i = 0; i < extraSize; i++)
- *p++ = ' ';
- m_NumExtraChars = extraSize;
- }
-
- for (i = 0; i < m_NumExtraChars; i++)
- *p++ = '\b';
- m_NumExtraChars = extraSize;
- for (; size < extraSize; size++)
- *p++ = ' ';
- MyStringCopy(p, s);
- (*OutStream) << fullString;
- OutStream->Flush();
- m_PrevValue = m_CurValue;
-}
-
-void CPercentPrinter::PrintRatio()
-{
- if (m_CurValue < m_PrevValue + m_MinStepSize &&
- m_CurValue + m_MinStepSize > m_PrevValue && m_NumExtraChars != 0)
- return;
- RePrintRatio();
-}
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Console/PercentPrinter.h b/src/libs/7zip/win/CPP/7zip/UI/Console/PercentPrinter.h
deleted file mode 100644
index 509bab5fc..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Console/PercentPrinter.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// PercentPrinter.h
-
-#ifndef __PERCENT_PRINTER_H
-#define __PERCENT_PRINTER_H
-
-#include "../../../Common/StdOutStream.h"
-
-class CPercentPrinter
-{
- UInt64 m_MinStepSize;
- UInt64 m_PrevValue;
- UInt64 m_CurValue;
- UInt64 m_Total;
- unsigned m_NumExtraChars;
-public:
- CStdOutStream *OutStream;
-
- CPercentPrinter(UInt64 minStepSize = 1): m_MinStepSize(minStepSize),
- m_PrevValue(0), m_CurValue(0), m_Total((UInt64)(Int64)-1), m_NumExtraChars(0) {}
- void SetTotal(UInt64 total) { m_Total = total; m_PrevValue = 0; }
- void SetRatio(UInt64 doneValue) { m_CurValue = doneValue; }
- void PrintString(const char *s);
- void PrintString(const wchar_t *s);
- void PrintNewLine();
- void ClosePrint();
- void RePrintRatio();
- void PrintRatio();
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/7zip/UI/Console/StdAfx.h b/src/libs/7zip/win/CPP/7zip/UI/Console/StdAfx.h
deleted file mode 100644
index 2854ff3e9..000000000
--- a/src/libs/7zip/win/CPP/7zip/UI/Console/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/Common.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/ComTry.h b/src/libs/7zip/win/CPP/Common/ComTry.h
deleted file mode 100644
index c8aa4aedc..000000000
--- a/src/libs/7zip/win/CPP/Common/ComTry.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// ComTry.h
-
-#ifndef __COM_TRY_H
-#define __COM_TRY_H
-
-#include "MyWindows.h"
-// #include "Exception.h"
-// #include "NewHandler.h"
-
-#define COM_TRY_BEGIN try {
-#define COM_TRY_END } catch(...) { return E_OUTOFMEMORY; }
-
- // catch(const CNewException &) { return E_OUTOFMEMORY; }
- // catch(const CSystemException &e) { return e.ErrorCode; }
- // catch(...) { return E_FAIL; }
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/CommandLineParser.cpp b/src/libs/7zip/win/CPP/Common/CommandLineParser.cpp
deleted file mode 100644
index ac9ae1960..000000000
--- a/src/libs/7zip/win/CPP/Common/CommandLineParser.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-// CommandLineParser.cpp
-
-#include "StdAfx.h"
-
-#include "CommandLineParser.h"
-
-static bool IsString1PrefixedByString2_NoCase(const wchar_t *u, const char *a)
-{
- for (;;)
- {
- char c = *a;
- if (c == 0)
- return true;
- if (MyCharLower_Ascii(c) != MyCharLower_Ascii(*u))
- return false;
- a++;
- u++;
- }
-}
-
-namespace NCommandLineParser {
-
-bool SplitCommandLine(const UString &src, UString &dest1, UString &dest2)
-{
- dest1.Empty();
- dest2.Empty();
- bool quoteMode = false;
- unsigned i;
- for (i = 0; i < src.Len(); i++)
- {
- wchar_t c = src[i];
- if ((c == L' ' || c == L'\t') && !quoteMode)
- {
- dest2 = src.Ptr(i + 1);
- return i != 0;
- }
- if (c == L'\"')
- quoteMode = !quoteMode;
- else
- dest1 += c;
- }
- return i != 0;
-}
-
-void SplitCommandLine(const UString &s, UStringVector &parts)
-{
- UString sTemp = s;
- sTemp.Trim();
- parts.Clear();
- for (;;)
- {
- UString s1, s2;
- if (SplitCommandLine(sTemp, s1, s2))
- parts.Add(s1);
- if (s2.IsEmpty())
- break;
- sTemp = s2;
- }
-}
-
-
-static const char *kStopSwitchParsing = "--";
-
-static bool inline IsItSwitchChar(wchar_t c)
-{
- return (c == '-');
-}
-
-CParser::CParser(unsigned numSwitches):
- _numSwitches(numSwitches),
- _switches(0)
-{
- _switches = new CSwitchResult[numSwitches];
-}
-
-CParser::~CParser()
-{
- delete []_switches;
-}
-
-
-// if (s) contains switch then function updates switch structures
-// out: true, if (s) is a switch
-bool CParser::ParseString(const UString &s, const CSwitchForm *switchForms)
-{
- if (s.IsEmpty() || !IsItSwitchChar(s[0]))
- return false;
-
- unsigned pos = 1;
- unsigned switchIndex = 0;
- int maxLen = -1;
-
- for (unsigned i = 0; i < _numSwitches; i++)
- {
- const char *key = switchForms[i].Key;
- unsigned switchLen = MyStringLen(key);
- if ((int)switchLen <= maxLen || pos + switchLen > s.Len())
- continue;
- if (IsString1PrefixedByString2_NoCase((const wchar_t *)s + pos, key))
- {
- switchIndex = i;
- maxLen = switchLen;
- }
- }
-
- if (maxLen < 0)
- {
- ErrorMessage = "Unknown switch:";
- return false;
- }
-
- pos += maxLen;
-
- CSwitchResult &sw = _switches[switchIndex];
- const CSwitchForm &form = switchForms[switchIndex];
-
- if (!form.Multi && sw.ThereIs)
- {
- ErrorMessage = "Multiple instances for switch:";
- return false;
- }
-
- sw.ThereIs = true;
-
- int rem = s.Len() - pos;
- if (rem < form.MinLen)
- {
- ErrorMessage = "Too short switch:";
- return false;
- }
-
- sw.WithMinus = false;
- sw.PostCharIndex = -1;
-
- switch (form.Type)
- {
- case NSwitchType::kMinus:
- if (rem != 0)
- {
- sw.WithMinus = (s[pos] == '-');
- if (sw.WithMinus)
- pos++;
- }
- break;
-
- case NSwitchType::kChar:
- if (rem != 0)
- {
- wchar_t c = s[pos];
- if (c <= 0x7F)
- {
- sw.PostCharIndex = FindCharPosInString(form.PostCharSet, (char)c);
- if (sw.PostCharIndex >= 0)
- pos++;
- }
- }
- break;
-
- case NSwitchType::kString:
- sw.PostStrings.Add((const wchar_t *)s + pos);
- return true;
- }
- if (pos != s.Len())
- {
- ErrorMessage = "Too long switch:";
- return false;
- }
- return true;
-}
-
-bool CParser::ParseStrings(const CSwitchForm *switchForms, const UStringVector &commandStrings)
-{
- ErrorLine.Empty();
- bool stopSwitch = false;
- FOR_VECTOR (i, commandStrings)
- {
- const UString &s = commandStrings[i];
- if (!stopSwitch)
- {
- if (s.IsEqualTo(kStopSwitchParsing))
- {
- stopSwitch = true;
- continue;
- }
- if (!s.IsEmpty() && IsItSwitchChar(s[0]))
- {
- if (ParseString(s, switchForms))
- continue;
- ErrorLine = s;
- return false;
- }
- }
- NonSwitchStrings.Add(s);
- }
- return true;
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/Common/CommandLineParser.h b/src/libs/7zip/win/CPP/Common/CommandLineParser.h
deleted file mode 100644
index e3e6e6b14..000000000
--- a/src/libs/7zip/win/CPP/Common/CommandLineParser.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Common/CommandLineParser.h
-
-#ifndef __COMMON_COMMAND_LINE_PARSER_H
-#define __COMMON_COMMAND_LINE_PARSER_H
-
-#include "MyString.h"
-
-namespace NCommandLineParser {
-
-bool SplitCommandLine(const UString &src, UString &dest1, UString &dest2);
-void SplitCommandLine(const UString &s, UStringVector &parts);
-
-namespace NSwitchType
-{
- enum EEnum
- {
- kSimple,
- kMinus,
- kString,
- kChar
- };
-}
-
-struct CSwitchForm
-{
- const char *Key;
- Byte Type;
- bool Multi;
- Byte MinLen;
- // int MaxLen;
- const char *PostCharSet;
-};
-
-struct CSwitchResult
-{
- bool ThereIs;
- bool WithMinus;
- int PostCharIndex;
- UStringVector PostStrings;
-
- CSwitchResult(): ThereIs(false) {};
-};
-
-class CParser
-{
- unsigned _numSwitches;
- CSwitchResult *_switches;
-
- bool ParseString(const UString &s, const CSwitchForm *switchForms);
-public:
- UStringVector NonSwitchStrings;
- AString ErrorMessage;
- UString ErrorLine;
-
- CParser(unsigned numSwitches);
- ~CParser();
- bool ParseStrings(const CSwitchForm *switchForms, const UStringVector &commandStrings);
- const CSwitchResult& operator[](size_t index) const { return _switches[index]; }
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/Common.h b/src/libs/7zip/win/CPP/Common/Common.h
deleted file mode 100644
index 9dd30f4be..000000000
--- a/src/libs/7zip/win/CPP/Common/Common.h
+++ /dev/null
@@ -1,13 +0,0 @@
-// Common.h
-
-#ifndef __COMMON_COMMON_H
-#define __COMMON_COMMON_H
-
-#include "../../C/Compiler.h"
-
-#include "MyWindows.h"
-#include "NewHandler.h"
-
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[1]))
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/Common.pri b/src/libs/7zip/win/CPP/Common/Common.pri
deleted file mode 100644
index ecc997d89..000000000
--- a/src/libs/7zip/win/CPP/Common/Common.pri
+++ /dev/null
@@ -1,35 +0,0 @@
-HEADERS += $$7ZIP_BASE/CPP/Common/CommandLineParser.h \
- $$7ZIP_BASE/CPP/Common/ComTry.h \
- $$7ZIP_BASE/CPP/Common/Common.h \
- $$7ZIP_BASE/CPP/Common/Defs.h \
- $$7ZIP_BASE/CPP/Common/IntToString.h \
- $$7ZIP_BASE/CPP/Common/ListFileUtils.h \
- $$7ZIP_BASE/CPP/Common/MyBuffer.h \
- $$7ZIP_BASE/CPP/Common/MyCom.h \
- $$7ZIP_BASE/CPP/Common/MyException.h \
- $$7ZIP_BASE/CPP/Common/MyGuidDef.h \
- $$7ZIP_BASE/CPP/Common/MyInitGuid.h \
- $$7ZIP_BASE/CPP/Common/MyString.h \
- $$7ZIP_BASE/CPP/Common/MyTypes.h \
- $$7ZIP_BASE/CPP/Common/MyUnknown.h \
- $$7ZIP_BASE/CPP/Common/MyVector.h \
- $$7ZIP_BASE/CPP/Common/MyWindows.h \
- $$7ZIP_BASE/CPP/Common/NewHandler.h \
- $$7ZIP_BASE/CPP/Common/StdAfx.h \
- $$7ZIP_BASE/CPP/Common/StdOutStream.h \
- $$7ZIP_BASE/CPP/Common/StringConvert.h \
- $$7ZIP_BASE/CPP/Common/StringToInt.h \
- $$7ZIP_BASE/CPP/Common/UTFConvert.h \
- $$7ZIP_BASE/CPP/Common/Wildcard.h
-
-SOURCES += $$7ZIP_BASE/CPP/Common/CommandLineParser.cpp \
- $$7ZIP_BASE/CPP/Common/IntToString.cpp \
- $$7ZIP_BASE/CPP/Common/ListFileUtils.cpp \
- $$7ZIP_BASE/CPP/Common/MyString.cpp \
- $$7ZIP_BASE/CPP/Common/MyWindows.cpp \
- $$7ZIP_BASE/CPP/Common/NewHandler.cpp \
- $$7ZIP_BASE/CPP/Common/StdOutStream.cpp \
- $$7ZIP_BASE/CPP/Common/StringConvert.cpp \
- $$7ZIP_BASE/CPP/Common/StringToInt.cpp \
- $$7ZIP_BASE/CPP/Common/UTFConvert.cpp \
- $$7ZIP_BASE/CPP/Common/Wildcard.cpp
diff --git a/src/libs/7zip/win/CPP/Common/Defs.h b/src/libs/7zip/win/CPP/Common/Defs.h
deleted file mode 100644
index dad3ae8f1..000000000
--- a/src/libs/7zip/win/CPP/Common/Defs.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Common/Defs.h
-
-#ifndef __COMMON_DEFS_H
-#define __COMMON_DEFS_H
-
-template <class T> inline T MyMin(T a, T b)
- { return a < b ? a : b; }
-template <class T> inline T MyMax(T a, T b)
- { return a > b ? a : b; }
-
-template <class T> inline int MyCompare(T a, T b)
- { return a < b ? -1 : (a == b ? 0 : 1); }
-
-inline int BoolToInt(bool value)
- { return (value ? 1: 0); }
-
-inline bool IntToBool(int value)
- { return (value != 0); }
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/IntToString.cpp b/src/libs/7zip/win/CPP/Common/IntToString.cpp
deleted file mode 100644
index ed217c72c..000000000
--- a/src/libs/7zip/win/CPP/Common/IntToString.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-// Common/IntToString.cpp
-
-#include "StdAfx.h"
-
-#include "IntToString.h"
-
-#define CONVERT_INT_TO_STR(charType, tempSize) \
- unsigned char temp[tempSize]; unsigned i = 0; \
- while (val >= 10) { temp[i++] = (unsigned char)('0' + (unsigned)(val % 10)); val /= 10; } \
- *s++ = (charType)('0' + (unsigned)val); \
- while (i != 0) { i--; *s++ = temp[i]; } \
- *s = 0;
-
-void ConvertUInt32ToString(UInt32 val, char *s) throw()
-{
- CONVERT_INT_TO_STR(char, 16);
-}
-
-void ConvertUInt64ToString(UInt64 val, char *s) throw()
-{
- if (val <= (UInt32)0xFFFFFFFF)
- {
- ConvertUInt32ToString((UInt32)val, s);
- return;
- }
- CONVERT_INT_TO_STR(char, 24);
-}
-
-void ConvertUInt64ToOct(UInt64 val, char *s) throw()
-{
- UInt64 v = val;
- unsigned i;
- for (i = 1;; i++)
- {
- v >>= 3;
- if (v == 0)
- break;
- }
- s[i] = 0;
- do
- {
- unsigned t = (unsigned)(val & 0x7);
- val >>= 3;
- s[--i] = (char)('0' + t);
- }
- while (i);
-}
-
-void ConvertUInt32ToHex(UInt32 val, char *s) throw()
-{
- UInt32 v = val;
- unsigned i;
- for (i = 1;; i++)
- {
- v >>= 4;
- if (v == 0)
- break;
- }
- s[i] = 0;
- do
- {
- unsigned t = (unsigned)((val & 0xF));
- val >>= 4;
- s[--i] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10)));
- }
- while (i);
-}
-
-void ConvertUInt64ToHex(UInt64 val, char *s) throw()
-{
- UInt64 v = val;
- unsigned i;
- for (i = 1;; i++)
- {
- v >>= 4;
- if (v == 0)
- break;
- }
- s[i] = 0;
- do
- {
- unsigned t = (unsigned)((val & 0xF));
- val >>= 4;
- s[--i] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10)));
- }
- while (i);
-}
-
-void ConvertUInt32ToHex8Digits(UInt32 val, char *s) throw()
-{
- s[8] = 0;
- for (int i = 7; i >= 0; i--)
- {
- unsigned t = val & 0xF;
- val >>= 4;
- s[i] = (char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))));
- }
-}
-
-/*
-void ConvertUInt32ToHex8Digits(UInt32 val, wchar_t *s)
-{
- s[8] = 0;
- for (int i = 7; i >= 0; i--)
- {
- unsigned t = val & 0xF;
- val >>= 4;
- s[i] = (wchar_t)(((t < 10) ? ('0' + t) : ('A' + (t - 10))));
- }
-}
-*/
-
-void ConvertUInt32ToString(UInt32 val, wchar_t *s) throw()
-{
- CONVERT_INT_TO_STR(wchar_t, 16);
-}
-
-void ConvertUInt64ToString(UInt64 val, wchar_t *s) throw()
-{
- if (val <= (UInt32)0xFFFFFFFF)
- {
- ConvertUInt32ToString((UInt32)val, s);
- return;
- }
- CONVERT_INT_TO_STR(wchar_t, 24);
-}
-
-void ConvertInt64ToString(Int64 val, char *s) throw()
-{
- if (val < 0)
- {
- *s++ = '-';
- val = -val;
- }
- ConvertUInt64ToString(val, s);
-}
-
-void ConvertInt64ToString(Int64 val, wchar_t *s) throw()
-{
- if (val < 0)
- {
- *s++ = L'-';
- val = -val;
- }
- ConvertUInt64ToString(val, s);
-}
diff --git a/src/libs/7zip/win/CPP/Common/IntToString.h b/src/libs/7zip/win/CPP/Common/IntToString.h
deleted file mode 100644
index 69605ab76..000000000
--- a/src/libs/7zip/win/CPP/Common/IntToString.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Common/IntToString.h
-
-#ifndef __COMMON_INT_TO_STRING_H
-#define __COMMON_INT_TO_STRING_H
-
-#include "MyTypes.h"
-
-void ConvertUInt32ToString(UInt32 value, char *s) throw();
-void ConvertUInt64ToString(UInt64 value, char *s) throw();
-
-void ConvertUInt32ToString(UInt32 value, wchar_t *s) throw();
-void ConvertUInt64ToString(UInt64 value, wchar_t *s) throw();
-
-void ConvertUInt64ToOct(UInt64 value, char *s) throw();
-
-void ConvertUInt32ToHex(UInt32 value, char *s) throw();
-void ConvertUInt64ToHex(UInt64 value, char *s) throw();
-void ConvertUInt32ToHex8Digits(UInt32 value, char *s) throw();
-// void ConvertUInt32ToHex8Digits(UInt32 value, wchar_t *s) throw();
-
-void ConvertInt64ToString(Int64 value, char *s) throw();
-void ConvertInt64ToString(Int64 value, wchar_t *s) throw();
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/ListFileUtils.cpp b/src/libs/7zip/win/CPP/Common/ListFileUtils.cpp
deleted file mode 100644
index 4d7faeca3..000000000
--- a/src/libs/7zip/win/CPP/Common/ListFileUtils.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-// Common/ListFileUtils.cpp
-
-#include "StdAfx.h"
-
-#include "../../C/CpuArch.h"
-
-#include "../Windows/FileIO.h"
-
-#include "ListFileUtils.h"
-#include "MyBuffer.h"
-#include "StringConvert.h"
-#include "UTFConvert.h"
-
-static const char kQuoteChar = '\"';
-
-static void AddName(UStringVector &strings, UString &s)
-{
- s.Trim();
- if (s.Len() >= 2 && s[0] == kQuoteChar && s.Back() == kQuoteChar)
- {
- s.DeleteBack();
- s.Delete(0);
- }
- if (!s.IsEmpty())
- strings.Add(s);
-}
-
-bool ReadNamesFromListFile(CFSTR fileName, UStringVector &strings, UINT codePage)
-{
- NWindows::NFile::NIO::CInFile file;
- if (!file.Open(fileName))
- return false;
- UInt64 fileSize;
- if (!file.GetLength(fileSize))
- return false;
- if (fileSize >= ((UInt32)1 << 31) - 32)
- return false;
- UString u;
- if (codePage == MY__CP_UTF16 || codePage == MY__CP_UTF16BE)
- {
- if ((fileSize & 1) != 0)
- return false;
- CByteArr buf((size_t)fileSize);
- UInt32 processed;
- if (!file.Read(buf, (UInt32)fileSize, processed))
- return false;
- if (processed != fileSize)
- return false;
- file.Close();
- unsigned num = (unsigned)fileSize / 2;
- wchar_t *p = u.GetBuffer(num);
- if (codePage == MY__CP_UTF16)
- for (unsigned i = 0; i < num; i++)
- {
- wchar_t c = GetUi16(buf + i * 2);
- if (c == 0)
- return false;
- p[i] = c;
- }
- else
- for (unsigned i = 0; i < num; i++)
- {
- wchar_t c = (wchar_t)GetBe16(buf + i * 2);
- if (c == 0)
- return false;
- p[i] = c;
- }
- u.ReleaseBuffer(num);
- }
- else
- {
- AString s;
- char *p = s.GetBuffer((unsigned)fileSize);
- UInt32 processed;
- if (!file.Read(p, (UInt32)fileSize, processed))
- return false;
- if (processed != fileSize)
- return false;
- file.Close();
- p[processed] = 0;
- s.ReleaseBuffer();
- if (s.Len() != processed)
- return false;
-
- // #ifdef CP_UTF8
- if (codePage == CP_UTF8)
- {
- if (!ConvertUTF8ToUnicode(s, u))
- return false;
- }
- else
- // #endif
- MultiByteToUnicodeString2(u, s, codePage);
- }
-
- const wchar_t kGoodBOM = 0xFEFF;
- const wchar_t kBadBOM = 0xFFFE;
-
- UString s;
- unsigned i = 0;
- for (; i < u.Len() && u[i] == kGoodBOM; i++);
- for (; i < u.Len(); i++)
- {
- wchar_t c = u[i];
- if (c == kGoodBOM || c == kBadBOM)
- return false;
- if (c == L'\n' || c == 0xD)
- {
- AddName(strings, s);
- s.Empty();
- }
- else
- s += c;
- }
- AddName(strings, s);
- return true;
-}
diff --git a/src/libs/7zip/win/CPP/Common/ListFileUtils.h b/src/libs/7zip/win/CPP/Common/ListFileUtils.h
deleted file mode 100644
index e8d833fdb..000000000
--- a/src/libs/7zip/win/CPP/Common/ListFileUtils.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Common/ListFileUtils.h
-
-#ifndef __COMMON_LIST_FILE_UTILS_H
-#define __COMMON_LIST_FILE_UTILS_H
-
-#include "MyString.h"
-#include "MyTypes.h"
-
-#define MY__CP_UTF16 1200
-#define MY__CP_UTF16BE 1201
-
-bool ReadNamesFromListFile(CFSTR fileName, UStringVector &strings, UINT codePage = CP_OEMCP);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyBuffer.h b/src/libs/7zip/win/CPP/Common/MyBuffer.h
deleted file mode 100644
index 7bd79f6f4..000000000
--- a/src/libs/7zip/win/CPP/Common/MyBuffer.h
+++ /dev/null
@@ -1,237 +0,0 @@
-// Common/MyBuffer.h
-
-#ifndef __COMMON_MY_BUFFER_H
-#define __COMMON_MY_BUFFER_H
-
-#include "Defs.h"
-
-template <class T> class CBuffer
-{
- T *_items;
- size_t _size;
-
- void CopyToEmpty(const CBuffer &buffer)
- {
- if (buffer._size > 0)
- {
- _items = new T[buffer._size];
- memcpy(_items, buffer._items, buffer._size * sizeof(T));
- _size = buffer._size;
- }
- }
-public:
- void Free()
- {
- if (_items)
- {
- delete []_items;
- _items = 0;
- }
- _size = 0;
- }
-
- CBuffer(): _items(0), _size(0) {};
- CBuffer(size_t size): _items(0), _size(0) { _items = new T[size]; _size = size; }
- CBuffer(const CBuffer &buffer): _items(0), _size(0) { CopyToEmpty(buffer); }
- ~CBuffer() { delete []_items; }
-
- operator T *() { return _items; };
- operator const T *() const { return _items; };
- size_t Size() const { return _size; }
-
- void Alloc(size_t size)
- {
- if (size != _size)
- {
- Free();
- if (size != 0)
- {
- _items = new T[size];
- _size = size;
- }
- }
- }
-
- void AllocAtLeast(size_t size)
- {
- if (size > _size)
- {
- Free();
- _items = new T[size];
- _size = size;
- }
- }
-
- void CopyFrom(const T *data, size_t size)
- {
- Alloc(size);
- memcpy(_items, data, size * sizeof(T));
- }
-
- void ChangeSize_KeepData(size_t newSize, size_t keepSize)
- {
- if (newSize == _size)
- return;
- T *newBuffer = NULL;
- if (newSize > 0)
- {
- newBuffer = new T[newSize];
- if (_size > 0)
- memcpy(newBuffer, _items, MyMin(MyMin(_size, keepSize), newSize) * sizeof(T));
- }
- delete []_items;
- _items = newBuffer;
- _size = newSize;
- }
-
- CBuffer& operator=(const CBuffer &buffer)
- {
- Free();
- CopyToEmpty(buffer);
- return *this;
- }
-};
-
-template <class T>
-bool operator==(const CBuffer<T>& b1, const CBuffer<T>& b2)
-{
- size_t size1 = b1.Size();
- if (size1 != b2.Size())
- return false;
- return memcmp(b1, b2, size1 * sizeof(T)) == 0;
-}
-
-template <class T>
-bool operator!=(const CBuffer<T>& b1, const CBuffer<T>& b2)
-{
- size_t size1 = b1.Size();
- if (size1 == b2.Size())
- return false;
- return memcmp(b1, b2, size1 * sizeof(T)) != 0;
-}
-
-
-typedef CBuffer<char> CCharBuffer;
-typedef CBuffer<wchar_t> CWCharBuffer;
-typedef CBuffer<unsigned char> CByteBuffer;
-
-
-template <class T> class CObjArray
-{
-protected:
- T *_items;
-private:
- // we disable constructors
- CObjArray(const CObjArray &buffer);
- void operator=(const CObjArray &buffer);
-public:
- void Free()
- {
- delete []_items;
- _items = 0;
- }
- CObjArray(size_t size): _items(0) { if (size != 0) _items = new T[size]; }
- CObjArray(): _items(0) {};
- ~CObjArray() { delete []_items; }
-
- operator T *() { return _items; };
- operator const T *() const { return _items; };
-
- void Alloc(size_t newSize)
- {
- delete []_items;
- _items = 0;
- _items = new T[newSize];
- }
-};
-
-typedef CObjArray<unsigned char> CByteArr;
-typedef CObjArray<bool> CBoolArr;
-typedef CObjArray<int> CIntArr;
-
-// #define CRecArray CObjArray
-
-template <class T> class CObjArray2
-{
-// protected:
- T *_items;
- unsigned _size;
-
- CObjArray2(const CObjArray2 &buffer);
- void operator=(const CObjArray2 &buffer);
-public:
-
- void Free()
- {
- delete []_items;
- _items = 0;
- _size = 0;
- }
- CObjArray2(): _items(0), _size(0) {};
- /*
- CObjArray2(const CObjArray2 &buffer): _items(0), _size(0)
- {
- size_t newSize = buffer._size;
- if (newSize > 0)
- {
- T *newBuffer = new T[newSize];;
- _items = newBuffer;
- _size = newSize;
- const T *src = buffer;
- for (size_t i = 0; i < newSize; i++)
- newBuffer[i] = src[i];
- }
- }
- */
- /*
- CObjArray2(size_t size): _items(0), _size(0)
- {
- if (size != 0)
- {
- _items = new T[size];
- _size = size;
- }
- }
- */
-
- ~CObjArray2() { delete []_items; }
-
- operator T *() { return _items; };
- operator const T *() const { return _items; };
-
- unsigned Size() const { return (unsigned)_size; }
- bool IsEmpty() const { return _size == 0; }
-
- // SetSize doesn't keep old items. It allocates new array if size is not equal
- void SetSize(unsigned size)
- {
- if (size == _size)
- return;
- T *newBuffer = NULL;
- if (size > 0)
- newBuffer = new T[size];
- delete []_items;
- _items = newBuffer;
- _size = size;
- }
-
- /*
- CObjArray2& operator=(const CObjArray2 &buffer)
- {
- Free();
- size_t newSize = buffer._size;
- if (newSize > 0)
- {
- T *newBuffer = new T[newSize];;
- _items = newBuffer;
- _size = newSize;
- const T *src = buffer;
- for (size_t i = 0; i < newSize; i++)
- newBuffer[i] = src[i];
- }
- return *this;
- }
- */
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyCom.h b/src/libs/7zip/win/CPP/Common/MyCom.h
deleted file mode 100644
index 466407cde..000000000
--- a/src/libs/7zip/win/CPP/Common/MyCom.h
+++ /dev/null
@@ -1,242 +0,0 @@
-// MyCom.h
-
-#ifndef __MY_COM_H
-#define __MY_COM_H
-
-#include "MyWindows.h"
-#include "NewHandler.h"
-
-#ifndef RINOK
-#define RINOK(x) { HRESULT __result_ = (x); if (__result_ != S_OK) return __result_; }
-#endif
-
-template <class T>
-class CMyComPtr
-{
- T* _p;
-public:
- CMyComPtr(): _p(NULL) {}
- CMyComPtr(T* p) throw() { if ((_p = p) != NULL) p->AddRef(); }
- CMyComPtr(const CMyComPtr<T>& lp) throw() { if ((_p = lp._p) != NULL) _p->AddRef(); }
- ~CMyComPtr() { if (_p) _p->Release(); }
- void Release() { if (_p) { _p->Release(); _p = NULL; } }
- operator T*() const { return (T*)_p; }
- // T& operator*() const { return *_p; }
- T** operator&() { return &_p; }
- T* operator->() const { return _p; }
- T* operator=(T* p)
- {
- if (p)
- p->AddRef();
- if (_p)
- _p->Release();
- _p = p;
- return p;
- }
- T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); }
- bool operator!() const { return (_p == NULL); }
- // bool operator==(T* pT) const { return _p == pT; }
- void Attach(T* p2)
- {
- Release();
- _p = p2;
- }
- T* Detach()
- {
- T* pt = _p;
- _p = NULL;
- return pt;
- }
- #ifdef _WIN32
- HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
- {
- return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);
- }
- #endif
- /*
- HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
- {
- CLSID clsid;
- HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
- ATLASSERT(_p == NULL);
- if (SUCCEEDED(hr))
- hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p);
- return hr;
- }
- */
- template <class Q>
- HRESULT QueryInterface(REFGUID iid, Q** pp) const throw()
- {
- return _p->QueryInterface(iid, (void**)pp);
- }
-};
-
-//////////////////////////////////////////////////////////
-
-inline HRESULT StringToBstr(LPCOLESTR src, BSTR *bstr)
-{
- *bstr = ::SysAllocString(src);
- return (*bstr != NULL) ? S_OK : E_OUTOFMEMORY;
-}
-
-class CMyComBSTR
-{
- BSTR m_str;
-public:
-
- CMyComBSTR(): m_str(NULL) {}
- CMyComBSTR(LPCOLESTR src) { m_str = ::SysAllocString(src); }
- // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }
- // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); }
- CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }
- /*
- CMyComBSTR(REFGUID src)
- {
- LPOLESTR szGuid;
- StringFromCLSID(src, &szGuid);
- m_str = ::SysAllocString(szGuid);
- CoTaskMemFree(szGuid);
- }
- */
- ~CMyComBSTR() { ::SysFreeString(m_str); }
- CMyComBSTR& operator=(const CMyComBSTR& src)
- {
- if (m_str != src.m_str)
- {
- if (m_str)
- ::SysFreeString(m_str);
- m_str = src.MyCopy();
- }
- return *this;
- }
- CMyComBSTR& operator=(LPCOLESTR src)
- {
- ::SysFreeString(m_str);
- m_str = ::SysAllocString(src);
- return *this;
- }
- // unsigned Len() const { return ::SysStringLen(m_str); }
- operator BSTR() const { return m_str; }
- BSTR* operator&() { return &m_str; }
- BSTR MyCopy() const
- {
- int byteLen = ::SysStringByteLen(m_str);
- BSTR res = ::SysAllocStringByteLen(NULL, byteLen);
- memcpy(res, m_str, byteLen);
- return res;
- }
- /*
- void Attach(BSTR src) { m_str = src; }
- BSTR Detach()
- {
- BSTR s = m_str;
- m_str = NULL;
- return s;
- }
- */
- void Empty()
- {
- ::SysFreeString(m_str);
- m_str = NULL;
- }
- bool operator!() const { return (m_str == NULL); }
-};
-
-//////////////////////////////////////////////////////////
-
-class CMyUnknownImp
-{
-public:
- ULONG __m_RefCount;
- CMyUnknownImp(): __m_RefCount(0) {}
-};
-
-#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \
-(REFGUID iid, void **outObject) throw() { *outObject = NULL;
-
-#define MY_QUERYINTERFACE_ENTRY(i) else if (iid == IID_ ## i) \
- { *outObject = (void *)(i *)this; }
-
-#define MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) if (iid == IID_IUnknown) \
- { *outObject = (void *)(IUnknown *)(i *)this; }
-
-#define MY_QUERYINTERFACE_BEGIN2(i) MY_QUERYINTERFACE_BEGIN \
- MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \
- MY_QUERYINTERFACE_ENTRY(i)
-
-#define MY_QUERYINTERFACE_END else return E_NOINTERFACE; AddRef(); return S_OK; }
-
-#define MY_ADDREF_RELEASE \
-STDMETHOD_(ULONG, AddRef)() throw() { return ++__m_RefCount; } \
-STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0) \
- return __m_RefCount; delete this; return 0; }
-
-#define MY_UNKNOWN_IMP_SPEC(i) \
- MY_QUERYINTERFACE_BEGIN \
- i \
- MY_QUERYINTERFACE_END \
- MY_ADDREF_RELEASE
-
-
-#define MY_UNKNOWN_IMP MY_QUERYINTERFACE_BEGIN \
- MY_QUERYINTERFACE_ENTRY_UNKNOWN(IUnknown) \
- MY_QUERYINTERFACE_END \
- MY_ADDREF_RELEASE
-
-#define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \
- MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \
- MY_QUERYINTERFACE_ENTRY(i) \
- )
-
-#define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \
- MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \
- MY_QUERYINTERFACE_ENTRY(i1) \
- MY_QUERYINTERFACE_ENTRY(i2) \
- )
-
-#define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \
- MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \
- MY_QUERYINTERFACE_ENTRY(i1) \
- MY_QUERYINTERFACE_ENTRY(i2) \
- MY_QUERYINTERFACE_ENTRY(i3) \
- )
-
-#define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \
- MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \
- MY_QUERYINTERFACE_ENTRY(i1) \
- MY_QUERYINTERFACE_ENTRY(i2) \
- MY_QUERYINTERFACE_ENTRY(i3) \
- MY_QUERYINTERFACE_ENTRY(i4) \
- )
-
-#define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \
- MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \
- MY_QUERYINTERFACE_ENTRY(i1) \
- MY_QUERYINTERFACE_ENTRY(i2) \
- MY_QUERYINTERFACE_ENTRY(i3) \
- MY_QUERYINTERFACE_ENTRY(i4) \
- MY_QUERYINTERFACE_ENTRY(i5) \
- )
-
-#define MY_UNKNOWN_IMP6(i1, i2, i3, i4, i5, i6) MY_UNKNOWN_IMP_SPEC( \
- MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \
- MY_QUERYINTERFACE_ENTRY(i1) \
- MY_QUERYINTERFACE_ENTRY(i2) \
- MY_QUERYINTERFACE_ENTRY(i3) \
- MY_QUERYINTERFACE_ENTRY(i4) \
- MY_QUERYINTERFACE_ENTRY(i5) \
- MY_QUERYINTERFACE_ENTRY(i6) \
- )
-
-#define MY_UNKNOWN_IMP7(i1, i2, i3, i4, i5, i6, i7) MY_UNKNOWN_IMP_SPEC( \
- MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \
- MY_QUERYINTERFACE_ENTRY(i1) \
- MY_QUERYINTERFACE_ENTRY(i2) \
- MY_QUERYINTERFACE_ENTRY(i3) \
- MY_QUERYINTERFACE_ENTRY(i4) \
- MY_QUERYINTERFACE_ENTRY(i5) \
- MY_QUERYINTERFACE_ENTRY(i6) \
- MY_QUERYINTERFACE_ENTRY(i7) \
- )
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyException.h b/src/libs/7zip/win/CPP/Common/MyException.h
deleted file mode 100644
index f0ad11158..000000000
--- a/src/libs/7zip/win/CPP/Common/MyException.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Common/Exception.h
-
-#ifndef __COMMON_EXCEPTION_H
-#define __COMMON_EXCEPTION_H
-
-#include "MyWindows.h"
-
-struct CSystemException
-{
- HRESULT ErrorCode;
- CSystemException(HRESULT errorCode): ErrorCode(errorCode) {}
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyGuidDef.h b/src/libs/7zip/win/CPP/Common/MyGuidDef.h
deleted file mode 100644
index 68745870e..000000000
--- a/src/libs/7zip/win/CPP/Common/MyGuidDef.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Common/MyGuidDef.h
-
-#ifndef GUID_DEFINED
-#define GUID_DEFINED
-
-#include "MyTypes.h"
-
-typedef struct {
- UInt32 Data1;
- UInt16 Data2;
- UInt16 Data3;
- unsigned char Data4[8];
-} GUID;
-
-#ifdef __cplusplus
-#define REFGUID const GUID &
-#else
-#define REFGUID const GUID *
-#endif
-
-#define REFCLSID REFGUID
-#define REFIID REFGUID
-
-#ifdef __cplusplus
-inline int operator==(REFGUID g1, REFGUID g2)
-{
- for (int i = 0; i < (int)sizeof(g1); i++)
- if (((unsigned char *)&g1)[i] != ((unsigned char *)&g2)[i])
- return 0;
- return 1;
-}
-inline int operator!=(REFGUID g1, REFGUID g2) { return !(g1 == g2); }
-#endif
-
-#ifdef __cplusplus
- #define MY_EXTERN_C extern "C"
-#else
- #define MY_EXTERN_C extern
-#endif
-
-#endif
-
-
-#ifdef DEFINE_GUID
-#undef DEFINE_GUID
-#endif
-
-#ifdef INITGUID
- #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
- MY_EXTERN_C const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
-#else
- #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
- MY_EXTERN_C const GUID name
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyInitGuid.h b/src/libs/7zip/win/CPP/Common/MyInitGuid.h
deleted file mode 100644
index 279fba5d6..000000000
--- a/src/libs/7zip/win/CPP/Common/MyInitGuid.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Common/MyInitGuid.h
-
-#ifndef __COMMON_MY_INITGUID_H
-#define __COMMON_MY_INITGUID_H
-
-/*
-This file must be included only to one C++ file in project before
-declarations of COM interfaces with DEFINE_GUID macro.
-
-Each GUID must be initialized exactly once in project.
-There are two different versions of the DEFINE_GUID macro in guiddef.h (MyGuidDef.h):
- - if INITGUID is not defined: DEFINE_GUID declares an external reference to the symbol name.
- - if INITGUID is defined: DEFINE_GUID initializes the symbol name to the value of the GUID.
-
-Also we need IID_IUnknown that is initialized in some file for linking:
- MSVC: by default the linker uses some lib file that contains IID_IUnknown
- MinGW: add -luuid switch for linker
- WinCE: we define IID_IUnknown in this file
- Other: we define IID_IUnknown in this file
-*/
-
-#ifdef _WIN32
-
-#ifdef UNDER_CE
-#include <basetyps.h>
-#endif
-
-#include <initguid.h>
-
-#ifdef UNDER_CE
-DEFINE_GUID(IID_IUnknown,
-0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
-#endif
-
-#else
-
-#define INITGUID
-#include "MyGuidDef.h"
-DEFINE_GUID(IID_IUnknown,
-0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
-
-#endif
-
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyString.cpp b/src/libs/7zip/win/CPP/Common/MyString.cpp
deleted file mode 100644
index 6fbfa334b..000000000
--- a/src/libs/7zip/win/CPP/Common/MyString.cpp
+++ /dev/null
@@ -1,1215 +0,0 @@
-// Common/MyString.cpp
-
-#include "StdAfx.h"
-
-#ifdef _WIN32
-#include <windows.h>
-#include <wchar.h>
-#else
-#include <ctype.h>
-#endif
-
-#if !defined(_UNICODE) || !defined(USE_UNICODE_FSTRING)
-#include "StringConvert.h"
-#endif
-
-#include "MyString.h"
-
-#define MY_STRING_NEW(_T_, _size_) new _T_[_size_]
-// #define MY_STRING_NEW(_T_, _size_) ((_T_ *)my_new((size_t)(_size_) * sizeof(_T_)))
-
-/*
-inline const char* MyStringGetNextCharPointer(const char *p) throw()
-{
- #if defined(_WIN32) && !defined(UNDER_CE)
- return CharNextA(p);
- #else
- return p + 1;
- #endif
-}
-*/
-
-int FindCharPosInString(const char *s, char c) throw()
-{
- for (const char *p = s;; p++)
- {
- if (*p == c)
- return (int)(p - s);
- if (*p == 0)
- return -1;
- // MyStringGetNextCharPointer(p);
- }
-}
-
-int FindCharPosInString(const wchar_t *s, wchar_t c) throw()
-{
- for (const wchar_t *p = s;; p++)
- {
- if (*p == c)
- return (int)(p - s);
- if (*p == 0)
- return -1;
- }
-}
-
-/*
-void MyStringUpper_Ascii(wchar_t *s)
-{
- for (;;)
- {
- wchar_t c = *s;
- if (c == 0)
- return;
- *s++ = MyCharUpper_Ascii(c);
- }
-}
-*/
-
-void MyStringLower_Ascii(wchar_t *s) throw()
-{
- for (;;)
- {
- wchar_t c = *s;
- if (c == 0)
- return;
- *s++ = MyCharLower_Ascii(c);
- }
-}
-
-#ifdef _WIN32
-
-#ifdef _UNICODE
-
-// wchar_t * MyStringUpper(wchar_t *s) { return CharUpperW(s); }
-// wchar_t * MyStringLower(wchar_t *s) { return CharLowerW(s); }
-// for WinCE - FString - char
-// const char *MyStringGetPrevCharPointer(const char * /* base */, const char *p) { return p - 1; }
-
-#else
-
-// const char * MyStringGetPrevCharPointer(const char *base, const char *p) throw() { return CharPrevA(base, p); }
-// char * MyStringUpper(char *s) { return CharUpperA(s); }
-// char * MyStringLower(char *s) { return CharLowerA(s); }
-
-wchar_t MyCharUpper_WIN(wchar_t c) throw()
-{
- wchar_t *res = CharUpperW((LPWSTR)(UINT_PTR)(unsigned)c);
- if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
- return (wchar_t)(unsigned)(UINT_PTR)res;
- const int kBufSize = 4;
- char s[kBufSize + 1];
- int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufSize, 0, 0);
- if (numChars == 0 || numChars > kBufSize)
- return c;
- s[numChars] = 0;
- ::CharUpperA(s);
- ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1);
- return c;
-}
-
-/*
-wchar_t MyCharLower_WIN(wchar_t c)
-{
- wchar_t *res = CharLowerW((LPWSTR)(UINT_PTR)(unsigned)c);
- if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
- return (wchar_t)(unsigned)(UINT_PTR)res;
- const int kBufSize = 4;
- char s[kBufSize + 1];
- int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufSize, 0, 0);
- if (numChars == 0 || numChars > kBufSize)
- return c;
- s[numChars] = 0;
- ::CharLowerA(s);
- ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1);
- return c;
-}
-*/
-
-/*
-wchar_t * MyStringUpper(wchar_t *s)
-{
- if (s == 0)
- return 0;
- wchar_t *res = CharUpperW(s);
- if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
- return res;
- AString a = UnicodeStringToMultiByte(s);
- a.MakeUpper();
- MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a));
- return s;
-}
-*/
-
-/*
-wchar_t * MyStringLower(wchar_t *s)
-{
- if (s == 0)
- return 0;
- wchar_t *res = CharLowerW(s);
- if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
- return res;
- AString a = UnicodeStringToMultiByte(s);
- a.MakeLower();
- MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a));
- return s;
-}
-*/
-
-#endif
-
-#endif
-
-bool IsString1PrefixedByString2(const char *s1, const char *s2) throw()
-{
- for (;;)
- {
- unsigned char c2 = (unsigned char)*s2++; if (c2 == 0) return true;
- unsigned char c1 = (unsigned char)*s1++; if (c1 != c2) return false;
- }
-}
-
-bool StringsAreEqualNoCase(const wchar_t *s1, const wchar_t *s2) throw()
-{
- for (;;)
- {
- wchar_t c1 = *s1++;
- wchar_t c2 = *s2++;
- if (c1 != c2 && MyCharUpper(c1) != MyCharUpper(c2)) return false;
- if (c1 == 0) return true;
- }
-}
-
-// ---------- ASCII ----------
-
-bool AString::IsPrefixedBy_Ascii_NoCase(const char *s) const throw()
-{
- const char *s1 = _chars;
- for (;;)
- {
- char c2 = *s++;
- if (c2 == 0)
- return true;
- char c1 = *s1++;
- if (MyCharLower_Ascii(c1) !=
- MyCharLower_Ascii(c2))
- return false;
- }
-}
-
-bool UString::IsPrefixedBy_Ascii_NoCase(const char *s) const throw()
-{
- const wchar_t *s1 = _chars;
- for (;;)
- {
- char c2 = *s++;
- if (c2 == 0)
- return true;
- wchar_t c1 = *s1++;
- if (MyCharLower_Ascii(c1) != (unsigned char)MyCharLower_Ascii(c2))
- return false;
- }
-}
-
-bool StringsAreEqual_Ascii(const wchar_t *u, const char *a) throw()
-{
- for (;;)
- {
- unsigned char c = *a;
- if (c != *u)
- return false;
- if (c == 0)
- return true;
- a++;
- u++;
- }
-}
-
-bool StringsAreEqualNoCase_Ascii(const char *s1, const char *s2) throw()
-{
- for (;;)
- {
- char c1 = *s1++;
- char c2 = *s2++;
- if (c1 != c2 && MyCharLower_Ascii(c1) != MyCharLower_Ascii(c2))
- return false;
- if (c1 == 0)
- return true;
- }
-}
-
-bool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const wchar_t *s2) throw()
-{
- for (;;)
- {
- wchar_t c1 = *s1++;
- wchar_t c2 = *s2++;
- if (c1 != c2 && MyCharLower_Ascii(c1) != MyCharLower_Ascii(c2))
- return false;
- if (c1 == 0)
- return true;
- }
-}
-
-bool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const char *s2) throw()
-{
- for (;;)
- {
- wchar_t c1 = *s1++;
- char c2 = *s2++;
- if (c1 != (unsigned char)c2 && (c1 > 0x7F || MyCharLower_Ascii(c1) != (unsigned char)MyCharLower_Ascii(c2)))
- return false;
- if (c1 == 0)
- return true;
- }
-}
-
-bool IsString1PrefixedByString2(const wchar_t *s1, const wchar_t *s2) throw()
-{
- for (;;)
- {
- wchar_t c2 = *s2++; if (c2 == 0) return true;
- wchar_t c1 = *s1++; if (c1 != c2) return false;
- }
-}
-
-// NTFS order: uses upper case
-int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2) throw()
-{
- for (;;)
- {
- wchar_t c1 = *s1++;
- wchar_t c2 = *s2++;
- if (c1 != c2)
- {
- wchar_t u1 = MyCharUpper(c1);
- wchar_t u2 = MyCharUpper(c2);
- if (u1 < u2) return -1;
- if (u1 > u2) return 1;
- }
- if (c1 == 0) return 0;
- }
-}
-
-int MyStringCompareNoCase_N(const wchar_t *s1, const wchar_t *s2, unsigned num) throw()
-{
- for (; num != 0; num--)
- {
- wchar_t c1 = *s1++;
- wchar_t c2 = *s2++;
- if (c1 != c2)
- {
- wchar_t u1 = MyCharUpper(c1);
- wchar_t u2 = MyCharUpper(c2);
- if (u1 < u2) return -1;
- if (u1 > u2) return 1;
- }
- if (c1 == 0) return 0;
- }
- return 0;
-}
-
-
-// ---------- AString ----------
-
-void AString::InsertSpace(unsigned &index, unsigned size)
-{
- Grow(size);
- MoveItems(index + size, index);
-}
-
-void AString::ReAlloc(unsigned newLimit)
-{
- if (newLimit < _len || newLimit >= 0x20000000) throw 20130220;
- // MY_STRING_REALLOC(_chars, char, newLimit + 1, _len + 1);
- char *newBuf = MY_STRING_NEW(char, newLimit + 1);
- memcpy(newBuf, _chars, (size_t)(_len + 1)); \
- MY_STRING_DELETE(_chars);
- _chars = newBuf;
-
- _limit = newLimit;
-}
-
-void AString::SetStartLen(unsigned len)
-{
- _chars = 0;
- _chars = MY_STRING_NEW(char, len + 1);
- _len = len;
- _limit = len;
-}
-
-void AString::Grow_1()
-{
- unsigned next = _len;
- next += next / 2;
- next += 16;
- next &= ~(unsigned)15;
- ReAlloc(next - 1);
-}
-
-void AString::Grow(unsigned n)
-{
- unsigned freeSize = _limit - _len;
- if (n <= freeSize)
- return;
-
- unsigned next = _len + n;
- next += next / 2;
- next += 16;
- next &= ~(unsigned)15;
- ReAlloc(next - 1);
-}
-
-/*
-AString::AString(unsigned num, const char *s)
-{
- unsigned len = MyStringLen(s);
- if (num > len)
- num = len;
- SetStartLen(num);
- memcpy(_chars, s, num);
- _chars[num] = 0;
-}
-*/
-
-AString::AString(unsigned num, const AString &s)
-{
- if (num > s._len)
- num = s._len;
- SetStartLen(num);
- memcpy(_chars, s._chars, num);
- _chars[num] = 0;
-}
-
-AString::AString(const AString &s, char c)
-{
- SetStartLen(s.Len() + 1);
- char *chars = _chars;
- unsigned len = s.Len();
- memcpy(chars, s, len);
- chars[len] = c;
- chars[len + 1] = 0;
-}
-
-AString::AString(const char *s1, unsigned num1, const char *s2, unsigned num2)
-{
- SetStartLen(num1 + num2);
- char *chars = _chars;
- memcpy(chars, s1, num1);
- memcpy(chars + num1, s2, num2 + 1);
-}
-
-AString operator+(const AString &s1, const AString &s2) { return AString(s1, s1.Len(), s2, s2.Len()); }
-AString operator+(const AString &s1, const char *s2) { return AString(s1, s1.Len(), s2, MyStringLen(s2)); }
-AString operator+(const char *s1, const AString &s2) { return AString(s1, MyStringLen(s1), s2, s2.Len()); }
-
-AString::AString()
-{
- _chars = 0;
- _chars = MY_STRING_NEW(char, 4);
- _len = 0;
- _limit = 4 - 1;
- _chars[0] = 0;
-}
-
-AString::AString(char c)
-{
- SetStartLen(1);
- _chars[0] = c;
- _chars[1] = 0;
-}
-
-AString::AString(const char *s)
-{
- SetStartLen(MyStringLen(s));
- MyStringCopy(_chars, s);
-}
-
-AString::AString(const AString &s)
-{
- SetStartLen(s._len);
- MyStringCopy(_chars, s._chars);
-}
-
-AString &AString::operator=(char c)
-{
- if (1 > _limit)
- {
- char *newBuf = MY_STRING_NEW(char, 1 + 1);
- MY_STRING_DELETE(_chars);
- _chars = newBuf;
- _limit = 1;
- }
- _len = 1;
- _chars[0] = c;
- _chars[1] = 0;
- return *this;
-}
-
-AString &AString::operator=(const char *s)
-{
- unsigned len = MyStringLen(s);
- if (len > _limit)
- {
- char *newBuf = MY_STRING_NEW(char, len + 1);
- MY_STRING_DELETE(_chars);
- _chars = newBuf;
- _limit = len;
- }
- _len = len;
- MyStringCopy(_chars, s);
- return *this;
-}
-
-AString &AString::operator=(const AString &s)
-{
- if (&s == this)
- return *this;
- unsigned len = s._len;
- if (len > _limit)
- {
- char *newBuf = MY_STRING_NEW(char, len + 1);
- MY_STRING_DELETE(_chars);
- _chars = newBuf;
- _limit = len;
- }
- _len = len;
- MyStringCopy(_chars, s._chars);
- return *this;
-}
-
-AString &AString::operator+=(const char *s)
-{
- unsigned len = MyStringLen(s);
- Grow(len);
- MyStringCopy(_chars + _len, s);
- _len += len;
- return *this;
-}
-
-AString &AString::operator+=(const AString &s)
-{
- Grow(s._len);
- MyStringCopy(_chars + _len, s._chars);
- _len += s._len;
- return *this;
-}
-
-void AString::SetFrom(const char *s, unsigned len) // no check
-{
- if (len > _limit)
- {
- char *newBuf = MY_STRING_NEW(char, len + 1);
- MY_STRING_DELETE(_chars);
- _chars = newBuf;
- _limit = len;
- }
- memcpy(_chars, s, len);
- _chars[len] = 0;
- _len = len;
-}
-
-int AString::Find(const AString &s, unsigned startIndex) const throw()
-{
- if (s.IsEmpty())
- return startIndex;
- for (; startIndex < _len; startIndex++)
- {
- unsigned j;
- for (j = 0; j < s._len && startIndex + j < _len; j++)
- if (_chars[startIndex + j] != s._chars[j])
- break;
- if (j == s._len)
- return (int)startIndex;
- }
- return -1;
-}
-
-int AString::ReverseFind(char c) const throw()
-{
- if (_len == 0)
- return -1;
- const char *p = _chars + _len - 1;
- for (;;)
- {
- if (*p == c)
- return (int)(p - _chars);
- if (p == _chars)
- return -1;
- p--; // p = GetPrevCharPointer(_chars, p);
- }
-}
-
-void AString::TrimLeft() throw()
-{
- const char *p = _chars;
- for (;; p++)
- {
- char c = *p;
- if (c != ' ' && c != '\n' && c != '\t')
- break;
- }
- unsigned pos = (unsigned)(p - _chars);
- if (pos != 0)
- {
- MoveItems(0, pos);
- _len -= pos;
- }
-}
-
-void AString::TrimRight() throw()
-{
- const char *p = _chars;
- int i;
- for (i = _len - 1; i >= 0; i--)
- {
- char c = p[i];
- if (c != ' ' && c != '\n' && c != '\t')
- break;
- }
- i++;
- if ((unsigned)i != _len)
- {
- _chars[i] = 0;
- _len = i;
- }
-}
-
-void AString::InsertAtFront(char c)
-{
- if (_limit == _len)
- Grow_1();
- MoveItems(1, 0);
- _chars[0] = c;
- _len++;
-}
-
-/*
-void AString::Insert(unsigned index, char c)
-{
- InsertSpace(index, 1);
- _chars[index] = c;
- _len++;
-}
-*/
-
-void AString::Insert(unsigned index, const char *s)
-{
- unsigned num = MyStringLen(s);
- if (num != 0)
- {
- InsertSpace(index, num);
- memcpy(_chars + index, s, num);
- _len += num;
- }
-}
-
-void AString::Insert(unsigned index, const AString &s)
-{
- unsigned num = s.Len();
- if (num != 0)
- {
- InsertSpace(index, num);
- memcpy(_chars + index, s, num);
- _len += num;
- }
-}
-
-void AString::RemoveChar(char ch) throw()
-{
- int pos = Find(ch);
- if (pos < 0)
- return;
- const char *src = _chars;
- char *dest = _chars + pos;
- pos++;
- unsigned len = _len;
- for (; (unsigned)pos < len; pos++)
- {
- char c = src[(unsigned)pos];
- if (c != ch)
- *dest++ = c;
- }
- *dest = 0;
- _len = (unsigned)(dest - _chars);
-}
-
-// !!!!!!!!!!!!!!! test it if newChar = '\0'
-void AString::Replace(char oldChar, char newChar) throw()
-{
- if (oldChar == newChar)
- return; // 0;
- // unsigned number = 0;
- int pos = 0;
- while ((unsigned)pos < _len)
- {
- pos = Find(oldChar, pos);
- if (pos < 0)
- break;
- _chars[pos] = newChar;
- pos++;
- // number++;
- }
- return; // number;
-}
-
-void AString::Replace(const AString &oldString, const AString &newString)
-{
- if (oldString.IsEmpty())
- return; // 0;
- if (oldString == newString)
- return; // 0;
- unsigned oldLen = oldString.Len();
- unsigned newLen = newString.Len();
- // unsigned number = 0;
- int pos = 0;
- while ((unsigned)pos < _len)
- {
- pos = Find(oldString, pos);
- if (pos < 0)
- break;
- Delete(pos, oldLen);
- Insert(pos, newString);
- pos += newLen;
- // number++;
- }
- // return number;
-}
-
-void AString::Delete(unsigned index) throw()
-{
- MoveItems(index, index + 1);
- _len--;
-}
-
-void AString::Delete(unsigned index, unsigned count) throw()
-{
- if (index + count > _len)
- count = _len - index;
- if (count > 0)
- {
- MoveItems(index, index + count);
- _len -= count;
- }
-}
-
-void AString::DeleteFrontal(unsigned num) throw()
-{
- if (num != 0)
- {
- MoveItems(0, num);
- _len -= num;
- }
-}
-
-/*
-AString operator+(const AString &s1, const AString &s2)
-{
- AString result(s1);
- result += s2;
- return result;
-}
-
-AString operator+(const AString &s, const char *chars)
-{
- AString result(s);
- result += chars;
- return result;
-}
-
-AString operator+(const char *chars, const AString &s)
-{
- AString result(chars);
- result += s;
- return result;
-}
-
-AString operator+(const AString &s, char c)
-{
- AString result(s);
- result += c;
- return result;
-}
-*/
-
-/*
-AString operator+(char c, const AString &s)
-{
- AString result(c);
- result += s;
- return result;
-}
-*/
-
-
-
-
-// ---------- UString ----------
-
-void UString::InsertSpace(unsigned index, unsigned size)
-{
- Grow(size);
- MoveItems(index + size, index);
-}
-
-void UString::ReAlloc(unsigned newLimit)
-{
- if (newLimit < _len || newLimit >= 0x20000000) throw 20130221;
- // MY_STRING_REALLOC(_chars, wchar_t, newLimit + 1, _len + 1);
- wchar_t *newBuf = MY_STRING_NEW(wchar_t, newLimit + 1);
- wmemcpy(newBuf, _chars, _len + 1);
- MY_STRING_DELETE(_chars);
- _chars = newBuf;
-
- _limit = newLimit;
-}
-
-void UString::SetStartLen(unsigned len)
-{
- _chars = 0;
- _chars = MY_STRING_NEW(wchar_t, len + 1);
- _len = len;
- _limit = len;
-}
-
-void UString::Grow_1()
-{
- unsigned next = _len;
- next += next / 2;
- next += 16;
- next &= ~(unsigned)15;
- ReAlloc(next - 1);
-}
-
-void UString::Grow(unsigned n)
-{
- unsigned freeSize = _limit - _len;
- if (n <= freeSize)
- return;
-
- unsigned next = _len + n;
- next += next / 2;
- next += 16;
- next &= ~(unsigned)15;
- ReAlloc(next - 1);
-}
-
-
-UString::UString(unsigned num, const wchar_t *s)
-{
- unsigned len = MyStringLen(s);
- if (num > len)
- num = len;
- SetStartLen(num);
- wmemcpy(_chars, s, num);
- _chars[num] = 0;
-}
-
-
-UString::UString(unsigned num, const UString &s)
-{
- if (num > s._len)
- num = s._len;
- SetStartLen(num);
- wmemcpy(_chars, s._chars, num);
- _chars[num] = 0;
-}
-
-UString::UString(const UString &s, wchar_t c)
-{
- SetStartLen(s.Len() + 1);
- wchar_t *chars = _chars;
- unsigned len = s.Len();
- wmemcpy(chars, s, len);
- chars[len] = c;
- chars[len + 1] = 0;
-}
-
-UString::UString(const wchar_t *s1, unsigned num1, const wchar_t *s2, unsigned num2)
-{
- SetStartLen(num1 + num2);
- wchar_t *chars = _chars;
- wmemcpy(chars, s1, num1);
- wmemcpy(chars + num1, s2, num2 + 1);
-}
-
-UString operator+(const UString &s1, const UString &s2) { return UString(s1, s1.Len(), s2, s2.Len()); }
-UString operator+(const UString &s1, const wchar_t *s2) { return UString(s1, s1.Len(), s2, MyStringLen(s2)); }
-UString operator+(const wchar_t *s1, const UString &s2) { return UString(s1, MyStringLen(s1), s2, s2.Len()); }
-
-UString::UString()
-{
- _chars = 0;
- _chars = MY_STRING_NEW(wchar_t, 4);
- _len = 0;
- _limit = 4 - 1;
- _chars[0] = 0;
-}
-
-UString::UString(wchar_t c)
-{
- SetStartLen(1);
- _chars[0] = c;
- _chars[1] = 0;
-}
-
-UString::UString(const wchar_t *s)
-{
- SetStartLen(MyStringLen(s));
- MyStringCopy(_chars, s);
-}
-
-UString::UString(const UString &s)
-{
- SetStartLen(s._len);
- MyStringCopy(_chars, s._chars);
-}
-
-UString &UString::operator=(wchar_t c)
-{
- if (1 > _limit)
- {
- wchar_t *newBuf = MY_STRING_NEW(wchar_t, 1 + 1);
- MY_STRING_DELETE(_chars);
- _chars = newBuf;
- _limit = 1;
- }
- _len = 1;
- _chars[0] = c;
- _chars[1] = 0;
- return *this;
-}
-
-UString &UString::operator=(const wchar_t *s)
-{
- unsigned len = MyStringLen(s);
- if (len > _limit)
- {
- wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1);
- MY_STRING_DELETE(_chars);
- _chars = newBuf;
- _limit = len;
- }
- _len = len;
- MyStringCopy(_chars, s);
- return *this;
-}
-
-UString &UString::operator=(const UString &s)
-{
- if (&s == this)
- return *this;
- unsigned len = s._len;
- if (len > _limit)
- {
- wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1);
- MY_STRING_DELETE(_chars);
- _chars = newBuf;
- _limit = len;
- }
- _len = len;
- MyStringCopy(_chars, s._chars);
- return *this;
-}
-
-UString &UString::operator+=(const wchar_t *s)
-{
- unsigned len = MyStringLen(s);
- Grow(len);
- MyStringCopy(_chars + _len, s);
- _len += len;
- return *this;
-}
-
-UString &UString::operator+=(const UString &s)
-{
- Grow(s._len);
- MyStringCopy(_chars + _len, s._chars);
- _len += s._len;
- return *this;
-}
-
-void UString::SetFrom(const wchar_t *s, unsigned len) // no check
-{
- if (len > _limit)
- {
- wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1);
- MY_STRING_DELETE(_chars);
- _chars = newBuf;
- _limit = len;
- }
- wmemcpy(_chars, s, len);
- _chars[len] = 0;
- _len = len;
-}
-
-void UString::SetFromAscii(const char *s)
-{
- unsigned len = MyStringLen(s);
- if (len > _limit)
- {
- wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1);
- MY_STRING_DELETE(_chars);
- _chars = newBuf;
- _limit = len;
- }
- wchar_t *chars = _chars;
- for (unsigned i = 0; i < len; i++)
- chars[i] = s[i];
- chars[len] = 0;
- _len = len;
-}
-
-void UString::AddAsciiStr(const char *s)
-{
- unsigned len = MyStringLen(s);
- Grow(len);
- wchar_t *chars = _chars + _len;
- for (unsigned i = 0; i < len; i++)
- chars[i] = s[i];
- chars[len] = 0;
- _len += len;
-}
-
-
-
-int UString::Find(const UString &s, unsigned startIndex) const throw()
-{
- if (s.IsEmpty())
- return startIndex;
- for (; startIndex < _len; startIndex++)
- {
- unsigned j;
- for (j = 0; j < s._len && startIndex + j < _len; j++)
- if (_chars[startIndex + j] != s._chars[j])
- break;
- if (j == s._len)
- return (int)startIndex;
- }
- return -1;
-}
-
-int UString::ReverseFind(wchar_t c) const throw()
-{
- if (_len == 0)
- return -1;
- const wchar_t *p = _chars + _len - 1;
- for (;;)
- {
- if (*p == c)
- return (int)(p - _chars);
- if (p == _chars)
- return -1;
- p--;
- }
-}
-
-void UString::TrimLeft() throw()
-{
- const wchar_t *p = _chars;
- for (;; p++)
- {
- wchar_t c = *p;
- if (c != ' ' && c != '\n' && c != '\t')
- break;
- }
- unsigned pos = (unsigned)(p - _chars);
- if (pos != 0)
- {
- MoveItems(0, pos);
- _len -= pos;
- }
-}
-
-void UString::TrimRight() throw()
-{
- const wchar_t *p = _chars;
- int i;
- for (i = _len - 1; i >= 0; i--)
- {
- wchar_t c = p[i];
- if (c != ' ' && c != '\n' && c != '\t')
- break;
- }
- i++;
- if ((unsigned)i != _len)
- {
- _chars[i] = 0;
- _len = i;
- }
-}
-
-void UString::InsertAtFront(wchar_t c)
-{
- if (_limit == _len)
- Grow_1();
- MoveItems(1, 0);
- _chars[0] = c;
- _len++;
-}
-
-/*
-void UString::Insert(unsigned index, wchar_t c)
-{
- InsertSpace(index, 1);
- _chars[index] = c;
- _len++;
-}
-*/
-
-void UString::Insert(unsigned index, const wchar_t *s)
-{
- unsigned num = MyStringLen(s);
- if (num != 0)
- {
- InsertSpace(index, num);
- wmemcpy(_chars + index, s, num);
- _len += num;
- }
-}
-
-void UString::Insert(unsigned index, const UString &s)
-{
- unsigned num = s.Len();
- if (num != 0)
- {
- InsertSpace(index, num);
- wmemcpy(_chars + index, s, num);
- _len += num;
- }
-}
-
-void UString::RemoveChar(wchar_t ch) throw()
-{
- int pos = Find(ch);
- if (pos < 0)
- return;
- const wchar_t *src = _chars;
- wchar_t *dest = _chars + pos;
- pos++;
- unsigned len = _len;
- for (; (unsigned)pos < len; pos++)
- {
- wchar_t c = src[(unsigned)pos];
- if (c != ch)
- *dest++ = c;
- }
- *dest = 0;
- _len = (unsigned)(dest - _chars);
-}
-
-// !!!!!!!!!!!!!!! test it if newChar = '\0'
-void UString::Replace(wchar_t oldChar, wchar_t newChar) throw()
-{
- if (oldChar == newChar)
- return; // 0;
- // unsigned number = 0;
- int pos = 0;
- while ((unsigned)pos < _len)
- {
- pos = Find(oldChar, pos);
- if (pos < 0)
- break;
- _chars[pos] = newChar;
- pos++;
- // number++;
- }
- return; // number;
-}
-
-void UString::Replace(const UString &oldString, const UString &newString)
-{
- if (oldString.IsEmpty())
- return; // 0;
- if (oldString == newString)
- return; // 0;
- unsigned oldLen = oldString.Len();
- unsigned newLen = newString.Len();
- // unsigned number = 0;
- int pos = 0;
- while ((unsigned)pos < _len)
- {
- pos = Find(oldString, pos);
- if (pos < 0)
- break;
- Delete(pos, oldLen);
- Insert(pos, newString);
- pos += newLen;
- // number++;
- }
- // return number;
-}
-
-void UString::Delete(unsigned index) throw()
-{
- MoveItems(index, index + 1);
- _len--;
-}
-
-void UString::Delete(unsigned index, unsigned count) throw()
-{
- if (index + count > _len)
- count = _len - index;
- if (count > 0)
- {
- MoveItems(index, index + count);
- _len -= count;
- }
-}
-
-void UString::DeleteFrontal(unsigned num) throw()
-{
- if (num != 0)
- {
- MoveItems(0, num);
- _len -= num;
- }
-}
-
-
-// ----------------------------------------
-
-/*
-int MyStringCompareNoCase(const char *s1, const char *s2)
-{
- return MyStringCompareNoCase(MultiByteToUnicodeString(s1), MultiByteToUnicodeString(s2));
-}
-*/
-
-static inline UINT GetCurrentCodePage()
-{
- #if defined(UNDER_CE) || !defined(_WIN32)
- return CP_ACP;
- #else
- return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP;
- #endif
-}
-
-#ifdef USE_UNICODE_FSTRING
-
-#ifndef _UNICODE
-
-AString fs2fas(CFSTR s)
-{
- return UnicodeStringToMultiByte(s, GetCurrentCodePage());
-}
-
-FString fas2fs(const AString &s)
-{
- return MultiByteToUnicodeString(s, GetCurrentCodePage());
-}
-
-#endif
-
-#else
-
-UString fs2us(const FString &s)
-{
- return MultiByteToUnicodeString((AString)s, GetCurrentCodePage());
-}
-
-FString us2fs(const wchar_t *s)
-{
- return UnicodeStringToMultiByte(s, GetCurrentCodePage());
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyString.h b/src/libs/7zip/win/CPP/Common/MyString.h
deleted file mode 100644
index 8417815cf..000000000
--- a/src/libs/7zip/win/CPP/Common/MyString.h
+++ /dev/null
@@ -1,525 +0,0 @@
-// Common/String.h
-
-#ifndef __COMMON_STRING_H
-#define __COMMON_STRING_H
-
-#include <string.h>
-
-#ifndef _WIN32
-#include <wctype.h>
-#include <wchar.h>
-#endif
-
-#include "MyTypes.h"
-#include "MyVector.h"
-
-inline unsigned MyStringLen(const char *s)
-{
- unsigned i;
- for (i = 0; s[i] != 0; i++);
- return i;
-}
-
-inline void MyStringCopy(char *dest, const char *src)
-{
- while ((*dest++ = *src++) != 0);
-}
-
-inline char *MyStpCpy(char *dest, const char *src)
-{
- for (;;)
- {
- char c = *src;
- *dest = c;
- if (c == 0)
- return dest;
- src++;
- dest++;
- }
-}
-
-inline unsigned MyStringLen(const wchar_t *s)
-{
- unsigned i;
- for (i = 0; s[i] != 0; i++);
- return i;
-}
-
-inline void MyStringCopy(wchar_t *dest, const wchar_t *src)
-{
- while ((*dest++ = *src++) != 0);
-}
-
-int FindCharPosInString(const char *s, char c) throw();
-int FindCharPosInString(const wchar_t *s, wchar_t c) throw();
-
-#ifdef _WIN32
- #ifndef _UNICODE
- #define STRING_UNICODE_THROW
- #endif
-#endif
-
-#ifndef STRING_UNICODE_THROW
- #define STRING_UNICODE_THROW throw()
-#endif
-
-/*
-inline char MyCharUpper_Ascii(char c)
-{
- if (c >= 'a' && c <= 'z')
- return (char)(c - 0x20);
- return c;
-}
-inline wchar_t MyCharUpper_Ascii(wchar_t c)
-{
- if (c >= 'a' && c <= 'z')
- return (wchar_t)(c - 0x20);
- return c;
-}
-*/
-
-inline char MyCharLower_Ascii(char c)
-{
- if (c >= 'A' && c <= 'Z')
- return (char)(c + 0x20);
- return c;
-}
-
-inline wchar_t MyCharLower_Ascii(wchar_t c)
-{
- if (c >= 'A' && c <= 'Z')
- return (wchar_t)(c + 0x20);
- return c;
-}
-
-wchar_t MyCharUpper_WIN(wchar_t c) throw();
-
-inline wchar_t MyCharUpper(wchar_t c) throw()
-{
- if (c < 'a') return c;
- if (c <= 'z') return (wchar_t)(c - 0x20);
- if (c <= 0x7F) return c;
- #ifdef _WIN32
- #ifdef _UNICODE
- return (wchar_t)(unsigned)(UINT_PTR)CharUpperW((LPWSTR)(UINT_PTR)(unsigned)c);
- #else
- return (wchar_t)MyCharUpper_WIN(c);
- #endif
- #else
- return (wchar_t)towupper(c);
- #endif
-}
-
-/*
-wchar_t MyCharLower_WIN(wchar_t c) throw();
-
-inline wchar_t MyCharLower(wchar_t c) throw()
-{
- if (c < 'A') return c;
- if (c <= 'Z') return (wchar_t)(c + 0x20);
- if (c <= 0x7F) return c;
- #ifdef _WIN32
- #ifdef _UNICODE
- return (wchar_t)(unsigned)(UINT_PTR)CharLowerW((LPWSTR)(UINT_PTR)(unsigned)c);
- #else
- return (wchar_t)MyCharLower_WIN(c);
- #endif
- #else
- return (wchar_t)tolower(c);
- #endif
-}
-*/
-
-// char *MyStringUpper(char *s) throw();
-// char *MyStringLower(char *s) throw();
-
-// void MyStringUpper_Ascii(wchar_t *s) throw();
-void MyStringLower_Ascii(wchar_t *s) throw();
-// wchar_t *MyStringUpper(wchar_t *s) STRING_UNICODE_THROW;
-// wchar_t *MyStringLower(wchar_t *s) STRING_UNICODE_THROW;
-
-bool StringsAreEqualNoCase(const wchar_t *s1, const wchar_t *s2) throw();
-
-bool IsString1PrefixedByString2(const char *s1, const char *s2) throw();
-bool IsString1PrefixedByString2(const wchar_t *s1, const wchar_t *s2) throw();
-
-int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2) throw();
-int MyStringCompareNoCase_N(const wchar_t *s1, const wchar_t *s2, unsigned num) throw();
-
-// ---------- ASCII ----------
-// char values in ASCII strings must be less then 128
-bool StringsAreEqual_Ascii(const wchar_t *u, const char *a) throw();
-bool StringsAreEqualNoCase_Ascii(const char *s1, const char *s2) throw();
-bool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const char *s2) throw();
-bool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const wchar_t *s2) throw();
-
-#define MY_STRING_DELETE(_p_) delete []_p_;
-// #define MY_STRING_DELETE(_p_) my_delete(_p_);
-
-class AString
-{
- char *_chars;
- unsigned _len;
- unsigned _limit;
-
- void MoveItems(unsigned dest, unsigned src)
- {
- memmove(_chars + dest, _chars + src, (size_t)(_len - src + 1) * sizeof(char));
- }
-
- void InsertSpace(unsigned &index, unsigned size);
-
- void ReAlloc(unsigned newLimit);
- void SetStartLen(unsigned len);
- void Grow_1();
- void Grow(unsigned n);
-
- // AString(unsigned num, const char *s);
- AString(unsigned num, const AString &s);
- AString(const AString &s, char c); // it's for String + char
- AString(const char *s1, unsigned num1, const char *s2, unsigned num2);
-
- friend AString operator+(const AString &s, char c) { return AString(s, c); } ;
- // friend AString operator+(char c, const AString &s); // is not supported
-
- friend AString operator+(const AString &s1, const AString &s2);
- friend AString operator+(const AString &s1, const char *s2);
- friend AString operator+(const char *s1, const AString &s2);
-
-public:
- AString();
- AString(char c);
- AString(const char *s);
- AString(const AString &s);
- ~AString() { MY_STRING_DELETE(_chars); }
-
- unsigned Len() const { return _len; }
- bool IsEmpty() const { return _len == 0; }
- void Empty() { _len = 0; _chars[0] = 0; }
-
- operator const char *() const { return _chars; }
- const char *Ptr() const { return _chars; }
- const char *Ptr(unsigned pos) const { return _chars + pos; }
- const char *RightPtr(unsigned num) const { return _chars + _len - num; }
- char Back() const { return _chars[_len - 1]; }
-
- void ReplaceOneCharAtPos(unsigned pos, char c) { _chars[pos] = c; }
-
- // The minimum size of the character buffer in characters.
- // This value does not include space for a null terminator.
- char *GetBuffer(unsigned minBufLen)
- {
- if (minBufLen > _limit)
- ReAlloc(minBufLen);
- return _chars;
- }
- void ReleaseBuffer() { ReleaseBuffer(MyStringLen(_chars)); }
- void ReleaseBuffer(unsigned newLen) { _len = newLen; _chars[newLen] = 0; }
-
- AString &operator=(char c);
- AString &operator=(const char *s);
- AString &operator=(const AString &s);
-
- AString &operator+=(char c)
- {
- if (_limit == _len)
- Grow_1();
- unsigned len = _len;
- char *chars = _chars;
- chars[len++] = c;
- chars[len] = 0;
- _len = len;
- return *this;
- }
-
- AString &operator+=(const char *s);
- AString &operator+=(const AString &s);
-
- void SetFrom(const char *s, unsigned len); // no check
- // AString Mid(unsigned startIndex, unsigned count) const { return AString(count, _chars + startIndex); }
- AString Left(unsigned count) const { return AString(count, *this); }
-
- // void MakeUpper() { MyStringUpper(_chars); }
- // void MakeLower() { MyStringLower(_chars); }
-
-
- // int Compare(const char *s) const { return MyStringCompare(_chars, s); }
- // int Compare(const AString &s) const { return MyStringCompare(_chars, s._chars); }
- // int CompareNoCase(const char *s) const { return MyStringCompareNoCase(_chars, s); }
- // int CompareNoCase(const AString &s) const { return MyStringCompareNoCase(_chars, s._chars); }
- bool IsPrefixedBy(const char *s) const { return IsString1PrefixedByString2(_chars, s); }
- bool IsPrefixedBy_Ascii_NoCase(const char *s) const throw();
-
- int Find(char c) const { return FindCharPosInString(_chars, c); }
- int Find(char c, unsigned startIndex) const
- {
- int pos = FindCharPosInString(_chars + startIndex, c);
- return pos < 0 ? -1 : (int)startIndex + pos;
- }
- int ReverseFind(char c) const throw();
- int Find(const AString &s) const { return Find(s, 0); }
- int Find(const AString &s, unsigned startIndex) const throw();
-
- void TrimLeft() throw();
- void TrimRight() throw();
- void Trim()
- {
- TrimRight();
- TrimLeft();
- }
-
- void InsertAtFront(char c);
- // void Insert(unsigned index, char c);
- void Insert(unsigned index, const char *s);
- void Insert(unsigned index, const AString &s);
-
- void RemoveChar(char ch) throw();
- void Replace(char oldChar, char newChar) throw();
- void Replace(const AString &oldString, const AString &newString);
-
- void Delete(unsigned index) throw();
- void Delete(unsigned index, unsigned count) throw();
- void DeleteFrontal(unsigned num) throw();
- void DeleteBack() { _chars[--_len] = 0; }
- void DeleteFrom(unsigned index)
- {
- if (index < _len)
- {
- _len = index;
- _chars[index] = 0;
- }
- }
-};
-
-bool operator<(const AString &s1, const AString &s2);
-bool operator>(const AString &s1, const AString &s2);
-
-/*
-bool operator==(const AString &s1, const AString &s2);
-bool operator==(const AString &s1, const char *s2);
-bool operator==(const char *s1, const AString &s2);
-
-bool operator!=(const AString &s1, const AString &s2);
-bool operator!=(const AString &s1, const char *s2);
-bool operator!=(const char *s1, const AString &s2);
-*/
-
-inline bool operator==(const AString &s1, const AString &s2) { return s1.Len() == s2.Len() && strcmp(s1, s2) == 0; }
-inline bool operator==(const AString &s1, const char *s2) { return strcmp(s1, s2) == 0; }
-inline bool operator==(const char *s1, const AString &s2) { return strcmp(s1, s2) == 0; }
-
-inline bool operator!=(const AString &s1, const AString &s2) { return s1.Len() != s2.Len() || strcmp(s1, s2) != 0; }
-inline bool operator!=(const AString &s1, const char *s2) { return strcmp(s1, s2) != 0; }
-inline bool operator!=(const char *s1, const AString &s2) { return strcmp(s1, s2) != 0; }
-
-
-
-class UString
-{
- wchar_t *_chars;
- unsigned _len;
- unsigned _limit;
-
- void MoveItems(unsigned dest, unsigned src)
- {
- memmove(_chars + dest, _chars + src, (size_t)(_len - src + 1) * sizeof(wchar_t));
- }
-
- void InsertSpace(unsigned index, unsigned size);
-
- void ReAlloc(unsigned newLimit);
- void SetStartLen(unsigned len);
- void Grow_1();
- void Grow(unsigned n);
-
- UString(unsigned num, const wchar_t *s); // for Mid
- UString(unsigned num, const UString &s); // for Left
- UString(const UString &s, wchar_t c); // it's for String + char
- UString(const wchar_t *s1, unsigned num1, const wchar_t *s2, unsigned num2);
-
- friend UString operator+(const UString &s, wchar_t c) { return UString(s, c); } ;
- // friend UString operator+(wchar_t c, const UString &s); // is not supported
-
- friend UString operator+(const UString &s1, const UString &s2);
- friend UString operator+(const UString &s1, const wchar_t *s2);
- friend UString operator+(const wchar_t *s1, const UString &s2);
-
-public:
- UString();
- UString(wchar_t c);
- UString(const wchar_t *s);
- UString(const UString &s);
- ~UString() { MY_STRING_DELETE(_chars); }
-
- unsigned Len() const { return _len; }
- bool IsEmpty() const { return _len == 0; }
- void Empty() { _len = 0; _chars[0] = 0; }
-
- operator const wchar_t *() const { return _chars; }
- const wchar_t *Ptr() const { return _chars; }
- const wchar_t *Ptr(unsigned pos) const { return _chars + pos; }
- const wchar_t *RightPtr(unsigned num) const { return _chars + _len - num; }
- wchar_t Back() const { return _chars[_len - 1]; }
-
- void ReplaceOneCharAtPos(unsigned pos, wchar_t c) { _chars[pos] = c; }
-
- // The minimum size of the character buffer in characters.
- // This value does not include space for a null terminator.
- wchar_t *GetBuffer(unsigned minBufLen)
- {
- if (minBufLen > _limit)
- ReAlloc(minBufLen);
- return _chars;
- }
- void ReleaseBuffer() { ReleaseBuffer(MyStringLen(_chars)); }
- void ReleaseBuffer(unsigned newLen) { _len = newLen; _chars[newLen] = 0; }
-
- UString &operator=(wchar_t c);
- UString &operator=(const wchar_t *s);
- UString &operator=(const UString &s);
-
- UString &operator+=(wchar_t c)
- {
- if (_limit == _len)
- Grow_1();
- unsigned len = _len;
- wchar_t *chars = _chars;
- chars[len++] = c;
- chars[len] = 0;
- _len = len;
- return *this;
- }
-
- UString &operator+=(const wchar_t *s);
- UString &operator+=(const UString &s);
-
- void SetFrom(const wchar_t *s, unsigned len); // no check
-
- void SetFromAscii(const char *s);
- void AddAsciiStr(const char *s);
-
- UString Mid(unsigned startIndex, unsigned count) const { return UString(count, _chars + startIndex); }
- UString Left(unsigned count) const { return UString(count, *this); }
-
- // void MakeUpper() { MyStringUpper(_chars); }
- // void MakeUpper() { MyStringUpper_Ascii(_chars); }
- // void MakeUpper_Ascii() { MyStringUpper_Ascii(_chars); }
- void MakeLower_Ascii() { MyStringLower_Ascii(_chars); }
-
- bool IsEqualTo(const char *s) const { return StringsAreEqual_Ascii(_chars, s); }
- bool IsEqualToNoCase(const wchar_t *s) const { return StringsAreEqualNoCase(_chars, s); }
- int Compare(const wchar_t *s) const { return wcscmp(_chars, s); }
- // int Compare(const UString &s) const { return MyStringCompare(_chars, s._chars); }
- // int CompareNoCase(const wchar_t *s) const { return MyStringCompareNoCase(_chars, s); }
- // int CompareNoCase(const UString &s) const { return MyStringCompareNoCase(_chars, s._chars); }
- bool IsPrefixedBy(const wchar_t *s) const { return IsString1PrefixedByString2(_chars, s); };
- bool IsPrefixedBy_Ascii_NoCase(const char *s) const throw();
-
- int Find(wchar_t c) const { return FindCharPosInString(_chars, c); }
- int Find(wchar_t c, unsigned startIndex) const
- {
- int pos = FindCharPosInString(_chars + startIndex, c);
- return pos < 0 ? -1 : (int)startIndex + pos;
- }
- int Find(const UString &s) const { return Find(s, 0); }
- int Find(const UString &s, unsigned startIndex) const throw();
- int ReverseFind(wchar_t c) const throw();
-
- void TrimLeft() throw();
- void TrimRight() throw();
- void Trim()
- {
- TrimRight();
- TrimLeft();
- }
-
- void InsertAtFront(wchar_t c);
- // void Insert(unsigned index, wchar_t c);
- void Insert(unsigned index, const wchar_t *s);
- void Insert(unsigned index, const UString &s);
-
- void RemoveChar(wchar_t ch) throw();
- void Replace(wchar_t oldChar, wchar_t newChar) throw();
- void Replace(const UString &oldString, const UString &newString);
-
- void Delete(unsigned index) throw();
- void Delete(unsigned index, unsigned count) throw();
- void DeleteFrontal(unsigned num) throw();
- void DeleteBack() { _chars[--_len] = 0; }
- void DeleteFrom(unsigned index)
- {
- if (index < _len)
- {
- _len = index;
- _chars[index] = 0;
- }
- }
-};
-
-bool operator<(const UString &s1, const UString &s2);
-bool operator>(const UString &s1, const UString &s2);
-
-inline bool operator==(const UString &s1, const UString &s2) { return s1.Len() == s2.Len() && wcscmp(s1, s2) == 0; }
-inline bool operator==(const UString &s1, const wchar_t *s2) { return wcscmp(s1, s2) == 0; }
-inline bool operator==(const wchar_t *s1, const UString &s2) { return wcscmp(s1, s2) == 0; }
-
-inline bool operator!=(const UString &s1, const UString &s2) { return s1.Len() != s2.Len() || wcscmp(s1, s2) != 0; }
-inline bool operator!=(const UString &s1, const wchar_t *s2) { return wcscmp(s1, s2) != 0; }
-inline bool operator!=(const wchar_t *s1, const UString &s2) { return wcscmp(s1, s2) != 0; }
-
-
-typedef CObjectVector<AString> AStringVector;
-typedef CObjectVector<UString> UStringVector;
-
-#ifdef _UNICODE
- typedef UString CSysString;
-#else
- typedef AString CSysString;
-#endif
-
-typedef CObjectVector<CSysString> CSysStringVector;
-
-
-// ---------- FString ----------
-
-#ifdef _WIN32
- #define USE_UNICODE_FSTRING
-#endif
-
-#ifdef USE_UNICODE_FSTRING
-
- #define __FTEXT(quote) L##quote
-
- typedef wchar_t FChar;
- typedef UString FString;
-
- #define fs2us(_x_) (_x_)
- #define us2fs(_x_) (_x_)
- FString fas2fs(const AString &s);
- AString fs2fas(const FChar *s);
-
-#else
-
- #define __FTEXT(quote) quote
-
- typedef char FChar;
- typedef AString FString;
-
- UString fs2us(const FString &s);
- FString us2fs(const wchar_t *s);
- #define fas2fs(_x_) (_x_)
- #define fs2fas(_x_) (_x_)
-
-#endif
-
-#define FTEXT(quote) __FTEXT(quote)
-
-#define FCHAR_PATH_SEPARATOR FTEXT(CHAR_PATH_SEPARATOR)
-#define FSTRING_PATH_SEPARATOR FTEXT(STRING_PATH_SEPARATOR)
-#define FCHAR_ANY_MASK FTEXT('*')
-#define FSTRING_ANY_MASK FTEXT("*")
-typedef const FChar *CFSTR;
-
-typedef CObjectVector<FString> FStringVector;
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyTypes.h b/src/libs/7zip/win/CPP/Common/MyTypes.h
deleted file mode 100644
index d81788816..000000000
--- a/src/libs/7zip/win/CPP/Common/MyTypes.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Common/MyTypes.h
-
-#ifndef __COMMON_MY_TYPES_H
-#define __COMMON_MY_TYPES_H
-
-#include "../../C/7zTypes.h"
-
-typedef int HRes;
-
-struct CBoolPair
-{
- bool Val;
- bool Def;
-
- CBoolPair(): Val(false), Def(false) {}
-
- void Init()
- {
- Val = false;
- Def = false;
- }
-
- void SetTrueTrue()
- {
- Val = true;
- Def = true;
- }
-};
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyUnknown.h b/src/libs/7zip/win/CPP/Common/MyUnknown.h
deleted file mode 100644
index 8b95afd38..000000000
--- a/src/libs/7zip/win/CPP/Common/MyUnknown.h
+++ /dev/null
@@ -1,13 +0,0 @@
-// MyUnknown.h
-
-#ifndef __MY_UNKNOWN_H
-#define __MY_UNKNOWN_H
-
-#ifdef _WIN32
-#include <basetyps.h>
-#include <unknwn.h>
-#else
-#include "MyWindows.h"
-#endif
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/MyVector.h b/src/libs/7zip/win/CPP/Common/MyVector.h
deleted file mode 100644
index 7e61dec31..000000000
--- a/src/libs/7zip/win/CPP/Common/MyVector.h
+++ /dev/null
@@ -1,615 +0,0 @@
-// Common/MyVector.h
-
-#ifndef __COMMON_MY_VECTOR_H
-#define __COMMON_MY_VECTOR_H
-
-template <class T>
-class CRecordVector
-{
- T *_items;
- unsigned _size;
- unsigned _capacity;
-
- void MoveItems(unsigned destIndex, unsigned srcIndex)
- {
- memmove(_items + destIndex, _items + srcIndex, (size_t)(_size - srcIndex) * (size_t)sizeof(T));
- }
-
- void ReserveOnePosition()
- {
- if (_size == _capacity)
- {
- unsigned newCapacity = _capacity + (_capacity >> 2) + 1;
- T *p = new T[newCapacity];
- memcpy(p, _items, (size_t)_size * (size_t)sizeof(T));
- delete []_items;
- _items = p;
- _capacity = newCapacity;
- }
- }
-
-public:
-
- CRecordVector(): _items(0), _size(0), _capacity(0) {}
-
- CRecordVector(const CRecordVector &v): _items(0), _size(0), _capacity(0)
- {
- unsigned size = v.Size();
- if (size != 0)
- {
- _items = new T[size];
- _size = size;
- _capacity = size;
- memcpy(_items, v._items, (size_t)size * (size_t)sizeof(T));
- }
- }
-
- unsigned Size() const { return _size; }
- bool IsEmpty() const { return _size == 0; }
-
- void ConstructReserve(unsigned size)
- {
- if (size != 0)
- {
- _items = new T[size];
- _capacity = size;
- }
- }
-
- void Reserve(unsigned newCapacity)
- {
- if (newCapacity > _capacity)
- {
- T *p = new T[newCapacity];
- memcpy(p, _items, (size_t)_size * (size_t)sizeof(T));
- delete []_items;
- _items = p;
- _capacity = newCapacity;
- }
- }
-
- void ClearAndReserve(unsigned newCapacity)
- {
- Clear();
- if (newCapacity > _capacity)
- {
- delete []_items;
- _items = NULL;
- _capacity = 0;
- _items = new T[newCapacity];
- _capacity = newCapacity;
- }
- }
-
- void ClearAndSetSize(unsigned newSize)
- {
- ClearAndReserve(newSize);
- _size = newSize;
- }
-
- void ChangeSize_KeepData(unsigned newSize)
- {
- if (newSize > _capacity)
- {
- T *p = new T[newSize];
- memcpy(p, _items, (size_t)_size * (size_t)sizeof(T));
- delete []_items;
- _items = p;
- _capacity = newSize;
- }
- _size = newSize;
- }
-
- void ReserveDown()
- {
- if (_size == _capacity)
- return;
- T *p = NULL;
- if (_size != 0)
- {
- p = new T[_size];
- memcpy(p, _items, (size_t)_size * (size_t)sizeof(T));
- }
- delete []_items;
- _items = p;
- _capacity = _size;
- }
-
- ~CRecordVector() { delete []_items; }
-
- void ClearAndFree()
- {
- delete []_items;
- _items = NULL;
- _size = 0;
- _capacity = 0;
- }
-
- void Clear() { _size = 0; }
-
- void DeleteBack() { _size--; }
-
- void DeleteFrom(unsigned index)
- {
- // if (index <= _size)
- _size = index;
- }
-
- void DeleteFrontal(unsigned num)
- {
- if (num != 0)
- {
- MoveItems(0, num);
- _size -= num;
- }
- }
-
- void Delete(unsigned index)
- {
- MoveItems(index, index + 1);
- _size -= 1;
- }
-
- /*
- void Delete(unsigned index, unsigned num)
- {
- if (num > 0)
- {
- MoveItems(index, index + num);
- _size -= num;
- }
- }
- */
-
- CRecordVector& operator=(const CRecordVector &v)
- {
- unsigned size = v.Size();
- if (size > _capacity)
- {
- delete []_items;
- _capacity = 0;
- _size = 0;
- _items = NULL;
- _items = new T[size];
- _capacity = size;
- }
- _size = size;
- memcpy(_items, v._items, (size_t)size * (size_t)sizeof(T));
- return *this;
- }
-
- CRecordVector& operator+=(const CRecordVector &v)
- {
- unsigned size = v.Size();
- Reserve(_size + size);
- memcpy(_items + _size, v._items, (size_t)size * (size_t)sizeof(T));
- _size += size;
- return *this;
- }
-
- unsigned Add(const T item)
- {
- ReserveOnePosition();
- _items[_size] = item;
- return _size++;
- }
-
- void AddInReserved(const T item)
- {
- _items[_size++] = item;
- }
-
- void Insert(unsigned index, const T item)
- {
- ReserveOnePosition();
- MoveItems(index + 1, index);
- _items[index] = item;
- _size++;
- }
-
- void MoveToFront(unsigned index)
- {
- if (index != 0)
- {
- T temp = _items[index];
- memmove(_items + 1, _items, (size_t)index * (size_t)sizeof(T));
- _items[0] = temp;
- }
- }
-
- const T& operator[](unsigned index) const { return _items[index]; }
- T& operator[](unsigned index) { return _items[index]; }
- const T& Front() const { return _items[0]; }
- T& Front() { return _items[0]; }
- const T& Back() const { return _items[_size - 1]; }
- T& Back() { return _items[_size - 1]; }
-
- /*
- void Swap(unsigned i, unsigned j)
- {
- T temp = _items[i];
- _items[i] = _items[j];
- _items[j] = temp;
- }
- */
-
- int FindInSorted(const T item, unsigned left, unsigned right) const
- {
- while (left != right)
- {
- unsigned mid = (left + right) / 2;
- const T midVal = (*this)[mid];
- if (item == midVal)
- return mid;
- if (item < midVal)
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
- }
-
- int FindInSorted2(const T &item, unsigned left, unsigned right) const
- {
- while (left != right)
- {
- unsigned mid = (left + right) / 2;
- const T& midVal = (*this)[mid];
- int comp = item.Compare(midVal);
- if (comp == 0)
- return mid;
- if (comp < 0)
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
- }
-
- int FindInSorted(const T item) const
- {
- return FindInSorted(item, 0, _size);
- }
-
- int FindInSorted2(const T &item) const
- {
- return FindInSorted2(item, 0, _size);
- }
-
- unsigned AddToUniqueSorted(const T item)
- {
- unsigned left = 0, right = _size;
- while (left != right)
- {
- unsigned mid = (left + right) / 2;
- const T midVal = (*this)[mid];
- if (item == midVal)
- return mid;
- if (item < midVal)
- right = mid;
- else
- left = mid + 1;
- }
- Insert(right, item);
- return right;
- }
-
- unsigned AddToUniqueSorted2(const T &item)
- {
- unsigned left = 0, right = _size;
- while (left != right)
- {
- unsigned mid = (left + right) / 2;
- const T& midVal = (*this)[mid];
- int comp = item.Compare(midVal);
- if (comp == 0)
- return mid;
- if (comp < 0)
- right = mid;
- else
- left = mid + 1;
- }
- Insert(right, item);
- return right;
- }
-
- static void SortRefDown(T* p, unsigned k, unsigned size, int (*compare)(const T*, const T*, void *), void *param)
- {
- T temp = p[k];
- for (;;)
- {
- unsigned s = (k << 1);
- if (s > size)
- break;
- if (s < size && compare(p + s + 1, p + s, param) > 0)
- s++;
- if (compare(&temp, p + s, param) >= 0)
- break;
- p[k] = p[s];
- k = s;
- }
- p[k] = temp;
- }
-
- void Sort(int (*compare)(const T*, const T*, void *), void *param)
- {
- unsigned size = _size;
- if (size <= 1)
- return;
- T* p = (&Front()) - 1;
- {
- unsigned i = size >> 1;
- do
- SortRefDown(p, i, size, compare, param);
- while (--i != 0);
- }
- do
- {
- T temp = p[size];
- p[size--] = p[1];
- p[1] = temp;
- SortRefDown(p, 1, size, compare, param);
- }
- while (size > 1);
- }
-
- static void SortRefDown2(T* p, unsigned k, unsigned size)
- {
- T temp = p[k];
- for (;;)
- {
- unsigned s = (k << 1);
- if (s > size)
- break;
- if (s < size && p[s + 1].Compare(p[s]) > 0)
- s++;
- if (temp.Compare(p[s]) >= 0)
- break;
- p[k] = p[s];
- k = s;
- }
- p[k] = temp;
- }
-
- void Sort2()
- {
- unsigned size = _size;
- if (size <= 1)
- return;
- T* p = (&Front()) - 1;
- {
- unsigned i = size >> 1;
- do
- SortRefDown2(p, i, size);
- while (--i != 0);
- }
- do
- {
- T temp = p[size];
- p[size--] = p[1];
- p[1] = temp;
- SortRefDown2(p, 1, size);
- }
- while (size > 1);
- }
-};
-
-typedef CRecordVector<int> CIntVector;
-typedef CRecordVector<unsigned int> CUIntVector;
-typedef CRecordVector<bool> CBoolVector;
-typedef CRecordVector<unsigned char> CByteVector;
-typedef CRecordVector<void *> CPointerVector;
-
-template <class T>
-class CObjectVector
-{
- CPointerVector _v;
-public:
- unsigned Size() const { return _v.Size(); }
- bool IsEmpty() const { return _v.IsEmpty(); }
- void ReserveDown() { _v.ReserveDown(); }
- // void Reserve(unsigned newCapacity) { _v.Reserve(newCapacity); }
- void ClearAndReserve(unsigned newCapacity) { Clear(); _v.ClearAndReserve(newCapacity); }
-
- CObjectVector() {};
- CObjectVector(const CObjectVector &v)
- {
- unsigned size = v.Size();
- _v.ConstructReserve(size);
- for (unsigned i = 0; i < size; i++)
- _v.AddInReserved(new T(v[i]));
- }
- CObjectVector& operator=(const CObjectVector &v)
- {
- Clear();
- unsigned size = v.Size();
- _v.Reserve(size);
- for (unsigned i = 0; i < size; i++)
- _v.AddInReserved(new T(v[i]));
- return *this;
- }
-
- CObjectVector& operator+=(const CObjectVector &v)
- {
- unsigned size = v.Size();
- _v.Reserve(Size() + size);
- for (unsigned i = 0; i < size; i++)
- _v.AddInReserved(new T(v[i]));
- return *this;
- }
-
- const T& operator[](unsigned index) const { return *((T *)_v[index]); }
- T& operator[](unsigned index) { return *((T *)_v[index]); }
- const T& Front() const { return operator[](0); }
- T& Front() { return operator[](0); }
- const T& Back() const { return operator[](_v.Size() - 1); }
- T& Back() { return operator[](_v.Size() - 1); }
-
- void MoveToFront(unsigned index) { _v.MoveToFront(index); }
-
- unsigned Add(const T& item) { return _v.Add(new T(item)); }
-
- void AddInReserved(const T& item) { _v.AddInReserved(new T(item)); }
-
- T& AddNew()
- {
- T *p = new T;
- _v.Add(p);
- return *p;
- }
-
- T& AddNewInReserved()
- {
- T *p = new T;
- _v.AddInReserved(p);
- return *p;
- }
-
- void Insert(unsigned index, const T& item) { _v.Insert(index, new T(item)); }
-
- T& InsertNew(unsigned index)
- {
- T *p = new T;
- _v.Insert(index, p);
- return *p;
- }
-
- ~CObjectVector()
- {
- for (unsigned i = _v.Size(); i != 0;)
- delete (T *)_v[--i];
- }
-
- void ClearAndFree()
- {
- Clear();
- _v.ClearAndFree();
- }
-
- void Clear()
- {
- for (unsigned i = _v.Size(); i != 0;)
- delete (T *)_v[--i];
- _v.Clear();
- }
-
- void DeleteFrom(unsigned index)
- {
- unsigned size = _v.Size();
- for (unsigned i = index; i < size; i++)
- delete (T *)_v[i];
- _v.DeleteFrom(index);
- }
-
- void DeleteFrontal(unsigned num)
- {
- for (unsigned i = 0; i < num; i++)
- delete (T *)_v[i];
- _v.DeleteFrontal(num);
- }
-
- void DeleteBack()
- {
- delete (T *)_v[_v.Size() - 1];
- _v.DeleteBack();
- }
-
- void Delete(unsigned index)
- {
- delete (T *)_v[index];
- _v.Delete(index);
- }
-
- /*
- void Delete(unsigned index, unsigned num)
- {
- for (unsigned i = 0; i < num; i++)
- delete (T *)_v[index + i];
- _v.Delete(index, num);
- }
- */
-
- /*
- int Find(const T& item) const
- {
- unsigned size = Size();
- for (unsigned i = 0; i < size; i++)
- if (item == (*this)[i])
- return i;
- return -1;
- }
- */
-
- int FindInSorted(const T& item) const
- {
- unsigned left = 0, right = Size();
- while (left != right)
- {
- unsigned mid = (left + right) / 2;
- const T& midVal = (*this)[mid];
- int comp = item.Compare(midVal);
- if (comp == 0)
- return mid;
- if (comp < 0)
- right = mid;
- else
- left = mid + 1;
- }
- return -1;
- }
-
- unsigned AddToUniqueSorted(const T& item)
- {
- unsigned left = 0, right = Size();
- while (left != right)
- {
- unsigned mid = (left + right) / 2;
- const T& midVal = (*this)[mid];
- int comp = item.Compare(midVal);
- if (comp == 0)
- return mid;
- if (comp < 0)
- right = mid;
- else
- left = mid + 1;
- }
- Insert(right, item);
- return right;
- }
-
- /*
- unsigned AddToSorted(const T& item)
- {
- unsigned left = 0, right = Size();
- while (left != right)
- {
- unsigned mid = (left + right) / 2;
- const T& midVal = (*this)[mid];
- int comp = item.Compare(midVal);
- if (comp == 0)
- {
- right = mid + 1;
- break;
- }
- if (comp < 0)
- right = mid;
- else
- left = mid + 1;
- }
- Insert(right, item);
- return right;
- }
- */
-
- void Sort(int (*compare)(void *const *, void *const *, void *), void *param)
- { _v.Sort(compare, param); }
-
- static int CompareObjectItems(void *const *a1, void *const *a2, void * /* param */)
- { return (*(*((const T **)a1))).Compare(*(*((const T **)a2))); }
-
- void Sort() { _v.Sort(CompareObjectItems, 0); }
-};
-
-#define FOR_VECTOR(_i_, _v_) for (unsigned _i_ = 0; _i_ < (_v_).Size(); _i_++)
-
-#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 38c93fdb2..000000000
--- a/src/libs/7zip/win/CPP/Common/MyWindows.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-// MyWindows.cpp
-
-#include "StdAfx.h"
-
-#ifndef _WIN32
-
-#include <stdlib.h>
-
-#include "MyWindows.h"
-
-static inline void *AllocateForBSTR(size_t cb) { return ::malloc(cb); }
-static inline void FreeForBSTR(void *pv) { ::free(pv);}
-
-/* Win32 uses DWORD (32-bit) type to store size of string before (OLECHAR *) string.
- We must select CBstrSizeType for another systems (not Win32):
-
- if (CBstrSizeType is UINT32),
- then we support only strings smaller than 4 GB.
- Win32 version always has that limitation.
-
- if (CBstrSizeType is UINT),
- (UINT can be 16/32/64-bit)
- We can support strings larger than 4 GB (if UINT is 64-bit),
- but sizeof(UINT) can be different in parts compiled by
- different compilers/settings,
- and we can't send such BSTR strings between such parts.
-*/
-
-typedef UINT32 CBstrSizeType;
-// typedef UINT CBstrSizeType;
-
-#define k_BstrSize_Max 0xFFFFFFFF
-// #define k_BstrSize_Max UINT_MAX
-// #define k_BstrSize_Max ((UINT)(INT)-1)
-
-BSTR SysAllocStringByteLen(LPCSTR s, UINT len)
-{
- /* Original SysAllocStringByteLen in Win32 maybe fills only unaligned null OLECHAR at the end.
- We provide also aligned null OLECHAR at the end. */
-
- if (len >= (k_BstrSize_Max - sizeof(OLECHAR) - sizeof(OLECHAR) - sizeof(CBstrSizeType)))
- return NULL;
-
- UINT size = (len + sizeof(OLECHAR) + sizeof(OLECHAR) - 1) & ~(sizeof(OLECHAR) - 1);
- void *p = AllocateForBSTR(size + sizeof(CBstrSizeType));
- if (!p)
- return NULL;
- *(CBstrSizeType *)p = (CBstrSizeType)len;
- BSTR bstr = (BSTR)((CBstrSizeType *)p + 1);
- if (s)
- memcpy(bstr, s, len);
- for (; len < size; len++)
- ((Byte *)bstr)[len] = 0;
- return bstr;
-}
-
-BSTR SysAllocStringLen(const OLECHAR *s, UINT len)
-{
- if (len >= (k_BstrSize_Max - sizeof(OLECHAR) - sizeof(CBstrSizeType)) / sizeof(OLECHAR))
- return NULL;
-
- UINT size = len * sizeof(OLECHAR);
- void *p = AllocateForBSTR(size + sizeof(CBstrSizeType) + sizeof(OLECHAR));
- if (!p)
- return NULL;
- *(CBstrSizeType *)p = (CBstrSizeType)size;
- BSTR bstr = (BSTR)((CBstrSizeType *)p + 1);
- if (s)
- memcpy(bstr, s, size);
- bstr[len] = 0;
- return bstr;
-}
-
-BSTR SysAllocString(const OLECHAR *s)
-{
- if (!s)
- return 0;
- const OLECHAR *s2 = s;
- while (*s2 != 0)
- s2++;
- return SysAllocStringLen(s, (UINT)(s2 - s));
-}
-
-void SysFreeString(BSTR bstr)
-{
- if (bstr)
- FreeForBSTR((CBstrSizeType *)bstr - 1);
-}
-
-UINT SysStringByteLen(BSTR bstr)
-{
- if (!bstr)
- return 0;
- return *((CBstrSizeType *)bstr - 1);
-}
-
-UINT SysStringLen(BSTR bstr)
-{
- if (!bstr)
- return 0;
- return *((CBstrSizeType *)bstr - 1) / 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, const 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)
- 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/MyWindows.h b/src/libs/7zip/win/CPP/Common/MyWindows.h
deleted file mode 100644
index 139a4e8b9..000000000
--- a/src/libs/7zip/win/CPP/Common/MyWindows.h
+++ /dev/null
@@ -1,216 +0,0 @@
-// MyWindows.h
-
-#ifndef __MY_WINDOWS_H
-#define __MY_WINDOWS_H
-
-#ifdef _WIN32
-
-#include <windows.h>
-
-#ifdef UNDER_CE
- #undef VARIANT_TRUE
- #define VARIANT_TRUE ((VARIANT_BOOL)-1)
-#endif
-
-#else
-
-#include <stddef.h> // for wchar_t
-#include <string.h>
-
-#include "MyGuidDef.h"
-
-#define WINAPI
-
-typedef char CHAR;
-typedef unsigned char UCHAR;
-
-#undef BYTE
-typedef unsigned char BYTE;
-
-typedef short SHORT;
-typedef unsigned short USHORT;
-
-#undef WORD
-typedef unsigned short WORD;
-typedef short VARIANT_BOOL;
-
-typedef int INT;
-typedef Int32 INT32;
-typedef unsigned int UINT;
-typedef UInt32 UINT32;
-typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit
-typedef UINT32 ULONG;
-
-#undef DWORD
-typedef UINT32 DWORD;
-
-typedef Int64 LONGLONG;
-typedef UInt64 ULONGLONG;
-
-typedef struct _LARGE_INTEGER { LONGLONG QuadPart; } LARGE_INTEGER;
-typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart; } ULARGE_INTEGER;
-
-typedef const CHAR *LPCSTR;
-typedef CHAR TCHAR;
-typedef const TCHAR *LPCTSTR;
-typedef wchar_t WCHAR;
-typedef WCHAR OLECHAR;
-typedef const WCHAR *LPCWSTR;
-typedef OLECHAR *BSTR;
-typedef const OLECHAR *LPCOLESTR;
-typedef OLECHAR *LPOLESTR;
-
-typedef struct _FILETIME
-{
- DWORD dwLowDateTime;
- DWORD dwHighDateTime;
-} FILETIME;
-
-#define HRESULT LONG
-#define FAILED(Status) ((HRESULT)(Status)<0)
-typedef ULONG PROPID;
-typedef LONG SCODE;
-
-#define S_OK ((HRESULT)0x00000000L)
-#define S_FALSE ((HRESULT)0x00000001L)
-#define E_NOTIMPL ((HRESULT)0x80004001L)
-#define E_NOINTERFACE ((HRESULT)0x80004002L)
-#define E_ABORT ((HRESULT)0x80004004L)
-#define E_FAIL ((HRESULT)0x80004005L)
-#define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L)
-#define E_OUTOFMEMORY ((HRESULT)0x8007000EL)
-#define E_INVALIDARG ((HRESULT)0x80070057L)
-
-#ifdef _MSC_VER
-#define STDMETHODCALLTYPE __stdcall
-#else
-#define STDMETHODCALLTYPE
-#endif
-
-#define STDMETHOD_(t, f) virtual t STDMETHODCALLTYPE f
-#define STDMETHOD(f) STDMETHOD_(HRESULT, f)
-#define STDMETHODIMP_(type) type STDMETHODCALLTYPE
-#define STDMETHODIMP STDMETHODIMP_(HRESULT)
-
-#define PURE = 0
-
-#define MIDL_INTERFACE(x) struct
-
-#ifdef __cplusplus
-
-DEFINE_GUID(IID_IUnknown,
-0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
-struct IUnknown
-{
- STDMETHOD(QueryInterface) (REFIID iid, void **outObject) PURE;
- STDMETHOD_(ULONG, AddRef)() PURE;
- STDMETHOD_(ULONG, Release)() PURE;
- #ifndef _WIN32
- virtual ~IUnknown() {}
- #endif
-};
-
-typedef IUnknown *LPUNKNOWN;
-
-#endif
-
-#define VARIANT_TRUE ((VARIANT_BOOL)-1)
-#define VARIANT_FALSE ((VARIANT_BOOL)0)
-
-enum VARENUM
-{
- VT_EMPTY = 0,
- VT_NULL = 1,
- VT_I2 = 2,
- VT_I4 = 3,
- VT_R4 = 4,
- VT_R8 = 5,
- VT_CY = 6,
- VT_DATE = 7,
- VT_BSTR = 8,
- VT_DISPATCH = 9,
- VT_ERROR = 10,
- VT_BOOL = 11,
- VT_VARIANT = 12,
- VT_UNKNOWN = 13,
- VT_DECIMAL = 14,
- VT_I1 = 16,
- VT_UI1 = 17,
- VT_UI2 = 18,
- VT_UI4 = 19,
- VT_I8 = 20,
- VT_UI8 = 21,
- VT_INT = 22,
- VT_UINT = 23,
- VT_VOID = 24,
- VT_HRESULT = 25,
- VT_FILETIME = 64
-};
-
-typedef unsigned short VARTYPE;
-typedef WORD PROPVAR_PAD1;
-typedef WORD PROPVAR_PAD2;
-typedef WORD PROPVAR_PAD3;
-
-typedef struct tagPROPVARIANT
-{
- VARTYPE vt;
- PROPVAR_PAD1 wReserved1;
- PROPVAR_PAD2 wReserved2;
- PROPVAR_PAD3 wReserved3;
- union
- {
- CHAR cVal;
- UCHAR bVal;
- SHORT iVal;
- USHORT uiVal;
- LONG lVal;
- ULONG ulVal;
- INT intVal;
- UINT uintVal;
- LARGE_INTEGER hVal;
- ULARGE_INTEGER uhVal;
- VARIANT_BOOL boolVal;
- SCODE scode;
- FILETIME filetime;
- BSTR bstrVal;
- };
-} PROPVARIANT;
-
-typedef PROPVARIANT tagVARIANT;
-typedef tagVARIANT VARIANT;
-typedef VARIANT VARIANTARG;
-
-MY_EXTERN_C HRESULT VariantClear(VARIANTARG *prop);
-MY_EXTERN_C HRESULT VariantCopy(VARIANTARG *dest, const VARIANTARG *src);
-
-typedef struct tagSTATPROPSTG
-{
- LPOLESTR lpwstrName;
- PROPID propid;
- VARTYPE vt;
-} STATPROPSTG;
-
-MY_EXTERN_C BSTR SysAllocStringByteLen(LPCSTR psz, UINT len);
-MY_EXTERN_C BSTR SysAllocStringLen(const OLECHAR *sz, UINT len);
-MY_EXTERN_C BSTR SysAllocString(const OLECHAR *sz);
-MY_EXTERN_C void SysFreeString(BSTR bstr);
-MY_EXTERN_C UINT SysStringByteLen(BSTR bstr);
-MY_EXTERN_C UINT SysStringLen(BSTR bstr);
-
-MY_EXTERN_C DWORD GetLastError();
-MY_EXTERN_C LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2);
-
-#define CP_ACP 0
-#define CP_OEMCP 1
-#define CP_UTF8 65001
-
-typedef enum tagSTREAM_SEEK
-{
- STREAM_SEEK_SET = 0,
- STREAM_SEEK_CUR = 1,
- STREAM_SEEK_END = 2
-} STREAM_SEEK;
-
-#endif
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/NewHandler.cpp b/src/libs/7zip/win/CPP/Common/NewHandler.cpp
deleted file mode 100644
index 9072376df..000000000
--- a/src/libs/7zip/win/CPP/Common/NewHandler.cpp
+++ /dev/null
@@ -1,162 +0,0 @@
-// NewHandler.cpp
-
-#include "StdAfx.h"
-
-#include <stdlib.h>
-
-#include "NewHandler.h"
-
-// #define DEBUG_MEMORY_LEAK
-
-#ifndef DEBUG_MEMORY_LEAK
-
-#ifdef _WIN32
-
-/*
-void * my_new(size_t size)
-{
- // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);
- void *p = ::malloc(size);
- if (p == 0)
- throw CNewException();
- return p;
-}
-
-void my_delete(void *p) throw()
-{
- // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);
- ::free(p);
-}
-
-void * my_Realloc(void *p, size_t newSize, size_t oldSize)
-{
- void *newBuf = my_new(newSize);
- memcpy(newBuf, p, oldSize);
- my_delete(p);
- return newBuf;
-}
-*/
-
-void *
-#ifdef _MSC_VER
-__cdecl
-#endif
-operator new(size_t size)
-{
- // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);
- void *p = ::malloc(size);
- if (p == 0)
- throw CNewException();
- return p;
-}
-
-void
-#ifdef _MSC_VER
-__cdecl
-#endif
-operator delete(void *p) throw()
-{
- // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);
- ::free(p);
-}
-
-/*
-void *
-#ifdef _MSC_VER
-__cdecl
-#endif
-operator new[](size_t size)
-{
- // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);
- void *p = ::malloc(size);
- if (p == 0)
- throw CNewException();
- return p;
-}
-
-void
-#ifdef _MSC_VER
-__cdecl
-#endif
-operator delete[](void *p) throw()
-{
- // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);
- ::free(p);
-}
-*/
-
-#endif
-
-#else
-
-#include <stdio.h>
-
-// #pragma init_seg(lib)
-const int kDebugSize = 1000000;
-static void *a[kDebugSize];
-static int index = 0;
-
-static int numAllocs = 0;
-void * __cdecl operator new(size_t size)
-{
- numAllocs++;
- void *p = HeapAlloc(GetProcessHeap(), 0, size);
- if (index < kDebugSize)
- {
- a[index] = p;
- index++;
- }
- if (p == 0)
- throw CNewException();
- printf("Alloc %6d, size = %8d\n", numAllocs, size);
- return p;
-}
-
-class CC
-{
-public:
- CC()
- {
- for (int i = 0; i < kDebugSize; i++)
- a[i] = 0;
- }
- ~CC()
- {
- for (int i = 0; i < kDebugSize; i++)
- if (a[i] != 0)
- return;
- }
-} g_CC;
-
-
-void __cdecl operator delete(void *p)
-{
- if (p == 0)
- return;
- /*
- for (int i = 0; i < index; i++)
- if (a[i] == p)
- a[i] = 0;
- */
- HeapFree(GetProcessHeap(), 0, p);
- numAllocs--;
- printf("Free %d\n", numAllocs);
-}
-
-#endif
-
-/*
-int MemErrorVC(size_t)
-{
- throw CNewException();
- // return 1;
-}
-CNewHandlerSetter::CNewHandlerSetter()
-{
- // MemErrorOldVCFunction = _set_new_handler(MemErrorVC);
-}
-CNewHandlerSetter::~CNewHandlerSetter()
-{
- // _set_new_handler(MemErrorOldVCFunction);
-}
-*/
diff --git a/src/libs/7zip/win/CPP/Common/NewHandler.h b/src/libs/7zip/win/CPP/Common/NewHandler.h
deleted file mode 100644
index e3e7422c8..000000000
--- a/src/libs/7zip/win/CPP/Common/NewHandler.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Common/NewHandler.h
-
-#ifndef __COMMON_NEW_HANDLER_H
-#define __COMMON_NEW_HANDLER_H
-
-/*
-This file must be included before any code that uses operators "delete" or "new".
-Also you must compile and link "NewHandler.cpp", if you use MSVC 6.0.
-The operator "new" in MSVC 6.0 doesn't throw exception "bad_alloc".
-So we define another version of operator "new" that throws "CNewException" on failure.
-
-If you use compiler that throws exception in "new" operator (GCC or new version of MSVC),
-you can compile without "NewHandler.cpp". So standard exception "bad_alloc" will be used.
-
-It's still allowed to use redefined version of operator "new" from "NewHandler.cpp"
-with any compiler. 7-Zip's code can work with "bad_alloc" and "CNewException" exceptions.
-But if you use some additional code (outside of 7-Zip's code), you must check
-that redefined version of operator "new" (that throws CNewException) is not
-problem for your code.
-
-Also we declare delete(void *p) throw() that creates smaller code.
-*/
-
-
-class CNewException {};
-
-#ifdef WIN32
-// We can compile my_new and my_delete with _fastcall
-/*
-void * my_new(size_t size);
-void my_delete(void *p) throw();
-// void * my_Realloc(void *p, size_t newSize, size_t oldSize);
-*/
-#endif
-
-#ifdef _WIN32
-
-void *
-#ifdef _MSC_VER
-__cdecl
-#endif
-operator new(size_t size);
-
-void
-#ifdef _MSC_VER
-__cdecl
-#endif
-operator delete(void *p) throw();
-
-#endif
-
-/*
-#ifdef _WIN32
-void *
-#ifdef _MSC_VER
-__cdecl
-#endif
-operator new[](size_t size);
-
-void
-#ifdef _MSC_VER
-__cdecl
-#endif
-operator delete[](void *p) throw();
-#endif
-*/
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/StdAfx.h b/src/libs/7zip/win/CPP/Common/StdAfx.h
deleted file mode 100644
index 420f5c326..000000000
--- a/src/libs/7zip/win/CPP/Common/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "Common.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/StdOutStream.cpp b/src/libs/7zip/win/CPP/Common/StdOutStream.cpp
deleted file mode 100644
index 6aed31a31..000000000
--- a/src/libs/7zip/win/CPP/Common/StdOutStream.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-// Common/StdOutStream.cpp
-
-#include "StdAfx.h"
-
-#include <tchar.h>
-
-#include "IntToString.h"
-#include "StdOutStream.h"
-#include "StringConvert.h"
-#include "UTFConvert.h"
-
-static const char kNewLineChar = '\n';
-
-static const char *kFileOpenMode = "wt";
-
-extern int g_CodePage;
-
-CStdOutStream g_StdOut(stdout);
-CStdOutStream g_StdErr(stderr);
-
-bool CStdOutStream::Open(const char *fileName) throw()
-{
- Close();
- _stream = fopen(fileName, kFileOpenMode);
- _streamIsOpen = (_stream != 0);
- return _streamIsOpen;
-}
-
-bool CStdOutStream::Close() throw()
-{
- if (!_streamIsOpen)
- return true;
- if (fclose(_stream) != 0)
- return false;
- _stream = 0;
- _streamIsOpen = false;
- return true;
-}
-
-bool CStdOutStream::Flush() throw()
-{
- return (fflush(_stream) == 0);
-}
-
-CStdOutStream & endl(CStdOutStream & outStream) throw()
-{
- return outStream << kNewLineChar;
-}
-
-CStdOutStream & CStdOutStream::operator<<(const wchar_t *s)
-{
- int codePage = g_CodePage;
- if (codePage == -1)
- codePage = CP_OEMCP;
- AString dest;
- if (codePage == CP_UTF8)
- ConvertUnicodeToUTF8(s, dest);
- else
- UnicodeStringToMultiByte2(dest, s, (UINT)codePage);
- return operator<<((const char *)dest);
-}
-
-void StdOut_Convert_UString_to_AString(const UString &s, AString &temp)
-{
- int codePage = g_CodePage;
- if (codePage == -1)
- codePage = CP_OEMCP;
- if (codePage == CP_UTF8)
- ConvertUnicodeToUTF8(s, temp);
- else
- UnicodeStringToMultiByte2(temp, s, (UINT)codePage);
-}
-
-void CStdOutStream::PrintUString(const UString &s, AString &temp)
-{
- StdOut_Convert_UString_to_AString(s, temp);
- *this << (const char *)temp;
-}
-
-CStdOutStream & CStdOutStream::operator<<(Int32 number) throw()
-{
- char s[32];
- ConvertInt64ToString(number, s);
- return operator<<(s);
-}
-
-CStdOutStream & CStdOutStream::operator<<(Int64 number) throw()
-{
- char s[32];
- ConvertInt64ToString(number, s);
- return operator<<(s);
-}
-
-CStdOutStream & CStdOutStream::operator<<(UInt32 number) throw()
-{
- char s[16];
- ConvertUInt32ToString(number, s);
- return operator<<(s);
-}
-
-CStdOutStream & CStdOutStream::operator<<(UInt64 number) throw()
-{
- char s[32];
- ConvertUInt64ToString(number, s);
- return operator<<(s);
-}
diff --git a/src/libs/7zip/win/CPP/Common/StdOutStream.h b/src/libs/7zip/win/CPP/Common/StdOutStream.h
deleted file mode 100644
index 0a8c0febb..000000000
--- a/src/libs/7zip/win/CPP/Common/StdOutStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Common/StdOutStream.h
-
-#ifndef __COMMON_STD_OUT_STREAM_H
-#define __COMMON_STD_OUT_STREAM_H
-
-#include <stdio.h>
-
-#include "MyString.h"
-#include "MyTypes.h"
-
-class CStdOutStream
-{
- FILE *_stream;
- bool _streamIsOpen;
-public:
- CStdOutStream(): _stream(0), _streamIsOpen(false) {};
- CStdOutStream(FILE *stream): _stream(stream), _streamIsOpen(false) {};
- ~CStdOutStream() { Close(); }
-
- // void AttachStdStream(FILE *stream) { _stream = stream; _streamIsOpen = false; }
- // bool IsDefined() const { return _stream != NULL; }
-
- operator FILE *() { return _stream; }
- bool Open(const char *fileName) throw();
- bool Close() throw();
- bool Flush() throw();
-
- CStdOutStream & operator<<(CStdOutStream & (* func)(CStdOutStream &))
- {
- (*func)(*this);
- return *this;
- }
-
- CStdOutStream & operator<<(const char *s) throw()
- {
- fputs(s, _stream);
- return *this;
- }
-
- CStdOutStream & operator<<(char c) throw()
- {
- fputc(c, _stream);
- return *this;
- }
-
- CStdOutStream & operator<<(Int32 number) throw();
- CStdOutStream & operator<<(Int64 number) throw();
- CStdOutStream & operator<<(UInt32 number) throw();
- CStdOutStream & operator<<(UInt64 number) throw();
-
- CStdOutStream & operator<<(const wchar_t *s);
- void PrintUString(const UString &s, AString &temp);
-};
-
-CStdOutStream & endl(CStdOutStream & outStream) throw();
-
-extern CStdOutStream g_StdOut;
-extern CStdOutStream g_StdErr;
-
-void StdOut_Convert_UString_to_AString(const UString &s, AString &temp);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/StringConvert.cpp b/src/libs/7zip/win/CPP/Common/StringConvert.cpp
deleted file mode 100644
index 0443a06ca..000000000
--- a/src/libs/7zip/win/CPP/Common/StringConvert.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-// Common/StringConvert.cpp
-
-#include "StdAfx.h"
-
-#include "StringConvert.h"
-
-#ifndef _WIN32
-#include <stdlib.h>
-#endif
-
-#ifdef _WIN32
-UString MultiByteToUnicodeString(const AString &srcString, UINT codePage)
-{
- UString resultString;
- if (!srcString.IsEmpty())
- {
- int numChars = MultiByteToWideChar(codePage, 0, srcString,
- srcString.Len(), resultString.GetBuffer(srcString.Len()),
- srcString.Len() + 1);
- if (numChars == 0)
- throw 282228;
- resultString.ReleaseBuffer(numChars);
- }
- return resultString;
-}
-
-void MultiByteToUnicodeString2(UString &dest, const AString &srcString, UINT codePage)
-{
- dest.Empty();
- if (!srcString.IsEmpty())
- {
- wchar_t *destBuf = dest.GetBuffer(srcString.Len());
- const char *sp = (const char *)srcString;
- unsigned i;
- for (i = 0;;)
- {
- char c = sp[i];
- if ((Byte)c >= 0x80 || c == 0)
- break;
- destBuf[i++] = (wchar_t)c;
- }
-
- if (i != srcString.Len())
- {
- unsigned numChars = MultiByteToWideChar(codePage, 0, sp + i,
- srcString.Len() - i, destBuf + i,
- srcString.Len() + 1 - i);
- if (numChars == 0)
- throw 282228;
- i += numChars;
- }
- dest.ReleaseBuffer(i);
- }
-}
-
-void UnicodeStringToMultiByte2(AString &dest, const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed)
-{
- dest.Empty();
- defaultCharWasUsed = false;
- if (!s.IsEmpty())
- {
- unsigned numRequiredBytes = s.Len() * 2;
- char *destBuf = dest.GetBuffer(numRequiredBytes);
- unsigned i;
- const wchar_t *sp = (const wchar_t *)s;
- for (i = 0;;)
- {
- wchar_t c = sp[i];
- if (c >= 0x80 || c == 0)
- break;
- destBuf[i++] = (char)c;
- }
- defaultCharWasUsed = false;
- if (i != s.Len())
- {
- BOOL defUsed;
- unsigned numChars = WideCharToMultiByte(codePage, 0, sp + i, s.Len() - i,
- destBuf + i, numRequiredBytes + 1 - i,
- &defaultChar, &defUsed);
- defaultCharWasUsed = (defUsed != FALSE);
- if (numChars == 0)
- throw 282229;
- i += numChars;
- }
- dest.ReleaseBuffer(i);
- }
-}
-
-void UnicodeStringToMultiByte2(AString &dest, const UString &srcString, UINT codePage)
-{
- bool defaultCharWasUsed;
- UnicodeStringToMultiByte2(dest, srcString, codePage, '_', defaultCharWasUsed);
-}
-
-AString UnicodeStringToMultiByte(const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed)
-{
- AString dest;
- defaultCharWasUsed = false;
- if (!s.IsEmpty())
- {
- unsigned numRequiredBytes = s.Len() * 2;
- BOOL defUsed;
- int numChars = WideCharToMultiByte(codePage, 0, s, s.Len(),
- dest.GetBuffer(numRequiredBytes), numRequiredBytes + 1,
- &defaultChar, &defUsed);
- defaultCharWasUsed = (defUsed != FALSE);
- if (numChars == 0)
- throw 282229;
- dest.ReleaseBuffer(numChars);
- }
- return dest;
-}
-
-AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage)
-{
- bool defaultCharWasUsed;
- return UnicodeStringToMultiByte(srcString, codePage, '_', defaultCharWasUsed);
-}
-
-#ifndef UNDER_CE
-AString SystemStringToOemString(const CSysString &srcString)
-{
- AString result;
- CharToOem(srcString, result.GetBuffer(srcString.Len() * 2));
- result.ReleaseBuffer();
- return result;
-}
-#endif
-
-#else
-
-UString MultiByteToUnicodeString(const AString &srcString, UINT codePage)
-{
- UString resultString;
- for (unsigned i = 0; i < srcString.Len(); i++)
- resultString += (wchar_t)srcString[i];
- /*
- if (!srcString.IsEmpty())
- {
- int numChars = mbstowcs(resultString.GetBuffer(srcString.Len()), srcString, srcString.Len() + 1);
- if (numChars < 0) throw "Your environment does not support UNICODE";
- resultString.ReleaseBuffer(numChars);
- }
- */
- return resultString;
-}
-
-AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage)
-{
- AString resultString;
- for (unsigned i = 0; i < srcString.Len(); i++)
- resultString += (char)srcString[i];
- /*
- if (!srcString.IsEmpty())
- {
- int numRequiredBytes = srcString.Len() * 6 + 1;
- int numChars = wcstombs(resultString.GetBuffer(numRequiredBytes), srcString, numRequiredBytes);
- if (numChars < 0) throw "Your environment does not support UNICODE";
- resultString.ReleaseBuffer(numChars);
- }
- */
- return resultString;
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/StringConvert.h b/src/libs/7zip/win/CPP/Common/StringConvert.h
deleted file mode 100644
index 8eea72ef2..000000000
--- a/src/libs/7zip/win/CPP/Common/StringConvert.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Common/StringConvert.h
-
-#ifndef __COMMON_STRING_CONVERT_H
-#define __COMMON_STRING_CONVERT_H
-
-#include "MyString.h"
-#include "MyWindows.h"
-
-UString MultiByteToUnicodeString(const AString &srcString, UINT codePage = CP_ACP);
-
-// optimized versions that work faster for ASCII strings
-void MultiByteToUnicodeString2(UString &dest, const AString &srcString, UINT codePage = CP_ACP);
-void UnicodeStringToMultiByte2(AString &dest, const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed);
-void UnicodeStringToMultiByte2(AString &dest, const UString &srcString, UINT codePage);
-
-AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage, char defaultChar, bool &defaultCharWasUsed);
-AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage = CP_ACP);
-
-inline const wchar_t* GetUnicodeString(const wchar_t* unicodeString)
- { return unicodeString; }
-inline const UString& GetUnicodeString(const UString &unicodeString)
- { return unicodeString; }
-inline UString GetUnicodeString(const AString &ansiString)
- { return MultiByteToUnicodeString(ansiString); }
-inline UString GetUnicodeString(const AString &multiByteString, UINT codePage)
- { return MultiByteToUnicodeString(multiByteString, codePage); }
-inline const wchar_t* GetUnicodeString(const wchar_t* unicodeString, UINT)
- { return unicodeString; }
-inline const UString& GetUnicodeString(const UString &unicodeString, UINT)
- { return unicodeString; }
-
-inline const char* GetAnsiString(const char* ansiString)
- { return ansiString; }
-inline const AString& GetAnsiString(const AString &ansiString)
- { return ansiString; }
-inline AString GetAnsiString(const UString &unicodeString)
- { return UnicodeStringToMultiByte(unicodeString); }
-
-inline const char* GetOemString(const char* oemString)
- { return oemString; }
-inline const AString& GetOemString(const AString &oemString)
- { return oemString; }
-inline AString GetOemString(const UString &unicodeString)
- { return UnicodeStringToMultiByte(unicodeString, CP_OEMCP); }
-
-
-#ifdef _UNICODE
- inline const wchar_t* GetSystemString(const wchar_t* unicodeString)
- { return unicodeString;}
- inline const UString& GetSystemString(const UString &unicodeString)
- { return unicodeString;}
- inline const wchar_t* GetSystemString(const wchar_t* unicodeString, UINT /* codePage */)
- { return unicodeString;}
- inline const UString& GetSystemString(const UString &unicodeString, UINT /* codePage */)
- { return unicodeString;}
- inline UString GetSystemString(const AString &multiByteString, UINT codePage)
- { return MultiByteToUnicodeString(multiByteString, codePage);}
- inline UString GetSystemString(const AString &multiByteString)
- { return MultiByteToUnicodeString(multiByteString);}
-#else
- inline const char* GetSystemString(const char *ansiString)
- { return ansiString; }
- inline const AString& GetSystemString(const AString &multiByteString, UINT)
- { return multiByteString; }
- inline const char * GetSystemString(const char *multiByteString, UINT)
- { return multiByteString; }
- inline AString GetSystemString(const UString &unicodeString)
- { return UnicodeStringToMultiByte(unicodeString); }
- inline AString GetSystemString(const UString &unicodeString, UINT codePage)
- { return UnicodeStringToMultiByte(unicodeString, codePage); }
-#endif
-
-#ifndef UNDER_CE
-AString SystemStringToOemString(const CSysString &srcString);
-#endif
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/StringToInt.cpp b/src/libs/7zip/win/CPP/Common/StringToInt.cpp
deleted file mode 100644
index 2023fcc2c..000000000
--- a/src/libs/7zip/win/CPP/Common/StringToInt.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-// Common/StringToInt.cpp
-
-#include "StdAfx.h"
-
-#include "StringToInt.h"
-
-static const UInt32 k_UInt32_max = 0xFFFFFFFF;
-static const UInt64 k_UInt64_max = UINT64_CONST(0xFFFFFFFFFFFFFFFF);
-// static const UInt64 k_UInt64_max = (UInt64)(Int64)-1;
-
-#define CONVERT_STRING_TO_UINT_FUNC(uintType, charType) \
- uintType ConvertStringTo ## uintType(const charType *s, const charType **end) throw() { \
- if (end) *end = s; \
- uintType res = 0; \
- for (;; s++) { \
- charType c = *s; \
- if (c < '0' || c > '9') { if (end) *end = s; return res; } \
- if (res > (k_ ## uintType ## _max) / 10) return 0; \
- res *= 10; \
- unsigned v = (c - '0'); \
- if (res > (k_ ## uintType ## _max) - v) return 0; \
- res += v; }}
-
-CONVERT_STRING_TO_UINT_FUNC(UInt32, char)
-CONVERT_STRING_TO_UINT_FUNC(UInt32, wchar_t)
-CONVERT_STRING_TO_UINT_FUNC(UInt64, char)
-CONVERT_STRING_TO_UINT_FUNC(UInt64, wchar_t)
-
-Int32 ConvertStringToInt32(const wchar_t *s, const wchar_t **end) throw()
-{
- if (end)
- *end = s;
- const wchar_t *s2 = s;
- if (*s == '-')
- s2++;
- if (*s2 == 0)
- return 0;
- const wchar_t *end2;
- UInt32 res = ConvertStringToUInt32(s2, &end2);
- if (*s == '-')
- {
- if (res > ((UInt32)1 << (32 - 1)))
- return 0;
- }
- else if ((res & ((UInt32)1 << (32 - 1))) != 0)
- return 0;
- if (end)
- *end = end2;
- if (*s == '-')
- return -(Int32)res;
- return (Int32)res;
-}
-
-UInt32 ConvertOctStringToUInt32(const char *s, const char **end) throw()
-{
- if (end)
- *end = s;
- UInt32 res = 0;
- for (;; s++)
- {
- char c = *s;
- if (c < '0' || c > '7')
- {
- if (end)
- *end = s;
- return res;
- }
- if ((res & (UInt32)7 << (32 - 3)) != 0)
- return 0;
- res <<= 3;
- res |= (unsigned)(c - '0');
- }
-}
-
-UInt64 ConvertOctStringToUInt64(const char *s, const char **end) throw()
-{
- if (end)
- *end = s;
- UInt64 res = 0;
- for (;; s++)
- {
- char c = *s;
- if (c < '0' || c > '7')
- {
- if (end)
- *end = s;
- return res;
- }
- if ((res & (UInt64)7 << (64 - 3)) != 0)
- return 0;
- res <<= 3;
- res |= (unsigned)(c - '0');
- }
-}
-
-UInt32 ConvertHexStringToUInt32(const char *s, const char **end) throw()
-{
- if (end)
- *end = s;
- UInt32 res = 0;
- for (;; s++)
- {
- char c = *s;
- unsigned v;
- if (c >= '0' && c <= '9') v = (c - '0');
- else if (c >= 'A' && c <= 'F') v = 10 + (c - 'A');
- else if (c >= 'a' && c <= 'f') v = 10 + (c - 'a');
- else
- {
- if (end)
- *end = s;
- return res;
- }
- if ((res & (UInt32)0xF << (32 - 4)) != 0)
- return 0;
- res <<= 4;
- res |= v;
- }
-}
-
-UInt64 ConvertHexStringToUInt64(const char *s, const char **end) throw()
-{
- if (end)
- *end = s;
- UInt64 res = 0;
- for (;; s++)
- {
- char c = *s;
- unsigned v;
- if (c >= '0' && c <= '9') v = (c - '0');
- else if (c >= 'A' && c <= 'F') v = 10 + (c - 'A');
- else if (c >= 'a' && c <= 'f') v = 10 + (c - 'a');
- else
- {
- if (end)
- *end = s;
- return res;
- }
- if ((res & (UInt64)0xF << (64 - 4)) != 0)
- return 0;
- res <<= 4;
- res |= v;
- }
-}
diff --git a/src/libs/7zip/win/CPP/Common/StringToInt.h b/src/libs/7zip/win/CPP/Common/StringToInt.h
deleted file mode 100644
index 5c5d7d7fe..000000000
--- a/src/libs/7zip/win/CPP/Common/StringToInt.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Common/StringToInt.h
-
-#ifndef __COMMON_STRING_TO_INT_H
-#define __COMMON_STRING_TO_INT_H
-
-#include "MyTypes.h"
-
-UInt32 ConvertStringToUInt32(const char *s, const char **end) throw();
-UInt64 ConvertStringToUInt64(const char *s, const char **end) throw();
-UInt32 ConvertStringToUInt32(const wchar_t *s, const wchar_t **end) throw();
-UInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end) throw();
-
-Int32 ConvertStringToInt32(const wchar_t *s, const wchar_t **end) throw();
-
-UInt32 ConvertOctStringToUInt32(const char *s, const char **end) throw();
-UInt64 ConvertOctStringToUInt64(const char *s, const char **end) throw();
-
-UInt32 ConvertHexStringToUInt32(const char *s, const char **end) throw();
-UInt64 ConvertHexStringToUInt64(const char *s, const char **end) throw();
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/UTFConvert.cpp b/src/libs/7zip/win/CPP/Common/UTFConvert.cpp
deleted file mode 100644
index 38bac3331..000000000
--- a/src/libs/7zip/win/CPP/Common/UTFConvert.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-// UTFConvert.cpp
-
-#include "StdAfx.h"
-
-#include "MyTypes.h"
-#include "UTFConvert.h"
-
-static const Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
-
-bool CheckUTF8(const char *src) throw()
-{
- for (;;)
- {
- Byte c;
- unsigned numAdds;
- c = *src++;
- if (c == 0)
- return true;
-
- if (c < 0x80)
- continue;
- if (c < 0xC0)
- return false;
- for (numAdds = 1; numAdds < 5; numAdds++)
- if (c < kUtf8Limits[numAdds])
- break;
- UInt32 value = (c - kUtf8Limits[numAdds - 1]);
-
- do
- {
- Byte c2 = *src++;
- if (c2 < 0x80 || c2 >= 0xC0)
- return false;
- value <<= 6;
- value |= (c2 - 0x80);
- }
- while (--numAdds);
-
- if (value >= 0x110000)
- return false;
- }
-}
-
-
-static Bool Utf8_To_Utf16(wchar_t *dest, size_t *destLen, const char *src, size_t srcLen) throw()
-{
- size_t destPos = 0, srcPos = 0;
- for (;;)
- {
- Byte c;
- unsigned numAdds;
- if (srcPos == srcLen)
- {
- *destLen = destPos;
- return True;
- }
- c = (Byte)src[srcPos++];
-
- if (c < 0x80)
- {
- if (dest)
- dest[destPos] = (wchar_t)c;
- destPos++;
- continue;
- }
- if (c < 0xC0)
- break;
- for (numAdds = 1; numAdds < 5; numAdds++)
- if (c < kUtf8Limits[numAdds])
- break;
- UInt32 value = (c - kUtf8Limits[numAdds - 1]);
-
- do
- {
- Byte c2;
- if (srcPos == srcLen)
- break;
- c2 = (Byte)src[srcPos++];
- if (c2 < 0x80 || c2 >= 0xC0)
- break;
- value <<= 6;
- value |= (c2 - 0x80);
- }
- while (--numAdds);
-
- if (value < 0x10000)
- {
- if (dest)
- dest[destPos] = (wchar_t)value;
- destPos++;
- }
- else
- {
- value -= 0x10000;
- if (value >= 0x100000)
- break;
- if (dest)
- {
- dest[destPos + 0] = (wchar_t)(0xD800 + (value >> 10));
- dest[destPos + 1] = (wchar_t)(0xDC00 + (value & 0x3FF));
- }
- destPos += 2;
- }
- }
- *destLen = destPos;
- return False;
-}
-
-static Bool Utf16_To_Utf8(char *dest, size_t *destLen, const wchar_t *src, size_t srcLen)
-{
- size_t destPos = 0, srcPos = 0;
- for (;;)
- {
- unsigned numAdds;
- UInt32 value;
- if (srcPos == srcLen)
- {
- *destLen = destPos;
- return True;
- }
- value = src[srcPos++];
- if (value < 0x80)
- {
- if (dest)
- dest[destPos] = (char)value;
- destPos++;
- continue;
- }
- if (value >= 0xD800 && value < 0xE000)
- {
- UInt32 c2;
- if (value >= 0xDC00 || srcPos == srcLen)
- break;
- c2 = src[srcPos++];
- if (c2 < 0xDC00 || c2 >= 0xE000)
- break;
- value = (((value - 0xD800) << 10) | (c2 - 0xDC00)) + 0x10000;
- }
- for (numAdds = 1; numAdds < 5; numAdds++)
- if (value < (((UInt32)1) << (numAdds * 5 + 6)))
- break;
- if (dest)
- dest[destPos] = (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds)));
- destPos++;
- do
- {
- numAdds--;
- if (dest)
- dest[destPos] = (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F));
- destPos++;
- }
- while (numAdds != 0);
- }
- *destLen = destPos;
- return False;
-}
-
-bool ConvertUTF8ToUnicode(const AString &src, UString &dest)
-{
- dest.Empty();
- size_t destLen = 0;
- Utf8_To_Utf16(NULL, &destLen, src, src.Len());
- Bool res = Utf8_To_Utf16(dest.GetBuffer((unsigned)destLen), &destLen, src, src.Len());
- dest.ReleaseBuffer((unsigned)destLen);
- return res ? true : false;
-}
-
-bool ConvertUnicodeToUTF8(const UString &src, AString &dest)
-{
- dest.Empty();
- size_t destLen = 0;
- Utf16_To_Utf8(NULL, &destLen, src, src.Len());
- Bool res = Utf16_To_Utf8(dest.GetBuffer((unsigned)destLen), &destLen, src, src.Len());
- dest.ReleaseBuffer((unsigned)destLen);
- return res ? true : false;
-}
diff --git a/src/libs/7zip/win/CPP/Common/UTFConvert.h b/src/libs/7zip/win/CPP/Common/UTFConvert.h
deleted file mode 100644
index 16b02fe45..000000000
--- a/src/libs/7zip/win/CPP/Common/UTFConvert.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// Common/UTFConvert.h
-
-#ifndef __COMMON_UTF_CONVERT_H
-#define __COMMON_UTF_CONVERT_H
-
-#include "MyString.h"
-
-bool CheckUTF8(const char *src) throw();
-bool ConvertUTF8ToUnicode(const AString &utfString, UString &resultString);
-bool ConvertUnicodeToUTF8(const UString &unicodeString, AString &resultString);
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Common/Wildcard.cpp b/src/libs/7zip/win/CPP/Common/Wildcard.cpp
deleted file mode 100644
index e88a1cf1c..000000000
--- a/src/libs/7zip/win/CPP/Common/Wildcard.cpp
+++ /dev/null
@@ -1,615 +0,0 @@
-// Common/Wildcard.cpp
-
-#include "StdAfx.h"
-
-#include "Wildcard.h"
-
-bool g_CaseSensitive =
- #ifdef _WIN32
- false;
- #else
- true;
- #endif
-
-
-bool IsPath1PrefixedByPath2(const wchar_t *s1, const wchar_t *s2)
-{
- if (g_CaseSensitive)
- {
- for (;;)
- {
- wchar_t c2 = *s2++; if (c2 == 0) return true;
- wchar_t c1 = *s1++;
- if (MyCharUpper(c1) !=
- MyCharUpper(c2))
- return false;
- }
- }
-
- for (;;)
- {
- wchar_t c2 = *s2++; if (c2 == 0) return true;
- wchar_t c1 = *s1++; if (c1 != c2) return false;
- }
-}
-
-int CompareFileNames(const wchar_t *s1, const wchar_t *s2) STRING_UNICODE_THROW
-{
- if (g_CaseSensitive)
- return wcscmp(s1, s2);
- return MyStringCompareNoCase(s1, s2);
-}
-
-#ifndef USE_UNICODE_FSTRING
-int CompareFileNames(const char *s1, const char *s2)
-{
- if (g_CaseSensitive)
- return wcscmp(fs2us(s1), fs2us(s2));
- return MyStringCompareNoCase(fs2us(s1), fs2us(s2));
-}
-#endif
-
-// -----------------------------------------
-// this function compares name with mask
-// ? - any char
-// * - any char or empty
-
-static bool EnhancedMaskTest(const wchar_t *mask, const wchar_t *name)
-{
- for (;;)
- {
- wchar_t m = *mask;
- wchar_t c = *name;
- if (m == 0)
- return (c == 0);
- if (m == '*')
- {
- if (EnhancedMaskTest(mask + 1, name))
- return true;
- if (c == 0)
- return false;
- }
- else
- {
- if (m == '?')
- {
- if (c == 0)
- return false;
- }
- else if (m != c)
- if (g_CaseSensitive || MyCharUpper(m) != MyCharUpper(c))
- return false;
- mask++;
- }
- name++;
- }
-}
-
-// --------------------------------------------------
-// Splits path to strings
-
-void SplitPathToParts(const UString &path, UStringVector &pathParts)
-{
- pathParts.Clear();
- unsigned len = path.Len();
- if (len == 0)
- return;
- UString name;
- unsigned prev = 0;
- for (unsigned i = 0; i < len; i++)
- if (IsCharDirLimiter(path[i]))
- {
- name.SetFrom(path.Ptr(prev), i - prev);
- pathParts.Add(name);
- prev = i + 1;
- }
- name.SetFrom(path.Ptr(prev), len - prev);
- pathParts.Add(name);
-}
-
-void SplitPathToParts_2(const UString &path, UString &dirPrefix, UString &name)
-{
- const wchar_t *start = path;
- const wchar_t *p = start + path.Len();
- for (; p != start; p--)
- if (IsCharDirLimiter(*(p - 1)))
- break;
- dirPrefix.SetFrom(path, (unsigned)(p - start));
- name = p;
-}
-
-void SplitPathToParts_Smart(const UString &path, UString &dirPrefix, UString &name)
-{
- const wchar_t *start = path;
- const wchar_t *p = start + path.Len();
- if (p != start)
- {
- if (IsCharDirLimiter(*(p - 1)))
- p--;
- for (; p != start; p--)
- if (IsCharDirLimiter(*(p - 1)))
- break;
- }
- dirPrefix.SetFrom(path, (unsigned)(p - start));
- name = p;
-}
-
-UString ExtractDirPrefixFromPath(const UString &path)
-{
- const wchar_t *start = path;
- const wchar_t *p = start + path.Len();
- for (; p != start; p--)
- if (IsCharDirLimiter(*(p - 1)))
- break;
- return path.Left((unsigned)(p - start));
-}
-
-UString ExtractFileNameFromPath(const UString &path)
-{
- const wchar_t *start = path;
- const wchar_t *p = start + path.Len();
- for (; p != start; p--)
- if (IsCharDirLimiter(*(p - 1)))
- break;
- return p;
-}
-
-
-bool DoesWildcardMatchName(const UString &mask, const UString &name)
-{
- return EnhancedMaskTest(mask, name);
-}
-
-bool DoesNameContainWildcard(const UString &path)
-{
- for (unsigned i = 0; i < path.Len(); i++)
- {
- wchar_t c = path[i];
- if (c == '*' || c == '?')
- return true;
- }
- return false;
-}
-
-
-// ----------------------------------------------------------'
-// NWildcard
-
-namespace NWildcard {
-
-
-#ifdef _WIN32
-bool IsDriveColonName(const wchar_t *s)
-{
- wchar_t c = s[0];
- return c != 0 && s[1] == ':' && s[2] == 0 && (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z');
-}
-#endif
-
-/*
-
-M = MaskParts.Size();
-N = TestNameParts.Size();
-
- File Dir
-ForFile rec M<=N [N-M, N) -
-!ForDir nonrec M=N [0, M) -
-
-ForDir rec M<N [0, M) ... [N-M-1, N-1) same as ForBoth-File
-!ForFile nonrec [0, M) same as ForBoth-File
-
-ForFile rec m<=N [0, M) ... [N-M, N) same as ForBoth-File
-ForDir nonrec [0, M) same as ForBoth-File
-
-*/
-
-bool CItem::AreAllAllowed() const
-{
- return ForFile && ForDir && WildcardMatching && PathParts.Size() == 1 && PathParts.Front() == L"*";
-}
-
-bool CItem::CheckPath(const UStringVector &pathParts, bool isFile) const
-{
- if (!isFile && !ForDir)
- return false;
- int delta = (int)pathParts.Size() - (int)PathParts.Size();
- if (delta < 0)
- return false;
- int start = 0;
- int finish = 0;
-
- if (isFile)
- {
- if (!ForDir)
- {
- if (Recursive)
- start = delta;
- else if (delta !=0)
- return false;
- }
- if (!ForFile && delta == 0)
- return false;
- }
-
- if (Recursive)
- {
- finish = delta;
- if (isFile && !ForFile)
- finish = delta - 1;
- }
-
- for (int d = start; d <= finish; d++)
- {
- unsigned i;
- for (i = 0; i < PathParts.Size(); i++)
- {
- if (WildcardMatching)
- {
- if (!DoesWildcardMatchName(PathParts[i], pathParts[i + d]))
- break;
- }
- else
- {
- if (CompareFileNames(PathParts[i], pathParts[i + d]) != 0)
- break;
- }
- }
- if (i == PathParts.Size())
- return true;
- }
- return false;
-}
-
-bool CCensorNode::AreAllAllowed() const
-{
- if (!Name.IsEmpty() ||
- !SubNodes.IsEmpty() ||
- !ExcludeItems.IsEmpty() ||
- IncludeItems.Size() != 1)
- return false;
- return IncludeItems.Front().AreAllAllowed();
-}
-
-int CCensorNode::FindSubNode(const UString &name) const
-{
- FOR_VECTOR (i, SubNodes)
- if (CompareFileNames(SubNodes[i].Name, name) == 0)
- return i;
- return -1;
-}
-
-void CCensorNode::AddItemSimple(bool include, CItem &item)
-{
- if (include)
- IncludeItems.Add(item);
- else
- ExcludeItems.Add(item);
-}
-
-void CCensorNode::AddItem(bool include, CItem &item)
-{
- if (item.PathParts.Size() <= 1)
- {
- if (item.PathParts.Size() != 0 && item.WildcardMatching)
- {
- if (!DoesNameContainWildcard(item.PathParts.Front()))
- item.WildcardMatching = false;
- }
- AddItemSimple(include, item);
- return;
- }
- const UString &front = item.PathParts.Front();
-
- // We can't ignore wildcard, since we don't allow wildcard in SubNodes[].Name
- // if (item.Wildcard)
- if (DoesNameContainWildcard(front))
- {
- AddItemSimple(include, item);
- return;
- }
- int index = FindSubNode(front);
- if (index < 0)
- index = SubNodes.Add(CCensorNode(front, this));
- item.PathParts.Delete(0);
- SubNodes[index].AddItem(include, item);
-}
-
-void CCensorNode::AddItem(bool include, const UString &path, bool recursive, bool forFile, bool forDir, bool wildcardMatching)
-{
- CItem item;
- SplitPathToParts(path, item.PathParts);
- item.Recursive = recursive;
- item.ForFile = forFile;
- item.ForDir = forDir;
- item.WildcardMatching = wildcardMatching;
- AddItem(include, item);
-}
-
-bool CCensorNode::NeedCheckSubDirs() const
-{
- FOR_VECTOR (i, IncludeItems)
- {
- const CItem &item = IncludeItems[i];
- if (item.Recursive || item.PathParts.Size() > 1)
- return true;
- }
- return false;
-}
-
-bool CCensorNode::AreThereIncludeItems() const
-{
- if (IncludeItems.Size() > 0)
- return true;
- FOR_VECTOR (i, SubNodes)
- if (SubNodes[i].AreThereIncludeItems())
- return true;
- return false;
-}
-
-bool CCensorNode::CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const
-{
- const CObjectVector<CItem> &items = include ? IncludeItems : ExcludeItems;
- FOR_VECTOR (i, items)
- if (items[i].CheckPath(pathParts, isFile))
- return true;
- return false;
-}
-
-bool CCensorNode::CheckPathVect(const UStringVector &pathParts, bool isFile, bool &include) const
-{
- if (CheckPathCurrent(false, pathParts, isFile))
- {
- include = false;
- return true;
- }
- include = true;
- bool finded = CheckPathCurrent(true, pathParts, isFile);
- if (pathParts.Size() <= 1)
- return finded;
- int index = FindSubNode(pathParts.Front());
- if (index >= 0)
- {
- UStringVector pathParts2 = pathParts;
- pathParts2.Delete(0);
- if (SubNodes[index].CheckPathVect(pathParts2, isFile, include))
- return true;
- }
- return finded;
-}
-
-bool CCensorNode::CheckPath2(bool isAltStream, const UString &path, bool isFile, bool &include) const
-{
- UStringVector pathParts;
- SplitPathToParts(path, pathParts);
- if (CheckPathVect(pathParts, isFile, include))
- {
- if (!include || !isAltStream)
- return true;
- }
- if (isAltStream && !pathParts.IsEmpty())
- {
- UString &back = pathParts.Back();
- int pos = back.Find(L':');
- if (pos > 0)
- {
- back.DeleteFrom(pos);
- return CheckPathVect(pathParts, isFile, include);
- }
- }
- return false;
-}
-
-bool CCensorNode::CheckPath(bool isAltStream, const UString &path, bool isFile) const
-{
- bool include;
- if (CheckPath2(isAltStream, path, isFile, include))
- return include;
- return false;
-}
-
-bool CCensorNode::CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const
-{
- if (CheckPathCurrent(include, pathParts, isFile))
- return true;
- if (Parent == 0)
- return false;
- pathParts.Insert(0, Name);
- return Parent->CheckPathToRoot(include, pathParts, isFile);
-}
-
-/*
-bool CCensorNode::CheckPathToRoot(bool include, const UString &path, bool isFile) const
-{
- UStringVector pathParts;
- SplitPathToParts(path, pathParts);
- return CheckPathToRoot(include, pathParts, isFile);
-}
-*/
-
-void CCensorNode::AddItem2(bool include, const UString &path, bool recursive, bool wildcardMatching)
-{
- if (path.IsEmpty())
- return;
- bool forFile = true;
- bool forFolder = true;
- UString path2 = path;
- if (IsCharDirLimiter(path.Back()))
- {
- path2.DeleteBack();
- forFile = false;
- }
- AddItem(include, path2, recursive, forFile, forFolder, wildcardMatching);
-}
-
-void CCensorNode::ExtendExclude(const CCensorNode &fromNodes)
-{
- ExcludeItems += fromNodes.ExcludeItems;
- FOR_VECTOR (i, fromNodes.SubNodes)
- {
- const CCensorNode &node = fromNodes.SubNodes[i];
- int subNodeIndex = FindSubNode(node.Name);
- if (subNodeIndex < 0)
- subNodeIndex = SubNodes.Add(CCensorNode(node.Name, this));
- SubNodes[subNodeIndex].ExtendExclude(node);
- }
-}
-
-int CCensor::FindPrefix(const UString &prefix) const
-{
- FOR_VECTOR (i, Pairs)
- if (CompareFileNames(Pairs[i].Prefix, prefix) == 0)
- return i;
- return -1;
-}
-
-void CCensor::AddItem(ECensorPathMode pathMode, bool include, const UString &path, bool recursive, bool wildcardMatching)
-{
- UStringVector pathParts;
- if (path.IsEmpty())
- throw "Empty file path";
- SplitPathToParts(path, pathParts);
- bool forFile = true;
- if (pathParts.Back().IsEmpty())
- {
- forFile = false;
- pathParts.DeleteBack();
- }
-
- UString prefix;
-
- if (pathMode != k_AbsPath)
- {
- const UString &front = pathParts.Front();
- bool isAbs = false;
-
- if (front.IsEmpty())
- isAbs = true;
- else
- {
- #ifdef _WIN32
-
- if (IsDriveColonName(front))
- isAbs = true;
- else
-
- #endif
-
- FOR_VECTOR (i, pathParts)
- {
- const UString &part = pathParts[i];
- if (part == L".." || part == L".")
- {
- isAbs = true;
- break;
- }
- }
- }
-
- unsigned numAbsParts = 0;
- if (isAbs)
- if (pathParts.Size() > 1)
- numAbsParts = pathParts.Size() - 1;
- else
- numAbsParts = 1;
-
- #ifdef _WIN32
-
- // \\?\ case
- if (numAbsParts >= 3)
- {
- if (pathParts[0].IsEmpty() &&
- pathParts[1].IsEmpty() &&
- pathParts[2] == L"?")
- {
- prefix =
- WSTRING_PATH_SEPARATOR
- WSTRING_PATH_SEPARATOR L"?"
- WSTRING_PATH_SEPARATOR;
- numAbsParts -= 3;
- pathParts.DeleteFrontal(3);
- }
- }
-
- #endif
-
- if (numAbsParts > 1 && pathMode == k_FullPath)
- numAbsParts = 1;
-
- // We can't ignore wildcard, since we don't allow wildcard in SubNodes[].Name
- // if (wildcardMatching)
- for (unsigned i = 0; i < numAbsParts; i++)
- {
- {
- const UString &front = pathParts.Front();
- if (DoesNameContainWildcard(front))
- break;
- prefix += front;
- prefix += WCHAR_PATH_SEPARATOR;
- }
- pathParts.Delete(0);
- }
- }
-
- int index = FindPrefix(prefix);
- if (index < 0)
- index = Pairs.Add(CPair(prefix));
-
- CItem item;
- item.PathParts = pathParts;
- item.ForDir = true;
- item.ForFile = forFile;
- item.Recursive = recursive;
- item.WildcardMatching = wildcardMatching;
- Pairs[index].Head.AddItem(include, item);
-}
-
-bool CCensor::CheckPath(bool isAltStream, const UString &path, bool isFile) const
-{
- bool finded = false;
- FOR_VECTOR (i, Pairs)
- {
- bool include;
- if (Pairs[i].Head.CheckPath2(isAltStream, path, isFile, include))
- {
- if (!include)
- return false;
- finded = true;
- }
- }
- return finded;
-}
-
-void CCensor::ExtendExclude()
-{
- unsigned i;
- for (i = 0; i < Pairs.Size(); i++)
- if (Pairs[i].Prefix.IsEmpty())
- break;
- if (i == Pairs.Size())
- return;
- unsigned index = i;
- for (i = 0; i < Pairs.Size(); i++)
- if (index != i)
- Pairs[i].Head.ExtendExclude(Pairs[index].Head);
-}
-
-void CCensor::AddPathsToCensor(ECensorPathMode censorPathMode)
-{
- FOR_VECTOR(i, CensorPaths)
- {
- const CCensorPath &cp = CensorPaths[i];
- AddItem(censorPathMode, cp.Include, cp.Path, cp.Recursive, cp.WildcardMatching);
- }
- CensorPaths.Clear();
-}
-
-void CCensor::AddPreItem(bool include, const UString &path, bool recursive, bool wildcardMatching)
-{
- CCensorPath &cp = CensorPaths.AddNew();
- cp.Path = path;
- cp.Include = include;
- cp.Recursive = recursive;
- cp.WildcardMatching = wildcardMatching;
-}
-
-}
diff --git a/src/libs/7zip/win/CPP/Common/Wildcard.h b/src/libs/7zip/win/CPP/Common/Wildcard.h
deleted file mode 100644
index 137d71ced..000000000
--- a/src/libs/7zip/win/CPP/Common/Wildcard.h
+++ /dev/null
@@ -1,157 +0,0 @@
-// Common/Wildcard.h
-
-#ifndef __COMMON_WILDCARD_H
-#define __COMMON_WILDCARD_H
-
-#include "MyString.h"
-
-int CompareFileNames(const wchar_t *s1, const wchar_t *s2) STRING_UNICODE_THROW;
-#ifndef USE_UNICODE_FSTRING
- int CompareFileNames(const char *s1, const char *s2);
-#endif
-
-bool IsPath1PrefixedByPath2(const wchar_t *s1, const wchar_t *s2);
-
-inline bool IsCharDirLimiter(wchar_t c)
-{
- return c == WCHAR_PATH_SEPARATOR
- #ifdef _WIN32
- || c == L'/'
- #endif
- ;
-}
-
-void SplitPathToParts(const UString &path, UStringVector &pathParts);
-void SplitPathToParts_2(const UString &path, UString &dirPrefix, UString &name);
-void SplitPathToParts_Smart(const UString &path, UString &dirPrefix, UString &name); // ignores dir delimiter at the end of (path)
-
-UString ExtractDirPrefixFromPath(const UString &path);
-UString ExtractFileNameFromPath(const UString &path);
-
-bool DoesNameContainWildcard(const UString &path);
-bool DoesWildcardMatchName(const UString &mask, const UString &name);
-
-namespace NWildcard {
-
-#ifdef _WIN32
-// returns true, if name is like "a:", "c:", ...
-bool IsDriveColonName(const wchar_t *s);
-#endif
-
-
-struct CItem
-{
- UStringVector PathParts;
- bool Recursive;
- bool ForFile;
- bool ForDir;
- bool WildcardMatching;
-
- #ifdef _WIN32
- bool IsDriveItem() const
- {
- return PathParts.Size() == 1 && !ForFile && ForDir && IsDriveColonName(PathParts[0]);
- }
- #endif
-
- // CItem(): WildcardMatching(true) {}
-
- bool AreAllAllowed() const;
- bool CheckPath(const UStringVector &pathParts, bool isFile) const;
-};
-
-class CCensorNode
-{
- CCensorNode *Parent;
-
- bool CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const;
- void AddItemSimple(bool include, CItem &item);
- bool CheckPathVect(const UStringVector &pathParts, bool isFile, bool &include) const;
-public:
- CCensorNode(): Parent(0) { };
- CCensorNode(const UString &name, CCensorNode *parent): Name(name), Parent(parent) { };
-
- UString Name; // wildcard is not allowed here
- CObjectVector<CCensorNode> SubNodes;
- CObjectVector<CItem> IncludeItems;
- CObjectVector<CItem> ExcludeItems;
-
- bool AreAllAllowed() const;
-
- int FindSubNode(const UString &path) const;
-
- void AddItem(bool include, CItem &item);
- void AddItem(bool include, const UString &path, bool recursive, bool forFile, bool forDir, bool wildcardMatching);
- void AddItem2(bool include, const UString &path, bool recursive, bool wildcardMatching);
-
- bool NeedCheckSubDirs() const;
- bool AreThereIncludeItems() const;
-
- bool CheckPath2(bool isAltStream, const UString &path, bool isFile, bool &include) const;
- bool CheckPath(bool isAltStream, const UString &path, bool isFile) const;
-
- bool CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const;
- // bool CheckPathToRoot(const UString &path, bool isFile, bool include) const;
- void ExtendExclude(const CCensorNode &fromNodes);
-};
-
-struct CPair
-{
- UString Prefix;
- CCensorNode Head;
-
- CPair(const UString &prefix): Prefix(prefix) { };
-};
-
-enum ECensorPathMode
-{
- k_RelatPath, // absolute prefix as Prefix, remain path in Tree
- k_FullPath, // drive prefix as Prefix, remain path in Tree
- k_AbsPath // full path in Tree
-};
-
-struct CCensorPath
-{
- UString Path;
- bool Include;
- bool Recursive;
- bool WildcardMatching;
-
- CCensorPath():
- Include(true),
- Recursive(false),
- WildcardMatching(true)
- {}
-};
-
-class CCensor
-{
- int FindPrefix(const UString &prefix) const;
-public:
- CObjectVector<CPair> Pairs;
-
- CObjectVector<NWildcard::CCensorPath> CensorPaths;
-
- bool AllAreRelative() const
- { return (Pairs.Size() == 1 && Pairs.Front().Prefix.IsEmpty()); }
-
- void AddItem(ECensorPathMode pathMode, bool include, const UString &path, bool recursive, bool wildcardMatching);
- bool CheckPath(bool isAltStream, const UString &path, bool isFile) const;
- void ExtendExclude();
-
- void AddPathsToCensor(NWildcard::ECensorPathMode censorPathMode);
- void AddPreItem(bool include, const UString &path, bool recursive, bool wildcardMatching);
- void AddPreItem(const UString &path)
- {
- AddPreItem(true, path, false, false);
- }
- void AddPreItem_Wildcard()
- {
- AddPreItem(true, L"*", false, true);
- }
-};
-
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/DLL.cpp b/src/libs/7zip/win/CPP/Windows/DLL.cpp
deleted file mode 100644
index cf3dd1ceb..000000000
--- a/src/libs/7zip/win/CPP/Windows/DLL.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-// Windows/DLL.cpp
-
-#include "StdAfx.h"
-
-#include "DLL.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-extern HINSTANCE g_hInstance;
-
-namespace NWindows {
-namespace NDLL {
-
-bool CLibrary::Free() throw()
-{
- if (_module == 0)
- return true;
- if (!::FreeLibrary(_module))
- return false;
- _module = 0;
- return true;
-}
-
-bool CLibrary::LoadEx(CFSTR path, DWORD flags) throw()
-{
- if (!Free())
- return false;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- _module = ::LoadLibraryEx(fs2fas(path), NULL, flags);
- }
- else
- #endif
- {
- _module = ::LoadLibraryExW(fs2us(path), NULL, flags);
- }
- return (_module != NULL);
-}
-
-bool CLibrary::Load(CFSTR path) throw()
-{
- if (!Free())
- return false;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- _module = ::LoadLibrary(fs2fas(path));
- }
- else
- #endif
- {
- _module = ::LoadLibraryW(fs2us(path));
- }
- return (_module != NULL);
-}
-
-bool MyGetModuleFileName(FString &path)
-{
- HMODULE hModule = g_hInstance;
- path.Empty();
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- TCHAR s[MAX_PATH + 2];
- s[0] = 0;
- DWORD size = ::GetModuleFileName(hModule, s, MAX_PATH + 1);
- if (size <= MAX_PATH && size != 0)
- {
- path = fas2fs(s);
- return true;
- }
- }
- else
- #endif
- {
- WCHAR s[MAX_PATH + 2];
- s[0] = 0;
- DWORD size = ::GetModuleFileNameW(hModule, s, MAX_PATH + 1);
- if (size <= MAX_PATH && size != 0)
- {
- path = us2fs(s);
- return true;
- }
- }
- return false;
-}
-
-#ifndef _SFX
-
-FString GetModuleDirPrefix()
-{
- FString s;
- if (MyGetModuleFileName(s))
- {
- int pos = s.ReverseFind(FCHAR_PATH_SEPARATOR);
- if (pos >= 0)
- {
- s.DeleteFrom(pos + 1);
- return s;
- }
- }
- return FTEXT(".") FSTRING_PATH_SEPARATOR;
-}
-
-#endif
-
-}}
diff --git a/src/libs/7zip/win/CPP/Windows/DLL.h b/src/libs/7zip/win/CPP/Windows/DLL.h
deleted file mode 100644
index d8848ce95..000000000
--- a/src/libs/7zip/win/CPP/Windows/DLL.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Windows/DLL.h
-
-#ifndef __WINDOWS_DLL_H
-#define __WINDOWS_DLL_H
-
-#include "../Common/MyString.h"
-
-namespace NWindows {
-namespace NDLL {
-
-#ifdef UNDER_CE
-#define My_GetProcAddress(module, procName) ::GetProcAddressA(module, procName)
-#else
-#define My_GetProcAddress(module, procName) ::GetProcAddress(module, procName)
-#endif
-
-class CLibrary
-{
- HMODULE _module;
-public:
- CLibrary(): _module(NULL) {};
- ~CLibrary() { Free(); }
-
- operator HMODULE() const { return _module; }
- HMODULE* operator&() { return &_module; }
- bool IsLoaded() const { return (_module != NULL); };
-
- void Attach(HMODULE m)
- {
- Free();
- _module = m;
- }
- HMODULE Detach()
- {
- HMODULE m = _module;
- _module = NULL;
- return m;
- }
-
- bool Free() throw();
- bool LoadEx(CFSTR path, DWORD flags = LOAD_LIBRARY_AS_DATAFILE) throw();
- bool Load(CFSTR path) throw();
- FARPROC GetProc(LPCSTR procName) const { return My_GetProcAddress(_module, procName); }
-};
-
-bool MyGetModuleFileName(FString &path);
-
-FString GetModuleDirPrefix();
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Defs.h b/src/libs/7zip/win/CPP/Windows/Defs.h
deleted file mode 100644
index 281c40c33..000000000
--- a/src/libs/7zip/win/CPP/Windows/Defs.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Windows/Defs.h
-
-#ifndef __WINDOWS_DEFS_H
-#define __WINDOWS_DEFS_H
-
-#include "../Common/MyWindows.h"
-
-#ifdef _WIN32
-inline bool LRESULTToBool(LRESULT v) { return (v != FALSE); }
-inline bool BOOLToBool(BOOL v) { return (v != FALSE); }
-inline BOOL BoolToBOOL(bool v) { return (v ? TRUE: FALSE); }
-#endif
-
-inline VARIANT_BOOL BoolToVARIANT_BOOL(bool v) { return (v ? VARIANT_TRUE: VARIANT_FALSE); }
-inline bool VARIANT_BOOLToBool(VARIANT_BOOL v) { return (v != VARIANT_FALSE); }
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/FileDir.cpp b/src/libs/7zip/win/CPP/Windows/FileDir.cpp
deleted file mode 100644
index 097f81efb..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileDir.cpp
+++ /dev/null
@@ -1,583 +0,0 @@
-// Windows/FileDir.cpp
-
-#include "StdAfx.h"
-
-#ifndef _UNICODE
-#include "../Common/StringConvert.h"
-#endif
-
-#include "FileDir.h"
-#include "FileFind.h"
-#include "FileName.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-using namespace NWindows;
-using namespace NFile;
-using namespace NName;
-
-namespace NWindows {
-namespace NFile {
-namespace NDir {
-
-#ifndef UNDER_CE
-
-bool GetWindowsDir(FString &path)
-{
- UINT needLength;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- TCHAR s[MAX_PATH + 2];
- s[0] = 0;
- needLength = ::GetWindowsDirectory(s, MAX_PATH + 1);
- path = fas2fs(s);
- }
- else
- #endif
- {
- WCHAR s[MAX_PATH + 2];
- s[0] = 0;
- needLength = ::GetWindowsDirectoryW(s, MAX_PATH + 1);
- path = us2fs(s);
- }
- return (needLength > 0 && needLength <= MAX_PATH);
-}
-
-bool GetSystemDir(FString &path)
-{
- UINT needLength;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- TCHAR s[MAX_PATH + 2];
- s[0] = 0;
- needLength = ::GetSystemDirectory(s, MAX_PATH + 1);
- path = fas2fs(s);
- }
- else
- #endif
- {
- WCHAR s[MAX_PATH + 2];
- s[0] = 0;
- needLength = ::GetSystemDirectoryW(s, MAX_PATH + 1);
- path = us2fs(s);
- }
- return (needLength > 0 && needLength <= MAX_PATH);
-}
-#endif
-
-bool SetDirTime(CFSTR path, const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime)
-{
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return false;
- }
- #endif
-
- HANDLE hDir = INVALID_HANDLE_VALUE;
- IF_USE_MAIN_PATH
- hDir = ::CreateFileW(fs2us(path), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
- #ifdef WIN_LONG_PATH
- if (hDir == INVALID_HANDLE_VALUE && USE_SUPER_PATH)
- {
- UString longPath;
- if (GetSuperPath(path, longPath, USE_MAIN_PATH))
- hDir = ::CreateFileW(longPath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
- }
- #endif
-
- bool res = false;
- if (hDir != INVALID_HANDLE_VALUE)
- {
- res = BOOLToBool(::SetFileTime(hDir, cTime, aTime, mTime));
- ::CloseHandle(hDir);
- }
- return res;
-}
-
-bool SetFileAttrib(CFSTR path, DWORD attrib)
-{
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- if (::SetFileAttributes(fs2fas(path), attrib))
- return true;
- }
- else
- #endif
- {
- IF_USE_MAIN_PATH
- if (::SetFileAttributesW(fs2us(path), attrib))
- return true;
- #ifdef WIN_LONG_PATH
- if (USE_SUPER_PATH)
- {
- UString longPath;
- if (GetSuperPath(path, longPath, USE_MAIN_PATH))
- return BOOLToBool(::SetFileAttributesW(longPath, attrib));
- }
- #endif
- }
- return false;
-}
-
-bool RemoveDir(CFSTR path)
-{
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- if (::RemoveDirectory(fs2fas(path)))
- return true;
- }
- else
- #endif
- {
- IF_USE_MAIN_PATH
- if (::RemoveDirectoryW(fs2us(path)))
- return true;
- #ifdef WIN_LONG_PATH
- if (USE_SUPER_PATH)
- {
- UString longPath;
- if (GetSuperPath(path, longPath, USE_MAIN_PATH))
- return BOOLToBool(::RemoveDirectoryW(longPath));
- }
- #endif
- }
- return false;
-}
-
-bool MyMoveFile(CFSTR oldFile, CFSTR newFile)
-{
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- if (::MoveFile(fs2fas(oldFile), fs2fas(newFile)))
- return true;
- }
- else
- #endif
- {
- IF_USE_MAIN_PATH_2(oldFile, newFile)
- if (::MoveFileW(fs2us(oldFile), fs2us(newFile)))
- return true;
- #ifdef WIN_LONG_PATH
- if (USE_SUPER_PATH_2)
- {
- UString d1, d2;
- if (GetSuperPaths(oldFile, newFile, d1, d2, USE_MAIN_PATH_2))
- return BOOLToBool(::MoveFileW(d1, d2));
- }
- #endif
- }
- return false;
-}
-
-#ifndef UNDER_CE
-
-EXTERN_C_BEGIN
-typedef BOOL (WINAPI *Func_CreateHardLinkW)(
- LPCWSTR lpFileName,
- LPCWSTR lpExistingFileName,
- LPSECURITY_ATTRIBUTES lpSecurityAttributes
- );
-EXTERN_C_END
-
-bool MyCreateHardLink(CFSTR newFileName, CFSTR existFileName)
-{
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return false;
- /*
- if (::CreateHardLink(fs2fas(newFileName), fs2fas(existFileName), NULL))
- return true;
- */
- }
- else
- #endif
- {
- Func_CreateHardLinkW my_CreateHardLinkW = (Func_CreateHardLinkW)
- ::GetProcAddress(::GetModuleHandleW(L"kernel32.dll"), "CreateHardLinkW");
- if (!my_CreateHardLinkW)
- return false;
- IF_USE_MAIN_PATH_2(newFileName, existFileName)
- if (my_CreateHardLinkW(fs2us(newFileName), fs2us(existFileName), NULL))
- return true;
- #ifdef WIN_LONG_PATH
- if (USE_SUPER_PATH_2)
- {
- UString d1, d2;
- if (GetSuperPaths(newFileName, existFileName, d1, d2, USE_MAIN_PATH_2))
- return BOOLToBool(my_CreateHardLinkW(d1, d2, NULL));
- }
- #endif
- }
- return false;
-}
-
-#endif
-
-bool CreateDir(CFSTR path)
-{
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- if (::CreateDirectory(fs2fas(path), NULL))
- return true;
- }
- else
- #endif
- {
- IF_USE_MAIN_PATH
- if (::CreateDirectoryW(fs2us(path), NULL))
- return true;
- #ifdef WIN_LONG_PATH
- if ((!USE_MAIN_PATH || ::GetLastError() != ERROR_ALREADY_EXISTS) && USE_SUPER_PATH)
- {
- UString longPath;
- if (GetSuperPath(path, longPath, USE_MAIN_PATH))
- return BOOLToBool(::CreateDirectoryW(longPath, NULL));
- }
- #endif
- }
- return false;
-}
-
-bool CreateComplexDir(CFSTR _aPathName)
-{
- FString pathName = _aPathName;
- int pos = pathName.ReverseFind(FCHAR_PATH_SEPARATOR);
- if (pos > 0 && (unsigned)pos == pathName.Len() - 1)
- {
- if (pathName.Len() == 3 && pathName[1] == L':')
- return true; // Disk folder;
- pathName.Delete(pos);
- }
- const FString pathName2 = pathName;
- pos = pathName.Len();
-
- for (;;)
- {
- if (CreateDir(pathName))
- break;
- if (::GetLastError() == ERROR_ALREADY_EXISTS)
- {
- NFind::CFileInfo fileInfo;
- if (!fileInfo.Find(pathName)) // For network folders
- return true;
- if (!fileInfo.IsDir())
- return false;
- break;
- }
- pos = pathName.ReverseFind(FCHAR_PATH_SEPARATOR);
- if (pos < 0 || pos == 0)
- return false;
- if (pathName[pos - 1] == L':')
- return false;
- pathName.DeleteFrom(pos);
- }
-
- while (pos < (int)pathName2.Len())
- {
- pos = pathName2.Find(FCHAR_PATH_SEPARATOR, pos + 1);
- if (pos < 0)
- pos = pathName2.Len();
- pathName.SetFrom(pathName2, pos);
- if (!CreateDir(pathName))
- return false;
- }
-
- return true;
-}
-
-bool DeleteFileAlways(CFSTR path)
-{
- if (!SetFileAttrib(path, 0))
- return false;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- if (::DeleteFile(fs2fas(path)))
- return true;
- }
- else
- #endif
- {
- IF_USE_MAIN_PATH
- if (::DeleteFileW(fs2us(path)))
- return true;
- #ifdef WIN_LONG_PATH
- if (USE_SUPER_PATH)
- {
- UString longPath;
- if (GetSuperPath(path, longPath, USE_MAIN_PATH))
- return BOOLToBool(::DeleteFileW(longPath));
- }
- #endif
- }
- return false;
-}
-
-bool RemoveDirWithSubItems(const FString &path)
-{
- bool needRemoveSubItems = true;
- {
- NFind::CFileInfo fi;
- if (!fi.Find(path))
- return false;
- if (!fi.IsDir())
- {
- ::SetLastError(ERROR_DIRECTORY);
- return false;
- }
- if (fi.HasReparsePoint())
- needRemoveSubItems = false;
- }
-
- if (needRemoveSubItems)
- {
- FString s = path;
- s += FCHAR_PATH_SEPARATOR;
- unsigned prefixSize = s.Len();
- s += FCHAR_ANY_MASK;
- NFind::CEnumerator enumerator(s);
- NFind::CFileInfo fi;
- while (enumerator.Next(fi))
- {
- s.DeleteFrom(prefixSize);
- s += fi.Name;
- if (fi.IsDir())
- {
- if (!RemoveDirWithSubItems(s))
- return false;
- }
- else if (!DeleteFileAlways(s))
- return false;
- }
- }
-
- if (!SetFileAttrib(path, 0))
- return false;
- return RemoveDir(path);
-}
-
-#ifdef UNDER_CE
-
-bool MyGetFullPathName(CFSTR path, FString &resFullPath)
-{
- resFullPath = path;
- return true;
-}
-
-#else
-
-bool MyGetFullPathName(CFSTR path, FString &resFullPath)
-{
- return GetFullPath(path, resFullPath);
-}
-
-bool SetCurrentDir(CFSTR path)
-{
- // SetCurrentDirectory doesn't support \\?\ prefix
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- return BOOLToBool(::SetCurrentDirectory(fs2fas(path)));
- }
- else
- #endif
- {
- return BOOLToBool(::SetCurrentDirectoryW(fs2us(path)));
- }
-}
-
-bool GetCurrentDir(FString &path)
-{
- path.Empty();
- DWORD needLength;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- TCHAR s[MAX_PATH + 2];
- s[0] = 0;
- needLength = ::GetCurrentDirectory(MAX_PATH + 1, s);
- path = fas2fs(s);
- }
- else
- #endif
- {
- WCHAR s[MAX_PATH + 2];
- s[0] = 0;
- needLength = ::GetCurrentDirectoryW(MAX_PATH + 1, s);
- path = us2fs(s);
- }
- return (needLength > 0 && needLength <= MAX_PATH);
-}
-
-#endif
-
-bool GetFullPathAndSplit(CFSTR path, FString &resDirPrefix, FString &resFileName)
-{
- bool res = MyGetFullPathName(path, resDirPrefix);
- if (!res)
- resDirPrefix = path;
- int pos = resDirPrefix.ReverseFind(FCHAR_PATH_SEPARATOR);
- resFileName = resDirPrefix.Ptr(pos + 1);
- resDirPrefix.DeleteFrom(pos + 1);
- return res;
-}
-
-bool GetOnlyDirPrefix(CFSTR path, FString &resDirPrefix)
-{
- FString resFileName;
- return GetFullPathAndSplit(path, resDirPrefix, resFileName);
-}
-
-bool MyGetTempPath(FString &path)
-{
- path.Empty();
- DWORD needLength;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- TCHAR s[MAX_PATH + 2];
- s[0] = 0;
- needLength = ::GetTempPath(MAX_PATH + 1, s);
- path = fas2fs(s);
- }
- else
- #endif
- {
- WCHAR s[MAX_PATH + 2];
- s[0] = 0;
- needLength = ::GetTempPathW(MAX_PATH + 1, s);;
- path = us2fs(s);
- }
- return (needLength > 0 && needLength <= MAX_PATH);
-}
-
-static bool CreateTempFile(CFSTR prefix, bool addRandom, FString &path, NIO::COutFile *outFile)
-{
- UInt32 d = (GetTickCount() << 12) ^ (GetCurrentThreadId() << 14) ^ GetCurrentProcessId();
- for (unsigned i = 0; i < 100; i++)
- {
- path = prefix;
- if (addRandom)
- {
- FChar s[16];
- UInt32 value = d;
- unsigned k;
- for (k = 0; k < 8; k++)
- {
- unsigned t = value & 0xF;
- value >>= 4;
- s[k] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10)));
- }
- s[k] = '\0';
- if (outFile)
- path += FChar('.');
- path += s;
- UInt32 step = GetTickCount() + 2;
- if (step == 0)
- step = 1;
- d += step;
- }
- addRandom = true;
- if (outFile)
- path += FTEXT(".tmp");
- if (NFind::DoesFileOrDirExist(path))
- {
- SetLastError(ERROR_ALREADY_EXISTS);
- continue;
- }
- if (outFile)
- {
- if (outFile->Create(path, false))
- return true;
- }
- else
- {
- if (CreateDir(path))
- return true;
- }
- DWORD error = GetLastError();
- if (error != ERROR_FILE_EXISTS &&
- error != ERROR_ALREADY_EXISTS)
- break;
- }
- path.Empty();
- return false;
-}
-
-bool CTempFile::Create(CFSTR prefix, NIO::COutFile *outFile)
-{
- if (!Remove())
- return false;
- if (!CreateTempFile(prefix, false, _path, outFile))
- return false;
- _mustBeDeleted = true;
- return true;
-}
-
-bool CTempFile::CreateRandomInTempFolder(CFSTR namePrefix, NIO::COutFile *outFile)
-{
- if (!Remove())
- return false;
- FString tempPath;
- if (!MyGetTempPath(tempPath))
- return false;
- if (!CreateTempFile(tempPath + namePrefix, true, _path, outFile))
- return false;
- _mustBeDeleted = true;
- return true;
-}
-
-bool CTempFile::Remove()
-{
- if (!_mustBeDeleted)
- return true;
- _mustBeDeleted = !DeleteFileAlways(_path);
- return !_mustBeDeleted;
-}
-
-bool CTempFile::MoveTo(CFSTR name, bool deleteDestBefore)
-{
- if (deleteDestBefore)
- if (NFind::DoesFileExist(name))
- if (!DeleteFileAlways(name))
- return false;
- DisableDeleting();
- return MyMoveFile(_path, name);
-}
-
-bool CTempDir::Create(CFSTR prefix)
-{
- if (!Remove())
- return false;
- FString tempPath;
- if (!MyGetTempPath(tempPath))
- return false;
- if (!CreateTempFile(tempPath + prefix, true, _path, NULL))
- return false;
- _mustBeDeleted = true;
- return true;
-}
-
-bool CTempDir::Remove()
-{
- if (!_mustBeDeleted)
- return true;
- _mustBeDeleted = !RemoveDirWithSubItems(_path);
- return !_mustBeDeleted;
-}
-
-}}}
diff --git a/src/libs/7zip/win/CPP/Windows/FileDir.h b/src/libs/7zip/win/CPP/Windows/FileDir.h
deleted file mode 100644
index 02d3e5a57..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileDir.h
+++ /dev/null
@@ -1,97 +0,0 @@
-// Windows/FileDir.h
-
-#ifndef __WINDOWS_FILE_DIR_H
-#define __WINDOWS_FILE_DIR_H
-
-#include "../Common/MyString.h"
-
-#include "FileIO.h"
-
-namespace NWindows {
-namespace NFile {
-namespace NDir {
-
-bool GetWindowsDir(FString &path);
-bool GetSystemDir(FString &path);
-
-bool SetDirTime(CFSTR path, const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime);
-bool SetFileAttrib(CFSTR path, DWORD attrib);
-bool MyMoveFile(CFSTR existFileName, CFSTR newFileName);
-
-#ifndef UNDER_CE
-bool MyCreateHardLink(CFSTR newFileName, CFSTR existFileName);
-#endif
-
-bool RemoveDir(CFSTR path);
-bool CreateDir(CFSTR path);
-bool CreateComplexDir(CFSTR path);
-bool DeleteFileAlways(CFSTR name);
-bool RemoveDirWithSubItems(const FString &path);
-
-bool MyGetFullPathName(CFSTR path, FString &resFullPath);
-bool GetFullPathAndSplit(CFSTR path, FString &resDirPrefix, FString &resFileName);
-bool GetOnlyDirPrefix(CFSTR path, FString &resDirPrefix);
-
-#ifndef UNDER_CE
-
-bool SetCurrentDir(CFSTR path);
-bool GetCurrentDir(FString &resultPath);
-
-#endif
-
-bool MyGetTempPath(FString &resultPath);
-
-class CTempFile
-{
- bool _mustBeDeleted;
- FString _path;
- void DisableDeleting() { _mustBeDeleted = false; }
-public:
- CTempFile(): _mustBeDeleted(false) {}
- ~CTempFile() { Remove(); }
- const FString &GetPath() const { return _path; }
- bool Create(CFSTR pathPrefix, NIO::COutFile *outFile); // pathPrefix is not folder prefix
- bool CreateRandomInTempFolder(CFSTR namePrefix, NIO::COutFile *outFile);
- bool Remove();
- bool MoveTo(CFSTR name, bool deleteDestBefore);
-};
-
-class CTempDir
-{
- bool _mustBeDeleted;
- FString _path;
-public:
- CTempDir(): _mustBeDeleted(false) {}
- ~CTempDir() { Remove(); }
- const FString &GetPath() const { return _path; }
- void DisableDeleting() { _mustBeDeleted = false; }
- bool Create(CFSTR namePrefix) ;
- bool Remove();
-};
-
-#if !defined(UNDER_CE)
-class CCurrentDirRestorer
-{
- FString _path;
-public:
- bool NeedRestore;
-
- CCurrentDirRestorer(): NeedRestore(true)
- {
- GetCurrentDir(_path);
- }
- ~CCurrentDirRestorer()
- {
- if (!NeedRestore)
- return;
- FString s;
- if (GetCurrentDir(s))
- if (s != _path)
- SetCurrentDir(_path);
- }
-};
-#endif
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/FileFind.cpp b/src/libs/7zip/win/CPP/Windows/FileFind.cpp
deleted file mode 100644
index 7f58288fe..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileFind.cpp
+++ /dev/null
@@ -1,579 +0,0 @@
-// Windows/FileFind.cpp
-
-#include "StdAfx.h"
-
-#include "FileFind.h"
-#include "FileIO.h"
-#include "FileName.h"
-#ifndef _UNICODE
-#include "../Common/StringConvert.h"
-#endif
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-using namespace NWindows;
-using namespace NFile;
-using namespace NName;
-
-#if defined(_WIN32) && !defined(UNDER_CE)
-
-EXTERN_C_BEGIN
-
-typedef enum
-{
- My_FindStreamInfoStandard,
- My_FindStreamInfoMaxInfoLevel
-} MY_STREAM_INFO_LEVELS;
-
-typedef struct
-{
- LARGE_INTEGER StreamSize;
- WCHAR cStreamName[MAX_PATH + 36];
-} MY_WIN32_FIND_STREAM_DATA, *MY_PWIN32_FIND_STREAM_DATA;
-
-typedef WINBASEAPI HANDLE (WINAPI *FindFirstStreamW_Ptr)(LPCWSTR fileName, MY_STREAM_INFO_LEVELS infoLevel,
- LPVOID findStreamData, DWORD flags);
-
-typedef WINBASEAPI BOOL (APIENTRY *FindNextStreamW_Ptr)(HANDLE findStream, LPVOID findStreamData);
-
-EXTERN_C_END
-
-#endif
-
-namespace NWindows {
-namespace NFile {
-
-#ifdef SUPPORT_DEVICE_FILE
-namespace NSystem
-{
-bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize);
-}
-#endif
-
-namespace NFind {
-
-bool CFileInfo::IsDots() const throw()
-{
- if (!IsDir() || Name.IsEmpty())
- return false;
- if (Name[0] != FTEXT('.'))
- return false;
- return Name.Len() == 1 || (Name.Len() == 2 && Name[1] == FTEXT('.'));
-}
-
-#define WIN_FD_TO_MY_FI(fi, fd) \
- fi.Attrib = fd.dwFileAttributes; \
- fi.CTime = fd.ftCreationTime; \
- fi.ATime = fd.ftLastAccessTime; \
- fi.MTime = fd.ftLastWriteTime; \
- fi.Size = (((UInt64)fd.nFileSizeHigh) << 32) + fd.nFileSizeLow; \
- fi.IsAltStream = false; \
- fi.IsDevice = false;
-
- /*
- #ifdef UNDER_CE
- fi.ObjectID = fd.dwOID;
- #else
- fi.ReparseTag = fd.dwReserved0;
- #endif
- */
-
-static void Convert_WIN32_FIND_DATA_to_FileInfo(const WIN32_FIND_DATAW &fd, CFileInfo &fi)
-{
- WIN_FD_TO_MY_FI(fi, fd);
- fi.Name = us2fs(fd.cFileName);
- #if defined(_WIN32) && !defined(UNDER_CE)
- // fi.ShortName = us2fs(fd.cAlternateFileName);
- #endif
-}
-
-#ifndef _UNICODE
-
-static void Convert_WIN32_FIND_DATA_to_FileInfo(const WIN32_FIND_DATA &fd, CFileInfo &fi)
-{
- WIN_FD_TO_MY_FI(fi, fd);
- fi.Name = fas2fs(fd.cFileName);
- #if defined(_WIN32) && !defined(UNDER_CE)
- // fi.ShortName = fas2fs(fd.cAlternateFileName);
- #endif
-}
-#endif
-
-////////////////////////////////
-// CFindFile
-
-bool CFindFileBase::Close() throw()
-{
- if (_handle == INVALID_HANDLE_VALUE)
- return true;
- if (!::FindClose(_handle))
- return false;
- _handle = INVALID_HANDLE_VALUE;
- return true;
-}
-
-bool CFindFile::FindFirst(CFSTR path, CFileInfo &fi)
-{
- if (!Close())
- return false;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- WIN32_FIND_DATAA fd;
- _handle = ::FindFirstFileA(fs2fas(path), &fd);
- if (_handle == INVALID_HANDLE_VALUE)
- return false;
- Convert_WIN32_FIND_DATA_to_FileInfo(fd, fi);
- }
- else
- #endif
- {
- WIN32_FIND_DATAW fd;
-
- IF_USE_MAIN_PATH
- _handle = ::FindFirstFileW(fs2us(path), &fd);
- #ifdef WIN_LONG_PATH
- if (_handle == INVALID_HANDLE_VALUE && USE_SUPER_PATH)
- {
- UString longPath;
- if (GetSuperPath(path, longPath, USE_MAIN_PATH))
- _handle = ::FindFirstFileW(longPath, &fd);
- }
- #endif
- if (_handle == INVALID_HANDLE_VALUE)
- return false;
- Convert_WIN32_FIND_DATA_to_FileInfo(fd, fi);
- }
- return true;
-}
-
-bool CFindFile::FindNext(CFileInfo &fi)
-{
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- WIN32_FIND_DATAA fd;
- if (!::FindNextFileA(_handle, &fd))
- return false;
- Convert_WIN32_FIND_DATA_to_FileInfo(fd, fi);
- }
- else
- #endif
- {
- WIN32_FIND_DATAW fd;
- if (!::FindNextFileW(_handle, &fd))
- return false;
- Convert_WIN32_FIND_DATA_to_FileInfo(fd, fi);
- }
- return true;
-}
-
-#if defined(_WIN32) && !defined(UNDER_CE)
-
-////////////////////////////////
-// AltStreams
-
-static FindFirstStreamW_Ptr g_FindFirstStreamW;
-static FindNextStreamW_Ptr g_FindNextStreamW;
-
-struct CFindStreamLoader
-{
- CFindStreamLoader()
- {
- g_FindFirstStreamW = (FindFirstStreamW_Ptr)::GetProcAddress(::GetModuleHandleA("kernel32.dll"), "FindFirstStreamW");
- g_FindNextStreamW = (FindNextStreamW_Ptr)::GetProcAddress(::GetModuleHandleA("kernel32.dll"), "FindNextStreamW");
- }
-} g_FindStreamLoader;
-
-bool CStreamInfo::IsMainStream() const throw()
-{
- return Name == L"::$DATA";
-};
-
-UString CStreamInfo::GetReducedName() const
-{
- UString s = Name;
- if (s.Len() >= 6)
- if (wcscmp(s.RightPtr(6), L":$DATA") == 0)
- s.DeleteFrom(s.Len() - 6);
- return s;
-}
-
-static void Convert_WIN32_FIND_STREAM_DATA_to_StreamInfo(const MY_WIN32_FIND_STREAM_DATA &sd, CStreamInfo &si)
-{
- si.Size = sd.StreamSize.QuadPart;
- si.Name = sd.cStreamName;
-}
-
-bool CFindStream::FindFirst(CFSTR path, CStreamInfo &si)
-{
- if (!Close())
- return false;
- if (!g_FindFirstStreamW)
- {
- ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return false;
- }
- {
- MY_WIN32_FIND_STREAM_DATA sd;
- IF_USE_MAIN_PATH
- _handle = g_FindFirstStreamW(fs2us(path), My_FindStreamInfoStandard, &sd, 0);
- if (_handle == INVALID_HANDLE_VALUE)
- {
- if (::GetLastError() == ERROR_HANDLE_EOF)
- return false;
- // long name can be tricky for path like ".\dirName".
- #ifdef WIN_LONG_PATH
- if (USE_SUPER_PATH)
- {
- UString longPath;
- if (GetSuperPath(path, longPath, USE_MAIN_PATH))
- _handle = g_FindFirstStreamW(longPath, My_FindStreamInfoStandard, &sd, 0);
- }
- #endif
- }
- if (_handle == INVALID_HANDLE_VALUE)
- return false;
- Convert_WIN32_FIND_STREAM_DATA_to_StreamInfo(sd, si);
- }
- return true;
-}
-
-bool CFindStream::FindNext(CStreamInfo &si)
-{
- if (!g_FindNextStreamW)
- {
- ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return false;
- }
- {
- MY_WIN32_FIND_STREAM_DATA sd;
- if (!g_FindNextStreamW(_handle, &sd))
- return false;
- Convert_WIN32_FIND_STREAM_DATA_to_StreamInfo(sd, si);
- }
- return true;
-}
-
-bool CStreamEnumerator::Next(CStreamInfo &si, bool &found)
-{
- bool res;
- if (_find.IsHandleAllocated())
- res = _find.FindNext(si);
- else
- res = _find.FindFirst(_filePath, si);
- if (res)
- {
- found = true;
- return true;
- }
- found = false;
- return (::GetLastError() == ERROR_HANDLE_EOF);
-}
-
-#endif
-
-
-#define MY_CLEAR_FILETIME(ft) ft.dwLowDateTime = ft.dwHighDateTime = 0;
-
-void CFileInfoBase::Clear() throw()
-{
- Size = 0;
- MY_CLEAR_FILETIME(CTime);
- MY_CLEAR_FILETIME(ATime);
- MY_CLEAR_FILETIME(MTime);
- Attrib = 0;
- IsAltStream = false;
- IsDevice = false;
-}
-
-#if defined(_WIN32) && !defined(UNDER_CE)
-
-static int FindAltStreamColon(CFSTR path)
-{
- for (int i = 0;; i++)
- {
- FChar c = path[i];
- if (c == 0)
- return -1;
- if (c == ':')
- {
- if (path[i + 1] == '\\')
- if (i == 1 || (i > 1 && path[i - 2] == '\\'))
- {
- wchar_t c0 = path[i - 1];
- if (c0 >= 'a' && c0 <= 'z' ||
- c0 >= 'A' && c0 <= 'Z')
- continue;
- }
- return i;
- }
- }
-}
-
-#endif
-
-bool CFileInfo::Find(CFSTR path)
-{
- #ifdef SUPPORT_DEVICE_FILE
- if (IsDevicePath(path))
- {
- Clear();
- Name = path + 4;
-
- IsDevice = true;
- if (/* path[0] == '\\' && path[1] == '\\' && path[2] == '.' && path[3] == '\\' && */
- path[5] == ':' && path[6] == 0)
- {
- FChar drive[4] = { path[4], ':', '\\', 0 };
- UInt64 clusterSize, totalSize, freeSize;
- if (NSystem::MyGetDiskFreeSpace(drive, clusterSize, totalSize, freeSize))
- {
- Size = totalSize;
- return true;
- }
- }
-
- NIO::CInFile inFile;
- // ::OutputDebugStringW(path);
- if (!inFile.Open(path))
- return false;
- // ::OutputDebugStringW(L"---");
- if (inFile.SizeDefined)
- Size = inFile.Size;
- return true;
- }
- #endif
-
- #if defined(_WIN32) && !defined(UNDER_CE)
-
- int colonPos = FindAltStreamColon(path);
- if (colonPos >= 0)
- {
- UString streamName = fs2us(path + (unsigned)colonPos);
- FString filePath = path;
- filePath.DeleteFrom(colonPos);
- streamName += L":$DATA"; // change it!!!!
- if (Find(filePath))
- {
- // if (IsDir())
- Attrib &= ~FILE_ATTRIBUTE_DIRECTORY;
- Size = 0;
- CStreamEnumerator enumerator(filePath);
- for (;;)
- {
- CStreamInfo si;
- bool found;
- if (!enumerator.Next(si, found))
- return false;
- if (!found)
- {
- ::SetLastError(ERROR_FILE_NOT_FOUND);
- return false;
- }
- if (si.Name.IsEqualToNoCase(streamName))
- {
- Name += us2fs(si.Name);
- Name.DeleteFrom(Name.Len() - 6);
- Size = si.Size;
- IsAltStream = true;
- return true;
- }
- }
- }
- }
-
- #endif
-
- CFindFile finder;
- if (finder.FindFirst(path, *this))
- return true;
- #ifdef _WIN32
- {
- DWORD lastError = GetLastError();
- if (lastError == ERROR_BAD_NETPATH ||
- lastError == ERROR_FILE_NOT_FOUND ||
- lastError == ERROR_INVALID_NAME // for "\\SERVER\shared" paths that are translated to "\\?\UNC\SERVER\shared"
- )
- {
- unsigned len = MyStringLen(path);
- if (len > 2 && path[0] == '\\' && path[1] == '\\')
- {
- int startPos = 2;
- if (len > kSuperUncPathPrefixSize && IsSuperUncPath(path))
- startPos = kSuperUncPathPrefixSize;
- int pos = FindCharPosInString(path + startPos, FTEXT('\\'));
- if (pos >= 0)
- {
- pos += startPos + 1;
- len -= pos;
- int pos2 = FindCharPosInString(path + pos, FTEXT('\\'));
- if (pos2 < 0 || pos2 == (int)len - 1)
- {
- FString s = path;
- if (pos2 < 0)
- {
- pos2 = len;
- s += FTEXT('\\');
- }
- s += FCHAR_ANY_MASK;
- if (finder.FindFirst(s, *this))
- if (Name == FTEXT("."))
- {
- Name.SetFrom(s.Ptr(pos), pos2);
- return true;
- }
- ::SetLastError(lastError);
- }
- }
- }
- }
- }
- #endif
- return false;
-}
-
-bool DoesFileExist(CFSTR name)
-{
- CFileInfo fi;
- return fi.Find(name) && !fi.IsDir();
-}
-
-bool DoesDirExist(CFSTR name)
-{
- CFileInfo fi;
- return fi.Find(name) && fi.IsDir();
-}
-bool DoesFileOrDirExist(CFSTR name)
-{
- CFileInfo fi;
- return fi.Find(name);
-}
-
-bool CEnumerator::NextAny(CFileInfo &fi)
-{
- if (_findFile.IsHandleAllocated())
- return _findFile.FindNext(fi);
- else
- return _findFile.FindFirst(_wildcard, fi);
-}
-
-bool CEnumerator::Next(CFileInfo &fi)
-{
- for (;;)
- {
- if (!NextAny(fi))
- return false;
- if (!fi.IsDots())
- return true;
- }
-}
-
-bool CEnumerator::Next(CFileInfo &fi, bool &found)
-{
- if (Next(fi))
- {
- found = true;
- return true;
- }
- found = false;
- return (::GetLastError() == ERROR_NO_MORE_FILES);
-}
-
-////////////////////////////////
-// CFindChangeNotification
-// FindFirstChangeNotification can return 0. MSDN doesn't tell about it.
-
-bool CFindChangeNotification::Close() throw()
-{
- if (!IsHandleAllocated())
- return true;
- if (!::FindCloseChangeNotification(_handle))
- return false;
- _handle = INVALID_HANDLE_VALUE;
- return true;
-}
-
-HANDLE CFindChangeNotification::FindFirst(CFSTR path, bool watchSubtree, DWORD notifyFilter)
-{
- #ifndef _UNICODE
- if (!g_IsNT)
- _handle = ::FindFirstChangeNotification(fs2fas(path), BoolToBOOL(watchSubtree), notifyFilter);
- else
- #endif
- {
- IF_USE_MAIN_PATH
- _handle = ::FindFirstChangeNotificationW(fs2us(path), BoolToBOOL(watchSubtree), notifyFilter);
- #ifdef WIN_LONG_PATH
- if (!IsHandleAllocated())
- {
- UString longPath;
- if (GetSuperPath(path, longPath, USE_MAIN_PATH))
- _handle = ::FindFirstChangeNotificationW(longPath, BoolToBOOL(watchSubtree), notifyFilter);
- }
- #endif
- }
- return _handle;
-}
-
-#ifndef UNDER_CE
-
-bool MyGetLogicalDriveStrings(CObjectVector<FString> &driveStrings)
-{
- driveStrings.Clear();
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- driveStrings.Clear();
- UINT32 size = GetLogicalDriveStrings(0, NULL);
- if (size == 0)
- return false;
- AString buf;
- UINT32 newSize = GetLogicalDriveStrings(size, buf.GetBuffer(size));
- if (newSize == 0 || newSize > size)
- return false;
- AString s;
- for (UINT32 i = 0; i < newSize; i++)
- {
- char c = buf[i];
- if (c == '\0')
- {
- driveStrings.Add(fas2fs(s));
- s.Empty();
- }
- else
- s += c;
- }
- return s.IsEmpty();
- }
- else
- #endif
- {
- UINT32 size = GetLogicalDriveStringsW(0, NULL);
- if (size == 0)
- return false;
- UString buf;
- UINT32 newSize = GetLogicalDriveStringsW(size, buf.GetBuffer(size));
- if (newSize == 0 || newSize > size)
- return false;
- UString s;
- for (UINT32 i = 0; i < newSize; i++)
- {
- WCHAR c = buf[i];
- if (c == L'\0')
- {
- driveStrings.Add(us2fs(s));
- s.Empty();
- }
- else
- s += c;
- }
- return s.IsEmpty();
- }
-}
-
-#endif
-
-}}}
diff --git a/src/libs/7zip/win/CPP/Windows/FileFind.h b/src/libs/7zip/win/CPP/Windows/FileFind.h
deleted file mode 100644
index aaa7499bd..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileFind.h
+++ /dev/null
@@ -1,158 +0,0 @@
-// Windows/FileFind.h
-
-#ifndef __WINDOWS_FILE_FIND_H
-#define __WINDOWS_FILE_FIND_H
-
-#include "../Common/MyString.h"
-#include "Defs.h"
-
-namespace NWindows {
-namespace NFile {
-namespace NFind {
-
-namespace NAttributes
-{
- inline bool IsReadOnly(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_READONLY) != 0; }
- inline bool IsHidden(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_HIDDEN) != 0; }
- inline bool IsSystem(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_SYSTEM) != 0; }
- inline bool IsDir(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_DIRECTORY) != 0; }
- inline bool IsArchived(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ARCHIVE) != 0; }
- inline bool IsCompressed(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_COMPRESSED) != 0; }
- inline bool IsEncrypted(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ENCRYPTED) != 0; }
-}
-
-class CFileInfoBase
-{
- bool MatchesMask(UINT32 mask) const { return ((Attrib & mask) != 0); }
-public:
- UInt64 Size;
- FILETIME CTime;
- FILETIME ATime;
- FILETIME MTime;
- DWORD Attrib;
- bool IsAltStream;
- bool IsDevice;
-
- /*
- #ifdef UNDER_CE
- DWORD ObjectID;
- #else
- UINT32 ReparseTag;
- #endif
- */
-
- CFileInfoBase() { Clear(); }
- void Clear() throw();
-
- void SetAsDir() { Attrib = FILE_ATTRIBUTE_DIRECTORY; }
-
- bool IsArchived() const { return MatchesMask(FILE_ATTRIBUTE_ARCHIVE); }
- bool IsCompressed() const { return MatchesMask(FILE_ATTRIBUTE_COMPRESSED); }
- bool IsDir() const { return MatchesMask(FILE_ATTRIBUTE_DIRECTORY); }
- bool IsEncrypted() const { return MatchesMask(FILE_ATTRIBUTE_ENCRYPTED); }
- bool IsHidden() const { return MatchesMask(FILE_ATTRIBUTE_HIDDEN); }
- bool IsNormal() const { return MatchesMask(FILE_ATTRIBUTE_NORMAL); }
- bool IsOffline() const { return MatchesMask(FILE_ATTRIBUTE_OFFLINE); }
- bool IsReadOnly() const { return MatchesMask(FILE_ATTRIBUTE_READONLY); }
- bool HasReparsePoint() const { return MatchesMask(FILE_ATTRIBUTE_REPARSE_POINT); }
- bool IsSparse() const { return MatchesMask(FILE_ATTRIBUTE_SPARSE_FILE); }
- bool IsSystem() const { return MatchesMask(FILE_ATTRIBUTE_SYSTEM); }
- bool IsTemporary() const { return MatchesMask(FILE_ATTRIBUTE_TEMPORARY); }
-};
-
-struct CFileInfo: public CFileInfoBase
-{
- FString Name;
- #if defined(_WIN32) && !defined(UNDER_CE)
- // FString ShortName;
- #endif
-
- bool IsDots() const throw();
- bool Find(CFSTR wildcard);
-};
-
-class CFindFileBase
-{
-protected:
- HANDLE _handle;
-public:
- bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE; }
- CFindFileBase(): _handle(INVALID_HANDLE_VALUE) {}
- ~CFindFileBase() { Close(); }
- bool Close() throw();
-};
-
-class CFindFile: public CFindFileBase
-{
-public:
- bool FindFirst(CFSTR wildcard, CFileInfo &fileInfo);
- bool FindNext(CFileInfo &fileInfo);
-};
-
-#if defined(_WIN32) && !defined(UNDER_CE)
-
-struct CStreamInfo
-{
- UString Name;
- UInt64 Size;
-
- UString GetReducedName() const;
- bool IsMainStream() const throw();
-};
-
-class CFindStream: public CFindFileBase
-{
-public:
- bool FindFirst(CFSTR filePath, CStreamInfo &streamInfo);
- bool FindNext(CStreamInfo &streamInfo);
-};
-
-class CStreamEnumerator
-{
- CFindStream _find;
- FString _filePath;
-
- bool NextAny(CFileInfo &fileInfo);
-public:
- CStreamEnumerator(const FString &filePath): _filePath(filePath) {}
- bool Next(CStreamInfo &streamInfo, bool &found);
-};
-
-#endif
-
-bool DoesFileExist(CFSTR name);
-bool DoesDirExist(CFSTR name);
-bool DoesFileOrDirExist(CFSTR name);
-
-class CEnumerator
-{
- CFindFile _findFile;
- FString _wildcard;
-
- bool NextAny(CFileInfo &fileInfo);
-public:
- CEnumerator(const FString &wildcard): _wildcard(wildcard) {}
- bool Next(CFileInfo &fileInfo);
- bool Next(CFileInfo &fileInfo, bool &found);
-};
-
-class CFindChangeNotification
-{
- HANDLE _handle;
-public:
- operator HANDLE () { return _handle; }
- bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE && _handle != 0; }
- CFindChangeNotification(): _handle(INVALID_HANDLE_VALUE) {}
- ~CFindChangeNotification() { Close(); }
- bool Close() throw();
- HANDLE FindFirst(CFSTR pathName, bool watchSubtree, DWORD notifyFilter);
- bool FindNext() { return BOOLToBool(::FindNextChangeNotification(_handle)); }
-};
-
-#ifndef UNDER_CE
-bool MyGetLogicalDriveStrings(CObjectVector<FString> &driveStrings);
-#endif
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/FileIO.cpp b/src/libs/7zip/win/CPP/Windows/FileIO.cpp
deleted file mode 100644
index fec859ed3..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileIO.cpp
+++ /dev/null
@@ -1,432 +0,0 @@
-// Windows/FileIO.cpp
-
-#include "StdAfx.h"
-
-#ifdef SUPPORT_DEVICE_FILE
-#include "../../C/Alloc.h"
-#endif
-
-#include "FileIO.h"
-#include "FileName.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-using namespace NWindows;
-using namespace NFile;
-using namespace NName;
-
-namespace NWindows {
-namespace NFile {
-
-#ifdef SUPPORT_DEVICE_FILE
-
-namespace NSystem
-{
-bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize);
-}
-#endif
-
-namespace NIO {
-
-/*
-WinXP-64 CreateFile():
- "" - ERROR_PATH_NOT_FOUND
- :stream - OK
- .:stream - ERROR_PATH_NOT_FOUND
- .\:stream - OK
-
- folder\:stream - ERROR_INVALID_NAME
- folder:stream - OK
-
- c:\:stream - OK
-
- c::stream - ERROR_INVALID_NAME, if current dir is NOT ROOT ( c:\dir1 )
- c::stream - OK, if current dir is ROOT ( c:\ )
-*/
-
-bool CFileBase::Create(CFSTR path, DWORD desiredAccess,
- DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes)
-{
- if (!Close())
- return false;
-
- #ifdef SUPPORT_DEVICE_FILE
- IsDeviceFile = false;
- #endif
-
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- _handle = ::CreateFile(fs2fas(path), desiredAccess, shareMode,
- (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, flagsAndAttributes, (HANDLE)NULL);
- }
- else
- #endif
- {
- IF_USE_MAIN_PATH
- _handle = ::CreateFileW(fs2us(path), desiredAccess, shareMode,
- (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, flagsAndAttributes, (HANDLE)NULL);
- #ifdef WIN_LONG_PATH
- if (_handle == INVALID_HANDLE_VALUE && USE_SUPER_PATH)
- {
- UString superPath;
- if (GetSuperPath(path, superPath, USE_MAIN_PATH))
- _handle = ::CreateFileW(superPath, desiredAccess, shareMode,
- (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, flagsAndAttributes, (HANDLE)NULL);
- }
- #endif
- }
- return (_handle != INVALID_HANDLE_VALUE);
-}
-
-bool CFileBase::Close() throw()
-{
- if (_handle == INVALID_HANDLE_VALUE)
- return true;
- if (!::CloseHandle(_handle))
- return false;
- _handle = INVALID_HANDLE_VALUE;
- return true;
-}
-
-bool CFileBase::GetPosition(UInt64 &position) const throw()
-{
- return Seek(0, FILE_CURRENT, position);
-}
-
-bool CFileBase::GetLength(UInt64 &length) const throw()
-{
- #ifdef SUPPORT_DEVICE_FILE
- if (IsDeviceFile && SizeDefined)
- {
- length = Size;
- return true;
- }
- #endif
-
- DWORD sizeHigh;
- DWORD sizeLow = ::GetFileSize(_handle, &sizeHigh);
- if (sizeLow == 0xFFFFFFFF)
- if (::GetLastError() != NO_ERROR)
- return false;
- length = (((UInt64)sizeHigh) << 32) + sizeLow;
- return true;
-}
-
-bool CFileBase::Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const throw()
-{
- #ifdef SUPPORT_DEVICE_FILE
- if (IsDeviceFile && SizeDefined && moveMethod == FILE_END)
- {
- distanceToMove += Size;
- moveMethod = FILE_BEGIN;
- }
- #endif
-
- LONG high = (LONG)(distanceToMove >> 32);
- DWORD low = ::SetFilePointer(_handle, (LONG)(distanceToMove & 0xFFFFFFFF), &high, moveMethod);
- if (low == 0xFFFFFFFF)
- if (::GetLastError() != NO_ERROR)
- return false;
- newPosition = (((UInt64)high) << 32) + low;
- return true;
-}
-
-bool CFileBase::Seek(UInt64 position, UInt64 &newPosition) const throw()
-{
- return Seek(position, FILE_BEGIN, newPosition);
-}
-
-bool CFileBase::SeekToBegin() const throw()
-{
- UInt64 newPosition;
- return Seek(0, newPosition);
-}
-
-bool CFileBase::SeekToEnd(UInt64 &newPosition) const throw()
-{
- return Seek(0, FILE_END, newPosition);
-}
-
-// ---------- CInFile ---------
-
-#ifdef SUPPORT_DEVICE_FILE
-
-void CInFile::CorrectDeviceSize()
-{
- // maybe we must decrease kClusterSize to 1 << 12, if we want correct size at tail
- static const UInt32 kClusterSize = 1 << 14;
- UInt64 pos = Size & ~(UInt64)(kClusterSize - 1);
- UInt64 realNewPosition;
- if (!Seek(pos, realNewPosition))
- return;
- Byte *buf = (Byte *)MidAlloc(kClusterSize);
-
- bool needbackward = true;
-
- for (;;)
- {
- UInt32 processed = 0;
- // up test is slow for "PhysicalDrive".
- // processed size for latest block for "PhysicalDrive0" is 0.
- if (!Read1(buf, kClusterSize, processed))
- break;
- if (processed == 0)
- break;
- needbackward = false;
- Size = pos + processed;
- if (processed != kClusterSize)
- break;
- pos += kClusterSize;
- }
-
- if (needbackward && pos != 0)
- {
- pos -= kClusterSize;
- for (;;)
- {
- // break;
- if (!Seek(pos, realNewPosition))
- break;
- if (!buf)
- {
- buf = (Byte *)MidAlloc(kClusterSize);
- if (!buf)
- break;
- }
- UInt32 processed = 0;
- // that code doesn't work for "PhysicalDrive0"
- if (!Read1(buf, kClusterSize, processed))
- break;
- if (processed != 0)
- {
- Size = pos + processed;
- break;
- }
- if (pos == 0)
- break;
- pos -= kClusterSize;
- }
- }
- MidFree(buf);
-}
-
-
-void CInFile::CalcDeviceSize(CFSTR s)
-{
- SizeDefined = false;
- Size = 0;
- if (_handle == INVALID_HANDLE_VALUE || !IsDeviceFile)
- return;
- #ifdef UNDER_CE
-
- SizeDefined = true;
- Size = 128 << 20;
-
- #else
-
- PARTITION_INFORMATION partInfo;
- bool needCorrectSize = true;
-
- /*
- WinXP 64-bit:
-
- HDD \\.\PhysicalDrive0 (MBR):
- GetPartitionInfo == GeometryEx : corrrect size? (includes tail)
- Geometry : smaller than GeometryEx (no tail, maybe correct too?)
- MyGetDiskFreeSpace : FAIL
- Size correction is slow and block size (kClusterSize) must be small?
-
- HDD partition \\.\N: (NTFS):
- MyGetDiskFreeSpace : Size of NTFS clusters. Same size can be calculated after correction
- GetPartitionInfo : size of partition data: NTFS clusters + TAIL; TAIL contains extra empty sectors and copy of first sector of NTFS
- Geometry / CdRomGeometry / GeometryEx : size of HDD (not that partition)
-
- CD-ROM drive (ISO):
- MyGetDiskFreeSpace : correct size. Same size can be calculated after correction
- Geometry == CdRomGeometry : smaller than corrrect size
- GetPartitionInfo == GeometryEx : larger than corrrect size
-
- Floppy \\.\a: (FAT):
- Geometry : correct size.
- CdRomGeometry / GeometryEx / GetPartitionInfo / MyGetDiskFreeSpace - FAIL
- correction works OK for FAT.
- correction works OK for non-FAT, if kClusterSize = 512.
- */
-
- if (GetPartitionInfo(&partInfo))
- {
- Size = partInfo.PartitionLength.QuadPart;
- SizeDefined = true;
- needCorrectSize = false;
- if ((s)[0] == '\\' && (s)[1] == '\\' && (s)[2] == '.' && (s)[3] == '\\' && (s)[5] == ':' && (s)[6] == 0)
- {
- FChar path[4] = { s[4], ':', '\\', 0 };
- UInt64 clusterSize, totalSize, freeSize;
- if (NSystem::MyGetDiskFreeSpace(path, clusterSize, totalSize, freeSize))
- Size = totalSize;
- else
- needCorrectSize = true;
- }
- }
-
- if (!SizeDefined)
- {
- my_DISK_GEOMETRY_EX geomEx;
- SizeDefined = GetGeometryEx(&geomEx);
- if (SizeDefined)
- Size = geomEx.DiskSize.QuadPart;
- else
- {
- DISK_GEOMETRY geom;
- SizeDefined = GetGeometry(&geom);
- if (!SizeDefined)
- SizeDefined = GetCdRomGeometry(&geom);
- if (SizeDefined)
- Size = geom.Cylinders.QuadPart * geom.TracksPerCylinder * geom.SectorsPerTrack * geom.BytesPerSector;
- }
- }
-
- if (needCorrectSize && SizeDefined && Size != 0)
- {
- CorrectDeviceSize();
- SeekToBegin();
- }
-
- // SeekToBegin();
- #endif
-}
-
-// ((desiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA | GENERIC_WRITE)) == 0 &&
-
-#define MY_DEVICE_EXTRA_CODE \
- IsDeviceFile = IsDevicePath(fileName); \
- CalcDeviceSize(fileName);
-#else
-#define MY_DEVICE_EXTRA_CODE
-#endif
-
-bool CInFile::Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes)
-{
- bool res = Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes);
- MY_DEVICE_EXTRA_CODE
- return res;
-}
-
-bool CInFile::OpenShared(CFSTR fileName, bool shareForWrite)
-{ return Open(fileName, FILE_SHARE_READ | (shareForWrite ? FILE_SHARE_WRITE : 0), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); }
-
-bool CInFile::Open(CFSTR fileName)
- { return OpenShared(fileName, false); }
-
-// ReadFile and WriteFile functions in Windows have BUG:
-// If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1)
-// from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES
-// (Insufficient system resources exist to complete the requested service).
-
-// Probably in some version of Windows there are problems with other sizes:
-// for 32 MB (maybe also for 16 MB).
-// And message can be "Network connection was lost"
-
-static UInt32 kChunkSizeMax = (1 << 22);
-
-bool CInFile::Read1(void *data, UInt32 size, UInt32 &processedSize) throw()
-{
- DWORD processedLoc = 0;
- bool res = BOOLToBool(::ReadFile(_handle, data, size, &processedLoc, NULL));
- processedSize = (UInt32)processedLoc;
- return res;
-}
-
-bool CInFile::ReadPart(void *data, UInt32 size, UInt32 &processedSize) throw()
-{
- if (size > kChunkSizeMax)
- size = kChunkSizeMax;
- return Read1(data, size, processedSize);
-}
-
-bool CInFile::Read(void *data, UInt32 size, UInt32 &processedSize) throw()
-{
- processedSize = 0;
- do
- {
- UInt32 processedLoc = 0;
- bool res = ReadPart(data, size, processedLoc);
- processedSize += processedLoc;
- if (!res)
- return false;
- if (processedLoc == 0)
- return true;
- data = (void *)((unsigned char *)data + processedLoc);
- size -= processedLoc;
- }
- while (size > 0);
- return true;
-}
-
-// ---------- COutFile ---------
-
-static inline DWORD GetCreationDisposition(bool createAlways)
- { return createAlways? CREATE_ALWAYS: CREATE_NEW; }
-
-bool COutFile::Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes)
- { return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, creationDisposition, flagsAndAttributes); }
-
-bool COutFile::Open(CFSTR fileName, DWORD creationDisposition)
- { return Open(fileName, FILE_SHARE_READ, creationDisposition, FILE_ATTRIBUTE_NORMAL); }
-
-bool COutFile::Create(CFSTR fileName, bool createAlways)
- { return Open(fileName, GetCreationDisposition(createAlways)); }
-
-bool COutFile::CreateAlways(CFSTR fileName, DWORD flagsAndAttributes)
- { return Open(fileName, FILE_SHARE_READ, GetCreationDisposition(true), flagsAndAttributes); }
-
-bool COutFile::SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime) throw()
- { return BOOLToBool(::SetFileTime(_handle, cTime, aTime, mTime)); }
-
-bool COutFile::SetMTime(const FILETIME *mTime) throw() { return SetTime(NULL, NULL, mTime); }
-
-bool COutFile::WritePart(const void *data, UInt32 size, UInt32 &processedSize) throw()
-{
- if (size > kChunkSizeMax)
- size = kChunkSizeMax;
- DWORD processedLoc = 0;
- bool res = BOOLToBool(::WriteFile(_handle, data, size, &processedLoc, NULL));
- processedSize = (UInt32)processedLoc;
- return res;
-}
-
-bool COutFile::Write(const void *data, UInt32 size, UInt32 &processedSize) throw()
-{
- processedSize = 0;
- do
- {
- UInt32 processedLoc = 0;
- bool res = WritePart(data, size, processedLoc);
- processedSize += processedLoc;
- if (!res)
- return false;
- if (processedLoc == 0)
- return true;
- data = (const void *)((const unsigned char *)data + processedLoc);
- size -= processedLoc;
- }
- while (size > 0);
- return true;
-}
-
-bool COutFile::SetEndOfFile() throw() { return BOOLToBool(::SetEndOfFile(_handle)); }
-
-bool COutFile::SetLength(UInt64 length) throw()
-{
- UInt64 newPosition;
- if (!Seek(length, newPosition))
- return false;
- if (newPosition != length)
- return false;
- return SetEndOfFile();
-}
-
-}}}
diff --git a/src/libs/7zip/win/CPP/Windows/FileIO.h b/src/libs/7zip/win/CPP/Windows/FileIO.h
deleted file mode 100644
index f595121ef..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileIO.h
+++ /dev/null
@@ -1,201 +0,0 @@
-// Windows/FileIO.h
-
-#ifndef __WINDOWS_FILE_IO_H
-#define __WINDOWS_FILE_IO_H
-
-#if defined(_WIN32) && !defined(UNDER_CE)
-#include <winioctl.h>
-#endif
-
-#include "../Common/MyString.h"
-#include "../Common/MyBuffer.h"
-
-#include "Defs.h"
-
-#define _my_IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
-#define _my_IO_REPARSE_TAG_SYMLINK (0xA000000CL)
-
-#define _my_SYMLINK_FLAG_RELATIVE 1
-
-#define my_FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) // REPARSE_DATA_BUFFER
-#define my_FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS) // REPARSE_DATA_BUFFER
-
-namespace NWindows {
-namespace NFile {
-
-#if defined(_WIN32) && !defined(UNDER_CE)
-bool FillLinkData(CByteBuffer &dest, const wchar_t *path, bool isSymLink);
-#endif
-
-struct CReparseShortInfo
-{
- unsigned Offset;
- unsigned Size;
-
- bool Parse(const Byte *p, size_t size);
-};
-
-struct CReparseAttr
-{
- UInt32 Tag;
- UInt32 Flags;
- UString SubsName;
- UString PrintName;
-
- CReparseAttr(): Tag(0), Flags(0) {}
- bool Parse(const Byte *p, size_t size);
-
- bool IsMountPoint() const { return Tag == _my_IO_REPARSE_TAG_MOUNT_POINT; } // it's Junction
- bool IsSymLink() const { return Tag == _my_IO_REPARSE_TAG_SYMLINK; }
- bool IsRelative() const { return Flags == _my_SYMLINK_FLAG_RELATIVE; }
- // bool IsVolume() const;
-
- bool IsOkNamePair() const;
- UString GetPath() const;
-};
-
-namespace NIO {
-
-bool GetReparseData(CFSTR path, CByteBuffer &reparseData, BY_HANDLE_FILE_INFORMATION *fileInfo = NULL);
-bool SetReparseData(CFSTR path, bool isDir, const void *data, DWORD size);
-
-class CFileBase
-{
-protected:
- HANDLE _handle;
-
- bool Create(CFSTR path, DWORD desiredAccess,
- DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
-
-public:
-
- bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inSize,
- LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned, LPOVERLAPPED overlapped = NULL) const
- {
- return BOOLToBool(::DeviceIoControl(_handle, controlCode, inBuffer, inSize,
- outBuffer, outSize, bytesReturned, overlapped));
- }
-
- bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned) const
- {
- return DeviceIoControl(controlCode, NULL, 0, outBuffer, outSize, bytesReturned);
- }
-
- bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize) const
- {
- DWORD bytesReturned;
- return DeviceIoControlOut(controlCode, outBuffer, outSize, &bytesReturned);
- }
-
-public:
- #ifdef SUPPORT_DEVICE_FILE
- bool IsDeviceFile;
- bool SizeDefined;
- UInt64 Size; // it can be larger than real available size
- #endif
-
- CFileBase(): _handle(INVALID_HANDLE_VALUE) {};
- ~CFileBase() { Close(); }
-
- bool Close() throw();
-
- bool GetPosition(UInt64 &position) const throw();
- bool GetLength(UInt64 &length) const throw();
-
- bool Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const throw();
- bool Seek(UInt64 position, UInt64 &newPosition) const throw();
- bool SeekToBegin() const throw();
- bool SeekToEnd(UInt64 &newPosition) const throw();
-
- bool GetFileInformation(BY_HANDLE_FILE_INFORMATION *info) const
- { return BOOLToBool(GetFileInformationByHandle(_handle, info)); }
-
- static bool GetFileInformation(CFSTR path, BY_HANDLE_FILE_INFORMATION *info)
- {
- NIO::CFileBase file;
- if (!file.Create(path, 0, FILE_SHARE_READ, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS))
- return false;
- return file.GetFileInformation(info);
- }
-};
-
-#ifndef UNDER_CE
-#define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM
-#define IOCTL_CDROM_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS)
-// #define IOCTL_CDROM_MEDIA_REMOVAL CTL_CODE(IOCTL_CDROM_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-// IOCTL_DISK_GET_DRIVE_GEOMETRY_EX works since WinXP
-#define my_IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-struct my_DISK_GEOMETRY_EX
-{
- DISK_GEOMETRY Geometry;
- LARGE_INTEGER DiskSize;
- BYTE Data[1];
-};
-#endif
-
-class CInFile: public CFileBase
-{
- #ifdef SUPPORT_DEVICE_FILE
-
- #ifndef UNDER_CE
-
- bool GetGeometry(DISK_GEOMETRY *res) const
- { return DeviceIoControlOut(IOCTL_DISK_GET_DRIVE_GEOMETRY, res, sizeof(*res)); }
-
- bool GetGeometryEx(my_DISK_GEOMETRY_EX *res) const
- { return DeviceIoControlOut(my_IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, res, sizeof(*res)); }
-
- bool GetCdRomGeometry(DISK_GEOMETRY *res) const
- { return DeviceIoControlOut(IOCTL_CDROM_GET_DRIVE_GEOMETRY, res, sizeof(*res)); }
-
- bool GetPartitionInfo(PARTITION_INFORMATION *res)
- { return DeviceIoControlOut(IOCTL_DISK_GET_PARTITION_INFO, LPVOID(res), sizeof(*res)); }
-
- #endif
-
- void CorrectDeviceSize();
- void CalcDeviceSize(CFSTR name);
-
- #endif
-
-public:
- bool Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
- bool OpenShared(CFSTR fileName, bool shareForWrite);
- bool Open(CFSTR fileName);
-
- #ifndef UNDER_CE
-
- bool OpenReparse(CFSTR fileName)
- {
- return Open(fileName, FILE_SHARE_READ, OPEN_EXISTING,
- FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS);
- }
-
- #endif
-
- bool Read1(void *data, UInt32 size, UInt32 &processedSize) throw();
- bool ReadPart(void *data, UInt32 size, UInt32 &processedSize) throw();
- bool Read(void *data, UInt32 size, UInt32 &processedSize) throw();
-};
-
-class COutFile: public CFileBase
-{
-public:
- bool Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
- bool Open(CFSTR fileName, DWORD creationDisposition);
- bool Create(CFSTR fileName, bool createAlways);
- bool CreateAlways(CFSTR fileName, DWORD flagsAndAttributes);
-
- bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime) throw();
- bool SetMTime(const FILETIME *mTime) throw();
- bool WritePart(const void *data, UInt32 size, UInt32 &processedSize) throw();
- bool Write(const void *data, UInt32 size, UInt32 &processedSize) throw();
- bool SetEndOfFile() throw();
- bool SetLength(UInt64 length) throw();
-};
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/FileLink.cpp b/src/libs/7zip/win/CPP/Windows/FileLink.cpp
deleted file mode 100644
index dc524700d..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileLink.cpp
+++ /dev/null
@@ -1,426 +0,0 @@
-// Windows/FileLink.cpp
-
-#include "StdAfx.h"
-
-#include "../../C/CpuArch.h"
-
-#ifdef SUPPORT_DEVICE_FILE
-#include "../../C/Alloc.h"
-#endif
-
-#include "FileDir.h"
-#include "FileFind.h"
-#include "FileIO.h"
-#include "FileName.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-namespace NWindows {
-namespace NFile {
-
-using namespace NName;
-
-/*
- Reparse Points (Junctions and Symbolic Links):
- struct
- {
- UInt32 Tag;
- UInt16 Size; // not including starting 8 bytes
- UInt16 Reserved; // = 0
-
- UInt16 SubstituteOffset; // offset in bytes from start of namesChars
- UInt16 SubstituteLen; // size in bytes, it doesn't include tailed NUL
- UInt16 PrintOffset; // offset in bytes from start of namesChars
- UInt16 PrintLen; // size in bytes, it doesn't include tailed NUL
-
- [UInt32] Flags; // for Symbolic Links only.
-
- UInt16 namesChars[]
- }
-
- MOUNT_POINT (Junction point):
- 1) there is NUL wchar after path
- 2) Default Order in table:
- Substitute Path
- Print Path
- 3) pathnames can not contain dot directory names
-
- SYMLINK:
- 1) there is no NUL wchar after path
- 2) Default Order in table:
- Print Path
- Substitute Path
-*/
-
-/*
-static const UInt32 kReparseFlags_Alias = (1 << 29);
-static const UInt32 kReparseFlags_HighLatency = (1 << 30);
-static const UInt32 kReparseFlags_Microsoft = ((UInt32)1 << 31);
-
-#define _my_IO_REPARSE_TAG_HSM (0xC0000004L)
-#define _my_IO_REPARSE_TAG_HSM2 (0x80000006L)
-#define _my_IO_REPARSE_TAG_SIS (0x80000007L)
-#define _my_IO_REPARSE_TAG_WIM (0x80000008L)
-#define _my_IO_REPARSE_TAG_CSV (0x80000009L)
-#define _my_IO_REPARSE_TAG_DFS (0x8000000AL)
-#define _my_IO_REPARSE_TAG_DFSR (0x80000012L)
-*/
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-
-#define Set16(p, v) SetUi16(p, v)
-#define Set32(p, v) SetUi32(p, v)
-
-static const wchar_t *k_LinkPrefix = L"\\??\\";
-static const unsigned k_LinkPrefix_Size = 4;
-
-static const bool IsLinkPrefix(const wchar_t *s)
-{
- return IsString1PrefixedByString2(s, k_LinkPrefix);
-}
-
-/*
-static const wchar_t *k_VolumePrefix = L"Volume{";
-static const bool IsVolumeName(const wchar_t *s)
-{
- return IsString1PrefixedByString2(s, k_VolumePrefix);
-}
-*/
-
-void WriteString(Byte *dest, const wchar_t *path)
-{
- for (;;)
- {
- wchar_t c = *path++;
- if (c == 0)
- return;
- Set16(dest, (UInt16)c);
- dest += 2;
- }
-}
-
-bool FillLinkData(CByteBuffer &dest, const wchar_t *path, bool isSymLink)
-{
- bool isAbs = IsAbsolutePath(path);
- if (!isAbs && !isSymLink)
- return false;
-
- bool needPrintName = true;
-
- if (IsSuperPath(path))
- {
- path += kSuperPathPrefixSize;
- if (!IsDrivePath(path))
- needPrintName = false;
- }
-
- const unsigned add_Prefix_Len = isAbs ? k_LinkPrefix_Size : 0;
-
- unsigned len2 = MyStringLen(path) * 2;
- const unsigned len1 = len2 + add_Prefix_Len * 2;
- if (!needPrintName)
- len2 = 0;
-
- unsigned totalNamesSize = (len1 + len2);
-
- /* some WIM imagex software uses old scheme for symbolic links.
- so we can old scheme for byte to byte compatibility */
-
- bool newOrderScheme = isSymLink;
- // newOrderScheme = false;
-
- if (!newOrderScheme)
- totalNamesSize += 2 * 2;
-
- const size_t size = 8 + 8 + (isSymLink ? 4 : 0) + totalNamesSize;
- dest.Alloc(size);
- memset(dest, 0, size);
- const UInt32 tag = isSymLink ?
- _my_IO_REPARSE_TAG_SYMLINK :
- _my_IO_REPARSE_TAG_MOUNT_POINT;
- Byte *p = dest;
- Set32(p, tag);
- Set16(p + 4, (UInt16)(size - 8));
- Set16(p + 6, 0);
- p += 8;
-
- unsigned subOffs = 0;
- unsigned printOffs = 0;
- if (newOrderScheme)
- subOffs = len2;
- else
- printOffs = len1 + 2;
-
- Set16(p + 0, (UInt16)subOffs);
- Set16(p + 2, (UInt16)len1);
- Set16(p + 4, (UInt16)printOffs);
- Set16(p + 6, (UInt16)len2);
-
- p += 8;
- if (isSymLink)
- {
- UInt32 flags = isAbs ? 0 : _my_SYMLINK_FLAG_RELATIVE;
- Set32(p, flags);
- p += 4;
- }
-
- if (add_Prefix_Len != 0)
- WriteString(p + subOffs, k_LinkPrefix);
- WriteString(p + subOffs + add_Prefix_Len * 2, path);
- if (needPrintName)
- WriteString(p + printOffs, path);
- return true;
-}
-
-static void GetString(const Byte *p, unsigned len, UString &res)
-{
- wchar_t *s = res.GetBuffer(len);
- for (unsigned i = 0; i < len; i++)
- s[i] = Get16(p + i * 2);
- s[len] = 0;
- res.ReleaseBuffer();
-}
-
-bool CReparseAttr::Parse(const Byte *p, size_t size)
-{
- if (size < 8)
- return false;
- Tag = Get32(p);
- UInt32 len = Get16(p + 4);
- if (len + 8 > size)
- return false;
- /*
- if ((type & kReparseFlags_Alias) == 0 ||
- (type & kReparseFlags_Microsoft) == 0 ||
- (type & 0xFFFF) != 3)
- */
- if (Tag != _my_IO_REPARSE_TAG_MOUNT_POINT &&
- Tag != _my_IO_REPARSE_TAG_SYMLINK)
- // return true;
- return false;
-
- if (Get16(p + 6) != 0) // padding
- return false;
-
- p += 8;
- size -= 8;
-
- if (len != size) // do we need that check?
- return false;
-
- if (len < 8)
- return false;
- unsigned subOffs = Get16(p);
- unsigned subLen = Get16(p + 2);
- unsigned printOffs = Get16(p + 4);
- unsigned printLen = Get16(p + 6);
- len -= 8;
- p += 8;
-
- Flags = 0;
- if (Tag == _my_IO_REPARSE_TAG_SYMLINK)
- {
- if (len < 4)
- return false;
- Flags = Get32(p);
- len -= 4;
- p += 4;
- }
-
- if ((subOffs & 1) != 0 || subOffs > len || len - subOffs < subLen)
- return false;
- if ((printOffs & 1) != 0 || printOffs > len || len - printOffs < printLen)
- return false;
- GetString(p + subOffs, subLen >> 1, SubsName);
- GetString(p + printOffs, printLen >> 1, PrintName);
-
- return true;
-}
-
-bool CReparseShortInfo::Parse(const Byte *p, size_t size)
-{
- const Byte *start = p;
- Offset= 0;
- Size = 0;
- if (size < 8)
- return false;
- UInt32 Tag = Get32(p);
- UInt32 len = Get16(p + 4);
- if (len + 8 > size)
- return false;
- /*
- if ((type & kReparseFlags_Alias) == 0 ||
- (type & kReparseFlags_Microsoft) == 0 ||
- (type & 0xFFFF) != 3)
- */
- if (Tag != _my_IO_REPARSE_TAG_MOUNT_POINT &&
- Tag != _my_IO_REPARSE_TAG_SYMLINK)
- // return true;
- return false;
-
- if (Get16(p + 6) != 0) // padding
- return false;
-
- p += 8;
- size -= 8;
-
- if (len != size) // do we need that check?
- return false;
-
- if (len < 8)
- return false;
- unsigned subOffs = Get16(p);
- unsigned subLen = Get16(p + 2);
- unsigned printOffs = Get16(p + 4);
- unsigned printLen = Get16(p + 6);
- len -= 8;
- p += 8;
-
- // UInt32 Flags = 0;
- if (Tag == _my_IO_REPARSE_TAG_SYMLINK)
- {
- if (len < 4)
- return false;
- // Flags = Get32(p);
- len -= 4;
- p += 4;
- }
-
- if ((subOffs & 1) != 0 || subOffs > len || len - subOffs < subLen)
- return false;
- if ((printOffs & 1) != 0 || printOffs > len || len - printOffs < printLen)
- return false;
-
- Offset = (unsigned)(p - start) + subOffs;
- Size = subLen;
- return true;
-}
-
-bool CReparseAttr::IsOkNamePair() const
-{
- if (IsLinkPrefix(SubsName))
- {
- if (!IsDrivePath(SubsName.Ptr(k_LinkPrefix_Size)))
- return PrintName.IsEmpty();
- if (wcscmp(SubsName.Ptr(k_LinkPrefix_Size), PrintName) == 0)
- return true;
- }
- return wcscmp(SubsName, PrintName) == 0;
-}
-
-/*
-bool CReparseAttr::IsVolume() const
-{
- if (!IsLinkPrefix(SubsName))
- return false;
- return IsVolumeName(SubsName.Ptr(k_LinkPrefix_Size));
-}
-*/
-
-UString CReparseAttr::GetPath() const
-{
- UString s = SubsName;
- if (IsLinkPrefix(s))
- {
- s.ReplaceOneCharAtPos(1, '\\');
- if (IsDrivePath(s.Ptr(k_LinkPrefix_Size)))
- s.DeleteFrontal(k_LinkPrefix_Size);
- }
- return s;
-}
-
-
-#ifdef SUPPORT_DEVICE_FILE
-
-namespace NSystem
-{
-bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize);
-}
-#endif
-
-#ifndef UNDER_CE
-
-namespace NIO {
-
-bool GetReparseData(CFSTR path, CByteBuffer &reparseData, BY_HANDLE_FILE_INFORMATION *fileInfo)
-{
- reparseData.Free();
- CInFile file;
- if (!file.OpenReparse(path))
- return false;
-
- if (fileInfo)
- file.GetFileInformation(fileInfo);
-
- const unsigned kBufSize = MAXIMUM_REPARSE_DATA_BUFFER_SIZE;
- CByteArr buf(kBufSize);
- DWORD returnedSize;
- if (!file.DeviceIoControlOut(my_FSCTL_GET_REPARSE_POINT, buf, kBufSize, &returnedSize))
- return false;
- reparseData.CopyFrom(buf, returnedSize);
- return true;
-}
-
-static bool CreatePrefixDirOfFile(CFSTR path)
-{
- FString path2 = path;
- int pos = path2.ReverseFind(FCHAR_PATH_SEPARATOR);
- if (pos < 0)
- return true;
- #ifdef _WIN32
- if (pos == 2 && path2[1] == L':')
- return true; // we don't create Disk folder;
- #endif
- path2.DeleteFrom(pos);
- return NDir::CreateComplexDir(path2);
-}
-
-// If there is Reprase data already, it still writes new Reparse data
-bool SetReparseData(CFSTR path, bool isDir, const void *data, DWORD size)
-{
- NFile::NFind::CFileInfo fi;
- if (fi.Find(path))
- {
- if (fi.IsDir() != isDir)
- {
- ::SetLastError(ERROR_DIRECTORY);
- return false;
- }
- }
- else
- {
- if (isDir)
- {
- if (!NDir::CreateComplexDir(path))
- return false;
- }
- else
- {
- CreatePrefixDirOfFile(path);
- COutFile file;
- if (!file.Create(path, CREATE_NEW))
- return false;
- }
- }
-
- COutFile file;
- if (!file.Open(path,
- FILE_SHARE_WRITE,
- OPEN_EXISTING,
- FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS))
- return false;
-
- DWORD returnedSize;
- if (!file.DeviceIoControl(my_FSCTL_SET_REPARSE_POINT, (void *)data, size, NULL, 0, &returnedSize))
- return false;
- return true;
-}
-
-}
-
-#endif
-
-}}
diff --git a/src/libs/7zip/win/CPP/Windows/FileMapping.h b/src/libs/7zip/win/CPP/Windows/FileMapping.h
deleted file mode 100644
index f90c429f1..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileMapping.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Windows/FileMapping.h
-
-#ifndef __WINDOWS_FILEMAPPING_H
-#define __WINDOWS_FILEMAPPING_H
-
-#include "../Common/MyTypes.h"
-
-#include "Handle.h"
-
-namespace NWindows {
-
-class CFileMapping: public CHandle
-{
-public:
- WRes Create(DWORD protect, UInt64 maxSize, LPCTSTR name)
- {
- _handle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, protect, (DWORD)(maxSize >> 32), (DWORD)maxSize, name);
- return ::GetLastError();
- }
-
- WRes Open(DWORD
- #ifndef UNDER_CE
- desiredAccess
- #endif
- , LPCTSTR name)
- {
- #ifdef UNDER_CE
- WRes res = Create(PAGE_READONLY, 0, name);
- if (res == ERROR_ALREADY_EXISTS)
- return 0;
- Close();
- if (res == 0)
- res = ERROR_FILE_NOT_FOUND;
- return res;
- #else
- _handle = ::OpenFileMapping(desiredAccess, FALSE, name);
- if (_handle != 0)
- return 0;
- return ::GetLastError();
- #endif
- }
-
- LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap)
- {
- return ::MapViewOfFile(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap);
- }
-
- #ifndef UNDER_CE
- LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap, LPVOID baseAddress)
- {
- return ::MapViewOfFileEx(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap, baseAddress);
- }
- #endif
-};
-
-class CFileUnmapper
-{
- const void *_data;
-public:
- CFileUnmapper(const void *data) : _data(data) {}
- ~CFileUnmapper() { ::UnmapViewOfFile(_data); }
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/FileName.cpp b/src/libs/7zip/win/CPP/Windows/FileName.cpp
deleted file mode 100644
index 0a6aee100..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileName.cpp
+++ /dev/null
@@ -1,687 +0,0 @@
-// Windows/FileName.cpp
-
-#include "StdAfx.h"
-
-#include "FileName.h"
-
-#ifndef _UNICODE
-extern bool g_IsNT;
-#endif
-
-namespace NWindows {
-namespace NFile {
-namespace NName {
-
-#ifndef USE_UNICODE_FSTRING
-void NormalizeDirPathPrefix(FString &dirPath)
-{
- if (dirPath.IsEmpty())
- return;
- if (dirPath.Back() != FCHAR_PATH_SEPARATOR)
- dirPath += FCHAR_PATH_SEPARATOR;
-}
-#endif
-
-void NormalizeDirPathPrefix(UString &dirPath)
-{
- if (dirPath.IsEmpty())
- return;
- if (dirPath.Back() != WCHAR_PATH_SEPARATOR)
- dirPath += WCHAR_PATH_SEPARATOR;
-}
-
-
-#ifdef _WIN32
-
-const wchar_t *kSuperPathPrefix = L"\\\\?\\";
-static const wchar_t *kSuperUncPrefix = L"\\\\?\\UNC\\";
-
-#define IS_DEVICE_PATH(s) ((s)[0] == '\\' && (s)[1] == '\\' && (s)[2] == '.' && (s)[3] == '\\')
-#define IS_SUPER_PREFIX(s) ((s)[0] == '\\' && (s)[1] == '\\' && (s)[2] == '?' && (s)[3] == '\\')
-#define IS_SUPER_OR_DEVICE_PATH(s) ((s)[0] == '\\' && (s)[1] == '\\' && ((s)[2] == '?' || (s)[2] == '.') && (s)[3] == '\\')
-#define IS_LETTER_CHAR(c) ((c) >= 'a' && (c) <= 'z' || (c) >= 'A' && (c) <= 'Z')
-
-#define IS_UNC_WITH_SLASH(s) ( \
- ((s)[0] == 'U' || (s)[0] == 'u') && \
- ((s)[1] == 'N' || (s)[1] == 'n') && \
- ((s)[2] == 'C' || (s)[2] == 'c') && \
- (s)[3] == '\\')
-
-bool IsDevicePath(CFSTR s) throw()
-{
- #ifdef UNDER_CE
-
- s = s;
- return false;
- /*
- // actually we don't know the way to open device file in WinCE.
- unsigned len = MyStringLen(s);
- if (len < 5 || len > 5 || memcmp(s, FTEXT("DSK"), 3 * sizeof(FChar)) != 0)
- return false;
- if (s[4] != ':')
- return false;
- // for reading use SG_REQ sg; if (DeviceIoControl(dsk, IOCTL_DISK_READ));
- */
-
- #else
-
- if (!IS_DEVICE_PATH(s))
- return false;
- unsigned len = MyStringLen(s);
- if (len == 6 && s[5] == ':')
- return true;
- if (len < 18 || len > 22 || memcmp(s + kDevicePathPrefixSize, FTEXT("PhysicalDrive"), 13 * sizeof(FChar)) != 0)
- return false;
- for (unsigned i = 17; i < len; i++)
- if (s[i] < '0' || s[i] > '9')
- return false;
- return true;
-
- #endif
-}
-
-bool IsSuperUncPath(CFSTR s) throw() { return (IS_SUPER_PREFIX(s) && IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize)); }
-
-bool IsDrivePath(const wchar_t *s) throw() { return IS_LETTER_CHAR(s[0]) && s[1] == ':' && s[2] == '\\'; }
-bool IsSuperPath(const wchar_t *s) throw() { return IS_SUPER_PREFIX(s); }
-bool IsSuperOrDevicePath(const wchar_t *s) throw() { return IS_SUPER_OR_DEVICE_PATH(s); }
-// bool IsSuperUncPath(const wchar_t *s) { return (IS_SUPER_PREFIX(s) && IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize)); }
-
-#ifndef USE_UNICODE_FSTRING
-bool IsDrivePath(CFSTR s) throw() { return IS_LETTER_CHAR(s[0]) && s[1] == ':' && s[2] == '\\'; }
-bool IsSuperPath(CFSTR s) throw() { return IS_SUPER_PREFIX(s); }
-bool IsSuperOrDevicePath(CFSTR s) throw() { return IS_SUPER_OR_DEVICE_PATH(s); }
-#endif // USE_UNICODE_FSTRING
-
-bool IsAbsolutePath(const wchar_t *s) throw()
-{
- return s[0] == WCHAR_PATH_SEPARATOR || IsDrivePath(s);
-}
-
-static const unsigned kDrivePrefixSize = 3; /* c:\ */
-
-#ifndef USE_UNICODE_FSTRING
-
-static unsigned GetRootPrefixSize_Of_NetworkPath(CFSTR s) throw()
-{
- // Network path: we look "server\path\" as root prefix
- int pos = FindCharPosInString(s, '\\');
- if (pos < 0)
- return 0;
- int pos2 = FindCharPosInString(s + pos + 1, '\\');
- if (pos2 < 0)
- return 0;
- return pos + pos2 + 2;
-}
-
-static unsigned GetRootPrefixSize_Of_SimplePath(CFSTR s) throw()
-{
- if (IsDrivePath(s))
- return kDrivePrefixSize;
- if (s[0] != '\\' || s[1] != '\\')
- return 0;
- unsigned size = GetRootPrefixSize_Of_NetworkPath(s + 2);
- return (size == 0) ? 0 : 2 + size;
-}
-
-static unsigned GetRootPrefixSize_Of_SuperPath(CFSTR s) throw()
-{
- if (IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize))
- {
- unsigned size = GetRootPrefixSize_Of_NetworkPath(s + kSuperUncPathPrefixSize);
- return (size == 0) ? 0 : kSuperUncPathPrefixSize + size;
- }
- // we support \\?\c:\ paths and volume GUID paths \\?\Volume{GUID}\"
- int pos = FindCharPosInString(s + kSuperPathPrefixSize, FCHAR_PATH_SEPARATOR);
- if (pos < 0)
- return 0;
- return kSuperPathPrefixSize + pos + 1;
-}
-
-unsigned GetRootPrefixSize(CFSTR s) throw()
-{
- if (IS_DEVICE_PATH(s))
- return kDevicePathPrefixSize;
- if (IsSuperPath(s))
- return GetRootPrefixSize_Of_SuperPath(s);
- return GetRootPrefixSize_Of_SimplePath(s);
-}
-
-#endif // USE_UNICODE_FSTRING
-
-static unsigned GetRootPrefixSize_Of_NetworkPath(const wchar_t *s) throw()
-{
- // Network path: we look "server\path\" as root prefix
- int pos = FindCharPosInString(s, L'\\');
- if (pos < 0)
- return 0;
- int pos2 = FindCharPosInString(s + pos + 1, L'\\');
- if (pos2 < 0)
- return 0;
- return pos + pos2 + 2;
-}
-
-static unsigned GetRootPrefixSize_Of_SimplePath(const wchar_t *s) throw()
-{
- if (IsDrivePath(s))
- return kDrivePrefixSize;
- if (s[0] != '\\' || s[1] != '\\')
- return 0;
- unsigned size = GetRootPrefixSize_Of_NetworkPath(s + 2);
- return (size == 0) ? 0 : 2 + size;
-}
-
-static unsigned GetRootPrefixSize_Of_SuperPath(const wchar_t *s) throw()
-{
- if (IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize))
- {
- unsigned size = GetRootPrefixSize_Of_NetworkPath(s + kSuperUncPathPrefixSize);
- return (size == 0) ? 0 : kSuperUncPathPrefixSize + size;
- }
- // we support \\?\c:\ paths and volume GUID paths \\?\Volume{GUID}\"
- int pos = FindCharPosInString(s + kSuperPathPrefixSize, L'\\');
- if (pos < 0)
- return 0;
- return kSuperPathPrefixSize + pos + 1;
-}
-
-unsigned GetRootPrefixSize(const wchar_t *s) throw()
-{
- if (IS_DEVICE_PATH(s))
- return kDevicePathPrefixSize;
- if (IsSuperPath(s))
- return GetRootPrefixSize_Of_SuperPath(s);
- return GetRootPrefixSize_Of_SimplePath(s);
-}
-
-#else // _WIN32
-
-bool IsAbsolutePath(const wchar_t *s) throw() { return s[0] == WCHAR_PATH_SEPARATOR }
-
-#ifndef USE_UNICODE_FSTRING
-unsigned GetRootPrefixSize(CFSTR s) throw() { return s[0] == CHAR_PATH_SEPRATOR ? 1 : 0; }
-#endif
-unsigned GetRootPrefixSize(const wchar_t *s) throw() { return s[0] == CHAR_PATH_SEPRATOR ? 1 : 0; }
-
-#endif // _WIN32
-
-
-#ifndef UNDER_CE
-
-static bool GetCurDir(UString &path)
-{
- path.Empty();
- DWORD needLength;
- #ifndef _UNICODE
- if (!g_IsNT)
- {
- TCHAR s[MAX_PATH + 2];
- s[0] = 0;
- needLength = ::GetCurrentDirectory(MAX_PATH + 1, s);
- path = fs2us(fas2fs(s));
- }
- else
- #endif
- {
- WCHAR s[MAX_PATH + 2];
- s[0] = 0;
- needLength = ::GetCurrentDirectoryW(MAX_PATH + 1, s);
- path = s;
- }
- return (needLength > 0 && needLength <= MAX_PATH);
-}
-
-static bool ResolveDotsFolders(UString &s)
-{
- #ifdef _WIN32
- s.Replace(L'/', WCHAR_PATH_SEPARATOR);
- #endif
- for (int i = 0;;)
- {
- wchar_t c = s[i];
- if (c == 0)
- return true;
- if (c == '.' && (i == 0 || s[i - 1] == WCHAR_PATH_SEPARATOR))
- {
- wchar_t c1 = s[i + 1];
- if (c1 == '.')
- {
- wchar_t c2 = s[i + 2];
- if (c2 == WCHAR_PATH_SEPARATOR || c2 == 0)
- {
- if (i == 0)
- return false;
- int k = i - 2;
- for (; k >= 0; k--)
- if (s[k] == WCHAR_PATH_SEPARATOR)
- break;
- unsigned num;
- if (k >= 0)
- {
- num = i + 2 - k;
- i = k;
- }
- else
- {
- num = (c2 == 0 ? (i + 2) : (i + 3));
- i = 0;
- }
- s.Delete(i, num);
- continue;
- }
- }
- else
- {
- if (c1 == WCHAR_PATH_SEPARATOR || c1 == 0)
- {
- unsigned num = 2;
- if (i != 0)
- i--;
- else if (c1 == 0)
- num = 1;
- s.Delete(i, num);
- continue;
- }
- }
- }
- i++;
- }
-}
-
-#endif // UNDER_CE
-
-#define LONG_PATH_DOTS_FOLDERS_PARSING
-
-
-/*
-Windows (at least 64-bit XP) can't resolve "." or ".." in paths that start with SuperPrefix \\?\
-To solve that problem we check such path:
- - super path contains "." or ".." - we use kSuperPathType_UseOnlySuper
- - super path doesn't contain "." or ".." - we use kSuperPathType_UseOnlyMain
-*/
-#ifdef LONG_PATH_DOTS_FOLDERS_PARSING
-#ifndef UNDER_CE
-static bool AreThereDotsFolders(CFSTR s)
-{
- for (unsigned i = 0;; i++)
- {
- FChar c = s[i];
- if (c == 0)
- return false;
- if (c == '.' && (i == 0 || s[i - 1] == CHAR_PATH_SEPARATOR))
- {
- FChar c1 = s[i + 1];
- if (c1 == 0 || c1 == CHAR_PATH_SEPARATOR ||
- (c1 == '.' && (s[i + 2] == 0 || s[i + 2] == CHAR_PATH_SEPARATOR)))
- return true;
- }
- }
-}
-#endif
-#endif // LONG_PATH_DOTS_FOLDERS_PARSING
-
-#ifdef WIN_LONG_PATH
-
-/*
-Most of Windows versions have problems, if some file or dir name
-contains '.' or ' ' at the end of name (Bad Path).
-To solve that problem, we always use Super Path ("\\?\" prefix and full path)
-in such cases. Note that "." and ".." are not bad names.
-
-There are 3 cases:
- 1) If the path is already Super Path, we use that path
- 2) If the path is not Super Path :
- 2.1) Bad Path; we use only Super Path.
- 2.2) Good Path; we use Main Path. If it fails, we use Super Path.
-
- NeedToUseOriginalPath returns:
- kSuperPathType_UseOnlyMain : Super already
- kSuperPathType_UseOnlySuper : not Super, Bad Path
- kSuperPathType_UseMainAndSuper : not Super, Good Path
-*/
-
-int GetUseSuperPathType(CFSTR s) throw()
-{
- if (IsSuperOrDevicePath(s))
- {
- #ifdef LONG_PATH_DOTS_FOLDERS_PARSING
- if ((s)[2] != '.')
- if (AreThereDotsFolders(s + kSuperPathPrefixSize))
- return kSuperPathType_UseOnlySuper;
- #endif
- return kSuperPathType_UseOnlyMain;
- }
-
- for (unsigned i = 0;; i++)
- {
- FChar c = s[i];
- if (c == 0)
- return kSuperPathType_UseMainAndSuper;
- if (c == '.' || c == ' ')
- {
- FChar c2 = s[i + 1];
- if (c2 == 0 || c2 == CHAR_PATH_SEPARATOR)
- {
- // if it's "." or "..", it's not bad name.
- if (c == '.')
- {
- if (i == 0 || s[i - 1] == CHAR_PATH_SEPARATOR)
- continue;
- if (s[i - 1] == '.')
- {
- if (i - 1 == 0 || s[i - 2] == CHAR_PATH_SEPARATOR)
- continue;
- }
- }
- return kSuperPathType_UseOnlySuper;
- }
- }
- }
-}
-
-
-/*
- returns false in two cases:
- - if GetCurDir was used, and GetCurDir returned error.
- - if we can't resolve ".." name.
- if path is ".", "..", res is empty.
- if it's Super Path already, res is empty.
- for \**** , and if GetCurDir is not drive (c:\), res is empty
- for absolute paths, returns true, res is Super path.
-*/
-
-
-static bool GetSuperPathBase(CFSTR s, UString &res)
-{
- res.Empty();
-
- FChar c = s[0];
- if (c == 0)
- return true;
- if (c == '.' && (s[1] == 0 || (s[1] == '.' && s[2] == 0)))
- return true;
-
- if (IsSuperOrDevicePath(s))
- {
- #ifdef LONG_PATH_DOTS_FOLDERS_PARSING
-
- if ((s)[2] == '.')
- return true;
-
- // we will return true here, so we will try to use these problem paths.
-
- if (!AreThereDotsFolders(s + kSuperPathPrefixSize))
- return true;
-
- UString temp = fs2us(s);
- unsigned fixedSize = GetRootPrefixSize_Of_SuperPath(temp);
- if (fixedSize == 0)
- return true;
-
- UString rem = &temp[fixedSize];
- if (!ResolveDotsFolders(rem))
- return true;
-
- temp.DeleteFrom(fixedSize);
- res += temp;
- res += rem;
-
- #endif
-
- return true;
- }
-
- if (c == CHAR_PATH_SEPARATOR)
- {
- if (s[1] == CHAR_PATH_SEPARATOR)
- {
- UString temp = fs2us(s + 2);
- unsigned fixedSize = GetRootPrefixSize_Of_NetworkPath(temp);
- if (fixedSize == 0) // maybe we must ignore that error to allow short network paths?
- return false;
- UString rem = &temp[fixedSize];
- if (!ResolveDotsFolders(rem))
- return false;
- res += kSuperUncPrefix;
- temp.DeleteFrom(fixedSize);
- res += temp;
- res += rem;
- return true;
- }
- }
- else
- {
- if (IsDrivePath(s))
- {
- UString temp = fs2us(s);
- UString rem = &temp[kDrivePrefixSize];
- if (!ResolveDotsFolders(rem))
- return true;
- res += kSuperPathPrefix;
- temp.DeleteFrom(kDrivePrefixSize);
- res += temp;
- res += rem;
- return true;
- }
- }
-
- UString curDir;
- if (!GetCurDir(curDir))
- return false;
- if (curDir.Back() != WCHAR_PATH_SEPARATOR)
- curDir += WCHAR_PATH_SEPARATOR;
-
- unsigned fixedSizeStart = 0;
- unsigned fixedSize = 0;
- const wchar_t *superMarker = NULL;
- if (IsSuperPath(curDir))
- {
- fixedSize = GetRootPrefixSize_Of_SuperPath(curDir);
- if (fixedSize == 0)
- return false;
- }
- else
- {
- if (IsDrivePath(curDir))
- {
- superMarker = kSuperPathPrefix;
- fixedSize = kDrivePrefixSize;
- }
- else
- {
- if (curDir[0] != CHAR_PATH_SEPARATOR || curDir[1] != CHAR_PATH_SEPARATOR)
- return false;
- fixedSizeStart = 2;
- fixedSize = GetRootPrefixSize_Of_NetworkPath(&curDir[2]);
- if (fixedSize == 0)
- return false;
- superMarker = kSuperUncPrefix;
- }
- }
-
- UString temp;
- if (c == CHAR_PATH_SEPARATOR)
- {
- temp = fs2us(s + 1);
- }
- else
- {
- temp += &curDir[fixedSizeStart + fixedSize];
- temp += fs2us(s);
- }
- if (!ResolveDotsFolders(temp))
- return false;
- if (superMarker)
- res += superMarker;
- res += curDir.Mid(fixedSizeStart, fixedSize);
- res += temp;
- return true;
-}
-
-
-/*
- In that case if GetSuperPathBase doesn't return new path, we don't need
- to use same path that was used as main path
-
- GetSuperPathBase superPath.IsEmpty() onlyIfNew
- false * * GetCurDir Error
- true false * use Super path
- true true true don't use any path, we already used mainPath
- true true false use main path as Super Path, we don't try mainMath
- That case is possible now if GetCurDir returns unknow
- type of path (not drive and not network)
-
- We can change that code if we want to try mainPath, if GetSuperPathBase returns error,
- and we didn't try mainPath still.
- If we want to work that way, we don't need to use GetSuperPathBase return code.
-*/
-
-bool GetSuperPath(CFSTR path, UString &superPath, bool onlyIfNew)
-{
- if (GetSuperPathBase(path, superPath))
- {
- if (superPath.IsEmpty())
- {
- // actually the only possible when onlyIfNew == true and superPath is empty
- // is case when
-
- if (onlyIfNew)
- return false;
- superPath = fs2us(path);
- }
- return true;
- }
- return false;
-}
-
-bool GetSuperPaths(CFSTR s1, CFSTR s2, UString &d1, UString &d2, bool onlyIfNew)
-{
- if (!GetSuperPathBase(s1, d1) ||
- !GetSuperPathBase(s2, d2))
- return false;
- if (d1.IsEmpty() && d2.IsEmpty() && onlyIfNew)
- return false;
- if (d1.IsEmpty()) d1 = fs2us(s1);
- if (d2.IsEmpty()) d2 = fs2us(s2);
- return true;
-}
-
-
-/*
-// returns true, if we need additional use with New Super path.
-bool GetSuperPath(CFSTR path, UString &superPath)
-{
- if (GetSuperPathBase(path, superPath))
- return !superPath.IsEmpty();
- return false;
-}
-*/
-#endif // WIN_LONG_PATH
-
-bool GetFullPath(CFSTR dirPrefix, CFSTR s, FString &res)
-{
- res = s;
-
- #ifdef UNDER_CE
-
- if (s[0] != CHAR_PATH_SEPARATOR)
- {
- if (!dirPrefix)
- return false;
- res = dirPrefix;
- res += s;
- }
-
- #else
-
- unsigned prefixSize = GetRootPrefixSize(s);
- if (prefixSize != 0)
- {
- if (!AreThereDotsFolders(s + prefixSize))
- return true;
-
- UString rem = fs2us(s + prefixSize);
- if (!ResolveDotsFolders(rem))
- return true; // maybe false;
- res.DeleteFrom(prefixSize);
- res += us2fs(rem);
- return true;
- }
-
- /*
- FChar c = s[0];
- if (c == 0)
- return true;
- if (c == '.' && (s[1] == 0 || (s[1] == '.' && s[2] == 0)))
- return true;
- if (c == CHAR_PATH_SEPARATOR && s[1] == CHAR_PATH_SEPARATOR)
- return true;
- if (IsDrivePath(s))
- return true;
- */
-
- UString curDir;
- if (dirPrefix)
- curDir = fs2us(dirPrefix);
- else
- {
- if (!GetCurDir(curDir))
- return false;
- }
- if (!curDir.IsEmpty() && curDir.Back() != WCHAR_PATH_SEPARATOR)
- curDir += WCHAR_PATH_SEPARATOR;
-
- unsigned fixedSize = 0;
-
- #ifdef _WIN32
-
- if (IsSuperPath(curDir))
- {
- fixedSize = GetRootPrefixSize_Of_SuperPath(curDir);
- if (fixedSize == 0)
- return false;
- }
- else
- {
- if (IsDrivePath(curDir))
- fixedSize = kDrivePrefixSize;
- else
- {
- if (curDir[0] != WCHAR_PATH_SEPARATOR || curDir[1] != WCHAR_PATH_SEPARATOR)
- return false;
- fixedSize = GetRootPrefixSize_Of_NetworkPath(&curDir[2]);
- if (fixedSize == 0)
- return false;
- fixedSize += 2;
- }
- }
-
- #endif // _WIN32
-
- UString temp;
- if (s[0] == CHAR_PATH_SEPARATOR)
- {
- temp = fs2us(s + 1);
- }
- else
- {
- temp += curDir.Ptr(fixedSize);
- temp += fs2us(s);
- }
- if (!ResolveDotsFolders(temp))
- return false;
- curDir.DeleteFrom(fixedSize);
- res = us2fs(curDir);
- res += us2fs(temp);
-
- #endif // UNDER_CE
-
- return true;
-}
-
-bool GetFullPath(CFSTR path, FString &fullPath)
-{
- return GetFullPath(NULL, path, fullPath);
-}
-
-}}}
diff --git a/src/libs/7zip/win/CPP/Windows/FileName.h b/src/libs/7zip/win/CPP/Windows/FileName.h
deleted file mode 100644
index 04fc79b2d..000000000
--- a/src/libs/7zip/win/CPP/Windows/FileName.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Windows/FileName.h
-
-#ifndef __WINDOWS_FILE_NAME_H
-#define __WINDOWS_FILE_NAME_H
-
-#include "../Common/MyString.h"
-
-namespace NWindows {
-namespace NFile {
-namespace NName {
-
-void NormalizeDirPathPrefix(FString &dirPath); // ensures that it ended with '\\', if dirPath is not epmty
-void NormalizeDirPathPrefix(UString &dirPath);
-
-#ifdef _WIN32
-
-extern const wchar_t *kSuperPathPrefix; /* \\?\ */
-const unsigned kDevicePathPrefixSize = 4;
-const unsigned kSuperPathPrefixSize = 4;
-const unsigned kSuperUncPathPrefixSize = kSuperPathPrefixSize + 4;
-
-bool IsDevicePath(CFSTR s) throw(); /* \\.\ */
-bool IsSuperUncPath(CFSTR s) throw();
-
-bool IsDrivePath(const wchar_t *s) throw();
-bool IsSuperPath(const wchar_t *s) throw();
-bool IsSuperOrDevicePath(const wchar_t *s) throw();
-
-#ifndef USE_UNICODE_FSTRING
-bool IsDrivePath(CFSTR s) throw();
-bool IsSuperPath(CFSTR s) throw();
-bool IsSuperOrDevicePath(CFSTR s) throw();
-#endif
-
-#endif // _WIN32
-
-bool IsAbsolutePath(const wchar_t *s) throw();
-unsigned GetRootPrefixSize(const wchar_t *s) throw();
-
-#ifdef WIN_LONG_PATH
-
-const int kSuperPathType_UseOnlyMain = 0;
-const int kSuperPathType_UseOnlySuper = 1;
-const int kSuperPathType_UseMainAndSuper = 2;
-
-int GetUseSuperPathType(CFSTR s) throw();
-bool GetSuperPath(CFSTR path, UString &longPath, bool onlyIfNew);
-bool GetSuperPaths(CFSTR s1, CFSTR s2, UString &d1, UString &d2, bool onlyIfNew);
-
-#define USE_MAIN_PATH (__useSuperPathType != kSuperPathType_UseOnlySuper)
-#define USE_MAIN_PATH_2 (__useSuperPathType1 != kSuperPathType_UseOnlySuper && __useSuperPathType2 != kSuperPathType_UseOnlySuper)
-
-#define USE_SUPER_PATH (__useSuperPathType != kSuperPathType_UseOnlyMain)
-#define USE_SUPER_PATH_2 (__useSuperPathType1 != kSuperPathType_UseOnlyMain || __useSuperPathType2 != kSuperPathType_UseOnlyMain)
-
-#define IF_USE_MAIN_PATH int __useSuperPathType = GetUseSuperPathType(path); if (USE_MAIN_PATH)
-#define IF_USE_MAIN_PATH_2(x1, x2) \
- int __useSuperPathType1 = GetUseSuperPathType(x1); \
- int __useSuperPathType2 = GetUseSuperPathType(x2); \
- if (USE_MAIN_PATH_2)
-
-#else
-
-#define IF_USE_MAIN_PATH
-#define IF_USE_MAIN_PATH_2(x1, x2)
-
-#endif // WIN_LONG_PATH
-
-bool GetFullPath(CFSTR dirPrefix, CFSTR path, FString &fullPath);
-bool GetFullPath(CFSTR path, FString &fullPath);
-
-}}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Handle.h b/src/libs/7zip/win/CPP/Windows/Handle.h
deleted file mode 100644
index bb7cb705d..000000000
--- a/src/libs/7zip/win/CPP/Windows/Handle.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Windows/Handle.h
-
-#ifndef __WINDOWS_HANDLE_H
-#define __WINDOWS_HANDLE_H
-
-namespace NWindows {
-
-class CHandle
-{
-protected:
- HANDLE _handle;
-public:
- operator HANDLE() { return _handle; }
- CHandle(): _handle(NULL) {}
- ~CHandle() { Close(); }
- bool IsCreated() const { return (_handle != NULL); }
- bool Close()
- {
- if (_handle == NULL)
- return true;
- if (!::CloseHandle(_handle))
- return false;
- _handle = NULL;
- return true;
- }
- void Attach(HANDLE handle) { _handle = handle; }
- HANDLE Detach()
- {
- HANDLE handle = _handle;
- _handle = NULL;
- return handle;
- }
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/PropVariant.cpp b/src/libs/7zip/win/CPP/Windows/PropVariant.cpp
deleted file mode 100644
index d16f576cc..000000000
--- a/src/libs/7zip/win/CPP/Windows/PropVariant.cpp
+++ /dev/null
@@ -1,300 +0,0 @@
-// Windows/PropVariant.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/Defs.h"
-
-#include "PropVariant.h"
-
-namespace NWindows {
-namespace NCOM {
-
-HRESULT PropVarEm_Alloc_Bstr(PROPVARIANT *p, unsigned numChars) throw()
-{
- p->bstrVal = ::SysAllocStringLen(0, numChars);
- if (!p->bstrVal)
- {
- p->vt = VT_ERROR;
- p->scode = E_OUTOFMEMORY;
- return E_OUTOFMEMORY;
- }
- p->vt = VT_BSTR;
- return S_OK;
-}
-
-HRESULT PropVarEm_Set_Str(PROPVARIANT *p, const char *s) throw()
-{
- UINT len = (UINT)strlen(s);
- p->bstrVal = ::SysAllocStringLen(0, len);
- if (!p->bstrVal)
- {
- p->vt = VT_ERROR;
- p->scode = E_OUTOFMEMORY;
- return E_OUTOFMEMORY;
- }
- p->vt = VT_BSTR;
- BSTR dest = p->bstrVal;
- for (UINT i = 0; i <= len; i++)
- dest[i] = s[i];
- return S_OK;
-}
-
-CPropVariant::CPropVariant(const PROPVARIANT &varSrc)
-{
- vt = VT_EMPTY;
- InternalCopy(&varSrc);
-}
-
-CPropVariant::CPropVariant(const CPropVariant &varSrc)
-{
- vt = VT_EMPTY;
- InternalCopy(&varSrc);
-}
-
-CPropVariant::CPropVariant(BSTR bstrSrc)
-{
- vt = VT_EMPTY;
- *this = bstrSrc;
-}
-
-CPropVariant::CPropVariant(LPCOLESTR lpszSrc)
-{
- vt = VT_EMPTY;
- *this = lpszSrc;
-}
-
-CPropVariant& CPropVariant::operator=(const CPropVariant &varSrc)
-{
- InternalCopy(&varSrc);
- return *this;
-}
-CPropVariant& CPropVariant::operator=(const PROPVARIANT &varSrc)
-{
- InternalCopy(&varSrc);
- return *this;
-}
-
-CPropVariant& CPropVariant::operator=(BSTR bstrSrc)
-{
- *this = (LPCOLESTR)bstrSrc;
- return *this;
-}
-
-static const char *kMemException = "out of memory";
-
-CPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc)
-{
- InternalClear();
- vt = VT_BSTR;
- wReserved1 = 0;
- bstrVal = ::SysAllocString(lpszSrc);
- if (!bstrVal && lpszSrc)
- {
- throw kMemException;
- // vt = VT_ERROR;
- // scode = E_OUTOFMEMORY;
- }
- return *this;
-}
-
-CPropVariant& CPropVariant::operator=(const char *s)
-{
- InternalClear();
- vt = VT_BSTR;
- wReserved1 = 0;
- UINT len = (UINT)strlen(s);
- bstrVal = ::SysAllocStringLen(0, len);
- if (!bstrVal)
- {
- throw kMemException;
- // vt = VT_ERROR;
- // scode = E_OUTOFMEMORY;
- }
- else
- {
- for (UINT i = 0; i <= len; i++)
- bstrVal[i] = s[i];
- }
- return *this;
-}
-
-CPropVariant& CPropVariant::operator=(bool bSrc) throw()
-{
- if (vt != VT_BOOL)
- {
- InternalClear();
- vt = VT_BOOL;
- }
- boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
- return *this;
-}
-
-BSTR CPropVariant::AllocBstr(unsigned numChars)
-{
- if (vt != VT_EMPTY)
- InternalClear();
- vt = VT_BSTR;
- wReserved1 = 0;
- bstrVal = ::SysAllocStringLen(0, numChars);
- if (!bstrVal)
- {
- throw kMemException;
- // vt = VT_ERROR;
- // scode = E_OUTOFMEMORY;
- }
- return bstrVal;
-}
-
-#define SET_PROP_FUNC(type, id, dest) \
- CPropVariant& CPropVariant::operator=(type value) throw() \
- { if (vt != id) { InternalClear(); vt = id; } \
- dest = value; return *this; }
-
-SET_PROP_FUNC(Byte, VT_UI1, bVal)
-// SET_PROP_FUNC(Int16, VT_I2, iVal)
-SET_PROP_FUNC(Int32, VT_I4, lVal)
-SET_PROP_FUNC(UInt32, VT_UI4, ulVal)
-SET_PROP_FUNC(UInt64, VT_UI8, uhVal.QuadPart)
-SET_PROP_FUNC(Int64, VT_I8, hVal.QuadPart)
-SET_PROP_FUNC(const FILETIME &, VT_FILETIME, filetime)
-
-HRESULT PropVariant_Clear(PROPVARIANT *prop) throw()
-{
- switch (prop->vt)
- {
- case VT_EMPTY:
- case VT_UI1:
- case VT_I1:
- case VT_I2:
- case VT_UI2:
- case VT_BOOL:
- case VT_I4:
- case VT_UI4:
- case VT_R4:
- case VT_INT:
- case VT_UINT:
- case VT_ERROR:
- case VT_FILETIME:
- case VT_UI8:
- case VT_R8:
- case VT_CY:
- case VT_DATE:
- prop->vt = VT_EMPTY;
- prop->wReserved1 = 0;
- prop->wReserved2 = 0;
- prop->wReserved3 = 0;
- prop->uhVal.QuadPart = 0;
- return S_OK;
- }
- return ::VariantClear((VARIANTARG *)prop);
- // return ::PropVariantClear(prop);
- // PropVariantClear can clear VT_BLOB.
-}
-
-HRESULT CPropVariant::Clear() throw()
-{
- if (vt == VT_EMPTY)
- return S_OK;
- return PropVariant_Clear(this);
-}
-
-HRESULT CPropVariant::Copy(const PROPVARIANT* pSrc) throw()
-{
- ::VariantClear((tagVARIANT *)this);
- switch(pSrc->vt)
- {
- case VT_UI1:
- case VT_I1:
- case VT_I2:
- case VT_UI2:
- case VT_BOOL:
- case VT_I4:
- case VT_UI4:
- case VT_R4:
- case VT_INT:
- case VT_UINT:
- case VT_ERROR:
- case VT_FILETIME:
- case VT_UI8:
- case VT_R8:
- case VT_CY:
- case VT_DATE:
- memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT));
- return S_OK;
- }
- return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)const_cast<PROPVARIANT *>(pSrc));
-}
-
-
-HRESULT CPropVariant::Attach(PROPVARIANT *pSrc) throw()
-{
- HRESULT hr = Clear();
- if (FAILED(hr))
- return hr;
- memcpy(this, pSrc, sizeof(PROPVARIANT));
- pSrc->vt = VT_EMPTY;
- return S_OK;
-}
-
-HRESULT CPropVariant::Detach(PROPVARIANT *pDest) throw()
-{
- if (pDest->vt != VT_EMPTY)
- {
- HRESULT hr = PropVariant_Clear(pDest);
- if (FAILED(hr))
- return hr;
- }
- memcpy(pDest, this, sizeof(PROPVARIANT));
- vt = VT_EMPTY;
- return S_OK;
-}
-
-HRESULT CPropVariant::InternalClear() throw()
-{
- if (vt == VT_EMPTY)
- return S_OK;
- HRESULT hr = Clear();
- if (FAILED(hr))
- {
- vt = VT_ERROR;
- scode = hr;
- }
- return hr;
-}
-
-void CPropVariant::InternalCopy(const PROPVARIANT *pSrc)
-{
- HRESULT hr = Copy(pSrc);
- if (FAILED(hr))
- {
- if (hr == E_OUTOFMEMORY)
- throw kMemException;
- vt = VT_ERROR;
- scode = hr;
- }
-}
-
-int CPropVariant::Compare(const CPropVariant &a) throw()
-{
- if (vt != a.vt)
- return MyCompare(vt, a.vt);
- switch (vt)
- {
- case VT_EMPTY: return 0;
- // case VT_I1: return MyCompare(cVal, a.cVal);
- case VT_UI1: return MyCompare(bVal, a.bVal);
- case VT_I2: return MyCompare(iVal, a.iVal);
- case VT_UI2: return MyCompare(uiVal, a.uiVal);
- case VT_I4: return MyCompare(lVal, a.lVal);
- case VT_UI4: return MyCompare(ulVal, a.ulVal);
- // case VT_UINT: return MyCompare(uintVal, a.uintVal);
- case VT_I8: return MyCompare(hVal.QuadPart, a.hVal.QuadPart);
- case VT_UI8: return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart);
- case VT_BOOL: return -MyCompare(boolVal, a.boolVal);
- case VT_FILETIME: return ::CompareFileTime(&filetime, &a.filetime);
- case VT_BSTR: return 0; // Not implemented
- default: return 0;
- }
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/Windows/PropVariant.h b/src/libs/7zip/win/CPP/Windows/PropVariant.h
deleted file mode 100644
index d71b85e1d..000000000
--- a/src/libs/7zip/win/CPP/Windows/PropVariant.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Windows/PropVariant.h
-
-#ifndef __WINDOWS_PROP_VARIANT_H
-#define __WINDOWS_PROP_VARIANT_H
-
-#include "../Common/MyTypes.h"
-#include "../Common/MyWindows.h"
-
-namespace NWindows {
-namespace NCOM {
-
-HRESULT PropVariant_Clear(PROPVARIANT *p) throw();
-
-HRESULT PropVarEm_Alloc_Bstr(PROPVARIANT *p, unsigned numChars) throw();
-HRESULT PropVarEm_Set_Str(PROPVARIANT *p, const char *s) throw();
-
-inline void PropVarEm_Set_UInt32(PROPVARIANT *p, UInt32 v) throw()
-{
- p->vt = VT_UI4;
- p->ulVal = v;
-}
-
-inline void PropVarEm_Set_UInt64(PROPVARIANT *p, UInt64 v) throw()
-{
- p->vt = VT_UI8;
- p->uhVal.QuadPart = v;
-}
-
-inline void PropVarEm_Set_FileTime64(PROPVARIANT *p, UInt64 v) throw()
-{
- p->vt = VT_FILETIME;
- p->filetime.dwLowDateTime = (DWORD)v;
- p->filetime.dwHighDateTime = (DWORD)(v >> 32);
-}
-
-inline void PropVarEm_Set_Bool(PROPVARIANT *p, bool b) throw()
-{
- p->vt = VT_BOOL;
- p->boolVal = (b ? VARIANT_TRUE : VARIANT_FALSE);
-}
-
-
-class CPropVariant : public tagPROPVARIANT
-{
-public:
- CPropVariant()
- {
- vt = VT_EMPTY;
- wReserved1 = 0;
- // wReserved2 = 0;
- // wReserved3 = 0;
- // uhVal.QuadPart = 0;
- bstrVal = 0;
- }
- ~CPropVariant() throw() { Clear(); }
- CPropVariant(const PROPVARIANT &varSrc);
- CPropVariant(const CPropVariant &varSrc);
- CPropVariant(BSTR bstrSrc);
- CPropVariant(LPCOLESTR lpszSrc);
- CPropVariant(bool bSrc) { vt = VT_BOOL; wReserved1 = 0; boolVal = (bSrc ? VARIANT_TRUE : VARIANT_FALSE); };
- CPropVariant(Byte value) { vt = VT_UI1; wReserved1 = 0; bVal = value; }
-
-private:
- CPropVariant(Int16 value); // { vt = VT_I2; wReserved1 = 0; iVal = value; }
- CPropVariant(Int32 value); // { vt = VT_I4; wReserved1 = 0; lVal = value; }
-
-public:
- CPropVariant(UInt32 value) { vt = VT_UI4; wReserved1 = 0; ulVal = value; }
- CPropVariant(UInt64 value) { vt = VT_UI8; wReserved1 = 0; uhVal.QuadPart = value; }
- CPropVariant(Int64 value) { vt = VT_I8; wReserved1 = 0; hVal.QuadPart = value; }
- CPropVariant(const FILETIME &value) { vt = VT_FILETIME; wReserved1 = 0; filetime = value; }
-
- CPropVariant& operator=(const CPropVariant &varSrc);
- CPropVariant& operator=(const PROPVARIANT &varSrc);
- CPropVariant& operator=(BSTR bstrSrc);
- CPropVariant& operator=(LPCOLESTR lpszSrc);
- CPropVariant& operator=(const char *s);
-
- CPropVariant& operator=(bool bSrc) throw();
- CPropVariant& operator=(Byte value) throw();
-
-private:
- CPropVariant& operator=(Int16 value) throw();
-
-public:
- CPropVariant& operator=(Int32 value) throw();
- CPropVariant& operator=(UInt32 value) throw();
- CPropVariant& operator=(UInt64 value) throw();
- CPropVariant& operator=(Int64 value) throw();
- CPropVariant& operator=(const FILETIME &value) throw();
-
- BSTR AllocBstr(unsigned numChars);
-
- HRESULT Clear() throw();
- HRESULT Copy(const PROPVARIANT *pSrc) throw();
- HRESULT Attach(PROPVARIANT *pSrc) throw();
- HRESULT Detach(PROPVARIANT *pDest) throw();
-
- HRESULT InternalClear() throw();
- void InternalCopy(const PROPVARIANT *pSrc);
-
- int Compare(const CPropVariant &a) throw();
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/PropVariantConv.cpp b/src/libs/7zip/win/CPP/Windows/PropVariantConv.cpp
deleted file mode 100644
index dfb93d6d6..000000000
--- a/src/libs/7zip/win/CPP/Windows/PropVariantConv.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-// PropVariantConvert.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/IntToString.h"
-
-#include "Defs.h"
-#include "PropVariantConv.h"
-
-#define UINT_TO_STR_2(c, val) { s[0] = (c); s[1] = (char)('0' + (val) / 10); s[2] = (char)('0' + (val) % 10); s += 3; }
-
-bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime, bool includeSeconds) throw()
-{
- SYSTEMTIME st;
- if (!BOOLToBool(FileTimeToSystemTime(&ft, &st)))
- {
- *s = 0;
- return false;
- }
- unsigned val = st.wYear;
- if (val >= 10000)
- {
- *s++ = (char)('0' + val / 10000);
- val %= 10000;
- }
- {
- s[3] = (char)('0' + val % 10); val /= 10;
- s[2] = (char)('0' + val % 10); val /= 10;
- s[1] = (char)('0' + val % 10);
- s[0] = (char)('0' + val / 10);
- s += 4;
- }
- UINT_TO_STR_2('-', st.wMonth);
- UINT_TO_STR_2('-', st.wDay);
- if (includeTime)
- {
- UINT_TO_STR_2(' ', st.wHour);
- UINT_TO_STR_2(':', st.wMinute);
- if (includeSeconds)
- UINT_TO_STR_2(':', st.wSecond);
- }
- *s = 0;
- return true;
-}
-
-void ConvertFileTimeToString(const FILETIME &ft, wchar_t *dest, bool includeTime, bool includeSeconds) throw()
-{
- char s[32];
- ConvertFileTimeToString(ft, s, includeTime, includeSeconds);
- for (unsigned i = 0;; i++)
- {
- unsigned char c = s[i];
- dest[i] = c;
- if (c == 0)
- return;
- }
-}
-
-void ConvertPropVariantToShortString(const PROPVARIANT &prop, char *dest) throw()
-{
- *dest = 0;
- switch (prop.vt)
- {
- case VT_EMPTY: return;
- case VT_BSTR: dest[0] = '?'; dest[1] = 0; return;
- case VT_UI1: ConvertUInt32ToString(prop.bVal, dest); return;
- case VT_UI2: ConvertUInt32ToString(prop.uiVal, dest); return;
- case VT_UI4: ConvertUInt32ToString(prop.ulVal, dest); return;
- case VT_UI8: ConvertUInt64ToString(prop.uhVal.QuadPart, dest); return;
- case VT_FILETIME: ConvertFileTimeToString(prop.filetime, dest, true, true); return;
- // case VT_I1: return ConvertInt64ToString(prop.cVal, dest); return;
- case VT_I2: ConvertInt64ToString(prop.iVal, dest); return;
- case VT_I4: ConvertInt64ToString(prop.lVal, dest); return;
- case VT_I8: ConvertInt64ToString(prop.hVal.QuadPart, dest); return;
- case VT_BOOL: dest[0] = VARIANT_BOOLToBool(prop.boolVal) ? '+' : '-'; dest[1] = 0; return;
- default: dest[0] = '?'; dest[1] = ':'; ConvertUInt64ToString(prop.vt, dest + 2);
- }
-}
-
-void ConvertPropVariantToShortString(const PROPVARIANT &prop, wchar_t *dest) throw()
-{
- *dest = 0;
- switch (prop.vt)
- {
- case VT_EMPTY: return;
- case VT_BSTR: dest[0] = '?'; dest[1] = 0; return;
- case VT_UI1: ConvertUInt32ToString(prop.bVal, dest); return;
- case VT_UI2: ConvertUInt32ToString(prop.uiVal, dest); return;
- case VT_UI4: ConvertUInt32ToString(prop.ulVal, dest); return;
- case VT_UI8: ConvertUInt64ToString(prop.uhVal.QuadPart, dest); return;
- case VT_FILETIME: ConvertFileTimeToString(prop.filetime, dest, true, true); return;
- // case VT_I1: return ConvertInt64ToString(prop.cVal, dest); return;
- case VT_I2: ConvertInt64ToString(prop.iVal, dest); return;
- case VT_I4: ConvertInt64ToString(prop.lVal, dest); return;
- case VT_I8: ConvertInt64ToString(prop.hVal.QuadPart, dest); return;
- case VT_BOOL: dest[0] = VARIANT_BOOLToBool(prop.boolVal) ? '+' : '-'; dest[1] = 0; return;
- default: dest[0] = '?'; dest[1] = ':'; ConvertUInt32ToString(prop.vt, dest + 2);
- }
-}
diff --git a/src/libs/7zip/win/CPP/Windows/PropVariantConv.h b/src/libs/7zip/win/CPP/Windows/PropVariantConv.h
deleted file mode 100644
index 5d26357f0..000000000
--- a/src/libs/7zip/win/CPP/Windows/PropVariantConv.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Windows/PropVariantConv.h
-
-#ifndef __PROP_VARIANT_CONV_H
-#define __PROP_VARIANT_CONV_H
-
-#include "../Common/MyTypes.h"
-
-// provide at least 32 bytes for buffer including zero-end
-bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime = true, bool includeSeconds = true) throw();
-void ConvertFileTimeToString(const FILETIME &ft, wchar_t *s, bool includeTime = true, bool includeSeconds = true) throw();
-
-// provide at least 32 bytes for buffer including zero-end
-// don't send VT_BSTR to these functions
-void ConvertPropVariantToShortString(const PROPVARIANT &prop, char *dest) throw();
-void ConvertPropVariantToShortString(const PROPVARIANT &prop, wchar_t *dest) throw();
-
-inline bool ConvertPropVariantToUInt64(const PROPVARIANT &prop, UInt64 &value)
-{
- switch (prop.vt)
- {
- case VT_UI8: value = (UInt64)prop.uhVal.QuadPart; return true;
- case VT_UI4: value = prop.ulVal; return true;
- case VT_UI2: value = prop.uiVal; return true;
- case VT_UI1: value = prop.bVal; return true;
- case VT_EMPTY: return false;
- default: throw 151199;
- }
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/SecurityUtils.cpp b/src/libs/7zip/win/CPP/Windows/SecurityUtils.cpp
deleted file mode 100644
index f997738ce..000000000
--- a/src/libs/7zip/win/CPP/Windows/SecurityUtils.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-// Windows/SecurityUtils.cpp
-
-#include "StdAfx.h"
-
-#include "SecurityUtils.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/SecurityUtils.h b/src/libs/7zip/win/CPP/Windows/SecurityUtils.h
deleted file mode 100644
index 715de2505..000000000
--- a/src/libs/7zip/win/CPP/Windows/SecurityUtils.h
+++ /dev/null
@@ -1,167 +0,0 @@
-// Windows/SecurityUtils.h
-
-#ifndef __WINDOWS_SECURITY_UTILS_H
-#define __WINDOWS_SECURITY_UTILS_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/StdAfx.h b/src/libs/7zip/win/CPP/Windows/StdAfx.h
deleted file mode 100644
index 1766dfa86..000000000
--- a/src/libs/7zip/win/CPP/Windows/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../Common/Common.h"
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Synchronization.cpp b/src/libs/7zip/win/CPP/Windows/Synchronization.cpp
deleted file mode 100644
index 5f86d1eb1..000000000
--- a/src/libs/7zip/win/CPP/Windows/Synchronization.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-// Windows/Synchronization.cpp
-
-#include "StdAfx.h"
-
-#include "Synchronization.h"
-
-namespace NWindows {
-namespace NSynchronization {
-
-}}
diff --git a/src/libs/7zip/win/CPP/Windows/Synchronization.h b/src/libs/7zip/win/CPP/Windows/Synchronization.h
deleted file mode 100644
index dc695f6f3..000000000
--- a/src/libs/7zip/win/CPP/Windows/Synchronization.h
+++ /dev/null
@@ -1,164 +0,0 @@
-// Windows/Synchronization.h
-
-#ifndef __WINDOWS_SYNCHRONIZATION_H
-#define __WINDOWS_SYNCHRONIZATION_H
-
-#include "../../C/Threads.h"
-
-#include "Defs.h"
-
-#ifdef _WIN32
-#include "Handle.h"
-#endif
-
-namespace NWindows {
-namespace NSynchronization {
-
-class CBaseEvent
-{
-protected:
- ::CEvent _object;
-public:
- bool IsCreated() { return Event_IsCreated(&_object) != 0; }
- operator HANDLE() { return _object; }
- CBaseEvent() { Event_Construct(&_object); }
- ~CBaseEvent() { Close(); }
- WRes Close() { return Event_Close(&_object); }
- #ifdef _WIN32
- WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL)
- {
- _object = ::CreateEvent(sa, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name);
- if (name == NULL && _object != 0)
- return 0;
- return ::GetLastError();
- }
- WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)
- {
- _object = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name);
- if (_object != 0)
- return 0;
- return ::GetLastError();
- }
- #endif
-
- WRes Set() { return Event_Set(&_object); }
- // bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); }
- WRes Reset() { return Event_Reset(&_object); }
- WRes Lock() { return Event_Wait(&_object); }
-};
-
-class CManualResetEvent: public CBaseEvent
-{
-public:
- WRes Create(bool initiallyOwn = false)
- {
- return ManualResetEvent_Create(&_object, initiallyOwn ? 1: 0);
- }
- WRes CreateIfNotCreated()
- {
- if (IsCreated())
- return 0;
- return ManualResetEvent_CreateNotSignaled(&_object);
- }
- #ifdef _WIN32
- WRes CreateWithName(bool initiallyOwn, LPCTSTR name)
- {
- return CBaseEvent::Create(true, initiallyOwn, name);
- }
- #endif
-};
-
-class CAutoResetEvent: public CBaseEvent
-{
-public:
- WRes Create()
- {
- return AutoResetEvent_CreateNotSignaled(&_object);
- }
- WRes CreateIfNotCreated()
- {
- if (IsCreated())
- return 0;
- return AutoResetEvent_CreateNotSignaled(&_object);
- }
-};
-
-#ifdef _WIN32
-class CObject: public CHandle
-{
-public:
- WRes Lock(DWORD timeoutInterval = INFINITE)
- { return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0 ? 0 : ::GetLastError()); }
-};
-class CMutex: public CObject
-{
-public:
- WRes Create(bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL)
- {
- _handle = ::CreateMutex(sa, BoolToBOOL(initiallyOwn), name);
- if (name == NULL && _handle != 0)
- return 0;
- return ::GetLastError();
- }
- #ifndef UNDER_CE
- WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)
- {
- _handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name);
- if (_handle != 0)
- return 0;
- return ::GetLastError();
- }
- #endif
- WRes Release()
- {
- return ::ReleaseMutex(_handle) ? 0 : ::GetLastError();
- }
-};
-class CMutexLock
-{
- CMutex *_object;
-public:
- CMutexLock(CMutex &object): _object(&object) { _object->Lock(); }
- ~CMutexLock() { _object->Release(); }
-};
-#endif
-
-class CSemaphore
-{
- ::CSemaphore _object;
-public:
- CSemaphore() { Semaphore_Construct(&_object); }
- ~CSemaphore() { Close(); }
- WRes Close() { return Semaphore_Close(&_object); }
- operator HANDLE() { return _object; }
- WRes Create(UInt32 initiallyCount, UInt32 maxCount)
- {
- return Semaphore_Create(&_object, initiallyCount, maxCount);
- }
- WRes Release() { return Semaphore_Release1(&_object); }
- WRes Release(UInt32 releaseCount) { return Semaphore_ReleaseN(&_object, releaseCount); }
- WRes Lock() { return Semaphore_Wait(&_object); }
-};
-
-class CCriticalSection
-{
- ::CCriticalSection _object;
-public:
- CCriticalSection() { CriticalSection_Init(&_object); }
- ~CCriticalSection() { CriticalSection_Delete(&_object); }
- void Enter() { CriticalSection_Enter(&_object); }
- void Leave() { CriticalSection_Leave(&_object); }
-};
-
-class CCriticalSectionLock
-{
- CCriticalSection *_object;
- void Unlock() { _object->Leave(); }
-public:
- CCriticalSectionLock(CCriticalSection &object): _object(&object) {_object->Enter(); }
- ~CCriticalSectionLock() { Unlock(); }
-};
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/System.cpp b/src/libs/7zip/win/CPP/Windows/System.cpp
deleted file mode 100644
index 4bc8d2a3f..000000000
--- a/src/libs/7zip/win/CPP/Windows/System.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-// Windows/System.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/Defs.h"
-
-#include "System.h"
-
-namespace NWindows {
-namespace NSystem {
-
-UInt32 GetNumberOfProcessors()
-{
- SYSTEM_INFO systemInfo;
- GetSystemInfo(&systemInfo);
- return (UInt32)systemInfo.dwNumberOfProcessors;
-}
-
-#ifndef UNDER_CE
-
-#if !defined(_WIN64) && defined(__GNUC__)
-
-typedef struct _MY_MEMORYSTATUSEX {
- DWORD dwLength;
- DWORD dwMemoryLoad;
- DWORDLONG ullTotalPhys;
- DWORDLONG ullAvailPhys;
- DWORDLONG ullTotalPageFile;
- DWORDLONG ullAvailPageFile;
- DWORDLONG ullTotalVirtual;
- DWORDLONG ullAvailVirtual;
- DWORDLONG ullAvailExtendedVirtual;
-} MY_MEMORYSTATUSEX, *MY_LPMEMORYSTATUSEX;
-
-#else
-
-#define MY_MEMORYSTATUSEX MEMORYSTATUSEX
-#define MY_LPMEMORYSTATUSEX LPMEMORYSTATUSEX
-
-#endif
-
-typedef BOOL (WINAPI *GlobalMemoryStatusExP)(MY_LPMEMORYSTATUSEX lpBuffer);
-
-#endif
-
-UInt64 GetRamSize()
-{
- #ifndef UNDER_CE
- MY_MEMORYSTATUSEX stat;
- stat.dwLength = sizeof(stat);
- #endif
- #ifdef _WIN64
- if (!::GlobalMemoryStatusEx(&stat))
- return 0;
- return MyMin(stat.ullTotalVirtual, stat.ullTotalPhys);
- #else
- #ifndef UNDER_CE
- GlobalMemoryStatusExP globalMemoryStatusEx = (GlobalMemoryStatusExP)
- ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")), "GlobalMemoryStatusEx");
- if (globalMemoryStatusEx != 0 && globalMemoryStatusEx(&stat))
- return MyMin(stat.ullTotalVirtual, stat.ullTotalPhys);
- #endif
- {
- MEMORYSTATUS stat;
- stat.dwLength = sizeof(stat);
- ::GlobalMemoryStatus(&stat);
- return MyMin(stat.dwTotalVirtual, stat.dwTotalPhys);
- }
- #endif
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/Windows/System.h b/src/libs/7zip/win/CPP/Windows/System.h
deleted file mode 100644
index 4133a7b30..000000000
--- a/src/libs/7zip/win/CPP/Windows/System.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Windows/System.h
-
-#ifndef __WINDOWS_SYSTEM_H
-#define __WINDOWS_SYSTEM_H
-
-#include "../Common/MyTypes.h"
-
-namespace NWindows {
-namespace NSystem {
-
-UInt32 GetNumberOfProcessors();
-UInt64 GetRamSize();
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Thread.h b/src/libs/7zip/win/CPP/Windows/Thread.h
deleted file mode 100644
index f9ecaed85..000000000
--- a/src/libs/7zip/win/CPP/Windows/Thread.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Windows/Thread.h
-
-#ifndef __WINDOWS_THREAD_H
-#define __WINDOWS_THREAD_H
-
-#include "../../C/Threads.h"
-
-#include "Defs.h"
-
-namespace NWindows {
-
-class CThread
-{
- ::CThread thread;
-public:
- CThread() { Thread_Construct(&thread); }
- ~CThread() { Close(); }
- bool IsCreated() { return Thread_WasCreated(&thread) != 0; }
- WRes Close() { return Thread_Close(&thread); }
- WRes Create(THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter)
- { return Thread_Create(&thread, startAddress, parameter); }
- WRes Wait() { return Thread_Wait(&thread); }
-
- #ifdef _WIN32
- operator HANDLE() { return thread; }
- void Attach(HANDLE handle) { thread = handle; }
- HANDLE Detach() { HANDLE h = thread; thread = NULL; return h; }
- DWORD Resume() { return ::ResumeThread(thread); }
- DWORD Suspend() { return ::SuspendThread(thread); }
- bool Terminate(DWORD exitCode) { return BOOLToBool(::TerminateThread(thread, exitCode)); }
- int GetPriority() { return ::GetThreadPriority(thread); }
- bool SetPriority(int priority) { return BOOLToBool(::SetThreadPriority(thread, priority)); }
- #endif
-};
-
-}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/TimeUtils.cpp b/src/libs/7zip/win/CPP/Windows/TimeUtils.cpp
deleted file mode 100644
index 7ef44d9cc..000000000
--- a/src/libs/7zip/win/CPP/Windows/TimeUtils.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-// Windows/TimeUtils.cpp
-
-#include "StdAfx.h"
-
-#include "Defs.h"
-#include "TimeUtils.h"
-
-namespace NWindows {
-namespace NTime {
-
-static const UInt32 kNumTimeQuantumsInSecond = 10000000;
-static const UInt32 kFileTimeStartYear = 1601;
-static const UInt32 kDosTimeStartYear = 1980;
-static const UInt32 kUnixTimeStartYear = 1970;
-static const UInt64 kUnixTimeOffset =
- (UInt64)60 * 60 * 24 * (89 + 365 * (kUnixTimeStartYear - kFileTimeStartYear));
-static const UInt64 kNumSecondsInFileTime = (UInt64)(Int64)-1 / kNumTimeQuantumsInSecond;
-
-bool DosTimeToFileTime(UInt32 dosTime, FILETIME &ft) throw()
-{
- #if defined(_WIN32) && !defined(UNDER_CE)
- return BOOLToBool(::DosDateTimeToFileTime((UInt16)(dosTime >> 16), (UInt16)(dosTime & 0xFFFF), &ft));
- #else
- ft.dwLowDateTime = 0;
- ft.dwHighDateTime = 0;
- UInt64 res;
- if (!GetSecondsSince1601(kDosTimeStartYear + (dosTime >> 25), (dosTime >> 21) & 0xF, (dosTime >> 16) & 0x1F,
- (dosTime >> 11) & 0x1F, (dosTime >> 5) & 0x3F, (dosTime & 0x1F) * 2, res))
- return false;
- res *= kNumTimeQuantumsInSecond;
- ft.dwLowDateTime = (UInt32)res;
- ft.dwHighDateTime = (UInt32)(res >> 32);
- return true;
- #endif
-}
-
-static const UInt32 kHighDosTime = 0xFF9FBF7D;
-static const UInt32 kLowDosTime = 0x210000;
-
-#define PERIOD_4 (4 * 365 + 1)
-#define PERIOD_100 (PERIOD_4 * 25 - 1)
-#define PERIOD_400 (PERIOD_100 * 4 + 1)
-
-bool FileTimeToDosTime(const FILETIME &ft, UInt32 &dosTime) throw()
-{
- #if defined(_WIN32) && !defined(UNDER_CE)
-
- WORD datePart, timePart;
- if (!::FileTimeToDosDateTime(&ft, &datePart, &timePart))
- {
- dosTime = (ft.dwHighDateTime >= 0x01C00000) ? kHighDosTime : kLowDosTime;
- return false;
- }
- dosTime = (((UInt32)datePart) << 16) + timePart;
-
- #else
-
- unsigned year, mon, day, hour, min, sec;
- UInt64 v64 = ft.dwLowDateTime | ((UInt64)ft.dwHighDateTime << 32);
- Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- unsigned temp;
- UInt32 v;
- v64 += (kNumTimeQuantumsInSecond * 2 - 1);
- v64 /= kNumTimeQuantumsInSecond;
- sec = (unsigned)(v64 % 60);
- v64 /= 60;
- min = (unsigned)(v64 % 60);
- v64 /= 60;
- hour = (unsigned)(v64 % 24);
- v64 /= 24;
-
- v = (UInt32)v64;
-
- year = (unsigned)(kFileTimeStartYear + v / PERIOD_400 * 400);
- v %= PERIOD_400;
-
- temp = (unsigned)(v / PERIOD_100);
- if (temp == 4)
- temp = 3;
- year += temp * 100;
- v -= temp * PERIOD_100;
-
- temp = v / PERIOD_4;
- if (temp == 25)
- temp = 24;
- year += temp * 4;
- v -= temp * PERIOD_4;
-
- temp = v / 365;
- if (temp == 4)
- temp = 3;
- year += temp;
- v -= temp * 365;
-
- if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
- ms[1] = 29;
- for (mon = 1; mon <= 12; mon++)
- {
- unsigned s = ms[mon - 1];
- if (v < s)
- break;
- v -= s;
- }
- day = (unsigned)v + 1;
-
- dosTime = kLowDosTime;
- if (year < kDosTimeStartYear)
- return false;
- year -= kDosTimeStartYear;
- dosTime = kHighDosTime;
- if (year >= 128)
- return false;
- dosTime = (year << 25) | (mon << 21) | (day << 16) | (hour << 11) | (min << 5) | (sec >> 1);
- #endif
- return true;
-}
-
-void UnixTimeToFileTime(UInt32 unixTime, FILETIME &ft) throw()
-{
- UInt64 v = (kUnixTimeOffset + (UInt64)unixTime) * kNumTimeQuantumsInSecond;
- ft.dwLowDateTime = (DWORD)v;
- ft.dwHighDateTime = (DWORD)(v >> 32);
-}
-
-bool UnixTime64ToFileTime(Int64 unixTime, FILETIME &ft) throw()
-{
- if (unixTime > kNumSecondsInFileTime - kUnixTimeOffset)
- {
- ft.dwLowDateTime = ft.dwHighDateTime = (UInt32)(Int32)-1;
- return false;
- }
- Int64 v = (Int64)kUnixTimeOffset + unixTime;
- if (v < 0)
- {
- ft.dwLowDateTime = ft.dwHighDateTime = 0;
- return false;
- }
- UInt64 v2 = (UInt64)v * kNumTimeQuantumsInSecond;
- ft.dwLowDateTime = (DWORD)v2;
- ft.dwHighDateTime = (DWORD)(v2 >> 32);
- return true;
-}
-
-Int64 FileTimeToUnixTime64(const FILETIME &ft) throw()
-{
- UInt64 winTime = (((UInt64)ft.dwHighDateTime) << 32) + ft.dwLowDateTime;
- return (Int64)(winTime / kNumTimeQuantumsInSecond) - kUnixTimeOffset;
-}
-
-bool FileTimeToUnixTime(const FILETIME &ft, UInt32 &unixTime) throw()
-{
- UInt64 winTime = (((UInt64)ft.dwHighDateTime) << 32) + ft.dwLowDateTime;
- winTime /= kNumTimeQuantumsInSecond;
- if (winTime < kUnixTimeOffset)
- {
- unixTime = 0;
- return false;
- }
- winTime -= kUnixTimeOffset;
- if (winTime > 0xFFFFFFFF)
- {
- unixTime = 0xFFFFFFFF;
- return false;
- }
- unixTime = (UInt32)winTime;
- return true;
-}
-
-bool GetSecondsSince1601(unsigned year, unsigned month, unsigned day,
- unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds) throw()
-{
- resSeconds = 0;
- if (year < kFileTimeStartYear || year >= 10000 || month < 1 || month > 12 ||
- day < 1 || day > 31 || hour > 23 || min > 59 || sec > 59)
- return false;
- UInt32 numYears = year - kFileTimeStartYear;
- UInt32 numDays = numYears * 365 + numYears / 4 - numYears / 100 + numYears / 400;
- Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
- ms[1] = 29;
- month--;
- for (unsigned i = 0; i < month; i++)
- numDays += ms[i];
- numDays += day - 1;
- resSeconds = ((UInt64)(numDays * 24 + hour) * 60 + min) * 60 + sec;
- return true;
-}
-
-void GetCurUtcFileTime(FILETIME &ft) throw()
-{
- // Both variants provide same low resolution on WinXP: about 15 ms.
- // But GetSystemTimeAsFileTime is much faster.
-
- #ifdef UNDER_CE
- SYSTEMTIME st;
- GetSystemTime(&st);
- SystemTimeToFileTime(&st, &ft);
- #else
- GetSystemTimeAsFileTime(&ft);
- #endif
-}
-
-}}
diff --git a/src/libs/7zip/win/CPP/Windows/TimeUtils.h b/src/libs/7zip/win/CPP/Windows/TimeUtils.h
deleted file mode 100644
index 2967214e6..000000000
--- a/src/libs/7zip/win/CPP/Windows/TimeUtils.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Windows/TimeUtils.h
-
-#ifndef __WINDOWS_TIME_UTILS_H
-#define __WINDOWS_TIME_UTILS_H
-
-#include "../Common/MyTypes.h"
-
-namespace NWindows {
-namespace NTime {
-
-bool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime) throw();
-bool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime) throw();
-void UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime) throw();
-bool UnixTime64ToFileTime(Int64 unixTime, FILETIME &fileTime) throw();
-bool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime) throw();
-Int64 FileTimeToUnixTime64(const FILETIME &ft) throw();
-bool GetSecondsSince1601(unsigned year, unsigned month, unsigned day,
- unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds) throw();
-void GetCurUtcFileTime(FILETIME &ft) throw();
-
-}}
-
-#endif
diff --git a/src/libs/7zip/win/CPP/Windows/Windows.pri b/src/libs/7zip/win/CPP/Windows/Windows.pri
deleted file mode 100644
index a69279060..000000000
--- a/src/libs/7zip/win/CPP/Windows/Windows.pri
+++ /dev/null
@@ -1,29 +0,0 @@
-HEADERS += $$7ZIP_BASE/CPP/Windows/DLL.h \
- $$7ZIP_BASE/CPP/Windows/Defs.h \
- $$7ZIP_BASE/CPP/Windows/FileDir.h \
- $$7ZIP_BASE/CPP/Windows/FileFind.h \
- $$7ZIP_BASE/CPP/Windows/FileIO.h \
- $$7ZIP_BASE/CPP/Windows/FileMapping.h \
- $$7ZIP_BASE/CPP/Windows/FileName.h \
- $$7ZIP_BASE/CPP/Windows/Handle.h \
- $$7ZIP_BASE/CPP/Windows/PropVariant.h \
- $$7ZIP_BASE/CPP/Windows/PropVariantConv.h \
- $$7ZIP_BASE/CPP/Windows/SecurityUtils.h \
- $$7ZIP_BASE/CPP/Windows/StdAfx.h \
- $$7ZIP_BASE/CPP/Windows/Synchronization.h \
- $$7ZIP_BASE/CPP/Windows/System.h \
- $$7ZIP_BASE/CPP/Windows/Thread.h \
- $$7ZIP_BASE/CPP/Windows/TimeUtils.h
-
-SOURCES += $$7ZIP_BASE/CPP/Windows/DLL.cpp \
- $$7ZIP_BASE/CPP/Windows/FileDir.cpp \
- $$7ZIP_BASE/CPP/Windows/FileFind.cpp \
- $$7ZIP_BASE/CPP/Windows/FileIO.cpp \
- $$7ZIP_BASE/CPP/Windows/FileLink.cpp \
- $$7ZIP_BASE/CPP/Windows/FileName.cpp \
- $$7ZIP_BASE/CPP/Windows/PropVariant.cpp \
- $$7ZIP_BASE/CPP/Windows/PropVariantConv.cpp \
- $$7ZIP_BASE/CPP/Windows/SecurityUtils.cpp \
- $$7ZIP_BASE/CPP/Windows/Synchronization.cpp \
- $$7ZIP_BASE/CPP/Windows/System.cpp \
- $$7ZIP_BASE/CPP/Windows/TimeUtils.cpp
diff --git a/src/libs/7zip/win/win.pri b/src/libs/7zip/win/win.pri
deleted file mode 100644
index d29553cbd..000000000
--- a/src/libs/7zip/win/win.pri
+++ /dev/null
@@ -1,11 +0,0 @@
-include(C/C.pri)
-include(CPP/7zip/7zip.pri)
-include(CPP/7zip/Archive/7z/7z.pri)
-include(CPP/7zip/Archive/Archive.pri)
-include(CPP/7zip/Archive/Common/Common.pri)
-include(CPP/7zip/Common/Common.pri)
-include(CPP/7zip/Compress/Compress.pri)
-include(CPP/7zip/UI/Common/Common.pri)
-include(CPP/7zip/UI/Console/Console.pri)
-include(CPP/Common/Common.pri)
-include(CPP/Windows/Windows.pri)