Работа с ростер-листом (списком контактов)
Ростер-лист или аналог списка контактов в сетях ICQ в Jabber-е представлен списком, содержащим JID-контакты в виде элементов XML хранящимся на сервере от имени пользователя. Так как ростер-лист сохранен сервером от имени пользователя, то пользователь может обратиться к информации списка от любого ресурса.
Управление ростер-листом (списком) осуществляется через расширенный информационный запрос <IQ> содержащий дочерний элемент <query> c пространством имен 'jabber:iq:roster'. Элемент <query> может содержать один или более дочерних элементов <ITEM> содержащих информацию о контакте.
Уникальный идентификатор каждого элемента списка <item> - это JID контанта, формируемый в атрибуте jid Значение атрибута jid имеет форму user@domain без указания ресурса. Текущее состояние подписки пользователя (контакта) относительно элемента <item> зафиксировано в атрибуте subscription и может принимать следующие значения:
none - У пользователя нет подписки к контакту, нет подписки и к информации присутствия пользователя
to - у пользователя есть подписка к информации присутствия контакта, но у контакта нет подписки к информации присутствия пользователя
from - у контакта есть подписка к информации присутствия пользователя, но у пользователя нет подписки к информации присутствия контакта
both - у пользователя есть подписка к присутствию контакта, да и у контакта есть подписка к пользователю.
Запрос списка контактов при входе в систему
При входе в систему клиент Jabber должен послать серверу информационный запрос о получении ростер-листа.
Запрос ростер-листа клиентом:
Код:
<iq from='delphi-test@jabber.ru/тестовая'
type='get' id='roster_1'>
<query xmlns='jabber:iq:roster'/>
</iq>
Получение ростер-листа с сервера:
Код:
<iq from='delphi-test@jabber.ru'
to='delphi-test@jabber.ru/тестовая' id='roster_1'
type='result'>
<query xmlns='jabber:iq:roster'>
<item subscription='from'
name='Тест 2'
jid='delphi-test2@jabber.ru'/>
</query>
</iq>
Управление ростер-листом
Добавление или редактирование контакта. При отсутствии контакта в ростер-листе контакт будет добавлен, при наличии отредактирован.
Добавление / корректировка. Клиент посылает следующий пакет.
Код:
<iq from='delphi-test@jabber.ru/тестовая'
type='set' id='уникальный номер'>
<query xmlns='jabber:iq:roster'>
<item jid='новый/корректируемый JID'
name='Имя контакта'>
<group>Группа контакта</group>
</item>
</query>
</iq>
После добавления/обновления информации о контакте на сервере, сервер оповещает все доступные ресурсы пользователя о внесенной информации. Оповещение служит сигналом для синхронизации данных клиентов о данном контакте с данными сервера.
Оповещение сервера:
Код:
<iq to='delphi-test@jabber.ru/тестовая'
type='set'
id='уникальный номер'>
<query xmlns='jabber:iq:roster'>
<item jid='новый/корректируемый JID'
name='Имя контакта'>
<group>Группа контакта</group>
</item>
</query>
</iq>
Информация о результате:
Код:
<iq to='delphi-test@jabber.ru/тестовая' type='result' id='уникальный номер'/>
В любое время, пользователь удалить контакт из ростер-списка, для этого клиент должен послать запрос с атрибутом subscription элемента <item> равным значению 'remove':
Код:
<iq from=' delphi-test@jabber.ru/тестовая' type='set' id='roster_4'>
<query xmlns='jabber:iq:roster'>
<item jid='JID который удаляется' subscription='remove'/>
</query>
</iq>
Как и в случае с добавлением/корректировкой контакта сервер оповещает клиенты о удалении контакта. Указанием факта удаления служит атрибут subscription равным значению 'remove' в элементе <item>.
Код:
<iq to=' delphi-test@jabber.ru/тестовая' type='set' id='roster_4'>
<query xmlns='jabber:iq:roster'>
<item jid='JID который удален сервером' subscription='remove'/>
</query>
</iq>
Заключение
Как вы видите, ничего особо сложного нет. Простой Jabber-клиент с минимальной функциональностью представлен в примере. Также в архив выложен парсер TjanXMLParser2, RFC 3920, 3921.
К статье прилагается пример. (
Скачать)
P.S. Я так подумал, если за исходники возмёться знающий человек с прямыми руками и знающий Дельфи то из этого простого jabber клиента можно сделать первый т.к. ниразу не видел их jabber брут... Да к томуже уже реализованна работа через прокси
