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

问题描述

我需要使用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

解决方法

您的问题是:

  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类型(以及更多的内省)

我相信此代码是解决所有问题后所需要的:

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]

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...