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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +160 -0
  3. data/README.md +3 -5
  4. data/Rakefile +18 -8
  5. data/VERSION +1 -1
  6. data/doc/Reference.md +106 -7
  7. data/examples/doc/_extract_examples +7 -0
  8. data/examples/gdbus/gdbus +31 -24
  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 +1 -1
  15. data/examples/simple/call_introspect.rb +1 -0
  16. data/examples/simple/get_id.rb +2 -1
  17. data/examples/simple/properties.rb +2 -0
  18. data/examples/utils/listnames.rb +1 -0
  19. data/examples/utils/notify.rb +1 -0
  20. data/lib/dbus/api_options.rb +9 -0
  21. data/lib/dbus/auth.rb +20 -15
  22. data/lib/dbus/bus.rb +123 -75
  23. data/lib/dbus/bus_name.rb +12 -8
  24. data/lib/dbus/core_ext/class/attribute.rb +1 -1
  25. data/lib/dbus/data.rb +821 -0
  26. data/lib/dbus/emits_changed_signal.rb +83 -0
  27. data/lib/dbus/error.rb +4 -2
  28. data/lib/dbus/introspect.rb +132 -31
  29. data/lib/dbus/logger.rb +3 -1
  30. data/lib/dbus/marshall.rb +247 -296
  31. data/lib/dbus/matchrule.rb +16 -16
  32. data/lib/dbus/message.rb +44 -37
  33. data/lib/dbus/message_queue.rb +16 -10
  34. data/lib/dbus/object.rb +358 -24
  35. data/lib/dbus/object_path.rb +11 -6
  36. data/lib/dbus/proxy_object.rb +22 -1
  37. data/lib/dbus/proxy_object_factory.rb +13 -7
  38. data/lib/dbus/proxy_object_interface.rb +63 -30
  39. data/lib/dbus/raw_message.rb +91 -0
  40. data/lib/dbus/type.rb +318 -86
  41. data/lib/dbus/xml.rb +32 -17
  42. data/lib/dbus.rb +14 -7
  43. data/ruby-dbus.gemspec +7 -3
  44. data/spec/async_spec.rb +2 -0
  45. data/spec/binding_spec.rb +2 -0
  46. data/spec/bus_and_xml_backend_spec.rb +2 -0
  47. data/spec/bus_driver_spec.rb +2 -0
  48. data/spec/bus_name_spec.rb +3 -1
  49. data/spec/bus_spec.rb +2 -0
  50. data/spec/byte_array_spec.rb +2 -0
  51. data/spec/client_robustness_spec.rb +4 -2
  52. data/spec/data/marshall.yaml +1667 -0
  53. data/spec/data_spec.rb +673 -0
  54. data/spec/emits_changed_signal_spec.rb +58 -0
  55. data/spec/err_msg_spec.rb +2 -0
  56. data/spec/introspect_xml_parser_spec.rb +2 -0
  57. data/spec/introspection_spec.rb +2 -0
  58. data/spec/main_loop_spec.rb +3 -1
  59. data/spec/node_spec.rb +23 -0
  60. data/spec/object_path_spec.rb +3 -0
  61. data/spec/object_spec.rb +138 -0
  62. data/spec/packet_marshaller_spec.rb +41 -0
  63. data/spec/packet_unmarshaller_spec.rb +248 -0
  64. data/spec/property_spec.rb +192 -5
  65. data/spec/proxy_object_spec.rb +2 -0
  66. data/spec/server_robustness_spec.rb +2 -0
  67. data/spec/server_spec.rb +2 -0
  68. data/spec/service_newapi.rb +70 -70
  69. data/spec/session_bus_spec.rb +3 -1
  70. data/spec/session_bus_spec_manual.rb +2 -0
  71. data/spec/signal_spec.rb +5 -3
  72. data/spec/spec_helper.rb +37 -9
  73. data/spec/thread_safety_spec.rb +2 -0
  74. data/spec/tools/dbus-limited-session.conf +4 -0
  75. data/spec/type_spec.rb +214 -6
  76. data/spec/value_spec.rb +16 -1
  77. data/spec/variant_spec.rb +4 -2
  78. data/spec/zzz_quit_spec.rb +16 -0
  79. metadata +34 -8
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of the ruby-dbus project
2
4
  # Copyright (C) 2016 Martin Vidner
3
5
  #
@@ -9,6 +11,13 @@
9
11
  module DBus
10
12
  class ApiOptions
11
13
  # https://github.com/mvidner/ruby-dbus/issues/30
14
+ # @return [Boolean]
15
+ # - true: a proxy (client-side) method will return an array
16
+ # even for the most common case where the method is declared
17
+ # to have only one 'out parameter'
18
+ # - false: a proxy (client-side) method will return
19
+ # - one value for the only 'out parameter'
20
+ # - an array with more 'out parameters'
12
21
  attr_accessor :proxy_method_returns_array
13
22
 
14
23
  A0 = ApiOptions.new
data/lib/dbus/auth.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of the ruby-dbus project
2
4
  # Copyright (C) 2007 Arnaud Cornet and Paul van Tilburg
3
5
  #
@@ -73,7 +75,7 @@ module DBus
73
75
  path = File.join(ENV["HOME"], ".dbus-keyrings", context)
74
76
  DBus.logger.debug "path: #{path.inspect}"
75
77
  File.foreach(path) do |line|
76
- if line.index(id).zero?
78
+ if line.start_with?(id)
77
79
  # Right line of file, read cookie
78
80
  cookie = line.split(" ")[2].chomp
79
81
  DBus.logger.debug "cookie: #{cookie.inspect}"
@@ -87,27 +89,28 @@ module DBus
87
89
  return response
88
90
  end
89
91
  end
92
+ return if @retries <= 0
93
+
90
94
  # a little rescue magic
91
- unless @retries <= 0
92
- puts "ERROR: Could not auth, will now exit."
93
- puts "ERROR: Unable to locate cookie, retry in 1 second."
94
- @retries -= 1
95
- sleep 1
96
- data(hexdata)
97
- end
95
+ puts "ERROR: Could not auth, will now exit."
96
+ puts "ERROR: Unable to locate cookie, retry in 1 second."
97
+ @retries -= 1
98
+ sleep 1
99
+ data(hexdata)
98
100
  end
99
101
 
100
102
  # encode plain to hex
101
103
  def hex_encode(plain)
102
104
  return nil if plain.nil?
103
- plain.to_s.unpack("H*")[0]
105
+
106
+ plain.to_s.unpack1("H*")
104
107
  end
105
108
 
106
109
  # decode hex to plain
107
110
  def hex_decode(encoded)
108
111
  encoded.scan(/[[:xdigit:]]{2}/).map { |h| h.hex.chr }.join
109
112
  end
110
- end # DBusCookieSHA1 class ends here
113
+ end
111
114
 
112
115
  # Note: this following stuff is tested with External authenticator only!
113
116
 
@@ -148,12 +151,13 @@ module DBus
148
151
  # server.
149
152
  def send(meth, *args)
150
153
  o = ([meth] + args).join(" ")
151
- @socket.write(o + "\r\n")
154
+ @socket.write("#{o}\r\n")
152
155
  end
153
156
 
154
157
  # Try authentication using the next authenticator.
155
158
  def next_authenticator
156
159
  raise AuthenticationFailed if @auth_list.empty?
160
+
157
161
  @authenticator = @auth_list.shift.new
158
162
  auth_msg = ["AUTH", @authenticator.name, @authenticator.authenticate]
159
163
  DBus.logger.debug "auth_msg: #{auth_msg.inspect}"
@@ -169,9 +173,10 @@ module DBus
169
173
  data = ""
170
174
  crlf = "\r\n"
171
175
  left = 1024 # 1024 byte, no idea if it's ever getting bigger
172
- while left > 0
176
+ while left.positive?
173
177
  buf = @socket.read(left > 1 ? 1 : left)
174
178
  break if buf.nil?
179
+
175
180
  left -= buf.bytesize
176
181
  data += buf
177
182
  break if data.include? crlf # crlf means line finished, the TCP socket keeps on listening, so we break
@@ -262,6 +267,6 @@ module DBus
262
267
  end
263
268
  end
264
269
  true
265
- end # def next_state
266
- end # class Client
267
- end # module D-Bus
270
+ end
271
+ end
272
+ end
data/lib/dbus/bus.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # dbus.rb - Module containing the low-level D-Bus implementation
2
4
  #
3
5
  # This file is part of the ruby-dbus project
@@ -9,7 +11,6 @@
9
11
  # See the file "COPYING" for the exact licensing terms.
10
12
 
11
13
  require "socket"
12
- require "thread"
13
14
  require "singleton"
14
15
 
15
16
  # = D-Bus main module
@@ -17,7 +18,7 @@ require "singleton"
17
18
  # Module containing all the D-Bus modules and classes.
18
19
  module DBus
19
20
  # This represents a remote service. It should not be instantiated directly
20
- # Use {Bus#service}
21
+ # Use {Connection#service}
21
22
  class Service
22
23
  # The service name.
23
24
  attr_reader :name
@@ -48,6 +49,7 @@ module DBus
48
49
  end
49
50
 
50
51
  # Retrieves an object at the given _path_.
52
+ # @param path [ObjectPath]
51
53
  # @return [ProxyObject]
52
54
  def [](path)
53
55
  object(path, api: ApiOptions::A1)
@@ -55,9 +57,11 @@ module DBus
55
57
 
56
58
  # Retrieves an object at the given _path_
57
59
  # whose methods always return an array.
60
+ # @param path [ObjectPath]
61
+ # @param api [ApiOptions]
58
62
  # @return [ProxyObject]
59
63
  def object(path, api: ApiOptions::A0)
60
- node = get_node(path, _create = true)
64
+ node = get_node(path, create: true)
61
65
  if node.object.nil? || node.object.api != api
62
66
  node.object = ProxyObject.new(
63
67
  @bus, @name, path,
@@ -67,35 +71,43 @@ module DBus
67
71
  node.object
68
72
  end
69
73
 
70
- # Export an object _obj_ (an DBus::Object subclass instance).
74
+ # Export an object
75
+ # @param obj [DBus::Object]
71
76
  def export(obj)
72
77
  obj.service = self
73
- get_node(obj.path, true).object = obj
78
+ get_node(obj.path, create: true).object = obj
74
79
  end
75
80
 
76
81
  # Undo exporting an object _obj_.
77
82
  # Raises ArgumentError if it is not a DBus::Object.
78
83
  # Returns the object, or false if _obj_ was not exported.
84
+ # @param obj [DBus::Object]
79
85
  def unexport(obj)
80
86
  raise ArgumentError, "DBus::Service#unexport() expects a DBus::Object argument" unless obj.is_a?(DBus::Object)
81
87
  return false unless obj.path
88
+
82
89
  last_path_separator_idx = obj.path.rindex("/")
83
90
  parent_path = obj.path[1..last_path_separator_idx - 1]
84
91
  node_name = obj.path[last_path_separator_idx + 1..-1]
85
92
 
86
- parent_node = get_node(parent_path, false)
93
+ parent_node = get_node(parent_path, create: false)
87
94
  return false unless parent_node
95
+
88
96
  obj.service = nil
89
97
  parent_node.delete(node_name).object
90
98
  end
91
99
 
92
- # Get the object node corresponding to the given _path_. if _create_ is
93
- # true, the the nodes in the path are created if they do not already exist.
94
- def get_node(path, create = false)
100
+ # Get the object node corresponding to the given *path*.
101
+ # @param path [ObjectPath]
102
+ # @param create [Boolean] if true, the the {Node}s in the path are created
103
+ # if they do not already exist.
104
+ # @return [Node,nil]
105
+ def get_node(path, create: false)
95
106
  n = @root
96
107
  path.sub(%r{^/}, "").split("/").each do |elem|
97
108
  if !(n[elem])
98
109
  return nil if !create
110
+
99
111
  n[elem] = Node.new(elem)
100
112
  end
101
113
  n = n[elem]
@@ -120,13 +132,14 @@ module DBus
120
132
  subnodes.each do |nodename|
121
133
  subnode = node[nodename] = Node.new(nodename)
122
134
  subpath = if path == "/"
123
- "/" + nodename
135
+ "/#{nodename}"
124
136
  else
125
- path + "/" + nodename
137
+ "#{path}/#{nodename}"
126
138
  end
127
139
  rec_introspect(subnode, subpath)
128
140
  end
129
141
  return if intfs.empty?
142
+
130
143
  node.object = ProxyObjectFactory.new(xml, @bus, @name, path).build
131
144
  end
132
145
  end
@@ -135,34 +148,34 @@ module DBus
135
148
  #
136
149
  # Class representing a node on an object path.
137
150
  class Node < Hash
138
- # The D-Bus object contained by the node.
151
+ # @return [DBus::Object,DBus::ProxyObject,nil]
152
+ # The D-Bus object contained by the node.
139
153
  attr_accessor :object
154
+
140
155
  # The name of the node.
156
+ # @return [String] the last component of its object path, or "/"
141
157
  attr_reader :name
142
158
 
143
159
  # Create a new node with a given _name_.
144
160
  def initialize(name)
161
+ super()
145
162
  @name = name
146
163
  @object = nil
147
164
  end
148
165
 
149
166
  # Return an XML string representation of the node.
150
167
  # It is shallow, not recursing into subnodes
151
- def to_xml
168
+ # @param node_opath [String]
169
+ def to_xml(node_opath)
152
170
  xml = '<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
153
171
  "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
154
- <node>
155
172
  '
156
- each_pair do |k, _v|
157
- xml += "<node name=\"#{k}\" />"
173
+ xml += "<node name=\"#{node_opath}\">\n"
174
+ each_key do |k|
175
+ xml += " <node name=\"#{k}\" />\n"
158
176
  end
159
- if @object
160
- @object.intfs.each_pair do |_k, v|
161
- xml += %(<interface name="#{v.name}">\n)
162
- v.methods.each_value { |m| xml += m.to_xml }
163
- v.signals.each_value { |m| xml += m.to_xml }
164
- xml += "</interface>\n"
165
- end
177
+ @object&.intfs&.each_value do |v|
178
+ xml += v.to_xml
166
179
  end
167
180
  xml += "</node>"
168
181
  xml
@@ -180,9 +193,12 @@ module DBus
180
193
  if !@object.nil?
181
194
  s += format("%x ", @object.object_id)
182
195
  end
183
- s + "{" + keys.collect { |k| "#{k} => #{self[k].sub_inspect}" }.join(",") + "}"
196
+ contents_sub_inspect = keys
197
+ .map { |k| "#{k} => #{self[k].sub_inspect}" }
198
+ .join(",")
199
+ "#{s}{#{contents_sub_inspect}}"
184
200
  end
185
- end # class Inspect
201
+ end
186
202
 
187
203
  # FIXME: rename Connection to Bus?
188
204
 
@@ -205,7 +221,15 @@ module DBus
205
221
  def initialize(path)
206
222
  @message_queue = MessageQueue.new(path)
207
223
  @unique_name = nil
224
+
225
+ # @return [Hash{Integer => Proc}]
226
+ # key: message serial
227
+ # value: block to be run when the reply to that message is received
208
228
  @method_call_replies = {}
229
+
230
+ # @return [Hash{Integer => Message}]
231
+ # for debugging only: messages for which a reply was not received yet;
232
+ # key == value.serial
209
233
  @method_call_msgs = {}
210
234
  @signal_matchrules = {}
211
235
  @proxy = nil
@@ -216,7 +240,7 @@ module DBus
216
240
  # but do not block on the queue.
217
241
  # Called by a main loop when something is available in the queue
218
242
  def dispatch_message_queue
219
- while (msg = @message_queue.pop(:non_block)) # FIXME: EOFError
243
+ while (msg = @message_queue.pop(blocking: false)) # FIXME: EOFError
220
244
  process(msg)
221
245
  end
222
246
  end
@@ -323,7 +347,7 @@ module DBus
323
347
  </signal>
324
348
  </interface>
325
349
  </node>
326
- '.freeze
350
+ '
327
351
  # This apostroph is for syntax highlighting editors confused by above xml: "
328
352
 
329
353
  # @api private
@@ -338,6 +362,7 @@ module DBus
338
362
  if reply_handler.nil?
339
363
  send_sync(message) do |rmsg|
340
364
  raise rmsg if rmsg.is_a?(Error)
365
+
341
366
  ret = rmsg.params
342
367
  end
343
368
  else
@@ -442,44 +467,52 @@ module DBus
442
467
  end
443
468
 
444
469
  # @api private
445
- # Send a message _m_ on to the bus. This is done synchronously, thus
470
+ # Send a message _msg_ on to the bus. This is done synchronously, thus
446
471
  # the call will block until a reply message arrives.
447
- def send_sync(m, &retc) # :yields: reply/return message
448
- return if m.nil? # check if somethings wrong
449
- @message_queue.push(m)
450
- @method_call_msgs[m.serial] = m
451
- @method_call_replies[m.serial] = retc
472
+ # @param msg [Message]
473
+ # @param retc [Proc] the reply handler
474
+ # @yieldparam rmsg [MethodReturnMessage] the reply
475
+ # @yieldreturn [Array<Object>] the reply (out) parameters
476
+ def send_sync(msg, &retc) # :yields: reply/return message
477
+ return if msg.nil? # check if somethings wrong
478
+
479
+ @message_queue.push(msg)
480
+ @method_call_msgs[msg.serial] = msg
481
+ @method_call_replies[msg.serial] = retc
452
482
 
453
483
  retm = wait_for_message
454
484
  return if retm.nil? # check if somethings wrong
455
485
 
456
486
  process(retm)
457
- while @method_call_replies.key? m.serial
487
+ while @method_call_replies.key? msg.serial
458
488
  retm = wait_for_message
459
489
  process(retm)
460
490
  end
461
491
  rescue EOFError
462
- new_err = DBus::Error.new("Connection dropped after we sent #{m.inspect}")
492
+ new_err = DBus::Error.new("Connection dropped after we sent #{msg.inspect}")
463
493
  raise new_err
464
494
  end
465
495
 
466
496
  # @api private
467
497
  # Specify a code block that has to be executed when a reply for
468
- # message _m_ is received.
469
- def on_return(m, &retc)
498
+ # message _msg_ is received.
499
+ # @param msg [Message]
500
+ def on_return(msg, &retc)
470
501
  # Have a better exception here
471
- if m.message_type != Message::METHOD_CALL
502
+ if msg.message_type != Message::METHOD_CALL
472
503
  raise "on_return should only get method_calls"
473
504
  end
474
- @method_call_msgs[m.serial] = m
475
- @method_call_replies[m.serial] = retc
505
+
506
+ @method_call_msgs[msg.serial] = msg
507
+ @method_call_replies[msg.serial] = retc
476
508
  end
477
509
 
478
510
  # Asks bus to send us messages matching mr, and execute slot when
479
511
  # received
480
- def add_match(mr, &slot)
512
+ # @param match_rule [MatchRule,#to_s]
513
+ def add_match(match_rule, &slot)
481
514
  # check this is a signal.
482
- mrs = mr.to_s
515
+ mrs = match_rule.to_s
483
516
  DBus.logger.debug "#{@signal_matchrules.size} rules, adding #{mrs.inspect}"
484
517
  # don't ask for the same match if we override it
485
518
  unless @signal_matchrules.key?(mrs)
@@ -489,69 +522,77 @@ module DBus
489
522
  @signal_matchrules[mrs] = slot
490
523
  end
491
524
 
492
- def remove_match(mr)
493
- mrs = mr.to_s
525
+ # @param match_rule [MatchRule,#to_s]
526
+ def remove_match(match_rule)
527
+ mrs = match_rule.to_s
494
528
  rule_existed = @signal_matchrules.delete(mrs).nil?
495
529
  # don't remove nonexisting matches.
496
530
  return if rule_existed
531
+
497
532
  # FIXME: if we do try, the Error.MatchRuleNotFound is *not* raised
498
533
  # and instead is reported as "no return code for nil"
499
534
  proxy.RemoveMatch(mrs)
500
535
  end
501
536
 
502
537
  # @api private
503
- # Process a message _m_ based on its type.
504
- def process(m)
505
- return if m.nil? # check if somethings wrong
506
- case m.message_type
538
+ # Process a message _msg_ based on its type.
539
+ # @param msg [Message]
540
+ def process(msg)
541
+ return if msg.nil? # check if somethings wrong
542
+
543
+ case msg.message_type
507
544
  when Message::ERROR, Message::METHOD_RETURN
508
- raise InvalidPacketException if m.reply_serial.nil?
509
- mcs = @method_call_replies[m.reply_serial]
545
+ raise InvalidPacketException if msg.reply_serial.nil?
546
+
547
+ mcs = @method_call_replies[msg.reply_serial]
510
548
  if !mcs
511
- DBus.logger.debug "no return code for mcs: #{mcs.inspect} m: #{m.inspect}"
549
+ DBus.logger.debug "no return code for mcs: #{mcs.inspect} msg: #{msg.inspect}"
512
550
  else
513
- if m.message_type == Message::ERROR
514
- mcs.call(Error.new(m))
551
+ if msg.message_type == Message::ERROR
552
+ mcs.call(Error.new(msg))
515
553
  else
516
- mcs.call(m)
554
+ mcs.call(msg)
517
555
  end
518
- @method_call_replies.delete(m.reply_serial)
519
- @method_call_msgs.delete(m.reply_serial)
556
+ @method_call_replies.delete(msg.reply_serial)
557
+ @method_call_msgs.delete(msg.reply_serial)
520
558
  end
521
559
  when DBus::Message::METHOD_CALL
522
- if m.path == "/org/freedesktop/DBus"
560
+ if msg.path == "/org/freedesktop/DBus"
523
561
  DBus.logger.debug "Got method call on /org/freedesktop/DBus"
524
562
  end
525
- node = @service.get_node(m.path)
563
+ node = @service.get_node(msg.path, create: false)
526
564
  if !node
527
- reply = Message.error(m, "org.freedesktop.DBus.Error.UnknownObject",
528
- "Object #{m.path} doesn't exist")
565
+ reply = Message.error(msg, "org.freedesktop.DBus.Error.UnknownObject",
566
+ "Object #{msg.path} doesn't exist")
529
567
  @message_queue.push(reply)
530
568
  # handle introspectable as an exception:
531
- elsif m.interface == "org.freedesktop.DBus.Introspectable" &&
532
- m.member == "Introspect"
533
- reply = Message.new(Message::METHOD_RETURN).reply_to(m)
569
+ elsif msg.interface == "org.freedesktop.DBus.Introspectable" &&
570
+ msg.member == "Introspect"
571
+ reply = Message.new(Message::METHOD_RETURN).reply_to(msg)
534
572
  reply.sender = @unique_name
535
- reply.add_param(Type::STRING, node.to_xml)
573
+ xml = node.to_xml(msg.path)
574
+ reply.add_param(Type::STRING, xml)
536
575
  @message_queue.push(reply)
537
576
  else
538
577
  obj = node.object
539
578
  return if obj.nil? # FIXME, pushes no reply
540
- obj.dispatch(m) if obj
579
+
580
+ obj&.dispatch(msg)
541
581
  end
542
582
  when DBus::Message::SIGNAL
543
583
  # the signal can match multiple different rules
544
584
  # clone to allow new signale handlers to be registered
545
585
  @signal_matchrules.dup.each do |mrs, slot|
546
- if DBus::MatchRule.new.from_s(mrs).match(m)
547
- slot.call(m)
586
+ if DBus::MatchRule.new.from_s(mrs).match(msg)
587
+ slot.call(msg)
548
588
  end
549
589
  end
550
590
  else
551
- DBus.logger.debug "Unknown message type: #{m.message_type}"
591
+ # spec(Message Format): Unknown types must be ignored.
592
+ DBus.logger.debug "Unknown message type: #{msg.message_type}"
552
593
  end
553
- rescue Exception => ex
554
- raise m.annotate_exception(ex)
594
+ rescue Exception => e
595
+ raise msg.annotate_exception(e)
555
596
  end
556
597
 
557
598
  # Retrieves the Service with the given _name_.
@@ -566,6 +607,11 @@ module DBus
566
607
  # @api private
567
608
  # Emit a signal event for the given _service_, object _obj_, interface
568
609
  # _intf_ and signal _sig_ with arguments _args_.
610
+ # @param service [Service]
611
+ # @param obj [DBus::Object]
612
+ # @param intf [Interface]
613
+ # @param sig [Signal]
614
+ # @param args arguments for the signal
569
615
  def emit(service, obj, intf, sig, *args)
570
616
  m = Message.new(DBus::Message::SIGNAL)
571
617
  m.path = obj.path
@@ -596,7 +642,7 @@ module DBus
596
642
  end
597
643
  @service = Service.new(@unique_name, self)
598
644
  end
599
- end # class Connection
645
+ end
600
646
 
601
647
  # = D-Bus session bus class
602
648
  #
@@ -622,6 +668,7 @@ module DBus
622
668
  # traditional dbus uses /var/lib/dbus/machine-id
623
669
  machine_id_path = Dir["{/etc,/var/lib/dbus,/var/db/dbus}/machine-id"].first
624
670
  return nil unless machine_id_path
671
+
625
672
  machine_id = File.read(machine_id_path).chomp
626
673
 
627
674
  display = ENV["DISPLAY"][/:(\d+)\.?/, 1]
@@ -653,7 +700,7 @@ module DBus
653
700
  class ASystemBus < Connection
654
701
  # Get the default system bus.
655
702
  def initialize
656
- super(SystemSocketName)
703
+ super(SYSTEM_BUS_ADDRESS)
657
704
  send_hello
658
705
  end
659
706
  end
@@ -668,7 +715,7 @@ module DBus
668
715
  # (for Unix-socket) unix:path=/tmp/my_funky_bus_socket
669
716
  #
670
717
  # you'll need to take care about authentification then, more info here:
671
- # http://github.com/pangdudu/ruby-dbus/blob/master/README.rdoc
718
+ # https://gitlab.com/pangdudu/ruby-dbus/-/blob/master/README.rdoc
672
719
  class RemoteBus < Connection
673
720
  # Get the remote bus.
674
721
  def initialize(socket_name)
@@ -728,6 +775,7 @@ module DBus
728
775
  while !@quitting && !@buses.empty?
729
776
  ready = IO.select(@buses.keys, [], [], 5) # timeout 5 seconds
730
777
  next unless ready # timeout exceeds so continue unless quitting
778
+
731
779
  ready.first.each do |socket|
732
780
  b = @buses[socket]
733
781
  begin
@@ -742,5 +790,5 @@ module DBus
742
790
  end
743
791
  end
744
792
  end
745
- end # class Main
746
- end # module DBus
793
+ end
794
+ end
data/lib/dbus/bus_name.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of the ruby-dbus project
2
4
  # Copyright (C) 2019 Martin Vidner
3
5
  #
@@ -7,21 +9,23 @@
7
9
  # See the file "COPYING" for the exact licensing terms.
8
10
 
9
11
  module DBus
10
- # A {::String} that validates at initialization time
12
+ # D-Bus: a name for a connection, like ":1.3" or "org.example.ManagerManager".
13
+ # Implemented as a {::String} that validates at initialization time.
11
14
  # @see https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-bus
12
15
  class BusName < String
13
16
  # @raise Error if not a valid bus name
14
- def initialize(s)
15
- unless self.class.valid?(s)
16
- raise DBus::Error, "Invalid bus name #{s.inspect}"
17
+ def initialize(name)
18
+ unless self.class.valid?(name)
19
+ raise DBus::Error, "Invalid bus name #{name.inspect}"
17
20
  end
21
+
18
22
  super
19
23
  end
20
24
 
21
- def self.valid?(s)
22
- s.size <= 255 &&
23
- (s =~ /\A:[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)+\z/ ||
24
- s =~ /\A[A-Za-z_-][A-Za-z0-9_-]*(\.[A-Za-z_-][A-Za-z0-9_-]*)+\z/)
25
+ def self.valid?(name)
26
+ name.size <= 255 &&
27
+ (name =~ /\A:[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)+\z/ ||
28
+ name =~ /\A[A-Za-z_-][A-Za-z0-9_-]*(\.[A-Za-z_-][A-Za-z0-9_-]*)+\z/)
25
29
  end
26
30
  end
27
31
  end
@@ -2,7 +2,7 @@
2
2
  # copied from activesupport/core_ext from Rails, MIT license
3
3
  # https://github.com/rails/rails/tree/9794e85351243cac6d4e78adaba634b8e4ecad0a/activesupport/lib/active_support/core_ext
4
4
 
5
- require "dbus/core_ext/module/redefine_method"
5
+ require_relative "../module/redefine_method"
6
6
 
7
7
  class Class
8
8
  # Declare a class-level attribute whose value is inheritable by subclasses.