49830b7fd4
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
188 lines
4.6 KiB
PHP
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 |