首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何列出使用DBus和UDisks2的所有可移动设备?

如何列出使用DBus和UDisks2的所有可移动设备?
EN

Stack Overflow用户
提问于 2020-08-22 14:17:18
回答 1查看 632关注 0票数 1

我需要列出,过滤和使用UDisks2打开块设备。我正在试着列出所有的可移动设备。

方法由UDisks2提供,需要a{sv}类型。如果我没有弄错的话,那就是字符串键和变体值的HashTable。

如何使用这些信息列出设备?到目前为止,我尝试了以下几点:

代码语言:javascript
复制
import std.stdio, ddbus;

void main()
{
    Connection conn = connectToBus();
    PathIface obj = new PathIface(conn, "org.freedesktop.UDsks2",
            "/org/freedesktop/UDisks2/Manager", "org.freedesktop.UDisks2.Manager");

    writeln(obj.call!string("GetBlockDevices", "org.freedesktop.DBus", ???));
}

call方法需要一个Arg作为最后一个参数。我如何在那里提供一个a{sv}

我正在使用ddbus库。

对于args,我使用了Variant!string[string],因为变体本身是一个模板类型。我还从call方法参数中删除了多余的"org.freedesktop.DBus“。

代码语言:javascript
复制
import std.stdio, ddbus;
import ddbus: Variant;

void main()
{
    Connection conn = connectToBus();
    PathIface obj = new PathIface(conn, "org.freedesktop.DBus",
            "/org/freedesktop/UDisks2/Manager", "org.freedesktop.UDisks2.Manager");

    Variant!string[string] arg;
    writeln(obj.call!string("GetBlockDevices", arg));
}

但是,我得到了以下错误:

ddbus.exception.DBusException@../../.dub/packages/ddbus-2.3.0/ddbus/source/ddbus/thin.d(833):org.freedesktop.DBus不理解消息GetBlockDevices

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-25 14:17:52

你们的问题是:

  1. D总线名称org.freedesktop.UDisks2在系统总线上(而不是在会话总线上),因此需要更改connectToBus()调用。
  2. 总线名是org.freedeskop.UDisks2,而不是org.freedesktop.DBus
  3. GetBlockDevices的返回值是ao (对象路径数组),但是您使用call!string调用它,这意味着您将得到一个字符串。将此更改为call!(ObjectPath[])
  4. (可选)你的论点是Variant!string[string]的。ddbus中的Variant!T类型是一个助手,它只会使任何类型T都像dbus协议中的变体,但实际上它不允许任何其他类型。如果您想支持传递任何类型,那么ddbus支持使用std.variant : Variant,或者有一个特殊类型,您可以使用使用Variant!DBusAny的ddbus变体,这是一个更轻量级的标记联合,只支持所有的dbus类型(以及更多的内省)。

我相信这个代码就是你想要的,所有的问题都解决了:

代码语言:javascript
复制
import std.stdio, ddbus;
import ddbus : Variant;
import ddbus.c_lib;

void main()
{
    Connection conn = connectToBus(DBusBusType.DBUS_BUS_SYSTEM);
    PathIface obj = new PathIface(conn,
        busName("org.freedesktop.UDisks2"),
        ObjectPath("/org/freedesktop/UDisks2/Manager"),
        interfaceName("org.freedesktop.UDisks2.Manager"));

    Variant!DBusAny[string] arg;
    writeln(obj.call!(ObjectPath[])("GetBlockDevices", arg));
}

在这段代码中,我还使用了类型安全的ddbus,这使得PathIface中的参数更加清晰。类型安全API需要ddbus 3.0.0-beta.1或更高版本.

示例输出:

代码语言:javascript
复制
[/org/freedesktop/UDisks2/block_devices/sdc1, /org/freedesktop/UDisks2/block_devices/sdb1, /org/freedesktop/UDisks2/block_devices/sda, /org/freedesktop/UDisks2/block_devices/nvme0n1p2, /org/freedesktop/UDisks2/block_devices/sdb3, /org/freedesktop/UDisks2/block_devices/sdc, /org/freedesktop/UDisks2/block_devices/nvme0n1, /org/freedesktop/UDisks2/block_devices/sr0, /org/freedesktop/UDisks2/block_devices/nvme0n1p1, /org/freedesktop/UDisks2/block_devices/sde, /org/freedesktop/UDisks2/block_devices/sdb2, /org/freedesktop/UDisks2/block_devices/sdb, /org/freedesktop/UDisks2/block_devices/sda1, /org/freedesktop/UDisks2/block_devices/sde1, /org/freedesktop/UDisks2/block_devices/sdb4, /org/freedesktop/UDisks2/block_devices/sdd]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63537158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档