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

connection[R]

@return [Connection] The connection we’re using.

Public Class Methods

new(connection) click to toggle source
Calls superclass method DBus::NodeTree::new
# File lib/dbus/object_server.rb, line 32
def initialize(connection)
  @connection = connection
  super()
end
path_of(obj_or_path) click to toggle source

@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, line 118
def self.path_of(obj_or_path)
  case obj_or_path
  when ObjectPath
    obj_or_path
  when String
    ObjectPath.new(obj_or_path)
  when DBus::Object
    obj_or_path.path
  else
    raise ArgumentError, "Expecting a DBus::Object argument or DBus::ObjectPath or String which parses as one"
  end
end

Public Instance Methods

[](path)
Alias for: object
descendants_for(path) click to toggle source

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, line 108
def descendants_for(path)
  node = get_node(path, create: false)
  raise ArgumentError, "Object path #{path} doesn't exist" if node.nil?

  node.descendant_objects
end
export(obj) click to toggle source

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, line 49
def export(obj)
  node = get_node(obj.path, create: true)
  raise "At #{obj.path} there is already an object #{node.object.inspect}" if node.object

  node.object = obj

  obj.object_server = self
  object_manager_for(obj)&.object_added(obj)
end
object(path) click to toggle source

Retrieves an object at the given path @param path [ObjectPath] @return [DBus::Object,nil]

# File lib/dbus/object_server.rb, line 40
def object(path)
  node = get_node(path, create: false)
  node&.object
end
Also aliased as: []
object_manager_for(object) click to toggle source

Find the (closest) parent of object implementing the ObjectManager interface, or nil @return [DBus::Object,nil]

# File lib/dbus/object_server.rb, line 95
def object_manager_for(object)
  path = object.path
  node_chain = get_node_chain(path)
  om_node = node_chain.reverse_each.find do |node|
    node.object&.is_a? DBus::ObjectManager
  end
  om_node&.object
end
unexport(obj_or_path) click to toggle source

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, line 63
def unexport(obj_or_path)
  path = self.class.path_of(obj_or_path)
  parent_path, _separator, node_name = path.rpartition("/")

  parent_node = get_node(parent_path, create: false)
  return false unless parent_node

  node = if node_name == "" # path == "/"
           parent_node
         else
           parent_node[node_name]
         end
  obj = node&.object
  raise ArgumentError, "Cannot unexport, no object at #{path}" unless obj

  object_manager_for(obj)&.object_removed(obj)
  obj.object_server = nil
  node.object = nil

  # node can be deleted if
  # - it has no children
  # - it is not root
  if node.empty? && !node.equal?(parent_node)
    parent_node.delete(node_name)
  end

  obj
end

Private Instance Methods

get_node_chain(path) click to toggle source

@param path [ObjectPath] a path that must exist @return [Array<Node>] nodes from the root to the leaf

# File lib/dbus/object_server.rb, line 139
def get_node_chain(path)
  n = @root
  result = [n]
  path.sub(%r{^/}, "").split("/").each do |elem|
    n = n[elem]
    result.push(n)
  end
  result
end