2009-03-20 5 views
2

Je suis nouveau à D-Bus (et à Python, double whammy!) Et j'essaie de trouver la meilleure façon de faire quelque chose qui a été discuté dans le tutoriel.Comment créer un service D-Bus qui crée dynamiquement plusieurs objets?

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

Par exemple, disons que je veux créer une enveloppe autour flickrapi telle que le 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 spécifiera toujours la même clé API et que les informations d'authentification seront les mêmes pour tous les utilisateurs du service.

Surtout dans le dernier cas, je ne peux pas vraiment supposer que ce sera vrai.

Sur la base de la documentation citée plus haut, 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 manipulé?

2) Si oui, comment le service saura-t-il que le client a terminé? Existe-t-il un moyen de détecter si le client actuel a rompu la connexion afin que le service puisse nettoyer ses objets créés dynamiquement? Aussi, comment pourrais-je créer les objets individuels en premier lieu?

3) Si ce n'est pas ainsi que cela doit être géré, quelles sont les autres suggestions pour accomplir quelque chose de similaire? J'ai lu un certain nombre de didacticiels D-Bus et de diverses documentations et je me suis rendu compte que ce que je recherchais était ce que j'ai cité ci-dessus. Cependant, aucun des exemples ne cherche à faire quoi que ce soit de ce genre, donc je ne suis pas sûr de savoir comment procéder.

Répondre

2

1) La plupart du temps oui, je ne changerais qu'une chose dans la méthode connect comme je l'explique en 2).

2) Les connexions D-Bus ne sont pas persistantes, tout est fait avec des messages de demande/réponse, aucun état de connexion n'est stocké sauf si vous l'implémentez dans des objets tiers comme avec flickerObject. Les objets d-bus dans les liaisons python sont pour la plupart des proxies qui abstrait les objets distants comme si vous étiez "connectés" à eux, mais ce qu'ils font est de construire des messages basés sur les informations que vous donnez à l'instanciation D-Bus , interface et ainsi de suite). Ainsi, le service ne peut pas savoir quand le client est fait si le client ne l'annonce pas avec un autre appel explicite.

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

Pour créer l'objet individuel, il vous suffit d'instancier un objet dans le même service que vous le faites avec votre "/ Connection", mais vous devez vous assurer que vous utilisez un nom inexistant. Vous pourriez avoir un "/ Connection/Manager", et divers "/ Connection/1", "/ Connection/2" ...

3) Si vous avez besoin de stocker l'état de connexion, vous devez faire quelque chose comme cette.

Questions connexes