3,7 → 3,7 |
;; Copyright (C) KolibriOS team 2010-2015. All rights reserved. ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
;; vncc.asm - VNC client for KolibriOS ;; |
;; VNC client for KolibriOS ;; |
;; ;; |
;; Written by hidnplayr@kolibrios.org ;; |
;; ;; |
17,11 → 17,6 |
__DEBUG__ = 1 |
__DEBUG_LEVEL__ = 1 |
|
xpos = 4 ; coordinates of image |
ypos = 22 ; |
|
TIMEOUT = 5 ; timeout in seconds |
|
use32 |
|
org 0x0 |
34,7 → 29,6 |
dd IM_END ; esp |
dd 0x0 , 0x0 ; I_Param , I_Path |
|
|
include "../../macros.inc" |
include "../../debug-fdo.inc" |
include "../../proc32.inc" |
65,35 → 59,50 |
name rb 256 |
ends |
|
include "logon.inc" |
xpos = 4 |
ypos = 22 |
|
TIMEOUT = 5 ; timeout in seconds |
|
RECEIVE_BUFFER_SIZE = 8*1024*1024 ; 8 Mib |
|
STATUS_INITIAL = 0 |
STATUS_CONNECTING = 1 |
STATUS_LOGIN = 2 |
STATUS_CONNECTED = 3 |
|
STATUS_DISCONNECTED = 10 |
STATUS_DNS_ERR = 11 |
STATUS_SOCK_ERR = 12 |
STATUS_CONNECT_ERR = 13 |
STATUS_PROTO_ERR = 14 |
STATUS_SECURITY_ERR = 15 |
STATUS_LIB_ERR = 16 |
STATUS_THREAD_ERR = 17 |
|
include "gui.inc" |
include "network.inc" |
include "raw.inc" |
include "copyrect.inc" |
include "thread.inc" |
include "rre.inc" |
|
START: |
|
mcall 68, 11 ; init heap |
|
; load libraries |
; Load libraries |
stdcall dll.Load, @IMPORT |
test eax, eax |
jnz exit |
jz @f |
mov [status], STATUS_LIB_ERR |
@@: |
|
call logon |
; Present the user with the GUI and wait for network connection |
call draw_gui |
|
mcall 40, 0 ; disable all events |
mcall 67, 0, 0, 0, 0 ; resize the window (hide it) |
mcall 51, 1, thread_start, thread_stack |
; Create main window |
mcall 71, 1, name ; reset window caption (add server name) |
|
DEBUGF 1,"Thread created: %u\n", eax |
|
@@: |
mcall 5, 10 |
cmp byte[thread_ready], 0 |
je @r |
|
mcall 40, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_KEY + EVM_REDRAW + EVM_BUTTON |
|
mov edx, dword[screen] |
movzx esi, dx |
shr edx, 16 |
101,9 → 110,28 |
add esi, ypos+xpos |
mcall 67, 10, 10 ; resize the window |
|
mcall 40, EVM_MOUSE + EVM_MOUSE_FILTER + EVM_KEY + EVM_REDRAW + EVM_BUTTON |
|
redraw: |
mcall 12, 1 |
|
mov ebx, dword[screen] |
movzx ecx, bx |
shr ebx, 16 |
mov edx, 0x74ffffff |
mov edi, name |
mcall 0 ; draw window |
|
call drawbuffer |
|
mcall 12, 2 |
|
mainloop: |
mcall 10 ; wait for event |
cmp [status], STATUS_CONNECTED |
jne draw_gui |
|
mcall 23, 100 ; Check for event with 1s timeout |
|
dec eax |
jz redraw |
dec eax |
114,26 → 142,28 |
jz mouse |
jmp mainloop |
|
drawbuffer: |
mcall 7, framebuffer_data, dword[screen], 0 |
ret |
|
key: |
|
; DEBUGF 1,"Sending key event\n" |
|
mcall 2 |
mov byte[keyevent.key+3], ah |
mov byte[KeyEvent.key+3], ah |
|
mcall send, [socketnum], keyevent, 8, 0 |
mcall send, [socketnum], KeyEvent, 8, 0 |
jmp mainloop |
|
mouse: |
|
; DEBUGF 1,"Sending mouse event\n" |
|
mcall 37, 1 ; get mouse pos |
sub eax, xpos shl 16 + ypos |
bswap eax |
mov [pointerevent.x], ax |
mov [PointerEvent.x], ax |
shr eax, 16 |
mov [pointerevent.y], ax |
mov [PointerEvent.y], ax |
|
mcall 37, 2 ; get mouse buttons |
test al, 00000010b ; test if right button was pressed (bit 1 in kolibri) |
140,60 → 170,25 |
jz @f |
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 |
@@: |
mov [pointerevent.mask],al |
mov [PointerEvent.mask], al |
|
mcall send, [socketnum], pointerevent, 6, 0 |
mcall send, [socketnum], PointerEvent, 6, 0 |
jmp mainloop |
|
redraw: |
|
; DEBUGF 1,"Drawing window\n" |
|
mcall 12, 1 |
|
mov ebx, dword[screen] |
movzx ecx, bx |
shr ebx, 16 |
mov edx, 0x74ffffff |
mov edi, name |
mcall 0 ; draw window |
|
call drawbuffer |
|
mcall 12, 2 |
|
jmp mainloop |
|
drawbuffer: |
mcall 7, framebuffer_data, dword[screen], 0 |
ret |
|
button: |
mcall 17 ; get id |
|
exit: |
DEBUGF 1, "Closing time!\n" |
mcall close, [socketnum] |
mcall -1 |
|
no_rfb: |
DEBUGF 1, "This is no vnc server!\n" |
jmp exit |
|
invalid_security: |
DEBUGF 1, "Security error: %s\n", receive_buffer+5 |
jmp exit |
; DATA AREA |
|
include_debug_strings |
|
; DATA AREA |
HandShake db "RFB 003.003", 10 |
|
include_debug_strings ; ALWAYS present in data section |
|
handshake db "RFB 003.003", 10 |
ClientInit db 0 ; not shared |
beep db 0x85, 0x25, 0x85, 0x40, 0 |
|
pixel_format32 db 0 ; setPixelformat |
SetPixelFormat32 db 0 ; setPixelformat |
db 0, 0, 0 ; padding |
.bpp db 32 ; bits per pixel |
.depth db 32 ; depth |
207,7 → 202,7 |
.blue_shift db 16 ; blue-shift |
db 0, 0, 0 ; padding |
|
pixel_format16 db 0 ; setPixelformat |
SetPixelFormat16 db 0 ; setPixelformat |
db 0, 0, 0 ; padding |
.bpp db 16 ; bits per pixel |
.depth db 15 ; depth |
221,7 → 216,7 |
.blue_shift db 10 ; blue-shift |
db 0, 0, 0 ; padding |
|
pixel_format8 db 0 ; setPixelformat |
SetPixelFormat8 db 0 ; setPixelformat |
db 0, 0, 0 ; padding |
.bpp db 8 ; bits per pixel |
.depth db 6 ; depth |
235,7 → 230,7 |
.blue_shift db 4 ; blue-shift |
db 0, 0, 0 ; padding |
|
encodings db 2 ; setEncodings |
SetEncodings db 2 ; setEncodings |
db 0 ; padding |
db 0, 2 ; number of encodings |
db 0, 0, 0, 0 ; raw encoding (DWORD, Big endian order) |
245,7 → 240,7 |
; db 0, 0, 0, 15 ; TRLE |
; db 0, 0, 0, 16 ; ZRLE |
|
fbur db 3 ; frame buffer update request |
FramebufferUpdateRequest db 3 |
.inc db 0 ; incremental |
.x dw 0 |
.y dw 0 |
252,12 → 247,12 |
.width dw 0 |
.height dw 0 |
|
keyevent db 4 ; keyevent |
KeyEvent db 4 ; keyevent |
.down db 0 ; down-flag |
dw 0 ; padding |
.key dd 0 ; key |
|
pointerevent db 5 ; pointerevent |
PointerEvent db 5 ; pointerevent |
.mask db 0 ; button-mask |
.x dw 0 ; x-position |
.y dw 0 ; y-position |
269,11 → 264,39 |
.ip dd 0 |
rb 10 |
|
thread_ready db 0 |
mouse_dd dd ? |
beep db 0x85, 0x25, 0x85, 0x40, 0 |
|
status dd STATUS_INITIAL |
update_gui dd 0 |
mouse_dd dd 0 |
|
URLbox edit_box 200, 25, 16, 0xffffff, 0x6f9480, 0, 0, 0, 65535, serveraddr, mouse_dd, ed_focus, 0, 0 |
|
serverstr db "server:" |
userstr db "username:" |
passstr db "password:" |
connectstr db "connect" |
loginstr db "login" |
loginstr_e: |
|
sz_err_disconnected db "Server closed connection unexpectedly.", 0 |
sz_err_dns db "Could not resolve hostname.", 0 |
sz_err_sock db "Could not open socket.", 0 |
sz_err_connect db "Could not connect to the server.", 0 |
sz_err_proto db "A protocol error has occured.", 0 |
sz_err_security db "Server requested an unsupported security type.", 0 |
sz_err_library db "Could not load needed libraries.", 0 |
sz_err_thread db "Could not create thread.", 0 |
|
err_msg dd sz_err_disconnected |
dd sz_err_dns |
dd sz_err_sock |
dd sz_err_connect |
dd sz_err_proto |
dd sz_err_security |
dd sz_err_library |
dd sz_err_thread |
|
; import |
align 4 |
@IMPORT: |
299,8 → 322,8 |
import archiver,\ |
deflate_unpack, "deflate_unpack" |
|
name db "VNC client " |
name.dash db 0, " " |
name db "VNC viewer " |
.dash db 0, " " |
|
I_END: |
|
308,27 → 331,34 |
|
socketnum dd ? |
datapointer dd ? |
|
rectangles dw ? |
|
rectangle: |
.width dw ? |
.height dw ? |
.x dw ? |
.y dw ? |
.x dd ? |
.y dd ? |
.width dd ? |
.height dd ? |
|
subrectangles dd ? |
|
subrectangle: |
.x dd ? |
.y dd ? |
.width dd ? |
.height dd ? |
|
screen: ; Remote screen resolution |
.height dw ? |
.width dw ? |
|
serveraddr rb 65536 |
receive_buffer rb 5*1024*1024 ; 5 mb buffer for received data (incoming frbupdate etc) |
receive_buffer rb RECEIVE_BUFFER_SIZE |
framebuffer_data rb 1024*1024*3 ; framebuffer |
|
rb 0x1000 |
thread_stack: |
|
rb 0x1000 |
|
IM_END: |
|
|