LINUX.ORG.RU

[libdbus] Как узнать какие объекты есть у сервиса и какие интерфейсы есть у этих объектов?


0

0

Допустим qdbusviewer позволяет это смотреть, но читать его исходники, а дальше исходники Qt не совсем то что хочется, хотя как вариант... Нужно узнать именно средствами сишного libdbus. Может я что-то пропустил, очевидное, но на ум приходит только получить интроспекцию, но там нет полного пути нодами? Наверное просто нужно выспаться, но если кто знает точный ответ - прошу отписаться.

★★★

Такс, прочитал спеки и уяснил что всё это должно быть в интроспекции. Но ёкарный бабай, сервисы возвращают одну интроспекцию, а qdbusviewer показывает другое, с путями которые я не пойму откуда берутся:)
Пример:
сервис имеет внутри путь org/gnome/vino/screens/0
И уже внутри этого пути располагаются интерфейсы org.freedesktop.DBus.Introspectable и org.gnome.VinoScreen.
Так показывается qdbusviewer. Но если вызвать с помощью этого же qdbusviewer метод Introspect, то он возвращает:
"<!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="org.freedesktop.DBus.Introspectable"> <method name="Introspect"> <arg name="data" direction="out" type="s"/> </method> </interface> <interface name="org.gnome.VinoScreen"> <method name="GetServerPort"> <arg name="port" direction="out" type="u"/> </method> <signal name="ServerPortChanged"> </signal> </interface> </node> "}
Что-то странное однако:)

ixrws ★★★
() автор топика
Ответ на: комментарий от ixrws

Всем спасибо - разобрался. Оказывается qdbusviewer просто не упоминает о том что вызывает Introspect для корня изначально. А интроспект отдаёт вот это:
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<node name="org"/>
</node>
Ну и далее по цепочке делается также для org и тд.
Правда одного я так и не понял, почему в возвращаемой интроспекции не указывается интерфейс org.freedesktop.DBus.Introspectable , ведь он фактически реализуется, это разве не "касяк" ?:)

ixrws ★★★
() автор топика
Ответ на: комментарий от ixrws

> Правда одного я так и не понял, почему в возвращаемой интроспекции не указывается интерфейс org.freedesktop.DBus.Introspectable , ведь он фактически реализуется, это разве не "касяк" ?:)

Косяк. Но тем не менее, никто не заставляет разработчика реализовывать org.freedesktop.DBus.Introspectable, а уж тем более указывать все методы/интерфейсы (тем более, если какие-либо из них по тем или иным причинам нужно скрыть). Да и в любом случае qtdbusviewer попытается вызвать Introspect, вне зависимости от того, говорит ли объект, что поддерживает его или нет.

Я спецификацию D-BUS читал давно, но мне кажется, что реализация Introspectable — чисто для удобства: если знать метод и его параметры, его можно вызвать безо всякой интроспекции :-)

> Оказывается qdbusviewer просто не упоминает


Как это не упоминает? Попробуйте натравить qtdbusviewer на объект, не реализующий org.freedesktop.DBus.Introspectable:

Error: Call to object / at blah.blah.blah: org.freedesktop.DBus.Error.NoReply (Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.) failed

Если в приложение добавить отладку (туда, где выполняется dbus_connection_pop_message()):

const char* interface = dbus_message_get_interface(msg);
const char* member = dbus_message_get_member(msg);
const char* path = dbus_message_get_path(msg);

и вывести значения на экран/в лог, то будет видно, где и что вызывается.

В моём случае, например, было так:

Interface: org.freedesktop.DBus Member: NameAcquired Path: /org/freedesktop/DBus
Interface: org.freedesktop.DBus Member: NameAcquired Path: /org/freedesktop/DBus
Interface: org.freedesktop.DBus.Introspectable Member: Introspect Path: /
Interface: org.freedesktop.DBus.Introspectable Member: Introspect Path: /blah

Первые два — это, я так понимаю, результат dbus_bus_request_name(), последние два — это от qtdbusviewer. Причем если имя на шине blah.blahblah.blahblahblah, то сначала Introspect будет вызван на /, потом на blah.

sjinks ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.