class Chef::ReservedNames::Win32::File::VersionInfo

Public Class Methods

new(file_name) click to toggle source
# File lib/chef/win32/file/version_info.rb, line 29
def initialize(file_name)
  raise Errno::ENOENT, file_name unless ::File.exist?(file_name)
  @file_version_info = retrieve_file_version_info(file_name)
end

Private Instance Methods

get_version_info_string(string_key) click to toggle source
# File lib/chef/win32/file/version_info.rb, line 81
def get_version_info_string(string_key)
  info_ptr = FFI::MemoryPointer.new(:pointer)
  size_ptr = FFI::MemoryPointer.new(:int)
  unless VerQueryValueW(@file_version_info, "\\StringFileInfo\\#{translation}\\#{string_key}".to_wstring, info_ptr, size_ptr)
    Chef::ReservedNames::Win32::Error.raise!
  end

  info_ptr.read_pointer.read_wstring(size_ptr.read_uint)
end
to_hex(integer) click to toggle source
# File lib/chef/win32/file/version_info.rb, line 77
def to_hex(integer)
  integer.to_s(16).rjust(4, "0")
end
translation() click to toggle source
# File lib/chef/win32/file/version_info.rb, line 61
def translation
  @translation ||= begin
    info_ptr = FFI::MemoryPointer.new(:pointer)
    unless VerQueryValueW(@file_version_info, "\\VarFileInfo\\Translation".to_wstring, info_ptr, FFI::MemoryPointer.new(:int))
      Chef::ReservedNames::Win32::Error.raise!
    end

    # there can potentially be multiple translations but most installers just have one
    # we use the first because we use this for the version strings which are language
    # agnostic. If/when we need other fields, we should we should add logic to find
    # the "best" translation
    trans = Translation.new(info_ptr.read_pointer)
    to_hex(trans[:w_lang]) + to_hex(trans[:w_code_page])
  end
end