Delphi World - ICQ2000 сделай сам 4
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
ICQ2000 сделай сам 4


Автор: Alexander Vaga
WEB-сайт: http://icq2000cc.hobi.ru

Познакомился интернетчик с девушкой, погуляли, он и спрашивает:
- Как бы нам еще встретиться?
Она ему на бумажке телефон написала и уехала. Он смотрит на бумажку: "На ICQ не похоже... На IP тоже..."
Так и не состоялась любовь...

Итак, в обработчике события ClientSocket.onRead_Data из FLAP-пакетов формируется список FIFO. Обработку этого списка производит таймерная процедура MainT. Ее задача заключается в следующем:

  • взять из очереди FLAP-пакет (если очередь не пуста);
  • сформировать из него временный объект (запись) типа PPack. (Для его обработки в модуле Packet находятся соответствующие функции и процедуры);
  • направить его на вход одного из двух обработчиков;
  • после обработки удалить временный объект.

procedure TForm1.MainTTimer(Sender: TObject);
var FindFIFO : PFLAP_Item;
    tmp : PPack;
begin
// закроем вход в таймер (реентерабельность нам не нужна) 
     MainT.Enabled := false;
// проверим не пуста ли очередь
     while HeadFIFO<>nil do begin
// если есть ожидающие пакеты, то берем первый из них
       FindFIFO := HeadFIFO;
// и корректируем очередь
       if HeadFIFO^.Next=nil then HeadFIFO := nil
       else HeadFIFO := HeadFIFO^.Next;
// создаем временный Pak
       tmp := PacketNew;
// переносим в него данные из пакета очереди
// сначала FLAP-заголовок
       PacketAppend(tmp,@FindFIFO^.FLAP,sizeof(FLAP_HDR));
// затем блок данных
       PacketAppend(tmp,FindFIFO^.DATA,swap(FindFIFO^.FLAP.Len));
// освобождаем пакет, который из очереди
       FreeMem(FindFIFO^.DATA,swap(FindFIFO^.FLAP.Len));
       Dispose(FindFIFO);
// пропишем его дамп в файл "<твой UIN>.log"
       debugFILE(tmp,'< ');
// если в данный момент мы соединены с сервером авторизации
       if isAuth then 
// то напавим пакет в обработчик AuthorizePart 
          AuthorizePart(tmp)
       else 
// либо в основной обработчик
          WorkPart(tmp);
// удалим временный Pak
       PacketDelete(tmp);
     end;
// откроем вход в таймер
     MainT.Enabled := true;
end;

Вполне логично, что дальше надо рассмотреть работу процедуры AuthorizePart, т.к. самый первый FLAP-пакет попадет именно в нее.

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования