Class: DBus::ProxyObjectInterface

Inherits:
Object
  • Object
show all
Defined in:
lib/dbus/proxy_object_interface.rb

Overview

D-Bus proxy object interface class

A class similar to the normal Interface used as a proxy for remote object interfaces.

Constant Summary collapse

PROPERTY_INTERFACE =
"org.freedesktop.DBus.Properties".freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(object, name) ⇒ ProxyObjectInterface

Creates a new proxy interface for the given proxy object and the given name.



27
28
29
30
31
32
# File 'lib/dbus/proxy_object_interface.rb', line 27

def initialize(object, name)
  @object = object
  @name = name
  @methods = {}
  @signals = {}
end

Instance Attribute Details

#methodsObject

The proxied methods contained in the interface.



17
18
19
# File 'lib/dbus/proxy_object_interface.rb', line 17

def methods
  @methods
end

#nameObject (readonly)

The name of the interface.



23
24
25
# File 'lib/dbus/proxy_object_interface.rb', line 23

def name
  @name
end

#objectObject (readonly)

The proxy object to which this interface belongs.



21
22
23
# File 'lib/dbus/proxy_object_interface.rb', line 21

def object
  @object
end

#signalsObject

The proxied signals contained in the interface.



19
20
21
# File 'lib/dbus/proxy_object_interface.rb', line 19

def signals
  @signals
end

Instance Method Details

#[](propname) ⇒ Object

Read a property.

Parameters:

  • propname (String)


116
117
118
119
120
121
122
123
124
# File 'lib/dbus/proxy_object_interface.rb', line 116

def [](propname)
  ret = object[PROPERTY_INTERFACE].Get(name, propname)
  # this method always returns the single property
  if @object.api.proxy_method_returns_array
    ret[0]
  else
    ret
  end
end

#[]=(propname, value) ⇒ Object

Write a property.

Parameters:

  • propname (String)
  • value (Object)


129
130
131
# File 'lib/dbus/proxy_object_interface.rb', line 129

def []=(propname, value)
  object[PROPERTY_INTERFACE].Set(name, propname, value)
end

#all_propertiesHash{String}

Read all properties at once, as a hash.

Returns:

  • (Hash{String})


135
136
137
138
139
140
141
142
143
# File 'lib/dbus/proxy_object_interface.rb', line 135

def all_properties
  ret = object[PROPERTY_INTERFACE].GetAll(name)
  # this method always returns the single property
  if @object.api.proxy_method_returns_array
    ret[0]
  else
    ret
  end
end

#define(m) ⇒ Object

Defines a signal or method based on the descriptor m.



81
82
83
84
85
86
87
# File 'lib/dbus/proxy_object_interface.rb', line 81

def define(m)
  if m.is_a?(Method)
    define_method_from_descriptor(m)
  elsif m.is_a?(Signal)
    define_signal_from_descriptor(m)
  end
end

#define_method(methodname, prototype) ⇒ Object

Defines a proxied method on the interface.



90
91
92
93
94
# File 'lib/dbus/proxy_object_interface.rb', line 90

def define_method(methodname, prototype)
  m = Method.new(methodname)
  m.from_prototype(prototype)
  define(m)
end

#define_method_from_descriptor(m) ⇒ Object

Defines a method on the interface from the Method descriptor m.



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/dbus/proxy_object_interface.rb', line 40

def define_method_from_descriptor(m)
  m.params.each do |fpar|
    par = fpar.type
    # This is the signature validity check
    Type::Parser.new(par).parse
  end

  singleton_class.class_eval do
    define_method m.name do |*args, &reply_handler|
      if m.params.size != args.size
        raise ArgumentError, "wrong number of arguments (#{args.size} for #{m.params.size})"
      end

      msg = Message.new(Message::METHOD_CALL)
      msg.path = @object.path
      msg.interface = @name
      msg.destination = @object.destination
      msg.member = m.name
      msg.sender = @object.bus.unique_name
      m.params.each do |fpar|
        par = fpar.type
        msg.add_param(par, args.shift)
      end
      ret = @object.bus.send_sync_or_async(msg, &reply_handler)
      if ret.nil? || @object.api.proxy_method_returns_array
        ret
      else
        m.rets.size == 1 ? ret.first : ret
      end
    end
  end

  @methods[m.name] = m
end

#define_signal_from_descriptor(s) ⇒ Object

Defines a signal from the descriptor s.



76
77
78
# File 'lib/dbus/proxy_object_interface.rb', line 76

def define_signal_from_descriptor(s)
  @signals[s.name] = s
end

#on_signal(name, &block) ⇒ void #on_signal(bus, name, &block) ⇒ void

This method returns an undefined value.

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.



103
104
105
106
107
108
109
110
# File 'lib/dbus/proxy_object_interface.rb', line 103

def on_signal(bus = @object.bus, name, &block)
  mr = DBus::MatchRule.new.from_signal(self, name)
  if block.nil?
    bus.remove_match(mr)
  else
    bus.add_match(mr) { |msg| block.call(*msg.params) }
  end
end

#to_strObject

Returns the string representation of the interface (the name).



35
36
37
# File 'lib/dbus/proxy_object_interface.rb', line 35

def to_str
  @name
end