windows-api 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,9 @@
1
+ = 0.3.0 - 1-Feb-2009
2
+ * No longer explicitly checks for an error in the constructor. It lets the
3
+ underlying Win32::API library deal with it.
4
+ * More dynamic handling and setting of the MSVCRT_DLL variable.
5
+ * Added a WideString implementation. Internal use only.
6
+
1
7
  = 0.2.4 - 18-Jul-2008
2
8
  * Eliminated unnecessary LoadLibrary() attempts for functions that explicitly
3
9
  end with an 'A' or 'W', and all MSVCRT functions, since they have no 'A'
data/MANIFEST CHANGED
@@ -4,4 +4,5 @@
4
4
  * Rakefile
5
5
  * windows-api.gemspec
6
6
  * lib/windows/api.rb
7
+ * lib/windows/wide_string.rb
7
8
  * test/test_windows_api.rb
data/lib/windows/api.rb CHANGED
@@ -12,7 +12,7 @@ module Windows
12
12
  if CONFIG['host_os'].split('_')[1].to_i >= 80 &&
13
13
  File.exists?(File.join(CONFIG['bindir'], 'ruby.exe.manifest'))
14
14
  then
15
- MSVCRT_DLL = 'msvcr80'
15
+ MSVCRT_DLL = 'msvcr' + CONFIG['host_os'].split('_')[1]
16
16
  else
17
17
  MSVCRT_DLL = 'msvcrt'
18
18
  end
@@ -25,11 +25,8 @@ module Windows
25
25
  extend Forwardable
26
26
 
27
27
  # The version of this library
28
- VERSION = '0.2.4'
28
+ VERSION = '0.3.0'
29
29
 
30
- # Error typically raised if any of the Windows::API methods fail
31
- class Error < RuntimeError; end
32
-
33
30
  # The methods from Win32::API are delegated to the appropriate object
34
31
  def_delegators(:@api, :function_name, :dll_name, :prototype)
35
32
  def_delegators(:@api, :return_type, :effective_function_name)
@@ -288,7 +285,6 @@ module Windows
288
285
  @auto_unicode = bool
289
286
  end
290
287
 
291
-
292
288
  # call-seq:
293
289
  # API.new(func, proto='V', rtype='L', dll='kernel32')
294
290
  #
@@ -334,11 +330,7 @@ module Windows
334
330
  @dll_name = dll
335
331
  @boolean = rtype == 'B' ? true : false
336
332
 
337
- begin
338
- @api = Win32::API.new(func, proto, rtype, dll)
339
- rescue RuntimeError => err
340
- raise Error, err
341
- end
333
+ @api = Win32::API.new(func, proto, rtype, dll)
342
334
 
343
335
  api_a = nil
344
336
  api_w = nil
@@ -352,7 +344,7 @@ module Windows
352
344
  # msvcrt functions never have explicit ANSI or Wide character
353
345
  # versions.
354
346
  #
355
- if Windows::API.auto_unicode && dll.downcase != 'msvcrt'
347
+ if Windows::API.auto_unicode && dll !~ /msvcr/i
356
348
  begin
357
349
  unless ['A', 'W'].include?(func[-1].chr)
358
350
  api_a = Win32::API.new("#{func}A", proto, rtype, dll)
@@ -0,0 +1,60 @@
1
+ require 'windows/unicode'
2
+ require 'windows/msvcrt/string'
3
+
4
+ # This is a class that simplifies wide string handling. It is NOT meant
5
+ # for general consumption, but for internal use by the Win32Utils Team.
6
+ # Use at your own risk.
7
+ #
8
+ class WideString < String
9
+ include Windows::Unicode
10
+ include Windows::MSVCRT::String
11
+
12
+ ACP = CP_ACP
13
+ UTF7 = CP_UTF7
14
+ UTF8 = CP_UTF8
15
+
16
+ # Get or set the encoding of the wide string object
17
+ #
18
+ attr_accessor :encoding
19
+
20
+ # Creates a new wide +string+ with the given +encoding+, or UTF8 if
21
+ # no encoding is specified.
22
+ #
23
+ def initialize(string, encoding = UTF8)
24
+ super(multi_to_wide(string, encoding))
25
+ @encoding = encoding
26
+ end
27
+
28
+ # Returns the multibyte version of the wide string.
29
+ #
30
+ def to_multi
31
+ wide_to_multi(self, @encoding)
32
+ end
33
+
34
+ # Replaces the wide string with a multibyte version.
35
+ #
36
+ def to_multi!
37
+ self.replace(wide_to_multi(self, @encoding))
38
+ end
39
+
40
+ alias to_s to_multi
41
+ alias to_str to_multi
42
+ alias inspect to_multi
43
+
44
+ # Strips the trailing two null characters from the string.
45
+ #
46
+ def wstrip
47
+ self[0..-3] if string[-2..-1] == "\000\000"
48
+ end
49
+
50
+ # The length of the wide string in chars.
51
+ #
52
+ def length
53
+ wcslen(self) * 2
54
+ end
55
+
56
+ # The size of the wide string in bytes.
57
+ def size
58
+ wcslen(self)
59
+ end
60
+ end
@@ -0,0 +1,53 @@
1
+ require 'rubygems'
2
+ gem 'test-unit'
3
+
4
+ require 'test/unit'
5
+ require 'windows/wide_string'
6
+
7
+ class TC_WideString < Test::Unit::TestCase
8
+ def setup
9
+ @str_english = WideString.new('hello')
10
+ @str_greek = WideString.new('Ελλάσ')
11
+ end
12
+
13
+ def test_length
14
+ assert_equal(10, @str_english.length)
15
+ assert_equal(10, @str_greek.length)
16
+ end
17
+
18
+ def test_size
19
+ assert_equal(5, @str_english.size)
20
+ assert_equal(5, @str_greek.size)
21
+ end
22
+
23
+ def test_to_multi
24
+ assert_respond_to(@str_english, :to_multi)
25
+ assert_equal('hello', @str_english.to_multi)
26
+ assert_equal('Ελλάσ', @str_greek.to_multi)
27
+ end
28
+
29
+ def test_literal_string_value
30
+ assert_equal("h\000e\000l\000l\000o\000\000\000", @str_english)
31
+ assert_equal("\225\003\273\003\273\003\254\003\303\003\000\000", @str_greek)
32
+ end
33
+
34
+ def test_alias_to_s
35
+ assert_respond_to(@str_greek, :to_s)
36
+ assert_true(@str_greek.method(:to_s) == @str_greek.method(:to_multi))
37
+ end
38
+
39
+ def test_alias_to_str
40
+ assert_respond_to(@str_greek, :to_str)
41
+ assert_true(@str_greek.method(:to_str) == @str_greek.method(:to_multi))
42
+ end
43
+
44
+ def test_alias_inspect
45
+ assert_respond_to(@str_greek, :inspect)
46
+ assert_true(@str_greek.method(:inspect) == @str_greek.method(:to_multi))
47
+ end
48
+
49
+ def teardown
50
+ @str_english = nil
51
+ @str_greek = nil
52
+ end
53
+ end
@@ -55,7 +55,7 @@ class TC_Windows_API < Test::Unit::TestCase
55
55
  end
56
56
 
57
57
  def test_version
58
- assert_equal('0.2.4', API::VERSION)
58
+ assert_equal('0.3.0', API::VERSION)
59
59
  end
60
60
 
61
61
  def test_full_data_types
@@ -148,6 +148,15 @@ class TC_Windows_API < Test::Unit::TestCase
148
148
  assert_equal('ReadDirectoryChangesW', $read.effective_function_name)
149
149
  end
150
150
 
151
+ def test_bad_prototype_raises_error
152
+ assert_raise(Win32::API::PrototypeError){ Windows::API.new('GetCurrentDirectory', 'XL', 'L') }
153
+ assert_raise(Win32::API::PrototypeError){ Windows::API.new('GetCurrentDirectory', 'PL', 'X') }
154
+ end
155
+
156
+ def test_bad_function_raises_error
157
+ assert_raise(Win32::API::LoadLibraryError){ Windows::API.new('GetCurrentFooBar', 'LL', 'L') }
158
+ end
159
+
151
160
  def teardown
152
161
  @buf = nil
153
162
  end
data/windows-api.gemspec CHANGED
@@ -2,7 +2,7 @@ require "rubygems"
2
2
 
3
3
  spec = Gem::Specification.new do |gem|
4
4
  gem.name = "windows-api"
5
- gem.version = "0.2.4"
5
+ gem.version = "0.3.0"
6
6
  gem.author = "Daniel J. Berger"
7
7
  gem.email = "djberg96@gmail.com"
8
8
  gem.homepage = "http://www.rubyforge.org/projects/win32utils"
@@ -16,10 +16,9 @@ spec = Gem::Specification.new do |gem|
16
16
  gem.files.reject! { |fn| fn.include? "CVS" }
17
17
  gem.require_path = "lib"
18
18
  gem.extra_rdoc_files = ["README", "CHANGES", "MANIFEST"]
19
- gem.add_dependency("win32-api", ">= 1.0.5")
19
+ gem.add_dependency("win32-api", ">= 1.3.0")
20
20
  end
21
21
 
22
22
  if $0 == __FILE__
23
- Gem.manage_gems
24
23
  Gem::Builder.new(spec).build
25
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: windows-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel J. Berger
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-07-19 00:00:00 -06:00
12
+ date: 2009-02-01 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 1.0.5
23
+ version: 1.3.0
24
24
  version:
25
25
  description: An easier way to create methods using Win32API
26
26
  email: djberg96@gmail.com
@@ -34,19 +34,20 @@ extra_rdoc_files:
34
34
  - MANIFEST
35
35
  files:
36
36
  - lib/windows/api.rb
37
- - test/CVS
37
+ - lib/windows/wide_string.rb
38
+ - test/test_wide_string.rb
38
39
  - test/test_windows_api.rb
39
40
  - CHANGES
40
- - CVS
41
41
  - lib
42
42
  - MANIFEST
43
43
  - Rakefile
44
44
  - README
45
45
  - test
46
46
  - windows-api.gemspec
47
- - windows-api.gemspec~
48
47
  has_rdoc: true
49
48
  homepage: http://www.rubyforge.org/projects/win32utils
49
+ licenses: []
50
+
50
51
  post_install_message:
51
52
  rdoc_options: []
52
53
 
@@ -67,9 +68,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
68
  requirements: []
68
69
 
69
70
  rubyforge_project: win32utils
70
- rubygems_version: 1.2.0
71
+ rubygems_version: 1.3.1
71
72
  signing_key:
72
- specification_version: 2
73
+ specification_version: 3
73
74
  summary: An easier way to create methods using Win32API
74
75
  test_files:
75
76
  - test/test_windows_api.rb
data/windows-api.gemspec~ DELETED
@@ -1,25 +0,0 @@
1
- require "rubygems"
2
-
3
- spec = Gem::Specification.new do |gem|
4
- gem.name = "windows-api"
5
- gem.version = "0.2.4"
6
- gem.author = "Daniel J. Berger"
7
- gem.email = "djberg96@gmail.com"
8
- gem.homepage = "http://www.rubyforge.org/projects/win32utils"
9
- gem.rubyforge_project = "win32utils"
10
- gem.platform = Gem::Platform::RUBY
11
- gem.summary = "An easier way to create methods using Win32API"
12
- gem.description = "An easier way to create methods using Win32API"
13
- gem.test_file = "test/tc_windows_api.rb"
14
- gem.has_rdoc = true
15
- gem.files = Dir["lib/windows/*.rb"] + Dir["test/*"] + Dir["[A-Z]*"]
16
- gem.files.reject! { |fn| fn.include? "CVS" }
17
- gem.require_path = "lib"
18
- gem.extra_rdoc_files = ["README", "CHANGES", "MANIFEST"]
19
- gem.add_dependency("win32-api", ">= 1.0.5")
20
- end
21
-
22
- if $0 == __FILE__
23
- Gem.manage_gems
24
- Gem::Builder.new(spec).build
25
- end