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.



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

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.



304
305
306
# File 'lib/dbus/introspect.rb', line 304

def methods
  @methods
end

#nameObject (readonly)

The name of the interface.



310
311
312
# File 'lib/dbus/introspect.rb', line 310

def name
  @name
end

#objectObject (readonly)

The proxy object to which this interface belongs.



308
309
310
# File 'lib/dbus/introspect.rb', line 308

def object
  @object
end

#signalsObject

The proxied signals contained in the interface.



306
307
308
# File 'lib/dbus/introspect.rb', line 306

def signals
  @signals
end

Instance Method Details

#[](propname) ⇒ Object

Read a property.



411
412
413
# File 'lib/dbus/introspect.rb', line 411

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

#[]=(propname, value) ⇒ Object

Write a property.



416
417
418
# File 'lib/dbus/introspect.rb', line 416

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

#all_propertiesObject

Read all properties at once, as a hash.



421
422
423
# File 'lib/dbus/introspect.rb', line 421

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

#check_for_eval(s) ⇒ Object

FIXME

Raises:

  • (RuntimeError)


330
331
332
# File 'lib/dbus/introspect.rb', line 330

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)


335
336
337
# File 'lib/dbus/introspect.rb', line 335

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.



382
383
384
385
386
387
388
# File 'lib/dbus/introspect.rb', line 382

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.



391
392
393
394
395
# File 'lib/dbus/introspect.rb', line 391

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.



340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
# File 'lib/dbus/introspect.rb', line 340

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.



377
378
379
# File 'lib/dbus/introspect.rb', line 377

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.



399
400
401
402
403
404
405
406
# File 'lib/dbus/introspect.rb', line 399

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.



325
326
327
# File 'lib/dbus/introspect.rb', line 325

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

#to_strObject

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



320
321
322
# File 'lib/dbus/introspect.rb', line 320

def to_str
  @name
end