[前][次][番号順一覧][スレッド一覧]

ruby-changes:29884

From: nobu <ko1@a...>
Date: Sat, 13 Jul 2013 12:24:42 +0900 (JST)
Subject: [ruby-changes:29884] nobu:r41936 (trunk): ext/win32: move

nobu	2013-07-13 12:24:28 +0900 (Sat, 13 Jul 2013)

  New Revision: 41936

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=41936

  Log:
    ext/win32: move
    
    * ext/win32: move from ext/dl and ext/fiddle.  since ext/extmk.rb
      builds extensions in alphabetical order, compiled?('fiddle') under
      ext/dl makes no sense.

  Added directories:
    trunk/ext/win32/
    trunk/ext/win32/lib/
    trunk/ext/win32/lib/win32/
  Added files:
    trunk/ext/win32/extconf.rb
    trunk/ext/win32/lib/Win32API.rb
    trunk/ext/win32/lib/win32/registry.rb
    trunk/ext/win32/lib/win32/resolv.rb
    trunk/ext/win32/lib/win32/sspi.rb
  Removed files:
    trunk/ext/dl/win32/extconf.rb
    trunk/ext/dl/win32/lib/Win32API.rb
    trunk/ext/dl/win32/lib/win32/registry.rb
    trunk/ext/dl/win32/lib/win32/resolv.rb
    trunk/ext/dl/win32/lib/win32/sspi.rb
    trunk/ext/fiddle/win32/extconf.rb
    trunk/ext/fiddle/win32/lib/win32/registry.rb
    trunk/ext/fiddle/win32/lib/win32/resolv.rb
  Modified files:
    trunk/ChangeLog

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 41935)
+++ ChangeLog	(revision 41936)
@@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Sat Jul 13 12:24:24 2013  Nobuyoshi Nakada  <nobu@r...>
+
+	* ext/win32: move from ext/dl and ext/fiddle.  since ext/extmk.rb
+	  builds extensions in alphabetical order, compiled?('fiddle') under
+	  ext/dl makes no sense.
+
 Sat Jul 13 09:26:09 2013  Tanaka Akira  <akr@f...>
 
 	* bignum.c (biglsh_bang): Removed.
Index: ext/dl/win32/extconf.rb
===================================================================
--- ext/dl/win32/extconf.rb	(revision 41935)
+++ ext/dl/win32/extconf.rb	(revision 41936)
@@ -1,3 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/ext/dl/win32/extconf.rb#L0
-if compiled?('dl') and !compiled?('fiddle') and $mswin||$bccwin||$mingw||$cygwin
-  create_makefile('win32')
-end
Index: ext/dl/win32/lib/Win32API.rb
===================================================================
--- ext/dl/win32/lib/Win32API.rb	(revision 41935)
+++ ext/dl/win32/lib/Win32API.rb	(revision 41936)
@@ -1,31 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/ext/dl/win32/lib/Win32API.rb#L0
-# -*- ruby -*-
-# for backward compatibility
-warn "Warning:#{caller[0].sub(/:in `.*'\z/, '')}: Win32API is deprecated after Ruby 1.9.1; use dl directly instead" if $VERBOSE
-
-require 'dl'
-
-class Win32API
-  DLL = {}
-  TYPEMAP = {"0" => DL::TYPE_VOID, "S" => DL::TYPE_VOIDP, "I" => DL::TYPE_LONG}
-  POINTER_TYPE = DL::SIZEOF_VOIDP == DL::SIZEOF_LONG_LONG ? 'q*' : 'l!*'
-
-  def initialize(dllname, func, import, export = "0", calltype = :stdcall)
-    @proto = [import].join.tr("VPpNnLlIi", "0SSI").sub(/^(.)0*$/, '\1')
-    handle = DLL[dllname] ||= DL.dlopen(dllname)
-    @func = DL::CFunc.new(handle[func], TYPEMAP[export.tr("VPpNnLlIi", "0SSI")], func, calltype)
-  rescue DL::DLError => e
-    raise LoadError, e.message, e.backtrace
-  end
-
-  def call(*args)
-    import = @proto.split("")
-    args.each_with_index do |x, i|
-      args[i], = [x == 0 ? nil : x].pack("p").unpack(POINTER_TYPE) if import[i] == "S"
-      args[i], = [x].pack("I").unpack("i") if import[i] == "I"
-    end
-    ret, = @func.call(args)
-    return ret || 0
-  end
-
-  alias Call call
-end
Index: ext/dl/win32/lib/win32/sspi.rb
===================================================================
--- ext/dl/win32/lib/win32/sspi.rb	(revision 41935)
+++ ext/dl/win32/lib/win32/sspi.rb	(revision 41936)
@@ -1,330 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/ext/dl/win32/lib/win32/sspi.rb#L0
-#
-# = win32/sspi.rb
-#
-# Copyright (c) 2006-2007 Justin Bailey
-#
-# Written and maintained by Justin Bailey <jgbailey@g...>.
-#
-# This program is free software. You can re-distribute and/or
-# modify this program under the same terms of ruby itself ---
-# Ruby Distribution License or GNU General Public License.
-#
-
-require 'Win32API'
-
-# Implements bindings to Win32 SSPI functions, focused on authentication to a proxy server over HTTP.
-module Win32
-	module SSPI
-		# Specifies how credential structure requested will be used. Only SECPKG_CRED_OUTBOUND is used
-		# here.
-		SECPKG_CRED_INBOUND = 0x00000001
-		SECPKG_CRED_OUTBOUND = 0x00000002
-		SECPKG_CRED_BOTH = 0x00000003
-
-		# Format of token. NETWORK format is used here.
-		SECURITY_NATIVE_DREP = 0x00000010
-		SECURITY_NETWORK_DREP = 0x00000000
-
-		# InitializeSecurityContext Requirement flags
-		ISC_REQ_REPLAY_DETECT = 0x00000004
-		ISC_REQ_SEQUENCE_DETECT = 0x00000008
-		ISC_REQ_CONFIDENTIALITY = 0x00000010
-		ISC_REQ_USE_SESSION_KEY = 0x00000020
-		ISC_REQ_PROMPT_FOR_CREDS = 0x00000040
-		ISC_REQ_CONNECTION = 0x00000800
-
-		# Win32 API Functions. Uses Win32API to bind methods to constants contained in class.
-		module API
-			# Can be called with AcquireCredentialsHandle.call()
-			AcquireCredentialsHandle = Win32API.new("secur32", "AcquireCredentialsHandle", 'ppLpppppp', 'L')
-			# Can be called with InitializeSecurityContext.call()
-			InitializeSecurityContext = Win32API.new("secur32", "InitializeSecurityContext", 'pppLLLpLpppp', 'L')
-			# Can be called with DeleteSecurityContext.call()
-			DeleteSecurityContext = Win32API.new("secur32", "DeleteSecurityContext", 'P', 'L')
-			# Can be called with FreeCredentialsHandle.call()
-			FreeCredentialsHandle = Win32API.new("secur32", "FreeCredentialsHandle", 'P', 'L')
-		end
-
-		# SecHandle struct
-		class SecurityHandle
-			def upper
-				@struct.unpack("LL")[1]
-			end
-
-			def lower
-				@struct.unpack("LL")[0]
-			end
-
-			def to_p
-				@struct ||= "\0" * 8
-			end
-		end
-
-		# Some familiar aliases for the SecHandle structure
-		CredHandle = CtxtHandle = SecurityHandle
-
-		# TimeStamp struct
-		class TimeStamp
-			attr_reader :struct
-
-			def to_p
-				@struct ||= "\0" * 8
-			end
-		end
-
-		# Creates binary representaiton of a SecBufferDesc structure,
-		# including the SecBuffer contained inside.
-		class SecurityBuffer
-
-			SECBUFFER_TOKEN = 2   # Security token
-
-			TOKENBUFSIZE = 12288
-			SECBUFFER_VERSION = 0
-
-			def initialize(buffer = nil)
-				@buffer = buffer || "\0" * TOKENBUFSIZE
-				@bufferSize = @buffer.length
-				@type = SECBUFFER_TOKEN
-			end
-
-			def bufferSize
-				unpack
-				@bufferSize
-			end
-
-			def bufferType
-				unpack
-				@type
-			end
-
-			def token
-				unpack
-				@buffer
-			end
-
-			def to_p
-				# Assumption is that when to_p is called we are going to get a packed structure. Therefore,
-				# set @unpacked back to nil so we know to unpack when accessors are next accessed.
-				@unpacked = nil
-				# Assignment of inner structure to variable is very important here. Without it,
-				# will not be able to unpack changes to the structure. Alternative, nested unpacks,
-				# does not work (i.e. @struct.unpack("LLP12")[2].unpack("LLP12") results in "no associated pointer")
-				@sec_buffer ||= [@bufferSize, @type, @buffer].pack("LLP")
-				@struct ||= [SECBUFFER_VERSION, 1, @sec_buffer].pack("LLP")
-			end
-
-		private
-
-			# Unpacks the SecurityBufferDesc structure into member variables. We
-			# only want to do this once per struct, so the struct is deleted
-			# after unpacking.
-			def unpack
-				if ! @unpacked && @sec_buffer && @struct
-					@bufferSize, @type = @sec_buffer.unpack("LL")
-					@buffer = @sec_buffer.unpack("LLP#{@bufferSize}")[2]
-					@struct = nil
-					@sec_buffer = nil
-					@unpacked = true
-				end
-			end
-		end
-
-		# SEC_WINNT_AUTH_IDENTITY structure
-		class Identity
-			SEC_WINNT_AUTH_IDENTITY_ANSI = 0x1
-
-			attr_accessor :user, :domain, :password
-
-			def initialize(user = nil, domain = nil, password = nil)
-				@user = user
-				@domain = domain
-				@password = password
-				@flags = SEC_WINNT_AUTH_IDENTITY_ANSI
-			end
-
-			def to_p
-				[@user, @user ? @user.length : 0,
-				 @domain, @domain ? @domain.length : 0,
-				 @password, @password ? @password.length : 0,
-				 @flags].pack("PLPLPLL")
-			end
-		end
-
-		# Takes a return result from an SSPI function and interprets the value.
-		class SSPIResult
-			# Good results
-			SEC_E_OK = 0x00000000
-			SEC_I_CONTINUE_NEEDED = 0x00090312
-
-			# These are generally returned by InitializeSecurityContext
-			SEC_E_INSUFFICIENT_MEMORY = 0x80090300
-			SEC_E_INTERNAL_ERROR = 0x80090304
-			SEC_E_INVALID_HANDLE = 0x80090301
-			SEC_E_INVALID_TOKEN = 0x80090308
-			SEC_E_LOGON_DENIED = 0x8009030C
-			SEC_E_NO_AUTHENTICATING_AUTHORITY = 0x80090311
-			SEC_E_NO_CREDENTIALS = 0x8009030E
-			SEC_E_TARGET_UNKNOWN = 0x80090303
-			SEC_E_UNSUPPORTED_FUNCTION = 0x80090302
-			SEC_E_WRONG_PRINCIPAL = 0x80090322
-
-			# These are generally returned by AcquireCredentialsHandle
-			SEC_E_NOT_OWNER = 0x80090306
-			SEC_E_SECPKG_NOT_FOUND = 0x80090305
-			SEC_E_UNKNOWN_CREDENTIALS = 0x8009030D
-
-			@@map = {}
-			constants.each { |v| @@map[self.const_get(v.to_s)] = v }
-
-			attr_reader :value
-
-			def initialize(value)
-				# convert to unsigned long
-				value = [value].pack("L").unpack("L").first
-				raise "#{value.to_s(16)} is not a recognized result" unless @@map.has_key? value
-				@value = value
-			end
-
-			def to_s
-				@@map[@value].to_s
-			end
-
-			def ok?
-				@value == SEC_I_CONTINUE_NEEDED || @value == SEC_E_OK
-			end
-
-			def ==(other)
-				if other.is_a?(SSPIResult)
-					@value == other.value
-				elsif other.is_a?(Fixnum)
-					@value == @@map[other]
-				else
-					false
-				end
-			end
-		end
-
-		# Handles "Negotiate" type authentication. Geared towards authenticating with a proxy server over HTTP
-		class NegotiateAuth
-			attr_accessor :credentials, :context, :contextAttributes, :user, :domain
-
-			# Default request flags for SSPI functions
-			REQUEST_FLAGS = ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONNECTION
-
-			# NTLM tokens start with this header always. Encoding alone adds "==" and newline, so remove those
-      B64_TOKEN_PREFIX = ["NTLMSSP"].pack("m").delete("=\n")
-
-			# Given a connection and a request path, performs authentication as the current user and returns
-			# the response from a GET request. The connnection should be a Net::HTTP object, and it should
-			# have been constructed using the Net::HTTP.Proxy method, but anything that responds to "get" will work.
-			# If a user and domain are given, will authenticate as the given user.
-			# Returns the response received from the get method (usually Net::HTTPResponse)
-			def NegotiateAuth.proxy_auth_get(http, path, user = nil, domain = nil)
-				raise "http must respond to :get" unless http.respond_to?(:get)
-				nego_auth = self.new user, domain
-
-				resp = http.get path, { "Proxy-Authorization" => "Negotiate " + nego_auth.get_initial_token }
-				if resp["Proxy-Authenticate"]
-					resp = http.get path, { "Proxy-Authorization" => "Negotiate " + nego_auth.complete_authentication(resp["Proxy-Authenticate"].split(" ").last.strip) }
-				end
-
-				resp
-			end
-
-			# Creates a new instance ready for authentication as the given user in the given domain.
-			# Defaults to current user and domain as defined by ENV["USERDOMAIN"] and ENV["USERNAME"] if
-			# no arguments are supplied.
-			def initialize(user = nil, domain = nil)
-				if user.nil? && domain.nil? && ENV["USERNAME"].nil? && ENV["USERDOMAIN"].nil?
-					raise "A username or domain must be supplied since they cannot be retrieved from the environment"
-				end
-
-				@user = user || ENV["USERNAME"]
-				@domain = domain || ENV["USERDOMAIN"]
-			end
-
-			# Gets the initial Negotiate token. Returns it as a base64 encoded string suitable for use in HTTP. Can
-			# be easily decoded, however.
-			def get_initial_token
-				raise "This object is no longer usable because its resources have been freed." if @cleaned_up
-				get_credentials
-
-				outputBuffer = SecurityBuffer.new
-				@context = CtxtHandle.new
-				@contextAttributes = "\0" * 4
-
-				result = SSPIResult.new(API::InitializeSecurityContext.call(@credentials.to_p, nil, nil,
-					REQUEST_FLAGS,0, SECURITY_NETWORK_DREP, nil, 0, @context.to_p, outputBuffer.to_p, @contextAttributes, TimeStamp.new.to_p))
-
-				if result.ok? then
-					return encode_token(outputBuffer.token)
-				else
-					raise "Error: #{result.to_s}"
-				end
-			end
-
-			# Takes a token and gets the next token in the Negotiate authentication chain. Token can be Base64 encoded or not.
-			# The token can include the "Negotiate" header and it will be stripped.
-			# Does not indicate if SEC_I_CONTINUE or SEC_E_OK was returned.
-			# Token returned is Base64 encoded w/ all new lines removed.
-			def complete_authentication(token)
-				raise "This object is no longer usable because its resources have been freed." if @cleaned_up
-
-				# Nil token OK, just set it to empty string
-				token = "" if token.nil?
-
-				if token.include? "Negotiate"
-					# If the Negotiate prefix is passed in, assume we are seeing "Negotiate <token>" and get the token.
-					token = token.split(" ").last
-				end
-
-				if token.include? B64_TOKEN_PREFIX
-					# indicates base64 encoded token
-          token = token.strip.unpack("m")[0]
-				end
-
-				outputBuffer = SecurityBuffer.new
-				result = SSPIResult.new(API::InitializeSecurityContext.call(@credentials.to_p, @context.to_p, nil,
-					REQUEST_FLAGS, 0, SECURITY_NETWORK_DREP, SecurityBuffer.new(token).to_p, 0,
-					@context.to_p,
-					outputBuffer.to_p, @contextAttributes, TimeStamp.new.to_p))
-
-				if result.ok? then
-					return encode_token(outputBuffer.token)
-				else
-					raise "Error: #{result.to_s}"
-				end
-			ensure
-				# need to make sure we don't clean up if we've already cleaned up.
-				clean_up unless @cleaned_up
-			end
-
-		 private
-
-			def clean_up
-				# free structures allocated
-				@cleaned_up = true
-				API::FreeCredentialsHandle.call(@credentials.to_p)
-				API::DeleteSecurityContext.call(@context.to_p)
-				@context = nil
-				@credentials = nil
-				@contextAttributes = nil
-			end
-
-			# Gets credentials based on user, domain or both. If both are nil, an error occurs
-			def get_credentials
-				@credentials = CredHandle.new
-				ts = TimeStamp.new
-				@identity = Identity.new @user, @domain
-				result = SSPIResult.new(API::AcquireCredentialsHandle.call(nil, "Negotiate", SECPKG_CRED_OUTBOUND, nil, @identity.to_p,
-					nil, nil, @credentials.to_p, ts.to_p))
-				raise "Error acquire credentials: #{result}" unless result.ok?
-			end
-
-			def encode_token(t)
-				# encode64 will add newlines every 60 characters so we need to remove those.
-        [t].pack("m").delete("\n")
-			end
-		end
-	end
-end
\ No newline at end of file
Index: ext/dl/win32/lib/win32/registry.rb
===================================================================
--- ext/dl/win32/lib/win32/registry.rb	(revision 41935)
+++ ext/dl/win32/lib/win32/registry.rb	(revision 41936)
@@ -1,876 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/ext/dl/win32/lib/win32/registry.rb#L0
-require 'dl/import'
-module Win32
-
-=begin rdoc
-= Win32 Registry
-
-win32/registry is registry accessor library for Win32 platform.
-It uses dl/import to call Win32 Registry APIs.
-
-== example
-  Win32::Registry::HKEY_CURRENT_USER.open('SOFTWARE\foo') do |reg|
-    value = reg['foo']                               # read a value
-    value = reg['foo', Win32::Registry::REG_SZ]      # read a value with type
-    type, value = reg.read('foo')                    # read a value
-    reg['foo'] = 'bar'                               # write a value
-    reg['foo', Win32::Registry::REG_SZ] = 'bar'      # write a value with type
-    reg.write('foo', Win32::Registry::REG_SZ, 'bar') # write a value
-
-    reg.each_value { |name, type, data| ... }        # Enumerate values
-    reg.each_key { |key, wtime| ... }                # Enumerate subkeys
-
-    reg.delete_value(name)                         # Delete a value
-    reg.delete_key(name)                           # Delete a subkey
-    reg.delete_key(name, true)                     # Delete a subkey recursively
-  end
-
-= Reference
-
-== Win32::Registry class
-
---- info
-
---- num_keys
-
---- max_key_length
-
---- num_values
-
---- max_value_name_length
-
---- max_value_length
-
---- descriptor_length
-
---- wtime
-    Returns an item of key information.
-
-=== constants
---- HKEY_CLASSES_ROOT
-
---- HKEY_CURRENT_USER
-
---- HKEY_LOCAL_MACHINE
-
---- HKEY_PERFORMANCE_DATA
-
---- HKEY_CURRENT_CONFIG
-
---- HKEY_DYN_DATA
-
-    Win32::Registry object whose key is predefined key.
-For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/predefined_keys.asp] article.
-
-=end rdoc
-
-  WCHAR = Encoding::UTF_16LE
-  WCHAR_NUL = "\0".encode(WCHAR).freeze
-  WCHAR_SIZE = WCHAR_NUL.bytesize
-  LOCALE = Encoding.find(Encoding.locale_charmap)
-
-  class Registry
-
-    #
-    # For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/registry.asp].
-    #
-    # --- HKEY_*
-    #
-    #     Predefined key ((*handle*)).
-    #     These are Integer, not Win32::Registry.
-    #
-    # --- REG_*
-    #
-    #     Registry value type.
-    #
-    # --- KEY_*
-    #
-    #     Security access mask.
-    #
-    # --- KEY_OPTIONS_*
-    #
-    #     Key options.
-    #
-    # --- REG_CREATED_NEW_KEY
-    #
-    # --- REG_OPENED_EXISTING_KEY
-    #
-    #     If the key is created newly or opened existing key.
-    #     See also Registry#disposition method.
-    module Constants
-      HKEY_CLASSES_ROOT = 0x80000000
-      HKEY_CURRENT_USER = 0x80000001
-      HKEY_LOCAL_MACHINE = 0x80000002
-      HKEY_USERS = 0x80000003
-      HKEY_PERFORMANCE_DATA = 0x80000004
-      HKEY_PERFORMANCE_TEXT = 0x80000050
-      HKEY_PERFORMANCE_NLSTEXT = 0x80000060
-      HKEY_CURRENT_CONFIG = 0x80000005
-      HKEY_DYN_DATA = 0x80000006
-
-      REG_NONE = 0
-      REG_SZ = 1
-      REG_EXPAND_SZ = 2
-      REG_BINARY = 3
-      REG_DWORD = 4
-      REG_DWORD_LITTLE_ENDIAN = 4
-      REG_DWORD_BIG_ENDIAN = 5
-      REG_LINK = 6
-      REG_MULTI_SZ = 7
-      REG_RESOURCE_LIST = 8
-      REG_FULL_RESOURCE_DESCRIPTOR = 9
-      REG_RESOURCE_REQUIREMENTS_LIST = 10
-      REG_QWORD = 11
-      REG_QWORD_LITTLE_ENDIAN = 11
-
-      STANDARD_RIGHTS_READ = 0x00020000
-      STANDARD_RIGHTS_WRITE = 0x00020000
-      KEY_QUERY_VALUE = 0x0001
-      KEY_SET_VALUE = 0x0002
-      KEY_CREATE_SUB_KEY = 0x0004
-      KEY_ENUMERATE_SUB_KEYS = 0x0008
-      KEY_NOTIFY = 0x0010
-      KEY_CREATE_LINK = 0x0020
-      KEY_READ = STANDARD_RIGHTS_READ |
-        KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY
-      KEY_WRITE = STANDARD_RIGHTS_WRITE |
-        KEY_SET_VALUE | KEY_CREATE_SUB_KEY
-      KEY_EXECUTE = KEY_READ
-      KEY_ALL_ACCESS = KEY_READ | KEY_WRITE | KEY_CREATE_LINK
-
-      REG_OPTION_RESERVED = 0x0000
-      REG_OPTION_NON_VOLATILE = 0x0000
-      REG_OPTION_VOLATILE = 0x0001
-      REG_OPTION_CREATE_LINK = 0x0002
-      REG_OPTION_BACKUP_RESTORE = 0x0004
-      REG_OPTION_OPEN_LINK = 0x0008
-      REG_LEGAL_OPTION = REG_OPTION_RESERVED |
-        REG_OPTION_NON_VOLATILE | REG_OPTION_CREATE_LINK |
-        REG_OPTION_BACKUP_RESTORE | REG_OPTION_OPEN_LINK
-
-      REG_CREATED_NEW_KEY = 1
-      REG_OPENED_EXISTING_KEY = 2
-
-      REG_WHOLE_HIVE_VOLATILE = 0x0001
-      REG_REFRESH_HIVE = 0x0002
-      REG_NO_LAZY_FLUSH = 0x0004
-      REG_FORCE_RESTORE = 0x0008
-
-      MAX_KEY_LENGTH = 514
-      MAX_VALUE_LENGTH = 32768
-    end
-    include Constants
-    include Enumerable
-
-    #
-    # Error
-    #
-    class Error < ::StandardError
-      module Kernel32
-        extend DL::Importer
-        dlload "kernel32.dll"
-      end
-      FormatMessageW = Kernel32.extern "int FormatMessageW(int, void *, int, int, void *, int, void *)", :stdcall
-      def initialize(code)
-        @code = code
-        msg = WCHAR_NUL * 1024
-        len = FormatMessageW.call(0x1200, 0, code, 0, msg, 1024, 0)
-        msg = msg[0, len].encode(LOCALE)
-        super msg.tr("\r".encode(msg.encoding), '').chomp
-      end
-      attr_reader :code
-    end
-
-    #
-    # Predefined Keys
-    #
-    class PredefinedKey < Registry
-      def initialize(hkey, keyname)
-        @hkey = hkey
-        @parent = nil
-        @keyname = keyname
-        @disposition = REG_OPENED_EXISTING_KEY
-      end
-
-      # Predefined keys cannot be closed
-      def close
-        raise Error.new(5) ## ERROR_ACCESS_DENIED
-      end
-
-      # Fake #class method for Registry#open, Registry#create
-      def class
-        Registry
-      end
-
-      # Make all
-      Constants.constants.grep(/^HKEY_/) do |c|
-        Registry.const_set c, new(Constants.const_get(c), c.to_s)
-      end
-    end
-
-    #
-    # Win32 APIs
-    #
-    module API
-      extend DL::Importer
-      dlload "advapi32.dll"
-      [
-        "long RegOpenKeyExW(void *, void *, long, long, void *)",
-        "long RegCreateKeyExW(void *, void *, long, long, long, long, void *, void *, void *)",
-         (... truncated)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]