Как аннотировать XML-файл с помощью org.gtk.GDBus.C.ForceGVariant, используя gdbus-codegen - PullRequest
1 голос
/ 27 апреля 2019

Я пытаюсь аннотировать xml-файл, чтобы dbus-codegen генерировал метод, который использует GVariant * вместо нативного типа, такого как gchar.

Вот код xml, с которым я работаю.

<node>
  <interface name="org.bluez.GattCharacteristic1">
    <method name="WriteValue">

        <arg name="value" type="ay" direction="in"/>

    </method>
  </interface>
</node>

Я прочитал следующий пост stackoverflow:

Отправка байтового массива (типа `ay`) по D-Bus с использованием GDBus

Прочитав этот пост, я попробовал следующее:

1) Отредактируйте XML-файл, добавив аннотации

<node>
  <interface name="org.bluez.GattCharacteristic1">
    <method name="WriteValue">
      <annotation name="org.gtk.GDBus.C.ForceGVariant" value="true">
        <arg name="value" type="ay" direction="in"/>
      </annotation>
    </method>
  </interface>
</node>

затем выполните:

gdbus-codegen --interface-prefix org.bluez --c-generate-object-manager --generate-c-code generated-code org.bluez.xml

Это не сгенерировало то, что я хотел.

2) Используйте ключ --annotate на gdbus-codegen:

gdbus-codegen --annotate "org.bluez.GattCharacteristic1.WriteValue()" org.gtk.GDBus.C.ForceGVariant true --interface-prefix org.bluez --c-generate-object-manager --generate-c-code generated-code org.bluez.xml

Это не сгенерировало то, что я хотел.

Единственный способ добиться успеха - поменять «ay» в следующем коде на «a (y):

    <annotation name="org.gtk.GDBus.C.ForceGVariant" value="true">
    <arg name="value" type="a(y)" direction="in"/>
    </annotation>'

Однако это вызывает другие проблемы.

Итак, как мне получить метод WriteValue со следующим объявлением:

    gboolean gatt_characteristic1_call_write_value_sync
    (GattCharacteristic1 *proxy,
    GVariant *arg_value,
    GCancellable *cancellable,
    GError **error)

вместо:

    gboolean gatt_characteristic1_call_write_value_sync (
    GattCharacteristic1 *proxy,
    const gchar *arg_value,
    GCancellable *cancellable,
    GError **error)

Может кто-нибудь сказать мне, что я делаю не так.

спасибо.

1 Ответ

0 голосов
/ 28 апреля 2019

Как указано в разделе спецификации D-Bus для формата данных самоанализа , вам необходимо использовать <annotation> в качестве самозакрывающегося элемента, а не окружать элемент <arg>.

Итак, вы хотите:

<node>
  <interface name="org.bluez.GattCharacteristic1">
    <method name="WriteValue">
      <arg name="value" type="ay" direction="in">
        <annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
      </arg>
    </method>
  </interface>
</node>

Вы можете также увидеть примеры этого в исходном коде GLib .

...