Subversion Repositories Kolibri OS

Rev

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