From d39e3ce57e8e3c718120a19db251af6dd30b5012 Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Tue, 11 Aug 2015 18:39:38 +0000 Subject: [PATCH] VNC Viewer: Allow user to enter port number (address:port syntax). Fixed and enabled RRE. git-svn-id: svn://kolibrios.org@5715 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/network/vncc/network.inc | 47 +++++++++++++---- programs/network/vncc/rre.inc | 88 ++++++++++++++++++++++--------- programs/network/vncc/vncc.asm | 10 ++-- 3 files changed, 106 insertions(+), 39 deletions(-) diff --git a/programs/network/vncc/network.inc b/programs/network/vncc/network.inc index 02b2b5356c..cc9231cf60 100644 --- a/programs/network/vncc/network.inc +++ b/programs/network/vncc/network.inc @@ -16,38 +16,67 @@ thread_start: mcall 40, 0 ; disable all events for this thread -; resolve name +; Extract port number from server address + mov esi, serveraddr + @@: + lodsb + test al, al + jz .port_done + cmp al, ':' + jne @r + mov byte[esi-1], 0 ; replace colon with 0 byte, we dont want to upset getaddrinfo + xor eax, eax + xor ebx, ebx ; port number + @@: + lodsb + test al, al + jz @f + sub al, '0' + jb err_dns + cmp al, 9 + ja err_dns + lea ebx, [ebx*4+ebx] + lea ebx, [ebx*2+eax] + jmp @b + @@: + xchg bl, bh + mov [sockaddr1.port], bx + .port_done: + +; Resolve hostname push esp ; reserve stack place invoke getaddrinfo, serveraddr, 0, 0, esp pop esi -; test for error test eax, eax jnz err_dns mov eax, [esi+addrinfo.ai_addr] mov eax, [eax+sockaddr_in.sin_addr] mov [sockaddr1.ip], eax + invoke freeaddrinfo, esi DEBUGF 1, "Connecting to %u.%u.%u.%u:%u\n", \ [sockaddr1.ip]:1, [sockaddr1.ip+1]:1, [sockaddr1.ip+2]:1, [sockaddr1.ip+3]:1, \ [sockaddr1.port]:2 - invoke freeaddrinfo, esi - +; Open socket mcall socket, AF_INET4, SOCK_STREAM, 0 cmp eax, -1 je err_sock - mov [socketnum], eax + +; Connect to the server mcall connect, [socketnum], sockaddr1, 18 cmp eax, -1 je err_connect +; Wait for handshake from server ; TODO: implement timeout call wait_for_data - cmp dword[receive_buffer], "RFB " jne err_proto + +; Reply to handshake DEBUGF 1, "Sending handshake\n" mcall send, [socketnum], HandShake, 12, 0 call wait_for_data @@ -203,7 +232,7 @@ end if ; Tell the main thread we are ready for business! mov [status], STATUS_CONNECTED -; Request initial update +; Request initial framebuffer update from server mov [FramebufferUpdateRequest.inc], 0 request_fbu: @@ -269,8 +298,8 @@ rectangle_loop: lodsd ; encoding bswap eax - DEBUGF 1, "rectangle: width=%u height=%u x=%u y=%u encoding: ",\ - [rectangle.width]:2, [rectangle.height]:2, [rectangle.x]:2, [rectangle.y]:2 + DEBUGF 1, "Rectangle: x=%u y=%u width=%u height=%u encoding: ",\ + [rectangle.x]:2, [rectangle.y]:2, [rectangle.width]:2, [rectangle.height]:2 cmp eax, 0 je encoding_raw diff --git a/programs/network/vncc/rre.inc b/programs/network/vncc/rre.inc index 072d3c84e9..b9e5c9cca4 100644 --- a/programs/network/vncc/rre.inc +++ b/programs/network/vncc/rre.inc @@ -12,54 +12,70 @@ ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -pixel_to_24bpp: ; returns in ecx, destroys eax, ebx +pixel_to_24bpp: ; returns in ecx + if BITS_PER_PIXEL = 8 -; Convert pixel to 24BPP - mov bl, 85 - mov al, [esi] - shr al, 6 - and al, 3 - mul bl - mov ch, al ; blue + + push eax ebx + mov bl, 36 + mov al, [esi] + and al, 7 + mul bl + mov ch, al ; red + mov al, [esi] shr al, 3 and al, 7 mul bl mov cl, al ; green + + mov bl, 85 mov al, [esi] - and al, 7 + shr al, 6 + and al, 3 mul bl - shr ecx, 8 - mov cl, al ; red + shl ecx, 8 + mov cl, al ; blue + inc esi + pop ebx eax + else if BITS_PER_PIXEL = 16 + + push eax lodsw - mov cl, al - shl cl, 3 - and cx, 0x00f8 ; blue - shl ecx, 16 + mov cl, ah + and al, 0xf8 ; red + mov cx, ax shl cx, 5 and ch, 0xfc ; green - mov cl, ah - and al, 0xf8 ; red + shl ecx, 8 + + mov cl, al + shl cl, 3 + and cx, 0x00f8 ; blue + pop eax + else + xor ecx, ecx mov cx, [esi] - shr ecx, 8 + shl ecx, 8 mov cl, [esi+2] add esi, 3 + end if ret encoding_RRE: - DEBUGF 2,"RRE\n" + DEBUGF 1,"RRE\n" @@: - lea eax, [esi+5] + lea eax, [esi+4+BYTES_PER_PIXEL] cmp [datapointer], eax jae @f call read_data.more @@ -70,17 +86,23 @@ encoding_RRE: bswap eax mov [subrectangles], eax + DEBUGF 1, "%u subrectangles\n", eax + +; Get background color call pixel_to_24bpp +; Calculate first pixel pos movzx eax, [screen.width] mul [rectangle.y] ; [screen.width]*[rectangle.y] add eax, [rectangle.x] ; [screen.width]*[rectangle.y]+[rectangle.x] lea edi, [framebuffer_data+eax*3] ; edi = framebuffer_data+([screen.width]*[rectangle.y]+[rectangle.x])*3 +; Calculate offset between two rows of pixels movzx eax, [screen.width] sub eax, [rectangle.width] lea ebp, [eax*3] ; ebp = ([screen.width]-[rectangle.width])*3 +; Draw background rectangle push edi mov eax, ecx mov edx, [rectangle.height] @@ -98,17 +120,23 @@ encoding_RRE: jnz .lineloop pop edi +; Any subrectangles at all? + cmp [subrectangles], 0 + je next_rectangle + .subrectangle: @@: - lea eax, [esi+9] + lea eax, [esi+8+BYTES_PER_PIXEL] cmp [datapointer], eax jae @f call read_data.more jmp @b @@: +; Get subrectangle color call pixel_to_24bpp +; Get coordinates xor eax, eax lodsw xchg al, ah @@ -118,17 +146,27 @@ encoding_RRE: mov [subrectangle.y], eax lodsw xchg al, ah - mov [subrectangle.height], eax + mov [subrectangle.width], eax lodsw xchg al, ah - mov [subrectangle.width], eax + mov [subrectangle.height], eax + DEBUGF 1, "Subrectangle: x=%u y=%u width=%u height=%u\n", \ + [subrectangle.x], [subrectangle.y], [subrectangle.width], [subrectangle.height] +; Calculate pos of first pixel push edi - mov eax, [rectangle.width] + movzx eax, [screen.width] mul [subrectangle.y] add eax, [subrectangle.x] + lea eax, [eax*3] add edi, eax +; Calculate offset between two rows of pixels + movzx eax, [screen.width] + sub eax, [subrectangle.width] + lea ebp, [eax*3] ; ebp = ([screen.width]-[rectangle.width])*3 + +; Draw the subrectangle mov eax, ecx mov edx, [subrectangle.height] .lineloop2: @@ -143,9 +181,7 @@ encoding_RRE: add edi, ebp dec edx jnz .lineloop2 - pop edi - dec [subrectangles] jnz .subrectangle jmp next_rectangle \ No newline at end of file diff --git a/programs/network/vncc/vncc.asm b/programs/network/vncc/vncc.asm index 7b5fa0a048..a60348188a 100644 --- a/programs/network/vncc/vncc.asm +++ b/programs/network/vncc/vncc.asm @@ -17,7 +17,7 @@ format binary as "" __DEBUG__ = 1 __DEBUG_LEVEL__ = 2 -BITS_PER_PIXEL = 8 ; 8, 16 24 +BITS_PER_PIXEL = 8 ; 8, 16 24 use32 @@ -85,6 +85,8 @@ STATUS_LIB_ERR = 16 STATUS_THREAD_ERR = 17 STATUS_LOGIN_FAILED = 18 +BYTES_PER_PIXEL = (BITS_PER_PIXEL + 7) / 8 + include "keymap.inc" include "gui.inc" include "network.inc" @@ -310,10 +312,10 @@ SetPixelFormat8 db 0 ; setPixelformat SetEncodings db 2 ; setEncodings db 0 ; padding - db 0, 2 ; number of encodings - db 0, 0, 0, 0 ; raw encoding (DWORD, Big endian order) + db 0, 3 ; number of encodings db 0, 0, 0, 1 ; Copyrect encoding -; db 0, 0, 0, 2 ; RRE + db 0, 0, 0, 2 ; RRE + db 0, 0, 0, 0 ; raw encoding ; db 0, 0, 0, 5 ; HexTile ; db 0, 0, 0, 15 ; TRLE ; db 0, 0, 0, 16 ; ZRLE