Class: DBus::ProxyObjectInterface

Inherits:
Object
  • Object
show all
Defined in:
lib/dbus/introspect.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"

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.



235
236
237
238
# File 'lib/dbus/introspect.rb', line 235

def initialize(object, name)
  @object, @name = object, name
  @methods, @signals = Hash.new, Hash.new
end

Instance Attribute Details

#methodsObject

The proxied methods contained in the interface.



225
226
227
# File 'lib/dbus/introspect.rb', line 225

def methods
  @methods
end

#nameObject (readonly)

The name of the interface.



231
232
233
# File 'lib/dbus/introspect.rb', line 231

def name
  @name
end

#objectObject (readonly)

The proxy object to which this interface belongs.



229
230
231
# File 'lib/dbus/introspect.rb', line 229

def object
  @object
end

#signalsObject

The proxied signals contained in the interface.



227
228
229
# File 'lib/dbus/introspect.rb', line 227

def signals
  @signals
end

Instance Method Details

#[](propname) ⇒ Object

Read a property.



332
333
334
# File 'lib/dbus/introspect.rb', line 332

def [](propname)
  self.object[PROPERTY_INTERFACE].Get(self.name, propname)[0]
end

#[]=(propname, value) ⇒ Object

Write a property.



337
338
339
# File 'lib/dbus/introspect.rb', line 337

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

#all_propertiesObject

Read all properties at once, as a hash.



342
343
344
# File 'lib/dbus/introspect.rb', line 342

def all_properties
  self.object[PROPERTY_INTERFACE].GetAll(self.name)[0]
end

#check_for_eval(s) ⇒ Object

FIXME

Raises:

  • (RuntimeError)


251
252
253
# File 'lib/dbus/introspect.rb', line 251

def check_for_eval(s)
  raise RuntimeError, "invalid internal data '#{s}'" if not s.to_s =~ /^[A-Za-z0-9_]*$/
end

#check_for_quoted_eval(s) ⇒ Object

FIXME

Raises:

  • (RuntimeError)


256
257
258
# File 'lib/dbus/introspect.rb', line 256

def check_for_quoted_eval(s)
  raise RuntimeError, "invalid internal data '#{s}'" if not s.to_s =~ /^[^"]+$/
end

#define(m) ⇒ Object

Defines a signal or method based on the descriptor m.



303
304
305
306
307
308
309
# File 'lib/dbus/introspect.rb', line 303

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

#define_method(methodname, prototype) ⇒ Object

Defines a proxied method on the interface.



312
313
314
315
316
# File 'lib/dbus/introspect.rb', line 312

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.



261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
# File 'lib/dbus/introspect.rb', line 261

def define_method_from_descriptor(m)
  check_for_eval(m.name)
  check_for_quoted_eval(@name)
  methdef = "def #{m.name}("
  methdef += (0..(m.params.size - 1)).to_a.collect { |n|
    "arg#{n}"
  }.push("&reply_handler").join(", ")
  methdef += %{)
          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
        }
  idx = 0
  m.params.each do |fpar|
    par = fpar.type
    check_for_quoted_eval(par)

    # This is the signature validity check
    Type::Parser.new(par).parse

    methdef += %{
      msg.add_param("#{par}", arg#{idx})
    }
    idx += 1
  end
  methdef += "
    @object.bus.send_sync_or_async(msg, &reply_handler)
  end
  "
  singleton_class.class_eval(methdef)
  @methods[m.name] = m
end

#define_signal_from_descriptor(s) ⇒ Object

Defines a signal from the descriptor s.



298
299
300
# File 'lib/dbus/introspect.rb', line 298

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

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

Registers a handler (code block) for a signal with name arriving over the given bus. If no block is given, the signal is unregistered.



320
321
322
323
324
325
326
327
# File 'lib/dbus/introspect.rb', line 320

def on_signal(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

#singleton_classObject

Returns the singleton class of the interface.



246
247
248
# File 'lib/dbus/introspect.rb', line 246

def singleton_class
  (class << self ; self ; end)
end

#to_strObject

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



241
242
243
# File 'lib/dbus/introspect.rb', line 241

def to_str
  @name
end