Subversion Repositories Kolibri OS

Rev

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