seven-zip 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +31 -0
- data/.github/workflows/release.yml +30 -0
- data/.gitignore +27 -0
- data/.travis.yml +35 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +20 -0
- data/README.md +204 -0
- data/Rakefile +79 -0
- data/ext/C/Types.h +254 -0
- data/ext/CPP/7zip/Archive/IArchive.h +234 -0
- data/ext/CPP/7zip/IDecl.h +15 -0
- data/ext/CPP/7zip/IPassword.h +24 -0
- data/ext/CPP/7zip/IProgress.h +33 -0
- data/ext/CPP/7zip/IStream.h +58 -0
- data/ext/CPP/7zip/PropID.h +76 -0
- data/ext/CPP/Common/MyCom.h +225 -0
- data/ext/CPP/Common/MyGuidDef.h +54 -0
- data/ext/CPP/Common/MyInitGuid.h +22 -0
- data/ext/CPP/Common/MyUnknown.h +13 -0
- data/ext/CPP/Common/MyWindows.h +204 -0
- data/ext/CPP/Common/Types.h +11 -0
- data/ext/CPP/Windows/PropVariant.h +56 -0
- data/ext/CPP/include_windows/basetyps.h +19 -0
- data/ext/CPP/include_windows/tchar.h +89 -0
- data/ext/CPP/include_windows/windows.h +194 -0
- data/ext/p7zip/Asm/x64/7zCrcT8U.asm +103 -0
- data/ext/p7zip/Asm/x86/7zCrcT8U.asm +101 -0
- data/ext/p7zip/C/7zBuf.h +39 -0
- data/ext/p7zip/C/7zBuf2.c +45 -0
- data/ext/p7zip/C/7zCrc.c +76 -0
- data/ext/p7zip/C/7zCrc.h +25 -0
- data/ext/p7zip/C/7zCrcOpt.c +34 -0
- data/ext/p7zip/C/7zCrcT8.c +43 -0
- data/ext/p7zip/C/7zStream.c +169 -0
- data/ext/p7zip/C/7zVersion.h +7 -0
- data/ext/p7zip/C/Aes.c +284 -0
- data/ext/p7zip/C/Aes.h +38 -0
- data/ext/p7zip/C/Alloc.back3 +238 -0
- data/ext/p7zip/C/Alloc.c +280 -0
- data/ext/p7zip/C/Alloc.c.back +243 -0
- data/ext/p7zip/C/Alloc.c.back2 +222 -0
- data/ext/p7zip/C/Alloc.h +27 -0
- data/ext/p7zip/C/Bra.c +133 -0
- data/ext/p7zip/C/Bra.h +68 -0
- data/ext/p7zip/C/Bra86.c +85 -0
- data/ext/p7zip/C/BraIA64.c +67 -0
- data/ext/p7zip/C/BwtSort.c +516 -0
- data/ext/p7zip/C/BwtSort.h +30 -0
- data/ext/p7zip/C/CpuArch.c +168 -0
- data/ext/p7zip/C/CpuArch.h +155 -0
- data/ext/p7zip/C/Delta.c +62 -0
- data/ext/p7zip/C/Delta.h +23 -0
- data/ext/p7zip/C/HuffEnc.c +146 -0
- data/ext/p7zip/C/HuffEnc.h +27 -0
- data/ext/p7zip/C/LzFind.c +761 -0
- data/ext/p7zip/C/LzFind.h +115 -0
- data/ext/p7zip/C/LzFindMt.c +793 -0
- data/ext/p7zip/C/LzFindMt.h +105 -0
- data/ext/p7zip/C/LzHash.h +54 -0
- data/ext/p7zip/C/Lzma2Dec.c +356 -0
- data/ext/p7zip/C/Lzma2Dec.h +84 -0
- data/ext/p7zip/C/Lzma2Enc.c +477 -0
- data/ext/p7zip/C/Lzma2Enc.h +66 -0
- data/ext/p7zip/C/LzmaDec.c +999 -0
- data/ext/p7zip/C/LzmaDec.h +231 -0
- data/ext/p7zip/C/LzmaEnc.c +2268 -0
- data/ext/p7zip/C/LzmaEnc.h +80 -0
- data/ext/p7zip/C/LzmaUtil/Lzma86Dec.c +61 -0
- data/ext/p7zip/C/LzmaUtil/Lzma86Dec.h +51 -0
- data/ext/p7zip/C/LzmaUtil/Lzma86Enc.c +113 -0
- data/ext/p7zip/C/LzmaUtil/Lzma86Enc.h +78 -0
- data/ext/p7zip/C/MtCoder.c +327 -0
- data/ext/p7zip/C/MtCoder.h +98 -0
- data/ext/p7zip/C/Ppmd.h +85 -0
- data/ext/p7zip/C/Ppmd7.c +708 -0
- data/ext/p7zip/C/Ppmd7.h +140 -0
- data/ext/p7zip/C/Ppmd7Dec.c +187 -0
- data/ext/p7zip/C/Ppmd7Enc.c +185 -0
- data/ext/p7zip/C/Ppmd8.c +1120 -0
- data/ext/p7zip/C/Ppmd8.h +133 -0
- data/ext/p7zip/C/Ppmd8Dec.c +155 -0
- data/ext/p7zip/C/Ppmd8Enc.c +161 -0
- data/ext/p7zip/C/RotateDefs.h +20 -0
- data/ext/p7zip/C/Sha256.c +204 -0
- data/ext/p7zip/C/Sha256.h +26 -0
- data/ext/p7zip/C/Sort.c +93 -0
- data/ext/p7zip/C/Sort.h +20 -0
- data/ext/p7zip/C/Threads.c +582 -0
- data/ext/p7zip/C/Threads.h +123 -0
- data/ext/p7zip/C/Types.h +254 -0
- data/ext/p7zip/C/Xz.c +88 -0
- data/ext/p7zip/C/Xz.h +252 -0
- data/ext/p7zip/C/XzCrc64.c +33 -0
- data/ext/p7zip/C/XzCrc64.h +26 -0
- data/ext/p7zip/C/XzDec.c +875 -0
- data/ext/p7zip/C/XzEnc.c +497 -0
- data/ext/p7zip/C/XzEnc.h +25 -0
- data/ext/p7zip/C/XzIn.c +306 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zCompressionMode.cpp +3 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zCompressionMode.h +50 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zDecode.cpp +332 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zDecode.h +68 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zEncode.cpp +444 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zEncode.h +55 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zExtract.cpp +270 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderInStream.cpp +123 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderInStream.h +58 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderOutStream.cpp +149 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderOutStream.h +58 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zHandler.cpp +482 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zHandler.h +119 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zHandlerOut.cpp +483 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zHeader.cpp +14 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zHeader.h +97 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zIn.cpp +1276 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zIn.h +245 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zItem.h +268 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zOut.cpp +866 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zOut.h +152 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zProperties.cpp +164 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zProperties.h +22 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zRegister.cpp +18 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zSpecStream.cpp +24 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zSpecStream.h +35 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zUpdate.cpp +1216 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zUpdate.h +88 -0
- data/ext/p7zip/CPP/7zip/Archive/ApmHandler.cpp +356 -0
- data/ext/p7zip/CPP/7zip/Archive/ArchiveExports.cpp +135 -0
- data/ext/p7zip/CPP/7zip/Archive/ArjHandler.cpp +798 -0
- data/ext/p7zip/CPP/7zip/Archive/Bz2Handler.cpp +423 -0
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabBlockInStream.cpp +189 -0
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabBlockInStream.h +44 -0
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabHandler.cpp +929 -0
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabHandler.h +28 -0
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabHeader.cpp +15 -0
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabHeader.h +44 -0
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabIn.cpp +272 -0
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabIn.h +161 -0
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabItem.h +63 -0
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabRegister.cpp +13 -0
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHandler.cpp +721 -0
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHandler.h +29 -0
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHeader.cpp +24 -0
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHeader.h +28 -0
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmIn.cpp +937 -0
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmIn.h +244 -0
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmRegister.cpp +13 -0
- data/ext/p7zip/CPP/7zip/Archive/Com/ComHandler.cpp +239 -0
- data/ext/p7zip/CPP/7zip/Archive/Com/ComHandler.h +28 -0
- data/ext/p7zip/CPP/7zip/Archive/Com/ComIn.cpp +389 -0
- data/ext/p7zip/CPP/7zip/Archive/Com/ComIn.h +119 -0
- data/ext/p7zip/CPP/7zip/Archive/Com/ComRegister.cpp +13 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2.cpp +121 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2.h +174 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2MT.cpp +240 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2MT.h +80 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2ST.cpp +239 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2ST.h +88 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/CrossThreadProgress.cpp +15 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/CrossThreadProgress.h +37 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/DummyOutStream.cpp +22 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/DummyOutStream.h +24 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/FindSignature.cpp +62 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/FindSignature.h +12 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/HandlerOut.cpp +623 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/HandlerOut.h +87 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/InStreamWithCRC.cpp +42 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/InStreamWithCRC.h +67 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/ItemNameUtils.cpp +61 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/ItemNameUtils.h +24 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/MultiStream.cpp +190 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/MultiStream.h +84 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp +18 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithCRC.h +36 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp +18 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithSha1.h +36 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/ParseProperties.cpp +177 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/ParseProperties.h +18 -0
- data/ext/p7zip/CPP/7zip/Archive/CpioHandler.cpp +624 -0
- data/ext/p7zip/CPP/7zip/Archive/CramfsHandler.cpp +644 -0
- data/ext/p7zip/CPP/7zip/Archive/DebHandler.cpp +413 -0
- data/ext/p7zip/CPP/7zip/Archive/DeflateProps.cpp +118 -0
- data/ext/p7zip/CPP/7zip/Archive/DeflateProps.h +35 -0
- data/ext/p7zip/CPP/7zip/Archive/DllExports2.cpp +76 -0
- data/ext/p7zip/CPP/7zip/Archive/DmgHandler.cpp +918 -0
- data/ext/p7zip/CPP/7zip/Archive/ElfHandler.cpp +534 -0
- data/ext/p7zip/CPP/7zip/Archive/FatHandler.cpp +996 -0
- data/ext/p7zip/CPP/7zip/Archive/FlvHandler.cpp +544 -0
- data/ext/p7zip/CPP/7zip/Archive/GzHandler.cpp +698 -0
- data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsHandler.cpp +243 -0
- data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsHandler.h +26 -0
- data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsIn.cpp +480 -0
- data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsIn.h +154 -0
- data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsRegister.cpp +13 -0
- data/ext/p7zip/CPP/7zip/Archive/IArchive.h +234 -0
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHandler.cpp +326 -0
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHandler.h +30 -0
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHeader.cpp +21 -0
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHeader.h +61 -0
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoIn.cpp +453 -0
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoIn.h +315 -0
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoItem.h +141 -0
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoRegister.cpp +13 -0
- data/ext/p7zip/CPP/7zip/Archive/LzhHandler.cpp +775 -0
- data/ext/p7zip/CPP/7zip/Archive/LzmaHandler.cpp +430 -0
- data/ext/p7zip/CPP/7zip/Archive/MachoHandler.cpp +500 -0
- data/ext/p7zip/CPP/7zip/Archive/MbrHandler.cpp +507 -0
- data/ext/p7zip/CPP/7zip/Archive/MslzHandler.cpp +257 -0
- data/ext/p7zip/CPP/7zip/Archive/MubHandler.cpp +266 -0
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisDecode.cpp +130 -0
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisDecode.h +47 -0
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisHandler.cpp +510 -0
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisHandler.h +43 -0
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisIn.cpp +1461 -0
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisIn.h +181 -0
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisRegister.cpp +13 -0
- data/ext/p7zip/CPP/7zip/Archive/NtfsHandler.cpp +1764 -0
- data/ext/p7zip/CPP/7zip/Archive/PeHandler.cpp +1752 -0
- data/ext/p7zip/CPP/7zip/Archive/PpmdHandler.cpp +456 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarHandler.cpp +869 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarHandler.h +66 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarHeader.cpp +21 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarHeader.h +205 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarIn.cpp +478 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarIn.h +123 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarItem.cpp +55 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarItem.h +79 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarRegister.cpp +13 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp +78 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarVolumeInStream.h +49 -0
- data/ext/p7zip/CPP/7zip/Archive/RpmHandler.cpp +292 -0
- data/ext/p7zip/CPP/7zip/Archive/SplitHandler.cpp +366 -0
- data/ext/p7zip/CPP/7zip/Archive/SquashfsHandler.cpp +2155 -0
- data/ext/p7zip/CPP/7zip/Archive/SwfHandler.cpp +706 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandler.cpp +386 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandler.h +61 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandlerOut.cpp +122 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarHeader.cpp +25 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarHeader.h +108 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarIn.cpp +207 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarIn.h +17 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarItem.h +72 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarOut.cpp +187 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarOut.h +28 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarRegister.cpp +18 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarUpdate.cpp +139 -0
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarUpdate.h +34 -0
- data/ext/p7zip/CPP/7zip/Archive/Udf/UdfHandler.cpp +451 -0
- data/ext/p7zip/CPP/7zip/Archive/Udf/UdfHandler.h +37 -0
- data/ext/p7zip/CPP/7zip/Archive/Udf/UdfIn.cpp +876 -0
- data/ext/p7zip/CPP/7zip/Archive/Udf/UdfIn.h +375 -0
- data/ext/p7zip/CPP/7zip/Archive/Udf/UdfRegister.cpp +13 -0
- data/ext/p7zip/CPP/7zip/Archive/VhdHandler.cpp +734 -0
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandler.cpp +660 -0
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandler.h +77 -0
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandlerOut.cpp +639 -0
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimIn.cpp +855 -0
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimIn.h +297 -0
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimRegister.cpp +18 -0
- data/ext/p7zip/CPP/7zip/Archive/XarHandler.cpp +588 -0
- data/ext/p7zip/CPP/7zip/Archive/XzHandler.cpp +707 -0
- data/ext/p7zip/CPP/7zip/Archive/ZHandler.cpp +161 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipAddCommon.cpp +379 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipAddCommon.h +56 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipCompressionMode.h +42 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandler.cpp +822 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandler.h +101 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp +537 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHeader.cpp +36 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHeader.h +284 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipIn.cpp +893 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipIn.h +125 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItem.cpp +181 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItem.h +281 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItemEx.h +34 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipOut.cpp +289 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipOut.h +56 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipRegister.cpp +18 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipUpdate.cpp +1076 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipUpdate.h +58 -0
- data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile +328 -0
- data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile.depend +4962 -0
- data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile.list +265 -0
- data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7zFM.txt +163 -0
- data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7zG.txt +131 -0
- data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7za.txt +253 -0
- data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_ALL.txt +32 -0
- data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_Format7zFree.txt +290 -0
- data/ext/p7zip/CPP/7zip/CMAKE/generate.sh +37 -0
- data/ext/p7zip/CPP/7zip/CMAKE/generate_xcode.sh +32 -0
- data/ext/p7zip/CPP/7zip/Common/CWrappers.cpp +226 -0
- data/ext/p7zip/CPP/7zip/Common/CWrappers.h +109 -0
- data/ext/p7zip/CPP/7zip/Common/CreateCoder.cpp +293 -0
- data/ext/p7zip/CPP/7zip/Common/CreateCoder.h +98 -0
- data/ext/p7zip/CPP/7zip/Common/FilePathAutoRename.cpp +55 -0
- data/ext/p7zip/CPP/7zip/Common/FilePathAutoRename.h +10 -0
- data/ext/p7zip/CPP/7zip/Common/FileStreams.cpp +273 -0
- data/ext/p7zip/CPP/7zip/Common/FileStreams.h +134 -0
- data/ext/p7zip/CPP/7zip/Common/FilterCoder.cpp +247 -0
- data/ext/p7zip/CPP/7zip/Common/FilterCoder.h +128 -0
- data/ext/p7zip/CPP/7zip/Common/InBuffer.cpp +83 -0
- data/ext/p7zip/CPP/7zip/Common/InBuffer.h +81 -0
- data/ext/p7zip/CPP/7zip/Common/InOutTempBuffer.cpp +122 -0
- data/ext/p7zip/CPP/7zip/Common/InOutTempBuffer.h +48 -0
- data/ext/p7zip/CPP/7zip/Common/LimitedStreams.cpp +154 -0
- data/ext/p7zip/CPP/7zip/Common/LimitedStreams.h +125 -0
- data/ext/p7zip/CPP/7zip/Common/LockedStream.cpp +23 -0
- data/ext/p7zip/CPP/7zip/Common/LockedStream.h +38 -0
- data/ext/p7zip/CPP/7zip/Common/MemBlocks.cpp +183 -0
- data/ext/p7zip/CPP/7zip/Common/MemBlocks.h +71 -0
- data/ext/p7zip/CPP/7zip/Common/MethodId.cpp +27 -0
- data/ext/p7zip/CPP/7zip/Common/MethodId.h +10 -0
- data/ext/p7zip/CPP/7zip/Common/MethodProps.cpp +99 -0
- data/ext/p7zip/CPP/7zip/Common/MethodProps.h +41 -0
- data/ext/p7zip/CPP/7zip/Common/OffsetStream.cpp +35 -0
- data/ext/p7zip/CPP/7zip/Common/OffsetStream.h +25 -0
- data/ext/p7zip/CPP/7zip/Common/OutBuffer.cpp +116 -0
- data/ext/p7zip/CPP/7zip/Common/OutBuffer.h +64 -0
- data/ext/p7zip/CPP/7zip/Common/OutMemStream.cpp +142 -0
- data/ext/p7zip/CPP/7zip/Common/OutMemStream.h +96 -0
- data/ext/p7zip/CPP/7zip/Common/ProgressMt.cpp +53 -0
- data/ext/p7zip/CPP/7zip/Common/ProgressMt.h +46 -0
- data/ext/p7zip/CPP/7zip/Common/ProgressUtils.cpp +42 -0
- data/ext/p7zip/CPP/7zip/Common/ProgressUtils.h +34 -0
- data/ext/p7zip/CPP/7zip/Common/RegisterArc.h +32 -0
- data/ext/p7zip/CPP/7zip/Common/RegisterCodec.h +33 -0
- data/ext/p7zip/CPP/7zip/Common/StreamBinder.cpp +152 -0
- data/ext/p7zip/CPP/7zip/Common/StreamBinder.h +38 -0
- data/ext/p7zip/CPP/7zip/Common/StreamObjects.cpp +221 -0
- data/ext/p7zip/CPP/7zip/Common/StreamObjects.h +135 -0
- data/ext/p7zip/CPP/7zip/Common/StreamUtils.cpp +56 -0
- data/ext/p7zip/CPP/7zip/Common/StreamUtils.h +13 -0
- data/ext/p7zip/CPP/7zip/Common/VirtThread.cpp +46 -0
- data/ext/p7zip/CPP/7zip/Common/VirtThread.h +23 -0
- data/ext/p7zip/CPP/7zip/Compress/ArjDecoder1.cpp +309 -0
- data/ext/p7zip/CPP/7zip/Compress/ArjDecoder1.h +98 -0
- data/ext/p7zip/CPP/7zip/Compress/ArjDecoder2.cpp +90 -0
- data/ext/p7zip/CPP/7zip/Compress/ArjDecoder2.h +59 -0
- data/ext/p7zip/CPP/7zip/Compress/BZip2Const.h +54 -0
- data/ext/p7zip/CPP/7zip/Compress/BZip2Crc.cpp +26 -0
- data/ext/p7zip/CPP/7zip/Compress/BZip2Crc.h +31 -0
- data/ext/p7zip/CPP/7zip/Compress/BZip2Decoder.cpp +943 -0
- data/ext/p7zip/CPP/7zip/Compress/BZip2Decoder.h +205 -0
- data/ext/p7zip/CPP/7zip/Compress/BZip2Encoder.cpp +895 -0
- data/ext/p7zip/CPP/7zip/Compress/BZip2Encoder.h +245 -0
- data/ext/p7zip/CPP/7zip/Compress/BZip2Register.cpp +20 -0
- data/ext/p7zip/CPP/7zip/Compress/Bcj2Coder.cpp +386 -0
- data/ext/p7zip/CPP/7zip/Compress/Bcj2Coder.h +115 -0
- data/ext/p7zip/CPP/7zip/Compress/Bcj2Register.cpp +19 -0
- data/ext/p7zip/CPP/7zip/Compress/BcjCoder.cpp +15 -0
- data/ext/p7zip/CPP/7zip/Compress/BcjCoder.h +19 -0
- data/ext/p7zip/CPP/7zip/Compress/BcjRegister.cpp +19 -0
- data/ext/p7zip/CPP/7zip/Compress/BitlDecoder.cpp +24 -0
- data/ext/p7zip/CPP/7zip/Compress/BitlDecoder.h +141 -0
- data/ext/p7zip/CPP/7zip/Compress/BitlEncoder.h +57 -0
- data/ext/p7zip/CPP/7zip/Compress/BitmDecoder.h +66 -0
- data/ext/p7zip/CPP/7zip/Compress/BitmEncoder.h +50 -0
- data/ext/p7zip/CPP/7zip/Compress/BranchCoder.cpp +19 -0
- data/ext/p7zip/CPP/7zip/Compress/BranchCoder.h +44 -0
- data/ext/p7zip/CPP/7zip/Compress/BranchMisc.cpp +37 -0
- data/ext/p7zip/CPP/7zip/Compress/BranchMisc.h +14 -0
- data/ext/p7zip/CPP/7zip/Compress/BranchRegister.cpp +30 -0
- data/ext/p7zip/CPP/7zip/Compress/ByteSwap.cpp +73 -0
- data/ext/p7zip/CPP/7zip/Compress/CodecExports.cpp +160 -0
- data/ext/p7zip/CPP/7zip/Compress/CopyCoder.cpp +67 -0
- data/ext/p7zip/CPP/7zip/Compress/CopyCoder.h +34 -0
- data/ext/p7zip/CPP/7zip/Compress/CopyRegister.cpp +14 -0
- data/ext/p7zip/CPP/7zip/Compress/Deflate64Register.cpp +20 -0
- data/ext/p7zip/CPP/7zip/Compress/DeflateConst.h +134 -0
- data/ext/p7zip/CPP/7zip/Compress/DeflateDecoder.cpp +353 -0
- data/ext/p7zip/CPP/7zip/Compress/DeflateDecoder.h +157 -0
- data/ext/p7zip/CPP/7zip/Compress/DeflateEncoder.cpp +986 -0
- data/ext/p7zip/CPP/7zip/Compress/DeflateEncoder.h +211 -0
- data/ext/p7zip/CPP/7zip/Compress/DeflateRegister.cpp +21 -0
- data/ext/p7zip/CPP/7zip/Compress/DeltaFilter.cpp +112 -0
- data/ext/p7zip/CPP/7zip/Compress/DllExports.cpp +39 -0
- data/ext/p7zip/CPP/7zip/Compress/DllExports2.cpp +28 -0
- data/ext/p7zip/CPP/7zip/Compress/HuffmanDecoder.h +89 -0
- data/ext/p7zip/CPP/7zip/Compress/ImplodeDecoder.cpp +219 -0
- data/ext/p7zip/CPP/7zip/Compress/ImplodeDecoder.h +57 -0
- data/ext/p7zip/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp +89 -0
- data/ext/p7zip/CPP/7zip/Compress/ImplodeHuffmanDecoder.h +34 -0
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp +531 -0
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp +1018 -0
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h +48 -0
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp +311 -0
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h +20 -0
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/makefile +173 -0
- data/ext/p7zip/CPP/7zip/Compress/LzOutWindow.cpp +14 -0
- data/ext/p7zip/CPP/7zip/Compress/LzOutWindow.h +66 -0
- data/ext/p7zip/CPP/7zip/Compress/LzhDecoder.cpp +220 -0
- data/ext/p7zip/CPP/7zip/Compress/LzhDecoder.h +106 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzma2Decoder.cpp +189 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzma2Decoder.h +73 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzma2Encoder.cpp +94 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzma2Encoder.h +36 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzma2Register.cpp +20 -0
- data/ext/p7zip/CPP/7zip/Compress/LzmaDecoder.cpp +252 -0
- data/ext/p7zip/CPP/7zip/Compress/LzmaDecoder.h +84 -0
- data/ext/p7zip/CPP/7zip/Compress/LzmaEncoder.cpp +149 -0
- data/ext/p7zip/CPP/7zip/Compress/LzmaEncoder.h +36 -0
- data/ext/p7zip/CPP/7zip/Compress/LzmaRegister.cpp +20 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzx.h +61 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzx86Converter.cpp +90 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzx86Converter.h +46 -0
- data/ext/p7zip/CPP/7zip/Compress/LzxDecoder.cpp +387 -0
- data/ext/p7zip/CPP/7zip/Compress/LzxDecoder.h +159 -0
- data/ext/p7zip/CPP/7zip/Compress/Mtf8.h +193 -0
- data/ext/p7zip/CPP/7zip/Compress/PpmdDecoder.cpp +167 -0
- data/ext/p7zip/CPP/7zip/Compress/PpmdDecoder.h +78 -0
- data/ext/p7zip/CPP/7zip/Compress/PpmdEncoder.cpp +119 -0
- data/ext/p7zip/CPP/7zip/Compress/PpmdEncoder.h +48 -0
- data/ext/p7zip/CPP/7zip/Compress/PpmdRegister.cpp +21 -0
- data/ext/p7zip/CPP/7zip/Compress/PpmdZip.cpp +223 -0
- data/ext/p7zip/CPP/7zip/Compress/PpmdZip.h +72 -0
- data/ext/p7zip/CPP/7zip/Compress/QuantumDecoder.cpp +175 -0
- data/ext/p7zip/CPP/7zip/Compress/QuantumDecoder.h +264 -0
- data/ext/p7zip/CPP/7zip/Compress/RangeCoder.h +205 -0
- data/ext/p7zip/CPP/7zip/Compress/RangeCoderBit.h +114 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar/makefile +34 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar/makefile.depend +158 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar/makefile.list +64 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar1Decoder.cpp +480 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar1Decoder.h +88 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar2Decoder.cpp +391 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar2Decoder.h +174 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar3Decoder.cpp +897 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar3Decoder.h +267 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar3Vm.cpp +1091 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar3Vm.h +179 -0
- data/ext/p7zip/CPP/7zip/Compress/RarCodecsRegister.cpp +26 -0
- data/ext/p7zip/CPP/7zip/Compress/ShrinkDecoder.cpp +145 -0
- data/ext/p7zip/CPP/7zip/Compress/ShrinkDecoder.h +38 -0
- data/ext/p7zip/CPP/7zip/Compress/ZDecoder.cpp +159 -0
- data/ext/p7zip/CPP/7zip/Compress/ZDecoder.h +42 -0
- data/ext/p7zip/CPP/7zip/Compress/ZlibDecoder.cpp +89 -0
- data/ext/p7zip/CPP/7zip/Compress/ZlibDecoder.h +48 -0
- data/ext/p7zip/CPP/7zip/Compress/ZlibEncoder.cpp +61 -0
- data/ext/p7zip/CPP/7zip/Compress/ZlibEncoder.h +48 -0
- data/ext/p7zip/CPP/7zip/Crypto/7zAes.cpp +244 -0
- data/ext/p7zip/CPP/7zip/Crypto/7zAes.h +117 -0
- data/ext/p7zip/CPP/7zip/Crypto/7zAesRegister.cpp +18 -0
- data/ext/p7zip/CPP/7zip/Crypto/HmacSha1.cpp +109 -0
- data/ext/p7zip/CPP/7zip/Crypto/HmacSha1.h +39 -0
- data/ext/p7zip/CPP/7zip/Crypto/MyAes.cpp +48 -0
- data/ext/p7zip/CPP/7zip/Crypto/MyAes.h +38 -0
- data/ext/p7zip/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp +83 -0
- data/ext/p7zip/CPP/7zip/Crypto/Pbkdf2HmacSha1.h +21 -0
- data/ext/p7zip/CPP/7zip/Crypto/RandGen.cpp +107 -0
- data/ext/p7zip/CPP/7zip/Crypto/RandGen.h +21 -0
- data/ext/p7zip/CPP/7zip/Crypto/Rar20Crypto.cpp +133 -0
- data/ext/p7zip/CPP/7zip/Crypto/Rar20Crypto.h +50 -0
- data/ext/p7zip/CPP/7zip/Crypto/RarAes.cpp +134 -0
- data/ext/p7zip/CPP/7zip/Crypto/RarAes.h +47 -0
- data/ext/p7zip/CPP/7zip/Crypto/Sha1.cpp +229 -0
- data/ext/p7zip/CPP/7zip/Crypto/Sha1.h +68 -0
- data/ext/p7zip/CPP/7zip/Crypto/WzAes.cpp +221 -0
- data/ext/p7zip/CPP/7zip/Crypto/WzAes.h +125 -0
- data/ext/p7zip/CPP/7zip/Crypto/ZipCrypto.cpp +88 -0
- data/ext/p7zip/CPP/7zip/Crypto/ZipCrypto.h +56 -0
- data/ext/p7zip/CPP/7zip/Crypto/ZipStrong.cpp +164 -0
- data/ext/p7zip/CPP/7zip/Crypto/ZipStrong.h +47 -0
- data/ext/p7zip/CPP/7zip/Guid.txt +170 -0
- data/ext/p7zip/CPP/7zip/ICoder.h +186 -0
- data/ext/p7zip/CPP/7zip/IDecl.h +15 -0
- data/ext/p7zip/CPP/7zip/IPassword.h +24 -0
- data/ext/p7zip/CPP/7zip/IProgress.h +33 -0
- data/ext/p7zip/CPP/7zip/IStream.h +58 -0
- data/ext/p7zip/CPP/7zip/MyVersion.h +11 -0
- data/ext/p7zip/CPP/7zip/PREMAKE/generate.sh +18 -0
- data/ext/p7zip/CPP/7zip/PREMAKE/premake4.lua +263 -0
- data/ext/p7zip/CPP/7zip/PropID.h +76 -0
- data/ext/p7zip/CPP/7zip/QMAKE/7ZA/7ZA.pro +228 -0
- data/ext/p7zip/CPP/7zip/QMAKE/7ZA/7ZA_osx.pro +228 -0
- data/ext/p7zip/CPP/7zip/QMAKE/test_emul/test_emul.pro +26 -0
- data/ext/p7zip/CPP/7zip/TEST/TestUI/TestUI.cpp +560 -0
- data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile +33 -0
- data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile.depend +577 -0
- data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile.list +16 -0
- data/ext/p7zip/CPP/Common/AutoPtr.h +35 -0
- data/ext/p7zip/CPP/Common/Buffer.h +77 -0
- data/ext/p7zip/CPP/Common/CRC.cpp +7 -0
- data/ext/p7zip/CPP/Common/C_FileIO.cpp +88 -0
- data/ext/p7zip/CPP/Common/C_FileIO.h +47 -0
- data/ext/p7zip/CPP/Common/ComTry.h +18 -0
- data/ext/p7zip/CPP/Common/CommandLineParser.cpp +230 -0
- data/ext/p7zip/CPP/Common/CommandLineParser.h +72 -0
- data/ext/p7zip/CPP/Common/Defs.h +20 -0
- data/ext/p7zip/CPP/Common/DynamicBuffer.h +50 -0
- data/ext/p7zip/CPP/Common/IntToString.cpp +77 -0
- data/ext/p7zip/CPP/Common/IntToString.h +19 -0
- data/ext/p7zip/CPP/Common/Lang.cpp +130 -0
- data/ext/p7zip/CPP/Common/Lang.h +28 -0
- data/ext/p7zip/CPP/Common/ListFileUtils.cpp +75 -0
- data/ext/p7zip/CPP/Common/ListFileUtils.h +11 -0
- data/ext/p7zip/CPP/Common/MyCom.h +225 -0
- data/ext/p7zip/CPP/Common/MyException.h +14 -0
- data/ext/p7zip/CPP/Common/MyGuidDef.h +54 -0
- data/ext/p7zip/CPP/Common/MyInitGuid.h +22 -0
- data/ext/p7zip/CPP/Common/MyMap.cpp +140 -0
- data/ext/p7zip/CPP/Common/MyMap.h +28 -0
- data/ext/p7zip/CPP/Common/MyString.cpp +206 -0
- data/ext/p7zip/CPP/Common/MyString.h +601 -0
- data/ext/p7zip/CPP/Common/MyUnknown.h +13 -0
- data/ext/p7zip/CPP/Common/MyVector.cpp +87 -0
- data/ext/p7zip/CPP/Common/MyVector.h +266 -0
- data/ext/p7zip/CPP/Common/MyWindows.cpp +111 -0
- data/ext/p7zip/CPP/Common/MyWindows.h +218 -0
- data/ext/p7zip/CPP/Common/MyXml.cpp +209 -0
- data/ext/p7zip/CPP/Common/MyXml.h +40 -0
- data/ext/p7zip/CPP/Common/NewHandler.h +16 -0
- data/ext/p7zip/CPP/Common/StdInStream.cpp +100 -0
- data/ext/p7zip/CPP/Common/StdInStream.h +32 -0
- data/ext/p7zip/CPP/Common/StdOutStream.cpp +93 -0
- data/ext/p7zip/CPP/Common/StdOutStream.h +35 -0
- data/ext/p7zip/CPP/Common/StringConvert.cpp +181 -0
- data/ext/p7zip/CPP/Common/StringConvert.h +73 -0
- data/ext/p7zip/CPP/Common/StringToInt.cpp +90 -0
- data/ext/p7zip/CPP/Common/StringToInt.h +18 -0
- data/ext/p7zip/CPP/Common/TextConfig.cpp +138 -0
- data/ext/p7zip/CPP/Common/TextConfig.h +22 -0
- data/ext/p7zip/CPP/Common/Types.h +11 -0
- data/ext/p7zip/CPP/Common/UTFConvert.cpp +145 -0
- data/ext/p7zip/CPP/Common/UTFConvert.h +11 -0
- data/ext/p7zip/CPP/Common/Wildcard.cpp +462 -0
- data/ext/p7zip/CPP/Common/Wildcard.h +80 -0
- data/ext/p7zip/CPP/Windows/COM.cpp +37 -0
- data/ext/p7zip/CPP/Windows/COM.h +69 -0
- data/ext/p7zip/CPP/Windows/Clipboard.cpp +160 -0
- data/ext/p7zip/CPP/Windows/Clipboard.h +28 -0
- data/ext/p7zip/CPP/Windows/CommonDialog.h +19 -0
- data/ext/p7zip/CPP/Windows/Control/ComboBox.h +82 -0
- data/ext/p7zip/CPP/Windows/Control/Controls.cpp +515 -0
- data/ext/p7zip/CPP/Windows/Control/Dialog.cpp +560 -0
- data/ext/p7zip/CPP/Windows/Control/Dialog.h +179 -0
- data/ext/p7zip/CPP/Windows/Control/DialogImpl.h +73 -0
- data/ext/p7zip/CPP/Windows/Control/Edit.h +24 -0
- data/ext/p7zip/CPP/Windows/Control/ListView.h +164 -0
- data/ext/p7zip/CPP/Windows/Control/ProgressBar.h +34 -0
- data/ext/p7zip/CPP/Windows/Control/Static.h +23 -0
- data/ext/p7zip/CPP/Windows/Control/StatusBar.h +56 -0
- data/ext/p7zip/CPP/Windows/Control/Window2.cpp +211 -0
- data/ext/p7zip/CPP/Windows/Control/Window2.h +111 -0
- data/ext/p7zip/CPP/Windows/DLL.cpp +193 -0
- data/ext/p7zip/CPP/Windows/DLL.h +48 -0
- data/ext/p7zip/CPP/Windows/Defs.h +17 -0
- data/ext/p7zip/CPP/Windows/Error.cpp +58 -0
- data/ext/p7zip/CPP/Windows/Error.h +33 -0
- data/ext/p7zip/CPP/Windows/FileDir.cpp +927 -0
- data/ext/p7zip/CPP/Windows/FileDir.h +115 -0
- data/ext/p7zip/CPP/Windows/FileFind.cpp +604 -0
- data/ext/p7zip/CPP/Windows/FileFind.h +126 -0
- data/ext/p7zip/CPP/Windows/FileIO.cpp +475 -0
- data/ext/p7zip/CPP/Windows/FileIO.h +110 -0
- data/ext/p7zip/CPP/Windows/FileName.cpp +50 -0
- data/ext/p7zip/CPP/Windows/FileName.h +27 -0
- data/ext/p7zip/CPP/Windows/Menu.h +4 -0
- data/ext/p7zip/CPP/Windows/NtCheck.h +44 -0
- data/ext/p7zip/CPP/Windows/PropVariant.cpp +243 -0
- data/ext/p7zip/CPP/Windows/PropVariant.h +56 -0
- data/ext/p7zip/CPP/Windows/PropVariantConversions.cpp +142 -0
- data/ext/p7zip/CPP/Windows/PropVariantConversions.h +14 -0
- data/ext/p7zip/CPP/Windows/PropVariantUtils.cpp +78 -0
- data/ext/p7zip/CPP/Windows/PropVariantUtils.h +28 -0
- data/ext/p7zip/CPP/Windows/Registry.cpp +313 -0
- data/ext/p7zip/CPP/Windows/Registry.h +113 -0
- data/ext/p7zip/CPP/Windows/ResourceString.h +22 -0
- data/ext/p7zip/CPP/Windows/Shell.h +21 -0
- data/ext/p7zip/CPP/Windows/Synchronization.cpp +157 -0
- data/ext/p7zip/CPP/Windows/Synchronization.h +187 -0
- data/ext/p7zip/CPP/Windows/Synchronization2.h +218 -0
- data/ext/p7zip/CPP/Windows/System.cpp +166 -0
- data/ext/p7zip/CPP/Windows/System.h +16 -0
- data/ext/p7zip/CPP/Windows/Thread.h +41 -0
- data/ext/p7zip/CPP/Windows/Time.cpp +88 -0
- data/ext/p7zip/CPP/Windows/Time.h +21 -0
- data/ext/p7zip/CPP/Windows/Window.cpp +101 -0
- data/ext/p7zip/CPP/Windows/Window.h +43 -0
- data/ext/p7zip/CPP/include_windows/basetyps.h +19 -0
- data/ext/p7zip/CPP/include_windows/tchar.h +89 -0
- data/ext/p7zip/CPP/include_windows/windows.h +194 -0
- data/ext/p7zip/CPP/myWindows/StdAfx.h +124 -0
- data/ext/p7zip/CPP/myWindows/config.h +67 -0
- data/ext/p7zip/CPP/myWindows/initguid.h +4 -0
- data/ext/p7zip/CPP/myWindows/makefile +21 -0
- data/ext/p7zip/CPP/myWindows/makefile.depend +32 -0
- data/ext/p7zip/CPP/myWindows/makefile.list +28 -0
- data/ext/p7zip/CPP/myWindows/myAddExeFlag.cpp +20 -0
- data/ext/p7zip/CPP/myWindows/myGetTickCount.cpp +8 -0
- data/ext/p7zip/CPP/myWindows/myPrivate.h +17 -0
- data/ext/p7zip/CPP/myWindows/mySplitCommandLine.cpp +82 -0
- data/ext/p7zip/CPP/myWindows/test_emul.cpp +745 -0
- data/ext/p7zip/CPP/myWindows/wine_GetXXXDefaultLangID.cpp +741 -0
- data/ext/p7zip/CPP/myWindows/wine_date_and_time.cpp +434 -0
- data/ext/p7zip/ChangeLog +914 -0
- data/ext/p7zip/DOCS/7zC.txt +194 -0
- data/ext/p7zip/DOCS/7zFormat.txt +469 -0
- data/ext/p7zip/DOCS/License.txt +52 -0
- data/ext/p7zip/DOCS/MANUAL/commands/add.htm +87 -0
- data/ext/p7zip/DOCS/MANUAL/commands/bench.htm +79 -0
- data/ext/p7zip/DOCS/MANUAL/commands/delete.htm +59 -0
- data/ext/p7zip/DOCS/MANUAL/commands/extract.htm +91 -0
- data/ext/p7zip/DOCS/MANUAL/commands/extract_full.htm +68 -0
- data/ext/p7zip/DOCS/MANUAL/commands/index.htm +33 -0
- data/ext/p7zip/DOCS/MANUAL/commands/list.htm +77 -0
- data/ext/p7zip/DOCS/MANUAL/commands/style.css +232 -0
- data/ext/p7zip/DOCS/MANUAL/commands/test.htm +46 -0
- data/ext/p7zip/DOCS/MANUAL/commands/update.htm +66 -0
- data/ext/p7zip/DOCS/MANUAL/exit_codes.htm +27 -0
- data/ext/p7zip/DOCS/MANUAL/index.htm +29 -0
- data/ext/p7zip/DOCS/MANUAL/style.css +232 -0
- data/ext/p7zip/DOCS/MANUAL/switches/ar_exclude.htm +56 -0
- data/ext/p7zip/DOCS/MANUAL/switches/ar_include.htm +83 -0
- data/ext/p7zip/DOCS/MANUAL/switches/ar_no.htm +52 -0
- data/ext/p7zip/DOCS/MANUAL/switches/charset.htm +49 -0
- data/ext/p7zip/DOCS/MANUAL/switches/exclude.htm +60 -0
- data/ext/p7zip/DOCS/MANUAL/switches/include.htm +87 -0
- data/ext/p7zip/DOCS/MANUAL/switches/index.htm +64 -0
- data/ext/p7zip/DOCS/MANUAL/switches/large_pages.htm +50 -0
- data/ext/p7zip/DOCS/MANUAL/switches/list_tech.htm +36 -0
- data/ext/p7zip/DOCS/MANUAL/switches/method.htm +625 -0
- data/ext/p7zip/DOCS/MANUAL/switches/output_dir.htm +53 -0
- data/ext/p7zip/DOCS/MANUAL/switches/overwrite.htm +56 -0
- data/ext/p7zip/DOCS/MANUAL/switches/password.htm +54 -0
- data/ext/p7zip/DOCS/MANUAL/switches/recurse.htm +83 -0
- data/ext/p7zip/DOCS/MANUAL/switches/sfx.htm +156 -0
- data/ext/p7zip/DOCS/MANUAL/switches/ssc.htm +50 -0
- data/ext/p7zip/DOCS/MANUAL/switches/stdin.htm +55 -0
- data/ext/p7zip/DOCS/MANUAL/switches/stdout.htm +50 -0
- data/ext/p7zip/DOCS/MANUAL/switches/stop_switch.htm +31 -0
- data/ext/p7zip/DOCS/MANUAL/switches/style.css +232 -0
- data/ext/p7zip/DOCS/MANUAL/switches/type.htm +83 -0
- data/ext/p7zip/DOCS/MANUAL/switches/update.htm +176 -0
- data/ext/p7zip/DOCS/MANUAL/switches/volume.htm +49 -0
- data/ext/p7zip/DOCS/MANUAL/switches/working_dir.htm +55 -0
- data/ext/p7zip/DOCS/MANUAL/switches/yes.htm +48 -0
- data/ext/p7zip/DOCS/MANUAL/syntax.htm +120 -0
- data/ext/p7zip/DOCS/Methods.txt +152 -0
- data/ext/p7zip/DOCS/copying.txt +504 -0
- data/ext/p7zip/DOCS/history.txt +456 -0
- data/ext/p7zip/DOCS/lzma.txt +598 -0
- data/ext/p7zip/DOCS/readme.txt +181 -0
- data/ext/p7zip/DOCS/unRarLicense.txt +41 -0
- data/ext/p7zip/README +358 -0
- data/ext/p7zip/TODO +39 -0
- data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/ChangeLog +41 -0
- data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/readme +21 -0
- data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/readme.u7z +30 -0
- data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/u7z +133 -0
- data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/README +21 -0
- data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/check/check.sh +117 -0
- data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/check/files.tar +0 -0
- data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/man1/p7zip.1 +33 -0
- data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/p7zip +144 -0
- data/ext/p7zip/contrib/qnx630sp3/qnx630sp3-shared +14 -0
- data/ext/p7zip/contrib/qnx630sp3/qnx630sp3-static +10 -0
- data/ext/p7zip/extconf.rb +101 -0
- data/ext/p7zip/install.sh +206 -0
- data/ext/p7zip/install_local_context_menu.sh +18 -0
- data/ext/p7zip/integration_context_menu.txt +51 -0
- data/ext/p7zip/makefile +181 -0
- data/ext/p7zip/makefile.aix_gcc +22 -0
- data/ext/p7zip/makefile.beos +18 -0
- data/ext/p7zip/makefile.crc32 +8 -0
- data/ext/p7zip/makefile.cygwin +20 -0
- data/ext/p7zip/makefile.cygwin_asm +21 -0
- data/ext/p7zip/makefile.djgpp_old +21 -0
- data/ext/p7zip/makefile.djgpp_watt +47 -0
- data/ext/p7zip/makefile.freebsd5 +20 -0
- data/ext/p7zip/makefile.freebsd6 +20 -0
- data/ext/p7zip/makefile.glb +39 -0
- data/ext/p7zip/makefile.gprof +18 -0
- data/ext/p7zip/makefile.hpux-acc +17 -0
- data/ext/p7zip/makefile.hpux-acc_64 +19 -0
- data/ext/p7zip/makefile.hpux-gcc +21 -0
- data/ext/p7zip/makefile.linux_amd64 +22 -0
- data/ext/p7zip/makefile.linux_amd64_asm +24 -0
- data/ext/p7zip/makefile.linux_amd64_asm_icc +27 -0
- data/ext/p7zip/makefile.linux_any_cpu +22 -0
- data/ext/p7zip/makefile.linux_any_cpu_gcc_4.X +24 -0
- data/ext/p7zip/makefile.linux_clang_amd64 +22 -0
- data/ext/p7zip/makefile.linux_cross_arm +22 -0
- data/ext/p7zip/makefile.linux_gcc_2.95_no_need_for_libstdc +20 -0
- data/ext/p7zip/makefile.linux_other +23 -0
- data/ext/p7zip/makefile.linux_s390x +23 -0
- data/ext/p7zip/makefile.linux_x86_asm_gcc_4.X +26 -0
- data/ext/p7zip/makefile.linux_x86_asm_gcc_4.X_fltk +26 -0
- data/ext/p7zip/makefile.linux_x86_asm_gcc_mudflap_4.X +26 -0
- data/ext/p7zip/makefile.linux_x86_asm_icc +25 -0
- data/ext/p7zip/makefile.linux_x86_icc +24 -0
- data/ext/p7zip/makefile.machine_base +22 -0
- data/ext/p7zip/makefile.macosx_32bits +20 -0
- data/ext/p7zip/makefile.macosx_32bits_asm +23 -0
- data/ext/p7zip/makefile.macosx_32bits_ppc +21 -0
- data/ext/p7zip/makefile.macosx_64bits +20 -0
- data/ext/p7zip/makefile.macosx_llvm_64bits +20 -0
- data/ext/p7zip/makefile.netbsd +21 -0
- data/ext/p7zip/makefile.netware_asm_gcc_3.X +41 -0
- data/ext/p7zip/makefile.oldmake +174 -0
- data/ext/p7zip/makefile.openbsd +20 -0
- data/ext/p7zip/makefile.openbsd_no_port +20 -0
- data/ext/p7zip/makefile.qnx_shared.bin +21 -0
- data/ext/p7zip/makefile.qnx_static +21 -0
- data/ext/p7zip/makefile.rules +661 -0
- data/ext/p7zip/makefile.solaris_sparc_CC_32 +21 -0
- data/ext/p7zip/makefile.solaris_sparc_CC_64 +23 -0
- data/ext/p7zip/makefile.solaris_sparc_gcc +21 -0
- data/ext/p7zip/makefile.solaris_x86 +19 -0
- data/ext/p7zip/makefile.tru64 +22 -0
- data/ext/seven_zip_ruby/extconf.rb +127 -0
- data/ext/seven_zip_ruby/guid_defs.h +29 -0
- data/ext/seven_zip_ruby/mutex.h +10 -0
- data/ext/seven_zip_ruby/posix/mutex.h +94 -0
- data/ext/seven_zip_ruby/seven_zip_archive.cpp +1876 -0
- data/ext/seven_zip_ruby/seven_zip_archive.h +548 -0
- data/ext/seven_zip_ruby/util_common.cpp +28 -0
- data/ext/seven_zip_ruby/util_common.h +515 -0
- data/ext/seven_zip_ruby/utils.cpp +575 -0
- data/ext/seven_zip_ruby/utils.h +25 -0
- data/ext/seven_zip_ruby/win32/mutex.h +130 -0
- data/lib/seven_zip_ruby/7z.dll +0 -0
- data/lib/seven_zip_ruby/7z.sfx +0 -0
- data/lib/seven_zip_ruby/7z64.dll +0 -0
- data/lib/seven_zip_ruby/7zCon.sfx +0 -0
- data/lib/seven_zip_ruby/archive_info.rb +21 -0
- data/lib/seven_zip_ruby/entry_info.rb +46 -0
- data/lib/seven_zip_ruby/exception.rb +10 -0
- data/lib/seven_zip_ruby/seven_zip_reader.rb +537 -0
- data/lib/seven_zip_ruby/seven_zip_writer.rb +502 -0
- data/lib/seven_zip_ruby/update_info.rb +116 -0
- data/lib/seven_zip_ruby/version.rb +3 -0
- data/lib/seven_zip_ruby.rb +34 -0
- data/seven-zip.gemspec +35 -0
- data/spec/seven_zip.7z +0 -0
- data/spec/seven_zip_password.7z +0 -0
- data/spec/seven_zip_ruby_spec.rb +703 -0
- data/spec/seven_zip_ruby_spec_helper.rb +144 -0
- metadata +829 -0
@@ -0,0 +1,1876 @@
|
|
1
|
+
|
2
|
+
#include <array>
|
3
|
+
#include <vector>
|
4
|
+
#include <cassert>
|
5
|
+
#include <string>
|
6
|
+
|
7
|
+
#ifndef _WIN32
|
8
|
+
#include <dlfcn.h>
|
9
|
+
#endif
|
10
|
+
|
11
|
+
#include "seven_zip_archive.h"
|
12
|
+
#include "utils.h"
|
13
|
+
#include "util_common.h"
|
14
|
+
|
15
|
+
#define INTERN(const_str) rb_intern2(const_str, sizeof(const_str) - 1)
|
16
|
+
|
17
|
+
// For https://bugs.ruby-lang.org/issues/11962
|
18
|
+
#ifndef RARRAY_CONST_PTR
|
19
|
+
#define RARRAY_CONST_PTR(index_list) RARRAY_PTR(index_list)
|
20
|
+
#endif
|
21
|
+
|
22
|
+
////////////////////////////////////////////////////////////////
|
23
|
+
namespace SevenZip
|
24
|
+
{
|
25
|
+
|
26
|
+
using namespace RubyCppUtil;
|
27
|
+
|
28
|
+
|
29
|
+
typedef UINT32 (WINAPI * CreateObjectFunc)(
|
30
|
+
const GUID *clsID,
|
31
|
+
const GUID *interfaceID,
|
32
|
+
void **outObject);
|
33
|
+
|
34
|
+
static CreateObjectFunc CreateObject;
|
35
|
+
static VALUE gSevenZipModule = Qnil;
|
36
|
+
|
37
|
+
#ifdef _WIN32
|
38
|
+
static HMODULE gSevenZipHandle;
|
39
|
+
#else
|
40
|
+
static void *gSevenZipHandle;
|
41
|
+
#endif
|
42
|
+
|
43
|
+
////////////////////////////////////////////////////////////////
|
44
|
+
ArchiveBase::RubyAction ArchiveBase::ACTION_END = [](){};
|
45
|
+
|
46
|
+
ArchiveBase::ArchiveBase()
|
47
|
+
: m_action_tuple(nullptr),
|
48
|
+
m_event_loop_running(false),
|
49
|
+
m_self(Qnil)
|
50
|
+
{
|
51
|
+
m_action_result.clear();
|
52
|
+
}
|
53
|
+
|
54
|
+
ArchiveBase::~ArchiveBase()
|
55
|
+
{
|
56
|
+
}
|
57
|
+
|
58
|
+
void ArchiveBase::setSelf(VALUE self)
|
59
|
+
{
|
60
|
+
m_self = self;
|
61
|
+
}
|
62
|
+
|
63
|
+
VALUE ArchiveBase::self()
|
64
|
+
{
|
65
|
+
return m_self;
|
66
|
+
}
|
67
|
+
|
68
|
+
void ArchiveBase::rubyEventLoop()
|
69
|
+
{
|
70
|
+
m_action_mutex.lock();
|
71
|
+
while(m_event_loop_running){
|
72
|
+
m_action_mutex.unlock();
|
73
|
+
|
74
|
+
RubyActionTuple end_tuple = std::make_pair(&ACTION_END, false);
|
75
|
+
RubyActionTuple * volatile action_tuple = nullptr;
|
76
|
+
|
77
|
+
bool success = runNativeFuncProtect([&](){
|
78
|
+
MutexLocker locker(&m_action_mutex);
|
79
|
+
while(!m_action_tuple){
|
80
|
+
m_action_cond_var.wait(&m_action_mutex);
|
81
|
+
}
|
82
|
+
action_tuple = m_action_tuple;
|
83
|
+
}, [&](){
|
84
|
+
MutexLocker locker(&m_action_mutex);
|
85
|
+
if (m_event_loop_running){
|
86
|
+
m_action_tuple = &end_tuple;
|
87
|
+
m_action_cond_var.broadcast();
|
88
|
+
}
|
89
|
+
});
|
90
|
+
if (!success){
|
91
|
+
MutexLocker locker(&m_action_mutex);
|
92
|
+
action_tuple = &end_tuple;
|
93
|
+
}
|
94
|
+
|
95
|
+
RubyAction *action = action_tuple->first;
|
96
|
+
bool event_loop_running = m_event_loop_running;
|
97
|
+
if (action == &ACTION_END){
|
98
|
+
action_tuple->second = true;
|
99
|
+
event_loop_running = false;
|
100
|
+
}else if (m_action_result.isError()){
|
101
|
+
action_tuple->second = false;
|
102
|
+
}else{
|
103
|
+
int status = 0;
|
104
|
+
rb_protect(runProtectedRubyAction, reinterpret_cast<VALUE>(action), &status);
|
105
|
+
action_tuple->second = (status == 0);
|
106
|
+
|
107
|
+
if (status && !m_action_result.isError()){
|
108
|
+
m_action_result.status = status;
|
109
|
+
m_action_result.exception = rb_gv_get("$!");
|
110
|
+
event_loop_running = false;
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
m_action_mutex.lock();
|
115
|
+
m_event_loop_running = event_loop_running;
|
116
|
+
// if (m_action_tuple && m_action_tuple != &end_tuple && m_action_tuple != action_tuple){
|
117
|
+
// // Someone overrode m_action_tuple.
|
118
|
+
// // It might be killEventLoopThread. Otherwise, it might a bug.
|
119
|
+
// // Therefore, terminate event loop for safety.
|
120
|
+
// m_event_loop_running = false;
|
121
|
+
// }
|
122
|
+
m_action_tuple = nullptr;
|
123
|
+
m_action_cond_var.broadcast();
|
124
|
+
}
|
125
|
+
m_action_mutex.unlock();
|
126
|
+
}
|
127
|
+
|
128
|
+
VALUE ArchiveBase::runProtectedRubyAction(VALUE p)
|
129
|
+
{
|
130
|
+
RubyAction *action = reinterpret_cast<RubyAction*>(p);
|
131
|
+
(*action)();
|
132
|
+
return Qnil;
|
133
|
+
}
|
134
|
+
|
135
|
+
VALUE ArchiveBase::staticRubyEventLoop(void *p)
|
136
|
+
{
|
137
|
+
ArchiveBase *self = reinterpret_cast<ArchiveBase*>(p);
|
138
|
+
VALUE gc_guard = self->self();
|
139
|
+
RB_GC_GUARD(gc_guard);
|
140
|
+
self->rubyEventLoop();
|
141
|
+
return Qnil;
|
142
|
+
}
|
143
|
+
|
144
|
+
void ArchiveBase::startEventLoopThread()
|
145
|
+
{
|
146
|
+
MutexLocker locker(&m_action_mutex);
|
147
|
+
if (m_event_loop_running){
|
148
|
+
return;
|
149
|
+
}
|
150
|
+
m_event_loop_running = true;
|
151
|
+
RubyCppUtil::rb_thread_create(staticRubyEventLoop, this);
|
152
|
+
}
|
153
|
+
|
154
|
+
void ArchiveBase::cancelAction()
|
155
|
+
{
|
156
|
+
// killEventLoopThread();
|
157
|
+
setErrorState();
|
158
|
+
}
|
159
|
+
|
160
|
+
void ArchiveBase::killEventLoopThread()
|
161
|
+
{
|
162
|
+
MutexLocker locker(&m_action_mutex);
|
163
|
+
if (m_event_loop_running){
|
164
|
+
static RubyActionTuple end_tuple;
|
165
|
+
end_tuple = std::make_pair(&ACTION_END, false);
|
166
|
+
m_action_tuple = &end_tuple; // override.
|
167
|
+
m_action_cond_var.broadcast();
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
bool ArchiveBase::runRubyActionImpl(RubyAction *action)
|
172
|
+
{
|
173
|
+
MutexLocker locker(&m_action_mutex);
|
174
|
+
|
175
|
+
if (!action || !m_event_loop_running){
|
176
|
+
return false;
|
177
|
+
}
|
178
|
+
|
179
|
+
RubyActionTuple tuple = std::make_pair(action, false);
|
180
|
+
|
181
|
+
while(m_action_tuple && m_event_loop_running){
|
182
|
+
m_action_cond_var.wait(&m_action_mutex);
|
183
|
+
}
|
184
|
+
if (!m_event_loop_running){
|
185
|
+
return false;
|
186
|
+
}
|
187
|
+
|
188
|
+
m_action_tuple = &tuple;
|
189
|
+
|
190
|
+
m_action_cond_var.broadcast();
|
191
|
+
|
192
|
+
while(m_action_tuple == &tuple && m_event_loop_running){
|
193
|
+
m_action_cond_var.wait(&m_action_mutex);
|
194
|
+
}
|
195
|
+
|
196
|
+
return (tuple.second && m_event_loop_running);
|
197
|
+
}
|
198
|
+
|
199
|
+
template<typename T>
|
200
|
+
bool ArchiveBase::runRubyAction(T t)
|
201
|
+
{
|
202
|
+
RubyAction action = t;
|
203
|
+
return runRubyActionImpl(&action);
|
204
|
+
}
|
205
|
+
|
206
|
+
void ArchiveBase::finishRubyAction()
|
207
|
+
{
|
208
|
+
runRubyActionImpl(&ACTION_END);
|
209
|
+
}
|
210
|
+
|
211
|
+
void ArchiveBase::mark()
|
212
|
+
{
|
213
|
+
rb_gc_mark(m_self);
|
214
|
+
m_action_result.mark();
|
215
|
+
}
|
216
|
+
|
217
|
+
void ArchiveBase::prepareAction()
|
218
|
+
{
|
219
|
+
m_action_result.clear();
|
220
|
+
}
|
221
|
+
|
222
|
+
void ArchiveBase::terminateEventLoopThread()
|
223
|
+
{
|
224
|
+
runNativeFuncProtect([&](){
|
225
|
+
finishRubyAction();
|
226
|
+
}, [&](){
|
227
|
+
// Nothing to do.
|
228
|
+
});
|
229
|
+
}
|
230
|
+
|
231
|
+
////////////////////////////////////////////////////////////////
|
232
|
+
ArchiveReader::ArchiveReader(const GUID &format_guid)
|
233
|
+
: m_rb_callback_proc(Qnil), m_rb_out_stream(Qnil),
|
234
|
+
m_processing_index((UInt32)(Int32)-1), m_rb_in_stream(Qnil),
|
235
|
+
m_format_guid(format_guid),
|
236
|
+
m_password_specified(false),
|
237
|
+
m_state(STATE_INITIAL)
|
238
|
+
{
|
239
|
+
IInArchive *archive = 0;
|
240
|
+
HRESULT ret = CreateObject(&m_format_guid, &IID_IInArchive, reinterpret_cast<void **>(&archive));
|
241
|
+
if (ret != S_OK){
|
242
|
+
m_state = STATE_ERROR;
|
243
|
+
return;
|
244
|
+
}
|
245
|
+
|
246
|
+
m_in_archive.Attach(archive);
|
247
|
+
}
|
248
|
+
|
249
|
+
void ArchiveReader::setProcessingStream(VALUE stream, UInt32 index, Int32 askExtractMode)
|
250
|
+
{
|
251
|
+
m_rb_out_stream = stream;
|
252
|
+
m_processing_index = index;
|
253
|
+
m_ask_extract_mode = askExtractMode;
|
254
|
+
}
|
255
|
+
|
256
|
+
void ArchiveReader::getProcessingStream(VALUE *stream, UInt32 *index, Int32 *askExtractMode)
|
257
|
+
{
|
258
|
+
if (stream){
|
259
|
+
*stream = m_rb_out_stream;
|
260
|
+
}
|
261
|
+
if (index){
|
262
|
+
*index = m_processing_index;
|
263
|
+
}
|
264
|
+
if (askExtractMode){
|
265
|
+
*askExtractMode = m_ask_extract_mode;
|
266
|
+
}
|
267
|
+
}
|
268
|
+
|
269
|
+
void ArchiveReader::clearProcessingStream()
|
270
|
+
{
|
271
|
+
setProcessingStream(Qnil, (UInt32)(Int32)-1, 0);
|
272
|
+
}
|
273
|
+
|
274
|
+
void ArchiveReader::setOperationResult(UInt32 index, Int32 result)
|
275
|
+
{
|
276
|
+
if (index < m_test_result.size()){
|
277
|
+
m_test_result[index] = result;
|
278
|
+
}
|
279
|
+
}
|
280
|
+
|
281
|
+
VALUE ArchiveReader::open(VALUE in_stream, VALUE param)
|
282
|
+
{
|
283
|
+
checkStateToBeginOperation(STATE_INITIAL);
|
284
|
+
prepareAction();
|
285
|
+
EventLoopThreadExecuter te(this);
|
286
|
+
|
287
|
+
m_rb_in_stream = in_stream;
|
288
|
+
m_rb_callback_proc = Qnil;
|
289
|
+
m_rb_out_stream = Qnil;
|
290
|
+
m_rb_entry_info_list.clear();
|
291
|
+
|
292
|
+
VALUE password;
|
293
|
+
runRubyFunction([&](){
|
294
|
+
password = rb_hash_aref(param, ID2SYM(INTERN("password")));
|
295
|
+
});
|
296
|
+
if (NIL_P(password)){
|
297
|
+
m_password_specified = false;
|
298
|
+
}else{
|
299
|
+
m_password_specified = true;
|
300
|
+
m_password = std::string(RSTRING_PTR(password), RSTRING_LEN(password));
|
301
|
+
}
|
302
|
+
|
303
|
+
HRESULT ret = E_FAIL;
|
304
|
+
runNativeFunc([&](){
|
305
|
+
ArchiveOpenCallback *callback;
|
306
|
+
if (m_password_specified){
|
307
|
+
callback = new ArchiveOpenCallback(this, m_password);
|
308
|
+
}else{
|
309
|
+
callback = new ArchiveOpenCallback(this);
|
310
|
+
}
|
311
|
+
|
312
|
+
CMyComPtr<IArchiveOpenCallback> callback_ptr(callback);
|
313
|
+
|
314
|
+
InStream *stream = new InStream(m_rb_in_stream, this);
|
315
|
+
m_in_stream = stream;
|
316
|
+
ret = m_in_archive->Open(stream, 0, callback);
|
317
|
+
});
|
318
|
+
|
319
|
+
checkState(STATE_INITIAL, "Open error");
|
320
|
+
if (ret != S_OK){
|
321
|
+
throw RubyCppUtil::RubyException("Invalid file format. open");
|
322
|
+
}
|
323
|
+
|
324
|
+
m_state = STATE_OPENED;
|
325
|
+
|
326
|
+
return Qnil;
|
327
|
+
}
|
328
|
+
|
329
|
+
VALUE ArchiveReader::close()
|
330
|
+
{
|
331
|
+
if (m_state == STATE_CLOSED){
|
332
|
+
return Qnil;
|
333
|
+
}
|
334
|
+
|
335
|
+
checkStateToBeginOperation(STATE_OPENED);
|
336
|
+
prepareAction();
|
337
|
+
EventLoopThreadExecuter te(this);
|
338
|
+
|
339
|
+
runNativeFunc([&](){
|
340
|
+
m_in_archive->Close();
|
341
|
+
});
|
342
|
+
std::vector<VALUE>().swap(m_rb_entry_info_list);
|
343
|
+
|
344
|
+
checkState(STATE_OPENED, "Close error");
|
345
|
+
m_state = STATE_CLOSED;
|
346
|
+
|
347
|
+
return Qnil;
|
348
|
+
}
|
349
|
+
|
350
|
+
VALUE ArchiveReader::entryNum()
|
351
|
+
{
|
352
|
+
checkStateToBeginOperation(STATE_OPENED);
|
353
|
+
prepareAction();
|
354
|
+
EventLoopThreadExecuter te(this);
|
355
|
+
|
356
|
+
UInt32 num;
|
357
|
+
runNativeFunc([&](){
|
358
|
+
HRESULT ret = m_in_archive->GetNumberOfItems(&num);
|
359
|
+
if (ret != S_OK){
|
360
|
+
num = 0xFFFFFFFF;
|
361
|
+
}
|
362
|
+
});
|
363
|
+
|
364
|
+
checkState(STATE_OPENED, "entryNum error");
|
365
|
+
|
366
|
+
return ULONG2NUM(num);
|
367
|
+
}
|
368
|
+
|
369
|
+
VALUE ArchiveReader::getArchiveProperty()
|
370
|
+
{
|
371
|
+
checkStateToBeginOperation(STATE_OPENED);
|
372
|
+
prepareAction();
|
373
|
+
EventLoopThreadExecuter te(this);
|
374
|
+
|
375
|
+
struct PropIdVarTypePair
|
376
|
+
{
|
377
|
+
PROPID prop_id;
|
378
|
+
VARTYPE vt;
|
379
|
+
};
|
380
|
+
PropIdVarTypePair list[] = {
|
381
|
+
{ kpidMethod, VT_BSTR },
|
382
|
+
{ kpidSolid, VT_BOOL },
|
383
|
+
{ kpidNumBlocks, VT_UI4 },
|
384
|
+
{ kpidHeadersSize, VT_UI8 },
|
385
|
+
{ kpidPhySize, VT_UI8 }
|
386
|
+
};
|
387
|
+
|
388
|
+
const unsigned int size = sizeof(list)/sizeof(list[0]);
|
389
|
+
|
390
|
+
NWindows::NCOM::CPropVariant variant_list[size];
|
391
|
+
runNativeFunc([&](){
|
392
|
+
for (unsigned int i=0; i<size; i++){
|
393
|
+
HRESULT ret = m_in_archive->GetArchiveProperty(list[i].prop_id, &variant_list[i]);
|
394
|
+
if (ret != S_OK || variant_list[i].vt != list[i].vt){
|
395
|
+
variant_list[i].Clear();
|
396
|
+
}
|
397
|
+
}
|
398
|
+
});
|
399
|
+
|
400
|
+
checkState(STATE_OPENED, "getArchiveProperty error");
|
401
|
+
|
402
|
+
VALUE ret;
|
403
|
+
VALUE value_list[size];
|
404
|
+
runRubyFunction([&](){
|
405
|
+
VALUE archive_info = rb_const_get(gSevenZipModule, INTERN("ArchiveInfo"));
|
406
|
+
ID new_id = INTERN("new");
|
407
|
+
for (unsigned int i=0; i<size; i++){
|
408
|
+
value_list[i] = ConvertPropToValue(variant_list[i]);
|
409
|
+
}
|
410
|
+
ret = rb_funcall2(archive_info, new_id, size, value_list);
|
411
|
+
});
|
412
|
+
return ret;
|
413
|
+
}
|
414
|
+
|
415
|
+
VALUE ArchiveReader::getEntryInfo(VALUE index)
|
416
|
+
{
|
417
|
+
checkStateToBeginOperation(STATE_OPENED);
|
418
|
+
prepareAction();
|
419
|
+
EventLoopThreadExecuter te(this);
|
420
|
+
|
421
|
+
fillEntryInfo();
|
422
|
+
|
423
|
+
checkState(STATE_OPENED, "getEntryInfo error");
|
424
|
+
|
425
|
+
UInt32 idx;
|
426
|
+
runRubyFunction([&](){
|
427
|
+
idx = NUM2ULONG(index);
|
428
|
+
});
|
429
|
+
return entryInfo(idx);
|
430
|
+
}
|
431
|
+
|
432
|
+
VALUE ArchiveReader::entryInfo(UInt32 index)
|
433
|
+
{
|
434
|
+
if (index >= m_rb_entry_info_list.size()){
|
435
|
+
return Qnil;
|
436
|
+
}
|
437
|
+
|
438
|
+
return m_rb_entry_info_list[index];
|
439
|
+
}
|
440
|
+
|
441
|
+
VALUE ArchiveReader::getAllEntryInfo()
|
442
|
+
{
|
443
|
+
checkStateToBeginOperation(STATE_OPENED);
|
444
|
+
prepareAction();
|
445
|
+
EventLoopThreadExecuter te(this);
|
446
|
+
|
447
|
+
fillEntryInfo();
|
448
|
+
|
449
|
+
checkState(STATE_OPENED, "getAllEntryInfo error");
|
450
|
+
|
451
|
+
VALUE ret;
|
452
|
+
runRubyFunction([&](){
|
453
|
+
ret = rb_ary_new4(m_rb_entry_info_list.size(), &m_rb_entry_info_list[0]);
|
454
|
+
});
|
455
|
+
return ret;
|
456
|
+
}
|
457
|
+
|
458
|
+
VALUE ArchiveReader::setFileAttribute(VALUE path, VALUE attrib)
|
459
|
+
{
|
460
|
+
#ifdef _WIN32
|
461
|
+
BSTR str = ConvertStringToBstr(RSTRING_PTR(path), RSTRING_LEN(path));
|
462
|
+
BOOL ret = ::SetFileAttributesW(str, NUM2ULONG(attrib));
|
463
|
+
SysFreeString(str);
|
464
|
+
return (ret ? Qtrue : Qfalse);
|
465
|
+
#else
|
466
|
+
// TODO
|
467
|
+
return Qtrue;
|
468
|
+
#endif
|
469
|
+
}
|
470
|
+
|
471
|
+
VALUE ArchiveReader::extract(VALUE index, VALUE callback_proc)
|
472
|
+
{
|
473
|
+
checkStateToBeginOperation(STATE_OPENED);
|
474
|
+
prepareAction();
|
475
|
+
EventLoopThreadExecuter te(this);
|
476
|
+
|
477
|
+
m_rb_callback_proc = callback_proc;
|
478
|
+
|
479
|
+
fillEntryInfo();
|
480
|
+
|
481
|
+
UInt32 i;
|
482
|
+
runRubyFunction([&](){
|
483
|
+
i = NUM2ULONG(index);
|
484
|
+
});
|
485
|
+
HRESULT ret;
|
486
|
+
runNativeFunc([&](){
|
487
|
+
ArchiveExtractCallback *extract_callback = createArchiveExtractCallback();
|
488
|
+
CMyComPtr<IArchiveExtractCallback> callback(extract_callback);
|
489
|
+
ret = m_in_archive->Extract(&i, 1, 0, extract_callback);
|
490
|
+
});
|
491
|
+
|
492
|
+
m_rb_callback_proc = Qnil;
|
493
|
+
|
494
|
+
checkState(STATE_OPENED, "extract error");
|
495
|
+
if (ret != S_OK){
|
496
|
+
throw RubyCppUtil::RubyException("Invalid file format. extract");
|
497
|
+
}
|
498
|
+
|
499
|
+
return Qnil;
|
500
|
+
}
|
501
|
+
|
502
|
+
VALUE ArchiveReader::extractFiles(VALUE index_list, VALUE callback_proc)
|
503
|
+
{
|
504
|
+
checkStateToBeginOperation(STATE_OPENED);
|
505
|
+
prepareAction();
|
506
|
+
EventLoopThreadExecuter te(this);
|
507
|
+
|
508
|
+
m_rb_callback_proc = callback_proc;
|
509
|
+
|
510
|
+
fillEntryInfo();
|
511
|
+
|
512
|
+
std::vector<UInt32> list(RARRAY_LEN(index_list));
|
513
|
+
std::transform(RARRAY_CONST_PTR(index_list), RARRAY_CONST_PTR(index_list) + RARRAY_LEN(index_list),
|
514
|
+
list.begin(), [](VALUE num){ return NUM2ULONG(num); });
|
515
|
+
|
516
|
+
HRESULT ret;
|
517
|
+
runNativeFunc([&](){
|
518
|
+
ArchiveExtractCallback *extract_callback = createArchiveExtractCallback();
|
519
|
+
CMyComPtr<IArchiveExtractCallback> callback(extract_callback);
|
520
|
+
ret = m_in_archive->Extract(&list[0], list.size(), 0, extract_callback);
|
521
|
+
});
|
522
|
+
|
523
|
+
m_rb_callback_proc = Qnil;
|
524
|
+
|
525
|
+
checkState(STATE_OPENED, "extractFiles error");
|
526
|
+
if (ret != S_OK){
|
527
|
+
throw RubyCppUtil::RubyException("Invalid file format. extractFiles");
|
528
|
+
}
|
529
|
+
|
530
|
+
return Qnil;
|
531
|
+
}
|
532
|
+
|
533
|
+
VALUE ArchiveReader::extractAll(VALUE callback_proc)
|
534
|
+
{
|
535
|
+
checkStateToBeginOperation(STATE_OPENED);
|
536
|
+
prepareAction();
|
537
|
+
EventLoopThreadExecuter te(this);
|
538
|
+
|
539
|
+
m_rb_callback_proc = callback_proc;
|
540
|
+
|
541
|
+
fillEntryInfo();
|
542
|
+
|
543
|
+
HRESULT ret;
|
544
|
+
runNativeFunc([&](){
|
545
|
+
ArchiveExtractCallback *extract_callback = createArchiveExtractCallback();
|
546
|
+
CMyComPtr<IArchiveExtractCallback> callback(extract_callback);
|
547
|
+
ret = m_in_archive->Extract(0, (UInt32)(Int32)(-1), 0, extract_callback);
|
548
|
+
});
|
549
|
+
|
550
|
+
m_rb_callback_proc = Qnil;
|
551
|
+
|
552
|
+
checkState(STATE_OPENED, "extractAll error");
|
553
|
+
if (ret != S_OK){
|
554
|
+
throw RubyCppUtil::RubyException("Invalid file format. extractAll");
|
555
|
+
}
|
556
|
+
|
557
|
+
return Qnil;
|
558
|
+
}
|
559
|
+
|
560
|
+
VALUE ArchiveReader::testAll(VALUE detail)
|
561
|
+
{
|
562
|
+
checkStateToBeginOperation(STATE_OPENED);
|
563
|
+
prepareAction();
|
564
|
+
EventLoopThreadExecuter te(this);
|
565
|
+
|
566
|
+
m_rb_callback_proc = Qnil;
|
567
|
+
|
568
|
+
UInt32 num;
|
569
|
+
HRESULT ret;
|
570
|
+
runNativeFunc([&](){
|
571
|
+
ret = m_in_archive->GetNumberOfItems(&num);
|
572
|
+
});
|
573
|
+
checkState(STATE_OPENED, "testAll error");
|
574
|
+
if (ret != S_OK || m_state == STATE_ERROR){
|
575
|
+
throw RubyCppUtil::RubyException("Cannot get number of items");
|
576
|
+
}
|
577
|
+
m_test_result.resize(num);
|
578
|
+
std::fill(m_test_result.begin(), m_test_result.end(), NArchive::NExtract::NOperationResult::kOK);
|
579
|
+
|
580
|
+
runNativeFunc([&](){
|
581
|
+
ArchiveExtractCallback *extract_callback = createArchiveExtractCallback();
|
582
|
+
CMyComPtr<IArchiveExtractCallback> callback(extract_callback);
|
583
|
+
ret = m_in_archive->Extract(0, (UInt32)(Int32)(-1), 1, extract_callback);
|
584
|
+
});
|
585
|
+
|
586
|
+
checkState(STATE_OPENED, "testAll error");
|
587
|
+
if (ret != S_OK){
|
588
|
+
throw RubyCppUtil::RubyException("Archive corrupted.");
|
589
|
+
}
|
590
|
+
|
591
|
+
if (RTEST(detail)){
|
592
|
+
VALUE ary;
|
593
|
+
runRubyFunction([&](){
|
594
|
+
using namespace NArchive::NExtract::NOperationResult;
|
595
|
+
|
596
|
+
VALUE unsupportedMethod = ID2SYM(INTERN("UnsupportedMethod"));
|
597
|
+
VALUE dataError = ID2SYM(INTERN("DataError"));
|
598
|
+
VALUE crcError = ID2SYM(INTERN("CrcError"));
|
599
|
+
|
600
|
+
ary = rb_ary_new2(num);
|
601
|
+
for (unsigned int i=0; i<m_test_result.size(); i++){
|
602
|
+
VALUE v;
|
603
|
+
switch(m_test_result[i]){
|
604
|
+
case kOK:
|
605
|
+
v = Qtrue;
|
606
|
+
break;
|
607
|
+
case kUnSupportedMethod:
|
608
|
+
v = unsupportedMethod;
|
609
|
+
break;
|
610
|
+
case kDataError:
|
611
|
+
v = dataError;
|
612
|
+
break;
|
613
|
+
case kCRCError:
|
614
|
+
v = crcError;
|
615
|
+
break;
|
616
|
+
default:
|
617
|
+
v = Qnil;
|
618
|
+
break;
|
619
|
+
}
|
620
|
+
rb_ary_store(ary, (long)i, v);
|
621
|
+
}
|
622
|
+
});
|
623
|
+
return ary;
|
624
|
+
}else{
|
625
|
+
using namespace NArchive::NExtract::NOperationResult;
|
626
|
+
return (std::find_if(m_test_result.begin(), m_test_result.end(),
|
627
|
+
std::bind(std::not_equal_to<Int32>(), std::placeholders::_1, kOK))
|
628
|
+
== m_test_result.end()) ? Qtrue : Qfalse;
|
629
|
+
}
|
630
|
+
}
|
631
|
+
|
632
|
+
ArchiveExtractCallback *ArchiveReader::createArchiveExtractCallback()
|
633
|
+
{
|
634
|
+
ArchiveExtractCallback *extract_callback;
|
635
|
+
if (m_password_specified){
|
636
|
+
extract_callback = new ArchiveExtractCallback(this, m_password);
|
637
|
+
}else{
|
638
|
+
extract_callback = new ArchiveExtractCallback(this);
|
639
|
+
}
|
640
|
+
return extract_callback;
|
641
|
+
}
|
642
|
+
|
643
|
+
void ArchiveReader::fillEntryInfo()
|
644
|
+
{
|
645
|
+
if (!m_rb_entry_info_list.empty()){
|
646
|
+
return;
|
647
|
+
}
|
648
|
+
|
649
|
+
struct PropIdVarTypePair
|
650
|
+
{
|
651
|
+
PROPID prop_id;
|
652
|
+
VARTYPE vt;
|
653
|
+
};
|
654
|
+
PropIdVarTypePair list[] = {
|
655
|
+
{ kpidPath, VT_BSTR },
|
656
|
+
{ kpidMethod, VT_BSTR },
|
657
|
+
{ kpidIsDir, VT_BOOL },
|
658
|
+
{ kpidEncrypted, VT_BOOL },
|
659
|
+
{ kpidIsAnti, VT_BOOL },
|
660
|
+
{ kpidSize, VT_UI8 },
|
661
|
+
{ kpidPackSize, VT_UI8 },
|
662
|
+
{ kpidCTime, VT_FILETIME },
|
663
|
+
{ kpidATime, VT_FILETIME },
|
664
|
+
{ kpidMTime, VT_FILETIME },
|
665
|
+
{ kpidAttrib, VT_UI4 },
|
666
|
+
{ kpidCRC, VT_UI4 }
|
667
|
+
};
|
668
|
+
|
669
|
+
const unsigned int size = sizeof(list)/sizeof(list[0]);
|
670
|
+
|
671
|
+
UInt32 num;
|
672
|
+
HRESULT ret;
|
673
|
+
runNativeFunc([&](){
|
674
|
+
ret = m_in_archive->GetNumberOfItems(&num);
|
675
|
+
});
|
676
|
+
if (ret != S_OK || m_state == STATE_ERROR){
|
677
|
+
throw RubyCppUtil::RubyException("Cannot get number of items");
|
678
|
+
}
|
679
|
+
|
680
|
+
std::vector< std::array< NWindows::NCOM::CPropVariant, size > > variant_list(num);
|
681
|
+
|
682
|
+
runNativeFunc([&](){
|
683
|
+
for (UInt32 idx=0; idx<num; idx++){
|
684
|
+
for (unsigned int i=0; i<size; i++){
|
685
|
+
HRESULT ret = m_in_archive->GetProperty(idx, list[i].prop_id, &variant_list[idx][i]);
|
686
|
+
if (ret != S_OK || variant_list[idx][i].vt != list[i].vt){
|
687
|
+
variant_list[idx][i].Clear();
|
688
|
+
}
|
689
|
+
}
|
690
|
+
}
|
691
|
+
});
|
692
|
+
if (m_state == STATE_ERROR){
|
693
|
+
throw RubyCppUtil::RubyException("Cannot get property of items");
|
694
|
+
}
|
695
|
+
|
696
|
+
m_rb_entry_info_list.resize(variant_list.size(), Qnil);
|
697
|
+
VALUE value_list[size + 1];
|
698
|
+
runRubyFunction([&](){
|
699
|
+
VALUE entry_info = rb_const_get(gSevenZipModule, INTERN("EntryInfo"));
|
700
|
+
ID new_id = INTERN("new");
|
701
|
+
for (UInt32 i=0; i<m_rb_entry_info_list.size(); i++){
|
702
|
+
value_list[0] = ULONG2NUM(i);
|
703
|
+
for (unsigned int j=0; j<size; j++){
|
704
|
+
value_list[j+1] = ConvertPropToValue(variant_list[i][j]);
|
705
|
+
}
|
706
|
+
m_rb_entry_info_list[i] = rb_funcall2(entry_info, new_id, size + 1, value_list);
|
707
|
+
}
|
708
|
+
});
|
709
|
+
}
|
710
|
+
|
711
|
+
void ArchiveReader::mark()
|
712
|
+
{
|
713
|
+
rb_gc_mark(m_rb_callback_proc);
|
714
|
+
rb_gc_mark(m_rb_out_stream);
|
715
|
+
rb_gc_mark(m_rb_in_stream);
|
716
|
+
std::for_each(m_rb_entry_info_list.begin(), m_rb_entry_info_list.end(), [](VALUE i){ rb_gc_mark(i); });
|
717
|
+
|
718
|
+
ArchiveBase::mark();
|
719
|
+
}
|
720
|
+
|
721
|
+
void ArchiveReader::checkStateToBeginOperation(ArchiveReaderState expected, const std::string &msg)
|
722
|
+
{
|
723
|
+
if (m_state != expected){
|
724
|
+
VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
|
725
|
+
throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
|
726
|
+
}
|
727
|
+
}
|
728
|
+
|
729
|
+
void ArchiveReader::checkState(ArchiveReaderState expected, const std::string &msg)
|
730
|
+
{
|
731
|
+
if (m_action_result.isError()){
|
732
|
+
m_state = STATE_ERROR;
|
733
|
+
if (m_action_result.hasException()){
|
734
|
+
VALUE exc = m_action_result.exception;
|
735
|
+
m_action_result.clear();
|
736
|
+
throw RubyCppUtil::RubyException(exc);
|
737
|
+
}
|
738
|
+
}
|
739
|
+
|
740
|
+
if (m_state != expected){
|
741
|
+
m_state = STATE_ERROR;
|
742
|
+
|
743
|
+
VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
|
744
|
+
throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
|
745
|
+
}
|
746
|
+
}
|
747
|
+
|
748
|
+
void ArchiveReader::setErrorState()
|
749
|
+
{
|
750
|
+
m_state = STATE_ERROR;
|
751
|
+
}
|
752
|
+
|
753
|
+
////////////////////////////////////////////////////////////////
|
754
|
+
ArchiveWriter::ArchiveWriter(const GUID &format_guid)
|
755
|
+
: m_rb_callback_proc(Qnil),
|
756
|
+
m_rb_in_stream(Qnil),
|
757
|
+
m_processing_index((UInt32)(Int32)-1),
|
758
|
+
m_rb_out_stream(Qnil),
|
759
|
+
m_format_guid(format_guid),
|
760
|
+
m_password_specified(false),
|
761
|
+
m_state(STATE_INITIAL)
|
762
|
+
{
|
763
|
+
IOutArchive *archive = 0;
|
764
|
+
HRESULT ret = CreateObject(&m_format_guid, &IID_IOutArchive, reinterpret_cast<void **>(&archive));
|
765
|
+
if (ret != S_OK){
|
766
|
+
m_state = STATE_ERROR;
|
767
|
+
return;
|
768
|
+
}
|
769
|
+
|
770
|
+
m_out_archive.Attach(archive);
|
771
|
+
}
|
772
|
+
|
773
|
+
VALUE ArchiveWriter::open(VALUE out_stream, VALUE param)
|
774
|
+
{
|
775
|
+
checkStateToBeginOperation(STATE_INITIAL);
|
776
|
+
prepareAction();
|
777
|
+
|
778
|
+
m_rb_out_stream = out_stream;
|
779
|
+
m_rb_callback_proc = Qnil;
|
780
|
+
m_rb_in_stream = Qnil;
|
781
|
+
std::vector<VALUE>().swap(m_rb_update_list);
|
782
|
+
|
783
|
+
VALUE password;
|
784
|
+
runRubyFunction([&](){
|
785
|
+
password = rb_hash_aref(param, ID2SYM(INTERN("password")));
|
786
|
+
});
|
787
|
+
if (NIL_P(password)){
|
788
|
+
m_password_specified = false;
|
789
|
+
}else{
|
790
|
+
m_password_specified = true;
|
791
|
+
m_password = std::string(RSTRING_PTR(password), RSTRING_LEN(password));
|
792
|
+
}
|
793
|
+
|
794
|
+
checkState(STATE_INITIAL, "Open error");
|
795
|
+
m_state = STATE_OPENED;
|
796
|
+
|
797
|
+
return Qnil;
|
798
|
+
}
|
799
|
+
|
800
|
+
VALUE ArchiveWriter::addItem(VALUE item)
|
801
|
+
{
|
802
|
+
checkStateToBeginOperation(STATE_OPENED);
|
803
|
+
prepareAction();
|
804
|
+
|
805
|
+
m_rb_update_list.push_back(item);
|
806
|
+
|
807
|
+
checkState(STATE_OPENED, "addItem error");
|
808
|
+
|
809
|
+
return Qnil;
|
810
|
+
}
|
811
|
+
|
812
|
+
VALUE ArchiveWriter::compress(VALUE callback_proc)
|
813
|
+
{
|
814
|
+
if (m_state == STATE_COMPRESSED){
|
815
|
+
return Qnil;
|
816
|
+
}
|
817
|
+
|
818
|
+
checkStateToBeginOperation(STATE_OPENED);
|
819
|
+
prepareAction();
|
820
|
+
EventLoopThreadExecuter te(this);
|
821
|
+
|
822
|
+
m_rb_callback_proc = callback_proc;
|
823
|
+
|
824
|
+
HRESULT opt_ret;
|
825
|
+
HRESULT ret;
|
826
|
+
runNativeFunc([&](){
|
827
|
+
CMyComPtr<ISetProperties> set;
|
828
|
+
m_out_archive->QueryInterface(IID_ISetProperties, (void **)&set);
|
829
|
+
opt_ret = setOption(set);
|
830
|
+
if (opt_ret != S_OK){
|
831
|
+
return;
|
832
|
+
}
|
833
|
+
|
834
|
+
ArchiveUpdateCallback *callback;
|
835
|
+
if (m_password_specified){
|
836
|
+
callback = new ArchiveUpdateCallback(this, m_password);
|
837
|
+
}else{
|
838
|
+
callback = new ArchiveUpdateCallback(this);
|
839
|
+
}
|
840
|
+
|
841
|
+
CMyComPtr<IOutStream> out_stream(new OutStream(m_rb_out_stream, this));
|
842
|
+
CMyComPtr<IArchiveUpdateCallback> callback_ptr(callback);
|
843
|
+
ret = m_out_archive->UpdateItems(out_stream, m_rb_update_list.size(), callback_ptr);
|
844
|
+
});
|
845
|
+
|
846
|
+
m_rb_callback_proc = Qnil;
|
847
|
+
|
848
|
+
if (opt_ret != S_OK){
|
849
|
+
throw RubyCppUtil::RubyException(rb_exc_new2(rb_eArgError, "Invalid option"));
|
850
|
+
}
|
851
|
+
|
852
|
+
checkState(STATE_OPENED, "compress error");
|
853
|
+
if (ret != S_OK){
|
854
|
+
throw RubyCppUtil::RubyException("UpdateItems error");
|
855
|
+
}
|
856
|
+
|
857
|
+
m_state = STATE_COMPRESSED;
|
858
|
+
|
859
|
+
return Qnil;
|
860
|
+
}
|
861
|
+
|
862
|
+
VALUE ArchiveWriter::close()
|
863
|
+
{
|
864
|
+
if (m_state == STATE_CLOSED){
|
865
|
+
return Qnil;
|
866
|
+
}
|
867
|
+
|
868
|
+
checkStateToBeginOperation(STATE_OPENED, STATE_COMPRESSED);
|
869
|
+
prepareAction();
|
870
|
+
|
871
|
+
std::vector<VALUE>().swap(m_rb_update_list);
|
872
|
+
|
873
|
+
checkState(STATE_OPENED, STATE_COMPRESSED, "close error");
|
874
|
+
m_state = STATE_CLOSED;
|
875
|
+
|
876
|
+
return Qnil;
|
877
|
+
}
|
878
|
+
|
879
|
+
VALUE ArchiveWriter::getFileAttribute(VALUE path)
|
880
|
+
{
|
881
|
+
#ifdef _WIN32
|
882
|
+
BSTR str = ConvertStringToBstr(RSTRING_PTR(path), RSTRING_LEN(path));
|
883
|
+
DWORD attr = ::GetFileAttributesW(str);
|
884
|
+
SysFreeString(str);
|
885
|
+
return ULONG2NUM(attr);
|
886
|
+
#else
|
887
|
+
// TODO
|
888
|
+
return Qnil;
|
889
|
+
#endif
|
890
|
+
}
|
891
|
+
|
892
|
+
void ArchiveWriter::setProcessingStream(VALUE stream, UInt32 index)
|
893
|
+
{
|
894
|
+
m_rb_in_stream = stream;
|
895
|
+
m_processing_index = index;
|
896
|
+
}
|
897
|
+
|
898
|
+
void ArchiveWriter::getProcessingStream(VALUE *stream, UInt32 *index)
|
899
|
+
{
|
900
|
+
if (stream){
|
901
|
+
*stream = m_rb_in_stream;
|
902
|
+
}
|
903
|
+
if (index){
|
904
|
+
*index = m_processing_index;
|
905
|
+
}
|
906
|
+
}
|
907
|
+
|
908
|
+
void ArchiveWriter::clearProcessingStream()
|
909
|
+
{
|
910
|
+
setProcessingStream(Qnil, (UInt32)(Int32)(-1));
|
911
|
+
}
|
912
|
+
|
913
|
+
bool ArchiveWriter::updateItemInfo(UInt32 index, bool *new_data, bool *new_properties, UInt32 *index_in_archive)
|
914
|
+
{
|
915
|
+
bool ret = runRubyAction([&](){
|
916
|
+
VALUE item = m_rb_update_list[index];
|
917
|
+
if (new_data){
|
918
|
+
*new_data = RTEST(rb_funcall(item, INTERN("new_data?"), 0));
|
919
|
+
}
|
920
|
+
if (new_properties){
|
921
|
+
*new_properties = RTEST(rb_funcall(item, INTERN("new_properties?"), 0));
|
922
|
+
}
|
923
|
+
if (index_in_archive){
|
924
|
+
VALUE idx = rb_funcall(item, INTERN("index_in_archive"), 0);
|
925
|
+
*index_in_archive = (RTEST(idx) ? NUM2ULONG(idx) : (UInt32)(Int32)(-1));
|
926
|
+
}
|
927
|
+
});
|
928
|
+
|
929
|
+
return ret;
|
930
|
+
}
|
931
|
+
|
932
|
+
void ArchiveWriter::mark()
|
933
|
+
{
|
934
|
+
rb_gc_mark(m_rb_callback_proc);
|
935
|
+
rb_gc_mark(m_rb_in_stream);
|
936
|
+
rb_gc_mark(m_rb_out_stream);
|
937
|
+
std::for_each(m_rb_update_list.begin(), m_rb_update_list.end(), [](VALUE i){ rb_gc_mark(i); });
|
938
|
+
|
939
|
+
ArchiveBase::mark();
|
940
|
+
}
|
941
|
+
|
942
|
+
void ArchiveWriter::checkStateToBeginOperation(ArchiveWriterState expected, const std::string &msg)
|
943
|
+
{
|
944
|
+
if (m_state != expected){
|
945
|
+
VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
|
946
|
+
throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
|
947
|
+
}
|
948
|
+
}
|
949
|
+
|
950
|
+
void ArchiveWriter::checkStateToBeginOperation(ArchiveWriterState expected1, ArchiveWriterState expected2,
|
951
|
+
const std::string &msg)
|
952
|
+
{
|
953
|
+
if (m_state != expected1 && m_state != expected2){
|
954
|
+
VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
|
955
|
+
throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
|
956
|
+
}
|
957
|
+
}
|
958
|
+
|
959
|
+
void ArchiveWriter::checkState(ArchiveWriterState expected, const std::string &msg)
|
960
|
+
{
|
961
|
+
if (m_action_result.isError()){
|
962
|
+
m_state = STATE_ERROR;
|
963
|
+
if (m_action_result.hasException()){
|
964
|
+
VALUE exc = m_action_result.exception;
|
965
|
+
m_action_result.clear();
|
966
|
+
throw RubyCppUtil::RubyException(exc);
|
967
|
+
}
|
968
|
+
}
|
969
|
+
|
970
|
+
if (m_state != expected){
|
971
|
+
m_state = STATE_ERROR;
|
972
|
+
|
973
|
+
VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
|
974
|
+
throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
|
975
|
+
}
|
976
|
+
}
|
977
|
+
|
978
|
+
void ArchiveWriter::checkState(ArchiveWriterState expected1, ArchiveWriterState expected2,
|
979
|
+
const std::string &msg)
|
980
|
+
{
|
981
|
+
if (m_action_result.isError()){
|
982
|
+
m_state = STATE_ERROR;
|
983
|
+
if (m_action_result.hasException()){
|
984
|
+
VALUE exc = m_action_result.exception;
|
985
|
+
m_action_result.clear();
|
986
|
+
throw RubyCppUtil::RubyException(exc);
|
987
|
+
}
|
988
|
+
}
|
989
|
+
|
990
|
+
if (m_state != expected1 && m_state != expected2){
|
991
|
+
m_state = STATE_ERROR;
|
992
|
+
|
993
|
+
VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
|
994
|
+
throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
|
995
|
+
}
|
996
|
+
}
|
997
|
+
|
998
|
+
void ArchiveWriter::setErrorState()
|
999
|
+
{
|
1000
|
+
m_state = STATE_ERROR;
|
1001
|
+
}
|
1002
|
+
|
1003
|
+
////////////////////////////////////////////////////////////////
|
1004
|
+
SevenZipReader::SevenZipReader()
|
1005
|
+
: ArchiveReader(CLSID_CFormat7z)
|
1006
|
+
{
|
1007
|
+
}
|
1008
|
+
|
1009
|
+
////////////////////////////////////////////////////////////////
|
1010
|
+
SevenZipWriter::SevenZipWriter()
|
1011
|
+
: ArchiveWriter(CLSID_CFormat7z),
|
1012
|
+
m_method("LZMA"),
|
1013
|
+
m_level(5),
|
1014
|
+
m_solid(true),
|
1015
|
+
m_header_compression(true),
|
1016
|
+
m_header_encryption(false),
|
1017
|
+
m_multi_threading(true)
|
1018
|
+
{
|
1019
|
+
}
|
1020
|
+
|
1021
|
+
VALUE SevenZipWriter::setMethod(VALUE method)
|
1022
|
+
{
|
1023
|
+
method = rb_check_string_type(method);
|
1024
|
+
if (NIL_P(method)){
|
1025
|
+
throw RubyCppUtil::RubyException(rb_exc_new2(rb_eArgError, "method should be String"));
|
1026
|
+
}
|
1027
|
+
|
1028
|
+
method = rb_funcall(method, INTERN("upcase"), 0);
|
1029
|
+
std::string str(RSTRING_PTR(method), RSTRING_LEN(method));
|
1030
|
+
const char *supported[] = {
|
1031
|
+
"LZMA", "LZMA2", "PPMD", "BZIP2", "DEFLATE", "COPY"
|
1032
|
+
};
|
1033
|
+
if (std::find(supported, supported + sizeof(supported)/sizeof(supported[0]), str)
|
1034
|
+
== supported + sizeof(supported)/sizeof(supported[0])){
|
1035
|
+
throw RubyCppUtil::RubyException(rb_exc_new2(rb_eArgError, "Invalid method specified"));
|
1036
|
+
}
|
1037
|
+
|
1038
|
+
if (str == "COPY"){
|
1039
|
+
m_level = 0;
|
1040
|
+
}
|
1041
|
+
|
1042
|
+
m_method = str;
|
1043
|
+
return method;
|
1044
|
+
}
|
1045
|
+
|
1046
|
+
VALUE SevenZipWriter::method()
|
1047
|
+
{
|
1048
|
+
if (m_method != "PPMD"){
|
1049
|
+
return rb_str_new(m_method.c_str(), m_method.size());
|
1050
|
+
}else{
|
1051
|
+
return rb_str_new2("PPMd");
|
1052
|
+
}
|
1053
|
+
}
|
1054
|
+
|
1055
|
+
VALUE SevenZipWriter::setLevel(VALUE level)
|
1056
|
+
{
|
1057
|
+
level = rb_check_to_integer(level, "to_int");
|
1058
|
+
if (NIL_P(level)){
|
1059
|
+
throw RubyCppUtil::RubyException(rb_exc_new2(rb_eArgError, "level should be Integer"));
|
1060
|
+
}
|
1061
|
+
UInt32 l = NUM2ULONG(level);
|
1062
|
+
switch(l){
|
1063
|
+
case 0:
|
1064
|
+
m_method = "COPY";
|
1065
|
+
break;
|
1066
|
+
case 1: case 3: case 5: case 7: case 9:
|
1067
|
+
break;
|
1068
|
+
default:
|
1069
|
+
throw RubyCppUtil::RubyException(rb_exc_new2(rb_eArgError, "level should be 0, 1, 3, 5, 7 or 9"));
|
1070
|
+
break;
|
1071
|
+
}
|
1072
|
+
m_level = l;
|
1073
|
+
return level;
|
1074
|
+
}
|
1075
|
+
|
1076
|
+
VALUE SevenZipWriter::level()
|
1077
|
+
{
|
1078
|
+
return ULONG2NUM(m_level);
|
1079
|
+
}
|
1080
|
+
|
1081
|
+
VALUE SevenZipWriter::setSolid(VALUE solid)
|
1082
|
+
{
|
1083
|
+
m_solid = RTEST(solid);
|
1084
|
+
return solid;
|
1085
|
+
}
|
1086
|
+
|
1087
|
+
VALUE SevenZipWriter::solid()
|
1088
|
+
{
|
1089
|
+
return (m_solid ? Qtrue : Qfalse);
|
1090
|
+
}
|
1091
|
+
|
1092
|
+
VALUE SevenZipWriter::setHeaderCompression(VALUE header_compression)
|
1093
|
+
{
|
1094
|
+
m_header_compression = RTEST(header_compression);
|
1095
|
+
return header_compression;
|
1096
|
+
}
|
1097
|
+
|
1098
|
+
VALUE SevenZipWriter::headerCompression()
|
1099
|
+
{
|
1100
|
+
return (m_header_compression ? Qtrue : Qfalse);
|
1101
|
+
}
|
1102
|
+
|
1103
|
+
VALUE SevenZipWriter::setHeaderEncryption(VALUE header_encryption)
|
1104
|
+
{
|
1105
|
+
m_header_encryption = RTEST(header_encryption);
|
1106
|
+
return header_encryption;
|
1107
|
+
}
|
1108
|
+
|
1109
|
+
VALUE SevenZipWriter::headerEncryption()
|
1110
|
+
{
|
1111
|
+
return (m_header_encryption ? Qtrue : Qfalse);
|
1112
|
+
}
|
1113
|
+
|
1114
|
+
VALUE SevenZipWriter::setMultiThreading(VALUE multi_threading)
|
1115
|
+
{
|
1116
|
+
m_multi_threading = RTEST(multi_threading);
|
1117
|
+
return multi_threading;
|
1118
|
+
}
|
1119
|
+
|
1120
|
+
VALUE SevenZipWriter::multiThreading()
|
1121
|
+
{
|
1122
|
+
return (m_multi_threading ? Qtrue : Qfalse);
|
1123
|
+
}
|
1124
|
+
|
1125
|
+
HRESULT SevenZipWriter::setOption(ISetProperties *set)
|
1126
|
+
{
|
1127
|
+
NWindows::NCOM::CPropVariant prop[6];
|
1128
|
+
const wchar_t *name[6] = { L"0", L"x", L"s", L"hc", L"he", L"mt" };
|
1129
|
+
prop[0] = m_method.c_str();
|
1130
|
+
prop[1] = m_level;
|
1131
|
+
prop[2] = m_solid;
|
1132
|
+
prop[3] = m_header_compression;
|
1133
|
+
prop[4] = m_header_encryption;
|
1134
|
+
prop[5] = m_multi_threading;
|
1135
|
+
|
1136
|
+
return set->SetProperties(name, prop, sizeof(name)/sizeof(name[0]));
|
1137
|
+
}
|
1138
|
+
|
1139
|
+
////////////////////////////////////////////////////////////////
|
1140
|
+
ArchiveOpenCallback::ArchiveOpenCallback(ArchiveReader *archive)
|
1141
|
+
: m_archive(archive), m_password_specified(false)
|
1142
|
+
{
|
1143
|
+
}
|
1144
|
+
|
1145
|
+
ArchiveOpenCallback::ArchiveOpenCallback(ArchiveReader *archive, const std::string &password)
|
1146
|
+
: m_archive(archive), m_password_specified(true), m_password(password)
|
1147
|
+
{
|
1148
|
+
}
|
1149
|
+
|
1150
|
+
STDMETHODIMP ArchiveOpenCallback::SetTotal(const UInt64 *files, const UInt64 *bytes)
|
1151
|
+
{
|
1152
|
+
// This function is called periodically, so use this function as a check function of interrupt.
|
1153
|
+
if (m_archive->isErrorState()){
|
1154
|
+
return E_ABORT;
|
1155
|
+
}
|
1156
|
+
return S_OK;
|
1157
|
+
}
|
1158
|
+
|
1159
|
+
STDMETHODIMP ArchiveOpenCallback::SetCompleted(const UInt64 *files, const UInt64 *bytes)
|
1160
|
+
{
|
1161
|
+
// This function is called periodically, so use this function as a check function of interrupt.
|
1162
|
+
if (m_archive->isErrorState()){
|
1163
|
+
return E_ABORT;
|
1164
|
+
}
|
1165
|
+
return S_OK;
|
1166
|
+
}
|
1167
|
+
|
1168
|
+
STDMETHODIMP ArchiveOpenCallback::CryptoGetTextPassword(BSTR *password)
|
1169
|
+
{
|
1170
|
+
if (!m_password_specified){
|
1171
|
+
return E_ABORT;
|
1172
|
+
}
|
1173
|
+
|
1174
|
+
if (password){
|
1175
|
+
*password = ConvertStringToBstr(m_password);
|
1176
|
+
}
|
1177
|
+
return S_OK;
|
1178
|
+
}
|
1179
|
+
|
1180
|
+
|
1181
|
+
////////////////////////////////////////////////////////////////
|
1182
|
+
ArchiveExtractCallback::ArchiveExtractCallback(ArchiveReader *archive)
|
1183
|
+
: m_archive(archive), m_password_specified(false)
|
1184
|
+
{
|
1185
|
+
}
|
1186
|
+
|
1187
|
+
ArchiveExtractCallback::ArchiveExtractCallback(ArchiveReader *archive, const std::string &password)
|
1188
|
+
: m_archive(archive), m_password_specified(true), m_password(password)
|
1189
|
+
{
|
1190
|
+
}
|
1191
|
+
|
1192
|
+
STDMETHODIMP ArchiveExtractCallback::SetTotal(UInt64 size)
|
1193
|
+
{
|
1194
|
+
// This function is called periodically, so use this function as a check function of interrupt.
|
1195
|
+
if (m_archive->isErrorState()){
|
1196
|
+
return E_ABORT;
|
1197
|
+
}
|
1198
|
+
return S_OK;
|
1199
|
+
}
|
1200
|
+
|
1201
|
+
STDMETHODIMP ArchiveExtractCallback::SetCompleted(const UInt64 *completeValue)
|
1202
|
+
{
|
1203
|
+
// This function is called periodically, so use this function as a check function of interrupt.
|
1204
|
+
if (m_archive->isErrorState()){
|
1205
|
+
return E_ABORT;
|
1206
|
+
}
|
1207
|
+
return S_OK;
|
1208
|
+
}
|
1209
|
+
|
1210
|
+
STDMETHODIMP ArchiveExtractCallback::GetStream(UInt32 index, ISequentialOutStream **outStream,
|
1211
|
+
Int32 askExtractMode)
|
1212
|
+
{
|
1213
|
+
switch(askExtractMode){
|
1214
|
+
case NArchive::NExtract::NAskMode::kExtract:
|
1215
|
+
break;
|
1216
|
+
case NArchive::NExtract::NAskMode::kTest:
|
1217
|
+
m_archive->setProcessingStream(Qnil, index, askExtractMode);
|
1218
|
+
return S_OK;
|
1219
|
+
default:
|
1220
|
+
return S_OK;
|
1221
|
+
}
|
1222
|
+
|
1223
|
+
VALUE rb_stream;
|
1224
|
+
VALUE proc = m_archive->callbackProc();
|
1225
|
+
bool ret = m_archive->runRubyAction([&](){
|
1226
|
+
rb_stream = rb_funcall(proc, INTERN("call"), 2,
|
1227
|
+
ID2SYM(INTERN("stream")), m_archive->entryInfo(index));
|
1228
|
+
m_archive->setProcessingStream(rb_stream, index, askExtractMode);
|
1229
|
+
});
|
1230
|
+
if (!ret){
|
1231
|
+
m_archive->clearProcessingStream();
|
1232
|
+
return E_FAIL;
|
1233
|
+
}
|
1234
|
+
|
1235
|
+
OutStream *stream = new OutStream(rb_stream, m_archive);
|
1236
|
+
CMyComPtr<OutStream> ptr(stream);
|
1237
|
+
*outStream = ptr.Detach();
|
1238
|
+
|
1239
|
+
return S_OK;
|
1240
|
+
}
|
1241
|
+
|
1242
|
+
STDMETHODIMP ArchiveExtractCallback::PrepareOperation(Int32 askExtractMode)
|
1243
|
+
{
|
1244
|
+
return S_OK;
|
1245
|
+
}
|
1246
|
+
|
1247
|
+
STDMETHODIMP ArchiveExtractCallback::SetOperationResult(Int32 resultOperationResult)
|
1248
|
+
{
|
1249
|
+
UInt32 index;
|
1250
|
+
VALUE stream;
|
1251
|
+
Int32 askExtractMode;
|
1252
|
+
m_archive->getProcessingStream(&stream, &index, &askExtractMode);
|
1253
|
+
|
1254
|
+
switch(askExtractMode){
|
1255
|
+
case NArchive::NExtract::NAskMode::kExtract:
|
1256
|
+
break;
|
1257
|
+
case NArchive::NExtract::NAskMode::kTest:
|
1258
|
+
m_archive->clearProcessingStream();
|
1259
|
+
m_archive->setOperationResult(index, resultOperationResult);
|
1260
|
+
return S_OK;
|
1261
|
+
default:
|
1262
|
+
return S_OK;
|
1263
|
+
}
|
1264
|
+
|
1265
|
+
if (!NIL_P(stream)){
|
1266
|
+
VALUE proc = m_archive->callbackProc();
|
1267
|
+
bool ret = m_archive->runRubyAction([&](){
|
1268
|
+
using namespace NArchive::NExtract::NOperationResult;
|
1269
|
+
|
1270
|
+
VALUE arg_hash = rb_hash_new();
|
1271
|
+
rb_hash_aset(arg_hash, ID2SYM(INTERN("info")), m_archive->entryInfo(index));
|
1272
|
+
rb_hash_aset(arg_hash, ID2SYM(INTERN("stream")), stream);
|
1273
|
+
rb_hash_aset(arg_hash, ID2SYM(INTERN("success")), (resultOperationResult == kOK ? Qtrue : Qfalse));
|
1274
|
+
rb_funcall(proc, INTERN("call"), 2, ID2SYM(INTERN("result")), arg_hash);
|
1275
|
+
});
|
1276
|
+
if (!ret){
|
1277
|
+
m_archive->clearProcessingStream();
|
1278
|
+
return E_FAIL;
|
1279
|
+
}
|
1280
|
+
}
|
1281
|
+
m_archive->clearProcessingStream();
|
1282
|
+
|
1283
|
+
return S_OK;
|
1284
|
+
}
|
1285
|
+
|
1286
|
+
STDMETHODIMP ArchiveExtractCallback::CryptoGetTextPassword(BSTR *password)
|
1287
|
+
{
|
1288
|
+
if (!m_password_specified){
|
1289
|
+
return E_ABORT;
|
1290
|
+
}
|
1291
|
+
|
1292
|
+
if (password){
|
1293
|
+
*password = ConvertStringToBstr(m_password);
|
1294
|
+
}
|
1295
|
+
return S_OK;
|
1296
|
+
}
|
1297
|
+
|
1298
|
+
|
1299
|
+
////////////////////////////////////////////////////////////////
|
1300
|
+
ArchiveUpdateCallback::ArchiveUpdateCallback(ArchiveWriter *archive)
|
1301
|
+
: m_archive(archive), m_password_specified(false)
|
1302
|
+
{
|
1303
|
+
}
|
1304
|
+
|
1305
|
+
ArchiveUpdateCallback::ArchiveUpdateCallback(ArchiveWriter *archive, const std::string &password)
|
1306
|
+
: m_archive(archive), m_password_specified(true), m_password(password)
|
1307
|
+
{
|
1308
|
+
}
|
1309
|
+
|
1310
|
+
STDMETHODIMP ArchiveUpdateCallback::SetTotal(UInt64 size)
|
1311
|
+
{
|
1312
|
+
// This function is called periodically, so use this function as a check function of interrupt.
|
1313
|
+
if (m_archive->isErrorState()){
|
1314
|
+
return E_ABORT;
|
1315
|
+
}
|
1316
|
+
return S_OK;
|
1317
|
+
}
|
1318
|
+
|
1319
|
+
STDMETHODIMP ArchiveUpdateCallback::SetCompleted(const UInt64 *completeValue)
|
1320
|
+
{
|
1321
|
+
// This function is called periodically, so use this function as a check function of interrupt.
|
1322
|
+
if (m_archive->isErrorState()){
|
1323
|
+
return E_ABORT;
|
1324
|
+
}
|
1325
|
+
return S_OK;
|
1326
|
+
}
|
1327
|
+
|
1328
|
+
STDMETHODIMP ArchiveUpdateCallback::EnumProperties(IEnumSTATPROPSTG **enumerator)
|
1329
|
+
{
|
1330
|
+
return E_NOTIMPL;
|
1331
|
+
}
|
1332
|
+
|
1333
|
+
STDMETHODIMP ArchiveUpdateCallback::GetUpdateItemInfo(UInt32 index, Int32 *newData,
|
1334
|
+
Int32 *newProperties, UInt32 *indexInArchive)
|
1335
|
+
{
|
1336
|
+
bool new_data = false;
|
1337
|
+
bool new_properties = false;
|
1338
|
+
UInt32 index_in_archive = (UInt32)(Int32)(-1);
|
1339
|
+
|
1340
|
+
bool ret = m_archive->updateItemInfo(index, &new_data, &new_properties, &index_in_archive);
|
1341
|
+
if (!ret){
|
1342
|
+
return E_FAIL;
|
1343
|
+
}
|
1344
|
+
|
1345
|
+
if (newData){
|
1346
|
+
*newData = static_cast<Int32>(new_data);
|
1347
|
+
}
|
1348
|
+
if (newProperties){
|
1349
|
+
*newProperties = static_cast<Int32>(new_properties);
|
1350
|
+
}
|
1351
|
+
if (indexInArchive){
|
1352
|
+
*indexInArchive = index_in_archive;
|
1353
|
+
}
|
1354
|
+
|
1355
|
+
return S_OK;
|
1356
|
+
}
|
1357
|
+
|
1358
|
+
STDMETHODIMP ArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
|
1359
|
+
{
|
1360
|
+
VALUE info = m_archive->itemInfo(index);
|
1361
|
+
|
1362
|
+
bool ret = m_archive->runRubyAction([&](){
|
1363
|
+
switch(propID){
|
1364
|
+
case kpidIsAnti:
|
1365
|
+
ConvertValueToProp(rb_funcall(info, INTERN("anti?"), 0), VT_BOOL, value);
|
1366
|
+
break;
|
1367
|
+
case kpidPath:
|
1368
|
+
ConvertValueToProp(rb_funcall(info, INTERN("path"), 0), VT_BSTR, value);
|
1369
|
+
break;
|
1370
|
+
case kpidIsDir:
|
1371
|
+
ConvertValueToProp(rb_funcall(info, INTERN("directory?"), 0), VT_BOOL, value);
|
1372
|
+
break;
|
1373
|
+
case kpidSize:
|
1374
|
+
ConvertValueToProp(rb_funcall(info, INTERN("size"), 0), VT_UI8, value);
|
1375
|
+
break;
|
1376
|
+
case kpidAttrib:
|
1377
|
+
ConvertValueToProp(rb_funcall(info, INTERN("attrib"), 0), VT_UI4, value);
|
1378
|
+
break;
|
1379
|
+
case kpidCTime:
|
1380
|
+
ConvertValueToProp(rb_funcall(info, INTERN("ctime"), 0), VT_FILETIME, value);
|
1381
|
+
break;
|
1382
|
+
case kpidATime:
|
1383
|
+
ConvertValueToProp(rb_funcall(info, INTERN("atime"), 0), VT_FILETIME, value);
|
1384
|
+
break;
|
1385
|
+
case kpidMTime:
|
1386
|
+
ConvertValueToProp(rb_funcall(info, INTERN("mtime"), 0), VT_FILETIME, value);
|
1387
|
+
break;
|
1388
|
+
case kpidPosixAttrib:
|
1389
|
+
ConvertValueToProp(rb_funcall(info, INTERN("posix_attrib"), 0), VT_UI4, value);
|
1390
|
+
break;
|
1391
|
+
case kpidUser:
|
1392
|
+
{
|
1393
|
+
VALUE user = rb_funcall(info, INTERN("user"), 0);
|
1394
|
+
if (RTEST(user)){
|
1395
|
+
ConvertValueToProp(user, VT_BSTR, value);
|
1396
|
+
}
|
1397
|
+
}
|
1398
|
+
break;
|
1399
|
+
case kpidGroup:
|
1400
|
+
{
|
1401
|
+
VALUE group = rb_funcall(info, INTERN("group"), 0);
|
1402
|
+
if (RTEST(group)){
|
1403
|
+
ConvertValueToProp(group, VT_BSTR, value);
|
1404
|
+
}
|
1405
|
+
}
|
1406
|
+
break;
|
1407
|
+
default:
|
1408
|
+
rb_warning("Unknown propID");
|
1409
|
+
break;
|
1410
|
+
}
|
1411
|
+
});
|
1412
|
+
if (!ret){
|
1413
|
+
return E_FAIL;
|
1414
|
+
}
|
1415
|
+
|
1416
|
+
return S_OK;
|
1417
|
+
}
|
1418
|
+
|
1419
|
+
STDMETHODIMP ArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream **inStream)
|
1420
|
+
{
|
1421
|
+
VALUE rb_stream;
|
1422
|
+
std::string filepath;
|
1423
|
+
VALUE proc = m_archive->callbackProc();
|
1424
|
+
bool ret = m_archive->runRubyAction([&](){
|
1425
|
+
VALUE info = m_archive->itemInfo(index);
|
1426
|
+
VALUE ret_array = rb_funcall(proc, INTERN("call"), 2, ID2SYM(INTERN("stream")), info);
|
1427
|
+
if (NIL_P(ret_array)){
|
1428
|
+
rb_stream = Qnil;
|
1429
|
+
return;
|
1430
|
+
}
|
1431
|
+
|
1432
|
+
// ret_array[0]: true: filepath
|
1433
|
+
// false: io
|
1434
|
+
if (RTEST(rb_ary_entry(ret_array, 0))){
|
1435
|
+
rb_stream = Qnil;
|
1436
|
+
VALUE path = rb_ary_entry(ret_array, 1);
|
1437
|
+
filepath = std::string(RSTRING_PTR(path), RSTRING_LEN(path));
|
1438
|
+
}else{
|
1439
|
+
rb_stream = rb_ary_entry(ret_array, 1);
|
1440
|
+
}
|
1441
|
+
|
1442
|
+
m_archive->setProcessingStream(rb_stream, index);
|
1443
|
+
});
|
1444
|
+
if (!ret){
|
1445
|
+
m_archive->clearProcessingStream();
|
1446
|
+
return E_FAIL;
|
1447
|
+
}
|
1448
|
+
|
1449
|
+
if (NIL_P(rb_stream) && !(filepath.empty())){
|
1450
|
+
FileInStream *stream = new FileInStream(filepath, m_archive);
|
1451
|
+
CMyComPtr<FileInStream> ptr(stream);
|
1452
|
+
*inStream = ptr.Detach();
|
1453
|
+
}else{
|
1454
|
+
InStream *stream = new InStream(rb_stream, m_archive);
|
1455
|
+
CMyComPtr<InStream> ptr(stream);
|
1456
|
+
*inStream = ptr.Detach();
|
1457
|
+
}
|
1458
|
+
|
1459
|
+
return S_OK;
|
1460
|
+
}
|
1461
|
+
|
1462
|
+
STDMETHODIMP ArchiveUpdateCallback::SetOperationResult(Int32 operationResult)
|
1463
|
+
{
|
1464
|
+
UInt32 index;
|
1465
|
+
VALUE stream;
|
1466
|
+
m_archive->getProcessingStream(&stream, &index);
|
1467
|
+
|
1468
|
+
if (!NIL_P(stream)){
|
1469
|
+
VALUE proc = m_archive->callbackProc();
|
1470
|
+
bool ret = m_archive->runRubyAction([&](){
|
1471
|
+
VALUE arg_hash = rb_hash_new();
|
1472
|
+
rb_hash_aset(arg_hash, ID2SYM(INTERN("info")), m_archive->itemInfo(index));
|
1473
|
+
rb_hash_aset(arg_hash, ID2SYM(INTERN("stream")), stream);
|
1474
|
+
rb_funcall(proc, INTERN("call"), 2, ID2SYM(INTERN("result")), arg_hash);
|
1475
|
+
});
|
1476
|
+
if (!ret){
|
1477
|
+
m_archive->clearProcessingStream();
|
1478
|
+
return E_FAIL;
|
1479
|
+
}
|
1480
|
+
}
|
1481
|
+
m_archive->clearProcessingStream();
|
1482
|
+
|
1483
|
+
return S_OK;
|
1484
|
+
}
|
1485
|
+
|
1486
|
+
STDMETHODIMP ArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)
|
1487
|
+
{
|
1488
|
+
if (m_password_specified){
|
1489
|
+
*passwordIsDefined = 1;
|
1490
|
+
*password = ConvertStringToBstr(m_password);
|
1491
|
+
}else{
|
1492
|
+
*passwordIsDefined = 0;
|
1493
|
+
}
|
1494
|
+
return S_OK;
|
1495
|
+
}
|
1496
|
+
|
1497
|
+
|
1498
|
+
////////////////////////////////////////////////////////////////
|
1499
|
+
InStream::InStream(VALUE stream, ArchiveBase *archive)
|
1500
|
+
: m_stream(stream), m_archive(archive)
|
1501
|
+
{
|
1502
|
+
}
|
1503
|
+
|
1504
|
+
STDMETHODIMP InStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
|
1505
|
+
{
|
1506
|
+
bool ret = m_archive->runRubyAction([&](){
|
1507
|
+
VALUE whence;
|
1508
|
+
switch(seekOrigin){
|
1509
|
+
case 0:
|
1510
|
+
whence = rb_const_get(rb_cIO, INTERN("SEEK_SET"));
|
1511
|
+
break;
|
1512
|
+
case 1:
|
1513
|
+
whence = rb_const_get(rb_cIO, INTERN("SEEK_CUR"));
|
1514
|
+
break;
|
1515
|
+
case 2:
|
1516
|
+
whence = rb_const_get(rb_cIO, INTERN("SEEK_END"));
|
1517
|
+
break;
|
1518
|
+
default:
|
1519
|
+
return;
|
1520
|
+
}
|
1521
|
+
|
1522
|
+
rb_funcall(m_stream, INTERN("seek"), 2, LL2NUM(offset), whence);
|
1523
|
+
if (newPosition){
|
1524
|
+
VALUE pos = rb_funcall(m_stream, INTERN("tell"), 0);
|
1525
|
+
*newPosition = NUM2ULONG(pos);
|
1526
|
+
}
|
1527
|
+
});
|
1528
|
+
if (!ret){
|
1529
|
+
return E_FAIL;
|
1530
|
+
}
|
1531
|
+
|
1532
|
+
return S_OK;
|
1533
|
+
}
|
1534
|
+
|
1535
|
+
STDMETHODIMP InStream::Read(void *data, UInt32 size, UInt32 *processedSize)
|
1536
|
+
{
|
1537
|
+
bool ret = m_archive->runRubyAction([&](){
|
1538
|
+
VALUE str = rb_funcall(m_stream, INTERN("read"), 1, ULONG2NUM(size));
|
1539
|
+
if (!NIL_P(str) && data){
|
1540
|
+
memcpy(data, RSTRING_PTR(str), RSTRING_LEN(str));
|
1541
|
+
}
|
1542
|
+
|
1543
|
+
if (processedSize){
|
1544
|
+
*processedSize = (NIL_P(str) ? 0 : RSTRING_LEN(str));
|
1545
|
+
}
|
1546
|
+
});
|
1547
|
+
if (!ret){
|
1548
|
+
if (processedSize){
|
1549
|
+
*processedSize = 0;
|
1550
|
+
}
|
1551
|
+
return E_FAIL;
|
1552
|
+
}
|
1553
|
+
|
1554
|
+
return S_OK;
|
1555
|
+
}
|
1556
|
+
|
1557
|
+
////////////////////////////////////////////////////////////////
|
1558
|
+
FileInStream::FileInStream(const std::string &filename, ArchiveBase *archive)
|
1559
|
+
: m_archive(archive)
|
1560
|
+
#ifdef USE_WIN32_FILE_API
|
1561
|
+
, m_file_handle(INVALID_HANDLE_VALUE)
|
1562
|
+
#else
|
1563
|
+
, m_file(filename.c_str(), std::ios::binary)
|
1564
|
+
#endif
|
1565
|
+
{
|
1566
|
+
#ifdef USE_WIN32_FILE_API
|
1567
|
+
BSTR name = ConvertStringToBstr(filename);
|
1568
|
+
m_file_handle = CreateFileW(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
|
1569
|
+
FILE_ATTRIBUTE_NORMAL, NULL);
|
1570
|
+
SysFreeString(name);
|
1571
|
+
#else
|
1572
|
+
// Nothing to do
|
1573
|
+
#endif
|
1574
|
+
}
|
1575
|
+
|
1576
|
+
FileInStream::~FileInStream()
|
1577
|
+
{
|
1578
|
+
#ifdef USE_WIN32_FILE_API
|
1579
|
+
if (m_file_handle == INVALID_HANDLE_VALUE){
|
1580
|
+
return;
|
1581
|
+
}
|
1582
|
+
|
1583
|
+
CloseHandle(m_file_handle);
|
1584
|
+
m_file_handle = INVALID_HANDLE_VALUE;
|
1585
|
+
#else
|
1586
|
+
// Nothing to do
|
1587
|
+
#endif
|
1588
|
+
}
|
1589
|
+
|
1590
|
+
STDMETHODIMP FileInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
|
1591
|
+
{
|
1592
|
+
#ifdef USE_WIN32_FILE_API
|
1593
|
+
if (m_file_handle == INVALID_HANDLE_VALUE){
|
1594
|
+
return E_FAIL;
|
1595
|
+
}
|
1596
|
+
|
1597
|
+
DWORD method;
|
1598
|
+
switch(seekOrigin){
|
1599
|
+
case 0:
|
1600
|
+
method = FILE_BEGIN;
|
1601
|
+
break;
|
1602
|
+
case 1:
|
1603
|
+
method = FILE_CURRENT;
|
1604
|
+
break;
|
1605
|
+
case 2:
|
1606
|
+
method = FILE_END;
|
1607
|
+
break;
|
1608
|
+
default:
|
1609
|
+
return E_FAIL;
|
1610
|
+
}
|
1611
|
+
|
1612
|
+
DWORD low, high;
|
1613
|
+
low = (DWORD)(offset & 0xFFFFFFFFUL);
|
1614
|
+
high = (DWORD)((offset >> 32) & 0xFFFFFFFFUL);
|
1615
|
+
DWORD new_low = SetFilePointer(m_file_handle, (LONG)low, (PLONG)&high, method);
|
1616
|
+
|
1617
|
+
if (newPosition){
|
1618
|
+
*newPosition = (((UInt64)high) << 32) + ((UInt64)new_low);
|
1619
|
+
}
|
1620
|
+
return S_OK;
|
1621
|
+
#else
|
1622
|
+
if (!m_file.is_open()){
|
1623
|
+
return E_FAIL;
|
1624
|
+
}
|
1625
|
+
|
1626
|
+
std::ios::seekdir method;
|
1627
|
+
switch(seekOrigin){
|
1628
|
+
case 0:
|
1629
|
+
method = std::ios::beg;
|
1630
|
+
break;
|
1631
|
+
case 1:
|
1632
|
+
method = std::ios::cur;
|
1633
|
+
break;
|
1634
|
+
case 2:
|
1635
|
+
method = std::ios::end;
|
1636
|
+
break;
|
1637
|
+
default:
|
1638
|
+
return E_FAIL;
|
1639
|
+
}
|
1640
|
+
|
1641
|
+
std::streamoff sto = offset;
|
1642
|
+
m_file.seekg(sto, method);
|
1643
|
+
if (newPosition){
|
1644
|
+
*newPosition = m_file.tellg();
|
1645
|
+
}
|
1646
|
+
return S_OK;
|
1647
|
+
#endif
|
1648
|
+
}
|
1649
|
+
|
1650
|
+
STDMETHODIMP FileInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
|
1651
|
+
{
|
1652
|
+
#ifdef USE_WIN32_FILE_API
|
1653
|
+
if (m_file_handle == INVALID_HANDLE_VALUE){
|
1654
|
+
return E_FAIL;
|
1655
|
+
}
|
1656
|
+
|
1657
|
+
DWORD processed_size;
|
1658
|
+
BOOL ret = ReadFile(m_file_handle, data, size, &processed_size, NULL);
|
1659
|
+
if (!ret){
|
1660
|
+
return E_FAIL;
|
1661
|
+
}
|
1662
|
+
|
1663
|
+
if (processedSize){
|
1664
|
+
*processedSize = processed_size;
|
1665
|
+
}
|
1666
|
+
|
1667
|
+
return S_OK;
|
1668
|
+
#else
|
1669
|
+
if (!m_file.is_open()){
|
1670
|
+
return E_FAIL;
|
1671
|
+
}
|
1672
|
+
|
1673
|
+
m_file.read(reinterpret_cast<char*>(data), size);
|
1674
|
+
if (processedSize){
|
1675
|
+
*processedSize = m_file.gcount();
|
1676
|
+
}
|
1677
|
+
return S_OK;
|
1678
|
+
#endif
|
1679
|
+
}
|
1680
|
+
|
1681
|
+
////////////////////////////////////////////////////////////////
|
1682
|
+
OutStream::OutStream(VALUE stream, ArchiveBase *archive)
|
1683
|
+
: m_stream(stream), m_archive(archive)
|
1684
|
+
{
|
1685
|
+
}
|
1686
|
+
|
1687
|
+
STDMETHODIMP OutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
|
1688
|
+
{
|
1689
|
+
bool ret = m_archive->runRubyAction([&](){
|
1690
|
+
VALUE str = rb_str_new(reinterpret_cast<const char*>(data), size);
|
1691
|
+
VALUE len = rb_funcall(m_stream, INTERN("write"), 1, str);
|
1692
|
+
if (processedSize){
|
1693
|
+
if (NIL_P(len)){
|
1694
|
+
*processedSize = 0;
|
1695
|
+
}else{
|
1696
|
+
*processedSize = NUM2ULONG(len);
|
1697
|
+
}
|
1698
|
+
}
|
1699
|
+
});
|
1700
|
+
if (!ret){
|
1701
|
+
if (processedSize){
|
1702
|
+
*processedSize = 0;
|
1703
|
+
}
|
1704
|
+
// When killEventLoopThread is called in cancelAction
|
1705
|
+
// return S_OK even if error occurs.
|
1706
|
+
//
|
1707
|
+
// Detail:
|
1708
|
+
// It seems that BZip2Encoder has a bug.
|
1709
|
+
// If Write method returns E_FAIL, some Events are not set in that file
|
1710
|
+
// because OutBuffer throws an exception in Encoder->WriteBytes.
|
1711
|
+
return E_FAIL;
|
1712
|
+
}
|
1713
|
+
|
1714
|
+
return S_OK;
|
1715
|
+
}
|
1716
|
+
|
1717
|
+
STDMETHODIMP OutStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
|
1718
|
+
{
|
1719
|
+
bool ret = m_archive->runRubyAction([&](){
|
1720
|
+
VALUE whence;
|
1721
|
+
switch(seekOrigin){
|
1722
|
+
case 0:
|
1723
|
+
whence = rb_const_get(rb_cIO, INTERN("SEEK_SET"));
|
1724
|
+
break;
|
1725
|
+
case 1:
|
1726
|
+
whence = rb_const_get(rb_cIO, INTERN("SEEK_CUR"));
|
1727
|
+
break;
|
1728
|
+
case 2:
|
1729
|
+
whence = rb_const_get(rb_cIO, INTERN("SEEK_END"));
|
1730
|
+
break;
|
1731
|
+
default:
|
1732
|
+
return;
|
1733
|
+
}
|
1734
|
+
|
1735
|
+
rb_funcall(m_stream, INTERN("seek"), 2, LL2NUM(offset), whence);
|
1736
|
+
if (newPosition){
|
1737
|
+
VALUE pos = rb_funcall(m_stream, INTERN("tell"), 0);
|
1738
|
+
*newPosition = NUM2ULONG(pos);
|
1739
|
+
}
|
1740
|
+
});
|
1741
|
+
if (!ret){
|
1742
|
+
return E_FAIL;
|
1743
|
+
}
|
1744
|
+
|
1745
|
+
return S_OK;
|
1746
|
+
}
|
1747
|
+
|
1748
|
+
STDMETHODIMP OutStream::SetSize(UInt64 size)
|
1749
|
+
{
|
1750
|
+
bool ret = m_archive->runRubyAction([&](){
|
1751
|
+
rb_funcall(m_stream, INTERN("truncate"), 1, ULL2NUM(size));
|
1752
|
+
});
|
1753
|
+
if (!ret){
|
1754
|
+
return E_FAIL;
|
1755
|
+
}
|
1756
|
+
|
1757
|
+
return S_OK;
|
1758
|
+
}
|
1759
|
+
|
1760
|
+
|
1761
|
+
|
1762
|
+
}
|
1763
|
+
|
1764
|
+
|
1765
|
+
extern "C" void Init_seven_zip_archive(void)
|
1766
|
+
{
|
1767
|
+
using namespace SevenZip;
|
1768
|
+
using namespace RubyCppUtil;
|
1769
|
+
|
1770
|
+
VALUE mod = rb_define_module("SevenZipRuby");
|
1771
|
+
gSevenZipModule = mod;
|
1772
|
+
|
1773
|
+
VALUE external_lib_dir = rb_const_get(mod, INTERN("EXTERNAL_LIB_DIR"));
|
1774
|
+
if (!RB_TYPE_P(external_lib_dir, RUBY_T_STRING)) {
|
1775
|
+
rb_warning("EXTERNAL_LIB_DIR should be String object.");
|
1776
|
+
return;
|
1777
|
+
}
|
1778
|
+
std::string external_lib_dir_str(RSTRING_PTR(external_lib_dir), RSTRING_LEN(external_lib_dir));
|
1779
|
+
|
1780
|
+
#ifdef _WIN32
|
1781
|
+
const int len = MultiByteToWideChar(CP_UTF8, 0, external_lib_dir_str.c_str(), external_lib_dir_str.length(),
|
1782
|
+
NULL, 0);
|
1783
|
+
if (len == 0) {
|
1784
|
+
rb_warning("MultiByteToWideChar error.");
|
1785
|
+
return;
|
1786
|
+
}
|
1787
|
+
std::vector<wchar_t> external_lib_dir_vec(len);
|
1788
|
+
MultiByteToWideChar(CP_UTF8, 0, external_lib_dir_str.c_str(), external_lib_dir_str.length(),
|
1789
|
+
&external_lib_dir_vec[0], external_lib_dir_vec.size());
|
1790
|
+
const std::wstring external_lib_dir_wstr(&external_lib_dir_vec[0], len);
|
1791
|
+
|
1792
|
+
const std::wstring dll_path = external_lib_dir_wstr + L"/7z.dll";
|
1793
|
+
gSevenZipHandle = LoadLibraryW(dll_path.c_str());
|
1794
|
+
if (!gSevenZipHandle){
|
1795
|
+
const std::wstring dll_path2 = external_lib_dir_wstr + L"/7z64.dll";
|
1796
|
+
gSevenZipHandle = LoadLibraryW(dll_path2.c_str());
|
1797
|
+
}
|
1798
|
+
#else
|
1799
|
+
std::string dll_path = external_lib_dir_str + "/7z.so";
|
1800
|
+
gSevenZipHandle = dlopen(dll_path.c_str(), RTLD_NOW);
|
1801
|
+
#endif
|
1802
|
+
if (!gSevenZipHandle){
|
1803
|
+
rb_warning("7z library is not found.");
|
1804
|
+
return;
|
1805
|
+
}
|
1806
|
+
|
1807
|
+
#ifdef _WIN32
|
1808
|
+
CreateObject = (CreateObjectFunc)GetProcAddress(gSevenZipHandle, "CreateObject");
|
1809
|
+
#else
|
1810
|
+
CreateObject = (CreateObjectFunc)dlsym(gSevenZipHandle, "CreateObject");
|
1811
|
+
#endif
|
1812
|
+
if (!CreateObject){
|
1813
|
+
rb_warning("CreateObject is not found.");
|
1814
|
+
return;
|
1815
|
+
}
|
1816
|
+
|
1817
|
+
|
1818
|
+
VALUE cls;
|
1819
|
+
|
1820
|
+
// arg_count is needed by MSVC 2010...
|
1821
|
+
// MSVC 2010 seems not to be able to guess argument count of the function passed as a template parameter.
|
1822
|
+
#define READER_FUNC(func, arg_count) wrappedFunction##arg_count<SevenZipReader, ArchiveReader, &ArchiveReader::func>
|
1823
|
+
|
1824
|
+
cls = rb_define_wrapped_cpp_class_under<SevenZipReader>(mod, "SevenZipReader", rb_cObject);
|
1825
|
+
rb_define_method_ext(cls, "open_impl", READER_FUNC(open, 2));
|
1826
|
+
rb_define_method_ext(cls, "close_impl", READER_FUNC(close, 0));
|
1827
|
+
rb_define_method_ext(cls, "entry_num", READER_FUNC(entryNum, 0));
|
1828
|
+
rb_define_method_ext(cls, "extract_impl", READER_FUNC(extract, 2));
|
1829
|
+
rb_define_method_ext(cls, "extract_files_impl", READER_FUNC(extractFiles, 2));
|
1830
|
+
rb_define_method_ext(cls, "extract_all_impl", READER_FUNC(extractAll, 1));
|
1831
|
+
rb_define_method_ext(cls, "test_all_impl", READER_FUNC(testAll, 1));
|
1832
|
+
rb_define_method_ext(cls, "archive_property", READER_FUNC(getArchiveProperty, 0));
|
1833
|
+
rb_define_method_ext(cls, "entry", READER_FUNC(getEntryInfo, 1));
|
1834
|
+
rb_define_method_ext(cls, "entries", READER_FUNC(getAllEntryInfo, 0));
|
1835
|
+
rb_define_method_ext(cls, "set_file_attribute", READER_FUNC(setFileAttribute, 2));
|
1836
|
+
|
1837
|
+
#undef READER_FUNC
|
1838
|
+
|
1839
|
+
|
1840
|
+
// arg_count is needed by MSVC 2010...
|
1841
|
+
// MSVC 2010 seems not to be able to guess argument count of the function passed as a template parameter.
|
1842
|
+
#define WRITER_FUNC(func, arg_count) wrappedFunction##arg_count<SevenZipWriter, ArchiveWriter, &ArchiveWriter::func>
|
1843
|
+
#define WRITER_FUNC2(func, arg_count) wrappedFunction##arg_count<SevenZipWriter, &SevenZipWriter::func>
|
1844
|
+
|
1845
|
+
cls = rb_define_wrapped_cpp_class_under<SevenZipWriter>(mod, "SevenZipWriter", rb_cObject);
|
1846
|
+
rb_define_method_ext(cls, "open_impl", WRITER_FUNC(open, 2));
|
1847
|
+
rb_define_method_ext(cls, "add_item", WRITER_FUNC(addItem, 1));
|
1848
|
+
rb_define_method_ext(cls, "compress_impl", WRITER_FUNC(compress, 1));
|
1849
|
+
rb_define_method_ext(cls, "close_impl", WRITER_FUNC(close, 0));
|
1850
|
+
rb_define_method_ext(cls, "get_file_attribute", WRITER_FUNC(getFileAttribute, 1));
|
1851
|
+
|
1852
|
+
rb_define_method_ext(cls, "method=", WRITER_FUNC2(setMethod, 1));
|
1853
|
+
rb_define_method_ext(cls, "method", WRITER_FUNC2(method, 0));
|
1854
|
+
rb_define_method_ext(cls, "level=", WRITER_FUNC2(setLevel, 1));
|
1855
|
+
rb_define_method_ext(cls, "level", WRITER_FUNC2(level, 0));
|
1856
|
+
rb_define_method_ext(cls, "solid=", WRITER_FUNC2(setSolid, 1));
|
1857
|
+
rb_define_method_ext(cls, "solid", WRITER_FUNC2(solid, 0));
|
1858
|
+
rb_define_method_ext(cls, "solid?", WRITER_FUNC2(solid, 0));
|
1859
|
+
rb_define_method_ext(cls, "header_compression=", WRITER_FUNC2(setHeaderCompression, 1));
|
1860
|
+
rb_define_method_ext(cls, "header_compression", WRITER_FUNC2(headerCompression, 0));
|
1861
|
+
rb_define_method_ext(cls, "header_compression?", WRITER_FUNC2(headerCompression, 0));
|
1862
|
+
rb_define_method_ext(cls, "header_encryption=", WRITER_FUNC2(setHeaderEncryption, 1));
|
1863
|
+
rb_define_method_ext(cls, "header_encryption", WRITER_FUNC2(headerEncryption, 0));
|
1864
|
+
rb_define_method_ext(cls, "header_encryption?", WRITER_FUNC2(headerEncryption, 0));
|
1865
|
+
rb_define_method_ext(cls, "multi_threading=", WRITER_FUNC2(setMultiThreading, 1));
|
1866
|
+
rb_define_method_ext(cls, "multi_thread=", WRITER_FUNC2(setMultiThreading, 1));
|
1867
|
+
rb_define_method_ext(cls, "multi_threading", WRITER_FUNC2(multiThreading, 0));
|
1868
|
+
rb_define_method_ext(cls, "multi_threading?", WRITER_FUNC2(multiThreading, 0));
|
1869
|
+
rb_define_method_ext(cls, "multi_thread", WRITER_FUNC2(multiThreading, 0));
|
1870
|
+
rb_define_method_ext(cls, "multi_thread?", WRITER_FUNC2(multiThreading, 0));
|
1871
|
+
|
1872
|
+
#undef WRITER_FUNC2
|
1873
|
+
#undef WRITER_FUNC
|
1874
|
+
|
1875
|
+
}
|
1876
|
+
|