diff options
author | jsorg71 <jsorg71> | 2005-06-28 03:00:43 +0000 |
---|---|---|
committer | jsorg71 <jsorg71> | 2005-06-28 03:00:43 +0000 |
commit | fd4beef2df71d8c44e8de47a476f319d1d49a038 (patch) | |
tree | 44ac5af738425ec8c7560d50b7418eb113845418 | |
parent | 74a67d2d3f9fd1e4e120373e49e6b02858d92bb9 (diff) | |
download | xrdp-proprietary-fd4beef2df71d8c44e8de47a476f319d1d49a038.tar.gz xrdp-proprietary-fd4beef2df71d8c44e8de47a476f319d1d49a038.zip |
moved files around
-rw-r--r-- | xrdp/Makefile | 26 | ||||
-rw-r--r-- | xrdp/constants.h | 433 | ||||
-rw-r--r-- | xrdp/funcs.c | 91 | ||||
-rw-r--r-- | xrdp/libxrdp.h | 19 | ||||
-rw-r--r-- | xrdp/makefile_lib | 21 | ||||
-rw-r--r-- | xrdp/makefile_win32 | 35 | ||||
-rw-r--r-- | xrdp/xrdp.c | 78 | ||||
-rw-r--r-- | xrdp/xrdp.h | 482 | ||||
-rw-r--r-- | xrdp/xrdp_bitmap.c | 143 | ||||
-rw-r--r-- | xrdp/xrdp_bitmap_compress.c | 1001 | ||||
-rw-r--r-- | xrdp/xrdp_cache.c | 49 | ||||
-rw-r--r-- | xrdp/xrdp_defines.h | 61 | ||||
-rw-r--r-- | xrdp/xrdp_file.c | 201 | ||||
-rw-r--r-- | xrdp/xrdp_font.c | 36 | ||||
-rw-r--r-- | xrdp/xrdp_interface.c | 253 | ||||
-rw-r--r-- | xrdp/xrdp_iso.c | 187 | ||||
-rw-r--r-- | xrdp/xrdp_list.c | 171 | ||||
-rw-r--r-- | xrdp/xrdp_listen.c | 21 | ||||
-rw-r--r-- | xrdp/xrdp_login_wnd.c | 162 | ||||
-rw-r--r-- | xrdp/xrdp_mcs.c | 606 | ||||
-rw-r--r-- | xrdp/xrdp_orders.c | 1536 | ||||
-rw-r--r-- | xrdp/xrdp_painter.c | 115 | ||||
-rw-r--r-- | xrdp/xrdp_process.c | 92 | ||||
-rw-r--r-- | xrdp/xrdp_rdp.c | 909 | ||||
-rw-r--r-- | xrdp/xrdp_region.c | 75 | ||||
-rw-r--r-- | xrdp/xrdp_sec.c | 587 | ||||
-rw-r--r-- | xrdp/xrdp_tcp.c | 150 | ||||
-rw-r--r-- | xrdp/xrdp_types.h | 261 | ||||
-rw-r--r-- | xrdp/xrdp_wm.c | 490 |
29 files changed, 1003 insertions, 7288 deletions
diff --git a/xrdp/Makefile b/xrdp/Makefile index 742ffef1..28617873 100644 --- a/xrdp/Makefile +++ b/xrdp/Makefile @@ -1,26 +1,24 @@ -XRDPOBJ = xrdp.o xrdp_tcp.o xrdp_iso.o xrdp_mcs.o xrdp_sec.o \ - xrdp_rdp.o xrdp_process.o xrdp_listen.o xrdp_orders.o \ - xrdp_bitmap.o xrdp_wm.o xrdp_painter.o xrdp_list.o \ +XRDPOBJ = xrdp.o xrdp_process.o xrdp_listen.o \ + xrdp_bitmap.o xrdp_wm.o xrdp_painter.o \ xrdp_region.o xrdp_cache.o xrdp_font.o funcs.o \ - xrdp_login_wnd.o xrdp_file.o xrdp_bitmap_compress.o \ - xrdp_interface.o \ - os_calls.o + xrdp_login_wnd.o xrdp_interface.o \ + ../common/list.o \ + ../common/file.o \ + ../common/os_calls.o \ + ../common/thread_calls.o -CFLAGS = -Wall -O2 -I../common -C_OS_FLAGS = $(CFLAGS) -DUSE_OPENSSL -DUSE_PTHREAD -c -LDFLAGS = -L /usr/gnu/lib -LIBS = -lpthread -lcrypto -ldl -#CC = g++ +#CFLAGS = -Wall -O2 -I../common -I../libxrdp -DXRDP_DEBUG +CFLAGS = -Wall -O2 -I../common -I../libxrdp +LDFLAGS = -L/usr/gnu/lib -L../libxrdp -Wl,-rpath,. +LIBS = -ldl -lpthread -lxrdp CC = gcc all: xrdp xrdp: $(XRDPOBJ) $(CC) $(LDFLAGS) -o xrdp $(XRDPOBJ) $(LIBS) + strip xrdp clean: rm -f $(XRDPOBJ) xrdp - -os_calls.o: - $(CC) $(C_OS_FLAGS) ../common/os_calls.c diff --git a/xrdp/constants.h b/xrdp/constants.h deleted file mode 100644 index 6b15a91f..00000000 --- a/xrdp/constants.h +++ /dev/null @@ -1,433 +0,0 @@ -/* - rdesktop: A Remote Desktop Protocol client. - Miscellaneous protocol constants - Copyright (C) Matthew Chapman 1999-2002 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -/* modified for xrdp */ - -/* TCP port for Remote Desktop Protocol */ -#define TCP_PORT_RDP 3389 - -#define ISO_PDU_CR 0xE0 /* Connection Request */ -#define ISO_PDU_CC 0xD0 /* Connection Confirm */ -#define ISO_PDU_DR 0x80 /* Disconnect Request */ -#define ISO_PDU_DT 0xF0 /* Data */ -#define ISO_PDU_ER 0x70 /* Error */ - -/* MCS PDU codes */ -#define MCS_EDRQ 1 /* Erect Domain Request */ -#define MCS_DPUM 8 /* Disconnect Provider Ultimatum */ -#define MCS_AURQ 10 /* Attach User Request */ -#define MCS_AUCF 11 /* Attach User Confirm */ -#define MCS_CJRQ 14 /* Channel Join Request */ -#define MCS_CJCF 15 /* Channel Join Confirm */ -#define MCS_SDRQ 25 /* Send Data Request */ -#define MCS_SDIN 26 /* Send Data Indication */ - -#define MCS_CONNECT_INITIAL 0x7f65 -#define MCS_CONNECT_RESPONSE 0x7f66 - -#define BER_TAG_BOOLEAN 1 -#define BER_TAG_INTEGER 2 -#define BER_TAG_OCTET_STRING 4 -#define BER_TAG_RESULT 10 -#define MCS_TAG_DOMAIN_PARAMS 0x30 - -#define MCS_GLOBAL_CHANNEL 1003 -#define MCS_USERCHANNEL_BASE 1001 - -/* RDP secure transport constants */ -#define SEC_RANDOM_SIZE 32 -#define SEC_MODULUS_SIZE 64 -#define SEC_PADDING_SIZE 8 -#define SEC_EXPONENT_SIZE 4 - -#define SEC_CLIENT_RANDOM 0x0001 -#define SEC_ENCRYPT 0x0008 -#define SEC_LOGON_INFO 0x0040 -#define SEC_LICENCE_NEG 0x0080 - -#define SEC_TAG_SRV_INFO 0x0c01 -#define SEC_TAG_SRV_CRYPT 0x0c02 -#define SEC_TAG_SRV_CHANNELS 0x0c03 - -#define SEC_TAG_CLI_INFO 0xc001 -#define SEC_TAG_CLI_CRYPT 0xc002 -#define SEC_TAG_CLI_CHANNELS 0xc003 -#define SEC_TAG_CLI_4 0xc004 - -#define SEC_TAG_PUBKEY 0x0006 -#define SEC_TAG_KEYSIG 0x0008 - -#define SEC_RSA_MAGIC 0x31415352 /* RSA1 */ - -/* RDP licensing constants */ -#define LICENCE_TOKEN_SIZE 10 -#define LICENCE_HWID_SIZE 20 -#define LICENCE_SIGNATURE_SIZE 16 - -#define LICENCE_TAG_DEMAND 0x01 -#define LICENCE_TAG_AUTHREQ 0x02 -#define LICENCE_TAG_ISSUE 0x03 -#define LICENCE_TAG_REISSUE 0x04 -#define LICENCE_TAG_PRESENT 0x12 -#define LICENCE_TAG_REQUEST 0x13 -#define LICENCE_TAG_AUTHRESP 0x15 -#define LICENCE_TAG_RESULT 0xff - -#define LICENCE_TAG_USER 0x000f -#define LICENCE_TAG_HOST 0x0010 - -/* RDP PDU codes */ -#define RDP_PDU_DEMAND_ACTIVE 1 -#define RDP_PDU_CONFIRM_ACTIVE 3 -#define RDP_PDU_DEACTIVATE 6 -#define RDP_PDU_DATA 7 - -#define RDP_DATA_PDU_UPDATE 2 -#define RDP_DATA_PDU_CONTROL 20 -#define RDP_DATA_PDU_POINTER 27 -#define RDP_DATA_PDU_INPUT 28 -#define RDP_DATA_PDU_SYNCHRONISE 31 -#define RDP_DATA_PDU_BELL 34 -#define RDP_DATA_PDU_LOGON 38 -#define RDP_DATA_PDU_FONT2 39 -#define RDP_DATA_PDU_DISCONNECT 47 - -#define RDP_CTL_REQUEST_CONTROL 1 -#define RDP_CTL_GRANT_CONTROL 2 -#define RDP_CTL_DETACH 3 -#define RDP_CTL_COOPERATE 4 - -#define RDP_UPDATE_ORDERS 0 -#define RDP_UPDATE_BITMAP 1 -#define RDP_UPDATE_PALETTE 2 -#define RDP_UPDATE_SYNCHRONIZE 3 - -#define RDP_POINTER_SYSTEM 1 -#define RDP_POINTER_MOVE 3 -#define RDP_POINTER_COLOR 6 -#define RDP_POINTER_CACHED 7 - -#define RDP_NULL_POINTER 0 -#define RDP_DEFAULT_POINTER 0x7F00 - -#define RDP_INPUT_SYNCHRONIZE 0 -#define RDP_INPUT_CODEPOINT 1 -#define RDP_INPUT_VIRTKEY 2 -#define RDP_INPUT_SCANCODE 4 -#define RDP_INPUT_MOUSE 0x8001 - -/* Device flags */ -#define KBD_FLAG_RIGHT 0x0001 -#define KBD_FLAG_EXT 0x0100 -#define KBD_FLAG_QUIET 0x1000 -#define KBD_FLAG_DOWN 0x4000 -#define KBD_FLAG_UP 0x8000 - -/* These are for synchronization; not for keystrokes */ -#define KBD_FLAG_SCROLL 0x0001 -#define KBD_FLAG_NUMLOCK 0x0002 -#define KBD_FLAG_CAPITAL 0x0004 - -/* See T.128 */ -#define RDP_KEYPRESS 0 -#define RDP_KEYRELEASE (KBD_FLAG_DOWN | KBD_FLAG_UP) - -#define MOUSE_FLAG_MOVE 0x0800 -#define MOUSE_FLAG_BUTTON1 0x1000 -#define MOUSE_FLAG_BUTTON2 0x2000 -#define MOUSE_FLAG_BUTTON3 0x4000 -#define MOUSE_FLAG_BUTTON4 0x0280 -#define MOUSE_FLAG_BUTTON5 0x0380 -#define MOUSE_FLAG_DOWN 0x8000 - -/* Raster operation masks */ -#define ROP2_S(rop3) (rop3 & 0xf) -#define ROP2_P(rop3) ((rop3 & 0x3) | ((rop3 & 0x30) >> 2)) - -#define ROP2_COPY 0xc -#define ROP2_XOR 0x6 -#define ROP2_AND 0x8 -#define ROP2_NXOR 0x9 -#define ROP2_OR 0xe - -#define MIX_TRANSPARENT 0 -#define MIX_OPAQUE 1 - -#define TEXT2_VERTICAL 0x04 -#define TEXT2_IMPLICIT_X 0x20 - -/* RDP bitmap cache (version 2) constants */ -#define BMPCACHE2_C0_CELLS 0x78 -#define BMPCACHE2_C1_CELLS 0x78 -#define BMPCACHE2_C2_CELLS 0x150 -#define BMPCACHE2_NUM_PSTCELLS 0x9f6 - -#define PDU_FLAG_FIRST 0x01 -#define PDU_FLAG_LAST 0x02 - -/* Maps to generalCapabilitySet in T.128 page 138 */ - -/* RDP capabilities */ -#define RDP_CAPSET_GENERAL 1 -#define RDP_CAPLEN_GENERAL 0x18 -#define OS_MAJOR_TYPE_UNIX 4 -#define OS_MINOR_TYPE_XSERVER 7 - -#define RDP_CAPSET_BITMAP 2 -#define RDP_CAPLEN_BITMAP 0x1C - -#define RDP_CAPSET_ORDER 3 -#define RDP_CAPLEN_ORDER 0x58 -#define ORDER_CAP_NEGOTIATE 2 -#define ORDER_CAP_NOSUPPORT 4 - -#define RDP_CAPSET_BMPCACHE 4 -#define RDP_CAPLEN_BMPCACHE 0x28 - -#define RDP_CAPSET_CONTROL 5 -#define RDP_CAPLEN_CONTROL 0x0C - -#define RDP_CAPSET_ACTIVATE 7 -#define RDP_CAPLEN_ACTIVATE 0x0C - -#define RDP_CAPSET_POINTER 8 -#define RDP_CAPLEN_POINTER 0x08 - -#define RDP_CAPSET_SHARE 9 -#define RDP_CAPLEN_SHARE 0x08 - -#define RDP_CAPSET_COLCACHE 10 -#define RDP_CAPLEN_COLCACHE 0x08 - -#define RDP_CAPSET_BMPCACHE2 19 -#define RDP_CAPLEN_BMPCACHE2 0x28 -#define BMPCACHE2_FLAG_PERSIST ((long)1<<31) - -#define RDP_SOURCE "MSTSC" - -/* Logon flags */ -#define RDP_LOGON_AUTO 0x0008 -#define RDP_LOGON_NORMAL 0x0033 -#define RDP_COMPRESSION 0x0080 -#define RDP_LOGON_BLOB 0x0100 -#define RDP_LOGON_LEAVE_AUDIO 0x2000 - -#define RDP5_DISABLE_NOTHING 0x00 -#define RDP5_NO_WALLPAPER 0x01 -#define RDP5_NO_FULLWINDOWDRAG 0x02 -#define RDP5_NO_MENUANIMATIONS 0x04 -#define RDP5_NO_THEMING 0x08 -#define RDP5_NO_CURSOR_SHADOW 0x20 -#define RDP5_NO_CURSORSETTINGS 0x40 /* disables cursor blinking */ - -/* compression types */ -#define RDP_MPPC_COMPRESSED 0x20 -#define RDP_MPPC_RESET 0x40 -#define RDP_MPPC_FLUSH 0x80 -#define RDP_MPPC_DICT_SIZE 8192 - -/* Keymap flags */ -#define MapRightShiftMask (1 << 0) -#define MapLeftShiftMask (1 << 1) -#define MapShiftMask (MapRightShiftMask | MapLeftShiftMask) - -#define MapRightAltMask (1 << 2) -#define MapLeftAltMask (1 << 3) -#define MapAltGrMask MapRightAltMask - -#define MapRightCtrlMask (1 << 4) -#define MapLeftCtrlMask (1 << 5) -#define MapCtrlMask (MapRightCtrlMask | MapLeftCtrlMask) - -#define MapRightWinMask (1 << 6) -#define MapLeftWinMask (1 << 7) -#define MapWinMask (MapRightWinMask | MapLeftWinMask) - -#define MapNumLockMask (1 << 8) -#define MapCapsLockMask (1 << 9) - -#define MapLocalStateMask (1 << 10) - -#define MapInhibitMask (1 << 11) - -#define MASK_ADD_BITS(var, mask) (var |= mask) -#define MASK_REMOVE_BITS(var, mask) (var &= ~mask) -#define MASK_HAS_BITS(var, mask) ((var & mask)>0) -#define MASK_CHANGE_BIT(var, mask, active) \ - (var = ((var & ~mask) | (active ? mask : 0))) - -/* Clipboard constants, "borrowed" from GCC system headers in - the w32 cross compiler */ - -#define CF_TEXT 1 -#define CF_BITMAP 2 -#define CF_METAFILEPICT 3 -#define CF_SYLK 4 -#define CF_DIF 5 -#define CF_TIFF 6 -#define CF_OEMTEXT 7 -#define CF_DIB 8 -#define CF_PALETTE 9 -#define CF_PENDATA 10 -#define CF_RIFF 11 -#define CF_WAVE 12 -#define CF_UNICODETEXT 13 -#define CF_ENHMETAFILE 14 -#define CF_HDROP 15 -#define CF_LOCALE 16 -#define CF_MAX 17 -#define CF_OWNERDISPLAY 128 -#define CF_DSPTEXT 129 -#define CF_DSPBITMAP 130 -#define CF_DSPMETAFILEPICT 131 -#define CF_DSPENHMETAFILE 142 -#define CF_PRIVATEFIRST 512 -#define CF_PRIVATELAST 767 -#define CF_GDIOBJFIRST 768 -#define CF_GDIOBJLAST 1023 - -/* Sound format constants */ -#define WAVE_FORMAT_PCM 1 -#define WAVE_FORMAT_ADPCM 2 -#define WAVE_FORMAT_ALAW 6 -#define WAVE_FORMAT_MULAW 7 - -/* Virtual channel options */ -#define CHANNEL_OPTION_INITIALIZED 0x80000000 -#define CHANNEL_OPTION_ENCRYPT_RDP 0x40000000 -#define CHANNEL_OPTION_COMPRESS_RDP 0x00800000 -#define CHANNEL_OPTION_SHOW_PROTOCOL 0x00200000 - -/* NT status codes for RDPDR */ -#define STATUS_SUCCESS 0x00000000 -#define STATUS_PENDING 0x00000103 - -#define STATUS_NO_MORE_FILES 0x80000006 -#define STATUS_DEVICE_PAPER_EMPTY 0x8000000e -#define STATUS_DEVICE_POWERED_OFF 0x8000000f -#define STATUS_DEVICE_OFF_LINE 0x80000010 -#define STATUS_DEVICE_BUSY 0x80000011 - -#define STATUS_INVALID_HANDLE 0xc0000008 -#define STATUS_INVALID_PARAMETER 0xc000000d -#define STATUS_NO_SUCH_FILE 0xc000000f -#define STATUS_INVALID_DEVICE_REQUEST 0xc0000010 -#define STATUS_ACCESS_DENIED 0xc0000022 -#define STATUS_OBJECT_NAME_COLLISION 0xc0000035 -#define STATUS_DISK_FULL 0xc000007f -#define STATUS_FILE_IS_A_DIRECTORY 0xc00000ba -#define STATUS_NOT_SUPPORTED 0xc00000bb -#define STATUS_TIMEOUT 0xc0000102 -#define STATUS_CANCELLED 0xc0000120 - -/* RDPDR constants */ -#define RDPDR_MAX_DEVICES 0x10 -#define DEVICE_TYPE_SERIAL 0x01 -#define DEVICE_TYPE_PARALLEL 0x02 -#define DEVICE_TYPE_PRINTER 0x04 -#define DEVICE_TYPE_DISK 0x08 -#define DEVICE_TYPE_SCARD 0x20 - -#define FILE_DIRECTORY_FILE 0x00000001 -#define FILE_NON_DIRECTORY_FILE 0x00000040 -#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000 - -/* RDP5 disconnect PDU */ -#define exDiscReasonNoInfo 0x0000 -#define exDiscReasonAPIInitiatedDisconnect 0x0001 -#define exDiscReasonAPIInitiatedLogoff 0x0002 -#define exDiscReasonServerIdleTimeout 0x0003 -#define exDiscReasonServerLogonTimeout 0x0004 -#define exDiscReasonReplacedByOtherConnection 0x0005 -#define exDiscReasonOutOfMemory 0x0006 -#define exDiscReasonServerDeniedConnection 0x0007 -#define exDiscReasonServerDeniedConnectionFips 0x0008 -#define exDiscReasonLicenseInternal 0x0100 -#define exDiscReasonLicenseNoLicenseServer 0x0101 -#define exDiscReasonLicenseNoLicense 0x0102 -#define exDiscReasonLicenseErrClientMsg 0x0103 -#define exDiscReasonLicenseHwidDoesntMatchLicense 0x0104 -#define exDiscReasonLicenseErrClientLicense 0x0105 -#define exDiscReasonLicenseCantFinishProtocol 0x0106 -#define exDiscReasonLicenseClientEndedProtocol 0x0107 -#define exDiscReasonLicenseErrClientEncryption 0x0108 -#define exDiscReasonLicenseCantUpgradeLicense 0x0109 -#define exDiscReasonLicenseNoRemoteConnections 0x010a - -#define RDP_ORDER_STANDARD 0x01 -#define RDP_ORDER_SECONDARY 0x02 -#define RDP_ORDER_BOUNDS 0x04 -#define RDP_ORDER_CHANGE 0x08 -#define RDP_ORDER_DELTA 0x10 -#define RDP_ORDER_LASTBOUNDS 0x20 -#define RDP_ORDER_SMALL 0x40 -#define RDP_ORDER_TINY 0x80 - -#define RDP_ORDER_DESTBLT 0 -#define RDP_ORDER_PATBLT 1 -#define RDP_ORDER_SCREENBLT 2 -#define RDP_ORDER_LINE 9 -#define RDP_ORDER_RECT 10 -#define RDP_ORDER_DESKSAVE 11 -#define RDP_ORDER_MEMBLT 13 -#define RDP_ORDER_TRIBLT 14 -#define RDP_ORDER_POLYLINE 22 -#define RDP_ORDER_TEXT2 27 - -#define RDP_ORDER_RAW_BMPCACHE 0 -#define RDP_ORDER_COLCACHE 1 -#define RDP_ORDER_BMPCACHE 2 -#define RDP_ORDER_FONTCACHE 3 -#define RDP_ORDER_RAW_BMPCACHE2 4 -#define RDP_ORDER_BMPCACHE2 5 - -/* drawable types */ -#define WND_TYPE_BITMAP 0 -#define WND_TYPE_WND 1 -#define WND_TYPE_SCREEN 2 -#define WND_TYPE_BUTTON 3 -#define WND_TYPE_IMAGE 4 -#define WND_TYPE_EDIT 5 -#define WND_TYPE_LABEL 6 -#define WND_TYPE_COMBO 7 -#define WND_TYPE_SPECIAL 8 - -/* button states */ -#define BUTTON_STATE_UP 0 -#define BUTTON_STATE_DOWN 1 - -/* messages */ -#define WM_PAINT 3 -#define WM_KEYDOWN 15 -#define WM_KEYUP 16 -#define WM_MOUSEMOVE 100 -#define WM_LBUTTONUP 101 -#define WM_LBUTTONDOWN 102 -#define WM_RBUTTONUP 103 -#define WM_RBUTTONDOWN 104 -#define WM_BUTTON3UP 105 -#define WM_BUTTON3DOWN 106 -#define WM_BUTTON4UP 107 -#define WM_BUTTON4DOWN 108 -#define WM_BUTTON5UP 109 -#define WM_BUTTON5DOWN 110 -#define WM_INVALIDATE 200 - -#define CB_ITEMCHANGE 300 diff --git a/xrdp/funcs.c b/xrdp/funcs.c index 69b6bf62..65f40908 100644 --- a/xrdp/funcs.c +++ b/xrdp/funcs.c @@ -24,7 +24,8 @@ /*****************************************************************************/ /* returns boolean */ -int rect_contains_pt(struct xrdp_rect* in, int x, int y) +int APP_CC +rect_contains_pt(struct xrdp_rect* in, int x, int y) { if (x < in->left) { @@ -46,8 +47,9 @@ int rect_contains_pt(struct xrdp_rect* in, int x, int y) } /*****************************************************************************/ -int rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2, - struct xrdp_rect* out) +int APP_CC +rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2, + struct xrdp_rect* out) { int rv; struct xrdp_rect dumby; @@ -84,7 +86,8 @@ int rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2, /*****************************************************************************/ /* adjust the bounds to fit in the bitmap */ /* return false if there is nothing to draw else return true */ -int check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy) +int APP_CC +check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy) { if (*x >= b->width) { @@ -221,43 +224,46 @@ int check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy) */ /* non shift chars */ -char chars1[] = {'\0', '\0', '1', '2', '3', '4', '5', '6', - '7', '8', '9', '0', '-', '=', '\0', '\0', - 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', - 'o', 'p', '[', ']', '\0', '\0', 'a', 's', - 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', - '\'', '`', '\0', '\\', 'z', 'x', 'c', 'v', - 'b', 'n', 'm', ',', '.', '/', '\0', '*', - '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', - '8', '9', '-', '4', '5', '6', '+', '1', - '2', '3', '0', '.', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; +static char chars1[] = +{'\0', '\0', '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', '-', '=', '\0', '\0', + 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', + 'o', 'p', '[', ']', '\0', '\0', 'a', 's', + 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', + '\'', '`', '\0', '\\', 'z', 'x', 'c', 'v', + 'b', 'n', 'm', ',', '.', '/', '\0', '*', + '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', + '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; /* shift chars */ -char chars2[] = {'\0', '\0', '!', '@', '#', '$', '%', '^', - '&', '*', '(', ')', '_', '+', '\0', '\0', - 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', - 'O', 'P', '{', '}', '\0', '\0', 'A', 'S', - 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', - '"', '~', '\0', '|', 'Z', 'X', 'C', 'V', - 'B', 'N', 'M', '<', '>', '?', '\0', '*', - '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', - '8', '9', '-', '4', '5', '6', '+', '1', - '2', '3', '0', '.', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; +static char chars2[] = +{'\0', '\0', '!', '@', '#', '$', '%', '^', + '&', '*', '(', ')', '_', '+', '\0', '\0', + 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', + 'O', 'P', '{', '}', '\0', '\0', 'A', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', + '"', '~', '\0', '|', 'Z', 'X', 'C', 'V', + 'B', 'N', 'M', '<', '>', '?', '\0', '*', + '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', + '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; /*****************************************************************************/ -char get_char_from_scan_code(int device_flags, int scan_code, int* keys, - int caps_lock, int num_lock, int scroll_lock) +char APP_CC +get_char_from_scan_code(int device_flags, int scan_code, int* keys, + int caps_lock, int num_lock, int scroll_lock) { char rv; int shift; @@ -321,7 +327,8 @@ char get_char_from_scan_code(int device_flags, int scan_code, int* keys, /*****************************************************************************/ /* add a ch at index position in text, index starts at 0 */ /* if index = -1 add it to the end */ -int add_char_at(char* text, char ch, int index) +int APP_CC +add_char_at(char* text, char ch, int index) { int len; int i; @@ -345,7 +352,8 @@ int add_char_at(char* text, char ch, int index) /*****************************************************************************/ /* remove a ch at index position in text, index starts at 0 */ /* if index = -1 remove it from the end */ -int remove_char_at(char* text, int index) +int APP_CC +remove_char_at(char* text, int index) { int len; int i; @@ -369,7 +377,8 @@ int remove_char_at(char* text, int index) } /*****************************************************************************/ -int set_string(char** in_str, char* in) +int APP_CC +set_string(char** in_str, char* in) { if (in_str == 0) { diff --git a/xrdp/libxrdp.h b/xrdp/libxrdp.h deleted file mode 100644 index 28b68828..00000000 --- a/xrdp/libxrdp.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - use freely -*/ - -int server_init(void); -int server_exit(void); -int server_connect(int sck, int* width, int* height, int* bpp); -int server_loop(int sck); -int server_set_callback(int (* callback)(int, int, int)); -int server_begin_update(void); -int server_end_update(void); -int server_fill_rect(int x, int y, int cx, int cy, int color); -int server_screen_blt(int x, int y, int cx, int cy, int srcx, int srcy); -int server_paint_rect(int x, int y, int cx, int cy, char* data); -int server_set_pointer(int x, int y, char* data, char* mask); -int server_palette(int* palette); - diff --git a/xrdp/makefile_lib b/xrdp/makefile_lib deleted file mode 100644 index 77ae095e..00000000 --- a/xrdp/makefile_lib +++ /dev/null @@ -1,21 +0,0 @@ - -XRDPOBJ = ../common/os_calls.o \ - xrdp_tcp.o xrdp_iso.o xrdp_mcs.o xrdp_sec.o \ - xrdp_rdp.o xrdp_process.o xrdp_orders.o \ - xrdp_bitmap.o xrdp_wm.o xrdp_painter.o xrdp_list.o \ - xrdp_region.o xrdp_cache.o xrdp_font.o funcs.o \ - xrdp_file.o xrdp_bitmap_compress.o \ - xrdp_interface.o - -CFLAGS = -Wall -O2 -I../common -DXRDP_LIB -LDFLAGS = -L /usr/gnu/lib -shared -LIBS = -lcrypto -CC = gcc - -all: xrdp - -xrdp: $(XRDPOBJ) - $(CC) $(LDFLAGS) -o libxrdp.so $(XRDPOBJ) $(LIBS) - -clean: - rm -f $(XRDPOBJ) xrdp diff --git a/xrdp/makefile_win32 b/xrdp/makefile_win32 index 0ddd82c9..5d62472b 100644 --- a/xrdp/makefile_win32 +++ b/xrdp/makefile_win32 @@ -6,20 +6,20 @@ # run 'set PATH=c:\borland\bcc55\bin' and run 'make -f makefile_win32 all' # -XRDPOBJ = xrdp.obj xrdp_tcp.obj xrdp_iso.obj xrdp_mcs.obj \ - xrdp_sec.obj xrdp_rdp.obj xrdp_process.obj xrdp_listen.obj \ - xrdp_orders.obj xrdp_bitmap.obj xrdp_wm.obj xrdp_painter.obj \ - xrdp_list.obj xrdp_region.obj xrdp_cache.obj xrdp_font.obj \ - funcs.obj xrdp_login_wnd.obj xrdp_file.obj xrdp_interface.obj \ - xrdp_bitmap_compress.obj \ - os_calls.obj - -CFLAGS = -w- -O2 -I../common -C_OS_FLAGS = -w- -O2 -Ic:/borland/bcc55/include -Ic:/openssl/include -DUSE_OPENSSL -c +XRDPOBJ = xrdp.obj xrdp_process.obj xrdp_listen.obj \ + xrdp_bitmap.obj xrdp_wm.obj xrdp_painter.obj \ + xrdp_region.obj xrdp_cache.obj xrdp_font.obj funcs.obj \ + xrdp_login_wnd.obj xrdp_interface.obj \ + list.obj \ + file.obj \ + os_calls.obj \ + thread_calls.obj + +CFLAGS = -w- -O2 -I../common -Ic:/borland/bcc55/include -Ic:/openssl/include -I../libxrdp LDFLAGS = -Lc:/borland/bcc55/lib xrdp: $(XRDPOBJ) - $(CC) $(LDFLAGS) libeay32.lib $(XRDPOBJ) + $(CC) $(LDFLAGS) libeay32.lib xrdp.lib $(XRDPOBJ) all: lib xrdp @@ -28,6 +28,17 @@ clean: lib: implib -a -w libeay32.lib c:/windows/system32/libeay32.dll + implib -w xrdp.lib ../libxrdp/xrdp.dll + +list.obj: + $(CC) $(CFLAGS) -c ../common/list.c + +file.obj: + $(CC) $(CFLAGS) -c ../common/file.c os_calls.obj: - $(CC) $(C_OS_FLAGS) ../common/os_calls.c + $(CC) $(CFLAGS) -c ../common/os_calls.c + +thread_calls.obj: + $(CC) $(CFLAGS) -c ../common/thread_calls.c + diff --git a/xrdp/xrdp.c b/xrdp/xrdp.c index 511c4a80..166ecf55 100644 --- a/xrdp/xrdp.c +++ b/xrdp/xrdp.c @@ -20,13 +20,26 @@ */ +#if defined(_WIN32) +#include <windows.h> +#else +#include <pthread.h> +#endif #include "xrdp.h" static struct xrdp_listen* g_listen = 0; static int g_threadid = 0; /* main threadid */ +#if defined(_WIN32) +static CRITICAL_SECTION g_term_mutex; +#else +static pthread_mutex_t g_term_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif +static int g_term = 0; + /*****************************************************************************/ -void shutdown(int sig) +void +xrdp_shutdown(int sig) { struct xrdp_listen* listen; @@ -43,19 +56,70 @@ void shutdown(int sig) g_set_term(1); g_sleep(1000); xrdp_listen_delete(listen); - g_exit_system(); +#if defined(_WIN32) + WSACleanup(); + DeleteCriticalSection(&g_term_mutex); +#endif } } /*****************************************************************************/ -int main(int argc, char** argv) +int +g_is_term(void) +{ + int rv; + +#if defined(_WIN32) + EnterCriticalSection(&g_term_mutex); + rv = g_term; + LeaveCriticalSection(&g_term_mutex); +#else + pthread_mutex_lock(&g_term_mutex); + rv = g_term; + pthread_mutex_unlock(&g_term_mutex); +#endif + return rv; +} + +/*****************************************************************************/ +void +g_set_term(int in_val) { - g_init_system(); +#if defined(_WIN32) + EnterCriticalSection(&g_term_mutex); + g_term = in_val; + LeaveCriticalSection(&g_term_mutex); +#else + pthread_mutex_lock(&g_term_mutex); + g_term = in_val; + pthread_mutex_unlock(&g_term_mutex); +#endif +} + +/*****************************************************************************/ +void +pipe_sig(int sig_num) +{ + /* do nothing */ + g_printf("got SIGPIPE(%d)\n\r", sig_num); +} + +/*****************************************************************************/ +int +main(int argc, char** argv) +{ +#if defined(_WIN32) + WSADATA w; + + WSAStartup(2, &w); + InitializeCriticalSection(&g_term_mutex); +#endif g_threadid = g_get_threadid(); g_listen = xrdp_listen_create(); - g_signal(2, shutdown); - g_signal(9, shutdown); - g_signal(15, shutdown); + g_signal(2, xrdp_shutdown); + g_signal(9, xrdp_shutdown); + g_signal(13, pipe_sig); /* sig pipe */ + g_signal(15, xrdp_shutdown); xrdp_listen_main_loop(g_listen); return 0; } diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h index a73e1353..4a23a0a8 100644 --- a/xrdp/xrdp.h +++ b/xrdp/xrdp.h @@ -23,278 +23,262 @@ /* include other h files */ #include "arch.h" #include "parse.h" +#include "libxrdpinc.h" #include "xrdp_types.h" -#include "constants.h" -#include "xrdp_defines.h" +#include "xrdp_constants.h" +#include "defines.h" #include "os_calls.h" +#include "ssl_calls.h" +#include "thread_calls.h" +#include "list.h" +#include "file.h" -/* xrdp_tcp.c */ -struct xrdp_tcp* xrdp_tcp_create(struct xrdp_iso* owner, int sck); -void xrdp_tcp_delete(struct xrdp_tcp* self); -int xrdp_tcp_init(struct xrdp_tcp* self, struct stream* s); -int xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len); -int xrdp_tcp_send(struct xrdp_tcp* self, struct stream* s); - -/* xrdp_iso.c */ -struct xrdp_iso* xrdp_iso_create(struct xrdp_mcs* owner, int sck); -void xrdp_iso_delete(struct xrdp_iso* self); -int xrdp_iso_init(struct xrdp_iso* self, struct stream* s); -int xrdp_iso_recv(struct xrdp_iso* self, struct stream* s); -int xrdp_iso_send(struct xrdp_iso* self, struct stream* s); -int xrdp_iso_incoming(struct xrdp_iso* self); - -/* xrdp_mcs.c */ -struct xrdp_mcs* xrdp_mcs_create(struct xrdp_sec* owner, int sck, - struct stream* client_mcs_data, - struct stream* server_mcs_data); -void xrdp_mcs_delete(struct xrdp_mcs* self); -int xrdp_mcs_init(struct xrdp_mcs* self, struct stream* s); -int xrdp_mcs_recv(struct xrdp_mcs* self, struct stream* s, int* chan); -int xrdp_mcs_send(struct xrdp_mcs* self, struct stream* s); -int xrdp_mcs_incoming(struct xrdp_mcs* self); -int xrdp_mcs_disconnect(struct xrdp_mcs* self); - -/* xrdp_sec.c */ -struct xrdp_sec* xrdp_sec_create(struct xrdp_rdp* owner, int sck); -void xrdp_sec_delete(struct xrdp_sec* self); -int xrdp_sec_init(struct xrdp_sec* self, struct stream* s); -int xrdp_sec_recv(struct xrdp_sec* self, struct stream* s, int* chan); -int xrdp_sec_send(struct xrdp_sec* self, struct stream* s, int flags); -int xrdp_sec_incoming(struct xrdp_sec* self); -int xrdp_sec_disconnect(struct xrdp_sec* self); - -/* xrdp_rdp.c */ -struct xrdp_rdp* xrdp_rdp_create(struct xrdp_process* owner, int sck); -void xrdp_rdp_delete(struct xrdp_rdp* self); -int xrdp_rdp_init(struct xrdp_rdp* self, struct stream* s); -int xrdp_rdp_init_data(struct xrdp_rdp* self, struct stream* s); -int xrdp_rdp_recv(struct xrdp_rdp* self, struct stream* s, int* code); -int xrdp_rdp_send(struct xrdp_rdp* self, struct stream* s, int pdu_type); -int xrdp_rdp_send_data(struct xrdp_rdp* self, struct stream* s, - int data_pdu_type); -int xrdp_rdp_incoming(struct xrdp_rdp* self); -int xrdp_rdp_send_demand_active(struct xrdp_rdp* self); -int xrdp_rdp_process_confirm_active(struct xrdp_rdp* self, struct stream* s); -int xrdp_rdp_process_data(struct xrdp_rdp* self, struct stream* s); -int xrdp_rdp_disconnect(struct xrdp_rdp* self); - -/* xrdp_orders.c */ -struct xrdp_orders* xrdp_orders_create(struct xrdp_process* owner, - struct xrdp_rdp* rdp_layer); -void xrdp_orders_delete(struct xrdp_orders* self); -int xrdp_orders_init(struct xrdp_orders* self); -int xrdp_orders_send(struct xrdp_orders* self); -int xrdp_orders_force_send(struct xrdp_orders* self); -int xrdp_orders_rect(struct xrdp_orders* self, int x, int y, int cx, int cy, - int color, struct xrdp_rect* rect); -int xrdp_orders_screen_blt(struct xrdp_orders* self, int x, int y, - int cx, int cy, int srcx, int srcy, - int rop, struct xrdp_rect* rect); -int xrdp_orders_pat_blt(struct xrdp_orders* self, int x, int y, - int cx, int cy, int rop, int bg_color, - int fg_color, struct xrdp_brush* brush, - struct xrdp_rect* rect); -int xrdp_orders_dest_blt(struct xrdp_orders* self, int x, int y, - int cx, int cy, int rop, - struct xrdp_rect* rect); -int xrdp_orders_line(struct xrdp_orders* self, int mix_mode, - int startx, int starty, - int endx, int endy, int rop, int bg_color, - struct xrdp_pen* pen, - struct xrdp_rect* rect); -int xrdp_orders_mem_blt(struct xrdp_orders* self, int cache_id, - int color_table, int x, int y, int cx, int cy, - int rop, int srcx, int srcy, - int cache_idx, struct xrdp_rect* rect); -int xrdp_orders_text(struct xrdp_orders* self, - int font, int flags, int mixmode, - int fg_color, int bg_color, - int clip_left, int clip_top, - int clip_right, int clip_bottom, - int box_left, int box_top, - int box_right, int box_bottom, - int x, int y, char* data, int data_len, - struct xrdp_rect* rect); -int xrdp_orders_send_palette(struct xrdp_orders* self, int* palette, - int cache_id); -int xrdp_orders_send_raw_bitmap(struct xrdp_orders* self, - struct xrdp_bitmap* bitmap, - int cache_id, int cache_idx); -int xrdp_orders_send_bitmap(struct xrdp_orders* self, - struct xrdp_bitmap* bitmap, - int cache_id, int cache_idx); -int xrdp_orders_send_font(struct xrdp_orders* self, - struct xrdp_font_item* font_item, - int font_index, int char_index); +/* xrdp.c */ +int +g_is_term(void); +void +g_set_term(int in_val); /* xrdp_cache.c */ -struct xrdp_cache* xrdp_cache_create(struct xrdp_wm* owner, - struct xrdp_orders* orders, - struct xrdp_client_info* client_info); -void xrdp_cache_delete(struct xrdp_cache* self); -int xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap); -int xrdp_cache_add_palette(struct xrdp_cache* self, int* palette); -int xrdp_cache_add_char(struct xrdp_cache* self, - struct xrdp_font_item* font_item); -int xrdp_cache_add_pointer(struct xrdp_cache* self, - struct xrdp_pointer_item* pointer_item); -int xrdp_cache_add_pointer_static(struct xrdp_cache* self, - struct xrdp_pointer_item* pointer_item, - int index); +struct xrdp_cache* APP_CC +xrdp_cache_create(struct xrdp_wm* owner, struct xrdp_session* session, + struct xrdp_client_info* client_info); +void APP_CC +xrdp_cache_delete(struct xrdp_cache* self); +int APP_CC +xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap); +int APP_CC +xrdp_cache_add_palette(struct xrdp_cache* self, int* palette); +int APP_CC +xrdp_cache_add_char(struct xrdp_cache* self, + struct xrdp_font_char* font_item); +int APP_CC +xrdp_cache_add_pointer(struct xrdp_cache* self, + struct xrdp_pointer_item* pointer_item); +int APP_CC +xrdp_cache_add_pointer_static(struct xrdp_cache* self, + struct xrdp_pointer_item* pointer_item, + int index); /* xrdp_wm.c */ -struct xrdp_wm* xrdp_wm_create(struct xrdp_process* owner, - struct xrdp_client_info* client_info); -void xrdp_wm_delete(struct xrdp_wm* self); -int xrdp_wm_send_palette(struct xrdp_wm* self); -int xrdp_wm_init(struct xrdp_wm* self); -int xrdp_wm_send_bitmap(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, - int x, int y, int cx, int cy); -int xrdp_wm_set_pointer(struct xrdp_wm* self, int cache_idx); -int xrdp_wm_set_focused(struct xrdp_wm* self, struct xrdp_bitmap* wnd); -int xrdp_wm_get_vis_region(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, - int x, int y, int cx, int cy, - struct xrdp_region* region, int clip_children); -int xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y); -int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down); -int xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code); -int xrdp_wm_key_sync(struct xrdp_wm* self, int device_flags, int key_flags); -int xrdp_wm_pu(struct xrdp_wm* self, struct xrdp_bitmap* control); -int xrdp_wm_send_pointer(struct xrdp_wm* self, int cache_idx, - char* data, char* mask, int x, int y); -int xrdp_wm_pointer(struct xrdp_wm* self, char* data, char* mask, int x, int y); +struct xrdp_wm* APP_CC +xrdp_wm_create(struct xrdp_process* owner, + struct xrdp_client_info* client_info); +void APP_CC +xrdp_wm_delete(struct xrdp_wm* self); +int APP_CC +xrdp_wm_send_palette(struct xrdp_wm* self); +int APP_CC +xrdp_wm_init(struct xrdp_wm* self); +int APP_CC +xrdp_wm_send_bitmap(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, + int x, int y, int cx, int cy); +int APP_CC +xrdp_wm_set_pointer(struct xrdp_wm* self, int cache_idx); +int APP_CC +xrdp_wm_set_focused(struct xrdp_wm* self, struct xrdp_bitmap* wnd); +int APP_CC +xrdp_wm_get_vis_region(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, + int x, int y, int cx, int cy, + struct xrdp_region* region, int clip_children); +int APP_CC +xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y); +int APP_CC +xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down); +int APP_CC +xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code); +int APP_CC +xrdp_wm_key_sync(struct xrdp_wm* self, int device_flags, int key_flags); +int APP_CC +xrdp_wm_pu(struct xrdp_wm* self, struct xrdp_bitmap* control); +int APP_CC +xrdp_wm_send_pointer(struct xrdp_wm* self, int cache_idx, + char* data, char* mask, int x, int y); +int APP_CC +xrdp_wm_pointer(struct xrdp_wm* self, char* data, char* mask, int x, int y); +int +callback(long id, int msg, long param1, long param2, long param3, long param4); /* xrdp_process.c */ -struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner); -void xrdp_process_delete(struct xrdp_process* self); -int xrdp_process_loop(struct xrdp_process* self, struct stream* s); -int xrdp_process_main_loop(struct xrdp_process* self); +struct xrdp_process* APP_CC +xrdp_process_create(struct xrdp_listen* owner); +void APP_CC +xrdp_process_delete(struct xrdp_process* self); +int APP_CC +xrdp_process_loop(struct xrdp_process* self); +int APP_CC +xrdp_process_main_loop(struct xrdp_process* self); /* xrdp_listen.c */ -struct xrdp_listen* xrdp_listen_create(void); -void xrdp_listen_delete(struct xrdp_listen* self); -int xrdp_listen_delete_pro(struct xrdp_listen* self, struct xrdp_process* pro); -int xrdp_listen_main_loop(struct xrdp_listen* self); +struct xrdp_listen* APP_CC +xrdp_listen_create(void); +void APP_CC +xrdp_listen_delete(struct xrdp_listen* self); +int APP_CC +xrdp_listen_delete_pro(struct xrdp_listen* self, struct xrdp_process* pro); +int APP_CC +xrdp_listen_main_loop(struct xrdp_listen* self); /* xrdp_region.c */ -struct xrdp_region* xrdp_region_create(struct xrdp_wm* wm); -void xrdp_region_delete(struct xrdp_region* self); -int xrdp_region_add_rect(struct xrdp_region* self, struct xrdp_rect* rect); -int xrdp_region_insert_rect(struct xrdp_region* self, int i, int left, - int top, int right, int bottom); -int xrdp_region_subtract_rect(struct xrdp_region* self, - struct xrdp_rect* rect); -int xrdp_region_get_rect(struct xrdp_region* self, int index, - struct xrdp_rect* rect); +struct xrdp_region* APP_CC +xrdp_region_create(struct xrdp_wm* wm); +void APP_CC +xrdp_region_delete(struct xrdp_region* self); +int APP_CC +xrdp_region_add_rect(struct xrdp_region* self, struct xrdp_rect* rect); +int APP_CC +xrdp_region_insert_rect(struct xrdp_region* self, int i, int left, + int top, int right, int bottom); +int APP_CC +xrdp_region_subtract_rect(struct xrdp_region* self, + struct xrdp_rect* rect); +int APP_CC +xrdp_region_get_rect(struct xrdp_region* self, int index, + struct xrdp_rect* rect); /* xrdp_bitmap.c */ -struct xrdp_bitmap* xrdp_bitmap_create(int width, int height, int bpp, - int type, struct xrdp_wm* wm); -struct xrdp_bitmap* xrdp_bitmap_create_with_data(int width, int height, - int bpp, char* data, - struct xrdp_wm* wm); -void xrdp_bitmap_delete(struct xrdp_bitmap* self); -struct xrdp_bitmap* xrdp_bitmap_get_child_by_id(struct xrdp_bitmap* self, - int id); -int xrdp_bitmap_set_focus(struct xrdp_bitmap* self, int focused); -int xrdp_bitmap_load(struct xrdp_bitmap* self, char* filename, int* palette); -int xrdp_bitmap_get_pixel(struct xrdp_bitmap* self, int x, int y); -int xrdp_bitmap_set_pixel(struct xrdp_bitmap* self, int x, int y, int pixel); -int xrdp_bitmap_copy_box(struct xrdp_bitmap* self, - struct xrdp_bitmap* dest, - int x, int y, int cx, int cy); -int xrdp_bitmap_copy_box_with_crc(struct xrdp_bitmap* self, - struct xrdp_bitmap* dest, - int x, int y, int cx, int cy); -int xrdp_bitmap_compare(struct xrdp_bitmap* self, - struct xrdp_bitmap* b); -int xrdp_bitmap_compare_with_crc(struct xrdp_bitmap* self, - struct xrdp_bitmap* b); -int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect); -int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, - int param1, int param2); -int xrdp_bitmap_to_screenx(struct xrdp_bitmap* self, int x); -int xrdp_bitmap_to_screeny(struct xrdp_bitmap* self, int y); -int xrdp_bitmap_from_screenx(struct xrdp_bitmap* self, int x); -int xrdp_bitmap_from_screeny(struct xrdp_bitmap* self, int y); +struct xrdp_bitmap* APP_CC +xrdp_bitmap_create(int width, int height, int bpp, + int type, struct xrdp_wm* wm); +struct xrdp_bitmap* APP_CC +xrdp_bitmap_create_with_data(int width, int height, + int bpp, char* data, + struct xrdp_wm* wm); +void APP_CC +xrdp_bitmap_delete(struct xrdp_bitmap* self); +struct xrdp_bitmap* APP_CC +xrdp_bitmap_get_child_by_id(struct xrdp_bitmap* self, int id); +int APP_CC +xrdp_bitmap_set_focus(struct xrdp_bitmap* self, int focused); +int APP_CC +xrdp_bitmap_load(struct xrdp_bitmap* self, char* filename, int* palette); +int APP_CC +xrdp_bitmap_get_pixel(struct xrdp_bitmap* self, int x, int y); +int APP_CC +xrdp_bitmap_set_pixel(struct xrdp_bitmap* self, int x, int y, int pixel); +int APP_CC +xrdp_bitmap_copy_box(struct xrdp_bitmap* self, + struct xrdp_bitmap* dest, + int x, int y, int cx, int cy); +int APP_CC +xrdp_bitmap_copy_box_with_crc(struct xrdp_bitmap* self, + struct xrdp_bitmap* dest, + int x, int y, int cx, int cy); +int APP_CC +xrdp_bitmap_compare(struct xrdp_bitmap* self, + struct xrdp_bitmap* b); +int APP_CC +xrdp_bitmap_compare_with_crc(struct xrdp_bitmap* self, + struct xrdp_bitmap* b); +int APP_CC +xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect); +int APP_CC +xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, + int param1, int param2); +int APP_CC +xrdp_bitmap_to_screenx(struct xrdp_bitmap* self, int x); +int APP_CC +xrdp_bitmap_to_screeny(struct xrdp_bitmap* self, int y); +int APP_CC +xrdp_bitmap_from_screenx(struct xrdp_bitmap* self, int x); +int APP_CC +xrdp_bitmap_from_screeny(struct xrdp_bitmap* self, int y); /* xrdp_painter.c */ -struct xrdp_painter* xrdp_painter_create(struct xrdp_wm* wn); -void xrdp_painter_delete(struct xrdp_painter* self); -int xrdp_painter_begin_update(struct xrdp_painter* self); -int xrdp_painter_end_update(struct xrdp_painter* self); -int xrdp_painter_font_needed(struct xrdp_painter* self); -int xrdp_painter_set_clip(struct xrdp_painter* self, - int x, int y, int cx, int cy); -int xrdp_painter_clr_clip(struct xrdp_painter* self); -int xrdp_painter_fill_rect(struct xrdp_painter* self, - struct xrdp_bitmap* bitmap, - int x, int y, int cx, int cy); -int xrdp_painter_fill_rect2(struct xrdp_painter* self, - struct xrdp_bitmap* bitmap, - int x, int y, int cx, int cy); -int xrdp_painter_draw_bitmap(struct xrdp_painter* self, - struct xrdp_bitmap* bitmap, - struct xrdp_bitmap* to_draw, - int x, int y, int cx, int cy); -int xrdp_painter_text_width(struct xrdp_painter* self, char* text); -int xrdp_painter_text_height(struct xrdp_painter* self, char* text); -int xrdp_painter_draw_text(struct xrdp_painter* self, - struct xrdp_bitmap* bitmap, - int x, int y, char* text); - -/* xrdp_list.c */ -struct xrdp_list* xrdp_list_create(void); -void xrdp_list_delete(struct xrdp_list* self); -void xrdp_list_add_item(struct xrdp_list* self, long item); -long xrdp_list_get_item(struct xrdp_list* self, int index); -void xrdp_list_clear(struct xrdp_list* self); -int xrdp_list_index_of(struct xrdp_list* self, long item); -void xrdp_list_remove_item(struct xrdp_list* self, int index); -void xrdp_list_insert_item(struct xrdp_list* self, int index, long item); +struct xrdp_painter* APP_CC +xrdp_painter_create(struct xrdp_wm* wm, struct xrdp_session* session); +void APP_CC +xrdp_painter_delete(struct xrdp_painter* self); +int APP_CC +xrdp_painter_begin_update(struct xrdp_painter* self); +int APP_CC +xrdp_painter_end_update(struct xrdp_painter* self); +int APP_CC +xrdp_painter_font_needed(struct xrdp_painter* self); +int APP_CC +xrdp_painter_set_clip(struct xrdp_painter* self, + int x, int y, int cx, int cy); +int APP_CC +xrdp_painter_clr_clip(struct xrdp_painter* self); +int APP_CC +xrdp_painter_fill_rect(struct xrdp_painter* self, + struct xrdp_bitmap* bitmap, + int x, int y, int cx, int cy); +int APP_CC +xrdp_painter_fill_rect2(struct xrdp_painter* self, + struct xrdp_bitmap* bitmap, + int x, int y, int cx, int cy); +int APP_CC +xrdp_painter_draw_bitmap(struct xrdp_painter* self, + struct xrdp_bitmap* bitmap, + struct xrdp_bitmap* to_draw, + int x, int y, int cx, int cy); +int APP_CC +xrdp_painter_text_width(struct xrdp_painter* self, char* text); +int APP_CC +xrdp_painter_text_height(struct xrdp_painter* self, char* text); +int APP_CC +xrdp_painter_draw_text(struct xrdp_painter* self, + struct xrdp_bitmap* bitmap, + int x, int y, char* text); /* xrdp_font.c */ -struct xrdp_font* xrdp_font_create(struct xrdp_wm* wm); -void xrdp_font_delete(struct xrdp_font* self); -int xrdp_font_item_compare(struct xrdp_font_item* font1, - struct xrdp_font_item* font2); +struct xrdp_font* APP_CC +xrdp_font_create(struct xrdp_wm* wm); +void APP_CC +xrdp_font_delete(struct xrdp_font* self); +int APP_CC +xrdp_font_item_compare(struct xrdp_font_char* font1, + struct xrdp_font_char* font2); /* funcs.c */ -int rect_contains_pt(struct xrdp_rect* in, int x, int y); -int rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2, - struct xrdp_rect* out); -int check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy); -char get_char_from_scan_code(int device_flags, int scan_code, int* keys, - int caps_lock, int num_lock, int scroll_lock); -int add_char_at(char* text, char ch, int index); -int remove_char_at(char* text, int index); -int set_string(char** in_str, char* in); - -int xrdp_login_wnd_create(struct xrdp_wm* self); +int APP_CC +rect_contains_pt(struct xrdp_rect* in, int x, int y); +int APP_CC +rect_intersect(struct xrdp_rect* in1, struct xrdp_rect* in2, + struct xrdp_rect* out); +int APP_CC +check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy); +char APP_CC +get_char_from_scan_code(int device_flags, int scan_code, int* keys, + int caps_lock, int num_lock, int scroll_lock); +int APP_CC +add_char_at(char* text, char ch, int index); +int APP_CC +remove_char_at(char* text, int index); +int APP_CC +set_string(char** in_str, char* in); -int xrdp_file_read_sections(int fd, struct xrdp_list* names); -int xrdp_file_read_section(int fd, char* section, struct xrdp_list* names, - struct xrdp_list* values); +int APP_CC +xrdp_login_wnd_create(struct xrdp_wm* self); /* xrdp_bitmap_compress.c */ -int xrdp_bitmap_compress(char* in_data, int width, int height, - struct stream* s, int bpp, int byte_limit, - int start_line, struct stream* temp, - int e); +int APP_CC +xrdp_bitmap_compress(char* in_data, int width, int height, + struct stream* s, int bpp, int byte_limit, + int start_line, struct stream* temp, + int e); -#ifndef XRDP_LIB /* xrdp_interface.c */ -int server_begin_update(struct xrdp_mod* mod); -int server_end_update(struct xrdp_mod* mod); -int server_fill_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, - int color); -int server_screen_blt(struct xrdp_mod* mod, int x, int y, int cx, int cy, - int srcx, int srcy); -int server_paint_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, - char* data); -int server_set_pointer(struct xrdp_mod* mod, int x, int y, - char* data, char* mask); -int server_palette(struct xrdp_mod* mod, int* palette); -int server_msg(struct xrdp_mod* mod, char* msg); -int server_is_term(struct xrdp_mod* mod); -#endif +int +server_begin_update(struct xrdp_mod* mod); +int +server_end_update(struct xrdp_mod* mod); +int +server_fill_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, + int color); +int +server_screen_blt(struct xrdp_mod* mod, int x, int y, int cx, int cy, + int srcx, int srcy); +int +server_paint_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, + char* data); +int +server_set_pointer(struct xrdp_mod* mod, int x, int y, + char* data, char* mask); +int +server_palette(struct xrdp_mod* mod, int* palette); +int +server_msg(struct xrdp_mod* mod, char* msg); +int +server_is_term(struct xrdp_mod* mod); diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c index 7adf031d..d51fb1ce 100644 --- a/xrdp/xrdp_bitmap.c +++ b/xrdp/xrdp_bitmap.c @@ -25,8 +25,8 @@ #include "xrdp.h" -int g_crc_seed = 0xffffffff; -int g_crc_table[256] = +static int g_crc_seed = 0xffffffff; +static int g_crc_table[256] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, @@ -79,8 +79,9 @@ int g_crc_table[256] = #define CRC_END(in_crc) (in_crc) = ((in_crc) ^ g_crc_seed) /*****************************************************************************/ -struct xrdp_bitmap* xrdp_bitmap_create(int width, int height, int bpp, - int type, struct xrdp_wm* wm) +struct xrdp_bitmap* APP_CC +xrdp_bitmap_create(int width, int height, int bpp, + int type, struct xrdp_wm* wm) { struct xrdp_bitmap* self; int Bpp; @@ -103,14 +104,14 @@ struct xrdp_bitmap* xrdp_bitmap_create(int width, int height, int bpp, } if (self->type != WND_TYPE_BITMAP) { - self->child_list = xrdp_list_create(); + self->child_list = list_create(); } self->line_size = width * Bpp; if (self->type == WND_TYPE_COMBO) { - self->string_list = xrdp_list_create(); + self->string_list = list_create(); self->string_list->auto_free = 1; - self->data_list = xrdp_list_create(); + self->data_list = list_create(); self->data_list->auto_free = 1; } self->wm = wm; @@ -118,9 +119,10 @@ struct xrdp_bitmap* xrdp_bitmap_create(int width, int height, int bpp, } /*****************************************************************************/ -struct xrdp_bitmap* xrdp_bitmap_create_with_data(int width, int height, - int bpp, char* data, - struct xrdp_wm* wm) +struct xrdp_bitmap* APP_CC +xrdp_bitmap_create_with_data(int width, int height, + int bpp, char* data, + struct xrdp_wm* wm) { struct xrdp_bitmap* self; @@ -136,7 +138,8 @@ struct xrdp_bitmap* xrdp_bitmap_create_with_data(int width, int height, } /*****************************************************************************/ -void xrdp_bitmap_delete(struct xrdp_bitmap* self) +void APP_CC +xrdp_bitmap_delete(struct xrdp_bitmap* self) { int i; struct xrdp_mod_data* mod_data; @@ -185,32 +188,32 @@ void xrdp_bitmap_delete(struct xrdp_bitmap* self) { xrdp_bitmap_delete((struct xrdp_bitmap*)self->child_list->items[i]); } - xrdp_list_delete(self->child_list); + list_delete(self->child_list); } if (self->parent != 0) { - i = xrdp_list_index_of(self->parent->child_list, (long)self); + i = list_index_of(self->parent->child_list, (long)self); if (i >= 0) { - xrdp_list_remove_item(self->parent->child_list, i); + list_remove_item(self->parent->child_list, i); } } if (self->string_list != 0) /* for combo */ { - xrdp_list_delete(self->string_list); + list_delete(self->string_list); } if (self->data_list != 0) /* for combo */ { for (i = 0; i < self->data_list->count; i++) { - mod_data = (struct xrdp_mod_data*)xrdp_list_get_item(self->data_list, i); + mod_data = (struct xrdp_mod_data*)list_get_item(self->data_list, i); if (mod_data != 0) { - xrdp_list_delete(mod_data->names); - xrdp_list_delete(mod_data->values); + list_delete(mod_data->names); + list_delete(mod_data->values); } } - xrdp_list_delete(self->data_list); + list_delete(self->data_list); } if (!self->do_not_free_data) { @@ -221,15 +224,15 @@ void xrdp_bitmap_delete(struct xrdp_bitmap* self) } /*****************************************************************************/ -struct xrdp_bitmap* xrdp_bitmap_get_child_by_id(struct xrdp_bitmap* self, - int id) +struct xrdp_bitmap* APP_CC +xrdp_bitmap_get_child_by_id(struct xrdp_bitmap* self, int id) { int i; struct xrdp_bitmap* b; for (i = 0; i < self->child_list->count; i++) { - b = (struct xrdp_bitmap*)xrdp_list_get_item(self->child_list, i); + b = (struct xrdp_bitmap*)list_get_item(self->child_list, i); if (b->id == id) { return b; @@ -241,7 +244,8 @@ struct xrdp_bitmap* xrdp_bitmap_get_child_by_id(struct xrdp_bitmap* self, /*****************************************************************************/ /* if focused is true focus this window else unfocus it */ /* returns error */ -int xrdp_bitmap_set_focus(struct xrdp_bitmap* self, int focused) +int APP_CC +xrdp_bitmap_set_focus(struct xrdp_bitmap* self, int focused) { struct xrdp_painter* painter; @@ -253,7 +257,7 @@ int xrdp_bitmap_set_focus(struct xrdp_bitmap* self, int focused) { return 0; } - painter = xrdp_painter_create(self->wm); + painter = xrdp_painter_create(self->wm, self->wm->session); xrdp_painter_font_needed(painter); xrdp_painter_begin_update(painter); if (focused) @@ -277,7 +281,8 @@ int xrdp_bitmap_set_focus(struct xrdp_bitmap* self, int focused) } /*****************************************************************************/ -int xrdp_bitmap_get_index(struct xrdp_bitmap* self, int* palette, int color) +int APP_CC +xrdp_bitmap_get_index(struct xrdp_bitmap* self, int* palette, int color) { int r; int g; @@ -293,7 +298,8 @@ int xrdp_bitmap_get_index(struct xrdp_bitmap* self, int* palette, int color) } /*****************************************************************************/ -int xrdp_bitmap_resize(struct xrdp_bitmap* self, int width, int height) +int APP_CC +xrdp_bitmap_resize(struct xrdp_bitmap* self, int width, int height) { int Bpp; @@ -316,7 +322,8 @@ int xrdp_bitmap_resize(struct xrdp_bitmap* self, int width, int height) /* load a bmp file */ /* return 0 ok */ /* return 1 error */ -int xrdp_bitmap_load(struct xrdp_bitmap* self, char* filename, int* palette) +int APP_CC +xrdp_bitmap_load(struct xrdp_bitmap* self, char* filename, int* palette) { int fd; int i; @@ -409,7 +416,8 @@ int xrdp_bitmap_load(struct xrdp_bitmap* self, char* filename, int* palette) } /*****************************************************************************/ -int xrdp_bitmap_get_pixel(struct xrdp_bitmap* self, int x, int y) +int APP_CC +xrdp_bitmap_get_pixel(struct xrdp_bitmap* self, int x, int y) { if (self == 0) { @@ -438,7 +446,8 @@ int xrdp_bitmap_get_pixel(struct xrdp_bitmap* self, int x, int y) } /*****************************************************************************/ -int xrdp_bitmap_set_pixel(struct xrdp_bitmap* self, int x, int y, int pixel) +int APP_CC +xrdp_bitmap_set_pixel(struct xrdp_bitmap* self, int x, int y, int pixel) { if (self == 0) { @@ -469,9 +478,10 @@ int xrdp_bitmap_set_pixel(struct xrdp_bitmap* self, int x, int y, int pixel) /*****************************************************************************/ /* copy part of self at x, y to 0, 0 in dest */ /* returns error */ -int xrdp_bitmap_copy_box(struct xrdp_bitmap* self, - struct xrdp_bitmap* dest, - int x, int y, int cx, int cy) +int APP_CC +xrdp_bitmap_copy_box(struct xrdp_bitmap* self, + struct xrdp_bitmap* dest, + int x, int y, int cx, int cy) { int i; int j; @@ -552,9 +562,10 @@ int xrdp_bitmap_copy_box(struct xrdp_bitmap* self, /*****************************************************************************/ /* copy part of self at x, y to 0, 0 in dest */ /* returns error */ -int xrdp_bitmap_copy_box_with_crc(struct xrdp_bitmap* self, - struct xrdp_bitmap* dest, - int x, int y, int cx, int cy) +int APP_CC +xrdp_bitmap_copy_box_with_crc(struct xrdp_bitmap* self, + struct xrdp_bitmap* dest, + int x, int y, int cx, int cy) { int i; int j; @@ -667,8 +678,9 @@ int xrdp_bitmap_copy_box_with_crc(struct xrdp_bitmap* self, /*****************************************************************************/ /* returns true if they are the same, else returns false */ -int xrdp_bitmap_compare(struct xrdp_bitmap* self, - struct xrdp_bitmap* b) +int APP_CC +xrdp_bitmap_compare(struct xrdp_bitmap* self, + struct xrdp_bitmap* b) { if (self == 0) { @@ -699,8 +711,9 @@ int xrdp_bitmap_compare(struct xrdp_bitmap* self, /*****************************************************************************/ /* returns true if they are the same, else returns false */ -int xrdp_bitmap_compare_with_crc(struct xrdp_bitmap* self, - struct xrdp_bitmap* b) +int APP_CC +xrdp_bitmap_compare_with_crc(struct xrdp_bitmap* self, + struct xrdp_bitmap* b) { if (self == 0) { @@ -730,9 +743,10 @@ int xrdp_bitmap_compare_with_crc(struct xrdp_bitmap* self, } /*****************************************************************************/ -int xrdp_bitmap_draw_focus_box(struct xrdp_bitmap* self, - struct xrdp_painter* painter, - int x, int y, int cx, int cy) +int APP_CC +xrdp_bitmap_draw_focus_box(struct xrdp_bitmap* self, + struct xrdp_painter* painter, + int x, int y, int cx, int cy) { painter->rop = 0xf0; xrdp_painter_begin_update(painter); @@ -765,10 +779,11 @@ int xrdp_bitmap_draw_focus_box(struct xrdp_bitmap* self, /*****************************************************************************/ /* x and y are in relation to self for 0, 0 is the top left of the control */ -int xrdp_bitmap_draw_button(struct xrdp_bitmap* self, - struct xrdp_painter* painter, - int x, int y, int w, int h, - int down) +int APP_CC +xrdp_bitmap_draw_button(struct xrdp_bitmap* self, + struct xrdp_painter* painter, + int x, int y, int w, int h, + int down) { if (down) { @@ -830,7 +845,8 @@ int xrdp_bitmap_draw_button(struct xrdp_bitmap* self, /*****************************************************************************/ /* nil for rect means the whole thing */ /* returns error */ -int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) +int APP_CC +xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) { int i; int w; @@ -852,7 +868,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) { return 0; } - painter = xrdp_painter_create(self->wm); + painter = xrdp_painter_create(self->wm, self->wm->session); xrdp_painter_font_needed(painter); painter->rop = 0xcc; /* copy */ if (rect == 0) @@ -928,7 +944,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) if (check_bounds(self->wm->screen, &x, &y, &w, &h)) { self->wm->mod->mod_event(self->wm->mod, WM_INVALIDATE, - MAKELONG(x, y), MAKELONG(w, h)); + MAKELONG(x, y), MAKELONG(w, h), 0, 0); } } } @@ -1080,7 +1096,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) else painter->font->color = self->wm->black; xrdp_painter_draw_text(painter, self, 4, 2, - (char*)xrdp_list_get_item(self->string_list, self->item_index)); + (char*)list_get_item(self->string_list, self->item_index)); /* draw button on right */ x = self->width - 20; y = 2; @@ -1101,7 +1117,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) y = 0; for (i = 0; i < self->popped_from->string_list->count; i++) { - p = (char*)xrdp_list_get_item(self->popped_from->string_list, i); + p = (char*)list_get_item(self->popped_from->string_list, i); h = xrdp_painter_text_height(painter, p); self->item_height = h; if (i == self->item_index) @@ -1123,7 +1139,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) /* draw any child windows in the area */ for (i = 0; i < self->child_list->count; i++) { - b = (struct xrdp_bitmap*)xrdp_list_get_item(self->child_list, i); + b = (struct xrdp_bitmap*)list_get_item(self->child_list, i); if (rect == 0) xrdp_bitmap_invalidate(b, 0); else @@ -1143,8 +1159,9 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) /*****************************************************************************/ /* returns error */ -int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, - int param1, int param2) +int APP_CC +xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, + int param1, int param2) { char c; int n; @@ -1175,7 +1192,7 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, i = -1; if (self->child_list != 0) { - i = xrdp_list_index_of(self->child_list, (long)self->focused_control); + i = list_index_of(self->child_list, (long)self->focused_control); } if (shift) { @@ -1194,7 +1211,7 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, } } n = self->child_list->count; - b = (struct xrdp_bitmap*)xrdp_list_get_item(self->child_list, i); + b = (struct xrdp_bitmap*)list_get_item(self->child_list, i); while (b != self->focused_control && b != 0 && n > 0) { n--; @@ -1222,7 +1239,7 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, i = 0; } } - b = (struct xrdp_bitmap*)xrdp_list_get_item(self->child_list, i); + b = (struct xrdp_bitmap*)list_get_item(self->child_list, i); } } else if (scan_code == 28) /* enter */ @@ -1417,7 +1434,8 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, /*****************************************************************************/ /* convert the controls coords to screen coords */ -int xrdp_bitmap_to_screenx(struct xrdp_bitmap* self, int x) +int APP_CC +xrdp_bitmap_to_screenx(struct xrdp_bitmap* self, int x) { int i; @@ -1432,7 +1450,8 @@ int xrdp_bitmap_to_screenx(struct xrdp_bitmap* self, int x) /*****************************************************************************/ /* convert the controls coords to screen coords */ -int xrdp_bitmap_to_screeny(struct xrdp_bitmap* self, int y) +int APP_CC +xrdp_bitmap_to_screeny(struct xrdp_bitmap* self, int y) { int i; @@ -1447,7 +1466,8 @@ int xrdp_bitmap_to_screeny(struct xrdp_bitmap* self, int y) /*****************************************************************************/ /* convert the screen coords to controls coords */ -int xrdp_bitmap_from_screenx(struct xrdp_bitmap* self, int x) +int APP_CC +xrdp_bitmap_from_screenx(struct xrdp_bitmap* self, int x) { int i; @@ -1462,7 +1482,8 @@ int xrdp_bitmap_from_screenx(struct xrdp_bitmap* self, int x) /*****************************************************************************/ /* convert the screen coords to controls coords */ -int xrdp_bitmap_from_screeny(struct xrdp_bitmap* self, int y) +int APP_CC +xrdp_bitmap_from_screeny(struct xrdp_bitmap* self, int y) { int i; diff --git a/xrdp/xrdp_bitmap_compress.c b/xrdp/xrdp_bitmap_compress.c deleted file mode 100644 index f17eb1d4..00000000 --- a/xrdp/xrdp_bitmap_compress.c +++ /dev/null @@ -1,1001 +0,0 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - - bitmap compressor - -*/ - -#include "xrdp.h" - -/*****************************************************************************/ -#define IN_PIXEL8(in_ptr, in_x, in_y, in_w, in_last_pixel, in_pixel); \ -{ \ - if (in_ptr == 0) \ - { \ - in_pixel = 0; \ - } \ - else if (in_x < in_w) \ - { \ - in_pixel = GETPIXEL8(in_ptr, in_x, in_y, in_w); \ - } \ - else \ - { \ - in_pixel = in_last_pixel; \ - } \ -} - -/*****************************************************************************/ -#define IN_PIXEL16(in_ptr, in_x, in_y, in_w, in_last_pixel, in_pixel); \ -{ \ - if (in_ptr == 0) \ - { \ - in_pixel = 0; \ - } \ - else if (in_x < in_w) \ - { \ - in_pixel = GETPIXEL16(in_ptr, in_x, in_y, in_w); \ - } \ - else \ - { \ - in_pixel = in_last_pixel; \ - } \ -} - -/*****************************************************************************/ -/* color */ -#define OUT_COLOR_COUNT1(in_count, in_s, in_data) \ -{ \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - temp = (0x3 << 5) | in_count; \ - out_uint8(in_s, temp); \ - out_uint8(in_s, in_data); \ - } \ - else if (in_count < 256 + 32) \ - { \ - out_uint8(in_s, 0x60); \ - temp = in_count - 32; \ - out_uint8(in_s, temp); \ - out_uint8(in_s, in_data); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf3); \ - out_uint16_le(in_s, in_count); \ - out_uint8(in_s, in_data); \ - } \ - } \ - in_count = 0; \ -} - -/*****************************************************************************/ -/* color */ -#define OUT_COLOR_COUNT2(in_count, in_s, in_data) \ -{ \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - temp = (0x3 << 5) | in_count; \ - out_uint8(in_s, temp); \ - out_uint16_le(in_s, in_data); \ - } \ - else if (in_count < 256 + 32) \ - { \ - out_uint8(in_s, 0x60); \ - temp = in_count - 32; \ - out_uint8(in_s, temp); \ - out_uint16_le(in_s, in_data); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf3); \ - out_uint16_le(in_s, in_count); \ - out_uint16_le(in_s, in_data); \ - } \ - } \ - in_count = 0; \ -} - -/*****************************************************************************/ -/* copy */ -#define OUT_COPY_COUNT1(in_count, in_s, in_data) \ -{ \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - temp = (0x4 << 5) | in_count; \ - out_uint8(in_s, temp); \ - out_uint8a(in_s, in_data->data, in_count); \ - } \ - else if (in_count < 256 + 32) \ - { \ - out_uint8(in_s, 0x80); \ - temp = in_count - 32; \ - out_uint8(in_s, temp); \ - out_uint8a(in_s, in_data->data, in_count); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf4); \ - out_uint16_le(in_s, in_count); \ - out_uint8a(in_s, in_data->data, in_count); \ - } \ - } \ - in_count = 0; \ - init_stream(in_data, 0); \ -} - -/*****************************************************************************/ -/* copy */ -#define OUT_COPY_COUNT2(in_count, in_s, in_data) \ -{ \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - temp = (0x4 << 5) | in_count; \ - out_uint8(in_s, temp); \ - temp = in_count * 2; \ - out_uint8a(in_s, in_data->data, temp); \ - } \ - else if (in_count < 256 + 32) \ - { \ - out_uint8(in_s, 0x80); \ - temp = in_count - 32; \ - out_uint8(in_s, temp); \ - temp = in_count * 2; \ - out_uint8a(in_s, in_data->data, temp); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf4); \ - out_uint16_le(in_s, in_count); \ - temp = in_count * 2; \ - out_uint8a(in_s, in_data->data, temp); \ - } \ - } \ - in_count = 0; \ - init_stream(in_data, 0); \ -} - -/*****************************************************************************/ -/* bicolor */ -#define OUT_BICOLOR_COUNT1(in_count, in_s, in_color1, in_color2) \ -{ \ - if (in_count > 0) \ - { \ - if (in_count / 2 < 16) \ - { \ - temp = (0xe << 4) | (in_count / 2); \ - out_uint8(in_s, temp); \ - out_uint8(in_s, in_color1); \ - out_uint8(in_s, in_color2); \ - } \ - else if (in_count / 2 < 256 + 16) \ - { \ - out_uint8(in_s, 0xe0); \ - temp = in_count / 2 - 16; \ - out_uint8(in_s, temp); \ - out_uint8(in_s, in_color1); \ - out_uint8(in_s, in_color2); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf8); \ - temp = in_count / 2; \ - out_uint16_le(in_s, temp); \ - out_uint8(in_s, in_color1); \ - out_uint8(in_s, in_color2); \ - } \ - } \ - in_count = 0; \ -} - -/*****************************************************************************/ -/* bicolor */ -#define OUT_BICOLOR_COUNT2(in_count, in_s, in_color1, in_color2) \ -{ \ - if (in_count > 0) \ - { \ - if (in_count / 2 < 16) \ - { \ - temp = (0xe << 4) | (in_count / 2); \ - out_uint8(in_s, temp); \ - out_uint16_le(in_s, in_color1); \ - out_uint16_le(in_s, in_color2); \ - } \ - else if (in_count / 2 < 256 + 16) \ - { \ - out_uint8(in_s, 0xe0); \ - temp = in_count / 2 - 16; \ - out_uint8(in_s, temp); \ - out_uint16_le(in_s, in_color1); \ - out_uint16_le(in_s, in_color2); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf8); \ - temp = in_count / 2; \ - out_uint16_le(in_s, temp); \ - out_uint16_le(in_s, in_color1); \ - out_uint16_le(in_s, in_color2); \ - } \ - } \ - in_count = 0; \ -} - -/*****************************************************************************/ -/* fill */ -#define OUT_FILL_COUNT1(in_count, in_s) \ -{ \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - out_uint8(in_s, in_count); \ - } \ - else if (in_count < 256 + 32) \ - { \ - out_uint8(in_s, 0x0); \ - temp = in_count - 32; \ - out_uint8(in_s, temp); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf0); \ - out_uint16_le(in_s, in_count); \ - } \ - } \ - in_count = 0; \ -} - -/*****************************************************************************/ -/* fill */ -#define OUT_FILL_COUNT2(in_count, in_s) \ -{ \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - out_uint8(in_s, in_count); \ - } \ - else if (in_count < 256 + 32) \ - { \ - out_uint8(in_s, 0x0); \ - temp = in_count - 32; \ - out_uint8(in_s, temp); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf0); \ - out_uint16_le(in_s, in_count); \ - } \ - } \ - in_count = 0; \ -} - -/*****************************************************************************/ -/* mix */ -#define OUT_MIX_COUNT1(in_count, in_s) \ -{ \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - temp = (0x1 << 5) | in_count; \ - out_uint8(in_s, temp); \ - } \ - else if (in_count < 256 + 32) \ - { \ - out_uint8(in_s, 0x20); \ - temp = in_count - 32; \ - out_uint8(in_s, temp); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf1); \ - out_uint16_le(in_s, in_count); \ - } \ - } \ - in_count = 0; \ -} - -/*****************************************************************************/ -/* mix */ -#define OUT_MIX_COUNT2(in_count, in_s) \ -{ \ - if (in_count > 0) \ - { \ - if (in_count < 32) \ - { \ - temp = (0x1 << 5) | in_count; \ - out_uint8(in_s, temp); \ - } \ - else if (in_count < 256 + 32) \ - { \ - out_uint8(in_s, 0x20); \ - temp = in_count - 32; \ - out_uint8(in_s, temp); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf1); \ - out_uint16_le(in_s, in_count); \ - } \ - } \ - in_count = 0; \ -} - -/*****************************************************************************/ -/* fom */ -#define OUT_FOM_COUNT1(in_count, in_s, in_mask, in_mask_len) \ -{ \ - if (in_count > 0) \ - { \ - if ((in_count % 8) == 0 && in_count < 249) \ - { \ - temp = (0x2 << 5) | (in_count / 8); \ - out_uint8(in_s, temp); \ - out_uint8a(in_s, in_mask, in_mask_len); \ - } \ - else if (in_count < 256) \ - { \ - out_uint8(in_s, 0x40); \ - temp = in_count - 1; \ - out_uint8(in_s, temp); \ - out_uint8a(in_s, in_mask, in_mask_len); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf2); \ - out_uint16_le(in_s, in_count); \ - out_uint8a(in_s, in_mask, in_mask_len); \ - } \ - } \ - in_count = 0; \ -} - -/*****************************************************************************/ -/* fom */ -#define OUT_FOM_COUNT2(in_count, in_s, in_mask, in_mask_len) \ -{ \ - if (in_count > 0) \ - { \ - if ((in_count % 8) == 0 && in_count < 249) \ - { \ - temp = (0x2 << 5) | (in_count / 8); \ - out_uint8(in_s, temp); \ - out_uint8a(in_s, in_mask, in_mask_len); \ - } \ - else if (in_count < 256) \ - { \ - out_uint8(in_s, 0x40); \ - temp = in_count - 1; \ - out_uint8(in_s, temp); \ - out_uint8a(in_s, in_mask, in_mask_len); \ - } \ - else \ - { \ - out_uint8(in_s, 0xf2); \ - out_uint16_le(in_s, in_count); \ - out_uint8a(in_s, in_mask, in_mask_len); \ - } \ - } \ - in_count = 0; \ -} - -/*****************************************************************************/ -#define TEST_FILL \ -((last_line == 0 && pixel == 0) || \ - (last_line != 0 && pixel == ypixel)) -#define TEST_MIX \ -((last_line == 0 && pixel == mix) || \ - (last_line != 0 && pixel == (ypixel ^ mix))) -#define TEST_FOM (TEST_FILL || TEST_MIX) -#define TEST_COLOR (pixel == last_pixel) -#define TEST_BICOLOR \ -( \ - (pixel != last_pixel) && \ - ( \ - (!bicolor_spin && pixel == bicolor1 && last_pixel == bicolor2) || \ - (bicolor_spin && pixel == bicolor2 && last_pixel == bicolor1) \ - ) \ -) -#define RESET_COUNTS \ -{ \ - bicolor_count = 0; \ - fill_count = 0; \ - color_count = 0; \ - mix_count = 0; \ - fom_count = 0; \ - fom_mask_len = 0; \ - bicolor_spin = 0; \ -} - -/*****************************************************************************/ -int xrdp_bitmap_compress(char* in_data, int width, int height, - struct stream* s, int bpp, int byte_limit, - int start_line, struct stream* temp_s, - int e) -{ - char* line; - char* last_line; - char fom_mask[8192]; - int lines_sent; - int pixel; - int count; - int color_count; - int last_pixel; - int bicolor_count; - int bicolor1; - int bicolor2; - int bicolor_spin; - int end; - int i; - int out_count; - int ypixel; - int last_ypixel; - int fill_count; - int mix_count; - int mix; - int fom_count; - int fom_mask_len; - int temp; /* used in macros */ - - init_stream(temp_s, 0); - fom_mask_len = 0; - last_line = 0; - lines_sent = 0; - end = width + e; - count = 0; - color_count = 0; - last_pixel = 0; - last_ypixel = 0; - bicolor_count = 0; - bicolor1 = 0; - bicolor2 = 0; - bicolor_spin = 0; - fill_count = 0; - mix_count = 0; - fom_count = 0; - if (bpp == 8) - { - mix = 0xff; - out_count = end; - line = in_data + width * start_line; - while (start_line >= 0 && out_count < 32768) - { - i = (s->p - s->data) + count; - if (i - color_count >= byte_limit && - i - bicolor_count >= byte_limit && - i - fill_count >= byte_limit && - i - mix_count >= byte_limit && - i - fom_count >= byte_limit) - { - break; - } - out_count += end; - for (i = 0; i < end; i++) - { - /* read next pixel */ - IN_PIXEL8(line, i, 0, width, last_pixel, pixel); - IN_PIXEL8(last_line, i, 0, width, last_ypixel, ypixel); - if (!TEST_FILL) - { - if (fill_count > 3 && - fill_count >= color_count && - fill_count >= bicolor_count && - fill_count >= mix_count && - fill_count >= fom_count) - { - count -= fill_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FILL_COUNT1(fill_count, s); - RESET_COUNTS; - } - fill_count = 0; - } - if (!TEST_MIX) - { - if (mix_count > 3 && - mix_count >= fill_count && - mix_count >= bicolor_count && - mix_count >= color_count && - mix_count >= fom_count) - { - count -= mix_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_MIX_COUNT1(mix_count, s); - RESET_COUNTS; - } - mix_count = 0; - } - if (!TEST_COLOR) - { - if (color_count > 3 && - color_count >= fill_count && - color_count >= bicolor_count && - color_count >= mix_count && - color_count >= fom_count) - { - count -= color_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_COLOR_COUNT1(color_count, s, last_pixel); - RESET_COUNTS; - } - color_count = 0; - } - if (!TEST_BICOLOR) - { - if (bicolor_count > 3 && - bicolor_count >= fill_count && - bicolor_count >= color_count && - bicolor_count >= mix_count && - bicolor_count >= fom_count) - { - if ((bicolor_count % 2) == 0) - { - count -= bicolor_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_BICOLOR_COUNT1(bicolor_count, s, bicolor1, bicolor2); - } - else - { - bicolor_count--; - count -= bicolor_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_BICOLOR_COUNT1(bicolor_count, s, bicolor2, bicolor1); - } - RESET_COUNTS; - } - bicolor_count = 0; - bicolor1 = last_pixel; - bicolor2 = pixel; - bicolor_spin = 0; - } - if (!TEST_FOM) - { - if (fom_count > 3 && - fom_count >= fill_count && - fom_count >= color_count && - fom_count >= mix_count && - fom_count >= bicolor_count) - { - count -= fom_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FOM_COUNT1(fom_count, s, fom_mask, fom_mask_len); - RESET_COUNTS; - } - fom_count = 0; - fom_mask_len = 0; - } - if (TEST_FILL) - { - fill_count++; - } - if (TEST_MIX) - { - mix_count++; - } - if (TEST_COLOR) - { - color_count++; - } - if (TEST_BICOLOR) - { - bicolor_spin = !bicolor_spin; - bicolor_count++; - } - if (TEST_FOM) - { - if ((fom_count % 8) == 0) - { - fom_mask[fom_mask_len] = 0; - fom_mask_len++; - } - if (pixel == (ypixel ^ mix)) - { - fom_mask[fom_mask_len - 1] |= (1 << (fom_count % 8)); - } - fom_count++; - } - out_uint8(temp_s, pixel); - count++; - last_pixel = pixel; - last_ypixel = ypixel; - } - /* can't take fix, mix, or fom past first line */ - if (last_line == 0) - { - if (fill_count > 3 && - fill_count >= color_count && - fill_count >= bicolor_count && - fill_count >= mix_count && - fill_count >= fom_count) - { - count -= fill_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FILL_COUNT1(fill_count, s); - RESET_COUNTS; - } - fill_count = 0; - if (mix_count > 3 && - mix_count >= fill_count && - mix_count >= bicolor_count && - mix_count >= color_count && - mix_count >= fom_count) - { - count -= mix_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_MIX_COUNT1(mix_count, s); - RESET_COUNTS; - } - mix_count = 0; - if (fom_count > 3 && - fom_count >= fill_count && - fom_count >= color_count && - fom_count >= mix_count && - fom_count >= bicolor_count) - { - count -= fom_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FOM_COUNT1(fom_count, s, fom_mask, fom_mask_len); - RESET_COUNTS; - } - fom_count = 0; - fom_mask_len = 0; - } - last_line = line; - line = line - width; - start_line--; - lines_sent++; - } - if (fill_count > 3 && - fill_count >= color_count && - fill_count >= bicolor_count && - fill_count >= mix_count && - fill_count >= fom_count) - { - count -= fill_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FILL_COUNT1(fill_count, s); - } - else if (mix_count > 3 && - mix_count >= color_count && - mix_count >= bicolor_count && - mix_count >= fill_count && - mix_count >= fom_count) - { - count -= mix_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_MIX_COUNT1(mix_count, s); - } - else if (color_count > 3 && - color_count >= mix_count && - color_count >= bicolor_count && - color_count >= fill_count && - color_count >= fom_count) - { - count -= color_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_COLOR_COUNT1(color_count, s, last_pixel); - } - else if (bicolor_count > 3 && - bicolor_count >= mix_count && - bicolor_count >= color_count && - bicolor_count >= fill_count && - bicolor_count >= fom_count) - { - if ((bicolor_count % 2) == 0) - { - count -= bicolor_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_BICOLOR_COUNT1(bicolor_count, s, bicolor1, bicolor2); - } - else - { - bicolor_count--; - count -= bicolor_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_BICOLOR_COUNT1(bicolor_count, s, bicolor2, bicolor1); - } - count -= bicolor_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_BICOLOR_COUNT1(bicolor_count, s, bicolor1, bicolor2); - } - else if (fom_count > 3 && - fom_count >= mix_count && - fom_count >= color_count && - fom_count >= fill_count && - fom_count >= bicolor_count) - { - count -= fom_count; - OUT_COPY_COUNT1(count, s, temp_s); - OUT_FOM_COUNT1(fom_count, s, fom_mask, fom_mask_len); - } - else - { - OUT_COPY_COUNT1(count, s, temp_s); - } - } - else if (bpp == 16) - { - mix = 0xffff; - out_count = end * 2; - line = in_data + width * start_line * 2; - while (start_line >= 0 && out_count < 32768) - { - i = (s->p - s->data) + count * 2; - if (i - (color_count * 2) >= byte_limit && - i - (bicolor_count * 2) >= byte_limit && - i - (fill_count * 2) >= byte_limit && - i - (mix_count * 2) >= byte_limit && - i - (fom_count * 2) >= byte_limit) - { - break; - } - out_count += end * 2; - for (i = 0; i < end; i++) - { - /* read next pixel */ - IN_PIXEL16(line, i, 0, width, last_pixel, pixel); - IN_PIXEL16(last_line, i, 0, width, last_ypixel, ypixel); - if (!TEST_FILL) - { - if (fill_count > 3 && - fill_count >= color_count && - fill_count >= bicolor_count && - fill_count >= mix_count && - fill_count >= fom_count) - { - count -= fill_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_FILL_COUNT2(fill_count, s); - RESET_COUNTS; - } - fill_count = 0; - } - if (!TEST_MIX) - { - if (mix_count > 3 && - mix_count >= fill_count && - mix_count >= bicolor_count && - mix_count >= color_count && - mix_count >= fom_count) - { - count -= mix_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_MIX_COUNT2(mix_count, s); - RESET_COUNTS; - } - mix_count = 0; - } - if (!TEST_COLOR) - { - if (color_count > 3 && - color_count >= fill_count && - color_count >= bicolor_count && - color_count >= mix_count && - color_count >= fom_count) - { - count -= color_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_COLOR_COUNT2(color_count, s, last_pixel); - RESET_COUNTS; - } - color_count = 0; - } - if (!TEST_BICOLOR) - { - if (bicolor_count > 3 && - bicolor_count >= fill_count && - bicolor_count >= color_count && - bicolor_count >= mix_count && - bicolor_count >= fom_count) - { - if ((bicolor_count % 2) == 0) - { - count -= bicolor_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_BICOLOR_COUNT2(bicolor_count, s, bicolor1, bicolor2); - } - else - { - bicolor_count--; - count -= bicolor_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_BICOLOR_COUNT2(bicolor_count, s, bicolor2, bicolor1); - } - RESET_COUNTS; - } - bicolor_count = 0; - bicolor1 = last_pixel; - bicolor2 = pixel; - bicolor_spin = 0; - } - if (!TEST_FOM) - { - if (fom_count > 3 && - fom_count >= fill_count && - fom_count >= color_count && - fom_count >= mix_count && - fom_count >= bicolor_count) - { - count -= fom_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_FOM_COUNT2(fom_count, s, fom_mask, fom_mask_len); - RESET_COUNTS; - } - fom_count = 0; - fom_mask_len = 0; - } - if (TEST_FILL) - { - fill_count++; - } - if (TEST_MIX) - { - mix_count++; - } - if (TEST_COLOR) - { - color_count++; - } - if (TEST_BICOLOR) - { - bicolor_spin = !bicolor_spin; - bicolor_count++; - } - if (TEST_FOM) - { - if ((fom_count % 8) == 0) - { - fom_mask[fom_mask_len] = 0; - fom_mask_len++; - } - if (pixel == (ypixel ^ mix)) - { - fom_mask[fom_mask_len - 1] |= (1 << (fom_count % 8)); - } - fom_count++; - } - out_uint16_le(temp_s, pixel); - count++; - last_pixel = pixel; - last_ypixel = ypixel; - } - /* can't take fix, mix, or fom past first line */ - if (last_line == 0) - { - if (fill_count > 3 && - fill_count >= color_count && - fill_count >= bicolor_count && - fill_count >= mix_count && - fill_count >= fom_count) - { - count -= fill_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_FILL_COUNT2(fill_count, s); - RESET_COUNTS; - } - fill_count = 0; - if (mix_count > 3 && - mix_count >= fill_count && - mix_count >= bicolor_count && - mix_count >= color_count && - mix_count >= fom_count) - { - count -= mix_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_MIX_COUNT2(mix_count, s); - RESET_COUNTS; - } - mix_count = 0; - if (fom_count > 3 && - fom_count >= fill_count && - fom_count >= color_count && - fom_count >= mix_count && - fom_count >= bicolor_count) - { - count -= fom_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_FOM_COUNT2(fom_count, s, fom_mask, fom_mask_len); - RESET_COUNTS; - } - fom_count = 0; - fom_mask_len = 0; - } - last_line = line; - line = line - width * 2; - start_line--; - lines_sent++; - } - if (fill_count > 3 && - fill_count >= color_count && - fill_count >= bicolor_count && - fill_count >= mix_count && - fill_count >= fom_count) - { - count -= fill_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_FILL_COUNT2(fill_count, s); - } - else if (mix_count > 3 && - mix_count >= color_count && - mix_count >= bicolor_count && - mix_count >= fill_count && - mix_count >= fom_count) - { - count -= mix_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_MIX_COUNT2(mix_count, s); - } - else if (color_count > 3 && - color_count >= mix_count && - color_count >= bicolor_count && - color_count >= fill_count && - color_count >= fom_count) - { - count -= color_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_COLOR_COUNT2(color_count, s, last_pixel); - } - else if (bicolor_count > 3 && - bicolor_count >= mix_count && - bicolor_count >= color_count && - bicolor_count >= fill_count && - bicolor_count >= fom_count) - { - if ((bicolor_count % 2) == 0) - { - count -= bicolor_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_BICOLOR_COUNT2(bicolor_count, s, bicolor1, bicolor2); - } - else - { - bicolor_count--; - count -= bicolor_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_BICOLOR_COUNT2(bicolor_count, s, bicolor2, bicolor1); - } - count -= bicolor_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_BICOLOR_COUNT2(bicolor_count, s, bicolor1, bicolor2); - } - else if (fom_count > 3 && - fom_count >= mix_count && - fom_count >= color_count && - fom_count >= fill_count && - fom_count >= bicolor_count) - { - count -= fom_count; - OUT_COPY_COUNT2(count, s, temp_s); - OUT_FOM_COUNT2(fom_count, s, fom_mask, fom_mask_len); - } - else - { - OUT_COPY_COUNT2(count, s, temp_s); - } - } - return lines_sent; -} diff --git a/xrdp/xrdp_cache.c b/xrdp/xrdp_cache.c index 62bce7a6..99cc8f31 100644 --- a/xrdp/xrdp_cache.c +++ b/xrdp/xrdp_cache.c @@ -23,15 +23,16 @@ #include "xrdp.h" /*****************************************************************************/ -struct xrdp_cache* xrdp_cache_create(struct xrdp_wm* owner, - struct xrdp_orders* orders, - struct xrdp_client_info* client_info) +struct xrdp_cache* APP_CC +xrdp_cache_create(struct xrdp_wm* owner, + struct xrdp_session* session, + struct xrdp_client_info* client_info) { struct xrdp_cache* self; self = (struct xrdp_cache*)g_malloc(sizeof(struct xrdp_cache), 1); self->wm = owner; - self->orders = orders; + self->session = session; self->use_bitmap_comp = client_info->use_bitmap_comp; self->cache1_entries = client_info->cache1_entries; self->cache1_size = client_info->cache1_size; @@ -44,7 +45,8 @@ struct xrdp_cache* xrdp_cache_create(struct xrdp_wm* owner, } /*****************************************************************************/ -void xrdp_cache_delete(struct xrdp_cache* self) +void APP_CC +xrdp_cache_delete(struct xrdp_cache* self) { int i; int j; @@ -74,7 +76,8 @@ void xrdp_cache_delete(struct xrdp_cache* self) /*****************************************************************************/ /* returns cache id */ -int xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap) +int APP_CC +xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap) { int i; int j; @@ -205,11 +208,15 @@ int xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap) self->bitmap_items[cache_id][cache_idx].stamp = self->bitmap_stamp; if (self->use_bitmap_comp) { - xrdp_orders_send_bitmap(self->orders, bitmap, cache_id, cache_idx); + libxrdp_orders_send_bitmap(self->session, bitmap->width, + bitmap->height, bitmap->bpp, + bitmap->data, cache_id, cache_idx); } else { - xrdp_orders_send_raw_bitmap(self->orders, bitmap, cache_id, cache_idx); + libxrdp_orders_send_raw_bitmap(self->session, bitmap->width, + bitmap->height, bitmap->bpp, + bitmap->data, cache_id, cache_idx); } return MAKELONG(cache_id, cache_idx); } @@ -217,7 +224,8 @@ int xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap) /*****************************************************************************/ /* not used */ /* not sure how to use a palette in rdp */ -int xrdp_cache_add_palette(struct xrdp_cache* self, int* palette) +int APP_CC +xrdp_cache_add_palette(struct xrdp_cache* self, int* palette) { int i; int oldest; @@ -260,13 +268,14 @@ int xrdp_cache_add_palette(struct xrdp_cache* self, int* palette) /* set, send palette and return */ g_memcpy(self->palette_items[index].palette, palette, 256 * sizeof(int)); self->palette_items[index].stamp = self->palette_stamp; - xrdp_orders_send_palette(self->orders, palette, index); + libxrdp_orders_send_palette(self->session, palette, index); return index; } /*****************************************************************************/ -int xrdp_cache_add_char(struct xrdp_cache* self, - struct xrdp_font_item* font_item) +int APP_CC +xrdp_cache_add_char(struct xrdp_cache* self, + struct xrdp_font_char* font_item) { int i; int j; @@ -274,7 +283,7 @@ int xrdp_cache_add_char(struct xrdp_cache* self, int f; int c; int datasize; - struct xrdp_font_item* fi; + struct xrdp_font_char* fi; self->char_stamp++; /* look for match */ @@ -318,7 +327,7 @@ int xrdp_cache_add_char(struct xrdp_cache* self, fi->width = font_item->width; fi->height = font_item->height; self->char_items[f][c].stamp = self->char_stamp; - xrdp_orders_send_font(self->orders, fi, f, c); + libxrdp_orders_send_font(self->session, fi, f, c); return MAKELONG(f, c); } @@ -327,8 +336,9 @@ int xrdp_cache_add_char(struct xrdp_cache* self, client if it finds it returns the index in the cache does not take ownership of pointer_item */ -int xrdp_cache_add_pointer(struct xrdp_cache* self, - struct xrdp_pointer_item* pointer_item) +int APP_CC +xrdp_cache_add_pointer(struct xrdp_cache* self, + struct xrdp_pointer_item* pointer_item) { int i; int oldest; @@ -385,9 +395,10 @@ int xrdp_cache_add_pointer(struct xrdp_cache* self, } /*****************************************************************************/ -int xrdp_cache_add_pointer_static(struct xrdp_cache* self, - struct xrdp_pointer_item* pointer_item, - int index) +int APP_CC +xrdp_cache_add_pointer_static(struct xrdp_cache* self, + struct xrdp_pointer_item* pointer_item, + int index) { if (self == 0) diff --git a/xrdp/xrdp_defines.h b/xrdp/xrdp_defines.h deleted file mode 100644 index 8c754c9c..00000000 --- a/xrdp/xrdp_defines.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - - main define/macro file - -*/ - -/* check for debug */ -#ifdef XRDP_DEBUG -#define DEBUG(args) g_printf args; -#else -#define DEBUG(args) -#endif -/* other macros */ -#define MIN(x1, x2) ((x1) < (x2) ? (x1) : (x2)) -#define MAX(x1, x2) ((x1) > (x2) ? (x1) : (x2)) -#define HIWORD(in) (((in) & 0xffff0000) >> 16) -#define LOWORD(in) ((in) & 0x0000ffff) -#define MAKELONG(hi, lo) ((((hi) & 0xffff) << 16) | ((lo) & 0xffff)) -#define MAKERECT(r, x, y, cx, cy) \ -{ (r).left = x; (r).top = y; (r).right = (x) + (cx); (r).bottom = (y) + (cy); } -#define ISRECTEMPTY(r) (((r).right <= (r).left) || ((r).bottom <= (r).top)) -#define RECTOFFSET(r, dx, dy) \ -{ (r).left += dx; (r).top += dy; (r).right += dx; (r).bottom += dy; } -#define GETPIXEL8(d, x, y, w) (*(((unsigned char*)d) + ((y) * (w) + (x)))) -#define GETPIXEL16(d, x, y, w) (*(((unsigned short*)d) + ((y) * (w) + (x)))) -#define GETPIXEL32(d, x, y, w) (*(((unsigned long*)d) + ((y) * (w) + (x)))) -#define SETPIXEL8(d, x, y, w, v) \ -(*(((unsigned char*)d) + ((y) * (w) + (x))) = (v)) -#define SETPIXEL16(d, x, y, w, v) \ -(*(((unsigned short*)d) + ((y) * (w) + (x))) = (v)) -#define SETPIXEL32(d, x, y, w, v) \ -(*(((unsigned long*)d) + ((y) * (w) + (x))) = (v)) -#define COLOR8(r, g, b) \ -( \ - (((r) >> 5) << 0) | \ - (((g) >> 5) << 3) | \ - (((b) >> 6) << 6) \ -) -#define COLOR15(r, g, b) ((((r) >> 3) << 10) | (((g) >> 3) << 5) | ((b) >> 3)) -#define COLOR16(r, g, b) ((((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3)) -#define COLOR24(r, g, b) ((r) | ((g) << 8) | ((b) << 16)) -/* font macros */ -#define FONT_DATASIZE(f) ((((f)->height * (((f)->width + 7) / 8)) + 3) & ~3); -/* use crc for bitmap cache lookups */ -#define USE_CRC diff --git a/xrdp/xrdp_file.c b/xrdp/xrdp_file.c deleted file mode 100644 index c0e44f1a..00000000 --- a/xrdp/xrdp_file.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - - read a config file - -*/ - -#include "xrdp.h" - -/*****************************************************************************/ -int xrdp_file_read_sections(int fd, struct xrdp_list* names) -{ - struct stream* s; - char text[256]; - char c; - int in_it; - int in_it_index; - int len; - int index; - - g_file_seek(fd, 0); - in_it_index = 0; - in_it = 0; - g_memset(text, 0, 256); - xrdp_list_clear(names); - make_stream(s); - init_stream(s, 8192); - len = g_file_read(fd, s->data, 8192); - if (len > 0) - { - s->end = s->p + len; - for (index = 0; index < len; index++) - { - in_uint8(s, c); - if (c == '[') - in_it = 1; - else if (c == ']') - { - xrdp_list_add_item(names, (long)g_strdup(text)); - in_it = 0; - in_it_index = 0; - g_memset(text, 0, 256); - } - else if (in_it) - { - text[in_it_index] = c; - in_it_index++; - } - } - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -int xrdp_file_read_line(struct stream* s, char* text) -{ - int i; - char c; - char* hold; - - if (!s_check(s)) - return 1; - hold = s->p; - i = 0; - in_uint8(s, c); - while (c != 10 && c != 13 && s_check(s)) - { - text[i] = c; - i++; - in_uint8(s, c); - } - if (c == 10 || c == 13) - { - while ((c == 10 || c == 13) && s_check(s)) - { - in_uint8(s, c); - } - s->p--; - } - text[i] = 0; - if (text[0] == '[') - { - s->p = hold; - return 1; - } - if (g_strlen(text) > 0) - return 0; - else - return 1; -} - -/*****************************************************************************/ -int xrdp_file_split_name_value(char* text, char* name, char* value) -{ - int len; - int i; - int value_index; - int name_index; - int on_to; - - value_index = 0; - name_index = 0; - on_to = 0; - name[0] = 0; - value[0] = 0; - len = g_strlen(text); - for (i = 0; i < len; i++) - { - if (text[i] == '=') - on_to = 1; - else if (on_to) - { - value[value_index] = text[i]; - value_index++; - value[value_index] = 0; - } - else - { - name[name_index] = text[i]; - name_index++; - name[name_index] = 0; - } - } - return 0; -} - -/*****************************************************************************/ -int xrdp_file_read_section(int fd, char* section, struct xrdp_list* names, - struct xrdp_list* values) -{ - struct stream* s; - char text[256]; - char name[256]; - char value[256]; - char c; - int in_it; - int in_it_index; - int len; - int index; - - g_file_seek(fd, 0); - in_it_index = 0; - in_it = 0; - g_memset(text, 0, 256); - xrdp_list_clear(names); - xrdp_list_clear(values); - make_stream(s); - init_stream(s, 8192); - len = g_file_read(fd, s->data, 8192); - if (len > 0) - { - s->end = s->p + len; - for (index = 0; index < len; index++) - { - in_uint8(s, c); - if (c == '[') - in_it = 1; - else if (c == ']') - { - if (g_strcmp(section, text) == 0) - { - xrdp_file_read_line(s, text); - while (xrdp_file_read_line(s, text) == 0) - { - xrdp_file_split_name_value(text, name, value); - xrdp_list_add_item(names, (long)g_strdup(name)); - xrdp_list_add_item(values, (long)g_strdup(value)); - } - free_stream(s); - return 0; - } - in_it = 0; - in_it_index = 0; - g_memset(text, 0, 256); - } - else if (in_it) - { - text[in_it_index] = c; - in_it_index++; - } - } - } - free_stream(s); - return 0; -} diff --git a/xrdp/xrdp_font.c b/xrdp/xrdp_font.c index c2e00c28..bf1416e6 100644 --- a/xrdp/xrdp_font.c +++ b/xrdp/xrdp_font.c @@ -40,7 +40,8 @@ #include "xrdp.h" -char w_char[] = +#if 0 /* not used */ +static char w_char[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -59,10 +60,11 @@ char w_char[] = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - +#endif /*****************************************************************************/ -struct xrdp_font* xrdp_font_create(struct xrdp_wm* wm) +struct xrdp_font* APP_CC +xrdp_font_create(struct xrdp_wm* wm) { struct xrdp_font* self; struct stream* s; @@ -71,7 +73,7 @@ struct xrdp_font* xrdp_font_create(struct xrdp_wm* wm) int i; int index; int datasize; - struct xrdp_font_item* f; + struct xrdp_font_char* f; //g_printf("loading font\n"); self = (struct xrdp_font*)g_malloc(sizeof(struct xrdp_font), 1); @@ -131,38 +133,58 @@ struct xrdp_font* xrdp_font_create(struct xrdp_wm* wm) /*****************************************************************************/ /* free the font and all the items */ -void xrdp_font_delete(struct xrdp_font* self) +void APP_CC +xrdp_font_delete(struct xrdp_font* self) { int i; if (self == 0) + { return; + } for (i = 0; i < 256; i++) + { g_free(self->font_items[i].data); + } g_free(self); } /*****************************************************************************/ /* compare the two font items returns 1 if they match */ -int xrdp_font_item_compare(struct xrdp_font_item* font1, - struct xrdp_font_item* font2) +int APP_CC +xrdp_font_item_compare(struct xrdp_font_char* font1, + struct xrdp_font_char* font2) { int datasize; if (font1 == 0) + { return 0; + } if (font2 == 0) + { return 0; + } if (font1->offset != font2->offset) + { return 0; + } if (font1->baseline != font2->baseline) + { return 0; + } if (font1->width != font2->width) + { return 0; + } if (font1->height != font2->height) + { return 0; + } datasize = FONT_DATASIZE(font1); if (g_memcmp(font1->data, font2->data, datasize) == 0) + { return 1; + } return 0; } diff --git a/xrdp/xrdp_interface.c b/xrdp/xrdp_interface.c index b8bf4664..4b674e5e 100644 --- a/xrdp/xrdp_interface.c +++ b/xrdp/xrdp_interface.c @@ -22,204 +22,12 @@ #include "xrdp.h" -#ifdef XRDP_LIB - -struct xrdp_mod g_mod; -struct xrdp_process* g_rdp_process; -struct stream* g_s; -int (* g_callback)(int, int, int); - -/*****************************************************************************/ -int mod_event(struct xrdp_mod* v, int msg, int param1, int param2) -{ - if (g_callback != 0) - { - return g_callback(msg, param1, param2); - } - else - { - return 0; - } -} - -/*****************************************************************************/ -int server_init(void) -{ - g_init_system(); - g_memset(&g_mod, 0, sizeof(struct xrdp_mod)); - g_rdp_process = 0; - make_stream(g_s); - init_stream(g_s, 8192); - g_mod.handle = (long)(&g_mod); - g_mod.mod_event = mod_event; - return 0; -} - -/*****************************************************************************/ -int server_exit(void) -{ - xrdp_process_delete(g_rdp_process); - free_stream(g_s); - g_exit_system(); - return 0; -} - -/*****************************************************************************/ -int server_connect(int sck, int* width, int* height, int* bpp) -{ - g_rdp_process = xrdp_process_create(0); - g_rdp_process->sck = sck; - if (xrdp_rdp_incoming(g_rdp_process->rdp_layer) != 0) - { - return 1; - } - if (width != 0) - { - *width = g_rdp_process->rdp_layer->client_info.width; - } - if (height != 0) - { - *height = g_rdp_process->rdp_layer->client_info.height; - } - if (bpp != 0) - { - *bpp = g_rdp_process->rdp_layer->client_info.bpp; - } - return 0; -} - -/*****************************************************************************/ -int server_loop(int sck) -{ - if (g_rdp_process == 0) - { - return 1; - } - if (g_rdp_process->term) - { - return 1; - } - if (g_rdp_process->wm != 0) - { - if (g_rdp_process->wm->mod == 0) - { - g_rdp_process->wm->mod = &g_mod; - } - if (g_mod.wm == 0) - { - g_mod.wm = (long)(g_rdp_process->wm); - } - } - init_stream(g_s, 8192); - if (xrdp_process_loop(g_rdp_process, g_s) != 0) - { - return 1; - } - return 0; -} - -/*****************************************************************************/ -int server_set_callback(int (* callback)(int, int, int)) -{ - g_callback = callback; - return 0; -} - -/*****************************************************************************/ -int server_begin_update(void) -{ - struct xrdp_wm* wm; - struct xrdp_painter* p; - - wm = (struct xrdp_wm*)g_mod.wm; - p = xrdp_painter_create(wm); - xrdp_painter_begin_update(p); - g_mod.painter = (long)p; - return 0; -} - -/*****************************************************************************/ -int server_end_update(void) -{ - struct xrdp_painter* p; - - p = (struct xrdp_painter*)g_mod.painter; - xrdp_painter_end_update(p); - xrdp_painter_delete(p); - g_mod.painter = 0; - return 0; -} - -/*****************************************************************************/ -int server_fill_rect(int x, int y, int cx, int cy, int color) -{ - struct xrdp_wm* wm; - struct xrdp_painter* p; - - wm = (struct xrdp_wm*)g_mod.wm; - p = (struct xrdp_painter*)g_mod.painter; - p->fg_color = color; - xrdp_painter_fill_rect(p, wm->screen, x, y, cx, cy); - return 0; -} - -/*****************************************************************************/ -int server_screen_blt(int x, int y, int cx, int cy, int srcx, int srcy) -{ - struct xrdp_wm* wm; - - wm = (struct xrdp_wm*)g_mod.wm; - xrdp_orders_init(wm->orders); - xrdp_orders_screen_blt(wm->orders, x, y, cx, cy, srcx, srcy, 0xcc, 0); - xrdp_orders_send(wm->orders); - return 0; -} - -/*****************************************************************************/ -int server_paint_rect(int x, int y, int cx, int cy, char* data) -{ - struct xrdp_wm* wm; - struct xrdp_bitmap* b; - - wm = (struct xrdp_wm*)g_mod.wm; - b = xrdp_bitmap_create_with_data(cx, cy, wm->screen->bpp, data, wm); - xrdp_painter_draw_bitmap((struct xrdp_painter*)g_mod.painter, - wm->screen, b, x, y, cx, cy); - xrdp_bitmap_delete(b); - return 0; -} - -/*****************************************************************************/ -int server_set_pointer(int x, int y, char* data, char* mask) -{ - struct xrdp_wm* wm; - - wm = (struct xrdp_wm*)g_mod.wm; - xrdp_wm_pointer(wm, data, mask, x, y); - return 0; -} - -/*****************************************************************************/ -int server_palette(int* palette) -{ - struct xrdp_wm* wm; - - wm = (struct xrdp_wm*)g_mod.wm; - if (g_memcmp(wm->palette, palette, 255 * sizeof(int)) != 0) - { - g_memcpy(wm->palette, palette, 256 * sizeof(int)); - xrdp_wm_send_palette(wm); - } - return 0; -} - -#else - /*****************************************************************************/ /* this is the log windows nofity function */ -int xrdp_wm_log_wnd_notify(struct xrdp_bitmap* wnd, - struct xrdp_bitmap* sender, - int msg, long param1, long param2) +int +xrdp_wm_log_wnd_notify(struct xrdp_bitmap* wnd, + struct xrdp_bitmap* sender, + int msg, long param1, long param2) { struct xrdp_painter* painter; struct xrdp_wm* wm; @@ -262,7 +70,7 @@ int xrdp_wm_log_wnd_notify(struct xrdp_bitmap* wnd, painter->font->color = wnd->wm->black; for (index = 0; index < wnd->wm->log->count; index++) { - text = (char*)xrdp_list_get_item(wnd->wm->log, index); + text = (char*)list_get_item(wnd->wm->log, index); xrdp_painter_draw_text(painter, wnd, 10, 30 + index * 15, text); } } @@ -271,20 +79,22 @@ int xrdp_wm_log_wnd_notify(struct xrdp_bitmap* wnd, } /*****************************************************************************/ -int server_begin_update(struct xrdp_mod* mod) +int +server_begin_update(struct xrdp_mod* mod) { struct xrdp_wm* wm; struct xrdp_painter* p; wm = (struct xrdp_wm*)mod->wm; - p = xrdp_painter_create(wm); + p = xrdp_painter_create(wm, wm->session); xrdp_painter_begin_update(p); mod->painter = (long)p; return 0; } /*****************************************************************************/ -int server_end_update(struct xrdp_mod* mod) +int +server_end_update(struct xrdp_mod* mod) { struct xrdp_painter* p; @@ -296,8 +106,9 @@ int server_end_update(struct xrdp_mod* mod) } /*****************************************************************************/ -int server_fill_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, - int color) +int +server_fill_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, + int color) { struct xrdp_wm* wm; struct xrdp_painter* p; @@ -310,21 +121,23 @@ int server_fill_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, } /*****************************************************************************/ -int server_screen_blt(struct xrdp_mod* mod, int x, int y, int cx, int cy, - int srcx, int srcy) +int +server_screen_blt(struct xrdp_mod* mod, int x, int y, int cx, int cy, + int srcx, int srcy) { struct xrdp_wm* wm; wm = (struct xrdp_wm*)mod->wm; - xrdp_orders_init(wm->orders); - xrdp_orders_screen_blt(wm->orders, x, y, cx, cy, srcx, srcy, 0xcc, 0); - xrdp_orders_send(wm->orders); + libxrdp_orders_init(wm->session); + libxrdp_orders_screen_blt(wm->session, x, y, cx, cy, srcx, srcy, 0xcc, 0); + libxrdp_orders_send(wm->session); return 0; } /*****************************************************************************/ -int server_paint_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, - char* data) +int +server_paint_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, + char* data) { struct xrdp_wm* wm; struct xrdp_bitmap* b; @@ -338,8 +151,9 @@ int server_paint_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, } /*****************************************************************************/ -int server_set_pointer(struct xrdp_mod* mod, int x, int y, - char* data, char* mask) +int +server_set_pointer(struct xrdp_mod* mod, int x, int y, + char* data, char* mask) { struct xrdp_wm* wm; @@ -349,7 +163,8 @@ int server_set_pointer(struct xrdp_mod* mod, int x, int y, } /*****************************************************************************/ -int server_palette(struct xrdp_mod* mod, int* palette) +int +server_palette(struct xrdp_mod* mod, int* palette) { struct xrdp_wm* wm; @@ -363,19 +178,20 @@ int server_palette(struct xrdp_mod* mod, int* palette) } /*****************************************************************************/ -int server_msg(struct xrdp_mod* mod, char* msg) +int +server_msg(struct xrdp_mod* mod, char* msg) { struct xrdp_wm* wm; struct xrdp_bitmap* but; wm = (struct xrdp_wm*)mod->wm; - xrdp_list_add_item(wm->log, (long)g_strdup(msg)); + list_add_item(wm->log, (long)g_strdup(msg)); if (wm->log_wnd == 0) { /* log window */ wm->log_wnd = xrdp_bitmap_create(400, 400, wm->screen->bpp, WND_TYPE_WND, wm); - xrdp_list_add_item(wm->screen->child_list, (long)wm->log_wnd); + list_add_item(wm->screen->child_list, (long)wm->log_wnd); wm->log_wnd->parent = wm->screen; wm->log_wnd->owner = wm->screen; wm->log_wnd->bg_color = wm->grey; @@ -384,7 +200,7 @@ int server_msg(struct xrdp_mod* mod, char* msg) set_string(&wm->log_wnd->caption1, "Connection Log"); /* ok button */ but = xrdp_bitmap_create(60, 25, wm->screen->bpp, WND_TYPE_BUTTON, wm); - xrdp_list_insert_item(wm->log_wnd->child_list, 0, (long)but); + list_insert_item(wm->log_wnd->child_list, 0, (long)but); but->parent = wm->log_wnd; but->owner = wm->log_wnd; but->left = (400 - 60) - 10; @@ -401,9 +217,8 @@ int server_msg(struct xrdp_mod* mod, char* msg) } /*****************************************************************************/ -int server_is_term(struct xrdp_mod* mod) +int +server_is_term(struct xrdp_mod* mod) { return g_is_term(); } - -#endif /* XRDP_LIB */ diff --git a/xrdp/xrdp_iso.c b/xrdp/xrdp_iso.c deleted file mode 100644 index 7180c8b9..00000000 --- a/xrdp/xrdp_iso.c +++ /dev/null @@ -1,187 +0,0 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - - iso layer - -*/ - -#include "xrdp.h" - -/*****************************************************************************/ -struct xrdp_iso* xrdp_iso_create(struct xrdp_mcs* owner, int sck) -{ - struct xrdp_iso* self; - - self = (struct xrdp_iso*)g_malloc(sizeof(struct xrdp_iso), 1); - self->mcs_layer = owner; - self->tcp_layer = xrdp_tcp_create(self, sck); - return self; -} - -/*****************************************************************************/ -void xrdp_iso_delete(struct xrdp_iso* self) -{ - if (self == 0) - { - return; - } - xrdp_tcp_delete(self->tcp_layer); - g_free(self); -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_iso_recv_msg(struct xrdp_iso* self, struct stream* s, int* code) -{ - int ver; - int len; - - *code = 0; - if (xrdp_tcp_recv(self->tcp_layer, s, 4) != 0) - { - return 1; - } - in_uint8(s, ver); - if (ver != 3) - { - return 1; - } - in_uint8s(s, 1); - in_uint16_be(s, len); - if (xrdp_tcp_recv(self->tcp_layer, s, len - 4) != 0) - { - return 1; - } - in_uint8s(s, 1); - in_uint8(s, *code); - if (*code == ISO_PDU_DT) - { - in_uint8s(s, 1); - } - else - { - in_uint8s(s, 5); - } - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_iso_recv(struct xrdp_iso* self, struct stream* s) -{ - int code; - - DEBUG((" in xrdp_iso_recv\n\r")); - if (xrdp_iso_recv_msg(self, s, &code) != 0) - { - DEBUG((" out xrdp_iso_recv xrdp_iso_recv_msg return non zero\n\r")); - return 1; - } - if (code != ISO_PDU_DT) - { - DEBUG((" out xrdp_iso_recv code != ISO_PDU_DT\n\r")); - return 1; - } - DEBUG((" out xrdp_iso_recv\n\r")); - return 0; -} - -/*****************************************************************************/ -int xrdp_iso_send_msg(struct xrdp_iso* self, struct stream* s, int code) -{ - if (xrdp_tcp_init(self->tcp_layer, s) != 0) - { - return 1; - } - out_uint8(s, 3); - out_uint8(s, 0); - out_uint16_be(s, 11); /* length */ - out_uint8(s, 8); - out_uint8(s, code); - out_uint16_le(s, 0); - out_uint16_le(s, 0); - out_uint8(s, 0); - s_mark_end(s); - if (xrdp_tcp_send(self->tcp_layer, s) != 0) - { - return 1; - } - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_iso_incoming(struct xrdp_iso* self) -{ - int code; - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - DEBUG((" in xrdp_iso_incoming\n\r")); - if (xrdp_iso_recv_msg(self, s, &code) != 0) - { - free_stream(s); - return 1; - } - if (code != ISO_PDU_CR) - { - free_stream(s); - return 1; - } - if (xrdp_iso_send_msg(self, s, ISO_PDU_CC) != 0) - { - free_stream(s); - return 1; - } - DEBUG((" out xrdp_iso_incoming\n\r")); - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_iso_init(struct xrdp_iso* self, struct stream* s) -{ - xrdp_tcp_init(self->tcp_layer, s); - s_push_layer(s, iso_hdr, 7); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_iso_send(struct xrdp_iso* self, struct stream* s) -{ - int len; - - DEBUG((" in xrdp_iso_send\n\r")); - s_pop_layer(s, iso_hdr); - len = s->end - s->p; - out_uint8(s, 3); - out_uint8(s, 0); - out_uint16_be(s, len); - out_uint8(s, 2); - out_uint8(s, ISO_PDU_DT); - out_uint8(s, 0x80); - if (xrdp_tcp_send(self->tcp_layer, s) != 0) - { - return 1; - } - DEBUG((" out xrdp_iso_send\n\r")); - return 0; -} diff --git a/xrdp/xrdp_list.c b/xrdp/xrdp_list.c deleted file mode 100644 index 34264925..00000000 --- a/xrdp/xrdp_list.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - - simple list - -*/ - -#include "xrdp.h" - -/*****************************************************************************/ -struct xrdp_list* xrdp_list_create(void) -{ - struct xrdp_list* self; - - self = (struct xrdp_list*)g_malloc(sizeof(struct xrdp_list), 1); - self->grow_by = 10; - self->alloc_size = 10; - self->items = (long*)g_malloc(sizeof(long) * 10, 1); - return self; -} - -/*****************************************************************************/ -void xrdp_list_delete(struct xrdp_list* self) -{ - int i; - - if (self == 0) - { - return; - } - if (self->auto_free) - { - for (i = 0; i < self->count; i++) - { - g_free((void*)self->items[i]); - self->items[i] = 0; - } - } - g_free(self->items); - g_free(self); -} - -/*****************************************************************************/ -void xrdp_list_add_item(struct xrdp_list* self, long item) -{ - long* p; - int i; - - if (self->count >= self->alloc_size) - { - i = self->alloc_size; - self->alloc_size += self->grow_by; - p = (long*)g_malloc(sizeof(long) * self->alloc_size, 1); - g_memcpy(p, self->items, sizeof(long) * i); - g_free(self->items); - self->items = p; - } - self->items[self->count] = item; - self->count++; -} - -/*****************************************************************************/ -long xrdp_list_get_item(struct xrdp_list* self, int index) -{ - if (index < 0 || index >= self->count) - { - return 0; - } - return self->items[index]; -} - -/*****************************************************************************/ -void xrdp_list_clear(struct xrdp_list* self) -{ - int i; - - if (self->auto_free) - { - for (i = 0; i < self->count; i++) - { - g_free((void*)self->items[i]); - self->items[i] = 0; - } - } - g_free(self->items); - self->count = 0; - self->grow_by = 10; - self->alloc_size = 10; - self->items = (long*)g_malloc(sizeof(long) * 10, 1); -} - -/*****************************************************************************/ -int xrdp_list_index_of(struct xrdp_list* self, long item) -{ - int i; - - for (i = 0; i < self->count; i++) - { - if (self->items[i] == item) - { - return i; - } - } - return -1; -} - -/*****************************************************************************/ -void xrdp_list_remove_item(struct xrdp_list* self, int index) -{ - int i; - - if (index >= 0 && index < self->count) - { - if (self->auto_free) - { - g_free((void*)self->items[index]); - self->items[index] = 0; - } - for (i = index; i < (self->count - 1); i++) - { - self->items[i] = self->items[i + 1]; - } - self->count--; - } -} - -/*****************************************************************************/ -void xrdp_list_insert_item(struct xrdp_list* self, int index, long item) -{ - long* p; - int i; - - if (index == self->count) - { - xrdp_list_add_item(self, item); - return; - } - if (index >= 0 && index < self->count) - { - self->count++; - if (self->count > self->alloc_size) - { - i = self->alloc_size; - self->alloc_size += self->grow_by; - p = (long*)g_malloc(sizeof(long) * self->alloc_size, 1); - g_memcpy(p, self->items, sizeof(long) * i); - g_free(self->items); - self->items = p; - } - for (i = (self->count - 2); i >= index; i--) - { - self->items[i + 1] = self->items[i]; - } - self->items[index] = item; - } -} diff --git a/xrdp/xrdp_listen.c b/xrdp/xrdp_listen.c index fb11be73..e71b8180 100644 --- a/xrdp/xrdp_listen.c +++ b/xrdp/xrdp_listen.c @@ -25,7 +25,8 @@ static struct xrdp_process* g_process = 0; /*****************************************************************************/ -struct xrdp_listen* xrdp_listen_create(void) +struct xrdp_listen* APP_CC +xrdp_listen_create(void) { struct xrdp_listen* self; @@ -35,13 +36,15 @@ struct xrdp_listen* xrdp_listen_create(void) } /*****************************************************************************/ -void xrdp_listen_delete(struct xrdp_listen* self) +void APP_CC +xrdp_listen_delete(struct xrdp_listen* self) { g_free(self); } /*****************************************************************************/ -int xrdp_listen_term_processes(struct xrdp_listen* self) +int APP_CC +xrdp_listen_term_processes(struct xrdp_listen* self) { int i; @@ -77,7 +80,8 @@ int xrdp_listen_term_processes(struct xrdp_listen* self) /*****************************************************************************/ /* returns error */ -int xrdp_listen_add_pro(struct xrdp_listen* self) +int APP_CC +xrdp_listen_add_pro(struct xrdp_listen* self) { int i; @@ -103,7 +107,8 @@ int xrdp_listen_add_pro(struct xrdp_listen* self) } /*****************************************************************************/ -int xrdp_listen_delete_pro(struct xrdp_listen* self, struct xrdp_process* pro) +int APP_CC +xrdp_listen_delete_pro(struct xrdp_listen* self, struct xrdp_process* pro) { int i; @@ -122,7 +127,8 @@ int xrdp_listen_delete_pro(struct xrdp_listen* self, struct xrdp_process* pro) /*****************************************************************************/ /* i can't get stupid in_val to work, hum using global var for now */ -THREAD_RV THREAD_CC xrdp_process_run(void* in_val) +THREAD_RV THREAD_CC +xrdp_process_run(void* in_val) { DEBUG(("process started\n\r")); xrdp_process_main_loop(g_process); @@ -132,7 +138,8 @@ THREAD_RV THREAD_CC xrdp_process_run(void* in_val) /*****************************************************************************/ /* wait for incoming connections */ -int xrdp_listen_main_loop(struct xrdp_listen* self) +int APP_CC +xrdp_listen_main_loop(struct xrdp_listen* self) { int error; diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c index 4893ce60..51bcf77d 100644 --- a/xrdp/xrdp_login_wnd.c +++ b/xrdp/xrdp_login_wnd.c @@ -24,9 +24,10 @@ /*****************************************************************************/ /* all login help screen events go here */ -int xrdp_wm_login_help_notify(struct xrdp_bitmap* wnd, - struct xrdp_bitmap* sender, - int msg, long param1, long param2) +int APP_CC +xrdp_wm_login_help_notify(struct xrdp_bitmap* wnd, + struct xrdp_bitmap* sender, + int msg, long param1, long param2) { struct xrdp_painter* p; @@ -78,16 +79,18 @@ logging on."); } /*****************************************************************************/ -int xrdp_wm_popup_notify(struct xrdp_bitmap* wnd, - struct xrdp_bitmap* sender, - int msg, int param1, int param2) +int APP_CC +xrdp_wm_popup_notify(struct xrdp_bitmap* wnd, + struct xrdp_bitmap* sender, + int msg, int param1, int param2) { return 0; } /*****************************************************************************/ -int xrdp_wm_setup_mod(struct xrdp_wm* self, - struct xrdp_mod_data* mod_data) +int +xrdp_wm_setup_mod(struct xrdp_wm* self, + struct xrdp_mod_data* mod_data) { if (self == 0) { @@ -131,14 +134,15 @@ int xrdp_wm_setup_mod(struct xrdp_wm* self, } /*****************************************************************************/ -int xrdp_wm_delete_all_childs(struct xrdp_wm* self) +int APP_CC +xrdp_wm_delete_all_childs(struct xrdp_wm* self) { int i; struct xrdp_bitmap* b; for (i = self->screen->child_list->count - 1; i >= 0; i--) { - b = (struct xrdp_bitmap*)xrdp_list_get_item(self->screen->child_list, i); + b = (struct xrdp_bitmap*)list_get_item(self->screen->child_list, i); xrdp_bitmap_delete(b); } xrdp_bitmap_invalidate(self->screen, 0); @@ -146,23 +150,25 @@ int xrdp_wm_delete_all_childs(struct xrdp_wm* self) } /*****************************************************************************/ -int set_mod_data_item(struct xrdp_mod_data* mod, char* name, char* value) +int APP_CC +set_mod_data_item(struct xrdp_mod_data* mod, char* name, char* value) { int index; for (index = 0; index < mod->names->count; index++) { - if (g_strcmp(name, (char*)xrdp_list_get_item(mod->names, index)) == 0) + if (g_strcmp(name, (char*)list_get_item(mod->names, index)) == 0) { - xrdp_list_remove_item(mod->values, index); - xrdp_list_insert_item(mod->values, index, (long)g_strdup(value)); + list_remove_item(mod->values, index); + list_insert_item(mod->values, index, (long)g_strdup(value)); } } return 0; } /*****************************************************************************/ -int xrdp_wm_help_clicked(struct xrdp_bitmap* wnd) +int APP_CC +xrdp_wm_help_clicked(struct xrdp_bitmap* wnd) { struct xrdp_bitmap* help; struct xrdp_bitmap* but; @@ -170,7 +176,7 @@ int xrdp_wm_help_clicked(struct xrdp_bitmap* wnd) /* create help screen */ help = xrdp_bitmap_create(300, 300, wnd->wm->screen->bpp, WND_TYPE_WND, wnd->wm); - xrdp_list_insert_item(wnd->wm->screen->child_list, 0, (long)help); + list_insert_item(wnd->wm->screen->child_list, 0, (long)help); help->parent = wnd->wm->screen; help->owner = wnd; wnd->modal_dialog = help; @@ -182,7 +188,7 @@ int xrdp_wm_help_clicked(struct xrdp_bitmap* wnd) /* ok button */ but = xrdp_bitmap_create(60, 25, wnd->wm->screen->bpp, WND_TYPE_BUTTON, wnd->wm); - xrdp_list_insert_item(help->child_list, 0, (long)but); + list_insert_item(help->child_list, 0, (long)but); but->parent = help; but->owner = help; but->left = 120; @@ -200,7 +206,8 @@ int xrdp_wm_help_clicked(struct xrdp_bitmap* wnd) } /*****************************************************************************/ -int xrdp_wm_cancel_clicked(struct xrdp_bitmap* wnd) +int APP_CC +xrdp_wm_cancel_clicked(struct xrdp_bitmap* wnd) { if (wnd != 0) { @@ -216,14 +223,15 @@ int xrdp_wm_cancel_clicked(struct xrdp_bitmap* wnd) } /*****************************************************************************/ -int xrdp_wm_ok_clicked(struct xrdp_bitmap* wnd) +int APP_CC +xrdp_wm_ok_clicked(struct xrdp_bitmap* wnd) { struct xrdp_bitmap* combo; struct xrdp_bitmap* label; struct xrdp_bitmap* edit; struct xrdp_wm* wm; - struct xrdp_list* names; - struct xrdp_list* values; + struct list* names; + struct list* values; struct xrdp_mod_data* mod_data; int i; @@ -232,7 +240,7 @@ int xrdp_wm_ok_clicked(struct xrdp_bitmap* wnd) if (combo != 0) { mod_data = (struct xrdp_mod_data*) - xrdp_list_get_item(combo->data_list, combo->item_index); + list_get_item(combo->data_list, combo->item_index); if (mod_data != 0) { /* get the user typed values */ @@ -249,19 +257,19 @@ int xrdp_wm_ok_clicked(struct xrdp_bitmap* wnd) if (xrdp_wm_setup_mod(wm, mod_data) == 0) { /* gota copy these cause dialog gets freed */ - names = xrdp_list_create(); + names = list_create(); names->auto_free = 1; for (i = 0; i < mod_data->names->count; i++) { - xrdp_list_add_item(names, - (long)g_strdup((char*)xrdp_list_get_item(mod_data->names, i))); + list_add_item(names, + (long)g_strdup((char*)list_get_item(mod_data->names, i))); } - values = xrdp_list_create(); + values = list_create(); values->auto_free = 1; for (i = 0; i < mod_data->values->count; i++) { - xrdp_list_add_item(values, - (long)g_strdup((char*)xrdp_list_get_item(mod_data->values, i))); + list_add_item(values, + (long)g_strdup((char*)list_get_item(mod_data->values, i))); } xrdp_wm_delete_all_childs(wm); if (!wm->pro_layer->term) @@ -277,8 +285,8 @@ int xrdp_wm_ok_clicked(struct xrdp_bitmap* wnd) for (i = 0; i < names->count; i++) { wm->mod->mod_set_param(wm->mod, - (char*)xrdp_list_get_item(names, i), - (char*)xrdp_list_get_item(values, i)); + (char*)list_get_item(names, i), + (char*)list_get_item(values, i)); } if (wm->mod->mod_connect(wm->mod) != 0) { @@ -308,8 +316,8 @@ int xrdp_wm_ok_clicked(struct xrdp_bitmap* wnd) } } } - xrdp_list_delete(names); - xrdp_list_delete(values); + list_delete(names); + list_delete(values); } } } @@ -317,7 +325,8 @@ int xrdp_wm_ok_clicked(struct xrdp_bitmap* wnd) } /******************************************************************************/ -int xrdp_wm_show_edits(struct xrdp_wm* self, struct xrdp_bitmap* combo) +int APP_CC +xrdp_wm_show_edits(struct xrdp_wm* self, struct xrdp_bitmap* combo) { int count; int index; @@ -335,23 +344,23 @@ int xrdp_wm_show_edits(struct xrdp_wm* self, struct xrdp_bitmap* combo) xrdp_bitmap_delete(b); } - insert_index = xrdp_list_index_of(self->login_window->child_list, + insert_index = list_index_of(self->login_window->child_list, (long)combo); insert_index++; mod = (struct xrdp_mod_data*) - xrdp_list_get_item(combo->data_list, combo->item_index); + list_get_item(combo->data_list, combo->item_index); if (mod != 0) { count = 0; for (index = 0; index < mod->names->count; index++) { - value = (char*)xrdp_list_get_item(mod->values, index); + value = (char*)list_get_item(mod->values, index); if (g_strncmp("ask", value, 3) == 0) { /* label */ b = xrdp_bitmap_create(60, 20, self->screen->bpp, WND_TYPE_LABEL, self); - xrdp_list_insert_item(self->login_window->child_list, insert_index, + list_insert_item(self->login_window->child_list, insert_index, (long)b); insert_index++; b->parent = self->login_window; @@ -359,12 +368,12 @@ int xrdp_wm_show_edits(struct xrdp_wm* self, struct xrdp_bitmap* combo) b->left = 155; b->top = 60 + 25 * count; b->id = 100 + 2 * count; - name = (char*)xrdp_list_get_item(mod->names, index); + name = (char*)list_get_item(mod->names, index); set_string(&b->caption1, name); /* edit */ b = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_EDIT, self); - xrdp_list_insert_item(self->login_window->child_list, insert_index, + list_insert_item(self->login_window->child_list, insert_index, (long)b); insert_index++; b->parent = self->login_window; @@ -394,9 +403,10 @@ int xrdp_wm_show_edits(struct xrdp_wm* self, struct xrdp_bitmap* combo) /*****************************************************************************/ /* all login screen events go here */ -int xrdp_wm_login_notify(struct xrdp_bitmap* wnd, - struct xrdp_bitmap* sender, - int msg, long param1, long param2) +int APP_CC +xrdp_wm_login_notify(struct xrdp_bitmap* wnd, + struct xrdp_bitmap* sender, + int msg, long param1, long param2) { struct xrdp_bitmap* b; struct xrdp_rect rect; @@ -426,12 +436,12 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd, } else if (msg == 100) /* modal result is done */ { - i = xrdp_list_index_of(wnd->wm->screen->child_list, (long)sender); + i = list_index_of(wnd->wm->screen->child_list, (long)sender); if (i >= 0) { b = (struct xrdp_bitmap*) - xrdp_list_get_item(wnd->wm->screen->child_list, i); - xrdp_list_remove_item(sender->wm->screen->child_list, i); + list_get_item(wnd->wm->screen->child_list, i); + list_remove_item(sender->wm->screen->child_list, i); MAKERECT(rect, b->left, b->top, b->width, b->height); xrdp_bitmap_invalidate(wnd->wm->screen, &rect); xrdp_bitmap_delete(sender); @@ -448,11 +458,12 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd, } /******************************************************************************/ -int xrdp_wm_login_fill_in_combo(struct xrdp_wm* self, struct xrdp_bitmap* b) +int APP_CC +xrdp_wm_login_fill_in_combo(struct xrdp_wm* self, struct xrdp_bitmap* b) { - struct xrdp_list* sections; - struct xrdp_list* section_names; - struct xrdp_list* section_values; + struct list* sections; + struct list* section_names; + struct list* section_values; int fd; int i; int j; @@ -461,18 +472,18 @@ int xrdp_wm_login_fill_in_combo(struct xrdp_wm* self, struct xrdp_bitmap* b) char* r; struct xrdp_mod_data* mod_data; - sections = xrdp_list_create(); + sections = list_create(); sections->auto_free = 1; - section_names = xrdp_list_create(); + section_names = list_create(); section_names->auto_free = 1; - section_values = xrdp_list_create(); + section_values = list_create(); section_values->auto_free = 1; fd = g_file_open("xrdp.ini"); - xrdp_file_read_sections(fd, sections); + file_read_sections(fd, sections); for (i = 0; i < sections->count; i++) { - p = (char*)xrdp_list_get_item(sections, i); - xrdp_file_read_section(fd, p, section_names, section_values); + p = (char*)list_get_item(sections, i); + file_read_section(fd, p, section_names, section_values); if (g_strcmp(p, "globals") == 0) { } @@ -480,15 +491,15 @@ int xrdp_wm_login_fill_in_combo(struct xrdp_wm* self, struct xrdp_bitmap* b) { mod_data = (struct xrdp_mod_data*) g_malloc(sizeof(struct xrdp_mod_data), 1); - mod_data->names = xrdp_list_create(); + mod_data->names = list_create(); mod_data->names->auto_free = 1; - mod_data->values = xrdp_list_create(); + mod_data->values = list_create(); mod_data->values->auto_free = 1; g_strcpy(mod_data->name, p); /* set name in square bracket */ for (j = 0; j < section_names->count; j++) { - q = (char*)xrdp_list_get_item(section_names, j); - r = (char*)xrdp_list_get_item(section_values, j); + q = (char*)list_get_item(section_names, j); + r = (char*)list_get_item(section_values, j); if (g_strcmp("name", q) == 0) { g_strcpy(mod_data->name, r); @@ -499,23 +510,24 @@ int xrdp_wm_login_fill_in_combo(struct xrdp_wm* self, struct xrdp_bitmap* b) } else { - xrdp_list_add_item(mod_data->names, (long)g_strdup(q)); - xrdp_list_add_item(mod_data->values, (long)g_strdup(r)); + list_add_item(mod_data->names, (long)g_strdup(q)); + list_add_item(mod_data->values, (long)g_strdup(r)); } } - xrdp_list_add_item(b->string_list, (long)g_strdup(mod_data->name)); - xrdp_list_add_item(b->data_list, (long)mod_data); + list_add_item(b->string_list, (long)g_strdup(mod_data->name)); + list_add_item(b->data_list, (long)mod_data); } } g_file_close(fd); - xrdp_list_delete(sections); - xrdp_list_delete(section_names); - xrdp_list_delete(section_values); + list_delete(sections); + list_delete(section_names); + list_delete(section_values); return 0; } /******************************************************************************/ -int xrdp_login_wnd_create(struct xrdp_wm* self) +int APP_CC +xrdp_login_wnd_create(struct xrdp_wm* self) { struct xrdp_bitmap* but; struct xrdp_bitmap* combo; @@ -523,7 +535,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) /* draw login window */ self->login_window = xrdp_bitmap_create(400, 200, self->screen->bpp, WND_TYPE_WND, self); - xrdp_list_add_item(self->screen->child_list, (long)self->login_window); + list_add_item(self->screen->child_list, (long)self->login_window); self->login_window->parent = self->screen; self->login_window->owner = self->screen; self->login_window->bg_color = self->grey; @@ -541,7 +553,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) but->owner = self->screen; but->left = self->screen->width - but->width; but->top = self->screen->height - but->height; - xrdp_list_add_item(self->screen->child_list, (long)but); + list_add_item(self->screen->child_list, (long)but); /* image */ but = xrdp_bitmap_create(4, 4, self->screen->bpp, WND_TYPE_IMAGE, self); @@ -550,11 +562,11 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) but->owner = self->login_window; but->left = 10; but->top = 30; - xrdp_list_add_item(self->login_window->child_list, (long)but); + list_add_item(self->login_window->child_list, (long)but); /* label */ but = xrdp_bitmap_create(60, 20, self->screen->bpp, WND_TYPE_LABEL, self); - xrdp_list_add_item(self->login_window->child_list, (long)but); + list_add_item(self->login_window->child_list, (long)but); but->parent = self->login_window; but->owner = self->login_window; but->left = 155; @@ -563,7 +575,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) /* combo */ combo = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_COMBO, self); - xrdp_list_add_item(self->login_window->child_list, (long)combo); + list_add_item(self->login_window->child_list, (long)combo); combo->parent = self->login_window; combo->owner = self->login_window; combo->left = 220; @@ -574,7 +586,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) /* button */ but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON, self); - xrdp_list_add_item(self->login_window->child_list, (long)but); + list_add_item(self->login_window->child_list, (long)but); but->parent = self->login_window; but->owner = self->login_window; but->left = 180; @@ -586,7 +598,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) /* button */ but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON, self); - xrdp_list_add_item(self->login_window->child_list, (long)but); + list_add_item(self->login_window->child_list, (long)but); but->parent = self->login_window; but->owner = self->login_window; but->left = 250; @@ -598,7 +610,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) /* button */ but = xrdp_bitmap_create(60, 25, self->screen->bpp, WND_TYPE_BUTTON, self); - xrdp_list_add_item(self->login_window->child_list, (long)but); + list_add_item(self->login_window->child_list, (long)but); but->parent = self->login_window; but->owner = self->login_window; but->left = 320; diff --git a/xrdp/xrdp_mcs.c b/xrdp/xrdp_mcs.c deleted file mode 100644 index 41197cfa..00000000 --- a/xrdp/xrdp_mcs.c +++ /dev/null @@ -1,606 +0,0 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - - mcs layer - -*/ - -#include "xrdp.h" - -/*****************************************************************************/ -struct xrdp_mcs* xrdp_mcs_create(struct xrdp_sec* owner, int sck, - struct stream* client_mcs_data, - struct stream* server_mcs_data) -{ - struct xrdp_mcs* self; - - self = (struct xrdp_mcs*)g_malloc(sizeof(struct xrdp_mcs), 1); - self->sec_layer = owner; - self->userid = 1; - self->chanid = 1001; - self->client_mcs_data = client_mcs_data; - self->server_mcs_data = server_mcs_data; - self->iso_layer = xrdp_iso_create(self, sck); - return self; -} - -/*****************************************************************************/ -void xrdp_mcs_delete(struct xrdp_mcs* self) -{ - if (self == 0) - { - return; - } - xrdp_iso_delete(self->iso_layer); - g_free(self); -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_send_cjcf(struct xrdp_mcs* self, int chanid) -{ - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_iso_init(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - out_uint8(s, (MCS_CJCF << 2) | 2); - out_uint8(s, 0); - out_uint16_be(s, self->userid); - out_uint16_be(s, chanid); - out_uint16_be(s, chanid); - s_mark_end(s); - if (xrdp_iso_send(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_recv(struct xrdp_mcs* self, struct stream* s, int* chan) -{ - int appid; - int opcode; - int len; - - DEBUG((" in xrdp_mcs_recv\n\r")); - while (1) - { - if (xrdp_iso_recv(self->iso_layer, s) != 0) - { - DEBUG((" out xrdp_mcs_recv xrdp_iso_recv returned non zero\n\r")); - return 1; - } - in_uint8(s, opcode); - appid = opcode >> 2; - if (appid == MCS_DPUM) - { - DEBUG((" out xrdp_mcs_recv appid != MCS_DPUM\n\r")); - return 1; - } - if (appid == MCS_CJRQ) - { - xrdp_mcs_send_cjcf(self, self->userid + MCS_USERCHANNEL_BASE); - continue; - } - break; - } - if (appid != MCS_SDRQ) - { - DEBUG((" out xrdp_mcs_recv err got 0x%x need MCS_SDRQ\n\r", appid)); - return 1; - } - in_uint8s(s, 2); - in_uint16_be(s, *chan); - in_uint8s(s, 1); - in_uint8(s, len); - if (len & 0x80) - { - in_uint8s(s, 1); - } - DEBUG((" out xrdp_mcs_recv\n\r")); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_ber_parse_header(struct xrdp_mcs* self, struct stream* s, - int tag_val, int* len) -{ - int tag; - int l; - int i; - - if (tag_val > 0xff) - { - in_uint16_be(s, tag); - } - else - { - in_uint8(s, tag); - } - if (tag != tag_val) - { - return 1; - } - in_uint8(s, l); - if (l & 0x80) - { - l = l & ~0x80; - *len = 0; - while (l > 0) - { - in_uint8(s, i); - *len = (*len << 8) | i; - l--; - } - } - else - { - *len = l; - } - if (s_check(s)) - { - return 0; - } - else - { - return 1; - } -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_parse_domain_params(struct xrdp_mcs* self, struct stream* s) -{ - int len; - - if (xrdp_mcs_ber_parse_header(self, s, MCS_TAG_DOMAIN_PARAMS, &len) != 0) - { - return 1; - } - in_uint8s(s, len); - if (s_check(s)) - { - return 0; - } - else - { - return 1; - } -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_recv_connect_initial(struct xrdp_mcs* self) -{ - int len; - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_iso_recv(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - if (xrdp_mcs_ber_parse_header(self, s, MCS_CONNECT_INITIAL, &len) != 0) - { - free_stream(s); - return 1; - } - if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_OCTET_STRING, &len) != 0) - { - free_stream(s); - return 1; - } - in_uint8s(s, len); - if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_OCTET_STRING, &len) != 0) - { - free_stream(s); - return 1; - } - in_uint8s(s, len); - if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_BOOLEAN, &len) != 0) - { - free_stream(s); - return 1; - } - in_uint8s(s, len); - if (xrdp_mcs_parse_domain_params(self, s) != 0) - { - free_stream(s); - return 1; - } - if (xrdp_mcs_parse_domain_params(self, s) != 0) - { - free_stream(s); - return 1; - } - if (xrdp_mcs_parse_domain_params(self, s) != 0) - { - free_stream(s); - return 1; - } - if (xrdp_mcs_ber_parse_header(self, s, BER_TAG_OCTET_STRING, &len) != 0) - { - free_stream(s); - return 1; - } - /* make a copy of client mcs data */ - init_stream(self->client_mcs_data, len); - out_uint8a(self->client_mcs_data, s->p, len); - in_uint8s(s, len); - s_mark_end(self->client_mcs_data); - if (s_check_end(s)) - { - free_stream(s); - return 0; - } - else - { - free_stream(s); - return 1; - } -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_recv_edrq(struct xrdp_mcs* self) -{ - int opcode; - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_iso_recv(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - in_uint8(s, opcode); - if ((opcode >> 2) != MCS_EDRQ) - { - free_stream(s); - return 1; - } - in_uint8s(s, 2); - in_uint8s(s, 2); - if (opcode & 2) - { - in_uint16_be(s, self->userid); - } - if (!(s_check_end(s))) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_recv_aurq(struct xrdp_mcs* self) -{ - int opcode; - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_iso_recv(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - in_uint8(s, opcode); - if ((opcode >> 2) != MCS_AURQ) - { - free_stream(s); - return 1; - } - if (opcode & 2) - { - in_uint16_be(s, self->userid); - } - if (!(s_check_end(s))) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_send_aucf(struct xrdp_mcs* self) -{ - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_iso_init(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - out_uint8(s, ((MCS_AUCF << 2) | 2)); - out_uint8s(s, 1); - out_uint16_be(s, self->userid); - s_mark_end(s); - if (xrdp_iso_send(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_recv_cjrq(struct xrdp_mcs* self) -{ - int opcode; - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_iso_recv(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - in_uint8(s, opcode); - if ((opcode >> 2) != MCS_CJRQ) - { - free_stream(s); - return 1; - } - in_uint8s(s, 4); - if (opcode & 2) - { - in_uint8s(s, 2); - } - if (!(s_check_end(s))) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_ber_out_header(struct xrdp_mcs* self, struct stream* s, - int tag_val, int len) -{ - if (tag_val > 0xff) - { - out_uint16_be(s, tag_val); - } - else - { - out_uint8(s, tag_val); - } - if (len >= 0x80) - { - out_uint8(s, 0x82); - out_uint16_be(s, len); - } - else - { - out_uint8(s, len); - } - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_ber_out_int8(struct xrdp_mcs* self, struct stream* s, int value) -{ - xrdp_mcs_ber_out_header(self, s, BER_TAG_INTEGER, 1); - out_uint8(s, value); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_ber_out_int16(struct xrdp_mcs* self, struct stream* s, int value) -{ - xrdp_mcs_ber_out_header(self, s, BER_TAG_INTEGER, 2); - out_uint8(s, (value >> 8)); - out_uint8(s, value); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_ber_out_int24(struct xrdp_mcs* self, struct stream* s, int value) -{ - xrdp_mcs_ber_out_header(self, s, BER_TAG_INTEGER, 3); - out_uint8(s, (value >> 16)); - out_uint8(s, (value >> 8)); - out_uint8(s, value); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_out_domain_params(struct xrdp_mcs* self, struct stream* s, - int max_channels, - int max_users, int max_tokens, - int max_pdu_size) -{ - xrdp_mcs_ber_out_header(self, s, MCS_TAG_DOMAIN_PARAMS, 26); - xrdp_mcs_ber_out_int8(self, s, max_channels); - xrdp_mcs_ber_out_int8(self, s, max_users); - xrdp_mcs_ber_out_int8(self, s, max_tokens); - xrdp_mcs_ber_out_int8(self, s, 1); - xrdp_mcs_ber_out_int8(self, s, 0); - xrdp_mcs_ber_out_int8(self, s, 1); - xrdp_mcs_ber_out_int24(self, s, max_pdu_size); - xrdp_mcs_ber_out_int8(self, s, 2); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_send_connect_response(struct xrdp_mcs* self) -{ - int data_len; - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - data_len = self->server_mcs_data->end - self->server_mcs_data->data; - xrdp_iso_init(self->iso_layer, s); - xrdp_mcs_ber_out_header(self, s, MCS_CONNECT_RESPONSE, 313); - xrdp_mcs_ber_out_header(self, s, BER_TAG_RESULT, 1); - out_uint8(s, 0); - xrdp_mcs_ber_out_header(self, s, BER_TAG_INTEGER, 1); - out_uint8(s, 0); - xrdp_mcs_out_domain_params(self, s, 2, 2, 0, 0xffff); - xrdp_mcs_ber_out_header(self, s, BER_TAG_OCTET_STRING, data_len); - /* mcs data */ - out_uint8a(s, self->server_mcs_data->data, data_len); - s_mark_end(s); - if (xrdp_iso_send(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_incoming(struct xrdp_mcs* self) -{ - DEBUG((" in xrdp_mcs_incoming\n\r")); - if (xrdp_iso_incoming(self->iso_layer) != 0) - { - return 1; - } - if (xrdp_mcs_recv_connect_initial(self) != 0) - { - return 1; - } - if (xrdp_mcs_send_connect_response(self) != 0) - { - return 1; - } - if (xrdp_mcs_recv_edrq(self) != 0) - { - return 1; - } - if (xrdp_mcs_recv_aurq(self) != 0) - { - return 1; - } - if (xrdp_mcs_send_aucf(self) != 0) - { - return 1; - } - if (xrdp_mcs_recv_cjrq(self) != 0) - { - return 1; - } - if (xrdp_mcs_send_cjcf(self, self->userid + MCS_USERCHANNEL_BASE) != 0) - { - return 1; - } - if (xrdp_mcs_recv_cjrq(self) != 0) - { - return 1; - } - if (xrdp_mcs_send_cjcf(self, MCS_GLOBAL_CHANNEL) != 0) - { - return 1; - } - DEBUG((" out xrdp_mcs_incoming\n\r")); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_init(struct xrdp_mcs* self, struct stream* s) -{ - xrdp_iso_init(self->iso_layer, s); - s_push_layer(s, mcs_hdr, 8); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_send(struct xrdp_mcs* self, struct stream* s) -{ - int len; - - DEBUG((" in xrdp_mcs_send\n\r")); - s_pop_layer(s, mcs_hdr); - len = (s->end - s->p) - 8; - len = len | 0x8000; - out_uint8(s, MCS_SDIN << 2); - out_uint16_be(s, self->userid); - out_uint16_be(s, MCS_GLOBAL_CHANNEL); - out_uint8(s, 0x70); - out_uint16_be(s, len); - if (xrdp_iso_send(self->iso_layer, s) != 0) - { - return 1; - } - DEBUG((" out xrdp_mcs_send\n\r")); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_mcs_disconnect(struct xrdp_mcs* self) -{ - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_iso_init(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - out_uint8(s, (MCS_DPUM << 2) | 1); - out_uint8(s, 0x80); - s_mark_end(s); - if (xrdp_iso_send(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} diff --git a/xrdp/xrdp_orders.c b/xrdp/xrdp_orders.c deleted file mode 100644 index 7b5e1273..00000000 --- a/xrdp/xrdp_orders.c +++ /dev/null @@ -1,1536 +0,0 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - - orders - -*/ - -#include "xrdp.h" - -/*****************************************************************************/ -struct xrdp_orders* xrdp_orders_create(struct xrdp_process* owner, - struct xrdp_rdp* rdp_layer) -{ - struct xrdp_orders* self; - - self = (struct xrdp_orders*)g_malloc(sizeof(struct xrdp_orders), 1); - self->pro_layer = owner; - self->rdp_layer = rdp_layer; - make_stream(self->out_s); - init_stream(self->out_s, 8192); - return self; -} - -/*****************************************************************************/ -void xrdp_orders_delete(struct xrdp_orders* self) -{ - if (self == 0) - { - return; - } - free_stream(self->out_s); - g_free(self); -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_orders_init(struct xrdp_orders* self) -{ - self->order_level++; - if (self->order_level == 1) - { - self->order_count = 0; - /* is this big enough */ - if (xrdp_rdp_init_data(self->rdp_layer, self->out_s) != 0) - { - return 1; - } - out_uint16_le(self->out_s, RDP_UPDATE_ORDERS); - out_uint8s(self->out_s, 2); /* pad */ - self->order_count_ptr = self->out_s->p; - out_uint8s(self->out_s, 2); /* number of orders, set later */ - out_uint8s(self->out_s, 2); /* pad */ - } - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_orders_send(struct xrdp_orders* self) -{ - int rv; - - rv = 0; - if (self->order_level > 0) - { - self->order_level--; - if (self->order_level == 0 && self->order_count > 0) - { - s_mark_end(self->out_s); - DEBUG(("xrdp_orders_send sending %d orders\n\r", self->order_count)); - self->order_count_ptr[0] = self->order_count; - self->order_count_ptr[1] = self->order_count >> 8; - if (xrdp_rdp_send_data(self->rdp_layer, self->out_s, - RDP_DATA_PDU_UPDATE) != 0) - { - rv = 1; - } - } - } - return rv; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_orders_force_send(struct xrdp_orders* self) -{ - if (self->order_count > 0) - { - s_mark_end(self->out_s); - DEBUG(("xrdp_orders_force_send sending %d orders\n\r", self->order_count)); - self->order_count_ptr[0] = self->order_count; - self->order_count_ptr[1] = self->order_count >> 8; - if (xrdp_rdp_send_data(self->rdp_layer, self->out_s, - RDP_DATA_PDU_UPDATE) != 0) - { - return 1; - } - } - self->order_count = 0; - self->order_level = 0; - return 0; -} - -/*****************************************************************************/ -/* check if the current order will fix in packet size of 8192, if not */ -/* send what we got and init a new one */ -/* returns error */ -int xrdp_orders_check(struct xrdp_orders* self, int max_size) -{ - int size; - - if (self->order_level < 1) - { - if (max_size > 8000) - { - return 1; - } - else - { - return 0; - } - } - size = self->out_s->p - self->order_count_ptr; - if (size < 0 || size > 8192) - { - return 1; - } - if (size + max_size + 100 > 8000) - { - xrdp_orders_force_send(self); - xrdp_orders_init(self); - } - return 0; -} - -/*****************************************************************************/ -/* check if rect is the same as the last one sent */ -/* returns boolean */ -int xrdp_orders_last_bounds(struct xrdp_orders* self, - struct xrdp_rect* rect) -{ - if (rect == 0) - { - return 0; - } - if (rect->left == self->clip_left && - rect->top == self->clip_top && - rect->right == self->clip_right && - rect->bottom == self->clip_bottom) - { - return 1; - } - return 0; -} - -/*****************************************************************************/ -/* check if all coords are withing 256 bytes */ -/* returns boolean */ -int xrdp_orders_send_delta(struct xrdp_orders* self, int* vals, int count) -{ - int i; - - for (i = 0; i < count; i += 2) - { - if (g_abs(vals[i] - vals[i + 1]) >= 128) - { - return 0; - } - } - return 1; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_orders_out_bounds(struct xrdp_orders* self, struct xrdp_rect* rect) -{ - char* bounds_flags_ptr; - int bounds_flags; - - bounds_flags = 0; - bounds_flags_ptr = self->out_s->p; - out_uint8s(self->out_s, 1); - /* left */ - if (rect->left == self->clip_left) - { - } - else if (g_abs(rect->left - self->clip_left) < 128) - { - bounds_flags |= 0x10; - } - else - { - bounds_flags |= 0x01; - } - /* top */ - if (rect->top == self->clip_top) - { - } - else if (g_abs(rect->top - self->clip_top) < 128) - { - bounds_flags |= 0x20; - } - else - { - bounds_flags |= 0x02; - } - /* right */ - if (rect->right == self->clip_right) - { - } - else if (g_abs(rect->right - self->clip_right) < 128) - { - bounds_flags |= 0x40; - } - else - { - bounds_flags |= 0x04; - } - /* bottom */ - if (rect->bottom == self->clip_bottom) - { - } - else if (g_abs(rect->bottom - self->clip_bottom) < 128) - { - bounds_flags |= 0x80; - } - else - { - bounds_flags |= 0x08; - } - /* left */ - if (bounds_flags & 0x01) - { - out_uint16_le(self->out_s, rect->left); - } - else if (bounds_flags & 0x10) - { - out_uint8(self->out_s, rect->left - self->clip_left); - } - self->clip_left = rect->left; - /* top */ - if (bounds_flags & 0x02) - { - out_uint16_le(self->out_s, rect->top); - } - else if (bounds_flags & 0x20) - { - out_uint8(self->out_s, rect->top - self->clip_top); - } - self->clip_top = rect->top; - /* right */ - if (bounds_flags & 0x04) - { - out_uint16_le(self->out_s, rect->right); - } - else if (bounds_flags & 0x40) - { - out_uint8(self->out_s, rect->right - self->clip_right); - } - self->clip_right = rect->right; - /* bottom */ - if (bounds_flags & 0x08) - { - out_uint16_le(self->out_s, rect->bottom); - } - else if (bounds_flags & 0x80) - { - out_uint8(self->out_s, rect->bottom - self->clip_bottom); - } - self->clip_bottom = rect->bottom; - /* set flags */ - *bounds_flags_ptr = bounds_flags; - return 0; -} - -/*****************************************************************************/ -/* returns error */ -/* send a solid rect to client */ -/* max size 23 */ -int xrdp_orders_rect(struct xrdp_orders* self, int x, int y, int cx, int cy, - int color, struct xrdp_rect* rect) -{ - int order_flags; - int vals[8]; - int present; - char* present_ptr; - - xrdp_orders_check(self, 23); - self->order_count++; - order_flags = RDP_ORDER_STANDARD; - if (self->last_order != RDP_ORDER_RECT) - { - order_flags |= RDP_ORDER_CHANGE; - } - self->last_order = RDP_ORDER_RECT; - if (rect != 0) - { - order_flags |= RDP_ORDER_BOUNDS; - if (xrdp_orders_last_bounds(self, rect)) - { - order_flags |= RDP_ORDER_LASTBOUNDS; - } - } - vals[0] = x; - vals[1] = self->rect_x; - vals[2] = y; - vals[3] = self->rect_y; - vals[4] = cx; - vals[5] = self->rect_cx; - vals[6] = cy; - vals[7] = self->rect_cy; - if (xrdp_orders_send_delta(self, vals, 8)) - { - order_flags |= RDP_ORDER_DELTA; - } - out_uint8(self->out_s, order_flags) - if (order_flags & RDP_ORDER_CHANGE) - { - out_uint8(self->out_s, self->last_order); - } - present = 0; - present_ptr = self->out_s->p; /* hold 1 byte present pointer */ - out_uint8s(self->out_s, 1) - if ((order_flags & RDP_ORDER_BOUNDS) && - !(order_flags & RDP_ORDER_LASTBOUNDS)) - { - xrdp_orders_out_bounds(self, rect); - } - if (x != self->rect_x) - { - present |= 0x01; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, x - self->rect_x); - } - else - { - out_uint16_le(self->out_s, x); - } - self->rect_x = x; - } - if (y != self->rect_y) - { - present |= 0x02; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, y - self->rect_y); - } - else - { - out_uint16_le(self->out_s, y); - } - self->rect_y = y; - } - if (cx != self->rect_cx) - { - present |= 0x04; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, cx - self->rect_cx); - } - else - { - out_uint16_le(self->out_s, cx); - } - self->rect_cx = cx; - } - if (cy != self->rect_cy) - { - present |= 0x08; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, cy - self->rect_cy); - } - else - { - out_uint16_le(self->out_s, cy); - } - self->rect_cy = cy; - } - if ((color & 0xff) != (self->rect_color & 0xff)) - { - present |= 0x10; - self->rect_color = (self->rect_color & 0xffff00) | (color & 0xff); - out_uint8(self->out_s, color); - } - if ((color & 0xff00) != (self->rect_color & 0xff00)) - { - present |= 0x20; - self->rect_color = (self->rect_color & 0xff00ff) | (color & 0xff00); - out_uint8(self->out_s, color >> 8); - } - if ((color & 0xff0000) != (self->rect_color & 0xff0000)) - { - present |= 0x40; - self->rect_color = (self->rect_color & 0x00ffff) | (color & 0xff0000); - out_uint8(self->out_s, color >> 16); - } - present_ptr[0] = present; - return 0; -} - -/*****************************************************************************/ -/* returns error */ -/* send a screen blt order */ -/* max size 25 */ -int xrdp_orders_screen_blt(struct xrdp_orders* self, int x, int y, - int cx, int cy, int srcx, int srcy, - int rop, struct xrdp_rect* rect) -{ - int order_flags; - int vals[12]; - int present; - char* present_ptr; - - xrdp_orders_check(self, 25); - self->order_count++; - order_flags = RDP_ORDER_STANDARD; - if (self->last_order != RDP_ORDER_SCREENBLT) - { - order_flags |= RDP_ORDER_CHANGE; - } - self->last_order = RDP_ORDER_SCREENBLT; - if (rect != 0) - { - order_flags |= RDP_ORDER_BOUNDS; - if (xrdp_orders_last_bounds(self, rect)) - { - order_flags |= RDP_ORDER_LASTBOUNDS; - } - } - vals[0] = x; - vals[1] = self->scr_blt_x; - vals[2] = y; - vals[3] = self->scr_blt_y; - vals[4] = cx; - vals[5] = self->scr_blt_cx; - vals[6] = cy; - vals[7] = self->scr_blt_cy; - vals[8] = srcx; - vals[9] = self->scr_blt_srcx; - vals[10] = srcy; - vals[11] = self->scr_blt_srcy; - if (xrdp_orders_send_delta(self, vals, 12)) - { - order_flags |= RDP_ORDER_DELTA; - } - out_uint8(self->out_s, order_flags); - if (order_flags & RDP_ORDER_CHANGE) - { - out_uint8(self->out_s, self->last_order); - } - present = 0; - present_ptr = self->out_s->p; /* hold 1 byte present pointer */ - out_uint8s(self->out_s, 1) - if ((order_flags & RDP_ORDER_BOUNDS) && - !(order_flags & RDP_ORDER_LASTBOUNDS)) - { - xrdp_orders_out_bounds(self, rect); - } - if (x != self->scr_blt_x) - { - present |= 0x01; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, x - self->scr_blt_x); - } - else - { - out_uint16_le(self->out_s, x); - } - self->scr_blt_x = x; - } - if (y != self->scr_blt_y) - { - present |= 0x02; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, y - self->scr_blt_y); - } - else - { - out_uint16_le(self->out_s, y); - } - self->scr_blt_y = y; - } - if (cx != self->scr_blt_cx) - { - present |= 0x04; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, cx - self->scr_blt_cx); - } - else - { - out_uint16_le(self->out_s, cx); - } - self->scr_blt_cx = cx; - } - if (cy != self->scr_blt_cy) - { - present |= 0x08; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, cy - self->scr_blt_cy); - } - else - { - out_uint16_le(self->out_s, cy); - } - self->scr_blt_cy = cy; - } - if (rop != self->scr_blt_rop) - { - present |= 0x10; - out_uint8(self->out_s, rop); - self->scr_blt_rop = rop; - } - if (srcx != self->scr_blt_srcx) - { - present |= 0x20; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, srcx - self->scr_blt_srcx); - } - else - { - out_uint16_le(self->out_s, srcx); - } - self->scr_blt_srcx = srcx; - } - if (srcy != self->scr_blt_srcy) - { - present |= 0x40; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, srcy - self->scr_blt_srcy) - } - else - { - out_uint16_le(self->out_s, srcy) - } - self->scr_blt_srcy = srcy; - } - present_ptr[0] = present; - return 0; -} - -/*****************************************************************************/ -/* returns error */ -/* send a pat blt order */ -/* max size 39 */ -int xrdp_orders_pat_blt(struct xrdp_orders* self, int x, int y, - int cx, int cy, int rop, int bg_color, - int fg_color, struct xrdp_brush* brush, - struct xrdp_rect* rect) -{ - int order_flags; - int vals[8]; - int present; - char* present_ptr; - struct xrdp_brush blank_brush; - - xrdp_orders_check(self, 39); - self->order_count++; - order_flags = RDP_ORDER_STANDARD; - if (self->last_order != RDP_ORDER_PATBLT) - { - order_flags |= RDP_ORDER_CHANGE; - } - self->last_order = RDP_ORDER_PATBLT; - if (rect != 0) - { - order_flags |= RDP_ORDER_BOUNDS; - if (xrdp_orders_last_bounds(self, rect)) - { - order_flags |= RDP_ORDER_LASTBOUNDS; - } - } - vals[0] = x; - vals[1] = self->pat_blt_x; - vals[2] = y; - vals[3] = self->pat_blt_y; - vals[4] = cx; - vals[5] = self->pat_blt_cx; - vals[6] = cy; - vals[7] = self->pat_blt_cy; - if (xrdp_orders_send_delta(self, vals, 8)) - { - order_flags |= RDP_ORDER_DELTA; - } - out_uint8(self->out_s, order_flags); - if (order_flags & RDP_ORDER_CHANGE) - { - out_uint8(self->out_s, self->last_order); - } - present = 0; - present_ptr = self->out_s->p; /* hold 2 byte present pointer, todo */ - out_uint8s(self->out_s, 2) /* this can be smaller, */ - /* see RDP_ORDER_SMALL and RDP_ORDER_TINY */ - if ((order_flags & RDP_ORDER_BOUNDS) && - !(order_flags & RDP_ORDER_LASTBOUNDS)) - { - xrdp_orders_out_bounds(self, rect); - } - if (x != self->pat_blt_x) - { - present |= 0x0001; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, x - self->pat_blt_x); - } - else - { - out_uint16_le(self->out_s, x); - } - self->pat_blt_x = x; - } - if (y != self->pat_blt_y) - { - present |= 0x0002; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, y - self->pat_blt_y); - } - else - { - out_uint16_le(self->out_s, y); - } - self->pat_blt_y = y; - } - if (cx != self->pat_blt_cx) - { - present |= 0x0004; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, cx - self->pat_blt_cx); - } - else - { - out_uint16_le(self->out_s, cx); - } - self->pat_blt_cx = cx; - } - if (cy != self->pat_blt_cy) - { - present |= 0x0008; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, cy - self->pat_blt_cy); - } - else - { - out_uint16_le(self->out_s, cy); - } - self->pat_blt_cy = cy; - } - if (rop != self->pat_blt_rop) - { - present |= 0x0010; - /* PATCOPY PATPAINT PATINVERT DSTINVERT BLACKNESS WHITENESS */ - out_uint8(self->out_s, rop); - self->pat_blt_rop = rop; - } - if (bg_color != self->pat_blt_bg_color) - { - present |= 0x0020; - out_uint8(self->out_s, bg_color); - out_uint8(self->out_s, bg_color >> 8); - out_uint8(self->out_s, bg_color >> 16); - self->pat_blt_bg_color = bg_color; - } - if (fg_color != self->pat_blt_fg_color) - { - present |= 0x0040; - out_uint8(self->out_s, fg_color); - out_uint8(self->out_s, fg_color >> 8); - out_uint8(self->out_s, fg_color >> 16); - self->pat_blt_fg_color = fg_color; - } - if (brush == 0) /* if nil use blank one */ - { /* todo can we just set style to zero */ - g_memset(&blank_brush, 0, sizeof(struct xrdp_brush)); - brush = &blank_brush; - } - if (brush->x_orgin != self->pat_blt_brush.x_orgin) - { - present |= 0x0080; - out_uint8(self->out_s, brush->x_orgin); - self->pat_blt_brush.x_orgin = brush->x_orgin; - } - if (brush->y_orgin != self->pat_blt_brush.y_orgin) - { - present |= 0x0100; - out_uint8(self->out_s, brush->y_orgin); - self->pat_blt_brush.y_orgin = brush->y_orgin; - } - if (brush->style != self->pat_blt_brush.style) - { - present |= 0x0200; - out_uint8(self->out_s, brush->style); - self->pat_blt_brush.style = brush->style; - } - if (brush->pattern[0] != self->pat_blt_brush.pattern[0]) - { - present |= 0x0400; - out_uint8(self->out_s, brush->pattern[0]); - self->pat_blt_brush.pattern[0] = brush->pattern[0]; - } - if (g_memcmp(brush->pattern + 1, self->pat_blt_brush.pattern + 1, 7) != 0) - { - present |= 0x0800; - out_uint8a(self->out_s, brush->pattern + 1, 7); - g_memcpy(self->pat_blt_brush.pattern + 1, brush->pattern + 1, 7); - } - present_ptr[0] = present; - present_ptr[1] = present >> 8; - return 0; -} - -/*****************************************************************************/ -/* returns error */ -/* send a dest blt order */ -/* max size 21 */ -int xrdp_orders_dest_blt(struct xrdp_orders* self, int x, int y, - int cx, int cy, int rop, - struct xrdp_rect* rect) -{ - int order_flags; - int vals[8]; - int present; - char* present_ptr; - - xrdp_orders_check(self, 21); - self->order_count++; - order_flags = RDP_ORDER_STANDARD; - if (self->last_order != RDP_ORDER_DESTBLT) - { - order_flags |= RDP_ORDER_CHANGE; - } - self->last_order = RDP_ORDER_DESTBLT; - if (rect != 0) - { - order_flags |= RDP_ORDER_BOUNDS; - if (xrdp_orders_last_bounds(self, rect)) - { - order_flags |= RDP_ORDER_LASTBOUNDS; - } - } - vals[0] = x; - vals[1] = self->dest_blt_x; - vals[2] = y; - vals[3] = self->dest_blt_y; - vals[4] = cx; - vals[5] = self->dest_blt_cx; - vals[6] = cy; - vals[7] = self->dest_blt_cy; - if (xrdp_orders_send_delta(self, vals, 8)) - { - order_flags |= RDP_ORDER_DELTA; - } - out_uint8(self->out_s, order_flags); - if (order_flags & RDP_ORDER_CHANGE) - { - out_uint8(self->out_s, self->last_order) - } - present = 0; - present_ptr = self->out_s->p; /* hold 1 byte present pointer */ - out_uint8s(self->out_s, 1) - if ((order_flags & RDP_ORDER_BOUNDS) && - !(order_flags & RDP_ORDER_LASTBOUNDS)) - { - xrdp_orders_out_bounds(self, rect); - } - if (x != self->dest_blt_x) - { - present |= 0x01; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, x - self->dest_blt_x); - } - else - { - out_uint16_le(self->out_s, x); - } - self->dest_blt_x = x; - } - if (y != self->dest_blt_y) - { - present |= 0x02; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, y - self->dest_blt_y); - } - else - { - out_uint16_le(self->out_s, y); - } - self->dest_blt_y = y; - } - if (cx != self->dest_blt_cx) - { - present |= 0x04; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, cx - self->dest_blt_cx); - } - else - { - out_uint16_le(self->out_s, cx); - } - self->dest_blt_cx = cx; - } - if (cy != self->dest_blt_cy) - { - present |= 0x08; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, cy - self->dest_blt_cy); - } - else - { - out_uint16_le(self->out_s, cy); - } - self->dest_blt_cy = cy; - } - if (rop != self->dest_blt_rop) - { - present |= 0x10; - out_uint8(self->out_s, rop); - self->dest_blt_rop = rop; - } - present_ptr[0] = present; - return 0; -} - -/*****************************************************************************/ -/* returns error */ -/* send a line order */ -/* max size 32 */ -int xrdp_orders_line(struct xrdp_orders* self, int mix_mode, - int startx, int starty, - int endx, int endy, int rop, int bg_color, - struct xrdp_pen* pen, - struct xrdp_rect* rect) -{ - int order_flags; - int vals[8]; - int present; - char* present_ptr; - struct xrdp_pen blank_pen; - - xrdp_orders_check(self, 32); - self->order_count++; - order_flags = RDP_ORDER_STANDARD; - if (self->last_order != RDP_ORDER_LINE) - { - order_flags |= RDP_ORDER_CHANGE; - } - self->last_order = RDP_ORDER_LINE; - if (rect != 0) - { - order_flags |= RDP_ORDER_BOUNDS; - if (xrdp_orders_last_bounds(self, rect)) - { - order_flags |= RDP_ORDER_LASTBOUNDS; - } - } - vals[0] = startx; - vals[1] = self->line_startx; - vals[2] = starty; - vals[3] = self->line_starty; - vals[4] = endx; - vals[5] = self->line_endx; - vals[6] = endy; - vals[7] = self->line_endy; - if (xrdp_orders_send_delta(self, vals, 8)) - { - order_flags |= RDP_ORDER_DELTA; - } - out_uint8(self->out_s, order_flags); - if (order_flags & RDP_ORDER_CHANGE) - { - out_uint8(self->out_s, self->last_order); - } - present = 0; - present_ptr = self->out_s->p; /* hold 2 byte present pointer */ - out_uint8s(self->out_s, 2) - if ((order_flags & RDP_ORDER_BOUNDS) && - !(order_flags & RDP_ORDER_LASTBOUNDS)) - { - xrdp_orders_out_bounds(self, rect); - } - if (mix_mode != self->line_mix_mode) - { - present |= 0x0001; - out_uint16_le(self->out_s, mix_mode) - self->line_mix_mode = mix_mode; - } - if (startx != self->line_startx) - { - present |= 0x0002; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, startx - self->line_startx); - } - else - { - out_uint16_le(self->out_s, startx); - } - self->line_startx = startx; - } - if (starty != self->line_starty) - { - present |= 0x0004; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, starty - self->line_starty); - } - else - { - out_uint16_le(self->out_s, starty); - } - self->line_starty = starty; - } - if (endx != self->line_endx) - { - present |= 0x0008; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, endx - self->line_endx); - } - else - { - out_uint16_le(self->out_s, endx); - } - self->line_endx = endx; - } - if (endy != self->line_endy) - { - present |= 0x0010; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, endy - self->line_endy); - } - else - { - out_uint16_le(self->out_s, endy); - } - self->line_endy = endy; - } - if (bg_color != self->line_bg_color) - { - present |= 0x0020; - out_uint8(self->out_s, bg_color) - out_uint8(self->out_s, bg_color >> 8) - out_uint8(self->out_s, bg_color >> 16) - self->line_bg_color = bg_color; - } - if (rop != self->line_rop) - { - present |= 0x0040; - out_uint8(self->out_s, rop) - self->line_rop = rop; - } - if (pen == 0) - { - g_memset(&blank_pen, 0, sizeof(struct xrdp_pen)); - pen = &blank_pen; - } - if (pen->style != self->line_pen.style) - { - present |= 0x0080; - out_uint8(self->out_s, pen->style) - self->line_pen.style = pen->style; - } - if (pen->width != self->line_pen.width) - { - present |= 0x0100; - out_uint8(self->out_s, pen->width) - self->line_pen.width = pen->width; - } - if (pen->color != self->line_pen.color) - { - present |= 0x0200; - out_uint8(self->out_s, pen->color) - out_uint8(self->out_s, pen->color >> 8) - out_uint8(self->out_s, pen->color >> 16) - self->line_pen.color = pen->color; - } - present_ptr[0] = present; - present_ptr[1] = present >> 8; - return 0; -} - -/*****************************************************************************/ -/* returns error */ -/* send a mem blt order */ -/* max size 30 */ -int xrdp_orders_mem_blt(struct xrdp_orders* self, int cache_id, - int color_table, int x, int y, int cx, int cy, - int rop, int srcx, int srcy, - int cache_idx, struct xrdp_rect* rect) -{ - int order_flags; - int vals[12]; - int present; - char* present_ptr; - - xrdp_orders_check(self, 30); - self->order_count++; - order_flags = RDP_ORDER_STANDARD; - if (self->last_order != RDP_ORDER_MEMBLT) - { - order_flags |= RDP_ORDER_CHANGE; - } - self->last_order = RDP_ORDER_MEMBLT; - if (rect != 0) - { - order_flags |= RDP_ORDER_BOUNDS; - if (xrdp_orders_last_bounds(self, rect)) - { - order_flags |= RDP_ORDER_LASTBOUNDS; - } - } - vals[0] = x; - vals[1] = self->mem_blt_x; - vals[2] = y; - vals[3] = self->mem_blt_y; - vals[4] = cx; - vals[5] = self->mem_blt_cx; - vals[6] = cy; - vals[7] = self->mem_blt_cy; - vals[8] = srcx; - vals[9] = self->mem_blt_srcx; - vals[10] = srcy; - vals[11] = self->mem_blt_srcy; - if (xrdp_orders_send_delta(self, vals, 12)) - { - order_flags |= RDP_ORDER_DELTA; - } - out_uint8(self->out_s, order_flags); - if (order_flags & RDP_ORDER_CHANGE) - { - out_uint8(self->out_s, self->last_order) - } - present = 0; - present_ptr = self->out_s->p; /* hold 2 byte present pointer, todo */ - out_uint8s(self->out_s, 2) /* this can be smaller, */ - /* see RDP_ORDER_SMALL and RDP_ORDER_TINY */ - if ((order_flags & RDP_ORDER_BOUNDS) && - !(order_flags & RDP_ORDER_LASTBOUNDS)) - { - xrdp_orders_out_bounds(self, rect); - } - if (cache_id != self->mem_blt_cache_id || - color_table != self->mem_blt_color_table) - { - present |= 0x0001; - out_uint8(self->out_s, cache_id); - out_uint8(self->out_s, color_table); - self->mem_blt_cache_id = cache_id; - self->mem_blt_color_table = color_table; - } - if (x != self->mem_blt_x) - { - present |= 0x0002; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, x - self->mem_blt_x); - } - else - { - out_uint16_le(self->out_s, x); - } - self->mem_blt_x = x; - } - if (y != self->mem_blt_y) - { - present |= 0x0004; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, y - self->mem_blt_y); - } - else - { - out_uint16_le(self->out_s, y); - } - self->mem_blt_y = y; - } - if (cx != self->mem_blt_cx) - { - present |= 0x0008; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, cx - self->mem_blt_cx); - } - else - { - out_uint16_le(self->out_s, cx); - } - self->mem_blt_cx = cx; - } - if (cy != self->mem_blt_cy) - { - present |= 0x0010; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, cy - self->mem_blt_cy); - } - else - { - out_uint16_le(self->out_s, cy); - } - self->mem_blt_cy = cy; - } - if (rop != self->mem_blt_rop) - { - present |= 0x0020; - out_uint8(self->out_s, rop); - self->mem_blt_rop = rop; - } - if (srcx != self->mem_blt_srcx) - { - present |= 0x0040; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, srcx - self->mem_blt_srcx); - } - else - { - out_uint16_le(self->out_s, srcx); - } - self->mem_blt_srcx = srcx; - } - if (srcy != self->mem_blt_srcy) - { - present |= 0x0080; - if (order_flags & RDP_ORDER_DELTA) - { - out_uint8(self->out_s, srcy - self->mem_blt_srcy); - } - else - { - out_uint16_le(self->out_s, srcy); - } - self->mem_blt_srcy = srcy; - } - if (cache_idx != self->mem_blt_cache_idx) - { - present |= 0x0100; - out_uint16_le(self->out_s, cache_idx); - self->mem_blt_cache_idx = cache_idx; - } - present_ptr[0] = present; - present_ptr[1] = present >> 8; - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_orders_text(struct xrdp_orders* self, - int font, int flags, int mixmode, - int fg_color, int bg_color, - int clip_left, int clip_top, - int clip_right, int clip_bottom, - int box_left, int box_top, - int box_right, int box_bottom, - int x, int y, char* data, int data_len, - struct xrdp_rect* rect) -{ - int order_flags; - int present; - char* present_ptr; - - xrdp_orders_check(self, 100); - self->order_count++; - order_flags = RDP_ORDER_STANDARD; - if (self->last_order != RDP_ORDER_TEXT2) - { - order_flags |= RDP_ORDER_CHANGE; - } - self->last_order = RDP_ORDER_TEXT2; - if (rect != 0) - { - order_flags |= RDP_ORDER_BOUNDS; - if (xrdp_orders_last_bounds(self, rect)) - { - order_flags |= RDP_ORDER_LASTBOUNDS; - } - } - out_uint8(self->out_s, order_flags); - if (order_flags & RDP_ORDER_CHANGE) - { - out_uint8(self->out_s, self->last_order); - } - present = 0; - present_ptr = self->out_s->p; /* hold 3 byte present pointer, todo */ - out_uint8s(self->out_s, 3) /* this can be smaller, */ - /* see RDP_ORDER_SMALL and RDP_ORDER_TINY */ - if ((order_flags & RDP_ORDER_BOUNDS) && - !(order_flags & RDP_ORDER_LASTBOUNDS)) - { - xrdp_orders_out_bounds(self, rect); - } - if (font != self->text_font) - { - present |= 0x000001; - out_uint8(self->out_s, font); - self->text_font = font; - } - if (flags != self->text_flags) - { - present |= 0x000002; - out_uint8(self->out_s, flags); - self->text_flags = flags; - } - /* unknown */ - if (mixmode != self->text_mixmode) - { - present |= 0x000008; - out_uint8(self->out_s, mixmode); - self->text_mixmode = mixmode; - } - if (fg_color != self->text_fg_color) - { - present |= 0x000010; - out_uint8(self->out_s, fg_color) - out_uint8(self->out_s, fg_color >> 8) - out_uint8(self->out_s, fg_color >> 16) - self->text_fg_color = fg_color; - } - if (bg_color != self->text_bg_color) - { - present |= 0x000020; - out_uint8(self->out_s, bg_color) - out_uint8(self->out_s, bg_color >> 8) - out_uint8(self->out_s, bg_color >> 16) - self->text_bg_color = bg_color; - } - if (clip_left != self->text_clip_left) - { - present |= 0x000040; - out_uint16_le(self->out_s, clip_left); - self->text_clip_left = clip_left; - } - if (clip_top != self->text_clip_top) - { - present |= 0x000080; - out_uint16_le(self->out_s, clip_top); - self->text_clip_top = clip_top; - } - if (clip_right != self->text_clip_right) - { - present |= 0x000100; - out_uint16_le(self->out_s, clip_right); - self->text_clip_right = clip_right; - } - if (clip_bottom != self->text_clip_bottom) - { - present |= 0x000200; - out_uint16_le(self->out_s, clip_bottom); - self->text_clip_bottom = clip_bottom; - } - if (box_left != self->text_box_left) - { - present |= 0x000400; - out_uint16_le(self->out_s, box_left); - self->text_box_left = box_left; - } - if (box_top != self->text_box_top) - { - present |= 0x000800; - out_uint16_le(self->out_s, box_top); - self->text_box_top = box_top; - } - if (box_right != self->text_box_right) - { - present |= 0x001000; - out_uint16_le(self->out_s, box_right); - self->text_box_right = box_right; - } - if (box_bottom != self->text_box_bottom) - { - present |= 0x002000; - out_uint16_le(self->out_s, box_bottom); - self->text_box_bottom = box_bottom; - } - if (x != self->text_x) - { - present |= 0x080000; - out_uint16_le(self->out_s, x); - self->text_x = x; - } - if (y != self->text_y) - { - present |= 0x100000; - out_uint16_le(self->out_s, y); - self->text_y = y; - } - { - /* always send text */ - present |= 0x200000; - out_uint8(self->out_s, data_len); - out_uint8a(self->out_s, data, data_len); - } - /* send 3 byte present */ - present_ptr[0] = present; - present_ptr[1] = present >> 8; - present_ptr[2] = present >> 16; - return 0; -} - -/*****************************************************************************/ -/* returns error */ -/* when a palette gets sent, send the main palette too */ -int xrdp_orders_send_palette(struct xrdp_orders* self, int* palette, - int cache_id) -{ - int order_flags; - int len; - int i; - - xrdp_orders_check(self, 2000); - self->order_count++; - order_flags = RDP_ORDER_STANDARD | RDP_ORDER_SECONDARY; - out_uint8(self->out_s, order_flags); - len = 1027 - 7; /* length after type minus 7 */ - out_uint16_le(self->out_s, len); - out_uint16_le(self->out_s, 0); /* flags */ - out_uint8(self->out_s, RDP_ORDER_COLCACHE); /* type */ - out_uint8(self->out_s, cache_id); - out_uint16_le(self->out_s, 256); /* num colors */ - for (i = 0; i < 256; i++) - { - out_uint8(self->out_s, palette[i]); - out_uint8(self->out_s, palette[i] >> 8); - out_uint8(self->out_s, palette[i] >> 16); - out_uint8(self->out_s, 0); - } - return 0; -} - -/*****************************************************************************/ -/* returns error */ -/* max size width * height * Bpp + 16 */ -int xrdp_orders_send_raw_bitmap(struct xrdp_orders* self, - struct xrdp_bitmap* bitmap, - int cache_id, int cache_idx) -{ - int order_flags; - int len; - int bufsize; - int Bpp; - int i; - int j; - int pixel; - int e; - - e = bitmap->width % 4; - if (e != 0) - { - e = 4 - e; - } - Bpp = (bitmap->bpp + 7) / 8; - bufsize = (bitmap->width + e) * bitmap->height * Bpp; - xrdp_orders_check(self, bufsize + 16); - self->order_count++; - order_flags = RDP_ORDER_STANDARD | RDP_ORDER_SECONDARY; - out_uint8(self->out_s, order_flags); - len = (bufsize + 9) - 7; /* length after type minus 7 */ - out_uint16_le(self->out_s, len); - out_uint16_le(self->out_s, 8); /* flags */ - out_uint8(self->out_s, RDP_ORDER_RAW_BMPCACHE); /* type */ - out_uint8(self->out_s, cache_id); - out_uint8s(self->out_s, 1); /* pad */ - out_uint8(self->out_s, bitmap->width + e); - out_uint8(self->out_s, bitmap->height); - out_uint8(self->out_s, bitmap->bpp); - out_uint16_le(self->out_s, bufsize); - out_uint16_le(self->out_s, cache_idx); - for (i = bitmap->height - 1; i >= 0; i--) - { - for (j = 0; j < bitmap->width; j++) - { - pixel = xrdp_bitmap_get_pixel(bitmap, j, i); - if (Bpp == 3) - { - out_uint8(self->out_s, pixel >> 16); - out_uint8(self->out_s, pixel >> 8); - out_uint8(self->out_s, pixel); - } - else if (Bpp == 2) - { - out_uint8(self->out_s, pixel); - out_uint8(self->out_s, pixel >> 8); - } - else if (Bpp == 1) - { - out_uint8(self->out_s, pixel); - } - } - for (j = 0; j < e; j++) - { - out_uint8s(self->out_s, Bpp); - } - } - return 0; -} - -/*****************************************************************************/ -/* returns error */ -/* max size width * height * Bpp + 16 */ -int xrdp_orders_send_bitmap(struct xrdp_orders* self, - struct xrdp_bitmap* bitmap, - int cache_id, int cache_idx) -{ - int order_flags; - int len; - int bufsize; - int Bpp; - int i; - int lines_sending; - int e; - struct stream* s; - struct stream* temp_s; - char* p; - - if (bitmap->width > 64) - { - g_printf("error, width > 64\n\r"); - return 1; - } - if (bitmap->height > 64) - { - g_printf("error, height > 64\n\r"); - return 1; - } - e = bitmap->width % 4; - if (e != 0) - { - e = 4 - e; - } - make_stream(s); - init_stream(s, 8192); - make_stream(temp_s); - init_stream(temp_s, 8192); - p = s->p; - i = bitmap->height; - lines_sending = xrdp_bitmap_compress(bitmap->data, bitmap->width, - bitmap->height, - s, bitmap->bpp, - 8192, - i - 1, temp_s, e); - if (lines_sending != bitmap->height) - { - free_stream(s); - free_stream(temp_s); - g_printf("error in xrdp_orders_send_bitmap, lines_sending(%d) != \ -bitmap->height(%d)\n\r", lines_sending, bitmap->height); - return 1; - } - bufsize = s->p - p; - Bpp = (bitmap->bpp + 7) / 8; - xrdp_orders_check(self, bufsize + 16); - self->order_count++; - order_flags = RDP_ORDER_STANDARD | RDP_ORDER_SECONDARY; - out_uint8(self->out_s, order_flags); - len = (bufsize + 9 + 8) - 7; /* length after type minus 7 */ - out_uint16_le(self->out_s, len); - out_uint16_le(self->out_s, 8); /* flags */ - out_uint8(self->out_s, RDP_ORDER_BMPCACHE); /* type */ - out_uint8(self->out_s, cache_id); - out_uint8s(self->out_s, 1); /* pad */ - out_uint8(self->out_s, bitmap->width + e); - out_uint8(self->out_s, bitmap->height); - out_uint8(self->out_s, bitmap->bpp); - out_uint16_le(self->out_s, bufsize + 8); - out_uint16_le(self->out_s, cache_idx); - out_uint8s(self->out_s, 2); /* pad */ - out_uint16_le(self->out_s, bufsize); - out_uint16_le(self->out_s, (bitmap->width + e) * Bpp); /* line size */ - out_uint16_le(self->out_s, (bitmap->width + e) * - Bpp * bitmap->height); /* final size */ - out_uint8a(self->out_s, s->data, bufsize); - free_stream(s); - free_stream(temp_s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -/* max size datasize + 18*/ -/* todo, only sends one for now */ -int xrdp_orders_send_font(struct xrdp_orders* self, - struct xrdp_font_item* font_item, - int font_index, int char_index) -{ - int order_flags; - int datasize; - int len; - - datasize = FONT_DATASIZE(font_item); - xrdp_orders_check(self, datasize + 18); - self->order_count++; - order_flags = RDP_ORDER_STANDARD | RDP_ORDER_SECONDARY; - out_uint8(self->out_s, order_flags); - len = (datasize + 12) - 7; /* length after type minus 7 */ - out_uint16_le(self->out_s, len); - out_uint16_le(self->out_s, 8); /* flags */ - out_uint8(self->out_s, RDP_ORDER_FONTCACHE); /* type */ - out_uint8(self->out_s, font_index); - out_uint8(self->out_s, 1); /* num of chars */ - out_uint16_le(self->out_s, char_index); - out_uint16_le(self->out_s, font_item->offset); - out_uint16_le(self->out_s, font_item->baseline); - out_uint16_le(self->out_s, font_item->width); - out_uint16_le(self->out_s, font_item->height); - out_uint8a(self->out_s, font_item->data, datasize); - return 0; -} diff --git a/xrdp/xrdp_painter.c b/xrdp/xrdp_painter.c index 357b8250..a2ddbe55 100644 --- a/xrdp/xrdp_painter.c +++ b/xrdp/xrdp_painter.c @@ -23,20 +23,22 @@ #include "xrdp.h" /*****************************************************************************/ -struct xrdp_painter* xrdp_painter_create(struct xrdp_wm* wm) +struct xrdp_painter* APP_CC +xrdp_painter_create(struct xrdp_wm* wm, struct xrdp_session* session) { struct xrdp_painter* self; self = (struct xrdp_painter*)g_malloc(sizeof(struct xrdp_painter), 1); self->wm = wm; - self->orders = wm->orders; + self->session = session; self->rop = 0xcc; /* copy */ self->clip_children = 1; return self; } /*****************************************************************************/ -void xrdp_painter_delete(struct xrdp_painter* self) +void APP_CC +xrdp_painter_delete(struct xrdp_painter* self) { if (self == 0) { @@ -47,21 +49,24 @@ void xrdp_painter_delete(struct xrdp_painter* self) } /*****************************************************************************/ -int xrdp_painter_begin_update(struct xrdp_painter* self) +int APP_CC +xrdp_painter_begin_update(struct xrdp_painter* self) { - xrdp_orders_init(self->orders); + libxrdp_orders_init(self->session); return 0; } /*****************************************************************************/ -int xrdp_painter_end_update(struct xrdp_painter* self) +int APP_CC +xrdp_painter_end_update(struct xrdp_painter* self) { - xrdp_orders_send(self->orders); + libxrdp_orders_send(self->session); return 0; } /*****************************************************************************/ -int xrdp_painter_font_needed(struct xrdp_painter* self) +int APP_CC +xrdp_painter_font_needed(struct xrdp_painter* self) { if (self->font == 0) { @@ -72,8 +77,9 @@ int xrdp_painter_font_needed(struct xrdp_painter* self) /*****************************************************************************/ /* returns boolean, true if there is something to draw */ -int xrdp_painter_clip_adj(struct xrdp_painter* self, int* x, int* y, - int* cx, int* cy) +int APP_CC +xrdp_painter_clip_adj(struct xrdp_painter* self, int* x, int* y, + int* cx, int* cy) { int dx; int dy; @@ -122,8 +128,9 @@ int xrdp_painter_clip_adj(struct xrdp_painter* self, int* x, int* y, } /*****************************************************************************/ -int xrdp_painter_set_clip(struct xrdp_painter* self, - int x, int y, int cx, int cy) +int APP_CC +xrdp_painter_set_clip(struct xrdp_painter* self, + int x, int y, int cx, int cy) { self->use_clip = 1; self->clip.left = x; @@ -134,14 +141,16 @@ int xrdp_painter_set_clip(struct xrdp_painter* self, } /*****************************************************************************/ -int xrdp_painter_clr_clip(struct xrdp_painter* self) +int APP_CC +xrdp_painter_clr_clip(struct xrdp_painter* self) { self->use_clip = 0; return 0; } /*****************************************************************************/ -int xrdp_painter_rop(int rop, int src, int dst) +int APP_CC +xrdp_painter_rop(int rop, int src, int dst) { switch (rop & 0x0f) { @@ -167,9 +176,10 @@ int xrdp_painter_rop(int rop, int src, int dst) /*****************************************************************************/ /* fill in an area of the screen with one color */ -int xrdp_painter_fill_rect(struct xrdp_painter* self, - struct xrdp_bitmap* bitmap, - int x, int y, int cx, int cy) +int APP_CC +xrdp_painter_fill_rect(struct xrdp_painter* self, + struct xrdp_bitmap* bitmap, + int x, int y, int cx, int cy) { int i; struct xrdp_region* region; @@ -201,10 +211,10 @@ int xrdp_painter_fill_rect(struct xrdp_painter* self, DEBUG(("sending rect order %d %d %d %d\n\r", rect.left, rect.top, rect.right, rect.bottom)); - xrdp_orders_rect(self->orders, rect.left, rect.top, - rect.right - rect.left, - rect.bottom - rect.top, - self->fg_color, 0); + libxrdp_orders_rect(self->session, rect.left, rect.top, + rect.right - rect.left, + rect.bottom - rect.top, + self->fg_color, 0); } i++; } @@ -215,9 +225,10 @@ int xrdp_painter_fill_rect(struct xrdp_painter* self, /*****************************************************************************/ /* fill in an area of the screen with opcodes and patterns */ /* todo, this needs work */ -int xrdp_painter_fill_rect2(struct xrdp_painter* self, - struct xrdp_bitmap* bitmap, - int x, int y, int cx, int cy) +int APP_CC +xrdp_painter_fill_rect2(struct xrdp_painter* self, + struct xrdp_bitmap* bitmap, + int x, int y, int cx, int cy) { int i; struct xrdp_region* region; @@ -249,11 +260,11 @@ int xrdp_painter_fill_rect2(struct xrdp_painter* self, DEBUG(("sending rect2 order %d %d %d %d\n\r", rect.left, rect.top, rect.right, rect.bottom)); - xrdp_orders_pat_blt(self->orders, rect.left, rect.top, - rect.right - rect.left, - rect.bottom - rect.top, - self->rop, self->bg_color, self->fg_color, - &self->brush, 0); + libxrdp_orders_pat_blt(self->session, rect.left, rect.top, + rect.right - rect.left, + rect.bottom - rect.top, + self->rop, self->bg_color, self->fg_color, + &self->brush, 0); } i++; } @@ -265,10 +276,11 @@ int xrdp_painter_fill_rect2(struct xrdp_painter* self, #define SSH 60 /*****************************************************************************/ -int xrdp_painter_draw_bitmap(struct xrdp_painter* self, - struct xrdp_bitmap* bitmap, - struct xrdp_bitmap* to_draw, - int x, int y, int cx, int cy) +int APP_CC +xrdp_painter_draw_bitmap(struct xrdp_painter* self, + struct xrdp_bitmap* bitmap, + struct xrdp_bitmap* to_draw, + int x, int y, int cx, int cy) { int i; int j; @@ -395,9 +407,9 @@ int xrdp_painter_draw_bitmap(struct xrdp_painter* self, cache_id, palette_id, x1, y1, w, h, self->rop, srcx, srcy, cache_idx)); - xrdp_orders_mem_blt(self->orders, cache_id, palette_id, - x1, y1, w, h, self->rop, srcx, srcy, - cache_idx, &rect1); + libxrdp_orders_mem_blt(self->session, cache_id, palette_id, + x1, y1, w, h, self->rop, srcx, srcy, + cache_idx, &rect1); } } } @@ -412,7 +424,7 @@ int xrdp_painter_draw_bitmap(struct xrdp_painter* self, else /* no bitmap cache */ { /* make sure there is no waiting orders */ - xrdp_orders_force_send(self->orders); + libxrdp_orders_force_send(self->session); k = 0; while (xrdp_region_get_rect(region, k, &rect) == 0) { @@ -432,12 +444,13 @@ int xrdp_painter_draw_bitmap(struct xrdp_painter* self, } /*****************************************************************************/ -int xrdp_painter_text_width(struct xrdp_painter* self, char* text) +int APP_CC +xrdp_painter_text_width(struct xrdp_painter* self, char* text) { int index; int rv; int len; - struct xrdp_font_item* font_item; + struct xrdp_font_char* font_item; xrdp_painter_font_needed(self); if (text == 0) @@ -455,12 +468,13 @@ int xrdp_painter_text_width(struct xrdp_painter* self, char* text) } /*****************************************************************************/ -int xrdp_painter_text_height(struct xrdp_painter* self, char* text) +int APP_CC +xrdp_painter_text_height(struct xrdp_painter* self, char* text) { int index; int rv; int len; - struct xrdp_font_item* font_item; + struct xrdp_font_char* font_item; xrdp_painter_font_needed(self); if (text == 0) @@ -478,9 +492,10 @@ int xrdp_painter_text_height(struct xrdp_painter* self, char* text) } /*****************************************************************************/ -int xrdp_painter_draw_text(struct xrdp_painter* self, - struct xrdp_bitmap* bitmap, - int x, int y, char* text) +int APP_CC +xrdp_painter_draw_text(struct xrdp_painter* self, + struct xrdp_bitmap* bitmap, + int x, int y, char* text) { int i; int f; @@ -500,7 +515,7 @@ int xrdp_painter_draw_text(struct xrdp_painter* self, struct xrdp_rect draw_rect; struct xrdp_bitmap* b; struct xrdp_font* font; - struct xrdp_font_item* font_item; + struct xrdp_font_char* font_item; len = g_strlen(text); if (len < 1) @@ -586,11 +601,11 @@ int xrdp_painter_draw_text(struct xrdp_painter* self, 0, 0, 0, 0, x1, y1, len, draw_rect.left, draw_rect.top, draw_rect.right, draw_rect.bottom)); - xrdp_orders_text(self->orders, f, flags, 0, - font->color, 0, - x - 1, y - 1, x + total_width, y + total_height, - 0, 0, 0, 0, - x1, y1, data, len * 2, &draw_rect); + libxrdp_orders_text(self->session, f, flags, 0, + font->color, 0, + x - 1, y - 1, x + total_width, y + total_height, + 0, 0, 0, 0, + x1, y1, data, len * 2, &draw_rect); } } k++; diff --git a/xrdp/xrdp_process.c b/xrdp/xrdp_process.c index 72c39ff5..34038755 100644 --- a/xrdp/xrdp_process.c +++ b/xrdp/xrdp_process.c @@ -23,7 +23,8 @@ #include "xrdp.h" /*****************************************************************************/ -struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner) +struct xrdp_process* APP_CC +xrdp_process_create(struct xrdp_listen* owner) { struct xrdp_process* self; @@ -33,87 +34,50 @@ struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner) } /*****************************************************************************/ -void xrdp_process_delete(struct xrdp_process* self) +void APP_CC +xrdp_process_delete(struct xrdp_process* self) { if (self == 0) { return; } - xrdp_rdp_delete(self->rdp_layer); - xrdp_orders_delete(self->orders); + libxrdp_exit(self->session); xrdp_wm_delete(self->wm); g_free(self); } /*****************************************************************************/ -int xrdp_process_loop(struct xrdp_process* self, struct stream* s) +int APP_CC +xrdp_process_loop(struct xrdp_process* self) { - int cont; int rv; - int code; - code = 0; rv = 0; - cont = 1; - while (cont && !self->term) + if (self->session != 0) { - if (xrdp_rdp_recv(self->rdp_layer, s, &code) != 0) - { - rv = 1; - break; - } - DEBUG(("xrdp_process_main_loop code %d\n\r", code)); - switch (code) - { - case -1: - xrdp_rdp_send_demand_active(self->rdp_layer); - break; - case 0: - break; - case RDP_PDU_CONFIRM_ACTIVE: /* 3 */ - xrdp_rdp_process_confirm_active(self->rdp_layer, s); - break; - case RDP_PDU_DATA: /* 7 */ - if (xrdp_rdp_process_data(self->rdp_layer, s) != 0) - { - DEBUG(("xrdp_rdp_process_data returned non zero\n\r")); - cont = 0; - self->term = 1; - } - break; - default: - g_printf("unknown in xrdp_process_main_loop\n\r"); - break; - } - if (cont) - { - cont = s->next_packet < s->end; - } + rv = libxrdp_process_data(self->session); } - if (self->rdp_layer->up_and_running && self->wm == 0 && rv == 0) + if (self->wm == 0 && self->session->up_and_running && rv == 0) { - /* only do this once */ - DEBUG(("xrdp_process_main_loop up and running\n\r")); - self->orders = xrdp_orders_create(self, self->rdp_layer); - self->wm = xrdp_wm_create(self, &self->rdp_layer->client_info); + DEBUG(("calling xrdp_wm_init and creating wm")); + self->wm = xrdp_wm_create(self, self->session->client_info); xrdp_wm_init(self->wm); } return rv; } /*****************************************************************************/ -int xrdp_process_main_loop(struct xrdp_process* self) +int APP_CC +xrdp_process_main_loop(struct xrdp_process* self) { -#ifndef XRDP_LIB int sel_r; - struct stream* s; - make_stream(s); self->status = 1; - self->rdp_layer = xrdp_rdp_create(self, self->sck); + self->session = libxrdp_init((long)self, self->sck); + self->session->callback = callback; g_tcp_set_non_blocking(self->sck); g_tcp_set_no_delay(self->sck); - if (xrdp_rdp_incoming(self->rdp_layer) == 0) + if (libxrdp_process_incomming(self->session) == 0) { while (!g_is_term() && !self->term) { @@ -128,8 +92,7 @@ int xrdp_process_main_loop(struct xrdp_process* self) } if (sel_r & 1) { - init_stream(s, 8192); - if (xrdp_process_loop(self, s) != 0) + if (xrdp_process_loop(self) != 0) { break; } @@ -150,22 +113,23 @@ int xrdp_process_main_loop(struct xrdp_process* self) } } } + libxrdp_disconnect(self->session); + g_sleep(500); } - if (self->wm->mod != 0) + if (self->wm != 0) { - if (self->wm->mod->mod_end != 0) + if (self->wm->mod != 0) { - self->wm->mod->mod_end(self->wm->mod); + if (self->wm->mod->mod_end != 0) + { + self->wm->mod->mod_end(self->wm->mod); + } } } - xrdp_rdp_disconnect(self->rdp_layer); - g_sleep(500); - xrdp_rdp_delete(self->rdp_layer); - self->rdp_layer = 0; + libxrdp_exit(self->session); + self->session = 0; g_tcp_close(self->sck); self->status = -1; xrdp_listen_delete_pro(self->lis_layer, self); - free_stream(s); -#endif return 0; } diff --git a/xrdp/xrdp_rdp.c b/xrdp/xrdp_rdp.c deleted file mode 100644 index 745f07b7..00000000 --- a/xrdp/xrdp_rdp.c +++ /dev/null @@ -1,909 +0,0 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - - rdp layer - -*/ - -#include "xrdp.h" - -char unknown1[172] = -{ 0xff, 0x02, 0xb6, 0x00, 0x28, 0x00, 0x00, 0x00, - 0x27, 0x00, 0x27, 0x00, 0x03, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x26, 0x00, 0x01, 0x00, 0x1e, 0x00, - 0x02, 0x00, 0x1f, 0x00, 0x03, 0x00, 0x1d, 0x00, - 0x04, 0x00, 0x27, 0x00, 0x05, 0x00, 0x0b, 0x00, - 0x06, 0x00, 0x28, 0x00, 0x08, 0x00, 0x21, 0x00, - 0x09, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x22, 0x00, - 0x0b, 0x00, 0x25, 0x00, 0x0c, 0x00, 0x24, 0x00, - 0x0d, 0x00, 0x23, 0x00, 0x0e, 0x00, 0x19, 0x00, - 0x0f, 0x00, 0x16, 0x00, 0x10, 0x00, 0x15, 0x00, - 0x11, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x1b, 0x00, - 0x13, 0x00, 0x1a, 0x00, 0x14, 0x00, 0x17, 0x00, - 0x15, 0x00, 0x18, 0x00, 0x16, 0x00, 0x0e, 0x00, - 0x18, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x0d, 0x00, - 0x1a, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x14, 0x00, - 0x1f, 0x00, 0x13, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x0a, 0x00, 0x22, 0x00, 0x06, 0x00, - 0x23, 0x00, 0x07, 0x00, 0x24, 0x00, 0x08, 0x00, - 0x25, 0x00, 0x09, 0x00, 0x26, 0x00, 0x04, 0x00, - 0x27, 0x00, 0x03, 0x00, 0x28, 0x00, 0x02, 0x00, - 0x29, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x05, 0x00, - 0x2b, 0x00, 0x2a, 0x00 }; - -/*****************************************************************************/ -int xrdp_rdp_read_config(struct xrdp_client_info* client_info) -{ - int fd; - int index; - struct xrdp_list* items; - struct xrdp_list* values; - char* item; - char* value; - - fd = g_file_open("xrdp.ini"); - if (fd > 0) - { - items = xrdp_list_create(); - items->auto_free = 1; - values = xrdp_list_create(); - values->auto_free = 1; - xrdp_file_read_section(fd, "globals", items, values); - for (index = 0; index < items->count; index++) - { - item = (char*)xrdp_list_get_item(items, index); - value = (char*)xrdp_list_get_item(values, index); - if (g_strcmp(item, "bitmap_cache") == 0) - { - if (g_strcmp(value, "yes") == 0) - { - client_info->use_bitmap_cache = 1; - } - } - else if (g_strcmp(item, "bitmap_compression") == 0) - { - if (g_strcmp(value, "yes") == 0) - { - client_info->use_bitmap_comp = 1; - } - } - } - xrdp_list_delete(items); - xrdp_list_delete(values); - g_file_close(fd); - } - return 0; -} - -/*****************************************************************************/ -struct xrdp_rdp* xrdp_rdp_create(struct xrdp_process* owner, int sck) -{ - struct xrdp_rdp* self; - - self = (struct xrdp_rdp*)g_malloc(sizeof(struct xrdp_rdp), 1); - self->pro_layer = owner; - self->share_id = 66538; - self->sec_layer = xrdp_sec_create(self, sck); - /* read ini settings */ - xrdp_rdp_read_config(&self->client_info); - return self; -} - -/*****************************************************************************/ -void xrdp_rdp_delete(struct xrdp_rdp* self) -{ - if (self == 0) - { - return; - } - xrdp_sec_delete(self->sec_layer); - g_free(self); -} - -/*****************************************************************************/ -int xrdp_rdp_init(struct xrdp_rdp* self, struct stream* s) -{ - if (xrdp_sec_init(self->sec_layer, s) != 0) - { - return 1; - } - s_push_layer(s, rdp_hdr, 6); - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_init_data(struct xrdp_rdp* self, struct stream* s) -{ - if (xrdp_sec_init(self->sec_layer, s) != 0) - { - return 1; - } - s_push_layer(s, rdp_hdr, 18); - return 0; -} - -/*****************************************************************************/ -/* returns erros */ -int xrdp_rdp_recv(struct xrdp_rdp* self, struct stream* s, int* code) -{ - int error; - int len; - int pdu_code; - int chan; - - DEBUG(("in xrdp_rdp_recv\n\r")); - if (s->next_packet == 0 || s->next_packet >= s->end) - { - chan = 0; - error = xrdp_sec_recv(self->sec_layer, s, &chan); - if (error == -1) /* special code for send demand active */ - { - s->next_packet = 0; - *code = -1; - DEBUG(("out xrdp_rdp_recv\n\r")); - return 0; - } - if (error != 0) - { - DEBUG(("out xrdp_rdp_recv error\n\r")); - return 1; - } - if (chan != MCS_GLOBAL_CHANNEL && chan > 0) - { - s->next_packet = 0; - *code = 0; - DEBUG(("out xrdp_rdp_recv\n\r")); - return 0; - } - s->next_packet = s->p; - } - else - { - s->p = s->next_packet; - } - in_uint16_le(s, len); - if (len == 0x8000) - { - s->next_packet += 8; - *code = 0; - DEBUG(("out xrdp_rdp_recv\n\r")); - return 0; - } - in_uint16_le(s, pdu_code); - *code = pdu_code & 0xf; - in_uint8s(s, 2); /* mcs user id */ - s->next_packet += len; - DEBUG(("out xrdp_rdp_recv\n\r")); - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_send(struct xrdp_rdp* self, struct stream* s, int pdu_type) -{ - int len; - - DEBUG(("in xrdp_rdp_send\n\r")); - s_pop_layer(s, rdp_hdr); - len = s->end - s->p; - out_uint16_le(s, len); - out_uint16_le(s, 0x10 | pdu_type); - out_uint16_le(s, self->mcs_channel); - if (xrdp_sec_send(self->sec_layer, s, 0) != 0) - { - DEBUG(("out xrdp_rdp_send error\n\r")); - return 1; - } - DEBUG(("out xrdp_rdp_send\n\r")); - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_send_data(struct xrdp_rdp* self, struct stream* s, - int data_pdu_type) -{ - int len; - - DEBUG(("in xrdp_rdp_send_data\n\r")); - s_pop_layer(s, rdp_hdr); - len = s->end - s->p; - out_uint16_le(s, len); - out_uint16_le(s, 0x10 | RDP_PDU_DATA); - out_uint16_le(s, self->mcs_channel); - out_uint32_le(s, self->share_id); - out_uint8(s, 0); - out_uint8(s, 1); - out_uint16_le(s, len - 14); - out_uint8(s, data_pdu_type); - out_uint8(s, 0); - out_uint16_le(s, 0); - if (xrdp_sec_send(self->sec_layer, s, 0) != 0) - { - DEBUG(("out xrdp_rdp_send_data error\n\r")); - return 1; - } - DEBUG(("out xrdp_rdp_send_data\n\r")); - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_parse_client_mcs_data(struct xrdp_rdp* self) -{ - struct stream* p; - int i; - - p = &self->sec_layer->client_mcs_data; - p->p = p->data; - in_uint8s(p, 31); - in_uint16_le(p, self->client_info.width); - in_uint16_le(p, self->client_info.height); - in_uint8s(p, 120); - self->client_info.bpp = 8; - in_uint16_le(p, i); - switch (i) - { - case 0xca01: - in_uint8s(p, 6); - in_uint8(p, i); - if (i > 8) - { - self->client_info.bpp = i; - } - break; - case 0xca02: - self->client_info.bpp = 15; - break; - case 0xca03: - self->client_info.bpp = 16; - break; - case 0xca04: - self->client_info.bpp = 24; - break; - } - p->p = p->data; - DEBUG(("client width %d, client height %d bpp %d\n\r", - self->client_info.width, self->client_info.height, - self->client_info.bpp)); - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_incoming(struct xrdp_rdp* self) -{ - DEBUG(("in xrdp_rdp_incoming\n\r")); - if (xrdp_sec_incoming(self->sec_layer) != 0) - { - return 1; - } - self->mcs_channel = self->sec_layer->mcs_layer->userid + - MCS_USERCHANNEL_BASE; - xrdp_rdp_parse_client_mcs_data(self); - DEBUG(("out xrdp_rdp_incoming mcs channel %d\n\r", self->mcs_channel)); - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_send_demand_active(struct xrdp_rdp* self) -{ - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_rdp_init(self, s) != 0) - { - free_stream(s); - return 1; - } - - out_uint32_le(s, self->share_id); - out_uint32_be(s, 0x04000401); - out_uint32_be(s, 0x524e5300); - out_uint32_be(s, 0x08000000); - out_uint32_be(s, 0x09000800); - out_uint16_le(s, self->mcs_channel); - out_uint16_be(s, 0xb5e2); - - /* Output general capability set */ - out_uint16_le(s, RDP_CAPSET_GENERAL); /* 1 */ - out_uint16_le(s, RDP_CAPLEN_GENERAL); /* 24(0x18) */ - out_uint16_le(s, 1); /* OS major type */ - out_uint16_le(s, 3); /* OS minor type */ - out_uint16_le(s, 0x200); /* Protocol version */ - out_uint16_le(s, 0); /* pad */ - out_uint16_le(s, 0); /* Compression types */ - out_uint16_le(s, 0); /* pad */ - out_uint16_le(s, 0); /* Update capability */ - out_uint16_le(s, 0); /* Remote unshare capability */ - out_uint16_le(s, 0); /* Compression level */ - out_uint16_le(s, 0); /* Pad */ - - /* Output bitmap capability set */ - out_uint16_le(s, RDP_CAPSET_BITMAP); /* 2 */ - out_uint16_le(s, RDP_CAPLEN_BITMAP); /* 28(0x1c) */ - out_uint16_le(s, self->client_info.bpp); /* Preferred BPP */ - out_uint16_le(s, 1); /* Receive 1 BPP */ - out_uint16_le(s, 1); /* Receive 4 BPP */ - out_uint16_le(s, 1); /* Receive 8 BPP */ - out_uint16_le(s, self->client_info.width); /* width */ - out_uint16_le(s, self->client_info.height); /* height */ - out_uint16_le(s, 0); /* Pad */ - out_uint16_le(s, 1); /* Allow resize */ - out_uint16_le(s, 1); /* bitmap compression */ - out_uint16_le(s, 0); /* unknown */ - out_uint16_le(s, 0); /* unknown */ - out_uint16_le(s, 0); /* pad */ - - /* Output ? */ - out_uint16_le(s, 14); - out_uint16_le(s, 4); - - /* Output order capability set */ - out_uint16_le(s, RDP_CAPSET_ORDER); /* 3 */ - out_uint16_le(s, RDP_CAPLEN_ORDER); /* 88(0x58) */ - out_uint8s(s, 16); - out_uint32_be(s, 0x40420f00); - out_uint16_le(s, 1); /* Cache X granularity */ - out_uint16_le(s, 20); /* Cache Y granularity */ - out_uint16_le(s, 0); /* Pad */ - out_uint16_le(s, 1); /* Max order level */ - out_uint16_le(s, 0x2f); /* Number of fonts */ - out_uint16_le(s, 0x22); /* Capability flags */ - /* caps */ - out_uint8(s, 1); /* dest blt */ - out_uint8(s, 1); /* pat blt */ - out_uint8(s, 1); /* screen blt */ - out_uint8(s, 1); /* memblt */ - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 0); - out_uint8(s, 0); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 1); - out_uint8(s, 0); - out_uint8(s, 0); - out_uint8(s, 0); - out_uint16_le(s, 0x6a1); - out_uint8s(s, 6); /* ? */ - out_uint32_le(s, 0x0f4240); /* desk save */ - out_uint32_le(s, 0); /* ? */ - out_uint32_le(s, 0); /* ? */ - - /* Output color cache capability set */ - out_uint16_le(s, RDP_CAPSET_COLCACHE); - out_uint16_le(s, RDP_CAPLEN_COLCACHE); - out_uint16_le(s, 6); /* cache size */ - out_uint16_le(s, 0); /* pad */ - - /* Output pointer capability set */ - out_uint16_le(s, RDP_CAPSET_POINTER); - out_uint16_le(s, RDP_CAPLEN_POINTER); - out_uint16_le(s, 1); /* Colour pointer */ - out_uint16_le(s, 0x19); /* Cache size */ - - /* Output ? */ - out_uint16_le(s, 0xd); - out_uint16_le(s, 0x58); /* 88 */ - out_uint8(s, 1); - out_uint8s(s, 83); - - s_mark_end(s); - - if (xrdp_rdp_send(self, s, RDP_PDU_DEMAND_ACTIVE) != 0) - { - free_stream(s); - return 1; - } - - free_stream(s); - return 0; -} - -/*****************************************************************************/ -int xrdp_process_capset_general(struct xrdp_rdp* self, struct stream* s, - int len) -{ - int i; - - in_uint8s(s, 10); - in_uint16_le(s, i); - self->client_info.use_compact_packets = (i != 0); - return 0; -} - -/*****************************************************************************/ -int xrdp_process_capset_order(struct xrdp_rdp* self, struct stream* s, - int len) -{ - int i; - - in_uint8s(s, 72); - in_uint32_le(s, i); /* desktop cache size, usually 0x38400 */ - self->client_info.desktop_cache = i; - return 0; -} - -/*****************************************************************************/ -/* get the bitmap cache size */ -int xrdp_process_capset_bmpcache(struct xrdp_rdp* self, struct stream* s, - int len) -{ - in_uint8s(s, 24); - in_uint16_le(s, self->client_info.cache1_entries); - in_uint16_le(s, self->client_info.cache1_size); - in_uint16_le(s, self->client_info.cache2_entries); - in_uint16_le(s, self->client_info.cache2_size); - in_uint16_le(s, self->client_info.cache3_entries); - in_uint16_le(s, self->client_info.cache3_size); - return 0; -} - -/*****************************************************************************/ -/* get the number of client cursor cache */ -int xrdp_process_capset_pointercache(struct xrdp_rdp* self, struct stream* s, - int len) -{ - int i; - - in_uint8s(s, 2); /* color pointer */ - in_uint16_le(s, i); - i = MIN(i, 32); - self->client_info.pointer_cache_entries = i; - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_process_confirm_active(struct xrdp_rdp* self, struct stream* s) -{ - int cap_len; - int source_len; - int num_caps; - int index; - int type; - int len; - char* p; - - in_uint8s(s, 4); /* rdp_shareid */ - in_uint8s(s, 2); /* userid */ - in_uint16_le(s, source_len); /* sizeof RDP_SOURCE */ - in_uint16_le(s, cap_len); - in_uint8s(s, source_len); - in_uint16_le(s, num_caps); - in_uint8s(s, 2); /* pad */ - for (index = 0; index < num_caps; index++) - { - p = s->p; - in_uint16_le(s, type); - in_uint16_le(s, len); - switch (type) - { - case RDP_CAPSET_GENERAL: /* 1 */ - xrdp_process_capset_general(self, s, len); - break; - case RDP_CAPSET_ORDER: /* 3 */ - xrdp_process_capset_order(self, s, len); - break; - case RDP_CAPSET_BMPCACHE: /* 4 */ - xrdp_process_capset_bmpcache(self, s, len); - break; - case RDP_CAPSET_POINTER: /* 8 */ - xrdp_process_capset_pointercache(self, s, len); - break; - } - s->p = p + len; - } - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_process_data_pointer(struct xrdp_rdp* self, struct stream* s) -{ - return 0; -} - -/*****************************************************************************/ -/* RDP_INPUT_SYNCHRONIZE */ -int xrdp_rdp_process_input_sync(struct xrdp_rdp* self, int device_flags, - int key_flags) -{ - DEBUG(("sync event flags %d key %d\n\r", device_flags, key_flags)); - if (!self->up_and_running) - { - return 0; - } - xrdp_wm_key_sync(self->pro_layer->wm, device_flags, key_flags); - return 0; -} - -/*****************************************************************************/ -/* RDP_INPUT_SCANCODE */ -int xrdp_rdp_process_input_scancode(struct xrdp_rdp* self, int device_flags, - int scan_code) -{ - DEBUG(("key event flags %4.4x scan_code %d\n\r", device_flags, scan_code)); - if (!self->up_and_running) - { - return 0; - } - xrdp_wm_key(self->pro_layer->wm, device_flags, scan_code); - return 0; -} - -/*****************************************************************************/ -/* RDP_INPUT_MOUSE */ -int xrdp_rdp_process_input_mouse(struct xrdp_rdp* self, int device_flags, - int x, int y) -{ - DEBUG(("mouse event flags %4.4x x %d y %d\n\r", device_flags, x, y)); - if (!self->up_and_running) - { - return 0; - } - if (device_flags & MOUSE_FLAG_MOVE) /* 0x0800 */ - { - xrdp_wm_mouse_move(self->pro_layer->wm, x, y); - } - if (device_flags & MOUSE_FLAG_BUTTON1) /* 0x1000 */ - { - if (device_flags & MOUSE_FLAG_DOWN) /* 0x8000 */ - { - xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 1, 1); - } - else - { - xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 1, 0); - } - } - if (device_flags & MOUSE_FLAG_BUTTON2) /* 0x2000 */ - { - if (device_flags & MOUSE_FLAG_DOWN) /* 0x8000 */ - { - xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 2, 1); - } - else - { - xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 2, 0); - } - } - if (device_flags & MOUSE_FLAG_BUTTON3) /* 0x4000 */ - { - if (device_flags & MOUSE_FLAG_DOWN) /* 0x8000 */ - { - xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 3, 1); - } - else - { - xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 3, 0); - } - } - if (device_flags == MOUSE_FLAG_BUTTON4 || /* 0x0280 */ - device_flags == 0x0278) - { - xrdp_wm_mouse_click(self->pro_layer->wm, 0, 0, 4, 0); - } - if (device_flags == MOUSE_FLAG_BUTTON5 || /* 0x0380 */ - device_flags == 0x0388) - { - xrdp_wm_mouse_click(self->pro_layer->wm, 0, 0, 5, 0); - } - return 0; -} - -/*****************************************************************************/ -/* RDP_DATA_PDU_INPUT */ -int xrdp_rdp_process_data_input(struct xrdp_rdp* self, struct stream* s) -{ - int num_events; - int index; - int msg_type; - int device_flags; - int param1; - int param2; - - in_uint16_le(s, num_events); - in_uint8s(s, 2); /* pad */ - DEBUG(("xrdp_rdp_process_data_input %d events\n\r", num_events)); - for (index = 0; index < num_events; index++) - { - in_uint8s(s, 4); /* time */ - in_uint16_le(s, msg_type); - in_uint16_le(s, device_flags); - in_sint16_le(s, param1); - in_sint16_le(s, param2); - switch (msg_type) - { - case RDP_INPUT_SYNCHRONIZE: /* 0 */ - xrdp_rdp_process_input_sync(self, device_flags, param1); - break; - case RDP_INPUT_SCANCODE: /* 4 */ - xrdp_rdp_process_input_scancode(self, device_flags, param1); - break; - case RDP_INPUT_MOUSE: /* 8001 */ - xrdp_rdp_process_input_mouse(self, device_flags, param1, param2); - break; - default: - g_printf("unknown in xrdp_rdp_process_data_input\n\r"); - break; - } - } - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_send_synchronise(struct xrdp_rdp* self) -{ - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_rdp_init_data(self, s) != 0) - { - free_stream(s); - return 1; - } - out_uint16_le(s, 1); - out_uint16_le(s, 1002); - s_mark_end(s); - if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_SYNCHRONISE) != 0) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_send_control(struct xrdp_rdp* self, int action) -{ - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_rdp_init_data(self, s) != 0) - { - free_stream(s); - return 1; - } - out_uint16_le(s, action); - out_uint16_le(s, 0); /* userid */ - out_uint32_le(s, 1002); /* control id */ - s_mark_end(s); - if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_CONTROL) != 0) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_process_data_control(struct xrdp_rdp* self, struct stream* s) -{ - int action; - - in_uint16_le(s, action); - in_uint8s(s, 2); /* user id */ - in_uint8s(s, 4); /* control id */ - if (action == RDP_CTL_REQUEST_CONTROL) - { - xrdp_rdp_send_synchronise(self); - xrdp_rdp_send_control(self, RDP_CTL_COOPERATE); - xrdp_rdp_send_control(self, RDP_CTL_GRANT_CONTROL); - } - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_process_data_sync(struct xrdp_rdp* self) -{ - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_process_screen_update(struct xrdp_rdp* self, struct stream* s) -{ - int op; - int left; - int top; - int right; - int bottom; - int cx; - int cy; - struct xrdp_rect rect; - - in_uint32_le(s, op); - in_uint16_le(s, left); - in_uint16_le(s, top); - in_uint16_le(s, right); - in_uint16_le(s, bottom); - cx = (right - left) + 1; - cy = (bottom - top) + 1; - if (self->up_and_running && self->pro_layer->wm != 0) - { - MAKERECT(rect, left, top, cx, cy); - xrdp_bitmap_invalidate(self->pro_layer->wm->screen, &rect); - } - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_send_unknown1(struct xrdp_rdp* self) -{ - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_rdp_init_data(self, s) != 0) - { - free_stream(s); - return 1; - } - out_uint8a(s, unknown1, 172); - s_mark_end(s); - if (xrdp_rdp_send_data(self, s, 0x28) != 0) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_process_data_font(struct xrdp_rdp* self, struct stream* s) -{ - int seq; - - in_uint8s(s, 2); /* num of fonts */ - in_uint8s(s, 2); /* unknown */ - in_uint16_le(s, seq); - /* 419 client sends Seq 1, then 2 */ - /* 2600 clients sends only Seq 3 */ - if (seq == 2 || seq == 3) /* after second font message, we are up and */ - { /* running */ - xrdp_rdp_send_unknown1(self); - self->up_and_running = 1; - } - return 0; -} - -/*****************************************************************************/ -/* sent 37 pdu */ -int xrdp_rdp_send_disconnect_query_response(struct xrdp_rdp* self) -{ - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_rdp_init_data(self, s) != 0) - { - free_stream(s); - return 1; - } - s_mark_end(s); - if (xrdp_rdp_send_data(self, s, 37) != 0) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* sent RDP_DATA_PDU_DISCONNECT 47 pdu */ -int xrdp_rdp_send_disconnect_reason(struct xrdp_rdp* self, int reason) -{ - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_rdp_init_data(self, s) != 0) - { - free_stream(s); - return 1; - } - out_uint32_le(s, reason); - s_mark_end(s); - if (xrdp_rdp_send_data(self, s, RDP_DATA_PDU_DISCONNECT) != 0) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* RDP_PDU_DATA */ -int xrdp_rdp_process_data(struct xrdp_rdp* self, struct stream* s) -{ - int len; - int data_type; - int ctype; - int clen; - - in_uint8s(s, 6); - in_uint16_le(s, len); - in_uint8(s, data_type); - in_uint8(s, ctype); - in_uint16_le(s, clen); - DEBUG(("xrdp_rdp_process_data code %d\n\r", data_type)); - switch (data_type) - { - case RDP_DATA_PDU_POINTER: /* 27 */ - xrdp_rdp_process_data_pointer(self, s); - break; - case RDP_DATA_PDU_INPUT: /* 28 */ - xrdp_rdp_process_data_input(self, s); - break; - case RDP_DATA_PDU_CONTROL: /* 20 */ - xrdp_rdp_process_data_control(self, s); - break; - case RDP_DATA_PDU_SYNCHRONISE: /* 31 */ - xrdp_rdp_process_data_sync(self); - break; - case 33: /* 33 ?? Invalidate an area I think */ - xrdp_rdp_process_screen_update(self, s); - break; - case 35: - /* 35 ?? this comes when minimuzing a full screen mstsc.exe 2600 */ - /* I think this is saying the client no longer wants screen */ - /* updates and it will issue a 33 above to catch up */ - /* so minimized apps don't take bandwidth */ - break; - case 36: /* 36 ?? disconnect query? */ - /* when this message comes, send a 37 back so the client */ - /* is sure the connection is alive and it can ask if user */ - /* really wants to disconnect */ - xrdp_rdp_send_disconnect_query_response(self); /* send a 37 back */ - break; - case RDP_DATA_PDU_FONT2: /* 39 */ - xrdp_rdp_process_data_font(self, s); - break; - default: - g_printf("unknown in xrdp_rdp_process_data %d\n\r", data_type); - break; - } - return 0; -} - -/*****************************************************************************/ -int xrdp_rdp_disconnect(struct xrdp_rdp* self) -{ - return xrdp_sec_disconnect(self->sec_layer); -} diff --git a/xrdp/xrdp_region.c b/xrdp/xrdp_region.c index e1d0a597..2f5ade6c 100644 --- a/xrdp/xrdp_region.c +++ b/xrdp/xrdp_region.c @@ -24,40 +24,46 @@ #include "xrdp.h" /*****************************************************************************/ -struct xrdp_region* xrdp_region_create(struct xrdp_wm* wm) +struct xrdp_region* APP_CC +xrdp_region_create(struct xrdp_wm* wm) { struct xrdp_region* self; self = (struct xrdp_region*)g_malloc(sizeof(struct xrdp_region), 1); self->wm = wm; - self->rects = xrdp_list_create(); + self->rects = list_create(); self->rects->auto_free = 1; return self; } /*****************************************************************************/ -void xrdp_region_delete(struct xrdp_region* self) +void APP_CC +xrdp_region_delete(struct xrdp_region* self) { if (self == 0) + { return; - xrdp_list_delete(self->rects); + } + list_delete(self->rects); g_free(self); } /*****************************************************************************/ -int xrdp_region_add_rect(struct xrdp_region* self, struct xrdp_rect* rect) +int APP_CC +xrdp_region_add_rect(struct xrdp_region* self, struct xrdp_rect* rect) { struct xrdp_rect* r; r = (struct xrdp_rect*)g_malloc(sizeof(struct xrdp_rect), 1); *r = *rect; - xrdp_list_add_item(self->rects, (long)r); + list_add_item(self->rects, (long)r); return 0; } /*****************************************************************************/ -int xrdp_region_insert_rect(struct xrdp_region* self, int i, int left, - int top, int right, int bottom) +int APP_CC +xrdp_region_insert_rect(struct xrdp_region* self, int i, int left, + int top, int right, int bottom) { struct xrdp_rect* r; @@ -66,13 +72,14 @@ int xrdp_region_insert_rect(struct xrdp_region* self, int i, int left, r->top = top; r->right = right; r->bottom = bottom; - xrdp_list_insert_item(self->rects, i, (long)r); + list_insert_item(self->rects, i, (long)r); return 0; } /*****************************************************************************/ -int xrdp_region_subtract_rect(struct xrdp_region* self, - struct xrdp_rect* rect) +int APP_CC +xrdp_region_subtract_rect(struct xrdp_region* self, + struct xrdp_rect* rect) { struct xrdp_rect* r; struct xrdp_rect rect1; @@ -80,7 +87,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, for (i = self->rects->count - 1; i >= 0; i--) { - r = (struct xrdp_rect*)xrdp_list_get_item(self->rects, i); + r = (struct xrdp_rect*)list_get_item(self->rects, i); rect1 = *r; r = &rect1; //g_printf("r is %d %d %d %d\n", r->left, r->top, r->right, r->bottom); @@ -89,7 +96,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->right >= r->right && rect->bottom >= r->bottom) { /* rect is not visible */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); } else if (rect->right < r->left || rect->bottom < r->top || @@ -102,7 +109,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->bottom < r->bottom && rect->top <= r->top) { /* partially covered(whole top) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, rect->bottom, r->right, r->bottom); } @@ -111,7 +118,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->right < r->right && rect->left <= r->left) { /* partially covered(left) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, rect->right, r->top, r->right, r->bottom); } @@ -120,7 +127,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->top > r->top && rect->bottom >= r->bottom) { /* partially covered(bottom) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, r->right, rect->top); } @@ -129,7 +136,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->left > r->left && rect->right >= r->right) { /* partially covered(right) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, rect->left, r->bottom); } @@ -138,7 +145,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->right < r->right && rect->bottom < r->bottom) { /* partially covered(top left) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, rect->right, r->top, r->right, rect->bottom); xrdp_region_insert_rect(self, i, r->left, rect->bottom, @@ -149,7 +156,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->right < r->right && rect->top > r->top) { /* partially covered(bottom left) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, r->right, rect->top); xrdp_region_insert_rect(self, i, rect->right, rect->top, @@ -160,7 +167,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->top <= r->top && rect->bottom < r->bottom) { /* partially covered(top right) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, rect->left, r->bottom); xrdp_region_insert_rect(self, i, rect->left, rect->bottom, @@ -171,7 +178,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->top > r->top && rect->bottom >= r->bottom) { /* partially covered(bottom right) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, r->right, rect->top); xrdp_region_insert_rect(self, i, r->left, rect->top, @@ -182,7 +189,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->right < r->right && rect->bottom >= r->bottom) { /* 2 rects, one on each end */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, rect->left, r->bottom); xrdp_region_insert_rect(self, i, rect->right, r->top, @@ -193,7 +200,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->right >= r->right && rect->bottom < r->bottom) { /* 2 rects, one on each end */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, r->right, rect->top); xrdp_region_insert_rect(self, i, r->left, rect->bottom, @@ -204,7 +211,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->top <= r->top && rect->bottom < r->bottom) { /* partially covered(top) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, rect->left, r->bottom); xrdp_region_insert_rect(self, i, rect->left, rect->bottom, @@ -217,7 +224,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->left <= r->left && rect->right < r->right) { /* partially covered(left) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, r->right, rect->top); xrdp_region_insert_rect(self, i, rect->right, rect->top, @@ -230,7 +237,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->bottom >= r->bottom && rect->top > r->top) { /* partially covered(bottom) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, rect->left, r->bottom); xrdp_region_insert_rect(self, i, rect->left, r->top, @@ -243,7 +250,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->right >= r->right && rect->left > r->left) { /* partially covered(right) */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, r->right, rect->top); xrdp_region_insert_rect(self, i, r->left, rect->top, @@ -256,7 +263,7 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, rect->right < r->right && rect->bottom < r->bottom) { /* totally contained, 4 rects */ - xrdp_list_remove_item(self->rects, i); + list_remove_item(self->rects, i); xrdp_region_insert_rect(self, i, r->left, r->top, r->right, rect->top); xrdp_region_insert_rect(self, i, r->left, rect->top, @@ -267,21 +274,25 @@ int xrdp_region_subtract_rect(struct xrdp_region* self, r->right, rect->bottom); } else + { g_printf("error in xrdp_region_subtract_rect\n\r"); - + } } return 0; } /*****************************************************************************/ -int xrdp_region_get_rect(struct xrdp_region* self, int index, - struct xrdp_rect* rect) +int APP_CC +xrdp_region_get_rect(struct xrdp_region* self, int index, + struct xrdp_rect* rect) { struct xrdp_rect* r; - r = (struct xrdp_rect*)xrdp_list_get_item(self->rects, index); + r = (struct xrdp_rect*)list_get_item(self->rects, index); if (r == 0) + { return 1; + } *rect = *r; return 0; } diff --git a/xrdp/xrdp_sec.c b/xrdp/xrdp_sec.c deleted file mode 100644 index f1982f5e..00000000 --- a/xrdp/xrdp_sec.c +++ /dev/null @@ -1,587 +0,0 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - - secure layer - -*/ - -#include "xrdp.h" - -char pad_54[40] = -{ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54 }; - -char pad_92[48] = -{ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92 }; - -char pub_exp[4] = { 0x01, 0x00, 0x01, 0x00 }; - -char pub_mod[64] = -{ 0x67, 0xab, 0x0e, 0x6a, 0x9f, 0xd6, 0x2b, 0xa3, - 0x32, 0x2f, 0x41, 0xd1, 0xce, 0xee, 0x61, 0xc3, - 0x76, 0x0b, 0x26, 0x11, 0x70, 0x48, 0x8a, 0x8d, - 0x23, 0x81, 0x95, 0xa0, 0x39, 0xf7, 0x5b, 0xaa, - 0x3e, 0xf1, 0xed, 0xb8, 0xc4, 0xee, 0xce, 0x5f, - 0x6a, 0xf5, 0x43, 0xce, 0x5f, 0x60, 0xca, 0x6c, - 0x06, 0x75, 0xae, 0xc0, 0xd6, 0xa4, 0x0c, 0x92, - 0xa4, 0xc6, 0x75, 0xea, 0x64, 0xb2, 0x50, 0x5b }; - -char pub_sig[64] = -{ 0x6a, 0x41, 0xb1, 0x43, 0xcf, 0x47, 0x6f, 0xf1, - 0xe6, 0xcc, 0xa1, 0x72, 0x97, 0xd9, 0xe1, 0x85, - 0x15, 0xb3, 0xc2, 0x39, 0xa0, 0xa6, 0x26, 0x1a, - 0xb6, 0x49, 0x01, 0xfa, 0xa6, 0xda, 0x60, 0xd7, - 0x45, 0xf7, 0x2c, 0xee, 0xe4, 0x8e, 0x64, 0x2e, - 0x37, 0x49, 0xf0, 0x4c, 0x94, 0x6f, 0x08, 0xf5, - 0x63, 0x4c, 0x56, 0x29, 0x55, 0x5a, 0x63, 0x41, - 0x2c, 0x20, 0x65, 0x95, 0x99, 0xb1, 0x15, 0x7c }; - -char pri_exp[64] = -{ 0x41, 0x93, 0x05, 0xB1, 0xF4, 0x38, 0xFC, 0x47, - 0x88, 0xC4, 0x7F, 0x83, 0x8C, 0xEC, 0x90, 0xDA, - 0x0C, 0x8A, 0xB5, 0xAE, 0x61, 0x32, 0x72, 0xF5, - 0x2B, 0xD1, 0x7B, 0x5F, 0x44, 0xC0, 0x7C, 0xBD, - 0x8A, 0x35, 0xFA, 0xAE, 0x30, 0xF6, 0xC4, 0x6B, - 0x55, 0xA7, 0x65, 0xEF, 0xF4, 0xB2, 0xAB, 0x18, - 0x4E, 0xAA, 0xE6, 0xDC, 0x71, 0x17, 0x3B, 0x4C, - 0xC2, 0x15, 0x4C, 0xF7, 0x81, 0xBB, 0xF0, 0x03 }; - -char lic1[322] = -{ 0x80, 0x00, 0x3e, 0x01, 0x01, 0x02, 0x3e, 0x01, - 0x7b, 0x3c, 0x31, 0xa6, 0xae, 0xe8, 0x74, 0xf6, - 0xb4, 0xa5, 0x03, 0x90, 0xe7, 0xc2, 0xc7, 0x39, - 0xba, 0x53, 0x1c, 0x30, 0x54, 0x6e, 0x90, 0x05, - 0xd0, 0x05, 0xce, 0x44, 0x18, 0x91, 0x83, 0x81, - 0x00, 0x00, 0x04, 0x00, 0x2c, 0x00, 0x00, 0x00, - 0x4d, 0x00, 0x69, 0x00, 0x63, 0x00, 0x72, 0x00, - 0x6f, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x66, 0x00, - 0x74, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, - 0x72, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x72, 0x00, - 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, - 0x6e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x32, 0x00, 0x33, 0x00, 0x36, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0xb8, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x5c, 0x00, 0x52, 0x53, 0x41, 0x31, - 0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x3f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0xc7, 0xc9, 0xf7, 0x8e, 0x5a, 0x38, 0xe4, - 0x29, 0xc3, 0x00, 0x95, 0x2d, 0xdd, 0x4c, 0x3e, - 0x50, 0x45, 0x0b, 0x0d, 0x9e, 0x2a, 0x5d, 0x18, - 0x63, 0x64, 0xc4, 0x2c, 0xf7, 0x8f, 0x29, 0xd5, - 0x3f, 0xc5, 0x35, 0x22, 0x34, 0xff, 0xad, 0x3a, - 0xe6, 0xe3, 0x95, 0x06, 0xae, 0x55, 0x82, 0xe3, - 0xc8, 0xc7, 0xb4, 0xa8, 0x47, 0xc8, 0x50, 0x71, - 0x74, 0x29, 0x53, 0x89, 0x6d, 0x9c, 0xed, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x48, 0x00, 0xa8, 0xf4, 0x31, 0xb9, - 0xab, 0x4b, 0xe6, 0xb4, 0xf4, 0x39, 0x89, 0xd6, - 0xb1, 0xda, 0xf6, 0x1e, 0xec, 0xb1, 0xf0, 0x54, - 0x3b, 0x5e, 0x3e, 0x6a, 0x71, 0xb4, 0xf7, 0x75, - 0xc8, 0x16, 0x2f, 0x24, 0x00, 0xde, 0xe9, 0x82, - 0x99, 0x5f, 0x33, 0x0b, 0xa9, 0xa6, 0x94, 0xaf, - 0xcb, 0x11, 0xc3, 0xf2, 0xdb, 0x09, 0x42, 0x68, - 0x29, 0x56, 0x58, 0x01, 0x56, 0xdb, 0x59, 0x03, - 0x69, 0xdb, 0x7d, 0x37, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x0e, 0x00, 0x6d, 0x69, 0x63, 0x72, - 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, - 0x6d, 0x00 }; - -char lic2[20] = -{ 0x80, 0x00, 0x10, 0x00, 0xff, 0x02, 0x10, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x28, 0x14, 0x00, 0x00 }; - -/*****************************************************************************/ -struct xrdp_sec* xrdp_sec_create(struct xrdp_rdp* owner, int sck) -{ - struct xrdp_sec* self; - - self = (struct xrdp_sec*)g_malloc(sizeof(struct xrdp_sec), 1); - self->rdp_layer = owner; - self->rc4_key_size = 1; - self->decrypt_rc4_info = g_rc4_info_create(); - self->encrypt_rc4_info = g_rc4_info_create(); - g_random(self->server_random, 32); - self->mcs_layer = xrdp_mcs_create(self, sck, &self->client_mcs_data, - &self->server_mcs_data); - return self; -} - -/*****************************************************************************/ -void xrdp_sec_delete(struct xrdp_sec* self) -{ - if (self == 0) - { - return; - } - xrdp_mcs_delete(self->mcs_layer); - g_rc4_info_delete(self->decrypt_rc4_info); - g_rc4_info_delete(self->encrypt_rc4_info); - g_free(self->client_mcs_data.data); - g_free(self->server_mcs_data.data); - g_free(self); -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_sec_init(struct xrdp_sec* self, struct stream* s) -{ - if (xrdp_mcs_init(self->mcs_layer, s) != 0) - { - return 1; - } - s_push_layer(s, sec_hdr, 4); - return 0; -} - -/*****************************************************************************/ -/* Reduce key entropy from 64 to 40 bits */ -void xrdp_sec_make_40bit(char* key) -{ - key[0] = 0xd1; - key[1] = 0x26; - key[2] = 0x9e; -} - -/*****************************************************************************/ -/* returns error */ -/* update an encryption key */ -int xrdp_sec_update(char* key, char* update_key, int key_len) -{ - char shasig[20]; - void* sha1_info; - void* md5_info; - void* rc4_info; - - sha1_info = g_sha1_info_create(); - md5_info = g_md5_info_create(); - rc4_info = g_rc4_info_create(); - g_sha1_clear(sha1_info); - g_sha1_transform(sha1_info, update_key, key_len); - g_sha1_transform(sha1_info, pad_54, 40); - g_sha1_transform(sha1_info, key, key_len); - g_sha1_complete(sha1_info, shasig); - g_md5_clear(md5_info); - g_md5_transform(md5_info, update_key, key_len); - g_md5_transform(md5_info, pad_92, 48); - g_md5_transform(md5_info, shasig, 20); - g_md5_complete(md5_info, key); - g_rc4_set_key(rc4_info, key, key_len); - g_rc4_crypt(rc4_info, key, key_len); - if (key_len == 8) - { - xrdp_sec_make_40bit(key); - } - g_sha1_info_delete(sha1_info); - g_md5_info_delete(md5_info); - g_rc4_info_delete(rc4_info); - return 0; -} - -/*****************************************************************************/ -void xrdp_sec_decrypt(struct xrdp_sec* self, char* data, int len) -{ - if (self->decrypt_use_count == 4096) - { - xrdp_sec_update(self->decrypt_key, self->decrypt_update_key, - self->rc4_key_len); - g_rc4_set_key(self->decrypt_rc4_info, self->decrypt_key, - self->rc4_key_len); - self->decrypt_use_count = 0; - } - g_rc4_crypt(self->decrypt_rc4_info, data, len); - self->decrypt_use_count++; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_sec_process_logon_info(struct xrdp_sec* self, struct stream* s) -{ - int flags; - int len_domain; - int len_user; - int len_password; - int len_program; - int len_directory; - - in_uint8s(s, 4); - in_uint32_le(s, flags); - DEBUG(("in xrdp_sec_process_logon_info flags $%x\n\r", flags)); - /* this is the first test that the decrypt is working */ - if ((flags & RDP_LOGON_NORMAL) != RDP_LOGON_NORMAL) /* 0x33 */ - { /* must be or error */ - return 1; - } - if (flags & RDP_LOGON_AUTO) - { - } - if (flags & RDP_COMPRESSION) - { - } - in_uint16_le(s, len_domain); - in_uint16_le(s, len_user); - in_uint16_le(s, len_password); - in_uint16_le(s, len_program); - in_uint16_le(s, len_directory); - in_uint8s(s, len_domain + 2); - in_uint8s(s, len_user + 2); - in_uint8s(s, len_password + 2); - in_uint8s(s, len_program + 2); - in_uint8s(s, len_directory + 2); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_sec_send_lic_initial(struct xrdp_sec* self) -{ - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_mcs_init(self->mcs_layer, s) != 0) - { - free_stream(s); - return 1; - } - out_uint8a(s, lic1, 322); - s_mark_end(s); - if (xrdp_mcs_send(self->mcs_layer, s) != 0) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_sec_send_lic_response(struct xrdp_sec* self) -{ - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - if (xrdp_mcs_init(self->mcs_layer, s) != 0) - { - free_stream(s); - return 1; - } - out_uint8a(s, lic2, 20); - s_mark_end(s); - if (xrdp_mcs_send(self->mcs_layer, s) != 0) - { - free_stream(s); - return 1; - } - free_stream(s); - return 0; -} - -/*****************************************************************************/ -void xrdp_sec_reverse(char* p, int len) -{ - int i; - int j; - char temp; - - i = 0; - j = len - 1; - while (i < j) - { - temp = p[i]; - p[i] = p[j]; - p[j] = temp; - i++; - j--; - } -} - -/*****************************************************************************/ -void xrdp_sec_rsa_op(char* out, char* in, char* mod, char* exp) -{ - char lexp[64]; - char lmod[64]; - char lin[64]; - char lout[64]; - int len; - - g_memcpy(lexp, exp, 64); - g_memcpy(lmod, mod, 64); - g_memcpy(lin, in, 64); - xrdp_sec_reverse(lexp, 64); - xrdp_sec_reverse(lmod, 64); - xrdp_sec_reverse(lin, 64); - g_memset(lout, 0, 64); - len = g_mod_exp(lout, lin, lmod, lexp); - xrdp_sec_reverse(lout, len); - g_memcpy(out, lout, 64); -} - -/*****************************************************************************/ -void xrdp_sec_hash_48(char* out, char* in, char* salt1, char* salt2, int salt) -{ - int i; - void* sha1_info; - void* md5_info; - char pad[4]; - char sha1_sig[20]; - char md5_sig[16]; - - sha1_info = g_sha1_info_create(); - md5_info = g_md5_info_create(); - for (i = 0; i < 3; i++) - { - g_memset(pad, salt + i, 4); - g_sha1_clear(sha1_info); - g_sha1_transform(sha1_info, pad, i + 1); - g_sha1_transform(sha1_info, in, 48); - g_sha1_transform(sha1_info, salt1, 32); - g_sha1_transform(sha1_info, salt2, 32); - g_sha1_complete(sha1_info, sha1_sig); - g_md5_clear(md5_info); - g_md5_transform(md5_info, in, 48); - g_md5_transform(md5_info, sha1_sig, 20); - g_md5_complete(md5_info, md5_sig); - g_memcpy(out + i * 16, md5_sig, 16); - } - g_sha1_info_delete(sha1_info); - g_md5_info_delete(md5_info); -} - -/*****************************************************************************/ -void xrdp_sec_hash_16(char* out, char* in, char* salt1, char* salt2) -{ - void* md5_info; - - md5_info = g_md5_info_create(); - g_md5_clear(md5_info); - g_md5_transform(md5_info, in, 16); - g_md5_transform(md5_info, salt1, 32); - g_md5_transform(md5_info, salt2, 32); - g_md5_complete(md5_info, out); - g_md5_info_delete(md5_info); -} - -/*****************************************************************************/ -void xrdp_sec_establish_keys(struct xrdp_sec* self) -{ - char session_key[48]; - char temp_hash[48]; - char input[48]; - - g_memcpy(input, self->client_random, 24); - g_memcpy(input + 24, self->server_random, 24); - xrdp_sec_hash_48(temp_hash, input, self->client_random, - self->server_random, 65); - xrdp_sec_hash_48(session_key, temp_hash, self->client_random, - self->server_random, 88); - g_memcpy(self->sign_key, session_key, 16); - xrdp_sec_hash_16(self->encrypt_key, session_key + 16, self->client_random, - self->server_random); - xrdp_sec_hash_16(self->decrypt_key, session_key + 32, self->client_random, - self->server_random); - if (self->rc4_key_size == 1) - { - xrdp_sec_make_40bit(self->sign_key); - xrdp_sec_make_40bit(self->encrypt_key); - xrdp_sec_make_40bit(self->decrypt_key); - self->rc4_key_len = 8; - } - else - { - self->rc4_key_len = 16; - } - g_memcpy(self->decrypt_update_key, self->decrypt_key, 16); - g_memcpy(self->encrypt_update_key, self->encrypt_key, 16); - g_rc4_set_key(self->decrypt_rc4_info, self->decrypt_key, self->rc4_key_len); - g_rc4_set_key(self->encrypt_rc4_info, self->encrypt_key, self->rc4_key_len); -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_sec_recv(struct xrdp_sec* self, struct stream* s, int* chan) -{ - int flags; - int len; - - DEBUG((" in xrdp_sec_recv\n\r")); - if (xrdp_mcs_recv(self->mcs_layer, s, chan) != 0) - { - DEBUG((" out xrdp_sec_recv error\n\r")); - return 1; - } - in_uint32_le(s, flags); - DEBUG((" in xrdp_sec_recv flags $%x\n\r", flags)); - if (flags & SEC_ENCRYPT) /* 0x08 */ - { - in_uint8s(s, 8); /* signature */ - xrdp_sec_decrypt(self, s->p, s->end - s->p); - } - if (flags & SEC_CLIENT_RANDOM) /* 0x01 */ - { - in_uint32_le(s, len); - in_uint8a(s, self->client_crypt_random, 64); - xrdp_sec_rsa_op(self->client_random, self->client_crypt_random, - pub_mod, pri_exp); - xrdp_sec_establish_keys(self); - *chan = 1; /* just set a non existing channel and exit */ - return 0; - } - if (flags & SEC_LOGON_INFO) /* 0x40 */ - { - if (xrdp_sec_process_logon_info(self, s) != 0) - { - return 1; - } - if (xrdp_sec_send_lic_initial(self) != 0) - { - return 1; - } - *chan = 1; /* just set a non existing channel and exit */ - return 0; - } - if (flags & SEC_LICENCE_NEG) /* 0x80 */ - { - if (xrdp_sec_send_lic_response(self) != 0) - { - return 1; - } - return -1; /* special error that means send demand active */ - } - DEBUG((" out xrdp_sec_recv error\n\r")); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -/* TODO needs outgoing encryption */ -int xrdp_sec_send(struct xrdp_sec* self, struct stream* s, int flags) -{ - DEBUG((" in xrdp_sec_send\n\r")); - s_pop_layer(s, sec_hdr); - out_uint32_le(s, flags); - if (xrdp_mcs_send(self->mcs_layer, s) != 0) - { - return 1; - } - DEBUG((" out xrdp_sec_send\n\r")); - return 0; -} - -/*****************************************************************************/ -/* prepare server mcs data to send in mcs layer */ -void xrdp_sec_out_mcs_data(struct xrdp_sec* self) -{ - struct stream* p; - - p = &self->server_mcs_data; - init_stream(p, 512); - out_uint16_be(p, 5); - out_uint16_be(p, 0x14); - out_uint8(p, 0x7c); - out_uint16_be(p, 1); - out_uint8(p, 0x2a); - out_uint8(p, 0x14); - out_uint8(p, 0x76); - out_uint8(p, 0x0a); - out_uint8(p, 1); - out_uint8(p, 1); - out_uint8(p, 0); - out_uint16_le(p, 0xc001); - out_uint8(p, 0); - out_uint8(p, 0x4d); /* M */ - out_uint8(p, 0x63); /* c */ - out_uint8(p, 0x44); /* D */ - out_uint8(p, 0x6e); /* n */ - out_uint16_be(p, 0x80fc); - out_uint16_le(p, SEC_TAG_SRV_INFO); - out_uint16_le(p, 8); /* len */ - out_uint8(p, 4); /* 4 = rdp5 1 = rdp4 */ - out_uint8(p, 0); - out_uint8(p, 8); - out_uint8(p, 0); - out_uint16_le(p, SEC_TAG_SRV_CHANNELS); - out_uint16_le(p, 8); /* len */ - out_uint8(p, 0xeb); - out_uint8(p, 3); - out_uint8(p, 0); - out_uint8(p, 0); - out_uint16_le(p, SEC_TAG_SRV_CRYPT); - out_uint16_le(p, 0x00ec); /* len is 236 */ - out_uint32_le(p, 1); /* key len 1 = 40 bit 2 = 128 bit */ - out_uint32_le(p, 1); /* crypt level 1 = low 2 = medium 3 = high */ - out_uint32_le(p, 32); /* 32 bytes random len */ - out_uint32_le(p, 0xb8); /* 184 bytes rsa info(certificate) len */ - out_uint8a(p, self->server_random, 32); - /* here to end is certificate */ - /* HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ */ - /* TermService\Parameters\Certificate */ - out_uint32_le(p, 1); - out_uint32_le(p, 1); - out_uint32_le(p, 1); - out_uint16_le(p, SEC_TAG_PUBKEY); - out_uint16_le(p, 0x005c); /* 92 bytes length of SEC_TAG_PUBKEY */ - out_uint32_le(p, SEC_RSA_MAGIC); - out_uint32_le(p, 0x48); /* 72 bytes modulus len */ - out_uint32_be(p, 0x00020000); - out_uint32_be(p, 0x3f000000); - out_uint8a(p, pub_exp, 4); /* pub exp */ - out_uint8a(p, pub_mod, 64); /* pub mod */ - out_uint8s(p, 8); /* pad */ - out_uint16_le(p, SEC_TAG_KEYSIG); - out_uint16_le(p, 72); /* len */ - out_uint8a(p, pub_sig, 64); /* pub sig */ - out_uint8s(p, 8); /* pad */ - /* end certificate */ - s_mark_end(p); -} - -/*****************************************************************************/ -int xrdp_sec_incoming(struct xrdp_sec* self) -{ - DEBUG(("in xrdp_sec_incoming\n\r")); - xrdp_sec_out_mcs_data(self); - if (xrdp_mcs_incoming(self->mcs_layer) != 0) - { - return 1; - } -#ifdef XRDP_DEBUG - g_printf("client mcs data received\n\r"); - g_hexdump(self->client_mcs_data.data, - self->client_mcs_data.end - self->client_mcs_data.data); - g_printf("server mcs data sent\n\r"); - g_hexdump(self->server_mcs_data.data, - self->server_mcs_data.end - self->server_mcs_data.data); -#endif - DEBUG(("out xrdp_sec_incoming\n\r")); - return 0; -} - -/*****************************************************************************/ -int xrdp_sec_disconnect(struct xrdp_sec* self) -{ - return xrdp_mcs_disconnect(self->mcs_layer); -} diff --git a/xrdp/xrdp_tcp.c b/xrdp/xrdp_tcp.c deleted file mode 100644 index 996e6932..00000000 --- a/xrdp/xrdp_tcp.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - - tcp layer - -*/ - -#include "xrdp.h" - -/*****************************************************************************/ -struct xrdp_tcp* xrdp_tcp_create(struct xrdp_iso* owner, int sck) -{ - struct xrdp_tcp* self; - - self = (struct xrdp_tcp*)g_malloc(sizeof(struct xrdp_tcp), 1); - self->iso_layer = owner; - self->sck = sck; - return self; -} - -/*****************************************************************************/ -void xrdp_tcp_delete(struct xrdp_tcp* self) -{ - g_free(self); -} - -/*****************************************************************************/ -/* get out stream ready for data */ -/* returns error */ -int xrdp_tcp_init(struct xrdp_tcp* self, struct stream* s) -{ - init_stream(s, 8192); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len) -{ - int rcvd; - - if (self->sck_closed) - { - DEBUG((" in xrdp_tcp_recv, sck closed\n\r")); - return 1; - } - DEBUG((" in xrdp_tcp_recv, gota get %d bytes\n\r", len)); - init_stream(s, len); - while (len > 0) - { - if (g_is_term()) - { - DEBUG((" out xrdp_tcp_recv, g_is_term is true\n\r")); - return 1; - } - rcvd = g_tcp_recv(self->sck, s->end, len, 0); - if (rcvd == -1) - { - if (g_tcp_last_error_would_block(self->sck)) - { - g_sleep(1); - } - else - { - self->sck_closed = 1; - DEBUG((" error = -1 in xrdp_tcp_recv socket %d\n\r", self->sck)); - return 1; - } - } - else if (rcvd == 0) - { - self->sck_closed = 1; - DEBUG((" error = 0 in xrdp_tcp_recv socket %d\n\r", self->sck)); - return 1; - } - else - { - s->end += rcvd; - len -= rcvd; - } - } - DEBUG((" out xrdp_tcp_recv\n\r")); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int xrdp_tcp_send(struct xrdp_tcp* self, struct stream* s) -{ - int len; - int total; - int sent; - - if (self->sck_closed) - { - DEBUG((" in xrdp_tcp_send, sck closed\n\r")); - return 1; - } - len = s->end - s->data; - DEBUG((" in xrdp_tcp_send, gota send %d bytes\n\r", len)); - total = 0; - while (total < len) - { - if (g_is_term()) - { - return 1; - } - sent = g_tcp_send(self->sck, s->data + total, len - total, 0); - if (sent == -1) - { - if (g_tcp_last_error_would_block(self->sck)) - { - g_sleep(1); - } - else - { - self->sck_closed = 1; - DEBUG((" error = -1 in xrdp_tcp_send socket %d\n\r", self->sck)); - return 1; - } - } - else if (sent == 0) - { - self->sck_closed = 1; - DEBUG((" error = 0 in xrdp_tcp_send socket %d\n\r", self->sck)); - return 1; - } - else - { - total = total + sent; - } - } - DEBUG((" out xrdp_tcp_send, sent %d bytes ok\n\r", len)); - return 0; -} diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h index 24a60031..b17ec188 100644 --- a/xrdp/xrdp_types.h +++ b/xrdp/xrdp_types.h @@ -27,7 +27,8 @@ struct xrdp_mod /* client functions */ int (*mod_start)(struct xrdp_mod* v, int w, int h, int bpp); int (*mod_connect)(struct xrdp_mod* v); - int (*mod_event)(struct xrdp_mod* v, int msg, int param1, int param2); + int (*mod_event)(struct xrdp_mod* v, int msg, long param1, long param2, + long param3, long param4); int (*mod_signal)(struct xrdp_mod* v); int (*mod_end)(struct xrdp_mod* v); int (*mod_set_param)(struct xrdp_mod* v, char* name, char* value); @@ -51,13 +52,6 @@ struct xrdp_mod int sck; }; -/* for memory debugging */ -struct xrdp_mem -{ - int size; - int id; -}; - /* header for bmp file */ struct xrdp_bmp_header { @@ -74,219 +68,6 @@ struct xrdp_bmp_header int clr_important; }; -/* list */ -struct xrdp_list -{ - long* items; - int count; - int alloc_size; - int grow_by; - int auto_free; -}; - -/* rect */ -struct xrdp_rect -{ - int left; - int top; - int right; - int bottom; -}; - -/* bounds */ -struct xrdp_bounds -{ - int x; - int y; - int cx; - int cy; -}; - -/* brush */ -struct xrdp_brush -{ - int x_orgin; - int y_orgin; - int style; - char pattern[8]; -}; - -/* pen */ -struct xrdp_pen -{ - int style; - int width; - int color; -}; - -/* tcp */ -struct xrdp_tcp -{ - int sck; - int sck_closed; - struct xrdp_iso* iso_layer; /* owner */ -}; - -/* iso */ -struct xrdp_iso -{ - struct xrdp_mcs* mcs_layer; /* owner */ - struct xrdp_tcp* tcp_layer; -}; - -/* mcs */ -struct xrdp_mcs -{ - struct xrdp_sec* sec_layer; /* owner */ - struct xrdp_iso* iso_layer; - int userid; - int chanid; - struct stream* client_mcs_data; - struct stream* server_mcs_data; -}; - -/* sec */ -struct xrdp_sec -{ - struct xrdp_rdp* rdp_layer; /* owner */ - struct xrdp_mcs* mcs_layer; - char server_random[32]; - char client_random[64]; - char client_crypt_random[72]; - struct stream client_mcs_data; - struct stream server_mcs_data; - int decrypt_use_count; - int encrypt_use_count; - char decrypt_key[16]; - char encrypt_key[16]; - char decrypt_update_key[16]; - char encrypt_update_key[16]; - int rc4_key_size; - int rc4_key_len; - char sign_key[16]; - void* decrypt_rc4_info; - void* encrypt_rc4_info; -}; - -/* client info */ -struct xrdp_client_info -{ - int bpp; - int width; - int height; - int cache1_entries; - int cache1_size; - int cache2_entries; - int cache2_size; - int cache3_entries; - int cache3_size; - int pointer_cache_entries; - int use_bitmap_comp; - int use_bitmap_cache; - int op1; /* use smaller bitmap header, todo */ - int desktop_cache; - int use_compact_packets; /* rdp5 smaller packets */ -}; - -/* rdp */ -struct xrdp_rdp -{ - struct xrdp_process* pro_layer; /* owner */ - struct xrdp_sec* sec_layer; - int share_id; - int mcs_channel; - int up_and_running; - struct xrdp_client_info client_info; -}; - -/* orders */ -struct xrdp_orders -{ - struct stream* out_s; - struct xrdp_rdp* rdp_layer; - struct xrdp_process* pro_layer; /* owner */ - struct xrdp_wm* wm; - - char* order_count_ptr; /* pointer to count, set when sending */ - int order_count; - int order_level; /* inc for every call to xrdp_orders_init */ - - int last_order; /* last order sent */ - - int clip_left; /* RDP_ORDER_BOUNDS, RDP_ORDER_LASTBOUNDS */ - int clip_top; - int clip_right; - int clip_bottom; - - int rect_x; /* RDP_ORDER_RECT */ - int rect_y; - int rect_cx; - int rect_cy; - int rect_color; - - int scr_blt_x; /* RDP_ORDER_SCREENBLT */ - int scr_blt_y; - int scr_blt_cx; - int scr_blt_cy; - int scr_blt_rop; - int scr_blt_srcx; - int scr_blt_srcy; - - int pat_blt_x; /* RDP_ORDER_PATBLT */ - int pat_blt_y; - int pat_blt_cx; - int pat_blt_cy; - int pat_blt_rop; - int pat_blt_bg_color; - int pat_blt_fg_color; - struct xrdp_brush pat_blt_brush; - - int dest_blt_x; /* RDP_ORDER_DESTBLT */ - int dest_blt_y; - int dest_blt_cx; - int dest_blt_cy; - int dest_blt_rop; - - int line_mix_mode; /* RDP_ORDER_LINE */ - int line_startx; - int line_starty; - int line_endx; - int line_endy; - int line_bg_color; - int line_rop; - struct xrdp_pen line_pen; - - int mem_blt_color_table; /* RDP_ORDER_MEMBLT */ - int mem_blt_cache_id; - int mem_blt_x; - int mem_blt_y; - int mem_blt_cx; - int mem_blt_cy; - int mem_blt_rop; - int mem_blt_srcx; - int mem_blt_srcy; - int mem_blt_cache_idx; - - int text_font; /* RDP_ORDER_TEXT2 */ - int text_flags; - int text_unknown; - int text_mixmode; - int text_fg_color; - int text_bg_color; - int text_clip_left; - int text_clip_top; - int text_clip_right; - int text_clip_bottom; - int text_box_left; - int text_box_top; - int text_box_right; - int text_box_bottom; - int text_x; - int text_y; - int text_len; - char* text_data; -}; - struct xrdp_palette_item { int stamp; @@ -299,20 +80,10 @@ struct xrdp_bitmap_item struct xrdp_bitmap* bitmap; }; -struct xrdp_font_item -{ - int offset; - int baseline; - int width; - int height; - int incby; - char* data; -}; - struct xrdp_char_item { int stamp; - struct xrdp_font_item font_item; + struct xrdp_font_char font_item; }; struct xrdp_pointer_item @@ -328,7 +99,7 @@ struct xrdp_pointer_item struct xrdp_cache { struct xrdp_wm* wm; /* owner */ - struct xrdp_orders* orders; + struct xrdp_session* session; /* palette */ int palette_stamp; struct xrdp_palette_item palette_items[6]; @@ -356,9 +127,8 @@ struct xrdp_wm { struct xrdp_process* pro_layer; /* owner */ struct xrdp_bitmap* screen; - struct xrdp_orders* orders; + struct xrdp_session* session; struct xrdp_painter* painter; - struct xrdp_rdp* rdp_layer; struct xrdp_cache* cache; int palette[256]; struct xrdp_bitmap* login_window; @@ -406,7 +176,7 @@ struct xrdp_wm /* client info */ struct xrdp_client_info* client_info; /* session log */ - struct xrdp_list* log; + struct list* log; struct xrdp_bitmap* log_wnd; }; @@ -417,9 +187,8 @@ struct xrdp_process int sck; int term; struct xrdp_listen* lis_layer; /* owner */ - struct xrdp_rdp* rdp_layer; + struct xrdp_session* session; /* create these when up and running */ - struct xrdp_orders* orders; struct xrdp_wm* wm; int app_sck; }; @@ -439,7 +208,7 @@ struct xrdp_listen struct xrdp_region { struct xrdp_wm* wm; /* owner */ - struct xrdp_list* rects; + struct list* rects; }; /* painter */ @@ -452,7 +221,7 @@ struct xrdp_painter int bg_color; int fg_color; struct xrdp_brush brush; - struct xrdp_orders* orders; + struct xrdp_session* session; struct xrdp_wm* wm; /* owner */ struct xrdp_font* font; }; @@ -492,15 +261,15 @@ struct xrdp_bitmap struct xrdp_bitmap* default_button; /* button when enter is pressed */ struct xrdp_bitmap* esc_button; /* button when esc is pressed */ /* list of child windows */ - struct xrdp_list* child_list; + struct list* child_list; /* for edit */ int edit_pos; int password_char; /* for button or combo */ int state; /* for button 0 = normal 1 = down */ /* for combo */ - struct xrdp_list* string_list; - struct xrdp_list* data_list; + struct list* string_list; + struct list* data_list; /* for combo or popup */ int item_index; /* for popup */ @@ -514,7 +283,7 @@ struct xrdp_bitmap struct xrdp_font { struct xrdp_wm* wm; - struct xrdp_font_item font_items[256]; + struct xrdp_font_char font_items[256]; int color; char name[32]; int size; @@ -526,6 +295,6 @@ struct xrdp_mod_data { char name[256]; char lib[256]; - struct xrdp_list* names; - struct xrdp_list* values; + struct list* names; + struct list* values; }; diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c index c44c0071..75d6ff51 100644 --- a/xrdp/xrdp_wm.c +++ b/xrdp/xrdp_wm.c @@ -23,8 +23,9 @@ #include "xrdp.h" /*****************************************************************************/ -struct xrdp_wm* xrdp_wm_create(struct xrdp_process* owner, - struct xrdp_client_info* client_info) +struct xrdp_wm* APP_CC +xrdp_wm_create(struct xrdp_process* owner, + struct xrdp_client_info* client_info) { struct xrdp_wm* self; @@ -36,17 +37,17 @@ struct xrdp_wm* xrdp_wm_create(struct xrdp_process* owner, WND_TYPE_SCREEN, self); self->screen->wm = self; self->pro_layer = owner; - self->orders = owner->orders; - self->painter = xrdp_painter_create(self); - self->rdp_layer = owner->rdp_layer; - self->cache = xrdp_cache_create(self, self->orders, self->client_info); - self->log = xrdp_list_create(); + self->session = owner->session; + self->painter = xrdp_painter_create(self, self->session); + self->cache = xrdp_cache_create(self, self->session, self->client_info); + self->log = list_create(); self->log->auto_free = 1; return self; } /*****************************************************************************/ -void xrdp_wm_delete(struct xrdp_wm* self) +void APP_CC +xrdp_wm_delete(struct xrdp_wm* self) { if (self == 0) { @@ -68,213 +69,30 @@ void xrdp_wm_delete(struct xrdp_wm* self) g_free_library(self->mod_handle); } /* free the log */ - xrdp_list_delete(self->log); + list_delete(self->log); /* free self */ g_free(self); } /*****************************************************************************/ -int xrdp_wm_send_palette(struct xrdp_wm* self) +int APP_CC +xrdp_wm_send_palette(struct xrdp_wm* self) { - int i; - int color; - struct stream* s; - - if (self->client_info->bpp > 8) - { - return 0; - } - xrdp_orders_force_send(self->orders); - make_stream(s); - init_stream(s, 8192); - xrdp_rdp_init_data(self->rdp_layer, s); - out_uint16_le(s, RDP_UPDATE_PALETTE); - out_uint16_le(s, 0); - out_uint16_le(s, 256); /* # of colors */ - out_uint16_le(s, 0); - for (i = 0; i < 256; i++) - { - color = self->palette[i]; - out_uint8(s, color >> 16); - out_uint8(s, color >> 8); - out_uint8(s, color); - } - s_mark_end(s); - xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_UPDATE); - free_stream(s); - xrdp_orders_init(self->orders); - xrdp_orders_send_palette(self->orders, self->palette, 0); - xrdp_orders_send(self->orders); - return 0; + return libxrdp_send_palette(self->session, self->palette); } /*****************************************************************************/ -int xrdp_wm_send_bitmap(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, - int x, int y, int cx, int cy) +int APP_CC +xrdp_wm_send_bitmap(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, + int x, int y, int cx, int cy) { - int data_size; - int line_size; - int i; - int j; - int total_lines; - int lines_sending; - int Bpp; - int e; - int bufsize; - int total_bufsize; - int num_updates; - char* p_num_updates; - char* p; - char* q; - struct stream* s; - struct stream* temp_s; - - Bpp = (bitmap->bpp + 7) / 8; - e = bitmap->width % 4; - if (e != 0) - { - e = 4 - e; - } - line_size = bitmap->width * Bpp; - make_stream(s); - init_stream(s, 8192); - if (self->client_info->use_bitmap_comp) - { - make_stream(temp_s); - init_stream(temp_s, 65536); - i = 0; - if (cy <= bitmap->height) - { - i = cy; - } - while (i > 0) - { - total_bufsize = 0; - num_updates = 0; - xrdp_rdp_init_data(self->rdp_layer, s); - out_uint16_le(s, RDP_UPDATE_BITMAP); - p_num_updates = s->p; - out_uint8s(s, 2); /* num_updates set later */ - do - { - if (self->client_info->op1) - { - s_push_layer(s, channel_hdr, 18); - } - else - { - s_push_layer(s, channel_hdr, 26); - } - p = s->p; - lines_sending = xrdp_bitmap_compress(bitmap->data, bitmap->width, - bitmap->height, - s, bitmap->bpp, - 4096 - total_bufsize, - i - 1, temp_s, e); - if (lines_sending == 0) - { - break; - } - num_updates++; - bufsize = s->p - p; - total_bufsize += bufsize; - i = i - lines_sending; - s_mark_end(s); - s_pop_layer(s, channel_hdr); - out_uint16_le(s, x); /* left */ - out_uint16_le(s, y + i); /* top */ - out_uint16_le(s, (x + cx) - 1); /* right */ - out_uint16_le(s, (y + i + lines_sending) - 1); /* bottom */ - out_uint16_le(s, bitmap->width + e); /* width */ - out_uint16_le(s, lines_sending); /* height */ - out_uint16_le(s, bitmap->bpp); /* bpp */ - if (self->client_info->op1) - { - out_uint16_le(s, 0x401); /* compress */ - out_uint16_le(s, bufsize); /* compressed size */ - j = (bitmap->width + e) * Bpp; - j = j * lines_sending; - } - else - { - out_uint16_le(s, 0x1); /* compress */ - out_uint16_le(s, bufsize + 8); - out_uint8s(s, 2); /* pad */ - out_uint16_le(s, bufsize); /* compressed size */ - j = (bitmap->width + e) * Bpp; - out_uint16_le(s, j); /* line size */ - j = j * lines_sending; - out_uint16_le(s, j); /* final size */ - } - if (j > 32768) - { - g_printf("error, decompressed size too big, its %d\n\r", j); - } - if (bufsize > 8192) - { - g_printf("error, compressed size too big, its %d\n\r", bufsize); - } - s->p = s->end; - } while (total_bufsize < 4096 && i > 0); - p_num_updates[0] = num_updates; - p_num_updates[1] = num_updates >> 8; - xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_UPDATE); - if (total_bufsize > 8192) - { - g_printf("error, total compressed size too big, its %d\n\r", - total_bufsize); - } - } - free_stream(temp_s); - } - else - { - lines_sending = 0; - data_size = bitmap->width * bitmap->height * Bpp; - total_lines = bitmap->height; - i = 0; - p = bitmap->data; - if (line_size > 0 && total_lines > 0) - { - while (i < total_lines) - { - lines_sending = 4096 / (line_size + e * Bpp); - if (i + lines_sending > total_lines) - { - lines_sending = total_lines - i; - } - p = p + line_size * lines_sending; - xrdp_rdp_init_data(self->rdp_layer, s); - out_uint16_le(s, RDP_UPDATE_BITMAP); - out_uint16_le(s, 1); /* num updates */ - out_uint16_le(s, x); - out_uint16_le(s, y + i); - out_uint16_le(s, (x + cx) - 1); - out_uint16_le(s, (y + i + lines_sending) - 1); - out_uint16_le(s, bitmap->width + e); - out_uint16_le(s, lines_sending); - out_uint16_le(s, bitmap->bpp); /* bpp */ - out_uint16_le(s, 0); /* compress */ - out_uint16_le(s, (line_size + e * Bpp) * lines_sending); /* bufsize */ - q = p; - for (j = 0; j < lines_sending; j++) - { - q = q - line_size; - out_uint8a(s, q, line_size) - out_uint8s(s, e * Bpp); - } - s_mark_end(s); - xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_UPDATE); - i = i + lines_sending; - } - } - } - free_stream(s); - return 0; + return libxrdp_send_bitmap(self->session, bitmap->width, bitmap->height, + bitmap->bpp, bitmap->data, x, y, cx, cy); } /*****************************************************************************/ -int xrdp_wm_set_focused(struct xrdp_wm* self, struct xrdp_bitmap* wnd) +int APP_CC +xrdp_wm_set_focused(struct xrdp_wm* self, struct xrdp_bitmap* wnd) { struct xrdp_bitmap* focus_out_control; struct xrdp_bitmap* focus_in_control; @@ -306,7 +124,8 @@ int xrdp_wm_set_focused(struct xrdp_wm* self, struct xrdp_bitmap* wnd) } //****************************************************************************** -int xrdp_wm_get_pixel(char* data, int x, int y, int width, int bpp) +int APP_CC +xrdp_wm_get_pixel(char* data, int x, int y, int width, int bpp) { int start; int shift; @@ -336,9 +155,9 @@ int xrdp_wm_get_pixel(char* data, int x, int y, int width, int bpp) } /*****************************************************************************/ -int xrdp_wm_pointer(struct xrdp_wm* self, char* data, char* mask, int x, int y) +int APP_CC +xrdp_wm_pointer(struct xrdp_wm* self, char* data, char* mask, int x, int y) { - struct xrdp_pointer_item pointer_item; g_memset(&pointer_item, 0, sizeof(struct xrdp_pointer_item)); @@ -351,8 +170,9 @@ int xrdp_wm_pointer(struct xrdp_wm* self, char* data, char* mask, int x, int y) } /*****************************************************************************/ -int xrdp_wm_load_pointer(struct xrdp_wm* self, char* file_name, char* data, - char* mask, int* x, int* y) +int APP_CC +xrdp_wm_load_pointer(struct xrdp_wm* self, char* file_name, char* data, + char* mask, int* x, int* y) { int fd; int bpp; @@ -423,67 +243,24 @@ int xrdp_wm_load_pointer(struct xrdp_wm* self, char* file_name, char* data, } /*****************************************************************************/ -int xrdp_wm_send_pointer(struct xrdp_wm* self, int cache_idx, - char* data, char* mask, int x, int y) +int APP_CC +xrdp_wm_send_pointer(struct xrdp_wm* self, int cache_idx, + char* data, char* mask, int x, int y) { - struct stream* s; - char* p; - int i; - int j; - - make_stream(s); - init_stream(s, 8192); - xrdp_rdp_init_data(self->rdp_layer, s); - out_uint16_le(s, RDP_POINTER_COLOR); - out_uint16_le(s, 0); /* pad */ - out_uint16_le(s, cache_idx); /* cache_idx */ - out_uint16_le(s, x); - out_uint16_le(s, y); - out_uint16_le(s, 32); - out_uint16_le(s, 32); - out_uint16_le(s, 128); - out_uint16_le(s, 3072); - p = data; - for (i = 0; i < 32; i++) - { - for (j = 0; j < 32; j++) - { - out_uint8(s, *p); - p++; - out_uint8(s, *p); - p++; - out_uint8(s, *p); - p++; - } - } - out_uint8a(s, mask, 128); /* mask */ - s_mark_end(s); - xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_POINTER); - free_stream(s); - return 0; + return libxrdp_send_pointer(self->session, cache_idx, data, mask, x, y); } /*****************************************************************************/ -int xrdp_wm_set_pointer(struct xrdp_wm* self, int cache_idx) +int APP_CC +xrdp_wm_set_pointer(struct xrdp_wm* self, int cache_idx) { - struct stream* s; - - make_stream(s); - init_stream(s, 8192); - xrdp_rdp_init_data(self->rdp_layer, s); - out_uint16_le(s, RDP_POINTER_CACHED); - out_uint16_le(s, 0); /* pad */ - out_uint16_le(s, cache_idx); /* cache_idx */ - s_mark_end(s); - xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_POINTER); - free_stream(s); - return 0; + return libxrdp_set_pointer(self->session, cache_idx); } /*****************************************************************************/ -int xrdp_wm_init(struct xrdp_wm* self) +int APP_CC +xrdp_wm_init(struct xrdp_wm* self) { -#ifndef XRDP_LIB /* if lib, dodn't create login screen */ int bindex; int gindex; int rindex; @@ -563,16 +340,16 @@ int xrdp_wm_init(struct xrdp_wm* self) xrdp_wm_set_focused(self, self->login_window); -#endif return 0; } /*****************************************************************************/ /* returns the number for rects visible for an area relative to a drawable */ /* putting the rects in region */ -int xrdp_wm_get_vis_region(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, - int x, int y, int cx, int cy, - struct xrdp_region* region, int clip_children) +int APP_CC +xrdp_wm_get_vis_region(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, + int x, int y, int cx, int cy, + struct xrdp_region* region, int clip_children) { int i; struct xrdp_bitmap* p; @@ -597,7 +374,7 @@ int xrdp_wm_get_vis_region(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, /* loop through all windows in z order */ for (i = 0; i < self->screen->child_list->count; i++) { - p = (struct xrdp_bitmap*)xrdp_list_get_item(self->screen->child_list, i); + p = (struct xrdp_bitmap*)list_get_item(self->screen->child_list, i); if (p == bitmap || p == bitmap->parent) { return 0; @@ -611,8 +388,9 @@ int xrdp_wm_get_vis_region(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, /*****************************************************************************/ /* return the window at x, y on the screen */ -struct xrdp_bitmap* xrdp_wm_at_pos(struct xrdp_bitmap* wnd, int x, int y, - struct xrdp_bitmap** wnd1) +static struct xrdp_bitmap* APP_CC +xrdp_wm_at_pos(struct xrdp_bitmap* wnd, int x, int y, + struct xrdp_bitmap** wnd1) { int i; struct xrdp_bitmap* p; @@ -621,7 +399,7 @@ struct xrdp_bitmap* xrdp_wm_at_pos(struct xrdp_bitmap* wnd, int x, int y, /* loop through all windows in z order */ for (i = 0; i < wnd->child_list->count; i++) { - p = (struct xrdp_bitmap*)xrdp_list_get_item(wnd->child_list, i); + p = (struct xrdp_bitmap*)list_get_item(wnd->child_list, i); if (x >= p->left && y >= p->top && x < p->left + p->width && y < p->top + p->height) { @@ -644,7 +422,8 @@ struct xrdp_bitmap* xrdp_wm_at_pos(struct xrdp_bitmap* wnd, int x, int y, } /*****************************************************************************/ -int xrdp_wm_xor_pat(struct xrdp_wm* self, int x, int y, int cx, int cy) +static int APP_CC +xrdp_wm_xor_pat(struct xrdp_wm* self, int x, int y, int cx, int cy) { self->painter->clip_children = 0; self->painter->rop = 0x5a; @@ -681,10 +460,11 @@ int xrdp_wm_xor_pat(struct xrdp_wm* self, int x, int y, int cx, int cy) /*****************************************************************************/ /* this don't are about nothing, just copy the bits */ /* no clipping rects, no windows in the way, nothing */ -int xrdp_wm_bitblt(struct xrdp_wm* self, - struct xrdp_bitmap* dst, int dx, int dy, - struct xrdp_bitmap* src, int sx, int sy, - int sw, int sh, int rop) +int APP_CC +xrdp_wm_bitblt(struct xrdp_wm* self, + struct xrdp_bitmap* dst, int dx, int dy, + struct xrdp_bitmap* src, int sx, int sy, + int sw, int sh, int rop) { // int i; // int line_size; @@ -706,9 +486,9 @@ int xrdp_wm_bitblt(struct xrdp_wm* self, // s += src->width * Bpp; // d += dst->width * Bpp; // } - xrdp_orders_init(self->orders); - xrdp_orders_screen_blt(self->orders, dx, dy, sw, sh, sx, sy, rop, 0); - xrdp_orders_send(self->orders); + libxrdp_orders_init(self->session); + libxrdp_orders_screen_blt(self->session, dx, dy, sw, sh, sx, sy, rop, 0); + libxrdp_orders_send(self->session); } return 0; } @@ -716,8 +496,9 @@ int xrdp_wm_bitblt(struct xrdp_wm* self, /*****************************************************************************/ /* return true is rect is totaly exposed going in reverse z order */ /* from wnd up */ -int xrdp_wm_is_rect_vis(struct xrdp_wm* self, struct xrdp_bitmap* wnd, - struct xrdp_rect* rect) +int APP_CC +xrdp_wm_is_rect_vis(struct xrdp_wm* self, struct xrdp_bitmap* wnd, + struct xrdp_rect* rect) { struct xrdp_rect wnd_rect; struct xrdp_bitmap* b; @@ -741,11 +522,11 @@ int xrdp_wm_is_rect_vis(struct xrdp_wm* self, struct xrdp_bitmap* wnd, return 0; } - i = xrdp_list_index_of(self->screen->child_list, (long)wnd); + i = list_index_of(self->screen->child_list, (long)wnd); i--; while (i >= 0) { - b = (struct xrdp_bitmap*)xrdp_list_get_item(self->screen->child_list, i); + b = (struct xrdp_bitmap*)list_get_item(self->screen->child_list, i); MAKERECT(wnd_rect, b->left, b->top, b->width, b->height); if (rect_intersect(rect, &wnd_rect, 0)) { @@ -757,8 +538,9 @@ int xrdp_wm_is_rect_vis(struct xrdp_wm* self, struct xrdp_bitmap* wnd, } /*****************************************************************************/ -int xrdp_wm_move_window(struct xrdp_wm* self, struct xrdp_bitmap* wnd, - int dx, int dy) +int APP_CC +xrdp_wm_move_window(struct xrdp_wm* self, struct xrdp_bitmap* wnd, + int dx, int dy) { struct xrdp_rect rect1; struct xrdp_rect rect2; @@ -798,7 +580,8 @@ int xrdp_wm_move_window(struct xrdp_wm* self, struct xrdp_bitmap* wnd, } /*****************************************************************************/ -int xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y) +int APP_CC +xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y) { struct xrdp_bitmap* b; int boxx; @@ -856,7 +639,7 @@ int xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y) { if (self->mod->mod_event != 0) { - self->mod->mod_event(self->mod, WM_MOUSEMOVE, x, y); + self->mod->mod_event(self->mod, WM_MOUSEMOVE, x, y, 0, 0); } } } @@ -898,7 +681,8 @@ int xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y) } /*****************************************************************************/ -int xrdp_wm_clear_popup(struct xrdp_wm* self) +static int APP_CC +xrdp_wm_clear_popup(struct xrdp_wm* self) { int i; struct xrdp_rect rect; @@ -908,8 +692,8 @@ int xrdp_wm_clear_popup(struct xrdp_wm* self) if (self->popup_wnd != 0) { //b = self->popup_wnd->popped_from; - i = xrdp_list_index_of(self->screen->child_list, (long)self->popup_wnd); - xrdp_list_remove_item(self->screen->child_list, i); + i = list_index_of(self->screen->child_list, (long)self->popup_wnd); + list_remove_item(self->screen->child_list, i); MAKERECT(rect, self->popup_wnd->left, self->popup_wnd->top, self->popup_wnd->width, self->popup_wnd->height); xrdp_bitmap_invalidate(self->screen, &rect); @@ -920,7 +704,8 @@ int xrdp_wm_clear_popup(struct xrdp_wm* self) } /*****************************************************************************/ -int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down) +int APP_CC +xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down) { struct xrdp_bitmap* control; struct xrdp_bitmap* focus_out_control; @@ -979,41 +764,41 @@ int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down) { if (but == 1 && down) { - self->mod->mod_event(self->mod, WM_LBUTTONDOWN, x, y); + self->mod->mod_event(self->mod, WM_LBUTTONDOWN, x, y, 0, 0); } else if (but == 1 && !down) { - self->mod->mod_event(self->mod, WM_LBUTTONUP, x, y); + self->mod->mod_event(self->mod, WM_LBUTTONUP, x, y, 0, 0); } if (but == 2 && down) { - self->mod->mod_event(self->mod, WM_RBUTTONDOWN, x, y); + self->mod->mod_event(self->mod, WM_RBUTTONDOWN, x, y, 0, 0); } else if (but == 2 && !down) { - self->mod->mod_event(self->mod, WM_RBUTTONUP, x, y); + self->mod->mod_event(self->mod, WM_RBUTTONUP, x, y, 0, 0); } if (but == 3 && down) { - self->mod->mod_event(self->mod, WM_BUTTON3DOWN, x, y); + self->mod->mod_event(self->mod, WM_BUTTON3DOWN, x, y, 0, 0); } else if (but == 3 && !down) { - self->mod->mod_event(self->mod, WM_BUTTON3UP, x, y); + self->mod->mod_event(self->mod, WM_BUTTON3UP, x, y, 0, 0); } if (but == 4) { self->mod->mod_event(self->mod, WM_BUTTON4DOWN, - self->mouse_x, self->mouse_y); + self->mouse_x, self->mouse_y, 0, 0); self->mod->mod_event(self->mod, WM_BUTTON4UP, - self->mouse_x, self->mouse_y); + self->mouse_x, self->mouse_y, 0, 0); } if (but == 5) { self->mod->mod_event(self->mod, WM_BUTTON5DOWN, - self->mouse_x, self->mouse_y); + self->mouse_x, self->mouse_y, 0, 0); self->mod->mod_event(self->mod, WM_BUTTON5UP, - self->mouse_x, self->mouse_y); + self->mouse_x, self->mouse_y, 0, 0); } } } @@ -1126,7 +911,8 @@ int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down) } /*****************************************************************************/ -int xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code) +int APP_CC +xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code) { int msg; char c; @@ -1163,11 +949,11 @@ int xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code) self->scroll_lock); if (c != 0) { - self->mod->mod_event(self->mod, msg, c, 0xffff); + self->mod->mod_event(self->mod, msg, c, 0xffff, 0, 0); } else { - self->mod->mod_event(self->mod, msg, scan_code, device_flags); + self->mod->mod_event(self->mod, msg, scan_code, device_flags, 0, 0); } } } @@ -1181,7 +967,8 @@ int xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code) /*****************************************************************************/ /* happens when client gets focus and sends key modifier info */ -int xrdp_wm_key_sync(struct xrdp_wm* self, int device_flags, int key_flags) +int APP_CC +xrdp_wm_key_sync(struct xrdp_wm* self, int device_flags, int key_flags) { self->num_lock = 0; self->scroll_lock = 0; @@ -1202,7 +989,8 @@ int xrdp_wm_key_sync(struct xrdp_wm* self, int device_flags, int key_flags) } /*****************************************************************************/ -int xrdp_wm_pu(struct xrdp_wm* self, struct xrdp_bitmap* control) +int APP_CC +xrdp_wm_pu(struct xrdp_wm* self, struct xrdp_bitmap* control) { int x; int y; @@ -1226,7 +1014,103 @@ int xrdp_wm_pu(struct xrdp_wm* self, struct xrdp_bitmap* control) self->popup_wnd->left = x; self->popup_wnd->top = y + control->height; self->popup_wnd->item_index = control->item_index; - xrdp_list_insert_item(self->screen->child_list, 0, (long)self->popup_wnd); + list_insert_item(self->screen->child_list, 0, (long)self->popup_wnd); xrdp_bitmap_invalidate(self->popup_wnd, 0); return 0; } + +/*****************************************************************************/ +static int APP_CC +xrdp_wm_process_input_mouse(struct xrdp_wm* self, int device_flags, + int x, int y) +{ + DEBUG(("mouse event flags %4.4x x %d y %d\n\r", device_flags, x, y)); + if (device_flags & MOUSE_FLAG_MOVE) /* 0x0800 */ + { + xrdp_wm_mouse_move(self->pro_layer->wm, x, y); + } + if (device_flags & MOUSE_FLAG_BUTTON1) /* 0x1000 */ + { + if (device_flags & MOUSE_FLAG_DOWN) /* 0x8000 */ + { + xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 1, 1); + } + else + { + xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 1, 0); + } + } + if (device_flags & MOUSE_FLAG_BUTTON2) /* 0x2000 */ + { + if (device_flags & MOUSE_FLAG_DOWN) /* 0x8000 */ + { + xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 2, 1); + } + else + { + xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 2, 0); + } + } + if (device_flags & MOUSE_FLAG_BUTTON3) /* 0x4000 */ + { + if (device_flags & MOUSE_FLAG_DOWN) /* 0x8000 */ + { + xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 3, 1); + } + else + { + xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 3, 0); + } + } + if (device_flags == MOUSE_FLAG_BUTTON4 || /* 0x0280 */ + device_flags == 0x0278) + { + xrdp_wm_mouse_click(self->pro_layer->wm, 0, 0, 4, 0); + } + if (device_flags == MOUSE_FLAG_BUTTON5 || /* 0x0380 */ + device_flags == 0x0388) + { + xrdp_wm_mouse_click(self->pro_layer->wm, 0, 0, 5, 0); + } + return 0; +} + +/******************************************************************************/ +/* this is the callbacks comming from libxrdp.so */ +int +callback(long id, int msg, long param1, long param2, long param3, long param4) +{ + int rv; + struct xrdp_wm* wm; + struct xrdp_rect rect; + + if (id == 0) /* "id" should be "struct xrdp_process*" as long */ + { + return 0; + } + wm = ((struct xrdp_process*)id)->wm; + if (wm == 0) + { + return 0; + } + rv = 0; + switch (msg) + { + case 0: /* RDP_INPUT_SYNCHRONIZE */ + rv = xrdp_wm_key_sync(wm, param3, param1); + break; + case 4: /* RDP_INPUT_SCANCODE */ + rv = xrdp_wm_key(wm, param3, param1); + break; + case 0x8001: /* RDP_INPUT_MOUSE */ + rv = xrdp_wm_process_input_mouse(wm, param3, param1, param2); + break; + case 0x4444: /* invalidate, this is not from RDP_DATA_PDU_INPUT */ + /* like the rest, its from RDP_PDU_DATA with code 33 */ + /* its the rdp client asking for a screen update */ + MAKERECT(rect, param1, param2, param3, param4); + rv = xrdp_bitmap_invalidate(wm->screen, &rect); + break; + } + return rv; +} |