seven_zip_ruby_am 1.2.5.1

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