unit Types;

interface

const
  // константы статуса
  // (если единица в старшем разряде,
  // то наш IP-адрес будет скрыт от другого клиента)
  STATE_ONLINE      = $10020000;
  STATE_AWAY        = $10020001;
  STATE_DND         = $10020013;
  STATE_INVISIBLE   = $10020100;
  STATE_OCCUPIED    = $10020011;
  STATE_FREEFORCHAT = $10020020;
  STATE_N_A         = $10020005;

  // константы статуса для внутненнего использования
  // (индексы для картинок и др.)
  online            = 0;
  freeforchat       = 1;
  invisible         = 2;
  occupied          = 3;
  dnd               = 4;
  away              = 5;
  na                = 6;
  etc               = 7;
  offline           = 8;
  simply_icq        = 9;
  mes               = 10;
  empty             = 11;

  // типы сообщений
  TYPE_MSG          = $01;
  TYPE_CHAT         = $02;
  TYPE_FILE         = $03;
  TYPE_URL          = $04;
  TYPE_AUTH_REQ     = $06;
  TYPE_AUTH_DEN     = $07;
  TYPE_AUTH_GIV     = $08;
  TYPE_ADDED        = $0C;
  TYPE_WEBPAGER     = $0D;
  TYPE_EXPRESS      = $0E;
  TYPE_CONTACT      = $13;
  TYPE_CONTACT_REG  = $1A;

  PACKET_DATA_SIZE = 4096;
type
  IParray = array[0..3] of byte;
  PByteArray = ^TByteArray;
  TByteArray = array[0..PACKET_DATA_SIZE-1] of byte;
  PCharArray = ^TCharArray;
  TCharArray = array[0..PACKET_DATA_SIZE-1] of char;
  PWORD = ^word;
  PLONG = ^longint;
  PBYTE = ^byte;

// FLAP-заголовок type PFLAP_HDR = ^FLAP_HDR;
  FLAP_HDR = packed record
    Sign : byte;
    ChID : byte;
    SEQ  : word;
    Len  : word;
  end;

// SNAC-заголовок
type PSNAC_HDR = ^SNAC_HDR;
  SNAC_HDR = packed record
    FamilyID  : word;
    SubTypeID : word;
    Flags     : array[0..1] of byte;
    RequestID : longint;
  end;

// полный FLAP-пакет
// при чтении с TCP-socketa сюда укладываем FLAP-заголовок и сами ДАННЫЕ.
// Из таких записей формируется связной список (см. поле Next)
type PFLAP_Item = ^FLAP_Item;
  FLAP_Item = packed record
    FLAP : FLAP_HDR;
    DATA : PByteArray;
    Next : PFLAP_Item;
  end;

// Пакет, который поступает в обработчик.
// Помимо самого FLAP-пакета в нем хранятся вспомогательные поля
// Cursor - текущая позиция чтения/записи
// Length - общая длина FLAP-заголовка и FLAP-данных
// Вариантная часть - для более осмысленного доступа к пакету
type   PPack = ^Pack;
  Pack = packed record
    cursor : word;
    length : word;
    case integer of
      0: (DATA:array[0..PACKET_DATA_SIZE-1] of byte);
      1: (FLAP : FLAP_HDR;
          FLAP_BODY:array[0..PACKET_DATA_SIZE-1] of byte);
      2: (Sign,ChID:byte; SEQ,Len:word);
      3: (fix:FLAP_HDR;
          SNAC:SNAC_HDR;
          SNAC_BODY:array[0..PACKET_DATA_SIZE-1] of byte);
    end;
  implementation

end.