Subversion Repositories Kolibri OS

Rev

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