dbus - зарегистрировать объект для удаленного на интерфейсе NULL

Я имею дело с бинарным сервисом / сервером dbb blob, к которому мне нужно подключиться через dbus (сеанс).

Самоанализ интерфейса выглядит следующим образом (получено через gdbus-codegen). Мы регистрируем функцию на пульте, поэтому мы получаем уведомление, если на пульте получено сообщение, которое называется message_handler, Это происходит как ответ на send_message команда, которую я передаю через dbus, но это работает (и, следовательно, не показано).

В примере Java это делается с помощью

dbus_connection.exportObject("/", new DBusInterfaceDerivedClassFoo());

и показывает в bustle как (no interface) message_handler и все работает как положено.


изображение графика суеты


В голых бревнах говорят <none> вместо (no interface),

Согласно gdbus-monitor - интерфейсу `` это вызвано тем, что gdbus-monitor детектирует interface являющийся NULL

Как зарегистрировать / экспортировать объект с интерфейсом, равным NULL, используя GDBus ?

Вещи постарались пока пометить как комментарии в коде:

Код кусок:

static gchar iface_xml[] = 
"<node name='/'>"
" <interface name='bar.long.long.name.rxobj'>"
"  <method name='message_handler' >"
"   <arg type='s' direction='in'/>"
"  </method>"
"  <method name=isRemote' >"
"   <arg type='b' direction='out'/>"
"  </method>"
" </interface>"
" <interface name='org.freedesktop.DBus.Introspectable'>"
"  <method name='Introspect'>"
"   <arg type='s' direction='out'/>"
"  </method>"
" </interface>"
" <interface name='org.freedesktop.DBus.Peer'>"
"  <method name='Ping'>"
"  </method>"
" </interface>"
"</node>";

GError *error = NULL;

GDBusConnection *con = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
g_assert (!error);

GDBusNodeInfo *node_info = g_dbus_node_info_new_for_xml (iface_xml, &error);
// also tried ...de_info = NULL; // - crash, see below
g_assert (!error);

GDBusInterfaceInfo *interface_info = g_dbus_node_info_lookup_interface (node_info,
                              "bar.long.long.name.rxobj");
// also tried ...okup_interface (node_info, NULL); - obviously wrong
g_assert (interface_info);

guint id = g_dbus_connection_register_object (con,
                  (const gchar*)"/",

             // also tried node_info->interfaces[0]
             // also tried "" - crash
             // also tried "\0" - crash
             // also tried NULL - assert failure
                  interface_info,

                  &vtable, /*we never enter any of the callbacks*/
                  NULL,/*user_data*/
                  (GDestroyNotify)NULL,
                  &error);
g_assert (!error);

GMainLoop *loop = g_main_loop_new (...);
g_main_loop_run (loop);
...

Независимо от того, что я прокомментировал, я даже не вводил обратные вызовы, указанные в vtable,

Заранее спасибо за любые советы.

Дополнительная информация: Насколько я могу сказать, пульт использует qtdbus, если это имеет значение.

1 ответ

Решение

Речь идет не об экспорте интерфейса с интерфейсом NULL (не охватываемым спецификацией), а о том, что сервис / сервер фактически обрабатывает такой вызов должным образом.

Это еще не было реализовано в gdbus, подана ошибка (включая патч) https://bugzilla.gnome.org/show_bug.cgi?id=706675

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