题
我是新来d-总线(和Python的,祸不单行!),我试图找出做一些事情,在本教程中讨论的最佳方式。
然而,一个文本编辑器应用 可以像它们拥有多个总线名称 (例如,在org.kde.KWrite 除了一般的文本编辑),具有 多个对象(也许 /组织/ KDE /文件/ 4352,其中 根据改变数 文件),并且每个对象可以 实现多个接口,如 org.freedesktop.DBus.Introspectable, org.freedesktop.BasicTextField, org.kde.RichTextDocument。
举例来说,假设我想创建围绕flickrapi
的包装,使得服务可以暴露的Flickr的API方法(比如说,urls_lookupGroup()
)屈指可数。如果我想假设使用该服务的服务将始终被指定相同的API密钥,并且将已授权的信息将是每个人都一样,这是比较简单的。
特别是在后者的情况下,我真的不能假定这将是正确的。
基于上面引述的文档上,我假设应该有这样的:
# 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')
所以,我的问题:
1)这是应如何处理?
2)如果是这样,怎么会知道服务客户端时做了什么?有没有一种方法来检测,如果当前的客户端已经打破连接,这样的服务可以清理它的动态创建的对象?此外,如何将我摆在首位创建单个对象?
3)如果不是这个应该怎么处理,什么是完成类似的东西其他一些建议吗?
我已经通过了一些d-Bus的教程和各种文档的阅读和对最接近我来看到我在找的是什么,我上面引述。然而,没有任何的例子看真正做到这样,所以我不知道如何着手任何事情。
解决方案
1)晴是的,我将只改变一件事在连接方法如我在第2解释)。
2)d总线连接不会持久,一切都与请求/响应消息来进行,没有连接状态被存储,除非你,你与你的flickerObject
做实现这个第三对象。在Python绑定的d-总线对象大多是代理抽象的远程对象,如果你是“连接”到他们,但它确实是建立一个基于你的信息给d-Bus的对象实例化的消息(对象路径,接口等等)。因此,该服务可以不知道什么时候,如果客户端不与其他显式调用宣布,它在客户端完成。
要处理突发性的客户最终确定,您可以创建客户端中的d-Bus的对象,并在连接时发送的对象路径服务,改变你的connect
方法也接受一个ObjectPath
参数。该服务可以听 NameOwnerChanged
的信号知道,如果一个客户端已经死亡。
要创建单独的对象,你只需要在你与你的“/连接”做同样的服务实例化一个对象,但你必须确保你使用的是unexisting名。你可以有一个 “/连接/管理器” 和各种 “/连接/ 1”, “/连接/ 2” ...
3)如果你需要存储的连接状态,你必须做这样的事情。