1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* ext/dl/win32/lib/win32/registry.rb (Win32::Registry.expand_environ):

use suitable encoding for the string.  fixed a test-all error of
  r41838.

* ext/fiddle/win32/lib/win32/registry.rb: same changes of r41838 and
  this revision of dl's win32/registry.rb.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41844 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
usa 2013-07-09 00:49:44 +00:00
parent 7083cebeae
commit d9726121e5
3 changed files with 46 additions and 27 deletions

View file

@ -1,3 +1,12 @@
Tue Jul 9 09:46:53 2013 NAKAMURA Usaku <usa@ruby-lang.org>
* ext/dl/win32/lib/win32/registry.rb (Win32::Registry.expand_environ):
use suitable encoding for the string. fixed a test-all error of
r41838.
* ext/fiddle/win32/lib/win32/registry.rb: same changes of r41838 and
this revision of dl's win32/registry.rb.
Tue Jul 9 07:39:45 2013 Eric Hodel <drbrain@segment7.net> Tue Jul 9 07:39:45 2013 Eric Hodel <drbrain@segment7.net>
* lib/rubygems: Update to RubyGems 2.0.4. See * lib/rubygems: Update to RubyGems 2.0.4. See

View file

@ -340,7 +340,7 @@ For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/pr
# For detail, see expandEnvironmentStrings[http://msdn.microsoft.com/library/en-us/sysinfo/base/expandenvironmentstrings.asp] \Win32 \API. # For detail, see expandEnvironmentStrings[http://msdn.microsoft.com/library/en-us/sysinfo/base/expandenvironmentstrings.asp] \Win32 \API.
# #
def self.expand_environ(str) def self.expand_environ(str)
str.gsub(/%([^%]+)%/) { ENV[$1] || ENV[$1.upcase] || $& } str.gsub(Regexp.compile("%([^%]+)%".encode(str.encoding))) { ENV[$1] || ENV[$1.upcase] || $& }
end end
@@type2name = { } @@type2name = { }

View file

@ -63,6 +63,10 @@ For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/pr
=end rdoc =end rdoc
WCHAR = Encoding::UTF_16LE
WCHAR_SPACE = "\0".encode(WCHAR).freeze
LOCALE = Encoding.find(Encoding.locale_charmap)
class Registry class Registry
# #
@ -164,12 +168,12 @@ For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/pr
extend Fiddle::Importer extend Fiddle::Importer
dlload "kernel32.dll" dlload "kernel32.dll"
end end
FormatMessageA = Kernel32.extern "int FormatMessageA(int, void *, int, int, void *, int, void *)", :stdcall FormatMessageW = Kernel32.extern "int FormatMessageW(int, void *, int, int, void *, int, void *)", :stdcall
def initialize(code) def initialize(code)
@code = code @code = code
msg = "\0".force_encoding(Encoding::ASCII_8BIT) * 1024 msg = WCHAR_SPACE * 1024
len = FormatMessageA.call(0x1200, 0, code, 0, msg, 1024, 0) len = FormatMessageW.call(0x1200, 0, code, 0, msg, 1024, 0)
msg = msg[0, len].force_encoding(Encoding.find(Encoding.locale_charmap)) msg = msg[0, len].encode
super msg.tr("\r", '').chomp super msg.tr("\r", '').chomp
end end
attr_reader :code attr_reader :code
@ -209,12 +213,12 @@ For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/pr
extend Fiddle::Importer extend Fiddle::Importer
dlload "advapi32.dll" dlload "advapi32.dll"
[ [
"long RegOpenKeyExA(void *, void *, long, long, void *)", "long RegOpenKeyExW(void *, void *, long, long, void *)",
"long RegCreateKeyExA(void *, void *, long, long, long, long, void *, void *, void *)", "long RegCreateKeyExW(void *, void *, long, long, long, long, void *, void *, void *)",
"long RegEnumValueA(void *, long, void *, void *, void *, void *, void *, void *)", "long RegEnumValueW(void *, long, void *, void *, void *, void *, void *, void *)",
"long RegEnumKeyExA(void *, long, void *, void *, void *, void *, void *, void *)", "long RegEnumKeyExW(void *, long, void *, void *, void *, void *, void *, void *)",
"long RegQueryValueExA(void *, void *, void *, void *, void *, void *)", "long RegQueryValueExW(void *, void *, void *, void *, void *, void *)",
"long RegSetValueExA(void *, void *, long, long, void *, long)", "long RegSetValueExW(void *, void *, long, long, void *, long)",
"long RegDeleteValue(void *, void *)", "long RegDeleteValue(void *, void *)",
"long RegDeleteKey(void *, void *)", "long RegDeleteKey(void *, void *)",
"long RegFlushKey(void *)", "long RegFlushKey(void *)",
@ -251,52 +255,58 @@ For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/pr
def OpenKey(hkey, name, opt, desired) def OpenKey(hkey, name, opt, desired)
result = packdw(0) result = packdw(0)
check RegOpenKeyExA.call(hkey, name, opt, desired, result) check RegOpenKeyExW.call(hkey, name.encode(WCHAR), opt, desired, result)
unpackdw(result) unpackdw(result)
end end
def CreateKey(hkey, name, opt, desired) def CreateKey(hkey, name, opt, desired)
result = packdw(0) result = packdw(0)
disp = packdw(0) disp = packdw(0)
check RegCreateKeyExA.call(hkey, name, 0, 0, opt, desired, check RegCreateKeyExW.call(hkey, name.encode(WCHAR), 0, 0, opt, desired,
0, result, disp) 0, result, disp)
[ unpackdw(result), unpackdw(disp) ] [ unpackdw(result), unpackdw(disp) ]
end end
def EnumValue(hkey, index) def EnumValue(hkey, index)
name = ' ' * Constants::MAX_KEY_LENGTH name = WCHAR_SPACE * Constants::MAX_KEY_LENGTH
size = packdw(Constants::MAX_KEY_LENGTH) size = packdw(Constants::MAX_KEY_LENGTH)
check RegEnumValueA.call(hkey, index, name, size, 0, 0, 0, 0) check RegEnumValueW.call(hkey, index, name, size, 0, 0, 0, 0)
name[0, unpackdw(size)] name[0, unpackdw(size)].encode
end end
def EnumKey(hkey, index) def EnumKey(hkey, index)
name = ' ' * Constants::MAX_KEY_LENGTH name = WCHAR_SPACE * Constants::MAX_KEY_LENGTH
size = packdw(Constants::MAX_KEY_LENGTH) size = packdw(Constants::MAX_KEY_LENGTH)
wtime = ' ' * 8 wtime = ' ' * 8
check RegEnumKeyExA.call(hkey, index, name, size, 0, 0, 0, wtime) check RegEnumKeyExW.call(hkey, index, name, size, 0, 0, 0, wtime)
[ name[0, unpackdw(size)], unpackqw(wtime) ] [ name[0, unpackdw(size)].encode, unpackqw(wtime) ]
end end
def QueryValue(hkey, name) def QueryValue(hkey, name)
type = packdw(0) type = packdw(0)
size = packdw(0) size = packdw(0)
check RegQueryValueExA.call(hkey, name, 0, type, 0, size) name = name.encode(WCHAR)
data = ' ' * unpackdw(size) check RegQueryValueExW.call(hkey, name, 0, type, 0, size)
check RegQueryValueExA.call(hkey, name, 0, type, data, size) data = WCHAR_SPACE * unpackdw(size)
[ unpackdw(type), data[0, unpackdw(size)] ] check RegQueryValueExW.call(hkey, name, 0, type, data, size)
[ unpackdw(type), data[0, unpackdw(size)].encode ]
end end
def SetValue(hkey, name, type, data, size) def SetValue(hkey, name, type, data, size)
check RegSetValueExA.call(hkey, name, 0, type, data, size) case type
when REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ
data = data.encode(WCHAR)
size ||= data.size + 1
end
check RegSetValueExW.call(hkey, name.encode(WCHAR), 0, type, data, size)
end end
def DeleteValue(hkey, name) def DeleteValue(hkey, name)
check RegDeleteValue.call(hkey, name) check RegDeleteValue.call(hkey, name.encode(WCHAR))
end end
def DeleteKey(hkey, name) def DeleteKey(hkey, name)
check RegDeleteKey.call(hkey, name) check RegDeleteKey.call(hkey, name.encode(WCHAR))
end end
def FlushKey(hkey) def FlushKey(hkey)
@ -330,7 +340,7 @@ For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/pr
# For detail, see expandEnvironmentStrings[http://msdn.microsoft.com/library/en-us/sysinfo/base/expandenvironmentstrings.asp] \Win32 \API. # For detail, see expandEnvironmentStrings[http://msdn.microsoft.com/library/en-us/sysinfo/base/expandenvironmentstrings.asp] \Win32 \API.
# #
def self.expand_environ(str) def self.expand_environ(str)
str.gsub(/%([^%]+)%/) { ENV[$1] || ENV[$1.upcase] || $& } str.gsub(Regexp.compile("%([^%]+)%".encode(str.encoding))) { ENV[$1] || ENV[$1.upcase] || $& }
end end
@@type2name = { } @@type2name = { }