哪种是在DTD D-BUS对象内省中注释复杂类型的正确方法?

时间:2015-11-04 09:19:29

标签: qt dbus bluez

我正在使用Qt D-Bus库与BlueZ服务进行交互。该平台是Linux OS。

我导出了/ org / 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。

假设我想用两个不同的值来注释“properties”和“changed_properties”args。

中的“property”,“ChangedProperties”中的“changed_properties”

根据答案qdbusxml2cpp unknown type,代理类需要有一个typedef,它在Qt上下文中定义“ProperyList”和“ChangedProperties”类型。

typedef QVariantMap PropertyList;
typedef QVariantMap ChangedProperties;

Q_DECLARE_METATYPE(PropertyList) 
Q_DECLARE_METATYPE(ChangedProperties)

编译时,我遇到了与Q_DECLARE_METATYPE相关的“重新定义”错误。实际上,在“QVariantMap”类型的两种类型的注册中存在问题。

处理这种情况的正确方法是什么?我是否要使用相同的值来注释DTD D-BUS对象内省中的所有“a {sv}”类型?

考虑上面的代码只是一个例子。我的Qt代码需要处理几个接口,其中类型“a {sv}”的参数在几个不同的上下文中使用。

可以抽象出“a {sv}”类型的解决方案吗?

考虑以下注释:

<annotation name="org.qtproject.QtDBus.QtTypeName.In0"  value="DbusQVariantMap"/>

注释是否可以接受或是否可以采用不同的解决方案?

1 个答案:

答案 0 :(得分:1)

我发现的解决方案是使用单个QVariantMap typedef并定义两个额外的struct来包装此对象。

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内容的信息详细说明了结构的名称。