如何将 GDBusInterface 转换为 GDBusProxy?

How can I convert a GDBusInterface into a GDBusProxy?

我正在尝试编写一些使用 GLib 的 GIO 中的 DBus 支持的 C。

我有一个 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); 中的 return 进行比较来做到这一点,但我没有 GDBusProxy,我有 GDBusInterface。所以我的问题是:如何从 GDBusInterface 得到 GDBusProxy

GDBusInterface 是由 GDBusProxy class 实现的接口,所以你已经有了 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() 将 return 代理所针对的众所周知或唯一的总线名称,这与接口名称不同。 well known or unique name 标识总线上的对等点(通常是另一个进程)。该对等点在 对象路径 公开对象,并且每个对象实现一个或多个 接口 .