如何创建动态创建多个对象的D-Bus服务?

时间:2009-03-20 20:05:24

标签: python dbus

我是D-Bus的新手(对于Python来说,双重打击!)我正试图找出做本教程中讨论的最佳方法。

  

但是,文本编辑器应用程序   可以轻松拥有多个总线名称   (例如,org.kde.KWrite in   除了通用TextEditor之外,还有   多个对象(也许   / org / kde / documents / 4352其中   数量根据变化而变化   文件),每个对象都可以   实现多个接口,例如   org.freedesktop.DBus.Introspectable,   org.freedesktop.BasicTextField,   org.kde.RichTextDocument。

例如,假设我想在flickrapi周围创建一个包装器,这样服务就可以公开一些Flickr API方法(比如urls_lookupGroup())。如果我想假设服务将始终指定相同的API密钥并且使用该服务的每个人的auth信息都相同,则这是相对简单的。

特别是在后一种情况下,我无法真正认为这是真的。

根据上面引用的文档,我假设应该有类似的东西:

# 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 个答案:

答案 0 :(得分: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)如果你需要存储连接状态,你必须做类似的事情。

相关问题