Subversion Repositories Kolibri OS

Rev

Rev 5668 | Rev 5677 | 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. ;;  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__ = 2
  19.  
  20. use32
  21.  
  22.         org     0x0
  23.  
  24.         db      "MENUET01"      ; 8 byte id
  25.         dd      0x01            ; header version
  26.         dd      START           ; start of code
  27.         dd      I_END           ; size of image
  28.         dd      IM_END          ; memory for app
  29.         dd      IM_END          ; esp
  30.         dd      0x0, 0x0        ; I_Param , I_Path
  31.  
  32. include "../../macros.inc"
  33. include "../../debug-fdo.inc"
  34. include "../../proc32.inc"
  35. include "../../dll.inc"
  36. include "../../struct.inc"
  37. include "../../develop/libraries/box_lib/trunk/box_lib.mac"
  38. include "../../network.inc"
  39.  
  40. struct  pixel_format
  41.         bpp             db ?
  42.         depth           db ?
  43.         big_endian      db ?
  44.         true_color      db ?
  45.         red_max         dw ?
  46.         green_max       dw ?
  47.         blue_max        dw ?
  48.         red_shift       db ?
  49.         green_shift     db ?
  50.         blue_shift      db ?
  51.         padding         rb 3
  52. ends
  53.  
  54. struct  framebuffer
  55.         width           dw ?
  56.         height          dw ?
  57.         pixelformat     pixel_format
  58.         name_length     dd ?
  59.         name            rb 256
  60. ends
  61.  
  62. xpos                    = 4
  63. ypos                    = 21
  64.  
  65. TIMEOUT                 = 5             ; timeout in seconds
  66.  
  67. RECEIVE_BUFFER_SIZE     = 8*1024*1024   ; 8 Mib
  68.  
  69. STATUS_INITIAL          = 0
  70. STATUS_CONNECTING       = 1
  71. STATUS_REQ_LOGIN        = 2
  72. STATUS_LOGIN            = 3
  73. STATUS_CONNECTED        = 4
  74.  
  75. STATUS_DISCONNECTED     = 10
  76. STATUS_DNS_ERR          = 11
  77. STATUS_SOCK_ERR         = 12
  78. STATUS_CONNECT_ERR      = 13
  79. STATUS_PROTO_ERR        = 14
  80. STATUS_SECURITY_ERR     = 15
  81. STATUS_LIB_ERR          = 16
  82. STATUS_THREAD_ERR       = 17
  83.  
  84. include "gui.inc"
  85. include "network.inc"
  86. include "raw.inc"
  87. include "copyrect.inc"
  88. include "rre.inc"
  89.  
  90. START:
  91.  
  92.         mcall   68, 11                  ; init heap
  93.  
  94. ; Load libraries
  95.         stdcall dll.Load, @IMPORT
  96.         test    eax, eax
  97.         jz      @f
  98.         mov     [status], STATUS_LIB_ERR
  99.   @@:
  100.  
  101. ; Present the user with the GUI and wait for network connection
  102.         call    draw_gui
  103.  
  104. ; Create main window
  105.         mcall   71, 1, name             ; reset window caption (add server name)
  106.  
  107.         mov     edx, dword[screen]
  108.         movzx   esi, dx
  109.         shr     edx, 16
  110.         add     edx, 2*xpos
  111.         add     esi, ypos+xpos
  112.         mcall   67, 10, 10              ; resize the window
  113.  
  114.         mcall   40, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_KEY + EVM_REDRAW + EVM_BUTTON
  115.  
  116.         mcall   66, 1, 1                ; Switch keyboard to scancode mode
  117.         mcall   26, 2, 1, keymap        ; Read keymap
  118.  
  119. redraw:
  120.         mcall   12, 1
  121.  
  122.         mov     ebx, dword[screen]
  123.         movzx   ecx, bx
  124.         shr     ebx, 16
  125.         mov     edx, 0x74ffffff
  126.         mov     edi, name
  127.         mcall   0                       ; draw window
  128.  
  129.         mcall   12, 2
  130.  
  131. draw_framebuffer:
  132.         mcall   7, framebuffer_data, dword[screen], 0
  133.         mov     [update_framebuffer], 0
  134.  
  135. mainloop:
  136.         cmp     [status], STATUS_CONNECTED
  137.         jne     draw_gui
  138.         cmp     [update_framebuffer], 0
  139.         jne     draw_framebuffer
  140.  
  141.         mcall   23, 10                  ; Check for event with 0,1s timeout
  142.  
  143.         dec     eax
  144.         jz      redraw
  145.         dec     eax
  146.         jz      key
  147.         dec     eax
  148.         jz      button
  149.         sub     eax, 3
  150.         jz      mouse
  151.         jmp     mainloop
  152.  
  153. key:
  154.         mcall   2
  155.         cmp     ah, 224         ; ext
  156.         je      mainloop        ;; TODO
  157.  
  158.         xor     al, al
  159.         test    ah, 0x80        ; key up?
  160.         jnz     @f
  161.         inc     al
  162.   @@:
  163.         mov     byte[KeyEvent.down], al
  164.  
  165.         shr     eax, 8
  166.         and     al, 0x7f
  167.         mov     al, [keymap+eax]
  168.         mov     byte[KeyEvent.key+3], al
  169.  
  170.         DEBUGF  1, "Sending key: 0x%x\n", al
  171.  
  172.         mcall   send, [socketnum], KeyEvent, 8, 0
  173.         jmp     mainloop
  174.  
  175. mouse:
  176. ;        DEBUGF  1, "Sending mouse event\n"
  177.  
  178.         mcall   37, 1           ; get mouse pos
  179.         bswap   eax
  180.         mov     [PointerEvent.x], ax
  181.         shr     eax, 16
  182.         mov     [PointerEvent.y], ax
  183.  
  184.         mcall   37, 2           ; get mouse buttons
  185.         test    al, 00000010b   ; test if right button was pressed  (bit 1 in kolibri)
  186.         jz      @f
  187.         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
  188.       @@:
  189.         mov     [PointerEvent.mask], al
  190.  
  191.         mcall   send, [socketnum], PointerEvent, 6, 0
  192.         jmp     mainloop
  193.  
  194. button:
  195.         mcall   17              ; get id
  196.         mcall   -1
  197.  
  198.  
  199. ; DATA AREA
  200.  
  201. include_debug_strings
  202.  
  203. HandShake               db "RFB 003.003", 10
  204.  
  205. ClientInit              db 0            ; not shared
  206.  
  207. SetPixelFormat32        db 0            ; setPixelformat
  208.                         db 0, 0, 0      ; padding
  209. .bpp                    db 32           ; bits per pixel
  210. .depth                  db 32           ; depth
  211. .big_endian             db 0            ; big-endian flag
  212. .true_color             db 1            ; true-colour flag
  213. .red_max                db 0, 255       ; red-max
  214. .green_max              db 0, 255       ; green-max
  215. .blue_max               db 0, 255       ; blue-max
  216. .red_shif               db 0            ; red-shift
  217. .green_shift            db 8            ; green-shift
  218. .blue_shift             db 16           ; blue-shift
  219.                         db 0, 0, 0      ; padding
  220.  
  221. SetPixelFormat16        db 0            ; setPixelformat
  222.                         db 0, 0, 0      ; padding
  223. .bpp                    db 16           ; bits per pixel
  224. .depth                  db 15           ; depth
  225. .big_endian             db 0            ; big-endian flag
  226. .true_color             db 1            ; true-colour flag
  227. .red_max                db 0, 31        ; red-max
  228. .green_max              db 0, 31        ; green-max
  229. .blue_max               db 0, 31        ; blue-max
  230. .red_shif               db 0            ; red-shift
  231. .green_shift            db 5            ; green-shift
  232. .blue_shift             db 10           ; blue-shift
  233.                         db 0, 0, 0      ; padding
  234.  
  235. SetPixelFormat8         db 0            ; setPixelformat
  236.                         db 0, 0, 0      ; padding
  237. .bpp                    db 8            ; bits per pixel
  238. .depth                  db 6            ; depth
  239. .big_endian             db 0            ; big-endian flag
  240. .true_color             db 1            ; true-colour flag
  241. .red_max                db 0, 3         ; red-max
  242. .green_max              db 0, 3         ; green-max
  243. .blue_max               db 0, 3         ; blue-max
  244. .red_shif               db 0            ; red-shift
  245. .green_shift            db 2            ; green-shift
  246. .blue_shift             db 4            ; blue-shift
  247.                         db 0, 0, 0      ; padding
  248.  
  249. SetEncodings            db 2            ; setEncodings
  250.                         db 0            ; padding
  251.                         db 0, 2         ; number of encodings
  252.                         db 0, 0, 0, 0   ; raw encoding        (DWORD, Big endian order)
  253.                         db 0, 0, 0, 1   ; Copyrect encoding
  254. ;                        db 0, 0, 0, 2   ; RRE
  255. ;                        db 0, 0, 0, 5   ; HexTile
  256. ;                        db 0, 0, 0, 15  ; TRLE
  257. ;                        db 0, 0, 0, 16  ; ZRLE
  258.  
  259. FramebufferUpdateRequest        db 3
  260. .inc                            db 0    ; incremental
  261. .x                              dw 0
  262. .y                              dw 0
  263. .width                          dw 0
  264. .height                         dw 0
  265.  
  266. KeyEvent                db 4            ; keyevent
  267. .down                   db 0            ; down-flag
  268.                         dw 0            ; padding
  269. .key                    dd 0            ; key
  270.  
  271. PointerEvent            db 5            ; pointerevent
  272. .mask                   db 0            ; button-mask
  273. .x                      dw 0            ; x-position
  274. .y                      dw 0            ; y-position
  275.  
  276.  
  277. sockaddr1:
  278.                 dw AF_INET4
  279. .port           dw 0x0c17               ; 5900
  280. .ip             dd 0
  281.                 rb 10
  282.  
  283. beep            db 0x85, 0x25, 0x85, 0x40, 0
  284.  
  285. status                  dd STATUS_INITIAL
  286. update_gui              dd 0
  287. mouse_dd                dd 0
  288. update_framebuffer      dd 0
  289.  
  290. URLbox          edit_box 235, 70, 10, 0xffffff, 0x6f9480, 0, 0, 0, 65535, serveraddr, mouse_dd, ed_focus, 0, 0
  291. USERbox         edit_box 150, 70, 10, 0xffffff, 0x6f9480, 0, 0, 0, 127, username, mouse_dd, ed_focus, 0, 0
  292. PASSbox         edit_box 150, 90, 10, 0xffffff, 0x6f9480, 0, 0, 0, 127, password, mouse_dd, 0, 0, 0
  293.  
  294. serverstr       db "server:"
  295. userstr         db "username:"
  296. passstr         db "password:"
  297. connectstr      db "Connect"
  298. loginstr        db "Log in"
  299. loginstr_e:
  300.  
  301. sz_err_disconnected     db "Server closed connection unexpectedly.", 0
  302. sz_err_dns              db "Could not resolve hostname.", 0
  303. sz_err_sock             db "Could not open socket.", 0
  304. sz_err_connect          db "Could not connect to the server.", 0
  305. sz_err_proto            db "A protocol error has occured.", 0
  306. sz_err_security         db "Server requested an unsupported security type.", 0
  307. sz_err_library          db "Could not load needed libraries.", 0
  308. sz_err_thread           db "Could not create thread.", 0
  309.  
  310. err_msg         dd sz_err_disconnected
  311.                 dd sz_err_dns
  312.                 dd sz_err_sock
  313.                 dd sz_err_connect
  314.                 dd sz_err_proto
  315.                 dd sz_err_security
  316.                 dd sz_err_library
  317.                 dd sz_err_thread
  318.  
  319. ; import
  320. align 4
  321. @IMPORT:
  322.  
  323. library network,                "network.obj",\
  324.         box_lib,                "box_lib.obj",\
  325.         archiver,               "archiver.obj"
  326.  
  327. import  network,\
  328.         getaddrinfo,            "getaddrinfo",  \
  329.         freeaddrinfo,           "freeaddrinfo", \
  330.         inet_ntoa,              "inet_ntoa"
  331.  
  332. import  box_lib,\
  333.         edit_box_draw,          "edit_box",\
  334.         edit_box_key,           "edit_box_key",\
  335.         edit_box_mouse,         "edit_box_mouse",\
  336.         scrollbar_v_draw,       "scrollbar_v_draw",\
  337.         scrollbar_v_mouse,      "scrollbar_v_mouse",\
  338.         scrollbar_h_draw,       "scrollbar_h_draw",\
  339.         scrollbar_h_mouse,      "scrollbar_h_mouse"
  340.  
  341. import  archiver,\
  342.         deflate_unpack,         "deflate_unpack"
  343.  
  344. name                    db "VNC viewer "
  345. .dash                   db 0, " "
  346.  
  347. I_END:
  348.  
  349. servername              rb 64+1
  350.  
  351. socketnum               dd ?
  352. datapointer             dd ?
  353.  
  354. rectangles              dw ?
  355.  
  356. rectangle:
  357. .x                      dd ?
  358. .y                      dd ?
  359. .width                  dd ?
  360. .height                 dd ?
  361.  
  362. subrectangles           dd ?
  363.  
  364. subrectangle:
  365. .x                      dd ?
  366. .y                      dd ?
  367. .width                  dd ?
  368. .height                 dd ?
  369.  
  370. screen:                 ; Remote screen resolution
  371. .height                 dw ?
  372. .width                  dw ?
  373.  
  374. keymap                  rb 128
  375. username                rb 128
  376. password                rb 128
  377. serveraddr              rb 65536
  378. receive_buffer          rb RECEIVE_BUFFER_SIZE
  379. framebuffer_data        rb 1024*1024*3  ; framebuffer
  380.  
  381.                         rb 0x1000
  382. thread_stack:
  383.                         rb 0x1000
  384. IM_END:
  385.  
  386.  
  387.