我正在使用gdbus-codegen
为DBUS客户端生成代码。
我在第三方DBUS服务器<property name="someProperty" type="(iiii)" access="read"/>
当我调用autogenerated方法获取属性值时:
GVariant* data = interface_name_get_some_property(proxy);
有时数据为NULL
。自动生成代码中的注释说明:
返回:(不传输):如果未设置属性,则为属性值或%NULL。不要释放返回的值,它属于@object。
“未设置”意味着什么,我该如何处理这种情况? 我认为默认情况下(如果未设置选项G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES),glib将加载所有属性,并且应该设置它们。
答案 0 :(得分:1)
生成的代码使用g_dbus_proxy_get_cached_property()
,它永远不会阻塞I / O:如果属性因任何原因不在缓存中,您将无法获得正确的值。一个常见的问题是在创建代理后立即获取属性值:g_dbus_proxy_new()
异步加载属性值,因此它们不应该在那时可用。
处理属性的最佳方法是使用属性更改通知。生成的GObjects&#34;通知&#34;在你的情况下,信号应该是最简单的方法:
void
on_some_property_notify (GObject *proxy,
GParamSpec *pspec,
gpointer user_data)
{
GVariant* data = interface_name_get_some_property(proxy);
// Do something with new prop value here
}
// TODO: check what the actual generated property name is
g_signal_connect (proxy, "notify::someProperty",
G_CALLBACK (on_some_property_notify), user_data);