Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Фреймворк Telepathy

Глава 20 из книги "Архитектура приложений с открытым исходным кодом", том 1.

Оригинал: Telepathy
Автор: Danielle Madeley
Перевод: Н.Ромоданов

20.2. Как в Telepathy используется шина D-Bus

Взаимодействие компонентов Telepathy осуществляется через шину обмена сообщениями D-Bus, которая обычно является сессионной шиной пользователя. В D-Bus предоставляются возможности, обычные для систем межпроцессных взаимодействий: каждый сервис публикует объекты, имеющие строго определенные пути в пространстве имен, ведущие к этим объектам, например /org/freedesktop/Telepathy/AccountManager [3]. В каждом объекте реализовано несколько интерфейсов. Интерфейсы снова строго определены в пространстве имен, и имеют вид org.freedesktop.DBus.Properties и ofdT.Connection. В каждом интерфейсе предоставляются методы, сигналы и свойства, которые вы можете вызывать, слушать или опрашивать.

Рис.20.2: Концептуальное представление объектов, публикуемых сервисом D-Bus

Публикация объектов D-Bus

Публикация объектов D-Bus полностью выполняется библиотекой D-Bus, которая используется в данный момент. По сути, это отображение пути к объекту D-Bus в объект, используемый в программе и реализующий данные интерфейсы. Пути к объектам, публикуемые сервисом, предоставляются для доступа с помощью дополнительного интерфейса org.freedesktop.DBus.Introspectable.

Когда сервис получает входящий вызов метода, в котором указан путь назначения (например, /ofdT/AccountManager), на библиотеку D-Bus возлагается обязанность найти в программе объект, представляемый данным объектом D-Bus, а затем выполнить вызов соответствующего метода для этого объекта.

Интерфейсы, методы, сигналы и свойства, предоставляемые Telepathy, подробно описываются с помощью языка D-Bus IDL (Interface Definition Language, язык описания интерфейсов), в основе которого лежит язык XML, расширенный таким образом, чтобы можно было включать больше информации. Спецификации в таком виде можно анализировать автоматически и создавать документацию и привязки к различным языкам программирования.

Сервисы Telepathy публикуют различные объекты на шине. Центр управления публикует объекты для менеджера соединений и диспетчера каналов так, чтобы был доступ к их сервисам. Клиентские программы публикуют объект Client так, чтобы он был доступен для диспетчера каналов. Наконец, менеджеры соединений публикуют следующие объекты: объект сервиса, который может использоваться менеджером аккаунтов для запроса новых соединений, по одному объекту для каждого открытого соединения и по одному объекту для каждого открытого канала.

Хотя объекты D-Bus не имеют типов, а только интерфейсы, в Telepathy типы эмулируются несколькими способами. Путь к объекту, сообщающий нам, где находится объект, является соединением, каналом, клиентской программой, и т.д., хотя обычно вы уже знаете об этом, когда запрашиваете прокси доступ для этого объекта. Каждый объект реализует базовый интерфейс для его собственного типа, например ofdT.Connection или ofdT.Channel. Для каналов, это очень похоже на абстрактный базовый класс. Объекты каналов также имеют конкретный класс, определяемый типом данного канала. Снова это представлено с помощью интерфейса шины D-Bus. О типе канала можно узнать, прочитав свойство ChannelType в интерфейсе Channel.

Наконец, в каждом объекте реализуется ряд необязательных интерфейсов (как ни странно, тоже представляемые как интерфейсы шины D-Bus), которые зависят от возможностей протокола и менеджера соединений. Список имеющихся интерфейсов для данного объекта представлены в свойстве Interfaces базового класса объекта.

Для объектов соединений Connection типа \code{ofdT.Connection}, необязательные интерфейсы имеют имена вида - ofdT.Connection.Interface.Avatars (если в протоколе есть понятие аватаров), odfT.Connection.Interface.ContactList (если в протоколе предоставлен реестр контактов – это делается не везде) и odfT.Connection.Interface.Location (если в протоколе предоставлена геолокационная информация). Для объектов каналов Channel типа ofdT.Channel, конкретные классы имеют имена интерфейсов вида ofdT.Channel.Type.Text, odfT.Channel.Type.Call и odfT.Channel.Type.FileTransfer. Необязательный интерфейс точно также, как и объекты Connection, имеют имена вида odfT.Channel.Interface.Messages (если канал может передавать и получать текстовые сообщения) и odfT.Channel.Interface.Group (если данный канал подключен к группе, содержащей много контактов, например, к многопользовательскому чату). Так, например, в текстовом канале реализуются, как минимум, интерфейсы ofdT.Channel, ofdT.Channel.Type.Text и Channel.Interface.Messages. Если это многопользовательский чат, в нем также будет реализован интерфейс odfT.Channel.Interface.Group.

Почему свойство Interfaces, а не анализ в самой шине D-Bus?

Вы можете поинтересоваться, почему в каждом базовом классе реализовано свойство Interfaces, вместо того, чтобы воспользоваться средствами анализа, имеющимися в самой шине D-Bus, которые бы нам сообщали, какие имеются интерфейсы. Дело в том, что в различных объектах каналов и соединений могут, в зависимости от возможностей канала или соединения, предлагаться различные интерфейсы, которые отличаются друг от друга, но в большинстве реализаций средств анализа D-Bus предполагается, что все объекты одного и того же класса объектов будут иметь одинаковые интерфейсы. Например, в telepathy-glib интерфейсы D-Bus, перечисляемые с помощью средств анализа D-Bus, берутся их реализаций классов интерфейсов объекта, которые определяются статически на этапе компиляции. Мы справляемся со всем этим благодаря наличию средств анализа в шине D-Bus, предоставляющих данные обо всех интерфейсах, которые могли бы быть в объекте, и благодаря использованию свойства Interfaces, указывающего, какие интерфейсы действуют на самом деле.

Хотя в самой шине D-Bus нет проверки того, что в объектах соединений присутствуют интерфейсы, относящиеся только к подключениям, и т. д. (поскольку в шине D-Bus не используется концепция типов, а лишь концепция интерфейсов, именуемых произвольным образом), мы для того, чтобы реализовывать такую проверку внутри языковых привязок фреймворка Telepathy, можем пользоваться информацией, имеющейся в спецификациях Telepathy.

Почему и как был расширен язык спецификаций IDL

В существующем языке спецификаций IDL шины D-Bus определяются имена, аргументы, ограничения доступа и сигнатуры методов, свойств и сигналов для типов D-Bus. Но в нем не поддерживается документирование, механизмы привязок и именованные типы.

Чтобы обойти эти ограничения, в XML было добавлено новое пространство имен XML, предоставляющее требуемую информацию. Это пространство имен для того, чтобы его можно было использовать другими интерфейсами API шины D-Bus, было разработано в наиболее обобщенном виде. Были добавлены новые элементы, среди которых есть возможность прямо внутрь интерфеса API добавлять документацию, описание обоснования тех или иных решений, вводную часть, отмечать устаревшие версии и возможные исключения, возникающие в методах.

Сигнатуры типов D-Bus являются низкоуровневым описанием, определяющим какие данные должны быть сериализированы использования в шине. Сигнатура типов D-Bus могут выглядеть, например, как (ii) (что представляет собой структуру, содержащую два элемента int32), или может быть более сложной. Например, a{sa(usuu)} - это ассоциативный массив, который ассоциирует строку с массивом структур, содержащих элементы uint32, string, uint32, uint32 (смотрите рис.20.3). Эти типы, хотя и описывают формат данных, не придают никакого семантического смысла информации, хранящейся в объектах этих типов.

Чтобы предоставить программистам семантическую прозрачность и усилить типизацию привязок к языкам программирования, были добавлены новые элементы, позволяющие именовать простые типы, структуры, ассоциативные массивы, перечислимые типы (enums) а также флаги, предоставлявшие их сигнатуры, а также документацию. Также были добавлены элементы, эмулирующие наследование объектов шины D-Bus.

Рис.20.3: Тип (ii) и тип a{sa(usuu)} шины D-Bus


Продолжение статьи: Хэндлы ( Handles).