class DBus::Object
Exported object type
Exportable D-Bus object class¶ ↑
Objects that are going to be exported by a D-Bus service should inherit from this class. At the client side, use ProxyObject.
Attributes
The path of the object.
The service that the object is exported by.
Public Class Methods
Select (and create) the interface that the following defined methods belong to.
# File lib/dbus/export.rb, line 76 def self.dbus_interface(s) @@intfs_mutex.synchronize do unless @@cur_intf = (self.intfs && self.intfs[s]) @@cur_intf = Interface.new(s) self.intfs = (self.intfs || {}).merge({s => @@cur_intf}) end yield @@cur_intf = nil end end
Defines an exportable method on the object with the given name sym, prototype and the code in a block.
# File lib/dbus/export.rb, line 96 def self.dbus_method(sym, protoype = "", &block) raise UndefinedInterface, sym if @@cur_intf.nil? @@cur_intf.define(Method.new(sym.to_s).from_prototype(protoype)) define_method(Object.make_method_name(@@cur_intf.name, sym.to_s), &block) end
Defines a signal for the object with a given name sym and prototype.
# File lib/dbus/export.rb, line 109 def self.dbus_signal(sym, protoype = "") raise UndefinedInterface, sym if @@cur_intf.nil? cur_intf = @@cur_intf signal = Signal.new(sym.to_s).from_prototype(protoype) cur_intf.define(Signal.new(sym.to_s).from_prototype(protoype)) define_method(sym.to_s) do |*args| emit(cur_intf, signal, *args) end end
Create a new object with a given path. Use DBus::Service#export to export it.
# File lib/dbus/export.rb, line 32 def initialize(path) @path = path @service = nil end
Private Class Methods
Helper method that returns a method name generated from the interface name intfname and method name methname.
# File lib/dbus/export.rb, line 124 def self.make_method_name(intfname, methname) "#{intfname}%%#{methname}" end
Public Instance Methods
Dispatch a message msg to call exported methods
# File lib/dbus/export.rb, line 44 def dispatch(msg) case msg.message_type when Message::METHOD_CALL reply = nil begin if not self.intfs[msg.interface] raise DBus.error("org.freedesktop.DBus.Error.UnknownMethod"), "Interface \"#{msg.interface}\" of object \"#{msg.path}\" doesn't exist" end meth = self.intfs[msg.interface].methods[msg.member.to_sym] if not meth raise DBus.error("org.freedesktop.DBus.Error.UnknownMethod"), "Method \"#{msg.member}\" on interface \"#{msg.interface}\" of object \"#{msg.path}\" doesn't exist" end methname = Object.make_method_name(msg.interface, msg.member) retdata = method(methname).call(*msg.params) retdata = [*retdata] reply = Message.method_return(msg) meth.rets.zip(retdata).each do |rsig, rdata| reply.add_param(rsig.type, rdata) end rescue => ex dbus_msg_exc = msg.annotate_exception(ex) reply = ErrorMessage.from_exception(dbus_msg_exc).reply_to(msg) end @service.bus.message_queue.push(reply) end end
Emits a signal from the object with the given interface, signal sig and arguments args.
# File lib/dbus/export.rb, line 104 def emit(intf, sig, *args) @service.bus.emit(@service, self, intf, sig, *args) end
State that the object implements the given intf.
# File lib/dbus/export.rb, line 38 def implements(intf) # use a setter self.intfs = (self.intfs || {}).merge({intf.name => intf}) end