UDisks2 的 Dbus 自检不完整?
Dbus instrospection incomplete for UDisks2?
我正在使用 java dbus 接口。由于不完整,我们不得不使用dbus自省工具生成xml个文件,这些文件将被转换成Java 类.
我希望能够在系统中插入或移除驱动器时接收信号。
为此,我发现信号 InterfacesAdded 和 InterfacesRemoved 正是我要搜索的。
我已使用此命令生成 xml 内省文件:
gdbus introspect --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2 --xml
它生成了一个文件,我用这个命令转换了它:
CreateInterface --system --no-ignore-builtin --create-files org.freedesktop.UDisks2.xml
我现在可以接收到 InterfacesAdded 信号,但不能接收到 InterfacesRemoved 信号。
似乎有问题,这个信号想要提供 block_devices 节点中的一些信息。但是对于这个节点,xml 文件是空的:
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<!-- GDBus 2.66.2 -->
<node>
<interface name="org.freedesktop.DBus.Properties">
... snip ...
<interface name="org.freedesktop.DBus.ObjectManager">
<method name="GetManagedObjects">
<arg type="a{oa{sa{sv}}}" name="object_paths_interfaces_and_properties" direction="out"/>
</method>
<signal name="InterfacesAdded">
<arg type="o" name="object_path"/>
<arg type="a{sa{sv}}" name="interfaces_and_properties"/>
</signal>
<signal name="InterfacesRemoved">
<arg type="o" name="object_path"/>
<arg type="as" name="interfaces"/>
</signal>
</interface>
<node name="Manager"/>
<node name="drives"/>
<node name="block_devices"/>
</node>
因此 java 代码不知道如何创建信号。
我能为此做什么?
我认为核心误解是:您为对象 /org/freedesktop/UDisks2
生成接口文件,但随后在您的代码中使用这些接口文件为 /org/freedesktop/UDisks2/block_devices/sdb
实现的接口创建代理。这些对象实现了不同的接口。
您将需要为其创建代理的所有接口的接口定义。我无法通过内省给出确切的命令来执行此操作,但只要找到合适的对象,您就可以使用相同的方法生成它们。例如:
gdbus introspect --system --xml \
--dest org.freedesktop.UDisks2 \
--object-path /org/freedesktop/UDisks2/block_devices/nvme0n1
在我的机器上为 org.freedesktop.UDisks2.Block
和 org.freedesktop.UDisks2.PartitionTable
生成接口定义。
就是说,UDisks2 似乎确实具有源代码中可用的所有 org.freedesktop.UDisks2.*
接口:org.freedesktop.UDisks2.xml.
我正在使用 java dbus 接口。由于不完整,我们不得不使用dbus自省工具生成xml个文件,这些文件将被转换成Java 类.
我希望能够在系统中插入或移除驱动器时接收信号。
为此,我发现信号 InterfacesAdded 和 InterfacesRemoved 正是我要搜索的。
我已使用此命令生成 xml 内省文件:
gdbus introspect --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2 --xml
它生成了一个文件,我用这个命令转换了它:
CreateInterface --system --no-ignore-builtin --create-files org.freedesktop.UDisks2.xml
我现在可以接收到 InterfacesAdded 信号,但不能接收到 InterfacesRemoved 信号。
似乎有问题,这个信号想要提供 block_devices 节点中的一些信息。但是对于这个节点,xml 文件是空的:
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<!-- GDBus 2.66.2 -->
<node>
<interface name="org.freedesktop.DBus.Properties">
... snip ...
<interface name="org.freedesktop.DBus.ObjectManager">
<method name="GetManagedObjects">
<arg type="a{oa{sa{sv}}}" name="object_paths_interfaces_and_properties" direction="out"/>
</method>
<signal name="InterfacesAdded">
<arg type="o" name="object_path"/>
<arg type="a{sa{sv}}" name="interfaces_and_properties"/>
</signal>
<signal name="InterfacesRemoved">
<arg type="o" name="object_path"/>
<arg type="as" name="interfaces"/>
</signal>
</interface>
<node name="Manager"/>
<node name="drives"/>
<node name="block_devices"/>
</node>
因此 java 代码不知道如何创建信号。
我能为此做什么?
我认为核心误解是:您为对象 /org/freedesktop/UDisks2
生成接口文件,但随后在您的代码中使用这些接口文件为 /org/freedesktop/UDisks2/block_devices/sdb
实现的接口创建代理。这些对象实现了不同的接口。
您将需要为其创建代理的所有接口的接口定义。我无法通过内省给出确切的命令来执行此操作,但只要找到合适的对象,您就可以使用相同的方法生成它们。例如:
gdbus introspect --system --xml \
--dest org.freedesktop.UDisks2 \
--object-path /org/freedesktop/UDisks2/block_devices/nvme0n1
在我的机器上为 org.freedesktop.UDisks2.Block
和 org.freedesktop.UDisks2.PartitionTable
生成接口定义。
就是说,UDisks2 似乎确实具有源代码中可用的所有 org.freedesktop.UDisks2.*
接口:org.freedesktop.UDisks2.xml.