ruby-dbus を使う (2)

Ruby の Hash のように使いたい

Ruby の Hash のようにキーと任意の型のペアを扱いたい。 DICT_ENTRY を使えば良いと思ったのだが、 emacs から送信しようとしてもうまく行かない。 結局、STRING と VARIANT をペアにした STRUCT の ARRAY で 表すことにした。

dbus_hash.rb

require 'dbus'

bus = DBus.session_bus
service = bus.request_service("test.dbus.service")

class DBusTest < DBus::Object
  dbus_interface "test.dbus.SampleInterface" do
    dbus_method :hash, "in arg:a(sv), out ret:a(sv)" do |arg|
      p arg
      [[['ABC', 'DEF'], ['array', [1, 2, 3]], ['boolean', false]]]
    end
  end
end

obj = DBusTest.new("/test/dbus/MyInstance")
service.export(obj)

main = DBus::Main.new
main << bus
main.run

プロトタイプには「a(sv)」を指定して、文字列と VARIANT 型の値の STRUCT の配列を 使用する。

emacs から引数を送信する

(dbus-call-method :session "test.dbus.service" "/test/dbus/MyInstance" "test.dbus.SampleInterface" "hash"
  '(:array (:struct "abc" (:variant "def")) (:struct :string "number" (:variant t))
   (:struct :string "number" (:variant (:array 1 2 3)))))

とすると値が文字列、boolean、配列でも送信できることがわかる。 dbus_hash.rb の方には

[["abc", "def"], ["number", true], ["number", [1, 2, 3]]]

が表示される。

nil は変換してくれない

ruby の nil は boolean の偽に変換してくれるかと思ったのだがだめだった。 false ならうまくいく。

Tags of current page

, ,