openSUSE imagewriter is a GPL licensed project which contains an example of how to do this.
(Relevant files: udisks2_interface.*
)
a{sv}
is a dict of string:variant pairs.
QVariantMap
would fit this signature.
a{sa{sv}}
is a dict of string:a{sv}
pairs.
QMap<QString, QVariantMap>
would fit this signature.
a{oa{sa{sv}}}
is a dict of objectpath:a{sa{sv}}
pairs.
QMap<QDBusObjectPath, QMap<QString, QVariantMap>>
would fit this signature.
We should hide those angle-brackets behind some typedefs in a header file:
typedef QMap<QString, QVariantMap> InterfaceList;
typedef QMap<QDBusObjectPath, InterfaceList> ManagedObjectList;
Then declare their QMetaTypes in the same header file:
Q_DECLARE_METATYPE(InterfaceList)
Q_DECLARE_METATYPE(ManagedObjectList)
Then register them with the Qt metatype system at runtime:
qDBusRegisterMetaType<InterfaceList>();
qDBusRegisterMetaType<ManagedObjectList>();
Then we can annotate the XML:
<method name="GetManagedObjects">
<arg type="a{oa{sa{sv}}}" name="objects" direction="out" />
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="ManagedObjectList"/>
</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"/>
</signal>