Как преобразовать GDBusInterface в GDBusProxy?

Я пытаюсь написать C, который использует поддержку DBus в GIO GLib.

У меня есть GDBusObjectManager, и я использовал g_signal_connect(), чтобы добавить обработчик сигнала interface-added. Подпись обработчика согласно документам:

void
user_function (GDBusObjectManager *manager,
               GDBusObject        *object,
               GDBusInterface     *interface,
               gpointer            user_data)

Я хочу проверить, соответствует ли добавленный интерфейс интересующему меня интерфейсу (org.bluez.Adapter1), а затем вызвать некоторые методы из этого интерфейса для объекта, который его реализует. Я считаю, что первый шаг — проверить, совпадает ли имя интерфейса. Я считаю, что мог бы сделать это, сравнив с возвратом от const gchar *g_dbus_proxy_get_name(GDBusProxy *proxy);, но у меня нет GDBusProxy, у меня есть GDBusInterface. Итак, мой вопрос: как я могу получить GDBusProxy из GDBusInterface?


person Dave    schedule 30.01.2019    source источник


Ответы (1)


GDBusInterface — это интерфейс, реализованный классом GDBusProxy, поэтому у вас уже есть GDBusProxy — вам просто нужно привести его к нужному типу, что вы можете сделать с помощью G_DBUS_PROXY (interface).

В зависимости от того, используете ли вы экземпляры прокси, сгенерированные gdbus-codegen, вы можете либо проверить, является ли это экземпляром прокси для org.bluez.Adapter1, используя макрос из сгенерированного кода, например MY_NAMESPACE_IS_ADAPTER1 (interface); или вы можете проверить имя интерфейса вручную, используя g_str_equal (g_dbus_proxy_get_interface_name (G_DBUS_PROXY (interface)), "org.bluez.Adapter1").

Обратите внимание, что g_dbus_proxy_get_name() вернет общеизвестное или уникальное имя шины, для которой предназначен прокси, которое не совпадает с именем интерфейса. хорошо известное или уникальное имя< /a> идентифицирует одноранговый узел (обычно другой процесс) на шине. Этот одноранговый узел предоставляет объекты по путям к объектам, и каждый объект реализует один или несколько интерфейсов.

person Philip Withnall    schedule 31.01.2019