seven_zip_ruby 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (732) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +25 -0
  3. data/.travis.yml +10 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +39 -0
  6. data/README.md +176 -0
  7. data/Rakefile +47 -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/depend +5 -0
  709. data/ext/seven_zip_ruby/extconf.rb +131 -0
  710. data/ext/seven_zip_ruby/guid_defs.h +29 -0
  711. data/ext/seven_zip_ruby/mutex.h +10 -0
  712. data/ext/seven_zip_ruby/posix/mutex.h +94 -0
  713. data/ext/seven_zip_ruby/seven_zip_archive.cpp +1614 -0
  714. data/ext/seven_zip_ruby/seven_zip_archive.h +515 -0
  715. data/ext/seven_zip_ruby/util_common.h +444 -0
  716. data/ext/seven_zip_ruby/utils.cpp +576 -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 +16 -0
  720. data/lib/seven_zip_ruby/7z.dll +0 -0
  721. data/lib/seven_zip_ruby/7z64.dll +0 -0
  722. data/lib/seven_zip_ruby/archive_info.rb +21 -0
  723. data/lib/seven_zip_ruby/entry_info.rb +45 -0
  724. data/lib/seven_zip_ruby/exception.rb +7 -0
  725. data/lib/seven_zip_ruby/seven_zip_reader.rb +180 -0
  726. data/lib/seven_zip_ruby/seven_zip_writer.rb +143 -0
  727. data/lib/seven_zip_ruby/update_info.rb +116 -0
  728. data/lib/seven_zip_ruby/version.rb +3 -0
  729. data/seven_zip_ruby.gemspec +26 -0
  730. data/spec/seven_zip_ruby_spec.rb +490 -0
  731. data/spec/seven_zip_ruby_spec_helper.rb +122 -0
  732. metadata +820 -0
@@ -0,0 +1,21 @@
1
+
2
+ OPTFLAGS=-fast
3
+
4
+ ALLFLAGS=${OPTFLAGS} -s -mt \
5
+ -DHAVE_LONG_LONG \
6
+ -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \
7
+ -DENV_UNIX \
8
+ -DNDEBUG -D_REENTRANT \
9
+ $(LOCAL_FLAGS)
10
+
11
+ CXX=CC $(ALLFLAGS)
12
+ CC=cc $(ALLFLAGS)
13
+ CC_SHARED=-KPIC
14
+ LINK_SHARED=-KPIC -G
15
+
16
+ # -lCrun : standard C++ library (for new/delete)
17
+ LOCAL_LIBS=-lpthread -lCrun
18
+ LOCAL_LIBS_DLL=$(LOCAL_LIBS) -ldl
19
+
20
+ OBJ_CRC32=$(OBJ_CRC32_C)
21
+
@@ -0,0 +1,23 @@
1
+
2
+ #-fast -xarch=v9 => 64 bits
3
+ # use "isainfo -v" to set the flag "-xarch"
4
+
5
+ OPTFLAGS=-fast -xarch=v9
6
+ ALLFLAGS=${OPTFLAGS} -s -mt \
7
+ -DHAVE_LONG_LONG \
8
+ -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \
9
+ -DENV_UNIX \
10
+ -DNDEBUG -D_REENTRANT \
11
+ $(LOCAL_FLAGS)
12
+
13
+ CXX=CC $(ALLFLAGS)
14
+ CC=cc $(ALLFLAGS)
15
+ CC_SHARED=-KPIC
16
+ LINK_SHARED=-KPIC -G
17
+
18
+ # -lCrun : standard C++ library (for new/delete)
19
+ LOCAL_LIBS=-lpthread -lCrun
20
+ LOCAL_LIBS_DLL=$(LOCAL_LIBS) -ldl
21
+
22
+ OBJ_CRC32=$(OBJ_CRC32_C)
23
+
@@ -0,0 +1,21 @@
1
+
2
+ OPTFLAGS=-O
3
+
4
+ ALLFLAGS=${OPTFLAGS} -s \
5
+ -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \
6
+ -DENV_UNIX \
7
+ -DNDEBUG -D_REENTRANT \
8
+ $(LOCAL_FLAGS)
9
+
10
+ #CXX=/opt/sfw/bin/g++ $(ALLFLAGS)
11
+ #CC=/opt/sfw/bin/gcc $(ALLFLAGS)
12
+ CXX=g++ $(ALLFLAGS)
13
+ CC=gcc $(ALLFLAGS)
14
+ CC_SHARED=-fPIC
15
+ LINK_SHARED=-fPIC -shared
16
+
17
+ LOCAL_LIBS=-lpthread -lrt
18
+ LOCAL_LIBS_DLL=$(LOCAL_LIBS) -ldl
19
+
20
+ OBJ_CRC32=$(OBJ_CRC32_C)
21
+
@@ -0,0 +1,19 @@
1
+
2
+ OPTFLAGS=-O
3
+
4
+ ALLFLAGS=${OPTFLAGS} -s \
5
+ -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \
6
+ -DENV_UNIX \
7
+ -DNDEBUG -D_REENTRANT \
8
+ $(LOCAL_FLAGS)
9
+
10
+ CXX=g++ $(ALLFLAGS)
11
+ CC=gcc $(ALLFLAGS)
12
+ CC_SHARED=-fPIC
13
+ LINK_SHARED=-fPIC -shared
14
+
15
+ LOCAL_LIBS=-lpthread -lrt
16
+ LOCAL_LIBS_DLL=$(LOCAL_LIBS) -ldl
17
+
18
+ OBJ_CRC32=$(OBJ_CRC32_C)
19
+
@@ -0,0 +1,22 @@
1
+ #
2
+ # makefile for Tru64
3
+ # tested with OSF 5.1 and g++ 3.4.2
4
+ #
5
+
6
+ OPTFLAGS=-O
7
+
8
+ ALLFLAGS=${OPTFLAGS} -s \
9
+ -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \
10
+ -DNDEBUG -D_REENTRANT -DENV_UNIX \
11
+ $(LOCAL_FLAGS)
12
+
13
+ CXX=g++ $(ALLFLAGS)
14
+ CC=gcc $(ALLFLAGS)
15
+ CC_SHARED=-fPIC
16
+ LINK_SHARED=-fPIC -shared
17
+
18
+ LOCAL_LIBS=-lpthread
19
+ LOCAL_LIBS_DLL=$(LOCAL_LIBS) -ldl
20
+
21
+ OBJ_CRC32=$(OBJ_CRC32_C)
22
+
@@ -0,0 +1,5 @@
1
+ seven_zip_archive.o: seven_zip_archive.cpp seven_zip_archive.h guid_defs.h ../CPP/7zip/IStream.h ../CPP/7zip/../Common/MyUnknown.h ../CPP/7zip/../Common/Types.h ../CPP/7zip/../Common/../../C/Types.h ../CPP/7zip/IDecl.h ../CPP/Common/MyCom.h ../CPP/Common/MyWindows.h ../CPP/Windows/PropVariant.h ../CPP/Windows/../Common/MyWindows.h ../CPP/Windows/../Common/Types.h ../CPP/7zip/Archive/IArchive.h ../CPP/7zip/Archive/../IProgress.h ../CPP/7zip/Archive/../../Common/MyUnknown.h ../CPP/7zip/Archive/../../Common/Types.h ../CPP/7zip/Archive/../IDecl.h ../CPP/7zip/Archive/../IStream.h ../CPP/7zip/Archive/../PropID.h ../CPP/7zip/IPassword.h mutex.h win32/mutex.h utils.h util_common.h
2
+ utils.o: utils.cpp utils.h ../CPP/Windows/PropVariant.h ../CPP/Windows/../Common/MyWindows.h ../CPP/Windows/../Common/Types.h ../CPP/Windows/../Common/../../C/Types.h
3
+
4
+ seven_zip_archive.obj: seven_zip_archive.cpp seven_zip_archive.h guid_defs.h ..\CPP\7zip\IStream.h ..\CPP\7zip\..\Common\MyUnknown.h ..\CPP\7zip\..\Common\Types.h ..\CPP\7zip\..\Common\..\..\C\Types.h ..\CPP\7zip\IDecl.h ..\CPP\Common\MyCom.h ..\CPP\Common\MyWindows.h ..\CPP\Windows\PropVariant.h ..\CPP\Windows\..\Common\MyWindows.h ..\CPP\Windows\..\Common\Types.h ..\CPP\7zip\Archive\IArchive.h ..\CPP\7zip\Archive\..\IProgress.h ..\CPP\7zip\Archive\..\..\Common\MyUnknown.h ..\CPP\7zip\Archive\..\..\Common\Types.h ..\CPP\7zip\Archive\..\IDecl.h ..\CPP\7zip\Archive\..\IStream.h ..\CPP\7zip\Archive\..\PropID.h ..\CPP\7zip\IPassword.h mutex.h win32\mutex.h utils.h util_common.h
5
+ utils.obj: utils.cpp utils.h ..\CPP\Windows\PropVariant.h ..\CPP\Windows\..\Common\MyWindows.h ..\CPP\Windows\..\Common\Types.h ..\CPP\Windows\..\Common\..\..\C\Types.h
@@ -0,0 +1,131 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require("mkmf")
4
+ require("rbconfig")
5
+
6
+
7
+ def create_p7zip_makefile(type)
8
+ config = RbConfig::CONFIG
9
+
10
+ allflags = config["ARCH_FLAG"] + ' -O -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_REENTRANT -DENV_UNIX '
11
+ case(type)
12
+ when :macosx
13
+ allflags += ' -DENV_MACOSX '
14
+ cc_shared = nil
15
+ link_shared = "-bundle"
16
+ local_libs = "-framework CoreFoundation"
17
+ local_libs_dll = '$(LOCAL_LIBS)'
18
+ when :linux
19
+ allflags += ' -DNDEBUG -D_7ZIP_LARGE_PAGES -pipe -s '
20
+ cc_shared = "-fPIC"
21
+ link_shared = "-fPIC -shared"
22
+ local_libs = "-lpthread"
23
+ local_libs_dll = '$(LOCAL_LIBS) -ldl'
24
+ end
25
+
26
+ cc_shared_content = (cc_shared ? "CC_SHARED=#{cc_shared}" : "")
27
+
28
+ makefile_content = <<"EOS"
29
+ ALLFLAGS=#{allflags} $(LOCAL_FLAGS)
30
+ CXX=#{config['CXX']} $(ALLFLAGS)
31
+ CC=#{config['CC']} $(ALLFLAGS)
32
+ #{cc_shared_content}
33
+ LINK_SHARED=#{link_shared}
34
+
35
+ LOCAL_LIBS=#{local_libs}
36
+ LOCAL_LIBS_DLL=#{local_libs_dll}
37
+ OBJ_CRC32=$(OBJ_CRC32_C)
38
+ EOS
39
+
40
+ File.open("makefile.machine", "w") do |file|
41
+ file.puts makefile_content
42
+ end
43
+ end
44
+
45
+ def check_ostype
46
+ if (RUBY_PLATFORM.include?("darwin"))
47
+ return :macosx
48
+ elsif (RUBY_PLATFORM.include?("linux"))
49
+ return :linux
50
+ else
51
+ raise "Unsupported platform"
52
+ end
53
+ end
54
+
55
+ def sample_cpp_source
56
+ # Check the following features.
57
+ # - lambda
58
+ # - std::function
59
+ # - std::array
60
+ return <<'EOS'
61
+ #include <functional>
62
+ #include <algorithm>
63
+ #include <array>
64
+ #include <iostream>
65
+
66
+ #include <ruby.h>
67
+ #include <ruby/thread.h>
68
+
69
+ void test()
70
+ {
71
+ int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
72
+ const int size = sizeof(array)/sizeof(array[0]);
73
+ std::array<int, size> var_list;
74
+
75
+ std::function<int (int, int)> convert = [&](int arg1, int arg2){
76
+ return arg1 * arg2;
77
+ };
78
+
79
+ const int value = 10;
80
+
81
+ std::transform(array, array + size, var_list.begin(), [&](int arg){
82
+ return convert(arg, value);
83
+ });
84
+
85
+ std::for_each(var_list.begin(), var_list.end(), [](int num){ std::cout << num << std::endl; });
86
+ }
87
+ EOS
88
+ end
89
+
90
+ def main
91
+ if (RUBY_PLATFORM.include?("mswin"))
92
+ # mswin32
93
+ $LIBS = "oleaut32.lib"
94
+ $CPPFLAGS = "/I.. /EHsc /DNDEBUG"
95
+ elsif (RUBY_PLATFORM.include?("mingw"))
96
+ # MinGW
97
+ $LIBS = "-loleaut32 -static-libgcc -static-libstdc++"
98
+
99
+ cpp0x_flag = [ "", "-std=c++11", "-std=gnu++11", "-std=c++0x", "-std=gnu++0x" ].find do |opt|
100
+ next try_compile(sample_cpp_source, "#{opt} -x c++ ")
101
+ end
102
+ raise "C++11 is not supported by the compiler." unless (cpp0x_flag)
103
+
104
+ $CPPFLAGS = "-I.. #{cpp0x_flag} -DNDEBUG "
105
+ else
106
+ cpp0x_flag = [ "", "-std=c++11", "-std=gnu++11", "-std=c++0x", "-std=gnu++0x" ].find do |opt|
107
+ next (try_compile(sample_cpp_source, "#{opt} -x c++ ") || try_compile(sample_cpp_source, "#{opt} "))
108
+ end
109
+ raise "C++11 is not supported by the compiler." unless (cpp0x_flag)
110
+
111
+ $CPPFLAGS = "-I.. -I../CPP/include_windows -I../CPP #{cpp0x_flag} -DNDEBUG "
112
+
113
+
114
+ ostype = check_ostype
115
+
116
+ Dir.chdir(File.expand_path("../../p7zip", __FILE__)) do
117
+ create_p7zip_makefile(ostype)
118
+
119
+ make_success = system("make 7zso")
120
+ raise "Failed to make p7zip" unless (make_success)
121
+
122
+ FileUtils.mv("./bin/7z.so", "../../lib/seven_zip_ruby/7z.so")
123
+ system("make clean_7zso")
124
+ end
125
+ end
126
+
127
+ create_makefile("seven_zip_ruby/seven_zip_archive")
128
+ end
129
+
130
+ main
131
+
@@ -0,0 +1,29 @@
1
+ #ifndef GUID_DEFS_H__
2
+ #define GUID_DEFS_H__
3
+
4
+ #include <CPP/7zip/IStream.h>
5
+
6
+ #ifdef _WIN32
7
+ DEFINE_GUID(IID_IUnknown, 0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
8
+ #endif
9
+
10
+
11
+ #define CLSID_FORMAT(name, value) \
12
+ DEFINE_GUID(CLSID_CFormat ## name, 0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, value, 0x00, 0x00)
13
+
14
+ CLSID_FORMAT(Zip, 0x01);
15
+ CLSID_FORMAT(BZip2, 0x02);
16
+ CLSID_FORMAT(Rar, 0x03);
17
+ CLSID_FORMAT(Z, 0x05);
18
+ CLSID_FORMAT(Lzh, 0x06);
19
+ CLSID_FORMAT(7z, 0x07);
20
+ CLSID_FORMAT(Cab, 0x08);
21
+ CLSID_FORMAT(Lzma,0x0A);
22
+
23
+ CLSID_FORMAT(Wim, 0xE6);
24
+ CLSID_FORMAT(Iso, 0xE7);
25
+ CLSID_FORMAT(Tar, 0xEE);
26
+ CLSID_FORMAT(GZip,0xEF);
27
+
28
+
29
+ #endif
@@ -0,0 +1,10 @@
1
+ #ifndef MUTEX_H__
2
+ #define MUTEX_H__
3
+
4
+ #ifdef _WIN32
5
+ #include "win32/mutex.h"
6
+ #else
7
+ #include "posix/mutex.h"
8
+ #endif
9
+
10
+ #endif
@@ -0,0 +1,94 @@
1
+ #ifndef MUTEX_POSIX_H__
2
+ #define MUTEX_POSIX_H__
3
+
4
+ #include <pthread.h>
5
+
6
+ namespace SevenZip
7
+ {
8
+
9
+ class ConditionVariable;
10
+
11
+ class Mutex
12
+ {
13
+ friend class ConditionVariable;
14
+
15
+ public:
16
+ Mutex(const char *name = "No Name")
17
+ : m_name(name)
18
+ {
19
+ pthread_mutex_init(&m_mutex, NULL);
20
+ }
21
+
22
+ ~Mutex()
23
+ {
24
+ pthread_mutex_destroy(&m_mutex);
25
+ }
26
+
27
+ void lock()
28
+ {
29
+ pthread_mutex_lock(&m_mutex);
30
+ }
31
+
32
+ void unlock()
33
+ {
34
+ pthread_mutex_unlock(&m_mutex);
35
+ }
36
+
37
+ private:
38
+ pthread_mutex_t m_mutex;
39
+ const char *m_name;
40
+ };
41
+
42
+ class MutexLocker
43
+ {
44
+ public:
45
+ MutexLocker(Mutex *mutex)
46
+ : m_mutex(mutex)
47
+ {
48
+ m_mutex->lock();
49
+ }
50
+
51
+ ~MutexLocker()
52
+ {
53
+ m_mutex->unlock();
54
+ }
55
+
56
+ private:
57
+ Mutex *m_mutex;
58
+ };
59
+
60
+ class ConditionVariable
61
+ {
62
+ public:
63
+ ConditionVariable()
64
+ {
65
+ pthread_cond_init(&m_cond_var, NULL);
66
+ }
67
+
68
+ ~ConditionVariable()
69
+ {
70
+ pthread_cond_destroy(&m_cond_var);
71
+ }
72
+
73
+ void wait(Mutex *mutex)
74
+ {
75
+ pthread_cond_wait(&m_cond_var, &(mutex->m_mutex));
76
+ }
77
+
78
+ void signal()
79
+ {
80
+ pthread_cond_signal(&m_cond_var);
81
+ }
82
+
83
+ void broadcast()
84
+ {
85
+ pthread_cond_broadcast(&m_cond_var);
86
+ }
87
+
88
+ private:
89
+ pthread_cond_t m_cond_var;
90
+ };
91
+
92
+ }
93
+
94
+ #endif
@@ -0,0 +1,1614 @@
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
+
17
+ ////////////////////////////////////////////////////////////////
18
+ namespace SevenZip
19
+ {
20
+
21
+
22
+ typedef UINT32 (WINAPI * CreateObjectFunc)(
23
+ const GUID *clsID,
24
+ const GUID *interfaceID,
25
+ void **outObject);
26
+
27
+ static CreateObjectFunc CreateObject;
28
+ static VALUE gSevenZipModule = Qnil;
29
+
30
+ #ifdef _WIN32
31
+ static HMODULE gSevenZipHandle;
32
+ #else
33
+ static void *gSevenZipHandle;
34
+ #endif
35
+
36
+ ////////////////////////////////////////////////////////////////
37
+ ArchiveBase::RubyAction ArchiveBase::ACTION_END = [](){};
38
+
39
+ ArchiveBase::ArchiveBase()
40
+ : m_action_tuple(nullptr),
41
+ m_event_loop_running(false)
42
+ {
43
+ m_action_result.clear();
44
+ }
45
+
46
+ ArchiveBase::~ArchiveBase()
47
+ {
48
+ }
49
+
50
+ void ArchiveBase::rubyEventLoop()
51
+ {
52
+ m_action_mutex.lock();
53
+ while(m_event_loop_running){
54
+ m_action_mutex.unlock();
55
+
56
+ RubyActionTuple end_tuple = std::make_pair(&ACTION_END, false);
57
+ RubyActionTuple *action_tuple = nullptr;
58
+
59
+ bool success = runNativeFuncProtect([&](){
60
+ MutexLocker locker(&m_action_mutex);
61
+ while(!m_action_tuple){
62
+ m_action_cond_var.wait(&m_action_mutex);
63
+ }
64
+ action_tuple = m_action_tuple;
65
+ }, [&](){
66
+ MutexLocker locker(&m_action_mutex);
67
+ if (m_event_loop_running){
68
+ m_action_tuple = &end_tuple;
69
+ m_action_cond_var.broadcast();
70
+ }
71
+ });
72
+ if (!success){
73
+ MutexLocker locker(&m_action_mutex);
74
+ action_tuple = &end_tuple;
75
+ }
76
+
77
+ RubyAction *action = action_tuple->first;
78
+ bool event_loop_running = m_event_loop_running;
79
+ if (action == &ACTION_END){
80
+ action_tuple->second = true;
81
+ event_loop_running = false;
82
+ }else if (m_action_result.isError()){
83
+ action_tuple->second = false;
84
+ }else{
85
+ int status = 0;
86
+ rb_protect(runProtectedRubyAction, reinterpret_cast<VALUE>(action), &status);
87
+ action_tuple->second = (status == 0);
88
+
89
+ if (status && !m_action_result.isError()){
90
+ m_action_result.status = status;
91
+ m_action_result.exception = rb_gv_get("$!");
92
+ event_loop_running = false;
93
+ }
94
+ }
95
+
96
+ m_action_mutex.lock();
97
+ m_event_loop_running = event_loop_running;
98
+ m_action_tuple = nullptr;
99
+ m_action_cond_var.broadcast();
100
+ }
101
+ m_action_mutex.unlock();
102
+ }
103
+
104
+ VALUE ArchiveBase::runProtectedRubyAction(VALUE p)
105
+ {
106
+ RubyAction *action = reinterpret_cast<RubyAction*>(p);
107
+ (*action)();
108
+ return Qnil;
109
+ }
110
+
111
+ VALUE ArchiveBase::staticRubyEventLoop(void *p)
112
+ {
113
+ ArchiveBase *self = reinterpret_cast<ArchiveBase*>(p);
114
+ self->rubyEventLoop();
115
+ return Qnil;
116
+ }
117
+
118
+ void ArchiveBase::startEventLoopThread()
119
+ {
120
+ MutexLocker locker(&m_action_mutex);
121
+ if (m_event_loop_running){
122
+ return;
123
+ }
124
+ m_event_loop_running = true;
125
+ rb_thread_create(RUBY_METHOD_FUNC(staticRubyEventLoop), this);
126
+ }
127
+
128
+ void ArchiveBase::cancelAction(void *p)
129
+ {
130
+ if (!p){
131
+ return;
132
+ }
133
+
134
+ ArchiveBase *self = reinterpret_cast<ArchiveBase*>(p);
135
+ self->cancelAction();
136
+ }
137
+
138
+ void ArchiveBase::cancelAction()
139
+ {
140
+ setErrorState();
141
+ }
142
+
143
+ bool ArchiveBase::runRubyActionImpl(RubyAction *action)
144
+ {
145
+ MutexLocker locker(&m_action_mutex);
146
+
147
+ if (!action || !m_event_loop_running){
148
+ return false;
149
+ }
150
+
151
+ RubyActionTuple tuple = std::make_pair(action, false);
152
+
153
+ while(m_action_tuple && m_event_loop_running){
154
+ m_action_cond_var.wait(&m_action_mutex);
155
+ }
156
+ if (!m_event_loop_running){
157
+ return false;
158
+ }
159
+
160
+ m_action_tuple = &tuple;
161
+
162
+ m_action_cond_var.broadcast();
163
+
164
+ while(m_action_tuple == &tuple && m_event_loop_running){
165
+ m_action_cond_var.wait(&m_action_mutex);
166
+ }
167
+
168
+ return (tuple.second && m_event_loop_running);
169
+ }
170
+
171
+ bool ArchiveBase::runRubyAction(RubyAction action)
172
+ {
173
+ return runRubyActionImpl(&action);
174
+ }
175
+
176
+ void ArchiveBase::finishRubyAction()
177
+ {
178
+ runRubyActionImpl(&ACTION_END);
179
+ }
180
+
181
+ void ArchiveBase::mark()
182
+ {
183
+ m_action_result.mark();
184
+ }
185
+
186
+ void ArchiveBase::prepareAction()
187
+ {
188
+ m_action_result.clear();
189
+ }
190
+
191
+ void ArchiveBase::terminateEventLoopThread()
192
+ {
193
+ runNativeFuncProtect([&](){
194
+ finishRubyAction();
195
+ }, [&](){
196
+ // Nothing to do.
197
+ });
198
+ }
199
+
200
+ ////////////////////////////////////////////////////////////////
201
+ ArchiveReader::ArchiveReader(const GUID &format_guid)
202
+ : m_rb_callback_proc(Qnil), m_rb_out_stream(Qnil), m_rb_in_stream(Qnil),
203
+ m_processing_index((UInt32)(Int32)-1),
204
+ m_format_guid(format_guid),
205
+ m_password_specified(false),
206
+ m_state(STATE_INITIAL)
207
+ {
208
+ IInArchive *archive = 0;
209
+ HRESULT ret = CreateObject(&m_format_guid, &IID_IInArchive, reinterpret_cast<void **>(&archive));
210
+ if (ret != S_OK){
211
+ m_state = STATE_ERROR;
212
+ return;
213
+ }
214
+
215
+ m_in_archive.Attach(archive);
216
+ }
217
+
218
+ void ArchiveReader::setProcessingStream(VALUE stream, UInt32 index, Int32 askExtractMode)
219
+ {
220
+ m_rb_out_stream = stream;
221
+ m_processing_index = index;
222
+ m_ask_extract_mode = askExtractMode;
223
+ }
224
+
225
+ void ArchiveReader::getProcessingStream(VALUE *stream, UInt32 *index, Int32 *askExtractMode)
226
+ {
227
+ if (stream){
228
+ *stream = m_rb_out_stream;
229
+ }
230
+ if (index){
231
+ *index = m_processing_index;
232
+ }
233
+ if (askExtractMode){
234
+ *askExtractMode = m_ask_extract_mode;
235
+ }
236
+ }
237
+
238
+ void ArchiveReader::clearProcessingStream()
239
+ {
240
+ setProcessingStream(Qnil, (UInt32)(Int32)-1, 0);
241
+ }
242
+
243
+ void ArchiveReader::setOperationResult(UInt32 index, Int32 result)
244
+ {
245
+ if (index < m_test_result.size()){
246
+ m_test_result[index] = result;
247
+ }
248
+ }
249
+
250
+ VALUE ArchiveReader::open(VALUE in_stream, VALUE param)
251
+ {
252
+ checkStateToBeginOperation(STATE_INITIAL);
253
+ prepareAction();
254
+ EventLoopThreadExecuter te(this);
255
+
256
+ m_rb_in_stream = in_stream;
257
+ m_rb_callback_proc = Qnil;
258
+ m_rb_out_stream = Qnil;
259
+ m_rb_entry_info_list.clear();
260
+
261
+ VALUE password = rb_hash_aref(param, ID2SYM(INTERN("password")));
262
+ if (NIL_P(password)){
263
+ m_password_specified = false;
264
+ }else{
265
+ m_password_specified = true;
266
+ m_password = std::string(RSTRING_PTR(password), RSTRING_LEN(password));
267
+ }
268
+
269
+ HRESULT ret = E_FAIL;
270
+ runNativeFunc([&](){
271
+ ArchiveOpenCallback *callback;
272
+ if (m_password_specified){
273
+ callback = new ArchiveOpenCallback(this, m_password);
274
+ }else{
275
+ callback = new ArchiveOpenCallback(this);
276
+ }
277
+
278
+ CMyComPtr<IArchiveOpenCallback> callback_ptr(callback);
279
+
280
+ InStream *stream = new InStream(m_rb_in_stream, this);
281
+ m_in_stream = stream;
282
+ ret = m_in_archive->Open(stream, 0, callback);
283
+ });
284
+
285
+ checkState(STATE_INITIAL, "Open error");
286
+ if (ret != S_OK){
287
+ throw RubyCppUtil::RubyException("Invalid file format. open");
288
+ }
289
+
290
+ m_state = STATE_OPENED;
291
+
292
+ return Qnil;
293
+ }
294
+
295
+ VALUE ArchiveReader::close()
296
+ {
297
+ if (m_state == STATE_CLOSED){
298
+ return Qnil;
299
+ }
300
+
301
+ checkStateToBeginOperation(STATE_OPENED);
302
+ prepareAction();
303
+ EventLoopThreadExecuter te(this);
304
+
305
+ runNativeFunc([&](){
306
+ m_in_archive->Close();
307
+ });
308
+ std::vector<VALUE>().swap(m_rb_entry_info_list);
309
+
310
+ checkState(STATE_OPENED, "Close error");
311
+ m_state = STATE_CLOSED;
312
+
313
+ return Qnil;
314
+ }
315
+
316
+ VALUE ArchiveReader::entryNum()
317
+ {
318
+ checkStateToBeginOperation(STATE_OPENED);
319
+ prepareAction();
320
+ EventLoopThreadExecuter te(this);
321
+
322
+ UInt32 num;
323
+ runNativeFunc([&](){
324
+ HRESULT ret = m_in_archive->GetNumberOfItems(&num);
325
+ if (ret != S_OK){
326
+ num = 0xFFFFFFFF;
327
+ }
328
+ });
329
+
330
+ checkState(STATE_OPENED, "entryNum error");
331
+
332
+ return ULONG2NUM(num);
333
+ }
334
+
335
+ VALUE ArchiveReader::getArchiveProperty()
336
+ {
337
+ checkStateToBeginOperation(STATE_OPENED);
338
+ prepareAction();
339
+ EventLoopThreadExecuter te(this);
340
+
341
+ struct PropIdVarTypePair
342
+ {
343
+ PROPID prop_id;
344
+ VARTYPE vt;
345
+ };
346
+ PropIdVarTypePair list[] = {
347
+ { kpidMethod, VT_BSTR },
348
+ { kpidSolid, VT_BOOL },
349
+ { kpidNumBlocks, VT_UI4 },
350
+ { kpidHeadersSize, VT_UI8 },
351
+ { kpidPhySize, VT_UI8 }
352
+ };
353
+
354
+ const unsigned int size = sizeof(list)/sizeof(list[0]);
355
+
356
+ NWindows::NCOM::CPropVariant variant_list[size];
357
+ runNativeFunc([&](){
358
+ for (unsigned int i=0; i<size; i++){
359
+ HRESULT ret = m_in_archive->GetArchiveProperty(list[i].prop_id, &variant_list[i]);
360
+ if (ret != S_OK || variant_list[i].vt != list[i].vt){
361
+ variant_list[i].Clear();
362
+ }
363
+ }
364
+ });
365
+
366
+ checkState(STATE_OPENED, "getArchiveProperty error");
367
+
368
+ VALUE archive_info = rb_const_get(gSevenZipModule, INTERN("ArchiveInfo"));
369
+ ID new_id = INTERN("new");
370
+ VALUE value_list[size];
371
+ for (unsigned int i=0; i<size; i++){
372
+ value_list[i] = ConvertPropToValue(variant_list[i]);
373
+ }
374
+ return rb_funcall2(archive_info, new_id, size, value_list);
375
+ }
376
+
377
+ VALUE ArchiveReader::getEntryInfo(VALUE index)
378
+ {
379
+ checkStateToBeginOperation(STATE_OPENED);
380
+ prepareAction();
381
+ EventLoopThreadExecuter te(this);
382
+
383
+ fillEntryInfo();
384
+
385
+ checkState(STATE_OPENED, "getEntryInfo error");
386
+
387
+ UInt32 idx = NUM2ULONG(index);
388
+ return entryInfo(idx);
389
+ }
390
+
391
+ VALUE ArchiveReader::entryInfo(UInt32 index)
392
+ {
393
+ if (index >= m_rb_entry_info_list.size()){
394
+ return Qnil;
395
+ }
396
+
397
+ return m_rb_entry_info_list[index];
398
+ }
399
+
400
+ VALUE ArchiveReader::getAllEntryInfo()
401
+ {
402
+ checkStateToBeginOperation(STATE_OPENED);
403
+ prepareAction();
404
+ EventLoopThreadExecuter te(this);
405
+
406
+ fillEntryInfo();
407
+
408
+ checkState(STATE_OPENED, "getAllEntryInfo error");
409
+
410
+ return rb_ary_new4(m_rb_entry_info_list.size(), &m_rb_entry_info_list[0]);
411
+ }
412
+
413
+ VALUE ArchiveReader::setFileAttribute(VALUE path, VALUE attrib)
414
+ {
415
+ #ifdef _WIN32
416
+ BSTR str = ConvertStringToBstr(RSTRING_PTR(path), RSTRING_LEN(path));
417
+ BOOL ret = ::SetFileAttributesW(str, NUM2ULONG(attrib));
418
+ SysFreeString(str);
419
+ return (ret ? Qtrue : Qfalse);
420
+ #else
421
+ // TODO
422
+ return Qtrue;
423
+ #endif
424
+ }
425
+
426
+ VALUE ArchiveReader::extract(VALUE index, VALUE callback_proc)
427
+ {
428
+ checkStateToBeginOperation(STATE_OPENED);
429
+ prepareAction();
430
+ EventLoopThreadExecuter te(this);
431
+
432
+ m_rb_callback_proc = callback_proc;
433
+
434
+ fillEntryInfo();
435
+
436
+ UInt32 i = NUM2ULONG(index);
437
+ HRESULT ret;
438
+ runNativeFunc([&](){
439
+ ArchiveExtractCallback *extract_callback = createArchiveExtractCallback();
440
+ CMyComPtr<IArchiveExtractCallback> callback(extract_callback);
441
+ ret = m_in_archive->Extract(&i, 1, 0, extract_callback);
442
+ });
443
+
444
+ m_rb_callback_proc = Qnil;
445
+
446
+ checkState(STATE_OPENED, "extract error");
447
+ if (ret != S_OK){
448
+ throw RubyCppUtil::RubyException("Invalid file format. extract");
449
+ }
450
+
451
+ return Qnil;
452
+ }
453
+
454
+ VALUE ArchiveReader::extractFiles(VALUE index_list, VALUE callback_proc)
455
+ {
456
+ checkStateToBeginOperation(STATE_OPENED);
457
+ prepareAction();
458
+ EventLoopThreadExecuter te(this);
459
+
460
+ m_rb_callback_proc = callback_proc;
461
+
462
+ fillEntryInfo();
463
+
464
+ std::vector<UInt32> list(RARRAY_LEN(index_list));
465
+ std::transform(RARRAY_PTR(index_list), RARRAY_PTR(index_list) + RARRAY_LEN(index_list),
466
+ list.begin(), [](VALUE num){ return NUM2ULONG(num); });
467
+
468
+ HRESULT ret;
469
+ runNativeFunc([&](){
470
+ ArchiveExtractCallback *extract_callback = createArchiveExtractCallback();
471
+ CMyComPtr<IArchiveExtractCallback> callback(extract_callback);
472
+ ret = m_in_archive->Extract(&list[0], list.size(), 0, extract_callback);
473
+ });
474
+
475
+ m_rb_callback_proc = Qnil;
476
+
477
+ checkState(STATE_OPENED, "extractFiles error");
478
+ if (ret != S_OK){
479
+ throw RubyCppUtil::RubyException("Invalid file format. extractFiles");
480
+ }
481
+
482
+ return Qnil;
483
+ }
484
+
485
+ VALUE ArchiveReader::extractAll(VALUE callback_proc)
486
+ {
487
+ checkStateToBeginOperation(STATE_OPENED);
488
+ prepareAction();
489
+ EventLoopThreadExecuter te(this);
490
+
491
+ m_rb_callback_proc = callback_proc;
492
+
493
+ fillEntryInfo();
494
+
495
+ HRESULT ret;
496
+ runNativeFunc([&](){
497
+ ArchiveExtractCallback *extract_callback = createArchiveExtractCallback();
498
+ CMyComPtr<IArchiveExtractCallback> callback(extract_callback);
499
+ ret = m_in_archive->Extract(0, (UInt32)(Int32)(-1), 0, extract_callback);
500
+ });
501
+
502
+ m_rb_callback_proc = Qnil;
503
+
504
+ checkState(STATE_OPENED, "extractAll error");
505
+ if (ret != S_OK){
506
+ throw RubyCppUtil::RubyException("Invalid file format. extractAll");
507
+ }
508
+
509
+ return Qnil;
510
+ }
511
+
512
+ VALUE ArchiveReader::testAll(VALUE detail)
513
+ {
514
+ checkStateToBeginOperation(STATE_OPENED);
515
+ prepareAction();
516
+ EventLoopThreadExecuter te(this);
517
+
518
+ m_rb_callback_proc = Qnil;
519
+
520
+ UInt32 num;
521
+ HRESULT ret;
522
+ runNativeFunc([&](){
523
+ ret = m_in_archive->GetNumberOfItems(&num);
524
+ });
525
+ checkState(STATE_OPENED, "testAll error");
526
+ if (ret != S_OK || m_state == STATE_ERROR){
527
+ throw RubyCppUtil::RubyException("Cannot get number of items");
528
+ }
529
+ m_test_result.resize(num);
530
+ std::fill(m_test_result.begin(), m_test_result.end(), NArchive::NExtract::NOperationResult::kOK);
531
+
532
+ runNativeFunc([&](){
533
+ ArchiveExtractCallback *extract_callback = createArchiveExtractCallback();
534
+ CMyComPtr<IArchiveExtractCallback> callback(extract_callback);
535
+ ret = m_in_archive->Extract(0, (UInt32)(Int32)(-1), 1, extract_callback);
536
+ });
537
+
538
+ checkState(STATE_OPENED, "testAll error");
539
+ if (ret != S_OK){
540
+ throw RubyCppUtil::RubyException("Archive corrupted.");
541
+ }
542
+
543
+ if (RTEST(detail)){
544
+ using namespace NArchive::NExtract::NOperationResult;
545
+
546
+ VALUE unsupportedMethod = ID2SYM(INTERN("UnsupportedMethod"));
547
+ VALUE dataError = ID2SYM(INTERN("DataError"));
548
+ VALUE crcError = ID2SYM(INTERN("CrcError"));
549
+
550
+ VALUE ary = rb_ary_new2(num);
551
+ rb_ary_resize(ary, m_test_result.size());
552
+ for (unsigned int i=0; i<m_test_result.size(); i++){
553
+ VALUE v;
554
+ switch(m_test_result[i]){
555
+ case kOK:
556
+ v = Qtrue;
557
+ break;
558
+ case kUnSupportedMethod:
559
+ v = unsupportedMethod;
560
+ break;
561
+ case kDataError:
562
+ v = dataError;
563
+ break;
564
+ case kCRCError:
565
+ v = crcError;
566
+ break;
567
+ default:
568
+ v = Qnil;
569
+ break;
570
+ }
571
+ RARRAY_PTR(ary)[i] = v;
572
+ }
573
+ return ary;
574
+ }else{
575
+ using namespace NArchive::NExtract::NOperationResult;
576
+ return (std::find_if(m_test_result.begin(), m_test_result.end(),
577
+ std::bind2nd(std::not_equal_to<Int32>(), kOK))
578
+ == m_test_result.end()) ? Qtrue : Qfalse;
579
+ }
580
+ }
581
+
582
+ ArchiveExtractCallback *ArchiveReader::createArchiveExtractCallback()
583
+ {
584
+ ArchiveExtractCallback *extract_callback;
585
+ if (m_password_specified){
586
+ extract_callback = new ArchiveExtractCallback(this, m_password);
587
+ }else{
588
+ extract_callback = new ArchiveExtractCallback(this);
589
+ }
590
+ return extract_callback;
591
+ }
592
+
593
+ void ArchiveReader::fillEntryInfo()
594
+ {
595
+ if (!m_rb_entry_info_list.empty()){
596
+ return;
597
+ }
598
+
599
+ struct PropIdVarTypePair
600
+ {
601
+ PROPID prop_id;
602
+ VARTYPE vt;
603
+ };
604
+ PropIdVarTypePair list[] = {
605
+ { kpidPath, VT_BSTR },
606
+ { kpidMethod, VT_BSTR },
607
+ { kpidIsDir, VT_BOOL },
608
+ { kpidEncrypted, VT_BOOL },
609
+ { kpidIsAnti, VT_BOOL },
610
+ { kpidSize, VT_UI8 },
611
+ { kpidPackSize, VT_UI8 },
612
+ { kpidCTime, VT_FILETIME },
613
+ { kpidATime, VT_FILETIME },
614
+ { kpidMTime, VT_FILETIME },
615
+ { kpidAttrib, VT_UI4 },
616
+ { kpidCRC, VT_UI4 }
617
+ };
618
+
619
+ const unsigned int size = sizeof(list)/sizeof(list[0]);
620
+
621
+ UInt32 num;
622
+ HRESULT ret;
623
+ runNativeFunc([&](){
624
+ ret = m_in_archive->GetNumberOfItems(&num);
625
+ });
626
+ if (ret != S_OK || m_state == STATE_ERROR){
627
+ throw RubyCppUtil::RubyException("Cannot get number of items");
628
+ }
629
+
630
+ std::vector< std::array< NWindows::NCOM::CPropVariant, size > > variant_list(num);
631
+
632
+ runNativeFunc([&](){
633
+ for (UInt32 idx=0; idx<num; idx++){
634
+ for (unsigned int i=0; i<size; i++){
635
+ HRESULT ret = m_in_archive->GetProperty(idx, list[i].prop_id, &variant_list[idx][i]);
636
+ if (ret != S_OK || variant_list[idx][i].vt != list[i].vt){
637
+ variant_list[idx][i].Clear();
638
+ }
639
+ }
640
+ }
641
+ });
642
+ if (m_state == STATE_ERROR){
643
+ throw RubyCppUtil::RubyException("Cannot get property of items");
644
+ }
645
+
646
+ VALUE entry_info = rb_const_get(gSevenZipModule, INTERN("EntryInfo"));
647
+ ID new_id = INTERN("new");
648
+ m_rb_entry_info_list.resize(variant_list.size(), Qnil);
649
+ for (UInt32 i=0; i<m_rb_entry_info_list.size(); i++){
650
+ VALUE value_list[size + 1];
651
+ value_list[0] = ULONG2NUM(i);
652
+ for (unsigned int j=0; j<size; j++){
653
+ value_list[j+1] = ConvertPropToValue(variant_list[i][j]);
654
+ }
655
+ m_rb_entry_info_list[i] = rb_funcall2(entry_info, new_id, size + 1, value_list);
656
+ }
657
+ }
658
+
659
+ void ArchiveReader::mark()
660
+ {
661
+ rb_gc_mark(m_rb_callback_proc);
662
+ rb_gc_mark(m_rb_out_stream);
663
+ rb_gc_mark(m_rb_in_stream);
664
+ std::for_each(m_rb_entry_info_list.begin(), m_rb_entry_info_list.end(), [](VALUE i){ rb_gc_mark(i); });
665
+
666
+ ArchiveBase::mark();
667
+ }
668
+
669
+ void ArchiveReader::checkStateToBeginOperation(ArchiveReaderState expected, const std::string &msg)
670
+ {
671
+ if (m_state != expected){
672
+ VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
673
+ throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
674
+ }
675
+ }
676
+
677
+ void ArchiveReader::checkState(ArchiveReaderState expected, const std::string &msg)
678
+ {
679
+ if (m_action_result.isError()){
680
+ m_state = STATE_ERROR;
681
+ if (m_action_result.hasException()){
682
+ VALUE exc = m_action_result.exception;
683
+ m_action_result.clear();
684
+ throw RubyCppUtil::RubyException(exc);
685
+ }
686
+ }
687
+
688
+ if (m_state != expected){
689
+ m_state = STATE_ERROR;
690
+
691
+ VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
692
+ throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
693
+ }
694
+ }
695
+
696
+ void ArchiveReader::setErrorState()
697
+ {
698
+ m_state = STATE_ERROR;
699
+ }
700
+
701
+ ////////////////////////////////////////////////////////////////
702
+ ArchiveWriter::ArchiveWriter(const GUID &format_guid)
703
+ : m_rb_callback_proc(Qnil),
704
+ m_rb_in_stream(Qnil),
705
+ m_processing_index((UInt32)(Int32)-1),
706
+ m_rb_out_stream(Qnil),
707
+ m_format_guid(format_guid),
708
+ m_password_specified(false),
709
+ m_state(STATE_INITIAL)
710
+ {
711
+ IOutArchive *archive = 0;
712
+ HRESULT ret = CreateObject(&m_format_guid, &IID_IOutArchive, reinterpret_cast<void **>(&archive));
713
+ if (ret != S_OK){
714
+ m_state = STATE_ERROR;
715
+ return;
716
+ }
717
+
718
+ m_out_archive.Attach(archive);
719
+ }
720
+
721
+ VALUE ArchiveWriter::open(VALUE out_stream, VALUE param)
722
+ {
723
+ checkStateToBeginOperation(STATE_INITIAL);
724
+ prepareAction();
725
+
726
+ m_rb_out_stream = out_stream;
727
+ m_rb_callback_proc = Qnil;
728
+ m_rb_in_stream = Qnil;
729
+ std::vector<VALUE>().swap(m_rb_update_list);
730
+
731
+ VALUE password = rb_hash_aref(param, ID2SYM(INTERN("password")));
732
+ if (NIL_P(password)){
733
+ m_password_specified = false;
734
+ }else{
735
+ m_password_specified = true;
736
+ m_password = std::string(RSTRING_PTR(password), RSTRING_LEN(password));
737
+ }
738
+
739
+ checkState(STATE_INITIAL, "Open error");
740
+ m_state = STATE_OPENED;
741
+
742
+ return Qnil;
743
+ }
744
+
745
+ VALUE ArchiveWriter::addItem(VALUE item)
746
+ {
747
+ checkStateToBeginOperation(STATE_OPENED);
748
+ prepareAction();
749
+
750
+ m_rb_update_list.push_back(item);
751
+
752
+ checkState(STATE_OPENED, "addItem error");
753
+
754
+ return Qnil;
755
+ }
756
+
757
+ VALUE ArchiveWriter::compress(VALUE callback_proc)
758
+ {
759
+ checkStateToBeginOperation(STATE_OPENED);
760
+ prepareAction();
761
+ EventLoopThreadExecuter te(this);
762
+
763
+ m_rb_callback_proc = callback_proc;
764
+
765
+ HRESULT opt_ret;
766
+ HRESULT ret;
767
+ runNativeFunc([&](){
768
+ CMyComPtr<ISetProperties> set;
769
+ m_out_archive->QueryInterface(IID_ISetProperties, (void **)&set);
770
+ opt_ret = setOption(set);
771
+ if (opt_ret != S_OK){
772
+ return;
773
+ }
774
+
775
+ ArchiveUpdateCallback *callback;
776
+ if (m_password_specified){
777
+ callback = new ArchiveUpdateCallback(this, m_password);
778
+ }else{
779
+ callback = new ArchiveUpdateCallback(this);
780
+ }
781
+
782
+ CMyComPtr<IOutStream> out_stream(new OutStream(m_rb_out_stream, this));
783
+ CMyComPtr<IArchiveUpdateCallback> callback_ptr(callback);
784
+ ret = m_out_archive->UpdateItems(out_stream, m_rb_update_list.size(), callback_ptr);
785
+ });
786
+
787
+ m_rb_callback_proc = Qnil;
788
+
789
+ if (opt_ret != S_OK){
790
+ throw RubyCppUtil::RubyException(rb_exc_new2(rb_eArgError, "Invalid option"));
791
+ }
792
+
793
+ checkState(STATE_OPENED, "compress error");
794
+ if (ret != S_OK){
795
+ throw RubyCppUtil::RubyException("UpdateItems error");
796
+ }
797
+
798
+ m_state = STATE_COMPRESSED;
799
+
800
+ return Qnil;
801
+ }
802
+
803
+ VALUE ArchiveWriter::close()
804
+ {
805
+ if (m_state == STATE_CLOSED){
806
+ return Qnil;
807
+ }
808
+
809
+ checkStateToBeginOperation(STATE_OPENED, STATE_COMPRESSED);
810
+ prepareAction();
811
+
812
+ std::vector<VALUE>().swap(m_rb_update_list);
813
+
814
+ checkState(STATE_OPENED, STATE_COMPRESSED, "close error");
815
+ m_state = STATE_CLOSED;
816
+
817
+ return Qnil;
818
+ }
819
+
820
+ VALUE ArchiveWriter::getFileAttribute(VALUE path)
821
+ {
822
+ #ifdef _WIN32
823
+ BSTR str = ConvertStringToBstr(RSTRING_PTR(path), RSTRING_LEN(path));
824
+ DWORD attr = ::GetFileAttributesW(str);
825
+ SysFreeString(str);
826
+ return ULONG2NUM(attr);
827
+ #else
828
+ // TODO
829
+ return Qnil;
830
+ #endif
831
+ }
832
+
833
+ void ArchiveWriter::setProcessingStream(VALUE stream, UInt32 index)
834
+ {
835
+ m_rb_in_stream = stream;
836
+ m_processing_index = index;
837
+ }
838
+
839
+ void ArchiveWriter::getProcessingStream(VALUE *stream, UInt32 *index)
840
+ {
841
+ if (stream){
842
+ *stream = m_rb_in_stream;
843
+ }
844
+ if (index){
845
+ *index = m_processing_index;
846
+ }
847
+ }
848
+
849
+ void ArchiveWriter::clearProcessingStream()
850
+ {
851
+ setProcessingStream(Qnil, (UInt32)(Int32)(-1));
852
+ }
853
+
854
+ bool ArchiveWriter::updateItemInfo(UInt32 index, bool *new_data, bool *new_properties, UInt32 *index_in_archive)
855
+ {
856
+ bool ret = runRubyAction([&](){
857
+ VALUE item = m_rb_update_list[index];
858
+ if (new_data){
859
+ *new_data = RTEST(rb_funcall(item, INTERN("new_data?"), 0));
860
+ }
861
+ if (new_properties){
862
+ *new_properties = RTEST(rb_funcall(item, INTERN("new_properties?"), 0));
863
+ }
864
+ if (index_in_archive){
865
+ VALUE idx = rb_funcall(item, INTERN("index_in_archive"), 0);
866
+ *index_in_archive = (RTEST(idx) ? NUM2ULONG(idx) : (UInt32)(Int32)(-1));
867
+ }
868
+ });
869
+
870
+ return ret;
871
+ }
872
+
873
+ void ArchiveWriter::mark()
874
+ {
875
+ rb_gc_mark(m_rb_callback_proc);
876
+ rb_gc_mark(m_rb_in_stream);
877
+ rb_gc_mark(m_rb_out_stream);
878
+ std::for_each(m_rb_update_list.begin(), m_rb_update_list.end(), [](VALUE i){ rb_gc_mark(i); });
879
+
880
+ ArchiveBase::mark();
881
+ }
882
+
883
+ void ArchiveWriter::checkStateToBeginOperation(ArchiveWriterState expected, const std::string &msg)
884
+ {
885
+ if (m_state != expected){
886
+ VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
887
+ throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
888
+ }
889
+ }
890
+
891
+ void ArchiveWriter::checkStateToBeginOperation(ArchiveWriterState expected1, ArchiveWriterState expected2,
892
+ const std::string &msg)
893
+ {
894
+ if (m_state != expected1 && m_state != expected2){
895
+ VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
896
+ throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
897
+ }
898
+ }
899
+
900
+ void ArchiveWriter::checkState(ArchiveWriterState expected, const std::string &msg)
901
+ {
902
+ if (m_action_result.isError()){
903
+ m_state = STATE_ERROR;
904
+ if (m_action_result.hasException()){
905
+ VALUE exc = m_action_result.exception;
906
+ m_action_result.clear();
907
+ throw RubyCppUtil::RubyException(exc);
908
+ }
909
+ }
910
+
911
+ if (m_state != expected){
912
+ m_state = STATE_ERROR;
913
+
914
+ VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
915
+ throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
916
+ }
917
+ }
918
+
919
+ void ArchiveWriter::checkState(ArchiveWriterState expected1, ArchiveWriterState expected2,
920
+ const std::string &msg)
921
+ {
922
+ if (m_action_result.isError()){
923
+ m_state = STATE_ERROR;
924
+ if (m_action_result.hasException()){
925
+ VALUE exc = m_action_result.exception;
926
+ m_action_result.clear();
927
+ throw RubyCppUtil::RubyException(exc);
928
+ }
929
+ }
930
+
931
+ if (m_state != expected1 && m_state != expected2){
932
+ m_state = STATE_ERROR;
933
+
934
+ VALUE invalid_operation_exc = rb_const_get(gSevenZipModule, INTERN("InvalidOperation"));
935
+ throw RubyCppUtil::RubyException(rb_exc_new(invalid_operation_exc, msg.c_str(), msg.size()));
936
+ }
937
+ }
938
+
939
+ void ArchiveWriter::setErrorState()
940
+ {
941
+ m_state = STATE_ERROR;
942
+ }
943
+
944
+ ////////////////////////////////////////////////////////////////
945
+ SevenZipReader::SevenZipReader()
946
+ : ArchiveReader(CLSID_CFormat7z)
947
+ {
948
+ }
949
+
950
+ ////////////////////////////////////////////////////////////////
951
+ SevenZipWriter::SevenZipWriter()
952
+ : ArchiveWriter(CLSID_CFormat7z),
953
+ m_method("LZMA"),
954
+ m_level(5),
955
+ m_solid(true),
956
+ m_header_compression(true),
957
+ m_header_encryption(false),
958
+ m_multi_threading(true)
959
+ {
960
+ }
961
+
962
+ VALUE SevenZipWriter::setMethod(VALUE method)
963
+ {
964
+ method = rb_check_string_type(method);
965
+ if (NIL_P(method)){
966
+ throw RubyCppUtil::RubyException(rb_exc_new2(rb_eArgError, "method should be String"));
967
+ }
968
+
969
+ method = rb_funcall(method, INTERN("upcase"), 0);
970
+ std::string str(RSTRING_PTR(method), RSTRING_LEN(method));
971
+ const char *supported[] = {
972
+ "LZMA", "LZMA2", "PPMD", "BZIP2", "DEFLATE", "COPY"
973
+ };
974
+ if (std::find(supported, supported + sizeof(supported)/sizeof(supported[0]), str)
975
+ == supported + sizeof(supported)/sizeof(supported[0])){
976
+ throw RubyCppUtil::RubyException(rb_exc_new2(rb_eArgError, "Invalid method specified"));
977
+ }
978
+
979
+ if (str == "COPY"){
980
+ m_level = 0;
981
+ }
982
+
983
+ m_method = str;
984
+ return method;
985
+ }
986
+
987
+ VALUE SevenZipWriter::method()
988
+ {
989
+ if (m_method != "PPMD"){
990
+ return rb_str_new(m_method.c_str(), m_method.size());
991
+ }else{
992
+ return rb_str_new2("PPMd");
993
+ }
994
+ }
995
+
996
+ VALUE SevenZipWriter::setLevel(VALUE level)
997
+ {
998
+ level = rb_check_to_int(level);
999
+ if (NIL_P(level)){
1000
+ throw RubyCppUtil::RubyException(rb_exc_new2(rb_eArgError, "level should be Integer"));
1001
+ }
1002
+ UInt32 l = NUM2ULONG(level);
1003
+ switch(l){
1004
+ case 0:
1005
+ m_method = "COPY";
1006
+ break;
1007
+ case 1: case 3: case 5: case 7: case 9:
1008
+ break;
1009
+ default:
1010
+ throw RubyCppUtil::RubyException(rb_exc_new2(rb_eArgError, "level should be 0, 1, 3, 5, 7 or 9"));
1011
+ break;
1012
+ }
1013
+ m_level = l;
1014
+ return level;
1015
+ }
1016
+
1017
+ VALUE SevenZipWriter::level()
1018
+ {
1019
+ return ULONG2NUM(m_level);
1020
+ }
1021
+
1022
+ VALUE SevenZipWriter::setSolid(VALUE solid)
1023
+ {
1024
+ m_solid = RTEST(solid);
1025
+ return solid;
1026
+ }
1027
+
1028
+ VALUE SevenZipWriter::solid()
1029
+ {
1030
+ return (m_solid ? Qtrue : Qfalse);
1031
+ }
1032
+
1033
+ VALUE SevenZipWriter::setHeaderCompression(VALUE header_compression)
1034
+ {
1035
+ m_header_compression = RTEST(header_compression);
1036
+ return header_compression;
1037
+ }
1038
+
1039
+ VALUE SevenZipWriter::headerCompression()
1040
+ {
1041
+ return (m_header_compression ? Qtrue : Qfalse);
1042
+ }
1043
+
1044
+ VALUE SevenZipWriter::setHeaderEncryption(VALUE header_encryption)
1045
+ {
1046
+ m_header_encryption = RTEST(header_encryption);
1047
+ return header_encryption;
1048
+ }
1049
+
1050
+ VALUE SevenZipWriter::headerEncryption()
1051
+ {
1052
+ return (m_header_encryption ? Qtrue : Qfalse);
1053
+ }
1054
+
1055
+ VALUE SevenZipWriter::setMultiThreading(VALUE multi_threading)
1056
+ {
1057
+ m_multi_threading = RTEST(multi_threading);
1058
+ return multi_threading;
1059
+ }
1060
+
1061
+ VALUE SevenZipWriter::multiThreading()
1062
+ {
1063
+ return (m_multi_threading ? Qtrue : Qfalse);
1064
+ }
1065
+
1066
+ HRESULT SevenZipWriter::setOption(ISetProperties *set)
1067
+ {
1068
+ NWindows::NCOM::CPropVariant prop[6];
1069
+ const wchar_t *name[6] = { L"0", L"x", L"s", L"hc", L"he", L"mt" };
1070
+ prop[0] = m_method.c_str();
1071
+ prop[1] = m_level;
1072
+ prop[2] = m_solid;
1073
+ prop[3] = m_header_compression;
1074
+ prop[4] = m_header_encryption;
1075
+ prop[5] = m_multi_threading;
1076
+
1077
+ return set->SetProperties(name, prop, sizeof(name)/sizeof(name[0]));
1078
+ }
1079
+
1080
+ ////////////////////////////////////////////////////////////////
1081
+ ArchiveOpenCallback::ArchiveOpenCallback(ArchiveReader *archive)
1082
+ : m_archive(archive), m_password_specified(false)
1083
+ {
1084
+ }
1085
+
1086
+ ArchiveOpenCallback::ArchiveOpenCallback(ArchiveReader *archive, const std::string &password)
1087
+ : m_archive(archive), m_password_specified(true), m_password(password)
1088
+ {
1089
+ }
1090
+
1091
+ STDMETHODIMP ArchiveOpenCallback::SetTotal(const UInt64 *files, const UInt64 *bytes)
1092
+ {
1093
+ return S_OK;
1094
+ }
1095
+
1096
+ STDMETHODIMP ArchiveOpenCallback::SetCompleted(const UInt64 *files, const UInt64 *bytes)
1097
+ {
1098
+ return S_OK;
1099
+ }
1100
+
1101
+ STDMETHODIMP ArchiveOpenCallback::CryptoGetTextPassword(BSTR *password)
1102
+ {
1103
+ if (!m_password_specified){
1104
+ return E_ABORT;
1105
+ }
1106
+
1107
+ if (password){
1108
+ *password = ConvertStringToBstr(m_password);
1109
+ }
1110
+ return S_OK;
1111
+ }
1112
+
1113
+
1114
+ ////////////////////////////////////////////////////////////////
1115
+ ArchiveExtractCallback::ArchiveExtractCallback(ArchiveReader *archive)
1116
+ : m_archive(archive), m_password_specified(false)
1117
+ {
1118
+ }
1119
+
1120
+ ArchiveExtractCallback::ArchiveExtractCallback(ArchiveReader *archive, const std::string &password)
1121
+ : m_archive(archive), m_password_specified(true), m_password(password)
1122
+ {
1123
+ }
1124
+
1125
+ STDMETHODIMP ArchiveExtractCallback::SetTotal(UInt64 size)
1126
+ {
1127
+ return S_OK;
1128
+ }
1129
+
1130
+ STDMETHODIMP ArchiveExtractCallback::SetCompleted(const UInt64 *completeValue)
1131
+ {
1132
+ // This function is called periodically, so use this function as a check function of interrupt.
1133
+ if (m_archive->isErrorState()){
1134
+ return E_FAIL;
1135
+ }
1136
+ return S_OK;
1137
+ }
1138
+
1139
+ STDMETHODIMP ArchiveExtractCallback::GetStream(UInt32 index, ISequentialOutStream **outStream,
1140
+ Int32 askExtractMode)
1141
+ {
1142
+ switch(askExtractMode){
1143
+ case NArchive::NExtract::NAskMode::kExtract:
1144
+ break;
1145
+ case NArchive::NExtract::NAskMode::kTest:
1146
+ m_archive->setProcessingStream(Qnil, index, askExtractMode);
1147
+ return S_OK;
1148
+ default:
1149
+ return S_OK;
1150
+ }
1151
+
1152
+ VALUE rb_stream;
1153
+ VALUE proc = m_archive->callbackProc();
1154
+ bool ret = m_archive->runRubyAction([&](){
1155
+ rb_stream = rb_funcall(proc, INTERN("call"), 2,
1156
+ ID2SYM(INTERN("stream")), m_archive->entryInfo(index));
1157
+ });
1158
+ if (!ret){
1159
+ m_archive->clearProcessingStream();
1160
+ return E_FAIL;
1161
+ }
1162
+
1163
+ m_archive->setProcessingStream(rb_stream, index, askExtractMode);
1164
+
1165
+ OutStream *stream = new OutStream(rb_stream, m_archive);
1166
+ CMyComPtr<OutStream> ptr(stream);
1167
+ *outStream = ptr.Detach();
1168
+
1169
+ return S_OK;
1170
+ }
1171
+
1172
+ STDMETHODIMP ArchiveExtractCallback::PrepareOperation(Int32 askExtractMode)
1173
+ {
1174
+ return S_OK;
1175
+ }
1176
+
1177
+ STDMETHODIMP ArchiveExtractCallback::SetOperationResult(Int32 resultOperationResult)
1178
+ {
1179
+ UInt32 index;
1180
+ VALUE stream;
1181
+ Int32 askExtractMode;
1182
+ m_archive->getProcessingStream(&stream, &index, &askExtractMode);
1183
+
1184
+ switch(askExtractMode){
1185
+ case NArchive::NExtract::NAskMode::kExtract:
1186
+ break;
1187
+ case NArchive::NExtract::NAskMode::kTest:
1188
+ m_archive->clearProcessingStream();
1189
+ m_archive->setOperationResult(index, resultOperationResult);
1190
+ return S_OK;
1191
+ default:
1192
+ return S_OK;
1193
+ }
1194
+
1195
+ if (!NIL_P(stream)){
1196
+ VALUE proc = m_archive->callbackProc();
1197
+ bool ret = m_archive->runRubyAction([&](){
1198
+ using namespace NArchive::NExtract::NOperationResult;
1199
+
1200
+ VALUE arg_hash = rb_hash_new();
1201
+ rb_hash_aset(arg_hash, ID2SYM(INTERN("info")), m_archive->entryInfo(index));
1202
+ rb_hash_aset(arg_hash, ID2SYM(INTERN("stream")), stream);
1203
+ rb_hash_aset(arg_hash, ID2SYM(INTERN("success")), (resultOperationResult == kOK ? Qtrue : Qfalse));
1204
+ rb_funcall(proc, INTERN("call"), 2, ID2SYM(INTERN("result")), arg_hash);
1205
+ });
1206
+ if (!ret){
1207
+ m_archive->clearProcessingStream();
1208
+ return E_FAIL;
1209
+ }
1210
+ }
1211
+ m_archive->clearProcessingStream();
1212
+
1213
+ return S_OK;
1214
+ }
1215
+
1216
+ STDMETHODIMP ArchiveExtractCallback::CryptoGetTextPassword(BSTR *password)
1217
+ {
1218
+ if (!m_password_specified){
1219
+ return E_ABORT;
1220
+ }
1221
+
1222
+ if (password){
1223
+ *password = ConvertStringToBstr(m_password);
1224
+ }
1225
+ return S_OK;
1226
+ }
1227
+
1228
+
1229
+ ////////////////////////////////////////////////////////////////
1230
+ ArchiveUpdateCallback::ArchiveUpdateCallback(ArchiveWriter *archive)
1231
+ : m_archive(archive), m_password_specified(false)
1232
+ {
1233
+ }
1234
+
1235
+ ArchiveUpdateCallback::ArchiveUpdateCallback(ArchiveWriter *archive, const std::string &password)
1236
+ : m_archive(archive), m_password_specified(true), m_password(password)
1237
+ {
1238
+ }
1239
+
1240
+ STDMETHODIMP ArchiveUpdateCallback::SetTotal(UInt64 size)
1241
+ {
1242
+ return S_OK;
1243
+ }
1244
+
1245
+ STDMETHODIMP ArchiveUpdateCallback::SetCompleted(const UInt64 *completeValue)
1246
+ {
1247
+ if (m_archive->isErrorState()){
1248
+ return E_FAIL;
1249
+ }
1250
+ return S_OK;
1251
+ }
1252
+
1253
+ STDMETHODIMP ArchiveUpdateCallback::EnumProperties(IEnumSTATPROPSTG **enumerator)
1254
+ {
1255
+ return E_NOTIMPL;
1256
+ }
1257
+
1258
+ STDMETHODIMP ArchiveUpdateCallback::GetUpdateItemInfo(UInt32 index, Int32 *newData,
1259
+ Int32 *newProperties, UInt32 *indexInArchive)
1260
+ {
1261
+ bool new_data = false;
1262
+ bool new_properties = false;
1263
+ UInt32 index_in_archive = (UInt32)(Int32)(-1);
1264
+
1265
+ bool ret = m_archive->updateItemInfo(index, &new_data, &new_properties, &index_in_archive);
1266
+ if (!ret){
1267
+ return E_FAIL;
1268
+ }
1269
+
1270
+ if (newData){
1271
+ *newData = static_cast<Int32>(new_data);
1272
+ }
1273
+ if (newProperties){
1274
+ *newProperties = static_cast<Int32>(new_properties);
1275
+ }
1276
+ if (indexInArchive){
1277
+ *indexInArchive = index_in_archive;
1278
+ }
1279
+
1280
+ return S_OK;
1281
+ }
1282
+
1283
+ STDMETHODIMP ArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
1284
+ {
1285
+ VALUE info = m_archive->itemInfo(index);
1286
+
1287
+ bool ret = m_archive->runRubyAction([&](){
1288
+ switch(propID){
1289
+ case kpidIsAnti:
1290
+ ConvertValueToProp(rb_funcall(info, INTERN("anti?"), 0), VT_BOOL, value);
1291
+ break;
1292
+ case kpidPath:
1293
+ ConvertValueToProp(rb_funcall(info, INTERN("path"), 0), VT_BSTR, value);
1294
+ break;
1295
+ case kpidIsDir:
1296
+ ConvertValueToProp(rb_funcall(info, INTERN("directory?"), 0), VT_BOOL, value);
1297
+ break;
1298
+ case kpidSize:
1299
+ ConvertValueToProp(rb_funcall(info, INTERN("size"), 0), VT_UI8, value);
1300
+ break;
1301
+ case kpidAttrib:
1302
+ ConvertValueToProp(rb_funcall(info, INTERN("attrib"), 0), VT_UI4, value);
1303
+ break;
1304
+ case kpidCTime:
1305
+ ConvertValueToProp(rb_funcall(info, INTERN("ctime"), 0), VT_FILETIME, value);
1306
+ break;
1307
+ case kpidATime:
1308
+ ConvertValueToProp(rb_funcall(info, INTERN("atime"), 0), VT_FILETIME, value);
1309
+ break;
1310
+ case kpidMTime:
1311
+ ConvertValueToProp(rb_funcall(info, INTERN("mtime"), 0), VT_FILETIME, value);
1312
+ break;
1313
+ case kpidPosixAttrib:
1314
+ ConvertValueToProp(rb_funcall(info, INTERN("posix_attrib"), 0), VT_UI4, value);
1315
+ break;
1316
+ case kpidUser:
1317
+ {
1318
+ VALUE user = rb_funcall(info, INTERN("user"), 0);
1319
+ if (RTEST(user)){
1320
+ ConvertValueToProp(user, VT_BSTR, value);
1321
+ }
1322
+ }
1323
+ break;
1324
+ case kpidGroup:
1325
+ {
1326
+ VALUE group = rb_funcall(info, INTERN("group"), 0);
1327
+ if (RTEST(group)){
1328
+ ConvertValueToProp(group, VT_BSTR, value);
1329
+ }
1330
+ }
1331
+ break;
1332
+ default:
1333
+ rb_warning("Unknown propID");
1334
+ break;
1335
+ }
1336
+ });
1337
+
1338
+ return S_OK;
1339
+ }
1340
+
1341
+ STDMETHODIMP ArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream **inStream)
1342
+ {
1343
+ VALUE rb_stream;
1344
+ VALUE proc = m_archive->callbackProc();
1345
+ bool ret = m_archive->runRubyAction([&](){
1346
+ VALUE info = m_archive->itemInfo(index);
1347
+ rb_stream = rb_funcall(proc, INTERN("call"), 2, ID2SYM(INTERN("stream")), info);
1348
+ });
1349
+ if (!ret){
1350
+ m_archive->clearProcessingStream();
1351
+ return E_FAIL;
1352
+ }
1353
+
1354
+ m_archive->setProcessingStream(rb_stream, index);
1355
+
1356
+ InStream *stream = new InStream(rb_stream, m_archive);
1357
+ CMyComPtr<InStream> ptr(stream);
1358
+ *inStream = ptr.Detach();
1359
+
1360
+ return S_OK;
1361
+ }
1362
+
1363
+ STDMETHODIMP ArchiveUpdateCallback::SetOperationResult(Int32 operationResult)
1364
+ {
1365
+ UInt32 index;
1366
+ VALUE stream;
1367
+ m_archive->getProcessingStream(&stream, &index);
1368
+
1369
+ if (!NIL_P(stream)){
1370
+ VALUE proc = m_archive->callbackProc();
1371
+ bool ret = m_archive->runRubyAction([&](){
1372
+ VALUE arg_hash = rb_hash_new();
1373
+ rb_hash_aset(arg_hash, ID2SYM(INTERN("info")), m_archive->itemInfo(index));
1374
+ rb_hash_aset(arg_hash, ID2SYM(INTERN("stream")), stream);
1375
+ rb_funcall(proc, INTERN("call"), 2, ID2SYM(INTERN("result")), arg_hash);
1376
+ });
1377
+ if (!ret){
1378
+ m_archive->clearProcessingStream();
1379
+ return E_FAIL;
1380
+ }
1381
+ }
1382
+ m_archive->clearProcessingStream();
1383
+
1384
+ return S_OK;
1385
+ }
1386
+
1387
+ STDMETHODIMP ArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)
1388
+ {
1389
+ if (m_password_specified){
1390
+ *passwordIsDefined = 1;
1391
+ *password = ConvertStringToBstr(m_password);
1392
+ }else{
1393
+ *passwordIsDefined = 0;
1394
+ }
1395
+ return S_OK;
1396
+ }
1397
+
1398
+
1399
+ ////////////////////////////////////////////////////////////////
1400
+ InStream::InStream(VALUE stream, ArchiveBase *archive)
1401
+ : m_stream(stream), m_archive(archive)
1402
+ {
1403
+ }
1404
+
1405
+ STDMETHODIMP InStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
1406
+ {
1407
+ bool ret = m_archive->runRubyAction([&](){
1408
+ VALUE whence;
1409
+ switch(seekOrigin){
1410
+ case 0:
1411
+ whence = rb_const_get(rb_cIO, INTERN("SEEK_SET"));
1412
+ break;
1413
+ case 1:
1414
+ whence = rb_const_get(rb_cIO, INTERN("SEEK_CUR"));
1415
+ break;
1416
+ case 2:
1417
+ whence = rb_const_get(rb_cIO, INTERN("SEEK_END"));
1418
+ break;
1419
+ default:
1420
+ return;
1421
+ }
1422
+
1423
+ rb_funcall(m_stream, INTERN("seek"), 2, LL2NUM(offset), whence);
1424
+ if (newPosition){
1425
+ VALUE pos = rb_funcall(m_stream, INTERN("tell"), 0);
1426
+ *newPosition = NUM2ULONG(pos);
1427
+ }
1428
+ });
1429
+ if (!ret){
1430
+ return E_FAIL;
1431
+ }
1432
+
1433
+ return S_OK;
1434
+ }
1435
+
1436
+ STDMETHODIMP InStream::Read(void *data, UInt32 size, UInt32 *processedSize)
1437
+ {
1438
+ bool ret = m_archive->runRubyAction([&](){
1439
+ VALUE str = rb_funcall(m_stream, INTERN("read"), 1, ULONG2NUM(size));
1440
+ if (!NIL_P(str) && data){
1441
+ std::memcpy(data, RSTRING_PTR(str), RSTRING_LEN(str));
1442
+ }
1443
+
1444
+ if (processedSize){
1445
+ *processedSize = (NIL_P(str) ? 0 : RSTRING_LEN(str));
1446
+ }
1447
+ });
1448
+ if (!ret){
1449
+ return E_FAIL;
1450
+ }
1451
+
1452
+ return S_OK;
1453
+ }
1454
+
1455
+ ////////////////////////////////////////////////////////////////
1456
+ OutStream::OutStream(VALUE stream, ArchiveBase *archive)
1457
+ : m_stream(stream), m_archive(archive)
1458
+ {
1459
+ }
1460
+
1461
+ STDMETHODIMP OutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
1462
+ {
1463
+ bool ret = m_archive->runRubyAction([&](){
1464
+ VALUE str = rb_str_new(reinterpret_cast<const char*>(data), size);
1465
+ VALUE len = rb_funcall(m_stream, INTERN("write"), 1, str);
1466
+ if (processedSize){
1467
+ if (NIL_P(len)){
1468
+ *processedSize = 0;
1469
+ }else{
1470
+ *processedSize = NUM2ULONG(len);
1471
+ }
1472
+ }
1473
+ });
1474
+ if (!ret){
1475
+ return E_FAIL;
1476
+ }
1477
+
1478
+ return S_OK;
1479
+ }
1480
+
1481
+ STDMETHODIMP OutStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
1482
+ {
1483
+ bool ret = m_archive->runRubyAction([&](){
1484
+ VALUE whence;
1485
+ switch(seekOrigin){
1486
+ case 0:
1487
+ whence = rb_const_get(rb_cIO, INTERN("SEEK_SET"));
1488
+ break;
1489
+ case 1:
1490
+ whence = rb_const_get(rb_cIO, INTERN("SEEK_CUR"));
1491
+ break;
1492
+ case 2:
1493
+ whence = rb_const_get(rb_cIO, INTERN("SEEK_END"));
1494
+ break;
1495
+ default:
1496
+ return;
1497
+ }
1498
+
1499
+ rb_funcall(m_stream, INTERN("seek"), 2, LL2NUM(offset), whence);
1500
+ if (newPosition){
1501
+ VALUE pos = rb_funcall(m_stream, INTERN("tell"), 0);
1502
+ *newPosition = NUM2ULONG(pos);
1503
+ }
1504
+ });
1505
+ if (!ret){
1506
+ return E_FAIL;
1507
+ }
1508
+
1509
+ return S_OK;
1510
+ }
1511
+
1512
+ STDMETHODIMP OutStream::SetSize(UInt64 size)
1513
+ {
1514
+ bool ret = m_archive->runRubyAction([&](){
1515
+ rb_funcall(m_stream, INTERN("truncate"), 1, ULL2NUM(size));
1516
+ });
1517
+ if (!ret){
1518
+ return E_FAIL;
1519
+ }
1520
+
1521
+ return S_OK;
1522
+ }
1523
+
1524
+
1525
+
1526
+ }
1527
+
1528
+
1529
+ extern "C" void Init_seven_zip_archive(void)
1530
+ {
1531
+ using namespace SevenZip;
1532
+ using namespace RubyCppUtil;
1533
+
1534
+ #ifdef _WIN32
1535
+ gSevenZipHandle = LoadLibrary("./7z.dll");
1536
+ if (!gSevenZipHandle){
1537
+ gSevenZipHandle = LoadLibrary("./7z64.dll");
1538
+ }
1539
+ #else
1540
+ gSevenZipHandle = dlopen("./7z.so", RTLD_NOW);
1541
+ #endif
1542
+ if (!gSevenZipHandle){
1543
+ rb_warning("7z library is not found.");
1544
+ return;
1545
+ }
1546
+
1547
+ #ifdef _WIN32
1548
+ CreateObject = (CreateObjectFunc)GetProcAddress(gSevenZipHandle, "CreateObject");
1549
+ #else
1550
+ CreateObject = (CreateObjectFunc)dlsym(gSevenZipHandle, "CreateObject");
1551
+ #endif
1552
+ if (!CreateObject){
1553
+ rb_warning("CreateObject is not found.");
1554
+ return;
1555
+ }
1556
+
1557
+
1558
+ VALUE mod = rb_define_module("SevenZipRuby");
1559
+ gSevenZipModule = mod;
1560
+
1561
+ VALUE cls;
1562
+
1563
+ // arg_count is needed by MSVC 2010...
1564
+ // MSVC 2010 seems not to be able to guess argument count of the function passed as a template parameter.
1565
+ #define READER_FUNC(func, arg_count) wrappedFunction##arg_count<SevenZipReader, ArchiveReader, &ArchiveReader::func>
1566
+
1567
+ cls = rb_define_wrapped_cpp_class_under<SevenZipReader>(mod, "SevenZipReader", rb_cObject);
1568
+ rb_define_method_ext(cls, "open_impl", READER_FUNC(open, 2));
1569
+ rb_define_method_ext(cls, "close", READER_FUNC(close, 0));
1570
+ rb_define_method_ext(cls, "entry_num", READER_FUNC(entryNum, 0));
1571
+ rb_define_method_ext(cls, "extract_impl", READER_FUNC(extract, 2));
1572
+ rb_define_method_ext(cls, "extract_files_impl", READER_FUNC(extractFiles, 2));
1573
+ rb_define_method_ext(cls, "extract_all_impl", READER_FUNC(extractAll, 1));
1574
+ rb_define_method_ext(cls, "test_all_impl", READER_FUNC(testAll, 1));
1575
+ rb_define_method_ext(cls, "archive_property", READER_FUNC(getArchiveProperty, 0));
1576
+ rb_define_method_ext(cls, "entry", READER_FUNC(getEntryInfo, 1));
1577
+ rb_define_method_ext(cls, "entries", READER_FUNC(getAllEntryInfo, 0));
1578
+ rb_define_method_ext(cls, "set_file_attribute", READER_FUNC(setFileAttribute, 2));
1579
+
1580
+ #undef READER_FUNC
1581
+
1582
+
1583
+ // arg_count is needed by MSVC 2010...
1584
+ // MSVC 2010 seems not to be able to guess argument count of the function passed as a template parameter.
1585
+ #define WRITER_FUNC(func, arg_count) wrappedFunction##arg_count<SevenZipWriter, ArchiveWriter, &ArchiveWriter::func>
1586
+ #define WRITER_FUNC2(func, arg_count) wrappedFunction##arg_count<SevenZipWriter, &SevenZipWriter::func>
1587
+
1588
+ cls = rb_define_wrapped_cpp_class_under<SevenZipWriter>(mod, "SevenZipWriter", rb_cObject);
1589
+ rb_define_method_ext(cls, "open_impl", WRITER_FUNC(open, 2));
1590
+ rb_define_method_ext(cls, "add_item", WRITER_FUNC(addItem, 1));
1591
+ rb_define_method_ext(cls, "compress_impl", WRITER_FUNC(compress, 1));
1592
+ rb_define_method_ext(cls, "close", WRITER_FUNC(close, 0));
1593
+ rb_define_method_ext(cls, "get_file_attribute", WRITER_FUNC(getFileAttribute, 1));
1594
+
1595
+ rb_define_method_ext(cls, "method=", WRITER_FUNC2(setMethod, 1));
1596
+ rb_define_method_ext(cls, "method", WRITER_FUNC2(method, 0));
1597
+ rb_define_method_ext(cls, "level=", WRITER_FUNC2(setLevel, 1));
1598
+ rb_define_method_ext(cls, "level", WRITER_FUNC2(level, 0));
1599
+ rb_define_method_ext(cls, "solid=", WRITER_FUNC2(setSolid, 1));
1600
+ rb_define_method_ext(cls, "solid", WRITER_FUNC2(solid, 0));
1601
+ rb_define_method_ext(cls, "header_compression=", WRITER_FUNC2(setHeaderCompression, 1));
1602
+ rb_define_method_ext(cls, "header_compression", WRITER_FUNC2(headerCompression, 0));
1603
+ rb_define_method_ext(cls, "header_encryption=", WRITER_FUNC2(setHeaderEncryption, 1));
1604
+ rb_define_method_ext(cls, "header_encryption", WRITER_FUNC2(headerEncryption, 0));
1605
+ rb_define_method_ext(cls, "multi_threading=", WRITER_FUNC2(setMultiThreading, 1));
1606
+ rb_define_method_ext(cls, "multi_thread=", WRITER_FUNC2(setMultiThreading, 1));
1607
+ rb_define_method_ext(cls, "multi_threading", WRITER_FUNC2(multiThreading, 0));
1608
+ rb_define_method_ext(cls, "multi_thread", WRITER_FUNC2(multiThreading, 0));
1609
+
1610
+ #undef WRITER_FUNC2
1611
+ #undef WRITER_FUNC
1612
+
1613
+ }
1614
+