;
;
; Ïîääåðæêà êîíòàêò ëèñòà íà ñåðâåðå
;
;
;
; Çàïîëíÿåò òàáëèöó ñ 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