2

我是 D-Bus 的新手(以及 Python 的新手,双重打击!),我正在尝试找出做本教程中讨论的事情的最佳方法。

但是,文本编辑器应用程序可以很容易地拥有多个总线名称(例如,除了通用 TextEditor 之外,org.kde.KWrite),具有多个对象(可能 /org/kde/documents/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 教程和各种文档,并且我最接近看到我正在寻找的内容是我上面引用的内容。然而,没有一个例子看起来真的做这样的事情,所以我不知道如何继续。

4

1 回答 1

2

1)大多数情况下是的,正如我在 2)中解释的那样,我只会更改连接方法中的一件事。

2) D-Bus 连接不是持久的,一切都是通过请求/响应消息完成的,没有连接状态被存储,除非您像使用flickerObject. python绑定中的d-bus对象主要是抽象远程对象的代理,就好像你“连接”到它们一样,但它真正做的是根据你提供给D-Bus对象实例化的信息(对象路径,界面等)。因此,如果客户端没有通过其他显式调用宣布它,则服务无法知道客户端何时完成。

要处理意外的客户端终结,您可以在客户端中创建一个 D-Bus 对象,并在连接时将对象路径发送到服务,更改您的connect方法以同时接受一个ObjectPath参数。该服务可以监听NameOwnerChanged信号以了解客户端是否已死亡。

要创建单个对象,您只需在与“/Connection”相同的服务中实例化一个对象,但您必须确保您使用的是不存在的名称。您可以有一个“/Connection/Manager”,以及各种“/Connection/1”、“/Connection/2”...

3)如果你需要存储连接状态,你必须做类似的事情。

于 2009-03-22T20:17:20.613 回答