Class: Omnizip::Formats::Rar::Rar5::Solid::SolidStream

Inherits:
Object
  • Object
show all
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.

Examples:

Create solid stream with multiple files

stream = SolidStream.new
stream.add_file('file1.txt', File.binread('file1.txt'))
stream.add_file('file2.txt', File.binread('file2.txt'))
data = stream.concatenated_data

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSolidStream

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_dataString (readonly)

Returns Concatenated file data.

Returns:

  • (String)

    Concatenated file data



28
29
30
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 28

def concatenated_data
  @concatenated_data
end

#filesArray<Hash> (readonly)

Returns File entries with metadata.

Returns:

  • (Array<Hash>)

    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

Parameters:

  • filename (String)

    File name for archive

  • data (String)

    File data (binary)

  • metadata (Hash) (defaults to: {})

    Additional file metadata

Options Hash (metadata):

  • :mtime (Time)

    Modification time

  • :stat (File::Stat)

    File stat object



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

#clearvoid

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

Returns:

  • (Boolean)

    true if no files added



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

Parameters:

  • index (Integer)

    File index (0-based)

Returns:

  • (String, nil)

    File data or nil if not found



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

Parameters:

  • index (Integer)

    File index (0-based)

Returns:

  • (Hash, nil)

    File entry or nil if not found



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_countInteger

Get file count

Returns:

  • (Integer)

    Number of files



74
75
76
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 74

def file_count
  @files.size
end

#total_sizeInteger

Get total size of all files

Returns:

  • (Integer)

    Total size in bytes



67
68
69
# File 'lib/omnizip/formats/rar/rar5/solid/solid_stream.rb', line 67

def total_size
  @concatenated_data.bytesize
end