Subversion Repositories Kolibri OS

Rev

Rev 3562 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2013. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;                                                                 ;;
  7. ;;         GNU GENERAL PUBLIC LICENSE                              ;;
  8. ;;          Version 2, June 1991                                   ;;
  9. ;;                                                                 ;;
  10. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  11.  
  12.  
  13. socket_connect:
  14.  
  15. ;        cmp     [status], STATUS_CONNECTED     ; TODO
  16. ;        je      disconnect
  17.  
  18. ; ignore if status is not "disconnected"
  19.         cmp     [status], STATUS_DISCONNECTED
  20.         jne     .nothing
  21.  
  22.         mov     esi, str_connecting
  23.         call    print_text2
  24.         mov     esi, irc_server_name
  25.         call    print_text2
  26.         mov     esi, str_dotnewline
  27.         call    print_text2
  28.  
  29. ; update status
  30.         inc     [status]        ; was STATUS_DISCONNECTED, now STATUS_RESOLVING
  31.  
  32. ; resolve name
  33.         push    esp     ; reserve stack place
  34.         push    esp     ; fourth parameter
  35.         push    0       ; third parameter
  36.         push    0       ; second parameter
  37.         push    irc_server_name
  38.         call    [getaddrinfo]
  39.         pop     esi
  40. ; test for error
  41.         test    eax, eax
  42.         jnz     .fail_dns
  43.  
  44. ; fill in ip in sockstruct
  45.         mov     eax, [esi + addrinfo.ai_addr]
  46.         mov     eax, [eax + sockaddr_in.sin_addr]
  47.         mov     [sockaddr1.ip], eax
  48.  
  49. ; free allocated memory
  50.         push    esi
  51.         call    [freeaddrinfo]
  52.  
  53. ; update status
  54.         inc     [status]
  55.  
  56. ; connect
  57.         mcall   socket, AF_INET4, SOCK_STREAM, 0
  58.         cmp     eax, -1
  59.         jz      .fail
  60.         mov     [socketnum], eax
  61.  
  62.         mcall   connect, [socketnum], sockaddr1, 18
  63.         cmp     eax, -1
  64.         jz      .fail_refused
  65.  
  66.   .nothing:
  67.         ret
  68.  
  69.   .fail:
  70.         mov     [status], STATUS_DISCONNECTED
  71.  
  72.         mov     esi, str_sockerr
  73.         call    print_text2
  74.  
  75.         ret
  76.  
  77.   .fail_dns:
  78.         mov     [status], STATUS_DISCONNECTED
  79.  
  80.         mov     esi, str_dnserr
  81.         call    print_text2
  82.  
  83.         ret
  84.  
  85.   .fail_refused:
  86.         mov     [status], STATUS_DISCONNECTED
  87.  
  88.         mov     esi, str_refused
  89.         call    print_text2
  90.  
  91.         ret
  92.  
  93.  
  94.  
  95. socket_write_userinfo:
  96.  
  97. ; create packet in packetbuf
  98.         mov     edi, packetbuf
  99.  
  100.         mov     eax, 'NICK'
  101.         stosd
  102.         mov     al, ' '
  103.         stosb
  104.         mov     esi, user_nick
  105.         mov     ecx, MAX_NICK_LEN
  106.   .loop:
  107.         lodsb
  108.         test    al, al
  109.         jz      .done
  110.         stosb
  111.         dec     ecx
  112.         jnz     .loop
  113.   .done:
  114.         mov     ax, 0x0d0a
  115.         stosw
  116.  
  117.         mov     eax, 'USER'
  118.         stosd
  119.         mov     al, ' '
  120.         stosb
  121.         mov     esi, user_nick
  122.         mov     ecx, MAX_NICK_LEN
  123.   .loop2:
  124.         lodsb
  125.         test    al, al
  126.         jz      .done2
  127.         stosb
  128.         dec     ecx
  129.         jnz     .loop2
  130.   .done2:
  131.         mov     eax, ' 8 *'
  132.         stosd
  133.         mov     ax, ' :'
  134.         stosw
  135.         mov     al, ' '
  136.         stosb
  137.         mov     esi, user_real_name
  138.         mov     ecx, MAX_REAL_LEN
  139.   .loop3:
  140.         lodsb
  141.         test    al, al
  142.         jz      .done3
  143.         stosb
  144.         dec     ecx
  145.         jnz     .loop3
  146.   .done3:
  147.         mov     ax, 0x0d0a
  148.         stosw
  149.  
  150.         lea     esi, [edi - packetbuf]
  151.         mcall   send, [socketnum], packetbuf, , 0
  152.  
  153.         ret
  154.  
  155.  
  156.  
  157.  
  158. process_network_event:
  159. ; values for status: 0, 1, 2, 3
  160.         mov     eax, [status]
  161.         dec     eax
  162. ; 0 = STATUS_DISCONNECTED - do nothing
  163. ; (ignore network events if we are disconnected from network)
  164.         js      .nothing
  165. ; 1 = STATUS_RESOLVING
  166.         jz      .nothing
  167. ; 2 = STATUS_CONNECTING
  168.         dec     eax
  169.         jz      .connecting
  170. ; 3 = STATUS_CONNECTED
  171.         jmp     .connected
  172.  
  173.   .nothing:
  174.         ret
  175.  
  176.   .connecting:
  177.         call    socket_write_userinfo
  178.  
  179. ; The connection has been established, change status from "connecting" to "connected".
  180.         inc     [status]
  181.  
  182.   .connected:
  183.         call    read_incoming_data
  184.         ret
  185.  
  186.  
  187. disconnect:
  188.  
  189.         cmp     [status], STATUS_DISCONNECTED
  190.         je      .nothing
  191.  
  192.         mcall   close, [socketnum]
  193.  
  194.         mov     [status], STATUS_DISCONNECTED
  195.  
  196.   .nothing:
  197.         ret
  198.  
  199.  
  200.  
  201. read_incoming_data:
  202.  
  203.         pusha
  204.  
  205. ; TODO: read more data if we receive one full packet
  206.  
  207.   .nextpacket:
  208.         mcall   recv, [socketnum], packetbuf, 1024      ; read a packet
  209.         inc     eax                                     ; check if we got one
  210.         jz      .done
  211.         dec     eax
  212.         jz      .done
  213.  
  214. ; ok we have data, now feed it to the recoder
  215.  
  216.         lea     edx, [packetbuf + eax]                  ; edx = end pointer
  217.         mov     esi, packetbuf                          ; esi = start pointer
  218.   .nextcommand:
  219.         mov     edi, servercommand
  220.   .byteloop:
  221.         call    get_next_byte                           ; reads byte from [esi] to al
  222.         jnc     .nextpacket                             ; if CF is set, we need more data
  223.         cmp     al, 10
  224.         je      .got_command
  225.         cmp     al, 13
  226.         je      .got_command
  227.         stosb
  228.         jmp     .byteloop
  229.  
  230. ; we have a command, call the serverparser
  231.  
  232.   .got_command:
  233.         mov     byte[edi], 0                            ; mark the end of the command
  234.         push    esi edx
  235.         call    server_parser
  236.         pop     edx esi
  237.         jmp     .nextcommand
  238.  
  239.   .done:
  240.         popa
  241.  
  242.         ret