2009-03-20 6 views
2

Ich bin neu in D-Bus (und zu Python, Doppel-Whammy!) Und ich versuche herauszufinden, der beste Weg, etwas zu tun, das im Tutorial besprochen wurde.Wie erstelle ich einen D-Bus-Dienst, der mehrere Objekte dynamisch erstellt?

jedoch ein Texteditor könnte als besitzen problemlos mehrere Busnamen (zum Beispiel org.kde.KWrite in Zusätzlich zu den allgemeinen Texteditor), haben mehrere Objekte (vielleicht /org/kde/documents/4352, wo die Zahl ändert sich entsprechend der Dokument), und jedes Objekt könnte mehrere Schnittstellen wie org.freedesktop.DBus.Introspectable, org.freedesktop.BasicTextField, org.kde.RichTextDocument implementieren.

Zum Beispiel sagt, dass ich einen Wrapper um flickrapi so erstellt werden soll, dass der Dienst eine Handvoll von Flickr-API-Methoden aussetzen kann (zum Beispiel urls_lookupGroup()). Dies ist relativ einfach, wenn ich davon ausgehen möchte, dass der Dienst immer denselben API-Schlüssel angibt und dass die Authentifizierungsinformationen für alle Benutzer identisch sind, die den Dienst verwenden.

Gerade im letzteren Fall kann ich nicht wirklich davon ausgehen, dass dies wahr sein wird.

auf der Dokumentation Basierend oben zitiert, ich gehe davon aus es so etwas wie das sein sollte:

# 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') 

Also, meine Fragen:

1) Ist dies, wie diese behandelt werden sollte?

2) Wenn ja, wie weiß der Dienst, wann der Client fertig ist? Gibt es eine Möglichkeit, festzustellen, ob der aktuelle Client eine Verbindung unterbrochen hat, damit der Dienst seine dynamisch erstellten Objekte bereinigen kann? Wie würde ich die einzelnen Objekte überhaupt erstellen?

3) Wenn dies nicht so gehandhabt wird, was sind andere Vorschläge, um etwas Ähnliches zu erreichen?

Ich habe eine Reihe von D-Bus Tutorials und verschiedene Dokumentationen gelesen und über das, was mir am nächsten kommt, was ich gesucht habe, ist das, was ich oben zitiert habe. Keines der Beispiele sieht jedoch so aus, als ob ich etwas tun würde. Ich bin mir nicht sicher, wie es weitergehen soll.

Antwort

2

1) Meistens ja, ich würde nur eine Sache in der Verbindungsmethode ändern, wie ich in 2) erkläre.

2) D-Bus-Verbindungen sind nicht persistent, alles wird mit Request/Response-Nachrichten durchgeführt, es wird kein Verbindungsstatus gespeichert, es sei denn, Sie implementieren dies in dritten Objekten wie bei Ihrer flickerObject. Die d-Bus-Objekte in Python-Bindungen sind meist Proxies, die die fernen Objekte so abstrahieren, als ob sie mit ihnen "verbunden" wären. Aber sie erstellen Nachrichten basierend auf den Informationen, die Sie der D-Bus-Objekt-Instantiierung geben (Objektpfad) , Schnittstelle und so). So kann der Dienst nicht wissen, wann der Client fertig ist, wenn der Client ihn nicht mit einem anderen expliziten Aufruf ankündigt.

Um die unerwartete Client-Finalisierung zu behandeln, können Sie ein D-Bus-Objekt im Client erstellen und den Objektpfad an den Dienst senden. Ändern Sie Ihre connect-Methode, um auch einen ObjectPath-Parameter zu akzeptieren.Der Dienst kann hören NameOwnerChanged Signal zu wissen, ob ein Client gestorben ist.

Um das individuelle Objekt zu erstellen, müssen Sie nur ein Objekt im selben Dienst instanziieren wie mit Ihrer "/ Connection", aber Sie müssen sicher sein, dass Sie einen nicht existierenden Namen verwenden. Sie könnten einen "/ Connection/Manager" haben und verschiedene "/ Connection/1", "/ Connection/2" ...

3) Wenn Sie den Verbindungsstatus speichern müssen, müssen Sie etwas wie tun Das.