omnizip 0.4.7-aarch64-linux

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 (632) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +32 -0
  4. data/.rubocop_todo.yml +293 -0
  5. data/CHANGELOG.md +1647 -0
  6. data/CONTEXT.md +68 -0
  7. data/COPYING +502 -0
  8. data/Gemfile +19 -0
  9. data/LICENSE +12 -0
  10. data/README.adoc +1327 -0
  11. data/Rakefile +15 -0
  12. data/TODO.refactor/00-overview.md +67 -0
  13. data/TODO.refactor/01-registry-base-class.md +81 -0
  14. data/TODO.refactor/02-error-hierarchy.md +57 -0
  15. data/TODO.refactor/03-autoload-entry-point.md +69 -0
  16. data/TODO.refactor/04-filter-base-consolidation.md +49 -0
  17. data/TODO.refactor/05-send-private-methods.md +64 -0
  18. data/TODO.refactor/06-instance-variable-access.md +69 -0
  19. data/TODO.refactor/07-respond-to-replacement.md +237 -0
  20. data/TODO.refactor/08-spec-doubles.md +27 -0
  21. data/TODO.refactor/09-cli-shared-module.md +35 -0
  22. data/TODO.refactor/10-format-detector-ocp.md +34 -0
  23. data/TODO.refactor/11-convenience-decoupling.md +38 -0
  24. data/TODO.refactor/12-thread-safety.md +8 -0
  25. data/TODO.refactor/13-lutaml-model-migration.md +158 -0
  26. data/TODO.refactor/14-add-missing-specs.md +25 -0
  27. data/benchmark/README.md +260 -0
  28. data/benchmark/benchmark_suite.rb +125 -0
  29. data/benchmark/compression_bench.rb +181 -0
  30. data/benchmark/filter_bench.rb +180 -0
  31. data/benchmark/models/benchmark_result.rb +59 -0
  32. data/benchmark/models/comparison_result.rb +69 -0
  33. data/benchmark/profile_suite.rb +167 -0
  34. data/benchmark/reporter.rb +150 -0
  35. data/benchmark/run_benchmarks.rb +66 -0
  36. data/benchmark/test_data.rb +137 -0
  37. data/config/formats/rar3_spec.yml +92 -0
  38. data/config/formats/rar5_spec.yml +102 -0
  39. data/docs/.github/workflows/docs.yml +142 -0
  40. data/docs/.gitignore +21 -0
  41. data/docs/.lychee.toml +67 -0
  42. data/docs/Gemfile +13 -0
  43. data/docs/RAR_WRITE_SUPPORT.md +26 -0
  44. data/docs/README.md +101 -0
  45. data/docs/_config.yml +112 -0
  46. data/docs/assets/logo.svg +1 -0
  47. data/docs/assets/omnizip-logo.pdf +1540 -11
  48. data/docs/comparison/feature-matrix.adoc +694 -0
  49. data/docs/comparison/index.adoc +113 -0
  50. data/docs/comparison/vs-7zip.adoc +309 -0
  51. data/docs/comparison/vs-peazip.adoc +77 -0
  52. data/docs/comparison/vs-rubyzip.adoc +342 -0
  53. data/docs/comparison/vs-winrar.adoc +100 -0
  54. data/docs/compatibility.adoc +579 -0
  55. data/docs/concepts/index.adoc +129 -0
  56. data/docs/developer/architecture.adoc +256 -0
  57. data/docs/developer/contributing.adoc +158 -0
  58. data/docs/developer/index.adoc +25 -0
  59. data/docs/developer/testing.adoc +212 -0
  60. data/docs/getting-started/basic-usage.adoc +263 -0
  61. data/docs/getting-started/index.adoc +42 -0
  62. data/docs/getting-started/installation.adoc +138 -0
  63. data/docs/getting-started/quick-start.adoc +183 -0
  64. data/docs/getting-started/your-first-archive.adoc +219 -0
  65. data/docs/guides/advanced-features/encryption.adoc +277 -0
  66. data/docs/guides/advanced-features/index.adoc +59 -0
  67. data/docs/guides/advanced-features/parallel-processing.adoc +144 -0
  68. data/docs/guides/advanced-features/progress-tracking.adoc +124 -0
  69. data/docs/guides/advanced-features/streaming.adoc +142 -0
  70. data/docs/guides/archive-formats/gzip-format.adoc +105 -0
  71. data/docs/guides/archive-formats/index.adoc +160 -0
  72. data/docs/guides/archive-formats/ole-format.adoc +151 -0
  73. data/docs/guides/archive-formats/rar-format.adoc +104 -0
  74. data/docs/guides/archive-formats/rar5.adoc +521 -0
  75. data/docs/guides/archive-formats/rpm-format.adoc +108 -0
  76. data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
  77. data/docs/guides/archive-formats/tar-format.adoc +106 -0
  78. data/docs/guides/archive-formats/xz-format.adoc +118 -0
  79. data/docs/guides/archive-formats/zip-format.adoc +35 -0
  80. data/docs/guides/compression-algorithms/bzip2.adoc +114 -0
  81. data/docs/guides/compression-algorithms/deflate.adoc +313 -0
  82. data/docs/guides/compression-algorithms/index.adoc +190 -0
  83. data/docs/guides/compression-algorithms/lzma.adoc +394 -0
  84. data/docs/guides/compression-algorithms/lzma2.adoc +244 -0
  85. data/docs/guides/compression-algorithms/ppmd.adoc +313 -0
  86. data/docs/guides/compression-algorithms/zstandard.adoc +296 -0
  87. data/docs/guides/creating-archives.adoc +348 -0
  88. data/docs/guides/extracting-archives.adoc +53 -0
  89. data/docs/guides/format-conversion.adoc +64 -0
  90. data/docs/guides/index.adoc +49 -0
  91. data/docs/guides/migration-rubyzip.adoc +217 -0
  92. data/docs/guides/parity-archives.adoc +605 -0
  93. data/docs/guides/performance-tuning.adoc +88 -0
  94. data/docs/index.adoc +228 -0
  95. data/docs/lychee.toml +67 -0
  96. data/docs/reference/api/overview.adoc +187 -0
  97. data/docs/reference/cli/compress-command.adoc +114 -0
  98. data/docs/reference/cli/overview.adoc +140 -0
  99. data/docs/reference/index.adoc +26 -0
  100. data/docs/resources/faq.adoc +185 -0
  101. data/docs/resources/quick-reference.adoc +222 -0
  102. data/docs/rust-backend.md +0 -0
  103. data/docs/troubleshooting/index.adoc +207 -0
  104. data/docs/xar_format.md +216 -0
  105. data/examples/api_comparison.rb +205 -0
  106. data/examples/deflate64_example.rb +96 -0
  107. data/examples/par2_demo.rb +121 -0
  108. data/examples/quick_start_native.rb +150 -0
  109. data/examples/quick_start_rubyzip.rb +115 -0
  110. data/examples/rubyzip_compatibility_demo.rb +194 -0
  111. data/exe/omnizip +27 -0
  112. data/lib/omnizip/algorithm.rb +176 -0
  113. data/lib/omnizip/algorithm_registry.rb +65 -0
  114. data/lib/omnizip/algorithms/.keep +0 -0
  115. data/lib/omnizip/algorithms/bzip2/bwt.rb +236 -0
  116. data/lib/omnizip/algorithms/bzip2/bz2.rb +687 -0
  117. data/lib/omnizip/algorithms/bzip2/rle.rb +146 -0
  118. data/lib/omnizip/algorithms/bzip2.rb +108 -0
  119. data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
  120. data/lib/omnizip/algorithms/deflate/decoder.rb +37 -0
  121. data/lib/omnizip/algorithms/deflate/encoder.rb +45 -0
  122. data/lib/omnizip/algorithms/deflate.rb +135 -0
  123. data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
  124. data/lib/omnizip/algorithms/deflate64/decoder.rb +151 -0
  125. data/lib/omnizip/algorithms/deflate64/encoder.rb +95 -0
  126. data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +352 -0
  127. data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +140 -0
  128. data/lib/omnizip/algorithms/deflate64.rb +118 -0
  129. data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
  130. data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
  131. data/lib/omnizip/algorithms/lzma/decoder.rb +146 -0
  132. data/lib/omnizip/algorithms/lzma/dictionary.rb +70 -0
  133. data/lib/omnizip/algorithms/lzma/distance_coder.rb +326 -0
  134. data/lib/omnizip/algorithms/lzma/encoder.rb +139 -0
  135. data/lib/omnizip/algorithms/lzma/length_coder.rb +172 -0
  136. data/lib/omnizip/algorithms/lzma/literal_decoder.rb +204 -0
  137. data/lib/omnizip/algorithms/lzma/literal_encoder.rb +208 -0
  138. data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +368 -0
  139. data/lib/omnizip/algorithms/lzma/lzma1_encoder.rb +105 -0
  140. data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +194 -0
  141. data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
  142. data/lib/omnizip/algorithms/lzma/match.rb +32 -0
  143. data/lib/omnizip/algorithms/lzma/match_finder.rb +233 -0
  144. data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
  145. data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +84 -0
  146. data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +159 -0
  147. data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
  148. data/lib/omnizip/algorithms/lzma/range_coder.rb +82 -0
  149. data/lib/omnizip/algorithms/lzma/range_decoder.rb +274 -0
  150. data/lib/omnizip/algorithms/lzma/range_encoder.rb +202 -0
  151. data/lib/omnizip/algorithms/lzma/state.rb +127 -0
  152. data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +323 -0
  153. data/lib/omnizip/algorithms/lzma/xz_encoder.rb +420 -0
  154. data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +640 -0
  155. data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +224 -0
  156. data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +167 -0
  157. data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +258 -0
  158. data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
  159. data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +314 -0
  160. data/lib/omnizip/algorithms/lzma/xz_state.rb +108 -0
  161. data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +1311 -0
  162. data/lib/omnizip/algorithms/lzma.rb +266 -0
  163. data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +180 -0
  164. data/lib/omnizip/algorithms/lzma2/constants.rb +38 -0
  165. data/lib/omnizip/algorithms/lzma2/encoder.rb +145 -0
  166. data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +165 -0
  167. data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
  168. data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +122 -0
  169. data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
  170. data/lib/omnizip/algorithms/lzma2.rb +133 -0
  171. data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
  172. data/lib/omnizip/algorithms/ppmd7/context.rb +151 -0
  173. data/lib/omnizip/algorithms/ppmd7/decoder.rb +127 -0
  174. data/lib/omnizip/algorithms/ppmd7/encoder.rb +153 -0
  175. data/lib/omnizip/algorithms/ppmd7/model.rb +245 -0
  176. data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
  177. data/lib/omnizip/algorithms/ppmd7.rb +146 -0
  178. data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
  179. data/lib/omnizip/algorithms/ppmd8/context.rb +32 -0
  180. data/lib/omnizip/algorithms/ppmd8/decoder.rb +104 -0
  181. data/lib/omnizip/algorithms/ppmd8/encoder.rb +135 -0
  182. data/lib/omnizip/algorithms/ppmd8/model.rb +246 -0
  183. data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
  184. data/lib/omnizip/algorithms/ppmd8.rb +122 -0
  185. data/lib/omnizip/algorithms/ppmd_base.rb +142 -0
  186. data/lib/omnizip/algorithms/registration.rb +28 -0
  187. data/lib/omnizip/algorithms/zstandard/constants.rb +158 -0
  188. data/lib/omnizip/algorithms/zstandard/decoder.rb +249 -0
  189. data/lib/omnizip/algorithms/zstandard/dictionary.rb +73 -0
  190. data/lib/omnizip/algorithms/zstandard/encoder.rb +294 -0
  191. data/lib/omnizip/algorithms/zstandard/frame/block.rb +143 -0
  192. data/lib/omnizip/algorithms/zstandard/frame/header.rb +233 -0
  193. data/lib/omnizip/algorithms/zstandard/frame.rb +33 -0
  194. data/lib/omnizip/algorithms/zstandard/fse/bitstream.rb +183 -0
  195. data/lib/omnizip/algorithms/zstandard/fse/encoder.rb +534 -0
  196. data/lib/omnizip/algorithms/zstandard/fse/interleaved.rb +92 -0
  197. data/lib/omnizip/algorithms/zstandard/fse/table.rb +188 -0
  198. data/lib/omnizip/algorithms/zstandard/fse/table_description.rb +203 -0
  199. data/lib/omnizip/algorithms/zstandard/fse.rb +53 -0
  200. data/lib/omnizip/algorithms/zstandard/huffman.rb +276 -0
  201. data/lib/omnizip/algorithms/zstandard/huffman_encoder.rb +327 -0
  202. data/lib/omnizip/algorithms/zstandard/ldm.rb +121 -0
  203. data/lib/omnizip/algorithms/zstandard/literals.rb +241 -0
  204. data/lib/omnizip/algorithms/zstandard/literals_encoder.rb +96 -0
  205. data/lib/omnizip/algorithms/zstandard/match_finder.rb +483 -0
  206. data/lib/omnizip/algorithms/zstandard/sequences.rb +350 -0
  207. data/lib/omnizip/algorithms/zstandard/sequences_encoder.rb +333 -0
  208. data/lib/omnizip/algorithms/zstandard/xxhash.rb +159 -0
  209. data/lib/omnizip/algorithms/zstandard.rb +210 -0
  210. data/lib/omnizip/algorithms.rb +35 -0
  211. data/lib/omnizip/archive/builder.rb +48 -0
  212. data/lib/omnizip/archive/reader_session.rb +67 -0
  213. data/lib/omnizip/archive.rb +86 -0
  214. data/lib/omnizip/archive_handler.rb +82 -0
  215. data/lib/omnizip/archive_handlers/cpio_handler.rb +47 -0
  216. data/lib/omnizip/archive_handlers/iso_handler.rb +54 -0
  217. data/lib/omnizip/archive_handlers/ole_handler.rb +37 -0
  218. data/lib/omnizip/archive_handlers/rar_handler.rb +96 -0
  219. data/lib/omnizip/archive_handlers/rpm_handler.rb +45 -0
  220. data/lib/omnizip/archive_handlers/seven_zip_handler.rb +89 -0
  221. data/lib/omnizip/archive_handlers/tar_handler.rb +75 -0
  222. data/lib/omnizip/archive_handlers/xar_handler.rb +49 -0
  223. data/lib/omnizip/archive_handlers/zip_handler.rb +115 -0
  224. data/lib/omnizip/archive_handlers.rb +18 -0
  225. data/lib/omnizip/backends.rb +160 -0
  226. data/lib/omnizip/buffer/memory_archive.rb +246 -0
  227. data/lib/omnizip/buffer/memory_extractor.rb +234 -0
  228. data/lib/omnizip/buffer/seven_zip_bridge.rb +171 -0
  229. data/lib/omnizip/buffer.rb +187 -0
  230. data/lib/omnizip/checksum_registry.rb +41 -0
  231. data/lib/omnizip/checksums/crc32.rb +101 -0
  232. data/lib/omnizip/checksums/crc64.rb +102 -0
  233. data/lib/omnizip/checksums/crc_base.rb +158 -0
  234. data/lib/omnizip/checksums/registration.rb +16 -0
  235. data/lib/omnizip/checksums/verifier.rb +130 -0
  236. data/lib/omnizip/checksums.rb +11 -0
  237. data/lib/omnizip/chunked/memory_manager.rb +194 -0
  238. data/lib/omnizip/chunked/reader.rb +78 -0
  239. data/lib/omnizip/chunked/writer.rb +123 -0
  240. data/lib/omnizip/chunked.rb +123 -0
  241. data/lib/omnizip/cli/output_formatter.rb +112 -0
  242. data/lib/omnizip/cli.rb +604 -0
  243. data/lib/omnizip/commands/.keep +0 -0
  244. data/lib/omnizip/commands/archive_create_command.rb +245 -0
  245. data/lib/omnizip/commands/archive_extract_command.rb +231 -0
  246. data/lib/omnizip/commands/archive_list_command.rb +204 -0
  247. data/lib/omnizip/commands/archive_repair_command.rb +129 -0
  248. data/lib/omnizip/commands/archive_verify_command.rb +115 -0
  249. data/lib/omnizip/commands/compress_command.rb +115 -0
  250. data/lib/omnizip/commands/decompress_command.rb +149 -0
  251. data/lib/omnizip/commands/list_command.rb +51 -0
  252. data/lib/omnizip/commands/metadata_command.rb +215 -0
  253. data/lib/omnizip/commands/parity_create_command.rb +114 -0
  254. data/lib/omnizip/commands/parity_repair_command.rb +120 -0
  255. data/lib/omnizip/commands/parity_verify_command.rb +122 -0
  256. data/lib/omnizip/commands/profile_list_command.rb +54 -0
  257. data/lib/omnizip/commands/profile_show_command.rb +44 -0
  258. data/lib/omnizip/commands.rb +21 -0
  259. data/lib/omnizip/convenience.rb +389 -0
  260. data/lib/omnizip/converter/conversion_registry.rb +50 -0
  261. data/lib/omnizip/converter/conversion_strategy.rb +108 -0
  262. data/lib/omnizip/converter/extract_repack_strategy.rb +51 -0
  263. data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +43 -0
  264. data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +54 -0
  265. data/lib/omnizip/converter.rb +124 -0
  266. data/lib/omnizip/crypto/aes256/cipher.rb +104 -0
  267. data/lib/omnizip/crypto/aes256/constants.rb +28 -0
  268. data/lib/omnizip/crypto/aes256/key_derivation.rb +100 -0
  269. data/lib/omnizip/crypto/aes256.rb +102 -0
  270. data/lib/omnizip/crypto.rb +11 -0
  271. data/lib/omnizip/entry.rb +44 -0
  272. data/lib/omnizip/error.rb +110 -0
  273. data/lib/omnizip/eta/exponential_smoothing_estimator.rb +95 -0
  274. data/lib/omnizip/eta/moving_average_estimator.rb +96 -0
  275. data/lib/omnizip/eta/rate_calculator.rb +104 -0
  276. data/lib/omnizip/eta/sample_history.rb +143 -0
  277. data/lib/omnizip/eta/time_estimator.rb +106 -0
  278. data/lib/omnizip/eta.rb +68 -0
  279. data/lib/omnizip/extraction/filter_chain.rb +179 -0
  280. data/lib/omnizip/extraction/glob_pattern.rb +140 -0
  281. data/lib/omnizip/extraction/pattern_matcher.rb +66 -0
  282. data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
  283. data/lib/omnizip/extraction/regex_pattern.rb +50 -0
  284. data/lib/omnizip/extraction/selective_extractor.rb +247 -0
  285. data/lib/omnizip/extraction.rb +115 -0
  286. data/lib/omnizip/file_type/mime_classifier.rb +144 -0
  287. data/lib/omnizip/file_type.rb +117 -0
  288. data/lib/omnizip/filter.rb +141 -0
  289. data/lib/omnizip/filter_pipeline.rb +108 -0
  290. data/lib/omnizip/filter_registry.rb +113 -0
  291. data/lib/omnizip/filters/bcj.rb +277 -0
  292. data/lib/omnizip/filters/bcj2/constants.rb +53 -0
  293. data/lib/omnizip/filters/bcj2/decoder.rb +263 -0
  294. data/lib/omnizip/filters/bcj2/encoder.rb +58 -0
  295. data/lib/omnizip/filters/bcj2/stream_data.rb +91 -0
  296. data/lib/omnizip/filters/bcj2.rb +93 -0
  297. data/lib/omnizip/filters/bcj_arm.rb +174 -0
  298. data/lib/omnizip/filters/bcj_arm64.rb +242 -0
  299. data/lib/omnizip/filters/bcj_ia64.rb +194 -0
  300. data/lib/omnizip/filters/bcj_ppc.rb +188 -0
  301. data/lib/omnizip/filters/bcj_sparc.rb +174 -0
  302. data/lib/omnizip/filters/bcj_x86.rb +191 -0
  303. data/lib/omnizip/filters/delta.rb +195 -0
  304. data/lib/omnizip/filters/xz_delta.rb +258 -0
  305. data/lib/omnizip/filters.rb +20 -0
  306. data/lib/omnizip/format_detector.rb +166 -0
  307. data/lib/omnizip/formats/.keep +0 -0
  308. data/lib/omnizip/formats/bzip2_file.rb +159 -0
  309. data/lib/omnizip/formats/cpio/bounded_io.rb +66 -0
  310. data/lib/omnizip/formats/cpio/constants.rb +55 -0
  311. data/lib/omnizip/formats/cpio/entry.rb +389 -0
  312. data/lib/omnizip/formats/cpio/reader.rb +194 -0
  313. data/lib/omnizip/formats/cpio/writer.rb +232 -0
  314. data/lib/omnizip/formats/cpio.rb +132 -0
  315. data/lib/omnizip/formats/format_spec_loader.rb +228 -0
  316. data/lib/omnizip/formats/gzip.rb +236 -0
  317. data/lib/omnizip/formats/iso/directory_builder.rb +321 -0
  318. data/lib/omnizip/formats/iso/directory_record.rb +162 -0
  319. data/lib/omnizip/formats/iso/joliet.rb +204 -0
  320. data/lib/omnizip/formats/iso/path_table.rb +125 -0
  321. data/lib/omnizip/formats/iso/reader.rb +194 -0
  322. data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
  323. data/lib/omnizip/formats/iso/volume_builder.rb +319 -0
  324. data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
  325. data/lib/omnizip/formats/iso/writer.rb +543 -0
  326. data/lib/omnizip/formats/iso.rb +133 -0
  327. data/lib/omnizip/formats/lzip.rb +161 -0
  328. data/lib/omnizip/formats/lzma_alone.rb +149 -0
  329. data/lib/omnizip/formats/msi/cab_extractor.rb +181 -0
  330. data/lib/omnizip/formats/msi/constants.rb +157 -0
  331. data/lib/omnizip/formats/msi/directory_resolver.rb +188 -0
  332. data/lib/omnizip/formats/msi/entry.rb +134 -0
  333. data/lib/omnizip/formats/msi/reader.rb +301 -0
  334. data/lib/omnizip/formats/msi/string_pool.rb +246 -0
  335. data/lib/omnizip/formats/msi/table_parser.rb +244 -0
  336. data/lib/omnizip/formats/msi.rb +73 -0
  337. data/lib/omnizip/formats/ole/allocation_table.rb +263 -0
  338. data/lib/omnizip/formats/ole/constants.rb +61 -0
  339. data/lib/omnizip/formats/ole/dirent.rb +439 -0
  340. data/lib/omnizip/formats/ole/header.rb +199 -0
  341. data/lib/omnizip/formats/ole/ranges_io.rb +347 -0
  342. data/lib/omnizip/formats/ole/storage.rb +482 -0
  343. data/lib/omnizip/formats/ole/types/variant.rb +338 -0
  344. data/lib/omnizip/formats/ole.rb +143 -0
  345. data/lib/omnizip/formats/rar/archive_repairer.rb +240 -0
  346. data/lib/omnizip/formats/rar/archive_verifier.rb +192 -0
  347. data/lib/omnizip/formats/rar/block_parser.rb +282 -0
  348. data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
  349. data/lib/omnizip/formats/rar/compression/dispatcher.rb +210 -0
  350. data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +212 -0
  351. data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +154 -0
  352. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
  353. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
  354. data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
  355. data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
  356. data/lib/omnizip/formats/rar/compression/lz77_huffman.rb +25 -0
  357. data/lib/omnizip/formats/rar/compression/ppmd/context.rb +103 -0
  358. data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +238 -0
  359. data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +250 -0
  360. data/lib/omnizip/formats/rar/compression/ppmd.rb +16 -0
  361. data/lib/omnizip/formats/rar/compression.rb +17 -0
  362. data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
  363. data/lib/omnizip/formats/rar/constants.rb +88 -0
  364. data/lib/omnizip/formats/rar/decompressor.rb +316 -0
  365. data/lib/omnizip/formats/rar/external_writer.rb +311 -0
  366. data/lib/omnizip/formats/rar/header.rb +209 -0
  367. data/lib/omnizip/formats/rar/license_validator.rb +111 -0
  368. data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
  369. data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
  370. data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
  371. data/lib/omnizip/formats/rar/models.rb +14 -0
  372. data/lib/omnizip/formats/rar/parity_handler.rb +299 -0
  373. data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +200 -0
  374. data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +584 -0
  375. data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
  376. data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
  377. data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +96 -0
  378. data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
  379. data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +162 -0
  380. data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
  381. data/lib/omnizip/formats/rar/rar5/header.rb +208 -0
  382. data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
  383. data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
  384. data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
  385. data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
  386. data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
  387. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +260 -0
  388. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
  389. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +176 -0
  390. data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +108 -0
  391. data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +139 -0
  392. data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
  393. data/lib/omnizip/formats/rar/rar5/vint.rb +53 -0
  394. data/lib/omnizip/formats/rar/rar5/writer.rb +540 -0
  395. data/lib/omnizip/formats/rar/rar_format_base.rb +239 -0
  396. data/lib/omnizip/formats/rar/reader.rb +377 -0
  397. data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
  398. data/lib/omnizip/formats/rar/volume_manager.rb +166 -0
  399. data/lib/omnizip/formats/rar/writer.rb +437 -0
  400. data/lib/omnizip/formats/rar.rb +193 -0
  401. data/lib/omnizip/formats/rar3/compressor.rb +71 -0
  402. data/lib/omnizip/formats/rar3/decompressor.rb +64 -0
  403. data/lib/omnizip/formats/rar3/reader.rb +107 -0
  404. data/lib/omnizip/formats/rar3/writer.rb +220 -0
  405. data/lib/omnizip/formats/rar3.rb +15 -0
  406. data/lib/omnizip/formats/rar5/compressor.rb +71 -0
  407. data/lib/omnizip/formats/rar5/decompressor.rb +64 -0
  408. data/lib/omnizip/formats/rar5/reader.rb +130 -0
  409. data/lib/omnizip/formats/rar5/writer.rb +65 -0
  410. data/lib/omnizip/formats/rar5.rb +15 -0
  411. data/lib/omnizip/formats/rpm/constants.rb +58 -0
  412. data/lib/omnizip/formats/rpm/entry.rb +106 -0
  413. data/lib/omnizip/formats/rpm/header.rb +106 -0
  414. data/lib/omnizip/formats/rpm/lead.rb +132 -0
  415. data/lib/omnizip/formats/rpm/tag.rb +228 -0
  416. data/lib/omnizip/formats/rpm/writer.rb +652 -0
  417. data/lib/omnizip/formats/rpm.rb +458 -0
  418. data/lib/omnizip/formats/seven_zip/bcj2_stream_decompressor.rb +274 -0
  419. data/lib/omnizip/formats/seven_zip/coder_chain.rb +169 -0
  420. data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
  421. data/lib/omnizip/formats/seven_zip/encoded_header.rb +110 -0
  422. data/lib/omnizip/formats/seven_zip/encrypted_header.rb +139 -0
  423. data/lib/omnizip/formats/seven_zip/file_collector.rb +143 -0
  424. data/lib/omnizip/formats/seven_zip/header.rb +102 -0
  425. data/lib/omnizip/formats/seven_zip/header_encryptor.rb +132 -0
  426. data/lib/omnizip/formats/seven_zip/header_writer.rb +425 -0
  427. data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
  428. data/lib/omnizip/formats/seven_zip/models/file_entry.rb +65 -0
  429. data/lib/omnizip/formats/seven_zip/models/folder.rb +67 -0
  430. data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
  431. data/lib/omnizip/formats/seven_zip/models.rb +20 -0
  432. data/lib/omnizip/formats/seven_zip/parser.rb +671 -0
  433. data/lib/omnizip/formats/seven_zip/reader.rb +626 -0
  434. data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +611 -0
  435. data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +308 -0
  436. data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
  437. data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +166 -0
  438. data/lib/omnizip/formats/seven_zip/writer.rb +801 -0
  439. data/lib/omnizip/formats/seven_zip.rb +179 -0
  440. data/lib/omnizip/formats/tar/constants.rb +73 -0
  441. data/lib/omnizip/formats/tar/entry.rb +98 -0
  442. data/lib/omnizip/formats/tar/header.rb +206 -0
  443. data/lib/omnizip/formats/tar/reader.rb +119 -0
  444. data/lib/omnizip/formats/tar/writer.rb +212 -0
  445. data/lib/omnizip/formats/tar.rb +74 -0
  446. data/lib/omnizip/formats/xar/constants.rb +119 -0
  447. data/lib/omnizip/formats/xar/entry.rb +268 -0
  448. data/lib/omnizip/formats/xar/header.rb +223 -0
  449. data/lib/omnizip/formats/xar/reader.rb +400 -0
  450. data/lib/omnizip/formats/xar/toc.rb +570 -0
  451. data/lib/omnizip/formats/xar/writer.rb +461 -0
  452. data/lib/omnizip/formats/xar.rb +145 -0
  453. data/lib/omnizip/formats/xz/reader.rb +121 -0
  454. data/lib/omnizip/formats/xz/writer.rb +416 -0
  455. data/lib/omnizip/formats/xz.rb +210 -0
  456. data/lib/omnizip/formats/xz_const.rb +49 -0
  457. data/lib/omnizip/formats/xz_impl/block_decoder.rb +761 -0
  458. data/lib/omnizip/formats/xz_impl/block_encoder.rb +304 -0
  459. data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
  460. data/lib/omnizip/formats/xz_impl/block_header_parser.rb +182 -0
  461. data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
  462. data/lib/omnizip/formats/xz_impl/index_encoder.rb +120 -0
  463. data/lib/omnizip/formats/xz_impl/stream_decoder.rb +470 -0
  464. data/lib/omnizip/formats/xz_impl/stream_encoder.rb +95 -0
  465. data/lib/omnizip/formats/xz_impl/stream_footer.rb +79 -0
  466. data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +115 -0
  467. data/lib/omnizip/formats/xz_impl/stream_header.rb +53 -0
  468. data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +106 -0
  469. data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
  470. data/lib/omnizip/formats/xz_impl.rb +52 -0
  471. data/lib/omnizip/formats/zip/central_directory_header.rb +223 -0
  472. data/lib/omnizip/formats/zip/constants.rb +69 -0
  473. data/lib/omnizip/formats/zip/end_of_central_directory.rb +132 -0
  474. data/lib/omnizip/formats/zip/local_file_header.rb +136 -0
  475. data/lib/omnizip/formats/zip/reader.rb +376 -0
  476. data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
  477. data/lib/omnizip/formats/zip/writer.rb +489 -0
  478. data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +102 -0
  479. data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +64 -0
  480. data/lib/omnizip/formats/zip/zip64_extra_field.rb +112 -0
  481. data/lib/omnizip/formats/zip.rb +50 -0
  482. data/lib/omnizip/formats.rb +29 -0
  483. data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
  484. data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
  485. data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
  486. data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
  487. data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
  488. data/lib/omnizip/implementations/base.rb +19 -0
  489. data/lib/omnizip/implementations/rust/archive.rb +93 -0
  490. data/lib/omnizip/implementations/rust/library.rb +221 -0
  491. data/lib/omnizip/implementations/rust.rb +26 -0
  492. data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +428 -0
  493. data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +456 -0
  494. data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +285 -0
  495. data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +197 -0
  496. data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +194 -0
  497. data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +139 -0
  498. data/lib/omnizip/implementations/seven_zip/lzma.rb +21 -0
  499. data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +56 -0
  500. data/lib/omnizip/implementations/seven_zip/lzma2.rb +12 -0
  501. data/lib/omnizip/implementations/seven_zip.rb +11 -0
  502. data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +547 -0
  503. data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +748 -0
  504. data/lib/omnizip/implementations/xz_utils/lzma2.rb +13 -0
  505. data/lib/omnizip/implementations/xz_utils.rb +10 -0
  506. data/lib/omnizip/implementations.rb +25 -0
  507. data/lib/omnizip/io/buffered_input.rb +147 -0
  508. data/lib/omnizip/io/buffered_output.rb +106 -0
  509. data/lib/omnizip/io/source.rb +143 -0
  510. data/lib/omnizip/io/stream_manager.rb +117 -0
  511. data/lib/omnizip/io.rb +15 -0
  512. data/lib/omnizip/link_handler/hard_link.rb +79 -0
  513. data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
  514. data/lib/omnizip/link_handler.rb +129 -0
  515. data/lib/omnizip/metadata/archive_metadata.rb +114 -0
  516. data/lib/omnizip/metadata/entry_metadata.rb +153 -0
  517. data/lib/omnizip/metadata/metadata_editor.rb +169 -0
  518. data/lib/omnizip/metadata/metadata_registry.rb +71 -0
  519. data/lib/omnizip/metadata/metadata_validator.rb +101 -0
  520. data/lib/omnizip/metadata.rb +58 -0
  521. data/lib/omnizip/models/.keep +0 -0
  522. data/lib/omnizip/models/algorithm_metadata.rb +41 -0
  523. data/lib/omnizip/models/attribute_apply.rb +40 -0
  524. data/lib/omnizip/models/compression_options.rb +53 -0
  525. data/lib/omnizip/models/conversion_options.rb +79 -0
  526. data/lib/omnizip/models/conversion_result.rb +141 -0
  527. data/lib/omnizip/models/eta_result.rb +45 -0
  528. data/lib/omnizip/models/extraction_rule.rb +115 -0
  529. data/lib/omnizip/models/filter_chain.rb +142 -0
  530. data/lib/omnizip/models/filter_config.rb +148 -0
  531. data/lib/omnizip/models/match_result.rb +141 -0
  532. data/lib/omnizip/models/optimization_suggestion.rb +95 -0
  533. data/lib/omnizip/models/parallel_options.rb +116 -0
  534. data/lib/omnizip/models/performance_result.rb +85 -0
  535. data/lib/omnizip/models/profile_report.rb +116 -0
  536. data/lib/omnizip/models/progress_options.rb +39 -0
  537. data/lib/omnizip/models/split_options.rb +116 -0
  538. data/lib/omnizip/optimization_registry.rb +45 -0
  539. data/lib/omnizip/parallel/engine.rb +52 -0
  540. data/lib/omnizip/parallel/job_queue.rb +209 -0
  541. data/lib/omnizip/parallel/job_scheduler.rb +225 -0
  542. data/lib/omnizip/parallel/parallel_compressor.rb +326 -0
  543. data/lib/omnizip/parallel/parallel_extractor.rb +238 -0
  544. data/lib/omnizip/parallel/thread_pool.rb +60 -0
  545. data/lib/omnizip/parallel/worker_pool.rb +227 -0
  546. data/lib/omnizip/parallel.rb +156 -0
  547. data/lib/omnizip/parity/chunked_block_processor.rb +194 -0
  548. data/lib/omnizip/parity/galois16.rb +145 -0
  549. data/lib/omnizip/parity/models/creator_packet.rb +71 -0
  550. data/lib/omnizip/parity/models/file_description_packet.rb +131 -0
  551. data/lib/omnizip/parity/models/ifsc_packet.rb +111 -0
  552. data/lib/omnizip/parity/models/main_packet.rb +126 -0
  553. data/lib/omnizip/parity/models/packet.rb +156 -0
  554. data/lib/omnizip/parity/models/packet_registry.rb +102 -0
  555. data/lib/omnizip/parity/models/recovery_slice_packet.rb +76 -0
  556. data/lib/omnizip/parity/models.rb +27 -0
  557. data/lib/omnizip/parity/par2_creator.rb +496 -0
  558. data/lib/omnizip/parity/par2_repairer.rb +409 -0
  559. data/lib/omnizip/parity/par2_verifier.rb +373 -0
  560. data/lib/omnizip/parity/par2cmdline_algorithm.rb +108 -0
  561. data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
  562. data/lib/omnizip/parity/reed_solomon_decoder.rb +263 -0
  563. data/lib/omnizip/parity/reed_solomon_encoder.rb +108 -0
  564. data/lib/omnizip/parity/reed_solomon_matrix.rb +339 -0
  565. data/lib/omnizip/parity.rb +207 -0
  566. data/lib/omnizip/password/encryption_registry.rb +26 -0
  567. data/lib/omnizip/password/encryption_strategy.rb +96 -0
  568. data/lib/omnizip/password/password_validator.rb +129 -0
  569. data/lib/omnizip/password/winzip_aes_strategy.rb +190 -0
  570. data/lib/omnizip/password/zip_crypto_strategy.rb +135 -0
  571. data/lib/omnizip/password.rb +88 -0
  572. data/lib/omnizip/pipe/stream_compressor.rb +124 -0
  573. data/lib/omnizip/pipe/stream_decompressor.rb +173 -0
  574. data/lib/omnizip/pipe.rb +120 -0
  575. data/lib/omnizip/platform/ntfs_streams.rb +200 -0
  576. data/lib/omnizip/platform.rb +189 -0
  577. data/lib/omnizip/profile/archive_profile.rb +36 -0
  578. data/lib/omnizip/profile/balanced_profile.rb +31 -0
  579. data/lib/omnizip/profile/binary_profile.rb +33 -0
  580. data/lib/omnizip/profile/compression_profile.rb +157 -0
  581. data/lib/omnizip/profile/custom_profile.rb +155 -0
  582. data/lib/omnizip/profile/fast_profile.rb +31 -0
  583. data/lib/omnizip/profile/maximum_profile.rb +31 -0
  584. data/lib/omnizip/profile/profile_detector.rb +108 -0
  585. data/lib/omnizip/profile/profile_registry.rb +160 -0
  586. data/lib/omnizip/profile/text_profile.rb +33 -0
  587. data/lib/omnizip/profile.rb +261 -0
  588. data/lib/omnizip/profiler/memory_profiler.rb +66 -0
  589. data/lib/omnizip/profiler/method_profiler.rb +49 -0
  590. data/lib/omnizip/profiler/report_generator.rb +158 -0
  591. data/lib/omnizip/profiler.rb +192 -0
  592. data/lib/omnizip/progress/callback_reporter.rb +34 -0
  593. data/lib/omnizip/progress/console_reporter.rb +59 -0
  594. data/lib/omnizip/progress/log_reporter.rb +89 -0
  595. data/lib/omnizip/progress/operation_progress.rb +118 -0
  596. data/lib/omnizip/progress/progress_bar.rb +156 -0
  597. data/lib/omnizip/progress/progress_reporter.rb +40 -0
  598. data/lib/omnizip/progress/progress_tracker.rb +215 -0
  599. data/lib/omnizip/progress/silent_reporter.rb +22 -0
  600. data/lib/omnizip/progress.rb +131 -0
  601. data/lib/omnizip/registry.rb +111 -0
  602. data/lib/omnizip/rubyzip_compat.rb +61 -0
  603. data/lib/omnizip/temp/safe_extract.rb +124 -0
  604. data/lib/omnizip/temp/temp_file.rb +123 -0
  605. data/lib/omnizip/temp/temp_file_pool.rb +109 -0
  606. data/lib/omnizip/temp.rb +184 -0
  607. data/lib/omnizip/version.rb +5 -0
  608. data/lib/omnizip/zip/entry.rb +160 -0
  609. data/lib/omnizip/zip/file.rb +485 -0
  610. data/lib/omnizip/zip/input_stream.rb +270 -0
  611. data/lib/omnizip/zip/output_stream.rb +320 -0
  612. data/lib/omnizip/zip.rb +23 -0
  613. data/lib/omnizip.rb +157 -0
  614. data/lib/tasks/msi_test_files.rake +66 -0
  615. data/lib/tasks/platform_gems.rake +147 -0
  616. data/lib/tasks/rust_backend.rake +48 -0
  617. data/readme-docs/advanced-features.adoc +514 -0
  618. data/readme-docs/api-usage.adoc +445 -0
  619. data/readme-docs/architecture.adoc +450 -0
  620. data/readme-docs/archive-formats.adoc +479 -0
  621. data/readme-docs/cli-usage.adoc +222 -0
  622. data/readme-docs/compression-algorithms.adoc +446 -0
  623. data/readme-docs/compression-profiles.adoc +247 -0
  624. data/readme-docs/encryption-checksums.adoc +328 -0
  625. data/readme-docs/format-converter.adoc +316 -0
  626. data/readme-docs/installation.adoc +228 -0
  627. data/readme-docs/par2-archives.adoc +608 -0
  628. data/readme-docs/performance-profiler.adoc +389 -0
  629. data/readme-docs/preprocessing-filters.adoc +280 -0
  630. data/vendor/libomnizip_ffi.so +0 -0
  631. data/xz-file-format-1.2.1.txt +1174 -0
  632. metadata +768 -0
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zlib"
4
+
5
+ module Omnizip
6
+ module Formats
7
+ module Rar3
8
+ # RAR v3 decompressor
9
+ #
10
+ # Decompresses data using RAR v3 decompression algorithms.
11
+ # This implementation uses DEFLATE as a compatible fallback
12
+ # for demonstration purposes. Full RAR decompression requires
13
+ # proprietary algorithms.
14
+ #
15
+ # @example Decompressing data
16
+ # decompressor = Rar3::Decompressor.new
17
+ # original = decompressor.decompress(compressed, method: :normal)
18
+ class Decompressor < Rar::RarFormatBase
19
+ # Initialize a RAR v3 decompressor
20
+ def initialize
21
+ super("rar3")
22
+ end
23
+
24
+ # Decompress data using RAR v3 methods
25
+ #
26
+ # @param data [String] The compressed data
27
+ # @param method [Symbol] The compression method
28
+ # @param options [Hash] Decompression options
29
+ # @return [String] The decompressed data
30
+ def decompress(data, method: :normal, **_options)
31
+ case method
32
+ when :store
33
+ decompress_store(data)
34
+ when :fastest, :fast, :normal, :good, :best
35
+ decompress_deflate(data)
36
+ else
37
+ raise FormatError,
38
+ "Unsupported decompression method: #{method}"
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ # Return stored data without decompression
45
+ #
46
+ # @param data [String] The stored data
47
+ # @return [String] The uncompressed data
48
+ def decompress_store(data)
49
+ data
50
+ end
51
+
52
+ # Decompress using DEFLATE (compatible fallback)
53
+ #
54
+ # @param data [String] The compressed data
55
+ # @return [String] The decompressed data
56
+ def decompress_deflate(data)
57
+ Zlib::Inflate.inflate(data)
58
+ rescue Zlib::Error => e
59
+ raise FormatError, "Decompression failed: #{e.message}"
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "stringio"
4
+ require "tmpdir"
5
+
6
+ module Omnizip
7
+ module Formats
8
+ module Rar3
9
+ # RAR v3 (RAR4-family) archive reader
10
+ #
11
+ # Adapter over the primary `Formats::Rar::Reader` — the one
12
+ # parser verified against real WinRAR archives — exposing the
13
+ # legacy entry shape (uncompressed_size, modified_time, ...).
14
+ #
15
+ # @example Reading a RAR3 archive
16
+ # reader = Rar3::Reader.new
17
+ # File.open("archive.rar", "rb") do |file|
18
+ # reader.read_archive(file).each { |entry| puts entry.name }
19
+ # end
20
+ class Reader < Omnizip::Formats::Rar::RarFormatBase
21
+ # RAR4 method byte to the legacy symbol vocabulary
22
+ METHOD_SYMBOLS = {
23
+ 0x30 => :store,
24
+ 0x31 => :fastest,
25
+ 0x32 => :fast,
26
+ 0x33 => :normal,
27
+ 0x34 => :good,
28
+ 0x35 => :best,
29
+ }.freeze
30
+
31
+ # Initialize a RAR v3 reader
32
+ def initialize
33
+ super("rar3")
34
+ end
35
+
36
+ # Read a RAR v3 archive
37
+ #
38
+ # @param io [IO] The input stream
39
+ # @return [Array<Entry>] The archive entries
40
+ # @raise [FormatError] If the archive signature is invalid
41
+ def read_archive(io)
42
+ data = io.read
43
+ unless verify_magic_bytes(StringIO.new(data))
44
+ raise FormatError, "Invalid RAR v3 signature"
45
+ end
46
+
47
+ Dir.mktmpdir("omnizip_rar3_read") do |tmp|
48
+ archive_path = File.join(tmp, "archive.rar")
49
+ File.binwrite(archive_path, data)
50
+
51
+ primary = Rar::Reader.new(archive_path)
52
+ primary.open
53
+ primary.list_files.map { |entry| adapt_entry(entry) }
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ # Map a primary RarEntry onto the legacy Entry shape
60
+ def adapt_entry(entry)
61
+ Entry.new(
62
+ name: entry.name,
63
+ compressed_size: entry.compressed_size,
64
+ uncompressed_size: entry.size,
65
+ crc32: entry.crc,
66
+ compression_method: METHOD_SYMBOLS[entry.method],
67
+ modified_time: entry.mtime,
68
+ attributes: entry.attributes,
69
+ encrypted: entry.encrypted,
70
+ host_os: entry.host_os,
71
+ )
72
+ end
73
+
74
+ # RAR archive entry model (legacy shape)
75
+ class Entry
76
+ include Omnizip::Entry
77
+
78
+ attr_accessor :name, :compressed_size, :uncompressed_size, :crc32,
79
+ :compression_method, :modified_time, :attributes,
80
+ :encrypted, :data_offset, :host_os, :salt
81
+
82
+ def entry_name = name
83
+ def entry_directory? = false
84
+ def entry_size = uncompressed_size
85
+ def entry_mtime = modified_time
86
+
87
+ def initialize(name: nil, compressed_size: nil, uncompressed_size: nil,
88
+ crc32: nil, compression_method: nil, modified_time: nil,
89
+ attributes: nil, encrypted: nil, data_offset: nil,
90
+ host_os: nil, salt: nil)
91
+ @name = name
92
+ @compressed_size = compressed_size
93
+ @uncompressed_size = uncompressed_size
94
+ @crc32 = crc32
95
+ @compression_method = compression_method
96
+ @modified_time = modified_time
97
+ @attributes = attributes
98
+ @encrypted = encrypted
99
+ @data_offset = data_offset
100
+ @host_os = host_os
101
+ @salt = salt
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,220 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require "lutaml/model"
5
+ rescue LoadError, ArgumentError
6
+ # lutaml-model not available, using simple classes
7
+ end
8
+
9
+ require "stringio"
10
+
11
+ module Omnizip
12
+ module Formats
13
+ module Rar3
14
+ # RAR v3 archive writer
15
+ #
16
+ # Writes RAR 3.x format archives, creating headers and compressing file
17
+ # data according to the RAR v3 specification.
18
+ #
19
+ # @example Writing a RAR3 archive
20
+ # writer = Rar3::Writer.new
21
+ # File.open("archive.rar", "wb") do |file|
22
+ # entries = [
23
+ # {name: "file.txt", data: "content", time: Time.now}
24
+ # ]
25
+ # writer.write_archive(file, entries)
26
+ # end
27
+ class Writer < Omnizip::Formats::Rar::RarFormatBase
28
+ # Initialize a RAR v3 writer
29
+ def initialize
30
+ super("rar3")
31
+ @compressor = Compressor.new
32
+ end
33
+
34
+ # Write a RAR v3 archive
35
+ #
36
+ # @param io [IO] The output stream
37
+ # @param entries [Array<Hash>] The entries to write
38
+ # @return [void]
39
+ def write_archive(io, entries)
40
+ # Write marker block
41
+ write_marker_block(io)
42
+
43
+ # Write archive header
44
+ write_archive_header(io)
45
+
46
+ # Write file entries
47
+ entries.each do |entry|
48
+ write_file_entry(io, entry)
49
+ end
50
+
51
+ # Write terminator block
52
+ write_terminator_block(io)
53
+ end
54
+
55
+ private
56
+
57
+ # Write marker block (RAR signature)
58
+ #
59
+ # @param io [IO] The output stream
60
+ # @return [void]
61
+ def write_marker_block(io)
62
+ io.write(spec.magic_bytes.pack("C*"))
63
+ end
64
+
65
+ # Write archive header block
66
+ #
67
+ # @param io [IO] The output stream
68
+ # @return [void]
69
+ def write_archive_header(io)
70
+ flags = 0
71
+ # Set default flags if needed
72
+
73
+ header_data = StringIO.new
74
+ # Reserved fields: HighPosAV (2) + PosAV (4) = 6 bytes,
75
+ # making the main header 13 bytes total like WinRAR's
76
+ header_data.write([0].pack("v") + [0].pack("V"))
77
+
78
+ header = create_block_header(
79
+ type: block_type_code(:archive),
80
+ flags: flags,
81
+ data: header_data.string,
82
+ )
83
+
84
+ write_block_header(io, header)
85
+ io.write(header_data.string)
86
+ end
87
+
88
+ # Write a file entry
89
+ #
90
+ # @param io [IO] The output stream
91
+ # @param entry [Hash] The entry data
92
+ # @return [void]
93
+ def write_file_entry(io, entry)
94
+ name = entry[:name] || entry["name"]
95
+ data = entry[:data] || entry["data"]
96
+ mtime = entry[:time] || entry["time"] || Time.now
97
+ method = entry[:method] || entry["method"] || :normal
98
+
99
+ # Compress data
100
+ compressed_data = @compressor.compress(data, method: method)
101
+
102
+ # Calculate sizes and CRC
103
+ packed_size = compressed_data.bytesize
104
+ unpacked_size = data.bytesize
105
+ file_crc = calculate_crc32(data)
106
+
107
+ # Encode filename
108
+ name_bytes = name.encode("UTF-8")
109
+ name_size = name_bytes.bytesize
110
+
111
+ # Set flags: LONG_BLOCK marks the PACK_SIZE data area; names
112
+ # are written as plain bytes without the Unicode flag (the
113
+ # 0x0200 encoding appends a second encoded name we do not
114
+ # write)
115
+ flags = spec.format.file_flags[:long_block]
116
+ if unpacked_size > 0xFFFFFFFF
117
+ flags |= spec.format.file_flags[:large_file]
118
+ end
119
+
120
+ # Build file header data. High size words precede the name
121
+ # per the RAR4 layout.
122
+ header_data = StringIO.new
123
+ header_data.write([packed_size & 0xFFFFFFFF].pack("V"))
124
+ header_data.write([unpacked_size & 0xFFFFFFFF].pack("V"))
125
+ header_data.write([spec.format.host_os[:win32]].pack("C"))
126
+ header_data.write([file_crc].pack("V"))
127
+ header_data.write([encode_dos_time(mtime)].pack("V"))
128
+ header_data.write([0x14].pack("C")) # Version needed
129
+ header_data.write([compression_method_code(method)].pack("C"))
130
+ header_data.write([name_size].pack("v"))
131
+ header_data.write([0x20].pack("V")) # File attributes
132
+ if flags & spec.format.file_flags[:large_file] != 0
133
+ header_data.write([(packed_size >> 32) & 0xFFFFFFFF].pack("V"))
134
+ header_data.write([(unpacked_size >> 32) & 0xFFFFFFFF].pack("V"))
135
+ end
136
+ header_data.write(name_bytes)
137
+
138
+ # Create and write block header
139
+ header = create_block_header(
140
+ type: block_type_code(:file),
141
+ flags: flags,
142
+ data: header_data.string,
143
+ )
144
+
145
+ write_block_header(io, header)
146
+ io.write(header_data.string)
147
+ io.write(compressed_data)
148
+ end
149
+
150
+ # Write terminator block
151
+ #
152
+ # @param io [IO] The output stream
153
+ # @return [void]
154
+ def write_terminator_block(io)
155
+ header = create_block_header(
156
+ type: block_type_code(:terminator),
157
+ flags: 0,
158
+ data: "",
159
+ )
160
+
161
+ write_block_header(io, header)
162
+ end
163
+
164
+ # Create a block header
165
+ #
166
+ # @param type [Integer] The block type
167
+ # @param flags [Integer] The block flags
168
+ # @param data [String] The block data
169
+ # @return [Hash] The block header
170
+ def create_block_header(type:, flags:, data:)
171
+ size = 7 + data.bytesize # Header size + data size
172
+
173
+ # Calculate header CRC
174
+ temp = StringIO.new
175
+ temp.write([type].pack("C"))
176
+ temp.write([flags].pack("v"))
177
+ temp.write([size].pack("v"))
178
+ temp.write(data) unless data.empty?
179
+
180
+ header_crc = calculate_crc32(temp.string) & 0xFFFF
181
+
182
+ {
183
+ crc: header_crc,
184
+ type: type,
185
+ flags: flags,
186
+ size: size,
187
+ }
188
+ end
189
+
190
+ # Write a block header to stream
191
+ #
192
+ # @param io [IO] The output stream
193
+ # @param header [Hash] The header data
194
+ # @return [void]
195
+ def write_block_header(io, header)
196
+ io.write([header[:crc]].pack("v"))
197
+ io.write([header[:type]].pack("C"))
198
+ io.write([header[:flags]].pack("v"))
199
+ io.write([header[:size]].pack("v"))
200
+ end
201
+
202
+ # Encode Ruby Time to DOS date/time format
203
+ #
204
+ # @param time [Time] The time to encode
205
+ # @return [Integer] The DOS timestamp
206
+ def encode_dos_time(time)
207
+ second = time.sec / 2
208
+ minute = time.min
209
+ hour = time.hour
210
+ day = time.day
211
+ month = time.month
212
+ year = time.year - 1980
213
+
214
+ (year << 25) | (month << 21) | (day << 16) |
215
+ (hour << 11) | (minute << 5) | second
216
+ end
217
+ end
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Omnizip
4
+ module Formats
5
+ # Standalone RAR3 reader/writer tree (see Formats::Rar for the
6
+ # primary RAR support). Classes under this namespace load lazily;
7
+ # require "omnizip" first so sibling namespaces resolve.
8
+ module Rar3
9
+ autoload :Compressor, "omnizip/formats/rar3/compressor"
10
+ autoload :Decompressor, "omnizip/formats/rar3/decompressor"
11
+ autoload :Reader, "omnizip/formats/rar3/reader"
12
+ autoload :Writer, "omnizip/formats/rar3/writer"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zlib"
4
+
5
+ module Omnizip
6
+ module Formats
7
+ module Rar5
8
+ # RAR v5 compressor
9
+ #
10
+ # Compresses data using RAR v5 compression algorithms.
11
+ # This implementation uses DEFLATE as a compatible fallback
12
+ # for demonstration purposes. Full RAR5 compression requires
13
+ # proprietary algorithms.
14
+ #
15
+ # @example Compressing data
16
+ # compressor = Rar5::Compressor.new
17
+ # compressed = compressor.compress("Hello, World!", method: :normal)
18
+ class Compressor < Rar::RarFormatBase
19
+ # Initialize a RAR v5 compressor
20
+ def initialize
21
+ super("rar5")
22
+ end
23
+
24
+ # Compress data using RAR v5 methods
25
+ #
26
+ # @param data [String] The data to compress
27
+ # @param method [Symbol] The compression method
28
+ # @param options [Hash] Compression options
29
+ # @return [String] The compressed data
30
+ def compress(data, method: :normal, **_options)
31
+ case method
32
+ when :store
33
+ compress_store(data)
34
+ when :fastest
35
+ compress_deflate(data, level: Zlib::BEST_SPEED)
36
+ when :fast
37
+ compress_deflate(data, level: 3)
38
+ when :normal
39
+ compress_deflate(data, level: Zlib::DEFAULT_COMPRESSION)
40
+ when :good
41
+ compress_deflate(data, level: 7)
42
+ when :best
43
+ compress_deflate(data, level: Zlib::BEST_COMPRESSION)
44
+ else
45
+ raise FormatError,
46
+ "Unsupported compression method: #{method}"
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ # Store data without compression
53
+ #
54
+ # @param data [String] The data to store
55
+ # @return [String] The uncompressed data
56
+ def compress_store(data)
57
+ data
58
+ end
59
+
60
+ # Compress using DEFLATE (compatible fallback)
61
+ #
62
+ # @param data [String] The data to compress
63
+ # @param level [Integer] The compression level
64
+ # @return [String] The compressed data
65
+ def compress_deflate(data, level:)
66
+ Zlib::Deflate.deflate(data, level)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zlib"
4
+
5
+ module Omnizip
6
+ module Formats
7
+ module Rar5
8
+ # RAR v5 decompressor
9
+ #
10
+ # Decompresses data using RAR v5 decompression algorithms.
11
+ # This implementation uses DEFLATE as a compatible fallback
12
+ # for demonstration purposes. Full RAR5 decompression requires
13
+ # proprietary algorithms.
14
+ #
15
+ # @example Decompressing data
16
+ # decompressor = Rar5::Decompressor.new
17
+ # original = decompressor.decompress(compressed, method: :normal)
18
+ class Decompressor < Rar::RarFormatBase
19
+ # Initialize a RAR v5 decompressor
20
+ def initialize
21
+ super("rar5")
22
+ end
23
+
24
+ # Decompress data using RAR v5 methods
25
+ #
26
+ # @param data [String] The compressed data
27
+ # @param method [Symbol] The compression method
28
+ # @param options [Hash] Decompression options
29
+ # @return [String] The decompressed data
30
+ def decompress(data, method: :normal, **_options)
31
+ case method
32
+ when :store
33
+ decompress_store(data)
34
+ when :fastest, :fast, :normal, :good, :best
35
+ decompress_deflate(data)
36
+ else
37
+ raise FormatError,
38
+ "Unsupported decompression method: #{method}"
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ # Return stored data without decompression
45
+ #
46
+ # @param data [String] The stored data
47
+ # @return [String] The uncompressed data
48
+ def decompress_store(data)
49
+ data
50
+ end
51
+
52
+ # Decompress using DEFLATE (compatible fallback)
53
+ #
54
+ # @param data [String] The compressed data
55
+ # @return [String] The decompressed data
56
+ def decompress_deflate(data)
57
+ Zlib::Inflate.inflate(data)
58
+ rescue Zlib::Error => e
59
+ raise FormatError, "Decompression failed: #{e.message}"
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "stringio"
4
+ require "tmpdir"
5
+
6
+ module Omnizip
7
+ module Formats
8
+ module Rar5
9
+ # RAR v5 archive reader
10
+ #
11
+ # Adapter over the primary `Formats::Rar::Reader` — the one RAR5
12
+ # parser verified against real archives and unrar — exposing the
13
+ # legacy entry shape (uncompressed_size, modified_time, ...).
14
+ #
15
+ # RAR 5 uses variable-length integers (vint) and improved header structure.
16
+ #
17
+ # @example Reading a RAR5 archive
18
+ # reader = Rar5::Reader.new
19
+ # File.open("archive.rar", "rb") do |file|
20
+ # entries = reader.read_archive(file)
21
+ # entries.each { |entry| puts entry.name }
22
+ # end
23
+ class Reader < Omnizip::Formats::Rar::RarFormatBase
24
+ # RAR5 compression-method byte (cinfo bits 8-10) to the legacy
25
+ # symbol vocabulary
26
+ METHOD_SYMBOLS = {
27
+ 0x30 => :store,
28
+ 0x31 => :fastest,
29
+ 0x32 => :fast,
30
+ 0x33 => :normal,
31
+ 0x34 => :good,
32
+ 0x35 => :best,
33
+ }.freeze
34
+
35
+ # Initialize a RAR v5 reader
36
+ def initialize
37
+ super("rar5")
38
+ end
39
+
40
+ # Read a RAR v5 archive
41
+ #
42
+ # @param io [IO] The input stream
43
+ # @return [Array<Entry>] The archive entries
44
+ # @raise [FormatError] If the archive signature is invalid
45
+ def read_archive(io)
46
+ data = io.read
47
+ unless verify_magic_bytes(StringIO.new(data))
48
+ raise FormatError, "Invalid RAR v5 signature"
49
+ end
50
+
51
+ Dir.mktmpdir("omnizip_rar5_read") do |tmp|
52
+ archive_path = File.join(tmp, "archive.rar")
53
+ File.binwrite(archive_path, data)
54
+
55
+ primary = Rar::Reader.new(archive_path)
56
+ primary.open
57
+ primary.list_files.map { |entry| adapt_entry(entry) }
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ # Map a primary RarEntry onto the legacy Entry shape
64
+ def adapt_entry(entry)
65
+ Entry.new(
66
+ name: entry.name,
67
+ compressed_size: entry.compressed_size,
68
+ uncompressed_size: entry.size,
69
+ crc32: entry.crc,
70
+ compression_method: METHOD_SYMBOLS[entry.method],
71
+ modified_time: entry.mtime,
72
+ attributes: entry.attributes,
73
+ encrypted: entry.encrypted,
74
+ host_os: entry.host_os,
75
+ is_directory: entry.is_dir,
76
+ )
77
+ end
78
+
79
+ class HeaderBlock
80
+ attr_accessor :crc, :size, :vint_length, :type, :flags, :extra_size,
81
+ :data_size, :header_start, :content_start
82
+
83
+ def initialize(crc: nil, size: nil, vint_length: 1, type: nil, flags: nil,
84
+ extra_size: nil, data_size: nil, header_start: nil, content_start: nil)
85
+ @crc = crc
86
+ @size = size
87
+ @vint_length = vint_length
88
+ @type = type
89
+ @flags = flags
90
+ @extra_size = extra_size
91
+ @data_size = data_size
92
+ @header_start = header_start
93
+ @content_start = content_start
94
+ end
95
+ end
96
+
97
+ # RAR v5 archive entry model
98
+ class Entry
99
+ include Omnizip::Entry
100
+
101
+ attr_accessor :name, :compressed_size, :uncompressed_size, :crc32,
102
+ :compression_method, :modified_time, :attributes,
103
+ :encrypted, :data_offset, :host_os, :is_directory
104
+
105
+ def entry_name = name
106
+ def entry_directory? = is_directory
107
+ def entry_size = uncompressed_size
108
+ def entry_mtime = modified_time
109
+
110
+ def initialize(name: nil, compressed_size: nil, uncompressed_size: nil,
111
+ crc32: nil, compression_method: nil, modified_time: nil,
112
+ attributes: nil, encrypted: nil, data_offset: nil,
113
+ host_os: nil, is_directory: nil)
114
+ @name = name
115
+ @compressed_size = compressed_size
116
+ @uncompressed_size = uncompressed_size
117
+ @crc32 = crc32
118
+ @compression_method = compression_method
119
+ @modified_time = modified_time
120
+ @attributes = attributes
121
+ @encrypted = encrypted
122
+ @data_offset = data_offset
123
+ @host_os = host_os
124
+ @is_directory = is_directory
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end