ruby-dbus 0.16.0 → 0.25.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 (108) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +288 -3
  3. data/README.md +3 -5
  4. data/Rakefile +27 -12
  5. data/VERSION +1 -1
  6. data/doc/Reference.md +109 -10
  7. data/examples/doc/_extract_examples +7 -0
  8. data/examples/no-bus/pulseaudio.rb +50 -0
  9. data/examples/no-introspect/nm-test.rb +2 -0
  10. data/examples/no-introspect/tracker-test.rb +3 -1
  11. data/examples/rhythmbox/playpause.rb +2 -1
  12. data/examples/service/call_service.rb +2 -1
  13. data/examples/service/complex-property.rb +21 -0
  14. data/examples/service/service_newapi.rb +3 -3
  15. data/examples/simple/call_introspect.rb +1 -0
  16. data/examples/simple/get_id.rb +6 -3
  17. data/examples/simple/properties.rb +2 -0
  18. data/examples/utils/listnames.rb +10 -1
  19. data/examples/utils/notify.rb +1 -0
  20. data/lib/dbus/api_options.rb +9 -0
  21. data/lib/dbus/auth.rb +307 -217
  22. data/lib/dbus/bus.rb +155 -588
  23. data/lib/dbus/bus_name.rb +12 -8
  24. data/lib/dbus/connection.rb +363 -0
  25. data/lib/dbus/core_ext/class/attribute.rb +1 -1
  26. data/lib/dbus/data.rb +821 -0
  27. data/lib/dbus/emits_changed_signal.rb +83 -0
  28. data/lib/dbus/error.rb +4 -2
  29. data/lib/dbus/introspect.rb +133 -31
  30. data/lib/dbus/logger.rb +6 -3
  31. data/lib/dbus/main.rb +66 -0
  32. data/lib/dbus/marshall.rb +247 -296
  33. data/lib/dbus/matchrule.rb +16 -16
  34. data/lib/dbus/message.rb +66 -57
  35. data/lib/dbus/message_queue.rb +40 -25
  36. data/lib/dbus/node_tree.rb +105 -0
  37. data/lib/dbus/object.rb +442 -33
  38. data/lib/dbus/object_manager.rb +61 -0
  39. data/lib/dbus/object_path.rb +11 -6
  40. data/lib/dbus/object_server.rb +149 -0
  41. data/lib/dbus/org.freedesktop.DBus.xml +97 -0
  42. data/lib/dbus/platform.rb +26 -0
  43. data/lib/dbus/proxy_object.rb +30 -11
  44. data/lib/dbus/proxy_object_factory.rb +13 -7
  45. data/lib/dbus/proxy_object_interface.rb +63 -30
  46. data/lib/dbus/proxy_service.rb +107 -0
  47. data/lib/dbus/raw_message.rb +91 -0
  48. data/lib/dbus/type.rb +319 -86
  49. data/lib/dbus/xml.rb +40 -19
  50. data/lib/dbus.rb +28 -17
  51. data/ruby-dbus.gemspec +13 -6
  52. data/spec/async_spec.rb +2 -0
  53. data/spec/auth_spec.rb +225 -0
  54. data/spec/binding_spec.rb +2 -0
  55. data/spec/bus_and_xml_backend_spec.rb +5 -1
  56. data/spec/bus_connection_spec.rb +93 -0
  57. data/spec/bus_name_spec.rb +3 -1
  58. data/spec/bus_spec.rb +2 -0
  59. data/spec/byte_array_spec.rb +2 -0
  60. data/spec/client_robustness_spec.rb +4 -2
  61. data/spec/connection_spec.rb +37 -0
  62. data/spec/coverage_helper.rb +39 -0
  63. data/spec/data/marshall.yaml +1667 -0
  64. data/spec/data_spec.rb +673 -0
  65. data/spec/dbus_spec.rb +22 -0
  66. data/spec/emits_changed_signal_spec.rb +58 -0
  67. data/spec/err_msg_spec.rb +2 -0
  68. data/spec/introspect_xml_parser_spec.rb +2 -0
  69. data/spec/introspection_spec.rb +2 -0
  70. data/spec/main_loop_spec.rb +17 -1
  71. data/spec/message_spec.rb +21 -0
  72. data/spec/mock-service/cockpit-dbustests.rb +29 -0
  73. data/spec/mock-service/com.redhat.Cockpit.DBusTests.xml +180 -0
  74. data/spec/mock-service/org.ruby.service.service +4 -0
  75. data/spec/mock-service/org.rubygems.ruby_dbus.DBusTests.service +4 -0
  76. data/spec/{service_newapi.rb → mock-service/spaghetti-monster.rb} +122 -75
  77. data/spec/node_spec.rb +65 -0
  78. data/spec/object_manager_spec.rb +33 -0
  79. data/spec/object_path_spec.rb +3 -0
  80. data/spec/object_server_spec.rb +138 -0
  81. data/spec/object_spec.rb +194 -0
  82. data/spec/packet_marshaller_spec.rb +41 -0
  83. data/spec/packet_unmarshaller_spec.rb +248 -0
  84. data/spec/platform_spec.rb +14 -0
  85. data/spec/property_spec.rb +214 -12
  86. data/spec/proxy_object_interface_spec.rb +35 -0
  87. data/spec/proxy_object_spec.rb +2 -0
  88. data/spec/{bus_driver_spec.rb → proxy_service_spec.rb} +15 -8
  89. data/spec/raw_message_spec.rb +32 -0
  90. data/spec/server_robustness_spec.rb +20 -6
  91. data/spec/session_bus_spec.rb +36 -1
  92. data/spec/session_bus_spec_manual.rb +2 -0
  93. data/spec/signal_spec.rb +16 -3
  94. data/spec/spec_helper.rb +25 -33
  95. data/spec/thread_safety_spec.rb +55 -12
  96. data/spec/tools/dbus-launch-simple +9 -6
  97. data/spec/tools/dbus-limited-session.conf +32 -0
  98. data/spec/tools/test_env +26 -6
  99. data/spec/type_spec.rb +214 -6
  100. data/spec/value_spec.rb +16 -1
  101. data/spec/variant_spec.rb +4 -2
  102. data/spec/zzz_quit_spec.rb +16 -0
  103. metadata +92 -20
  104. data/examples/gdbus/gdbus +0 -257
  105. data/examples/gdbus/gdbus.glade +0 -98
  106. data/examples/gdbus/launch.sh +0 -4
  107. data/spec/server_spec.rb +0 -53
  108. data/spec/tools/test_server +0 -39
data/examples/gdbus/gdbus DELETED
@@ -1,257 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- # This is a quite complex example using internal lower level API.
4
- # Not a good starting point, but might be usefull if you want to do tricky
5
- # stuff.
6
- # -- Arnaud
7
-
8
- require "dbus"
9
- require "gtk2"
10
-
11
- ENABLE_SYSTEM = false
12
-
13
- class MethodCallWindow
14
- def initialize(pwindow, intf, meth)
15
- @intf = intf
16
- @meth = meth
17
- @entries = []
18
- @dialog = Gtk::Dialog.new(meth.name, pwindow,
19
- Gtk::Dialog::MODAL | Gtk::Dialog::NO_SEPARATOR,
20
- [Gtk::Stock::OK, Gtk::Dialog::RESPONSE_OK],
21
- [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL])
22
-
23
- @meth.params.each do |param|
24
- shbox = Gtk::HBox.new(true, 0)
25
- label = Gtk::Label.new("#{param[0]} (#{param[1]})")
26
- input = Gtk::Entry.new
27
- @entries << input
28
- shbox.pack_start(label, true, true, 0)
29
- shbox.pack_start(input, true, true, 0)
30
- @dialog.vbox.pack_start(shbox, true, true, 0)
31
- @dialog.vbox.show_all
32
- end
33
- end
34
-
35
- def run
36
- on_ok if @dialog.run == Gtk::Dialog::RESPONSE_OK
37
- @dialog.destroy
38
- end
39
-
40
- def on_ok
41
- bus = @intf.object.bus
42
- m = DBus::Message.new(DBus::Message::METHOD_CALL)
43
- m.path = @intf.object.path
44
- m.interface = @intf.name
45
- m.destination = @intf.object.destination
46
- m.member = @meth.name
47
- m.sender = bus.unique_name
48
- @meth.params.each_with_index do |param, idx|
49
- entry = @entries[idx]
50
- data = nil
51
- case param[1]
52
- when "u", "i"
53
- data = entry.text.to_i
54
- when "s"
55
- data = entry.text
56
- when /^a/
57
- begin
58
- data = eval(entry.text)
59
- rescue
60
- puts "Incorrect data: #{data}"
61
- end
62
- end
63
- m.add_param(param[1], data)
64
- end
65
- bus.send_sync_or_async(m) do |retm|
66
- if retm.is_a?(DBus::Error)
67
- puts "Error: #{retm.inspect}"
68
- else
69
- puts "Method #{m.member} returns: #{retm.params.inspect}"
70
- end
71
- end
72
- end
73
- end
74
-
75
- class DBusUI
76
- def initialize
77
- @glade = Gtk::Builder.new
78
- @glade << "gdbus.glade"
79
-
80
- @sessiontreeview = @glade.get_object("sessiontreeview")
81
- setup_treeview_renderer(@sessiontreeview, "D-Bus Objects")
82
- @sessiontreeview.selection.signal_connect("changed") do |selection|
83
- on_treeview_selection_changed(selection)
84
- end
85
-
86
- @systemtreeview = @glade.get_object("systemtreeview")
87
- setup_treeview_renderer(@systemtreeview, "D-Bus Objects")
88
- @systemtreeview.selection.signal_connect("changed") do |selection|
89
- on_treeview_selection_changed(selection)
90
- end
91
-
92
- @methsigtreeview = @glade.get_object("methsigtreeview")
93
- # ierk
94
- setup_methodview_renderer(@methsigtreeview)
95
- @methsigtreeview.signal_connect("row-activated") do |view, path, column|
96
- on_method_activated(view, path, column)
97
- end
98
-
99
- @window = @glade.get_object("window1")
100
- @window.show_all
101
- start_buses
102
- end
103
-
104
- def beautify_method(meth)
105
- # Damn, this need to be rewritten :p
106
- s = meth.name + "("
107
- if meth.is_a?(DBus::Method)
108
- s += (meth.params.collect { |a| "in #{a[0]}:#{a[1]}" } +
109
- meth.rets.collect { |a| "out #{a[0]}:#{a[1]}" }).join(", ")
110
- elsif meth.is_a?(DBus::Signal)
111
- s += (meth.params.collect { |a| "in #{a[0]}:#{a[1]}" }).join(", ")
112
- end
113
- s += ")"
114
- s
115
- end
116
-
117
- def on_treeview_selection_changed(selection)
118
- selected = selection.selected
119
- model = Gtk::ListStore.new(String, String, DBus::Method,
120
- DBus::ProxyObjectInterface)
121
- @methsigtreeview.model = model
122
- if selected
123
- if (intf = selected[1])
124
- intf.methods.keys.sort.each do |mi|
125
- m = intf.methods[mi]
126
- subiter = model.append
127
- subiter[0] = beautify_method(m)
128
- subiter[1] = "M"
129
- subiter[2] = m
130
- subiter[3] = intf
131
- end
132
- intf.signals.keys.sort.each do |mi|
133
- m = intf.signals[mi]
134
- subiter = model.append
135
- subiter[0] = beautify_method(m)
136
- subiter[1] = "S"
137
- subiter[2] = m
138
- subiter[3] = intf
139
- end
140
- end
141
- end
142
- end
143
-
144
- def on_method_activated(view, path, _column)
145
- name = view.model.get_iter(path)[0]
146
- puts "Clicked on: #{name.inspect}"
147
- type = view.model.get_iter(path)[1]
148
- if type == "M"
149
- method = view.model.get_iter(path)[2]
150
- intf = view.model.get_iter(path)[3]
151
- MethodCallWindow.new(@window, intf, method).run
152
- elsif type == "S"
153
- signal = view.model.get_iter(path)[2]
154
- intf = view.model.get_iter(path)[3]
155
- mr = DBus::MatchRule.new.from_signal(intf, signal)
156
- puts "*** Registering matchrule: #{mr} ***"
157
- intf.object.bus.add_match(mr) do |sig|
158
- puts "Got #{sig.member}(#{sig.params.join(",")})"
159
- end
160
- end
161
- end
162
-
163
- def on_sessiontreeview_row_activated(view, path, _column)
164
- name = view.model.get_iter(path)[0]
165
- puts "Clicked on: #{name.inspect}"
166
- end
167
-
168
- def on_window_delete_event(_window, _event)
169
- Gtk.main_quit
170
- end
171
-
172
- def setup_methodview_renderer(treeview)
173
- renderer = Gtk::CellRendererText.new
174
- _col_offset = treeview.insert_column(-1, "T", renderer, "text" => 1)
175
- col_offset = treeview.insert_column(-1, "Name", renderer, "text" => 0)
176
- column = treeview.get_column(col_offset - 1)
177
- column.clickable = true
178
- end
179
-
180
- def setup_treeview_renderer(treeview, str)
181
- renderer = Gtk::CellRendererText.new
182
- col_offset = treeview.insert_column(-1, str, renderer, "text" => 0)
183
- column = treeview.get_column(col_offset - 1)
184
- column.clickable = true
185
- end
186
-
187
- def process_input(bus)
188
- # THIS is the bad ass loop
189
- # we should return to the glib main loop from time to time. Anyone with a
190
- # proper way to handle it ?
191
- bus.update_buffer
192
- bus.messages.each do |msg|
193
- bus.process(msg)
194
- end
195
- end
196
-
197
- def start_buses
198
- # call glibize to get dbus messages from the glib mainloop
199
- DBus::SessionBus.instance.glibize
200
- DBus::SystemBus.instance.glibize if ENABLE_SYSTEM
201
-
202
- DBus::SessionBus.instance.proxy.ListNames do |_msg, names|
203
- fill_treeview(DBus::SessionBus.instance, @sessiontreeview, names)
204
- end
205
-
206
- return unless ENABLE_SYSTEM
207
- DBus::SystemBus.instance.proxy.ListNames do |_msg, names|
208
- fill_treeview(DBus::SystemBus.instance, @systemtreeview, names)
209
- end
210
- end
211
-
212
- def walk_node(model, iter, node)
213
- node.each_pair do |key, val|
214
- subiter = model.append(iter)
215
- subiter[0] = key
216
- walk_node(model, subiter, val)
217
- 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]
224
- end
225
- end
226
-
227
- def introspect_services(model, bus)
228
- el = @introspect_array.shift
229
- if el !~ /^:/
230
- iter = model.append(nil)
231
- iter[0] = el
232
- puts "introspecting: #{el}"
233
- begin
234
- service = bus.service(el).introspect
235
- walk_node(model, iter, service.root)
236
- rescue Exception => e
237
- puts "DBus Error:"
238
- puts e.backtrace.join("\n")
239
- end
240
- end
241
-
242
- !@introspect_array.empty?
243
- end
244
-
245
- def fill_treeview(bus, treeview, array)
246
- model = Gtk::TreeStore.new(String, DBus::ProxyObjectInterface)
247
- treeview.model = model
248
- @introspect_array = array.sort
249
- Gtk.idle_add { introspect_services(model, bus) }
250
- end
251
-
252
- def main
253
- Gtk.main
254
- end
255
- end
256
-
257
- DBusUI.new.main
@@ -1,98 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <interface>
3
- <!-- interface-requires gtk+ 2.6 -->
4
- <!-- interface-naming-policy toplevel-contextual -->
5
- <object class="GtkWindow" id="window1">
6
- <property name="visible">True</property>
7
- <property name="can_focus">False</property>
8
- <property name="title" translatable="yes">GD-Bus</property>
9
- <property name="default_width">500</property>
10
- <property name="default_height">400</property>
11
- <signal name="delete-event" handler="on_window_delete_event" swapped="no"/>
12
- <child>
13
- <object class="GtkHPaned" id="hpaned1">
14
- <property name="visible">True</property>
15
- <property name="can_focus">True</property>
16
- <child>
17
- <object class="GtkNotebook" id="notebook1">
18
- <property name="visible">True</property>
19
- <property name="can_focus">True</property>
20
- <child>
21
- <object class="GtkScrolledWindow" id="scrolledwindow3">
22
- <property name="visible">True</property>
23
- <property name="can_focus">True</property>
24
- <property name="shadow_type">in</property>
25
- <child>
26
- <object class="GtkTreeView" id="sessiontreeview">
27
- <property name="visible">True</property>
28
- <property name="can_focus">True</property>
29
- <signal name="row-activated" handler="on_sessiontreeview_row_activated" swapped="no"/>
30
- </object>
31
- </child>
32
- </object>
33
- </child>
34
- <child type="tab">
35
- <object class="GtkLabel" id="label1">
36
- <property name="visible">True</property>
37
- <property name="can_focus">False</property>
38
- <property name="label" translatable="yes">Session</property>
39
- </object>
40
- <packing>
41
- <property name="tab_fill">False</property>
42
- </packing>
43
- </child>
44
- <child>
45
- <object class="GtkScrolledWindow" id="scrolledwindow5">
46
- <property name="visible">True</property>
47
- <property name="can_focus">True</property>
48
- <property name="shadow_type">in</property>
49
- <child>
50
- <object class="GtkTreeView" id="systemtreeview">
51
- <property name="visible">True</property>
52
- <property name="can_focus">True</property>
53
- </object>
54
- </child>
55
- </object>
56
- <packing>
57
- <property name="position">1</property>
58
- </packing>
59
- </child>
60
- <child type="tab">
61
- <object class="GtkLabel" id="label2">
62
- <property name="visible">True</property>
63
- <property name="can_focus">False</property>
64
- <property name="label" translatable="yes">System</property>
65
- </object>
66
- <packing>
67
- <property name="position">1</property>
68
- <property name="tab_fill">False</property>
69
- </packing>
70
- </child>
71
- </object>
72
- <packing>
73
- <property name="resize">False</property>
74
- <property name="shrink">True</property>
75
- </packing>
76
- </child>
77
- <child>
78
- <object class="GtkScrolledWindow" id="scrolledwindow4">
79
- <property name="visible">True</property>
80
- <property name="can_focus">True</property>
81
- <property name="shadow_type">in</property>
82
- <child>
83
- <object class="GtkTreeView" id="methsigtreeview">
84
- <property name="visible">True</property>
85
- <property name="can_focus">True</property>
86
- <signal name="row-activated" handler="on_method_activated" swapped="no"/>
87
- </object>
88
- </child>
89
- </object>
90
- <packing>
91
- <property name="resize">False</property>
92
- <property name="shrink">True</property>
93
- </packing>
94
- </child>
95
- </object>
96
- </child>
97
- </object>
98
- </interface>
@@ -1,4 +0,0 @@
1
- #!/bin/sh
2
- set -e
3
- # for the lazy typer
4
- ruby -w -I ../../lib gdbus
data/spec/server_spec.rb DELETED
@@ -1,53 +0,0 @@
1
- #!/usr/bin/env rspec
2
- # Test that a server survives various error cases
3
- require_relative "spec_helper"
4
- require "dbus"
5
-
6
- class Foo < DBus::Object
7
- dbus_interface "org.ruby.ServerTest" do
8
- dbus_signal :signal_without_arguments
9
- dbus_signal :signal_with_argument, "epsilon:d"
10
- end
11
-
12
- dbus_signal :signal_without_interface
13
- rescue DBus::Object::UndefinedInterface
14
- # raised by the preceding signal declaration
15
- end
16
-
17
- class Bar < DBus::Object
18
- dbus_interface "org.ruby.ServerTest" do
19
- # a valid Ruby symbol but an invalid DBus name; Ticket#38
20
- dbus_signal :signal_with_a_bang!
21
- end
22
- rescue DBus::InvalidMethodName
23
- # raised by the preceding signal declaration
24
- end
25
-
26
- describe "ServerTest" do
27
- before(:each) do
28
- @bus = DBus::ASessionBus.new
29
- @svc = @bus.request_service "org.ruby.server-test"
30
- end
31
-
32
- after(:each) do
33
- @bus.proxy.ReleaseName "org.ruby.server-test"
34
- end
35
-
36
- it "tests unexporting an object" do
37
- obj = Foo.new "/org/ruby/Foo"
38
- @svc.export obj
39
- expect(@svc.unexport(obj)).to be_a DBus::Object
40
- end
41
-
42
- it "tests unexporting an object not exported" do
43
- obj = Foo.new "/org/ruby/Foo"
44
- expect(@svc.unexport(obj)).to be false
45
- end
46
-
47
- it "tests emiting signals" do
48
- obj = Foo.new "/org/ruby/Foo"
49
- @svc.export obj
50
- obj.signal_without_arguments
51
- obj.signal_with_argument(-0.1)
52
- end
53
- end
@@ -1,39 +0,0 @@
1
- #! /bin/sh
2
- # A wrapper for DBus tests
3
- # Run a server (directly or by dbus activation) and then the test
4
- # $0 server [args...] -- test [args...]
5
- set -o errexit
6
-
7
- while [ "$1" != "--" ]; do
8
- SERVER="$SERVER $1"
9
- shift
10
- done
11
- shift # --
12
-
13
- setup_activation () {
14
- SDIR=$XDG_DATA_DIRS/dbus-1/services
15
- mkdir -p $SDIR
16
- # FIXME Name is hardcoded
17
- cat <<EOF > $SDIR/test.service
18
- [D-BUS Service]
19
- Name=org.ruby.service
20
- Exec=$SERVER
21
- EOF
22
- }
23
-
24
- run_server () {
25
- echo -n "Hey, server, get on da bus... "
26
- # start the server
27
- $SERVER & sleep 3
28
- echo "off we go!"
29
- }
30
-
31
- export XDG_DATA_DIRS=`mktemp -d dbus.activation.XXXXXX`
32
- RM_FILES="$RM_FILES $XDG_DATA_DIRS"
33
- setup_activation
34
- #run_server
35
-
36
- # Clean up at exit.
37
- trap "rm -rf \$RM_FILES" EXIT TERM INT
38
-
39
- "$@"