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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3efdd5d2b5a0d1c4155f89cd532f1f60f56e9efc
4
- data.tar.gz: fb14d03d04dfb70e0425d60c38fd248b37d86382
3
+ metadata.gz: 355028a84c9b976da5abdcd774bdf078ed5d806a
4
+ data.tar.gz: ca247e57fd842bbbd9752ac521a1d9163622a685
5
5
  SHA512:
6
- metadata.gz: e67c81f9a4368a9ca83463bdae86c498407478e5cfc8ed96ffc680234d8e9bcf5b4553a5be612990d908fac84ab1b6d15efcde86ea78ab43a671bf1b3f06385e
7
- data.tar.gz: 545532d071afaef42922a643c5a835f8e01e0fab14e50ee235d8e4c169c311b7e94db26ce555464a2684232fe219affe08f82f53f660f0b144e429fa903879cc
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.
@@ -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.3'
19
+ VERSION = '0.3.4'
20
20
 
21
- PIPE_BUFFER_SIZE = 512 #:nodoc:
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 = NOWAIT
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 = 0.chr * PIPE_BUFFER_SIZE
101
+ @buffer = ''
102
+ @ffi_buffer = FFI::Buffer.new( pipe_buffer_size )
102
103
  @size = 0
103
- @overlapped = Overlapped.new
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, @buffer, @buffer.size, bytes, @overlapped)
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 = @buffer[0, bytes_read]
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, @buffer, @buffer.size, bytes, nil)
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, @buffer, @buffer.size, bytes, @overlapped)
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, @buffer, @buffer.size, bytes, nil)
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 = @buffer[0, @transferred]
240
+ @buffer = @ffi_buffer.get_string(0, @transferred)
243
241
  end
244
242
 
245
243
  self
@@ -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,
@@ -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
- PIPE_BUFFER_SIZE,
26
- PIPE_BUFFER_SIZE,
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
@@ -14,7 +14,7 @@ class TC_Win32_Pipe < Test::Unit::TestCase
14
14
  end
15
15
 
16
16
  test "version is set to expected value" do
17
- assert_equal('0.3.3', Pipe::VERSION)
17
+ assert_equal('0.3.4', Pipe::VERSION)
18
18
  end
19
19
 
20
20
  test "name method basic functionality" do
@@ -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.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.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: 2013-10-21 00:00:00.000000000 Z
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.1.9
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