2017-10-05 7 views
0

現在、GDBusを使用してConsoleKitと対話しています。私はConsoleKit2 XMLファイルとgdbus-codegenを使用してコードを生成しました。すべてがうまくいきます。しかし、オブジェクトが存在するかどうかをどのように確認できますか?たとえば、/org/freedesktop/ConsoleKit/Session2があるかどうかを確認したいとします(例として、Seatオブジェクトのすべてのセッションを列挙できることはわかります)。D-Busオブジェクトが存在するか確認してください。

私は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

を返します。あなたが好ましく、最も好ましいものから順にリストされているいくつかのオプション、少なくともする必要があります。席内のすべてのセッション

  1. 列挙をオブジェクトはGetSessions()を使用しています。
  2. そのセッションのオブジェクトパスで必要なメソッドを試して呼び出し、エラーが発生して失敗したかどうかをorg.freedesktop.DBus.Errorから確認します。
  3. /org/freedesktop/ConsoleKitIntrospect()メソッドを呼び出し、結果のXMLブロブから<node>要素を解析して、現在のオブジェクトパス階層を確認します。

第1のオプションはおそらく最も簡単に実装でき、ConsoleKit APIの使用方法です。シートとセッションの番号付けは確定的ではないので、コード内でセッションオブジェクトパスをハードコードするだけでなく、そのパスが将来のブート時に変更される可能性があることに注意してください。

ConsoleKit websiteのように、ConsoleKitの代わりにsystemd-logindを使用することをお勧めします。代わりに使用することを検討する必要があります。

+0

ありがとうございました。アイデアナンバー2も私の心の中に来ましたが、私はそれが醜いと思った。次に、それは1になります。私はその決定的ではないことを知っています、私は例としてハードコードされたパスを使用しました。私はlogindがこれを行うための新しい方法であることも知っています。アプリケーションの次のステップはlogindサポートになりますが、一部のディストリビューションではまだconsolekitを使用しています(例えばGentoo LinuxでもConsolekitを使用できます)。ありがとうございました。 – Nidhoegger

関連する問題