omnizip 0.3.1

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 (511) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +32 -0
  4. data/.rubocop_todo.yml +754 -0
  5. data/COPYING +502 -0
  6. data/Gemfile +17 -0
  7. data/LICENSE +12 -0
  8. data/README.adoc +1045 -0
  9. data/Rakefile +12 -0
  10. data/benchmark/README.md +260 -0
  11. data/benchmark/benchmark_suite.rb +125 -0
  12. data/benchmark/compression_bench.rb +181 -0
  13. data/benchmark/filter_bench.rb +180 -0
  14. data/benchmark/models/benchmark_result.rb +59 -0
  15. data/benchmark/models/comparison_result.rb +69 -0
  16. data/benchmark/profile_suite.rb +167 -0
  17. data/benchmark/reporter.rb +150 -0
  18. data/benchmark/run_benchmarks.rb +66 -0
  19. data/benchmark/test_data.rb +137 -0
  20. data/config/formats/rar3_spec.yml +91 -0
  21. data/config/formats/rar5_spec.yml +102 -0
  22. data/docs/.github/workflows/docs.yml +142 -0
  23. data/docs/.gitignore +21 -0
  24. data/docs/.lychee.toml +67 -0
  25. data/docs/Gemfile +13 -0
  26. data/docs/RAR_WRITE_SUPPORT.md +26 -0
  27. data/docs/README.md +101 -0
  28. data/docs/_config.yml +112 -0
  29. data/docs/assets/logo.svg +1 -0
  30. data/docs/assets/omnizip-logo.pdf +1540 -11
  31. data/docs/comparison/feature-matrix.adoc +694 -0
  32. data/docs/comparison/index.adoc +113 -0
  33. data/docs/comparison/vs-7zip.adoc +309 -0
  34. data/docs/comparison/vs-peazip.adoc +77 -0
  35. data/docs/comparison/vs-rubyzip.adoc +342 -0
  36. data/docs/comparison/vs-winrar.adoc +100 -0
  37. data/docs/compatibility.adoc +579 -0
  38. data/docs/concepts/index.adoc +129 -0
  39. data/docs/developer/architecture.adoc +256 -0
  40. data/docs/developer/contributing.adoc +158 -0
  41. data/docs/developer/index.adoc +25 -0
  42. data/docs/developer/testing.adoc +212 -0
  43. data/docs/getting-started/basic-usage.adoc +271 -0
  44. data/docs/getting-started/index.adoc +42 -0
  45. data/docs/getting-started/installation.adoc +138 -0
  46. data/docs/getting-started/quick-start.adoc +185 -0
  47. data/docs/getting-started/your-first-archive.adoc +218 -0
  48. data/docs/guides/advanced-features/encryption.adoc +300 -0
  49. data/docs/guides/advanced-features/index.adoc +49 -0
  50. data/docs/guides/advanced-features/parallel-processing.adoc +246 -0
  51. data/docs/guides/advanced-features/progress-tracking.adoc +320 -0
  52. data/docs/guides/advanced-features/streaming.adoc +212 -0
  53. data/docs/guides/archive-formats/gzip-format.adoc +107 -0
  54. data/docs/guides/archive-formats/index.adoc +130 -0
  55. data/docs/guides/archive-formats/rar-format.adoc +104 -0
  56. data/docs/guides/archive-formats/rar5.adoc +521 -0
  57. data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
  58. data/docs/guides/archive-formats/tar-format.adoc +106 -0
  59. data/docs/guides/archive-formats/xz-format.adoc +118 -0
  60. data/docs/guides/archive-formats/zip-format.adoc +35 -0
  61. data/docs/guides/compression-algorithms/bzip2.adoc +113 -0
  62. data/docs/guides/compression-algorithms/deflate.adoc +319 -0
  63. data/docs/guides/compression-algorithms/index.adoc +190 -0
  64. data/docs/guides/compression-algorithms/lzma.adoc +398 -0
  65. data/docs/guides/compression-algorithms/lzma2.adoc +327 -0
  66. data/docs/guides/compression-algorithms/ppmd.adoc +316 -0
  67. data/docs/guides/compression-algorithms/zstandard.adoc +361 -0
  68. data/docs/guides/creating-archives.adoc +354 -0
  69. data/docs/guides/extracting-archives.adoc +53 -0
  70. data/docs/guides/format-conversion.adoc +64 -0
  71. data/docs/guides/index.adoc +49 -0
  72. data/docs/guides/migration-rubyzip.adoc +217 -0
  73. data/docs/guides/parity-archives.adoc +605 -0
  74. data/docs/guides/performance-tuning.adoc +88 -0
  75. data/docs/index.adoc +218 -0
  76. data/docs/lychee.toml +67 -0
  77. data/docs/reference/api/overview.adoc +188 -0
  78. data/docs/reference/cli/compress-command.adoc +114 -0
  79. data/docs/reference/cli/overview.adoc +140 -0
  80. data/docs/reference/index.adoc +26 -0
  81. data/docs/resources/faq.adoc +185 -0
  82. data/docs/resources/quick-reference.adoc +222 -0
  83. data/docs/troubleshooting/index.adoc +208 -0
  84. data/examples/api_comparison.rb +205 -0
  85. data/examples/deflate64_example.rb +96 -0
  86. data/examples/par2_demo.rb +121 -0
  87. data/examples/quick_start_native.rb +150 -0
  88. data/examples/quick_start_rubyzip.rb +115 -0
  89. data/examples/rubyzip_compatibility_demo.rb +194 -0
  90. data/exe/omnizip +27 -0
  91. data/lib/omnizip/algorithm.rb +130 -0
  92. data/lib/omnizip/algorithm_registry.rb +86 -0
  93. data/lib/omnizip/algorithms/.keep +0 -0
  94. data/lib/omnizip/algorithms/bzip2/bwt.rb +225 -0
  95. data/lib/omnizip/algorithms/bzip2/decoder.rb +193 -0
  96. data/lib/omnizip/algorithms/bzip2/encoder.rb +237 -0
  97. data/lib/omnizip/algorithms/bzip2/huffman.rb +206 -0
  98. data/lib/omnizip/algorithms/bzip2/mtf.rb +101 -0
  99. data/lib/omnizip/algorithms/bzip2/rle.rb +151 -0
  100. data/lib/omnizip/algorithms/bzip2.rb +130 -0
  101. data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
  102. data/lib/omnizip/algorithms/deflate/decoder.rb +38 -0
  103. data/lib/omnizip/algorithms/deflate/encoder.rb +46 -0
  104. data/lib/omnizip/algorithms/deflate.rb +128 -0
  105. data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
  106. data/lib/omnizip/algorithms/deflate64/decoder.rb +153 -0
  107. data/lib/omnizip/algorithms/deflate64/encoder.rb +98 -0
  108. data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +354 -0
  109. data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +142 -0
  110. data/lib/omnizip/algorithms/deflate64.rb +109 -0
  111. data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
  112. data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
  113. data/lib/omnizip/algorithms/lzma/decoder.rb +148 -0
  114. data/lib/omnizip/algorithms/lzma/dictionary.rb +69 -0
  115. data/lib/omnizip/algorithms/lzma/distance_coder.rb +415 -0
  116. data/lib/omnizip/algorithms/lzma/encoder.rb +142 -0
  117. data/lib/omnizip/algorithms/lzma/length_coder.rb +260 -0
  118. data/lib/omnizip/algorithms/lzma/literal_decoder.rb +320 -0
  119. data/lib/omnizip/algorithms/lzma/literal_encoder.rb +210 -0
  120. data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +341 -0
  121. data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +192 -0
  122. data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
  123. data/lib/omnizip/algorithms/lzma/match.rb +32 -0
  124. data/lib/omnizip/algorithms/lzma/match_finder.rb +205 -0
  125. data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
  126. data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +88 -0
  127. data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +130 -0
  128. data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
  129. data/lib/omnizip/algorithms/lzma/range_coder.rb +85 -0
  130. data/lib/omnizip/algorithms/lzma/range_decoder.rb +434 -0
  131. data/lib/omnizip/algorithms/lzma/range_encoder.rb +194 -0
  132. data/lib/omnizip/algorithms/lzma/state.rb +127 -0
  133. data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +325 -0
  134. data/lib/omnizip/algorithms/lzma/xz_encoder.rb +426 -0
  135. data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +645 -0
  136. data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +227 -0
  137. data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +169 -0
  138. data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +261 -0
  139. data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
  140. data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +331 -0
  141. data/lib/omnizip/algorithms/lzma/xz_state.rb +116 -0
  142. data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +2055 -0
  143. data/lib/omnizip/algorithms/lzma.rb +238 -0
  144. data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +182 -0
  145. data/lib/omnizip/algorithms/lzma2/constants.rb +41 -0
  146. data/lib/omnizip/algorithms/lzma2/encoder.rb +147 -0
  147. data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +161 -0
  148. data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
  149. data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +127 -0
  150. data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
  151. data/lib/omnizip/algorithms/lzma2.rb +141 -0
  152. data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
  153. data/lib/omnizip/algorithms/ppmd7/context.rb +154 -0
  154. data/lib/omnizip/algorithms/ppmd7/decoder.rb +126 -0
  155. data/lib/omnizip/algorithms/ppmd7/encoder.rb +163 -0
  156. data/lib/omnizip/algorithms/ppmd7/model.rb +248 -0
  157. data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
  158. data/lib/omnizip/algorithms/ppmd7.rb +116 -0
  159. data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
  160. data/lib/omnizip/algorithms/ppmd8/context.rb +34 -0
  161. data/lib/omnizip/algorithms/ppmd8/decoder.rb +107 -0
  162. data/lib/omnizip/algorithms/ppmd8/encoder.rb +138 -0
  163. data/lib/omnizip/algorithms/ppmd8/model.rb +250 -0
  164. data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
  165. data/lib/omnizip/algorithms/ppmd8.rb +82 -0
  166. data/lib/omnizip/algorithms/ppmd_base.rb +138 -0
  167. data/lib/omnizip/algorithms/sevenzip_lzma2.rb +123 -0
  168. data/lib/omnizip/algorithms/xz_lzma2.rb +118 -0
  169. data/lib/omnizip/algorithms/zstandard/constants.rb +25 -0
  170. data/lib/omnizip/algorithms/zstandard/decoder.rb +46 -0
  171. data/lib/omnizip/algorithms/zstandard/encoder.rb +51 -0
  172. data/lib/omnizip/algorithms/zstandard.rb +138 -0
  173. data/lib/omnizip/buffer/memory_archive.rb +251 -0
  174. data/lib/omnizip/buffer/memory_extractor.rb +224 -0
  175. data/lib/omnizip/buffer.rb +176 -0
  176. data/lib/omnizip/checksum_registry.rb +114 -0
  177. data/lib/omnizip/checksums/crc32.rb +100 -0
  178. data/lib/omnizip/checksums/crc64.rb +101 -0
  179. data/lib/omnizip/checksums/crc_base.rb +158 -0
  180. data/lib/omnizip/checksums/verifier.rb +131 -0
  181. data/lib/omnizip/chunked/memory_manager.rb +194 -0
  182. data/lib/omnizip/chunked/reader.rb +78 -0
  183. data/lib/omnizip/chunked/writer.rb +120 -0
  184. data/lib/omnizip/chunked.rb +129 -0
  185. data/lib/omnizip/cli/output_formatter.rb +104 -0
  186. data/lib/omnizip/cli.rb +572 -0
  187. data/lib/omnizip/commands/.keep +0 -0
  188. data/lib/omnizip/commands/archive_create_command.rb +427 -0
  189. data/lib/omnizip/commands/archive_extract_command.rb +272 -0
  190. data/lib/omnizip/commands/archive_list_command.rb +218 -0
  191. data/lib/omnizip/commands/archive_repair_command.rb +131 -0
  192. data/lib/omnizip/commands/archive_verify_command.rb +117 -0
  193. data/lib/omnizip/commands/compress_command.rb +117 -0
  194. data/lib/omnizip/commands/decompress_command.rb +120 -0
  195. data/lib/omnizip/commands/list_command.rb +53 -0
  196. data/lib/omnizip/commands/metadata_command.rb +153 -0
  197. data/lib/omnizip/commands/parity_create_command.rb +122 -0
  198. data/lib/omnizip/commands/parity_repair_command.rb +122 -0
  199. data/lib/omnizip/commands/parity_verify_command.rb +124 -0
  200. data/lib/omnizip/commands/profile_list_command.rb +56 -0
  201. data/lib/omnizip/commands/profile_show_command.rb +44 -0
  202. data/lib/omnizip/convenience.rb +359 -0
  203. data/lib/omnizip/converter/conversion_registry.rb +49 -0
  204. data/lib/omnizip/converter/conversion_strategy.rb +121 -0
  205. data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +97 -0
  206. data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +112 -0
  207. data/lib/omnizip/converter.rb +105 -0
  208. data/lib/omnizip/crypto/aes256/cipher.rb +100 -0
  209. data/lib/omnizip/crypto/aes256/constants.rb +28 -0
  210. data/lib/omnizip/crypto/aes256/key_derivation.rb +101 -0
  211. data/lib/omnizip/crypto/aes256.rb +102 -0
  212. data/lib/omnizip/error.rb +106 -0
  213. data/lib/omnizip/eta/exponential_smoothing_estimator.rb +98 -0
  214. data/lib/omnizip/eta/moving_average_estimator.rb +99 -0
  215. data/lib/omnizip/eta/rate_calculator.rb +104 -0
  216. data/lib/omnizip/eta/sample_history.rb +143 -0
  217. data/lib/omnizip/eta/time_estimator.rb +106 -0
  218. data/lib/omnizip/eta.rb +63 -0
  219. data/lib/omnizip/extraction/filter_chain.rb +177 -0
  220. data/lib/omnizip/extraction/glob_pattern.rb +140 -0
  221. data/lib/omnizip/extraction/pattern_matcher.rb +70 -0
  222. data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
  223. data/lib/omnizip/extraction/regex_pattern.rb +50 -0
  224. data/lib/omnizip/extraction/selective_extractor.rb +240 -0
  225. data/lib/omnizip/extraction.rb +111 -0
  226. data/lib/omnizip/file_type/mime_classifier.rb +144 -0
  227. data/lib/omnizip/file_type.rb +113 -0
  228. data/lib/omnizip/filter.rb +139 -0
  229. data/lib/omnizip/filter_pipeline.rb +108 -0
  230. data/lib/omnizip/filter_registry.rb +166 -0
  231. data/lib/omnizip/filters/bcj.rb +279 -0
  232. data/lib/omnizip/filters/bcj2/constants.rb +53 -0
  233. data/lib/omnizip/filters/bcj2/decoder.rb +200 -0
  234. data/lib/omnizip/filters/bcj2/encoder.rb +61 -0
  235. data/lib/omnizip/filters/bcj2/stream_data.rb +93 -0
  236. data/lib/omnizip/filters/bcj2.rb +99 -0
  237. data/lib/omnizip/filters/bcj_arm.rb +176 -0
  238. data/lib/omnizip/filters/bcj_arm64.rb +244 -0
  239. data/lib/omnizip/filters/bcj_ia64.rb +196 -0
  240. data/lib/omnizip/filters/bcj_ppc.rb +190 -0
  241. data/lib/omnizip/filters/bcj_sparc.rb +176 -0
  242. data/lib/omnizip/filters/bcj_x86.rb +193 -0
  243. data/lib/omnizip/filters/delta.rb +196 -0
  244. data/lib/omnizip/filters/filter_base.rb +72 -0
  245. data/lib/omnizip/filters/registry.rb +123 -0
  246. data/lib/omnizip/filters/xz_delta.rb +258 -0
  247. data/lib/omnizip/format_detector.rb +162 -0
  248. data/lib/omnizip/format_registry.rb +59 -0
  249. data/lib/omnizip/formats/.keep +0 -0
  250. data/lib/omnizip/formats/bzip2_file.rb +172 -0
  251. data/lib/omnizip/formats/cpio/constants.rb +55 -0
  252. data/lib/omnizip/formats/cpio/entry.rb +385 -0
  253. data/lib/omnizip/formats/cpio/reader.rb +196 -0
  254. data/lib/omnizip/formats/cpio/writer.rb +234 -0
  255. data/lib/omnizip/formats/cpio.rb +140 -0
  256. data/lib/omnizip/formats/format_spec_loader.rb +230 -0
  257. data/lib/omnizip/formats/gzip.rb +238 -0
  258. data/lib/omnizip/formats/iso/directory_builder.rb +297 -0
  259. data/lib/omnizip/formats/iso/directory_record.rb +152 -0
  260. data/lib/omnizip/formats/iso/joliet.rb +204 -0
  261. data/lib/omnizip/formats/iso/path_table.rb +125 -0
  262. data/lib/omnizip/formats/iso/reader.rb +197 -0
  263. data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
  264. data/lib/omnizip/formats/iso/volume_builder.rb +320 -0
  265. data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
  266. data/lib/omnizip/formats/iso/writer.rb +530 -0
  267. data/lib/omnizip/formats/iso.rb +140 -0
  268. data/lib/omnizip/formats/lzip.rb +175 -0
  269. data/lib/omnizip/formats/lzma_alone.rb +171 -0
  270. data/lib/omnizip/formats/rar/archive_repairer.rb +243 -0
  271. data/lib/omnizip/formats/rar/archive_verifier.rb +195 -0
  272. data/lib/omnizip/formats/rar/block_parser.rb +243 -0
  273. data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
  274. data/lib/omnizip/formats/rar/compression/dispatcher.rb +217 -0
  275. data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +216 -0
  276. data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +158 -0
  277. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
  278. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
  279. data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
  280. data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
  281. data/lib/omnizip/formats/rar/compression/ppmd/context.rb +105 -0
  282. data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +219 -0
  283. data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +262 -0
  284. data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
  285. data/lib/omnizip/formats/rar/constants.rb +82 -0
  286. data/lib/omnizip/formats/rar/decompressor.rb +238 -0
  287. data/lib/omnizip/formats/rar/external_writer.rb +312 -0
  288. data/lib/omnizip/formats/rar/header.rb +192 -0
  289. data/lib/omnizip/formats/rar/license_validator.rb +109 -0
  290. data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
  291. data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
  292. data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
  293. data/lib/omnizip/formats/rar/parity_handler.rb +292 -0
  294. data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +202 -0
  295. data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +578 -0
  296. data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
  297. data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
  298. data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +97 -0
  299. data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
  300. data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +166 -0
  301. data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
  302. data/lib/omnizip/formats/rar/rar5/header.rb +187 -0
  303. data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
  304. data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
  305. data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
  306. data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
  307. data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
  308. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +264 -0
  309. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
  310. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +194 -0
  311. data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +109 -0
  312. data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +142 -0
  313. data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
  314. data/lib/omnizip/formats/rar/rar5/vint.rb +65 -0
  315. data/lib/omnizip/formats/rar/rar5/writer.rb +466 -0
  316. data/lib/omnizip/formats/rar/rar_format_base.rb +241 -0
  317. data/lib/omnizip/formats/rar/reader.rb +366 -0
  318. data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
  319. data/lib/omnizip/formats/rar/volume_manager.rb +168 -0
  320. data/lib/omnizip/formats/rar/writer.rb +431 -0
  321. data/lib/omnizip/formats/rar.rb +205 -0
  322. data/lib/omnizip/formats/rar3/compressor.rb +73 -0
  323. data/lib/omnizip/formats/rar3/decompressor.rb +66 -0
  324. data/lib/omnizip/formats/rar3/reader.rb +386 -0
  325. data/lib/omnizip/formats/rar3/writer.rb +219 -0
  326. data/lib/omnizip/formats/rar5/compressor.rb +73 -0
  327. data/lib/omnizip/formats/rar5/decompressor.rb +66 -0
  328. data/lib/omnizip/formats/rar5/reader.rb +342 -0
  329. data/lib/omnizip/formats/rar5/writer.rb +214 -0
  330. data/lib/omnizip/formats/seven_zip/coder_chain.rb +150 -0
  331. data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
  332. data/lib/omnizip/formats/seven_zip/encoded_header.rb +114 -0
  333. data/lib/omnizip/formats/seven_zip/encrypted_header.rb +142 -0
  334. data/lib/omnizip/formats/seven_zip/file_collector.rb +144 -0
  335. data/lib/omnizip/formats/seven_zip/header.rb +106 -0
  336. data/lib/omnizip/formats/seven_zip/header_encryptor.rb +134 -0
  337. data/lib/omnizip/formats/seven_zip/header_writer.rb +466 -0
  338. data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
  339. data/lib/omnizip/formats/seven_zip/models/file_entry.rb +58 -0
  340. data/lib/omnizip/formats/seven_zip/models/folder.rb +69 -0
  341. data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
  342. data/lib/omnizip/formats/seven_zip/parser.rb +660 -0
  343. data/lib/omnizip/formats/seven_zip/reader.rb +458 -0
  344. data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +632 -0
  345. data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +315 -0
  346. data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
  347. data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +162 -0
  348. data/lib/omnizip/formats/seven_zip/writer.rb +740 -0
  349. data/lib/omnizip/formats/seven_zip.rb +93 -0
  350. data/lib/omnizip/formats/tar/constants.rb +73 -0
  351. data/lib/omnizip/formats/tar/entry.rb +94 -0
  352. data/lib/omnizip/formats/tar/header.rb +168 -0
  353. data/lib/omnizip/formats/tar/reader.rb +121 -0
  354. data/lib/omnizip/formats/tar/writer.rb +216 -0
  355. data/lib/omnizip/formats/tar.rb +84 -0
  356. data/lib/omnizip/formats/xz/reader.rb +116 -0
  357. data/lib/omnizip/formats/xz.rb +237 -0
  358. data/lib/omnizip/formats/xz_impl/block_decoder.rb +754 -0
  359. data/lib/omnizip/formats/xz_impl/block_encoder.rb +306 -0
  360. data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
  361. data/lib/omnizip/formats/xz_impl/block_header_parser.rb +186 -0
  362. data/lib/omnizip/formats/xz_impl/constants.rb +49 -0
  363. data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
  364. data/lib/omnizip/formats/xz_impl/index_encoder.rb +122 -0
  365. data/lib/omnizip/formats/xz_impl/stream_decoder.rb +468 -0
  366. data/lib/omnizip/formats/xz_impl/stream_encoder.rb +99 -0
  367. data/lib/omnizip/formats/xz_impl/stream_footer.rb +81 -0
  368. data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +117 -0
  369. data/lib/omnizip/formats/xz_impl/stream_header.rb +55 -0
  370. data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +108 -0
  371. data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
  372. data/lib/omnizip/formats/xz_impl/writer.rb +421 -0
  373. data/lib/omnizip/formats/zip/central_directory_header.rb +195 -0
  374. data/lib/omnizip/formats/zip/constants.rb +69 -0
  375. data/lib/omnizip/formats/zip/end_of_central_directory.rb +133 -0
  376. data/lib/omnizip/formats/zip/local_file_header.rb +138 -0
  377. data/lib/omnizip/formats/zip/reader.rb +250 -0
  378. data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
  379. data/lib/omnizip/formats/zip/writer.rb +375 -0
  380. data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +104 -0
  381. data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +66 -0
  382. data/lib/omnizip/formats/zip/zip64_extra_field.rb +114 -0
  383. data/lib/omnizip/formats/zip.rb +50 -0
  384. data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
  385. data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
  386. data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
  387. data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
  388. data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
  389. data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +421 -0
  390. data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +465 -0
  391. data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +288 -0
  392. data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +200 -0
  393. data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +197 -0
  394. data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +141 -0
  395. data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +519 -0
  396. data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +723 -0
  397. data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +750 -0
  398. data/lib/omnizip/io/buffered_input.rb +146 -0
  399. data/lib/omnizip/io/buffered_output.rb +105 -0
  400. data/lib/omnizip/io/stream_manager.rb +115 -0
  401. data/lib/omnizip/link_handler/hard_link.rb +79 -0
  402. data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
  403. data/lib/omnizip/link_handler.rb +124 -0
  404. data/lib/omnizip/metadata/archive_metadata.rb +114 -0
  405. data/lib/omnizip/metadata/entry_metadata.rb +146 -0
  406. data/lib/omnizip/metadata/metadata_editor.rb +171 -0
  407. data/lib/omnizip/metadata/metadata_registry.rb +64 -0
  408. data/lib/omnizip/metadata/metadata_validator.rb +99 -0
  409. data/lib/omnizip/metadata.rb +57 -0
  410. data/lib/omnizip/models/.keep +0 -0
  411. data/lib/omnizip/models/algorithm_metadata.rb +73 -0
  412. data/lib/omnizip/models/compression_options.rb +71 -0
  413. data/lib/omnizip/models/conversion_options.rb +87 -0
  414. data/lib/omnizip/models/conversion_result.rb +135 -0
  415. data/lib/omnizip/models/eta_result.rb +46 -0
  416. data/lib/omnizip/models/extraction_rule.rb +115 -0
  417. data/lib/omnizip/models/filter_chain.rb +144 -0
  418. data/lib/omnizip/models/filter_config.rb +183 -0
  419. data/lib/omnizip/models/match_result.rb +124 -0
  420. data/lib/omnizip/models/optimization_suggestion.rb +91 -0
  421. data/lib/omnizip/models/parallel_options.rb +104 -0
  422. data/lib/omnizip/models/performance_result.rb +79 -0
  423. data/lib/omnizip/models/profile_report.rb +82 -0
  424. data/lib/omnizip/models/progress_options.rb +38 -0
  425. data/lib/omnizip/models/split_options.rb +116 -0
  426. data/lib/omnizip/optimization_registry.rb +81 -0
  427. data/lib/omnizip/parallel/job_queue.rb +209 -0
  428. data/lib/omnizip/parallel/job_scheduler.rb +203 -0
  429. data/lib/omnizip/parallel/parallel_compressor.rb +347 -0
  430. data/lib/omnizip/parallel/parallel_extractor.rb +329 -0
  431. data/lib/omnizip/parallel/worker_pool.rb +223 -0
  432. data/lib/omnizip/parallel.rb +149 -0
  433. data/lib/omnizip/parity/chunked_block_processor.rb +196 -0
  434. data/lib/omnizip/parity/galois16.rb +145 -0
  435. data/lib/omnizip/parity/models/creator_packet.rb +73 -0
  436. data/lib/omnizip/parity/models/file_description_packet.rb +133 -0
  437. data/lib/omnizip/parity/models/ifsc_packet.rb +123 -0
  438. data/lib/omnizip/parity/models/main_packet.rb +128 -0
  439. data/lib/omnizip/parity/models/packet.rb +156 -0
  440. data/lib/omnizip/parity/models/packet_registry.rb +109 -0
  441. data/lib/omnizip/parity/models/recovery_slice_packet.rb +78 -0
  442. data/lib/omnizip/parity/par2_creator.rb +531 -0
  443. data/lib/omnizip/parity/par2_repairer.rb +407 -0
  444. data/lib/omnizip/parity/par2_verifier.rb +364 -0
  445. data/lib/omnizip/parity/par2cmdline_algorithm.rb +110 -0
  446. data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
  447. data/lib/omnizip/parity/reed_solomon_decoder.rb +266 -0
  448. data/lib/omnizip/parity/reed_solomon_encoder.rb +111 -0
  449. data/lib/omnizip/parity/reed_solomon_matrix.rb +342 -0
  450. data/lib/omnizip/parity.rb +186 -0
  451. data/lib/omnizip/password/encryption_registry.rb +65 -0
  452. data/lib/omnizip/password/encryption_strategy.rb +96 -0
  453. data/lib/omnizip/password/password_validator.rb +129 -0
  454. data/lib/omnizip/password/winzip_aes_strategy.rb +192 -0
  455. data/lib/omnizip/password/zip_crypto_strategy.rb +141 -0
  456. data/lib/omnizip/password.rb +87 -0
  457. data/lib/omnizip/pipe/stream_compressor.rb +124 -0
  458. data/lib/omnizip/pipe/stream_decompressor.rb +174 -0
  459. data/lib/omnizip/pipe.rb +121 -0
  460. data/lib/omnizip/platform/ntfs_streams.rb +201 -0
  461. data/lib/omnizip/platform.rb +189 -0
  462. data/lib/omnizip/profile/archive_profile.rb +39 -0
  463. data/lib/omnizip/profile/balanced_profile.rb +33 -0
  464. data/lib/omnizip/profile/binary_profile.rb +36 -0
  465. data/lib/omnizip/profile/compression_profile.rb +158 -0
  466. data/lib/omnizip/profile/custom_profile.rb +157 -0
  467. data/lib/omnizip/profile/fast_profile.rb +33 -0
  468. data/lib/omnizip/profile/maximum_profile.rb +33 -0
  469. data/lib/omnizip/profile/profile_detector.rb +110 -0
  470. data/lib/omnizip/profile/profile_registry.rb +161 -0
  471. data/lib/omnizip/profile/text_profile.rb +36 -0
  472. data/lib/omnizip/profile.rb +190 -0
  473. data/lib/omnizip/profiler/memory_profiler.rb +66 -0
  474. data/lib/omnizip/profiler/method_profiler.rb +49 -0
  475. data/lib/omnizip/profiler/report_generator.rb +169 -0
  476. data/lib/omnizip/profiler.rb +204 -0
  477. data/lib/omnizip/progress/callback_reporter.rb +36 -0
  478. data/lib/omnizip/progress/console_reporter.rb +62 -0
  479. data/lib/omnizip/progress/log_reporter.rb +91 -0
  480. data/lib/omnizip/progress/operation_progress.rb +118 -0
  481. data/lib/omnizip/progress/progress_bar.rb +156 -0
  482. data/lib/omnizip/progress/progress_reporter.rb +40 -0
  483. data/lib/omnizip/progress/progress_tracker.rb +190 -0
  484. data/lib/omnizip/progress/silent_reporter.rb +24 -0
  485. data/lib/omnizip/progress.rb +127 -0
  486. data/lib/omnizip/rubyzip_compat.rb +63 -0
  487. data/lib/omnizip/temp/safe_extract.rb +168 -0
  488. data/lib/omnizip/temp/temp_file.rb +124 -0
  489. data/lib/omnizip/temp/temp_file_pool.rb +109 -0
  490. data/lib/omnizip/temp.rb +181 -0
  491. data/lib/omnizip/version.rb +5 -0
  492. data/lib/omnizip/zip/entry.rb +156 -0
  493. data/lib/omnizip/zip/file.rb +485 -0
  494. data/lib/omnizip/zip/input_stream.rb +273 -0
  495. data/lib/omnizip/zip/output_stream.rb +324 -0
  496. data/lib/omnizip.rb +156 -0
  497. data/readme-docs/advanced-features.adoc +515 -0
  498. data/readme-docs/api-usage.adoc +444 -0
  499. data/readme-docs/architecture.adoc +449 -0
  500. data/readme-docs/archive-formats.adoc +479 -0
  501. data/readme-docs/cli-usage.adoc +222 -0
  502. data/readme-docs/compression-algorithms.adoc +442 -0
  503. data/readme-docs/compression-profiles.adoc +247 -0
  504. data/readme-docs/encryption-checksums.adoc +328 -0
  505. data/readme-docs/format-converter.adoc +325 -0
  506. data/readme-docs/installation.adoc +228 -0
  507. data/readme-docs/par2-archives.adoc +608 -0
  508. data/readme-docs/performance-profiler.adoc +389 -0
  509. data/readme-docs/preprocessing-filters.adoc +280 -0
  510. data/xz-file-format-1.2.1.txt +1174 -0
  511. metadata +617 -0
@@ -0,0 +1,328 @@
1
+ = Encryption & Checksums Guide
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == Purpose
6
+
7
+ This document covers encryption and checksum features in Omnizip for securing archives and verifying data integrity.
8
+
9
+ == AES-256 Encryption
10
+
11
+ === General
12
+
13
+ Omnizip provides password-protected archive encryption using AES-256-CBC with SHA-256 key derivation. This ensures strong security for sensitive data in archives.
14
+
15
+ === How It Works
16
+
17
+ . **Key Derivation:** Password is hashed using SHA-256 to create encryption key
18
+ . **Encryption:** Data is encrypted using AES-256 in CBC (Cipher Block Chaining) mode
19
+ . **Initialization Vector (IV):** Random IV is generated for each archive
20
+ . **Storage:** Encrypted data and IV are stored in archive metadata
21
+
22
+ === Security Features
23
+
24
+ * **AES-256:** Industry-standard strong encryption (256-bit key)
25
+ * **CBC Mode:** Cipher Block Chaining prevents pattern analysis
26
+ * **SHA-256:** Secure hash function for key derivation
27
+ * **Random IV:** Each archive has unique initialization vector
28
+ * **Salt:** Password is salted before hashing (prevents rainbow tables)
29
+
30
+ === Usage with .7z Archives
31
+
32
+ [source,ruby]
33
+ ----
34
+ # Create encrypted archive
35
+ writer = Omnizip::Formats::SevenZip::Writer.new(
36
+ 'secure_archive.7z',
37
+ password: "my_secure_password"
38
+ )
39
+
40
+ writer.add_file('sensitive_document.pdf')
41
+ writer.add_file('confidential_data.xlsx')
42
+ writer.close
43
+
44
+ # Extract encrypted archive
45
+ reader = Omnizip::Formats::SevenZip::Reader.new(
46
+ 'secure_archive.7z',
47
+ password: "my_secure_password"
48
+ )
49
+
50
+ reader.extract_all('output/')
51
+ reader.close
52
+ ----
53
+
54
+ === Password Strength Recommendations
55
+
56
+ **Weak (avoid):**
57
+ * Single words
58
+ * Common passwords
59
+ * < 8 characters
60
+ * No special characters
61
+
62
+ **Strong (recommended):**
63
+ * 12+ characters
64
+ * Mix of uppercase, lowercase, numbers, symbols
65
+ * Not based on dictionary words
66
+ * Unique for each archive
67
+
68
+ **Example strong passwords:**
69
+ * `mK9$pL2#nQ5@vR8!`
70
+ * `Correct-Horse-Battery-Staple-2024`
71
+ * `Th1s!sMyS3cur3P@ssw0rd`
72
+
73
+ === Security Considerations
74
+
75
+ **What encryption protects:**
76
+ * File contents from unauthorized access
77
+ * Archive contents from modification
78
+ * Data confidentiality during storage/transfer
79
+
80
+ **What encryption does NOT protect:**
81
+ * File names (visible in archive)
82
+ * File sizes (visible in archive)
83
+ * Directory structure (visible in archive)
84
+ * Metadata (creation dates, etc.)
85
+
86
+ **Important notes:**
87
+ * Store passwords securely (password managers recommended)
88
+ * Lost passwords cannot be recovered
89
+ * Stronger passwords require more time to crack
90
+ * Consider using key files for additional security
91
+
92
+ === Performance Impact
93
+
94
+ Encryption adds minimal overhead:
95
+
96
+ * **Encryption:** ~5-10% slower than unencrypted
97
+ * **Decryption:** ~5-10% slower than unencrypted
98
+ * **Memory:** No significant increase
99
+
100
+ The security benefits far outweigh the small performance cost.
101
+
102
+ == CRC32 Checksums
103
+
104
+ === General
105
+
106
+ CRC32 (Cyclic Redundancy Check 32-bit) provides fast integrity verification for compressed data. It detects accidental corruption but is not cryptographically secure.
107
+
108
+ === Characteristics
109
+
110
+ * **Size:** 32-bit (4 bytes)
111
+ * **Speed:** Very fast
112
+ * **Collision resistance:** Moderate
113
+ * **Use case:** Detect accidental corruption
114
+
115
+ === Usage
116
+
117
+ [source,ruby]
118
+ ----
119
+ # Calculate CRC32 of data
120
+ data = File.binread('file.txt')
121
+ crc32 = Omnizip::ChecksumRegistry.get(:crc32).calculate(data)
122
+
123
+ puts "CRC32: #{crc32.to_s(16).upcase}" # Hexadecimal format
124
+ ----
125
+
126
+ === When to Use CRC32
127
+
128
+ **Good for:**
129
+ * ZIP archives (standard checksum)
130
+ * Quick integrity checks
131
+ * Detecting transmission errors
132
+ * Low-overhead verification
133
+
134
+ **Not suitable for:**
135
+ * Security-critical applications
136
+ * Detecting intentional tampering
137
+ * Cryptographic purposes
138
+
139
+ == CRC64 Checksums
140
+
141
+ === General
142
+
143
+ CRC64 (Cyclic Redundancy Check 64-bit) provides stronger integrity verification than CRC32 with very low collision probability. Used in .7z archives for reliable data verification.
144
+
145
+ === Characteristics
146
+
147
+ * **Size:** 64-bit (8 bytes)
148
+ * **Speed:** Very fast
149
+ * **Collision resistance:** Very high
150
+ * **Use case:** Reliable corruption detection
151
+
152
+ === Usage
153
+
154
+ [source,ruby]
155
+ ----
156
+ # Calculate CRC64 of data
157
+ data = File.binread('large_file.dat')
158
+ crc64 = Omnizip::ChecksumRegistry.get(:crc64).calculate(data)
159
+
160
+ puts "CRC64: #{crc64.to_s(16).upcase}"
161
+ ----
162
+
163
+ === When to Use CRC64
164
+
165
+ **Good for:**
166
+ * .7z archives (standard checksum)
167
+ * Large files (> 4GB)
168
+ * High-reliability verification
169
+ * Minimal collision risk needed
170
+
171
+ **Advantages over CRC32:**
172
+ * Much lower collision probability
173
+ * Better for large datasets
174
+ * More reliable for critical data
175
+
176
+ ## Checksum Comparison
177
+
178
+ [cols="20,20,20,20,20",options="header"]
179
+ |===
180
+ |Feature |CRC32 |CRC64 |MD5 |SHA-256
181
+
182
+ |Size
183
+ |4 bytes
184
+ |8 bytes
185
+ |16 bytes
186
+ |32 bytes
187
+
188
+ |Speed
189
+ |⭐⭐⭐⭐⭐
190
+ |⭐⭐⭐⭐⭐
191
+ |⭐⭐⭐⭐
192
+ |⭐⭐⭐
193
+
194
+ |Collision Resistance
195
+ |⭐⭐
196
+ |⭐⭐⭐⭐
197
+ |⭐⭐⭐
198
+ |⭐⭐⭐⭐⭐
199
+
200
+ |Cryptographic Security
201
+ |❌ No
202
+ |❌ No
203
+ |⚠️ Weak
204
+ |✅ Yes
205
+
206
+ |Best Use Case
207
+ |ZIP archives
208
+ |.7z archives
209
+ |Legacy systems
210
+ |Security-critical
211
+ |===
212
+
213
+ **Note:** MD5 and SHA-256 are not currently implemented in Omnizip core, but can be added if needed.
214
+
215
+ == Archive Integrity Verification
216
+
217
+ === Automatic Verification
218
+
219
+ Omnizip automatically verifies checksums during extraction:
220
+
221
+ [source,ruby]
222
+ ----
223
+ # Extraction automatically verifies checksums
224
+ reader = Omnizip::Formats::SevenZip::Reader.new('archive.7z')
225
+
226
+ begin
227
+ reader.extract_all('output/')
228
+ puts "✓ All files verified successfully"
229
+ rescue Omnizip::ChecksumMismatchError => e
230
+ puts "✗ Checksum verification failed: #{e.message}"
231
+ puts "File may be corrupted: #{e.filename}"
232
+ end
233
+
234
+ reader.close
235
+ ----
236
+
237
+ === Manual Verification
238
+
239
+ You can manually verify checksums without extraction:
240
+
241
+ [source,ruby]
242
+ ----
243
+ # Verify archive integrity without extracting
244
+ reader = Omnizip::Formats::SevenZip::Reader.new('archive.7z')
245
+
246
+ reader.entries.each do |entry|
247
+ # Get stored checksum
248
+ stored_crc = entry.crc
249
+
250
+ # Read and calculate actual checksum
251
+ data = reader.read_entry_data(entry)
252
+ calculated_crc = Omnizip::ChecksumRegistry.get(:crc64).calculate(data)
253
+
254
+ if stored_crc == calculated_crc
255
+ puts "✓ #{entry.name}: OK"
256
+ else
257
+ puts "✗ #{entry.name}: CORRUPTED"
258
+ end
259
+ end
260
+
261
+ reader.close
262
+ ----
263
+
264
+ == Combined Security: Encryption + Checksums
265
+
266
+ Omnizip uses both encryption and checksums for maximum security and integrity:
267
+
268
+ [source,ruby]
269
+ ----
270
+ # Create secure archive with both encryption and checksums
271
+ writer = Omnizip::Formats::SevenZip::Writer.new(
272
+ 'secure_archive.7z',
273
+ password: "strong_password_here",
274
+ checksum: :crc64 # Default, can be explicit
275
+ )
276
+
277
+ writer.add_file('important_data.xlsx')
278
+ writer.close
279
+
280
+ # Extraction verifies both encryption and checksums
281
+ reader = Omnizip::Formats::SevenZip::Reader.new(
282
+ 'secure_archive.7z',
283
+ password: "strong_password_here"
284
+ )
285
+
286
+ begin
287
+ reader.extract_all('output/')
288
+ puts "✓ Password correct, checksums valid, data intact"
289
+ rescue Omnizip::WrongPasswordError
290
+ puts "✗ Incorrect password"
291
+ rescue Omnizip::ChecksumMismatchError
292
+ puts "✗ Data corrupted (password correct but checksum failed)"
293
+ end
294
+
295
+ reader.close
296
+ ----
297
+
298
+ == Best Practices
299
+
300
+ === For Security
301
+
302
+ . **Use strong passwords** (12+ characters, mixed case, numbers, symbols)
303
+ . **Don't reuse passwords** across different archives
304
+ . **Store passwords securely** (password manager recommended)
305
+ . **Use AES-256** for sensitive data
306
+ . **Combine with file permissions** for defense in depth
307
+
308
+ === For Data Integrity
309
+
310
+ . **Always verify checksums** during extraction
311
+ . **Use CRC64** for large or critical files
312
+ . **Test archives** after creation
313
+ . **Keep backup copies** of important archives
314
+ . **Verify archives periodically** (detect bit rot)
315
+
316
+ === For Performance
317
+
318
+ . **Encryption overhead is minimal** (~5-10%) - always use for sensitive data
319
+ . **CRC64 is very fast** - overhead is negligible
320
+ . **Larger files benefit more** from CRC64 over CRC32
321
+ . **Consider compression level** before encryption for best balance
322
+
323
+ == See Also
324
+
325
+ * link:archive-formats.adoc[Archive Formats]
326
+ * link:api-usage.adoc[Library API Usage]
327
+ * link:par2-archives.adoc[PAR2 Error Correction]
328
+ * link:../README.adoc[Main README]
@@ -0,0 +1,325 @@
1
+ = Format Converter
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == Purpose
6
+
7
+ The Format Converter provides seamless conversion between different archive formats, preserving metadata and allowing batch processing operations.
8
+
9
+ == Supported Conversions
10
+
11
+ [cols="30,30,40",options="header"]
12
+ |===
13
+ |Source Format |Target Format |Status
14
+
15
+ |ZIP
16
+ |7z
17
+ |✅ Full support
18
+
19
+ |7z
20
+ |ZIP
21
+ |✅ Full support
22
+
23
+ |RAR
24
+ |ZIP/7z
25
+ |🔵 Via extract + re-compress
26
+
27
+ |TAR
28
+ |ZIP/7z
29
+ |🔵 Via extract + re-compress
30
+ |===
31
+
32
+ == Basic Conversion
33
+
34
+ === Single File Conversion
35
+
36
+ [source,ruby]
37
+ ----
38
+ # Convert ZIP to 7z
39
+ Omnizip::Converter.convert('archive.zip', 'archive.7z')
40
+
41
+ # Convert 7z to ZIP
42
+ Omnizip::Converter.convert('archive.7z', 'archive.zip')
43
+ ----
44
+
45
+ === With Options
46
+
47
+ [source,ruby]
48
+ ----
49
+ # Convert with compression settings
50
+ Omnizip::Converter.convert('source.zip', 'target.7z',
51
+ algorithm: :lzma2,
52
+ level: 9,
53
+ solid: true
54
+ )
55
+
56
+ # Convert and delete source
57
+ Omnizip::Converter.convert('source.zip', 'target.7z',
58
+ delete_source: true
59
+ )
60
+
61
+ # Convert with progress tracking
62
+ Omnizip::Converter.convert('large.zip', 'large.7z',
63
+ progress: ->(pct) { puts "Progress: #{pct}%" }
64
+ )
65
+ ----
66
+
67
+ == Batch Conversion
68
+
69
+ === Convert Multiple Archives
70
+
71
+ [source,ruby]
72
+ ----
73
+ # Batch convert all ZIP files to 7z
74
+ sources = Dir.glob('backups/*.zip')
75
+
76
+ Omnizip::Converter.batch_convert(
77
+ sources,
78
+ target_format: :seven_zip,
79
+ level: 9
80
+ ) do |result|
81
+ puts "Converted: #{result.source} -> #{result.target}"
82
+ puts " Time: #{result.duration}s"
83
+ puts " Original: #{result.source_size} bytes"
84
+ puts " Converted: #{result.target_size} bytes"
85
+ puts " Savings: #{result.compression_improvement}%"
86
+ end
87
+ ----
88
+
89
+ == Conversion Strategies
90
+
91
+ === ZIP to 7z Strategy
92
+
93
+ Converts ZIP archives to 7z format with better compression:
94
+
95
+ [source,ruby]
96
+ ----
97
+ strategy = Omnizip::Converter::ZipToSevenZipStrategy.new(
98
+ 'source.zip',
99
+ 'target.7z',
100
+ algorithm: :lzma2,
101
+ level: 9,
102
+ solid: true
103
+ )
104
+
105
+ result = strategy.convert
106
+ puts "Compression improved by #{result.compression_improvement}%"
107
+ ----
108
+
109
+ === 7z to ZIP Strategy
110
+
111
+ Converts 7z archives to ZIP for better compatibility:
112
+
113
+ [source,ruby]
114
+ ----
115
+ strategy = Omnizip::Converter::SevenZipToZipStrategy.new(
116
+ 'source.7z',
117
+ 'target.zip',
118
+ algorithm: :deflate,
119
+ level: 6
120
+ )
121
+
122
+ result = strategy.convert
123
+ ----
124
+
125
+ == Conversion Options
126
+
127
+ === Available Options
128
+
129
+ [source,ruby]
130
+ ----
131
+ options = Omnizip::Models::ConversionOptions.new(
132
+ # Target compression settings
133
+ algorithm: :lzma2, # Compression algorithm
134
+ level: 9, # Compression level (1-9)
135
+ solid: true, # Solid compression (7z only)
136
+
137
+ # Filters
138
+ filter: :bcj_x86, # Preprocessing filter
139
+
140
+ # Behavior options
141
+ delete_source: false, # Delete source after conversion
142
+ overwrite: false, # Overwrite existing target
143
+ preserve_timestamps: true, # Keep original timestamps
144
+
145
+ # Progress tracking
146
+ progress: nil # Progress callback
147
+ )
148
+
149
+ Omnizip::Converter.convert_with_options('source.zip', 'target.7z', options)
150
+ ----
151
+
152
+ == Conversion Results
153
+
154
+ === Result Object
155
+
156
+ Each conversion returns a result object with detailed information:
157
+
158
+ [source,ruby]
159
+ ----
160
+ result = Omnizip::Converter.convert('archive.zip', 'archive.7z')
161
+
162
+ # Conversion details
163
+ result.success? # => true/false
164
+ result.source # => 'archive.zip'
165
+ result.target # => 'archive.7z'
166
+ result.duration # => 2.5 (seconds)
167
+
168
+ # Size information
169
+ result.source_size # => 1048576 (bytes)
170
+ result.target_size # => 524288 (bytes)
171
+ result.compression_improvement # => 50.0 (%)
172
+
173
+ # Files processed
174
+ result.files_processed # => 42
175
+ result.files_failed # => 0
176
+
177
+ # Error information (if failed)
178
+ result.error_message # => nil or error string
179
+ ----
180
+
181
+ == Examples
182
+
183
+ === Example 1: Optimize Storage with 7z
184
+
185
+ [source,ruby]
186
+ ----
187
+ # Convert all ZIP backups to 7z for better compression
188
+ def optimize_backups(backup_dir)
189
+ zip_files = Dir.glob("#{backup_dir}/*.zip")
190
+ total_saved = 0
191
+
192
+ zip_files.each do |zip_file|
193
+ sevenz_file = zip_file.sub('.zip', '.7z')
194
+
195
+ result = Omnizip::Converter.convert(zip_file, sevenz_file,
196
+ algorithm: :lzma2,
197
+ level: 9,
198
+ solid: true,
199
+ delete_source: true
200
+ )
201
+
202
+ saved = result.source_size - result.target_size
203
+ total_saved += saved
204
+
205
+ puts "#{File.basename(zip_file)}: saved #{saved / 1024}KB"
206
+ end
207
+
208
+ puts "\nTotal space saved: #{total_saved / (1024 * 1024)}MB"
209
+ end
210
+
211
+ optimize_backups('backups/')
212
+ ----
213
+
214
+ === Example 2: Convert to ZIP for Compatibility
215
+
216
+ [source,ruby]
217
+ ----
218
+ # Convert 7z archives to ZIP for compatibility with other systems
219
+ def convert_for_compatibility(source_dir, target_dir)
220
+ FileUtils.mkdir_p(target_dir)
221
+
222
+ Dir.glob("#{source_dir}/*.7z").each do |sevenz_file|
223
+ basename = File.basename(sevenz_file, '.7z')
224
+ zip_file = File.join(target_dir, "#{basename}.zip")
225
+
226
+ puts "Converting: #{basename}"
227
+ result = Omnizip::Converter.convert(sevenz_file, zip_file,
228
+ algorithm: :deflate,
229
+ level: 6
230
+ )
231
+
232
+ if result.success?
233
+ puts " ✓ Success (#{result.files_processed} files)"
234
+ else
235
+ puts " ✗ Failed: #{result.error_message}"
236
+ end
237
+ end
238
+ end
239
+
240
+ convert_for_compatibility('internal/', 'external/')
241
+ ----
242
+
243
+ === Example 3: Smart Conversion with Analysis
244
+
245
+ [source,ruby]
246
+ ----
247
+ # Analyze and convert only if beneficial
248
+ def smart_convert(source_file)
249
+ target_file = source_file.sub(/\.(zip|7z)$/, '.optimized.7z')
250
+
251
+ # Try conversion with maximum compression
252
+ result = Omnizip::Converter.convert(source_file, target_file,
253
+ algorithm: :lzma2,
254
+ level: 9,
255
+ solid: true
256
+ )
257
+
258
+ # Keep conversion only if it saves significant space
259
+ improvement = result.compression_improvement
260
+
261
+ if improvement > 10.0
262
+ # Good savings, delete source
263
+ File.delete(source_file)
264
+ File.rename(target_file, source_file.sub(/\.(zip|7z)$/, '.7z'))
265
+ puts "Optimized: #{improvement.round(1)}% savings"
266
+ else
267
+ # Not worth it, delete converted file
268
+ File.delete(target_file)
269
+ puts "Skipped: only #{improvement.round(1)}% improvement"
270
+ end
271
+ end
272
+ ----
273
+
274
+ == Checking Conversion Support
275
+
276
+ [source,ruby]
277
+ ----
278
+ # Check if conversion is supported
279
+ if Omnizip::Converter.supported?('archive.zip', 'archive.7z')
280
+ puts "ZIP to 7z conversion is supported"
281
+ end
282
+
283
+ # List available strategies
284
+ Omnizip::Converter.strategies.each do |strategy_class|
285
+ puts strategy_class.name
286
+ end
287
+ ----
288
+
289
+ == Performance Considerations
290
+
291
+ === Conversion Speed
292
+
293
+ [cols="30,30,40",options="header"]
294
+ |===
295
+ |Conversion |Speed |Notes
296
+
297
+ |ZIP → 7z (LZMA2)
298
+ |Slow
299
+ |10-15x slower than ZIP extraction alone
300
+
301
+ |7z → ZIP (Deflate)
302
+ |Medium
303
+ |Faster due to simpler Deflate compression
304
+
305
+ |With solid compression
306
+ |Very Slow
307
+ |Solid mode requires recompression of entire archive
308
+
309
+ |With Store (no compression)
310
+ |Fast
311
+ |Just format conversion, minimal processing
312
+ |===
313
+
314
+ === Memory Usage
315
+
316
+ - **Streaming mode**: Processes files one at a time (lower memory)
317
+ - **Batch mode**: May load multiple files in memory
318
+ - **Large archives**: Consider chunked processing for >1GB archives
319
+
320
+ == See Also
321
+
322
+ * link:../README.adoc#seven-zip-format[7z Format Documentation]
323
+ * link:../README.adoc#zip-format[ZIP Format Documentation]
324
+ * link:compression-profiles.adoc[Compression Profiles]
325
+ * link:performance-profiler.adoc[Performance Profiler]