win32-pipe 0.3.3 → 0.3.4
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.
- checksums.yaml +4 -4
- data/CHANGES +8 -0
- data/lib/win32/pipe.rb +18 -20
- data/lib/win32/pipe/client.rb +2 -2
- data/lib/win32/pipe/server.rb +5 -5
- data/lib/win32/pipe/windows/structs.rb +18 -18
- data/test/test_win32_pipe.rb +1 -1
- data/win32-pipe.gemspec +2 -1
- metadata +21 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 355028a84c9b976da5abdcd774bdf078ed5d806a
|
4
|
+
data.tar.gz: ca247e57fd842bbbd9752ac521a1d9163622a685
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fcd19fb11d78ae12468876e1ed0602d8fc5800d38f7767ecf1062f4cbc521a8eaf8d70053620d60267232cbed91f7bb372909e41e6e24e102fd3cf2f692bb595
|
7
|
+
data.tar.gz: 607f40aab87ece6503c15804829b33441766efedb999ecd1de2b44a6ff2668460a9ed46fabc2adeeeeba42d2cf0f3b3016c4bda73e7fcd548c9225072259ad53
|
data/CHANGES
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 0.3.4 - 22-Mar-2014
|
2
|
+
* Modified the constructor to allow a fourth argument that lets you set the
|
3
|
+
buffer size used by pipes. The default size has been increased to 4k.
|
4
|
+
* Use a bonafide FFI::Buffer, and re-use it instead of creating a new buffer
|
5
|
+
for each read/write operation.
|
6
|
+
* Thanks go to lionelperrin for the above updates.
|
7
|
+
* Added Rake as a development dependency.
|
8
|
+
|
1
9
|
== 0.3.3 - 21-Oct-2013
|
2
10
|
* Fixed INVALID_HANDLE_VALUE for 64-bit Ruby.
|
3
11
|
* Now internally uses a struct for OVERLAPPED event instead of packed string.
|
data/lib/win32/pipe.rb
CHANGED
@@ -16,9 +16,9 @@ module Win32
|
|
16
16
|
class Error < StandardError; end
|
17
17
|
|
18
18
|
# The version of this library
|
19
|
-
VERSION = '0.3.
|
19
|
+
VERSION = '0.3.4'
|
20
20
|
|
21
|
-
|
21
|
+
DEFAULT_PIPE_BUFFER_SIZE = 4096 #:nodoc:
|
22
22
|
PIPE_TIMEOUT = 5000 #:nodoc:
|
23
23
|
|
24
24
|
# Blocking mode is enabled
|
@@ -59,7 +59,7 @@ module Win32
|
|
59
59
|
OVERLAPPED = FILE_FLAG_OVERLAPPED
|
60
60
|
|
61
61
|
# The default pipe mode
|
62
|
-
DEFAULT_PIPE_MODE =
|
62
|
+
DEFAULT_PIPE_MODE = PIPE_WAIT
|
63
63
|
|
64
64
|
# The default open mode
|
65
65
|
DEFAULT_OPEN_MODE = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH
|
@@ -90,7 +90,7 @@ module Win32
|
|
90
90
|
#
|
91
91
|
# The default open mode is FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH.
|
92
92
|
#
|
93
|
-
def initialize(name, pipe_mode = DEFAULT_PIPE_MODE, open_mode = DEFAULT_OPEN_MODE)
|
93
|
+
def initialize(name, pipe_mode = DEFAULT_PIPE_MODE, open_mode = DEFAULT_OPEN_MODE, pipe_buffer_size = DEFAULT_PIPE_BUFFER_SIZE)
|
94
94
|
@name = "\\\\.\\pipe\\" + name
|
95
95
|
|
96
96
|
@pipe_mode = pipe_mode.nil? ? DEFAULT_PIPE_MODE : pipe_mode
|
@@ -98,11 +98,13 @@ module Win32
|
|
98
98
|
|
99
99
|
@pipe = nil
|
100
100
|
@pending_io = false
|
101
|
-
@buffer =
|
101
|
+
@buffer = ''
|
102
|
+
@ffi_buffer = FFI::Buffer.new( pipe_buffer_size )
|
102
103
|
@size = 0
|
103
|
-
@overlapped =
|
104
|
+
@overlapped = nil
|
104
105
|
@transferred = 0
|
105
106
|
@asynchronous = false
|
107
|
+
@pipe_buffer_size = pipe_buffer_size
|
106
108
|
|
107
109
|
if open_mode & FILE_FLAG_OVERLAPPED > 0
|
108
110
|
@asynchronous = true
|
@@ -110,6 +112,7 @@ module Win32
|
|
110
112
|
|
111
113
|
if @asynchronous
|
112
114
|
@event = CreateEvent(nil, true, true, nil)
|
115
|
+
@overlapped = Overlapped.new
|
113
116
|
@overlapped[:hEvent] = @event
|
114
117
|
end
|
115
118
|
end
|
@@ -142,22 +145,20 @@ module Win32
|
|
142
145
|
#
|
143
146
|
def read
|
144
147
|
bytes = FFI::MemoryPointer.new(:ulong)
|
145
|
-
@buffer = 0.chr * PIPE_BUFFER_SIZE
|
146
148
|
|
147
149
|
raise Error, "no pipe created" unless @pipe
|
148
150
|
|
149
151
|
if @asynchronous
|
150
|
-
bool = ReadFile(@pipe, @
|
151
|
-
error = GetLastError()
|
152
|
-
|
152
|
+
bool = ReadFile(@pipe, @ffi_buffer, @ffi_buffer.size, bytes, @overlapped)
|
153
153
|
bytes_read = bytes.read_ulong
|
154
154
|
|
155
155
|
if bool && bytes_read > 0
|
156
156
|
@pending_io = false
|
157
|
-
@buffer = @
|
157
|
+
@buffer = @ffi_buffer.get_string(0, bytes_read)
|
158
158
|
return true
|
159
159
|
end
|
160
160
|
|
161
|
+
error = GetLastError()
|
161
162
|
if !bool && error == ERROR_IO_PENDING
|
162
163
|
@pending_io = true
|
163
164
|
return true
|
@@ -165,28 +166,24 @@ module Win32
|
|
165
166
|
|
166
167
|
return false
|
167
168
|
else
|
168
|
-
unless ReadFile(@pipe, @
|
169
|
+
unless ReadFile(@pipe, @ffi_buffer, @ffi_buffer.size, bytes, nil)
|
169
170
|
raise SystemCallError.new("ReadFile", FFI.errno)
|
170
171
|
end
|
172
|
+
@buffer = @ffi_buffer.get_string(0, bytes.read_ulong)
|
171
173
|
end
|
172
|
-
|
173
|
-
@buffer.unpack("A*")
|
174
174
|
end
|
175
175
|
|
176
176
|
# Writes 'data' to the pipe. You can write data to either end of a
|
177
177
|
# named pipe.
|
178
178
|
#
|
179
179
|
def write(data)
|
180
|
-
@buffer = data
|
181
180
|
@size = data.size
|
182
181
|
bytes = FFI::MemoryPointer.new(:ulong)
|
183
182
|
|
184
183
|
raise Error, "no pipe created" unless @pipe
|
185
184
|
|
186
185
|
if @asynchronous
|
187
|
-
bool = WriteFile(@pipe, @
|
188
|
-
error = GetLastError()
|
189
|
-
|
186
|
+
bool = WriteFile(@pipe, @data, @data.size, bytes, @overlapped)
|
190
187
|
bytes_written = bytes.read_ulong
|
191
188
|
|
192
189
|
if bool && bytes_written > 0
|
@@ -194,6 +191,7 @@ module Win32
|
|
194
191
|
return true
|
195
192
|
end
|
196
193
|
|
194
|
+
error = GetLastError()
|
197
195
|
if !bool && error == ERROR_IO_PENDING
|
198
196
|
@pending_io = true
|
199
197
|
return true
|
@@ -201,7 +199,7 @@ module Win32
|
|
201
199
|
|
202
200
|
return false
|
203
201
|
else
|
204
|
-
unless WriteFile(@pipe,
|
202
|
+
unless WriteFile(@pipe, data, data.size, bytes, nil)
|
205
203
|
raise SystemCallError.new("WriteFile", FFI.errno)
|
206
204
|
end
|
207
205
|
|
@@ -239,7 +237,7 @@ module Win32
|
|
239
237
|
end
|
240
238
|
|
241
239
|
@transferred = transferred.read_ulong
|
242
|
-
@buffer = @
|
240
|
+
@buffer = @ffi_buffer.get_string(0, @transferred)
|
243
241
|
end
|
244
242
|
|
245
243
|
self
|
data/lib/win32/pipe/client.rb
CHANGED
@@ -27,8 +27,8 @@ module Win32
|
|
27
27
|
# puts "Got [#{data}] back from pipe server"
|
28
28
|
# end
|
29
29
|
#
|
30
|
-
def initialize(name, pipe_mode = DEFAULT_PIPE_MODE, open_mode = DEFAULT_OPEN_MODE)
|
31
|
-
super(name, pipe_mode, open_mode)
|
30
|
+
def initialize(name, pipe_mode = DEFAULT_PIPE_MODE, open_mode = DEFAULT_OPEN_MODE, pipe_buffer_size = DEFAULT_PIPE_BUFFER_SIZE)
|
31
|
+
super(name, pipe_mode, open_mode, pipe_buffer_size)
|
32
32
|
|
33
33
|
@pipe = CreateFile(
|
34
34
|
@name,
|
data/lib/win32/pipe/server.rb
CHANGED
@@ -14,22 +14,22 @@ module Win32
|
|
14
14
|
#--
|
15
15
|
# The default pipe_mode also happens to be 0.
|
16
16
|
#
|
17
|
-
def initialize(name, pipe_mode = 0, open_mode = Pipe::ACCESS_DUPLEX)
|
18
|
-
super(name, pipe_mode, open_mode)
|
17
|
+
def initialize(name, pipe_mode = 0, open_mode = Pipe::ACCESS_DUPLEX, pipe_buffer_size = DEFAULT_PIPE_BUFFER_SIZE)
|
18
|
+
super(name, pipe_mode, open_mode, pipe_buffer_size)
|
19
19
|
|
20
20
|
@pipe = CreateNamedPipe(
|
21
21
|
@name,
|
22
22
|
@open_mode,
|
23
23
|
@pipe_mode,
|
24
24
|
PIPE_UNLIMITED_INSTANCES,
|
25
|
-
|
26
|
-
|
25
|
+
pipe_buffer_size,
|
26
|
+
pipe_buffer_size,
|
27
27
|
PIPE_TIMEOUT,
|
28
28
|
nil
|
29
29
|
)
|
30
30
|
|
31
31
|
if @pipe == INVALID_HANDLE_VALUE
|
32
|
-
raise
|
32
|
+
raise SystemCallError.new("CreateNamedPipe", FFI.errno)
|
33
33
|
end
|
34
34
|
|
35
35
|
if block_given?
|
@@ -1,18 +1,18 @@
|
|
1
|
-
require 'ffi'
|
2
|
-
|
3
|
-
module Windows
|
4
|
-
module Structs
|
5
|
-
extend FFI::Library
|
6
|
-
|
7
|
-
# I'm assuming the anonymous struct for the internal union here.
|
8
|
-
class Overlapped < FFI::Struct
|
9
|
-
layout(
|
10
|
-
:Internal, :uintptr_t,
|
11
|
-
:InternalHigh, :uintptr_t,
|
12
|
-
:Offset, :ulong,
|
13
|
-
:OffsetHigh, :ulong,
|
14
|
-
:hEvent, :uintptr_t
|
15
|
-
)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module Windows
|
4
|
+
module Structs
|
5
|
+
extend FFI::Library
|
6
|
+
|
7
|
+
# I'm assuming the anonymous struct for the internal union here.
|
8
|
+
class Overlapped < FFI::Struct
|
9
|
+
layout(
|
10
|
+
:Internal, :uintptr_t,
|
11
|
+
:InternalHigh, :uintptr_t,
|
12
|
+
:Offset, :ulong,
|
13
|
+
:OffsetHigh, :ulong,
|
14
|
+
:hEvent, :uintptr_t
|
15
|
+
)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/test/test_win32_pipe.rb
CHANGED
data/win32-pipe.gemspec
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = 'win32-pipe'
|
5
|
-
spec.version = '0.3.
|
5
|
+
spec.version = '0.3.4'
|
6
6
|
spec.author = 'Daniel J. Berger'
|
7
7
|
spec.license = 'Artistic 2.0'
|
8
8
|
spec.email = 'djberg96@gmail.com'
|
@@ -15,6 +15,7 @@ Gem::Specification.new do |spec|
|
|
15
15
|
spec.extra_rdoc_files = ['CHANGES', 'README', 'MANIFEST']
|
16
16
|
|
17
17
|
spec.add_dependency('ffi')
|
18
|
+
spec.add_dependency('rake')
|
18
19
|
spec.add_development_dependency('test-unit')
|
19
20
|
|
20
21
|
spec.description = <<-EOF
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: win32-pipe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel J. Berger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: test-unit
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,19 +64,19 @@ extra_rdoc_files:
|
|
50
64
|
- MANIFEST
|
51
65
|
files:
|
52
66
|
- CHANGES
|
67
|
+
- MANIFEST
|
68
|
+
- README
|
69
|
+
- Rakefile
|
53
70
|
- examples/example_client.rb
|
54
71
|
- examples/example_client_async.rb
|
55
72
|
- examples/example_server.rb
|
56
73
|
- examples/example_server_async.rb
|
74
|
+
- lib/win32/pipe.rb
|
57
75
|
- lib/win32/pipe/client.rb
|
58
76
|
- lib/win32/pipe/server.rb
|
59
77
|
- lib/win32/pipe/windows/constants.rb
|
60
78
|
- lib/win32/pipe/windows/functions.rb
|
61
79
|
- lib/win32/pipe/windows/structs.rb
|
62
|
-
- lib/win32/pipe.rb
|
63
|
-
- MANIFEST
|
64
|
-
- Rakefile
|
65
|
-
- README
|
66
80
|
- test/test_win32_pipe.rb
|
67
81
|
- test/test_win32_pipe_client.rb
|
68
82
|
- test/test_win32_pipe_server.rb
|
@@ -87,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
101
|
version: '0'
|
88
102
|
requirements: []
|
89
103
|
rubyforge_project: win32utils
|
90
|
-
rubygems_version: 2.
|
104
|
+
rubygems_version: 2.2.2
|
91
105
|
signing_key:
|
92
106
|
specification_version: 4
|
93
107
|
summary: An interface for named pipes on MS Windows
|