Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ;
  3. ; VNC Client for kolibrios by hidnplayr
  4. ;
  5. ; hidnplayr@gmail.com
  6. ;
  7.  
  8. format binary as ""
  9.  
  10. use32
  11.  
  12.         org     0x0
  13.  
  14.         db      'MENUET01'              ; 8 byte id
  15.         dd      0x01                    ; header version
  16.         dd      START                   ; start of code
  17.         dd      I_END                   ; size of image
  18.         dd      IM_END                  ; memory for app
  19.         dd      IM_END                  ; esp
  20.         dd      0x0 , 0x0               ; I_Param , I_Path
  21.  
  22. __DEBUG__ equ 1
  23. __DEBUG_LEVEL__ equ 1
  24.  
  25. STRLEN = 64      ; password and server max length
  26. xpos = 4         ; coordinates of image
  27. ypos = 22        ;
  28.  
  29. TIMEOUT = 5     ; timeout in seconds
  30.  
  31. include '../macros.inc'
  32. include '../debug-fdo.inc'
  33. include '../proc32.inc'
  34. include '../dll.inc'
  35. include '../struct.inc'
  36. include '../network.inc'
  37.  
  38. include 'structs.inc'
  39. include 'logon.inc'
  40. include 'raw.inc'
  41. include 'thread.inc'
  42.  
  43. START:
  44.  
  45.         mcall   68, 11                  ; init heap
  46.  
  47. ; load libraries
  48.         stdcall dll.Load, @IMPORT
  49.         test    eax, eax
  50.         jnz     exit
  51.  
  52.         call    red_logon
  53.  
  54.         mcall   40, 0                   ; no events
  55.         mcall   67, 0, 0, 0, 0          ; resize the window (hide it)
  56.         mcall   51, 1, thread_start, thread_stack
  57.  
  58.         DEBUGF 1,'Thread created: %u\n', eax
  59.  
  60.       @@:
  61.         mcall   5, 10
  62.         cmp     byte [thread_ready], 0
  63.         je      @r
  64.  
  65.         mcall   40, 100111b             ; mouse, button, key, redraw
  66.  
  67.  
  68.         mov     edx, dword [screen]
  69.         movzx   esi, dx
  70.         shr     edx, 16
  71.         add     edx, 2*xpos
  72.         add     esi, ypos+xpos
  73.         mcall   67, 10, 10              ; resize the window
  74.  
  75. mainloop:
  76.         mcall   23, 50                  ; wait for event, 0,5s timeout
  77.  
  78.         dec     eax
  79.         jz      redraw
  80.  
  81.         dec     eax
  82.         jz      key
  83.  
  84.         dec     eax
  85.         jz      button
  86.  
  87.         sub     eax, 3
  88.         jz      mouse
  89.  
  90.         jmp     mainloop
  91.  
  92. key:
  93.  
  94.         DEBUGF  1,'Sending key event\n'
  95.  
  96.         mcall   2
  97.         mov     byte [keyevent.key+3], ah
  98.  
  99.         mcall   send, [socketnum], keyevent, 8, 0
  100.         jmp     mainloop
  101.  
  102. mouse:
  103.  
  104.         DEBUGF  1,'Sending mouse event\n'
  105.  
  106.         mcall   37, 1           ; get mouse pos
  107.         sub     eax, xpos shl 16 + ypos
  108.         bswap   eax
  109.         mov     [pointerevent.x], ax
  110.         shr     eax, 16
  111.         mov     [pointerevent.y], ax
  112.  
  113.         mcall   37, 2           ; get mouse buttons
  114.         test    al, 00000010b   ; test if right button was pressed  (bit 1 in kolibri)
  115.         jz      @f
  116.         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
  117.       @@:
  118.         mov     [pointerevent.mask],al
  119.  
  120.         mcall   send, [socketnum], pointerevent, 6, 0
  121.         jmp     mainloop
  122.  
  123. redraw:
  124.  
  125.         DEBUGF  1,'Drawing window\n'
  126.  
  127.         mcall   12, 1
  128.  
  129.         mov     ebx, dword[screen]
  130.         movzx   ecx, bx
  131.         shr     ebx, 16
  132.         mov     edx, 0x74ffffff
  133.         mov     edi, name
  134.         mcall   0               ; draw window
  135.  
  136.         call    drawbuffer
  137.  
  138.         mcall   12, 2
  139.  
  140.         jmp     mainloop
  141.  
  142. drawbuffer:
  143.  
  144.         mcall   7, framebuffer_data, dword[screen], 0
  145.         ret
  146.  
  147.  
  148. button:
  149.         mcall   17              ; get id
  150.  
  151. exit:
  152.         DEBUGF  1, 'Closing time!\n'
  153.         mcall   close, [socketnum]
  154.         mcall   -1
  155.  
  156. no_rfb:
  157.         DEBUGF  1, 'This is no vnc server!\n'
  158.         jmp     exit
  159.  
  160. invalid_security:
  161.         DEBUGF  1, 'Security error: %s\n', receive_buffer+5
  162.         jmp     exit
  163.  
  164.  
  165. ; DATA AREA
  166.  
  167. include_debug_strings    ; ALWAYS present in data section
  168.  
  169. handshake          db 'RFB 003.003', 10
  170. shared             db 0
  171. beep               db 0x85,0x25,0x85,0x40,0
  172.  
  173. pixel_format32     db 0       ; setPixelformat
  174.                    rb 3       ; padding
  175. .bpp               db 32      ; bits per pixel
  176. .depth             db 32      ; depth
  177. .big_endian        db 0       ; big-endian flag
  178. .true_color        db 1       ; true-colour flag
  179. .red_max           db 0,255   ; red-max
  180. .green_max         db 0,255   ; green-max
  181. .blue_max          db 0,255   ; blue-max
  182. .red_shif          db 0       ; red-shift
  183. .green_shift       db 8       ; green-shift
  184. .blue_shift        db 16      ; blue-shift
  185.                    rb 3       ; padding
  186.  
  187. pixel_format16     db 0       ; setPixelformat
  188.                    rb 3       ; padding
  189. .bpp               db 16      ; bits per pixel
  190. .depth             db 15      ; depth
  191. .big_endian        db 0       ; big-endian flag
  192. .true_color        db 1       ; true-colour flag
  193. .red_max           db 0,31    ; red-max
  194. .green_max         db 0,31    ; green-max
  195. .blue_max          db 0,31    ; blue-max
  196. .red_shif          db 0       ; red-shift
  197. .green_shift       db 5       ; green-shift
  198. .blue_shift        db 10      ; blue-shift
  199.                    rb 3       ; padding
  200.  
  201. pixel_format8      db 0       ; setPixelformat
  202.                    rb 3       ; padding
  203. .bpp               db 8       ; bits per pixel
  204. .depth             db 6       ; depth
  205. .big_endian        db 0       ; big-endian flag
  206. .true_color        db 1       ; true-colour flag
  207. .red_max           db 0,3     ; red-max
  208. .green_max         db 0,3     ; green-max
  209. .blue_max          db 0,3     ; blue-max
  210. .red_shif          db 0       ; red-shift
  211. .green_shift       db 2       ; green-shift
  212. .blue_shift        db 4       ; blue-shift
  213.                    rb 3       ; padding
  214.  
  215. encodings          db 2       ; setEncodings
  216.                    rb 1       ; padding
  217.                    db 1,0     ; number of encodings
  218.                    db 0,0,0,0 ; raw encoding        (DWORD, Big endian order)
  219.                    db 1,0,0,0 ; Copyrect encoding
  220.  
  221. fbur               db 3       ; frame buffer update request
  222. .inc               db 0       ; incremental
  223. .x                 dw 0
  224. .y                 dw 0
  225. .width             dw 0
  226. .height            dw 0
  227.  
  228. keyevent           db 4       ; keyevent
  229. .down              db 0       ; down-flag
  230.                    dw 0       ; padding
  231. .key               dd 0       ; key
  232.  
  233. pointerevent       db 5       ; pointerevent
  234. .mask              db 0       ; button-mask
  235. .x                 dw 0       ; x-position
  236. .y                 dw 0       ; y-position
  237.  
  238.  
  239. sockaddr1:
  240.         dw AF_INET4
  241. .port   dw 0x0c17       ; 5900
  242. .ip     dd 0
  243.         rb 10
  244.  
  245. thread_ready    db 0
  246. ; import
  247. align 4
  248. @IMPORT:
  249.  
  250. library         network, 'network.obj'
  251. import          network,        \
  252.                 getaddrinfo,    'getaddrinfo',  \
  253.                 freeaddrinfo,   'freeaddrinfo', \
  254.                 inet_ntoa,      'inet_ntoa'
  255.  
  256. name    db 'VNC client', 0
  257.  
  258. I_END:
  259.  
  260. socketnum          dd ?
  261. datapointer        dd ?
  262.  
  263. frame:
  264. .width             dw ?
  265. .height            dw ?
  266. .x                 dw ?
  267. .y                 dw ?
  268.  
  269. screen:
  270. .height            dw ?
  271. .width             dw ?
  272.  
  273. receive_buffer     rb 5*1024*1024 ; 5 mb buffer for received data (incoming frbupdate etc)
  274. framebuffer_data   rb 1024*768*3  ; framebuffer
  275.  
  276.  
  277.                 rb 0x1000
  278. thread_stack:
  279.  
  280.                 rb 0x1000
  281. IM_END:
  282.  
  283.  
  284.