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,152 @@
1
+ // 7zOut.h
2
+
3
+ #ifndef __7Z_OUT_H
4
+ #define __7Z_OUT_H
5
+
6
+ #include "7zCompressionMode.h"
7
+ #include "7zEncode.h"
8
+ #include "7zHeader.h"
9
+ #include "7zItem.h"
10
+
11
+ #include "../../Common/OutBuffer.h"
12
+
13
+ namespace NArchive {
14
+ namespace N7z {
15
+
16
+ class CWriteBufferLoc
17
+ {
18
+ Byte *_data;
19
+ size_t _size;
20
+ size_t _pos;
21
+ public:
22
+ CWriteBufferLoc(): _size(0), _pos(0) {}
23
+ void Init(Byte *data, size_t size)
24
+ {
25
+ _data = data;
26
+ _size = size;
27
+ _pos = 0;
28
+ }
29
+ void WriteBytes(const void *data, size_t size)
30
+ {
31
+ if (size > _size - _pos)
32
+ throw 1;
33
+ memcpy(_data + _pos, data, size);
34
+ _pos += size;
35
+ }
36
+ void WriteByte(Byte b)
37
+ {
38
+ if (_size == _pos)
39
+ throw 1;
40
+ _data[_pos++] = b;
41
+ }
42
+ size_t GetPos() const { return _pos; }
43
+ };
44
+
45
+ struct CHeaderOptions
46
+ {
47
+ bool CompressMainHeader;
48
+ bool WriteCTime;
49
+ bool WriteATime;
50
+ bool WriteMTime;
51
+
52
+ CHeaderOptions():
53
+ CompressMainHeader(true),
54
+ WriteCTime(false),
55
+ WriteATime(false),
56
+ WriteMTime(true)
57
+ {}
58
+ };
59
+
60
+ class COutArchive
61
+ {
62
+ UInt64 _prefixHeaderPos;
63
+
64
+ HRESULT WriteDirect(const void *data, UInt32 size);
65
+
66
+ UInt64 GetPos() const;
67
+ void WriteBytes(const void *data, size_t size);
68
+ void WriteBytes(const CByteBuffer &data) { WriteBytes(data, data.GetCapacity()); }
69
+ void WriteByte(Byte b);
70
+ void WriteUInt32(UInt32 value);
71
+ void WriteUInt64(UInt64 value);
72
+ void WriteNumber(UInt64 value);
73
+ void WriteID(UInt64 value) { WriteNumber(value); }
74
+
75
+ void WriteFolder(const CFolder &folder);
76
+ HRESULT WriteFileHeader(const CFileItem &itemInfo);
77
+ void WriteBoolVector(const CBoolVector &boolVector);
78
+ void WriteHashDigests(
79
+ const CRecordVector<bool> &digestsDefined,
80
+ const CRecordVector<UInt32> &hashDigests);
81
+
82
+ void WritePackInfo(
83
+ UInt64 dataOffset,
84
+ const CRecordVector<UInt64> &packSizes,
85
+ const CRecordVector<bool> &packCRCsDefined,
86
+ const CRecordVector<UInt32> &packCRCs);
87
+
88
+ void WriteUnpackInfo(const CObjectVector<CFolder> &folders);
89
+
90
+ void WriteSubStreamsInfo(
91
+ const CObjectVector<CFolder> &folders,
92
+ const CRecordVector<CNum> &numUnpackStreamsInFolders,
93
+ const CRecordVector<UInt64> &unpackSizes,
94
+ const CRecordVector<bool> &digestsDefined,
95
+ const CRecordVector<UInt32> &hashDigests);
96
+
97
+ void SkipAlign(unsigned pos, unsigned alignSize);
98
+ void WriteAlignedBoolHeader(const CBoolVector &v, int numDefined, Byte type, unsigned itemSize);
99
+ void WriteUInt64DefVector(const CUInt64DefVector &v, Byte type);
100
+
101
+ HRESULT EncodeStream(
102
+ DECL_EXTERNAL_CODECS_LOC_VARS
103
+ CEncoder &encoder, const CByteBuffer &data,
104
+ CRecordVector<UInt64> &packSizes, CObjectVector<CFolder> &folders);
105
+ void WriteHeader(
106
+ const CArchiveDatabase &db,
107
+ const CHeaderOptions &headerOptions,
108
+ UInt64 &headerOffset);
109
+
110
+ bool _countMode;
111
+ bool _writeToStream;
112
+ size_t _countSize;
113
+ UInt32 _crc;
114
+ COutBuffer _outByte;
115
+ CWriteBufferLoc _outByte2;
116
+
117
+ #ifdef _7Z_VOL
118
+ bool _endMarker;
119
+ #endif
120
+
121
+ HRESULT WriteSignature();
122
+ #ifdef _7Z_VOL
123
+ HRESULT WriteFinishSignature();
124
+ #endif
125
+ HRESULT WriteStartHeader(const CStartHeader &h);
126
+ #ifdef _7Z_VOL
127
+ HRESULT WriteFinishHeader(const CFinishHeader &h);
128
+ #endif
129
+ CMyComPtr<IOutStream> Stream;
130
+ public:
131
+
132
+ COutArchive() { _outByte.Create(1 << 16); }
133
+ CMyComPtr<ISequentialOutStream> SeqStream;
134
+ HRESULT Create(ISequentialOutStream *stream, bool endMarker);
135
+ void Close();
136
+ HRESULT SkipPrefixArchiveHeader();
137
+ HRESULT WriteDatabase(
138
+ DECL_EXTERNAL_CODECS_LOC_VARS
139
+ const CArchiveDatabase &db,
140
+ const CCompressionMethodMode *options,
141
+ const CHeaderOptions &headerOptions);
142
+
143
+ #ifdef _7Z_VOL
144
+ static UInt32 GetVolHeadersSize(UInt64 dataSize, int nameLength = 0, bool props = false);
145
+ static UInt64 GetVolPureSize(UInt64 volSize, int nameLength = 0, bool props = false);
146
+ #endif
147
+
148
+ };
149
+
150
+ }}
151
+
152
+ #endif
@@ -0,0 +1,164 @@
1
+ // 7zProperties.cpp
2
+
3
+ #include "StdAfx.h"
4
+
5
+ #include "7zProperties.h"
6
+ #include "7zHeader.h"
7
+ #include "7zHandler.h"
8
+
9
+ // #define _MULTI_PACK
10
+
11
+ namespace NArchive {
12
+ namespace N7z {
13
+
14
+ struct CPropMap
15
+ {
16
+ UInt64 FilePropID;
17
+ STATPROPSTG StatPROPSTG;
18
+ };
19
+
20
+ CPropMap kPropMap[] =
21
+ {
22
+ { NID::kName, { NULL, kpidPath, VT_BSTR } },
23
+ { NID::kSize, { NULL, kpidSize, VT_UI8 } },
24
+ { NID::kPackInfo, { NULL, kpidPackSize, VT_UI8 } },
25
+
26
+ #ifdef _MULTI_PACK
27
+ { 100, { L"Pack0", kpidPackedSize0, VT_UI8 } },
28
+ { 101, { L"Pack1", kpidPackedSize1, VT_UI8 } },
29
+ { 102, { L"Pack2", kpidPackedSize2, VT_UI8 } },
30
+ { 103, { L"Pack3", kpidPackedSize3, VT_UI8 } },
31
+ { 104, { L"Pack4", kpidPackedSize4, VT_UI8 } },
32
+ #endif
33
+
34
+ { NID::kCTime, { NULL, kpidCTime, VT_FILETIME } },
35
+ { NID::kMTime, { NULL, kpidMTime, VT_FILETIME } },
36
+ { NID::kATime, { NULL, kpidATime, VT_FILETIME } },
37
+ { NID::kWinAttributes, { NULL, kpidAttrib, VT_UI4 } },
38
+ { NID::kStartPos, { NULL, kpidPosition, VT_UI4 } },
39
+
40
+ { NID::kCRC, { NULL, kpidCRC, VT_UI4 } },
41
+
42
+ { NID::kAnti, { NULL, kpidIsAnti, VT_BOOL } }
43
+
44
+ #ifndef _SFX
45
+ ,
46
+ { 97, { NULL,kpidEncrypted, VT_BOOL } },
47
+ { 98, { NULL,kpidMethod, VT_BSTR } },
48
+ { 99, { NULL,kpidBlock, VT_UI4 } }
49
+ #endif
50
+ };
51
+
52
+ static const int kPropMapSize = sizeof(kPropMap) / sizeof(kPropMap[0]);
53
+
54
+ static int FindPropInMap(UInt64 filePropID)
55
+ {
56
+ for (int i = 0; i < kPropMapSize; i++)
57
+ if (kPropMap[i].FilePropID == filePropID)
58
+ return i;
59
+ return -1;
60
+ }
61
+
62
+ static void CopyOneItem(CRecordVector<UInt64> &src,
63
+ CRecordVector<UInt64> &dest, UInt32 item)
64
+ {
65
+ for (int i = 0; i < src.Size(); i++)
66
+ if (src[i] == item)
67
+ {
68
+ dest.Add(item);
69
+ src.Delete(i);
70
+ return;
71
+ }
72
+ }
73
+
74
+ static void RemoveOneItem(CRecordVector<UInt64> &src, UInt32 item)
75
+ {
76
+ for (int i = 0; i < src.Size(); i++)
77
+ if (src[i] == item)
78
+ {
79
+ src.Delete(i);
80
+ return;
81
+ }
82
+ }
83
+
84
+ static void InsertToHead(CRecordVector<UInt64> &dest, UInt32 item)
85
+ {
86
+ for (int i = 0; i < dest.Size(); i++)
87
+ if (dest[i] == item)
88
+ {
89
+ dest.Delete(i);
90
+ break;
91
+ }
92
+ dest.Insert(0, item);
93
+ }
94
+
95
+ void CHandler::FillPopIDs()
96
+ {
97
+ _fileInfoPopIDs.Clear();
98
+
99
+ #ifdef _7Z_VOL
100
+ if(_volumes.Size() < 1)
101
+ return;
102
+ const CVolume &volume = _volumes.Front();
103
+ const CArchiveDatabaseEx &_db = volume.Database;
104
+ #endif
105
+
106
+ CRecordVector<UInt64> fileInfoPopIDs = _db.ArchiveInfo.FileInfoPopIDs;
107
+
108
+ RemoveOneItem(fileInfoPopIDs, NID::kEmptyStream);
109
+ RemoveOneItem(fileInfoPopIDs, NID::kEmptyFile);
110
+
111
+ CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kName);
112
+ CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kAnti);
113
+ CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kSize);
114
+ CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kPackInfo);
115
+ CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCTime);
116
+ CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kMTime);
117
+ CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kATime);
118
+ CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kWinAttributes);
119
+ CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCRC);
120
+ CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kComment);
121
+ _fileInfoPopIDs += fileInfoPopIDs;
122
+
123
+ #ifndef _SFX
124
+ _fileInfoPopIDs.Add(97);
125
+ _fileInfoPopIDs.Add(98);
126
+ _fileInfoPopIDs.Add(99);
127
+ #endif
128
+ #ifdef _MULTI_PACK
129
+ _fileInfoPopIDs.Add(100);
130
+ _fileInfoPopIDs.Add(101);
131
+ _fileInfoPopIDs.Add(102);
132
+ _fileInfoPopIDs.Add(103);
133
+ _fileInfoPopIDs.Add(104);
134
+ #endif
135
+
136
+ #ifndef _SFX
137
+ InsertToHead(_fileInfoPopIDs, NID::kMTime);
138
+ InsertToHead(_fileInfoPopIDs, NID::kPackInfo);
139
+ InsertToHead(_fileInfoPopIDs, NID::kSize);
140
+ InsertToHead(_fileInfoPopIDs, NID::kName);
141
+ #endif
142
+ }
143
+
144
+ STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties)
145
+ {
146
+ *numProperties = _fileInfoPopIDs.Size();
147
+ return S_OK;
148
+ }
149
+
150
+ STDMETHODIMP CHandler::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)
151
+ {
152
+ if ((int)index >= _fileInfoPopIDs.Size())
153
+ return E_INVALIDARG;
154
+ int indexInMap = FindPropInMap(_fileInfoPopIDs[index]);
155
+ if (indexInMap == -1)
156
+ return E_INVALIDARG;
157
+ const STATPROPSTG &srcItem = kPropMap[indexInMap].StatPROPSTG;
158
+ *propID = srcItem.propid;
159
+ *varType = srcItem.vt;
160
+ *name = 0;
161
+ return S_OK;
162
+ }
163
+
164
+ }}
@@ -0,0 +1,22 @@
1
+ // 7zProperties.h
2
+
3
+ #ifndef __7Z_PROPERTIES_H
4
+ #define __7Z_PROPERTIES_H
5
+
6
+ #include "../../PropID.h"
7
+
8
+ namespace NArchive {
9
+ namespace N7z {
10
+
11
+ enum
12
+ {
13
+ kpidPackedSize0 = kpidUserDefined,
14
+ kpidPackedSize1,
15
+ kpidPackedSize2,
16
+ kpidPackedSize3,
17
+ kpidPackedSize4
18
+ };
19
+
20
+ }}
21
+
22
+ #endif
@@ -0,0 +1,18 @@
1
+ // 7zRegister.cpp
2
+
3
+ #include "StdAfx.h"
4
+
5
+ #include "../../Common/RegisterArc.h"
6
+
7
+ #include "7zHandler.h"
8
+ static IInArchive *CreateArc() { return new NArchive::N7z::CHandler; }
9
+ #ifndef EXTRACT_ONLY
10
+ static IOutArchive *CreateArcOut() { return new NArchive::N7z::CHandler; }
11
+ #else
12
+ #define CreateArcOut 0
13
+ #endif
14
+
15
+ static CArcInfo g_ArcInfo =
16
+ { L"7z", L"7z", 0, 7, {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}, 6, false, CreateArc, CreateArcOut };
17
+
18
+ REGISTER_ARC(7z)
@@ -0,0 +1,24 @@
1
+ // 7zSpecStream.cpp
2
+
3
+ #include "StdAfx.h"
4
+
5
+ #include "7zSpecStream.h"
6
+
7
+ STDMETHODIMP CSequentialInStreamSizeCount2::Read(void *data, UInt32 size, UInt32 *processedSize)
8
+ {
9
+ UInt32 realProcessedSize;
10
+ HRESULT result = _stream->Read(data, size, &realProcessedSize);
11
+ _size += realProcessedSize;
12
+ if (processedSize != 0)
13
+ *processedSize = realProcessedSize;
14
+ return result;
15
+ }
16
+
17
+ STDMETHODIMP CSequentialInStreamSizeCount2::GetSubStreamSize(
18
+ UInt64 subStream, UInt64 *value)
19
+ {
20
+ if (_getSubStreamSize == NULL)
21
+ return E_NOTIMPL;
22
+ return _getSubStreamSize->GetSubStreamSize(subStream, value);
23
+ }
24
+
@@ -0,0 +1,35 @@
1
+ // 7zSpecStream.h
2
+
3
+ #ifndef __7Z_SPEC_STREAM_H
4
+ #define __7Z_SPEC_STREAM_H
5
+
6
+ #include "../../IStream.h"
7
+ #include "../../ICoder.h"
8
+ #include "../../../Common/MyCom.h"
9
+
10
+ class CSequentialInStreamSizeCount2:
11
+ public ISequentialInStream,
12
+ public ICompressGetSubStreamSize,
13
+ public CMyUnknownImp
14
+ {
15
+ CMyComPtr<ISequentialInStream> _stream;
16
+ CMyComPtr<ICompressGetSubStreamSize> _getSubStreamSize;
17
+ UInt64 _size;
18
+ public:
19
+ void Init(ISequentialInStream *stream)
20
+ {
21
+ _stream = stream;
22
+ _getSubStreamSize = 0;
23
+ _stream.QueryInterface(IID_ICompressGetSubStreamSize, &_getSubStreamSize);
24
+ _size = 0;
25
+ }
26
+ UInt64 GetSize() const { return _size; }
27
+
28
+ MY_UNKNOWN_IMP1(ICompressGetSubStreamSize)
29
+
30
+ STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
31
+
32
+ STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value);
33
+ };
34
+
35
+ #endif
@@ -0,0 +1,1216 @@
1
+ // 7zUpdate.cpp
2
+
3
+ #include "StdAfx.h"
4
+
5
+ #include "../../../../C/CpuArch.h"
6
+
7
+ #include "../../Common/LimitedStreams.h"
8
+ #include "../../Common/ProgressUtils.h"
9
+
10
+ #include "../../Common/CreateCoder.h"
11
+
12
+ #include "../../Compress/CopyCoder.h"
13
+
14
+ #include "../Common/ItemNameUtils.h"
15
+ #include "../Common/OutStreamWithCRC.h"
16
+
17
+ #include "7zDecode.h"
18
+ #include "7zEncode.h"
19
+ #include "7zFolderInStream.h"
20
+ #include "7zHandler.h"
21
+ #include "7zOut.h"
22
+ #include "7zUpdate.h"
23
+
24
+ #ifndef WIN32
25
+ #include "Windows/FileIO.h"
26
+ #endif
27
+
28
+ namespace NArchive {
29
+ namespace N7z {
30
+
31
+ static const UInt64 k_LZMA = 0x030101;
32
+ static const UInt64 k_BCJ = 0x03030103;
33
+ static const UInt64 k_BCJ2 = 0x0303011B;
34
+
35
+ static const wchar_t *kMatchFinderForBCJ2_LZMA = L"BT2";
36
+ static const UInt32 kDictionaryForBCJ2_LZMA = 1 << 20;
37
+ static const UInt32 kAlgorithmForBCJ2_LZMA = 1;
38
+ static const UInt32 kNumFastBytesForBCJ2_LZMA = 64;
39
+
40
+ #ifdef MY_CPU_X86_OR_AMD64
41
+ #define USE_86_FILTER
42
+ #endif
43
+
44
+ static HRESULT WriteRange(IInStream *inStream, ISequentialOutStream *outStream,
45
+ UInt64 position, UInt64 size, ICompressProgressInfo *progress)
46
+ {
47
+ RINOK(inStream->Seek(position, STREAM_SEEK_SET, 0));
48
+ CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
49
+ CMyComPtr<CLimitedSequentialInStream> inStreamLimited(streamSpec);
50
+ streamSpec->SetStream(inStream);
51
+ streamSpec->Init(size);
52
+
53
+ NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
54
+ CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
55
+ RINOK(copyCoder->Code(inStreamLimited, outStream, NULL, NULL, progress));
56
+ return (copyCoderSpec->TotalSize == size ? S_OK : E_FAIL);
57
+ }
58
+
59
+ static int GetReverseSlashPos(const UString &name)
60
+ {
61
+ int slashPos = name.ReverseFind(L'/');
62
+ #ifdef _WIN32
63
+ int slash1Pos = name.ReverseFind(L'\\');
64
+ slashPos = MyMax(slashPos, slash1Pos);
65
+ #endif
66
+ return slashPos;
67
+ }
68
+
69
+ int CUpdateItem::GetExtensionPos() const
70
+ {
71
+ int slashPos = GetReverseSlashPos(Name);
72
+ int dotPos = Name.ReverseFind(L'.');
73
+ if (dotPos < 0 || (dotPos < slashPos && slashPos >= 0))
74
+ return Name.Length();
75
+ return dotPos + 1;
76
+ }
77
+
78
+ UString CUpdateItem::GetExtension() const
79
+ {
80
+ return Name.Mid(GetExtensionPos());
81
+ }
82
+
83
+ #define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
84
+
85
+ #define RINOZ_COMP(a, b) RINOZ(MyCompare(a, b))
86
+
87
+ static int CompareBuffers(const CByteBuffer &a1, const CByteBuffer &a2)
88
+ {
89
+ size_t c1 = a1.GetCapacity();
90
+ size_t c2 = a2.GetCapacity();
91
+ RINOZ_COMP(c1, c2);
92
+ for (size_t i = 0; i < c1; i++)
93
+ RINOZ_COMP(a1[i], a2[i]);
94
+ return 0;
95
+ }
96
+
97
+ static int CompareCoders(const CCoderInfo &c1, const CCoderInfo &c2)
98
+ {
99
+ RINOZ_COMP(c1.NumInStreams, c2.NumInStreams);
100
+ RINOZ_COMP(c1.NumOutStreams, c2.NumOutStreams);
101
+ RINOZ_COMP(c1.MethodID, c2.MethodID);
102
+ return CompareBuffers(c1.Props, c2.Props);
103
+ }
104
+
105
+ static int CompareBindPairs(const CBindPair &b1, const CBindPair &b2)
106
+ {
107
+ RINOZ_COMP(b1.InIndex, b2.InIndex);
108
+ return MyCompare(b1.OutIndex, b2.OutIndex);
109
+ }
110
+
111
+ static int CompareFolders(const CFolder &f1, const CFolder &f2)
112
+ {
113
+ int s1 = f1.Coders.Size();
114
+ int s2 = f2.Coders.Size();
115
+ RINOZ_COMP(s1, s2);
116
+ int i;
117
+ for (i = 0; i < s1; i++)
118
+ RINOZ(CompareCoders(f1.Coders[i], f2.Coders[i]));
119
+ s1 = f1.BindPairs.Size();
120
+ s2 = f2.BindPairs.Size();
121
+ RINOZ_COMP(s1, s2);
122
+ for (i = 0; i < s1; i++)
123
+ RINOZ(CompareBindPairs(f1.BindPairs[i], f2.BindPairs[i]));
124
+ return 0;
125
+ }
126
+
127
+ /*
128
+ static int CompareFiles(const CFileItem &f1, const CFileItem &f2)
129
+ {
130
+ return MyStringCompareNoCase(f1.Name, f2.Name);
131
+ }
132
+ */
133
+
134
+ struct CFolderRepack
135
+ {
136
+ int FolderIndex;
137
+ int Group;
138
+ CNum NumCopyFiles;
139
+ };
140
+
141
+ static int CompareFolderRepacks(const CFolderRepack *p1, const CFolderRepack *p2, void *param)
142
+ {
143
+ RINOZ_COMP(p1->Group, p2->Group);
144
+ int i1 = p1->FolderIndex;
145
+ int i2 = p2->FolderIndex;
146
+ const CArchiveDatabaseEx &db = *(const CArchiveDatabaseEx *)param;
147
+ RINOZ(CompareFolders(
148
+ db.Folders[i1],
149
+ db.Folders[i2]));
150
+ return MyCompare(i1, i2);
151
+ /*
152
+ RINOZ_COMP(
153
+ db.NumUnpackStreamsVector[i1],
154
+ db.NumUnpackStreamsVector[i2]);
155
+ if (db.NumUnpackStreamsVector[i1] == 0)
156
+ return 0;
157
+ return CompareFiles(
158
+ db.Files[db.FolderStartFileIndex[i1]],
159
+ db.Files[db.FolderStartFileIndex[i2]]);
160
+ */
161
+ }
162
+
163
+ ////////////////////////////////////////////////////////////
164
+
165
+ static int CompareEmptyItems(const int *p1, const int *p2, void *param)
166
+ {
167
+ const CObjectVector<CUpdateItem> &updateItems = *(const CObjectVector<CUpdateItem> *)param;
168
+ const CUpdateItem &u1 = updateItems[*p1];
169
+ const CUpdateItem &u2 = updateItems[*p2];
170
+ if (u1.IsDir != u2.IsDir)
171
+ return (u1.IsDir) ? 1 : -1;
172
+ if (u1.IsDir)
173
+ {
174
+ if (u1.IsAnti != u2.IsAnti)
175
+ return (u1.IsAnti ? 1 : -1);
176
+ int n = MyStringCompareNoCase(u1.Name, u2.Name);
177
+ return -n;
178
+ }
179
+ if (u1.IsAnti != u2.IsAnti)
180
+ return (u1.IsAnti ? 1 : -1);
181
+ return MyStringCompareNoCase(u1.Name, u2.Name);
182
+ }
183
+
184
+ static const char *g_Exts =
185
+ " lzma 7z ace arc arj bz bz2 deb lzo lzx gz pak rpm sit tgz tbz tbz2 tgz cab ha lha lzh rar zoo"
186
+ " zip jar ear war msi"
187
+ " 3gp avi mov mpeg mpg mpe wmv"
188
+ " aac ape fla flac la mp3 m4a mp4 ofr ogg pac ra rm rka shn swa tta wv wma wav"
189
+ " swf "
190
+ " chm hxi hxs"
191
+ " gif jpeg jpg jp2 png tiff bmp ico psd psp"
192
+ " awg ps eps cgm dxf svg vrml wmf emf ai md"
193
+ " cad dwg pps key sxi"
194
+ " max 3ds"
195
+ " iso bin nrg mdf img pdi tar cpio xpi"
196
+ " vfd vhd vud vmc vsv"
197
+ " vmdk dsk nvram vmem vmsd vmsn vmss vmtm"
198
+ " inl inc idl acf asa h hpp hxx c cpp cxx rc java cs pas bas vb cls ctl frm dlg def"
199
+ " f77 f f90 f95"
200
+ " asm sql manifest dep "
201
+ " mak clw csproj vcproj sln dsp dsw "
202
+ " class "
203
+ " bat cmd"
204
+ " xml xsd xsl xslt hxk hxc htm html xhtml xht mht mhtml htw asp aspx css cgi jsp shtml"
205
+ " awk sed hta js php php3 php4 php5 phptml pl pm py pyo rb sh tcl vbs"
206
+ " text txt tex ans asc srt reg ini doc docx mcw dot rtf hlp xls xlr xlt xlw ppt pdf"
207
+ " sxc sxd sxi sxg sxw stc sti stw stm odt ott odg otg odp otp ods ots odf"
208
+ " abw afp cwk lwp wpd wps wpt wrf wri"
209
+ " abf afm bdf fon mgf otf pcf pfa snf ttf"
210
+ " dbf mdb nsf ntf wdb db fdb gdb"
211
+ " exe dll ocx vbx sfx sys tlb awx com obj lib out o so "
212
+ " pdb pch idb ncb opt";
213
+
214
+ int GetExtIndex(const char *ext)
215
+ {
216
+ int extIndex = 1;
217
+ const char *p = g_Exts;
218
+ for (;;)
219
+ {
220
+ char c = *p++;
221
+ if (c == 0)
222
+ return extIndex;
223
+ if (c == ' ')
224
+ continue;
225
+ int pos = 0;
226
+ for (;;)
227
+ {
228
+ char c2 = ext[pos++];
229
+ if (c2 == 0 && (c == 0 || c == ' '))
230
+ return extIndex;
231
+ if (c != c2)
232
+ break;
233
+ c = *p++;
234
+ }
235
+ extIndex++;
236
+ for (;;)
237
+ {
238
+ if (c == 0)
239
+ return extIndex;
240
+ if (c == ' ')
241
+ break;
242
+ c = *p++;
243
+ }
244
+ }
245
+ }
246
+
247
+ struct CRefItem
248
+ {
249
+ const CUpdateItem *UpdateItem;
250
+ UInt32 Index;
251
+ UInt32 ExtensionPos;
252
+ UInt32 NamePos;
253
+ int ExtensionIndex;
254
+ CRefItem(UInt32 index, const CUpdateItem &ui, bool sortByType):
255
+ UpdateItem(&ui),
256
+ Index(index),
257
+ ExtensionPos(0),
258
+ NamePos(0),
259
+ ExtensionIndex(0)
260
+ {
261
+ if (sortByType)
262
+ {
263
+ int slashPos = GetReverseSlashPos(ui.Name);
264
+ NamePos = ((slashPos >= 0) ? (slashPos + 1) : 0);
265
+ int dotPos = ui.Name.ReverseFind(L'.');
266
+ if (dotPos < 0 || (dotPos < slashPos && slashPos >= 0))
267
+ ExtensionPos = ui.Name.Length();
268
+ else
269
+ {
270
+ ExtensionPos = dotPos + 1;
271
+ UString us = ui.Name.Mid(ExtensionPos);
272
+ if (!us.IsEmpty())
273
+ {
274
+ us.MakeLower();
275
+ int i;
276
+ AString s;
277
+ for (i = 0; i < us.Length(); i++)
278
+ {
279
+ wchar_t c = us[i];
280
+ if (c >= 0x80)
281
+ break;
282
+ s += (char)c;
283
+ }
284
+ if (i == us.Length())
285
+ ExtensionIndex = GetExtIndex(s);
286
+ else
287
+ ExtensionIndex = 0;
288
+ }
289
+ }
290
+ }
291
+ }
292
+ };
293
+
294
+ static int CompareUpdateItems(const CRefItem *p1, const CRefItem *p2, void *param)
295
+ {
296
+ const CRefItem &a1 = *p1;
297
+ const CRefItem &a2 = *p2;
298
+ const CUpdateItem &u1 = *a1.UpdateItem;
299
+ const CUpdateItem &u2 = *a2.UpdateItem;
300
+ int n;
301
+ if (u1.IsDir != u2.IsDir)
302
+ return (u1.IsDir) ? 1 : -1;
303
+ if (u1.IsDir)
304
+ {
305
+ if (u1.IsAnti != u2.IsAnti)
306
+ return (u1.IsAnti ? 1 : -1);
307
+ n = MyStringCompareNoCase(u1.Name, u2.Name);
308
+ return -n;
309
+ }
310
+ bool sortByType = *(bool *)param;
311
+ if (sortByType)
312
+ {
313
+ RINOZ_COMP(a1.ExtensionIndex, a2.ExtensionIndex);
314
+ RINOZ(MyStringCompareNoCase(u1.Name + a1.ExtensionPos, u2.Name + a2.ExtensionPos));
315
+ RINOZ(MyStringCompareNoCase(u1.Name + a1.NamePos, u2.Name + a2.NamePos));
316
+ if (!u1.MTimeDefined && u2.MTimeDefined) return 1;
317
+ if (u1.MTimeDefined && !u2.MTimeDefined) return -1;
318
+ if (u1.MTimeDefined && u2.MTimeDefined) RINOZ_COMP(u1.MTime, u2.MTime);
319
+ RINOZ_COMP(u1.Size, u2.Size);
320
+ }
321
+ return MyStringCompareNoCase(u1.Name, u2.Name);
322
+ }
323
+
324
+ struct CSolidGroup
325
+ {
326
+ CRecordVector<UInt32> Indices;
327
+ };
328
+
329
+ #ifdef _WIN32
330
+ static wchar_t *g_ExeExts[] =
331
+ {
332
+ L"dll",
333
+ L"exe",
334
+ L"ocx",
335
+ L"sfx",
336
+ L"sys"
337
+ };
338
+
339
+ static bool IsExeExt(const UString &ext)
340
+ {
341
+ for (int i = 0; i < sizeof(g_ExeExts) / sizeof(g_ExeExts[0]); i++)
342
+ if (ext.CompareNoCase(g_ExeExts[i]) == 0)
343
+ return true;
344
+ return false;
345
+ }
346
+ #else
347
+ static bool IsExeFile(const CUpdateItem &ui)
348
+ {
349
+ if (ui.Attrib & FILE_ATTRIBUTE_UNIX_EXTENSION) {
350
+ unsigned short st_mode = ui.Attrib >> 16;
351
+ if ((st_mode & 00111) && (ui.Size >= 2048))
352
+ {
353
+ // file has the execution flag and it's big enought
354
+ // try to find if the file is a script
355
+ NWindows::NFile::NIO::CInFile file;
356
+ if (file.Open(ui.Name))
357
+ {
358
+ char buffer[512];
359
+ UINT32 processedSize;
360
+ if (file.Read(buffer,sizeof(buffer),processedSize))
361
+ {
362
+ for(UInt32 i = 0; i < processedSize ; i++)
363
+ {
364
+ if (buffer[i] == 0)
365
+ {
366
+ return true; // this file is not a text (ascii, utf8, ...) !
367
+ }
368
+ }
369
+ }
370
+ }
371
+ }
372
+ }
373
+ return false;
374
+ }
375
+ #endif
376
+
377
+ #ifdef USE_86_FILTER
378
+
379
+ static inline void GetMethodFull(UInt64 methodID, UInt32 numInStreams, CMethodFull &methodResult)
380
+ {
381
+ methodResult.Id = methodID;
382
+ methodResult.NumInStreams = numInStreams;
383
+ methodResult.NumOutStreams = 1;
384
+ }
385
+
386
+ static void MakeExeMethod(const CCompressionMethodMode &method,
387
+ bool bcj2Filter, CCompressionMethodMode &exeMethod)
388
+ {
389
+ exeMethod = method;
390
+ if (bcj2Filter)
391
+ {
392
+ CMethodFull methodFull;
393
+ GetMethodFull(k_BCJ2, 4, methodFull);
394
+ exeMethod.Methods.Insert(0, methodFull);
395
+ GetMethodFull(k_LZMA, 1, methodFull);
396
+ {
397
+ CProp prop;
398
+ prop.Id = NCoderPropID::kAlgorithm;
399
+ prop.Value = kAlgorithmForBCJ2_LZMA;
400
+ methodFull.Props.Add(prop);
401
+ }
402
+ {
403
+ CProp prop;
404
+ prop.Id = NCoderPropID::kMatchFinder;
405
+ prop.Value = kMatchFinderForBCJ2_LZMA;
406
+ methodFull.Props.Add(prop);
407
+ }
408
+ {
409
+ CProp prop;
410
+ prop.Id = NCoderPropID::kDictionarySize;
411
+ prop.Value = kDictionaryForBCJ2_LZMA;
412
+ methodFull.Props.Add(prop);
413
+ }
414
+ {
415
+ CProp prop;
416
+ prop.Id = NCoderPropID::kNumFastBytes;
417
+ prop.Value = kNumFastBytesForBCJ2_LZMA;
418
+ methodFull.Props.Add(prop);
419
+ }
420
+ {
421
+ CProp prop;
422
+ prop.Id = NCoderPropID::kNumThreads;
423
+ prop.Value = (UInt32)1;
424
+ methodFull.Props.Add(prop);
425
+ }
426
+
427
+ exeMethod.Methods.Add(methodFull);
428
+ exeMethod.Methods.Add(methodFull);
429
+ CBind bind;
430
+
431
+ bind.OutCoder = 0;
432
+ bind.InStream = 0;
433
+
434
+ bind.InCoder = 1;
435
+ bind.OutStream = 0;
436
+ exeMethod.Binds.Add(bind);
437
+
438
+ bind.InCoder = 2;
439
+ bind.OutStream = 1;
440
+ exeMethod.Binds.Add(bind);
441
+
442
+ bind.InCoder = 3;
443
+ bind.OutStream = 2;
444
+ exeMethod.Binds.Add(bind);
445
+ }
446
+ else
447
+ {
448
+ CMethodFull methodFull;
449
+ GetMethodFull(k_BCJ, 1, methodFull);
450
+ exeMethod.Methods.Insert(0, methodFull);
451
+ CBind bind;
452
+ bind.OutCoder = 0;
453
+ bind.InStream = 0;
454
+ bind.InCoder = 1;
455
+ bind.OutStream = 0;
456
+ exeMethod.Binds.Add(bind);
457
+ }
458
+ }
459
+
460
+ #endif
461
+
462
+ static void FromUpdateItemToFileItem(const CUpdateItem &ui,
463
+ CFileItem &file, CFileItem2 &file2)
464
+ {
465
+ file.Name = NItemName::MakeLegalName(ui.Name);
466
+ if (ui.AttribDefined)
467
+ file.SetAttrib(ui.Attrib);
468
+
469
+ file2.CTime = ui.CTime; file2.CTimeDefined = ui.CTimeDefined;
470
+ file2.ATime = ui.ATime; file2.ATimeDefined = ui.ATimeDefined;
471
+ file2.MTime = ui.MTime; file2.MTimeDefined = ui.MTimeDefined;
472
+ file2.IsAnti = ui.IsAnti;
473
+ file2.StartPosDefined = false;
474
+
475
+ file.Size = ui.Size;
476
+ file.IsDir = ui.IsDir;
477
+ file.HasStream = ui.HasStream();
478
+ }
479
+
480
+ class CFolderOutStream2:
481
+ public ISequentialOutStream,
482
+ public CMyUnknownImp
483
+ {
484
+ COutStreamWithCRC *_crcStreamSpec;
485
+ CMyComPtr<ISequentialOutStream> _crcStream;
486
+ const CArchiveDatabaseEx *_db;
487
+ const CBoolVector *_extractStatuses;
488
+ CMyComPtr<ISequentialOutStream> _outStream;
489
+ UInt32 _startIndex;
490
+ int _currentIndex;
491
+ bool _fileIsOpen;
492
+ UInt64 _rem;
493
+
494
+ void OpenFile();
495
+ void CloseFile();
496
+ HRESULT CloseFileAndSetResult();
497
+ HRESULT ProcessEmptyFiles();
498
+ public:
499
+ MY_UNKNOWN_IMP
500
+
501
+ CFolderOutStream2()
502
+ {
503
+ _crcStreamSpec = new COutStreamWithCRC;
504
+ _crcStream = _crcStreamSpec;
505
+ }
506
+
507
+ HRESULT Init(const CArchiveDatabaseEx *db, UInt32 startIndex,
508
+ const CBoolVector *extractStatuses, ISequentialOutStream *outStream);
509
+ void ReleaseOutStream();
510
+ HRESULT CheckFinishedState() const { return (_currentIndex == _extractStatuses->Size()) ? S_OK: E_FAIL; }
511
+
512
+ STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
513
+ };
514
+
515
+ HRESULT CFolderOutStream2::Init(const CArchiveDatabaseEx *db, UInt32 startIndex,
516
+ const CBoolVector *extractStatuses, ISequentialOutStream *outStream)
517
+ {
518
+ _db = db;
519
+ _startIndex = startIndex;
520
+ _extractStatuses = extractStatuses;
521
+ _outStream = outStream;
522
+
523
+ _currentIndex = 0;
524
+ _fileIsOpen = false;
525
+ return ProcessEmptyFiles();
526
+ }
527
+
528
+ void CFolderOutStream2::ReleaseOutStream()
529
+ {
530
+ _outStream.Release();
531
+ _crcStreamSpec->ReleaseStream();
532
+ }
533
+
534
+ void CFolderOutStream2::OpenFile()
535
+ {
536
+ _crcStreamSpec->SetStream((*_extractStatuses)[_currentIndex] ? (ISequentialOutStream *)_outStream : NULL); // FIXED for gcc 2.95
537
+ _crcStreamSpec->Init(true);
538
+ _fileIsOpen = true;
539
+ _rem = _db->Files[_startIndex + _currentIndex].Size;
540
+ }
541
+
542
+ void CFolderOutStream2::CloseFile()
543
+ {
544
+ _crcStreamSpec->ReleaseStream();
545
+ _fileIsOpen = false;
546
+ _currentIndex++;
547
+ }
548
+
549
+ HRESULT CFolderOutStream2::CloseFileAndSetResult()
550
+ {
551
+ const CFileItem &file = _db->Files[_startIndex + _currentIndex];
552
+ CloseFile();
553
+ return (file.IsDir || !file.CrcDefined || file.Crc == _crcStreamSpec->GetCRC()) ? S_OK: S_FALSE;
554
+ }
555
+
556
+ HRESULT CFolderOutStream2::ProcessEmptyFiles()
557
+ {
558
+ while (_currentIndex < _extractStatuses->Size() && _db->Files[_startIndex + _currentIndex].Size == 0)
559
+ {
560
+ OpenFile();
561
+ RINOK(CloseFileAndSetResult());
562
+ }
563
+ return S_OK;
564
+ }
565
+
566
+ STDMETHODIMP CFolderOutStream2::Write(const void *data, UInt32 size, UInt32 *processedSize)
567
+ {
568
+ if (processedSize != NULL)
569
+ *processedSize = 0;
570
+ while (size != 0)
571
+ {
572
+ if (_fileIsOpen)
573
+ {
574
+ UInt32 cur = size < _rem ? size : (UInt32)_rem;
575
+ RINOK(_crcStream->Write(data, cur, &cur));
576
+ if (cur == 0)
577
+ break;
578
+ data = (const Byte *)data + cur;
579
+ size -= cur;
580
+ _rem -= cur;
581
+ if (processedSize != NULL)
582
+ *processedSize += cur;
583
+ if (_rem == 0)
584
+ {
585
+ RINOK(CloseFileAndSetResult());
586
+ RINOK(ProcessEmptyFiles());
587
+ continue;
588
+ }
589
+ }
590
+ else
591
+ {
592
+ RINOK(ProcessEmptyFiles());
593
+ if (_currentIndex == _extractStatuses->Size())
594
+ {
595
+ // we don't support partial extracting
596
+ return E_FAIL;
597
+ }
598
+ OpenFile();
599
+ }
600
+ }
601
+ return S_OK;
602
+ }
603
+
604
+ class CThreadDecoder: public CVirtThread
605
+ {
606
+ public:
607
+ HRESULT Result;
608
+ CMyComPtr<IInStream> InStream;
609
+
610
+ CFolderOutStream2 *FosSpec;
611
+ CMyComPtr<ISequentialOutStream> Fos;
612
+
613
+ UInt64 StartPos;
614
+ const UInt64 *PackSizes;
615
+ const CFolder *Folder;
616
+ #ifndef _NO_CRYPTO
617
+ CMyComPtr<ICryptoGetTextPassword> GetTextPassword;
618
+ #endif
619
+
620
+ DECL_EXTERNAL_CODECS_VARS
621
+ CDecoder Decoder;
622
+
623
+ #ifndef _7ZIP_ST
624
+ bool MtMode;
625
+ UInt32 NumThreads;
626
+ #endif
627
+
628
+ CThreadDecoder():
629
+ Decoder(true)
630
+ {
631
+ #ifndef _7ZIP_ST
632
+ MtMode = false;
633
+ NumThreads = 1;
634
+ #endif
635
+ FosSpec = new CFolderOutStream2;
636
+ Fos = FosSpec;
637
+ Result = E_FAIL;
638
+ }
639
+ virtual void Execute();
640
+ };
641
+
642
+ void CThreadDecoder::Execute()
643
+ {
644
+ try
645
+ {
646
+ #ifndef _NO_CRYPTO
647
+ bool passwordIsDefined;
648
+ #endif
649
+ Result = Decoder.Decode(
650
+ EXTERNAL_CODECS_VARS
651
+ InStream,
652
+ StartPos,
653
+ PackSizes,
654
+ *Folder,
655
+ Fos,
656
+ NULL
657
+ #ifndef _NO_CRYPTO
658
+ , GetTextPassword, passwordIsDefined
659
+ #endif
660
+ #ifndef _7ZIP_ST
661
+ , MtMode, NumThreads
662
+ #endif
663
+ );
664
+ }
665
+ catch(...)
666
+ {
667
+ Result = E_FAIL;
668
+ }
669
+ if (Result == S_OK)
670
+ Result = FosSpec->CheckFinishedState();
671
+ FosSpec->ReleaseOutStream();
672
+ }
673
+
674
+ bool static Is86FilteredFolder(const CFolder &f)
675
+ {
676
+ for (int i = 0; i < f.Coders.Size(); i++)
677
+ {
678
+ CMethodId m = f.Coders[i].MethodID;
679
+ if (m == k_BCJ || m == k_BCJ2)
680
+ return true;
681
+ }
682
+ return false;
683
+ }
684
+
685
+ #ifndef _NO_CRYPTO
686
+
687
+ class CCryptoGetTextPassword:
688
+ public ICryptoGetTextPassword,
689
+ public CMyUnknownImp
690
+ {
691
+ public:
692
+ UString Password;
693
+
694
+ MY_UNKNOWN_IMP
695
+ STDMETHOD(CryptoGetTextPassword)(BSTR *password);
696
+ };
697
+
698
+ STDMETHODIMP CCryptoGetTextPassword::CryptoGetTextPassword(BSTR *password)
699
+ {
700
+ return StringToBstr(Password, password);
701
+ }
702
+
703
+ #endif
704
+
705
+ static const int kNumGroupsMax = 4;
706
+
707
+ #ifdef USE_86_FILTER
708
+ static bool Is86Group(int group) { return (group & 1) != 0; }
709
+ #endif
710
+ static bool IsEncryptedGroup(int group) { return (group & 2) != 0; }
711
+ static int GetGroupIndex(bool encrypted, int bcjFiltered)
712
+ { return (encrypted ? 2 : 0) + (bcjFiltered ? 1 : 0); }
713
+
714
+ HRESULT Update(
715
+ DECL_EXTERNAL_CODECS_LOC_VARS
716
+ IInStream *inStream,
717
+ const CArchiveDatabaseEx *db,
718
+ const CObjectVector<CUpdateItem> &updateItems,
719
+ COutArchive &archive,
720
+ CArchiveDatabase &newDatabase,
721
+ ISequentialOutStream *seqOutStream,
722
+ IArchiveUpdateCallback *updateCallback,
723
+ const CUpdateOptions &options
724
+ #ifndef _NO_CRYPTO
725
+ , ICryptoGetTextPassword *getDecoderPassword
726
+ #endif
727
+ )
728
+ {
729
+ UInt64 numSolidFiles = options.NumSolidFiles;
730
+ if (numSolidFiles == 0)
731
+ numSolidFiles = 1;
732
+ /*
733
+ CMyComPtr<IOutStream> outStream;
734
+ RINOK(seqOutStream->QueryInterface(IID_IOutStream, (void **)&outStream));
735
+ if (!outStream)
736
+ return E_NOTIMPL;
737
+ */
738
+
739
+ UInt64 startBlockSize = db != 0 ? db->ArchiveInfo.StartPosition: 0;
740
+ if (startBlockSize > 0 && !options.RemoveSfxBlock)
741
+ {
742
+ RINOK(WriteRange(inStream, seqOutStream, 0, startBlockSize, NULL));
743
+ }
744
+
745
+ CRecordVector<int> fileIndexToUpdateIndexMap;
746
+ CRecordVector<CFolderRepack> folderRefs;
747
+ UInt64 complexity = 0;
748
+ UInt64 inSizeForReduce2 = 0;
749
+ bool needEncryptedRepack = false;
750
+ if (db != 0)
751
+ {
752
+ fileIndexToUpdateIndexMap.Reserve(db->Files.Size());
753
+ int i;
754
+ for (i = 0; i < db->Files.Size(); i++)
755
+ fileIndexToUpdateIndexMap.Add(-1);
756
+
757
+ for (i = 0; i < updateItems.Size(); i++)
758
+ {
759
+ int index = updateItems[i].IndexInArchive;
760
+ if (index != -1)
761
+ fileIndexToUpdateIndexMap[index] = i;
762
+ }
763
+
764
+ for (i = 0; i < db->Folders.Size(); i++)
765
+ {
766
+ CNum indexInFolder = 0;
767
+ CNum numCopyItems = 0;
768
+ CNum numUnpackStreams = db->NumUnpackStreamsVector[i];
769
+ UInt64 repackSize = 0;
770
+ for (CNum fi = db->FolderStartFileIndex[i]; indexInFolder < numUnpackStreams; fi++)
771
+ {
772
+ const CFileItem &file = db->Files[fi];
773
+ if (file.HasStream)
774
+ {
775
+ indexInFolder++;
776
+ int updateIndex = fileIndexToUpdateIndexMap[fi];
777
+ if (updateIndex >= 0 && !updateItems[updateIndex].NewData)
778
+ {
779
+ numCopyItems++;
780
+ repackSize += file.Size;
781
+ }
782
+ }
783
+ }
784
+
785
+ if (numCopyItems == 0)
786
+ continue;
787
+
788
+ CFolderRepack rep;
789
+ rep.FolderIndex = i;
790
+ rep.NumCopyFiles = numCopyItems;
791
+ const CFolder &f = db->Folders[i];
792
+ bool isEncrypted = f.IsEncrypted();
793
+ rep.Group = GetGroupIndex(isEncrypted, Is86FilteredFolder(f));
794
+ folderRefs.Add(rep);
795
+ if (numCopyItems == numUnpackStreams)
796
+ complexity += db->GetFolderFullPackSize(i);
797
+ else
798
+ {
799
+ complexity += repackSize;
800
+ if (repackSize > inSizeForReduce2)
801
+ inSizeForReduce2 = repackSize;
802
+ if (isEncrypted)
803
+ needEncryptedRepack = true;
804
+ }
805
+ }
806
+ folderRefs.Sort(CompareFolderRepacks, (void *)db);
807
+ }
808
+
809
+ UInt64 inSizeForReduce = 0;
810
+ int i;
811
+ for (i = 0; i < updateItems.Size(); i++)
812
+ {
813
+ const CUpdateItem &ui = updateItems[i];
814
+ if (ui.NewData)
815
+ {
816
+ complexity += ui.Size;
817
+ if (numSolidFiles != 1)
818
+ inSizeForReduce += ui.Size;
819
+ else if (ui.Size > inSizeForReduce)
820
+ inSizeForReduce = ui.Size;
821
+ }
822
+ }
823
+
824
+ if (inSizeForReduce2 > inSizeForReduce)
825
+ inSizeForReduce = inSizeForReduce2;
826
+
827
+ const UInt32 kMinReduceSize = (1 << 16);
828
+ if (inSizeForReduce < kMinReduceSize)
829
+ inSizeForReduce = kMinReduceSize;
830
+
831
+ RINOK(updateCallback->SetTotal(complexity));
832
+
833
+ CLocalProgress *lps = new CLocalProgress;
834
+ CMyComPtr<ICompressProgressInfo> progress = lps;
835
+ lps->Init(updateCallback, true);
836
+
837
+ CThreadDecoder threadDecoder;
838
+ if (!folderRefs.IsEmpty())
839
+ {
840
+ #ifdef EXTERNAL_CODECS
841
+ threadDecoder._codecsInfo = codecsInfo;
842
+ threadDecoder._externalCodecs = *externalCodecs;
843
+ #endif
844
+ RINOK(threadDecoder.Create());
845
+ }
846
+
847
+ CObjectVector<CSolidGroup> groups;
848
+ for (i = 0; i < kNumGroupsMax; i++)
849
+ groups.Add(CSolidGroup());
850
+
851
+ {
852
+ // ---------- Split files to 2 groups ----------
853
+
854
+ bool useFilters = options.UseFilters;
855
+ const CCompressionMethodMode &method = *options.Method;
856
+ if (method.Methods.Size() != 1 || method.Binds.Size() != 0)
857
+ useFilters = false;
858
+ for (i = 0; i < updateItems.Size(); i++)
859
+ {
860
+ const CUpdateItem &ui = updateItems[i];
861
+ if (!ui.NewData || !ui.HasStream())
862
+ continue;
863
+ bool filteredGroup = false;
864
+ if (useFilters)
865
+ {
866
+ #ifdef _WIN32
867
+ int dotPos = ui.Name.ReverseFind(L'.');
868
+ if (dotPos >= 0)
869
+ filteredGroup = IsExeExt(ui.Name.Mid(dotPos + 1));
870
+ #else
871
+ filteredGroup = IsExeFile(ui);
872
+ #endif
873
+ }
874
+ groups[GetGroupIndex(method.PasswordIsDefined, filteredGroup)].Indices.Add(i);
875
+ }
876
+ }
877
+
878
+ #ifndef _NO_CRYPTO
879
+
880
+ CCryptoGetTextPassword *getPasswordSpec = NULL;
881
+ if (needEncryptedRepack)
882
+ {
883
+ getPasswordSpec = new CCryptoGetTextPassword;
884
+ threadDecoder.GetTextPassword = getPasswordSpec;
885
+
886
+ if (options.Method->PasswordIsDefined)
887
+ getPasswordSpec->Password = options.Method->Password;
888
+ else
889
+ {
890
+ if (!getDecoderPassword)
891
+ return E_NOTIMPL;
892
+ CMyComBSTR password;
893
+ RINOK(getDecoderPassword->CryptoGetTextPassword(&password));
894
+ getPasswordSpec->Password = password;
895
+ }
896
+ }
897
+
898
+ #endif
899
+
900
+ // ---------- Compress ----------
901
+
902
+ RINOK(archive.Create(seqOutStream, false));
903
+ RINOK(archive.SkipPrefixArchiveHeader());
904
+
905
+ int folderRefIndex = 0;
906
+ lps->ProgressOffset = 0;
907
+
908
+ for (int groupIndex = 0; groupIndex < kNumGroupsMax; groupIndex++)
909
+ {
910
+ const CSolidGroup &group = groups[groupIndex];
911
+
912
+ CCompressionMethodMode method;
913
+ #ifdef USE_86_FILTER
914
+ if (Is86Group(groupIndex))
915
+ MakeExeMethod(*options.Method, options.MaxFilter, method);
916
+ else
917
+ #endif
918
+ method = *options.Method;
919
+
920
+ if (IsEncryptedGroup(groupIndex))
921
+ {
922
+ if (!method.PasswordIsDefined)
923
+ {
924
+ #ifndef _NO_CRYPTO
925
+ if (getPasswordSpec)
926
+ method.Password = getPasswordSpec->Password;
927
+ #endif
928
+ method.PasswordIsDefined = true;
929
+ }
930
+ }
931
+ else
932
+ {
933
+ method.PasswordIsDefined = false;
934
+ method.Password.Empty();
935
+ }
936
+
937
+ CEncoder encoder(method);
938
+
939
+ for (; folderRefIndex < folderRefs.Size(); folderRefIndex++)
940
+ {
941
+ const CFolderRepack &rep = folderRefs[folderRefIndex];
942
+ if (rep.Group != groupIndex)
943
+ break;
944
+ int folderIndex = rep.FolderIndex;
945
+
946
+ if (rep.NumCopyFiles == db->NumUnpackStreamsVector[folderIndex])
947
+ {
948
+ UInt64 packSize = db->GetFolderFullPackSize(folderIndex);
949
+ RINOK(WriteRange(inStream, archive.SeqStream,
950
+ db->GetFolderStreamPos(folderIndex, 0), packSize, progress));
951
+ lps->ProgressOffset += packSize;
952
+
953
+ const CFolder &folder = db->Folders[folderIndex];
954
+ CNum startIndex = db->FolderStartPackStreamIndex[folderIndex];
955
+ for (int j = 0; j < folder.PackStreams.Size(); j++)
956
+ {
957
+ newDatabase.PackSizes.Add(db->PackSizes[startIndex + j]);
958
+ // newDatabase.PackCRCsDefined.Add(db.PackCRCsDefined[startIndex + j]);
959
+ // newDatabase.PackCRCs.Add(db.PackCRCs[startIndex + j]);
960
+ }
961
+ newDatabase.Folders.Add(folder);
962
+ }
963
+ else
964
+ {
965
+ CStreamBinder sb;
966
+ RINOK(sb.CreateEvents());
967
+ CMyComPtr<ISequentialOutStream> sbOutStream;
968
+ CMyComPtr<ISequentialInStream> sbInStream;
969
+ sb.CreateStreams(&sbInStream, &sbOutStream);
970
+ CBoolVector extractStatuses;
971
+
972
+ CNum numUnpackStreams = db->NumUnpackStreamsVector[folderIndex];
973
+ CNum indexInFolder = 0;
974
+
975
+ for (CNum fi = db->FolderStartFileIndex[folderIndex]; indexInFolder < numUnpackStreams; fi++)
976
+ {
977
+ bool needExtract = false;
978
+ if (db->Files[fi].HasStream)
979
+ {
980
+ indexInFolder++;
981
+ int updateIndex = fileIndexToUpdateIndexMap[fi];
982
+ if (updateIndex >= 0 && !updateItems[updateIndex].NewData)
983
+ needExtract = true;
984
+ }
985
+ extractStatuses.Add(needExtract);
986
+ }
987
+
988
+ RINOK(threadDecoder.FosSpec->Init(db, db->FolderStartFileIndex[folderIndex], &extractStatuses, sbOutStream));
989
+ sbOutStream.Release();
990
+
991
+ threadDecoder.InStream = inStream;
992
+ threadDecoder.Folder = &db->Folders[folderIndex];
993
+ threadDecoder.StartPos = db->GetFolderStreamPos(folderIndex, 0);
994
+ threadDecoder.PackSizes = &db->PackSizes[db->FolderStartPackStreamIndex[folderIndex]];
995
+
996
+ threadDecoder.Start();
997
+
998
+ int startPackIndex = newDatabase.PackSizes.Size();
999
+ CFolder newFolder;
1000
+ RINOK(encoder.Encode(
1001
+ EXTERNAL_CODECS_LOC_VARS
1002
+ sbInStream, NULL, &inSizeForReduce, newFolder,
1003
+ archive.SeqStream, newDatabase.PackSizes, progress));
1004
+
1005
+ threadDecoder.WaitFinish();
1006
+
1007
+ RINOK(threadDecoder.Result);
1008
+
1009
+ for (; startPackIndex < newDatabase.PackSizes.Size(); startPackIndex++)
1010
+ lps->OutSize += newDatabase.PackSizes[startPackIndex];
1011
+ lps->InSize += newFolder.GetUnpackSize();
1012
+
1013
+ newDatabase.Folders.Add(newFolder);
1014
+ }
1015
+
1016
+ newDatabase.NumUnpackStreamsVector.Add(rep.NumCopyFiles);
1017
+
1018
+ CNum numUnpackStreams = db->NumUnpackStreamsVector[folderIndex];
1019
+
1020
+ CNum indexInFolder = 0;
1021
+ for (CNum fi = db->FolderStartFileIndex[folderIndex]; indexInFolder < numUnpackStreams; fi++)
1022
+ {
1023
+ CFileItem file;
1024
+ CFileItem2 file2;
1025
+ db->GetFile(fi, file, file2);
1026
+ if (file.HasStream)
1027
+ {
1028
+ indexInFolder++;
1029
+ int updateIndex = fileIndexToUpdateIndexMap[fi];
1030
+ if (updateIndex >= 0)
1031
+ {
1032
+ const CUpdateItem &ui = updateItems[updateIndex];
1033
+ if (ui.NewData)
1034
+ continue;
1035
+ if (ui.NewProps)
1036
+ {
1037
+ CFileItem uf;
1038
+ FromUpdateItemToFileItem(ui, uf, file2);
1039
+ uf.Size = file.Size;
1040
+ uf.Crc = file.Crc;
1041
+ uf.CrcDefined = file.CrcDefined;
1042
+ uf.HasStream = file.HasStream;
1043
+ file = uf;
1044
+ }
1045
+ newDatabase.AddFile(file, file2);
1046
+ }
1047
+ }
1048
+ }
1049
+ }
1050
+
1051
+ int numFiles = group.Indices.Size();
1052
+ if (numFiles == 0)
1053
+ continue;
1054
+ CRecordVector<CRefItem> refItems;
1055
+ refItems.Reserve(numFiles);
1056
+ bool sortByType = (numSolidFiles > 1);
1057
+ for (i = 0; i < numFiles; i++)
1058
+ refItems.Add(CRefItem(group.Indices[i], updateItems[group.Indices[i]], sortByType));
1059
+ refItems.Sort(CompareUpdateItems, (void *)&sortByType);
1060
+
1061
+ CRecordVector<UInt32> indices;
1062
+ indices.Reserve(numFiles);
1063
+
1064
+ for (i = 0; i < numFiles; i++)
1065
+ {
1066
+ UInt32 index = refItems[i].Index;
1067
+ indices.Add(index);
1068
+ /*
1069
+ const CUpdateItem &ui = updateItems[index];
1070
+ CFileItem file;
1071
+ if (ui.NewProps)
1072
+ FromUpdateItemToFileItem(ui, file);
1073
+ else
1074
+ file = db.Files[ui.IndexInArchive];
1075
+ if (file.IsAnti || file.IsDir)
1076
+ return E_FAIL;
1077
+ newDatabase.Files.Add(file);
1078
+ */
1079
+ }
1080
+
1081
+ for (i = 0; i < numFiles;)
1082
+ {
1083
+ UInt64 totalSize = 0;
1084
+ int numSubFiles;
1085
+ UString prevExtension;
1086
+ for (numSubFiles = 0; i + numSubFiles < numFiles &&
1087
+ numSubFiles < numSolidFiles; numSubFiles++)
1088
+ {
1089
+ const CUpdateItem &ui = updateItems[indices[i + numSubFiles]];
1090
+ totalSize += ui.Size;
1091
+ if (totalSize > options.NumSolidBytes)
1092
+ break;
1093
+ if (options.SolidExtension)
1094
+ {
1095
+ UString ext = ui.GetExtension();
1096
+ if (numSubFiles == 0)
1097
+ prevExtension = ext;
1098
+ else
1099
+ if (ext.CompareNoCase(prevExtension) != 0)
1100
+ break;
1101
+ }
1102
+ }
1103
+ if (numSubFiles < 1)
1104
+ numSubFiles = 1;
1105
+
1106
+ CFolderInStream *inStreamSpec = new CFolderInStream;
1107
+ CMyComPtr<ISequentialInStream> solidInStream(inStreamSpec);
1108
+ inStreamSpec->Init(updateCallback, &indices[i], numSubFiles);
1109
+
1110
+ CFolder folderItem;
1111
+
1112
+ int startPackIndex = newDatabase.PackSizes.Size();
1113
+ RINOK(encoder.Encode(
1114
+ EXTERNAL_CODECS_LOC_VARS
1115
+ solidInStream, NULL, &inSizeForReduce, folderItem,
1116
+ archive.SeqStream, newDatabase.PackSizes, progress));
1117
+
1118
+ for (; startPackIndex < newDatabase.PackSizes.Size(); startPackIndex++)
1119
+ lps->OutSize += newDatabase.PackSizes[startPackIndex];
1120
+
1121
+ lps->InSize += folderItem.GetUnpackSize();
1122
+ // for ()
1123
+ // newDatabase.PackCRCsDefined.Add(false);
1124
+ // newDatabase.PackCRCs.Add(0);
1125
+
1126
+ newDatabase.Folders.Add(folderItem);
1127
+
1128
+ CNum numUnpackStreams = 0;
1129
+ for (int subIndex = 0; subIndex < numSubFiles; subIndex++)
1130
+ {
1131
+ const CUpdateItem &ui = updateItems[indices[i + subIndex]];
1132
+ CFileItem file;
1133
+ CFileItem2 file2;
1134
+ if (ui.NewProps)
1135
+ FromUpdateItemToFileItem(ui, file, file2);
1136
+ else
1137
+ db->GetFile(ui.IndexInArchive, file, file2);
1138
+ if (file2.IsAnti || file.IsDir)
1139
+ return E_FAIL;
1140
+
1141
+ /*
1142
+ CFileItem &file = newDatabase.Files[
1143
+ startFileIndexInDatabase + i + subIndex];
1144
+ */
1145
+ if (!inStreamSpec->Processed[subIndex])
1146
+ {
1147
+ continue;
1148
+ // file.Name += L".locked";
1149
+ }
1150
+
1151
+ file.Crc = inStreamSpec->CRCs[subIndex];
1152
+ file.Size = inStreamSpec->Sizes[subIndex];
1153
+ if (file.Size != 0)
1154
+ {
1155
+ file.CrcDefined = true;
1156
+ file.HasStream = true;
1157
+ numUnpackStreams++;
1158
+ }
1159
+ else
1160
+ {
1161
+ file.CrcDefined = false;
1162
+ file.HasStream = false;
1163
+ }
1164
+ newDatabase.AddFile(file, file2);
1165
+ }
1166
+ // numUnpackStreams = 0 is very bad case for locked files
1167
+ // v3.13 doesn't understand it.
1168
+ newDatabase.NumUnpackStreamsVector.Add(numUnpackStreams);
1169
+ i += numSubFiles;
1170
+ }
1171
+ }
1172
+
1173
+ if (folderRefIndex != folderRefs.Size())
1174
+ return E_FAIL;
1175
+
1176
+ /*
1177
+ folderRefs.ClearAndFree();
1178
+ fileIndexToUpdateIndexMap.ClearAndFree();
1179
+ groups.ClearAndFree();
1180
+ */
1181
+
1182
+ {
1183
+ // ---------- Write Folders & Empty Files ----------
1184
+
1185
+ CRecordVector<int> emptyRefs;
1186
+ for (i = 0; i < updateItems.Size(); i++)
1187
+ {
1188
+ const CUpdateItem &ui = updateItems[i];
1189
+ if (ui.NewData)
1190
+ {
1191
+ if (ui.HasStream())
1192
+ continue;
1193
+ }
1194
+ else if (ui.IndexInArchive != -1 && db->Files[ui.IndexInArchive].HasStream)
1195
+ continue;
1196
+ emptyRefs.Add(i);
1197
+ }
1198
+ emptyRefs.Sort(CompareEmptyItems, (void *)&updateItems);
1199
+ for (i = 0; i < emptyRefs.Size(); i++)
1200
+ {
1201
+ const CUpdateItem &ui = updateItems[emptyRefs[i]];
1202
+ CFileItem file;
1203
+ CFileItem2 file2;
1204
+ if (ui.NewProps)
1205
+ FromUpdateItemToFileItem(ui, file, file2);
1206
+ else
1207
+ db->GetFile(ui.IndexInArchive, file, file2);
1208
+ newDatabase.AddFile(file, file2);
1209
+ }
1210
+ }
1211
+
1212
+ newDatabase.ReserveDown();
1213
+ return S_OK;
1214
+ }
1215
+
1216
+ }}