ruby-dbus 0.12.0 → 0.13.0

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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +344 -0
  3. data/Rakefile +21 -15
  4. data/VERSION +1 -1
  5. data/doc/Reference.md +26 -37
  6. data/examples/doc/_extract_examples +4 -4
  7. data/examples/gdbus/gdbus +40 -39
  8. data/examples/no-introspect/nm-test.rb +1 -3
  9. data/examples/no-introspect/tracker-test.rb +2 -4
  10. data/examples/rhythmbox/playpause.rb +1 -2
  11. data/examples/service/call_service.rb +0 -3
  12. data/examples/service/service_newapi.rb +3 -4
  13. data/examples/simple/call_introspect.rb +0 -3
  14. data/examples/simple/get_id.rb +1 -3
  15. data/examples/simple/properties.rb +3 -4
  16. data/examples/utils/listnames.rb +6 -7
  17. data/examples/utils/notify.rb +3 -5
  18. data/lib/dbus.rb +8 -20
  19. data/lib/dbus/auth.rb +59 -61
  20. data/lib/dbus/bus.rb +86 -97
  21. data/lib/dbus/error.rb +1 -1
  22. data/lib/dbus/export.rb +20 -18
  23. data/lib/dbus/introspect.rb +26 -28
  24. data/lib/dbus/logger.rb +1 -1
  25. data/lib/dbus/marshall.rb +72 -74
  26. data/lib/dbus/matchrule.rb +22 -26
  27. data/lib/dbus/message.rb +24 -33
  28. data/lib/dbus/message_queue.rb +30 -30
  29. data/lib/dbus/proxy_object.rb +34 -30
  30. data/lib/dbus/proxy_object_factory.rb +5 -2
  31. data/lib/dbus/proxy_object_interface.rb +10 -8
  32. data/lib/dbus/type.rb +154 -156
  33. data/lib/dbus/xml.rb +22 -16
  34. data/ruby-dbus.gemspec +15 -3
  35. data/spec/async_spec.rb +2 -4
  36. data/spec/binding_spec.rb +1 -5
  37. data/spec/bus_and_xml_backend_spec.rb +6 -9
  38. data/spec/bus_spec.rb +1 -1
  39. data/spec/byte_array_spec.rb +0 -2
  40. data/spec/err_msg_spec.rb +13 -10
  41. data/spec/introspect_xml_parser_spec.rb +2 -2
  42. data/spec/introspection_spec.rb +1 -1
  43. data/spec/main_loop_spec.rb +4 -5
  44. data/spec/property_spec.rb +0 -3
  45. data/spec/proxy_object_spec.rb +42 -0
  46. data/spec/server_robustness_spec.rb +0 -2
  47. data/spec/service_newapi.rb +51 -41
  48. data/spec/session_bus_spec.rb +6 -7
  49. data/spec/signal_spec.rb +2 -3
  50. data/spec/spec_helper.rb +28 -24
  51. data/spec/thread_safety_spec.rb +1 -2
  52. data/spec/type_spec.rb +2 -2
  53. data/spec/value_spec.rb +7 -10
  54. data/spec/variant_spec.rb +15 -16
  55. metadata +60 -3
  56. data/NEWS +0 -279
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  if ARGV[0].nil?
3
- puts "Usage: #{$0} file.md"
3
+ puts "Usage: #{$PROGRAM_NAME} file.md"
4
4
  exit
5
5
  end
6
6
 
@@ -11,7 +11,7 @@ File.open(ARGV[0]) do |f|
11
11
  f.each_line do |line|
12
12
  case line
13
13
  when /^#+ *(.*)/
14
- new_title = $1
14
+ new_title = Regexp.last_match(1)
15
15
 
16
16
  # write previous example
17
17
  unless example.empty?
@@ -22,7 +22,7 @@ File.open(ARGV[0]) do |f|
22
22
  File.open("#{basename}.rb", "w") do |e|
23
23
  e.write setup
24
24
  e.write example
25
- e.chmod(0755)
25
+ e.chmod(0o755)
26
26
  end
27
27
  end
28
28
  end
@@ -31,7 +31,7 @@ File.open(ARGV[0]) do |f|
31
31
  title = new_title
32
32
  example = ""
33
33
  when /^ (.*)/
34
- example << $1 << "\n"
34
+ example << Regexp.last_match(1) << "\n"
35
35
  end
36
36
  end
37
37
  end
@@ -5,19 +5,20 @@
5
5
  # stuff.
6
6
  # -- Arnaud
7
7
 
8
- require 'dbus'
8
+ require "dbus"
9
9
  require "gtk2"
10
10
 
11
- $enable_system = false
11
+ ENABLE_SYSTEM = false
12
12
 
13
13
  class MethodCallWindow
14
14
  def initialize(pwindow, intf, meth)
15
- @intf, @meth = intf, meth
16
- @entries = Array.new
15
+ @intf = intf
16
+ @meth = meth
17
+ @entries = []
17
18
  @dialog = Gtk::Dialog.new(meth.name, pwindow,
18
- Gtk::Dialog::MODAL | Gtk::Dialog::NO_SEPARATOR,
19
- [Gtk::Stock::OK, Gtk::Dialog::RESPONSE_OK],
20
- [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL])
19
+ Gtk::Dialog::MODAL | Gtk::Dialog::NO_SEPARATOR,
20
+ [Gtk::Stock::OK, Gtk::Dialog::RESPONSE_OK],
21
+ [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL])
21
22
 
22
23
  @meth.params.each do |param|
23
24
  shbox = Gtk::HBox.new(true, 0)
@@ -61,14 +62,13 @@ class MethodCallWindow
61
62
  end
62
63
  m.add_param(param[1], data)
63
64
  end
64
- bus.on_return(m) do |retm|
65
+ bus.send_sync_or_async(m) do |retm|
65
66
  if retm.is_a?(DBus::Error)
66
67
  puts "Error: #{retm.inspect}"
67
68
  else
68
69
  puts "Method #{m.member} returns: #{retm.params.inspect}"
69
70
  end
70
71
  end
71
- bus.send(m.marshall)
72
72
  end
73
73
  end
74
74
 
@@ -78,13 +78,13 @@ class DBusUI
78
78
  @glade << "gdbus.glade"
79
79
 
80
80
  @sessiontreeview = @glade.get_object("sessiontreeview")
81
- setup_treeview_renderer(@sessiontreeview, 'D-Bus Objects')
81
+ setup_treeview_renderer(@sessiontreeview, "D-Bus Objects")
82
82
  @sessiontreeview.selection.signal_connect("changed") do |selection|
83
83
  on_treeview_selection_changed(selection)
84
84
  end
85
85
 
86
86
  @systemtreeview = @glade.get_object("systemtreeview")
87
- setup_treeview_renderer(@systemtreeview, 'D-Bus Objects')
87
+ setup_treeview_renderer(@systemtreeview, "D-Bus Objects")
88
88
  @systemtreeview.selection.signal_connect("changed") do |selection|
89
89
  on_treeview_selection_changed(selection)
90
90
  end
@@ -92,6 +92,9 @@ class DBusUI
92
92
  @methsigtreeview = @glade.get_object("methsigtreeview")
93
93
  # ierk
94
94
  setup_methodview_renderer(@methsigtreeview)
95
+ @methsigtreeview.signal_connect("row-activated") do |view, path, column|
96
+ on_method_activated(view, path, column)
97
+ end
95
98
 
96
99
  @window = @glade.get_object("window1")
97
100
  @window.show_all
@@ -101,10 +104,10 @@ class DBusUI
101
104
  def beautify_method(meth)
102
105
  # Damn, this need to be rewritten :p
103
106
  s = meth.name + "("
104
- if meth.kind_of?(DBus::Method)
107
+ if meth.is_a?(DBus::Method)
105
108
  s += (meth.params.collect { |a| "in #{a[0]}:#{a[1]}" } +
106
109
  meth.rets.collect { |a| "out #{a[0]}:#{a[1]}" }).join(", ")
107
- elsif meth.kind_of?(DBus::Signal)
110
+ elsif meth.is_a?(DBus::Signal)
108
111
  s += (meth.params.collect { |a| "in #{a[0]}:#{a[1]}" }).join(", ")
109
112
  end
110
113
  s += ")"
@@ -117,7 +120,7 @@ class DBusUI
117
120
  DBus::ProxyObjectInterface)
118
121
  @methsigtreeview.model = model
119
122
  if selected
120
- if intf = selected[1]
123
+ if (intf = selected[1])
121
124
  intf.methods.keys.sort.each do |mi|
122
125
  m = intf.methods[mi]
123
126
  subiter = model.append
@@ -138,11 +141,10 @@ class DBusUI
138
141
  end
139
142
  end
140
143
 
141
- def on_method_activated(view, path, column)
144
+ def on_method_activated(view, path, _column)
142
145
  name = view.model.get_iter(path)[0]
143
146
  puts "Clicked on: #{name.inspect}"
144
147
  type = view.model.get_iter(path)[1]
145
- intf = view.model.get_iter(path)[2]
146
148
  if type == "M"
147
149
  method = view.model.get_iter(path)[2]
148
150
  intf = view.model.get_iter(path)[3]
@@ -151,34 +153,33 @@ class DBusUI
151
153
  signal = view.model.get_iter(path)[2]
152
154
  intf = view.model.get_iter(path)[3]
153
155
  mr = DBus::MatchRule.new.from_signal(intf, signal)
154
- puts "*** Registering matchrule: #{mr.to_s} ***"
156
+ puts "*** Registering matchrule: #{mr} ***"
155
157
  intf.object.bus.add_match(mr) do |sig|
156
- puts "Got #{sig.member}(#{sig.params.join(',')})"
158
+ puts "Got #{sig.member}(#{sig.params.join(",")})"
157
159
  end
158
160
  end
159
161
  end
160
162
 
161
- def on_sessiontreeview_row_activated(view, path, column)
163
+ def on_sessiontreeview_row_activated(view, path, _column)
162
164
  name = view.model.get_iter(path)[0]
163
165
  puts "Clicked on: #{name.inspect}"
164
- intf = view.model.get_iter(path)[1]
165
166
  end
166
167
 
167
- def on_window_delete_event(window, event)
168
+ def on_window_delete_event(_window, _event)
168
169
  Gtk.main_quit
169
170
  end
170
171
 
171
172
  def setup_methodview_renderer(treeview)
172
173
  renderer = Gtk::CellRendererText.new
173
- col_offset = treeview.insert_column(-1, "T", renderer, 'text' => 1)
174
- col_offset = treeview.insert_column(-1, "Name", renderer, 'text' => 0)
174
+ _col_offset = treeview.insert_column(-1, "T", renderer, "text" => 1)
175
+ col_offset = treeview.insert_column(-1, "Name", renderer, "text" => 0)
175
176
  column = treeview.get_column(col_offset - 1)
176
177
  column.clickable = true
177
178
  end
178
179
 
179
180
  def setup_treeview_renderer(treeview, str)
180
181
  renderer = Gtk::CellRendererText.new
181
- col_offset = treeview.insert_column(-1, str, renderer, 'text' => 0)
182
+ col_offset = treeview.insert_column(-1, str, renderer, "text" => 0)
182
183
  column = treeview.get_column(col_offset - 1)
183
184
  column.clickable = true
184
185
  end
@@ -196,15 +197,15 @@ class DBusUI
196
197
  def start_buses
197
198
  # call glibize to get dbus messages from the glib mainloop
198
199
  DBus::SessionBus.instance.glibize
199
- DBus::SystemBus.instance.glibize if $enable_system
200
+ DBus::SystemBus.instance.glibize if ENABLE_SYSTEM
200
201
 
201
- DBus::SessionBus.instance.proxy.ListNames do |msg, names|
202
+ DBus::SessionBus.instance.proxy.ListNames do |_msg, names|
202
203
  fill_treeview(DBus::SessionBus.instance, @sessiontreeview, names)
203
204
  end
204
- if $enable_system
205
- DBus::SystemBus.instance.proxy.ListNames do |msg, names|
206
- fill_treeview(DBus::SystemBus.instance, @systemtreeview, names)
207
- end
205
+
206
+ return unless ENABLE_SYSTEM
207
+ DBus::SystemBus.instance.proxy.ListNames do |_msg, names|
208
+ fill_treeview(DBus::SystemBus.instance, @systemtreeview, names)
208
209
  end
209
210
  end
210
211
 
@@ -214,18 +215,18 @@ class DBusUI
214
215
  subiter[0] = key
215
216
  walk_node(model, subiter, val)
216
217
  end
217
- unless node.object.nil?
218
- node.object.interfaces.sort.each do |ifname|
219
- subiter = model.append(iter)
220
- subiter[0] = ifname
221
- subiter[1] = node.object[ifname]
222
- end
218
+
219
+ return if node.object.nil?
220
+ node.object.interfaces.sort.each do |ifname|
221
+ subiter = model.append(iter)
222
+ subiter[0] = ifname
223
+ subiter[1] = node.object[ifname]
223
224
  end
224
225
  end
225
226
 
226
227
  def introspect_services(model, bus)
227
228
  el = @introspect_array.shift
228
- if not el =~ /^:/
229
+ if !(el =~ /^:/)
229
230
  iter = model.append(nil)
230
231
  iter[0] = el
231
232
  puts "introspecting: #{el}"
@@ -238,14 +239,14 @@ class DBusUI
238
239
  end
239
240
  end
240
241
 
241
- not @introspect_array.empty?
242
+ !@introspect_array.empty?
242
243
  end
243
244
 
244
245
  def fill_treeview(bus, treeview, array)
245
246
  model = Gtk::TreeStore.new(String, DBus::ProxyObjectInterface)
246
247
  treeview.model = model
247
248
  @introspect_array = array.sort
248
- Gtk::idle_add { introspect_services(model, bus) }
249
+ Gtk.idle_add { introspect_services(model, bus) }
249
250
  end
250
251
 
251
252
  def main
@@ -3,7 +3,7 @@
3
3
  # Trivial network interface lister using NetworkManager.
4
4
  # NetworkManager does not support introspection, so the api is not that sexy.
5
5
 
6
- require 'dbus'
6
+ require "dbus"
7
7
 
8
8
  bus = DBus::SystemBus.instance
9
9
 
@@ -17,5 +17,3 @@ rescue Exception
17
17
  poi.define_method("GetDevices", "") # NM 0.7
18
18
  p poi.GetDevices
19
19
  end
20
-
21
-
@@ -3,7 +3,7 @@
3
3
  # Trivial network interface lister using NetworkManager.
4
4
  # NetworkManager does not support introspection, so the api is not that sexy.
5
5
 
6
- require 'dbus'
6
+ require "dbus"
7
7
 
8
8
  bus = DBus::SessionBus.instance
9
9
 
@@ -11,6 +11,4 @@ tracker_service = bus.service("org.freedesktop.Tracker")
11
11
  tracker_manager = tracker_service.object("/org/freedesktop/tracker")
12
12
  poi = DBus::ProxyObjectInterface.new(tracker_manager, "org.freedesktop.Tracker.Files")
13
13
  poi.define_method("GetMetadataForFilesInFolder", "in live_query_id:i, in uri:s, in fields:as, out values:aas")
14
- p poi.GetMetadataForFilesInFolder(-1, ENV['HOME'] + "/Desktop", ["File:Name", "File:Size"])
15
-
16
-
14
+ p poi.GetMetadataForFilesInFolder(-1, ENV["HOME"] + "/Desktop", ["File:Name", "File:Size"])
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'dbus'
3
+ require "dbus"
4
4
  bus = DBus::SessionBus.instance
5
5
  # get a rb object
6
6
  proxy = bus.introspect("org.gnome.Rhythmbox", "/org/gnome/Rhythmbox/Player")
@@ -22,4 +22,3 @@ proxyi.playPause(true)
22
22
  main = DBus::Main.new
23
23
  main << bus
24
24
  main.run
25
-
@@ -9,8 +9,6 @@ ruby_srv = session_bus.service("org.ruby.service")
9
9
  # Get the object from this service
10
10
  player = ruby_srv.object("/org/ruby/MyInstance")
11
11
 
12
- # Introspect it
13
- puts player.introspect
14
12
  player.default_iface = "org.ruby.SampleInterface"
15
13
  player.test_variant(["s", "coucou"])
16
14
  player.on_signal("SomethingJustHappened") do |u, v|
@@ -22,4 +20,3 @@ p player["org.ruby.AnotherInterface"].Reverse("Hello world!")
22
20
  main = DBus::Main.new
23
21
  main << session_bus
24
22
  main.run
25
-
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'dbus'
4
- require 'thread'
3
+ require "dbus"
4
+ require "thread"
5
5
  Thread.abort_on_exception = true
6
6
 
7
7
  class Test < DBus::Object
@@ -37,7 +37,7 @@ service.export(myobj)
37
37
 
38
38
  Thread.new do
39
39
  i = 0
40
- loop do
40
+ loop do
41
41
  # Signal emission
42
42
  myobj.SomethingJustHappened("hey", i += 1)
43
43
  sleep(0.5)
@@ -48,4 +48,3 @@ puts "listening"
48
48
  main = DBus::Main.new
49
49
  main << bus
50
50
  main.run
51
-
@@ -10,8 +10,6 @@ rhythmbox = session_bus.service("org.gnome.Rhythmbox")
10
10
  # Get the object from this service
11
11
  player = rhythmbox.object("/org/gnome/Rhythmbox/Player")
12
12
 
13
- # Introspect it
14
- player.introspect
15
13
  if player.has_iface? "org.gnome.Rhythmbox.Player"
16
14
  puts "We have Rhythmbox Player interface"
17
15
  end
@@ -31,4 +29,3 @@ end
31
29
  main = DBus::Main.new
32
30
  main << session_bus
33
31
  main.run
34
-
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/env ruby
2
2
 
3
3
  # find the library without external help
4
- $:.unshift File.expand_path("../../../lib", __FILE__)
4
+ $LOAD_PATH.unshift File.expand_path("../../../lib", __FILE__)
5
5
 
6
6
  require "dbus"
7
7
 
@@ -10,8 +10,6 @@ driver_svc = bus["org.freedesktop.DBus"]
10
10
  # p driver_svc
11
11
  driver_obj = driver_svc["/"]
12
12
  # p driver_obj
13
- driver_obj.introspect
14
-
15
13
  driver_ifc = driver_obj["org.freedesktop.DBus"]
16
14
  # p driver_ifc
17
15
 
@@ -1,10 +1,9 @@
1
1
  #! /usr/bin/env ruby
2
- require 'dbus'
2
+ require "dbus"
3
3
 
4
4
  bus = DBus::SystemBus.instance
5
5
  nm_service = bus["org.freedesktop.NetworkManager"]
6
- network_manager_object = nm_service.object("/org/freedesktop/NetworkManager")
7
- network_manager_object.introspect
6
+ network_manager_object = nm_service["/org/freedesktop/NetworkManager"]
8
7
  nm_iface = network_manager_object["org.freedesktop.NetworkManager"]
9
8
 
10
9
  # read a property
@@ -16,4 +15,4 @@ else
16
15
  end
17
16
  puts "Toggling wireless"
18
17
  # write a property
19
- nm_iface["WirelessEnabled"] = ! enabled
18
+ nm_iface["WirelessEnabled"] = !enabled
@@ -1,11 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'dbus'
3
+ require "dbus"
4
4
 
5
5
  d = if ARGV.member?("--system")
6
- DBus::SystemBus.instance
7
- else
8
- DBus::SessionBus.instance
9
- end
10
- d.proxy.ListNames[0].each{ |n| puts "\t#{n}" }
11
-
6
+ DBus::SystemBus.instance
7
+ else
8
+ DBus::SessionBus.instance
9
+ end
10
+ d.proxy.ListNames[0].each { |n| puts "\t#{n}" }
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'dbus'
3
+ require "dbus"
4
4
 
5
5
  if ARGV.size < 2
6
6
  puts "Usage:"
@@ -9,11 +9,9 @@ if ARGV.size < 2
9
9
  end
10
10
 
11
11
  d = DBus::SessionBus.instance
12
- o = d.service("org.freedesktop.Notifications").object("/org/freedesktop/Notifications")
13
- o.introspect
12
+ o = d["org.freedesktop.Notifications"]["/org/freedesktop/Notifications"]
14
13
 
15
14
  i = o["org.freedesktop.Notifications"]
16
15
 
17
- i.Notify('notify.rb', 0, 'info', ARGV[0], ARGV[1], [], {}, 2000) do |ret, param|
16
+ i.Notify("notify.rb", 0, "info", ARGV[0], ARGV[1], [], {}, 2000) do |ret, param|
18
17
  end
19
-
@@ -34,26 +34,22 @@ require "thread"
34
34
  # Module containing all the D-Bus modules and classes.
35
35
  module DBus
36
36
  # Default socket name for the system bus.
37
- SystemSocketName = "unix:path=/var/run/dbus/system_bus_socket"
37
+ SystemSocketName = "unix:path=/var/run/dbus/system_bus_socket".freeze
38
38
 
39
39
  # Byte signifying big endianness.
40
- BIG_END = ?B
40
+ BIG_END = "B".freeze
41
41
  # Byte signifying little endianness.
42
- LIL_END = ?l
42
+ LIL_END = "l".freeze
43
43
 
44
44
  # Byte signifying the host's endianness.
45
45
  HOST_END = if [0x01020304].pack("L").unpack("V")[0] == 0x01020304
46
- LIL_END
47
- else
48
- BIG_END
49
- end
46
+ LIL_END
47
+ else
48
+ BIG_END
49
+ end
50
50
 
51
51
  # General exceptions.
52
52
 
53
- # Exception raised when an invalid packet is encountered.
54
- class InvalidPacketException < Exception
55
- end
56
-
57
53
  # Exception raised when there is a problem with a type (may be unknown or
58
54
  # mismatch).
59
55
  class TypeException < Exception
@@ -64,16 +60,8 @@ module DBus
64
60
  class IncompleteBufferException < Exception
65
61
  end
66
62
 
67
- # Exception raised when a method has not been implemented (yet).
68
- class MethodNotImplemented < Exception
69
- end
70
-
71
- # Exception raised when a method is invoked with invalid
72
- # parameters (wrong number or type).
73
- class InvalidParameters < Exception
74
- end
75
-
76
63
  # Exception raised when an invalid method name is used.
64
+ # FIXME: use NameError
77
65
  class InvalidMethodName < Exception
78
66
  end
79
67