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 ならうまくいく。