Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2010-2015. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;  vncc.asm - VNC client for KolibriOS                            ;;
  7. ;;                                                                 ;;
  8. ;;  Written by hidnplayr@kolibrios.org                             ;;
  9. ;;                                                                 ;;
  10. ;;          GNU GENERAL PUBLIC LICENSE                             ;;
  11. ;;             Version 2, June 1991                                ;;
  12. ;;                                                                 ;;
  13. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14.  
  15. format binary as ""
  16.  
  17. __DEBUG__       = 1
  18. __DEBUG_LEVEL__ = 1
  19.  
  20. xpos            = 4             ; coordinates of image
  21. ypos            = 22            ;
  22.  
  23. TIMEOUT         = 5             ; timeout in seconds
  24.  
  25. use32
  26.  
  27.         org     0x0
  28.  
  29.         db      "MENUET01"      ; 8 byte id
  30.         dd      0x01            ; header version
  31.         dd      START           ; start of code
  32.         dd      I_END           ; size of image
  33.         dd      IM_END          ; memory for app
  34.         dd      IM_END          ; esp
  35.         dd      0x0 , 0x0       ; I_Param , I_Path
  36.  
  37.  
  38. include "../../macros.inc"
  39. include "../../debug-fdo.inc"
  40. include "../../proc32.inc"
  41. include "../../dll.inc"
  42. include "../../struct.inc"
  43. include "../../develop/libraries/box_lib/trunk/box_lib.mac"
  44. include "../../network.inc"
  45.  
  46. struct  pixel_format
  47.         bpp             db ?
  48.         depth           db ?
  49.         big_endian      db ?
  50.         true_color      db ?
  51.         red_max         dw ?
  52.         green_max       dw ?
  53.         blue_max        dw ?
  54.         red_shift       db ?
  55.         green_shift     db ?
  56.         blue_shift      db ?
  57.         padding         rb 3
  58. ends
  59.  
  60. struct  framebuffer
  61.         width           dw ?
  62.         height          dw ?
  63.         pixelformat     pixel_format
  64.         name_length     dd ?
  65.         name            rb 256
  66. ends
  67.  
  68. include "logon.inc"
  69. include "raw.inc"
  70. include "copyrect.inc"
  71. include "thread.inc"
  72.  
  73. START:
  74.  
  75.         mcall   68, 11                  ; init heap
  76.  
  77. ; load libraries
  78.         stdcall dll.Load, @IMPORT
  79.         test    eax, eax
  80.         jnz     exit
  81.  
  82.         call    logon
  83.  
  84.         mcall   40, 0                   ; disable all events
  85.         mcall   67, 0, 0, 0, 0          ; resize the window (hide it)
  86.         mcall   51, 1, thread_start, thread_stack
  87.  
  88.         DEBUGF  1,"Thread created: %u\n", eax
  89.  
  90.       @@:
  91.         mcall   5, 10
  92.         cmp     byte[thread_ready], 0
  93.         je      @r
  94.  
  95.         mcall   40, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_KEY + EVM_REDRAW + EVM_BUTTON
  96.  
  97.         mov     edx, dword[screen]
  98.         movzx   esi, dx
  99.         shr     edx, 16
  100.         add     edx, 2*xpos
  101.         add     esi, ypos+xpos
  102.         mcall   67, 10, 10              ; resize the window
  103.  
  104. mainloop:
  105.         mcall   10                      ; wait for event
  106.  
  107.         dec     eax
  108.         jz      redraw
  109.         dec     eax
  110.         jz      key
  111.         dec     eax
  112.         jz      button
  113.         sub     eax, 3
  114.         jz      mouse
  115.         jmp     mainloop
  116.  
  117. key:
  118.  
  119. ;        DEBUGF  1,"Sending key event\n"
  120.  
  121.         mcall   2
  122.         mov     byte[keyevent.key+3], ah
  123.  
  124.         mcall   send, [socketnum], keyevent, 8, 0
  125.         jmp     mainloop
  126.  
  127. mouse:
  128.  
  129. ;        DEBUGF  1,"Sending mouse event\n"
  130.  
  131.         mcall   37, 1           ; get mouse pos
  132.         sub     eax, xpos shl 16 + ypos
  133.         bswap   eax
  134.         mov     [pointerevent.x], ax
  135.         shr     eax, 16
  136.         mov     [pointerevent.y], ax
  137.  
  138.         mcall   37, 2           ; get mouse buttons
  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.         mov     [pointerevent.mask],al
  144.  
  145.         mcall   send, [socketnum], pointerevent, 6, 0
  146.         jmp     mainloop
  147.  
  148. redraw:
  149.  
  150. ;        DEBUGF  1,"Drawing window\n"
  151.  
  152.         mcall   12, 1
  153.  
  154.         mov     ebx, dword[screen]
  155.         movzx   ecx, bx
  156.         shr     ebx, 16
  157.         mov     edx, 0x74ffffff
  158.         mov     edi, name
  159.         mcall   0               ; draw window
  160.  
  161.         call    drawbuffer
  162.  
  163.         mcall   12, 2
  164.  
  165.         jmp     mainloop
  166.  
  167. drawbuffer:
  168.         mcall   7, framebuffer_data, dword[screen], 0
  169.         ret
  170.  
  171. button:
  172.         mcall   17              ; get id
  173.  
  174. exit:
  175.         DEBUGF  1, "Closing time!\n"
  176.         mcall   close, [socketnum]
  177.         mcall   -1
  178.  
  179. no_rfb:
  180.         DEBUGF  1, "This is no vnc server!\n"
  181.         jmp     exit
  182.  
  183. invalid_security:
  184.         DEBUGF  1, "Security error: %s\n", receive_buffer+5
  185.         jmp     exit
  186.  
  187.  
  188. ; DATA AREA
  189.  
  190. include_debug_strings    ; ALWAYS present in data section
  191.  
  192. handshake          db "RFB 003.003", 10
  193. ClientInit         db 0         ; not shared
  194. beep               db 0x85, 0x25, 0x85, 0x40, 0
  195.  
  196. pixel_format32     db 0         ; setPixelformat
  197.                    db 0, 0, 0   ; padding
  198. .bpp               db 32        ; bits per pixel
  199. .depth             db 32        ; depth
  200. .big_endian        db 0         ; big-endian flag
  201. .true_color        db 1         ; true-colour flag
  202. .red_max           db 0, 255    ; red-max
  203. .green_max         db 0, 255    ; green-max
  204. .blue_max          db 0, 255    ; blue-max
  205. .red_shif          db 0         ; red-shift
  206. .green_shift       db 8         ; green-shift
  207. .blue_shift        db 16        ; blue-shift
  208.                    db 0, 0, 0   ; padding
  209.  
  210. pixel_format16     db 0         ; setPixelformat
  211.                    db 0, 0, 0   ; padding
  212. .bpp               db 16        ; bits per pixel
  213. .depth             db 15        ; depth
  214. .big_endian        db 0         ; big-endian flag
  215. .true_color        db 1         ; true-colour flag
  216. .red_max           db 0, 31     ; red-max
  217. .green_max         db 0, 31     ; green-max
  218. .blue_max          db 0, 31     ; blue-max
  219. .red_shif          db 0         ; red-shift
  220. .green_shift       db 5         ; green-shift
  221. .blue_shift        db 10        ; blue-shift
  222.                    db 0, 0, 0   ; padding
  223.  
  224. pixel_format8      db 0         ; setPixelformat
  225.                    db 0, 0, 0   ; padding
  226. .bpp               db 8         ; bits per pixel
  227. .depth             db 6         ; depth
  228. .big_endian        db 0         ; big-endian flag
  229. .true_color        db 1         ; true-colour flag
  230. .red_max           db 0, 3      ; red-max
  231. .green_max         db 0, 3      ; green-max
  232. .blue_max          db 0, 3      ; blue-max
  233. .red_shif          db 0         ; red-shift
  234. .green_shift       db 2         ; green-shift
  235. .blue_shift        db 4         ; blue-shift
  236.                    db 0, 0, 0   ; padding
  237.  
  238. encodings          db 2         ; setEncodings
  239.                    db 0         ; padding
  240.                    db 0, 2      ; number of encodings
  241.                    db 0, 0, 0, 0        ; raw encoding        (DWORD, Big endian order)
  242.                    db 0, 0, 0, 1        ; Copyrect encoding
  243. ;                   db 0, 0, 0, 2        ; RRE
  244. ;                   db 0, 0, 0, 5        ; HexTile
  245. ;                   db 0, 0, 0, 15       ; TRLE
  246. ;                   db 0, 0, 0, 16       ; ZRLE
  247.  
  248. fbur               db 3         ; frame buffer update request
  249. .inc               db 0         ; incremental
  250. .x                 dw 0
  251. .y                 dw 0
  252. .width             dw 0
  253. .height            dw 0
  254.  
  255. keyevent           db 4         ; keyevent
  256. .down              db 0         ; down-flag
  257.                    dw 0         ; padding
  258. .key               dd 0         ; key
  259.  
  260. pointerevent       db 5         ; pointerevent
  261. .mask              db 0         ; button-mask
  262. .x                 dw 0         ; x-position
  263. .y                 dw 0         ; y-position
  264.  
  265.  
  266. sockaddr1:
  267.         dw AF_INET4
  268. .port   dw 0x0c17               ; 5900
  269. .ip     dd 0
  270.         rb 10
  271.  
  272. thread_ready    db 0
  273. mouse_dd        dd ?
  274.  
  275. URLbox          edit_box 200, 25, 16, 0xffffff, 0x6f9480, 0, 0, 0, 65535, serveraddr, mouse_dd, ed_focus, 0, 0
  276.  
  277. ; import
  278. align 4
  279. @IMPORT:
  280.  
  281. library network,                "network.obj",\
  282.         box_lib,                "box_lib.obj",\
  283.         archiver,               "archiver.obj"
  284.  
  285. import  network,\
  286.         getaddrinfo,            "getaddrinfo",  \
  287.         freeaddrinfo,           "freeaddrinfo", \
  288.         inet_ntoa,              "inet_ntoa"
  289.  
  290. import  box_lib,\
  291.         edit_box_draw,          "edit_box",\
  292.         edit_box_key,           "edit_box_key",\
  293.         edit_box_mouse,         "edit_box_mouse",\
  294.         scrollbar_v_draw,       "scrollbar_v_draw",\
  295.         scrollbar_v_mouse,      "scrollbar_v_mouse",\
  296.         scrollbar_h_draw,       "scrollbar_h_draw",\
  297.         scrollbar_h_mouse,      "scrollbar_h_mouse"
  298.  
  299. import  archiver,\
  300.         deflate_unpack,         "deflate_unpack"
  301.  
  302. name                    db "VNC client "
  303. name.dash               db 0, " "
  304.  
  305. I_END:
  306.  
  307. servername              rb 64+1
  308.  
  309. socketnum               dd ?
  310. datapointer             dd ?
  311. rectangles              dw ?
  312.  
  313. rectangle:
  314. .width                  dw ?
  315. .height                 dw ?
  316. .x                      dw ?
  317. .y                      dw ?
  318.  
  319. screen:                 ; Remote screen resolution
  320. .height                 dw ?
  321. .width                  dw ?
  322.  
  323. serveraddr              rb 65536
  324. receive_buffer          rb 5*1024*1024  ; 5 mb buffer for received data (incoming frbupdate etc)
  325. framebuffer_data        rb 1024*1024*3  ; framebuffer
  326.  
  327.                         rb 0x1000
  328. thread_stack:
  329.  
  330.                         rb 0x1000
  331.  
  332. IM_END:
  333.  
  334.  
  335.