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.



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

#busObject (readonly)

The bus the object is reachable via.



442
443
444
# File 'lib/dbus/introspect.rb', line 442

def bus
  @bus
end

#default_ifaceObject

The default interface of the object, as String.



444
445
446
# File 'lib/dbus/introspect.rb', line 444

def default_iface
  @default_iface
end

#destinationObject (readonly)

The (remote) destination of the object.



438
439
440
# File 'lib/dbus/introspect.rb', line 438

def destination
  @destination
end

#introspectedObject

Flag determining whether the object has been introspected.



436
437
438
# File 'lib/dbus/introspect.rb', line 436

def introspected
  @introspected
end

#pathObject (readonly)

The path to the object.



440
441
442
# File 'lib/dbus/introspect.rb', line 440

def path
  @path
end

#subnodesObject

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.

Returns:

  • (Boolean)


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

#interfacesObject

Returns the interfaces of the object.



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

def interfaces
  @interfaces.keys
end

#introspectObject

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