e4cf34c0de
git-svn-id: svn://kolibrios.org@3545 a494cfbc-eb01-0410-851d-a64ba20cac60
414 lines
6.1 KiB
PHP
414 lines
6.1 KiB
PHP
;
|
||
;
|
||
; Поддержка контакт листа на сервере
|
||
;
|
||
;
|
||
|
||
;
|
||
; Заполняет таблицу с 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
|
||
|
||
|