class DBus::ObjectServer
The part of a {Connection} that can export {DBus::Object}s to provide services to clients.
Note that an ObjectServer does not have a name. Typically a {Connection} has one well known name, but can have none or more.
Formerly this class was intermixed with {ProxyService} as Service.
@example Usage
bus = DBus.session_bus obj = DBus::Object.new("/path") # a subclass more likely bus.object_server.export(obj) bus.request_name("org.example.Test")
Attributes
@return [Connection] The connection we’re using.
Public Class Methods
DBus::NodeTree::new
# File lib/dbus/object_server.rb 32 def initialize(connection) 33 @connection = connection 34 super() 35 end
@param obj_or_path [DBus::Object,ObjectPath,String] an object or a valid object path @return [ObjectPath] @api private
# File lib/dbus/object_server.rb 118 def self.path_of(obj_or_path) 119 case obj_or_path 120 when ObjectPath 121 obj_or_path 122 when String 123 ObjectPath.new(obj_or_path) 124 when DBus::Object 125 obj_or_path.path 126 else 127 raise ArgumentError, "Expecting a DBus::Object argument or DBus::ObjectPath or String which parses as one" 128 end 129 end
Public Instance Methods
All objects (not paths) under this path (except itself). @param path [ObjectPath] @return [Array<DBus::Object>] @raise ArgumentError if the path does not exist
# File lib/dbus/object_server.rb 108 def descendants_for(path) 109 node = get_node(path, create: false) 110 raise ArgumentError, "Object path #{path} doesn't exist" if node.nil? 111 112 node.descendant_objects 113 end
Export an object @param obj [DBus::Object] @raise RuntimeError if there’s already an exported object at the same path
# File lib/dbus/object_server.rb 49 def export(obj) 50 node = get_node(obj.path, create: true) 51 raise "At #{obj.path} there is already an object #{node.object.inspect}" if node.object 52 53 node.object = obj 54 55 obj.object_server = self 56 object_manager_for(obj)&.object_added(obj) 57 end
Retrieves an object at the given path @param path [ObjectPath] @return [DBus::Object,nil]
# File lib/dbus/object_server.rb 40 def object(path) 41 node = get_node(path, create: false) 42 node&.object 43 end
Find the (closest) parent of object implementing the ObjectManager interface, or nil @return [DBus::Object,nil]
# File lib/dbus/object_server.rb 95 def object_manager_for(object) 96 path = object.path 97 node_chain = get_node_chain(path) 98 om_node = node_chain.reverse_each.find do |node| 99 node.object&.is_a? DBus::ObjectManager 100 end 101 om_node&.object 102 end
Undo exporting an object obj_or_path. Raises ArgumentError if it is not a DBus::Object. Returns the object, or false if obj was not exported. @param obj_or_path [DBus::Object,ObjectPath,String] an object or a valid object path
# File lib/dbus/object_server.rb 63 def unexport(obj_or_path) 64 path = self.class.path_of(obj_or_path) 65 parent_path, _separator, node_name = path.rpartition("/") 66 67 parent_node = get_node(parent_path, create: false) 68 return false unless parent_node 69 70 node = if node_name == "" # path == "/" 71 parent_node 72 else 73 parent_node[node_name] 74 end 75 obj = node&.object 76 raise ArgumentError, "Cannot unexport, no object at #{path}" unless obj 77 78 object_manager_for(obj)&.object_removed(obj) 79 obj.object_server = nil 80 node.object = nil 81 82 # node can be deleted if 83 # - it has no children 84 # - it is not root 85 if node.empty? && !node.equal?(parent_node) 86 parent_node.delete(node_name) 87 end 88 89 obj 90 end
Private Instance Methods
@param path [ObjectPath] a path that must exist @return [Array<Node>] nodes from the root to the leaf
# File lib/dbus/object_server.rb 139 def get_node_chain(path) 140 n = @root 141 result = [n] 142 path.sub(%r{^/}, "").split("/").each do |elem| 143 n = n[elem] 144 result.push(n) 145 end 146 result 147 end