Subversion Repositories Kolibri OS

Rev

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