哪种方法可以在DTD D-BUS对象自省中注释复杂类型?
我正在使用Qt D-Bus库与BlueZ服务进行交互。该平台是Linux操作系统。哪种方法可以在DTD D-BUS对象自省中注释复杂类型?
我导出/组织/ bluez的/ hci0对象的DTD d-BUS对象自查,我已经添加了注解需要(见:qdbusxml2cpp unknown type)
考虑下面的XML片段:
<method name="SetDiscoveryFilter">
<arg name="properties" type="a{sv}" direction="in" />
<annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="ProperyList"/>
</method>
<signal name="PropertiesChanged">
<arg name="interface" type="s" direction="in" />
<arg name="changed_properties" type="a{sv}" direction="in" />
<arg name="invalidated_properties" type="as" direction="in" />
<annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="InvalidatedProperties"/>
</signal>
“SetDiscoveryFilter”方法中的“properties”arg与信号“PropertiesChanged”(a {sv})中的“changed_properties”arg具有相同的类型。
假设我想用两个不同的值注解“属性”和“changed_properties”参数。
在“对propertyList”在“ChangedProperties”,“changed_properties”
根据答案qdbusxml2cpp unknown type代理类需要有一个typedef限定“ProperyList”和“ChangedProperties”类型Qt的“属性”上下文。
typedef QVariantMap PropertyList;
typedef QVariantMap ChangedProperties;
Q_DECLARE_METATYPE(PropertyList)
Q_DECLARE_METATYPE(ChangedProperties)
编译时,我得到了与Q_DECLARE_METATYPE相关的“重定义”错误。事实上,在两种类型“QVariantMap”的注册中都存在问题。
哪一种处理这种情况的正确方法?我是否需要使用相同的值在DTD D-BUS Object Introspection中注释所有“a {sv}”类型?
考虑到上面的代码只是一个例子。我的Qt代码需要处理几个不同上下文中使用类型“a {sv}”参数的接口。
可以是“a {sv}”类型抽象的解决方案吗?
考虑下面的注释:
<annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="DbusQVariantMap"/>
是注释accettable或是否有可能采用不同的解决方案?
我找到的解决方案是使用单个QVariantMap typedef并定义两个额外的结构体来包装此对象。
typedef QVariantMap DBusQVariantMap;
Q_DECLARE_METATYPE(DBusQVariantMap)
struct PropertyList
{
DBusQVariantMap propertyListMap;
};
Q_DECLARE_METATYPE(PropertyList)
struct ChangedProperties
{
DBusQVariantMap changedPropertiesMap;
};
Q_DECLARE_METATYPE(ChangedProperties)
该结构被用作QVariantMap(QMap)的容器。关于DBusQVariantMap的内容的信息被详细描述为结构的名称。