Как создать службу D-Bus, которая динамически создает несколько объектов?

StackOverflow https://stackoverflow.com/questions/667760

  •  21-08-2019
  •  | 
  •  

Вопрос

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

Тем не менее, приложение текстового редактора может так же легко владеть несколькими именами автобусов (например, org.kde.kwrite в дополнение к общему текстовому текстовому сообщению), иметь несколько объектов (возможно/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).

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top