はじめに
ソフトウェアをメンテナンスしていると、バージョンアップにともないAPI等が変更になることがあります。 今回は、アプリケーションが対応しているDBusのインターフェースの変更に追従するやりかたを紹介します。
DBusのインターフェースの変更に気づいたきっかけ
問題に気づいたきっかけは、#955899 growl-for-linux: Depends on deprecated dbus-glibというバグ報告でした。
バグ報告で言及されているgrowl-for-linuxは、Growl Notification Transport Protocolを使う通知アプリケーションです。 アプリケーションで使っているライブラリーであるdbus-glibが非推奨になっているというのが報告されていました。
growl-for-linuxはRhythmboxのプラグインがあり、音楽を再生するときにgrowl-for-linux経由で通知できます。 バグを修正するためにdbus-glibからGDBusへ移行する際に、このプラグインが動作しなくなっていることがわかりました。 その原因がDBusのインターフェースの変更だったのです。
D-Feetを使って問題を特定する
D-FeetはDBusのデバッガでシステムバスやセッションバスの情報を表示できます。
動作しなくなっていたプラグインは次の条件を前提としていました。
-
セッションバスのバス名は org.gnome.Rhythmbox
-
Rhythmboxのオブジェクトパスは /org/gnome/Rhythmbox/Shell と /org/gnome/Rhythmbox/Player
-
オブジェクトパス /org/gnome/Rhythmbox/Player の getPlayingUri で再生中の曲のパスを取得する
-
オブジェクトパス /org/gnome/Rhythmbox/Shell の getSongProperties で再生中の曲のプロパティを取得する
一方、D-FeetでRhythmbox(バージョンは3.4.4)をみてみると次のことがわかりました。
-
セッションバスのバス名は org.gnome.Rhythmbox3 (Rhythmbox3に変わっている)
-
Rhythmboxのオブジェクトパスは /org/mpris/MediaPlayer2 1
-
オブジェクトパス /org/mpris/MediaPlayer2 の PlaybackStatus プロパティで再生状態を取得する
-
オブジェクトパス /org/mpris/MediaPlayer2 の Metadata プロパティで曲のメタ情報を取得する 2
したがって、上記のとおりD-Busのインターフェースに対してアクセスしている箇所を移植することで動作するようになりました。
修正内容は Use GDBus instead of deprecated dbus-glib としてupstreamにもフィードバックしています。
まとめ
今回は、アプリケーションが対応しているDBusのインターフェースの変更に追従するやりかたを紹介しました。3 もし、DBusのインターフェースの変更に対応することになったら参考にしてみてください。