问题描述
我需要使用UDisks2列出,过滤和打开块设备。我正在尝试列出所有可移动设备。
UDisks2提供的GetBlockDevices
method需要一种a{sv}
类型。如果我没记错的话,那是一个字符串键和Variant值的HashTable。
如何使用此信息列出设备?到目前为止,我尝试了以下方法:
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]
,因为Variant本身是模板类型。我还从调用方法参数中删除了多余的“ org.freedesktop.DBus”。
import std.stdio,ddbus;
import ddbus: Variant;
void main()
{
Connection conn = connectToBus();
PathIface obj = new PathIface(conn,"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
解决方法
您的问题是:
- D总线名称org.freedesktop.UDisks2在系统总线上(而不是会话总线上),因此
connectToBus()
调用需要更改。 - 总线名称为org.freedeskop.UDisks2,而不是org.freedesktop.DBus
- GetBlockDevices的返回值为
ao
(对象路径数组),但是您使用call!string
进行调用,这意味着您将获得一个字符串。将此更改为call!(ObjectPath[])
- (可选)您设置了参数
Variant!string[string]
。 ddbus中的Variant!T
类型是一个帮助程序,它将使任何T类型都像dbus协议中的变体一样起作用,但实际上并不允许任何其他类型。如果要支持传递任何类型,则ddbus可以使用std.variant : Variant
进行支持,也可以使用Variant!DBusAny
来与ddbus变体一起使用,这是一种更轻量的带标记的联合,仅支持所有dbus类型(以及更多的内省)
我相信此代码是解决所有问题后所需要的:
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 API,该API使PathIface中的参数更加清晰。类型安全的API需要ddbus 3.0.0-beta.1或更高版本。
示例输出:
[/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]