Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ;
  3. ; VNC Client for kolibrios by hidnplayr
  4. ;
  5. ;
  6. ; WORK IN PROGRESS...
  7. ;
  8. ; FEEL FREE TO CONTRIBUTE !
  9. ;
  10. ; hidnplayr@gmail.com
  11. ;
  12.  
  13. use32
  14.  
  15.     org     0x0
  16.  
  17.     db     'MENUET01'        ; 8 byte id
  18.     dd     0x01              ; header version
  19.     dd     START             ; start of code
  20.     dd     I_END             ; size of image
  21.     dd     IM_END            ; memory for app
  22.     dd     IM_END            ; esp
  23.     dd     0x0 , 0x0         ; I_Param , I_Icon
  24.  
  25. __DEBUG__ equ 1
  26. __DEBUG_LEVEL__ equ 1
  27.  
  28. STRLEN = 64      ; password and server max length
  29. xpos = 4         ; coordinates of image
  30. ypos = 22        ;
  31.  
  32. TIMEOUT = 60     ; timeout in seconds
  33. BUFFER  = 1500   ; Buffer size for DNS
  34.  
  35. include '..\..\macros.inc'
  36. include 'fdo.inc'
  37. include 'ETH.INC'
  38. include 'logon.inc'
  39. include 'raw.inc'
  40. include 'copyrect.inc'
  41. include 'thread.inc'
  42.  
  43. START:                                 ; start of execution
  44.  
  45.     call    red_logon
  46.  
  47.     mov     eax,40                     ; Report events
  48.     mov     ebx,00000000b              ; Only Stack
  49.     mcall
  50.  
  51.     mov     eax,67                     ; resize the window (hide it)
  52.     xor     ebx,ebx
  53.     mov     ecx,ebx
  54.     mov     edx,ebx
  55.     mov     esi,ebx
  56.     mcall
  57.  
  58.     mov     eax,51
  59.     mov     ebx,1
  60.     mov     ecx,thread_start
  61.     mov     edx,thread_stack
  62.     mcall
  63.  
  64.     DEBUGF 1,'Thread created: %u\n',eax
  65.  
  66.    @@:
  67.     mov     eax,5
  68.     mov     ebx,10
  69.     mcall
  70.  
  71.     cmp     byte[thread_ready],0
  72.     je      @r
  73.  
  74.     mov     eax,40                 ; report events
  75.     mov     ebx,100111b            ; mouse, button, key, redraw
  76.     mcall
  77.  
  78.     mov     eax,67                 ; resize the window
  79.     mov     ebx,10
  80.     mov     ecx,10
  81.     mov     edx,dword[framebuffer]
  82.     bswap   edx
  83.     movzx   esi,dx
  84.     shr     edx,16
  85.     add     edx,2*xpos
  86.     add     esi,ypos+xpos
  87.     mcall
  88.  
  89.   mainloop:
  90.     eth.socket_status [socket],eax
  91.     cmp     al,TCB_CLOSE_WAIT
  92.     je      close
  93.  
  94.     mov     eax,23                 ; wait for event with timeout
  95.     mov     ebx,50                 ; 0,5 s
  96.     mcall
  97.  
  98.     cmp     eax,1
  99.     je      redraw
  100.     cmp     eax,2                  ; key
  101.     je      key
  102.     cmp     eax,3                  ; button
  103.     je      button
  104.     cmp     eax,6                  ; mouse
  105.     je      mouse
  106.  
  107.     call    drawbuffer
  108.  
  109.     jmp     mainloop
  110.  
  111.   key:
  112.     DEBUGF 1,'Sending key event\n'
  113.  
  114.     mov     eax,2
  115.     mcall
  116.     mov     byte[keyevent.key+3],ah
  117.  
  118.     eth.write_tcp [socket],8,keyevent
  119.  
  120.     jmp     mainloop
  121.  
  122.   mouse:
  123.     DEBUGF 1,'Sending mouse event\n'
  124.  
  125.     mov     eax,37
  126.     mov     ebx,1
  127.     mcall
  128.  
  129.     sub     eax,xpos*65536+ypos
  130.     bswap   eax
  131.     mov     word[pointerevent.x],ax
  132.     shr     eax,16
  133.     mov     word[pointerevent.y],ax
  134.  
  135.     mov     eax,37
  136.     mov     ebx,2
  137.     mcall
  138.  
  139.     test    al,00000010b            ; test if right button was pressed  (bit 1 in kolibri)
  140.     jz      @f
  141.     add     al,00000010b            ; in RFB protocol it is bit 2, so if we add bit 2 again, we'll get bit 3 and bit 1 will remain the same
  142.    @@:
  143.  
  144.     mov     byte[pointerevent.mask],al
  145.  
  146.     eth.write_tcp [socket],6,pointerevent
  147.  
  148.     jmp     mainloop
  149.  
  150.   redraw:
  151.  
  152.     DEBUGF 1,'Drawing window\n'
  153.  
  154.     mcall 12, 1
  155.  
  156.     mov     eax,0                     ; draw window
  157.     mov     ebx,dword[framebuffer]
  158.     bswap   ebx
  159.     movzx   ecx,bx
  160.     shr     ebx,16
  161.     add     ebx,2*xpos
  162.     add     ecx,ypos+xpos
  163.     mov     edx,0xffffff
  164.     mcall
  165.  
  166.     mov     eax,4                     ; label
  167.     mov     ebx,9*65536+8
  168.     mov     ecx,0x10ffffff
  169.     mov     edx,name
  170.     mov     esi,[name_length]
  171.     bswap   esi
  172.     mcall
  173.  
  174.     call    drawbuffer
  175.  
  176.     mcall 12, 2
  177.  
  178.     jmp     mainloop
  179.  
  180.   drawbuffer:
  181.  
  182.     mov     eax,7
  183.     mov     ebx,framebuffer_data
  184.     mov     ecx,dword[screen]
  185.     mov     edx,xpos*65536+ypos
  186.     mcall
  187.  
  188.     ret
  189.  
  190.  
  191.   button:                         ; button
  192.     mov     eax,17                ; get id
  193.     mcall
  194.  
  195.   close:
  196.     call    read_data
  197. ;    eth.close_tcp [socket]             ; We're done, close the socket ;;; BUG WHEN CLOSING SOCKET !!
  198.     DEBUGF 1,'Socket closed\n'
  199.  
  200.     mov     eax,-1
  201.     mcall
  202.  
  203.     no_rfb:
  204.     DEBUGF 1,'This is no vnc server!\n'
  205.     jmp     close
  206.  
  207.     invalid_security:
  208.     DEBUGF 1,'Security error: %s\n',receive_buffer+5
  209.     jmp     close
  210.  
  211.  
  212. ; DATA AREA
  213.  
  214. include_debug_strings    ; ALWAYS present in data section
  215.  
  216. handshake          db 'RFB 003.003',0x0a
  217. shared             db 0
  218. beep               db 0x85,0x25,0x85,0x40,0
  219.  
  220. pixel_format32     db 0       ; setPixelformat
  221.                    rb 3       ; padding
  222. .bpp               db 32      ; bits per pixel
  223. .depth             db 32      ; depth
  224. .big_endian        db 0       ; big-endian flag
  225. .true_color        db 1       ; true-colour flag
  226. .red_max           db 0,255   ; red-max
  227. .green_max         db 0,255   ; green-max
  228. .blue_max          db 0,255   ; blue-max
  229. .red_shif          db 0       ; red-shift
  230. .green_shift       db 8       ; green-shift
  231. .blue_shift        db 16      ; blue-shift
  232.                    rb 3       ; padding
  233.  
  234. pixel_format16     db 0       ; setPixelformat
  235.                    rb 3       ; padding
  236. .bpp               db 16      ; bits per pixel
  237. .depth             db 15      ; depth
  238. .big_endian        db 0       ; big-endian flag
  239. .true_color        db 1       ; true-colour flag
  240. .red_max           db 0,31    ; red-max
  241. .green_max         db 0,31    ; green-max
  242. .blue_max          db 0,31    ; blue-max
  243. .red_shif          db 0       ; red-shift
  244. .green_shift       db 5       ; green-shift
  245. .blue_shift        db 10      ; blue-shift
  246.                    rb 3       ; padding
  247.  
  248. pixel_format8      db 0       ; setPixelformat
  249.                    rb 3       ; padding
  250. .bpp               db 8       ; bits per pixel
  251. .depth             db 6       ; depth
  252. .big_endian        db 0       ; big-endian flag
  253. .true_color        db 1       ; true-colour flag
  254. .red_max           db 0,3     ; red-max
  255. .green_max         db 0,3     ; green-max
  256. .blue_max          db 0,3     ; blue-max
  257. .red_shif          db 0       ; red-shift
  258. .green_shift       db 2       ; green-shift
  259. .blue_shift        db 4       ; blue-shift
  260.                    rb 3       ; padding
  261.  
  262. encodings          db 2       ; setEncodings
  263.                    rb 1       ; padding
  264.                    db 1,0     ; number of encodings
  265.                    db 0,0,0,0 ; raw encoding        (DWORD, Big endian order)
  266.                    db 1,0,0,0 ; Copyrect encoding
  267.  
  268. fbur               db 3       ; frame buffer update request
  269. .inc               db 0       ; incremental
  270. .x                 dw 0
  271. .y                 dw 0
  272. .width             dw 0
  273. .height            dw 0
  274.  
  275. keyevent           db 4       ; keyevent
  276. .down              db 0       ; down-flag
  277.                    dw 0       ; padding
  278. .key               dd 0       ; key
  279.  
  280. pointerevent       db 5       ; pointerevent
  281. .mask              db 0       ; button-mask
  282. .x                 dw 0       ; x-position
  283. .y                 dw 0       ; y-position
  284.  
  285. I_END:
  286.  
  287. framebuffer:
  288. .width             dw ?
  289. .height            dw ?
  290. pixelformat:
  291. .bpp               db ?
  292. .depth             db ?
  293. .big_endian        db ?
  294. .true_color        db ?
  295. .red_max           dw ?
  296. .green_max         dw ?
  297. .blue_max          dw ?
  298. .red_shift         db ?
  299. .green_shift       db ?
  300. .blue_shift        db ?
  301. .padding           rb 3
  302. name_length        dd ?
  303. name               rb 256
  304.  
  305. server_ip          dd 0
  306. server_port        dd 0
  307. socket             dd 0
  308. datapointer        dd 0
  309.  
  310. frame:
  311. .width             dw 0
  312. .height            dw 0
  313. .x                 dw 0
  314. .y                 dw 0
  315.  
  316. screen:
  317. .height            dw 0
  318. .width             dw 0
  319.  
  320. thread_ready       db 0
  321.  
  322. dnsMsg:
  323. receive_buffer     rb 5*1024*1024 ; 5 mb buffer for received data (incoming frbupdate etc)
  324. framebuffer_data   rb 1024*768*3  ; framebuffer
  325.  
  326. thread_stack       rb 0x1000
  327.  
  328. IM_END:
  329.  
  330.  
  331.