Class: Cabriolet::Models::WinHelpHeader

Inherits:
Object
  • Object
show all
Defined in:
lib/cabriolet/models/winhelp_header.rb

Overview

Windows Help (WinHelp) file header model

Represents the metadata of a Windows Help file (WinHelp 3.x or 4.x). WinHelp files contain an internal file system with |SYSTEM, |TOPIC, and other internal files.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(version: :winhelp3, magic: 0, directory_offset: 0, free_list_offset: 0, file_size: 0, filename: nil) ⇒ WinHelpHeader

Initialize WinHelp header

Parameters:

  • version (Symbol) (defaults to: :winhelp3)

    :winhelp3 or :winhelp4

  • magic (Integer) (defaults to: 0)

    Magic number

  • directory_offset (Integer) (defaults to: 0)

    Offset to internal file directory

  • free_list_offset (Integer) (defaults to: 0)

    Offset to free list

  • file_size (Integer) (defaults to: 0)

    Total file size

  • filename (String, nil) (defaults to: nil)

    Original filename



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/cabriolet/models/winhelp_header.rb', line 28

def initialize(
  version: :winhelp3,
  magic: 0,
  directory_offset: 0,
  free_list_offset: 0,
  file_size: 0,
  filename: nil
)
  @version = version
  @magic = magic
  @directory_offset = directory_offset
  @free_list_offset = free_list_offset
  @file_size = file_size
  @filename = filename

  @internal_files = []
  @system_data = nil
end

Instance Attribute Details

#directory_offsetObject

:winhelp3 or :winhelp4 # Magic number (0x35F3 or 0x3F5F0000)



11
12
13
# File 'lib/cabriolet/models/winhelp_header.rb', line 11

def directory_offset
  @directory_offset
end

#file_sizeObject

:winhelp3 or :winhelp4 # Magic number (0x35F3 or 0x3F5F0000)



11
12
13
# File 'lib/cabriolet/models/winhelp_header.rb', line 11

def file_size
  @file_size
end

#filenameObject

:winhelp3 or :winhelp4 # Magic number (0x35F3 or 0x3F5F0000)



11
12
13
# File 'lib/cabriolet/models/winhelp_header.rb', line 11

def filename
  @filename
end

#free_list_offsetObject

:winhelp3 or :winhelp4 # Magic number (0x35F3 or 0x3F5F0000)



11
12
13
# File 'lib/cabriolet/models/winhelp_header.rb', line 11

def free_list_offset
  @free_list_offset
end

#internal_filesObject

Internal files in the help file Array of hashes: { filename:, file_size:, starting_block: }



15
16
17
# File 'lib/cabriolet/models/winhelp_header.rb', line 15

def internal_files
  @internal_files
end

#magicObject

:winhelp3 or :winhelp4 # Magic number (0x35F3 or 0x3F5F0000)



11
12
13
# File 'lib/cabriolet/models/winhelp_header.rb', line 11

def magic
  @magic
end

#system_dataObject

Parsed |SYSTEM file data (if extracted)



18
19
20
# File 'lib/cabriolet/models/winhelp_header.rb', line 18

def system_data
  @system_data
end

#versionObject

:winhelp3 or :winhelp4 # Magic number (0x35F3 or 0x3F5F0000)



11
12
13
# File 'lib/cabriolet/models/winhelp_header.rb', line 11

def version
  @version
end

Instance Method Details

#find_file(name) ⇒ Hash?

Find internal file by name

Parameters:

  • name (String)

    Internal filename (e.g., “|SYSTEM”)

Returns:

  • (Hash, nil)

    File entry or nil if not found



86
87
88
# File 'lib/cabriolet/models/winhelp_header.rb', line 86

def find_file(name)
  @internal_files.find { |f| f[:filename] == name }
end

#has_system_file?Boolean

Check if |SYSTEM file exists

Returns:

  • (Boolean)

    true if |SYSTEM file present



93
94
95
# File 'lib/cabriolet/models/winhelp_header.rb', line 93

def has_system_file?
  !find_file("|SYSTEM").nil?
end

#has_topic_file?Boolean

Check if |TOPIC file exists

Returns:

  • (Boolean)

    true if |TOPIC file present



100
101
102
# File 'lib/cabriolet/models/winhelp_header.rb', line 100

def has_topic_file?
  !find_file("|TOPIC").nil?
end

#internal_filenamesArray<String>

Get list of internal filenames

Returns:

  • (Array<String>)

    Internal file names



78
79
80
# File 'lib/cabriolet/models/winhelp_header.rb', line 78

def internal_filenames
  @internal_files.map { |f| f[:filename] }
end

#magic_hexString

Get magic number as hex string

Returns:

  • (String)

    Hex representation of magic



121
122
123
124
# File 'lib/cabriolet/models/winhelp_header.rb', line 121

def magic_hex
  magic_int = @magic.respond_to?(:to_i) ? @magic.to_i : @magic.to_int
  "0x#{magic_int.to_s(16).upcase}"
end

#valid?Boolean

Check if header is valid

Returns:

  • (Boolean)

    true if header appears valid



50
51
52
53
54
55
56
57
58
59
# File 'lib/cabriolet/models/winhelp_header.rb', line 50

def valid?
  case @version
  when :winhelp3
    @magic == 0x35F3
  when :winhelp4
    (@magic & 0xFFFF) == 0x3F5F
  else
    false
  end
end

#version_stringString

Get version string

Returns:

  • (String)

    Human-readable version



107
108
109
110
111
112
113
114
115
116
# File 'lib/cabriolet/models/winhelp_header.rb', line 107

def version_string
  case @version
  when :winhelp3
    "Windows Help 3.x (16-bit)"
  when :winhelp4
    "Windows Help 4.x (32-bit)"
  else
    "Unknown"
  end
end

#winhelp3?Boolean

Check if this is WinHelp 3.x format

Returns:

  • (Boolean)

    true if WinHelp 3.x



64
65
66
# File 'lib/cabriolet/models/winhelp_header.rb', line 64

def winhelp3?
  @version == :winhelp3
end

#winhelp4?Boolean

Check if this is WinHelp 4.x format

Returns:

  • (Boolean)

    true if WinHelp 4.x



71
72
73
# File 'lib/cabriolet/models/winhelp_header.rb', line 71

def winhelp4?
  @version == :winhelp4
end