class U3d::WindowsInstallationHelper

Public Class Methods

new(exe_path) click to toggle source
# File lib/u3d/installation.rb, line 325
def initialize(exe_path)
  @exe_path = exe_path
end

Public Instance Methods

build_number() click to toggle source
# File lib/u3d/installation.rb, line 338
def build_number
  s = unity_version_info
  if s
    a = s.split("_")
    return a[1] if a.count > 1
  end
  nil
end
version() click to toggle source
# File lib/u3d/installation.rb, line 329
def version
  s = unity_version_info
  if s
    a = s.split("_")
    return a[0] unless a.empty?
  end
  nil
end

Private Instance Methods

string_file_info(info, path) click to toggle source
# File lib/u3d/installation.rb, line 353
def string_file_info(info, path)
  require "Win32API"
  get_file_version_info_size = Win32API.new('version.dll', 'GetFileVersionInfoSize', 'PP', 'L')
  get_file_version_info = Win32API.new('version.dll', 'GetFileVersionInfo', 'PIIP', 'I')
  ver_query_value = Win32API.new('version.dll', 'VerQueryValue', 'PPPP', 'I')
  rtl_move_memory = Win32API.new('kernel32.dll', 'RtlMoveMemory', 'PLL', 'I')

  file = path.tr("/", "\\")

  buf = [0].pack('L')
  version_size = get_file_version_info_size.call(file + "\0", buf)
  raise Exception if version_size.zero? # TODO: use GetLastError

  version_info = 0.chr * version_size
  version_ok = get_file_version_info.call(file, 0, version_size, version_info)
  raise Exception if version_ok.zero? # TODO: use GetLastError

  # hardcoding lang codepage
  struct_path = "\\StringFileInfo\\040904b0\\#{info}"

  addr = [0].pack('L')
  size = [0].pack('L')
  query_ok = ver_query_value.call(version_info, struct_path + "\0", addr, size)
  raise Exception if query_ok.zero?

  raddr = addr.unpack('L')[0]
  rsize = size.unpack('L')[0]

  info = Array.new(rsize, 0).pack('L*')
  rtl_move_memory.call(info, raddr, info.length)
  info.strip
rescue StandardError => e
  UI.verbose("Failure to find '#{info}' under '#{path}': #{e}")
  UI.verbose(e.backtrace)
  nil
end
unity_version_info() click to toggle source
# File lib/u3d/installation.rb, line 349
def unity_version_info
  @uvf ||= string_file_info('Unity Version', @exe_path)
end