Показать сообщение отдельно

  #4  
Старый 06.06.2009, 22:17
Аватар для lytgeygen
lytgeygen
Новичок
Регистрация: 12.04.2009
Сообщений: 23
Провел на форуме:
34915

Репутация: 13
Отправить сообщение для lytgeygen с помощью ICQ
По умолчанию

Работа с ростер-листом (списком контактов)

Ростер-лист или аналог списка контактов в сетях 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.

К статье прилагается пример. (Скачать)
www.interface.ru
Дмитрий Кузан

P.S. Я так подумал, если за исходники возмёться знающий человек с прямыми руками и знающий Дельфи то из этого простого jabber клиента можно сделать первый т.к. ниразу не видел их jabber брут... Да к томуже уже реализованна работа через прокси
 
Ответить с цитированием