Автор: Alexander
Vaga WEB-сайт: http://icq2000cc.hobi.ru
Итак, в обработчике события 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-пакет попадет именно в нее. |