dbus interface xml 文件的用途是什么?
what is the purpose of dbus interface xml file?
我正在阅读D-Bus API Design Guidelines:
Interface files for public API should be installed to $(datadir)/dbus-1/interfaces so that other services can load them.
OK...为了了解这些接口文件是如何工作的,我打开文件/usr/share/dbus-1/interfaces/org.gnome.Shell.Screenshot.xml
(我使用的是Ubuntu 20.04)
<node>
<interface name="org.gnome.Shell.Screenshot">
...
<method name="PickColor">
<arg type="a{sv}" direction="out" name="result"/>
</method>
好吧,我看到了接口名称,我看到了方法名称,但这还不够。如果我想使用 dbus-send
调用此方法
$ dbus-send --print-reply --dest=<service.name> </path/to/object> org.gnome.Shell.Screenshot.PickColor
我需要 <service.name>
和 <path/to/object>
,此 xml
文件没有提供。
问题是:如果这个文件没有提供有关服务接口的完整信息,它的用途是什么?它被 dbus-daemon
或任何其他程序使用吗?真的需要这样的文件吗?我是否应该得出一个 xml 文件不完整的结论,该文件不提供 object in 的路径?此类文件是否还应提及服务已知名称(在本例中为 org.gnome.Shell.Screenshot
)?
org.freedesktop.DBus.Introspectable
接口有一个方法:
org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
对象实例可以实现 Introspect
其中 returns 对象的 XML 描述。自省格式记录在:
https://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
在命令行上使用 busctl
我可以使用 list
获取所有服务,tree
获取所有对象,然后 intropspect
查找API。使用这三个命令,我可以发现系统
上的 D-Bus 服务
$ busctl list
$ busctl tree <service>
$ busctl introspect <service> <object>
您在问题中提到的服务在 Session/User 公交车上,所以它是:
$ busctl --user list | grep Screenshot
NAME PID PROCESS USER CONNECTION UNIT SESSION DESCRIPTION
---------------------------------------------------------------------------------------------------------------------------------
org.gnome.Screenshot - - - (activatable) - - -
org.gnome.Shell.Screenshot 1259 gnome-shell LinuxMachine1 :1.37 user@1000.service - -
$ busctl --user tree org.gnome.Shell.Screenshot
├─/StatusNotifierWatcher
└─/org
├─/org/freedesktop
│ ├─/org/freedesktop/Notifications
│ └─/org/freedesktop/portal
│ └─/org/freedesktop/portal/desktop
├─/org/gnome
│ ├─/org/gnome/Mutter
│ │ ├─/org/gnome/Mutter/DisplayConfig
│ │ └─/org/gnome/Mutter/IdleMonitor
│ │ └─/org/gnome/Mutter/IdleMonitor/Core
│ ├─/org/gnome/ScreenSaver
│ ├─/org/gnome/SessionManager
│ │ └─/org/gnome/SessionManager/EndSessionDialog
│ ├─/org/gnome/Shell
│ │ ├─/org/gnome/Shell/AudioDeviceSelection
│ │ ├─/org/gnome/Shell/Introspect
│ │ ├─/org/gnome/Shell/Screencast
│ │ ├─/org/gnome/Shell/Screenshot
│ │ └─/org/gnome/Shell/Wacom
│ └─/org/gnome/keyring
│ └─/org/gnome/keyring/Prompter
└─/org/gtk
├─/org/gtk/MountOperationHandler
└─/org/gtk/Notifications
$ busctl --user introspect org.gnome.Shell.Screenshot /org/gnome/Shell/Screenshot
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.Peer interface - - -
.GetMachineId method - s -
.Ping method - - -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
org.gnome.Shell.Screenshot interface - - -
.FlashArea method iiii - -
.PickColor method - a{sv} -
.Screenshot method bbs bs -
.ScreenshotArea method iiiibs bs -
.ScreenshotWindow method bbbs bs -
.SelectArea method - iiii -
为了完整起见,运行 与您执行的命令相同:
$ busctl --user call org.gnome.Shell.Screenshot /org/gnome/Shell/Screenshot org.gnome.Shell.Screenshot PickColor
a{sv} 1 "color" (ddd) 1 1 1
答案就在名字里:它是一个D-Bus接口文件。它定义了一个 接口 ,而不是该接口的实例。 D-Bus 中可能有零个或多个接口实例化,它们可能是动态的。所以它们的路径不能在 XML 文件中指定。
如果 D-Bus 是现在设计的,也许这个 XML 文件的结构或实现会有所不同。但这就是事实。
我正在阅读D-Bus API Design Guidelines:
Interface files for public API should be installed to $(datadir)/dbus-1/interfaces so that other services can load them.
OK...为了了解这些接口文件是如何工作的,我打开文件/usr/share/dbus-1/interfaces/org.gnome.Shell.Screenshot.xml
(我使用的是Ubuntu 20.04)
<node>
<interface name="org.gnome.Shell.Screenshot">
...
<method name="PickColor">
<arg type="a{sv}" direction="out" name="result"/>
</method>
好吧,我看到了接口名称,我看到了方法名称,但这还不够。如果我想使用 dbus-send
$ dbus-send --print-reply --dest=<service.name> </path/to/object> org.gnome.Shell.Screenshot.PickColor
我需要 <service.name>
和 <path/to/object>
,此 xml
文件没有提供。
问题是:如果这个文件没有提供有关服务接口的完整信息,它的用途是什么?它被 dbus-daemon
或任何其他程序使用吗?真的需要这样的文件吗?我是否应该得出一个 xml 文件不完整的结论,该文件不提供 object in 的路径?此类文件是否还应提及服务已知名称(在本例中为 org.gnome.Shell.Screenshot
)?
org.freedesktop.DBus.Introspectable
接口有一个方法:
org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
对象实例可以实现 Introspect
其中 returns 对象的 XML 描述。自省格式记录在:
https://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
在命令行上使用 busctl
我可以使用 list
获取所有服务,tree
获取所有对象,然后 intropspect
查找API。使用这三个命令,我可以发现系统
$ busctl list
$ busctl tree <service>
$ busctl introspect <service> <object>
您在问题中提到的服务在 Session/User 公交车上,所以它是:
$ busctl --user list | grep Screenshot
NAME PID PROCESS USER CONNECTION UNIT SESSION DESCRIPTION
---------------------------------------------------------------------------------------------------------------------------------
org.gnome.Screenshot - - - (activatable) - - -
org.gnome.Shell.Screenshot 1259 gnome-shell LinuxMachine1 :1.37 user@1000.service - -
$ busctl --user tree org.gnome.Shell.Screenshot
├─/StatusNotifierWatcher
└─/org
├─/org/freedesktop
│ ├─/org/freedesktop/Notifications
│ └─/org/freedesktop/portal
│ └─/org/freedesktop/portal/desktop
├─/org/gnome
│ ├─/org/gnome/Mutter
│ │ ├─/org/gnome/Mutter/DisplayConfig
│ │ └─/org/gnome/Mutter/IdleMonitor
│ │ └─/org/gnome/Mutter/IdleMonitor/Core
│ ├─/org/gnome/ScreenSaver
│ ├─/org/gnome/SessionManager
│ │ └─/org/gnome/SessionManager/EndSessionDialog
│ ├─/org/gnome/Shell
│ │ ├─/org/gnome/Shell/AudioDeviceSelection
│ │ ├─/org/gnome/Shell/Introspect
│ │ ├─/org/gnome/Shell/Screencast
│ │ ├─/org/gnome/Shell/Screenshot
│ │ └─/org/gnome/Shell/Wacom
│ └─/org/gnome/keyring
│ └─/org/gnome/keyring/Prompter
└─/org/gtk
├─/org/gtk/MountOperationHandler
└─/org/gtk/Notifications
$ busctl --user introspect org.gnome.Shell.Screenshot /org/gnome/Shell/Screenshot
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.Peer interface - - -
.GetMachineId method - s -
.Ping method - - -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
org.gnome.Shell.Screenshot interface - - -
.FlashArea method iiii - -
.PickColor method - a{sv} -
.Screenshot method bbs bs -
.ScreenshotArea method iiiibs bs -
.ScreenshotWindow method bbbs bs -
.SelectArea method - iiii -
为了完整起见,运行 与您执行的命令相同:
$ busctl --user call org.gnome.Shell.Screenshot /org/gnome/Shell/Screenshot org.gnome.Shell.Screenshot PickColor
a{sv} 1 "color" (ddd) 1 1 1
答案就在名字里:它是一个D-Bus接口文件。它定义了一个 接口 ,而不是该接口的实例。 D-Bus 中可能有零个或多个接口实例化,它们可能是动态的。所以它们的路径不能在 XML 文件中指定。
如果 D-Bus 是现在设计的,也许这个 XML 文件的结构或实现会有所不同。但这就是事实。