omnizip 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +32 -0
- data/.rubocop_todo.yml +754 -0
- data/COPYING +502 -0
- data/Gemfile +17 -0
- data/LICENSE +12 -0
- data/README.adoc +1045 -0
- data/Rakefile +12 -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 +91 -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 +271 -0
- data/docs/getting-started/index.adoc +42 -0
- data/docs/getting-started/installation.adoc +138 -0
- data/docs/getting-started/quick-start.adoc +185 -0
- data/docs/getting-started/your-first-archive.adoc +218 -0
- data/docs/guides/advanced-features/encryption.adoc +300 -0
- data/docs/guides/advanced-features/index.adoc +49 -0
- data/docs/guides/advanced-features/parallel-processing.adoc +246 -0
- data/docs/guides/advanced-features/progress-tracking.adoc +320 -0
- data/docs/guides/advanced-features/streaming.adoc +212 -0
- data/docs/guides/archive-formats/gzip-format.adoc +107 -0
- data/docs/guides/archive-formats/index.adoc +130 -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/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 +113 -0
- data/docs/guides/compression-algorithms/deflate.adoc +319 -0
- data/docs/guides/compression-algorithms/index.adoc +190 -0
- data/docs/guides/compression-algorithms/lzma.adoc +398 -0
- data/docs/guides/compression-algorithms/lzma2.adoc +327 -0
- data/docs/guides/compression-algorithms/ppmd.adoc +316 -0
- data/docs/guides/compression-algorithms/zstandard.adoc +361 -0
- data/docs/guides/creating-archives.adoc +354 -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 +218 -0
- data/docs/lychee.toml +67 -0
- data/docs/reference/api/overview.adoc +188 -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/troubleshooting/index.adoc +208 -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 +130 -0
- data/lib/omnizip/algorithm_registry.rb +86 -0
- data/lib/omnizip/algorithms/.keep +0 -0
- data/lib/omnizip/algorithms/bzip2/bwt.rb +225 -0
- data/lib/omnizip/algorithms/bzip2/decoder.rb +193 -0
- data/lib/omnizip/algorithms/bzip2/encoder.rb +237 -0
- data/lib/omnizip/algorithms/bzip2/huffman.rb +206 -0
- data/lib/omnizip/algorithms/bzip2/mtf.rb +101 -0
- data/lib/omnizip/algorithms/bzip2/rle.rb +151 -0
- data/lib/omnizip/algorithms/bzip2.rb +130 -0
- data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
- data/lib/omnizip/algorithms/deflate/decoder.rb +38 -0
- data/lib/omnizip/algorithms/deflate/encoder.rb +46 -0
- data/lib/omnizip/algorithms/deflate.rb +128 -0
- data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
- data/lib/omnizip/algorithms/deflate64/decoder.rb +153 -0
- data/lib/omnizip/algorithms/deflate64/encoder.rb +98 -0
- data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +354 -0
- data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +142 -0
- data/lib/omnizip/algorithms/deflate64.rb +109 -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 +148 -0
- data/lib/omnizip/algorithms/lzma/dictionary.rb +69 -0
- data/lib/omnizip/algorithms/lzma/distance_coder.rb +415 -0
- data/lib/omnizip/algorithms/lzma/encoder.rb +142 -0
- data/lib/omnizip/algorithms/lzma/length_coder.rb +260 -0
- data/lib/omnizip/algorithms/lzma/literal_decoder.rb +320 -0
- data/lib/omnizip/algorithms/lzma/literal_encoder.rb +210 -0
- data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +341 -0
- data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +192 -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 +205 -0
- data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
- data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +88 -0
- data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +130 -0
- data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
- data/lib/omnizip/algorithms/lzma/range_coder.rb +85 -0
- data/lib/omnizip/algorithms/lzma/range_decoder.rb +434 -0
- data/lib/omnizip/algorithms/lzma/range_encoder.rb +194 -0
- data/lib/omnizip/algorithms/lzma/state.rb +127 -0
- data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +325 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder.rb +426 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +645 -0
- data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +227 -0
- data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +169 -0
- data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +261 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +331 -0
- data/lib/omnizip/algorithms/lzma/xz_state.rb +116 -0
- data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +2055 -0
- data/lib/omnizip/algorithms/lzma.rb +238 -0
- data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +182 -0
- data/lib/omnizip/algorithms/lzma2/constants.rb +41 -0
- data/lib/omnizip/algorithms/lzma2/encoder.rb +147 -0
- data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +161 -0
- data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
- data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +127 -0
- data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
- data/lib/omnizip/algorithms/lzma2.rb +141 -0
- data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
- data/lib/omnizip/algorithms/ppmd7/context.rb +154 -0
- data/lib/omnizip/algorithms/ppmd7/decoder.rb +126 -0
- data/lib/omnizip/algorithms/ppmd7/encoder.rb +163 -0
- data/lib/omnizip/algorithms/ppmd7/model.rb +248 -0
- data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
- data/lib/omnizip/algorithms/ppmd7.rb +116 -0
- data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
- data/lib/omnizip/algorithms/ppmd8/context.rb +34 -0
- data/lib/omnizip/algorithms/ppmd8/decoder.rb +107 -0
- data/lib/omnizip/algorithms/ppmd8/encoder.rb +138 -0
- data/lib/omnizip/algorithms/ppmd8/model.rb +250 -0
- data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
- data/lib/omnizip/algorithms/ppmd8.rb +82 -0
- data/lib/omnizip/algorithms/ppmd_base.rb +138 -0
- data/lib/omnizip/algorithms/sevenzip_lzma2.rb +123 -0
- data/lib/omnizip/algorithms/xz_lzma2.rb +118 -0
- data/lib/omnizip/algorithms/zstandard/constants.rb +25 -0
- data/lib/omnizip/algorithms/zstandard/decoder.rb +46 -0
- data/lib/omnizip/algorithms/zstandard/encoder.rb +51 -0
- data/lib/omnizip/algorithms/zstandard.rb +138 -0
- data/lib/omnizip/buffer/memory_archive.rb +251 -0
- data/lib/omnizip/buffer/memory_extractor.rb +224 -0
- data/lib/omnizip/buffer.rb +176 -0
- data/lib/omnizip/checksum_registry.rb +114 -0
- data/lib/omnizip/checksums/crc32.rb +100 -0
- data/lib/omnizip/checksums/crc64.rb +101 -0
- data/lib/omnizip/checksums/crc_base.rb +158 -0
- data/lib/omnizip/checksums/verifier.rb +131 -0
- data/lib/omnizip/chunked/memory_manager.rb +194 -0
- data/lib/omnizip/chunked/reader.rb +78 -0
- data/lib/omnizip/chunked/writer.rb +120 -0
- data/lib/omnizip/chunked.rb +129 -0
- data/lib/omnizip/cli/output_formatter.rb +104 -0
- data/lib/omnizip/cli.rb +572 -0
- data/lib/omnizip/commands/.keep +0 -0
- data/lib/omnizip/commands/archive_create_command.rb +427 -0
- data/lib/omnizip/commands/archive_extract_command.rb +272 -0
- data/lib/omnizip/commands/archive_list_command.rb +218 -0
- data/lib/omnizip/commands/archive_repair_command.rb +131 -0
- data/lib/omnizip/commands/archive_verify_command.rb +117 -0
- data/lib/omnizip/commands/compress_command.rb +117 -0
- data/lib/omnizip/commands/decompress_command.rb +120 -0
- data/lib/omnizip/commands/list_command.rb +53 -0
- data/lib/omnizip/commands/metadata_command.rb +153 -0
- data/lib/omnizip/commands/parity_create_command.rb +122 -0
- data/lib/omnizip/commands/parity_repair_command.rb +122 -0
- data/lib/omnizip/commands/parity_verify_command.rb +124 -0
- data/lib/omnizip/commands/profile_list_command.rb +56 -0
- data/lib/omnizip/commands/profile_show_command.rb +44 -0
- data/lib/omnizip/convenience.rb +359 -0
- data/lib/omnizip/converter/conversion_registry.rb +49 -0
- data/lib/omnizip/converter/conversion_strategy.rb +121 -0
- data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +97 -0
- data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +112 -0
- data/lib/omnizip/converter.rb +105 -0
- data/lib/omnizip/crypto/aes256/cipher.rb +100 -0
- data/lib/omnizip/crypto/aes256/constants.rb +28 -0
- data/lib/omnizip/crypto/aes256/key_derivation.rb +101 -0
- data/lib/omnizip/crypto/aes256.rb +102 -0
- data/lib/omnizip/error.rb +106 -0
- data/lib/omnizip/eta/exponential_smoothing_estimator.rb +98 -0
- data/lib/omnizip/eta/moving_average_estimator.rb +99 -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 +63 -0
- data/lib/omnizip/extraction/filter_chain.rb +177 -0
- data/lib/omnizip/extraction/glob_pattern.rb +140 -0
- data/lib/omnizip/extraction/pattern_matcher.rb +70 -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 +240 -0
- data/lib/omnizip/extraction.rb +111 -0
- data/lib/omnizip/file_type/mime_classifier.rb +144 -0
- data/lib/omnizip/file_type.rb +113 -0
- data/lib/omnizip/filter.rb +139 -0
- data/lib/omnizip/filter_pipeline.rb +108 -0
- data/lib/omnizip/filter_registry.rb +166 -0
- data/lib/omnizip/filters/bcj.rb +279 -0
- data/lib/omnizip/filters/bcj2/constants.rb +53 -0
- data/lib/omnizip/filters/bcj2/decoder.rb +200 -0
- data/lib/omnizip/filters/bcj2/encoder.rb +61 -0
- data/lib/omnizip/filters/bcj2/stream_data.rb +93 -0
- data/lib/omnizip/filters/bcj2.rb +99 -0
- data/lib/omnizip/filters/bcj_arm.rb +176 -0
- data/lib/omnizip/filters/bcj_arm64.rb +244 -0
- data/lib/omnizip/filters/bcj_ia64.rb +196 -0
- data/lib/omnizip/filters/bcj_ppc.rb +190 -0
- data/lib/omnizip/filters/bcj_sparc.rb +176 -0
- data/lib/omnizip/filters/bcj_x86.rb +193 -0
- data/lib/omnizip/filters/delta.rb +196 -0
- data/lib/omnizip/filters/filter_base.rb +72 -0
- data/lib/omnizip/filters/registry.rb +123 -0
- data/lib/omnizip/filters/xz_delta.rb +258 -0
- data/lib/omnizip/format_detector.rb +162 -0
- data/lib/omnizip/format_registry.rb +59 -0
- data/lib/omnizip/formats/.keep +0 -0
- data/lib/omnizip/formats/bzip2_file.rb +172 -0
- data/lib/omnizip/formats/cpio/constants.rb +55 -0
- data/lib/omnizip/formats/cpio/entry.rb +385 -0
- data/lib/omnizip/formats/cpio/reader.rb +196 -0
- data/lib/omnizip/formats/cpio/writer.rb +234 -0
- data/lib/omnizip/formats/cpio.rb +140 -0
- data/lib/omnizip/formats/format_spec_loader.rb +230 -0
- data/lib/omnizip/formats/gzip.rb +238 -0
- data/lib/omnizip/formats/iso/directory_builder.rb +297 -0
- data/lib/omnizip/formats/iso/directory_record.rb +152 -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 +197 -0
- data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
- data/lib/omnizip/formats/iso/volume_builder.rb +320 -0
- data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
- data/lib/omnizip/formats/iso/writer.rb +530 -0
- data/lib/omnizip/formats/iso.rb +140 -0
- data/lib/omnizip/formats/lzip.rb +175 -0
- data/lib/omnizip/formats/lzma_alone.rb +171 -0
- data/lib/omnizip/formats/rar/archive_repairer.rb +243 -0
- data/lib/omnizip/formats/rar/archive_verifier.rb +195 -0
- data/lib/omnizip/formats/rar/block_parser.rb +243 -0
- data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
- data/lib/omnizip/formats/rar/compression/dispatcher.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +216 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +158 -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/ppmd/context.rb +105 -0
- data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +219 -0
- data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +262 -0
- data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
- data/lib/omnizip/formats/rar/constants.rb +82 -0
- data/lib/omnizip/formats/rar/decompressor.rb +238 -0
- data/lib/omnizip/formats/rar/external_writer.rb +312 -0
- data/lib/omnizip/formats/rar/header.rb +192 -0
- data/lib/omnizip/formats/rar/license_validator.rb +109 -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/parity_handler.rb +292 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +202 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +578 -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 +97 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +166 -0
- data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/header.rb +187 -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 +264 -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 +194 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +109 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +142 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
- data/lib/omnizip/formats/rar/rar5/vint.rb +65 -0
- data/lib/omnizip/formats/rar/rar5/writer.rb +466 -0
- data/lib/omnizip/formats/rar/rar_format_base.rb +241 -0
- data/lib/omnizip/formats/rar/reader.rb +366 -0
- data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
- data/lib/omnizip/formats/rar/volume_manager.rb +168 -0
- data/lib/omnizip/formats/rar/writer.rb +431 -0
- data/lib/omnizip/formats/rar.rb +205 -0
- data/lib/omnizip/formats/rar3/compressor.rb +73 -0
- data/lib/omnizip/formats/rar3/decompressor.rb +66 -0
- data/lib/omnizip/formats/rar3/reader.rb +386 -0
- data/lib/omnizip/formats/rar3/writer.rb +219 -0
- data/lib/omnizip/formats/rar5/compressor.rb +73 -0
- data/lib/omnizip/formats/rar5/decompressor.rb +66 -0
- data/lib/omnizip/formats/rar5/reader.rb +342 -0
- data/lib/omnizip/formats/rar5/writer.rb +214 -0
- data/lib/omnizip/formats/seven_zip/coder_chain.rb +150 -0
- data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
- data/lib/omnizip/formats/seven_zip/encoded_header.rb +114 -0
- data/lib/omnizip/formats/seven_zip/encrypted_header.rb +142 -0
- data/lib/omnizip/formats/seven_zip/file_collector.rb +144 -0
- data/lib/omnizip/formats/seven_zip/header.rb +106 -0
- data/lib/omnizip/formats/seven_zip/header_encryptor.rb +134 -0
- data/lib/omnizip/formats/seven_zip/header_writer.rb +466 -0
- data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
- data/lib/omnizip/formats/seven_zip/models/file_entry.rb +58 -0
- data/lib/omnizip/formats/seven_zip/models/folder.rb +69 -0
- data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
- data/lib/omnizip/formats/seven_zip/parser.rb +660 -0
- data/lib/omnizip/formats/seven_zip/reader.rb +458 -0
- data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +632 -0
- data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +315 -0
- data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
- data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +162 -0
- data/lib/omnizip/formats/seven_zip/writer.rb +740 -0
- data/lib/omnizip/formats/seven_zip.rb +93 -0
- data/lib/omnizip/formats/tar/constants.rb +73 -0
- data/lib/omnizip/formats/tar/entry.rb +94 -0
- data/lib/omnizip/formats/tar/header.rb +168 -0
- data/lib/omnizip/formats/tar/reader.rb +121 -0
- data/lib/omnizip/formats/tar/writer.rb +216 -0
- data/lib/omnizip/formats/tar.rb +84 -0
- data/lib/omnizip/formats/xz/reader.rb +116 -0
- data/lib/omnizip/formats/xz.rb +237 -0
- data/lib/omnizip/formats/xz_impl/block_decoder.rb +754 -0
- data/lib/omnizip/formats/xz_impl/block_encoder.rb +306 -0
- data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
- data/lib/omnizip/formats/xz_impl/block_header_parser.rb +186 -0
- data/lib/omnizip/formats/xz_impl/constants.rb +49 -0
- data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
- data/lib/omnizip/formats/xz_impl/index_encoder.rb +122 -0
- data/lib/omnizip/formats/xz_impl/stream_decoder.rb +468 -0
- data/lib/omnizip/formats/xz_impl/stream_encoder.rb +99 -0
- data/lib/omnizip/formats/xz_impl/stream_footer.rb +81 -0
- data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +117 -0
- data/lib/omnizip/formats/xz_impl/stream_header.rb +55 -0
- data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +108 -0
- data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
- data/lib/omnizip/formats/xz_impl/writer.rb +421 -0
- data/lib/omnizip/formats/zip/central_directory_header.rb +195 -0
- data/lib/omnizip/formats/zip/constants.rb +69 -0
- data/lib/omnizip/formats/zip/end_of_central_directory.rb +133 -0
- data/lib/omnizip/formats/zip/local_file_header.rb +138 -0
- data/lib/omnizip/formats/zip/reader.rb +250 -0
- data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
- data/lib/omnizip/formats/zip/writer.rb +375 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +104 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +66 -0
- data/lib/omnizip/formats/zip/zip64_extra_field.rb +114 -0
- data/lib/omnizip/formats/zip.rb +50 -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/seven_zip/lzma/decoder.rb +421 -0
- data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +465 -0
- data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +288 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +200 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +197 -0
- data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +141 -0
- data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +519 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +723 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +750 -0
- data/lib/omnizip/io/buffered_input.rb +146 -0
- data/lib/omnizip/io/buffered_output.rb +105 -0
- data/lib/omnizip/io/stream_manager.rb +115 -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 +124 -0
- data/lib/omnizip/metadata/archive_metadata.rb +114 -0
- data/lib/omnizip/metadata/entry_metadata.rb +146 -0
- data/lib/omnizip/metadata/metadata_editor.rb +171 -0
- data/lib/omnizip/metadata/metadata_registry.rb +64 -0
- data/lib/omnizip/metadata/metadata_validator.rb +99 -0
- data/lib/omnizip/metadata.rb +57 -0
- data/lib/omnizip/models/.keep +0 -0
- data/lib/omnizip/models/algorithm_metadata.rb +73 -0
- data/lib/omnizip/models/compression_options.rb +71 -0
- data/lib/omnizip/models/conversion_options.rb +87 -0
- data/lib/omnizip/models/conversion_result.rb +135 -0
- data/lib/omnizip/models/eta_result.rb +46 -0
- data/lib/omnizip/models/extraction_rule.rb +115 -0
- data/lib/omnizip/models/filter_chain.rb +144 -0
- data/lib/omnizip/models/filter_config.rb +183 -0
- data/lib/omnizip/models/match_result.rb +124 -0
- data/lib/omnizip/models/optimization_suggestion.rb +91 -0
- data/lib/omnizip/models/parallel_options.rb +104 -0
- data/lib/omnizip/models/performance_result.rb +79 -0
- data/lib/omnizip/models/profile_report.rb +82 -0
- data/lib/omnizip/models/progress_options.rb +38 -0
- data/lib/omnizip/models/split_options.rb +116 -0
- data/lib/omnizip/optimization_registry.rb +81 -0
- data/lib/omnizip/parallel/job_queue.rb +209 -0
- data/lib/omnizip/parallel/job_scheduler.rb +203 -0
- data/lib/omnizip/parallel/parallel_compressor.rb +347 -0
- data/lib/omnizip/parallel/parallel_extractor.rb +329 -0
- data/lib/omnizip/parallel/worker_pool.rb +223 -0
- data/lib/omnizip/parallel.rb +149 -0
- data/lib/omnizip/parity/chunked_block_processor.rb +196 -0
- data/lib/omnizip/parity/galois16.rb +145 -0
- data/lib/omnizip/parity/models/creator_packet.rb +73 -0
- data/lib/omnizip/parity/models/file_description_packet.rb +133 -0
- data/lib/omnizip/parity/models/ifsc_packet.rb +123 -0
- data/lib/omnizip/parity/models/main_packet.rb +128 -0
- data/lib/omnizip/parity/models/packet.rb +156 -0
- data/lib/omnizip/parity/models/packet_registry.rb +109 -0
- data/lib/omnizip/parity/models/recovery_slice_packet.rb +78 -0
- data/lib/omnizip/parity/par2_creator.rb +531 -0
- data/lib/omnizip/parity/par2_repairer.rb +407 -0
- data/lib/omnizip/parity/par2_verifier.rb +364 -0
- data/lib/omnizip/parity/par2cmdline_algorithm.rb +110 -0
- data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
- data/lib/omnizip/parity/reed_solomon_decoder.rb +266 -0
- data/lib/omnizip/parity/reed_solomon_encoder.rb +111 -0
- data/lib/omnizip/parity/reed_solomon_matrix.rb +342 -0
- data/lib/omnizip/parity.rb +186 -0
- data/lib/omnizip/password/encryption_registry.rb +65 -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 +192 -0
- data/lib/omnizip/password/zip_crypto_strategy.rb +141 -0
- data/lib/omnizip/password.rb +87 -0
- data/lib/omnizip/pipe/stream_compressor.rb +124 -0
- data/lib/omnizip/pipe/stream_decompressor.rb +174 -0
- data/lib/omnizip/pipe.rb +121 -0
- data/lib/omnizip/platform/ntfs_streams.rb +201 -0
- data/lib/omnizip/platform.rb +189 -0
- data/lib/omnizip/profile/archive_profile.rb +39 -0
- data/lib/omnizip/profile/balanced_profile.rb +33 -0
- data/lib/omnizip/profile/binary_profile.rb +36 -0
- data/lib/omnizip/profile/compression_profile.rb +158 -0
- data/lib/omnizip/profile/custom_profile.rb +157 -0
- data/lib/omnizip/profile/fast_profile.rb +33 -0
- data/lib/omnizip/profile/maximum_profile.rb +33 -0
- data/lib/omnizip/profile/profile_detector.rb +110 -0
- data/lib/omnizip/profile/profile_registry.rb +161 -0
- data/lib/omnizip/profile/text_profile.rb +36 -0
- data/lib/omnizip/profile.rb +190 -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 +169 -0
- data/lib/omnizip/profiler.rb +204 -0
- data/lib/omnizip/progress/callback_reporter.rb +36 -0
- data/lib/omnizip/progress/console_reporter.rb +62 -0
- data/lib/omnizip/progress/log_reporter.rb +91 -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 +190 -0
- data/lib/omnizip/progress/silent_reporter.rb +24 -0
- data/lib/omnizip/progress.rb +127 -0
- data/lib/omnizip/rubyzip_compat.rb +63 -0
- data/lib/omnizip/temp/safe_extract.rb +168 -0
- data/lib/omnizip/temp/temp_file.rb +124 -0
- data/lib/omnizip/temp/temp_file_pool.rb +109 -0
- data/lib/omnizip/temp.rb +181 -0
- data/lib/omnizip/version.rb +5 -0
- data/lib/omnizip/zip/entry.rb +156 -0
- data/lib/omnizip/zip/file.rb +485 -0
- data/lib/omnizip/zip/input_stream.rb +273 -0
- data/lib/omnizip/zip/output_stream.rb +324 -0
- data/lib/omnizip.rb +156 -0
- data/readme-docs/advanced-features.adoc +515 -0
- data/readme-docs/api-usage.adoc +444 -0
- data/readme-docs/architecture.adoc +449 -0
- data/readme-docs/archive-formats.adoc +479 -0
- data/readme-docs/cli-usage.adoc +222 -0
- data/readme-docs/compression-algorithms.adoc +442 -0
- data/readme-docs/compression-profiles.adoc +247 -0
- data/readme-docs/encryption-checksums.adoc +328 -0
- data/readme-docs/format-converter.adoc +325 -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/xz-file-format-1.2.1.txt +1174 -0
- metadata +617 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "constants"
|
|
4
|
+
|
|
5
|
+
module Omnizip
|
|
6
|
+
module Formats
|
|
7
|
+
module Rar
|
|
8
|
+
# RAR header parser
|
|
9
|
+
# Parses RAR4 and RAR5 archive headers
|
|
10
|
+
class Header
|
|
11
|
+
include Constants
|
|
12
|
+
|
|
13
|
+
attr_reader :version, :flags, :is_multi_volume, :is_solid,
|
|
14
|
+
:is_locked, :comment_present
|
|
15
|
+
|
|
16
|
+
# Read and parse RAR header
|
|
17
|
+
#
|
|
18
|
+
# @param io [IO] Input stream
|
|
19
|
+
# @return [Header] Parsed header
|
|
20
|
+
# @raise [RuntimeError] if invalid header
|
|
21
|
+
def self.read(io)
|
|
22
|
+
new.tap { |h| h.parse(io) }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Initialize header
|
|
26
|
+
def initialize
|
|
27
|
+
@version = nil
|
|
28
|
+
@flags = 0
|
|
29
|
+
@is_multi_volume = false
|
|
30
|
+
@is_solid = false
|
|
31
|
+
@is_locked = false
|
|
32
|
+
@comment_present = false
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Parse header from IO
|
|
36
|
+
#
|
|
37
|
+
# @param io [IO] Input stream
|
|
38
|
+
# @raise [RuntimeError] if invalid header
|
|
39
|
+
def parse(io)
|
|
40
|
+
# RAR4 signature is 7 bytes, RAR5 is 8 bytes
|
|
41
|
+
# Read 7 bytes first to check for RAR4
|
|
42
|
+
signature = io.read(7)
|
|
43
|
+
return unless signature
|
|
44
|
+
|
|
45
|
+
sig_bytes = signature.bytes
|
|
46
|
+
|
|
47
|
+
if sig_bytes == RAR4_SIGNATURE
|
|
48
|
+
@version = 4
|
|
49
|
+
parse_rar4_header(io)
|
|
50
|
+
elsif sig_bytes == RAR5_SIGNATURE[0..6]
|
|
51
|
+
# Might be RAR5, read one more byte
|
|
52
|
+
extra_byte = io.read(1)
|
|
53
|
+
if extra_byte && (sig_bytes + extra_byte.bytes) == RAR5_SIGNATURE
|
|
54
|
+
@version = 5
|
|
55
|
+
parse_rar5_header(io)
|
|
56
|
+
else
|
|
57
|
+
raise "Invalid RAR signature: #{(sig_bytes + (extra_byte&.bytes || [])).inspect}"
|
|
58
|
+
end
|
|
59
|
+
else
|
|
60
|
+
raise "Invalid RAR signature: #{sig_bytes.inspect}"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Check if header is valid
|
|
65
|
+
#
|
|
66
|
+
# @return [Boolean] true if valid
|
|
67
|
+
def valid?
|
|
68
|
+
!@version.nil?
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Check if RAR5 format
|
|
72
|
+
#
|
|
73
|
+
# @return [Boolean] true if RAR5
|
|
74
|
+
def rar5?
|
|
75
|
+
@version == 5
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Check if RAR4 format
|
|
79
|
+
#
|
|
80
|
+
# @return [Boolean] true if RAR4
|
|
81
|
+
def rar4?
|
|
82
|
+
@version == 4
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
private
|
|
86
|
+
|
|
87
|
+
# Parse RAR4 header
|
|
88
|
+
#
|
|
89
|
+
# @param io [IO] Input stream
|
|
90
|
+
def parse_rar4_header(io)
|
|
91
|
+
# Read marker block
|
|
92
|
+
read_uint16(io)
|
|
93
|
+
head_type = io.read(1)&.ord
|
|
94
|
+
read_uint16(io)
|
|
95
|
+
read_uint16(io)
|
|
96
|
+
|
|
97
|
+
unless head_type == BLOCK_MARKER
|
|
98
|
+
raise "Expected marker block, got 0x#{head_type.to_s(16)}"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Read archive header
|
|
102
|
+
read_uint16(io)
|
|
103
|
+
head_type = io.read(1)&.ord
|
|
104
|
+
head_flags = read_uint16(io)
|
|
105
|
+
head_size = read_uint16(io)
|
|
106
|
+
|
|
107
|
+
unless head_type == BLOCK_ARCHIVE
|
|
108
|
+
raise "Expected archive block, got 0x#{head_type.to_s(16)}"
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
@flags = head_flags
|
|
112
|
+
@is_multi_volume = head_flags.anybits?(ARCHIVE_VOLUME)
|
|
113
|
+
@is_solid = head_flags.anybits?(ARCHIVE_SOLID)
|
|
114
|
+
@is_locked = head_flags.anybits?(ARCHIVE_LOCKED)
|
|
115
|
+
@comment_present = head_flags.anybits?(ARCHIVE_COMMENT)
|
|
116
|
+
|
|
117
|
+
# Skip rest of archive header
|
|
118
|
+
# head_size includes TYPE(1) + FLAGS(2) + SIZE(2) = 5 bytes already read
|
|
119
|
+
remaining = head_size - 5
|
|
120
|
+
io.read(remaining) if remaining.positive?
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Parse RAR5 header
|
|
124
|
+
#
|
|
125
|
+
# @param io [IO] Input stream
|
|
126
|
+
def parse_rar5_header(io)
|
|
127
|
+
# RAR5 uses variable-length integer encoding
|
|
128
|
+
read_uint32(io)
|
|
129
|
+
read_vint(io)
|
|
130
|
+
header_type = read_vint(io)
|
|
131
|
+
header_flags = read_vint(io)
|
|
132
|
+
|
|
133
|
+
unless header_type == RAR5_HEADER_MAIN
|
|
134
|
+
raise "Expected main header, got #{header_type}"
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
@flags = header_flags
|
|
138
|
+
@is_multi_volume = header_flags.anybits?(RAR5_FLAG_MULTI_VOLUME)
|
|
139
|
+
|
|
140
|
+
# Read extra area if present
|
|
141
|
+
return unless header_flags.anybits?(RAR5_FLAG_EXTRA_AREA)
|
|
142
|
+
|
|
143
|
+
extra_size = read_vint(io)
|
|
144
|
+
io.read(extra_size) if extra_size.positive?
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Read 16-bit unsigned integer (little-endian)
|
|
148
|
+
#
|
|
149
|
+
# @param io [IO] Input stream
|
|
150
|
+
# @return [Integer] Value
|
|
151
|
+
def read_uint16(io)
|
|
152
|
+
bytes = io.read(2)
|
|
153
|
+
return 0 unless bytes&.size == 2
|
|
154
|
+
|
|
155
|
+
bytes.unpack1("v")
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# Read 32-bit unsigned integer (little-endian)
|
|
159
|
+
#
|
|
160
|
+
# @param io [IO] Input stream
|
|
161
|
+
# @return [Integer] Value
|
|
162
|
+
def read_uint32(io)
|
|
163
|
+
bytes = io.read(4)
|
|
164
|
+
return 0 unless bytes&.size == 4
|
|
165
|
+
|
|
166
|
+
bytes.unpack1("V")
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# Read variable-length integer (RAR5)
|
|
170
|
+
#
|
|
171
|
+
# @param io [IO] Input stream
|
|
172
|
+
# @return [Integer] Value
|
|
173
|
+
def read_vint(io)
|
|
174
|
+
result = 0
|
|
175
|
+
shift = 0
|
|
176
|
+
|
|
177
|
+
loop do
|
|
178
|
+
byte = io.read(1)&.ord
|
|
179
|
+
return result unless byte
|
|
180
|
+
|
|
181
|
+
result |= (byte & 0x7F) << shift
|
|
182
|
+
break if byte.nobits?(0x80)
|
|
183
|
+
|
|
184
|
+
shift += 7
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
result
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Formats
|
|
5
|
+
module Rar
|
|
6
|
+
# Validates WinRAR license ownership
|
|
7
|
+
#
|
|
8
|
+
# This class ensures users confirm they own a valid WinRAR license
|
|
9
|
+
# before allowing RAR archive creation, as RAR compression is proprietary.
|
|
10
|
+
class LicenseValidator
|
|
11
|
+
class << self
|
|
12
|
+
# Check if user has confirmed license ownership
|
|
13
|
+
#
|
|
14
|
+
# @return [Boolean] true if license confirmed
|
|
15
|
+
def license_confirmed?
|
|
16
|
+
File.exist?(license_file_path) && valid_confirmation?
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Prompt user to confirm license and save confirmation
|
|
20
|
+
#
|
|
21
|
+
# @return [Boolean] true if user confirms
|
|
22
|
+
def confirm_license!
|
|
23
|
+
return true if license_confirmed?
|
|
24
|
+
|
|
25
|
+
puts "\n#{'=' * 70}"
|
|
26
|
+
puts "RAR License Confirmation Required"
|
|
27
|
+
puts "=" * 70
|
|
28
|
+
puts
|
|
29
|
+
puts "RAR compression is proprietary and requires a WinRAR license."
|
|
30
|
+
puts "By proceeding, you confirm that you own a valid WinRAR license."
|
|
31
|
+
puts
|
|
32
|
+
puts "License information:"
|
|
33
|
+
puts " - License can be purchased at: https://www.rarlab.com/"
|
|
34
|
+
puts " - Price: ~$29 for single user license"
|
|
35
|
+
puts " - License is perpetual (no subscription)"
|
|
36
|
+
puts
|
|
37
|
+
print "Do you own a valid WinRAR license? (yes/no): "
|
|
38
|
+
|
|
39
|
+
response = $stdin.gets&.strip&.downcase
|
|
40
|
+
|
|
41
|
+
if response == "yes"
|
|
42
|
+
save_confirmation
|
|
43
|
+
puts "\nLicense confirmed. You can now create RAR archives."
|
|
44
|
+
true
|
|
45
|
+
else
|
|
46
|
+
puts "\nRAR creation requires a valid license."
|
|
47
|
+
puts "Consider using 7z format as a free alternative."
|
|
48
|
+
false
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Reset license confirmation
|
|
53
|
+
#
|
|
54
|
+
# This removes the saved confirmation file
|
|
55
|
+
def reset_confirmation
|
|
56
|
+
FileUtils.rm_f(license_file_path)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
# Get path to license confirmation file
|
|
62
|
+
#
|
|
63
|
+
# @return [String] Path to confirmation file
|
|
64
|
+
def license_file_path
|
|
65
|
+
config_dir = File.join(Dir.home, ".omnizip")
|
|
66
|
+
FileUtils.mkdir_p(config_dir)
|
|
67
|
+
File.join(config_dir, "rar_license_confirmed")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Save license confirmation
|
|
71
|
+
def save_confirmation
|
|
72
|
+
File.write(license_file_path, confirmation_data)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Validate saved confirmation
|
|
76
|
+
#
|
|
77
|
+
# @return [Boolean] true if confirmation is valid
|
|
78
|
+
def valid_confirmation?
|
|
79
|
+
data = File.read(license_file_path)
|
|
80
|
+
data.include?("CONFIRMED") && data.include?(Time.now.year.to_s)
|
|
81
|
+
rescue StandardError
|
|
82
|
+
false
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Generate confirmation data
|
|
86
|
+
#
|
|
87
|
+
# @return [String] Confirmation data
|
|
88
|
+
def confirmation_data
|
|
89
|
+
<<~CONF
|
|
90
|
+
WinRAR License Confirmation
|
|
91
|
+
Confirmed at: #{Time.now.iso8601}
|
|
92
|
+
Year: #{Time.now.year}
|
|
93
|
+
User: #{ENV['USER'] || ENV['USERNAME'] || 'unknown'}
|
|
94
|
+
Hostname: #{begin
|
|
95
|
+
Socket.gethostname
|
|
96
|
+
rescue StandardError
|
|
97
|
+
'unknown'
|
|
98
|
+
end}
|
|
99
|
+
Status: CONFIRMED
|
|
100
|
+
|
|
101
|
+
This file indicates that the user has confirmed ownership
|
|
102
|
+
of a valid WinRAR license for creating RAR archives.
|
|
103
|
+
CONF
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Formats
|
|
5
|
+
module Rar
|
|
6
|
+
module Models
|
|
7
|
+
# Represents a RAR archive with metadata
|
|
8
|
+
class RarArchive
|
|
9
|
+
attr_accessor :path, :version, :flags, :volumes, :entries,
|
|
10
|
+
:total_size, :compressed_size, :is_multi_volume,
|
|
11
|
+
:comment, :has_recovery, :recovery_percent,
|
|
12
|
+
:recovery_files
|
|
13
|
+
|
|
14
|
+
# Initialize RAR archive
|
|
15
|
+
#
|
|
16
|
+
# @param path [String] Path to RAR archive
|
|
17
|
+
def initialize(path)
|
|
18
|
+
@path = path
|
|
19
|
+
@version = nil
|
|
20
|
+
@flags = 0
|
|
21
|
+
@volumes = []
|
|
22
|
+
@entries = []
|
|
23
|
+
@total_size = 0
|
|
24
|
+
@compressed_size = 0
|
|
25
|
+
@is_multi_volume = false
|
|
26
|
+
@comment = nil
|
|
27
|
+
@has_recovery = false
|
|
28
|
+
@recovery_percent = 0
|
|
29
|
+
@recovery_files = []
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Check if archive has recovery records
|
|
33
|
+
#
|
|
34
|
+
# @return [Boolean] true if recovery available
|
|
35
|
+
def has_recovery_records?
|
|
36
|
+
@has_recovery || @recovery_files.any?
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Get recovery file paths
|
|
40
|
+
#
|
|
41
|
+
# @return [Array<String>] Paths to .rev files
|
|
42
|
+
def recovery_file_paths
|
|
43
|
+
@recovery_files
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Check if archive is multi-volume
|
|
47
|
+
#
|
|
48
|
+
# @return [Boolean] true if multi-volume archive
|
|
49
|
+
def multi_volume?
|
|
50
|
+
@is_multi_volume
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Get total number of volumes
|
|
54
|
+
#
|
|
55
|
+
# @return [Integer] Number of volumes
|
|
56
|
+
def total_volumes
|
|
57
|
+
@volumes.size
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Get RAR format version string
|
|
61
|
+
#
|
|
62
|
+
# @return [String] Version string (RAR4 or RAR5)
|
|
63
|
+
def format_version
|
|
64
|
+
@version == 5 ? "RAR5" : "RAR4"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Get total number of entries
|
|
68
|
+
#
|
|
69
|
+
# @return [Integer] Number of entries
|
|
70
|
+
def entry_count
|
|
71
|
+
@entries.size
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Formats
|
|
5
|
+
module Rar
|
|
6
|
+
module Models
|
|
7
|
+
# Represents a file entry in RAR archive
|
|
8
|
+
# Contains file metadata and extraction information
|
|
9
|
+
class RarEntry
|
|
10
|
+
attr_accessor :name, :size, :compressed_size, :crc, :is_dir,
|
|
11
|
+
:host_os, :mtime, :attributes, :method,
|
|
12
|
+
:version, :flags, :volume_index, :split_before,
|
|
13
|
+
:split_after, :encrypted
|
|
14
|
+
|
|
15
|
+
# Initialize RAR entry
|
|
16
|
+
def initialize
|
|
17
|
+
@name = nil
|
|
18
|
+
@size = 0
|
|
19
|
+
@compressed_size = 0
|
|
20
|
+
@crc = nil
|
|
21
|
+
@is_dir = false
|
|
22
|
+
@host_os = 0
|
|
23
|
+
@mtime = nil
|
|
24
|
+
@attributes = nil
|
|
25
|
+
@method = 0
|
|
26
|
+
@version = 0
|
|
27
|
+
@flags = 0
|
|
28
|
+
@volume_index = 0
|
|
29
|
+
@split_before = false
|
|
30
|
+
@split_after = false
|
|
31
|
+
@encrypted = false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Check if entry is a directory
|
|
35
|
+
#
|
|
36
|
+
# @return [Boolean] true if directory
|
|
37
|
+
def directory?
|
|
38
|
+
@is_dir
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Check if entry is a file
|
|
42
|
+
#
|
|
43
|
+
# @return [Boolean] true if regular file
|
|
44
|
+
def file?
|
|
45
|
+
!@is_dir
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Check if entry is encrypted
|
|
49
|
+
#
|
|
50
|
+
# @return [Boolean] true if encrypted
|
|
51
|
+
def encrypted?
|
|
52
|
+
@encrypted
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Check if entry spans volumes
|
|
56
|
+
#
|
|
57
|
+
# @return [Boolean] true if split across volumes
|
|
58
|
+
def split?
|
|
59
|
+
@split_before || @split_after
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Formats
|
|
5
|
+
module Rar
|
|
6
|
+
module Models
|
|
7
|
+
# Represents a RAR volume in a multi-volume set
|
|
8
|
+
class RarVolume
|
|
9
|
+
attr_accessor :path, :volume_number, :is_first, :is_last,
|
|
10
|
+
:size, :archive_flags
|
|
11
|
+
|
|
12
|
+
# Initialize RAR volume
|
|
13
|
+
#
|
|
14
|
+
# @param path [String] Path to volume file
|
|
15
|
+
# @param volume_number [Integer] Volume number (0-based)
|
|
16
|
+
def initialize(path, volume_number = 0)
|
|
17
|
+
@path = path
|
|
18
|
+
@volume_number = volume_number
|
|
19
|
+
@is_first = false
|
|
20
|
+
@is_last = false
|
|
21
|
+
@size = nil
|
|
22
|
+
@archive_flags = 0
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Check if this is the first volume
|
|
26
|
+
#
|
|
27
|
+
# @return [Boolean] true if first volume
|
|
28
|
+
def first?
|
|
29
|
+
@is_first
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Check if this is the last volume
|
|
33
|
+
#
|
|
34
|
+
# @return [Boolean] true if last volume
|
|
35
|
+
def last?
|
|
36
|
+
@is_last
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Get volume file size
|
|
40
|
+
#
|
|
41
|
+
# @return [Integer] File size in bytes
|
|
42
|
+
def file_size
|
|
43
|
+
@file_size ||= File.size(@path)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Check if file exists
|
|
47
|
+
#
|
|
48
|
+
# @return [Boolean] true if volume file exists
|
|
49
|
+
def exist?
|
|
50
|
+
File.exist?(@path)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|