From ab3688d75e0bf804508be96d401dcfd665fcf76d Mon Sep 17 00:00:00 2001 From: Seth Chisamore Date: Tue, 13 Dec 2011 11:07:53 -0500 Subject: [PATCH] move unicode helper functions into Chef::Win32::API::Unicode --- chef/lib/chef/win32/api/unicode.rb | 55 ++++++++++++++++++++++++++++-- chef/lib/chef/win32/unicode.rb | 46 ++----------------------- 2 files changed, 54 insertions(+), 47 deletions(-) diff --git a/chef/lib/chef/win32/api/unicode.rb b/chef/lib/chef/win32/api/unicode.rb index 16cb4ec0f1d..5000f91bdfa 100644 --- a/chef/lib/chef/win32/api/unicode.rb +++ b/chef/lib/chef/win32/api/unicode.rb @@ -22,9 +22,12 @@ class Chef module Win32 module API module Unicode - extend Chef::Win32::API + ############################################### + # Win32 API Constants + ############################################### + CP_ACP = 0 CP_OEMCP = 1 CP_MACCP = 2 @@ -85,8 +88,11 @@ module Unicode TCI_SRCFONTSIG = 3 TCI_SRCLOCALE = 0x100 - ffi_lib 'advapi32', 'kernel32' - ffi_convention :stdcall + ############################################### + # Win32 API Bindings + ############################################### + + ffi_lib 'kernel32', 'advapi32' =begin BOOL IsTextUnicode( @@ -123,6 +129,49 @@ module Unicode =end attach_function :WideCharToMultiByte, [:UINT, :DWORD, :LPCWSTR, :int, :LPSTR, :int, :LPCSTR, :LPBOOL], :int + ############################################### + # Helpers + ############################################### + + def utf8_to_wide(ustring) + # ensure it is actually UTF-8 + # Ruby likes to mark binary data as ASCII-8BIT + ustring = (ustring + "").force_encoding('UTF-8') if ustring.respond_to?(:force_encoding) && ustring.encoding.name != "UTF-8" + + # ensure we have the double-null termination Windows Wide likes + ustring = ustring << "\000\000" if ustring[-1].chr != "\000" + + # encode it all as UTF-16LE AKA Windows Wide Character AKA Windows Unicode + ustring = begin + if ustring.respond_to?(:encode) + ustring.encode('UTF-16LE') + else + require 'iconv' + Iconv.conv("UTF-16LE", "UTF-8", ustring) + end + end + ustring + end + + def wide_to_utf8(wstring) + # ensure it is actually UTF-16LE + # Ruby likes to mark binary data as ASCII-8BIT + wstring = wstring.force_encoding('UTF-16LE') if wstring.respond_to?(:force_encoding) + + # encode it all as UTF-8 + wstring = begin + if wstring.respond_to?(:encode) + wstring.encode('UTF-8') + else + require 'iconv' + Iconv.conv("UTF-8", "UTF-16LE", wstring) + end + end + # remove trailing CRLF and NULL characters + wstring.strip! + wstring + end + end end end diff --git a/chef/lib/chef/win32/unicode.rb b/chef/lib/chef/win32/unicode.rb index 385e86e458b..a154c8c7dc5 100644 --- a/chef/lib/chef/win32/unicode.rb +++ b/chef/lib/chef/win32/unicode.rb @@ -22,50 +22,8 @@ class Chef module Win32 class Unicode - - class << self - include Chef::Win32::API::Unicode - - def utf8_to_wide(ustring) - # ensure it is actually UTF-8 - # Ruby likes to mark binary data as ASCII-8BIT - ustring = (ustring + "").force_encoding('UTF-8') if ustring.respond_to?(:force_encoding) && ustring.encoding.name != "UTF-8" - - # ensure we have the double-null termination Windows Wide likes - ustring = ustring << "\000\000" if ustring[-1].chr != "\000" - - # encode it all as UTF-16LE AKA Windows Wide Character AKA Windows Unicode - ustring = begin - if ustring.respond_to?(:encode) - ustring.encode('UTF-16LE') - else - require 'iconv' - Iconv.conv("UTF-16LE", "UTF-8", ustring) - end - end - ustring - end - - def wide_to_utf8(wstring) - # ensure it is actually UTF-16LE - # Ruby likes to mark binary data as ASCII-8BIT - wstring = wstring.force_encoding('UTF-16LE') if wstring.respond_to?(:force_encoding) - - # encode it all as UTF-8 - wstring = begin - if wstring.respond_to?(:encode) - wstring.encode('UTF-8') - else - require 'iconv' - Iconv.conv("UTF-8", "UTF-16LE", wstring) - end - end - # remove trailing CRLF and NULL characters - wstring.strip! - wstring - end - end - + include Chef::Win32::API::Unicode + extend Chef::Win32::API::Unicode end end end