使用Vala将FD传递到DBus上的未命名管道

时间:2018-01-24 19:51:33

标签: dbus vala

我试图在应用程序之间发送大块数据,方法是通过DBus从一个控制消息向另一个发送一个请求Unix文件描述符的控制消息。我拥有它以便客户端可以请求此服务器,服务器创建包含UnixFDList的DBus消息,并且客户端收到回复消息但它不包含任何内容。在Vala的服务器端,使用DBusConnection设置register_object对象,遗憾的是,Vapi隐藏了所有C示例使用的DBusInterfaceVTable参数,该参数可以让我指定方法调用的委托。我尝试过使用register_object_with_closures,但我似乎无法将其用于工作,而Vala中的Closure对象实际上是无法记录的。

在我看来,我需要其中一种方法来接收来自DBusMethodInvocation委托的调用的DBusInterfaceMethodCallFunc对象的消息,你可以创建一个回复信息。有没有办法指定一个适用于register_object_with_closures的闭包类,或者一种指定DBusInterfaceVTable对象作为服务数据的一部分的方法?

我知道一个选项就是在C中创建服务,但我宁愿弄清楚并理解它在Vala中是如何工作的。

1 个答案:

答案 0 :(得分:0)

Vala在内部使用UnixFDList来处理包含GLib.UnixInputStream,GLib.UnixOutputStream,GLib.Socket或GLib.FileDescriptorBased类型参数的方法。

示例:

[DBus(name="eu.tiliado.Nuvola")]
public interface MasterDbusIfce: GLib.Object {
    public abstract void get_connection(
        string app_id,
        string dbus_id,
        out GLib.Socket? socket,
        out string? token) throws GLib.Error;
}