Как проверить свойство D-Bus при использовании скелета gdbus-codegen

Я создаю сервис на D-Bus, используя gdbus а также gdbus-codegen,

Самоанализ это:

<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
                      "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
  <interface name="com.example.foo">

    <property name="Bar" type="s" access="readwrite" />

  </interface>
</node>

Я исполняю gdbus-codegen как это:

gdbus-codegen --interface-prefix com.example --generate-c-code=foo foo.xml

И мой main.cpp выглядит так:

#include <iostream>

#include "foo.h"

void OnBarChanged(GObject * gobject, GParamSpec * pspec, gpointer user_data)
{
  std::cout << "Bar: " << foo_get_bar((Foo *)gobject) << std::endl;
}

void OnBusNameAquired(GDBusConnection * connection,
                      const gchar *     name,
                      gpointer          user_data)
{
  Foo * foo = foo_skeleton_new();

  g_signal_connect(foo, "notify::bar", G_CALLBACK(&OnBarChanged), NULL);

  g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(foo),
                                   connection,
                                   "/com/example/foo",
                                   NULL);
}

int main()
{
  std::cout << "Testing DBus properties" << std::endl;

  GMainLoop * loop;
  loop = g_main_loop_new(NULL, FALSE);
  g_bus_own_name(G_BUS_TYPE_SESSION,
                 "com.example.foo",
                 G_BUS_NAME_OWNER_FLAGS_NONE,
                 NULL,
                 OnBusNameAquired,
                 NULL,
                 NULL,
                 NULL);
  g_main_loop_run(loop);
  return 0;
}

Это работает, как и ожидалось, и я могу установить и получить свойства, используя:

gdbus call --session --dest com.example.foo --object-path /com/example/foo --method org.freedesktop.DBus.Properties.Set "com.example.foo" "Bar" "<'baz'>"

а также

gdbus call --session --dest com.example.foo --object-path /com/example/foo --method org.freedesktop.DBus.Properties.Get "com.example.foo" "Bar"
(<'baz'>,)

Эта проблема:

Я хочу проверить правильность установки свойства и иметь возможность вернуть ошибку, если она не удалась. Как это можно сделать с помощью gdbus-codegenсгенерированный код?

PS:

Код просачивается и, как правило, не готов к работе. Я в порядке с этим сейчас:-)

редактировать

После продолжающихся исследований кажется, что свойства D-Bus используют GObject свойство объекта Можно ли установить пользовательский валидатор, когда все это настроено gdbus-codegen-код?

1 ответ

Подключиться к GDBusInterfaceSkeleton::g-authorize-method сигнал от вашего foo скелет. Ваш обратный вызов будет вызываться для каждого вызова метода D-Bus, обработанного вашим экспортированным объектом - вы можете сопоставить на org.freedesktop.DBus.Properties.Set звонки и сделать проверку затем.

Вот пример этого (для произвольных вызовов методов, а не для установки свойства D-Bus; но принцип тот же) в flatpak: https://github.com/flatpak/flatpak/blob/c915f73b41688a7dc2ec7f0ab2fbcf1a7c738841/system-helper/flatpak-system-helper.c#L1192

Другие вопросы по тегам