我需要列出,过滤和使用UDisks2打开块设备。我正在试着列出所有的可移动设备。
方法由UDisks2提供,需要a{sv}类型。如果我没有弄错的话,那就是字符串键和变体值的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],因为变体本身是一个模板类型。我还从call方法参数中删除了多余的"org.freedesktop.DBus“。
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
发布于 2020-08-25 14:17:52
你们的问题是:
connectToBus()调用。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,这使得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]https://stackoverflow.com/questions/63537158
复制相似问题