Class: Omnizip::Formats::Rar::Rar5::Solid::SolidStream
- Inherits:
-
Object
- Object
- Omnizip::Formats::Rar::Rar5::Solid::SolidStream
- Defined in:
- lib/omnizip/formats/rar/rar5/solid/solid_stream.rb
Overview
Solid stream for concatenating multiple files
In solid compression, multiple files are concatenated into a single compression stream, allowing the compressor to use data from earlier files as dictionary/context for later files. This significantly improves compression ratios for similar files.
The stream maintains file boundaries and metadata to enable proper extraction while keeping all data in one continuous buffer.
Instance Attribute Summary collapse
-
#concatenated_data ⇒ String
readonly
Concatenated file data.
-
#files ⇒ Array<Hash>
readonly
File entries with metadata.
Instance Method Summary collapse
-
#add_file(filename, data, metadata = {}) ⇒ void
Add file to solid stream.
-
#clear ⇒ void
Clear all data and reset.
-
#empty? ⇒ Boolean
Check if stream is empty.
-
#extract_file_data(index) ⇒ String?
Extract file data by index.
-
#file_at(index) ⇒ Hash?
Get file entry by index.
-
#file_count ⇒ Integer
Get file count.
-
#initialize ⇒ SolidStream
constructor
Initialize solid stream.
-
#total_size ⇒ Integer
Get total size of all files.
Constructor Details
#initialize ⇒ SolidStream
Initialize solid stream
31 32 33 34 35 |
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 31 def initialize @files = [] @concatenated_data = String.new(encoding: Encoding::BINARY) @current_offset = 0 end |
Instance Attribute Details
#concatenated_data ⇒ String (readonly)
Returns Concatenated file data.
28 29 30 |
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 28 def concatenated_data @concatenated_data end |
#files ⇒ Array<Hash> (readonly)
Returns File entries with metadata.
25 26 27 |
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 25 def files @files end |
Instance Method Details
#add_file(filename, data, metadata = {}) ⇒ void
This method returns an undefined value.
Add file to solid stream
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 45 def add_file(filename, data, = {}) # Store file information file_entry = { filename: filename, offset: @current_offset, size: data.bytesize, mtime: [:mtime], stat: [:stat], } @files << file_entry # Append data to stream @concatenated_data << data # Update offset @current_offset += data.bytesize end |
#clear ⇒ void
This method returns an undefined value.
Clear all data and reset
104 105 106 107 108 |
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 104 def clear @files.clear @concatenated_data.clear @current_offset = 0 end |
#empty? ⇒ Boolean
Check if stream is empty
113 114 115 |
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 113 def empty? @files.empty? end |
#extract_file_data(index) ⇒ String?
Extract file data by index
92 93 94 95 96 97 98 99 |
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 92 def extract_file_data(index) return nil if index.negative? || index >= @files.size file = @files[index] return nil unless file @concatenated_data[file[:offset], file[:size]] end |
#file_at(index) ⇒ Hash?
Get file entry by index
82 83 84 85 86 |
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 82 def file_at(index) return nil if index.negative? || index >= @files.size @files[index] end |
#file_count ⇒ Integer
Get file count
74 75 76 |
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 74 def file_count @files.size end |
#total_size ⇒ Integer
Get total size of all files
67 68 69 |
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 67 def total_size @concatenated_data.bytesize end |