Class: DBus::ProxyObject
- Inherits:
-
Object
- Object
- DBus::ProxyObject
- Defined in:
- lib/dbus/introspect.rb
Overview
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.
Instance Attribute Summary collapse
-
#bus ⇒ Object
readonly
The bus the object is reachable via.
-
#default_iface ⇒ Object
The default interface of the object, as String.
-
#destination ⇒ Object
readonly
The (remote) destination of the object.
-
#introspected ⇒ Object
Flag determining whether the object has been introspected.
-
#path ⇒ Object
readonly
The path to the object.
-
#subnodes ⇒ Object
The names of direct subnodes of the object in the tree.
Instance Method Summary collapse
-
#[](intfname) ⇒ Object
Retrieves an interface of the proxy object (ProxyObjectInterface instance).
-
#[]=(intfname, intf) ⇒ Object
Maps the given interface name intfname to the given interface _intf.
-
#has_iface?(name) ⇒ Boolean
Returns whether the object has an interface with the given name.
-
#initialize(bus, dest, path) ⇒ ProxyObject
constructor
Creates a new proxy object living on the given bus at destination dest on the given path.
-
#interfaces ⇒ Object
Returns the interfaces of the object.
-
#introspect ⇒ Object
Introspects the remote object.
-
#on_signal(name, &block) ⇒ Object
Registers a handler, the code block, for a signal with the given name.
Constructor Details
#initialize(bus, dest, path) ⇒ ProxyObject
Creates a new proxy object living on the given bus at destination dest on the given path.
448 449 450 451 452 |
# 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 |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &reply_handler) ⇒ Object (private)
Handles all unkown methods, mostly to route method calls to the default interface.
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 |
# 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 |
Instance Attribute Details
#bus ⇒ Object (readonly)
The bus the object is reachable via.
442 443 444 |
# File 'lib/dbus/introspect.rb', line 442 def bus @bus end |
#default_iface ⇒ Object
The default interface of the object, as String.
444 445 446 |
# File 'lib/dbus/introspect.rb', line 444 def default_iface @default_iface end |
#destination ⇒ Object (readonly)
The (remote) destination of the object.
438 439 440 |
# File 'lib/dbus/introspect.rb', line 438 def destination @destination end |
#introspected ⇒ Object
Flag determining whether the object has been introspected.
436 437 438 |
# File 'lib/dbus/introspect.rb', line 436 def introspected @introspected end |
#path ⇒ Object (readonly)
The path to the object.
440 441 442 |
# File 'lib/dbus/introspect.rb', line 440 def path @path end |
#subnodes ⇒ Object
The names of direct subnodes of the object in the tree.
434 435 436 |
# File 'lib/dbus/introspect.rb', line 434 def subnodes @subnodes end |
Instance Method Details
#[](intfname) ⇒ Object
Retrieves an interface of the proxy object (ProxyObjectInterface instance).
460 461 462 |
# File 'lib/dbus/introspect.rb', line 460 def [](intfname) @interfaces[intfname] end |
#[]=(intfname, intf) ⇒ Object
Maps the given interface name intfname to the given interface _intf.
465 466 467 |
# File 'lib/dbus/introspect.rb', line 465 def []=(intfname, intf) @interfaces[intfname] = intf end |
#has_iface?(name) ⇒ Boolean
Returns whether the object has an interface with the given name.
479 480 481 482 |
# 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 |
#interfaces ⇒ Object
Returns the interfaces of the object.
455 456 457 |
# File 'lib/dbus/introspect.rb', line 455 def interfaces @interfaces.keys end |
#introspect ⇒ Object
Introspects the remote object. Allows you to find and select interfaces on the object.
471 472 473 474 475 476 |
# 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 |
#on_signal(name, &block) ⇒ Object
Registers a handler, the code block, for a signal with the given name. It uses default_iface which must have been set.
486 487 488 489 490 491 492 493 |
# 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 |