Я использую библиотеку 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 или можно принять другое решение?