win32-event 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +40 -0
- data/MANIFEST +7 -0
- data/README +52 -0
- data/Rakefile +21 -0
- data/lib/win32/event.rb +157 -0
- data/test/tc_event.rb +121 -0
- data/win32-event.gemspec +24 -0
- metadata +66 -0
data/CHANGES
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
== 0.5.0 - 3-May-2007
|
2
|
+
* Now pure Ruby.
|
3
|
+
* Both the Event.new and Event.close methods now accept a block, and
|
4
|
+
automatically close the associated handle at the end of the block.
|
5
|
+
* The Event.new method now accepts an optional fourth argument that controls
|
6
|
+
whether the Event object can be inherited by other processes.
|
7
|
+
* Added a gemspec.
|
8
|
+
* Added a Rakefile, including tasks for installation and testing.
|
9
|
+
* Removed the doc/event.txt file. The documentation is now inlined via RDoc.
|
10
|
+
There is also some documentation in the README file.
|
11
|
+
* Now requires the windows-pr package.
|
12
|
+
|
13
|
+
== 0.4.0 - 28-May-2005
|
14
|
+
* All methods now return self or klass (instead of true).
|
15
|
+
* Added the Event#inheritable? attribute that stores whether or not the Event
|
16
|
+
object is inheritable with regards to CreateProcess().
|
17
|
+
* The Event#set and Event#unset now properly set the Event#signaled? value.
|
18
|
+
* More Unicode friendly.
|
19
|
+
* Removed the event.rd file. The event.txt file is now rdoc friendly.
|
20
|
+
* Code cleanup.
|
21
|
+
|
22
|
+
== 0.3.1 - 1-Mar-2005
|
23
|
+
* Moved the 'examples' directory to the toplevel directory.
|
24
|
+
* Made the CHANGES and README files rdoc friendly.
|
25
|
+
|
26
|
+
== 0.3.0 - 17-Jul-2004
|
27
|
+
* Now uses the newer allocation framework, as well as replace the deprecated
|
28
|
+
STR2CSTR() function with StringValuePtr(). This means that, as of this
|
29
|
+
release, Ruby 1.8.0 or later is required.
|
30
|
+
* Removed the .html file as part of the distro. You can generate this on your
|
31
|
+
own via rd2.
|
32
|
+
* Moved the test.rb script to doc/examples.
|
33
|
+
|
34
|
+
== 0.2.0 - 28-Apr-2004
|
35
|
+
* The Event class is now a subclass of Ipc (and thus requires the win32-ipc
|
36
|
+
package).
|
37
|
+
* Documentation updates
|
38
|
+
|
39
|
+
== 0.1.0 - 12-Jan-2004
|
40
|
+
- Initial release.
|
data/MANIFEST
ADDED
data/README
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
== Description
|
2
|
+
Interface to MS Windows Event objects.
|
3
|
+
|
4
|
+
== Prerequsites
|
5
|
+
Requires the win32-ipc package.
|
6
|
+
|
7
|
+
== Installation
|
8
|
+
rake test (optional)
|
9
|
+
rake install
|
10
|
+
|
11
|
+
== Synopsis
|
12
|
+
Win32::Event.new("Foo") do |event|
|
13
|
+
event.set
|
14
|
+
# Do stuff
|
15
|
+
event.reset
|
16
|
+
end
|
17
|
+
|
18
|
+
e2 = Win32::Event.open("Bar")
|
19
|
+
# Do stuff
|
20
|
+
e2.close
|
21
|
+
|
22
|
+
== Documentation
|
23
|
+
The event.rb file contains inline RDoc documentation. If you installed
|
24
|
+
this file as a gem, then you have the docs.
|
25
|
+
|
26
|
+
== Notes
|
27
|
+
The Event class is a subclass of Win32::Ipc (win32-ipc). This package
|
28
|
+
require's the win32-ipc package internally (you don't need to explicitly
|
29
|
+
call it).
|
30
|
+
|
31
|
+
A PulseEvent() wrapper is intentionally omitted. From the MSDN web site:
|
32
|
+
"This function is unreliable and should not be used. It exists mainly for
|
33
|
+
backward compatibility."
|
34
|
+
|
35
|
+
== Acknowledgements
|
36
|
+
The Win32::Event Perl module by Chris Madsen was used as a general
|
37
|
+
guideline for developing the API.
|
38
|
+
|
39
|
+
== Known Bugs
|
40
|
+
None that I'm aware of. Please submit any bug reports to the project page
|
41
|
+
at http://www.rubyforge.org/projects/win32utils.
|
42
|
+
|
43
|
+
== Copyright
|
44
|
+
(C) 2003-2007 Daniel J. Berger
|
45
|
+
All Rights Reserved
|
46
|
+
|
47
|
+
== License
|
48
|
+
Ruby's
|
49
|
+
|
50
|
+
== Author
|
51
|
+
Park Heesob
|
52
|
+
Daniel J. Berger
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rbconfig'
|
4
|
+
include Config
|
5
|
+
|
6
|
+
desc 'Install the win32-event package (non-gem)'
|
7
|
+
task :install do
|
8
|
+
sitelibdir = CONFIG['sitelibdir']
|
9
|
+
installdir = File.join(sitelibdir, 'win32')
|
10
|
+
file = 'lib\win32\event.rb'
|
11
|
+
|
12
|
+
Dir.mkdir(installdir) unless File.exists?(installdir)
|
13
|
+
FileUtils.cp(file, installdir, :verbose => true)
|
14
|
+
end
|
15
|
+
|
16
|
+
Rake::TestTask.new do |t|
|
17
|
+
t.libs << 'test'
|
18
|
+
t.verbose = true
|
19
|
+
t.warning = true
|
20
|
+
t.test_files = FileList['test/tc_event.rb']
|
21
|
+
end
|
data/lib/win32/event.rb
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
require 'win32/ipc'
|
2
|
+
|
3
|
+
module Win32
|
4
|
+
class Event < Ipc
|
5
|
+
|
6
|
+
# This is the error raised if any of the Event methods fail.
|
7
|
+
class Error < StandardError; end
|
8
|
+
|
9
|
+
extend Windows::Synchronize
|
10
|
+
extend Windows::Error
|
11
|
+
extend Windows::Handle
|
12
|
+
|
13
|
+
VERSION = '0.5.0'
|
14
|
+
|
15
|
+
# The name of the Event object.
|
16
|
+
#
|
17
|
+
attr_reader :name
|
18
|
+
|
19
|
+
# Indicates whether or not the Event requires use of the ResetEvent()
|
20
|
+
# function set the state to nonsignaled.
|
21
|
+
#
|
22
|
+
attr_reader :manual_reset
|
23
|
+
|
24
|
+
# The initial state of the Event object. If true, the initial state
|
25
|
+
# is signaled. Otherwise, it is non-signaled.
|
26
|
+
#
|
27
|
+
attr_reader :initial_state
|
28
|
+
|
29
|
+
# Creates and returns new Event object. If +name+ is omitted, the
|
30
|
+
# Event object is created without a name, i.e. it's anonymous.
|
31
|
+
#
|
32
|
+
# If +name+ is provided and it already exists, then it is opened
|
33
|
+
# instead and the +manual_reset+ and +initial_state+ parameters are
|
34
|
+
# ignored.
|
35
|
+
#
|
36
|
+
# If the +man_reset+ parameter is set to +true+, then it creates an Event
|
37
|
+
# object which requires use of the Event#reset method in order to set the
|
38
|
+
# state to non-signaled. If this parameter is false (the default) then
|
39
|
+
# the system automatically resets the state to non-signaled after a
|
40
|
+
# single waiting thread has been released.
|
41
|
+
#
|
42
|
+
# If the +init_state+ parameter is +true+, the initial state of the
|
43
|
+
# Event object is signaled; otherwise, it is nonsignaled (the default).
|
44
|
+
#
|
45
|
+
# If the +inherit+ parameter is true, then processes created by this
|
46
|
+
# process will inherit the handle. Otherwise they will not.
|
47
|
+
#
|
48
|
+
# In block form this will automatically close the Event object at the
|
49
|
+
# end of the block.
|
50
|
+
#
|
51
|
+
def initialize(name=nil, man_reset=false, init_state=false, inherit=true)
|
52
|
+
@name = name
|
53
|
+
@manual_reset = man_reset
|
54
|
+
@initial_state = init_state
|
55
|
+
@inherit = inherit
|
56
|
+
|
57
|
+
manual_reset = man_reset ? 1 : 0
|
58
|
+
initial_state = init_state ? 1 : 0
|
59
|
+
|
60
|
+
# Used to prevent potential segfaults.
|
61
|
+
if name && !name.is_a?(String)
|
62
|
+
raise TypeError, 'name must be a string'
|
63
|
+
end
|
64
|
+
|
65
|
+
if inherit
|
66
|
+
sec = 0.chr * 12 # sizeof(SECURITY_ATTRIBUTES)
|
67
|
+
sec[0,4] = [12].pack('L')
|
68
|
+
sec[8,4] = [1].pack('L') # 1 == TRUE
|
69
|
+
else
|
70
|
+
sec = 0
|
71
|
+
end
|
72
|
+
|
73
|
+
handle = CreateEvent(sec, manual_reset, initial_state, name)
|
74
|
+
|
75
|
+
if handle == 0 || handle == INVALID_HANDLE_VALUE
|
76
|
+
raise Error, get_last_error
|
77
|
+
end
|
78
|
+
|
79
|
+
super(handle)
|
80
|
+
|
81
|
+
if block_given?
|
82
|
+
begin
|
83
|
+
yield self
|
84
|
+
ensure
|
85
|
+
close
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Open an existing Event by +name+. The +inherit+ argument sets whether
|
91
|
+
# or not the object was opened such that a process created by the
|
92
|
+
# CreateProcess() function (a Windows API function) can inherit the
|
93
|
+
# handle. The default is true.
|
94
|
+
#
|
95
|
+
# This method is essentially identical to Event.new, except that the
|
96
|
+
# options for manual_reset and initial_state cannot be set (since they
|
97
|
+
# are already set). Also, this method will raise an Event::Error if the
|
98
|
+
# event doesn't already exist.
|
99
|
+
#
|
100
|
+
# If you want "open or create" semantics, then use Event.new.
|
101
|
+
#--
|
102
|
+
# The OpenEvent() call here is strictly to force an error if the user
|
103
|
+
# tries to open an event that doesn't already exist.
|
104
|
+
#
|
105
|
+
def self.open(name, inherit=true, &block)
|
106
|
+
if name && !name.is_a?(String)
|
107
|
+
raise TypeError, 'name must be a string'
|
108
|
+
end
|
109
|
+
|
110
|
+
bool = inherit ? 1 : 0
|
111
|
+
handle = OpenEvent(EVENT_ALL_ACCESS, bool, name)
|
112
|
+
if handle == 0 || handle == INVALID_HANDLE_VALUE
|
113
|
+
raise Error, get_last_error
|
114
|
+
end
|
115
|
+
CloseHandle(handle)
|
116
|
+
|
117
|
+
self.new(name, false, false, inherit, &block)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Returns whether or not the object was opened such that a process
|
121
|
+
# created by the CreateProcess() function (a Windows API function) can
|
122
|
+
# inherit the handle. The default is true.
|
123
|
+
#
|
124
|
+
def inheritable?
|
125
|
+
@inherit
|
126
|
+
end
|
127
|
+
|
128
|
+
# Sets the Event object to a non-signaled state.
|
129
|
+
#
|
130
|
+
def reset
|
131
|
+
unless ResetEvent(@handle)
|
132
|
+
raise Error, get_last_error
|
133
|
+
end
|
134
|
+
@signaled = false
|
135
|
+
end
|
136
|
+
|
137
|
+
# Sets the Event object to a signaled state.
|
138
|
+
#
|
139
|
+
def set
|
140
|
+
unless SetEvent(@handle)
|
141
|
+
raise Error, get_last_error
|
142
|
+
end
|
143
|
+
@signaled = true
|
144
|
+
end
|
145
|
+
|
146
|
+
# Synonym for Event#reset if +bool+ is false, or Event#set
|
147
|
+
# if +bool+ is true.
|
148
|
+
#
|
149
|
+
def signaled=(bool)
|
150
|
+
if bool
|
151
|
+
set
|
152
|
+
else
|
153
|
+
reset
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
data/test/tc_event.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
#####################################################################
|
2
|
+
# tc_event.rb
|
3
|
+
#
|
4
|
+
# Test suite for the win32-event package. This test should be run
|
5
|
+
# via the 'rake test' task.
|
6
|
+
#####################################################################
|
7
|
+
require "test/unit"
|
8
|
+
require "win32/event"
|
9
|
+
include Win32
|
10
|
+
|
11
|
+
class TC_Win32Event < Test::Unit::TestCase
|
12
|
+
def setup
|
13
|
+
@event1 = Event.new
|
14
|
+
@event2 = Event.new("Foo")
|
15
|
+
@event3 = Event.new("Bar", true)
|
16
|
+
@event4 = Event.new("Baz", true, true)
|
17
|
+
@uni_event = Event.new("Ηελλας")
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_version
|
21
|
+
assert_equal('0.5.0', Event::VERSION)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_constructor_errors
|
25
|
+
assert_raises(ArgumentError){ Event.new("Foo", true, false, true, 1) }
|
26
|
+
assert_raises(TypeError){ Event.new(1) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_open
|
30
|
+
assert_respond_to(Event, :open)
|
31
|
+
assert_nothing_raised{ Event.open("Bar"){} }
|
32
|
+
assert_nothing_raised{ Event.open("Ηελλας"){} }
|
33
|
+
assert_nothing_raised{ Event.open("Bar", false) }
|
34
|
+
|
35
|
+
assert_raises(ArgumentError){ Event.open("Bar", true, false){} }
|
36
|
+
assert_raises(Event::Error){ Event.open("Blah"){} }
|
37
|
+
assert_raises(TypeError){ Event.open(1){} }
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_inheritable
|
41
|
+
@event1 = Event.open("Foo")
|
42
|
+
@event2 = Event.open("Baz", false)
|
43
|
+
|
44
|
+
assert_respond_to(@event1, :inheritable?)
|
45
|
+
assert_nothing_raised{ @event1.inheritable? }
|
46
|
+
|
47
|
+
assert_equal(true, @event1.inheritable?)
|
48
|
+
assert_equal(false, @event2.inheritable?)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_name
|
52
|
+
assert_respond_to(@event1, :name)
|
53
|
+
assert_nothing_raised{ @event1.name }
|
54
|
+
assert_nothing_raised{ @uni_event.name }
|
55
|
+
|
56
|
+
assert_nil(@event1.name)
|
57
|
+
assert_kind_of(String, @event2.name)
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_initial_state
|
61
|
+
assert_respond_to(@event1, :initial_state)
|
62
|
+
assert_nothing_raised{ @event1.initial_state }
|
63
|
+
|
64
|
+
assert_equal(false, @event1.initial_state)
|
65
|
+
assert_equal(false, @event2.initial_state)
|
66
|
+
assert_equal(false, @event3.initial_state)
|
67
|
+
assert_equal(true, @event4.initial_state)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_manual_reset
|
71
|
+
assert_respond_to(@event1, :manual_reset)
|
72
|
+
assert_nothing_raised{ @event1.manual_reset }
|
73
|
+
|
74
|
+
assert_equal(false, @event1.manual_reset)
|
75
|
+
assert_equal(false, @event2.manual_reset)
|
76
|
+
assert_equal(true, @event3.manual_reset)
|
77
|
+
assert_equal(true, @event4.manual_reset)
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_set
|
81
|
+
assert_respond_to(@event1, :set)
|
82
|
+
assert_nothing_raised{ @event1.set }
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_is_signaled
|
86
|
+
event = Event.new
|
87
|
+
assert_respond_to(event, :signaled?)
|
88
|
+
assert_nothing_raised{ event.signaled? }
|
89
|
+
|
90
|
+
assert_equal(false, event.signaled?)
|
91
|
+
event.set
|
92
|
+
assert_equal(true, event.signaled?)
|
93
|
+
event.reset
|
94
|
+
assert_equal(false, event.signaled?)
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_reset
|
98
|
+
assert_respond_to(@event1, :reset)
|
99
|
+
assert_nothing_raised{ @event1.reset }
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_close
|
103
|
+
event = Event.new
|
104
|
+
assert_respond_to(event, :close)
|
105
|
+
assert_nothing_raised{ event.close }
|
106
|
+
end
|
107
|
+
|
108
|
+
def teardown
|
109
|
+
@event1.close
|
110
|
+
@event2.close
|
111
|
+
@event3.close
|
112
|
+
@event4.close
|
113
|
+
@uni_event.close
|
114
|
+
|
115
|
+
@event1 = nil
|
116
|
+
@event2 = nil
|
117
|
+
@event3 = nil
|
118
|
+
@event4 = nil
|
119
|
+
@uni_event = nil
|
120
|
+
end
|
121
|
+
end
|
data/win32-event.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
|
3
|
+
spec = Gem::Specification.new do |gem|
|
4
|
+
gem.name = "win32-event"
|
5
|
+
gem.version = "0.5.0"
|
6
|
+
gem.author = "Daniel J. Berger"
|
7
|
+
gem.email = "djberg96@gmail.com"
|
8
|
+
gem.homepage = "http://www.rubyforge.org/projects/win32utils"
|
9
|
+
gem.platform = Gem::Platform::RUBY
|
10
|
+
gem.summary = "Interface to MS Windows Event objects."
|
11
|
+
gem.description = "Interface to MS Windows Event objects."
|
12
|
+
gem.test_file = "test/tc_event.rb"
|
13
|
+
gem.has_rdoc = true
|
14
|
+
gem.files = Dir["lib/win32/*.rb"] + Dir["test/*"] + Dir["[A-Z]*"]
|
15
|
+
gem.files.reject! { |fn| fn.include? "CVS" }
|
16
|
+
gem.require_path = "lib"
|
17
|
+
gem.extra_rdoc_files = ["README", "CHANGES", "MANIFEST"]
|
18
|
+
gem.add_dependency("win32-ipc", ">= 0.5.0")
|
19
|
+
end
|
20
|
+
|
21
|
+
if $0 == __FILE__
|
22
|
+
Gem.manage_gems
|
23
|
+
Gem::Builder.new(spec).build
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.0.8
|
3
|
+
specification_version: 1
|
4
|
+
name: win32-event
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.5.0
|
7
|
+
date: 2007-05-03 00:00:00 -06:00
|
8
|
+
summary: Interface to MS Windows Event objects.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: djberg96@gmail.com
|
12
|
+
homepage: http://www.rubyforge.org/projects/win32utils
|
13
|
+
rubyforge_project:
|
14
|
+
description: Interface to MS Windows Event objects.
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Daniel J. Berger
|
31
|
+
files:
|
32
|
+
- lib/win32/event.rb
|
33
|
+
- test/CVS
|
34
|
+
- test/tc_event.rb
|
35
|
+
- CHANGES
|
36
|
+
- CVS
|
37
|
+
- lib
|
38
|
+
- MANIFEST
|
39
|
+
- Rakefile
|
40
|
+
- README
|
41
|
+
- test
|
42
|
+
- win32-event.gemspec
|
43
|
+
test_files:
|
44
|
+
- test/tc_event.rb
|
45
|
+
rdoc_options: []
|
46
|
+
|
47
|
+
extra_rdoc_files:
|
48
|
+
- README
|
49
|
+
- CHANGES
|
50
|
+
- MANIFEST
|
51
|
+
executables: []
|
52
|
+
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
requirements: []
|
56
|
+
|
57
|
+
dependencies:
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: win32-ipc
|
60
|
+
version_requirement:
|
61
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.5.0
|
66
|
+
version:
|