Como faço para criar um serviço D-Bus que dinamicamente cria vários objetos?

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

  •  21-08-2019
  •  | 
  •  

Pergunta

Eu sou novo para D-Bus (e Python, duplo golpe!) E eu estou tentando descobrir a melhor maneira de fazer algo que foi discutido no tutorial.

No entanto, um aplicativo editor de texto poderia facilmente possuir vários nomes de ônibus (Por exemplo, em org.kde.KWrite Além TextEditor genérico), tem vários objetos (talvez / org / KDE / documentos / 4352, onde o alterações número de acordo com o documento), e cada objecto poderia implementar várias interfaces, tais como org.freedesktop.DBus.Introspectable, org.freedesktop.BasicTextField, org.kde.RichTextDocument.

Por exemplo, digamos que eu quero criar um invólucro em torno flickrapi de tal forma que o serviço pode expor um punhado de métodos Flickr API (digamos, urls_lookupGroup()). Este é relativamente simples, se eu quiser assumir que o serviço será sempre especificar a mesma chave de API e que a informação de autenticação será o mesmo para todos a utilizar o serviço.

Especialmente neste último caso, eu realmente não posso assumir esta será verdade.

Com base na documentação citada acima, eu estou supondo que deve haver algo como isto:

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

Então, minhas perguntas:

1) É assim que isso deve ser tratado?

2) Em caso afirmativo, como é que o serviço de saber quando o cliente é feito? Existe uma maneira de detectar se o cliente atual tem quebrado conexão para que o serviço possa limpeza seus objetos criados dinamicamente? Além disso, como eu iria criar os objetos individuais em primeiro lugar?

3) Se isto não é como isso deve ser tratado, quais são algumas outras sugestões para realizar algo semelhante?

Eu li através de uma série de tutoriais D-Bus e vários documentos e sobre o mais próximo que eu vim para ver o que eu estou procurando é o que eu citei acima. No entanto, nenhum dos exemplos olhar para realmente fazer algo como isso, então eu não tenho certeza de como proceder.

Foi útil?

Solução

1) Na maior parte sim, eu só iria mudar uma coisa no método de conexão como eu explicar em 2).

2) conexões D-Bus não são persistentes, tudo é feito com mensagens de pedido / resposta, nenhum estado conexão é armazenada a menos que você implementar isso em objetos terceiros como você faz com o seu flickerObject. Os objetos d-ônibus em vínculos python são principalmente proxies que abstraem os objetos remotos como se estivesse "ligada" para eles, mas o que ele realmente faz é a mensagens de compilação com base nas informações que você dá a D-Bus objeto instanciação (caminho do objeto , interface e assim). Portanto, o serviço não pode saber quando o cliente é feito se o cliente não anuncie isso com outra chamada explícita.

Para lidar com finalização cliente inesperada você pode criar um objeto de D-Bus no cliente e enviar o caminho do objeto para o serviço durante a conexão, alterar o método de connect a aceitar também um parâmetro ObjectPath. O serviço pode ouvir NameOwnerChanged sinal para saber se um cliente morreu.

Para criar o objeto individual você só tem que instanciar um objeto no mesmo serviço que você faz com seu "/ Connection", mas você tem que ter certeza que você está usando um nome que não existe. Você poderia ter um "/ Conexão / Manager", e vários "/ Conexão / 1", "/ Conexão / 2" ...

3) Se você precisa armazenar o estado da conexão, você tem que fazer algo assim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top