diff --git a/kernel/branches/net/applications/synergyc/synergyc.asm b/kernel/branches/net/applications/synergyc/synergyc.asm new file mode 100644 index 0000000000..14a9e5094b --- /dev/null +++ b/kernel/branches/net/applications/synergyc/synergyc.asm @@ -0,0 +1,376 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2010. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; Synergyc.asm - Synergy client for KolibriOS ;; +;; ;; +;; Written by hidnplayr@kolibrios.org ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +use32 + org 0x0 + + db 'MENUET01' ; signature + dd 1 ; header version + dd start ; entry point + dd i_end ; initialized size + dd mem ; required memory + dd mem ; stack pointer + dd 0 ; parameters + dd path ; path + +BUFFERSIZE equ 1024 + +include '../proc32.inc' +include '../macros.inc' +purge mov,add,sub +include '../dll.inc' + +include '../network.inc' + +start: + + cld + mov edi, path ; Calculate the length of zero-terminated string + xor al , al + mov ecx, 1024 + repne scasb + dec edi + mov esi, filename + movsd + movsb + + mcall 68, 11 + + stdcall dll.Load, @IMPORT + test eax, eax + jnz exit + + push 1 + call [con_start] + + push title + push 25 + push 80 + push 25 + push 80 + call [con_init] + + push path + call [con_write_asciiz] + + push newline + call [con_write_asciiz] + + push newline + call [con_write_asciiz] + + invoke ini.get_str, path, str_remote, str_ip, buffer_ptr, 16, 0 + test eax, eax + jnz error + + invoke ini.get_int, path, str_remote, str_port, 24800 + mov [sockaddr1.port], ax + + push str1 + call [con_write_asciiz] + + push buffer_ptr + call [con_write_asciiz] + + push newline + call [con_write_asciiz] + + mcall socket, AF_INET4, IPPROTO_TCP, 0 + cmp eax, -1 + je error + + mov [socketnum], eax + + push buffer_ptr ; hostname + call [inet_addr] + cmp eax, -1 + je error + mov [sockaddr1.ip], eax + + mcall connect, [socketnum], sockaddr1, 18 + + push str7 + call [con_write_asciiz] + + mcall 40, 1 shl 7; + 7 + +login: + call wait_for_data + + push buffer_ptr + 4 + call [con_write_asciiz] + + cmp dword [buffer_ptr], 11 shl 24 + jne login + cmp dword [buffer_ptr + 4], 'Syne' + jne login + cmp word [buffer_ptr + 8], 'rg' + jne login + cmp byte [buffer_ptr + 10], 'y' + jne login + + push str2 + call [con_write_asciiz] + + lea edi, [buffer_ptr + 11 + 4 + 4] + invoke ini.get_str, path, str_local, str_name, edi, 255, 0 + xor al , al + mov ecx, 256 + repne scasb + sub edi, buffer_ptr + 1 + 4 + mov esi, edi + bswap edi + mov dword [buffer_ptr], edi + mov edi, esi + sub edi, 11 + 4 + bswap edi + mov dword [buffer_ptr + 11 + 4], edi + add esi, 4 + + mcall send, [socketnum], buffer_ptr, , 0 + +mainloop: + call wait_for_data + mov edi, buffer_ptr + + .command: + push eax edi + + cmp dword [edi + 4], 'QINF' ; query screen info + je .qinf + + cmp dword [edi + 4], 'CALV' ; alive ? + je .calv + + cmp dword [edi + 4], 'CINN' ; mouse moved into screen + je .cinn + + cmp dword [edi + 4], 'DCLP' ; Clipboard event + je .dclp + + cmp dword [edi + 4], 'DMMV' ; Mouse moved + je .dmmv + + cmp dword [edi + 4], 'COUT' ; leave screen + je .cout + + cmp dword [edi + 4], 'DMDN' ; mouse button down + je .dmdn + + cmp dword [edi + 4], 'DMUP' ; mouse button released + je .dmup + + cmp dword [edi + 4], 'CNOP' ; no operation + je .next + + cmp dword [edi + 4], 'CIAK' ; resolution changed? + je .ciak + + push str3 + call [con_write_asciiz] + + mov byte[edi+8],0 + add edi, 4 + push edi + call [con_write_asciiz] + + push newline + call [con_write_asciiz] + + .next: + pop edi eax + + mov ecx, dword [edi] + bswap ecx + add ecx, 4 + sub eax, ecx + jle mainloop + add edi, ecx + jmp .command + + + .qinf: + mcall 14 ; get screen info + add eax, 0x00010001 + bswap eax + mov dword [screeninfo.size], eax + mcall send, [socketnum], screeninfo, screeninfo.length, 0 ; send client name + jmp .next + + + .calv: + mcall send, [socketnum], calv, calv.length, 0 ; looks like ping-pong event + jmp .next + + + .cinn: + mov edx, [edi + 8] + bswap edx + mcall 18, 19, 4 + ; ignore sequence number and modify key mask for now + push str6 + call [con_write_asciiz] + jmp .next + + .dclp: + + jmp .next + + .dmmv: + mov edx, [edi + 8] + bswap edx + mcall 18, 19, 4 + mcall send, [socketnum], cnop, cnop.length, 0 ; reply with NOP + push str4 + call [con_write_asciiz] + jmp .next + + .cout: + jmp .next + + .dmdn: + movzx eax, byte [edi + 8] + or [mousestate], eax + mcall 18, 19, 5, [mousestate] + mcall send, [socketnum], cnop, cnop.length, 0 ; reply with NOP + push str5 + call [con_write_asciiz] + jmp .next + + .dmup: + movzx eax, byte [edi + 8] + not eax + and [mousestate], eax + mcall 18, 19, 5, [mousestate] + mcall send, [socketnum], cnop, cnop.length, 0 ; reply with NOP + push str5 + call [con_write_asciiz] + jmp .next + + .ciak: + jmp .next + +error: + push str_err + call [con_write_asciiz] + + call [con_gets] + + push 1 + call [con_exit] + + mcall close, [socketnum] +exit: + + mcall -1 + + +wait_for_data: + mcall 10 ; wait for data + + mcall recv, [socketnum], buffer_ptr, BUFFERSIZE, 0 + cmp eax, -1 + je wait_for_data + + cmp eax, 8 + jl wait_for_data + + ret + + + +; data +title db 'Synergy client',0 +str1 db 'Connecting to: ',0 +str7 db 'Connected!',13,10,0 +str2 db 13,10,'Handshake received',13,10,0 +str3 db 'Unsupported command: ',0 +newline db 13,10,0 +str4 db 'mouse moved',13,10,0 +str5 db 'mouse buttons changed',13,10,0 +str6 db 'Enter screen',13,10,0 +str_err db 'Error occured !',13,10,'Press any key to quit',0 + +screeninfo: + dd (screeninfo.length - 4) shl 24 + db 'DINF' + dw 0 ; coordinate of leftmost pixel + dw 0 ; coordiante of topmost pixel + .size: + dw 0 ; width + dw 0 ; height + + dw 0 ; size of warp zone + + dw 0xb88b ; x position of the mouse on the secondary screen (no idea what it means) + dw 0xbcfb ; y position of the mouse on the secondary screen + .length = $ - screeninfo + +calv: + dd (4) shl 24 + db 'CALV' + .length = $ - calv + 8 ; also send cnop + +cnop: + dd (4) shl 24 + db 'CNOP' + .length = $ - cnop + +mousestate dd 0 + + +sockaddr1: + dw AF_INET4 +.port dw 24800 +.ip dd 192 + 168 shl 8 + 1 shl 16 + 115 shl 24 + rb 10 + +filename db '.ini', 0 +str_local db 'local', 0 +str_name db 'name', 0 +str_remote db 'remote', 0 +str_port db 'port', 0 +str_ip db 'ip', 0 + +; import +align 16 +@IMPORT: + +library console, 'console.obj',\ + libini, 'libini.obj',\ + network, 'network.obj' + +import network,\ + inet_addr, 'inet_addr' + +import console, \ + con_start, 'START',\ + con_init, 'con_init',\ + con_write_asciiz, 'con_write_asciiz',\ + con_exit, 'con_exit',\ + con_gets, 'con_gets',\ + con_cls, 'con_cls',\ + con_getch2, 'con_getch2',\ + con_set_cursor_pos, 'con_set_cursor_pos' + +import libini,\ + ini.get_str, 'ini_get_str',\ + ini.get_int, 'ini_get_int' + +align 4 +i_end: +socketnum dd ? +buffer_ptr rb BUFFERSIZE +path rb 4096 ; stack +mem: \ No newline at end of file diff --git a/kernel/branches/net/applications/synergyc/synergyc.ini b/kernel/branches/net/applications/synergyc/synergyc.ini new file mode 100644 index 0000000000..35acd986a4 --- /dev/null +++ b/kernel/branches/net/applications/synergyc/synergyc.ini @@ -0,0 +1,6 @@ +[local] +name = karaboeia + +[remote] +ip = 192.168.1.115 +port = 24800