Glib:DBUS属性中的NULL

时间:2017-09-27 11:38:52

标签: c linux glib dbus gio

我正在使用gdbus-codegen为DBUS客户端生成代码。 我在第三方DBUS服务器<property name="someProperty" type="(iiii)" access="read"/>

中有GVariant属性

当我调用autogenerated方法获取属性值时:

GVariant* data = interface_name_get_some_property(proxy);

有时数据为NULL。自动生成代码中的注释说明:

  

返回:(不传输):如果未设置属性,则为属性值或%NULL。不要释放返回的值,它属于@object。

“未设置”意味着什么,我该如何处理这种情况? 我认为默认情况下(如果未设置选项G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES),glib将加载所有属性,并且应该设置它们。

1 个答案:

答案 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);