【问题标题】:what is the purpose of dbus interface xml file?dbus接口xml文件的目的是什么?
【发布时间】:2022-02-08 21:42:55
【问题描述】:

我正在阅读D-Bus API Design Guidelines

公共 API 的接口文件应该安装到 $(datadir)/dbus-1/interfaces 以便其他服务可以加载它们。

好的...为了了解这些接口文件是如何工作的,我打开文件/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

我需要&lt;service.name&gt;&lt;path/to/object&gt;,这是xml-文件不提供的。

问题是:如果这个文件没有提供有关服务接口的完整信息,它的目的是什么? dbus-daemon 或任何其他程序使用它吗?真的需要这样的文件吗?我是否应该得出一个结论,即不提供对象 in 路径的 xml 文件是不完整的?此类文件是否还应提及服务已知名称(在本例中为org.gnome.Shell.Screenshot)?

【问题讨论】:

    标签: configuration-files dbus


    【解决方案1】:

    org.freedesktop.DBus.Introspectable 接口有一个方法:

          org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
        
    

    对象实例可以实现Introspect,它返回对象的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>
    

    您在问题中提到的服务位于会话/用户总线上,因此它是:

    $ 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
    

    【讨论】:

    • 这是一个绝妙的答案,它回答了我对 dbus 的许多问题,但这个特定的问题是在问别的问题:如果这些 xml 文件不提供完整信息,它们的目的是什么关于服务?他们真的需要什么吗?您正在谈论调用方法Introspect,但是有些人编写服务时没有提供此方法。但他们仍然提供 xml 文件,描述他们的服务。我是否应该得出一个结论,即在&lt;node name='/path/to/object'&gt; 中未提供对象路径的 xml 文件不完整?
    • 正如我在链接到的文档中所说,它的主要用途是用于描述自省对象的返回 XML 字符串。对我来说,使用PyGObject 绑定,XML 被传递给Gio.DBusNodeInfo.new_for_xml。正如链接文档中提到的,XML 也可能在其他地方使用。我怀疑答案将取决于您使用的特定 D-Bus 绑定以及您正在创建的内容。
    【解决方案2】:

    答案就在名称中:它是一个 D-Bus interface 文件。它定义了一个接口,而不是该接口的实例化。 D-Bus 中的接口可能有零个或多个实例化,并且它们可能是动态的。所以它们的路径不能在 XML 文件中指定。

    如果现在设计 D-Bus,也许这个 XML 文件的结构或实现方式会有所不同。但这就是存在的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 2015-04-06
      • 2010-10-31
      • 2012-11-13
      相关资源
      最近更新 更多