Subversion Repositories Kolibri OS

Rev

Rev 5720 | Rev 5750 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3618 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
5663 hidnplayr 3
;; Copyright (C) KolibriOS team 2010-2015. All rights reserved.    ;;
3618 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
5668 hidnplayr 6
;;  VNC client for KolibriOS                                       ;;
3618 hidnplayr 7
;;                                                                 ;;
8
;;  Written by hidnplayr@kolibrios.org                             ;;
9
;;                                                                 ;;
10
;;          GNU GENERAL PUBLIC LICENSE                             ;;
11
;;             Version 2, June 1991                                ;;
12
;;                                                                 ;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3545 hidnplayr 14
 
15
format binary as ""
16
 
3618 hidnplayr 17
__DEBUG__       = 1
5670 hidnplayr 18
__DEBUG_LEVEL__ = 2
3618 hidnplayr 19
 
5722 hidnplayr 20
BITS_PER_PIXEL  = 32            ; 8, 16, 24 or 32
5720 hidnplayr 21
SERVERADDRLEN   = 4096
5677 hidnplayr 22
 
3545 hidnplayr 23
use32
24
 
25
        org     0x0
26
 
5663 hidnplayr 27
        db      "MENUET01"      ; 8 byte id
3618 hidnplayr 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
5720 hidnplayr 33
        dd      serveraddr, 0x0 ; I_Param , I_Path
3545 hidnplayr 34
 
5663 hidnplayr 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"
3545 hidnplayr 42
 
5722 hidnplayr 43
struct  PixelFormat
5663 hidnplayr 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
3545 hidnplayr 56
 
5722 hidnplayr 57
struct  ServerInit
5663 hidnplayr 58
        width           dw ?
59
        height          dw ?
5722 hidnplayr 60
        pixelformat     PixelFormat
5663 hidnplayr 61
        name_length     dd ?
5722 hidnplayr 62
        name            db ?
5663 hidnplayr 63
ends
64
 
5668 hidnplayr 65
xpos                    = 4
5670 hidnplayr 66
ypos                    = 21
5668 hidnplayr 67
 
68
TIMEOUT                 = 5             ; timeout in seconds
69
 
70
RECEIVE_BUFFER_SIZE     = 8*1024*1024   ; 8 Mib
71
 
5720 hidnplayr 72
STATUS_CONNECT          = 0
5668 hidnplayr 73
STATUS_CONNECTING       = 1
5670 hidnplayr 74
STATUS_REQ_LOGIN        = 2
75
STATUS_LOGIN            = 3
76
STATUS_CONNECTED        = 4
5680 hidnplayr 77
STATUS_CLOSED           = 5
5668 hidnplayr 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
5680 hidnplayr 87
STATUS_LOGIN_FAILED     = 18
5720 hidnplayr 88
STATUS_SECURITY_ERR_C   = 19
5668 hidnplayr 89
 
5715 hidnplayr 90
BYTES_PER_PIXEL = (BITS_PER_PIXEL + 7) / 8
91
 
5677 hidnplayr 92
include "keymap.inc"
5668 hidnplayr 93
include "gui.inc"
94
include "network.inc"
5663 hidnplayr 95
include "raw.inc"
5666 hidnplayr 96
include "copyrect.inc"
5668 hidnplayr 97
include "rre.inc"
5716 hidnplayr 98
include "trle.inc"
5717 hidnplayr 99
include "zrle.inc"
5680 hidnplayr 100
include "des.inc"
5663 hidnplayr 101
 
3545 hidnplayr 102
START:
103
 
104
        mcall   68, 11                  ; init heap
105
 
5668 hidnplayr 106
; Load libraries
3545 hidnplayr 107
        stdcall dll.Load, @IMPORT
108
        test    eax, eax
5668 hidnplayr 109
        jz      @f
110
        mov     [status], STATUS_LIB_ERR
111
  @@:
3545 hidnplayr 112
 
5720 hidnplayr 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
 
5668 hidnplayr 126
; Present the user with the GUI and wait for network connection
127
        call    draw_gui
3545 hidnplayr 128
 
5668 hidnplayr 129
; Create main window
130
        mcall   71, 1, name             ; reset window caption (add server name)
3545 hidnplayr 131
 
5663 hidnplayr 132
        mov     edx, dword[screen]
3545 hidnplayr 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
 
5668 hidnplayr 139
        mcall   40, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_KEY + EVM_REDRAW + EVM_BUTTON
140
 
5670 hidnplayr 141
        mcall   66, 1, 1                ; Switch keyboard to scancode mode
142
 
5677 hidnplayr 143
        call    generate_keymap
144
 
5668 hidnplayr 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
 
5670 hidnplayr 157
draw_framebuffer:
5720 hidnplayr 158
        DEBUGF  1, "Drawing framebuffer\n"
5722 hidnplayr 159
        mcall   7, framebuffer, dword[screen], 0
5670 hidnplayr 160
        mov     [update_framebuffer], 0
161
 
3545 hidnplayr 162
mainloop:
5668 hidnplayr 163
        cmp     [status], STATUS_CONNECTED
164
        jne     draw_gui
5670 hidnplayr 165
        cmp     [update_framebuffer], 0
166
        jne     draw_framebuffer
3545 hidnplayr 167
 
5670 hidnplayr 168
        mcall   23, 10                  ; Check for event with 0,1s timeout
5668 hidnplayr 169
 
3545 hidnplayr 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:
5677 hidnplayr 181
        mcall   66, 3
5693 hidnplayr 182
        mov     ebx, eax        ; get modifier keys
5677 hidnplayr 183
 
5693 hidnplayr 184
        mcall   2               ; get key scancode
185
        cmp     ah, 224         ; extended keycode?
186
        je      .extended
3545 hidnplayr 187
 
5670 hidnplayr 188
        xor     al, al
189
        test    ah, 0x80        ; key up?
190
        jnz     @f
191
        inc     al
192
  @@:
193
        mov     byte[KeyEvent.down], al
194
 
5693 hidnplayr 195
        movzx   eax, ah
5670 hidnplayr 196
 
5677 hidnplayr 197
        test    ebx, 100000b    ; alt?
5693 hidnplayr 198
        jz      .no_alt
199
        mov     ax, [keymap_alt+eax*2]
5677 hidnplayr 200
        jmp     .key
5693 hidnplayr 201
  .no_alt:
202
 
5677 hidnplayr 203
        test    ebx, 11b        ; shift?
5693 hidnplayr 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]
5677 hidnplayr 225
  .key:
5693 hidnplayr 226
        test    ax, ax
227
        jz      mainloop
5677 hidnplayr 228
        mov     word[KeyEvent.key+2], ax
229
        DEBUGF  1, "Sending key: 0x%x\n", ax
5668 hidnplayr 230
        mcall   send, [socketnum], KeyEvent, 8, 0
3545 hidnplayr 231
        jmp     mainloop
232
 
5677 hidnplayr 233
 
5693 hidnplayr 234
 
3545 hidnplayr 235
mouse:
5677 hidnplayr 236
;        DEBUGF  1, "Sending pointer event\n"
3545 hidnplayr 237
 
238
        mcall   37, 1           ; get mouse pos
239
        bswap   eax
5668 hidnplayr 240
        mov     [PointerEvent.x], ax
3545 hidnplayr 241
        shr     eax, 16
5668 hidnplayr 242
        mov     [PointerEvent.y], ax
3545 hidnplayr 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
5663 hidnplayr 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
3545 hidnplayr 248
      @@:
5668 hidnplayr 249
        mov     [PointerEvent.mask], al
3545 hidnplayr 250
 
5668 hidnplayr 251
        mcall   send, [socketnum], PointerEvent, 6, 0
3545 hidnplayr 252
        jmp     mainloop
253
 
254
button:
255
        mcall   17              ; get id
5680 hidnplayr 256
        mov     [status], STATUS_CLOSED
5677 hidnplayr 257
        mcall   close, [socketnum]
3545 hidnplayr 258
        mcall   -1
259
 
260
 
5668 hidnplayr 261
; DATA AREA
3545 hidnplayr 262
 
5668 hidnplayr 263
include_debug_strings
3545 hidnplayr 264
 
5693 hidnplayr 265
keymap_numlock:
266
        db      '7', '8', '9', '-'
267
        db      '4', '5', '6', '+'
268
        db      '1', '2', '3'
269
        db      '0', '.'
270
 
5668 hidnplayr 271
HandShake               db "RFB 003.003", 10
3545 hidnplayr 272
 
5668 hidnplayr 273
ClientInit              db 0            ; not shared
3545 hidnplayr 274
 
5668 hidnplayr 275
SetPixelFormat32        db 0            ; setPixelformat
276
                        db 0, 0, 0      ; padding
277
.bpp                    db 32           ; bits per pixel
5722 hidnplayr 278
.depth                  db 24           ; depth
5668 hidnplayr 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
5722 hidnplayr 284
.red_shift              db 16           ; red-shift
5668 hidnplayr 285
.green_shift            db 8            ; green-shift
5722 hidnplayr 286
.blue_shift             db 0            ; blue-shift
5668 hidnplayr 287
                        db 0, 0, 0      ; padding
3545 hidnplayr 288
 
5677 hidnplayr 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
 
5668 hidnplayr 303
SetPixelFormat16        db 0            ; setPixelformat
304
                        db 0, 0, 0      ; padding
305
.bpp                    db 16           ; bits per pixel
5677 hidnplayr 306
.depth                  db 16           ; depth
5668 hidnplayr 307
.big_endian             db 0            ; big-endian flag
308
.true_color             db 1            ; true-colour flag
309
.red_max                db 0, 31        ; red-max
5677 hidnplayr 310
.green_max              db 0, 63        ; green-max
5668 hidnplayr 311
.blue_max               db 0, 31        ; blue-max
5677 hidnplayr 312
.red_shift              db 11           ; red-shift
5668 hidnplayr 313
.green_shift            db 5            ; green-shift
5677 hidnplayr 314
.blue_shift             db 0            ; blue-shift
5668 hidnplayr 315
                        db 0, 0, 0      ; padding
3545 hidnplayr 316
 
5668 hidnplayr 317
SetPixelFormat8         db 0            ; setPixelformat
318
                        db 0, 0, 0      ; padding
319
.bpp                    db 8            ; bits per pixel
5677 hidnplayr 320
.depth                  db 8            ; depth
5668 hidnplayr 321
.big_endian             db 0            ; big-endian flag
322
.true_color             db 1            ; true-colour flag
5677 hidnplayr 323
.red_max                db 0, 7         ; red-max
324
.green_max              db 0, 7         ; green-max
5668 hidnplayr 325
.blue_max               db 0, 3         ; blue-max
5677 hidnplayr 326
.red_shift              db 0            ; red-shift
327
.green_shift            db 3            ; green-shift
328
.blue_shift             db 6            ; blue-shift
5668 hidnplayr 329
                        db 0, 0, 0      ; padding
3545 hidnplayr 330
 
5668 hidnplayr 331
SetEncodings            db 2            ; setEncodings
332
                        db 0            ; padding
5720 hidnplayr 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
5668 hidnplayr 337
                        db 0, 0, 0, 1   ; Copyrect encoding
5715 hidnplayr 338
                        db 0, 0, 0, 0   ; raw encoding
5708 hidnplayr 339
  .length = $ - SetEncodings
3545 hidnplayr 340
 
5668 hidnplayr 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
3545 hidnplayr 347
 
5668 hidnplayr 348
KeyEvent                db 4            ; keyevent
349
.down                   db 0            ; down-flag
350
                        dw 0            ; padding
351
.key                    dd 0            ; key
3545 hidnplayr 352
 
5668 hidnplayr 353
PointerEvent            db 5            ; pointerevent
354
.mask                   db 0            ; button-mask
355
.x                      dw 0            ; x-position
356
.y                      dw 0            ; y-position
3545 hidnplayr 357
 
358
 
359
sockaddr1:
5668 hidnplayr 360
                dw AF_INET4
361
.port           dw 0x0c17               ; 5900
362
.ip             dd 0
363
                rb 10
3545 hidnplayr 364
 
5668 hidnplayr 365
beep            db 0x85, 0x25, 0x85, 0x40, 0
5663 hidnplayr 366
 
5720 hidnplayr 367
status                  dd STATUS_CONNECT
5670 hidnplayr 368
update_gui              dd 0
369
mouse_dd                dd 0
370
update_framebuffer      dd 0
5720 hidnplayr 371
thread_id               dd 0
5668 hidnplayr 372
 
5717 hidnplayr 373
deflate_buffer          dd 0
374
deflate_length          dd ?
375
deflate_str             dd ?
376
 
5720 hidnplayr 377
URLbox          edit_box 235, 70, 20, 0xffffff, 0x6f9480, 0, 0, 0, SERVERADDRLEN, serveraddr, mouse_dd, ed_focus, 0, 0
5693 hidnplayr 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
5663 hidnplayr 380
 
5668 hidnplayr 381
serverstr       db "server:"
382
userstr         db "username:"
383
passstr         db "password:"
5670 hidnplayr 384
connectstr      db "Connect"
385
loginstr        db "Log in"
5720 hidnplayr 386
cancelstr       db "Cancel"
387
okstr           db "OK"
388
okstr_e:
5668 hidnplayr 389
 
5720 hidnplayr 390
sz_err_disconnected     db "The server has closed the connection unexpectedly.", 0
5668 hidnplayr 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
5720 hidnplayr 395
sz_err_security         db "An authentication problem has occured.", 0
5668 hidnplayr 396
sz_err_library          db "Could not load needed libraries.", 0
397
sz_err_thread           db "Could not create thread.", 0
5680 hidnplayr 398
sz_err_login_failed     db "Login failed.", 0
5668 hidnplayr 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
5680 hidnplayr 408
                dd sz_err_login_failed
5720 hidnplayr 409
                dd sz_err_security_c
5668 hidnplayr 410
 
3545 hidnplayr 411
; import
412
align 4
413
@IMPORT:
414
 
5663 hidnplayr 415
library network,                "network.obj",\
416
        box_lib,                "box_lib.obj",\
417
        archiver,               "archiver.obj"
3545 hidnplayr 418
 
5663 hidnplayr 419
import  network,\
420
        getaddrinfo,            "getaddrinfo",  \
421
        freeaddrinfo,           "freeaddrinfo", \
422
        inet_ntoa,              "inet_ntoa"
3545 hidnplayr 423
 
5663 hidnplayr 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,\
5717 hidnplayr 434
        deflate_unpack2,        "deflate_unpack2"
5663 hidnplayr 435
 
5668 hidnplayr 436
name                    db "VNC viewer "
437
.dash                   db 0, " "
5663 hidnplayr 438
 
3545 hidnplayr 439
I_END:
440
 
5663 hidnplayr 441
servername              rb 64+1
3545 hidnplayr 442
 
5720 hidnplayr 443
serveraddr              db 0
444
                        rb SERVERADDRLEN
445
 
5663 hidnplayr 446
socketnum               dd ?
447
datapointer             dd ?
5668 hidnplayr 448
 
5663 hidnplayr 449
rectangles              dw ?
3545 hidnplayr 450
 
5663 hidnplayr 451
rectangle:
5668 hidnplayr 452
.x                      dd ?
453
.y                      dd ?
454
.width                  dd ?
455
.height                 dd ?
3545 hidnplayr 456
 
5668 hidnplayr 457
subrectangles           dd ?
458
 
459
subrectangle:
460
.x                      dd ?
461
.y                      dd ?
462
.width                  dd ?
463
.height                 dd ?
464
 
5663 hidnplayr 465
screen:                 ; Remote screen resolution
466
.height                 dw ?
467
.width                  dw ?
3545 hidnplayr 468
 
5716 hidnplayr 469
palette                 rd 128  ; TRLE/ZRLE
470
palettesize             db ?    ; TRLE/ZRLE
471
 
5677 hidnplayr 472
keymap                  rw 128
473
keymap_shift            rw 128
474
keymap_alt              rw 128
5670 hidnplayr 475
username                rb 128
476
password                rb 128
5680 hidnplayr 477
keys                    rd 32*2         ; DES keys for VNC authentication
478
 
5720 hidnplayr 479
sz_err_security_c       rb 512+1
480
 
5668 hidnplayr 481
receive_buffer          rb RECEIVE_BUFFER_SIZE
5722 hidnplayr 482
framebuffer             rb 1280*1024*3  ; framebuffer
3545 hidnplayr 483
 
5663 hidnplayr 484
                        rb 0x1000
3545 hidnplayr 485
thread_stack:
5663 hidnplayr 486
                        rb 0x1000
3545 hidnplayr 487
IM_END:
488