Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 3544 → Rev 3545

/programs/network/vncc/thread.inc
0,0 → 1,239
 
thread_start:
 
DEBUGF 1, 'I am the thread!\n'
 
mcall 40, 1 shl 7
 
; resolve name
push esp ; reserve stack place
invoke getaddrinfo, first, 0, 0, esp
pop esi
; test for error
test eax, eax
jnz exit
 
mov eax, [esi+addrinfo.ai_addr]
mov eax, [eax+sockaddr_in.sin_addr]
mov [sockaddr1.ip], eax
 
; DEBUGF 1, 'Connecting to %u.%u.%u.%u:%u\n', \
; [server_ip]:1, [server_ip+1]:1, \
; [server_ip+2]:1, [server_ip+3]:1, \
; [server_port]:2
 
mcall socket, AF_INET4, SOCK_STREAM, 0
mov [socketnum], eax
mcall connect, [socketnum], sockaddr1, 18
 
call wait_for_data
 
cmp dword [receive_buffer], 'RFB '
jne no_rfb
DEBUGF 1, 'received: %s\n', receive_buffer
mcall send, [socketnum], handshake, 12, 0
DEBUGF 1, 'Sending handshake: protocol version\n'
 
call wait_for_data
 
cmp dword [receive_buffer], 0x00000000
je invalid_security
 
cmp dword [receive_buffer], 0x01000000
je no_security
 
cmp dword [receive_buffer], 0x02000000
je vnc_security
 
jmp exit
 
vnc_security:
mov byte[mode], 1
call red_logon
 
no_security:
mcall send, [socketnum], shared, 1, 0
DEBUGF 1, 'Sending handshake: shared session?\n'
 
mcall 23, 100*TIMEOUT
 
call wait_for_data ; now the server should send init message
 
DEBUGF 1, 'Serverinit: bpp: %u depth: %u bigendian: %u truecolor: %u\n', \
[receive_buffer+framebuffer.pixelformat.bpp]:1, \
[receive_buffer+framebuffer.pixelformat.depth]:1, \
[receive_buffer+framebuffer.pixelformat.big_endian]:1, \
[receive_buffer+framebuffer.pixelformat.true_color]:1
 
mov eax, dword [receive_buffer]
mov dword [fbur.width], eax
bswap eax
mov dword [screen], eax
 
mcall send, [socketnum], pixel_format8, 20, 0
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 byte [thread_ready], 1
 
request_rfb:
mov [fbur.inc], 2
mcall send, [socketnum], fbur, 10, 0
 
thread_loop:
mcall 23, 100
 
call read_data ; Read the data into the buffer
 
; cmp eax, 2
; jb 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
 
align 4
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:',\
[frame.width]:2, [frame.height]:2, [frame.x]:2, [frame.y]:2, 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 sent SetColourMapEntries message\n'
 
jmp thread_loop
 
 
bell:
mcall 55, 55, , , beep
 
jmp thread_loop
 
 
servercuttext:
 
DEBUGF 1, 'Server cut text\n'
 
jmp thread_loop
 
 
read_data:
 
mov [datapointer], receive_buffer
.loop:
mcall 23, 100*TIMEOUT
mcall recv, [socketnum], [datapointer], 4096, 0
cmp eax, -1
je .done
 
add [datapointer], eax
 
cmp eax, 4096
je .loop
 
.done:
mov eax, [datapointer]
sub eax, receive_buffer
ret
 
 
 
wait_for_data:
 
mcall 23, 500
mcall recv, [socketnum], receive_buffer, 4096, 0
cmp eax, -1
je wait_for_data
test eax, eax
jz wait_for_data
 
ret