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.
Files changed (739) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +31 -0
  3. data/.github/workflows/release.yml +30 -0
  4. data/.gitignore +27 -0
  5. data/.travis.yml +35 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +20 -0
  8. data/README.md +204 -0
  9. data/Rakefile +79 -0
  10. data/ext/C/Types.h +254 -0
  11. data/ext/CPP/7zip/Archive/IArchive.h +234 -0
  12. data/ext/CPP/7zip/IDecl.h +15 -0
  13. data/ext/CPP/7zip/IPassword.h +24 -0
  14. data/ext/CPP/7zip/IProgress.h +33 -0
  15. data/ext/CPP/7zip/IStream.h +58 -0
  16. data/ext/CPP/7zip/PropID.h +76 -0
  17. data/ext/CPP/Common/MyCom.h +225 -0
  18. data/ext/CPP/Common/MyGuidDef.h +54 -0
  19. data/ext/CPP/Common/MyInitGuid.h +22 -0
  20. data/ext/CPP/Common/MyUnknown.h +13 -0
  21. data/ext/CPP/Common/MyWindows.h +204 -0
  22. data/ext/CPP/Common/Types.h +11 -0
  23. data/ext/CPP/Windows/PropVariant.h +56 -0
  24. data/ext/CPP/include_windows/basetyps.h +19 -0
  25. data/ext/CPP/include_windows/tchar.h +89 -0
  26. data/ext/CPP/include_windows/windows.h +194 -0
  27. data/ext/p7zip/Asm/x64/7zCrcT8U.asm +103 -0
  28. data/ext/p7zip/Asm/x86/7zCrcT8U.asm +101 -0
  29. data/ext/p7zip/C/7zBuf.h +39 -0
  30. data/ext/p7zip/C/7zBuf2.c +45 -0
  31. data/ext/p7zip/C/7zCrc.c +76 -0
  32. data/ext/p7zip/C/7zCrc.h +25 -0
  33. data/ext/p7zip/C/7zCrcOpt.c +34 -0
  34. data/ext/p7zip/C/7zCrcT8.c +43 -0
  35. data/ext/p7zip/C/7zStream.c +169 -0
  36. data/ext/p7zip/C/7zVersion.h +7 -0
  37. data/ext/p7zip/C/Aes.c +284 -0
  38. data/ext/p7zip/C/Aes.h +38 -0
  39. data/ext/p7zip/C/Alloc.back3 +238 -0
  40. data/ext/p7zip/C/Alloc.c +280 -0
  41. data/ext/p7zip/C/Alloc.c.back +243 -0
  42. data/ext/p7zip/C/Alloc.c.back2 +222 -0
  43. data/ext/p7zip/C/Alloc.h +27 -0
  44. data/ext/p7zip/C/Bra.c +133 -0
  45. data/ext/p7zip/C/Bra.h +68 -0
  46. data/ext/p7zip/C/Bra86.c +85 -0
  47. data/ext/p7zip/C/BraIA64.c +67 -0
  48. data/ext/p7zip/C/BwtSort.c +516 -0
  49. data/ext/p7zip/C/BwtSort.h +30 -0
  50. data/ext/p7zip/C/CpuArch.c +168 -0
  51. data/ext/p7zip/C/CpuArch.h +155 -0
  52. data/ext/p7zip/C/Delta.c +62 -0
  53. data/ext/p7zip/C/Delta.h +23 -0
  54. data/ext/p7zip/C/HuffEnc.c +146 -0
  55. data/ext/p7zip/C/HuffEnc.h +27 -0
  56. data/ext/p7zip/C/LzFind.c +761 -0
  57. data/ext/p7zip/C/LzFind.h +115 -0
  58. data/ext/p7zip/C/LzFindMt.c +793 -0
  59. data/ext/p7zip/C/LzFindMt.h +105 -0
  60. data/ext/p7zip/C/LzHash.h +54 -0
  61. data/ext/p7zip/C/Lzma2Dec.c +356 -0
  62. data/ext/p7zip/C/Lzma2Dec.h +84 -0
  63. data/ext/p7zip/C/Lzma2Enc.c +477 -0
  64. data/ext/p7zip/C/Lzma2Enc.h +66 -0
  65. data/ext/p7zip/C/LzmaDec.c +999 -0
  66. data/ext/p7zip/C/LzmaDec.h +231 -0
  67. data/ext/p7zip/C/LzmaEnc.c +2268 -0
  68. data/ext/p7zip/C/LzmaEnc.h +80 -0
  69. data/ext/p7zip/C/LzmaUtil/Lzma86Dec.c +61 -0
  70. data/ext/p7zip/C/LzmaUtil/Lzma86Dec.h +51 -0
  71. data/ext/p7zip/C/LzmaUtil/Lzma86Enc.c +113 -0
  72. data/ext/p7zip/C/LzmaUtil/Lzma86Enc.h +78 -0
  73. data/ext/p7zip/C/MtCoder.c +327 -0
  74. data/ext/p7zip/C/MtCoder.h +98 -0
  75. data/ext/p7zip/C/Ppmd.h +85 -0
  76. data/ext/p7zip/C/Ppmd7.c +708 -0
  77. data/ext/p7zip/C/Ppmd7.h +140 -0
  78. data/ext/p7zip/C/Ppmd7Dec.c +187 -0
  79. data/ext/p7zip/C/Ppmd7Enc.c +185 -0
  80. data/ext/p7zip/C/Ppmd8.c +1120 -0
  81. data/ext/p7zip/C/Ppmd8.h +133 -0
  82. data/ext/p7zip/C/Ppmd8Dec.c +155 -0
  83. data/ext/p7zip/C/Ppmd8Enc.c +161 -0
  84. data/ext/p7zip/C/RotateDefs.h +20 -0
  85. data/ext/p7zip/C/Sha256.c +204 -0
  86. data/ext/p7zip/C/Sha256.h +26 -0
  87. data/ext/p7zip/C/Sort.c +93 -0
  88. data/ext/p7zip/C/Sort.h +20 -0
  89. data/ext/p7zip/C/Threads.c +582 -0
  90. data/ext/p7zip/C/Threads.h +123 -0
  91. data/ext/p7zip/C/Types.h +254 -0
  92. data/ext/p7zip/C/Xz.c +88 -0
  93. data/ext/p7zip/C/Xz.h +252 -0
  94. data/ext/p7zip/C/XzCrc64.c +33 -0
  95. data/ext/p7zip/C/XzCrc64.h +26 -0
  96. data/ext/p7zip/C/XzDec.c +875 -0
  97. data/ext/p7zip/C/XzEnc.c +497 -0
  98. data/ext/p7zip/C/XzEnc.h +25 -0
  99. data/ext/p7zip/C/XzIn.c +306 -0
  100. data/ext/p7zip/CPP/7zip/Archive/7z/7zCompressionMode.cpp +3 -0
  101. data/ext/p7zip/CPP/7zip/Archive/7z/7zCompressionMode.h +50 -0
  102. data/ext/p7zip/CPP/7zip/Archive/7z/7zDecode.cpp +332 -0
  103. data/ext/p7zip/CPP/7zip/Archive/7z/7zDecode.h +68 -0
  104. data/ext/p7zip/CPP/7zip/Archive/7z/7zEncode.cpp +444 -0
  105. data/ext/p7zip/CPP/7zip/Archive/7z/7zEncode.h +55 -0
  106. data/ext/p7zip/CPP/7zip/Archive/7z/7zExtract.cpp +270 -0
  107. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderInStream.cpp +123 -0
  108. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderInStream.h +58 -0
  109. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderOutStream.cpp +149 -0
  110. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderOutStream.h +58 -0
  111. data/ext/p7zip/CPP/7zip/Archive/7z/7zHandler.cpp +482 -0
  112. data/ext/p7zip/CPP/7zip/Archive/7z/7zHandler.h +119 -0
  113. data/ext/p7zip/CPP/7zip/Archive/7z/7zHandlerOut.cpp +483 -0
  114. data/ext/p7zip/CPP/7zip/Archive/7z/7zHeader.cpp +14 -0
  115. data/ext/p7zip/CPP/7zip/Archive/7z/7zHeader.h +97 -0
  116. data/ext/p7zip/CPP/7zip/Archive/7z/7zIn.cpp +1276 -0
  117. data/ext/p7zip/CPP/7zip/Archive/7z/7zIn.h +245 -0
  118. data/ext/p7zip/CPP/7zip/Archive/7z/7zItem.h +268 -0
  119. data/ext/p7zip/CPP/7zip/Archive/7z/7zOut.cpp +866 -0
  120. data/ext/p7zip/CPP/7zip/Archive/7z/7zOut.h +152 -0
  121. data/ext/p7zip/CPP/7zip/Archive/7z/7zProperties.cpp +164 -0
  122. data/ext/p7zip/CPP/7zip/Archive/7z/7zProperties.h +22 -0
  123. data/ext/p7zip/CPP/7zip/Archive/7z/7zRegister.cpp +18 -0
  124. data/ext/p7zip/CPP/7zip/Archive/7z/7zSpecStream.cpp +24 -0
  125. data/ext/p7zip/CPP/7zip/Archive/7z/7zSpecStream.h +35 -0
  126. data/ext/p7zip/CPP/7zip/Archive/7z/7zUpdate.cpp +1216 -0
  127. data/ext/p7zip/CPP/7zip/Archive/7z/7zUpdate.h +88 -0
  128. data/ext/p7zip/CPP/7zip/Archive/ApmHandler.cpp +356 -0
  129. data/ext/p7zip/CPP/7zip/Archive/ArchiveExports.cpp +135 -0
  130. data/ext/p7zip/CPP/7zip/Archive/ArjHandler.cpp +798 -0
  131. data/ext/p7zip/CPP/7zip/Archive/Bz2Handler.cpp +423 -0
  132. data/ext/p7zip/CPP/7zip/Archive/Cab/CabBlockInStream.cpp +189 -0
  133. data/ext/p7zip/CPP/7zip/Archive/Cab/CabBlockInStream.h +44 -0
  134. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHandler.cpp +929 -0
  135. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHandler.h +28 -0
  136. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHeader.cpp +15 -0
  137. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHeader.h +44 -0
  138. data/ext/p7zip/CPP/7zip/Archive/Cab/CabIn.cpp +272 -0
  139. data/ext/p7zip/CPP/7zip/Archive/Cab/CabIn.h +161 -0
  140. data/ext/p7zip/CPP/7zip/Archive/Cab/CabItem.h +63 -0
  141. data/ext/p7zip/CPP/7zip/Archive/Cab/CabRegister.cpp +13 -0
  142. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHandler.cpp +721 -0
  143. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHandler.h +29 -0
  144. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHeader.cpp +24 -0
  145. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHeader.h +28 -0
  146. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmIn.cpp +937 -0
  147. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmIn.h +244 -0
  148. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmRegister.cpp +13 -0
  149. data/ext/p7zip/CPP/7zip/Archive/Com/ComHandler.cpp +239 -0
  150. data/ext/p7zip/CPP/7zip/Archive/Com/ComHandler.h +28 -0
  151. data/ext/p7zip/CPP/7zip/Archive/Com/ComIn.cpp +389 -0
  152. data/ext/p7zip/CPP/7zip/Archive/Com/ComIn.h +119 -0
  153. data/ext/p7zip/CPP/7zip/Archive/Com/ComRegister.cpp +13 -0
  154. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2.cpp +121 -0
  155. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2.h +174 -0
  156. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2MT.cpp +240 -0
  157. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2MT.h +80 -0
  158. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2ST.cpp +239 -0
  159. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2ST.h +88 -0
  160. data/ext/p7zip/CPP/7zip/Archive/Common/CrossThreadProgress.cpp +15 -0
  161. data/ext/p7zip/CPP/7zip/Archive/Common/CrossThreadProgress.h +37 -0
  162. data/ext/p7zip/CPP/7zip/Archive/Common/DummyOutStream.cpp +22 -0
  163. data/ext/p7zip/CPP/7zip/Archive/Common/DummyOutStream.h +24 -0
  164. data/ext/p7zip/CPP/7zip/Archive/Common/FindSignature.cpp +62 -0
  165. data/ext/p7zip/CPP/7zip/Archive/Common/FindSignature.h +12 -0
  166. data/ext/p7zip/CPP/7zip/Archive/Common/HandlerOut.cpp +623 -0
  167. data/ext/p7zip/CPP/7zip/Archive/Common/HandlerOut.h +87 -0
  168. data/ext/p7zip/CPP/7zip/Archive/Common/InStreamWithCRC.cpp +42 -0
  169. data/ext/p7zip/CPP/7zip/Archive/Common/InStreamWithCRC.h +67 -0
  170. data/ext/p7zip/CPP/7zip/Archive/Common/ItemNameUtils.cpp +61 -0
  171. data/ext/p7zip/CPP/7zip/Archive/Common/ItemNameUtils.h +24 -0
  172. data/ext/p7zip/CPP/7zip/Archive/Common/MultiStream.cpp +190 -0
  173. data/ext/p7zip/CPP/7zip/Archive/Common/MultiStream.h +84 -0
  174. data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp +18 -0
  175. data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithCRC.h +36 -0
  176. data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp +18 -0
  177. data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithSha1.h +36 -0
  178. data/ext/p7zip/CPP/7zip/Archive/Common/ParseProperties.cpp +177 -0
  179. data/ext/p7zip/CPP/7zip/Archive/Common/ParseProperties.h +18 -0
  180. data/ext/p7zip/CPP/7zip/Archive/CpioHandler.cpp +624 -0
  181. data/ext/p7zip/CPP/7zip/Archive/CramfsHandler.cpp +644 -0
  182. data/ext/p7zip/CPP/7zip/Archive/DebHandler.cpp +413 -0
  183. data/ext/p7zip/CPP/7zip/Archive/DeflateProps.cpp +118 -0
  184. data/ext/p7zip/CPP/7zip/Archive/DeflateProps.h +35 -0
  185. data/ext/p7zip/CPP/7zip/Archive/DllExports2.cpp +76 -0
  186. data/ext/p7zip/CPP/7zip/Archive/DmgHandler.cpp +918 -0
  187. data/ext/p7zip/CPP/7zip/Archive/ElfHandler.cpp +534 -0
  188. data/ext/p7zip/CPP/7zip/Archive/FatHandler.cpp +996 -0
  189. data/ext/p7zip/CPP/7zip/Archive/FlvHandler.cpp +544 -0
  190. data/ext/p7zip/CPP/7zip/Archive/GzHandler.cpp +698 -0
  191. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsHandler.cpp +243 -0
  192. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsHandler.h +26 -0
  193. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsIn.cpp +480 -0
  194. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsIn.h +154 -0
  195. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsRegister.cpp +13 -0
  196. data/ext/p7zip/CPP/7zip/Archive/IArchive.h +234 -0
  197. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHandler.cpp +326 -0
  198. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHandler.h +30 -0
  199. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHeader.cpp +21 -0
  200. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHeader.h +61 -0
  201. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoIn.cpp +453 -0
  202. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoIn.h +315 -0
  203. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoItem.h +141 -0
  204. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoRegister.cpp +13 -0
  205. data/ext/p7zip/CPP/7zip/Archive/LzhHandler.cpp +775 -0
  206. data/ext/p7zip/CPP/7zip/Archive/LzmaHandler.cpp +430 -0
  207. data/ext/p7zip/CPP/7zip/Archive/MachoHandler.cpp +500 -0
  208. data/ext/p7zip/CPP/7zip/Archive/MbrHandler.cpp +507 -0
  209. data/ext/p7zip/CPP/7zip/Archive/MslzHandler.cpp +257 -0
  210. data/ext/p7zip/CPP/7zip/Archive/MubHandler.cpp +266 -0
  211. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisDecode.cpp +130 -0
  212. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisDecode.h +47 -0
  213. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisHandler.cpp +510 -0
  214. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisHandler.h +43 -0
  215. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisIn.cpp +1461 -0
  216. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisIn.h +181 -0
  217. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisRegister.cpp +13 -0
  218. data/ext/p7zip/CPP/7zip/Archive/NtfsHandler.cpp +1764 -0
  219. data/ext/p7zip/CPP/7zip/Archive/PeHandler.cpp +1752 -0
  220. data/ext/p7zip/CPP/7zip/Archive/PpmdHandler.cpp +456 -0
  221. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHandler.cpp +869 -0
  222. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHandler.h +66 -0
  223. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHeader.cpp +21 -0
  224. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHeader.h +205 -0
  225. data/ext/p7zip/CPP/7zip/Archive/Rar/RarIn.cpp +478 -0
  226. data/ext/p7zip/CPP/7zip/Archive/Rar/RarIn.h +123 -0
  227. data/ext/p7zip/CPP/7zip/Archive/Rar/RarItem.cpp +55 -0
  228. data/ext/p7zip/CPP/7zip/Archive/Rar/RarItem.h +79 -0
  229. data/ext/p7zip/CPP/7zip/Archive/Rar/RarRegister.cpp +13 -0
  230. data/ext/p7zip/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp +78 -0
  231. data/ext/p7zip/CPP/7zip/Archive/Rar/RarVolumeInStream.h +49 -0
  232. data/ext/p7zip/CPP/7zip/Archive/RpmHandler.cpp +292 -0
  233. data/ext/p7zip/CPP/7zip/Archive/SplitHandler.cpp +366 -0
  234. data/ext/p7zip/CPP/7zip/Archive/SquashfsHandler.cpp +2155 -0
  235. data/ext/p7zip/CPP/7zip/Archive/SwfHandler.cpp +706 -0
  236. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandler.cpp +386 -0
  237. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandler.h +61 -0
  238. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandlerOut.cpp +122 -0
  239. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHeader.cpp +25 -0
  240. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHeader.h +108 -0
  241. data/ext/p7zip/CPP/7zip/Archive/Tar/TarIn.cpp +207 -0
  242. data/ext/p7zip/CPP/7zip/Archive/Tar/TarIn.h +17 -0
  243. data/ext/p7zip/CPP/7zip/Archive/Tar/TarItem.h +72 -0
  244. data/ext/p7zip/CPP/7zip/Archive/Tar/TarOut.cpp +187 -0
  245. data/ext/p7zip/CPP/7zip/Archive/Tar/TarOut.h +28 -0
  246. data/ext/p7zip/CPP/7zip/Archive/Tar/TarRegister.cpp +18 -0
  247. data/ext/p7zip/CPP/7zip/Archive/Tar/TarUpdate.cpp +139 -0
  248. data/ext/p7zip/CPP/7zip/Archive/Tar/TarUpdate.h +34 -0
  249. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfHandler.cpp +451 -0
  250. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfHandler.h +37 -0
  251. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfIn.cpp +876 -0
  252. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfIn.h +375 -0
  253. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfRegister.cpp +13 -0
  254. data/ext/p7zip/CPP/7zip/Archive/VhdHandler.cpp +734 -0
  255. data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandler.cpp +660 -0
  256. data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandler.h +77 -0
  257. data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandlerOut.cpp +639 -0
  258. data/ext/p7zip/CPP/7zip/Archive/Wim/WimIn.cpp +855 -0
  259. data/ext/p7zip/CPP/7zip/Archive/Wim/WimIn.h +297 -0
  260. data/ext/p7zip/CPP/7zip/Archive/Wim/WimRegister.cpp +18 -0
  261. data/ext/p7zip/CPP/7zip/Archive/XarHandler.cpp +588 -0
  262. data/ext/p7zip/CPP/7zip/Archive/XzHandler.cpp +707 -0
  263. data/ext/p7zip/CPP/7zip/Archive/ZHandler.cpp +161 -0
  264. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipAddCommon.cpp +379 -0
  265. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipAddCommon.h +56 -0
  266. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipCompressionMode.h +42 -0
  267. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandler.cpp +822 -0
  268. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandler.h +101 -0
  269. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp +537 -0
  270. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHeader.cpp +36 -0
  271. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHeader.h +284 -0
  272. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipIn.cpp +893 -0
  273. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipIn.h +125 -0
  274. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItem.cpp +181 -0
  275. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItem.h +281 -0
  276. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItemEx.h +34 -0
  277. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipOut.cpp +289 -0
  278. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipOut.h +56 -0
  279. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipRegister.cpp +18 -0
  280. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipUpdate.cpp +1076 -0
  281. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipUpdate.h +58 -0
  282. data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile +328 -0
  283. data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile.depend +4962 -0
  284. data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile.list +265 -0
  285. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7zFM.txt +163 -0
  286. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7zG.txt +131 -0
  287. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7za.txt +253 -0
  288. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_ALL.txt +32 -0
  289. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_Format7zFree.txt +290 -0
  290. data/ext/p7zip/CPP/7zip/CMAKE/generate.sh +37 -0
  291. data/ext/p7zip/CPP/7zip/CMAKE/generate_xcode.sh +32 -0
  292. data/ext/p7zip/CPP/7zip/Common/CWrappers.cpp +226 -0
  293. data/ext/p7zip/CPP/7zip/Common/CWrappers.h +109 -0
  294. data/ext/p7zip/CPP/7zip/Common/CreateCoder.cpp +293 -0
  295. data/ext/p7zip/CPP/7zip/Common/CreateCoder.h +98 -0
  296. data/ext/p7zip/CPP/7zip/Common/FilePathAutoRename.cpp +55 -0
  297. data/ext/p7zip/CPP/7zip/Common/FilePathAutoRename.h +10 -0
  298. data/ext/p7zip/CPP/7zip/Common/FileStreams.cpp +273 -0
  299. data/ext/p7zip/CPP/7zip/Common/FileStreams.h +134 -0
  300. data/ext/p7zip/CPP/7zip/Common/FilterCoder.cpp +247 -0
  301. data/ext/p7zip/CPP/7zip/Common/FilterCoder.h +128 -0
  302. data/ext/p7zip/CPP/7zip/Common/InBuffer.cpp +83 -0
  303. data/ext/p7zip/CPP/7zip/Common/InBuffer.h +81 -0
  304. data/ext/p7zip/CPP/7zip/Common/InOutTempBuffer.cpp +122 -0
  305. data/ext/p7zip/CPP/7zip/Common/InOutTempBuffer.h +48 -0
  306. data/ext/p7zip/CPP/7zip/Common/LimitedStreams.cpp +154 -0
  307. data/ext/p7zip/CPP/7zip/Common/LimitedStreams.h +125 -0
  308. data/ext/p7zip/CPP/7zip/Common/LockedStream.cpp +23 -0
  309. data/ext/p7zip/CPP/7zip/Common/LockedStream.h +38 -0
  310. data/ext/p7zip/CPP/7zip/Common/MemBlocks.cpp +183 -0
  311. data/ext/p7zip/CPP/7zip/Common/MemBlocks.h +71 -0
  312. data/ext/p7zip/CPP/7zip/Common/MethodId.cpp +27 -0
  313. data/ext/p7zip/CPP/7zip/Common/MethodId.h +10 -0
  314. data/ext/p7zip/CPP/7zip/Common/MethodProps.cpp +99 -0
  315. data/ext/p7zip/CPP/7zip/Common/MethodProps.h +41 -0
  316. data/ext/p7zip/CPP/7zip/Common/OffsetStream.cpp +35 -0
  317. data/ext/p7zip/CPP/7zip/Common/OffsetStream.h +25 -0
  318. data/ext/p7zip/CPP/7zip/Common/OutBuffer.cpp +116 -0
  319. data/ext/p7zip/CPP/7zip/Common/OutBuffer.h +64 -0
  320. data/ext/p7zip/CPP/7zip/Common/OutMemStream.cpp +142 -0
  321. data/ext/p7zip/CPP/7zip/Common/OutMemStream.h +96 -0
  322. data/ext/p7zip/CPP/7zip/Common/ProgressMt.cpp +53 -0
  323. data/ext/p7zip/CPP/7zip/Common/ProgressMt.h +46 -0
  324. data/ext/p7zip/CPP/7zip/Common/ProgressUtils.cpp +42 -0
  325. data/ext/p7zip/CPP/7zip/Common/ProgressUtils.h +34 -0
  326. data/ext/p7zip/CPP/7zip/Common/RegisterArc.h +32 -0
  327. data/ext/p7zip/CPP/7zip/Common/RegisterCodec.h +33 -0
  328. data/ext/p7zip/CPP/7zip/Common/StreamBinder.cpp +152 -0
  329. data/ext/p7zip/CPP/7zip/Common/StreamBinder.h +38 -0
  330. data/ext/p7zip/CPP/7zip/Common/StreamObjects.cpp +221 -0
  331. data/ext/p7zip/CPP/7zip/Common/StreamObjects.h +135 -0
  332. data/ext/p7zip/CPP/7zip/Common/StreamUtils.cpp +56 -0
  333. data/ext/p7zip/CPP/7zip/Common/StreamUtils.h +13 -0
  334. data/ext/p7zip/CPP/7zip/Common/VirtThread.cpp +46 -0
  335. data/ext/p7zip/CPP/7zip/Common/VirtThread.h +23 -0
  336. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder1.cpp +309 -0
  337. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder1.h +98 -0
  338. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder2.cpp +90 -0
  339. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder2.h +59 -0
  340. data/ext/p7zip/CPP/7zip/Compress/BZip2Const.h +54 -0
  341. data/ext/p7zip/CPP/7zip/Compress/BZip2Crc.cpp +26 -0
  342. data/ext/p7zip/CPP/7zip/Compress/BZip2Crc.h +31 -0
  343. data/ext/p7zip/CPP/7zip/Compress/BZip2Decoder.cpp +943 -0
  344. data/ext/p7zip/CPP/7zip/Compress/BZip2Decoder.h +205 -0
  345. data/ext/p7zip/CPP/7zip/Compress/BZip2Encoder.cpp +895 -0
  346. data/ext/p7zip/CPP/7zip/Compress/BZip2Encoder.h +245 -0
  347. data/ext/p7zip/CPP/7zip/Compress/BZip2Register.cpp +20 -0
  348. data/ext/p7zip/CPP/7zip/Compress/Bcj2Coder.cpp +386 -0
  349. data/ext/p7zip/CPP/7zip/Compress/Bcj2Coder.h +115 -0
  350. data/ext/p7zip/CPP/7zip/Compress/Bcj2Register.cpp +19 -0
  351. data/ext/p7zip/CPP/7zip/Compress/BcjCoder.cpp +15 -0
  352. data/ext/p7zip/CPP/7zip/Compress/BcjCoder.h +19 -0
  353. data/ext/p7zip/CPP/7zip/Compress/BcjRegister.cpp +19 -0
  354. data/ext/p7zip/CPP/7zip/Compress/BitlDecoder.cpp +24 -0
  355. data/ext/p7zip/CPP/7zip/Compress/BitlDecoder.h +141 -0
  356. data/ext/p7zip/CPP/7zip/Compress/BitlEncoder.h +57 -0
  357. data/ext/p7zip/CPP/7zip/Compress/BitmDecoder.h +66 -0
  358. data/ext/p7zip/CPP/7zip/Compress/BitmEncoder.h +50 -0
  359. data/ext/p7zip/CPP/7zip/Compress/BranchCoder.cpp +19 -0
  360. data/ext/p7zip/CPP/7zip/Compress/BranchCoder.h +44 -0
  361. data/ext/p7zip/CPP/7zip/Compress/BranchMisc.cpp +37 -0
  362. data/ext/p7zip/CPP/7zip/Compress/BranchMisc.h +14 -0
  363. data/ext/p7zip/CPP/7zip/Compress/BranchRegister.cpp +30 -0
  364. data/ext/p7zip/CPP/7zip/Compress/ByteSwap.cpp +73 -0
  365. data/ext/p7zip/CPP/7zip/Compress/CodecExports.cpp +160 -0
  366. data/ext/p7zip/CPP/7zip/Compress/CopyCoder.cpp +67 -0
  367. data/ext/p7zip/CPP/7zip/Compress/CopyCoder.h +34 -0
  368. data/ext/p7zip/CPP/7zip/Compress/CopyRegister.cpp +14 -0
  369. data/ext/p7zip/CPP/7zip/Compress/Deflate64Register.cpp +20 -0
  370. data/ext/p7zip/CPP/7zip/Compress/DeflateConst.h +134 -0
  371. data/ext/p7zip/CPP/7zip/Compress/DeflateDecoder.cpp +353 -0
  372. data/ext/p7zip/CPP/7zip/Compress/DeflateDecoder.h +157 -0
  373. data/ext/p7zip/CPP/7zip/Compress/DeflateEncoder.cpp +986 -0
  374. data/ext/p7zip/CPP/7zip/Compress/DeflateEncoder.h +211 -0
  375. data/ext/p7zip/CPP/7zip/Compress/DeflateRegister.cpp +21 -0
  376. data/ext/p7zip/CPP/7zip/Compress/DeltaFilter.cpp +112 -0
  377. data/ext/p7zip/CPP/7zip/Compress/DllExports.cpp +39 -0
  378. data/ext/p7zip/CPP/7zip/Compress/DllExports2.cpp +28 -0
  379. data/ext/p7zip/CPP/7zip/Compress/HuffmanDecoder.h +89 -0
  380. data/ext/p7zip/CPP/7zip/Compress/ImplodeDecoder.cpp +219 -0
  381. data/ext/p7zip/CPP/7zip/Compress/ImplodeDecoder.h +57 -0
  382. data/ext/p7zip/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp +89 -0
  383. data/ext/p7zip/CPP/7zip/Compress/ImplodeHuffmanDecoder.h +34 -0
  384. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp +531 -0
  385. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp +1018 -0
  386. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h +48 -0
  387. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp +311 -0
  388. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h +20 -0
  389. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/makefile +173 -0
  390. data/ext/p7zip/CPP/7zip/Compress/LzOutWindow.cpp +14 -0
  391. data/ext/p7zip/CPP/7zip/Compress/LzOutWindow.h +66 -0
  392. data/ext/p7zip/CPP/7zip/Compress/LzhDecoder.cpp +220 -0
  393. data/ext/p7zip/CPP/7zip/Compress/LzhDecoder.h +106 -0
  394. data/ext/p7zip/CPP/7zip/Compress/Lzma2Decoder.cpp +189 -0
  395. data/ext/p7zip/CPP/7zip/Compress/Lzma2Decoder.h +73 -0
  396. data/ext/p7zip/CPP/7zip/Compress/Lzma2Encoder.cpp +94 -0
  397. data/ext/p7zip/CPP/7zip/Compress/Lzma2Encoder.h +36 -0
  398. data/ext/p7zip/CPP/7zip/Compress/Lzma2Register.cpp +20 -0
  399. data/ext/p7zip/CPP/7zip/Compress/LzmaDecoder.cpp +252 -0
  400. data/ext/p7zip/CPP/7zip/Compress/LzmaDecoder.h +84 -0
  401. data/ext/p7zip/CPP/7zip/Compress/LzmaEncoder.cpp +149 -0
  402. data/ext/p7zip/CPP/7zip/Compress/LzmaEncoder.h +36 -0
  403. data/ext/p7zip/CPP/7zip/Compress/LzmaRegister.cpp +20 -0
  404. data/ext/p7zip/CPP/7zip/Compress/Lzx.h +61 -0
  405. data/ext/p7zip/CPP/7zip/Compress/Lzx86Converter.cpp +90 -0
  406. data/ext/p7zip/CPP/7zip/Compress/Lzx86Converter.h +46 -0
  407. data/ext/p7zip/CPP/7zip/Compress/LzxDecoder.cpp +387 -0
  408. data/ext/p7zip/CPP/7zip/Compress/LzxDecoder.h +159 -0
  409. data/ext/p7zip/CPP/7zip/Compress/Mtf8.h +193 -0
  410. data/ext/p7zip/CPP/7zip/Compress/PpmdDecoder.cpp +167 -0
  411. data/ext/p7zip/CPP/7zip/Compress/PpmdDecoder.h +78 -0
  412. data/ext/p7zip/CPP/7zip/Compress/PpmdEncoder.cpp +119 -0
  413. data/ext/p7zip/CPP/7zip/Compress/PpmdEncoder.h +48 -0
  414. data/ext/p7zip/CPP/7zip/Compress/PpmdRegister.cpp +21 -0
  415. data/ext/p7zip/CPP/7zip/Compress/PpmdZip.cpp +223 -0
  416. data/ext/p7zip/CPP/7zip/Compress/PpmdZip.h +72 -0
  417. data/ext/p7zip/CPP/7zip/Compress/QuantumDecoder.cpp +175 -0
  418. data/ext/p7zip/CPP/7zip/Compress/QuantumDecoder.h +264 -0
  419. data/ext/p7zip/CPP/7zip/Compress/RangeCoder.h +205 -0
  420. data/ext/p7zip/CPP/7zip/Compress/RangeCoderBit.h +114 -0
  421. data/ext/p7zip/CPP/7zip/Compress/Rar/makefile +34 -0
  422. data/ext/p7zip/CPP/7zip/Compress/Rar/makefile.depend +158 -0
  423. data/ext/p7zip/CPP/7zip/Compress/Rar/makefile.list +64 -0
  424. data/ext/p7zip/CPP/7zip/Compress/Rar1Decoder.cpp +480 -0
  425. data/ext/p7zip/CPP/7zip/Compress/Rar1Decoder.h +88 -0
  426. data/ext/p7zip/CPP/7zip/Compress/Rar2Decoder.cpp +391 -0
  427. data/ext/p7zip/CPP/7zip/Compress/Rar2Decoder.h +174 -0
  428. data/ext/p7zip/CPP/7zip/Compress/Rar3Decoder.cpp +897 -0
  429. data/ext/p7zip/CPP/7zip/Compress/Rar3Decoder.h +267 -0
  430. data/ext/p7zip/CPP/7zip/Compress/Rar3Vm.cpp +1091 -0
  431. data/ext/p7zip/CPP/7zip/Compress/Rar3Vm.h +179 -0
  432. data/ext/p7zip/CPP/7zip/Compress/RarCodecsRegister.cpp +26 -0
  433. data/ext/p7zip/CPP/7zip/Compress/ShrinkDecoder.cpp +145 -0
  434. data/ext/p7zip/CPP/7zip/Compress/ShrinkDecoder.h +38 -0
  435. data/ext/p7zip/CPP/7zip/Compress/ZDecoder.cpp +159 -0
  436. data/ext/p7zip/CPP/7zip/Compress/ZDecoder.h +42 -0
  437. data/ext/p7zip/CPP/7zip/Compress/ZlibDecoder.cpp +89 -0
  438. data/ext/p7zip/CPP/7zip/Compress/ZlibDecoder.h +48 -0
  439. data/ext/p7zip/CPP/7zip/Compress/ZlibEncoder.cpp +61 -0
  440. data/ext/p7zip/CPP/7zip/Compress/ZlibEncoder.h +48 -0
  441. data/ext/p7zip/CPP/7zip/Crypto/7zAes.cpp +244 -0
  442. data/ext/p7zip/CPP/7zip/Crypto/7zAes.h +117 -0
  443. data/ext/p7zip/CPP/7zip/Crypto/7zAesRegister.cpp +18 -0
  444. data/ext/p7zip/CPP/7zip/Crypto/HmacSha1.cpp +109 -0
  445. data/ext/p7zip/CPP/7zip/Crypto/HmacSha1.h +39 -0
  446. data/ext/p7zip/CPP/7zip/Crypto/MyAes.cpp +48 -0
  447. data/ext/p7zip/CPP/7zip/Crypto/MyAes.h +38 -0
  448. data/ext/p7zip/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp +83 -0
  449. data/ext/p7zip/CPP/7zip/Crypto/Pbkdf2HmacSha1.h +21 -0
  450. data/ext/p7zip/CPP/7zip/Crypto/RandGen.cpp +107 -0
  451. data/ext/p7zip/CPP/7zip/Crypto/RandGen.h +21 -0
  452. data/ext/p7zip/CPP/7zip/Crypto/Rar20Crypto.cpp +133 -0
  453. data/ext/p7zip/CPP/7zip/Crypto/Rar20Crypto.h +50 -0
  454. data/ext/p7zip/CPP/7zip/Crypto/RarAes.cpp +134 -0
  455. data/ext/p7zip/CPP/7zip/Crypto/RarAes.h +47 -0
  456. data/ext/p7zip/CPP/7zip/Crypto/Sha1.cpp +229 -0
  457. data/ext/p7zip/CPP/7zip/Crypto/Sha1.h +68 -0
  458. data/ext/p7zip/CPP/7zip/Crypto/WzAes.cpp +221 -0
  459. data/ext/p7zip/CPP/7zip/Crypto/WzAes.h +125 -0
  460. data/ext/p7zip/CPP/7zip/Crypto/ZipCrypto.cpp +88 -0
  461. data/ext/p7zip/CPP/7zip/Crypto/ZipCrypto.h +56 -0
  462. data/ext/p7zip/CPP/7zip/Crypto/ZipStrong.cpp +164 -0
  463. data/ext/p7zip/CPP/7zip/Crypto/ZipStrong.h +47 -0
  464. data/ext/p7zip/CPP/7zip/Guid.txt +170 -0
  465. data/ext/p7zip/CPP/7zip/ICoder.h +186 -0
  466. data/ext/p7zip/CPP/7zip/IDecl.h +15 -0
  467. data/ext/p7zip/CPP/7zip/IPassword.h +24 -0
  468. data/ext/p7zip/CPP/7zip/IProgress.h +33 -0
  469. data/ext/p7zip/CPP/7zip/IStream.h +58 -0
  470. data/ext/p7zip/CPP/7zip/MyVersion.h +11 -0
  471. data/ext/p7zip/CPP/7zip/PREMAKE/generate.sh +18 -0
  472. data/ext/p7zip/CPP/7zip/PREMAKE/premake4.lua +263 -0
  473. data/ext/p7zip/CPP/7zip/PropID.h +76 -0
  474. data/ext/p7zip/CPP/7zip/QMAKE/7ZA/7ZA.pro +228 -0
  475. data/ext/p7zip/CPP/7zip/QMAKE/7ZA/7ZA_osx.pro +228 -0
  476. data/ext/p7zip/CPP/7zip/QMAKE/test_emul/test_emul.pro +26 -0
  477. data/ext/p7zip/CPP/7zip/TEST/TestUI/TestUI.cpp +560 -0
  478. data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile +33 -0
  479. data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile.depend +577 -0
  480. data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile.list +16 -0
  481. data/ext/p7zip/CPP/Common/AutoPtr.h +35 -0
  482. data/ext/p7zip/CPP/Common/Buffer.h +77 -0
  483. data/ext/p7zip/CPP/Common/CRC.cpp +7 -0
  484. data/ext/p7zip/CPP/Common/C_FileIO.cpp +88 -0
  485. data/ext/p7zip/CPP/Common/C_FileIO.h +47 -0
  486. data/ext/p7zip/CPP/Common/ComTry.h +18 -0
  487. data/ext/p7zip/CPP/Common/CommandLineParser.cpp +230 -0
  488. data/ext/p7zip/CPP/Common/CommandLineParser.h +72 -0
  489. data/ext/p7zip/CPP/Common/Defs.h +20 -0
  490. data/ext/p7zip/CPP/Common/DynamicBuffer.h +50 -0
  491. data/ext/p7zip/CPP/Common/IntToString.cpp +77 -0
  492. data/ext/p7zip/CPP/Common/IntToString.h +19 -0
  493. data/ext/p7zip/CPP/Common/Lang.cpp +130 -0
  494. data/ext/p7zip/CPP/Common/Lang.h +28 -0
  495. data/ext/p7zip/CPP/Common/ListFileUtils.cpp +75 -0
  496. data/ext/p7zip/CPP/Common/ListFileUtils.h +11 -0
  497. data/ext/p7zip/CPP/Common/MyCom.h +225 -0
  498. data/ext/p7zip/CPP/Common/MyException.h +14 -0
  499. data/ext/p7zip/CPP/Common/MyGuidDef.h +54 -0
  500. data/ext/p7zip/CPP/Common/MyInitGuid.h +22 -0
  501. data/ext/p7zip/CPP/Common/MyMap.cpp +140 -0
  502. data/ext/p7zip/CPP/Common/MyMap.h +28 -0
  503. data/ext/p7zip/CPP/Common/MyString.cpp +206 -0
  504. data/ext/p7zip/CPP/Common/MyString.h +601 -0
  505. data/ext/p7zip/CPP/Common/MyUnknown.h +13 -0
  506. data/ext/p7zip/CPP/Common/MyVector.cpp +87 -0
  507. data/ext/p7zip/CPP/Common/MyVector.h +266 -0
  508. data/ext/p7zip/CPP/Common/MyWindows.cpp +111 -0
  509. data/ext/p7zip/CPP/Common/MyWindows.h +218 -0
  510. data/ext/p7zip/CPP/Common/MyXml.cpp +209 -0
  511. data/ext/p7zip/CPP/Common/MyXml.h +40 -0
  512. data/ext/p7zip/CPP/Common/NewHandler.h +16 -0
  513. data/ext/p7zip/CPP/Common/StdInStream.cpp +100 -0
  514. data/ext/p7zip/CPP/Common/StdInStream.h +32 -0
  515. data/ext/p7zip/CPP/Common/StdOutStream.cpp +93 -0
  516. data/ext/p7zip/CPP/Common/StdOutStream.h +35 -0
  517. data/ext/p7zip/CPP/Common/StringConvert.cpp +181 -0
  518. data/ext/p7zip/CPP/Common/StringConvert.h +73 -0
  519. data/ext/p7zip/CPP/Common/StringToInt.cpp +90 -0
  520. data/ext/p7zip/CPP/Common/StringToInt.h +18 -0
  521. data/ext/p7zip/CPP/Common/TextConfig.cpp +138 -0
  522. data/ext/p7zip/CPP/Common/TextConfig.h +22 -0
  523. data/ext/p7zip/CPP/Common/Types.h +11 -0
  524. data/ext/p7zip/CPP/Common/UTFConvert.cpp +145 -0
  525. data/ext/p7zip/CPP/Common/UTFConvert.h +11 -0
  526. data/ext/p7zip/CPP/Common/Wildcard.cpp +462 -0
  527. data/ext/p7zip/CPP/Common/Wildcard.h +80 -0
  528. data/ext/p7zip/CPP/Windows/COM.cpp +37 -0
  529. data/ext/p7zip/CPP/Windows/COM.h +69 -0
  530. data/ext/p7zip/CPP/Windows/Clipboard.cpp +160 -0
  531. data/ext/p7zip/CPP/Windows/Clipboard.h +28 -0
  532. data/ext/p7zip/CPP/Windows/CommonDialog.h +19 -0
  533. data/ext/p7zip/CPP/Windows/Control/ComboBox.h +82 -0
  534. data/ext/p7zip/CPP/Windows/Control/Controls.cpp +515 -0
  535. data/ext/p7zip/CPP/Windows/Control/Dialog.cpp +560 -0
  536. data/ext/p7zip/CPP/Windows/Control/Dialog.h +179 -0
  537. data/ext/p7zip/CPP/Windows/Control/DialogImpl.h +73 -0
  538. data/ext/p7zip/CPP/Windows/Control/Edit.h +24 -0
  539. data/ext/p7zip/CPP/Windows/Control/ListView.h +164 -0
  540. data/ext/p7zip/CPP/Windows/Control/ProgressBar.h +34 -0
  541. data/ext/p7zip/CPP/Windows/Control/Static.h +23 -0
  542. data/ext/p7zip/CPP/Windows/Control/StatusBar.h +56 -0
  543. data/ext/p7zip/CPP/Windows/Control/Window2.cpp +211 -0
  544. data/ext/p7zip/CPP/Windows/Control/Window2.h +111 -0
  545. data/ext/p7zip/CPP/Windows/DLL.cpp +193 -0
  546. data/ext/p7zip/CPP/Windows/DLL.h +48 -0
  547. data/ext/p7zip/CPP/Windows/Defs.h +17 -0
  548. data/ext/p7zip/CPP/Windows/Error.cpp +58 -0
  549. data/ext/p7zip/CPP/Windows/Error.h +33 -0
  550. data/ext/p7zip/CPP/Windows/FileDir.cpp +927 -0
  551. data/ext/p7zip/CPP/Windows/FileDir.h +115 -0
  552. data/ext/p7zip/CPP/Windows/FileFind.cpp +604 -0
  553. data/ext/p7zip/CPP/Windows/FileFind.h +126 -0
  554. data/ext/p7zip/CPP/Windows/FileIO.cpp +475 -0
  555. data/ext/p7zip/CPP/Windows/FileIO.h +110 -0
  556. data/ext/p7zip/CPP/Windows/FileName.cpp +50 -0
  557. data/ext/p7zip/CPP/Windows/FileName.h +27 -0
  558. data/ext/p7zip/CPP/Windows/Menu.h +4 -0
  559. data/ext/p7zip/CPP/Windows/NtCheck.h +44 -0
  560. data/ext/p7zip/CPP/Windows/PropVariant.cpp +243 -0
  561. data/ext/p7zip/CPP/Windows/PropVariant.h +56 -0
  562. data/ext/p7zip/CPP/Windows/PropVariantConversions.cpp +142 -0
  563. data/ext/p7zip/CPP/Windows/PropVariantConversions.h +14 -0
  564. data/ext/p7zip/CPP/Windows/PropVariantUtils.cpp +78 -0
  565. data/ext/p7zip/CPP/Windows/PropVariantUtils.h +28 -0
  566. data/ext/p7zip/CPP/Windows/Registry.cpp +313 -0
  567. data/ext/p7zip/CPP/Windows/Registry.h +113 -0
  568. data/ext/p7zip/CPP/Windows/ResourceString.h +22 -0
  569. data/ext/p7zip/CPP/Windows/Shell.h +21 -0
  570. data/ext/p7zip/CPP/Windows/Synchronization.cpp +157 -0
  571. data/ext/p7zip/CPP/Windows/Synchronization.h +187 -0
  572. data/ext/p7zip/CPP/Windows/Synchronization2.h +218 -0
  573. data/ext/p7zip/CPP/Windows/System.cpp +166 -0
  574. data/ext/p7zip/CPP/Windows/System.h +16 -0
  575. data/ext/p7zip/CPP/Windows/Thread.h +41 -0
  576. data/ext/p7zip/CPP/Windows/Time.cpp +88 -0
  577. data/ext/p7zip/CPP/Windows/Time.h +21 -0
  578. data/ext/p7zip/CPP/Windows/Window.cpp +101 -0
  579. data/ext/p7zip/CPP/Windows/Window.h +43 -0
  580. data/ext/p7zip/CPP/include_windows/basetyps.h +19 -0
  581. data/ext/p7zip/CPP/include_windows/tchar.h +89 -0
  582. data/ext/p7zip/CPP/include_windows/windows.h +194 -0
  583. data/ext/p7zip/CPP/myWindows/StdAfx.h +124 -0
  584. data/ext/p7zip/CPP/myWindows/config.h +67 -0
  585. data/ext/p7zip/CPP/myWindows/initguid.h +4 -0
  586. data/ext/p7zip/CPP/myWindows/makefile +21 -0
  587. data/ext/p7zip/CPP/myWindows/makefile.depend +32 -0
  588. data/ext/p7zip/CPP/myWindows/makefile.list +28 -0
  589. data/ext/p7zip/CPP/myWindows/myAddExeFlag.cpp +20 -0
  590. data/ext/p7zip/CPP/myWindows/myGetTickCount.cpp +8 -0
  591. data/ext/p7zip/CPP/myWindows/myPrivate.h +17 -0
  592. data/ext/p7zip/CPP/myWindows/mySplitCommandLine.cpp +82 -0
  593. data/ext/p7zip/CPP/myWindows/test_emul.cpp +745 -0
  594. data/ext/p7zip/CPP/myWindows/wine_GetXXXDefaultLangID.cpp +741 -0
  595. data/ext/p7zip/CPP/myWindows/wine_date_and_time.cpp +434 -0
  596. data/ext/p7zip/ChangeLog +914 -0
  597. data/ext/p7zip/DOCS/7zC.txt +194 -0
  598. data/ext/p7zip/DOCS/7zFormat.txt +469 -0
  599. data/ext/p7zip/DOCS/License.txt +52 -0
  600. data/ext/p7zip/DOCS/MANUAL/commands/add.htm +87 -0
  601. data/ext/p7zip/DOCS/MANUAL/commands/bench.htm +79 -0
  602. data/ext/p7zip/DOCS/MANUAL/commands/delete.htm +59 -0
  603. data/ext/p7zip/DOCS/MANUAL/commands/extract.htm +91 -0
  604. data/ext/p7zip/DOCS/MANUAL/commands/extract_full.htm +68 -0
  605. data/ext/p7zip/DOCS/MANUAL/commands/index.htm +33 -0
  606. data/ext/p7zip/DOCS/MANUAL/commands/list.htm +77 -0
  607. data/ext/p7zip/DOCS/MANUAL/commands/style.css +232 -0
  608. data/ext/p7zip/DOCS/MANUAL/commands/test.htm +46 -0
  609. data/ext/p7zip/DOCS/MANUAL/commands/update.htm +66 -0
  610. data/ext/p7zip/DOCS/MANUAL/exit_codes.htm +27 -0
  611. data/ext/p7zip/DOCS/MANUAL/index.htm +29 -0
  612. data/ext/p7zip/DOCS/MANUAL/style.css +232 -0
  613. data/ext/p7zip/DOCS/MANUAL/switches/ar_exclude.htm +56 -0
  614. data/ext/p7zip/DOCS/MANUAL/switches/ar_include.htm +83 -0
  615. data/ext/p7zip/DOCS/MANUAL/switches/ar_no.htm +52 -0
  616. data/ext/p7zip/DOCS/MANUAL/switches/charset.htm +49 -0
  617. data/ext/p7zip/DOCS/MANUAL/switches/exclude.htm +60 -0
  618. data/ext/p7zip/DOCS/MANUAL/switches/include.htm +87 -0
  619. data/ext/p7zip/DOCS/MANUAL/switches/index.htm +64 -0
  620. data/ext/p7zip/DOCS/MANUAL/switches/large_pages.htm +50 -0
  621. data/ext/p7zip/DOCS/MANUAL/switches/list_tech.htm +36 -0
  622. data/ext/p7zip/DOCS/MANUAL/switches/method.htm +625 -0
  623. data/ext/p7zip/DOCS/MANUAL/switches/output_dir.htm +53 -0
  624. data/ext/p7zip/DOCS/MANUAL/switches/overwrite.htm +56 -0
  625. data/ext/p7zip/DOCS/MANUAL/switches/password.htm +54 -0
  626. data/ext/p7zip/DOCS/MANUAL/switches/recurse.htm +83 -0
  627. data/ext/p7zip/DOCS/MANUAL/switches/sfx.htm +156 -0
  628. data/ext/p7zip/DOCS/MANUAL/switches/ssc.htm +50 -0
  629. data/ext/p7zip/DOCS/MANUAL/switches/stdin.htm +55 -0
  630. data/ext/p7zip/DOCS/MANUAL/switches/stdout.htm +50 -0
  631. data/ext/p7zip/DOCS/MANUAL/switches/stop_switch.htm +31 -0
  632. data/ext/p7zip/DOCS/MANUAL/switches/style.css +232 -0
  633. data/ext/p7zip/DOCS/MANUAL/switches/type.htm +83 -0
  634. data/ext/p7zip/DOCS/MANUAL/switches/update.htm +176 -0
  635. data/ext/p7zip/DOCS/MANUAL/switches/volume.htm +49 -0
  636. data/ext/p7zip/DOCS/MANUAL/switches/working_dir.htm +55 -0
  637. data/ext/p7zip/DOCS/MANUAL/switches/yes.htm +48 -0
  638. data/ext/p7zip/DOCS/MANUAL/syntax.htm +120 -0
  639. data/ext/p7zip/DOCS/Methods.txt +152 -0
  640. data/ext/p7zip/DOCS/copying.txt +504 -0
  641. data/ext/p7zip/DOCS/history.txt +456 -0
  642. data/ext/p7zip/DOCS/lzma.txt +598 -0
  643. data/ext/p7zip/DOCS/readme.txt +181 -0
  644. data/ext/p7zip/DOCS/unRarLicense.txt +41 -0
  645. data/ext/p7zip/README +358 -0
  646. data/ext/p7zip/TODO +39 -0
  647. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/ChangeLog +41 -0
  648. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/readme +21 -0
  649. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/readme.u7z +30 -0
  650. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/u7z +133 -0
  651. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/README +21 -0
  652. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/check/check.sh +117 -0
  653. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/check/files.tar +0 -0
  654. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/man1/p7zip.1 +33 -0
  655. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/p7zip +144 -0
  656. data/ext/p7zip/contrib/qnx630sp3/qnx630sp3-shared +14 -0
  657. data/ext/p7zip/contrib/qnx630sp3/qnx630sp3-static +10 -0
  658. data/ext/p7zip/extconf.rb +101 -0
  659. data/ext/p7zip/install.sh +206 -0
  660. data/ext/p7zip/install_local_context_menu.sh +18 -0
  661. data/ext/p7zip/integration_context_menu.txt +51 -0
  662. data/ext/p7zip/makefile +181 -0
  663. data/ext/p7zip/makefile.aix_gcc +22 -0
  664. data/ext/p7zip/makefile.beos +18 -0
  665. data/ext/p7zip/makefile.crc32 +8 -0
  666. data/ext/p7zip/makefile.cygwin +20 -0
  667. data/ext/p7zip/makefile.cygwin_asm +21 -0
  668. data/ext/p7zip/makefile.djgpp_old +21 -0
  669. data/ext/p7zip/makefile.djgpp_watt +47 -0
  670. data/ext/p7zip/makefile.freebsd5 +20 -0
  671. data/ext/p7zip/makefile.freebsd6 +20 -0
  672. data/ext/p7zip/makefile.glb +39 -0
  673. data/ext/p7zip/makefile.gprof +18 -0
  674. data/ext/p7zip/makefile.hpux-acc +17 -0
  675. data/ext/p7zip/makefile.hpux-acc_64 +19 -0
  676. data/ext/p7zip/makefile.hpux-gcc +21 -0
  677. data/ext/p7zip/makefile.linux_amd64 +22 -0
  678. data/ext/p7zip/makefile.linux_amd64_asm +24 -0
  679. data/ext/p7zip/makefile.linux_amd64_asm_icc +27 -0
  680. data/ext/p7zip/makefile.linux_any_cpu +22 -0
  681. data/ext/p7zip/makefile.linux_any_cpu_gcc_4.X +24 -0
  682. data/ext/p7zip/makefile.linux_clang_amd64 +22 -0
  683. data/ext/p7zip/makefile.linux_cross_arm +22 -0
  684. data/ext/p7zip/makefile.linux_gcc_2.95_no_need_for_libstdc +20 -0
  685. data/ext/p7zip/makefile.linux_other +23 -0
  686. data/ext/p7zip/makefile.linux_s390x +23 -0
  687. data/ext/p7zip/makefile.linux_x86_asm_gcc_4.X +26 -0
  688. data/ext/p7zip/makefile.linux_x86_asm_gcc_4.X_fltk +26 -0
  689. data/ext/p7zip/makefile.linux_x86_asm_gcc_mudflap_4.X +26 -0
  690. data/ext/p7zip/makefile.linux_x86_asm_icc +25 -0
  691. data/ext/p7zip/makefile.linux_x86_icc +24 -0
  692. data/ext/p7zip/makefile.machine_base +22 -0
  693. data/ext/p7zip/makefile.macosx_32bits +20 -0
  694. data/ext/p7zip/makefile.macosx_32bits_asm +23 -0
  695. data/ext/p7zip/makefile.macosx_32bits_ppc +21 -0
  696. data/ext/p7zip/makefile.macosx_64bits +20 -0
  697. data/ext/p7zip/makefile.macosx_llvm_64bits +20 -0
  698. data/ext/p7zip/makefile.netbsd +21 -0
  699. data/ext/p7zip/makefile.netware_asm_gcc_3.X +41 -0
  700. data/ext/p7zip/makefile.oldmake +174 -0
  701. data/ext/p7zip/makefile.openbsd +20 -0
  702. data/ext/p7zip/makefile.openbsd_no_port +20 -0
  703. data/ext/p7zip/makefile.qnx_shared.bin +21 -0
  704. data/ext/p7zip/makefile.qnx_static +21 -0
  705. data/ext/p7zip/makefile.rules +661 -0
  706. data/ext/p7zip/makefile.solaris_sparc_CC_32 +21 -0
  707. data/ext/p7zip/makefile.solaris_sparc_CC_64 +23 -0
  708. data/ext/p7zip/makefile.solaris_sparc_gcc +21 -0
  709. data/ext/p7zip/makefile.solaris_x86 +19 -0
  710. data/ext/p7zip/makefile.tru64 +22 -0
  711. data/ext/seven_zip_ruby/extconf.rb +127 -0
  712. data/ext/seven_zip_ruby/guid_defs.h +29 -0
  713. data/ext/seven_zip_ruby/mutex.h +10 -0
  714. data/ext/seven_zip_ruby/posix/mutex.h +94 -0
  715. data/ext/seven_zip_ruby/seven_zip_archive.cpp +1876 -0
  716. data/ext/seven_zip_ruby/seven_zip_archive.h +548 -0
  717. data/ext/seven_zip_ruby/util_common.cpp +28 -0
  718. data/ext/seven_zip_ruby/util_common.h +515 -0
  719. data/ext/seven_zip_ruby/utils.cpp +575 -0
  720. data/ext/seven_zip_ruby/utils.h +25 -0
  721. data/ext/seven_zip_ruby/win32/mutex.h +130 -0
  722. data/lib/seven_zip_ruby/7z.dll +0 -0
  723. data/lib/seven_zip_ruby/7z.sfx +0 -0
  724. data/lib/seven_zip_ruby/7z64.dll +0 -0
  725. data/lib/seven_zip_ruby/7zCon.sfx +0 -0
  726. data/lib/seven_zip_ruby/archive_info.rb +21 -0
  727. data/lib/seven_zip_ruby/entry_info.rb +46 -0
  728. data/lib/seven_zip_ruby/exception.rb +10 -0
  729. data/lib/seven_zip_ruby/seven_zip_reader.rb +537 -0
  730. data/lib/seven_zip_ruby/seven_zip_writer.rb +502 -0
  731. data/lib/seven_zip_ruby/update_info.rb +116 -0
  732. data/lib/seven_zip_ruby/version.rb +3 -0
  733. data/lib/seven_zip_ruby.rb +34 -0
  734. data/seven-zip.gemspec +35 -0
  735. data/spec/seven_zip.7z +0 -0
  736. data/spec/seven_zip_password.7z +0 -0
  737. data/spec/seven_zip_ruby_spec.rb +703 -0
  738. data/spec/seven_zip_ruby_spec_helper.rb +144 -0
  739. 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
+