gdbus
と を使用して D-Bus でサービスを作成していますgdbus-codegen
。
イントロスペクションは次のとおりです。
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="com.example.foo">
<property name="Bar" type="s" access="readwrite" />
</interface>
</node>
私はgdbus-codegen
このように実行しています:
gdbus-codegen --interface-prefix com.example --generate-c-code=foo foo.xml
そして、私の main.cpp は次のようになります。
#include <iostream>
#include "foo.h"
void OnBarChanged(GObject * gobject, GParamSpec * pspec, gpointer user_data)
{
std::cout << "Bar: " << foo_get_bar((Foo *)gobject) << std::endl;
}
void OnBusNameAquired(GDBusConnection * connection,
const gchar * name,
gpointer user_data)
{
Foo * foo = foo_skeleton_new();
g_signal_connect(foo, "notify::bar", G_CALLBACK(&OnBarChanged), NULL);
g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(foo),
connection,
"/com/example/foo",
NULL);
}
int main()
{
std::cout << "Testing DBus properties" << std::endl;
GMainLoop * loop;
loop = g_main_loop_new(NULL, FALSE);
g_bus_own_name(G_BUS_TYPE_SESSION,
"com.example.foo",
G_BUS_NAME_OWNER_FLAGS_NONE,
NULL,
OnBusNameAquired,
NULL,
NULL,
NULL);
g_main_loop_run(loop);
return 0;
}
これは期待どおりに機能し、次を使用してプロパティを設定および取得できます。
gdbus call --session --dest com.example.foo --object-path /com/example/foo --method org.freedesktop.DBus.Properties.Set "com.example.foo" "Bar" "<'baz'>"
と
gdbus call --session --dest com.example.foo --object-path /com/example/foo --method org.freedesktop.DBus.Properties.Get "com.example.foo" "Bar"
(<'baz'>,)
問題:
プロパティの設定を同期的に検証し、失敗した場合にエラーを返すことができるようにしたいと考えています。gdbus-codegen
生成されたコードを使用してこれをどのように達成できますか?
PS:
コードが漏れており、通常は本番環境に対応していません。私は今のところそれで大丈夫です:-)
編集
調査を続けた結果、D-Bus プロパティは基になるGObject
プロパティ機能を使用しているようです。コードによってすべてが設定されている場合、カスタムバリデーターをインストールすることは可能gdbus-codegen
ですか?