【问题标题】:Passing a FD to an unnamed pipe over DBus using Vala使用 Vala 通过 DBus 将 FD 传递给未命名的管道
【发布时间】:2018-01-24 19:51:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: dbus vala


    【解决方案1】:

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

    【讨论】:

    • 在 Vala 测试套件中有一个使用 UnixInputStream 的例子。它它tests/dbus/filedescriptor.test
    • @AlThomas 提供的答案和评论让我得到了我需要的东西。我没想到在测试文件夹中查找示例。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2010-10-26
    相关资源
    最近更新 更多