четверг, 16 сентября 2010 г.

Пишем Jabber-клиент на Delphi. Часть 4

Базовые семантические модули

После того как мы прошли авторизацию, разберем основные базовые семантические модули  XML-строф реализованных в протоколе, их довольно немного:
<Presence> - презентационные данные, определяют статусное состояние, видимость пользователей и управление подпиской.
<Message> - собственно сами сообщения переданные или принятые пользователем.
<IQ> - Info Query, данные информационных запросов, включают в себя сами запросы, а также результаты выполнения. Данные запросы позволяют Jabber-клиентам обменивается различными данными между собой. Информационное наполнение запроса и ответа определено в пространстве имен дочернего элемента. Дополнительные расширения протокола (XEP – XMPP Extension Protocol) очень сильно используют <iq> запросы. Подробнее об них я расскажу далее.

Отправка и прием сообщений <Message>

Прием и отправка сообщений осуществляется через XML-строфу <MESSAGE>. Так как в Jabber-е предусмотрены разные типы сообщений, то для их разграничений предусмотрен атрибут type содержащий информацию о типе сообщения.
Типы сообщений могут быть следующие:
chat – Одиночное сообщение от клиента к клиенту.
error – Сообщение об ошибке. Произошедшая ошибка связанна с предыдущим, посланным одиночным сообщением.
groupchat – Групповой чат. Данное сообщение пришло с группового чата, действующего по признаку «Одно сообщение – многим получателям».
headline – Системное сообщение, автоматически генерируется различными сервисами для шировещательной рассылки (новости, спорт, RSS-каналы и пр.) Отвечать на такие сообщение не нужно, да и не зачем.
normal – одиночное сообщение, посылаемое вне контекста взаимно-однозначного сеанса связи или группового чата. То есть это такое сообщение, на которое пользователь может дать ответ, не учитывая хронологии сеанса связи.

Дочерние элементы

У XML-строфы <Message>  могут быть следующие дочерние элементы, определенные пространством имен 'jabber:client' или 'jabber:server'. По умолчанию за этими элементами зарезервировано пространство имен 'jabber:client'. Если <Message> имеет тип error то обработка такого сообщения идет в соответствии с RFC 3920 XMPP-Core.
Элемент строфы <Message> может содержать любой из следующих дочерних элементов без явного объявления пространства имен:
 <subject/>, <body/>, <thread/>.
Где элемент <body> - является телом сообщения. В значении элемента содержится сам текст сообщения, предварительно перекодированный из-за ограничений XML. Элемент может содержать атрибут 'xml:lang' содержащий язык сообщения. В <Message> могут быть включены множественные экземпляры элементов <Body>,   но только при условии, что каждый экземпляр обладает атрибутом 'xml:lang' с  отличным языковым значением.
Например:
<message type="chat" to="получатель"
                     id="идентификатор"
                     from="отправитель">
   <body>Текст (тело) сообщения</body>
</message>

Элемент <Subject>  определяет тему сообщения. На него действуют те-же  правила, что и для <Body>. Множественные экземпляры <Body> могут быть включены для расширения и дополнения смежных тем, но при условии, что каждый экземпляр обладает атрибутом 'xml:lang' с  отличным языковым значением.
Элемент <thread>  служит для обеспечения хронологии сеанса. Значение <thread> элемента  сгенерированного отправителем должно быть послано назад в любых ответах. Этот элемент является дополнительным и обычно не используется для обмена сообщениями между пользователями. Используется он в сеансах связи. Более подробно можно прочитать о нем в RFC 3921.

Перекодировка символов текста

Поскольку символы "<" и ">" используются для обозначения самих XML тегов, то  их вставка в текст сообщения недопустима (за исключением случая, когда вставлен  символ ">", но никакой тег не был открыт). Поэтому для корректного формирования XML следующие символы должны быть заменены в теле сообщения при отправке оного и соответственно обратно возвращены при  приеме:
"<" в "&lt;"
">" в "&gt;".
Таким образом, чтобы написать "2>1", нужно написать "2&gt;1". То же самое касается и знака "&" – он заменяется "&amp;".  Также рекомендуется заменять и кавычки (хотя в большинстве случаев  они хорошо распознаются и без этого).  Эквивалент двойных кавычек - "&quot;"

Комментариев нет:

Отправить комментарий