win32-pipe 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|