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 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