omnizip 0.4.7-aarch64-linux
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,112 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Formats
|
|
5
|
+
module Zip
|
|
6
|
+
# ZIP64 Extended Information Extra Field
|
|
7
|
+
# Used in local/central headers when sizes exceed 32-bit limits
|
|
8
|
+
class Zip64ExtraField
|
|
9
|
+
include Omnizip::Formats::Zip::Constants
|
|
10
|
+
|
|
11
|
+
attr_accessor :tag, :size, :uncompressed_size, :compressed_size,
|
|
12
|
+
:relative_header_offset, :disk_start_number
|
|
13
|
+
|
|
14
|
+
def initialize(
|
|
15
|
+
tag: ZIP64_EXTRA_FIELD_TAG,
|
|
16
|
+
uncompressed_size: nil,
|
|
17
|
+
compressed_size: nil,
|
|
18
|
+
relative_header_offset: nil,
|
|
19
|
+
disk_start_number: nil
|
|
20
|
+
)
|
|
21
|
+
@tag = tag
|
|
22
|
+
@uncompressed_size = uncompressed_size
|
|
23
|
+
@compressed_size = compressed_size
|
|
24
|
+
@relative_header_offset = relative_header_offset
|
|
25
|
+
@disk_start_number = disk_start_number
|
|
26
|
+
@size = calculate_size
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Serialize to binary format
|
|
30
|
+
def to_binary
|
|
31
|
+
@size = calculate_size
|
|
32
|
+
data = [tag, size].pack("vv")
|
|
33
|
+
|
|
34
|
+
# Fields are included in the order they're needed
|
|
35
|
+
# based on which values in the regular header are 0xFFFFFFFF
|
|
36
|
+
data << [uncompressed_size].pack("Q") if uncompressed_size
|
|
37
|
+
data << [compressed_size].pack("Q") if compressed_size
|
|
38
|
+
data << [relative_header_offset].pack("Q") if relative_header_offset
|
|
39
|
+
data << [disk_start_number].pack("V") if disk_start_number
|
|
40
|
+
|
|
41
|
+
data
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Parse from binary data
|
|
45
|
+
# needs_uncompressed, needs_compressed, needs_offset, needs_disk specify
|
|
46
|
+
# which fields should be present based on the regular header values
|
|
47
|
+
def self.from_binary(data, needs_uncompressed: false, needs_compressed: false,
|
|
48
|
+
needs_offset: false, needs_disk: false)
|
|
49
|
+
tag, = data.unpack("vv")
|
|
50
|
+
|
|
51
|
+
unless tag == ZIP64_EXTRA_FIELD_TAG
|
|
52
|
+
raise Omnizip::FormatError,
|
|
53
|
+
"Invalid ZIP64 extra field tag"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
offset = 4 # After tag and size
|
|
57
|
+
uncompressed_size = nil
|
|
58
|
+
compressed_size = nil
|
|
59
|
+
relative_header_offset = nil
|
|
60
|
+
disk_start_number = nil
|
|
61
|
+
|
|
62
|
+
# Read fields in order based on what's needed
|
|
63
|
+
if needs_uncompressed && offset + 8 <= data.bytesize
|
|
64
|
+
uncompressed_size = data[offset, 8].unpack1("Q")
|
|
65
|
+
offset += 8
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
if needs_compressed && offset + 8 <= data.bytesize
|
|
69
|
+
compressed_size = data[offset, 8].unpack1("Q")
|
|
70
|
+
offset += 8
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
if needs_offset && offset + 8 <= data.bytesize
|
|
74
|
+
relative_header_offset = data[offset, 8].unpack1("Q")
|
|
75
|
+
offset += 8
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
if needs_disk && offset + 4 <= data.bytesize
|
|
79
|
+
disk_start_number = data[offset, 4].unpack1("V")
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
new(
|
|
83
|
+
tag: tag,
|
|
84
|
+
uncompressed_size: uncompressed_size,
|
|
85
|
+
compressed_size: compressed_size,
|
|
86
|
+
relative_header_offset: relative_header_offset,
|
|
87
|
+
disk_start_number: disk_start_number,
|
|
88
|
+
)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Check if this extra field is needed
|
|
92
|
+
def self.needed?(uncompressed_size: 0, compressed_size: 0, offset: 0)
|
|
93
|
+
uncompressed_size >= ZIP64_LIMIT ||
|
|
94
|
+
compressed_size >= ZIP64_LIMIT ||
|
|
95
|
+
offset >= ZIP64_LIMIT
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
private
|
|
99
|
+
|
|
100
|
+
# Calculate the size field value
|
|
101
|
+
def calculate_size
|
|
102
|
+
size = 0
|
|
103
|
+
size += 8 if uncompressed_size
|
|
104
|
+
size += 8 if compressed_size
|
|
105
|
+
size += 8 if relative_header_offset
|
|
106
|
+
size += 4 if disk_start_number
|
|
107
|
+
size
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Formats
|
|
5
|
+
# ZIP archive format implementation
|
|
6
|
+
module Zip
|
|
7
|
+
# Nested classes - autoloaded
|
|
8
|
+
autoload :Constants, "omnizip/formats/zip/constants"
|
|
9
|
+
autoload :LocalFileHeader, "omnizip/formats/zip/local_file_header"
|
|
10
|
+
autoload :CentralDirectoryHeader,
|
|
11
|
+
"omnizip/formats/zip/central_directory_header"
|
|
12
|
+
autoload :EndOfCentralDirectory,
|
|
13
|
+
"omnizip/formats/zip/end_of_central_directory"
|
|
14
|
+
autoload :Zip64EndOfCentralDirectory,
|
|
15
|
+
"omnizip/formats/zip/zip64_end_of_central_directory"
|
|
16
|
+
autoload :Zip64EndOfCentralDirectoryLocator,
|
|
17
|
+
"omnizip/formats/zip/zip64_end_of_central_directory_locator"
|
|
18
|
+
autoload :Zip64ExtraField, "omnizip/formats/zip/zip64_extra_field"
|
|
19
|
+
autoload :Reader, "omnizip/formats/zip/reader"
|
|
20
|
+
autoload :Writer, "omnizip/formats/zip/writer"
|
|
21
|
+
autoload :UnixExtraField, "omnizip/formats/zip/unix_extra_field"
|
|
22
|
+
|
|
23
|
+
class << self
|
|
24
|
+
# Read a ZIP archive
|
|
25
|
+
def read(file_path)
|
|
26
|
+
Reader.new(file_path).read
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Create a ZIP archive
|
|
30
|
+
def create(file_path, &block)
|
|
31
|
+
writer = Writer.new(file_path)
|
|
32
|
+
yield(writer) if block
|
|
33
|
+
writer
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Extract a ZIP archive
|
|
37
|
+
def extract(file_path, output_dir)
|
|
38
|
+
reader = read(file_path)
|
|
39
|
+
reader.extract_all(output_dir)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# List entries in a ZIP archive
|
|
43
|
+
def list(file_path)
|
|
44
|
+
reader = read(file_path)
|
|
45
|
+
reader.list_entries
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Formats
|
|
5
|
+
autoload :FormatSpecLoader, "omnizip/formats/format_spec_loader"
|
|
6
|
+
|
|
7
|
+
autoload :SevenZip, "omnizip/formats/seven_zip"
|
|
8
|
+
autoload :Zip, "omnizip/formats/zip"
|
|
9
|
+
autoload :Rar, "omnizip/formats/rar"
|
|
10
|
+
autoload :Rar3, "omnizip/formats/rar3"
|
|
11
|
+
autoload :Rar5, "omnizip/formats/rar5"
|
|
12
|
+
autoload :Tar, "omnizip/formats/tar"
|
|
13
|
+
autoload :Gzip, "omnizip/formats/gzip"
|
|
14
|
+
autoload :Bzip2File, "omnizip/formats/bzip2_file"
|
|
15
|
+
autoload :Xz, "omnizip/formats/xz"
|
|
16
|
+
|
|
17
|
+
autoload :Cpio, "omnizip/formats/cpio"
|
|
18
|
+
autoload :Rpm, "omnizip/formats/rpm"
|
|
19
|
+
autoload :Ole, "omnizip/formats/ole"
|
|
20
|
+
autoload :Msi, "omnizip/formats/msi"
|
|
21
|
+
autoload :Xar, "omnizip/formats/xar"
|
|
22
|
+
autoload :Iso, "omnizip/formats/iso"
|
|
23
|
+
autoload :LzmaAlone, "omnizip/formats/lzma_alone"
|
|
24
|
+
autoload :Lzip, "omnizip/formats/lzip"
|
|
25
|
+
|
|
26
|
+
autoload :XzConst, "omnizip/formats/xz_const"
|
|
27
|
+
autoload :XzImpl, "omnizip/formats/xz_impl"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2025 Ribose Inc.
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
6
|
+
# copy of this software and associated documentation files (the "Software"),
|
|
7
|
+
# to deal in the Software without restriction, including without limitation
|
|
8
|
+
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
9
|
+
# and/or sell copies of the Software, and to permit persons to whom the
|
|
10
|
+
# Software is furnished to do so, subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
|
13
|
+
# all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
20
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
21
|
+
# DEALINGS IN THE SOFTWARE.
|
|
22
|
+
|
|
23
|
+
module Omnizip
|
|
24
|
+
module Implementations
|
|
25
|
+
module Base
|
|
26
|
+
# Abstract base class for LZMA2 decoders.
|
|
27
|
+
#
|
|
28
|
+
# This class defines the common interface and shared functionality
|
|
29
|
+
# for all LZMA2 decoder implementations (XZ Utils, 7-Zip, etc.).
|
|
30
|
+
#
|
|
31
|
+
# Subclasses must implement the {#decode} method.
|
|
32
|
+
#
|
|
33
|
+
# @abstract Subclasses must implement {#decode}
|
|
34
|
+
class LZMA2DecoderBase
|
|
35
|
+
attr_reader :dict_size
|
|
36
|
+
|
|
37
|
+
# Initialize the LZMA2 decoder.
|
|
38
|
+
#
|
|
39
|
+
# @param input [IO] Input stream of compressed data
|
|
40
|
+
# @param options [Hash] Decoding options
|
|
41
|
+
# @option options [Integer] :dict_size Dictionary size (read from properties)
|
|
42
|
+
def initialize(input, options = {})
|
|
43
|
+
@input = input
|
|
44
|
+
# Dictionary size will be read from LZMA2 property byte by subclasses
|
|
45
|
+
@dict_size = options.fetch(:dict_size, nil)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Decode LZMA2 compressed data.
|
|
49
|
+
#
|
|
50
|
+
# Subclasses must implement this method to provide the specific
|
|
51
|
+
# decoding logic for their implementation (XZ Utils, 7-Zip, etc.).
|
|
52
|
+
#
|
|
53
|
+
# @param output [IO] Output stream for decompressed data
|
|
54
|
+
# @raise [NotImplementedError] Always raised in base class
|
|
55
|
+
# @return [void]
|
|
56
|
+
def decode(output = nil)
|
|
57
|
+
raise NotImplementedError,
|
|
58
|
+
"#{self.class} must implement #decode"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Get the implementation identifier.
|
|
62
|
+
#
|
|
63
|
+
# Subclasses must implement this to return a symbol identifying
|
|
64
|
+
# their implementation (e.g., :xz_utils, :seven_zip).
|
|
65
|
+
#
|
|
66
|
+
# @raise [NotImplementedError] Always raised in base class
|
|
67
|
+
# @return [Symbol] Implementation identifier
|
|
68
|
+
def implementation_name
|
|
69
|
+
raise NotImplementedError,
|
|
70
|
+
"#{self.class} must implement #implementation_name"
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2025 Ribose Inc.
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
6
|
+
# copy of this software and associated documentation files (the "Software"),
|
|
7
|
+
# to deal in the Software without restriction, including without limitation
|
|
8
|
+
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
9
|
+
# and/or sell copies of the Software, and to permit persons to whom the
|
|
10
|
+
# Software is furnished to do so, subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
|
13
|
+
# all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
20
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
21
|
+
# DEALINGS IN THE SOFTWARE.
|
|
22
|
+
|
|
23
|
+
module Omnizip
|
|
24
|
+
module Implementations
|
|
25
|
+
module Base
|
|
26
|
+
# Abstract base class for LZMA2 encoders.
|
|
27
|
+
#
|
|
28
|
+
# This class defines the common interface and shared functionality
|
|
29
|
+
# for all LZMA2 encoder implementations (XZ Utils, 7-Zip, etc.).
|
|
30
|
+
#
|
|
31
|
+
# LZMA2 is an improved version of LZMA that supports:
|
|
32
|
+
# - Uncompressed chunks for incompressible data
|
|
33
|
+
# - Dictionary/state resets for better compression
|
|
34
|
+
# - Simpler chunk format
|
|
35
|
+
#
|
|
36
|
+
# Subclasses must implement the {#encode} method.
|
|
37
|
+
#
|
|
38
|
+
# @abstract Subclasses must implement {#encode}
|
|
39
|
+
class LZMA2EncoderBase
|
|
40
|
+
attr_reader :dict_size, :lc, :lp, :pb
|
|
41
|
+
|
|
42
|
+
# Maximum uncompressed size per LZMA2 chunk (2MB)
|
|
43
|
+
UNCOMPRESSED_MAX = 1 << 21
|
|
44
|
+
# Maximum compressed size per LZMA2 chunk (64KB)
|
|
45
|
+
COMPRESSED_MAX = 1 << 16
|
|
46
|
+
|
|
47
|
+
# Initialize the LZMA2 encoder.
|
|
48
|
+
#
|
|
49
|
+
# @param options [Hash] Encoding options
|
|
50
|
+
# @option options [Integer] :dict_size Dictionary size (default: 8MB)
|
|
51
|
+
# @option options [Integer] :lc Literal context bits (default: 3)
|
|
52
|
+
# @option options [Integer] :lp Literal position bits (default: 0)
|
|
53
|
+
# @option options [Integer] :pb Position bits (default: 2)
|
|
54
|
+
# @option options [Boolean] :standalone Write property byte at start (default: true)
|
|
55
|
+
def initialize(options = {})
|
|
56
|
+
@dict_size = options.fetch(:dict_size, 8 * 1024 * 1024)
|
|
57
|
+
@lc = options.fetch(:lc, 3)
|
|
58
|
+
@lp = options.fetch(:lp, 0)
|
|
59
|
+
@pb = options.fetch(:pb, 2)
|
|
60
|
+
@standalone = options.fetch(:standalone, true)
|
|
61
|
+
|
|
62
|
+
validate_parameters!
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Encode data using LZMA2.
|
|
66
|
+
#
|
|
67
|
+
# Subclasses must implement this method to provide the specific
|
|
68
|
+
# encoding logic for their implementation (XZ Utils, 7-Zip, etc.).
|
|
69
|
+
#
|
|
70
|
+
# @param data [String] Input data to compress
|
|
71
|
+
# @raise [NotImplementedError] Always raised in base class
|
|
72
|
+
# @return [String] Compressed data
|
|
73
|
+
def encode(data)
|
|
74
|
+
raise NotImplementedError,
|
|
75
|
+
"#{self.class} must implement #encode"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Get the implementation identifier.
|
|
79
|
+
#
|
|
80
|
+
# Subclasses must implement this to return a symbol identifying
|
|
81
|
+
# their implementation (e.g., :xz_utils, :seven_zip).
|
|
82
|
+
#
|
|
83
|
+
# @raise [NotImplementedError] Always raised in base class
|
|
84
|
+
# @return [Symbol] Implementation identifier
|
|
85
|
+
def implementation_name
|
|
86
|
+
raise NotImplementedError,
|
|
87
|
+
"#{self.class} must implement #implementation_name"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Check if standalone mode is enabled.
|
|
91
|
+
#
|
|
92
|
+
# @return [Boolean] true if property byte should be written
|
|
93
|
+
def standalone?
|
|
94
|
+
@standalone
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
private
|
|
98
|
+
|
|
99
|
+
# Validate LZMA2 parameters.
|
|
100
|
+
#
|
|
101
|
+
# @raise [ArgumentError] If any parameter is out of valid range
|
|
102
|
+
# @return [void]
|
|
103
|
+
def validate_parameters!
|
|
104
|
+
unless @lc.between?(0, 8)
|
|
105
|
+
raise ArgumentError, "lc must be between 0 and 8, got #{@lc}"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
unless @lp.between?(0, 4)
|
|
109
|
+
raise ArgumentError, "lp must be between 0 and 4, got #{@lp}"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
unless @pb.between?(0, 4)
|
|
113
|
+
raise ArgumentError, "pb must be between 0 and 4, got #{@pb}"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# LZMA2 dictionary size constraints (from XZ Utils)
|
|
117
|
+
min_dict = 4096
|
|
118
|
+
max_dict = 1 << 28
|
|
119
|
+
|
|
120
|
+
unless @dict_size.between?(min_dict, max_dict)
|
|
121
|
+
raise ArgumentError,
|
|
122
|
+
"dict_size must be between #{min_dict} and #{max_dict}, got #{@dict_size}"
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2025 Ribose Inc.
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
6
|
+
# copy of this software and associated documentation files (the "Software"),
|
|
7
|
+
# to deal in the Software without restriction, including without limitation
|
|
8
|
+
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
9
|
+
# and/or sell copies of the Software, and to permit persons to whom the
|
|
10
|
+
# Software is furnished to do so, subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
|
13
|
+
# all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
20
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
21
|
+
# DEALINGS IN THE SOFTWARE.
|
|
22
|
+
|
|
23
|
+
module Omnizip
|
|
24
|
+
module Implementations
|
|
25
|
+
module Base
|
|
26
|
+
# Abstract base class for LZMA decoders.
|
|
27
|
+
#
|
|
28
|
+
# This class defines the common interface and shared functionality
|
|
29
|
+
# for all LZMA decoder implementations (XZ Utils, 7-Zip SDK, etc.).
|
|
30
|
+
#
|
|
31
|
+
# Subclasses must implement the {#decode_stream} method.
|
|
32
|
+
#
|
|
33
|
+
# @abstract Subclasses must implement {#decode_stream}
|
|
34
|
+
class LZMADecoderBase
|
|
35
|
+
attr_reader :lc, :lp, :pb, :dict_size, :uncompressed_size, :input
|
|
36
|
+
|
|
37
|
+
# Initialize the LZMA decoder.
|
|
38
|
+
#
|
|
39
|
+
# @param input [IO] Input stream of compressed data
|
|
40
|
+
# @param options [Hash] Decoding options
|
|
41
|
+
# @option options [Integer] :lc Literal context bits (read from header)
|
|
42
|
+
# @option options [Integer] :lp Literal position bits (read from header)
|
|
43
|
+
# @option options [Integer] :pb Position bits (read from header)
|
|
44
|
+
# @option options [Integer] :dict_size Dictionary size (read from header)
|
|
45
|
+
# @option options [Integer] :uncompressed_size Uncompressed size
|
|
46
|
+
def initialize(input, options = {})
|
|
47
|
+
@input = input
|
|
48
|
+
# Parameters will be read from LZMA header by subclasses
|
|
49
|
+
@lc = options.fetch(:lc, nil)
|
|
50
|
+
@lp = options.fetch(:lp, nil)
|
|
51
|
+
@pb = options.fetch(:pb, nil)
|
|
52
|
+
@dict_size = options.fetch(:dict_size, nil)
|
|
53
|
+
@uncompressed_size = options.fetch(:uncompressed_size, nil)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Decode a stream of compressed data.
|
|
57
|
+
#
|
|
58
|
+
# Subclasses must implement this method to provide the specific
|
|
59
|
+
# decoding logic for their implementation (XZ Utils, 7-Zip, etc.).
|
|
60
|
+
#
|
|
61
|
+
# @param output [IO] Output stream for decompressed data
|
|
62
|
+
# @raise [NotImplementedError] Always raised in base class
|
|
63
|
+
# @return [void]
|
|
64
|
+
def decode_stream(output = nil)
|
|
65
|
+
raise NotImplementedError,
|
|
66
|
+
"#{self.class} must implement #decode_stream"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Get the implementation identifier.
|
|
70
|
+
#
|
|
71
|
+
# Subclasses must implement this to return a symbol identifying
|
|
72
|
+
# their implementation (e.g., :xz_utils, :seven_zip).
|
|
73
|
+
#
|
|
74
|
+
# @raise [NotImplementedError] Always raised in base class
|
|
75
|
+
# @return [Symbol] Implementation identifier
|
|
76
|
+
def implementation_name
|
|
77
|
+
raise NotImplementedError,
|
|
78
|
+
"#{self.class} must implement #implementation_name"
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2025 Ribose Inc.
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
6
|
+
# copy of this software and associated documentation files (the "Software"),
|
|
7
|
+
# to deal in the Software without restriction, including without limitation
|
|
8
|
+
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
9
|
+
# and/or sell copies of the Software, and to permit persons to whom the
|
|
10
|
+
# Software is furnished to do so, subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
|
13
|
+
# all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
20
|
+
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
21
|
+
# DEALINGS IN THE SOFTWARE.
|
|
22
|
+
|
|
23
|
+
module Omnizip
|
|
24
|
+
module Implementations
|
|
25
|
+
module Base
|
|
26
|
+
# Abstract base class for LZMA encoders.
|
|
27
|
+
#
|
|
28
|
+
# This class defines the common interface and shared functionality
|
|
29
|
+
# for all LZMA encoder implementations (XZ Utils, 7-Zip SDK, etc.).
|
|
30
|
+
#
|
|
31
|
+
# Subclasses must implement the {#encode_stream} method.
|
|
32
|
+
#
|
|
33
|
+
# @abstract Subclasses must implement {#encode_stream}
|
|
34
|
+
class LZMAEncoderBase
|
|
35
|
+
attr_reader :lc, :lp, :pb, :dict_size, :output
|
|
36
|
+
|
|
37
|
+
# Initialize the LZMA encoder.
|
|
38
|
+
#
|
|
39
|
+
# @param output [IO] Output stream for compressed data
|
|
40
|
+
# @param options [Hash] Encoding options
|
|
41
|
+
# @option options [Integer] :lc Literal context bits (0-8, default: 3)
|
|
42
|
+
# @option options [Integer] :lp Literal position bits (0-4, default: 0)
|
|
43
|
+
# @option options [Integer] :pb Position bits (0-4, default: 2)
|
|
44
|
+
# @option options [Integer] :dict_size Dictionary size (default: 64KB)
|
|
45
|
+
# @raise [ArgumentError] If parameters are invalid
|
|
46
|
+
def initialize(output, options = {})
|
|
47
|
+
@output = output
|
|
48
|
+
@lc = options.fetch(:lc, 3)
|
|
49
|
+
@lp = options.fetch(:lp, 0)
|
|
50
|
+
@pb = options.fetch(:pb, 2)
|
|
51
|
+
@dict_size = options.fetch(:dict_size, 1 << 16) # 64KB default
|
|
52
|
+
|
|
53
|
+
validate_parameters!
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Encode a stream of data.
|
|
57
|
+
#
|
|
58
|
+
# Subclasses must implement this method to provide the specific
|
|
59
|
+
# encoding logic for their implementation (XZ Utils, 7-Zip, etc.).
|
|
60
|
+
#
|
|
61
|
+
# @param data [String] Input data to compress
|
|
62
|
+
# @raise [NotImplementedError] Always raised in base class
|
|
63
|
+
# @return [void]
|
|
64
|
+
def encode_stream(data)
|
|
65
|
+
raise NotImplementedError,
|
|
66
|
+
"#{self.class} must implement #encode_stream"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Get the implementation identifier.
|
|
70
|
+
#
|
|
71
|
+
# Subclasses must implement this to return a symbol identifying
|
|
72
|
+
# their implementation (e.g., :xz_utils, :seven_zip).
|
|
73
|
+
#
|
|
74
|
+
# @raise [NotImplementedError] Always raised in base class
|
|
75
|
+
# @return [Symbol] Implementation identifier
|
|
76
|
+
def implementation_name
|
|
77
|
+
raise NotImplementedError,
|
|
78
|
+
"#{self.class} must implement #implementation_name"
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
private
|
|
82
|
+
|
|
83
|
+
# Validate LZMA parameters.
|
|
84
|
+
#
|
|
85
|
+
# @raise [ArgumentError] If any parameter is out of valid range
|
|
86
|
+
# @return [void]
|
|
87
|
+
def validate_parameters!
|
|
88
|
+
unless @lc.between?(0, 8)
|
|
89
|
+
raise ArgumentError, "lc must be between 0 and 8, got #{@lc}"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
unless @lp.between?(0, 4)
|
|
93
|
+
raise ArgumentError, "lp must be between 0 and 4, got #{@lp}"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
unless @pb.between?(0, 4)
|
|
97
|
+
raise ArgumentError, "pb must be between 0 and 4, got #{@pb}"
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
unless @dict_size.between?(4096, 1 << 28)
|
|
101
|
+
raise ArgumentError,
|
|
102
|
+
"dict_size must be between 4096 and 268435456, got #{@dict_size}"
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|