Comment puis-je créer un service D-Bus qui crée dynamiquement plusieurs objets?

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

  •  21-08-2019
  •  | 
  •  

Question

Je suis nouveau à D-Bus (et Python, double coup dur!) Et je suis en train de trouver la meilleure façon de faire quelque chose qui a été discuté dans le tutoriel.

  

Cependant, une application éditeur de texte   pourrait aussi facilement posséder plusieurs noms de bus   (Par exemple, dans org.kde.KWrite   Outre TextEditor générique), ont   plusieurs objets (peut-être   / org / kde / documents / 4352 où la   nombre change en fonction de la   document), et chaque objet pourrait   implémenter plusieurs interfaces, telles que   org.freedesktop.DBus.Introspectable,   org.freedesktop.BasicTextField,   org.kde.RichTextDocument.

Par exemple, que je veux créer une enveloppe autour de telle sorte que le flickrapi service peut exposer une poignée de méthodes API Flickr (par exemple, urls_lookupGroup()). Ceci est relativement simple si je veux supposer que le service sera toujours spécifiera la même clé API et que les informations auth sera le même pour tous les utilisateurs du service.

En particulier, dans ce dernier cas, je ne peux pas vraiment supposer que ce sera vrai.

D'après les documents cités ci-dessus, je suppose qu'il devrait y avoir quelque chose comme ceci:

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

Alors, mes questions:

1) Est-ce comment cela doit être traité?

2) Si oui, comment le service savoir quand le client se fait? Y at-il un moyen de détecter si le client actuel a connexion cassé afin que le service puisse nettoyage ses objets créés dynamiquement? En outre, comment pourrais-je créer les objets individuels en premier lieu?

3) Si ce n'est pas comment cela doit être traité, quels sont d'autres suggestions pour accomplir quelque chose de similaire?

J'ai lu un certain nombre de tutoriels D-Bus et divers documents et sur le plus proche que je suis venu à voir ce que je cherche est ce que je citais ci-dessus. Cependant, aucun des exemples regarder réellement faire quelque chose comme ça, donc je ne suis pas sûr de savoir comment procéder.

Était-ce utile?

La solution

1) La plupart du temps oui, je ne changer une chose dans la méthode de connexion comme je l'explique dans 2).

2) connexions D-Bus ne sont pas persistants, tout est fait avec des messages de requête / réponse, pas d'état de connexion est stocké à moins que vous implémenter dans tiers des objets comme vous le faites avec votre flickerObject. Les objets d-bus dans les liaisons python sont pour la plupart des procurations qui font abstraction des objets distants comme si vous étiez « connecté » à eux, mais ce qu'il fait vraiment est de construire des messages en fonction des informations que vous donnez à l'objet D-Bus instanciation (chemin de l'objet , l'interface et ainsi). Ainsi, le service ne peut pas savoir quand le client se fait si le client n'annonce pas avec d'autres appel explicite.

Pour gérer la finalisation client inattendu vous pouvez créer un objet D-Bus dans le client et envoyer le chemin de l'objet au service lors de la connexion, changez votre méthode pour accepter également connect un paramètre ObjectPath. Le service peut écouter NameOwnerChanged signal pour savoir si un client est décédé.

Pour créer l'objet individuel vous suffit d'instancier un objet dans le même service que vous faites avec votre « / Connexion », mais vous devez être sûr que vous utilisez un nom de unexisting. Vous pourriez avoir un "/ Connexion / Manager", et divers "/ Connexion / 1", "/ Connexion / 2" ...

3) Si vous devez stocker l'état de connexion, vous devez faire quelque chose comme ça.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top