使用 Vala 通过 DBus 将 FD 传递给未命名的管道

Passing a FD to an unnamed pipe over DBus using Vala

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

在我看来,我需要其中一种方法来接收来自 DBusMethodInvocation 对象的消息,该消息是通过调用 DBusInterfaceMethodCallFunc 委托获得的,您可以创建回复消息。有没有一种方法可以指定与 register_object_with_closures 一起使用的闭包 class,或者可以指定一个 DBusInterfaceVTable 对象作为服务数据的一部分?

我知道一种选择是仅在 C 中创建服务,但我更愿意弄清楚并理解它在 Vala 中的工作原理。

Vala 在内部对包含 GLib.UnixInputStream、GLib.UnixOutputStream、GLib.Socket 或 GLib.FileDescriptorBased.

类型参数的方法使用 UnixFDList

示例:

[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;
}