qdbusxml2cpp неизвестного типа

При использовании программы qdbusxml2cpp для преобразования следующего xml в класс Qt я получаю эту ошибку:

qdbusxml2cpp -c ObjectManager -a ObjectManager:ObjectManager.cpp xml/object_manager.xml 
Got unknown type `a{oa{sa{sv}}}'
You should add <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="<type>"/> to the XML description

Описание D-Feet:

XML:

<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node><interface name="org.freedesktop.DBus.Introspectable"><method name="Introspect"><arg name="xml" type="s" direction="out"/>
</method></interface><interface name="org.freedesktop.DBus.ObjectManager"><method name="GetManagedObjects"><arg name="objects" type="a{oa{sa{sv}}}" direction="out"/>
</method><signal name="InterfacesAdded"><arg name="object" type="o"/>
<arg name="interfaces" type="a{sa{sv}}"/>
</signal>
<signal name="InterfacesRemoved"><arg name="object" type="o"/>
<arg name="interfaces" type="as"/>
</signal>
</interface><node name="org"/></node>

С этого веб-сайта ( http://techbase.kde.org/Development/Tutorials/D-Bus/CustomTypes) я понимаю, что мне нужно добавить аннотацию в XML, чтобы инструмент работал правильно.

Вот что у меня так далеко:

a{oa{sa{sv}}}

https://alteeve.ca/w/List_of_DBus_data_types
o == A UTF-8 string whose value is a valid DBus object path.

array { object_path array { string array { string variant } } }

<arg name="customdata" type="a{sv}" direction="in" />
QVariantMap in the arguments (type "a{sv}")
QMap<QString, QVariant>

Однако я не уверен, какой должна быть аннотация для {oa{sa{sv}}}, может кто-нибудь помочь мне понять? Спасибо!

2 ответа

Решение

https://github.com/openSUSE/imagewriter - это лицензированный GPL-проект, содержащий пример того, как это сделать.
(Соответствующие файлы: udisks2_interface.*)


a{sv} является указанием строки: вариант пары.
QVariantMap будет соответствовать этой подписи.

a{sa{sv}} это строка слова:a{sv} пар.
QMap<QString, QVariantMap> будет соответствовать этой подписи.

a{oa{sa{sv}}} является указанием на путь объекта:a{sa{sv}} пар.
QMap<QDBusObjectPath, QMap<QString, QVariantMap>> будет соответствовать этой подписи.

Мы должны скрыть эти угловые скобки за некоторыми typedef в заголовочном файле:

typedef QMap<QString, QVariantMap> InterfaceList;
typedef QMap<QDBusObjectPath, InterfaceList> ManagedObjectList;

Затем объявите их QMetaTypes в том же заголовочном файле:

Q_DECLARE_METATYPE(InterfaceList)
Q_DECLARE_METATYPE(ManagedObjectList)

Затем зарегистрируйте их в системе метатипов Qt во время выполнения:

qDBusRegisterMetaType<InterfaceList>();
qDBusRegisterMetaType<ManagedObjectList>();

Затем мы можем аннотировать XML:

<method name="GetManagedObjects">
  <arg type="a{oa{sa{sv}}}" name="objects" direction="out">
    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="ManagedObjectList"/>
  </arg>
</method>
<signal name="InterfacesAdded">
  <arg type="o" name="object"/>
  <arg type="a{sa{sv}}" name="interfaces">
    <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="InterfaceList"/>
  </arg>
</signal>

У меня была такая же проблема с более новой версией (Qt5.12). Я не хотел изменять сгенерированный код и узнал, как правильно сгенерировать этот код.
qdbusxml2cpp не знал, как обращаться с подписями словаря. Мое решение состоит в том, чтобы добавить аннотации непосредственно к типам Qt. как в этом, для
"a{oa{sa{sv}}}" -> QMap<QDBusObjectPath, QMap<QString, QVariantMap> >

      <method name="GetManagedObjects">
  <arg type="a{oa{sa{sv}}}" name="object_paths_interfaces_and_properties" direction="out"/>
  <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QMap&lt;QDBusObjectPath,QMap&lt;QString,QVariantMap&gt;&gt;"/>
</method>

С < fot < и > fot > . Тогда сгенерированный код правильный.

Надеюсь, это поможет кому-то однажды... через 8 лет

Другие вопросы по тегам