ruby-dbus 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS +16 -0
- data/README +1 -1
- data/Rakefile +20 -10
- data/VERSION +1 -1
- data/lib/dbus/auth.rb +11 -5
- data/lib/dbus/bus.rb +57 -27
- data/lib/dbus/export.rb +9 -6
- data/lib/dbus/introspect.rb +24 -42
- data/lib/dbus/marshall.rb +20 -19
- data/lib/dbus/matchrule.rb +2 -1
- data/lib/dbus/message.rb +1 -1
- data/ruby-dbus.gemspec +2 -0
- data/test/binding_test.rb +1 -1
- data/test/bus_driver_test.rb +1 -1
- data/test/bus_test.rb +18 -0
- data/test/property_test.rb +1 -1
- data/test/server_robustness_test.rb +3 -3
- data/test/server_test.rb +1 -1
- data/test/service_newapi.rb +9 -1
- data/test/session_bus_test_manual.rb +1 -1
- data/test/signal_test.rb +1 -1
- data/test/t2.rb +7 -1
- data/test/t3-ticket27.rb +1 -1
- data/test/t5-report-dbus-interface.rb +1 -1
- data/test/t6-loop.rb +1 -1
- data/test/thread_safety_test.rb +35 -0
- data/test/variant_test.rb +1 -1
- metadata +15 -13
- data/doc/tutorial/index.html +0 -365
- data/examples/no-introspect/call-overloaded.rb +0 -22
data/lib/dbus/marshall.rb
CHANGED
@@ -42,9 +42,7 @@ module DBus
|
|
42
42
|
@uint16 = "v"
|
43
43
|
@double = "E"
|
44
44
|
else
|
45
|
-
|
46
|
-
# yes, idea for a good name ? :)
|
47
|
-
raise Exception, "Incorrect endianness"
|
45
|
+
raise InvalidPacketException, "Incorrect endianness #{@endianness}"
|
48
46
|
end
|
49
47
|
@idx = 0
|
50
48
|
end
|
@@ -53,7 +51,7 @@ module DBus
|
|
53
51
|
# Return an array of unmarshalled objects
|
54
52
|
def unmarshall(signature, len = nil)
|
55
53
|
if len != nil
|
56
|
-
if @buffy.
|
54
|
+
if @buffy.bytesize < @idx + len
|
57
55
|
raise IncompleteBufferException
|
58
56
|
end
|
59
57
|
end
|
@@ -73,7 +71,7 @@ module DBus
|
|
73
71
|
when 2, 4, 8
|
74
72
|
bits = a - 1
|
75
73
|
@idx = @idx + bits & ~bits
|
76
|
-
raise IncompleteBufferException if @idx > @buffy.
|
74
|
+
raise IncompleteBufferException if @idx > @buffy.bytesize
|
77
75
|
else
|
78
76
|
raise "Unsupported alignment #{a}"
|
79
77
|
end
|
@@ -86,7 +84,7 @@ module DBus
|
|
86
84
|
|
87
85
|
# Retrieve the next _nbytes_ number of bytes from the buffer.
|
88
86
|
def get(nbytes)
|
89
|
-
raise IncompleteBufferException if @idx + nbytes > @buffy.
|
87
|
+
raise IncompleteBufferException if @idx + nbytes > @buffy.bytesize
|
90
88
|
ret = @buffy.slice(@idx, nbytes)
|
91
89
|
@idx += nbytes
|
92
90
|
ret
|
@@ -96,8 +94,8 @@ module DBus
|
|
96
94
|
def get_nul_terminated
|
97
95
|
raise IncompleteBufferException if not @buffy[@idx..-1] =~ /^([^\0]*)\0/
|
98
96
|
str = $1
|
99
|
-
raise IncompleteBufferException if @idx + str.
|
100
|
-
@idx += str.
|
97
|
+
raise IncompleteBufferException if @idx + str.bytesize + 1 > @buffy.bytesize
|
98
|
+
@idx += str.bytesize + 1
|
101
99
|
str
|
102
100
|
end
|
103
101
|
|
@@ -107,7 +105,7 @@ module DBus
|
|
107
105
|
align(4)
|
108
106
|
str_sz = get(4).unpack(@uint32)[0]
|
109
107
|
ret = @buffy.slice(@idx, str_sz)
|
110
|
-
raise IncompleteBufferException if @idx + str_sz + 1 > @buffy.
|
108
|
+
raise IncompleteBufferException if @idx + str_sz + 1 > @buffy.bytesize
|
111
109
|
@idx += str_sz
|
112
110
|
if @buffy[@idx].ord != 0
|
113
111
|
raise InvalidPacketException, "String is not nul-terminated"
|
@@ -122,7 +120,7 @@ module DBus
|
|
122
120
|
def get_signature
|
123
121
|
str_sz = get(1).unpack('C')[0]
|
124
122
|
ret = @buffy.slice(@idx, str_sz)
|
125
|
-
raise IncompleteBufferException if @idx + str_sz + 1 >= @buffy.
|
123
|
+
raise IncompleteBufferException if @idx + str_sz + 1 >= @buffy.bytesize
|
126
124
|
@idx += str_sz
|
127
125
|
if @buffy[@idx].ord != 0
|
128
126
|
raise InvalidPacketException, "Type is not nul-terminated"
|
@@ -193,7 +191,7 @@ module DBus
|
|
193
191
|
raise InvalidPacketException if array_sz > 67108864
|
194
192
|
|
195
193
|
align(signature.child.alignment)
|
196
|
-
raise IncompleteBufferException if @idx + array_sz > @buffy.
|
194
|
+
raise IncompleteBufferException if @idx + array_sz > @buffy.bytesize
|
197
195
|
|
198
196
|
packet = Array.new
|
199
197
|
start_idx = @idx
|
@@ -223,6 +221,7 @@ module DBus
|
|
223
221
|
packet = get_string
|
224
222
|
when Type::STRING
|
225
223
|
packet = get_string
|
224
|
+
packet.force_encoding('UTF-8') if RUBY_VERSION >= '1.9'
|
226
225
|
when Type::SIGNATURE
|
227
226
|
packet = get_signature
|
228
227
|
when Type::DICT_ENTRY
|
@@ -240,7 +239,7 @@ module DBus
|
|
240
239
|
|
241
240
|
# D-Bus packet marshaller class
|
242
241
|
#
|
243
|
-
# Class that handles the conversion (
|
242
|
+
# Class that handles the conversion (marshalling) of Ruby objects to
|
244
243
|
# (binary) payload data.
|
245
244
|
class PacketMarshaller
|
246
245
|
# The current or result packet.
|
@@ -267,18 +266,18 @@ module DBus
|
|
267
266
|
|
268
267
|
# Align the buffer with NULL (\0) bytes on a byte length of _a_.
|
269
268
|
def align(a)
|
270
|
-
@packet = @packet.ljust(num_align(@offset + @packet.
|
269
|
+
@packet = @packet.ljust(num_align(@offset + @packet.bytesize, a) - @offset, 0.chr)
|
271
270
|
end
|
272
271
|
|
273
272
|
# Append the the string _str_ itself to the packet.
|
274
273
|
def append_string(str)
|
275
274
|
align(4)
|
276
|
-
@packet += [str.
|
275
|
+
@packet += [str.bytesize].pack("L") + [str].pack("Z*")
|
277
276
|
end
|
278
277
|
|
279
278
|
# Append the the signature _signature_ itself to the packet.
|
280
279
|
def append_signature(str)
|
281
|
-
@packet += str.
|
280
|
+
@packet += str.bytesize.chr + str + "\0"
|
282
281
|
end
|
283
282
|
|
284
283
|
# Append the array type _type_ to the packet and allow for appending
|
@@ -286,12 +285,12 @@ module DBus
|
|
286
285
|
def array(type)
|
287
286
|
# Thanks to Peter Rullmann for this line
|
288
287
|
align(4)
|
289
|
-
sizeidx = @packet.
|
288
|
+
sizeidx = @packet.bytesize
|
290
289
|
@packet += "ABCD"
|
291
290
|
align(type.alignment)
|
292
|
-
contentidx = @packet.
|
291
|
+
contentidx = @packet.bytesize
|
293
292
|
yield
|
294
|
-
sz = @packet.
|
293
|
+
sz = @packet.bytesize - contentidx
|
295
294
|
raise InvalidPacketException if sz > 67108864
|
296
295
|
@packet[sizeidx...sizeidx + 4] = [sz].pack("L")
|
297
296
|
end
|
@@ -308,6 +307,8 @@ module DBus
|
|
308
307
|
end
|
309
308
|
|
310
309
|
# Append a value _val_ to the packet based on its _type_.
|
310
|
+
#
|
311
|
+
# Host native endianness is used, declared in Message#marshall
|
311
312
|
def append(type, val)
|
312
313
|
raise TypeException, "Cannot send nil" if val.nil?
|
313
314
|
|
@@ -372,7 +373,7 @@ module DBus
|
|
372
373
|
|
373
374
|
append_signature(vartype.to_s)
|
374
375
|
align(vartype.alignment)
|
375
|
-
sub = PacketMarshaller.new(@offset + @packet.
|
376
|
+
sub = PacketMarshaller.new(@offset + @packet.bytesize)
|
376
377
|
sub.append(vartype, vardata)
|
377
378
|
@packet += sub.packet
|
378
379
|
when Type::ARRAY
|
data/lib/dbus/matchrule.rb
CHANGED
@@ -15,7 +15,7 @@ module DBus
|
|
15
15
|
#
|
16
16
|
# FIXME
|
17
17
|
class MatchRule
|
18
|
-
# The list of possible match filters.
|
18
|
+
# The list of possible match filters. TODO argN, argNpath
|
19
19
|
FILTERS = [:sender, :interface, :member, :path, :destination, :type]
|
20
20
|
# The sender filter.
|
21
21
|
attr_accessor :sender
|
@@ -94,6 +94,7 @@ module DBus
|
|
94
94
|
return false if @interface and @interface != msg.interface
|
95
95
|
return false if @member and @member != msg.member
|
96
96
|
return false if @path and @path != msg.path
|
97
|
+
# FIXME sender and destination are ignored
|
97
98
|
true
|
98
99
|
end
|
99
100
|
end # class MatchRule
|
data/lib/dbus/message.rb
CHANGED
@@ -152,7 +152,7 @@ module DBus
|
|
152
152
|
@params.each do |param|
|
153
153
|
params.append(param[0], param[1])
|
154
154
|
end
|
155
|
-
@body_length = params.packet.
|
155
|
+
@body_length = params.packet.bytesize
|
156
156
|
|
157
157
|
marshaller = PacketMarshaller.new
|
158
158
|
marshaller.append(Type::BYTE, HOST_END)
|
data/ruby-dbus.gemspec
CHANGED
@@ -8,6 +8,7 @@ GEMSPEC = Gem::Specification.new do |s|
|
|
8
8
|
s.summary = "Ruby module for interaction with D-Bus"
|
9
9
|
# s.description = FIXME
|
10
10
|
s.version = File.read("VERSION").strip
|
11
|
+
s.license = "LGPL v2.1"
|
11
12
|
s.author = "Ruby DBus Team"
|
12
13
|
s.email = "ruby-dbus-devel@lists.luon.net"
|
13
14
|
s.homepage = "https://trac.luon.net/ruby-dbus"
|
@@ -15,4 +16,5 @@ GEMSPEC = Gem::Specification.new do |s|
|
|
15
16
|
s.require_path = "lib"
|
16
17
|
s.has_rdoc = true
|
17
18
|
s.extra_rdoc_files = ["COPYING", "README", "NEWS"]
|
19
|
+
s.required_ruby_version = ">= 1.8.7"
|
18
20
|
end
|
data/test/binding_test.rb
CHANGED
data/test/bus_driver_test.rb
CHANGED
data/test/bus_test.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Test the bus class
|
3
|
+
require "test/unit"
|
4
|
+
require "dbus"
|
5
|
+
|
6
|
+
class BusTest < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@bus = DBus::ASessionBus.new
|
9
|
+
@svc = @bus.service("org.ruby.service")
|
10
|
+
@svc.object("/").introspect
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_introspection_not_leaking
|
14
|
+
# peek inside the object to see if a cleanup step worked or not
|
15
|
+
some_hash = @bus.instance_eval { @method_call_replies || Hash.new }
|
16
|
+
assert_equal 0, some_hash.size, "there are leftover method handlers"
|
17
|
+
end
|
18
|
+
end
|
data/test/property_test.rb
CHANGED
@@ -5,7 +5,7 @@ require "dbus"
|
|
5
5
|
|
6
6
|
class ServerRobustnessTest < Test::Unit::TestCase
|
7
7
|
def setup
|
8
|
-
@bus = DBus::
|
8
|
+
@bus = DBus::ASessionBus.new
|
9
9
|
@svc = @bus.service("org.ruby.service")
|
10
10
|
end
|
11
11
|
|
@@ -57,7 +57,7 @@ class ServerRobustnessTest < Test::Unit::TestCase
|
|
57
57
|
ifc.not_the_answer
|
58
58
|
assert false, "should have raised"
|
59
59
|
rescue DBus::Error => e
|
60
|
-
assert_no_match(/timeout/, e)
|
60
|
+
assert_no_match(/timeout/, e.to_s)
|
61
61
|
end
|
62
62
|
|
63
63
|
def test_no_such_interface_without_introspection
|
@@ -67,6 +67,6 @@ class ServerRobustnessTest < Test::Unit::TestCase
|
|
67
67
|
ifc.the_answer
|
68
68
|
assert false, "should have raised"
|
69
69
|
rescue DBus::Error => e
|
70
|
-
assert_no_match(/timeout/, e)
|
70
|
+
assert_no_match(/timeout/, e.to_s)
|
71
71
|
end
|
72
72
|
end
|
data/test/server_test.rb
CHANGED
data/test/service_newapi.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
2
3
|
|
3
4
|
# find the library without external help
|
4
5
|
$:.unshift File.expand_path("../../lib", __FILE__)
|
@@ -56,6 +57,13 @@ class Test < DBus::Object
|
|
56
57
|
dbus_method :Error, "in name:s, in description:s" do |name, description|
|
57
58
|
raise DBus.error(name), description
|
58
59
|
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# closing and reopening the same interface
|
63
|
+
dbus_interface INTERFACE do
|
64
|
+
dbus_method :multibyte_string, "out string:s" do
|
65
|
+
"あいうえお"
|
66
|
+
end
|
59
67
|
|
60
68
|
dbus_signal :SomethingJustHappened, "toto:s, tutu:u"
|
61
69
|
end
|
@@ -186,7 +194,7 @@ bus.add_match(mr) do |msg|
|
|
186
194
|
end
|
187
195
|
end
|
188
196
|
|
189
|
-
puts "listening"
|
197
|
+
puts "listening, with ruby-#{RUBY_VERSION}"
|
190
198
|
main = DBus::Main.new
|
191
199
|
main << bus
|
192
200
|
begin
|
@@ -10,7 +10,7 @@ class SessionBusAddressTest < Test::Unit::TestCase
|
|
10
10
|
def setup
|
11
11
|
# test getting the session bus address even if unset in ENV (Issue#4)
|
12
12
|
ENV.delete "DBUS_SESSION_BUS_ADDRESS"
|
13
|
-
@bus = DBus::
|
13
|
+
@bus = DBus::ASessionBus.new
|
14
14
|
@svc = @bus.service("org.freedesktop.DBus")
|
15
15
|
end
|
16
16
|
|
data/test/signal_test.rb
CHANGED
@@ -9,7 +9,7 @@ end
|
|
9
9
|
|
10
10
|
class SignalHandlerTest < Test::Unit::TestCase
|
11
11
|
def setup
|
12
|
-
@session_bus = DBus::
|
12
|
+
@session_bus = DBus::ASessionBus.new
|
13
13
|
svc = @session_bus.service("org.ruby.service")
|
14
14
|
@obj = svc.object("/org/ruby/MyInstance")
|
15
15
|
@obj.introspect # necessary
|
data/test/t2.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
2
3
|
require "test/unit"
|
3
4
|
require "dbus"
|
4
5
|
|
5
6
|
class ValueTest < Test::Unit::TestCase
|
6
7
|
def setup
|
7
|
-
session_bus = DBus::
|
8
|
+
session_bus = DBus::ASessionBus.new
|
8
9
|
svc = session_bus.service("org.ruby.service")
|
9
10
|
@obj = svc.object("/org/ruby/MyInstance")
|
10
11
|
@obj.introspect # necessary
|
@@ -63,4 +64,9 @@ class ValueTest < Test::Unit::TestCase
|
|
63
64
|
# "warning: default `to_a' will be obsolete"
|
64
65
|
@obj.the_answer
|
65
66
|
end
|
67
|
+
|
68
|
+
def test_multibyte_string
|
69
|
+
str = @obj.multibyte_string[0]
|
70
|
+
assert_equal "あいうえお", str
|
71
|
+
end
|
66
72
|
end
|
data/test/t3-ticket27.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# Test passing a particular struct array through a variant
|
3
3
|
# https://trac.luon.net/ruby-dbus/ticket/27
|
4
4
|
require "dbus"
|
5
|
-
session_bus = DBus::
|
5
|
+
session_bus = DBus::ASessionBus.new
|
6
6
|
svc = session_bus.service("org.ruby.service")
|
7
7
|
obj = svc.object("/org/ruby/MyInstance")
|
8
8
|
obj.introspect # necessary
|
@@ -6,7 +6,7 @@ require "dbus"
|
|
6
6
|
|
7
7
|
class ErrMsgTest < Test::Unit::TestCase
|
8
8
|
def setup
|
9
|
-
session_bus = DBus::
|
9
|
+
session_bus = DBus::ASessionBus.new
|
10
10
|
svc = session_bus.service("org.ruby.service")
|
11
11
|
@obj = svc.object("/org/ruby/MyInstance")
|
12
12
|
@obj.introspect # necessary
|
data/test/t6-loop.rb
CHANGED
@@ -9,7 +9,7 @@ end
|
|
9
9
|
|
10
10
|
class MainLoopTest < Test::Unit::TestCase
|
11
11
|
def setup
|
12
|
-
@session_bus = DBus::
|
12
|
+
@session_bus = DBus::ASessionBus.new
|
13
13
|
svc = @session_bus.service("org.ruby.service")
|
14
14
|
@obj = svc.object("/org/ruby/MyInstance")
|
15
15
|
@obj.introspect # necessary
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Test thread safety
|
3
|
+
require "test/unit"
|
4
|
+
require "dbus"
|
5
|
+
|
6
|
+
def d(msg)
|
7
|
+
puts "#{$$} #{msg}" if $DEBUG
|
8
|
+
end
|
9
|
+
|
10
|
+
class ThreadSafetyTest < Test::Unit::TestCase
|
11
|
+
def test_thread_competition
|
12
|
+
print "Thread competition: "
|
13
|
+
jobs = []
|
14
|
+
5.times do
|
15
|
+
jobs << Thread.new do
|
16
|
+
Thread.current.abort_on_exception = true
|
17
|
+
|
18
|
+
# use separate connections to avoid races
|
19
|
+
bus = DBus::ASessionBus.new
|
20
|
+
svc = bus.service("org.ruby.service")
|
21
|
+
obj = svc.object("/org/ruby/MyInstance")
|
22
|
+
obj.introspect
|
23
|
+
obj.default_iface = "org.ruby.SampleInterface"
|
24
|
+
|
25
|
+
10.times do |i|
|
26
|
+
print "#{i} "
|
27
|
+
$stdout.flush
|
28
|
+
assert_equal 42, obj.the_answer[0]
|
29
|
+
sleep 0.1 * rand
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
jobs.each do |thread| thread.join end
|
34
|
+
end
|
35
|
+
end
|
data/test/variant_test.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-dbus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 3
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 7
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.7.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ruby DBus Team
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-07-26 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -32,12 +32,10 @@ extra_rdoc_files:
|
|
32
32
|
files:
|
33
33
|
- Rakefile
|
34
34
|
- VERSION
|
35
|
-
- doc/tutorial/index.html
|
36
35
|
- doc/tutorial/index.markdown
|
37
36
|
- examples/gdbus/gdbus
|
38
37
|
- examples/gdbus/gdbus.glade
|
39
38
|
- examples/gdbus/launch.sh
|
40
|
-
- examples/no-introspect/call-overloaded.rb
|
41
39
|
- examples/no-introspect/nm-test.rb
|
42
40
|
- examples/no-introspect/tracker-test.rb
|
43
41
|
- examples/rhythmbox/playpause.rb
|
@@ -63,6 +61,7 @@ files:
|
|
63
61
|
- ruby-dbus.gemspec
|
64
62
|
- test/binding_test.rb
|
65
63
|
- test/bus_driver_test.rb
|
64
|
+
- test/bus_test.rb
|
66
65
|
- test/dbus-launch-simple
|
67
66
|
- test/dbus-limited-session.conf
|
68
67
|
- test/property_test.rb
|
@@ -78,14 +77,15 @@ files:
|
|
78
77
|
- test/t6-loop.rb
|
79
78
|
- test/test_env
|
80
79
|
- test/test_server
|
80
|
+
- test/thread_safety_test.rb
|
81
81
|
- test/variant_test.rb
|
82
82
|
- COPYING
|
83
83
|
- README
|
84
84
|
- NEWS
|
85
85
|
has_rdoc: true
|
86
86
|
homepage: https://trac.luon.net/ruby-dbus
|
87
|
-
licenses:
|
88
|
-
|
87
|
+
licenses:
|
88
|
+
- LGPL v2.1
|
89
89
|
post_install_message:
|
90
90
|
rdoc_options: []
|
91
91
|
|
@@ -96,10 +96,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
96
96
|
requirements:
|
97
97
|
- - ">="
|
98
98
|
- !ruby/object:Gem::Version
|
99
|
-
hash:
|
99
|
+
hash: 57
|
100
100
|
segments:
|
101
|
-
-
|
102
|
-
|
101
|
+
- 1
|
102
|
+
- 8
|
103
|
+
- 7
|
104
|
+
version: 1.8.7
|
103
105
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
106
|
none: false
|
105
107
|
requirements:
|
@@ -112,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
114
|
requirements: []
|
113
115
|
|
114
116
|
rubyforge_project:
|
115
|
-
rubygems_version: 1.
|
117
|
+
rubygems_version: 1.5.2
|
116
118
|
signing_key:
|
117
119
|
specification_version: 3
|
118
120
|
summary: Ruby module for interaction with D-Bus
|