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);
Другие вопросы по тегам