2015-11-04 6 views
1

Я использую библиотеку Qt D-Bus для взаимодействия с сервисом BlueZ. Платформа - это ОС Linux.Каков правильный способ аннотировать сложные типы в объектно-ориентированном объекте DTD D-BUS?

Я экспортировал DTD D-BUS Объект интроспекции/орг/BlueZ/объекта hci0 и я добавил необходимые аннотации (см: 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> 

«Свойства» arg в методе «SetDiscoveryFilter» имеет один и тот же тип аргумента «changed_properties» в сигнале «PropertiesChanged» (a {sv}).

Предположим, я хочу аннотировать аргументы «properties» и «changed_properties» с двумя разными значениями.

«Свойства» в «PropertyList», «changed_properties» в «ChangedProperties»

Согласно ответу qdbusxml2cpp unknown type прокси-класс должен иметь ЬурейеЕ, который определяет «ProperyList» и «ChangedProperties» типы в Qt контекст.

typedef QVariantMap PropertyList; 
typedef QVariantMap ChangedProperties; 

Q_DECLARE_METATYPE(PropertyList) 
Q_DECLARE_METATYPE(ChangedProperties) 

При компиляции я получил ошибку «переопределение», связанные с Q_DECLARE_METATYPE. В самом деле, существует проблема при регистрации двух типов типа «QVariantMap».

Каков правильный способ справиться с этой ситуацией? Я должен аннотировать все типы «a {sv}» в объектной интроспекции объекта DTD D-BUS с тем же значением?

Учитывайте, что приведенный выше код является лишь примером. Мой Qt-код должен обрабатывать несколько интерфейсов, в которых аргументы типов «a {sv}» используются в нескольких разных контекстах.

Может быть абстракция «a {sv}» типа решения?

Рассмотрим следующую аннотацию:

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

ли аннотацию accettable или можно принять другое решение?

ответ

1

Решение, которое я нашел, - это использовать один тип typedef QVariantMap и определить две дополнительные структуры для обертывания этого объекта.

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 подробно описана в названии структур.