¿Cómo se crea un servicio de D-Bus que crea dinámicamente varios objetos?

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

  •  21-08-2019
  •  | 
  •  

Pregunta

Soy nuevo en D-Bus (y Python, doble golpe!) Y estoy tratando de averiguar la mejor manera de hacer algo que se discutió en el tutorial.

  

Sin embargo, una aplicación de edición de texto   podría poseer la misma facilidad con múltiples nombres de autobús   (Por ejemplo, org.kde.KWrite en   Además de TextEditor genérico), tienen   varios objetos (tal vez   / org / kde / documentos / 4352 donde el   número cambia de acuerdo con el   documento), y cada objeto podría   implementar múltiples interfaces, tales como   org.freedesktop.DBus.Introspectable,   org.freedesktop.BasicTextField,   org.kde.RichTextDocument.

Por ejemplo, digamos que quiero crear una envoltura alrededor de flickrapi tal que el servicio puede exponer a un puñado de métodos de la API de Flickr (por ejemplo, urls_lookupGroup()). Esto es relativamente sencillo si quiero suponer que el servicio siempre se especifica la misma clave de API y que la información de autenticación será el mismo para todo el mundo el uso del servicio.

Especialmente en este último caso, en realidad no puedo supongo que esto será cierto.

Sobre la base de la documentación citada anteriormente, estoy asumiendo que no debería ser algo como esto:

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

Por lo tanto, mis preguntas:

1) ¿Es así como deben realizar esto?

2) Si es así, ¿cómo sabrá el servicio cuando se realiza el cliente? ¿Hay una manera de detectar si el cliente actual ha roto la conexión para que el servicio puede limpiar sus objetos creados de forma dinámica? Además, ¿cómo iba a crear los objetos individuales en el primer lugar?

3) Si no es así como deben realizar esto, ¿cuáles son algunas otras sugerencias para lograr algo similar?

He leído a través de una serie de tutoriales de D-Bus y diversa documentación y lo más cercano que he llegado a ver lo que yo estoy buscando es lo que he citado anteriormente. Sin embargo, ninguno de los ejemplos mirar a hacer realmente nada como esto así que no estoy seguro de cómo proceder.

¿Fue útil?

Solución

1) Claro que sí, me gustaría cambiar sólo una cosa en el método connect como explico en 2).

2) conexiones D-Bus no son persistentes, todo se hace con los mensajes de petición / respuesta, ningún estado de conexión se almacena a menos que implemente esto en terceros objetos como lo hace con su flickerObject. Los objetos de D-Bus en enlaces Python son en su mayoría proxies que abstraer los objetos remotos como si estuviera "conectado" a ellos, pero lo que realmente hace es construir mensajes en función de la información que proporcione a D-Bus objeto de instancias (ruta del objeto , interfaz y así). Por lo que el servicio no puede saber cuando el cliente se lleva a cabo si el cliente no anuncia con otra llamada explícita.

Para hacer frente a la finalización inesperada cliente puede crear un objeto D-Bus en el cliente y enviar la ruta del objeto al servicio cuando la conexión, cambiar su connect método para aceptar también un parámetro ObjectPath. El servicio puede escuchar a NameOwnerChanged señal para saber si un cliente ha muerto.

Para crear el objeto individual es suficiente con crear una instancia de un objeto en el mismo servicio que usted hace con su "/ conexión", pero hay que estar seguro de que está utilizando un nombre inexistente. Usted podría tener un "/ Conexión / Manager", y varios "/ Conexión / 1", "/ Conexión / 2" ...

3) Si necesita almacenar el estado de conexión, lo que tiene que hacer algo así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top