哪种方法可以在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的内容的信息被详细描述为结构的名称。