Проверьте, существует ли объект D-Bus
В настоящее время я разговариваю с ConsoleKit с GDBus. Я использовал XML-файлы ConsoleKit2 и gdbus-codegen
сгенерировать код. Все работает нормально. Но как я могу проверить, существует ли объект? Например, я хочу посмотреть, есть ли /org/freedesktop/ConsoleKit/Session2
(просто пример, я знаю, что могу перечислить все сеансы в объекте Seat).
Я пытался использовать org.freedesktop.DBus.Peer.Ping
функция, но это вернет
dbus-send --system --print-reply --reply-timeout=2000 --type=method_call --dest=org.freedesktop.DBus /org/freedesktop/ConsoleKit/Seat1 org.freedesktop.DBus.Peer.Ping
Error org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 1 matched rules; type="method_call", sender=":1.168" (uid=1000 pid=18279 comm="dbus-send --system --print-reply --reply-timeout=2") interface="org.freedesktop.DBus.Peer" member="Ping" error name="(unset)" requested_reply="0" destination="org.freedesktop.DBus" (bus)
1 ответ
У вас есть несколько вариантов, перечисленных в порядке от наиболее предпочтительного до наименее предпочтительного:
- Перечислите все сеансы в объекте seat, используя
GetSessions()
, - Попробуйте вызвать метод, который вы хотите на пути к объекту этого сеанса и посмотреть, если это не с ошибкой из
org.freedesktop.DBus.Error
, - Позвоните
Introspect()
метод на/org/freedesktop/ConsoleKit
и разобрать<node>
элементы из получившегося блоба XML, чтобы увидеть текущую иерархию пути объекта.
Первый вариант, вероятно, самый простой для реализации, и он предназначен для использования API-интерфейса ConsoleKit. Обратите внимание, что нумерация мест и сеансов не является детерминированной, поэтому вам не следует просто жестко кодировать путь объекта сеанса в своем коде, так как этот путь может измениться в будущих загрузках.
Также обратите внимание, что, как говорится на веб-сайте ConsoleKit, ConsoleKit не рекомендуется в пользу systemd-logind, который вы должны использовать вместо этого.