ruby-dbus-openplacos 0.6.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.
- data/COPYING +504 -0
- data/NEWS +146 -0
- data/README +42 -0
- data/Rakefile +54 -0
- data/VERSION +1 -0
- data/doc/tutorial/index.markdown +480 -0
- data/examples/gdbus/gdbus +255 -0
- data/examples/gdbus/gdbus.glade +184 -0
- data/examples/gdbus/launch.sh +4 -0
- data/examples/no-introspect/nm-test.rb +21 -0
- data/examples/no-introspect/tracker-test.rb +16 -0
- data/examples/rhythmbox/playpause.rb +25 -0
- data/examples/service/call_service.rb +25 -0
- data/examples/service/service_newapi.rb +51 -0
- data/examples/simple/call_introspect.rb +34 -0
- data/examples/simple/properties.rb +19 -0
- data/examples/utils/listnames.rb +11 -0
- data/examples/utils/notify.rb +19 -0
- data/lib/dbus/auth.rb +258 -0
- data/lib/dbus/bus.rb +947 -0
- data/lib/dbus/core_ext/class/attribute.rb +91 -0
- data/lib/dbus/core_ext/kernel/singleton_class.rb +14 -0
- data/lib/dbus/core_ext/module/remove_method.rb +12 -0
- data/lib/dbus/error.rb +44 -0
- data/lib/dbus/export.rb +124 -0
- data/lib/dbus/introspect.rb +570 -0
- data/lib/dbus/marshall.rb +443 -0
- data/lib/dbus/matchrule.rb +100 -0
- data/lib/dbus/message.rb +310 -0
- data/lib/dbus/type.rb +222 -0
- data/lib/dbus.rb +83 -0
- data/ruby-dbus-openplacos.gemspec +17 -0
- data/test/binding_test.rb +56 -0
- data/test/bus_driver_test.rb +22 -0
- data/test/dbus-launch-simple +35 -0
- data/test/dbus-limited-session.conf +28 -0
- data/test/property_test.rb +55 -0
- data/test/server_robustness_test.rb +72 -0
- data/test/server_test.rb +53 -0
- data/test/service_newapi.rb +197 -0
- data/test/session_bus_test_manual.rb +20 -0
- data/test/signal_test.rb +64 -0
- data/test/t1 +4 -0
- data/test/t2.rb +66 -0
- data/test/t3-ticket27.rb +18 -0
- data/test/t5-report-dbus-interface.rb +58 -0
- data/test/t6-loop.rb +82 -0
- data/test/test_env +13 -0
- data/test/test_server +39 -0
- data/test/variant_test.rb +66 -0
- metadata +118 -0
@@ -0,0 +1,255 @@
|
|
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 'libglade2'
|
10
|
+
|
11
|
+
$enable_system = false
|
12
|
+
|
13
|
+
class MethodCallWindow
|
14
|
+
def initialize(pwindow, intf, meth)
|
15
|
+
@intf, @meth = intf, meth
|
16
|
+
@entries = Array.new
|
17
|
+
@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])
|
21
|
+
|
22
|
+
@meth.params.each do |param|
|
23
|
+
shbox = Gtk::HBox.new(true, 0)
|
24
|
+
label = Gtk::Label.new("#{param[0]} (#{param[1]})")
|
25
|
+
input = Gtk::Entry.new
|
26
|
+
@entries << input
|
27
|
+
shbox.pack_start(label, true, true, 0)
|
28
|
+
shbox.pack_start(input, true, true, 0)
|
29
|
+
@dialog.vbox.pack_start(shbox, true, true, 0)
|
30
|
+
@dialog.vbox.show_all
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def run
|
35
|
+
on_ok if @dialog.run == Gtk::Dialog::RESPONSE_OK
|
36
|
+
@dialog.destroy
|
37
|
+
end
|
38
|
+
|
39
|
+
def on_ok
|
40
|
+
bus = @intf.object.bus
|
41
|
+
m = DBus::Message.new(DBus::Message::METHOD_CALL)
|
42
|
+
m.path = @intf.object.path
|
43
|
+
m.interface = @intf.name
|
44
|
+
m.destination = @intf.object.destination
|
45
|
+
m.member = @meth.name
|
46
|
+
m.sender = bus.unique_name
|
47
|
+
@meth.params.each_with_index do |param, idx|
|
48
|
+
entry = @entries[idx]
|
49
|
+
data = nil
|
50
|
+
case param[1]
|
51
|
+
when "u", "i"
|
52
|
+
data = entry.text.to_i
|
53
|
+
when "s"
|
54
|
+
data = entry.text
|
55
|
+
when /^a/
|
56
|
+
begin
|
57
|
+
data = eval(entry.text)
|
58
|
+
rescue
|
59
|
+
puts "Incorrect data: #{data}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
m.add_param(param[1], data)
|
63
|
+
end
|
64
|
+
bus.on_return(m) do |retm|
|
65
|
+
if retm.is_a?(DBus::Error)
|
66
|
+
puts "Error: #{retm.inspect}"
|
67
|
+
else
|
68
|
+
puts "Method #{m.member} returns: #{retm.params.inspect}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
bus.send(m.marshall)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class DBusUI
|
76
|
+
def initialize
|
77
|
+
@glade = GladeXML.new("gdbus.glade") { |h| method(h) } # This block is like
|
78
|
+
# black magic :)
|
79
|
+
@sessiontreeview = @glade.get_widget("sessiontreeview")
|
80
|
+
setup_treeview_renderer(@sessiontreeview, 'D-Bus Objects')
|
81
|
+
@sessiontreeview.selection.signal_connect("changed") do |selection|
|
82
|
+
on_treeview_selection_changed(selection)
|
83
|
+
end
|
84
|
+
|
85
|
+
@systemtreeview = @glade.get_widget("systemtreeview")
|
86
|
+
setup_treeview_renderer(@systemtreeview, 'D-Bus Objects')
|
87
|
+
@systemtreeview.selection.signal_connect("changed") do |selection|
|
88
|
+
on_treeview_selection_changed(selection)
|
89
|
+
end
|
90
|
+
|
91
|
+
@methsigtreeview = @glade.get_widget("methsigtreeview")
|
92
|
+
# ierk
|
93
|
+
setup_methodview_renderer(@methsigtreeview)
|
94
|
+
|
95
|
+
@window = @glade.get_widget("window1")
|
96
|
+
@window.show_all
|
97
|
+
start_buses
|
98
|
+
end
|
99
|
+
|
100
|
+
def beautify_method(meth)
|
101
|
+
# Damn, this need to be rewritten :p
|
102
|
+
s = meth.name + "("
|
103
|
+
if meth.kind_of?(DBus::Method)
|
104
|
+
s += (meth.params.collect { |a| "in #{a[0]}:#{a[1]}" } +
|
105
|
+
meth.rets.collect { |a| "out #{a[0]}:#{a[1]}" }).join(", ")
|
106
|
+
elsif meth.kind_of?(DBus::Signal)
|
107
|
+
s += (meth.params.collect { |a| "in #{a[0]}:#{a[1]}" }).join(", ")
|
108
|
+
end
|
109
|
+
s += ")"
|
110
|
+
s
|
111
|
+
end
|
112
|
+
|
113
|
+
def on_treeview_selection_changed(selection)
|
114
|
+
selected = selection.selected
|
115
|
+
model = Gtk::ListStore.new(String, String, DBus::Method,
|
116
|
+
DBus::ProxyObjectInterface)
|
117
|
+
@methsigtreeview.model = model
|
118
|
+
if selected
|
119
|
+
if intf = selected[1]
|
120
|
+
intf.methods.keys.sort.each do |mi|
|
121
|
+
m = intf.methods[mi]
|
122
|
+
subiter = model.append
|
123
|
+
subiter[0] = beautify_method(m)
|
124
|
+
subiter[1] = "M"
|
125
|
+
subiter[2] = m
|
126
|
+
subiter[3] = intf
|
127
|
+
end
|
128
|
+
intf.signals.keys.sort.each do |mi|
|
129
|
+
m = intf.signals[mi]
|
130
|
+
subiter = model.append
|
131
|
+
subiter[0] = beautify_method(m)
|
132
|
+
subiter[1] = "S"
|
133
|
+
subiter[2] = m
|
134
|
+
subiter[3] = intf
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def on_method_activated(view, path, column)
|
141
|
+
name = view.model.get_iter(path)[0]
|
142
|
+
puts "Clicked on: #{name.inspect}"
|
143
|
+
type = view.model.get_iter(path)[1]
|
144
|
+
intf = view.model.get_iter(path)[2]
|
145
|
+
if type == "M"
|
146
|
+
method = view.model.get_iter(path)[2]
|
147
|
+
intf = view.model.get_iter(path)[3]
|
148
|
+
MethodCallWindow.new(@window, intf, method).run
|
149
|
+
elsif type == "S"
|
150
|
+
signal = view.model.get_iter(path)[2]
|
151
|
+
intf = view.model.get_iter(path)[3]
|
152
|
+
mr = DBus::MatchRule.new.from_signal(intf, signal)
|
153
|
+
puts "*** Registering matchrule: #{mr.to_s} ***"
|
154
|
+
intf.object.bus.add_match(mr) do |sig|
|
155
|
+
puts "Got #{sig.member}(#{sig.params.join(',')})"
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def on_sessiontreeview_row_activated(view, path, column)
|
161
|
+
name = view.model.get_iter(path)[0]
|
162
|
+
puts "Clicked on: #{name.inspect}"
|
163
|
+
intf = view.model.get_iter(path)[1]
|
164
|
+
end
|
165
|
+
|
166
|
+
def on_window_delete_event(window, event)
|
167
|
+
Gtk.main_quit
|
168
|
+
end
|
169
|
+
|
170
|
+
def setup_methodview_renderer(treeview)
|
171
|
+
renderer = Gtk::CellRendererText.new
|
172
|
+
col_offset = treeview.insert_column(-1, "T", renderer, 'text' => 1)
|
173
|
+
col_offset = treeview.insert_column(-1, "Name", renderer, 'text' => 0)
|
174
|
+
column = treeview.get_column(col_offset - 1)
|
175
|
+
column.clickable = true
|
176
|
+
end
|
177
|
+
|
178
|
+
def setup_treeview_renderer(treeview, str)
|
179
|
+
renderer = Gtk::CellRendererText.new
|
180
|
+
col_offset = treeview.insert_column(-1, str, renderer, 'text' => 0)
|
181
|
+
column = treeview.get_column(col_offset - 1)
|
182
|
+
column.clickable = true
|
183
|
+
end
|
184
|
+
|
185
|
+
def process_input(bus)
|
186
|
+
# THIS is the bad ass loop
|
187
|
+
# we should return to the glib main loop from time to time. Anyone with a
|
188
|
+
# proper way to handle it ?
|
189
|
+
bus.update_buffer
|
190
|
+
bus.messages.each do |msg|
|
191
|
+
bus.process(msg)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def start_buses
|
196
|
+
# call glibize to get dbus messages from the glib mainloop
|
197
|
+
DBus::SessionBus.instance.glibize
|
198
|
+
DBus::SystemBus.instance.glibize if $enable_system
|
199
|
+
|
200
|
+
DBus::SessionBus.instance.proxy.ListNames do |msg, names|
|
201
|
+
fill_treeview(DBus::SessionBus.instance, @sessiontreeview, names)
|
202
|
+
end
|
203
|
+
if $enable_system
|
204
|
+
DBus::SystemBus.instance.proxy.ListNames do |msg, names|
|
205
|
+
fill_treeview(DBus::SystemBus.instance, @systemtreeview, names)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def walk_node(model, iter, node)
|
211
|
+
node.each_pair do |key, val|
|
212
|
+
subiter = model.append(iter)
|
213
|
+
subiter[0] = key
|
214
|
+
walk_node(model, subiter, val)
|
215
|
+
end
|
216
|
+
unless node.object.nil?
|
217
|
+
node.object.interfaces.sort.each do |ifname|
|
218
|
+
subiter = model.append(iter)
|
219
|
+
subiter[0] = ifname
|
220
|
+
subiter[1] = node.object[ifname]
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def introspect_services(model, bus)
|
226
|
+
el = @introspect_array.shift
|
227
|
+
if not el =~ /^:/
|
228
|
+
iter = model.append(nil)
|
229
|
+
iter[0] = el
|
230
|
+
puts "introspecting: #{el}"
|
231
|
+
begin
|
232
|
+
service = bus.service(el).introspect
|
233
|
+
walk_node(model, iter, service.root)
|
234
|
+
rescue Exception => e
|
235
|
+
puts "DBus Error:"
|
236
|
+
puts e.backtrace.join("\n")
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
not @introspect_array.empty?
|
241
|
+
end
|
242
|
+
|
243
|
+
def fill_treeview(bus, treeview, array)
|
244
|
+
model = Gtk::TreeStore.new(String, DBus::ProxyObjectInterface)
|
245
|
+
treeview.model = model
|
246
|
+
@introspect_array = array.sort
|
247
|
+
Gtk::idle_add { introspect_services(model, bus) }
|
248
|
+
end
|
249
|
+
|
250
|
+
def main
|
251
|
+
Gtk.main
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
DBusUI.new.main
|
@@ -0,0 +1,184 @@
|
|
1
|
+
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
|
2
|
+
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
|
3
|
+
|
4
|
+
<glade-interface>
|
5
|
+
|
6
|
+
<widget class="GtkWindow" id="window1">
|
7
|
+
<property name="visible">True</property>
|
8
|
+
<property name="title" translatable="yes">GD-Bus</property>
|
9
|
+
<property name="type">GTK_WINDOW_TOPLEVEL</property>
|
10
|
+
<property name="window_position">GTK_WIN_POS_NONE</property>
|
11
|
+
<property name="modal">False</property>
|
12
|
+
<property name="default_width">500</property>
|
13
|
+
<property name="default_height">400</property>
|
14
|
+
<property name="resizable">True</property>
|
15
|
+
<property name="destroy_with_parent">False</property>
|
16
|
+
<property name="decorated">True</property>
|
17
|
+
<property name="skip_taskbar_hint">False</property>
|
18
|
+
<property name="skip_pager_hint">False</property>
|
19
|
+
<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
|
20
|
+
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
|
21
|
+
<property name="focus_on_map">True</property>
|
22
|
+
<property name="urgency_hint">False</property>
|
23
|
+
<signal name="delete_event" handler="on_window_delete_event" last_modification_time="Sat, 17 Mar 2007 14:49:13 GMT"/>
|
24
|
+
|
25
|
+
<child>
|
26
|
+
<widget class="GtkHPaned" id="hpaned1">
|
27
|
+
<property name="visible">True</property>
|
28
|
+
<property name="can_focus">True</property>
|
29
|
+
|
30
|
+
<child>
|
31
|
+
<widget class="GtkNotebook" id="notebook1">
|
32
|
+
<property name="visible">True</property>
|
33
|
+
<property name="can_focus">True</property>
|
34
|
+
<property name="show_tabs">True</property>
|
35
|
+
<property name="show_border">True</property>
|
36
|
+
<property name="tab_pos">GTK_POS_TOP</property>
|
37
|
+
<property name="scrollable">False</property>
|
38
|
+
<property name="enable_popup">False</property>
|
39
|
+
|
40
|
+
<child>
|
41
|
+
<widget class="GtkScrolledWindow" id="scrolledwindow3">
|
42
|
+
<property name="visible">True</property>
|
43
|
+
<property name="can_focus">True</property>
|
44
|
+
<property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
45
|
+
<property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
46
|
+
<property name="shadow_type">GTK_SHADOW_IN</property>
|
47
|
+
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
|
48
|
+
|
49
|
+
<child>
|
50
|
+
<widget class="GtkTreeView" id="sessiontreeview">
|
51
|
+
<property name="visible">True</property>
|
52
|
+
<property name="can_focus">True</property>
|
53
|
+
<property name="headers_visible">True</property>
|
54
|
+
<property name="rules_hint">False</property>
|
55
|
+
<property name="reorderable">False</property>
|
56
|
+
<property name="enable_search">True</property>
|
57
|
+
<property name="fixed_height_mode">False</property>
|
58
|
+
<property name="hover_selection">False</property>
|
59
|
+
<property name="hover_expand">False</property>
|
60
|
+
<signal name="row_activated" handler="on_sessiontreeview_row_activated" last_modification_time="Sat, 17 Mar 2007 10:17:11 GMT"/>
|
61
|
+
</widget>
|
62
|
+
</child>
|
63
|
+
</widget>
|
64
|
+
<packing>
|
65
|
+
<property name="tab_expand">False</property>
|
66
|
+
<property name="tab_fill">True</property>
|
67
|
+
</packing>
|
68
|
+
</child>
|
69
|
+
|
70
|
+
<child>
|
71
|
+
<widget class="GtkLabel" id="label1">
|
72
|
+
<property name="visible">True</property>
|
73
|
+
<property name="label" translatable="yes">Session</property>
|
74
|
+
<property name="use_underline">False</property>
|
75
|
+
<property name="use_markup">False</property>
|
76
|
+
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
77
|
+
<property name="wrap">False</property>
|
78
|
+
<property name="selectable">False</property>
|
79
|
+
<property name="xalign">0.5</property>
|
80
|
+
<property name="yalign">0.5</property>
|
81
|
+
<property name="xpad">0</property>
|
82
|
+
<property name="ypad">0</property>
|
83
|
+
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
84
|
+
<property name="width_chars">-1</property>
|
85
|
+
<property name="single_line_mode">False</property>
|
86
|
+
<property name="angle">0</property>
|
87
|
+
</widget>
|
88
|
+
<packing>
|
89
|
+
<property name="type">tab</property>
|
90
|
+
</packing>
|
91
|
+
</child>
|
92
|
+
|
93
|
+
<child>
|
94
|
+
<widget class="GtkScrolledWindow" id="scrolledwindow5">
|
95
|
+
<property name="visible">True</property>
|
96
|
+
<property name="can_focus">True</property>
|
97
|
+
<property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
98
|
+
<property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
99
|
+
<property name="shadow_type">GTK_SHADOW_IN</property>
|
100
|
+
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
|
101
|
+
|
102
|
+
<child>
|
103
|
+
<widget class="GtkTreeView" id="systemtreeview">
|
104
|
+
<property name="visible">True</property>
|
105
|
+
<property name="can_focus">True</property>
|
106
|
+
<property name="headers_visible">True</property>
|
107
|
+
<property name="rules_hint">False</property>
|
108
|
+
<property name="reorderable">False</property>
|
109
|
+
<property name="enable_search">True</property>
|
110
|
+
<property name="fixed_height_mode">False</property>
|
111
|
+
<property name="hover_selection">False</property>
|
112
|
+
<property name="hover_expand">False</property>
|
113
|
+
</widget>
|
114
|
+
</child>
|
115
|
+
</widget>
|
116
|
+
<packing>
|
117
|
+
<property name="tab_expand">False</property>
|
118
|
+
<property name="tab_fill">True</property>
|
119
|
+
</packing>
|
120
|
+
</child>
|
121
|
+
|
122
|
+
<child>
|
123
|
+
<widget class="GtkLabel" id="label2">
|
124
|
+
<property name="visible">True</property>
|
125
|
+
<property name="label" translatable="yes">System</property>
|
126
|
+
<property name="use_underline">False</property>
|
127
|
+
<property name="use_markup">False</property>
|
128
|
+
<property name="justify">GTK_JUSTIFY_LEFT</property>
|
129
|
+
<property name="wrap">False</property>
|
130
|
+
<property name="selectable">False</property>
|
131
|
+
<property name="xalign">0.5</property>
|
132
|
+
<property name="yalign">0.5</property>
|
133
|
+
<property name="xpad">0</property>
|
134
|
+
<property name="ypad">0</property>
|
135
|
+
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
136
|
+
<property name="width_chars">-1</property>
|
137
|
+
<property name="single_line_mode">False</property>
|
138
|
+
<property name="angle">0</property>
|
139
|
+
</widget>
|
140
|
+
<packing>
|
141
|
+
<property name="type">tab</property>
|
142
|
+
</packing>
|
143
|
+
</child>
|
144
|
+
</widget>
|
145
|
+
<packing>
|
146
|
+
<property name="shrink">True</property>
|
147
|
+
<property name="resize">False</property>
|
148
|
+
</packing>
|
149
|
+
</child>
|
150
|
+
|
151
|
+
<child>
|
152
|
+
<widget class="GtkScrolledWindow" id="scrolledwindow4">
|
153
|
+
<property name="visible">True</property>
|
154
|
+
<property name="can_focus">True</property>
|
155
|
+
<property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
156
|
+
<property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
|
157
|
+
<property name="shadow_type">GTK_SHADOW_IN</property>
|
158
|
+
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
|
159
|
+
|
160
|
+
<child>
|
161
|
+
<widget class="GtkTreeView" id="methsigtreeview">
|
162
|
+
<property name="visible">True</property>
|
163
|
+
<property name="can_focus">True</property>
|
164
|
+
<property name="headers_visible">True</property>
|
165
|
+
<property name="rules_hint">False</property>
|
166
|
+
<property name="reorderable">False</property>
|
167
|
+
<property name="enable_search">True</property>
|
168
|
+
<property name="fixed_height_mode">False</property>
|
169
|
+
<property name="hover_selection">False</property>
|
170
|
+
<property name="hover_expand">False</property>
|
171
|
+
<signal name="row_activated" handler="on_method_activated" last_modification_time="Sat, 17 Mar 2007 14:49:13 GMT"/>
|
172
|
+
</widget>
|
173
|
+
</child>
|
174
|
+
</widget>
|
175
|
+
<packing>
|
176
|
+
<property name="shrink">True</property>
|
177
|
+
<property name="resize">False</property>
|
178
|
+
</packing>
|
179
|
+
</child>
|
180
|
+
</widget>
|
181
|
+
</child>
|
182
|
+
</widget>
|
183
|
+
|
184
|
+
</glade-interface>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Trivial network interface lister using NetworkManager.
|
4
|
+
# NetworkManager does not support introspection, so the api is not that sexy.
|
5
|
+
|
6
|
+
require 'dbus'
|
7
|
+
|
8
|
+
bus = DBus::SystemBus.instance
|
9
|
+
|
10
|
+
nm_service = bus.service("org.freedesktop.NetworkManager")
|
11
|
+
nm_manager = nm_service.object("/org/freedesktop/NetworkManager")
|
12
|
+
poi = DBus::ProxyObjectInterface.new(nm_manager, "org.freedesktop.NetworkManager")
|
13
|
+
begin
|
14
|
+
poi.define_method("getDevices", "") # NM 0.6
|
15
|
+
p poi.getDevices
|
16
|
+
rescue Exception
|
17
|
+
poi.define_method("GetDevices", "") # NM 0.7
|
18
|
+
p poi.GetDevices
|
19
|
+
end
|
20
|
+
|
21
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Trivial network interface lister using NetworkManager.
|
4
|
+
# NetworkManager does not support introspection, so the api is not that sexy.
|
5
|
+
|
6
|
+
require 'dbus'
|
7
|
+
|
8
|
+
bus = DBus::SessionBus.instance
|
9
|
+
|
10
|
+
tracker_service = bus.service("org.freedesktop.Tracker")
|
11
|
+
tracker_manager = tracker_service.object("/org/freedesktop/tracker")
|
12
|
+
poi = DBus::ProxyObjectInterface.new(tracker_manager, "org.freedesktop.Tracker.Files")
|
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
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'dbus'
|
4
|
+
bus = DBus::SessionBus.instance
|
5
|
+
# get a rb object
|
6
|
+
proxy = bus.introspect("org.gnome.Rhythmbox", "/org/gnome/Rhythmbox/Player")
|
7
|
+
proxyi = proxy["org.gnome.Rhythmbox.Player"]
|
8
|
+
|
9
|
+
# register for signals
|
10
|
+
|
11
|
+
mr = DBus::MatchRule.new
|
12
|
+
mr.type = "signal"
|
13
|
+
mr.interface = "org.gnome.Rhythmbox.Player"
|
14
|
+
mr.path = "/org/gnome/Rhythmbox/Player"
|
15
|
+
bus.add_match(mr) do |msg, first_param|
|
16
|
+
print msg.member + " "
|
17
|
+
puts first_param
|
18
|
+
end
|
19
|
+
|
20
|
+
proxyi.playPause(true)
|
21
|
+
|
22
|
+
main = DBus::Main.new
|
23
|
+
main << bus
|
24
|
+
main.run
|
25
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "dbus"
|
4
|
+
|
5
|
+
session_bus = DBus::SessionBus.instance
|
6
|
+
|
7
|
+
ruby_srv = session_bus.service("org.ruby.service")
|
8
|
+
|
9
|
+
# Get the object from this service
|
10
|
+
player = ruby_srv.object("/org/ruby/MyInstance")
|
11
|
+
|
12
|
+
# Introspect it
|
13
|
+
puts player.introspect
|
14
|
+
player.default_iface = "org.ruby.SampleInterface"
|
15
|
+
player.test_variant(["s", "coucou"])
|
16
|
+
player.on_signal("SomethingJustHappened") do |u, v|
|
17
|
+
puts "SomethingJustHappened: #{u} #{v}"
|
18
|
+
end
|
19
|
+
player.hello("8=======D", "(_._)")
|
20
|
+
p player["org.ruby.AnotherInterface"].Reverse("Hello world!")
|
21
|
+
|
22
|
+
main = DBus::Main.new
|
23
|
+
main << session_bus
|
24
|
+
main.run
|
25
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'dbus'
|
4
|
+
require 'thread'
|
5
|
+
Thread.abort_on_exception = true
|
6
|
+
|
7
|
+
class Test < DBus::Object
|
8
|
+
# Create an interface aggregating all upcoming dbus_method defines.
|
9
|
+
dbus_interface "org.ruby.SampleInterface" do
|
10
|
+
dbus_method :hello, "in name:s, in name2:s" do |name, name2|
|
11
|
+
puts "hello(#{name}, #{name2})"
|
12
|
+
end
|
13
|
+
|
14
|
+
dbus_method :test_variant, "in stuff:v" do |variant|
|
15
|
+
p variant
|
16
|
+
end
|
17
|
+
|
18
|
+
dbus_signal :SomethingJustHappened, "toto:s, tutu:u"
|
19
|
+
end
|
20
|
+
|
21
|
+
dbus_interface "org.ruby.AnotherInterface" do
|
22
|
+
dbus_method :ThatsALongMethodNameIThink do
|
23
|
+
puts "ThatsALongMethodNameIThink"
|
24
|
+
end
|
25
|
+
dbus_method :Reverse, "in instr:s, out outstr:s" do |instr|
|
26
|
+
outstr = instr.split(//).reverse.join
|
27
|
+
puts "got: #{instr}, replying: #{outstr}"
|
28
|
+
[outstr]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
bus = DBus::SessionBus.instance
|
34
|
+
service = bus.request_service("org.ruby.service")
|
35
|
+
myobj = Test.new("/org/ruby/MyInstance")
|
36
|
+
service.export(myobj)
|
37
|
+
|
38
|
+
Thread.new do
|
39
|
+
i = 0
|
40
|
+
loop do
|
41
|
+
# Signal emission
|
42
|
+
myobj.SomethingJustHappened("hey", i += 1)
|
43
|
+
sleep(0.5)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
puts "listening"
|
48
|
+
main = DBus::Main.new
|
49
|
+
main << bus
|
50
|
+
main.run
|
51
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "dbus"
|
4
|
+
|
5
|
+
session_bus = DBus::SessionBus.instance
|
6
|
+
|
7
|
+
# Get the Rhythmbox service
|
8
|
+
rhythmbox = session_bus.service("org.gnome.Rhythmbox")
|
9
|
+
|
10
|
+
# Get the object from this service
|
11
|
+
player = rhythmbox.object("/org/gnome/Rhythmbox/Player")
|
12
|
+
|
13
|
+
# Introspect it
|
14
|
+
player.introspect
|
15
|
+
if player.has_iface? "org.gnome.Rhythmbox.Player"
|
16
|
+
puts "We have Rhythmbox Player interface"
|
17
|
+
end
|
18
|
+
|
19
|
+
player_with_iface = player["org.gnome.Rhythmbox.Player"]
|
20
|
+
p player_with_iface.getPlayingUri
|
21
|
+
|
22
|
+
# Maybe support default_iface=(iface_str) on an ProxyObject, so
|
23
|
+
# that this is possible?
|
24
|
+
player.default_iface = "org.gnome.Rhythmbox.Player"
|
25
|
+
puts "default_iface test:"
|
26
|
+
p player.getPlayingUri
|
27
|
+
player.on_signal("elapsedChanged") do |u|
|
28
|
+
puts "elapsedChanged: #{u}"
|
29
|
+
end
|
30
|
+
|
31
|
+
main = DBus::Main.new
|
32
|
+
main << session_bus
|
33
|
+
main.run
|
34
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
require 'dbus'
|
3
|
+
|
4
|
+
bus = DBus::SystemBus.instance
|
5
|
+
nm_service = bus["org.freedesktop.NetworkManager"]
|
6
|
+
network_manager_object = nm_service.object("/org/freedesktop/NetworkManager")
|
7
|
+
network_manager_object.introspect
|
8
|
+
nm_iface = network_manager_object["org.freedesktop.NetworkManager"]
|
9
|
+
|
10
|
+
# read a property
|
11
|
+
enabled = nm_iface["WirelessEnabled"]
|
12
|
+
if enabled
|
13
|
+
puts "Wireless is enabled"
|
14
|
+
else
|
15
|
+
puts "Wireless is disabled"
|
16
|
+
end
|
17
|
+
puts "Toggling wireless"
|
18
|
+
# write a property
|
19
|
+
nm_iface["WirelessEnabled"] = ! enabled
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'dbus'
|
4
|
+
|
5
|
+
if ARGV.size < 2
|
6
|
+
puts "Usage:"
|
7
|
+
puts "notify.rb \"title\" \"body\""
|
8
|
+
exit
|
9
|
+
end
|
10
|
+
|
11
|
+
d = DBus::SessionBus.instance
|
12
|
+
o = d.service("org.freedesktop.Notifications").object("/org/freedesktop/Notifications")
|
13
|
+
o.introspect
|
14
|
+
|
15
|
+
i = o["org.freedesktop.Notifications"]
|
16
|
+
|
17
|
+
i.Notify('notify.rb', 0, 'info', ARGV[0], ARGV[1], [], {}, 2000) do |ret, param|
|
18
|
+
end
|
19
|
+
|