如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GD 调整上传图像的大小并将其转换为 PNG?

将 GD-Sharp 流转换为位图

使用 PHP 中的 GD 库将位图文件转换为 JPEG

使用 GD2 将 png 转换为 jpg .. 透明度问题

如何将 jp2 图像转换为 jpg 文件?

将 GD 图像缩放器转换为具有双三次锐化器的等效 ImageMagick