Class DBus::ObjectTree
In: lib/dbus.rb
Parent: DBusCallable

An object tree allows you to register a handler for a tree of object paths. This means that literal Ruby objects do not need to be created for each object over the bus, but you can have a virtual tree of objects handled by a single Ruby object. There are two ways to handle method calls on virtual objects:

  1. Pass a list of dbus_methods in to initialize. This works just like DBus::Object, except an object_path is passed as the first argument to each method, denoting which virtual object the call was made on. If all the objects in the tree support the same methods, this is the best approach.
  2. Override object_method_called. This allows you to define the valid methods dynamically on an object by object basis. For example, if providing an object tree that represented a filesystem heirarchy, you’d only want an ls method on directory objects, not file objects.

Methods

Public Class methods

[Source]

     # File lib/dbus.rb, line 307
307:     def initialize(base_path, service, dbus_methods=[])
308:       @connection = service.get_bus.get_connection
309:       super(@connection, dbus_methods)
310:       @base_path = base_path
311:       @service = service
312:       @methods = dbus_methods
313:       @service.get_bus.get_connection.register_fallback(base_path, method(:on_unregister),
314:                                                         method(:on_message))
315:     end

Public Instance methods

Broadcast the signal signal_name for interface interface for the object identified by relative_path

[Source]

     # File lib/dbus.rb, line 324
324:     def broadcast_signal(interface, signal_name, relative_path)
325:       object_path = relative_path_to_object_path(relative_path)
326:       message = DBus::Binding::DBusMessage.new_signal(object_path, interface, signal_name)
327:       @connection.send(message)
328:     end

[Source]

     # File lib/dbus.rb, line 330
330:     def object_method_called
331:       raise NotImplementedError, "Not implemented"
332:     end

[Source]

     # File lib/dbus.rb, line 334
334:     def on_message(connection, message)
335:       target_object_full_path = message.get_path
336:       n = @base_path.length
337:       unless @base_path == target_object_full_path[0,n]
338:         @connection.send(new_error_reply(message, "Invalid target path: #{target_object_full_path}"))
339:         return HANDLER_RESULT_HANDLED
340:       end
341:       target_object_path = target_object_full_path[n..-1]
342:       target_method = message.get_member
343:       target_args = message.to_a
344:       args = [target_object_path, *target_args]
345:       @connection.send(dispatch(target_method, args, message))
346:       HANDLER_RESULT_HANDLED
347:     end

Create a new absolute ObjectPath for the given relative path

[Source]

     # File lib/dbus.rb, line 318
318:     def relative_path_to_object_path(path)
319:       ObjectPath.new(@base_path + path)
320:     end

[Validate]