ruby-dbus 0.16.0 → 0.18.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/NEWS.md +160 -0
- data/README.md +3 -5
- data/Rakefile +18 -8
- data/VERSION +1 -1
- data/doc/Reference.md +106 -7
- data/examples/doc/_extract_examples +7 -0
- data/examples/gdbus/gdbus +31 -24
- data/examples/no-introspect/nm-test.rb +2 -0
- data/examples/no-introspect/tracker-test.rb +3 -1
- data/examples/rhythmbox/playpause.rb +2 -1
- data/examples/service/call_service.rb +2 -1
- data/examples/service/complex-property.rb +21 -0
- data/examples/service/service_newapi.rb +1 -1
- data/examples/simple/call_introspect.rb +1 -0
- data/examples/simple/get_id.rb +2 -1
- data/examples/simple/properties.rb +2 -0
- data/examples/utils/listnames.rb +1 -0
- data/examples/utils/notify.rb +1 -0
- data/lib/dbus/api_options.rb +9 -0
- data/lib/dbus/auth.rb +20 -15
- data/lib/dbus/bus.rb +123 -75
- data/lib/dbus/bus_name.rb +12 -8
- data/lib/dbus/core_ext/class/attribute.rb +1 -1
- data/lib/dbus/data.rb +821 -0
- data/lib/dbus/emits_changed_signal.rb +83 -0
- data/lib/dbus/error.rb +4 -2
- data/lib/dbus/introspect.rb +132 -31
- data/lib/dbus/logger.rb +3 -1
- data/lib/dbus/marshall.rb +247 -296
- data/lib/dbus/matchrule.rb +16 -16
- data/lib/dbus/message.rb +44 -37
- data/lib/dbus/message_queue.rb +16 -10
- data/lib/dbus/object.rb +358 -24
- data/lib/dbus/object_path.rb +11 -6
- data/lib/dbus/proxy_object.rb +22 -1
- data/lib/dbus/proxy_object_factory.rb +13 -7
- data/lib/dbus/proxy_object_interface.rb +63 -30
- data/lib/dbus/raw_message.rb +91 -0
- data/lib/dbus/type.rb +318 -86
- data/lib/dbus/xml.rb +32 -17
- data/lib/dbus.rb +14 -7
- data/ruby-dbus.gemspec +7 -3
- data/spec/async_spec.rb +2 -0
- data/spec/binding_spec.rb +2 -0
- data/spec/bus_and_xml_backend_spec.rb +2 -0
- data/spec/bus_driver_spec.rb +2 -0
- data/spec/bus_name_spec.rb +3 -1
- data/spec/bus_spec.rb +2 -0
- data/spec/byte_array_spec.rb +2 -0
- data/spec/client_robustness_spec.rb +4 -2
- data/spec/data/marshall.yaml +1667 -0
- data/spec/data_spec.rb +673 -0
- data/spec/emits_changed_signal_spec.rb +58 -0
- data/spec/err_msg_spec.rb +2 -0
- data/spec/introspect_xml_parser_spec.rb +2 -0
- data/spec/introspection_spec.rb +2 -0
- data/spec/main_loop_spec.rb +3 -1
- data/spec/node_spec.rb +23 -0
- data/spec/object_path_spec.rb +3 -0
- data/spec/object_spec.rb +138 -0
- data/spec/packet_marshaller_spec.rb +41 -0
- data/spec/packet_unmarshaller_spec.rb +248 -0
- data/spec/property_spec.rb +192 -5
- data/spec/proxy_object_spec.rb +2 -0
- data/spec/server_robustness_spec.rb +2 -0
- data/spec/server_spec.rb +2 -0
- data/spec/service_newapi.rb +70 -70
- data/spec/session_bus_spec.rb +3 -1
- data/spec/session_bus_spec_manual.rb +2 -0
- data/spec/signal_spec.rb +5 -3
- data/spec/spec_helper.rb +37 -9
- data/spec/thread_safety_spec.rb +2 -0
- data/spec/tools/dbus-limited-session.conf +4 -0
- data/spec/type_spec.rb +214 -6
- data/spec/value_spec.rb +16 -1
- data/spec/variant_spec.rb +4 -2
- data/spec/zzz_quit_spec.rb +16 -0
- metadata +34 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07f1f2fd26d13923b2601c9c3f29ccf57afd42c0348b937bceea0804eece6d66
|
4
|
+
data.tar.gz: 5ad80792234951e7ed422b6eba16e7f6e55b41f24a116ef40afaa7f32cdeef74
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: acbe18b2d9695f8959ef6d51a3871e989600291076d6eef870a9215768ed6c7afd599d3af2741e13a733fe2f5cc9f75fdf075a130cafd0a9144b4ca00bd80dc9
|
7
|
+
data.tar.gz: 0363375dd8c4465aa2650649d0bd62a4f95431b78178edb624a84f5326e395476e0c54e4755b27fedc86caf94b7c059abbdc15af28832417ec1d3e4770ea9ae0
|
data/NEWS.md
CHANGED
@@ -2,6 +2,166 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## Ruby D-Bus 0.18.1 - 2022-07-13
|
6
|
+
|
7
|
+
No changes since 0.18.0.beta8.
|
8
|
+
Repeating the most important changes since 0.17.0:
|
9
|
+
|
10
|
+
API:
|
11
|
+
* Introduced DBus::Data classes, use them in Properties.Get,
|
12
|
+
Properties.GetAll to return correct types as declared ([#97][]).
|
13
|
+
* Introduced Object#dbus_properties_changed to send correctly typed property
|
14
|
+
values ([#115][]). Avoid calling PropertiesChanged directly as it will
|
15
|
+
guess the types.
|
16
|
+
* Service side `emits_changed_signal` to control emission of
|
17
|
+
PropertiesChanged: can be assigned within `dbus_interface` or as an option
|
18
|
+
when declaring properties ([#117][]).
|
19
|
+
* DBus.variant(type, value) is deprecated in favor of
|
20
|
+
Data::Variant.new(value, member_type:)
|
21
|
+
* Added type factories
|
22
|
+
* Type::Array[type]
|
23
|
+
* Type::Hash[key_type, value_type]
|
24
|
+
* Type::Struct[type1, type2...]
|
25
|
+
|
26
|
+
Bug fixes:
|
27
|
+
* Fix Object.dbus_reader to work with attr_accessor and automatically produce
|
28
|
+
dbus_properties_changed for properties that are read-write at
|
29
|
+
implementation side and read-only at D-Bus side ([#96][])
|
30
|
+
* Service-side properties: Fix Properties.Get, Properties.GetAll
|
31
|
+
to use the specific property signature, not the generic
|
32
|
+
Variant ([#97][], [#105][], [#109][]).
|
33
|
+
* Client-side properties: When calling Properties.Set in
|
34
|
+
ProxyObjectInterface#[]=, use the correct type ([#108][]).
|
35
|
+
* Added thorough tests (`spec/data/marshall.yaml`) to detect nearly all
|
36
|
+
invalid data at unmarshalling time.
|
37
|
+
|
38
|
+
Requirements:
|
39
|
+
* Require Ruby 2.4, because of RuboCop 1.0.
|
40
|
+
|
41
|
+
## Ruby D-Bus 0.18.0.beta8 - 2022-06-21
|
42
|
+
|
43
|
+
Bug fixes:
|
44
|
+
* Introduced Object#dbus_properties_changed to send correctly typed property
|
45
|
+
values ([#115][]). Avoid calling PropertiesChanged directly as it will
|
46
|
+
guess the types.
|
47
|
+
* Fix Object.dbus_reader to work with attr_accessor and automatically produce
|
48
|
+
dbus_properties_changed for properties that are read-write at
|
49
|
+
implementation side and read-only at D-Bus side ([#96][])
|
50
|
+
|
51
|
+
[#96]: https://github.com/mvidner/ruby-dbus/issues/96
|
52
|
+
|
53
|
+
API:
|
54
|
+
* Service side `emits_changed_signal` to control emission of
|
55
|
+
PropertiesChanged: can be assigned within `dbus_interface` or as an option
|
56
|
+
when declaring properties ([#117][]).
|
57
|
+
|
58
|
+
[#115]: https://github.com/mvidner/ruby-dbus/issues/115
|
59
|
+
[#117]: https://github.com/mvidner/ruby-dbus/pulls/117
|
60
|
+
|
61
|
+
## Ruby D-Bus 0.18.0.beta7 - 2022-05-29
|
62
|
+
|
63
|
+
API:
|
64
|
+
* DBus.variant(type, value) is deprecated in favor of
|
65
|
+
Data::Variant.new(value, member_type:)
|
66
|
+
|
67
|
+
Bug fixes:
|
68
|
+
* Client-side properties: When calling Properties.Set in
|
69
|
+
ProxyObjectInterface#[]=, use the correct type ([#108][]).
|
70
|
+
|
71
|
+
[#108]: https://github.com/mvidner/ruby-dbus/issues/108
|
72
|
+
|
73
|
+
## Ruby D-Bus 0.18.0.beta6 - 2022-05-25
|
74
|
+
|
75
|
+
API:
|
76
|
+
* Data::Base#value returns plain Ruby types;
|
77
|
+
Data::Container#exact_value contains Data::Base ([#114][]).
|
78
|
+
* Data::Base#initialize and .from_typed allow plain or exact values, validate
|
79
|
+
argument types.
|
80
|
+
* Implement #== (converting) and #eql? (strict) for Data::Base and DBus::Type.
|
81
|
+
|
82
|
+
[#114]: https://github.com/mvidner/ruby-dbus/pull/114
|
83
|
+
|
84
|
+
## Ruby D-Bus 0.18.0.beta5 - 2022-04-27
|
85
|
+
|
86
|
+
API:
|
87
|
+
* DBus::Type instances are frozen.
|
88
|
+
* Data::Container classes (Array, Struct, DictEntry, but not Variant)
|
89
|
+
constructors (#initialize, .from_items, .from_typed) changed to have
|
90
|
+
a *type* argument instead of *member_type* or *member_types*.
|
91
|
+
* Added type factories
|
92
|
+
* Type::Array[type]
|
93
|
+
* Type::Hash[key_type, value_type]
|
94
|
+
* Type::Struct[type1, type2...]
|
95
|
+
|
96
|
+
Bug fixes:
|
97
|
+
* Properties containing Variants would return them doubly wrapped ([#111][]).
|
98
|
+
|
99
|
+
[#111]: https://github.com/mvidner/ruby-dbus/pull/111
|
100
|
+
|
101
|
+
## Ruby D-Bus 0.18.0.beta4 - 2022-04-21
|
102
|
+
|
103
|
+
Bug fixes:
|
104
|
+
* Service-side properties: Fix Properties.Get, Properties.GetAll for
|
105
|
+
properties that contain arrays, on other than outermost level ([#109][]).
|
106
|
+
* Sending variants: fixed make_variant to correctly guess the signature
|
107
|
+
for UInt64 and number-keyed hashes/dictionaries.
|
108
|
+
|
109
|
+
[#109]: https://github.com/mvidner/ruby-dbus/pull/109
|
110
|
+
|
111
|
+
## Ruby D-Bus 0.18.0.beta3 - 2022-04-10
|
112
|
+
|
113
|
+
Bug fixes:
|
114
|
+
* Service-side properties: Fix Properties.Get, Properties.GetAll for Array,
|
115
|
+
Dict, and Variant types ([#105][]).
|
116
|
+
|
117
|
+
[#105]: https://github.com/mvidner/ruby-dbus/pull/105
|
118
|
+
|
119
|
+
## Ruby D-Bus 0.18.0.beta2 - 2022-04-04
|
120
|
+
|
121
|
+
API:
|
122
|
+
* Renamed the DBus::Type::Type class to DBus::Type
|
123
|
+
(which was previously a module).
|
124
|
+
* Introduced DBus::Data classes, use them in Properties.Get,
|
125
|
+
Properties.GetAll to return correct types as declared (still [#97][]).
|
126
|
+
|
127
|
+
Bug fixes:
|
128
|
+
* Signature validation: Ensure DBus.type produces a valid Type
|
129
|
+
* Detect more malformed messages: non-NUL padding bytes, variants with
|
130
|
+
multiple or no value.
|
131
|
+
* Added thorough tests (`spec/data/marshall.yaml`) to detect nearly all
|
132
|
+
invalid data at unmarshalling time.
|
133
|
+
|
134
|
+
## Ruby D-Bus 0.18.0.beta1 - 2022-02-24
|
135
|
+
|
136
|
+
API:
|
137
|
+
* D-Bus structs have been passed as Ruby arrays. Now these arrays are frozen.
|
138
|
+
* Ruby structs can be used as D-Bus structs.
|
139
|
+
|
140
|
+
Bug fixes:
|
141
|
+
* Returning the value for o.fd.DBus.Properties.Get, use the specific property
|
142
|
+
signature, not the generic Variant ([#97][]).
|
143
|
+
|
144
|
+
Requirements:
|
145
|
+
* Require Ruby 2.4, because of RuboCop 1.0.
|
146
|
+
|
147
|
+
[#97]: https://github.com/mvidner/ruby-dbus/issues/97
|
148
|
+
|
149
|
+
## Ruby D-Bus 0.17.0 - 2022-02-11
|
150
|
+
|
151
|
+
API:
|
152
|
+
* Export properties with `dbus_attr_accessor`, `dbus_reader` etc. ([#86][]).
|
153
|
+
|
154
|
+
Bug fixes:
|
155
|
+
* Depend on rexml which is separate since Ruby 3.0 ([#87][],
|
156
|
+
by Toshiaki Asai).
|
157
|
+
Nokogiri is faster but bigger so it remains optional.
|
158
|
+
* Fix connection in case ~/.dbus-keyrings has multiple cookies, showing
|
159
|
+
as "Oops: undefined method `zero?' for nil:NilClass".
|
160
|
+
* Add the missing name to the root introspection node.
|
161
|
+
|
162
|
+
[#86]: https://github.com/mvidner/ruby-dbus/pull/86
|
163
|
+
[#87]: https://github.com/mvidner/ruby-dbus/pull/87
|
164
|
+
|
5
165
|
## Ruby D-Bus 0.16.0 - 2019-10-15
|
6
166
|
|
7
167
|
API:
|
data/README.md
CHANGED
@@ -11,14 +11,13 @@ Ruby D-Bus is a pure Ruby library for writing clients and services for D-Bus.
|
|
11
11
|
[![Coverage Status][CS img]][Coverage Status]
|
12
12
|
|
13
13
|
[Gem Version]: https://rubygems.org/gems/ruby-dbus
|
14
|
-
[Build Status]: https://
|
15
|
-
[travis pull requests]: https://travis-ci.org/mvidner/ruby-dbus/pull_requests
|
14
|
+
[Build Status]: https://github.com/mvidner/ruby-dbus/actions?query=branch%3Amaster
|
16
15
|
[Dependency Status]: https://gemnasium.com/mvidner/ruby-dbus
|
17
16
|
[Code Climate]: https://codeclimate.com/github/mvidner/ruby-dbus
|
18
17
|
[Coverage Status]: https://coveralls.io/r/mvidner/ruby-dbus
|
19
18
|
|
20
19
|
[GV img]: https://badge.fury.io/rb/ruby-dbus.png
|
21
|
-
[BS img]: https://
|
20
|
+
[BS img]: https://github.com/mvidner/ruby-dbus/workflows/CI/badge.svg?branch=master
|
22
21
|
[DS img]: https://gemnasium.com/mvidner/ruby-dbus.png
|
23
22
|
[CC img]: https://codeclimate.com/github/mvidner/ruby-dbus.png
|
24
23
|
[CS img]: https://coveralls.io/repos/mvidner/ruby-dbus/badge.png?branch=master
|
@@ -32,7 +31,6 @@ via [UPower](http://upower.freedesktop.org/docs/UPower.html#UPower:OnBattery)
|
|
32
31
|
sysbus = DBus.system_bus
|
33
32
|
upower_service = sysbus["org.freedesktop.UPower"]
|
34
33
|
upower_object = upower_service["/org/freedesktop/UPower"]
|
35
|
-
upower_object.introspect
|
36
34
|
upower_interface = upower_object["org.freedesktop.UPower"]
|
37
35
|
on_battery = upower_interface["OnBattery"]
|
38
36
|
if on_battery
|
@@ -43,7 +41,7 @@ via [UPower](http://upower.freedesktop.org/docs/UPower.html#UPower:OnBattery)
|
|
43
41
|
|
44
42
|
## Requirements
|
45
43
|
|
46
|
-
- Ruby 2.
|
44
|
+
- Ruby 2.4 or newer.
|
47
45
|
|
48
46
|
|
49
47
|
## Installation
|
data/Rakefile
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
require "rake"
|
3
5
|
require "fileutils"
|
4
|
-
include FileUtils
|
5
6
|
require "tmpdir"
|
6
7
|
require "rspec/core/rake_task"
|
7
8
|
begin
|
@@ -9,6 +10,12 @@ begin
|
|
9
10
|
rescue LoadError
|
10
11
|
nil
|
11
12
|
end
|
13
|
+
begin
|
14
|
+
require "yard"
|
15
|
+
rescue LoadError
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
12
19
|
require "packaging"
|
13
20
|
|
14
21
|
Packaging.configuration do |conf|
|
@@ -38,12 +45,6 @@ RSpec::Core::RakeTask.new("bare:spec")
|
|
38
45
|
end
|
39
46
|
end
|
40
47
|
|
41
|
-
if ENV["TRAVIS"]
|
42
|
-
require "coveralls/rake/task"
|
43
|
-
Coveralls::RakeTask.new
|
44
|
-
task default: "coveralls:push"
|
45
|
-
end
|
46
|
-
|
47
48
|
# remove tarball implementation and create gem for this gemfile
|
48
49
|
Rake::Task[:tarball].clear
|
49
50
|
|
@@ -68,4 +69,13 @@ namespace :doc do
|
|
68
69
|
end
|
69
70
|
end
|
70
71
|
|
71
|
-
|
72
|
+
if Object.const_defined? :RuboCop
|
73
|
+
RuboCop::RakeTask.new
|
74
|
+
else
|
75
|
+
desc "Run RuboCop (dummy)"
|
76
|
+
task :rubocop do
|
77
|
+
warn "RuboCop not installed"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
YARD::Rake::YardocTask.new if Object.const_defined? :YARD
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.18.1
|
data/doc/Reference.md
CHANGED
@@ -153,7 +153,7 @@ To receive signals for a specific object and interface, use
|
|
153
153
|
|
154
154
|
D-Bus booleans, numbers, strings, arrays and dictionaries become their straightforward Ruby counterparts.
|
155
155
|
|
156
|
-
Structs become arrays.
|
156
|
+
Structs become frozen arrays.
|
157
157
|
|
158
158
|
Object paths become strings.
|
159
159
|
|
@@ -166,12 +166,21 @@ D-Bus has stricter typing than Ruby, so the library must decide
|
|
166
166
|
which D-Bus type to choose. Most of the time the choice is dictated
|
167
167
|
by the D-Bus signature.
|
168
168
|
|
169
|
+
For exact representation of D-Bus data types, use subclasses
|
170
|
+
of {DBus::Data::Base}, such as {DBus::Data::Int16} or {DBus::Data::UInt64}.
|
171
|
+
|
169
172
|
##### Variants
|
170
173
|
|
171
174
|
If the signature expects a Variant
|
172
175
|
(which is the case for all Properties!) then an explicit mechanism is needed.
|
173
176
|
|
174
|
-
1.
|
177
|
+
1. Any {DBus::Data::Base}.
|
178
|
+
|
179
|
+
2. A {DBus::Data::Variant} made by {DBus.variant}(signature, value).
|
180
|
+
(Formerly this produced the type+value pair below, now it is just an alias
|
181
|
+
to the Variant constructor.)
|
182
|
+
|
183
|
+
3. A pair [{DBus::Type}, value] specifies to marshall *value* as
|
175
184
|
that specified type.
|
176
185
|
The pair can be produced by {DBus.variant}(signature, value) which
|
177
186
|
gives the same result as [{DBus.type}(signature), value].
|
@@ -179,22 +188,29 @@ If the signature expects a Variant
|
|
179
188
|
ISSUE: using something else than cryptic signatures is even more painful
|
180
189
|
than remembering the signatures!
|
181
190
|
|
182
|
-
|
191
|
+
`foo_i["Bar"] = DBus.variant("au", [0, 1, 1, 2, 3, 5, 8])`
|
183
192
|
|
184
|
-
|
193
|
+
4. Other values are tried to fit one of these:
|
185
194
|
Boolean, Double, Array of Variants, Hash of String keyed Variants,
|
186
195
|
String, Int32, Int64.
|
187
196
|
|
188
|
-
|
197
|
+
5. **Deprecated:** A pair [String, value], where String is a valid
|
189
198
|
signature of a single complete type, marshalls value as that
|
190
|
-
type. This will hit you when you rely on method (
|
199
|
+
type. This will hit you when you rely on method (4) but happen to have
|
191
200
|
a particular string value in an array.
|
192
201
|
|
202
|
+
##### Structs
|
203
|
+
|
204
|
+
If a **STRUCT** `(...)` is expected you may pass
|
205
|
+
|
206
|
+
- an [Array](https://ruby-doc.org/core/Array.html) (frozen is fine)
|
207
|
+
- a [Struct](https://ruby-doc.org/core/Struct.html)
|
208
|
+
|
193
209
|
##### Byte Arrays
|
194
210
|
|
195
211
|
If a byte array (`ay`) is expected you can pass a String too.
|
196
212
|
The bytes sent are according to the string's
|
197
|
-
[encoding](http://ruby-doc.org/core
|
213
|
+
[encoding](http://ruby-doc.org/core/Encoding.html).
|
198
214
|
|
199
215
|
##### nil
|
200
216
|
|
@@ -244,14 +260,97 @@ When you want to provide a DBus API.
|
|
244
260
|
(check that client and service side have their counterparts)
|
245
261
|
|
246
262
|
### Basic
|
263
|
+
|
247
264
|
#### Exporting a Method
|
265
|
+
|
248
266
|
##### Interfaces
|
267
|
+
|
249
268
|
##### Methods
|
269
|
+
|
250
270
|
##### Bus Names
|
271
|
+
|
251
272
|
##### Errors
|
273
|
+
|
252
274
|
#### Exporting Properties
|
275
|
+
|
276
|
+
Similar to plain Ruby attributes, declared with
|
277
|
+
|
278
|
+
- {https://docs.ruby-lang.org/en/3.1/Module.html#method-i-attr_accessor attr_accessor}
|
279
|
+
- {https://docs.ruby-lang.org/en/3.1/Module.html#method-i-attr_reader attr_reader}
|
280
|
+
- {https://docs.ruby-lang.org/en/3.1/Module.html#method-i-attr_writer attr_writer}
|
281
|
+
|
282
|
+
These methods declare the attributes and export them as properties:
|
283
|
+
|
284
|
+
- {DBus::Object.dbus_attr_accessor}
|
285
|
+
- {DBus::Object.dbus_attr_reader}
|
286
|
+
- {DBus::Object.dbus_attr_writer}
|
287
|
+
|
288
|
+
For making properties out of Ruby methods (which are not attributes), use:
|
289
|
+
|
290
|
+
- {DBus::Object.dbus_accessor}
|
291
|
+
- {DBus::Object.dbus_reader}
|
292
|
+
- {DBus::Object.dbus_writer}
|
293
|
+
|
294
|
+
Note that the properties are declared in the Ruby naming convention with
|
295
|
+
`snake_case` and D-Bus sees them `CamelCased`. Use the `dbus_name` argument
|
296
|
+
for overriding this.
|
297
|
+
|
298
|
+
|
299
|
+
|
300
|
+
class Note < DBus::Object
|
301
|
+
dbus_interface "net.vidner.Example.Properties" do
|
302
|
+
# A read-write property "Title",
|
303
|
+
# with `title` and `title=` accessing @title.
|
304
|
+
dbus_attr_accessor :title, DBus::Type::STRING
|
305
|
+
|
306
|
+
# A read-only property "Author"
|
307
|
+
# (type specified via DBus signature)
|
308
|
+
# with `author` reading `@author`
|
309
|
+
dbus_attr_reader :author, "s"
|
310
|
+
|
311
|
+
# A read-only property `Clock`
|
312
|
+
def clock
|
313
|
+
Time.now.to_s
|
314
|
+
end
|
315
|
+
dbus_reader :clock, "s"
|
316
|
+
|
317
|
+
# Name mapping: `CreationTime`
|
318
|
+
def creation_time
|
319
|
+
"1993-01-01 00:00:00 +0100"
|
320
|
+
end
|
321
|
+
dbus_reader :creation_time, "s"
|
322
|
+
|
323
|
+
dbus_attr_accessor :book_volume, DBus::Type::VARIANT, dbus_name: "Volume"
|
324
|
+
end
|
325
|
+
|
326
|
+
dbus_interface "net.vidner.Example.Audio" do
|
327
|
+
dbus_attr_accessor :speaker_volume, DBus::Type::BYTE, dbus_name: "Volume"
|
328
|
+
end
|
329
|
+
|
330
|
+
# Must assign values because `nil` would crash our connection
|
331
|
+
def initialize(opath)
|
332
|
+
super
|
333
|
+
@title = "Ahem"
|
334
|
+
@author = "Martin"
|
335
|
+
@book_volume = 1
|
336
|
+
@speaker_volume = 11
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
obj = Note.new("/net/vidner/Example/Properties")
|
341
|
+
|
342
|
+
bus = DBus::SessionBus.instance
|
343
|
+
service = bus.request_service("net.vidner.Example")
|
344
|
+
service.export(obj)
|
345
|
+
|
346
|
+
main = DBus::Main.new
|
347
|
+
main << bus
|
348
|
+
main.run
|
349
|
+
|
253
350
|
### Advanced
|
351
|
+
|
254
352
|
#### Inheritance
|
353
|
+
|
255
354
|
#### Names
|
256
355
|
|
257
356
|
Specification Conformance
|
@@ -1,9 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
if ARGV[0].nil?
|
3
5
|
puts "Usage: #{$PROGRAM_NAME} file.md"
|
4
6
|
exit
|
5
7
|
end
|
6
8
|
|
9
|
+
base_url = "https://github.com/mvidner/ruby-dbus/blob/master/"
|
10
|
+
base_url += ARGV[0].gsub("../", "")
|
11
|
+
|
7
12
|
File.open(ARGV[0]) do |f|
|
8
13
|
title = nil
|
9
14
|
setup = ""
|
@@ -20,7 +25,9 @@ File.open(ARGV[0]) do |f|
|
|
20
25
|
setup = example
|
21
26
|
else
|
22
27
|
File.open("#{basename}.rb", "w") do |e|
|
28
|
+
anchor = title.downcase.gsub(/ +/, "-")
|
23
29
|
e.write setup
|
30
|
+
e.write "# #{base_url}##{anchor}\n"
|
24
31
|
e.write example
|
25
32
|
e.chmod(0o755)
|
26
33
|
end
|
data/examples/gdbus/gdbus
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
#
|
3
5
|
# This is a quite complex example using internal lower level API.
|
4
6
|
# Not a good starting point, but might be usefull if you want to do tricky
|
@@ -103,11 +105,12 @@ class DBusUI
|
|
103
105
|
|
104
106
|
def beautify_method(meth)
|
105
107
|
# Damn, this need to be rewritten :p
|
106
|
-
s = meth.name
|
107
|
-
|
108
|
+
s = "#{meth.name}("
|
109
|
+
case meth
|
110
|
+
when DBus::Method
|
108
111
|
s += (meth.params.collect { |a| "in #{a[0]}:#{a[1]}" } +
|
109
112
|
meth.rets.collect { |a| "out #{a[0]}:#{a[1]}" }).join(", ")
|
110
|
-
|
113
|
+
when DBus::Signal
|
111
114
|
s += (meth.params.collect { |a| "in #{a[0]}:#{a[1]}" }).join(", ")
|
112
115
|
end
|
113
116
|
s += ")"
|
@@ -119,25 +122,26 @@ class DBusUI
|
|
119
122
|
model = Gtk::ListStore.new(String, String, DBus::Method,
|
120
123
|
DBus::ProxyObjectInterface)
|
121
124
|
@methsigtreeview.model = model
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
125
|
+
return unless selected
|
126
|
+
|
127
|
+
intf = selected[1]
|
128
|
+
return unless intf
|
129
|
+
|
130
|
+
intf.methods.keys.sort.each do |mi|
|
131
|
+
m = intf.methods[mi]
|
132
|
+
subiter = model.append
|
133
|
+
subiter[0] = beautify_method(m)
|
134
|
+
subiter[1] = "M"
|
135
|
+
subiter[2] = m
|
136
|
+
subiter[3] = intf
|
137
|
+
end
|
138
|
+
intf.signals.keys.sort.each do |mi|
|
139
|
+
m = intf.signals[mi]
|
140
|
+
subiter = model.append
|
141
|
+
subiter[0] = beautify_method(m)
|
142
|
+
subiter[1] = "S"
|
143
|
+
subiter[2] = m
|
144
|
+
subiter[3] = intf
|
141
145
|
end
|
142
146
|
end
|
143
147
|
|
@@ -145,11 +149,12 @@ class DBusUI
|
|
145
149
|
name = view.model.get_iter(path)[0]
|
146
150
|
puts "Clicked on: #{name.inspect}"
|
147
151
|
type = view.model.get_iter(path)[1]
|
148
|
-
|
152
|
+
case type
|
153
|
+
when "M"
|
149
154
|
method = view.model.get_iter(path)[2]
|
150
155
|
intf = view.model.get_iter(path)[3]
|
151
156
|
MethodCallWindow.new(@window, intf, method).run
|
152
|
-
|
157
|
+
when "S"
|
153
158
|
signal = view.model.get_iter(path)[2]
|
154
159
|
intf = view.model.get_iter(path)[3]
|
155
160
|
mr = DBus::MatchRule.new.from_signal(intf, signal)
|
@@ -204,6 +209,7 @@ class DBusUI
|
|
204
209
|
end
|
205
210
|
|
206
211
|
return unless ENABLE_SYSTEM
|
212
|
+
|
207
213
|
DBus::SystemBus.instance.proxy.ListNames do |_msg, names|
|
208
214
|
fill_treeview(DBus::SystemBus.instance, @systemtreeview, names)
|
209
215
|
end
|
@@ -217,6 +223,7 @@ class DBusUI
|
|
217
223
|
end
|
218
224
|
|
219
225
|
return if node.object.nil?
|
226
|
+
|
220
227
|
node.object.interfaces.sort.each do |ifname|
|
221
228
|
subiter = model.append(iter)
|
222
229
|
subiter[0] = ifname
|
@@ -1,4 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
#
|
3
5
|
# Trivial network interface lister using NetworkManager.
|
4
6
|
# NetworkManager does not support introspection, so the api is not that sexy.
|
@@ -11,4 +13,4 @@ tracker_service = bus.service("org.freedesktop.Tracker")
|
|
11
13
|
tracker_manager = tracker_service.object("/org/freedesktop/tracker")
|
12
14
|
poi = DBus::ProxyObjectInterface.new(tracker_manager, "org.freedesktop.Tracker.Files")
|
13
15
|
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"]
|
16
|
+
p poi.GetMetadataForFilesInFolder(-1, "#{ENV["HOME"]}/Desktop", ["File:Name", "File:Size"])
|
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require "dbus"
|
4
5
|
bus = DBus::SessionBus.instance
|
@@ -13,7 +14,7 @@ mr.type = "signal"
|
|
13
14
|
mr.interface = "org.gnome.Rhythmbox.Player"
|
14
15
|
mr.path = "/org/gnome/Rhythmbox/Player"
|
15
16
|
bus.add_match(mr) do |msg, first_param|
|
16
|
-
print msg.member
|
17
|
+
print "#{msg.member} "
|
17
18
|
puts first_param
|
18
19
|
end
|
19
20
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require "dbus"
|
4
5
|
|
@@ -14,7 +15,7 @@ player.test_variant(["s", "coucou"])
|
|
14
15
|
player.on_signal("SomethingJustHappened") do |u, v|
|
15
16
|
puts "SomethingJustHappened: #{u} #{v}"
|
16
17
|
end
|
17
|
-
player.hello("
|
18
|
+
player.hello("Hey", "there!")
|
18
19
|
p player["org.ruby.AnotherInterface"].Reverse("Hello world!")
|
19
20
|
|
20
21
|
main = DBus::Main.new
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "dbus"
|
5
|
+
|
6
|
+
# Complex property
|
7
|
+
class Test < DBus::Object
|
8
|
+
dbus_interface "net.vidner.Scratch" do
|
9
|
+
dbus_attr_reader :progress, "(stttt)"
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(opath)
|
13
|
+
@progress = ["working", 1, 0, 100, 42].freeze
|
14
|
+
super(opath)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
bus = DBus::SessionBus.instance
|
19
|
+
svc = bus.request_service("net.vidner.Scratch")
|
20
|
+
svc.export(Test.new("/net/vidner/Scratch"))
|
21
|
+
DBus::Main.new.tap { |m| m << bus }.run
|
data/examples/simple/get_id.rb
CHANGED
data/examples/utils/listnames.rb
CHANGED