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,34 @@
1
+ // Archive/ZipItemEx.h
2
+
3
+ #ifndef __ARCHIVE_ZIP_ITEMEX_H
4
+ #define __ARCHIVE_ZIP_ITEMEX_H
5
+
6
+ #include "ZipHeader.h"
7
+ #include "ZipItem.h"
8
+
9
+ namespace NArchive {
10
+ namespace NZip {
11
+
12
+ class CItemEx: public CItem
13
+ {
14
+ public:
15
+ UInt32 FileHeaderWithNameSize;
16
+ UInt16 LocalExtraSize;
17
+
18
+ UInt64 GetLocalFullSize() const
19
+ { return FileHeaderWithNameSize + LocalExtraSize + PackSize +
20
+ (HasDescriptor() ? NFileHeader::kDataDescriptorSize : 0); };
21
+ /*
22
+ UInt64 GetLocalFullSize(bool isZip64) const
23
+ { return FileHeaderWithNameSize + LocalExtraSize + PackSize +
24
+ (HasDescriptor() ? (isZip64 ? NFileHeader::kDataDescriptor64Size : NFileHeader::kDataDescriptorSize) : 0); };
25
+ */
26
+ UInt64 GetLocalExtraPosition() const
27
+ { return LocalHeaderPosition + FileHeaderWithNameSize; };
28
+ UInt64 GetDataPosition() const
29
+ { return GetLocalExtraPosition() + LocalExtraSize; };
30
+ };
31
+
32
+ }}
33
+
34
+ #endif
@@ -0,0 +1,289 @@
1
+ // ZipOut.cpp
2
+
3
+ #include "StdAfx.h"
4
+
5
+ #include "../../Common/OffsetStream.h"
6
+
7
+ #include "ZipOut.h"
8
+
9
+ namespace NArchive {
10
+ namespace NZip {
11
+
12
+ void COutArchive::Create(IOutStream *outStream)
13
+ {
14
+ if (!m_OutBuffer.Create(1 << 16))
15
+ throw CSystemException(E_OUTOFMEMORY);
16
+ m_Stream = outStream;
17
+ m_OutBuffer.SetStream(outStream);
18
+ m_OutBuffer.Init();
19
+ m_BasePosition = 0;
20
+ }
21
+
22
+ void COutArchive::MoveBasePosition(UInt64 distanceToMove)
23
+ {
24
+ m_BasePosition += distanceToMove; // test overflow
25
+ }
26
+
27
+ void COutArchive::PrepareWriteCompressedDataZip64(UInt16 fileNameLength, bool isZip64, bool aesEncryption)
28
+ {
29
+ m_IsZip64 = isZip64;
30
+ m_ExtraSize = isZip64 ? (4 + 8 + 8) : 0;
31
+ if (aesEncryption)
32
+ m_ExtraSize += 4 + 7;
33
+ m_LocalFileHeaderSize = 4 + NFileHeader::kLocalBlockSize + fileNameLength + m_ExtraSize;
34
+ }
35
+
36
+ void COutArchive::PrepareWriteCompressedData(UInt16 fileNameLength, UInt64 unPackSize, bool aesEncryption)
37
+ {
38
+ // We test it to 0xF8000000 to support case when compressed size
39
+ // can be larger than uncompressed size.
40
+ PrepareWriteCompressedDataZip64(fileNameLength, unPackSize >= 0xF8000000, aesEncryption);
41
+ }
42
+
43
+ void COutArchive::PrepareWriteCompressedData2(UInt16 fileNameLength, UInt64 unPackSize, UInt64 packSize, bool aesEncryption)
44
+ {
45
+ bool isUnPack64 = unPackSize >= 0xFFFFFFFF;
46
+ bool isPack64 = packSize >= 0xFFFFFFFF;
47
+ bool isZip64 = isPack64 || isUnPack64;
48
+ PrepareWriteCompressedDataZip64(fileNameLength, isZip64, aesEncryption);
49
+ }
50
+
51
+ void COutArchive::WriteBytes(const void *buffer, UInt32 size)
52
+ {
53
+ m_OutBuffer.WriteBytes(buffer, size);
54
+ m_BasePosition += size;
55
+ }
56
+
57
+ void COutArchive::WriteByte(Byte b)
58
+ {
59
+ WriteBytes(&b, 1);
60
+ }
61
+
62
+ void COutArchive::WriteUInt16(UInt16 value)
63
+ {
64
+ for (int i = 0; i < 2; i++)
65
+ {
66
+ WriteByte((Byte)value);
67
+ value >>= 8;
68
+ }
69
+ }
70
+
71
+ void COutArchive::WriteUInt32(UInt32 value)
72
+ {
73
+ for (int i = 0; i < 4; i++)
74
+ {
75
+ WriteByte((Byte)value);
76
+ value >>= 8;
77
+ }
78
+ }
79
+
80
+ void COutArchive::WriteUInt64(UInt64 value)
81
+ {
82
+ for (int i = 0; i < 8; i++)
83
+ {
84
+ WriteByte((Byte)value);
85
+ value >>= 8;
86
+ }
87
+ }
88
+
89
+ void COutArchive::WriteExtra(const CExtraBlock &extra)
90
+ {
91
+ if (extra.SubBlocks.Size() != 0)
92
+ {
93
+ for (int i = 0; i < extra.SubBlocks.Size(); i++)
94
+ {
95
+ const CExtraSubBlock &subBlock = extra.SubBlocks[i];
96
+ WriteUInt16(subBlock.ID);
97
+ WriteUInt16((UInt16)subBlock.Data.GetCapacity());
98
+ WriteBytes(subBlock.Data, (UInt32)subBlock.Data.GetCapacity());
99
+ }
100
+ }
101
+ }
102
+
103
+ void COutArchive::SeekTo(UInt64 offset)
104
+ {
105
+ HRESULT res = m_Stream->Seek(offset, STREAM_SEEK_SET, NULL);
106
+ if (res != S_OK)
107
+ throw CSystemException(res);
108
+ }
109
+
110
+ void COutArchive::WriteLocalHeader(const CLocalItem &item)
111
+ {
112
+ SeekTo(m_BasePosition);
113
+
114
+ bool isZip64 = m_IsZip64 || item.PackSize >= 0xFFFFFFFF || item.UnPackSize >= 0xFFFFFFFF;
115
+
116
+ WriteUInt32(NSignature::kLocalFileHeader);
117
+ {
118
+ Byte ver = item.ExtractVersion.Version;
119
+ if (isZip64 && ver < NFileHeader::NCompressionMethod::kExtractVersion_Zip64)
120
+ ver = NFileHeader::NCompressionMethod::kExtractVersion_Zip64;
121
+ WriteByte(ver);
122
+ }
123
+ WriteByte(item.ExtractVersion.HostOS);
124
+ WriteUInt16(item.Flags);
125
+ WriteUInt16(item.CompressionMethod);
126
+ WriteUInt32(item.Time);
127
+ WriteUInt32(item.FileCRC);
128
+ WriteUInt32(isZip64 ? 0xFFFFFFFF: (UInt32)item.PackSize);
129
+ WriteUInt32(isZip64 ? 0xFFFFFFFF: (UInt32)item.UnPackSize);
130
+ WriteUInt16((UInt16)item.Name.Length());
131
+ {
132
+ UInt16 localExtraSize = (UInt16)((isZip64 ? (4 + 16): 0) + item.LocalExtra.GetSize());
133
+ if (localExtraSize > m_ExtraSize)
134
+ throw CSystemException(E_FAIL);
135
+ }
136
+ WriteUInt16((UInt16)m_ExtraSize); // test it;
137
+ WriteBytes((const char *)item.Name, item.Name.Length());
138
+
139
+ UInt32 extraPos = 0;
140
+ if (isZip64)
141
+ {
142
+ extraPos += 4 + 16;
143
+ WriteUInt16(NFileHeader::NExtraID::kZip64);
144
+ WriteUInt16(16);
145
+ WriteUInt64(item.UnPackSize);
146
+ WriteUInt64(item.PackSize);
147
+ }
148
+
149
+ WriteExtra(item.LocalExtra);
150
+ extraPos += (UInt32)item.LocalExtra.GetSize();
151
+ for (; extraPos < m_ExtraSize; extraPos++)
152
+ WriteByte(0);
153
+
154
+ m_OutBuffer.FlushWithCheck();
155
+ MoveBasePosition(item.PackSize);
156
+ SeekTo(m_BasePosition);
157
+ }
158
+
159
+ void COutArchive::WriteCentralHeader(const CItem &item)
160
+ {
161
+ bool isUnPack64 = item.UnPackSize >= 0xFFFFFFFF;
162
+ bool isPack64 = item.PackSize >= 0xFFFFFFFF;
163
+ bool isPosition64 = item.LocalHeaderPosition >= 0xFFFFFFFF;
164
+ bool isZip64 = isPack64 || isUnPack64 || isPosition64;
165
+
166
+ WriteUInt32(NSignature::kCentralFileHeader);
167
+ WriteByte(item.MadeByVersion.Version);
168
+ WriteByte(item.MadeByVersion.HostOS);
169
+ {
170
+ Byte ver = item.ExtractVersion.Version;
171
+ if (isZip64 && ver < NFileHeader::NCompressionMethod::kExtractVersion_Zip64)
172
+ ver = NFileHeader::NCompressionMethod::kExtractVersion_Zip64;
173
+ WriteByte(ver);
174
+ }
175
+ WriteByte(item.ExtractVersion.HostOS);
176
+ WriteUInt16(item.Flags);
177
+ WriteUInt16(item.CompressionMethod);
178
+ WriteUInt32(item.Time);
179
+ WriteUInt32(item.FileCRC);
180
+ WriteUInt32(isPack64 ? 0xFFFFFFFF: (UInt32)item.PackSize);
181
+ WriteUInt32(isUnPack64 ? 0xFFFFFFFF: (UInt32)item.UnPackSize);
182
+ WriteUInt16((UInt16)item.Name.Length());
183
+ UInt16 zip64ExtraSize = (UInt16)((isUnPack64 ? 8: 0) + (isPack64 ? 8: 0) + (isPosition64 ? 8: 0));
184
+ const UInt16 kNtfsExtraSize = 4 + 2 + 2 + (3 * 8);
185
+ UInt16 centralExtraSize = (UInt16)(isZip64 ? (4 + zip64ExtraSize) : 0) + (item.NtfsTimeIsDefined ? (4 + kNtfsExtraSize) : 0);
186
+ centralExtraSize = (UInt16)(centralExtraSize + item.CentralExtra.GetSize());
187
+ WriteUInt16(centralExtraSize); // test it;
188
+ WriteUInt16((UInt16)item.Comment.GetCapacity());
189
+ WriteUInt16(0); // DiskNumberStart;
190
+ WriteUInt16(item.InternalAttributes);
191
+ WriteUInt32(item.ExternalAttributes);
192
+ WriteUInt32(isPosition64 ? 0xFFFFFFFF: (UInt32)item.LocalHeaderPosition);
193
+ WriteBytes((const char *)item.Name, item.Name.Length());
194
+ if (isZip64)
195
+ {
196
+ WriteUInt16(NFileHeader::NExtraID::kZip64);
197
+ WriteUInt16(zip64ExtraSize);
198
+ if(isUnPack64)
199
+ WriteUInt64(item.UnPackSize);
200
+ if(isPack64)
201
+ WriteUInt64(item.PackSize);
202
+ if(isPosition64)
203
+ WriteUInt64(item.LocalHeaderPosition);
204
+ }
205
+ if (item.NtfsTimeIsDefined)
206
+ {
207
+ WriteUInt16(NFileHeader::NExtraID::kNTFS);
208
+ WriteUInt16(kNtfsExtraSize);
209
+ WriteUInt32(0); // reserved
210
+ WriteUInt16(NFileHeader::NNtfsExtra::kTagTime);
211
+ WriteUInt16(8 * 3);
212
+ WriteUInt32(item.NtfsMTime.dwLowDateTime);
213
+ WriteUInt32(item.NtfsMTime.dwHighDateTime);
214
+ WriteUInt32(item.NtfsATime.dwLowDateTime);
215
+ WriteUInt32(item.NtfsATime.dwHighDateTime);
216
+ WriteUInt32(item.NtfsCTime.dwLowDateTime);
217
+ WriteUInt32(item.NtfsCTime.dwHighDateTime);
218
+ }
219
+ WriteExtra(item.CentralExtra);
220
+ if (item.Comment.GetCapacity() > 0)
221
+ WriteBytes(item.Comment, (UInt32)item.Comment.GetCapacity());
222
+ }
223
+
224
+ void COutArchive::WriteCentralDir(const CObjectVector<CItem> &items, const CByteBuffer *comment)
225
+ {
226
+ SeekTo(m_BasePosition);
227
+
228
+ UInt64 cdOffset = GetCurrentPosition();
229
+ for(int i = 0; i < items.Size(); i++)
230
+ WriteCentralHeader(items[i]);
231
+ UInt64 cd64EndOffset = GetCurrentPosition();
232
+ UInt64 cdSize = cd64EndOffset - cdOffset;
233
+ bool cdOffset64 = cdOffset >= 0xFFFFFFFF;
234
+ bool cdSize64 = cdSize >= 0xFFFFFFFF;
235
+ bool items64 = items.Size() >= 0xFFFF;
236
+ bool isZip64 = (cdOffset64 || cdSize64 || items64);
237
+
238
+ if (isZip64)
239
+ {
240
+ WriteUInt32(NSignature::kZip64EndOfCentralDir);
241
+ WriteUInt64(kZip64EcdSize); // ThisDiskNumber = 0;
242
+ WriteUInt16(45); // version
243
+ WriteUInt16(45); // version
244
+ WriteUInt32(0); // ThisDiskNumber = 0;
245
+ WriteUInt32(0); // StartCentralDirectoryDiskNumber;;
246
+ WriteUInt64((UInt64)items.Size());
247
+ WriteUInt64((UInt64)items.Size());
248
+ WriteUInt64((UInt64)cdSize);
249
+ WriteUInt64((UInt64)cdOffset);
250
+
251
+ WriteUInt32(NSignature::kZip64EndOfCentralDirLocator);
252
+ WriteUInt32(0); // number of the disk with the start of the zip64 end of central directory
253
+ WriteUInt64(cd64EndOffset);
254
+ WriteUInt32(1); // total number of disks
255
+ }
256
+ WriteUInt32(NSignature::kEndOfCentralDir);
257
+ WriteUInt16(0); // ThisDiskNumber = 0;
258
+ WriteUInt16(0); // StartCentralDirectoryDiskNumber;
259
+ WriteUInt16((UInt16)(items64 ? 0xFFFF: items.Size()));
260
+ WriteUInt16((UInt16)(items64 ? 0xFFFF: items.Size()));
261
+ WriteUInt32(cdSize64 ? 0xFFFFFFFF: (UInt32)cdSize);
262
+ WriteUInt32(cdOffset64 ? 0xFFFFFFFF: (UInt32)cdOffset);
263
+ UInt32 commentSize = (UInt32)(comment ? comment->GetCapacity() : 0);
264
+ WriteUInt16((UInt16)commentSize);
265
+ if (commentSize > 0)
266
+ WriteBytes((const Byte *)*comment, commentSize);
267
+ m_OutBuffer.FlushWithCheck();
268
+ }
269
+
270
+ void COutArchive::CreateStreamForCompressing(IOutStream **outStream)
271
+ {
272
+ COffsetOutStream *streamSpec = new COffsetOutStream;
273
+ CMyComPtr<IOutStream> tempStream(streamSpec);
274
+ streamSpec->Init(m_Stream, m_BasePosition + m_LocalFileHeaderSize);
275
+ *outStream = tempStream.Detach();
276
+ }
277
+
278
+ void COutArchive::SeekToPackedDataPosition()
279
+ {
280
+ SeekTo(m_BasePosition + m_LocalFileHeaderSize);
281
+ }
282
+
283
+ void COutArchive::CreateStreamForCopying(ISequentialOutStream **outStream)
284
+ {
285
+ CMyComPtr<ISequentialOutStream> tempStream(m_Stream);
286
+ *outStream = tempStream.Detach();
287
+ }
288
+
289
+ }}
@@ -0,0 +1,56 @@
1
+ // ZipOut.h
2
+
3
+ #ifndef __ZIP_OUT_H
4
+ #define __ZIP_OUT_H
5
+
6
+ #include "Common/MyCom.h"
7
+
8
+ #include "../../IStream.h"
9
+ #include "../../Common/OutBuffer.h"
10
+
11
+ #include "ZipItem.h"
12
+
13
+ namespace NArchive {
14
+ namespace NZip {
15
+
16
+ // can throw CSystemException and COutBufferException
17
+
18
+ class COutArchive
19
+ {
20
+ CMyComPtr<IOutStream> m_Stream;
21
+ COutBuffer m_OutBuffer;
22
+
23
+ UInt64 m_BasePosition;
24
+ UInt32 m_LocalFileHeaderSize;
25
+ UInt32 m_ExtraSize;
26
+ bool m_IsZip64;
27
+
28
+ void WriteBytes(const void *buffer, UInt32 size);
29
+ void WriteByte(Byte b);
30
+ void WriteUInt16(UInt16 value);
31
+ void WriteUInt32(UInt32 value);
32
+ void WriteUInt64(UInt64 value);
33
+
34
+ void WriteExtraHeader(const CItem &item);
35
+ void WriteCentralHeader(const CItem &item);
36
+ void WriteExtra(const CExtraBlock &extra);
37
+ void SeekTo(UInt64 offset);
38
+ public:
39
+ void Create(IOutStream *outStream);
40
+ void MoveBasePosition(UInt64 distanceToMove);
41
+ UInt64 GetCurrentPosition() const { return m_BasePosition; };
42
+ void PrepareWriteCompressedDataZip64(UInt16 fileNameLength, bool isZip64, bool aesEncryption);
43
+ void PrepareWriteCompressedData(UInt16 fileNameLength, UInt64 unPackSize, bool aesEncryption);
44
+ void PrepareWriteCompressedData2(UInt16 fileNameLength, UInt64 unPackSize, UInt64 packSize, bool aesEncryption);
45
+ void WriteLocalHeader(const CLocalItem &item);
46
+
47
+ void WriteCentralDir(const CObjectVector<CItem> &items, const CByteBuffer *comment);
48
+
49
+ void CreateStreamForCompressing(IOutStream **outStream);
50
+ void CreateStreamForCopying(ISequentialOutStream **outStream);
51
+ void SeekToPackedDataPosition();
52
+ };
53
+
54
+ }}
55
+
56
+ #endif
@@ -0,0 +1,18 @@
1
+ // ZipRegister.cpp
2
+
3
+ #include "StdAfx.h"
4
+
5
+ #include "../../Common/RegisterArc.h"
6
+
7
+ #include "ZipHandler.h"
8
+ static IInArchive *CreateArc() { return new NArchive::NZip::CHandler; }
9
+ #ifndef EXTRACT_ONLY
10
+ static IOutArchive *CreateArcOut() { return new NArchive::NZip::CHandler; }
11
+ #else
12
+ #define CreateArcOut 0
13
+ #endif
14
+
15
+ static CArcInfo g_ArcInfo =
16
+ { L"zip", L"zip jar xpi odt ods docx xlsx", 0, 1, { 0x50, 0x4B, 0x03, 0x04 }, 4, false, CreateArc, CreateArcOut };
17
+
18
+ REGISTER_ARC(Zip)
@@ -0,0 +1,1076 @@
1
+ // ZipUpdate.cpp
2
+
3
+ #include "StdAfx.h"
4
+
5
+ #include "../../../../C/Alloc.h"
6
+
7
+ #include "Common/AutoPtr.h"
8
+ #include "Common/Defs.h"
9
+ #include "Common/StringConvert.h"
10
+
11
+ #include "Windows/Defs.h"
12
+ #include "Windows/Thread.h"
13
+
14
+ #include "../../Common/CreateCoder.h"
15
+ #include "../../Common/LimitedStreams.h"
16
+ #include "../../Common/OutMemStream.h"
17
+ #include "../../Common/ProgressUtils.h"
18
+ #ifndef _7ZIP_ST
19
+ #include "../../Common/ProgressMt.h"
20
+ #endif
21
+ #include "../../Common/StreamUtils.h"
22
+
23
+ #include "../../Compress/CopyCoder.h"
24
+
25
+ #include "ZipAddCommon.h"
26
+ #include "ZipOut.h"
27
+ #include "ZipUpdate.h"
28
+
29
+ using namespace NWindows;
30
+ using namespace NSynchronization;
31
+
32
+ namespace NArchive {
33
+ namespace NZip {
34
+
35
+ static const Byte kHostOS =
36
+ #ifdef _WIN32
37
+ NFileHeader::NHostOS::kFAT;
38
+ #else
39
+ NFileHeader::NHostOS::kUnix;
40
+ #endif
41
+
42
+ static const Byte kMadeByHostOS = kHostOS;
43
+ static const Byte kExtractHostOS = kHostOS;
44
+
45
+ static const Byte kMethodForDirectory = NFileHeader::NCompressionMethod::kStored;
46
+
47
+ static HRESULT CopyBlockToArchive(ISequentialInStream *inStream,
48
+ COutArchive &outArchive, ICompressProgressInfo *progress)
49
+ {
50
+ CMyComPtr<ISequentialOutStream> outStream;
51
+ outArchive.CreateStreamForCopying(&outStream);
52
+ return NCompress::CopyStream(inStream, outStream, progress);
53
+ }
54
+
55
+ static HRESULT WriteRange(IInStream *inStream, COutArchive &outArchive,
56
+ const CUpdateRange &range, ICompressProgressInfo *progress)
57
+ {
58
+ UInt64 position;
59
+ RINOK(inStream->Seek(range.Position, STREAM_SEEK_SET, &position));
60
+
61
+ CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
62
+ CMyComPtr<CLimitedSequentialInStream> inStreamLimited(streamSpec);
63
+ streamSpec->SetStream(inStream);
64
+ streamSpec->Init(range.Size);
65
+
66
+ RINOK(CopyBlockToArchive(inStreamLimited, outArchive, progress));
67
+ return progress->SetRatioInfo(&range.Size, &range.Size);
68
+ }
69
+
70
+ static void SetFileHeader(
71
+ COutArchive &archive,
72
+ const CCompressionMethodMode &options,
73
+ const CUpdateItem &ui,
74
+ CItem &item)
75
+ {
76
+ item.UnPackSize = ui.Size;
77
+ bool isDir;
78
+
79
+ item.ClearFlags();
80
+
81
+ if (ui.NewProperties)
82
+ {
83
+ isDir = ui.IsDir;
84
+ item.Name = ui.Name;
85
+ item.SetUtf8(ui.IsUtf8);
86
+ item.ExternalAttributes = ui.Attributes;
87
+ item.Time = ui.Time;
88
+ item.NtfsMTime = ui.NtfsMTime;
89
+ item.NtfsATime = ui.NtfsATime;
90
+ item.NtfsCTime = ui.NtfsCTime;
91
+ item.NtfsTimeIsDefined = ui.NtfsTimeIsDefined;
92
+ }
93
+ else
94
+ isDir = item.IsDir();
95
+
96
+ item.LocalHeaderPosition = archive.GetCurrentPosition();
97
+ item.MadeByVersion.HostOS = kMadeByHostOS;
98
+ item.MadeByVersion.Version = NFileHeader::NCompressionMethod::kMadeByProgramVersion;
99
+
100
+ item.ExtractVersion.HostOS = kExtractHostOS;
101
+
102
+ item.InternalAttributes = 0; // test it
103
+ item.SetEncrypted(!isDir && options.PasswordIsDefined);
104
+ if (isDir)
105
+ {
106
+ item.ExtractVersion.Version = NFileHeader::NCompressionMethod::kExtractVersion_Dir;
107
+ item.CompressionMethod = kMethodForDirectory;
108
+ item.PackSize = 0;
109
+ item.FileCRC = 0; // test it
110
+ }
111
+ }
112
+
113
+ static void SetItemInfoFromCompressingResult(const CCompressingResult &compressingResult,
114
+ bool isAesMode, Byte aesKeyMode, CItem &item)
115
+ {
116
+ item.ExtractVersion.Version = compressingResult.ExtractVersion;
117
+ item.CompressionMethod = compressingResult.Method;
118
+ item.FileCRC = compressingResult.CRC;
119
+ item.UnPackSize = compressingResult.UnpackSize;
120
+ item.PackSize = compressingResult.PackSize;
121
+
122
+ item.LocalExtra.Clear();
123
+ item.CentralExtra.Clear();
124
+
125
+ if (isAesMode)
126
+ {
127
+ CWzAesExtraField wzAesField;
128
+ wzAesField.Strength = aesKeyMode;
129
+ wzAesField.Method = compressingResult.Method;
130
+ item.CompressionMethod = NFileHeader::NCompressionMethod::kWzAES;
131
+ item.FileCRC = 0;
132
+ CExtraSubBlock sb;
133
+ wzAesField.SetSubBlock(sb);
134
+ item.LocalExtra.SubBlocks.Add(sb);
135
+ item.CentralExtra.SubBlocks.Add(sb);
136
+ }
137
+ }
138
+
139
+ #ifndef _7ZIP_ST
140
+
141
+ static THREAD_FUNC_DECL CoderThread(void *threadCoderInfo);
142
+
143
+ struct CThreadInfo
144
+ {
145
+ #ifdef EXTERNAL_CODECS
146
+ CMyComPtr<ICompressCodecsInfo> _codecsInfo;
147
+ const CObjectVector<CCodecInfoEx> *_externalCodecs;
148
+ #endif
149
+
150
+ NWindows::CThread Thread;
151
+ NWindows::NSynchronization::CAutoResetEvent CompressEvent;
152
+ NWindows::NSynchronization::CAutoResetEventWFMO CompressionCompletedEvent;
153
+ bool ExitThread;
154
+
155
+ CMtCompressProgress *ProgressSpec;
156
+ CMyComPtr<ICompressProgressInfo> Progress;
157
+
158
+ COutMemStream *OutStreamSpec;
159
+ CMyComPtr<IOutStream> OutStream;
160
+ CMyComPtr<ISequentialInStream> InStream;
161
+
162
+ CAddCommon Coder;
163
+ HRESULT Result;
164
+ CCompressingResult CompressingResult;
165
+
166
+ bool IsFree;
167
+ UInt32 UpdateIndex;
168
+
169
+ CThreadInfo(const CCompressionMethodMode &options):
170
+ ExitThread(false),
171
+ ProgressSpec(0),
172
+ OutStreamSpec(0),
173
+ Coder(options)
174
+ {}
175
+
176
+ HRESULT CreateEvents(CSynchro *sync)
177
+ {
178
+ RINOK(CompressEvent.CreateIfNotCreated());
179
+ return CompressionCompletedEvent.CreateIfNotCreated(sync);
180
+ }
181
+ HRes CreateThread() { return Thread.Create(CoderThread, this); }
182
+
183
+ void WaitAndCode();
184
+ void StopWaitClose()
185
+ {
186
+ ExitThread = true;
187
+ if (OutStreamSpec != 0)
188
+ OutStreamSpec->StopWriting(E_ABORT);
189
+ if (CompressEvent.IsCreated())
190
+ CompressEvent.Set();
191
+ Thread.Wait();
192
+ Thread.Close();
193
+ }
194
+
195
+ };
196
+
197
+ void CThreadInfo::WaitAndCode()
198
+ {
199
+ for (;;)
200
+ {
201
+ CompressEvent.Lock();
202
+ if (ExitThread)
203
+ return;
204
+ Result = Coder.Compress(
205
+ #ifdef EXTERNAL_CODECS
206
+ _codecsInfo, _externalCodecs,
207
+ #endif
208
+ InStream, OutStream, Progress, CompressingResult);
209
+ if (Result == S_OK && Progress)
210
+ Result = Progress->SetRatioInfo(&CompressingResult.UnpackSize, &CompressingResult.PackSize);
211
+ CompressionCompletedEvent.Set();
212
+ }
213
+ }
214
+
215
+ static THREAD_FUNC_DECL CoderThread(void *threadCoderInfo)
216
+ {
217
+ ((CThreadInfo *)threadCoderInfo)->WaitAndCode();
218
+ return 0;
219
+ }
220
+
221
+ class CThreads
222
+ {
223
+ public:
224
+ CObjectVector<CThreadInfo> Threads;
225
+ ~CThreads()
226
+ {
227
+ for (int i = 0; i < Threads.Size(); i++)
228
+ Threads[i].StopWaitClose();
229
+ }
230
+ };
231
+
232
+ struct CMemBlocks2: public CMemLockBlocks
233
+ {
234
+ CCompressingResult CompressingResult;
235
+ bool Defined;
236
+ bool Skip;
237
+ CMemBlocks2(): Defined(false), Skip(false) {}
238
+ };
239
+
240
+ class CMemRefs
241
+ {
242
+ public:
243
+ CMemBlockManagerMt *Manager;
244
+ CObjectVector<CMemBlocks2> Refs;
245
+ CMemRefs(CMemBlockManagerMt *manager): Manager(manager) {} ;
246
+ ~CMemRefs()
247
+ {
248
+ for (int i = 0; i < Refs.Size(); i++)
249
+ Refs[i].FreeOpt(Manager);
250
+ }
251
+ };
252
+
253
+ class CMtProgressMixer2:
254
+ public ICompressProgressInfo,
255
+ public CMyUnknownImp
256
+ {
257
+ UInt64 ProgressOffset;
258
+ UInt64 InSizes[2];
259
+ UInt64 OutSizes[2];
260
+ CMyComPtr<IProgress> Progress;
261
+ CMyComPtr<ICompressProgressInfo> RatioProgress;
262
+ bool _inSizeIsMain;
263
+ public:
264
+ NWindows::NSynchronization::CCriticalSection CriticalSection;
265
+ MY_UNKNOWN_IMP
266
+ void Create(IProgress *progress, bool inSizeIsMain);
267
+ void SetProgressOffset(UInt64 progressOffset);
268
+ HRESULT SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize);
269
+ STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
270
+ };
271
+
272
+ void CMtProgressMixer2::Create(IProgress *progress, bool inSizeIsMain)
273
+ {
274
+ Progress = progress;
275
+ Progress.QueryInterface(IID_ICompressProgressInfo, &RatioProgress);
276
+ _inSizeIsMain = inSizeIsMain;
277
+ ProgressOffset = InSizes[0] = InSizes[1] = OutSizes[0] = OutSizes[1] = 0;
278
+ }
279
+
280
+ void CMtProgressMixer2::SetProgressOffset(UInt64 progressOffset)
281
+ {
282
+ CriticalSection.Enter();
283
+ InSizes[1] = OutSizes[1] = 0;
284
+ ProgressOffset = progressOffset;
285
+ CriticalSection.Leave();
286
+ }
287
+
288
+ HRESULT CMtProgressMixer2::SetRatioInfo(int index, const UInt64 *inSize, const UInt64 *outSize)
289
+ {
290
+ NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection);
291
+ if (index == 0 && RatioProgress)
292
+ {
293
+ RINOK(RatioProgress->SetRatioInfo(inSize, outSize));
294
+ }
295
+ if (inSize != 0)
296
+ InSizes[index] = *inSize;
297
+ if (outSize != 0)
298
+ OutSizes[index] = *outSize;
299
+ UInt64 v = ProgressOffset + (_inSizeIsMain ?
300
+ (InSizes[0] + InSizes[1]) :
301
+ (OutSizes[0] + OutSizes[1]));
302
+ return Progress->SetCompleted(&v);
303
+ }
304
+
305
+ STDMETHODIMP CMtProgressMixer2::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
306
+ {
307
+ return SetRatioInfo(0, inSize, outSize);
308
+ }
309
+
310
+ class CMtProgressMixer:
311
+ public ICompressProgressInfo,
312
+ public CMyUnknownImp
313
+ {
314
+ public:
315
+ CMtProgressMixer2 *Mixer2;
316
+ CMyComPtr<ICompressProgressInfo> RatioProgress;
317
+ void Create(IProgress *progress, bool inSizeIsMain);
318
+ MY_UNKNOWN_IMP
319
+ STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
320
+ };
321
+
322
+ void CMtProgressMixer::Create(IProgress *progress, bool inSizeIsMain)
323
+ {
324
+ Mixer2 = new CMtProgressMixer2;
325
+ RatioProgress = Mixer2;
326
+ Mixer2->Create(progress, inSizeIsMain);
327
+ }
328
+
329
+ STDMETHODIMP CMtProgressMixer::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
330
+ {
331
+ return Mixer2->SetRatioInfo(1, inSize, outSize);
332
+ }
333
+
334
+
335
+ #endif
336
+
337
+
338
+ static HRESULT UpdateItemOldData(COutArchive &archive,
339
+ IInStream *inStream,
340
+ const CUpdateItem &ui, CItemEx &item,
341
+ /* bool izZip64, */
342
+ ICompressProgressInfo *progress,
343
+ UInt64 &complexity)
344
+ {
345
+ if (ui.NewProperties)
346
+ {
347
+ if (item.HasDescriptor())
348
+ return E_NOTIMPL;
349
+
350
+ // use old name size.
351
+ // CUpdateRange range(item.GetLocalExtraPosition(), item.LocalExtraSize + item.PackSize);
352
+ CUpdateRange range(item.GetDataPosition(), item.PackSize);
353
+
354
+ // item.ExternalAttributes = ui.Attributes;
355
+ // Test it
356
+ item.Name = ui.Name;
357
+ item.SetUtf8(ui.IsUtf8);
358
+ item.Time = ui.Time;
359
+ item.NtfsMTime = ui.NtfsMTime;
360
+ item.NtfsATime = ui.NtfsATime;
361
+ item.NtfsCTime = ui.NtfsCTime;
362
+ item.NtfsTimeIsDefined = ui.NtfsTimeIsDefined;
363
+
364
+ item.CentralExtra.RemoveUnknownSubBlocks();
365
+ item.LocalExtra.RemoveUnknownSubBlocks();
366
+
367
+ archive.PrepareWriteCompressedData2((UInt16)item.Name.Length(), item.UnPackSize, item.PackSize, item.LocalExtra.HasWzAesField());
368
+ item.LocalHeaderPosition = archive.GetCurrentPosition();
369
+ archive.SeekToPackedDataPosition();
370
+ RINOK(WriteRange(inStream, archive, range, progress));
371
+ complexity += range.Size;
372
+ archive.WriteLocalHeader(item);
373
+ }
374
+ else
375
+ {
376
+ CUpdateRange range(item.LocalHeaderPosition, item.GetLocalFullSize());
377
+
378
+ // set new header position
379
+ item.LocalHeaderPosition = archive.GetCurrentPosition();
380
+
381
+ RINOK(WriteRange(inStream, archive, range, progress));
382
+ complexity += range.Size;
383
+ archive.MoveBasePosition(range.Size);
384
+ }
385
+ return S_OK;
386
+ }
387
+
388
+ static void WriteDirHeader(COutArchive &archive, const CCompressionMethodMode *options,
389
+ const CUpdateItem &ui, CItemEx &item)
390
+ {
391
+ SetFileHeader(archive, *options, ui, item);
392
+ archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);
393
+ archive.WriteLocalHeader(item);
394
+ }
395
+
396
+ static HRESULT Update2St(
397
+ DECL_EXTERNAL_CODECS_LOC_VARS
398
+ COutArchive &archive,
399
+ CInArchive *inArchive,
400
+ IInStream *inStream,
401
+ const CObjectVector<CItemEx> &inputItems,
402
+ const CObjectVector<CUpdateItem> &updateItems,
403
+ const CCompressionMethodMode *options,
404
+ const CByteBuffer *comment,
405
+ IArchiveUpdateCallback *updateCallback)
406
+ {
407
+ CLocalProgress *lps = new CLocalProgress;
408
+ CMyComPtr<ICompressProgressInfo> progress = lps;
409
+ lps->Init(updateCallback, true);
410
+
411
+ CAddCommon compressor(*options);
412
+
413
+ CObjectVector<CItem> items;
414
+ UInt64 unpackSizeTotal = 0, packSizeTotal = 0;
415
+
416
+ for (int itemIndex = 0; itemIndex < updateItems.Size(); itemIndex++)
417
+ {
418
+ lps->InSize = unpackSizeTotal;
419
+ lps->OutSize = packSizeTotal;
420
+ RINOK(lps->SetCur());
421
+ const CUpdateItem &ui = updateItems[itemIndex];
422
+ CItemEx item;
423
+ if (!ui.NewProperties || !ui.NewData)
424
+ {
425
+ item = inputItems[ui.IndexInArchive];
426
+ if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)
427
+ return E_NOTIMPL;
428
+ }
429
+
430
+ if (ui.NewData)
431
+ {
432
+ bool isDir = ((ui.NewProperties) ? ui.IsDir : item.IsDir());
433
+ if (isDir)
434
+ {
435
+ WriteDirHeader(archive, options, ui, item);
436
+ }
437
+ else
438
+ {
439
+ CMyComPtr<ISequentialInStream> fileInStream;
440
+ HRESULT res = updateCallback->GetStream(ui.IndexInClient, &fileInStream);
441
+ if (res == S_FALSE)
442
+ {
443
+ lps->ProgressOffset += ui.Size;
444
+ RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
445
+ continue;
446
+ }
447
+ RINOK(res);
448
+
449
+ // file Size can be 64-bit !!!
450
+ SetFileHeader(archive, *options, ui, item);
451
+ archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);
452
+ CCompressingResult compressingResult;
453
+ CMyComPtr<IOutStream> outStream;
454
+ archive.CreateStreamForCompressing(&outStream);
455
+ RINOK(compressor.Compress(
456
+ EXTERNAL_CODECS_LOC_VARS
457
+ fileInStream, outStream, progress, compressingResult));
458
+ SetItemInfoFromCompressingResult(compressingResult, options->IsAesMode, options->AesKeyMode, item);
459
+ archive.WriteLocalHeader(item);
460
+ RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
461
+ unpackSizeTotal += item.UnPackSize;
462
+ packSizeTotal += item.PackSize;
463
+ }
464
+ }
465
+ else
466
+ {
467
+ UInt64 complexity = 0;
468
+ lps->SendRatio = false;
469
+ RINOK(UpdateItemOldData(archive, inStream, ui, item, progress, complexity));
470
+ lps->SendRatio = true;
471
+ lps->ProgressOffset += complexity;
472
+ }
473
+ items.Add(item);
474
+ lps->ProgressOffset += NFileHeader::kLocalBlockSize;
475
+ }
476
+ archive.WriteCentralDir(items, comment);
477
+ return S_OK;
478
+ }
479
+
480
+ static HRESULT Update2(
481
+ DECL_EXTERNAL_CODECS_LOC_VARS
482
+ COutArchive &archive,
483
+ CInArchive *inArchive,
484
+ IInStream *inStream,
485
+ const CObjectVector<CItemEx> &inputItems,
486
+ const CObjectVector<CUpdateItem> &updateItems,
487
+ const CCompressionMethodMode *options,
488
+ const CByteBuffer *comment,
489
+ IArchiveUpdateCallback *updateCallback)
490
+ {
491
+ UInt64 complexity = 0;
492
+ UInt64 numFilesToCompress = 0;
493
+ UInt64 numBytesToCompress = 0;
494
+
495
+ int i;
496
+ for(i = 0; i < updateItems.Size(); i++)
497
+ {
498
+ const CUpdateItem &ui = updateItems[i];
499
+ if (ui.NewData)
500
+ {
501
+ complexity += ui.Size;
502
+ numBytesToCompress += ui.Size;
503
+ numFilesToCompress++;
504
+ /*
505
+ if (ui.Commented)
506
+ complexity += ui.CommentRange.Size;
507
+ */
508
+ }
509
+ else
510
+ {
511
+ CItemEx inputItem = inputItems[ui.IndexInArchive];
512
+ if (inArchive->ReadLocalItemAfterCdItemFull(inputItem) != S_OK)
513
+ return E_NOTIMPL;
514
+ complexity += inputItem.GetLocalFullSize();
515
+ // complexity += inputItem.GetCentralExtraPlusCommentSize();
516
+ }
517
+ complexity += NFileHeader::kLocalBlockSize;
518
+ complexity += NFileHeader::kCentralBlockSize;
519
+ }
520
+
521
+ if (comment)
522
+ complexity += comment->GetCapacity();
523
+ complexity++; // end of central
524
+ updateCallback->SetTotal(complexity);
525
+
526
+ CAddCommon compressor(*options);
527
+
528
+ complexity = 0;
529
+
530
+ #ifndef _7ZIP_ST
531
+
532
+ const size_t kNumMaxThreads = (1 << 10);
533
+ UInt32 numThreads = options->NumThreads;
534
+ if (numThreads > kNumMaxThreads)
535
+ numThreads = kNumMaxThreads;
536
+
537
+ const size_t kMemPerThread = (1 << 25);
538
+ const size_t kBlockSize = 1 << 16;
539
+
540
+ CCompressionMethodMode options2;
541
+ if (options != 0)
542
+ options2 = *options;
543
+
544
+ bool mtMode = ((options != 0) && (numThreads > 1));
545
+
546
+ if (numFilesToCompress <= 1)
547
+ mtMode = false;
548
+
549
+ if (mtMode)
550
+ {
551
+ Byte method = options->MethodSequence.Front();
552
+ if (method == NFileHeader::NCompressionMethod::kStored && !options->PasswordIsDefined)
553
+ mtMode = false;
554
+ if (method == NFileHeader::NCompressionMethod::kBZip2)
555
+ {
556
+ UInt64 averageSize = numBytesToCompress / numFilesToCompress;
557
+ UInt32 blockSize = options->DicSize;
558
+ if (blockSize == 0)
559
+ blockSize = 1;
560
+ UInt64 averageNumberOfBlocks = averageSize / blockSize;
561
+ UInt32 numBZip2Threads = 32;
562
+ if (averageNumberOfBlocks < numBZip2Threads)
563
+ numBZip2Threads = (UInt32)averageNumberOfBlocks;
564
+ if (numBZip2Threads < 1)
565
+ numBZip2Threads = 1;
566
+ numThreads = numThreads / numBZip2Threads;
567
+ options2.NumThreads = numBZip2Threads;
568
+ if (numThreads <= 1)
569
+ mtMode = false;
570
+ }
571
+ if (method == NFileHeader::NCompressionMethod::kLZMA)
572
+ {
573
+ UInt32 numLZMAThreads = (options->Algo > 0 ? 2 : 1);
574
+ numThreads /= numLZMAThreads;
575
+ options2.NumThreads = numLZMAThreads;
576
+ if (numThreads <= 1)
577
+ mtMode = false;
578
+ }
579
+ }
580
+
581
+ if (!mtMode)
582
+ #endif
583
+ return Update2St(
584
+ EXTERNAL_CODECS_LOC_VARS
585
+ archive, inArchive,inStream,
586
+ inputItems, updateItems, options, comment, updateCallback);
587
+
588
+
589
+ #ifndef _7ZIP_ST
590
+
591
+ // Warning : before memManager, threads and compressingCompletedEvents
592
+ // in order to have a "good" order for the destructor
593
+ NWindows::NSynchronization::CSynchro synchroForCompressingCompletedEvents;
594
+ synchroForCompressingCompletedEvents.Create();
595
+ NWindows::NSynchronization::CSynchro synchroForOutStreamSpec;
596
+ synchroForOutStreamSpec.Create();
597
+
598
+
599
+ CObjectVector<CItem> items;
600
+
601
+ CMtProgressMixer *mtProgressMixerSpec = new CMtProgressMixer;
602
+ CMyComPtr<ICompressProgressInfo> progress = mtProgressMixerSpec;
603
+ mtProgressMixerSpec->Create(updateCallback, true);
604
+
605
+ CMtCompressProgressMixer mtCompressProgressMixer;
606
+ mtCompressProgressMixer.Init(numThreads, mtProgressMixerSpec->RatioProgress);
607
+
608
+ CMemBlockManagerMt memManager(kBlockSize);
609
+ CMemRefs refs(&memManager);
610
+
611
+ CThreads threads;
612
+ CRecordVector<HANDLE> compressingCompletedEvents;
613
+ CRecordVector<int> threadIndices; // list threads in order of updateItems
614
+
615
+ {
616
+ RINOK(memManager.AllocateSpaceAlways(&synchroForOutStreamSpec,(size_t)numThreads * (kMemPerThread / kBlockSize)));
617
+ for(i = 0; i < updateItems.Size(); i++)
618
+ refs.Refs.Add(CMemBlocks2());
619
+
620
+ UInt32 i;
621
+ for (i = 0; i < numThreads; i++)
622
+ threads.Threads.Add(CThreadInfo(options2));
623
+
624
+ for (i = 0; i < numThreads; i++)
625
+ {
626
+ CThreadInfo &threadInfo = threads.Threads[i];
627
+ #ifdef EXTERNAL_CODECS
628
+ threadInfo._codecsInfo = codecsInfo;
629
+ threadInfo._externalCodecs = externalCodecs;
630
+ #endif
631
+ RINOK(threadInfo.CreateEvents(&synchroForCompressingCompletedEvents));
632
+ threadInfo.OutStreamSpec = new COutMemStream(&memManager);
633
+ RINOK(threadInfo.OutStreamSpec->CreateEvents(&synchroForOutStreamSpec));
634
+ threadInfo.OutStream = threadInfo.OutStreamSpec;
635
+ threadInfo.IsFree = true;
636
+ threadInfo.ProgressSpec = new CMtCompressProgress();
637
+ threadInfo.Progress = threadInfo.ProgressSpec;
638
+ threadInfo.ProgressSpec->Init(&mtCompressProgressMixer, (int)i);
639
+ RINOK(threadInfo.CreateThread());
640
+ }
641
+ }
642
+ int mtItemIndex = 0;
643
+
644
+ int itemIndex = 0;
645
+ int lastRealStreamItemIndex = -1;
646
+
647
+ while (itemIndex < updateItems.Size())
648
+ {
649
+ if ((UInt32)threadIndices.Size() < numThreads && mtItemIndex < updateItems.Size())
650
+ {
651
+ const CUpdateItem &ui = updateItems[mtItemIndex++];
652
+ if (!ui.NewData)
653
+ continue;
654
+ CItemEx item;
655
+ if (ui.NewProperties)
656
+ {
657
+ if (ui.IsDir)
658
+ continue;
659
+ }
660
+ else
661
+ {
662
+ item = inputItems[ui.IndexInArchive];
663
+ if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)
664
+ return E_NOTIMPL;
665
+ if (item.IsDir())
666
+ continue;
667
+ }
668
+ CMyComPtr<ISequentialInStream> fileInStream;
669
+ {
670
+ NWindows::NSynchronization::CCriticalSectionLock lock(mtProgressMixerSpec->Mixer2->CriticalSection);
671
+ HRESULT res = updateCallback->GetStream(ui.IndexInClient, &fileInStream);
672
+ if (res == S_FALSE)
673
+ {
674
+ complexity += ui.Size;
675
+ complexity += NFileHeader::kLocalBlockSize;
676
+ mtProgressMixerSpec->Mixer2->SetProgressOffset(complexity);
677
+ RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
678
+ refs.Refs[mtItemIndex - 1].Skip = true;
679
+ continue;
680
+ }
681
+ RINOK(res);
682
+ RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
683
+ }
684
+
685
+ for (UInt32 i = 0; i < numThreads; i++)
686
+ {
687
+ CThreadInfo &threadInfo = threads.Threads[i];
688
+ if (threadInfo.IsFree)
689
+ {
690
+ threadInfo.IsFree = false;
691
+ threadInfo.InStream = fileInStream;
692
+
693
+ // !!!!! we must release ref before sending event
694
+ // BUG was here in v4.43 and v4.44. It could change ref counter in two threads in same time
695
+ fileInStream.Release();
696
+
697
+ threadInfo.OutStreamSpec->Init();
698
+ threadInfo.ProgressSpec->Reinit();
699
+ threadInfo.CompressEvent.Set();
700
+ threadInfo.UpdateIndex = mtItemIndex - 1;
701
+
702
+ compressingCompletedEvents.Add(threadInfo.CompressionCompletedEvent);
703
+ threadIndices.Add(i);
704
+ break;
705
+ }
706
+ }
707
+ continue;
708
+ }
709
+
710
+ if (refs.Refs[itemIndex].Skip)
711
+ {
712
+ itemIndex++;
713
+ continue;
714
+ }
715
+
716
+ const CUpdateItem &ui = updateItems[itemIndex];
717
+
718
+ CItemEx item;
719
+ if (!ui.NewProperties || !ui.NewData)
720
+ {
721
+ item = inputItems[ui.IndexInArchive];
722
+ if (inArchive->ReadLocalItemAfterCdItemFull(item) != S_OK)
723
+ return E_NOTIMPL;
724
+ }
725
+
726
+ if (ui.NewData)
727
+ {
728
+ bool isDir = ((ui.NewProperties) ? ui.IsDir : item.IsDir());
729
+ if (isDir)
730
+ {
731
+ WriteDirHeader(archive, options, ui, item);
732
+ }
733
+ else
734
+ {
735
+ if (lastRealStreamItemIndex < itemIndex)
736
+ {
737
+ lastRealStreamItemIndex = itemIndex;
738
+ SetFileHeader(archive, *options, ui, item);
739
+ // file Size can be 64-bit !!!
740
+ archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), ui.Size, options->IsAesMode);
741
+ }
742
+
743
+ CMemBlocks2 &memRef = refs.Refs[itemIndex];
744
+ if (memRef.Defined)
745
+ {
746
+ CMyComPtr<IOutStream> outStream;
747
+ archive.CreateStreamForCompressing(&outStream);
748
+ memRef.WriteToStream(memManager.GetBlockSize(), outStream);
749
+ SetItemInfoFromCompressingResult(memRef.CompressingResult,
750
+ options->IsAesMode, options->AesKeyMode, item);
751
+ SetFileHeader(archive, *options, ui, item);
752
+ archive.WriteLocalHeader(item);
753
+ // RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
754
+ memRef.FreeOpt(&memManager);
755
+ }
756
+ else
757
+ {
758
+ {
759
+ CThreadInfo &thread = threads.Threads[threadIndices.Front()];
760
+ if (!thread.OutStreamSpec->WasUnlockEventSent())
761
+ {
762
+ CMyComPtr<IOutStream> outStream;
763
+ archive.CreateStreamForCompressing(&outStream);
764
+ thread.OutStreamSpec->SetOutStream(outStream);
765
+ thread.OutStreamSpec->SetRealStreamMode();
766
+ }
767
+ }
768
+
769
+ DWORD result = ::WaitForMultipleObjects(compressingCompletedEvents.Size(),
770
+ &compressingCompletedEvents.Front(), FALSE, INFINITE);
771
+ int t = (int)(result - WAIT_OBJECT_0);
772
+ CThreadInfo &threadInfo = threads.Threads[threadIndices[t]];
773
+ threadInfo.InStream.Release();
774
+ threadInfo.IsFree = true;
775
+ RINOK(threadInfo.Result);
776
+ threadIndices.Delete(t);
777
+ compressingCompletedEvents.Delete(t);
778
+ if (t == 0)
779
+ {
780
+ RINOK(threadInfo.OutStreamSpec->WriteToRealStream());
781
+ threadInfo.OutStreamSpec->ReleaseOutStream();
782
+ SetItemInfoFromCompressingResult(threadInfo.CompressingResult,
783
+ options->IsAesMode, options->AesKeyMode, item);
784
+ SetFileHeader(archive, *options, ui, item);
785
+ archive.WriteLocalHeader(item);
786
+ }
787
+ else
788
+ {
789
+ CMemBlocks2 &memRef = refs.Refs[threadInfo.UpdateIndex];
790
+ threadInfo.OutStreamSpec->DetachData(memRef);
791
+ memRef.CompressingResult = threadInfo.CompressingResult;
792
+ memRef.Defined = true;
793
+ continue;
794
+ }
795
+ }
796
+ }
797
+ }
798
+ else
799
+ {
800
+ RINOK(UpdateItemOldData(archive, inStream, ui, item, progress, complexity));
801
+ }
802
+ items.Add(item);
803
+ complexity += NFileHeader::kLocalBlockSize;
804
+ mtProgressMixerSpec->Mixer2->SetProgressOffset(complexity);
805
+ itemIndex++;
806
+ }
807
+ archive.WriteCentralDir(items, comment);
808
+ return S_OK;
809
+ #endif
810
+ }
811
+
812
+ static const size_t kCacheBlockSize = (1 << 20);
813
+ static const size_t kCacheSize = (kCacheBlockSize << 2);
814
+ static const size_t kCacheMask = (kCacheSize - 1);
815
+
816
+ class CCacheOutStream:
817
+ public IOutStream,
818
+ public CMyUnknownImp
819
+ {
820
+ CMyComPtr<IOutStream> _stream;
821
+ Byte *_cache;
822
+ UInt64 _virtPos;
823
+ UInt64 _virtSize;
824
+ UInt64 _phyPos;
825
+ UInt64 _phySize; // <= _virtSize
826
+ UInt64 _cachedPos; // (_cachedPos + _cachedSize) <= _virtSize
827
+ size_t _cachedSize;
828
+
829
+ HRESULT MyWrite(size_t size);
830
+ HRESULT MyWriteBlock()
831
+ {
832
+ return MyWrite(kCacheBlockSize - ((size_t)_cachedPos & (kCacheBlockSize - 1)));
833
+ }
834
+ HRESULT FlushCache();
835
+ public:
836
+ CCacheOutStream(): _cache(0) {}
837
+ ~CCacheOutStream();
838
+ bool Allocate();
839
+ HRESULT Init(IOutStream *stream);
840
+
841
+ MY_UNKNOWN_IMP
842
+
843
+ STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
844
+ STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
845
+ STDMETHOD(SetSize)(UInt64 newSize);
846
+ };
847
+
848
+ bool CCacheOutStream::Allocate()
849
+ {
850
+ if (!_cache)
851
+ _cache = (Byte *)::MidAlloc(kCacheSize);
852
+ return (_cache != NULL);
853
+ }
854
+
855
+ HRESULT CCacheOutStream::Init(IOutStream *stream)
856
+ {
857
+ _virtPos = _phyPos = 0;
858
+ _stream = stream;
859
+ RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &_virtPos));
860
+ RINOK(_stream->Seek(0, STREAM_SEEK_END, &_virtSize));
861
+ RINOK(_stream->Seek(_virtPos, STREAM_SEEK_SET, &_virtPos));
862
+ _phyPos = _virtPos;
863
+ _phySize = _virtSize;
864
+ _cachedPos = 0;
865
+ _cachedSize = 0;
866
+ return S_OK;
867
+ }
868
+
869
+ HRESULT CCacheOutStream::MyWrite(size_t size)
870
+ {
871
+ while (size != 0 && _cachedSize != 0)
872
+ {
873
+ if (_phyPos != _cachedPos)
874
+ {
875
+ RINOK(_stream->Seek(_cachedPos, STREAM_SEEK_SET, &_phyPos));
876
+ }
877
+ size_t pos = (size_t)_cachedPos & kCacheMask;
878
+ size_t curSize = MyMin(kCacheSize - pos, _cachedSize);
879
+ curSize = MyMin(curSize, size);
880
+ RINOK(WriteStream(_stream, _cache + pos, curSize));
881
+ _phyPos += curSize;
882
+ if (_phySize < _phyPos)
883
+ _phySize = _phyPos;
884
+ _cachedPos += curSize;
885
+ _cachedSize -= curSize;
886
+ size -= curSize;
887
+ }
888
+ return S_OK;
889
+ }
890
+
891
+ HRESULT CCacheOutStream::FlushCache()
892
+ {
893
+ return MyWrite(_cachedSize);
894
+ }
895
+
896
+ CCacheOutStream::~CCacheOutStream()
897
+ {
898
+ FlushCache();
899
+ if (_virtSize != _phySize)
900
+ _stream->SetSize(_virtSize);
901
+ if (_virtPos != _phyPos)
902
+ _stream->Seek(_virtPos, STREAM_SEEK_SET, NULL);
903
+ ::MidFree(_cache);
904
+ }
905
+
906
+ STDMETHODIMP CCacheOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
907
+ {
908
+ if (processedSize)
909
+ *processedSize = 0;
910
+ if (size == 0)
911
+ return S_OK;
912
+
913
+ UInt64 zerosStart = _virtPos;
914
+ if (_cachedSize != 0)
915
+ {
916
+ if (_virtPos < _cachedPos)
917
+ {
918
+ RINOK(FlushCache());
919
+ }
920
+ else
921
+ {
922
+ UInt64 cachedEnd = _cachedPos + _cachedSize;
923
+ if (cachedEnd < _virtPos)
924
+ {
925
+ if (cachedEnd < _phySize)
926
+ {
927
+ RINOK(FlushCache());
928
+ }
929
+ else
930
+ zerosStart = cachedEnd;
931
+ }
932
+ }
933
+ }
934
+
935
+ if (_cachedSize == 0 && _phySize < _virtPos)
936
+ _cachedPos = zerosStart = _phySize;
937
+
938
+ if (zerosStart != _virtPos)
939
+ {
940
+ // write zeros to [cachedEnd ... _virtPos)
941
+
942
+ for (;;)
943
+ {
944
+ UInt64 cachedEnd = _cachedPos + _cachedSize;
945
+ size_t endPos = (size_t)cachedEnd & kCacheMask;
946
+ size_t curSize = kCacheSize - endPos;
947
+ if (curSize > _virtPos - cachedEnd)
948
+ curSize = (size_t)(_virtPos - cachedEnd);
949
+ if (curSize == 0)
950
+ break;
951
+ while (curSize > (kCacheSize - _cachedSize))
952
+ {
953
+ RINOK(MyWriteBlock());
954
+ }
955
+ memset(_cache + endPos, 0, curSize);
956
+ _cachedSize += curSize;
957
+ }
958
+ }
959
+
960
+ if (_cachedSize == 0)
961
+ _cachedPos = _virtPos;
962
+
963
+ size_t pos = (size_t)_virtPos & kCacheMask;
964
+ size = (UInt32)MyMin((size_t)size, kCacheSize - pos);
965
+ UInt64 cachedEnd = _cachedPos + _cachedSize;
966
+ if (_virtPos != cachedEnd) // _virtPos < cachedEnd
967
+ size = (UInt32)MyMin((size_t)size, (size_t)(cachedEnd - _virtPos));
968
+ else
969
+ {
970
+ // _virtPos == cachedEnd
971
+ if (_cachedSize == kCacheSize)
972
+ {
973
+ RINOK(MyWriteBlock());
974
+ }
975
+ size_t startPos = (size_t)_cachedPos & kCacheMask;
976
+ if (startPos > pos)
977
+ size = (UInt32)MyMin((size_t)size, (size_t)(startPos - pos));
978
+ _cachedSize += size;
979
+ }
980
+ memcpy(_cache + pos, data, size);
981
+ if (processedSize)
982
+ *processedSize = size;
983
+ _virtPos += size;
984
+ if (_virtSize < _virtPos)
985
+ _virtSize = _virtPos;
986
+ return S_OK;
987
+ }
988
+
989
+ STDMETHODIMP CCacheOutStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
990
+ {
991
+ switch(seekOrigin)
992
+ {
993
+ case STREAM_SEEK_SET: _virtPos = offset; break;
994
+ case STREAM_SEEK_CUR: _virtPos += offset; break;
995
+ case STREAM_SEEK_END: _virtPos = _virtSize + offset; break;
996
+ default: return STG_E_INVALIDFUNCTION;
997
+ }
998
+ if (newPosition)
999
+ *newPosition = _virtPos;
1000
+ return S_OK;
1001
+ }
1002
+
1003
+ STDMETHODIMP CCacheOutStream::SetSize(UInt64 newSize)
1004
+ {
1005
+ _virtSize = newSize;
1006
+ if (newSize < _phySize)
1007
+ {
1008
+ RINOK(_stream->SetSize(newSize));
1009
+ _phySize = newSize;
1010
+ }
1011
+ if (newSize <= _cachedPos)
1012
+ {
1013
+ _cachedSize = 0;
1014
+ _cachedPos = newSize;
1015
+ }
1016
+ if (newSize < _cachedPos + _cachedSize)
1017
+ _cachedSize = (size_t)(newSize - _cachedPos);
1018
+ return S_OK;
1019
+ }
1020
+
1021
+
1022
+ HRESULT Update(
1023
+ DECL_EXTERNAL_CODECS_LOC_VARS
1024
+ const CObjectVector<CItemEx> &inputItems,
1025
+ const CObjectVector<CUpdateItem> &updateItems,
1026
+ ISequentialOutStream *seqOutStream,
1027
+ CInArchive *inArchive,
1028
+ CCompressionMethodMode *compressionMethodMode,
1029
+ IArchiveUpdateCallback *updateCallback)
1030
+ {
1031
+ CMyComPtr<IOutStream> outStream;
1032
+ {
1033
+ CMyComPtr<IOutStream> outStreamReal;
1034
+ seqOutStream->QueryInterface(IID_IOutStream, (void **)&outStreamReal);
1035
+ if (!outStreamReal)
1036
+ return E_NOTIMPL;
1037
+ CCacheOutStream *cacheStream = new CCacheOutStream();
1038
+ outStream = cacheStream;
1039
+ if (!cacheStream->Allocate())
1040
+ return E_OUTOFMEMORY;
1041
+ RINOK(cacheStream->Init(outStreamReal));
1042
+ }
1043
+
1044
+ if (inArchive)
1045
+ {
1046
+ if (inArchive->ArcInfo.Base != 0 ||
1047
+ inArchive->ArcInfo.StartPosition != 0 ||
1048
+ !inArchive->IsOkHeaders)
1049
+ return E_NOTIMPL;
1050
+ }
1051
+
1052
+ COutArchive outArchive;
1053
+ outArchive.Create(outStream);
1054
+ /*
1055
+ if (inArchive && inArchive->ArcInfo.StartPosition > 0)
1056
+ {
1057
+ CMyComPtr<ISequentialInStream> inStream;
1058
+ inStream.Attach(inArchive->CreateLimitedStream(0, inArchive->ArcInfo.StartPosition));
1059
+ RINOK(CopyBlockToArchive(inStream, outArchive, NULL));
1060
+ outArchive.MoveBasePosition(inArchive->ArcInfo.StartPosition);
1061
+ }
1062
+ */
1063
+ CMyComPtr<IInStream> inStream;
1064
+ if (inArchive)
1065
+ inStream.Attach(inArchive->CreateStream());
1066
+
1067
+ return Update2(
1068
+ EXTERNAL_CODECS_LOC_VARS
1069
+ outArchive, inArchive, inStream,
1070
+ inputItems, updateItems,
1071
+ compressionMethodMode,
1072
+ inArchive ? &inArchive->ArcInfo.Comment : NULL,
1073
+ updateCallback);
1074
+ }
1075
+
1076
+ }}