omnizip 0.4.7-x86_64-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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +32 -0
- data/.rubocop_todo.yml +293 -0
- data/CHANGELOG.md +1647 -0
- data/CONTEXT.md +68 -0
- data/COPYING +502 -0
- data/Gemfile +19 -0
- data/LICENSE +12 -0
- data/README.adoc +1327 -0
- data/Rakefile +15 -0
- data/TODO.refactor/00-overview.md +67 -0
- data/TODO.refactor/01-registry-base-class.md +81 -0
- data/TODO.refactor/02-error-hierarchy.md +57 -0
- data/TODO.refactor/03-autoload-entry-point.md +69 -0
- data/TODO.refactor/04-filter-base-consolidation.md +49 -0
- data/TODO.refactor/05-send-private-methods.md +64 -0
- data/TODO.refactor/06-instance-variable-access.md +69 -0
- data/TODO.refactor/07-respond-to-replacement.md +237 -0
- data/TODO.refactor/08-spec-doubles.md +27 -0
- data/TODO.refactor/09-cli-shared-module.md +35 -0
- data/TODO.refactor/10-format-detector-ocp.md +34 -0
- data/TODO.refactor/11-convenience-decoupling.md +38 -0
- data/TODO.refactor/12-thread-safety.md +8 -0
- data/TODO.refactor/13-lutaml-model-migration.md +158 -0
- data/TODO.refactor/14-add-missing-specs.md +25 -0
- data/benchmark/README.md +260 -0
- data/benchmark/benchmark_suite.rb +125 -0
- data/benchmark/compression_bench.rb +181 -0
- data/benchmark/filter_bench.rb +180 -0
- data/benchmark/models/benchmark_result.rb +59 -0
- data/benchmark/models/comparison_result.rb +69 -0
- data/benchmark/profile_suite.rb +167 -0
- data/benchmark/reporter.rb +150 -0
- data/benchmark/run_benchmarks.rb +66 -0
- data/benchmark/test_data.rb +137 -0
- data/config/formats/rar3_spec.yml +92 -0
- data/config/formats/rar5_spec.yml +102 -0
- data/docs/.github/workflows/docs.yml +142 -0
- data/docs/.gitignore +21 -0
- data/docs/.lychee.toml +67 -0
- data/docs/Gemfile +13 -0
- data/docs/RAR_WRITE_SUPPORT.md +26 -0
- data/docs/README.md +101 -0
- data/docs/_config.yml +112 -0
- data/docs/assets/logo.svg +1 -0
- data/docs/assets/omnizip-logo.pdf +1540 -11
- data/docs/comparison/feature-matrix.adoc +694 -0
- data/docs/comparison/index.adoc +113 -0
- data/docs/comparison/vs-7zip.adoc +309 -0
- data/docs/comparison/vs-peazip.adoc +77 -0
- data/docs/comparison/vs-rubyzip.adoc +342 -0
- data/docs/comparison/vs-winrar.adoc +100 -0
- data/docs/compatibility.adoc +579 -0
- data/docs/concepts/index.adoc +129 -0
- data/docs/developer/architecture.adoc +256 -0
- data/docs/developer/contributing.adoc +158 -0
- data/docs/developer/index.adoc +25 -0
- data/docs/developer/testing.adoc +212 -0
- data/docs/getting-started/basic-usage.adoc +263 -0
- data/docs/getting-started/index.adoc +42 -0
- data/docs/getting-started/installation.adoc +138 -0
- data/docs/getting-started/quick-start.adoc +183 -0
- data/docs/getting-started/your-first-archive.adoc +219 -0
- data/docs/guides/advanced-features/encryption.adoc +277 -0
- data/docs/guides/advanced-features/index.adoc +59 -0
- data/docs/guides/advanced-features/parallel-processing.adoc +144 -0
- data/docs/guides/advanced-features/progress-tracking.adoc +124 -0
- data/docs/guides/advanced-features/streaming.adoc +142 -0
- data/docs/guides/archive-formats/gzip-format.adoc +105 -0
- data/docs/guides/archive-formats/index.adoc +160 -0
- data/docs/guides/archive-formats/ole-format.adoc +151 -0
- data/docs/guides/archive-formats/rar-format.adoc +104 -0
- data/docs/guides/archive-formats/rar5.adoc +521 -0
- data/docs/guides/archive-formats/rpm-format.adoc +108 -0
- data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
- data/docs/guides/archive-formats/tar-format.adoc +106 -0
- data/docs/guides/archive-formats/xz-format.adoc +118 -0
- data/docs/guides/archive-formats/zip-format.adoc +35 -0
- data/docs/guides/compression-algorithms/bzip2.adoc +114 -0
- data/docs/guides/compression-algorithms/deflate.adoc +313 -0
- data/docs/guides/compression-algorithms/index.adoc +190 -0
- data/docs/guides/compression-algorithms/lzma.adoc +394 -0
- data/docs/guides/compression-algorithms/lzma2.adoc +244 -0
- data/docs/guides/compression-algorithms/ppmd.adoc +313 -0
- data/docs/guides/compression-algorithms/zstandard.adoc +296 -0
- data/docs/guides/creating-archives.adoc +348 -0
- data/docs/guides/extracting-archives.adoc +53 -0
- data/docs/guides/format-conversion.adoc +64 -0
- data/docs/guides/index.adoc +49 -0
- data/docs/guides/migration-rubyzip.adoc +217 -0
- data/docs/guides/parity-archives.adoc +605 -0
- data/docs/guides/performance-tuning.adoc +88 -0
- data/docs/index.adoc +228 -0
- data/docs/lychee.toml +67 -0
- data/docs/reference/api/overview.adoc +187 -0
- data/docs/reference/cli/compress-command.adoc +114 -0
- data/docs/reference/cli/overview.adoc +140 -0
- data/docs/reference/index.adoc +26 -0
- data/docs/resources/faq.adoc +185 -0
- data/docs/resources/quick-reference.adoc +222 -0
- data/docs/rust-backend.md +0 -0
- data/docs/troubleshooting/index.adoc +207 -0
- data/docs/xar_format.md +216 -0
- data/examples/api_comparison.rb +205 -0
- data/examples/deflate64_example.rb +96 -0
- data/examples/par2_demo.rb +121 -0
- data/examples/quick_start_native.rb +150 -0
- data/examples/quick_start_rubyzip.rb +115 -0
- data/examples/rubyzip_compatibility_demo.rb +194 -0
- data/exe/omnizip +27 -0
- data/lib/omnizip/algorithm.rb +176 -0
- data/lib/omnizip/algorithm_registry.rb +65 -0
- data/lib/omnizip/algorithms/.keep +0 -0
- data/lib/omnizip/algorithms/bzip2/bwt.rb +236 -0
- data/lib/omnizip/algorithms/bzip2/bz2.rb +687 -0
- data/lib/omnizip/algorithms/bzip2/rle.rb +146 -0
- data/lib/omnizip/algorithms/bzip2.rb +108 -0
- data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
- data/lib/omnizip/algorithms/deflate/decoder.rb +37 -0
- data/lib/omnizip/algorithms/deflate/encoder.rb +45 -0
- data/lib/omnizip/algorithms/deflate.rb +135 -0
- data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
- data/lib/omnizip/algorithms/deflate64/decoder.rb +151 -0
- data/lib/omnizip/algorithms/deflate64/encoder.rb +95 -0
- data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +352 -0
- data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +140 -0
- data/lib/omnizip/algorithms/deflate64.rb +118 -0
- data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
- data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
- data/lib/omnizip/algorithms/lzma/decoder.rb +146 -0
- data/lib/omnizip/algorithms/lzma/dictionary.rb +70 -0
- data/lib/omnizip/algorithms/lzma/distance_coder.rb +326 -0
- data/lib/omnizip/algorithms/lzma/encoder.rb +139 -0
- data/lib/omnizip/algorithms/lzma/length_coder.rb +172 -0
- data/lib/omnizip/algorithms/lzma/literal_decoder.rb +204 -0
- data/lib/omnizip/algorithms/lzma/literal_encoder.rb +208 -0
- data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +368 -0
- data/lib/omnizip/algorithms/lzma/lzma1_encoder.rb +105 -0
- data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +194 -0
- data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
- data/lib/omnizip/algorithms/lzma/match.rb +32 -0
- data/lib/omnizip/algorithms/lzma/match_finder.rb +233 -0
- data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
- data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +84 -0
- data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +159 -0
- data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
- data/lib/omnizip/algorithms/lzma/range_coder.rb +82 -0
- data/lib/omnizip/algorithms/lzma/range_decoder.rb +274 -0
- data/lib/omnizip/algorithms/lzma/range_encoder.rb +202 -0
- data/lib/omnizip/algorithms/lzma/state.rb +127 -0
- data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +323 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder.rb +420 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +640 -0
- data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +224 -0
- data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +167 -0
- data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +258 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +314 -0
- data/lib/omnizip/algorithms/lzma/xz_state.rb +108 -0
- data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +1311 -0
- data/lib/omnizip/algorithms/lzma.rb +266 -0
- data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +180 -0
- data/lib/omnizip/algorithms/lzma2/constants.rb +38 -0
- data/lib/omnizip/algorithms/lzma2/encoder.rb +145 -0
- data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +165 -0
- data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
- data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +122 -0
- data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
- data/lib/omnizip/algorithms/lzma2.rb +133 -0
- data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
- data/lib/omnizip/algorithms/ppmd7/context.rb +151 -0
- data/lib/omnizip/algorithms/ppmd7/decoder.rb +127 -0
- data/lib/omnizip/algorithms/ppmd7/encoder.rb +153 -0
- data/lib/omnizip/algorithms/ppmd7/model.rb +245 -0
- data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
- data/lib/omnizip/algorithms/ppmd7.rb +146 -0
- data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
- data/lib/omnizip/algorithms/ppmd8/context.rb +32 -0
- data/lib/omnizip/algorithms/ppmd8/decoder.rb +104 -0
- data/lib/omnizip/algorithms/ppmd8/encoder.rb +135 -0
- data/lib/omnizip/algorithms/ppmd8/model.rb +246 -0
- data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
- data/lib/omnizip/algorithms/ppmd8.rb +122 -0
- data/lib/omnizip/algorithms/ppmd_base.rb +142 -0
- data/lib/omnizip/algorithms/registration.rb +28 -0
- data/lib/omnizip/algorithms/zstandard/constants.rb +158 -0
- data/lib/omnizip/algorithms/zstandard/decoder.rb +249 -0
- data/lib/omnizip/algorithms/zstandard/dictionary.rb +73 -0
- data/lib/omnizip/algorithms/zstandard/encoder.rb +294 -0
- data/lib/omnizip/algorithms/zstandard/frame/block.rb +143 -0
- data/lib/omnizip/algorithms/zstandard/frame/header.rb +233 -0
- data/lib/omnizip/algorithms/zstandard/frame.rb +33 -0
- data/lib/omnizip/algorithms/zstandard/fse/bitstream.rb +183 -0
- data/lib/omnizip/algorithms/zstandard/fse/encoder.rb +534 -0
- data/lib/omnizip/algorithms/zstandard/fse/interleaved.rb +92 -0
- data/lib/omnizip/algorithms/zstandard/fse/table.rb +188 -0
- data/lib/omnizip/algorithms/zstandard/fse/table_description.rb +203 -0
- data/lib/omnizip/algorithms/zstandard/fse.rb +53 -0
- data/lib/omnizip/algorithms/zstandard/huffman.rb +276 -0
- data/lib/omnizip/algorithms/zstandard/huffman_encoder.rb +327 -0
- data/lib/omnizip/algorithms/zstandard/ldm.rb +121 -0
- data/lib/omnizip/algorithms/zstandard/literals.rb +241 -0
- data/lib/omnizip/algorithms/zstandard/literals_encoder.rb +96 -0
- data/lib/omnizip/algorithms/zstandard/match_finder.rb +483 -0
- data/lib/omnizip/algorithms/zstandard/sequences.rb +350 -0
- data/lib/omnizip/algorithms/zstandard/sequences_encoder.rb +333 -0
- data/lib/omnizip/algorithms/zstandard/xxhash.rb +159 -0
- data/lib/omnizip/algorithms/zstandard.rb +210 -0
- data/lib/omnizip/algorithms.rb +35 -0
- data/lib/omnizip/archive/builder.rb +48 -0
- data/lib/omnizip/archive/reader_session.rb +67 -0
- data/lib/omnizip/archive.rb +86 -0
- data/lib/omnizip/archive_handler.rb +82 -0
- data/lib/omnizip/archive_handlers/cpio_handler.rb +47 -0
- data/lib/omnizip/archive_handlers/iso_handler.rb +54 -0
- data/lib/omnizip/archive_handlers/ole_handler.rb +37 -0
- data/lib/omnizip/archive_handlers/rar_handler.rb +96 -0
- data/lib/omnizip/archive_handlers/rpm_handler.rb +45 -0
- data/lib/omnizip/archive_handlers/seven_zip_handler.rb +89 -0
- data/lib/omnizip/archive_handlers/tar_handler.rb +75 -0
- data/lib/omnizip/archive_handlers/xar_handler.rb +49 -0
- data/lib/omnizip/archive_handlers/zip_handler.rb +115 -0
- data/lib/omnizip/archive_handlers.rb +18 -0
- data/lib/omnizip/backends.rb +160 -0
- data/lib/omnizip/buffer/memory_archive.rb +246 -0
- data/lib/omnizip/buffer/memory_extractor.rb +234 -0
- data/lib/omnizip/buffer/seven_zip_bridge.rb +171 -0
- data/lib/omnizip/buffer.rb +187 -0
- data/lib/omnizip/checksum_registry.rb +41 -0
- data/lib/omnizip/checksums/crc32.rb +101 -0
- data/lib/omnizip/checksums/crc64.rb +102 -0
- data/lib/omnizip/checksums/crc_base.rb +158 -0
- data/lib/omnizip/checksums/registration.rb +16 -0
- data/lib/omnizip/checksums/verifier.rb +130 -0
- data/lib/omnizip/checksums.rb +11 -0
- data/lib/omnizip/chunked/memory_manager.rb +194 -0
- data/lib/omnizip/chunked/reader.rb +78 -0
- data/lib/omnizip/chunked/writer.rb +123 -0
- data/lib/omnizip/chunked.rb +123 -0
- data/lib/omnizip/cli/output_formatter.rb +112 -0
- data/lib/omnizip/cli.rb +604 -0
- data/lib/omnizip/commands/.keep +0 -0
- data/lib/omnizip/commands/archive_create_command.rb +245 -0
- data/lib/omnizip/commands/archive_extract_command.rb +231 -0
- data/lib/omnizip/commands/archive_list_command.rb +204 -0
- data/lib/omnizip/commands/archive_repair_command.rb +129 -0
- data/lib/omnizip/commands/archive_verify_command.rb +115 -0
- data/lib/omnizip/commands/compress_command.rb +115 -0
- data/lib/omnizip/commands/decompress_command.rb +149 -0
- data/lib/omnizip/commands/list_command.rb +51 -0
- data/lib/omnizip/commands/metadata_command.rb +215 -0
- data/lib/omnizip/commands/parity_create_command.rb +114 -0
- data/lib/omnizip/commands/parity_repair_command.rb +120 -0
- data/lib/omnizip/commands/parity_verify_command.rb +122 -0
- data/lib/omnizip/commands/profile_list_command.rb +54 -0
- data/lib/omnizip/commands/profile_show_command.rb +44 -0
- data/lib/omnizip/commands.rb +21 -0
- data/lib/omnizip/convenience.rb +389 -0
- data/lib/omnizip/converter/conversion_registry.rb +50 -0
- data/lib/omnizip/converter/conversion_strategy.rb +108 -0
- data/lib/omnizip/converter/extract_repack_strategy.rb +51 -0
- data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +43 -0
- data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +54 -0
- data/lib/omnizip/converter.rb +124 -0
- data/lib/omnizip/crypto/aes256/cipher.rb +104 -0
- data/lib/omnizip/crypto/aes256/constants.rb +28 -0
- data/lib/omnizip/crypto/aes256/key_derivation.rb +100 -0
- data/lib/omnizip/crypto/aes256.rb +102 -0
- data/lib/omnizip/crypto.rb +11 -0
- data/lib/omnizip/entry.rb +44 -0
- data/lib/omnizip/error.rb +110 -0
- data/lib/omnizip/eta/exponential_smoothing_estimator.rb +95 -0
- data/lib/omnizip/eta/moving_average_estimator.rb +96 -0
- data/lib/omnizip/eta/rate_calculator.rb +104 -0
- data/lib/omnizip/eta/sample_history.rb +143 -0
- data/lib/omnizip/eta/time_estimator.rb +106 -0
- data/lib/omnizip/eta.rb +68 -0
- data/lib/omnizip/extraction/filter_chain.rb +179 -0
- data/lib/omnizip/extraction/glob_pattern.rb +140 -0
- data/lib/omnizip/extraction/pattern_matcher.rb +66 -0
- data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
- data/lib/omnizip/extraction/regex_pattern.rb +50 -0
- data/lib/omnizip/extraction/selective_extractor.rb +247 -0
- data/lib/omnizip/extraction.rb +115 -0
- data/lib/omnizip/file_type/mime_classifier.rb +144 -0
- data/lib/omnizip/file_type.rb +117 -0
- data/lib/omnizip/filter.rb +141 -0
- data/lib/omnizip/filter_pipeline.rb +108 -0
- data/lib/omnizip/filter_registry.rb +113 -0
- data/lib/omnizip/filters/bcj.rb +277 -0
- data/lib/omnizip/filters/bcj2/constants.rb +53 -0
- data/lib/omnizip/filters/bcj2/decoder.rb +263 -0
- data/lib/omnizip/filters/bcj2/encoder.rb +58 -0
- data/lib/omnizip/filters/bcj2/stream_data.rb +91 -0
- data/lib/omnizip/filters/bcj2.rb +93 -0
- data/lib/omnizip/filters/bcj_arm.rb +174 -0
- data/lib/omnizip/filters/bcj_arm64.rb +242 -0
- data/lib/omnizip/filters/bcj_ia64.rb +194 -0
- data/lib/omnizip/filters/bcj_ppc.rb +188 -0
- data/lib/omnizip/filters/bcj_sparc.rb +174 -0
- data/lib/omnizip/filters/bcj_x86.rb +191 -0
- data/lib/omnizip/filters/delta.rb +195 -0
- data/lib/omnizip/filters/xz_delta.rb +258 -0
- data/lib/omnizip/filters.rb +20 -0
- data/lib/omnizip/format_detector.rb +166 -0
- data/lib/omnizip/formats/.keep +0 -0
- data/lib/omnizip/formats/bzip2_file.rb +159 -0
- data/lib/omnizip/formats/cpio/bounded_io.rb +66 -0
- data/lib/omnizip/formats/cpio/constants.rb +55 -0
- data/lib/omnizip/formats/cpio/entry.rb +389 -0
- data/lib/omnizip/formats/cpio/reader.rb +194 -0
- data/lib/omnizip/formats/cpio/writer.rb +232 -0
- data/lib/omnizip/formats/cpio.rb +132 -0
- data/lib/omnizip/formats/format_spec_loader.rb +228 -0
- data/lib/omnizip/formats/gzip.rb +236 -0
- data/lib/omnizip/formats/iso/directory_builder.rb +321 -0
- data/lib/omnizip/formats/iso/directory_record.rb +162 -0
- data/lib/omnizip/formats/iso/joliet.rb +204 -0
- data/lib/omnizip/formats/iso/path_table.rb +125 -0
- data/lib/omnizip/formats/iso/reader.rb +194 -0
- data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
- data/lib/omnizip/formats/iso/volume_builder.rb +319 -0
- data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
- data/lib/omnizip/formats/iso/writer.rb +543 -0
- data/lib/omnizip/formats/iso.rb +133 -0
- data/lib/omnizip/formats/lzip.rb +161 -0
- data/lib/omnizip/formats/lzma_alone.rb +149 -0
- data/lib/omnizip/formats/msi/cab_extractor.rb +181 -0
- data/lib/omnizip/formats/msi/constants.rb +157 -0
- data/lib/omnizip/formats/msi/directory_resolver.rb +188 -0
- data/lib/omnizip/formats/msi/entry.rb +134 -0
- data/lib/omnizip/formats/msi/reader.rb +301 -0
- data/lib/omnizip/formats/msi/string_pool.rb +246 -0
- data/lib/omnizip/formats/msi/table_parser.rb +244 -0
- data/lib/omnizip/formats/msi.rb +73 -0
- data/lib/omnizip/formats/ole/allocation_table.rb +263 -0
- data/lib/omnizip/formats/ole/constants.rb +61 -0
- data/lib/omnizip/formats/ole/dirent.rb +439 -0
- data/lib/omnizip/formats/ole/header.rb +199 -0
- data/lib/omnizip/formats/ole/ranges_io.rb +347 -0
- data/lib/omnizip/formats/ole/storage.rb +482 -0
- data/lib/omnizip/formats/ole/types/variant.rb +338 -0
- data/lib/omnizip/formats/ole.rb +143 -0
- data/lib/omnizip/formats/rar/archive_repairer.rb +240 -0
- data/lib/omnizip/formats/rar/archive_verifier.rb +192 -0
- data/lib/omnizip/formats/rar/block_parser.rb +282 -0
- data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
- data/lib/omnizip/formats/rar/compression/dispatcher.rb +210 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +212 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +154 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman.rb +25 -0
- data/lib/omnizip/formats/rar/compression/ppmd/context.rb +103 -0
- data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +238 -0
- data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +250 -0
- data/lib/omnizip/formats/rar/compression/ppmd.rb +16 -0
- data/lib/omnizip/formats/rar/compression.rb +17 -0
- data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
- data/lib/omnizip/formats/rar/constants.rb +88 -0
- data/lib/omnizip/formats/rar/decompressor.rb +316 -0
- data/lib/omnizip/formats/rar/external_writer.rb +311 -0
- data/lib/omnizip/formats/rar/header.rb +209 -0
- data/lib/omnizip/formats/rar/license_validator.rb +111 -0
- data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
- data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
- data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
- data/lib/omnizip/formats/rar/models.rb +14 -0
- data/lib/omnizip/formats/rar/parity_handler.rb +299 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +200 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +584 -0
- data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
- data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
- data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +96 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +162 -0
- data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/header.rb +208 -0
- data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +260 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +176 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +108 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +139 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
- data/lib/omnizip/formats/rar/rar5/vint.rb +53 -0
- data/lib/omnizip/formats/rar/rar5/writer.rb +540 -0
- data/lib/omnizip/formats/rar/rar_format_base.rb +239 -0
- data/lib/omnizip/formats/rar/reader.rb +377 -0
- data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
- data/lib/omnizip/formats/rar/volume_manager.rb +166 -0
- data/lib/omnizip/formats/rar/writer.rb +437 -0
- data/lib/omnizip/formats/rar.rb +193 -0
- data/lib/omnizip/formats/rar3/compressor.rb +71 -0
- data/lib/omnizip/formats/rar3/decompressor.rb +64 -0
- data/lib/omnizip/formats/rar3/reader.rb +107 -0
- data/lib/omnizip/formats/rar3/writer.rb +220 -0
- data/lib/omnizip/formats/rar3.rb +15 -0
- data/lib/omnizip/formats/rar5/compressor.rb +71 -0
- data/lib/omnizip/formats/rar5/decompressor.rb +64 -0
- data/lib/omnizip/formats/rar5/reader.rb +130 -0
- data/lib/omnizip/formats/rar5/writer.rb +65 -0
- data/lib/omnizip/formats/rar5.rb +15 -0
- data/lib/omnizip/formats/rpm/constants.rb +58 -0
- data/lib/omnizip/formats/rpm/entry.rb +106 -0
- data/lib/omnizip/formats/rpm/header.rb +106 -0
- data/lib/omnizip/formats/rpm/lead.rb +132 -0
- data/lib/omnizip/formats/rpm/tag.rb +228 -0
- data/lib/omnizip/formats/rpm/writer.rb +652 -0
- data/lib/omnizip/formats/rpm.rb +458 -0
- data/lib/omnizip/formats/seven_zip/bcj2_stream_decompressor.rb +274 -0
- data/lib/omnizip/formats/seven_zip/coder_chain.rb +169 -0
- data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
- data/lib/omnizip/formats/seven_zip/encoded_header.rb +110 -0
- data/lib/omnizip/formats/seven_zip/encrypted_header.rb +139 -0
- data/lib/omnizip/formats/seven_zip/file_collector.rb +143 -0
- data/lib/omnizip/formats/seven_zip/header.rb +102 -0
- data/lib/omnizip/formats/seven_zip/header_encryptor.rb +132 -0
- data/lib/omnizip/formats/seven_zip/header_writer.rb +425 -0
- data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
- data/lib/omnizip/formats/seven_zip/models/file_entry.rb +65 -0
- data/lib/omnizip/formats/seven_zip/models/folder.rb +67 -0
- data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
- data/lib/omnizip/formats/seven_zip/models.rb +20 -0
- data/lib/omnizip/formats/seven_zip/parser.rb +671 -0
- data/lib/omnizip/formats/seven_zip/reader.rb +626 -0
- data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +611 -0
- data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +308 -0
- data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
- data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +166 -0
- data/lib/omnizip/formats/seven_zip/writer.rb +801 -0
- data/lib/omnizip/formats/seven_zip.rb +179 -0
- data/lib/omnizip/formats/tar/constants.rb +73 -0
- data/lib/omnizip/formats/tar/entry.rb +98 -0
- data/lib/omnizip/formats/tar/header.rb +206 -0
- data/lib/omnizip/formats/tar/reader.rb +119 -0
- data/lib/omnizip/formats/tar/writer.rb +212 -0
- data/lib/omnizip/formats/tar.rb +74 -0
- data/lib/omnizip/formats/xar/constants.rb +119 -0
- data/lib/omnizip/formats/xar/entry.rb +268 -0
- data/lib/omnizip/formats/xar/header.rb +223 -0
- data/lib/omnizip/formats/xar/reader.rb +400 -0
- data/lib/omnizip/formats/xar/toc.rb +570 -0
- data/lib/omnizip/formats/xar/writer.rb +461 -0
- data/lib/omnizip/formats/xar.rb +145 -0
- data/lib/omnizip/formats/xz/reader.rb +121 -0
- data/lib/omnizip/formats/xz/writer.rb +416 -0
- data/lib/omnizip/formats/xz.rb +210 -0
- data/lib/omnizip/formats/xz_const.rb +49 -0
- data/lib/omnizip/formats/xz_impl/block_decoder.rb +761 -0
- data/lib/omnizip/formats/xz_impl/block_encoder.rb +304 -0
- data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
- data/lib/omnizip/formats/xz_impl/block_header_parser.rb +182 -0
- data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
- data/lib/omnizip/formats/xz_impl/index_encoder.rb +120 -0
- data/lib/omnizip/formats/xz_impl/stream_decoder.rb +470 -0
- data/lib/omnizip/formats/xz_impl/stream_encoder.rb +95 -0
- data/lib/omnizip/formats/xz_impl/stream_footer.rb +79 -0
- data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +115 -0
- data/lib/omnizip/formats/xz_impl/stream_header.rb +53 -0
- data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +106 -0
- data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
- data/lib/omnizip/formats/xz_impl.rb +52 -0
- data/lib/omnizip/formats/zip/central_directory_header.rb +223 -0
- data/lib/omnizip/formats/zip/constants.rb +69 -0
- data/lib/omnizip/formats/zip/end_of_central_directory.rb +132 -0
- data/lib/omnizip/formats/zip/local_file_header.rb +136 -0
- data/lib/omnizip/formats/zip/reader.rb +376 -0
- data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
- data/lib/omnizip/formats/zip/writer.rb +489 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +102 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +64 -0
- data/lib/omnizip/formats/zip/zip64_extra_field.rb +112 -0
- data/lib/omnizip/formats/zip.rb +50 -0
- data/lib/omnizip/formats.rb +29 -0
- data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
- data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
- data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
- data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
- data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
- data/lib/omnizip/implementations/base.rb +19 -0
- data/lib/omnizip/implementations/rust/archive.rb +93 -0
- data/lib/omnizip/implementations/rust/library.rb +221 -0
- data/lib/omnizip/implementations/rust.rb +26 -0
- data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +428 -0
- data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +456 -0
- data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +285 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +197 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +194 -0
- data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +139 -0
- data/lib/omnizip/implementations/seven_zip/lzma.rb +21 -0
- data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +56 -0
- data/lib/omnizip/implementations/seven_zip/lzma2.rb +12 -0
- data/lib/omnizip/implementations/seven_zip.rb +11 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +547 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +748 -0
- data/lib/omnizip/implementations/xz_utils/lzma2.rb +13 -0
- data/lib/omnizip/implementations/xz_utils.rb +10 -0
- data/lib/omnizip/implementations.rb +25 -0
- data/lib/omnizip/io/buffered_input.rb +147 -0
- data/lib/omnizip/io/buffered_output.rb +106 -0
- data/lib/omnizip/io/source.rb +143 -0
- data/lib/omnizip/io/stream_manager.rb +117 -0
- data/lib/omnizip/io.rb +15 -0
- data/lib/omnizip/link_handler/hard_link.rb +79 -0
- data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
- data/lib/omnizip/link_handler.rb +129 -0
- data/lib/omnizip/metadata/archive_metadata.rb +114 -0
- data/lib/omnizip/metadata/entry_metadata.rb +153 -0
- data/lib/omnizip/metadata/metadata_editor.rb +169 -0
- data/lib/omnizip/metadata/metadata_registry.rb +71 -0
- data/lib/omnizip/metadata/metadata_validator.rb +101 -0
- data/lib/omnizip/metadata.rb +58 -0
- data/lib/omnizip/models/.keep +0 -0
- data/lib/omnizip/models/algorithm_metadata.rb +41 -0
- data/lib/omnizip/models/attribute_apply.rb +40 -0
- data/lib/omnizip/models/compression_options.rb +53 -0
- data/lib/omnizip/models/conversion_options.rb +79 -0
- data/lib/omnizip/models/conversion_result.rb +141 -0
- data/lib/omnizip/models/eta_result.rb +45 -0
- data/lib/omnizip/models/extraction_rule.rb +115 -0
- data/lib/omnizip/models/filter_chain.rb +142 -0
- data/lib/omnizip/models/filter_config.rb +148 -0
- data/lib/omnizip/models/match_result.rb +141 -0
- data/lib/omnizip/models/optimization_suggestion.rb +95 -0
- data/lib/omnizip/models/parallel_options.rb +116 -0
- data/lib/omnizip/models/performance_result.rb +85 -0
- data/lib/omnizip/models/profile_report.rb +116 -0
- data/lib/omnizip/models/progress_options.rb +39 -0
- data/lib/omnizip/models/split_options.rb +116 -0
- data/lib/omnizip/optimization_registry.rb +45 -0
- data/lib/omnizip/parallel/engine.rb +52 -0
- data/lib/omnizip/parallel/job_queue.rb +209 -0
- data/lib/omnizip/parallel/job_scheduler.rb +225 -0
- data/lib/omnizip/parallel/parallel_compressor.rb +326 -0
- data/lib/omnizip/parallel/parallel_extractor.rb +238 -0
- data/lib/omnizip/parallel/thread_pool.rb +60 -0
- data/lib/omnizip/parallel/worker_pool.rb +227 -0
- data/lib/omnizip/parallel.rb +156 -0
- data/lib/omnizip/parity/chunked_block_processor.rb +194 -0
- data/lib/omnizip/parity/galois16.rb +145 -0
- data/lib/omnizip/parity/models/creator_packet.rb +71 -0
- data/lib/omnizip/parity/models/file_description_packet.rb +131 -0
- data/lib/omnizip/parity/models/ifsc_packet.rb +111 -0
- data/lib/omnizip/parity/models/main_packet.rb +126 -0
- data/lib/omnizip/parity/models/packet.rb +156 -0
- data/lib/omnizip/parity/models/packet_registry.rb +102 -0
- data/lib/omnizip/parity/models/recovery_slice_packet.rb +76 -0
- data/lib/omnizip/parity/models.rb +27 -0
- data/lib/omnizip/parity/par2_creator.rb +496 -0
- data/lib/omnizip/parity/par2_repairer.rb +409 -0
- data/lib/omnizip/parity/par2_verifier.rb +373 -0
- data/lib/omnizip/parity/par2cmdline_algorithm.rb +108 -0
- data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
- data/lib/omnizip/parity/reed_solomon_decoder.rb +263 -0
- data/lib/omnizip/parity/reed_solomon_encoder.rb +108 -0
- data/lib/omnizip/parity/reed_solomon_matrix.rb +339 -0
- data/lib/omnizip/parity.rb +207 -0
- data/lib/omnizip/password/encryption_registry.rb +26 -0
- data/lib/omnizip/password/encryption_strategy.rb +96 -0
- data/lib/omnizip/password/password_validator.rb +129 -0
- data/lib/omnizip/password/winzip_aes_strategy.rb +190 -0
- data/lib/omnizip/password/zip_crypto_strategy.rb +135 -0
- data/lib/omnizip/password.rb +88 -0
- data/lib/omnizip/pipe/stream_compressor.rb +124 -0
- data/lib/omnizip/pipe/stream_decompressor.rb +173 -0
- data/lib/omnizip/pipe.rb +120 -0
- data/lib/omnizip/platform/ntfs_streams.rb +200 -0
- data/lib/omnizip/platform.rb +189 -0
- data/lib/omnizip/profile/archive_profile.rb +36 -0
- data/lib/omnizip/profile/balanced_profile.rb +31 -0
- data/lib/omnizip/profile/binary_profile.rb +33 -0
- data/lib/omnizip/profile/compression_profile.rb +157 -0
- data/lib/omnizip/profile/custom_profile.rb +155 -0
- data/lib/omnizip/profile/fast_profile.rb +31 -0
- data/lib/omnizip/profile/maximum_profile.rb +31 -0
- data/lib/omnizip/profile/profile_detector.rb +108 -0
- data/lib/omnizip/profile/profile_registry.rb +160 -0
- data/lib/omnizip/profile/text_profile.rb +33 -0
- data/lib/omnizip/profile.rb +261 -0
- data/lib/omnizip/profiler/memory_profiler.rb +66 -0
- data/lib/omnizip/profiler/method_profiler.rb +49 -0
- data/lib/omnizip/profiler/report_generator.rb +158 -0
- data/lib/omnizip/profiler.rb +192 -0
- data/lib/omnizip/progress/callback_reporter.rb +34 -0
- data/lib/omnizip/progress/console_reporter.rb +59 -0
- data/lib/omnizip/progress/log_reporter.rb +89 -0
- data/lib/omnizip/progress/operation_progress.rb +118 -0
- data/lib/omnizip/progress/progress_bar.rb +156 -0
- data/lib/omnizip/progress/progress_reporter.rb +40 -0
- data/lib/omnizip/progress/progress_tracker.rb +215 -0
- data/lib/omnizip/progress/silent_reporter.rb +22 -0
- data/lib/omnizip/progress.rb +131 -0
- data/lib/omnizip/registry.rb +111 -0
- data/lib/omnizip/rubyzip_compat.rb +61 -0
- data/lib/omnizip/temp/safe_extract.rb +124 -0
- data/lib/omnizip/temp/temp_file.rb +123 -0
- data/lib/omnizip/temp/temp_file_pool.rb +109 -0
- data/lib/omnizip/temp.rb +184 -0
- data/lib/omnizip/version.rb +5 -0
- data/lib/omnizip/zip/entry.rb +160 -0
- data/lib/omnizip/zip/file.rb +485 -0
- data/lib/omnizip/zip/input_stream.rb +270 -0
- data/lib/omnizip/zip/output_stream.rb +320 -0
- data/lib/omnizip/zip.rb +23 -0
- data/lib/omnizip.rb +157 -0
- data/lib/tasks/msi_test_files.rake +66 -0
- data/lib/tasks/platform_gems.rake +147 -0
- data/lib/tasks/rust_backend.rake +48 -0
- data/readme-docs/advanced-features.adoc +514 -0
- data/readme-docs/api-usage.adoc +445 -0
- data/readme-docs/architecture.adoc +450 -0
- data/readme-docs/archive-formats.adoc +479 -0
- data/readme-docs/cli-usage.adoc +222 -0
- data/readme-docs/compression-algorithms.adoc +446 -0
- data/readme-docs/compression-profiles.adoc +247 -0
- data/readme-docs/encryption-checksums.adoc +328 -0
- data/readme-docs/format-converter.adoc +316 -0
- data/readme-docs/installation.adoc +228 -0
- data/readme-docs/par2-archives.adoc +608 -0
- data/readme-docs/performance-profiler.adoc +389 -0
- data/readme-docs/preprocessing-filters.adoc +280 -0
- data/vendor/libomnizip_ffi.so +0 -0
- data/xz-file-format-1.2.1.txt +1174 -0
- 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
|