class DBus::ProxyObjectInterface
D-Bus proxy object interface class¶ ↑
A class similar to the normal Interface used as a proxy for remote object interfaces.
Constants
- PROPERTY_INTERFACE
Attributes
@return [Hash{String => DBus::Method}]
@return [String] The name of the interface.
@return [ProxyObject] The proxy object to which this interface belongs.
@return [Hash{Symbol => Property}]
@return [Hash{String => Signal}]
Public Class Methods
Creates a new proxy interface for the given proxy object and the given name.
# File lib/dbus/proxy_object_interface.rb 32 def initialize(object, name) 33 @object = object 34 @name = name 35 @methods = {} 36 @signals = {} 37 @properties = {} 38 end
Public Instance Methods
Read a property. @param propname [String]
# File lib/dbus/proxy_object_interface.rb 133 def [](propname) 134 ret = object[PROPERTY_INTERFACE].Get(name, propname) 135 # this method always returns the single property 136 if @object.api.proxy_method_returns_array 137 ret[0] 138 else 139 ret 140 end 141 end
Write a property. @param property_name [String] @param value [Object]
# File lib/dbus/proxy_object_interface.rb 146 def []=(property_name, value) 147 property = properties[property_name.to_sym] 148 if !property 149 raise DBus.error("org.freedesktop.DBus.Error.UnknownProperty"), 150 "Property '#{name}.#{property_name}' (on object '#{object.path}') not found" 151 end 152 153 case value 154 # accommodate former need to explicitly make a variant with the right type 155 when Data::Variant 156 variant = value 157 else 158 type = property.type 159 typed_value = Data.make_typed(type, value) 160 variant = Data::Variant.new(typed_value, member_type: type) 161 end 162 163 object[PROPERTY_INTERFACE].Set(name, property_name, variant) 164 end
Read all properties at once, as a hash. @return [Hash{String}]
# File lib/dbus/proxy_object_interface.rb 168 def all_properties 169 ret = object[PROPERTY_INTERFACE].GetAll(name) 170 # this method always returns the single property 171 if @object.api.proxy_method_returns_array 172 ret[0] 173 else 174 ret 175 end 176 end
Defines a signal or method based on the descriptor ifc_el. @param ifc_el [DBus::Method,Signal,Property]
# File lib/dbus/proxy_object_interface.rb 95 def define(ifc_el) 96 case ifc_el 97 when Method 98 define_method_from_descriptor(ifc_el) 99 when Signal 100 define_signal_from_descriptor(ifc_el) 101 when Property 102 define_property_from_descriptor(ifc_el) 103 end 104 end
Defines a proxied method on the interface.
# File lib/dbus/proxy_object_interface.rb 107 def define_method(methodname, prototype) 108 m = Method.new(methodname) 109 m.from_prototype(prototype) 110 define(m) 111 end
Defines a method on the interface from the Method descriptor method. @param method [Method]
# File lib/dbus/proxy_object_interface.rb 47 def define_method_from_descriptor(method) 48 method.params.each do |fpar| 49 par = fpar.type 50 # This is the signature validity check 51 Type::Parser.new(par).parse 52 end 53 54 singleton_class.class_eval do 55 define_method method.name do |*args, &reply_handler| 56 if method.params.size != args.size 57 raise ArgumentError, "wrong number of arguments (#{args.size} for #{method.params.size})" 58 end 59 60 msg = Message.new(Message::METHOD_CALL) 61 msg.path = @object.path 62 msg.interface = @name 63 msg.destination = @object.destination 64 msg.member = method.name 65 msg.sender = @object.bus.unique_name 66 method.params.each do |fpar| 67 par = fpar.type 68 msg.add_param(par, args.shift) 69 end 70 ret = @object.bus.send_sync_or_async(msg, &reply_handler) 71 if ret.nil? || @object.api.proxy_method_returns_array 72 ret 73 else 74 method.rets.size == 1 ? ret.first : ret 75 end 76 end 77 end 78 79 @methods[method.name] = method 80 end
@param prop [Property]
# File lib/dbus/proxy_object_interface.rb 89 def define_property_from_descriptor(prop) 90 @properties[prop.name] = prop 91 end
Defines a signal from the descriptor sig. @param sig [Signal]
# File lib/dbus/proxy_object_interface.rb 84 def define_signal_from_descriptor(sig) 85 @signals[sig.name] = sig 86 end
@overload on_signal(name, &block) @overload on_signal(bus, name, &block) Registers a handler (code block) for a signal with name arriving over the given bus. If no block is given, the signal is unregistered. Note that specifying bus is discouraged and the option is kept only for backward compatibility. @return [void]
# File lib/dbus/proxy_object_interface.rb 120 def on_signal(bus = @object.bus, name, &block) 121 mr = DBus::MatchRule.new.from_signal(self, name) 122 if block.nil? 123 bus.remove_match(mr) 124 else 125 bus.add_match(mr) { |msg| block.call(*msg.params) } 126 end 127 end
Returns the string representation of the interface (the name).
# File lib/dbus/proxy_object_interface.rb 41 def to_str 42 @name 43 end