Subversion Repositories Kolibri OS

Rev

Rev 3545 | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. thread_start:
  3.  
  4.         DEBUGF  1, 'I am the thread!\n'
  5.  
  6.         mcall   40, 0
  7.  
  8. ; resolve name
  9.         push    esp     ; reserve stack place
  10.         invoke  getaddrinfo, first, 0, 0, esp
  11.         pop     esi
  12. ; test for error
  13.         test    eax, eax
  14.         jnz     exit
  15.  
  16.         mov     eax, [esi+addrinfo.ai_addr]
  17.         mov     eax, [eax+sockaddr_in.sin_addr]
  18.         mov     [sockaddr1.ip], eax
  19.  
  20. ;        DEBUGF  1, 'Connecting to %u.%u.%u.%u:%u\n', \
  21. ;                [server_ip]:1, [server_ip+1]:1, \
  22. ;                [server_ip+2]:1, [server_ip+3]:1, \
  23. ;                [server_port]:2
  24.  
  25.         mcall   socket, AF_INET4, SOCK_STREAM, 0
  26.         mov     [socketnum], eax
  27.         mcall   connect, [socketnum], sockaddr1, 18
  28.  
  29.         call    wait_for_data
  30.  
  31.         cmp     dword [receive_buffer], 'RFB '
  32.         jne     no_rfb
  33.         DEBUGF  1, 'received: %s\n', receive_buffer
  34.         mcall   send, [socketnum], handshake, 12, 0
  35.         DEBUGF  1, 'Sending handshake: protocol version\n'
  36.  
  37.         call    wait_for_data
  38.  
  39.         cmp     dword [receive_buffer], 0x00000000
  40.         je      invalid_security
  41.  
  42.         cmp     dword [receive_buffer], 0x01000000
  43.         je      no_security
  44.  
  45.         cmp     dword [receive_buffer], 0x02000000
  46.         je      vnc_security
  47.  
  48.         jmp     exit
  49.  
  50. vnc_security:
  51.         mov     byte[mode], 1
  52.         call    red_logon
  53.  
  54. no_security:
  55.         mcall   send, [socketnum], shared, 1, 0
  56.         DEBUGF  1, 'Sending handshake: shared session?\n'
  57.  
  58.         call    wait_for_data       ; now the server should send init message
  59.  
  60.         DEBUGF  1, 'Serverinit: bpp: %u depth: %u bigendian: %u truecolor: %u\n', \
  61.                 [receive_buffer+framebuffer.pixelformat.bpp]:1, \
  62.                 [receive_buffer+framebuffer.pixelformat.depth]:1, \
  63.                 [receive_buffer+framebuffer.pixelformat.big_endian]:1, \
  64.                 [receive_buffer+framebuffer.pixelformat.true_color]:1
  65.  
  66.         mov     eax, dword [receive_buffer]
  67.         mov     dword [fbur.width], eax
  68.         bswap   eax
  69.         mov     dword [screen], eax
  70.  
  71.         mcall   send, [socketnum], pixel_format8, 20, 0
  72.         DEBUGF  1, 'Sending pixel format\n'
  73.         call    read_data
  74.  
  75. ;    eth.write_tcp [socket],8,encodings
  76. ;    DEBUGF 1,'Sending encoding info\n'
  77. ;    call    read_data
  78.  
  79.         mov     byte [thread_ready], 1
  80.  
  81. request_rfb:
  82.         mov     [fbur.inc], 2
  83.         mcall   send, [socketnum], fbur, 10, 0
  84.  
  85. thread_loop:
  86.         call    read_data              ; Read the data into the buffer
  87.  
  88. ;        cmp     eax, 2
  89. ;        jb      mainloop
  90.  
  91.         DEBUGF 1,'Data received, %u bytes\n', eax
  92.  
  93.         cmp     byte [receive_buffer],0
  94.         je      framebufferupdate
  95.  
  96.         cmp     byte [receive_buffer],1
  97.         je      setcolourmapentries
  98.  
  99.         cmp     byte [receive_buffer],2
  100.         je      bell
  101.  
  102.         cmp     byte [receive_buffer],3
  103.         je      servercuttext
  104.  
  105.         jmp     thread_loop
  106.  
  107. align 4
  108. framebufferupdate:
  109.  
  110.         mov     ax, word [receive_buffer+2]
  111.         xchg    al, ah
  112.         mov     di, ax
  113.         DEBUGF  1, 'Framebufferupdate: %u frames\n', di
  114.         mov     esi, receive_buffer+4
  115.         jmp     rectangle_loop
  116.  
  117.  
  118. next_rectangle:
  119.         call    drawbuffer
  120.  
  121.         dec     di
  122.         test    di, di
  123.         jz      request_rfb
  124.  
  125. rectangle_loop:
  126.  
  127.         mov     edx, [esi]
  128.         bswap   edx
  129.         mov     ebx, edx
  130.         shr     edx, 16
  131.         mov     [frame.x], dx
  132.         mov     [frame.y], bx
  133.         add     esi, 4
  134.         mov     ecx, [esi]
  135.         bswap   ecx
  136.         mov     eax, ecx
  137.         shr     ecx, 16
  138.         mov     [frame.width], cx
  139.         mov     [frame.height], ax
  140.         add     esi, 4
  141.         mov     eax, [esi]
  142.         add     esi, 4
  143.  
  144.         mov     ebx, esi
  145.         sub     ebx, receive_buffer+12
  146.         DEBUGF  1, 'frame: width=%u height=%u x=%u y=%u offset:%u encoding:',\
  147.                 [frame.width]:2, [frame.height]:2, [frame.x]:2, [frame.y]:2, ebx
  148.  
  149.         cmp     eax, 0
  150.         je      encoding_raw
  151. ;        cmp     eax, 1
  152. ;        je      encoding_copyrect
  153.         cmp     eax, 2
  154.         je      encoding_RRE
  155.         cmp     eax, 5
  156.         je      encoding_hextile
  157.         cmp     eax, 16
  158.         je      encoding_ZRLE
  159.  
  160.         mov     ebx, esi
  161.         sub     ebx, receive_buffer+8
  162.         DEBUGF  1, '\nunknown encoding: %u (offset %u)\n', eax, ebx
  163.         jmp     bell
  164.         jmp     thread_loop
  165.  
  166. encoding_RRE:
  167.  
  168.         DEBUGF  1, 'RRE\n'
  169.  
  170.         jmp     next_rectangle
  171.  
  172. encoding_hextile:
  173.  
  174.         DEBUGF  1, 'hextile\n'
  175.  
  176.         jmp     next_rectangle
  177.  
  178. encoding_ZRLE:
  179.  
  180.         DEBUGF  1, 'ZRLE\n'
  181.  
  182.         jmp     next_rectangle
  183.  
  184. setcolourmapentries:
  185.  
  186.         DEBUGF  1, 'Server sent SetColourMapEntries message\n'
  187.  
  188.         jmp     thread_loop
  189.  
  190.  
  191. bell:
  192.         mcall   55, 55, , , beep
  193.  
  194.         jmp     thread_loop
  195.  
  196.  
  197. servercuttext:
  198.  
  199.         DEBUGF  1, 'Server cut text\n'
  200.  
  201.         jmp     thread_loop
  202.  
  203.  
  204. read_data:
  205.         mov     [datapointer], receive_buffer
  206.   .loop:
  207.         mcall   recv, [socketnum], [datapointer], 4096, 0
  208.         cmp     eax, -1
  209.         je      .done
  210.  
  211.         add     [datapointer], eax
  212.  
  213.         cmp     eax, 4096
  214.         je      .loop
  215.  
  216.   .done:
  217.         mov     eax, [datapointer]
  218.         sub     eax, receive_buffer
  219.         ret
  220.  
  221.  
  222.  
  223. wait_for_data:
  224.         mcall   recv, [socketnum], receive_buffer, 4096, 0
  225.         cmp     eax, -1
  226.         je      wait_for_data
  227.         test    eax, eax
  228.         jz      wait_for_data
  229.  
  230.         ret
  231.  
  232.