Come faccio a creare un servizio D-Bus che crea dinamicamente più oggetti?

StackOverflow https://stackoverflow.com/questions/667760

  •  21-08-2019
  •  | 
  •  

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top