Come faccio a creare un servizio D-Bus che crea dinamicamente più oggetti?
Domanda
Sono nuovo di D-Bus (e per Python, doppio smacco!) E sto cercando di capire il modo migliore per fare qualcosa che è stato discusso nel tutorial.
Tuttavia, un editor di testo potrebbe facilmente possedere più nomi di bus (Per esempio, in org.kde.KWrite Oltre a TextEditor generico), hanno più oggetti (forse / org / kde / documenti / 4352 in cui il numero cambia a seconda del documento), e ciascun oggetto potrebbe implementare più interfacce, come org.freedesktop.DBus.Introspectable, org.freedesktop.BasicTextField, org.kde.RichTextDocument.
Per esempio, diciamo che voglio creare un wrapper flickrapi
in modo tale che il servizio può esporre una manciata di metodi API di Flickr (per esempio, urls_lookupGroup()
). Questo è relativamente semplice se voglio supporre che il servizio sarà sempre specificando la stessa chiave API e che le informazioni di autenticazione sarà la stessa per tutti utilizzare il servizio.
In particolare in quest'ultimo caso, non posso davvero Presumo che ciò sarà vero.
Sulla base della documentazione sopra citata, io parto dal presupposto ci dovrebbe essere qualcosa di simile:
# 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')
Quindi, le mie domande:
1) E 'questo come questo dovrebbe essere gestita?
2) In caso affermativo, in che modo il servizio di sapere quando il cliente è fatto? Esiste un modo per rilevare se il cliente attuale ha rotto connessione in modo che il servizio può pulizia suoi oggetti creati in modo dinamico? Inoltre, come faccio a creare i singoli oggetti in primo luogo?
3) Se questo non è come questo dovrebbe essere gestito, quali sono alcuni altri suggerimenti per realizzare qualcosa di simile?
Ho letto attraverso una serie di tutorial D-Bus e documentazione varia e circa il più vicino Sono venuto a vedere quello che sto cercando è quello che ho citato sopra. Tuttavia, nessuno degli esempi guardare a che fare in realtà nulla di simile quindi non sono sicuro di come procedere.
Soluzione
1) Per lo più sì, vorrei cambiare solo una cosa al metodo connect come spiego in 2).
2) connessioni D-Bus non sono persistenti, tutto è fatto con i messaggi di richiesta / risposta, nessuno stato di connessione viene archiviato a meno che non si implementa questa negli oggetti terze come si fa con il vostro flickerObject
. Gli oggetti d-autobus in binding Python sono per lo più i proxy che astratta gli oggetti remoti come se si fosse "connesso" a loro, ma ciò che realmente fa è quello di costruire i messaggi in base alle informazioni che date a D-Bus di istanze di oggetti (percorso dell'oggetto , l'interfaccia e così). Quindi il servizio non può sapere quando il cliente è fatto se il client non annuncia con altra chiamata esplicita.
Per gestire finalizzazione cliente inatteso è possibile creare un oggetto di D-Bus nel client e inviare il percorso dell'oggetto per il servizio durante il collegamento, modificare il metodo di connect
di accettare anche un parametro ObjectPath
. Il servizio può ascoltare la NameOwnerChanged
del segnale per sapere se un cliente è morto.
Per creare l'oggetto individuo è sufficiente creare un'istanza di un oggetto nello stesso servizio come fate con il vostro "/ Connection", ma bisogna essere sicuri che si sta utilizzando un nome inesistente. Si potrebbe avere un "/ Connection / Manager", e vari "/ Collegamento / 1", "/ Collegamento / 2" ...
3) Se avete bisogno di memorizzare lo stato della connessione, si deve fare una cosa del genere.