Exported object type
Objects that are going to be exported by a D-Bus service should inherit from this class. At the client side, use ProxyObject.
The path of the object.
The service that the object is exported by.
Select (and create) the interface that the following defined methods belong to.
# File lib/dbus/export.rb, line 75 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 95 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 108 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
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 reply = ErrorMessage.from_exception(ex).reply_to(msg) end @service.bus.send(reply.marshall) end end
Emits a signal from the object with the given interface, signal sig and arguments args.
# File lib/dbus/export.rb, line 103 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