Class: Cabriolet::CAB::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/cabriolet/cab/parser.rb

Overview

Parser reads and parses CAB file headers

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(io_system) ⇒ Parser

Initialize a new parser

Parameters:



12
13
14
# File 'lib/cabriolet/cab/parser.rb', line 12

def initialize(io_system)
  @io_system = io_system
end

Instance Attribute Details

#io_systemObject (readonly)

Returns the value of attribute io_system.



7
8
9
# File 'lib/cabriolet/cab/parser.rb', line 7

def io_system
  @io_system
end

Instance Method Details

#parse(filename) ⇒ Models::Cabinet

Parse a CAB file and return a Cabinet model

Parameters:

  • filename (String)

    Path to the CAB file

Returns:

Raises:



21
22
23
24
25
26
# File 'lib/cabriolet/cab/parser.rb', line 21

def parse(filename)
  handle = @io_system.open(filename, Constants::MODE_READ)
  cabinet = parse_handle(handle, filename)
  @io_system.close(handle)
  cabinet
end

#parse_handle(handle, filename, offset = 0, salvage = false, quiet = false) ⇒ Models::Cabinet

Parse a CAB from an already-open handle

Parameters:

  • handle (System::FileHandle, System::MemoryHandle)

    Open handle

  • filename (String)

    Filename for reference

  • offset (Integer) (defaults to: 0)

    Offset in file where cabinet starts

  • salvage (Boolean) (defaults to: false)

    Enable salvage mode for corrupted files

  • quiet (Boolean) (defaults to: false)

    Suppress error messages

Returns:

Raises:



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/cabriolet/cab/parser.rb', line 37

def parse_handle(handle, filename, offset = 0, salvage = false,
quiet = false)
  @salvage = salvage
  @quiet = quiet

  cabinet = Models::Cabinet.new(filename)
  cabinet.base_offset = offset

  # Seek to cabinet start
  @io_system.seek(handle, offset, Constants::SEEK_START)

  # Read and validate header
  header, folder_resv = read_header(handle, cabinet)
  validate_header(header)
  populate_cabinet_from_header(handle, cabinet, header)

  # Read folders
  read_folders(handle, cabinet, header, folder_resv)

  # Read files
  read_files(handle, cabinet, header, salvage)

  cabinet
end