Итак... Передавать и принимать сообщения уже умеем. На очереди - получение
информации о клиентах, которые находятся в списке контактов; а также поиск новых
клиентов по различным критериям. Такие запросы к серверу посылаются с помощью
все тех же SNAC(15,2). Вспомните, как производится запрос оффлайновых сообщений.
Уверен, что у вас не возникло никаких проблем со скачиванием, с компиляцией,
с "конфигурированием" первого проекта. Если вы вписывали в файл nICQ.ini свой
пароль, то коннект был обеспечен.
Урок №2 содержит два новых модуля. SendMess и MessFrom. Каждый из них имеет
свое окно. Это - передача и прием сообщений.
Для разбора конкретного примера возьмем ситуацию, когда мы запрашиваем у
ICQ-сервера оффлайновые сообщения (т.е. те, которые накопились на сервере, пока
нас не было в онлайне).
Запрос оффлайновых сообщений делаем с помощью SNAC(15,2), а ответ на него
получим соответственно в SNAC(15,3). Оба этих SNACa имеют очень простой формат.
Они содержат в себе только по одному TLV, а именно TLV(1). На первый взгляд все
очень просто. Но... TLV(1), в свою очередь, имеет очень ветвистую структуру.
(Такие особенности имеют и некоторые другие SNACи, например, SNAC(4,6) для
передачи и SNAC(4,7) для приема сообщений).
Обработчик WorkPart выполняет всю диспетчерскую работу на протяжении всего
времени, когда мы подключены к основному ICQ-серверу. Устроен он очень просто.
Перед рассмотрением работы обработчика AuthorizePart надо немного поговорить
и о протоколе.
Перед тем, как подключиться к ICQ-серверу и начать работать мы должны пройти
авторизацию на Authorization Server. Его адрес - login.icq.com:5190.
Необходимо:
соединиться с Authorization Server;
передать ему пакет с UINом и паролем;
получить от него IP-адрес и порт основного сервера и Cookie (256 байт
случайных данных). Cookie - это будет наш пропуск при последующем (после
авторизации) коннекте к основному рабочему серверу;
Итак, в обработчике события ClientSocket.onRead_Data из FLAP-пакетов
формируется список FIFO. Обработку этого списка производит таймерная процедура
MainT. Ее задача заключается в следующем:
взять из очереди FLAP-пакет (если очередь не пуста);
сформировать из него временный объект (запись) типа PPack. (Для его
обработки в модуле Packet находятся соответствующие функции и процедуры);
направить его на вход одного из двух обработчиков;
Итак, рассмотрим механизм приема FLAP-пакетов. Прием пакетов - это обработчик
события onReadData нашего ClientSocket. Задача этого обработчика сводится только
к приему FLAP-пакетов и формировании из них связного списка типа FIFO (первым
пришел, первым и ушел). Главное корректно отработать границы пакетов.
Делфи-проект nICQ в начале будет состоять из 3-х модулей: Types, Packet, Main.
В модуле Types находятся
константы и объявлены некоторые записи.
В модуле Packet - процедуры
и функции для записи/чтения FLAP-пакетов.(Большинство процедур из этого модуля
просто адаптированы из других проектов ICQ).