2

私はD-Bus(およびPython、ダブルワーミー!)を初めて使用し、チュートリアルで説明したことを実行するための最良の方法を見つけようとしています。

ただし、テキストエディタアプリケーションは、複数のバス名(たとえば、汎用TextEditorに加えてorg.kde.KWrite)を簡単に所有し、複数のオブジェクト(おそらく、ドキュメントに応じて番号が変わる/ org / kde / document / 4352)を持つことができます。 )、各オブジェクトは、org.freedesktop.DBus.Introspectable、org.freedesktop.BasicTextField、org.kde.RichTextDocumentなどの複数のインターフェースを実装できます。

たとえばflickrapi、サービスが少数のFlickr APIメソッドを公開できるようにラッパーを作成したいとします(たとえば、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-Busチュートリアルとさまざまなドキュメントを読み、私が探しているものを見るのに最も近いものについては、上記で引用したものです。ただし、どの例も実際にはこのようなことをしているようには見えないので、どのように進めるかはわかりません。

4

1 に答える 1

2

1)ほとんどの場合、2)で説明したように、connectメソッドで変更するのは1つだけです。

2)D-Bus接続は永続的ではなく、すべてが要求/応答メッセージで実行されます。これを3番目のオブジェクトに実装しない限り、接続状態は保存されませんflickerObject。Pythonバインディングのd-busオブジェクトは、ほとんどの場合、リモートオブジェクトに「接続」されているかのように抽象化するプロキシですが、実際には、D-Busオブジェクトのインスタンス化(オブジェクトパス)に提供する情報に基づいてメッセージを作成します。 、インターフェースなど)。したがって、クライアントが他の明示的な呼び出しでアナウンスしない場合、サービスはクライアントがいつ完了したかを知ることができません。

予期しないクライアントのファイナライズを処理するには、クライアントでD-Busオブジェクトを作成し、接続時にオブジェクトパスをサービスに送信しconnect、パラメーターも受け入れるようにメソッドを変更しObjectPathます。サービスはシグナルをリッスンしてNameOwnerChanged、クライアントが死亡したかどうかを知ることができます。

個々のオブジェクトを作成するには、「/ Connection」を使用する場合と同じサービスでオブジェクトをインスタンス化するだけですが、存在しない名前を使用していることを確認する必要があります。「/Connection/ Manager」、およびさまざまな「/ Connection / 1」、「/ Connection/2」を使用できます。

3)接続状態を保存する必要がある場合は、そのようなことを行う必要があります。

于 2009-03-22T20:17:20.613 に答える