kolibrios-fun/programs/network/VNCclient/thread.inc
hidnplayr 49830b7fd4 Update to the VNC-client
The new client uses a thread to receive and parse all incoming data from server.
Standard graphics mode is 8BPP but you can use 32BPP if you uncomment it in raw.inc 
Mouse works, keyboard doesnt (yet)
No encryption supported yet.
Cursor is drawn remotely.

git-svn-id: svn://kolibrios.org@264 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-01-08 19:28:20 +00:00

188 lines
4.6 KiB
PHP

thread_start:
DEBUGF 1,'I am the thread!\n'
mov eax,40 ; Report events
mov ebx,10000000b ; Only Stack
int 0x40
resolve first,[server_ip] ; the input window putted the server @ 'first', resolve it into a real ip
mov [server_port],5900 ; no port input for now, only standard port 5900
DEBUGF 1,'connecting to %u.%u.%u.%u:%u\n',1[server_ip],1[server_ip+1],1[server_ip+2],1[server_ip+3],4[server_port]
eth.search_port 1000,edx ; Find a free port starting from 1001 and store in edx
eth.open_tcp edx,[server_port],[server_ip],1,[socket] ; open socket
DEBUGF 1,'Socket opened: %u (port %u)\n',[socket],ecx
call read_data
cmp dword[receive_buffer+1],'RFB '
jne no_rfb
eth.write_tcp [socket],12,handshake
DEBUGF 1,'Sending handshake: protocol version\n'
call read_data
mov eax,receive_buffer+1
mov eax,[eax]
bswap eax
cmp eax,0
je invalid_security
cmp eax,1
je no_security
cmp eax,2
je vnc_security
jmp close
vnc_security:
mov byte[mode],1
call red_logon
no_security:
eth.write_tcp [socket],1,shared
DEBUGF 1,'Sending handshake: shared session?\n'
eth.wait_for_data [socket],TIMEOUT*10,close
eth.read_data [socket],framebuffer,[datapointer],IM_END-receive_buffer ; now the server should send init message
DEBUGF 1,'Serverinit: bpp:%u depth:%u bigendian:%u truecolor:%u\n',1[pixelformat.bpp],1[pixelformat.depth],1[pixelformat.big_endian],1[pixelformat.true_color]
mov eax,dword[framebuffer]
bswap eax
mov dword[screen],eax
eth.write_tcp [socket],20,pixel_format8
DEBUGF 1,'Sending pixel format\n'
call read_data
; eth.write_tcp [socket],8,encodings
; DEBUGF 1,'Sending encoding info\n'
; call read_data
mov eax,dword[framebuffer.width]
mov dword[fbur.width],eax
mov byte[thread_ready],1
request_rfb:
mov byte[fbur.inc],2 ;;;;;;;;
eth.write_tcp [socket],10,fbur ;;;;;;;;;
thread_loop:
eth.wait_for_data [socket],1000,thread_loop
call read_data ; Read the data into the buffer
mov eax,[datapointer] ; at least 2 bytes should be received
sub eax,receive_buffer
cmp eax,1
jle mainloop
DEBUGF 1,'Data received, %u bytes\n',eax
cmp byte[receive_buffer],0
je framebufferupdate
cmp byte[receive_buffer],1
je setcolourmapentries
cmp byte[receive_buffer],2
je bell
cmp byte[receive_buffer],3
je servercuttext
jmp thread_loop
framebufferupdate:
mov ax,word[receive_buffer+2]
xchg al,ah
mov di,ax
DEBUGF 1,'Framebufferupdate: %u frames\n',di
mov esi,receive_buffer+4
jmp rectangle_loop
next_rectangle:
call drawbuffer
dec di
test di,di
jz request_rfb
rectangle_loop:
mov edx,[esi]
bswap edx
mov ebx,edx
shr edx,16
mov [frame.x],dx
mov [frame.y],bx
add esi,4
mov ecx,[esi]
bswap ecx
mov eax,ecx
shr ecx,16
mov [frame.width],cx
mov [frame.height],ax
add esi,4
mov eax,[esi]
add esi,4
mov ebx,esi
sub ebx,receive_buffer+12
DEBUGF 1,'frame: width=%u height=%u x=%u y=%u offset:%u encoding:',2[frame.width],2[frame.height],2[frame.x],2[frame.y],ebx
cmp eax,0
je encoding_raw
cmp eax,1
je encoding_copyrect
cmp eax,2
je encoding_RRE
cmp eax,5
je encoding_hextile
cmp eax,16
je encoding_ZRLE
mov ebx,esi
sub ebx,receive_buffer+8
DEBUGF 1,'\nunknown encoding: %u (offset %u)\n',eax,ebx
jmp bell
jmp thread_loop
encoding_RRE:
DEBUGF 1,'RRE\n'
jmp next_rectangle
encoding_hextile:
DEBUGF 1,'hextile\n'
jmp next_rectangle
encoding_ZRLE:
DEBUGF 1,'ZRLE\n'
jmp next_rectangle
setcolourmapentries:
DEBUGF 1,'Server sended SetColourMapEntries message\n'
jmp thread_loop
bell:
mov eax,55
mov ebx,eax
mov esi,beep
int 0x40
jmp thread_loop
servercuttext:
DEBUGF 1,'Server cut text\n'
jmp thread_loop
read_data:
eth.read_data [socket],receive_buffer,[datapointer],IM_END-receive_buffer
ret