Class: DBus::ProxyObject

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

Constructor Details

#initialize(bus, dest, path) ⇒ ProxyObject

Creates a new proxy object living on the given bus at destination dest on the given path.



466
467
468
469
470
# File 'lib/dbus/introspect.rb', line 466

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) ⇒ Object (private)

Handles all unkown methods, mostly to route method calls to the default interface.



517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
# File 'lib/dbus/introspect.rb', line 517

def method_missing(name, *args)
  if @default_iface and has_iface?(@default_iface)
    begin
      @interfaces[@default_iface].method(name).call(*args)
    rescue NameError => e
      # interesting, foo.method("unknown")
      # raises NameError, not NoMethodError
      match = /undefined method `([^']*)' for class `([^']*)'/.match e.to_s
      raise unless match and match[2] == "DBus::ProxyObjectInterface"
      # BTW e.exception("...") would preserve the class.
      raise NoMethodError,"undefined method `#{match[1]}' 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

#busObject (readonly)

The bus the object is reachable via.



460
461
462
# File 'lib/dbus/introspect.rb', line 460

def bus
  @bus
end

#default_ifaceObject

The default interface of the object.



462
463
464
# File 'lib/dbus/introspect.rb', line 462

def default_iface
  @default_iface
end

#destinationObject (readonly)

The (remote) destination of the object.



456
457
458
# File 'lib/dbus/introspect.rb', line 456

def destination
  @destination
end

#introspectedObject

Flag determining whether the object has been introspected.



454
455
456
# File 'lib/dbus/introspect.rb', line 454

def introspected
  @introspected
end

#pathObject (readonly)

The path to the object.



458
459
460
# File 'lib/dbus/introspect.rb', line 458

def path
  @path
end

#subnodesObject

The subnodes of the object in the tree.



452
453
454
# File 'lib/dbus/introspect.rb', line 452

def subnodes
  @subnodes
end

Instance Method Details

#[](intfname) ⇒ Object

Retrieves an interface of the proxy object (ProxyObjectInterface instance).



478
479
480
# File 'lib/dbus/introspect.rb', line 478

def [](intfname)
  @interfaces[intfname]
end

#[]=(intfname, intf) ⇒ Object

Maps the given interface name intfname to the given interface _intf.



483
484
485
# File 'lib/dbus/introspect.rb', line 483

def []=(intfname, intf)
  @interfaces[intfname] = intf
end

#has_iface?(name) ⇒ Boolean

Returns whether the object has an interface with the given name.

Returns:

  • (Boolean)


497
498
499
500
# File 'lib/dbus/introspect.rb', line 497

def has_iface?(name)
  raise "Cannot call has_iface? is not introspected" if not @introspected
  @interfaces.member?(name)
end

#interfacesObject

Returns the interfaces of the object.



473
474
475
# File 'lib/dbus/introspect.rb', line 473

def interfaces
  @interfaces.keys
end

#introspectObject

Introspects the remote object. Allows you to find and select interfaces on the object.



489
490
491
492
493
494
# File 'lib/dbus/introspect.rb', line 489

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.



503
504
505
506
507
508
509
510
# File 'lib/dbus/introspect.rb', line 503

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