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.



369
370
371
372
373
# File 'lib/dbus/introspect.rb', line 369

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.



421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
# File 'lib/dbus/introspect.rb', line 421

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.



363
364
365
# File 'lib/dbus/introspect.rb', line 363

def bus
  @bus
end

#default_ifaceObject

The default interface of the object, as String.



365
366
367
# File 'lib/dbus/introspect.rb', line 365

def default_iface
  @default_iface
end

#destinationObject (readonly)

The (remote) destination of the object.



359
360
361
# File 'lib/dbus/introspect.rb', line 359

def destination
  @destination
end

#introspectedObject

Flag determining whether the object has been introspected.



357
358
359
# File 'lib/dbus/introspect.rb', line 357

def introspected
  @introspected
end

#pathObject (readonly)

The path to the object.



361
362
363
# File 'lib/dbus/introspect.rb', line 361

def path
  @path
end

#subnodesObject

The names of direct subnodes of the object in the tree.



355
356
357
# File 'lib/dbus/introspect.rb', line 355

def subnodes
  @subnodes
end

Instance Method Details

#[](intfname) ⇒ Object

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



381
382
383
# File 'lib/dbus/introspect.rb', line 381

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

#[]=(intfname, intf) ⇒ Object

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



386
387
388
# File 'lib/dbus/introspect.rb', line 386

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

#has_iface?(name) ⇒ Boolean

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

Returns:

  • (Boolean)


400
401
402
403
# File 'lib/dbus/introspect.rb', line 400

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.



376
377
378
# File 'lib/dbus/introspect.rb', line 376

def interfaces
  @interfaces.keys
end

#introspectObject

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



392
393
394
395
396
397
# File 'lib/dbus/introspect.rb', line 392

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.



407
408
409
410
411
412
413
414
# File 'lib/dbus/introspect.rb', line 407

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