D-Bus proxy object class
Class representing a remote object in an external application. Typically, calling a method on an instance of a ProxyObject sends a message over the bus so that the method is executed remotely on the correctponding object.
The bus the object is reachable via.
@return [String] The name of the default interface of the object.
The (remote) destination of the object.
Flag determining whether the object has been introspected.
The path to the object.
The names of direct subnodes of the object in the tree.
Creates a new proxy object living on the given bus at destination dest on the given path.
# File lib/dbus/proxy_object.rb, line 33 def initialize(bus, dest, path) @bus, @destination, @path = bus, dest, path @interfaces = Hash.new @subnodes = Array.new end
Retrieves an interface of the proxy object @param [String] intfname @return [ProxyObjectInterface]
# File lib/dbus/proxy_object.rb, line 47 def [](intfname) @interfaces[intfname] end
Maps the given interface name intfname to the given interface _intf. @param [String] intfname @param [ProxyObjectInterface] intf @return [ProxyObjectInterface]
# File lib/dbus/proxy_object.rb, line 55 def []=(intfname, intf) @interfaces[intfname] = intf end
For each non duplicated method name in any interface present on the caller, defines a shortcut method dynamically. This function is automatically called when a {ProxyObject} is introspected.
# File lib/dbus/proxy_object.rb, line 73 def define_shortcut_methods # builds a list of duplicated methods dup_meths, univocal_meths = [],{} @interfaces.each_value do |intf| intf.methods.each_value do |meth| name = meth.name.to_sym # don't overwrite instance methods! if dup_meths.include? name or self.class.instance_methods.include? name next elsif univocal_meths.include? name univocal_meths.delete name dup_meths << name else univocal_meths[name] = intf end end end univocal_meths.each do |name, intf| # creates a shortcut function that forwards each call to the method on # the appropriate intf singleton_class.class_eval do define_method name do |*args, &reply_handler| intf.method(name).call(*args, &reply_handler) end end end end
Returns whether the object has an interface with the given name.
# File lib/dbus/proxy_object.rb, line 102 def has_iface?(name) raise "Cannot call has_iface? if not introspected" if not @introspected @interfaces.member?(name) end
Returns the interfaces of the object.
# File lib/dbus/proxy_object.rb, line 40 def interfaces @interfaces.keys end
Introspects the remote object. Allows you to find and select interfaces on the object.
# File lib/dbus/proxy_object.rb, line 61 def introspect # Synchronous call here. xml = @bus.introspect_data(@destination, @path) ProxyObjectFactory.introspect_into(self, xml) define_shortcut_methods() xml end
Registers a handler, the code block, for a signal with the given name. It uses default_iface which must have been set. @return [void]
# File lib/dbus/proxy_object.rb, line 110 def on_signal(name, &block) if @default_iface and has_iface?(@default_iface) @interfaces[@default_iface].on_signal(name, &block) else # TODO improve raise NoMethodError end end