如何将 GDBusInterface 转换为 GDBusProxy?
Posted
技术标签:
【中文标题】如何将 GDBusInterface 转换为 GDBusProxy?【英文标题】:How can I convert a GDBusInterface into a GDBusProxy? 【发布时间】:2019-06-24 07:30:48 【问题描述】:我正在尝试编写一些使用 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);
的回报进行比较来做到这一点,但我没有GDBusProxy
,我有GDBusInterface
。所以我的问题是:如何从GDBusInterface
获得GDBusProxy
?
【问题讨论】:
【参考方案1】:GDBusInterface
是一个由GDBusProxy
类实现的接口,所以你已经有了GDBusProxy
——你只需要将它转换为正确的类型,你可以使用G_DBUS_PROXY (interface)
来做到这一点。
根据您是否使用gdbus-codegen
生成的代理实例,您可以使用生成代码中的宏(如MY_NAMESPACE_IS_ADAPTER1 (interface)
)来检查它是否是org.bluez.Adapter1
的代理实例;或者您可以使用g_str_equal (g_dbus_proxy_get_interface_name (G_DBUS_PROXY (interface)), "org.bluez.Adapter1")
手动检查接口名称。
请注意,g_dbus_proxy_get_name()
将返回代理所针对的众所周知或唯一的总线名称,该名称与接口名称不同。 well known or unique name 标识总线上的对等点(通常是另一个进程)。该对等点在对象路径处公开对象,每个对象实现一个或多个接口。
【讨论】:
以上是关于如何将 GDBusInterface 转换为 GDBusProxy?的主要内容,如果未能解决你的问题,请参考以下文章