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 73 def self.dbus_interface(s) @@intfs_mutex.synchronize do @@cur_intf = intfs[s] if !@@cur_intf @@cur_intf = Interface.new(s) # As this is a mutable class_attr, we cannot use # self.intfs[s] = @@cur_intf # Hash#[]= # as that would modify parent class attr in place. # Using the setter lets a subclass have the new value # while the superclass keeps the old one. self.intfs = 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 99 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 112 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
Helper method that returns a method name generated from the interface name intfname and method name methname. @api private
# File lib/dbus/export.rb, line 127 def self.make_method_name(intfname, methname) "#{intfname}%%#{methname}" end
Create a new object with a given path. Use DBus::Service#export to export it.
# File lib/dbus/export.rb, line 35 def initialize(path) @path = path @service = nil end
Public Instance Methods
Dispatch a message msg to call exported methods
# File lib/dbus/export.rb, line 41 def dispatch(msg) case msg.message_type when Message::METHOD_CALL reply = nil begin if !intfs[msg.interface] raise DBus.error("org.freedesktop.DBus.Error.UnknownMethod"), "Interface \"#{msg.interface}\" of object \"#{msg.path}\" doesn't exist" end meth = intfs[msg.interface].methods[msg.member.to_sym] if !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 107 def emit(intf, sig, *args) @service.bus.emit(@service, self, intf, sig, *args) end