Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;
  3. ; Ïîääåðæêà êîíòàêò ëèñòà íà ñåðâåðå
  4. ;
  5. ;
  6.  
  7. ;
  8. ; Çàïîëíÿåò òàáëèöó ñ UIN
  9. ; è îïöèîíàëüíî òàáëèöû ñ èìåíåì è äîï. èíôîé
  10. ;
  11.  
  12.  
  13. ; Èç comp.inc äëÿ îòëàäêè
  14. ;
  15. ;
  16. ; Ìàññèâ ñ UIN
  17. ;
  18. ;UIN_LEN = 11            ; Äëèíà
  19. ;UINS    = 15            ; Êîëè÷åñòâî
  20. ;
  21. ;uins db UIN_LEN*UINS dup 0
  22. ;
  23. ; ìàññèâ ñî ñòàòóñàìè
  24. ;
  25. ;stats dd UINS dup -1
  26. ;
  27. ; Ìàññèâ ñ èìåíàìè
  28. ;
  29. ;NAME_LEN = 30
  30.  
  31. ;names db NAME_LEN*UINS dup 0
  32.  
  33.  
  34. ;
  35. ; Äîñòàåò èç item UIN
  36. ; eax <- óêàçàòåëü íà item
  37. ; Ïðîïóñêàåò ãðóïïû
  38. ;
  39.  ssi_get_uin:
  40.   push eax
  41.   push ebx
  42.   push ecx
  43.   push edx
  44.  
  45.   ;
  46.   ; Ïðîâåðÿåì ItemID
  47.   ;
  48.   xor ebx, ebx
  49.   mov bl, [eax + 1]     ; Length of the item name
  50.   mov bh, [eax]       ;
  51.  
  52.  
  53.   ;push ebx
  54.   ;mov ebx, 128
  55.   ;call print_mem
  56.  
  57.   ;pop ebx
  58.  
  59.  
  60.   ;; FIXIT Ðàçóìíåå ïðîâåðÿòü ôëàãè
  61.   ;; Åñëè äëèíà ñòðîêè = 0
  62.   ;; ïðîïóñêàåì item
  63.   ;cmp ebx, 0
  64.   ;jz ssi_get_end
  65.  
  66.   ;;
  67.   ;;data_debug 'Item name len', ebx
  68.  
  69.   ;;+ñìåùåíèå äî ItemID
  70.  
  71.   ;;xor ecx, ecx
  72.   ;;mov ch, [eax + ebx + 4]
  73.   ;;mov cl, [eax + ebx + 5]  ;  Item ID#
  74.  
  75.   ;;cmp ecx, 0
  76.   ;;jz ssi_get_end
  77.  
  78.   ;
  79.   ; Ïðîâåðÿåì ôëàãè, îáðàáàòûâàåì òîëüêî çàïèñè UIN
  80.   ;
  81.   xor ecx, ecx
  82.   mov ch, [eax + ebx + 6]
  83.   mov cl, [eax + ebx + 7]
  84.  
  85.  
  86.   cmp ecx, 0           ; 0x0000   Buddy record (name: uin for ICQ and screenname for AIM)
  87.   jz ssi_uin
  88.  
  89.   ; debug
  90.   ;
  91.  
  92.   lea eax, [eax + ebx + 6]
  93.   mov ebx, 2
  94.   call print_mem
  95.  
  96.  
  97.   jmp ssi_get_end
  98.  
  99.  
  100.  ssi_uin:
  101.   ;
  102.   ; Êîïèðóåì UIN â òàáëèöó
  103.   ;
  104.   mov ecx, ebx  ; Äëèíà ñòðîêè
  105.   lea eax, [eax + 2]
  106.  
  107.   mov edx, [uin_ind]
  108.   cmp edx, UINS
  109.   jnb ssi_get_end      ;Íåò ñâîáîäíîãî ìåñòà â òàáëèöå UIN
  110.  
  111.   imul edx, UIN_LEN
  112.   mov ebx, uins
  113.   lea ebx, [ebx + edx]
  114.  
  115.   call strcpy
  116.  
  117.   inc [uin_ind]
  118.  
  119.   ;debug
  120.   ;mov eax, ebx
  121.   ;xor ebx, ebx
  122.   ;call writemsg
  123.  
  124.  
  125.   ;
  126.  ssi_get_end:
  127.   pop edx
  128.   pop ecx
  129.   pop ebx
  130.   pop eax
  131.  ret
  132.  
  133.  
  134. ;
  135. ; eax <- óêàçàòåëü íà item
  136. ; âîçâðàùàåò â eax óêàçàòåëü íà ñëåäóþùèé item
  137. ;
  138. ;
  139.  
  140.  ssi_next_item:
  141.  
  142.    push ebx
  143.    push ecx
  144.  
  145.    xor ebx, ebx
  146.    mov bl, [eax + 1]         ; äëèíà UIN
  147.    mov bh, [eax]             ;
  148.  
  149.    xor ecx, ecx
  150.    mov cl, [eax + ebx + 9]   ; Äëèíà äîïîëíèòåëüíûõ äàííûõ
  151.    mov ch, [eax + ebx + 8]   ;
  152.  
  153.    add ebx, ecx
  154.    add ebx, 10               ;+Äëèíà çàãîëîâêà
  155.  
  156.    lea eax, [eax + ebx]
  157.  
  158.  
  159.    pop ecx
  160.    pop ebx
  161.  ret
  162.  
  163.  
  164. ;
  165. ; eax <- óêàçàòåëü íà tlv
  166. ; âîçâðàùàåò â eax óêàçàòåëü íà ñëåä tlv
  167. ;
  168.  macro get_next_tlv {
  169.    push ebx
  170.  
  171.    xor ebx, ebx
  172.  
  173.    mov bl, [eax + 3]
  174.    mov bh, [eax + 2]
  175.  
  176.    ; + ðàçìåð çàãîëîâêà
  177.    lea ebx, [ebx + 4]
  178.  
  179.    lea eax, [eax + ebx]
  180.  
  181.    pop ebx
  182.  }
  183.  
  184.  
  185.  
  186. ;
  187. ; Èùåò â additional èìÿ è äð. ñâåäåíèÿ
  188. ; eax <- óêàçàòåëü íà item
  189. ;
  190.  ssi_get_add:
  191.    push eax
  192.    push ebx
  193.    push ecx
  194.    push edx
  195.    push esi
  196.  
  197.  
  198.    ;mov ebx, 128
  199.    ;call print_mem
  200.  
  201.  
  202.  
  203.  
  204.    xor ebx, ebx
  205.    mov bl, [eax + 1]      ; Length of the item name
  206.    mov bh, [eax]          ;
  207.  
  208.    ;;cmp ebx, 0             ; Åñëè äëèíà èìåíè = 0
  209.    ;;jz ssi_all_tlv         ; Íåò ñìûñëà îáðàáàòûâàòü
  210.  
  211.  
  212.    ;;+ñìåùåíèå äî ItemID
  213.  
  214.    ;;xor ecx, ecx
  215.    ;;mov ch, [eax + ebx + 4]
  216.    ;;mov cl, [eax + ebx + 5]  ; Item ID#
  217.    ;
  218.    ;;cmp ecx, 0               ; Ãðóïïû ïîêà íå îáðàáàòûâàþòñÿ
  219.    ;;jz ssi_all_tlv           ;
  220.    ;
  221.    ; Ïðîâåðÿåì ôëàãè, îáðàáàòûâàåì òîëüêî çàïèñè UIN
  222.    ;
  223.    xor ecx, ecx
  224.    mov ch, [eax + ebx + 6]
  225.    mov cl, [eax + ebx + 7]
  226.    
  227.    cmp ecx, 0           ; 0x0000          Buddy record (name: uin for ICQ and screenname for AIM)
  228.    jnz ssi_all_tlv
  229.  
  230.    
  231.    xor edx, edx
  232.    mov dl, [eax + ebx + 9]  ;
  233.    mov dh, [eax + ebx + 8]  ; Length of the additional data
  234.  
  235.  
  236.    lea eax, [eax + ebx + 10] ; eax óêàçàòåëü íà ïåðâûé tlv
  237.  
  238.  
  239.    ;FIXME : Iservd íå ïðèñûëàåò additional - ïîêà íå ìîãó îòëàäèòü
  240.    ;debug
  241.    ;push ebx
  242.    ;mov ebx, edx
  243.  
  244.    ;data_debug 'length additional data', ebx
  245.  
  246.    ;call print_mem
  247.    ;pop ebx
  248.    ;
  249.  
  250.  
  251.  
  252.    xor esi, esi
  253.  
  254.   ssi_tlv_process:
  255.    cmp esi, edx           ;
  256.    jnb ssi_all_tlv        ;  additional çàêîí÷èëîñü
  257.  
  258.    xor ecx, ecx
  259.    mov cl, [eax + 3]      ;
  260.    mov ch, [eax + 2]      ; TLV.Length
  261.  
  262.    xor ebx, ebx
  263.    mov bl, [eax + 1]      ; TLV.Type
  264.    mov bh, [eax]          ;
  265.  
  266.    cmp bx, 0x0131         ;Èìÿ ïîëüçîâàòåëÿ
  267.    jz ssi_name
  268.  
  269.    cmp bx, 0x0066         ;Îæèäàåì àâòîðèçàöèè
  270.    jz ssi_auth_wait
  271.  
  272.    jmp ssi_next_tlv
  273.  
  274.  
  275.   ssi_auth_wait:
  276.    ;
  277.    ;
  278.    ;
  279.    jmp ssi_next_tlv
  280.  
  281.  
  282.   ssi_name:
  283.  
  284.    ;
  285.    ; Ñêîïèðîâàòü èìÿ â ìàññèâ
  286.    ;
  287.    push eax
  288.    push ecx
  289.  
  290.    mov ebx, [name_ind]
  291.    cmp ebx, UINS
  292.    jnb ssi_name_end       ;Íåò ìåñòà â òàáëèöå
  293.  
  294.    lea eax, [eax + 4]     ;Óêàçàòåëü íà ñòðîêó (Ïðèáàâëÿåì ðàçìåð çàãîëîâêà TLV)
  295.  
  296.    imul ebx, NAME_LEN
  297.    lea ebx, [names + ebx]
  298.  
  299.    cmp ecx, NAME_LEN - 1     ; Åñëè èìÿ äëèííåå ïîëÿ â òàáëèöå
  300.    jna @f
  301.  
  302.    mov ecx, NAME_LEN - 1
  303.  
  304.   @@:
  305.    call strcpy
  306.  
  307.    ;; FIXIT
  308.    ;; Ïåðåêîäèðîâêà èìåíè
  309.    ;;
  310.    ;;mov eax, ebx
  311.    ;;call win2dos
  312.  
  313.    ;
  314.    ;debug
  315.    ;push eax
  316.    ;push ebx
  317.  
  318.    ;mov eax, ebx
  319.    ;xor ebx, ebx
  320.    ;call writemsg
  321.  
  322.    ;pop ebx
  323.    ;pop eax
  324.    ;
  325.    ;
  326.    inc [name_ind]
  327.  
  328.    pop ecx
  329.    pop eax
  330.  
  331.  
  332.  
  333.   ssi_next_tlv:
  334.    lea ecx, [ecx + 4] ; Äëèíà äàííûõ tlv + äëèíà çàãîëîâêà
  335.    add esi, ecx
  336.  
  337.    get_next_tlv
  338.    jmp ssi_tlv_process
  339.  
  340.  
  341.   ssi_name_end:
  342.    pop ecx
  343.    pop eax
  344.  
  345.  
  346.   ssi_all_tlv:
  347.  
  348.  
  349.    pop esi
  350.    pop edx
  351.    pop ecx
  352.    pop ebx
  353.    pop eax
  354.  ret
  355.  
  356. ;
  357. ;
  358. ; Îáðàáîòêà êîíòàêò ëèñòà, ïðèøåäøåãî îò ñåðâåðà
  359. ;
  360. ; â eax <- óêàçàòåëü íà äàííûå â ïàêåòå SNAC(13,06)
  361.  ssi_process_data:
  362.    push eax
  363.    push ebx
  364.    push ecx
  365.    push edx
  366.  
  367.    ;
  368.    ; Ïðîâåðèòü âåðñèþ ïðîòîêîëà
  369.    ;
  370.    xor ebx, ebx
  371.    mov bl, [eax]
  372.    cmp bl, 0
  373.    jnz ssi_bad_prot
  374.    ;
  375.    ;â ebx - êîëè÷åñòâî items
  376.    mov bl, [eax + 2]
  377.    mov bh, [eax + 1]
  378.    ;
  379.    data_debug 'SSI items:', ebx
  380.  
  381.    lea eax, [eax + 3] ; Óñòàíîâèòü eax íà ñïèñîê items
  382.  
  383.    xor ecx, ecx       ; Ñ÷åò÷èê items
  384.  
  385.  
  386.   ssi_next_uin:
  387.    cmp ecx, ebx
  388.    jnb ssi_all_items
  389.  
  390.  
  391.    call ssi_get_uin
  392.  
  393.    call ssi_get_add
  394.  
  395.    call ssi_next_item
  396.  
  397.    inc ecx
  398.    jmp ssi_next_uin
  399.  
  400.  
  401.  
  402.   ssi_bad_prot:
  403.    write_debug "ERR: SSI protocol version mismatch"
  404.  
  405.   ssi_all_items:
  406.  
  407.    pop edx
  408.    pop ecx
  409.    pop ebx
  410.    pop eax
  411.  ret
  412.  
  413.  
  414.