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