Glib: NULL в свойстве DBUS
Я использую gdbus-codegen
сгенерировать код для клиента DBUS. У меня есть свойство GVariant на стороннем сервере DBUS <property name="someProperty" type="(iiii)" access="read"/>
Когда я вызываю автоматически сгенерированный метод, чтобы получить значение свойства:
GVariant* data = interface_name_get_some_property(proxy);
несколько раз данные NULL
, Комментарий в сгенерированном коде гласит:
Возвращает: (не передавать): значение свойства или%NULL, если свойство не установлено. Не освобождайте возвращаемое значение, оно принадлежит @object.
Что значит "не задано" и как мне относиться к этой ситуации? Я думал, что по умолчанию (если опция G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES не установлена), glib загружает все свойства, и все они должны быть установлены.
1 ответ
Сгенерированный код использует g_dbus_proxy_get_cached_property()
который никогда не будет блокировать ввод / вывод: если свойство по какой-либо причине отсутствует в кэше, вы не получите правильное значение. Обычная ошибка будет получать значение свойства сразу после создания прокси: g_dbus_proxy_new()
загружает значения свойств асинхронно, поэтому они не должны быть доступны в этой точке.
Лучший способ справиться со свойствами - использовать уведомления об изменении свойств. Сгенерированный GObjects сигнал "уведомить" должен быть самым простым способом в вашем случае:
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);