どのように私は動的に複数のオブジェクトを作成し、D-バスサービスを作成するのですか?
質問
私はD-Busへの新たなんだ(とPython、ダブルパンチに!)と私は、チュートリアルで説明しました何かを行うための最善の方法を把握しようとしています。
ただし、テキストエディタアプリケーション 簡単に複数のバス名を所有することができ で(例えば、org.kde.KWrite 一般的なテキストエディタに加えて)、持っています 複数のオブジェクト(多分 / ORG / KDE /文書/ 4352 数は、に応じて変化します 文書)、および各オブジェクトができ などの複数のインターフェースを実装 org.freedesktop.DBus.Introspectable、 org.freedesktop.BasicTextField、 org.kde.RichTextDocumentます。
たとえば、私はサービスはFlickrのAPIメソッド(たとえば、flickrapi
)の一握りを公開することができるようなurls_lookupGroup()
のラッパーを作成したいと言います。私はサービスが常に同じAPIキーを指定し、認証情報は、サービスを利用して皆のための同じであることをされると仮定したい場合、これは比較的簡単です。
特に後者の場合には、私は本当にこれが本当だろうと想定することはできません。
上記の引用された文書に基づいて、私はこのような何かがあるはずと仮定しています:
# Get the connection proxy object.
flickrConnectionService = bus.get_object("com.example.FlickrService",
"/Connection")
# Ask the connection object to connect, the return value would be
# maybe something like "/connection/5512" ...
flickrObjectPath = flickrConnectionService.connect("MY_APP_API_KEY",
"MY_APP_API_SECRET",
flickrUsername)
# Get the service proxy object.
flickrService = bus.get_object("com.example.FlickrService",
flickrObjectPath);
# As the flickr service object to get group information.
groupInfo = flickrService.getFlickrGroupInfo('s3a-belltown')
だから、私の質問:
1)、これはどのように処理すべきか、このですか?
2)もしそうなら、クライアントが実行されたときにどのようにサービスを知っているのだろうか?現在のクライアントがそのようにサービス缶のクリーンアップその動的に作成されたオブジェクトの接続が壊れているかどうかを検出する方法はありますか?また、どのように私は最初の場所で個々のオブジェクトを作成するのでしょうか?
3)これがない場合には、これはどのように処理すべきか、似たような達成するためのいくつかの他の提案は何ですか?
私はD-バスチュートリアルや様々なドキュメントの数を読んで、私は私が上に引用するものです探しています何を見に来て最も近いに関するましました。しかし、例のどれもが、実際にこのように私は続行するかどうかはわからないようなものをやって探す必要はありません。
解決
1)主に、はい、私はのみ)connectメソッドに一つのことを変更します。
2)D-BUS接続は永続的ではありません。、すべてが要求/応答メッセージで行われ、あなたのflickerObject
でそうであるように、あなたが第三のオブジェクトでこれを実装していない限り、何も接続状態が保存されません。 PythonバインディングでD-BUSオブジェクトは、主に、あなたが彼らに「接続」しているかのようにリモートオブジェクト抽象的、しかし何それは本当にありませんが、あなたはD-BUSオブジェクトのインスタンス化(オブジェクトのパスに与える情報に基づいてメッセージを構築することであるとプロキシされています、インタフェースなど)。だから、サービスは、クライアントが他の明示的な呼び出しでそれを発表していない場合、クライアントが実行されたときに知ることができません。
あなたがクライアントにD-BUSオブジェクトを作成して接続する際に、またconnect
パラメータを受け入れるようにあなたのObjectPath
方法を変更サービスへのオブジェクトパスを送ることができます予期しないクライアントファイナライズを処理するには。サービスは、クライアントが死亡したかどうかを知るの NameOwnerChanged
の信号を聞くことができます。
個々のオブジェクトを作成するには、唯一のあなたの「/接続」を行うのと同じサービス内のオブジェクトをインスタンス化する必要がありますが、あなたはunexisting名前を使用していることを確認する必要があります。あなたは "/接続/マネージャー" を持って、そして可能性があり、様々な "/接続/ 1"、 "/接続/ 2" ...
あなたは、接続の状態を保存する必要がある場合は、3)、あなたはそのような何かをする必要があります。