class DBus::ProxyObject
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.
Attributes
The bus the object is reachable via.
The default interface of the object, as String.
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.
Public Class Methods
Creates a new proxy object living on the given bus at destination dest on the given path.
# File lib/dbus/introspect.rb, line 448 def initialize(bus, dest, path) @bus, @destination, @path = bus, dest, path @interfaces = Hash.new @subnodes = Array.new end
Public Instance Methods
Retrieves an interface of the proxy object (ProxyObjectInterface
instance).
# File lib/dbus/introspect.rb, line 460 def [](intfname) @interfaces[intfname] end
Maps the given interface name intfname to the given interface _intf.
# File lib/dbus/introspect.rb, line 465 def []=(intfname, intf) @interfaces[intfname] = intf end
Returns whether the object has an interface with the given name.
# File lib/dbus/introspect.rb, line 479 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/introspect.rb, line 455 def interfaces @interfaces.keys end
Introspects the remote object. Allows you to find and select interfaces on the object.
# File lib/dbus/introspect.rb, line 471 def introspect # Synchronous call here. xml = @bus.introspect_data(@destination, @path) ProxyObjectFactory.introspect_into(self, xml) xml end
Registers a handler, the code block, for a signal with the given name. It uses default_iface which must have been set.
# File lib/dbus/introspect.rb, line 486 def on_signal(name, &block) if @default_iface and has_iface?(@default_iface) @interfaces[@default_iface].on_signal(@bus, name, &block) else # TODO improve raise NoMethodError end end
Private Instance Methods
Handles all unkown methods, mostly to route method calls to the default interface.
# File lib/dbus/introspect.rb, line 500 def method_missing(name, *args, &reply_handler) if @default_iface and has_iface?(@default_iface) begin @interfaces[@default_iface].method(name).call(*args, &reply_handler) rescue NameError => e # interesting, foo.method("unknown") # raises NameError, not NoMethodError raise unless e.to_s =~ /undefined method `#{name}'/ # BTW e.exception("...") would preserve the class. raise NoMethodError,"undefined method `#{name}' for DBus interface `#{@default_iface}' on object `#{@path}'" end else # TODO distinguish: # - di not specified #TODO # - di is specified but not found in introspection data raise NoMethodError, "undefined method `#{name}' for DBus interface `#{@default_iface}' on object `#{@path}'" end end