Как создать сервис D-Bus, который динамически создает несколько объектов? - PullRequest
2 голосов
/ 20 марта 2009

Я новичок в D-Bus (и в Python, двойной удар!), И я пытаюсь найти лучший способ сделать то, что обсуждалось в учебнике.

Однако приложение для текстового редактора может так же легко иметь несколько названий шин (например, org.kde.KWrite в дополнение к универсальному TextEditor), есть несколько объектов (возможно / org / kde / documents / 4352 где число меняется в соответствии с документ), и каждый объект может реализовать несколько интерфейсов, таких как org.freedesktop.DBus.Introspectable, org.freedesktop.BasicTextField, org.kde.RichTextDocument.

Например, скажем, я хочу создать оболочку около flickrapi, чтобы служба могла предоставлять несколько методов API Flickr (скажем, 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 голосов
/ 22 марта 2009

1) В основном да, я бы изменил только одну вещь в методе соединения, как я объясню в 2).

2) Соединения D-Bus не являются постоянными, все делается с помощью сообщений запроса / ответа, состояние соединения не сохраняется, если вы не реализуете это в третьих объектах, как вы делаете с flickerObject. Объекты d-bus в привязках Python - это в основном прокси, которые абстрагируют удаленные объекты, как если бы вы были «подключены» к ним, но на самом деле они создают сообщения на основе информации, которую вы передаете для создания объекта D-Bus (путь к объекту). Интерфейс и так). Таким образом, служба не может знать, когда клиент завершил работу, если клиент не объявил об этом другим явным вызовом.

Чтобы обработать неожиданное завершение клиента, вы можете создать в клиенте объект D-Bus и при подключении отправить путь к сервису, измените метод connect, чтобы он также принимал параметр ObjectPath. Служба может прослушивать сигнал NameOwnerChanged, чтобы узнать, умер ли клиент.

Чтобы создать отдельный объект, вам нужно всего лишь создать экземпляр объекта в том же сервисе, что и ваш "/ Connection", но вы должны быть уверены, что используете несуществующее имя. Вы можете иметь «/ Connection / Manager» и различные «/ Connection / 1», /Connection/2"...

3) Если вам нужно сохранить состояние соединения, вы должны сделать что-то подобное.

...