kolibrios/programs/network/icq/trunk/ssi.inc
Kirill Lipatov (Leency) 6e3f4100a5 kolibri icq update
git-svn-id: svn://kolibrios.org@2296 a494cfbc-eb01-0410-851d-a64ba20cac60
2011-10-18 22:58:49 +00:00

414 lines
6.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
;
; Поддержка контакт листа на сервере
;
;
;
; Заполняет таблицу с UIN
; и опционально таблицы с именем и доп. инфой
;
; Из comp.inc для отладки
;
;
; Массив с UIN
;
;UIN_LEN = 11 ; Длина
;UINS = 15 ; Количество
;
;uins db UIN_LEN*UINS dup 0
;
; массив со статусами
;
;stats dd UINS dup -1
;
; Массив с именами
;
;NAME_LEN = 30
;names db NAME_LEN*UINS dup 0
;
; Достает из item UIN
; eax <- указатель на item
; Пропускает группы
;
ssi_get_uin:
push eax
push ebx
push ecx
push edx
;
; Проверяем ItemID
;
xor ebx, ebx
mov bl, [eax + 1] ; Length of the item name
mov bh, [eax] ;
;push ebx
;mov ebx, 128
;call print_mem
;pop ebx
;; FIXIT Разумнее проверять флаги
;; Если длина строки = 0
;; пропускаем item
;cmp ebx, 0
;jz ssi_get_end
;;
;;data_debug 'Item name len', ebx
;;+смещение до ItemID
;;xor ecx, ecx
;;mov ch, [eax + ebx + 4]
;;mov cl, [eax + ebx + 5] ; Item ID#
;;cmp ecx, 0
;;jz ssi_get_end
;
; Проверяем флаги, обрабатываем только записи UIN
;
xor ecx, ecx
mov ch, [eax + ebx + 6]
mov cl, [eax + ebx + 7]
cmp ecx, 0 ; 0x0000 Buddy record (name: uin for ICQ and screenname for AIM)
jz ssi_uin
; debug
;
lea eax, [eax + ebx + 6]
mov ebx, 2
call print_mem
jmp ssi_get_end
ssi_uin:
;
; Копируем UIN в таблицу
;
mov ecx, ebx ; Длина строки
lea eax, [eax + 2]
mov edx, [uin_ind]
cmp edx, UINS
jnb ssi_get_end ;Нет свободного места в таблице UIN
imul edx, UIN_LEN
mov ebx, uins
lea ebx, [ebx + edx]
call strcpy
inc [uin_ind]
;debug
;mov eax, ebx
;xor ebx, ebx
;call writemsg
;
ssi_get_end:
pop edx
pop ecx
pop ebx
pop eax
ret
;
; eax <- указатель на item
; возвращает в eax указатель на следующий item
;
;
ssi_next_item:
push ebx
push ecx
xor ebx, ebx
mov bl, [eax + 1] ; длина UIN
mov bh, [eax] ;
xor ecx, ecx
mov cl, [eax + ebx + 9] ; Длина дополнительных данных
mov ch, [eax + ebx + 8] ;
add ebx, ecx
add ebx, 10 ;+Длина заголовка
lea eax, [eax + ebx]
pop ecx
pop ebx
ret
;
; eax <- указатель на tlv
; возвращает в eax указатель на след tlv
;
macro get_next_tlv {
push ebx
xor ebx, ebx
mov bl, [eax + 3]
mov bh, [eax + 2]
; + размер заголовка
lea ebx, [ebx + 4]
lea eax, [eax + ebx]
pop ebx
}
;
; Ищет в additional имя и др. сведения
; eax <- указатель на item
;
ssi_get_add:
push eax
push ebx
push ecx
push edx
push esi
;mov ebx, 128
;call print_mem
xor ebx, ebx
mov bl, [eax + 1] ; Length of the item name
mov bh, [eax] ;
;;cmp ebx, 0 ; Если длина имени = 0
;;jz ssi_all_tlv ; Нет смысла обрабатывать
;;+смещение до ItemID
;;xor ecx, ecx
;;mov ch, [eax + ebx + 4]
;;mov cl, [eax + ebx + 5] ; Item ID#
;
;;cmp ecx, 0 ; Группы пока не обрабатываются
;;jz ssi_all_tlv ;
;
; Проверяем флаги, обрабатываем только записи UIN
;
xor ecx, ecx
mov ch, [eax + ebx + 6]
mov cl, [eax + ebx + 7]
cmp ecx, 0 ; 0x0000 Buddy record (name: uin for ICQ and screenname for AIM)
jnz ssi_all_tlv
xor edx, edx
mov dl, [eax + ebx + 9] ;
mov dh, [eax + ebx + 8] ; Length of the additional data
lea eax, [eax + ebx + 10] ; eax указатель на первый tlv
;FIXME : Iservd не присылает additional - пока не могу отладить
;debug
;push ebx
;mov ebx, edx
;data_debug 'length additional data', ebx
;call print_mem
;pop ebx
;
xor esi, esi
ssi_tlv_process:
cmp esi, edx ;
jnb ssi_all_tlv ; additional закончилось
xor ecx, ecx
mov cl, [eax + 3] ;
mov ch, [eax + 2] ; TLV.Length
xor ebx, ebx
mov bl, [eax + 1] ; TLV.Type
mov bh, [eax] ;
cmp bx, 0x0131 ;Имя пользователя
jz ssi_name
cmp bx, 0x0066 ;Ожидаем авторизации
jz ssi_auth_wait
jmp ssi_next_tlv
ssi_auth_wait:
;
;
;
jmp ssi_next_tlv
ssi_name:
;
; Скопировать имя в массив
;
push eax
push ecx
mov ebx, [name_ind]
cmp ebx, UINS
jnb ssi_name_end ;Нет места в таблице
lea eax, [eax + 4] ;Указатель на строку (Прибавляем размер заголовка TLV)
imul ebx, NAME_LEN
lea ebx, [names + ebx]
cmp ecx, NAME_LEN - 1 ; Если имя длиннее поля в таблице
jna @f
mov ecx, NAME_LEN - 1
@@:
call strcpy
;; FIXIT
;; Перекодировка имени
;;
;;mov eax, ebx
;;call win2dos
;
;debug
;push eax
;push ebx
;mov eax, ebx
;xor ebx, ebx
;call writemsg
;pop ebx
;pop eax
;
;
inc [name_ind]
pop ecx
pop eax
ssi_next_tlv:
lea ecx, [ecx + 4] ; Длина данных tlv + длина заголовка
add esi, ecx
get_next_tlv
jmp ssi_tlv_process
ssi_name_end:
pop ecx
pop eax
ssi_all_tlv:
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
;
;
; Обработка контакт листа, пришедшего от сервера
;
; в eax <- указатель на данные в пакете SNAC(13,06)
ssi_process_data:
push eax
push ebx
push ecx
push edx
;
; Проверить версию протокола
;
xor ebx, ebx
mov bl, [eax]
cmp bl, 0
jnz ssi_bad_prot
;
;в ebx - количество items
mov bl, [eax + 2]
mov bh, [eax + 1]
;
data_debug 'SSI items:', ebx
lea eax, [eax + 3] ; Установить eax на список items
xor ecx, ecx ; Счетчик items
ssi_next_uin:
cmp ecx, ebx
jnb ssi_all_items
call ssi_get_uin
call ssi_get_add
call ssi_next_item
inc ecx
jmp ssi_next_uin
ssi_bad_prot:
write_debug "ERR: SSI protocol version mismatch"
ssi_all_items:
pop edx
pop ecx
pop ebx
pop eax
ret