pass the client_info(caps) on to module and xserver
This commit is contained in:
parent
67bd319adf
commit
e0fc7297f5
79
common/xrdp_client_info.h
Normal file
79
common/xrdp_client_info.h
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2012 Jay Sorg
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
xrdp / xserver info / caps
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(XRDP_CLIENT_INFO_H)
|
||||||
|
#define XRDP_CLIENT_INFO_H
|
||||||
|
|
||||||
|
struct xrdp_client_info
|
||||||
|
{
|
||||||
|
int size; /* bytes for this structure */
|
||||||
|
int bpp;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
/* bitmap cache info */
|
||||||
|
int cache1_entries;
|
||||||
|
int cache1_size;
|
||||||
|
int cache2_entries;
|
||||||
|
int cache2_size;
|
||||||
|
int cache3_entries;
|
||||||
|
int cache3_size;
|
||||||
|
int bitmap_cache_persist_enable; /* 0 or 2 */
|
||||||
|
int bitmap_cache_version; /* 0 = original version, 2 = v2 */
|
||||||
|
/* pointer info */
|
||||||
|
int pointer_cache_entries;
|
||||||
|
/* other */
|
||||||
|
int use_bitmap_comp;
|
||||||
|
int use_bitmap_cache;
|
||||||
|
int op1; /* use smaller bitmap header, non cache */
|
||||||
|
int op2; /* use smaller bitmap header in bitmap cache */
|
||||||
|
int desktop_cache;
|
||||||
|
int use_compact_packets; /* rdp5 smaller packets */
|
||||||
|
char hostname[32];
|
||||||
|
int build;
|
||||||
|
int keylayout;
|
||||||
|
char username[256];
|
||||||
|
char password[256];
|
||||||
|
char domain[256];
|
||||||
|
char program[256];
|
||||||
|
char directory[256];
|
||||||
|
int rdp_compression;
|
||||||
|
int rdp_autologin;
|
||||||
|
int crypt_level; /* 1, 2, 3 = low, medium, high */
|
||||||
|
int channel_code; /* 0 = no channels 1 = channels */
|
||||||
|
int sound_code; /* 1 = leave sound at server */
|
||||||
|
int is_mce;
|
||||||
|
int rdp5_performanceflags;
|
||||||
|
int brush_cache_code; /* 0 = no cache 1 = 8x8 standard cache
|
||||||
|
2 = arbitrary dimensions */
|
||||||
|
char client_ip[256];
|
||||||
|
int max_bpp;
|
||||||
|
int jpeg; /* non standard bitmap cache v2 cap */
|
||||||
|
int offscreen_support_level;
|
||||||
|
int offscreen_cache_size;
|
||||||
|
int offscreen_cache_entries;
|
||||||
|
int rfx;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -37,6 +37,7 @@
|
|||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "libxrdpinc.h"
|
#include "libxrdpinc.h"
|
||||||
#include "file_loc.h"
|
#include "file_loc.h"
|
||||||
|
#include "xrdp_client_info.h"
|
||||||
|
|
||||||
/* tcp */
|
/* tcp */
|
||||||
struct xrdp_tcp
|
struct xrdp_tcp
|
||||||
|
@ -23,50 +23,7 @@
|
|||||||
#ifndef LIBXRDPINC_H
|
#ifndef LIBXRDPINC_H
|
||||||
#define LIBXRDPINC_H
|
#define LIBXRDPINC_H
|
||||||
|
|
||||||
struct xrdp_client_info
|
/* struct xrdp_client_info moved to xrdp_client_info.h */
|
||||||
{
|
|
||||||
int bpp;
|
|
||||||
int width;
|
|
||||||
int height;
|
|
||||||
/* bitmap cache info */
|
|
||||||
int cache1_entries;
|
|
||||||
int cache1_size;
|
|
||||||
int cache2_entries;
|
|
||||||
int cache2_size;
|
|
||||||
int cache3_entries;
|
|
||||||
int cache3_size;
|
|
||||||
int bitmap_cache_persist_enable; /* 0 or 2 */
|
|
||||||
int bitmap_cache_version; /* 0 = original version, 2 = v2 */
|
|
||||||
/* pointer info */
|
|
||||||
int pointer_cache_entries;
|
|
||||||
/* other */
|
|
||||||
int use_bitmap_comp;
|
|
||||||
int use_bitmap_cache;
|
|
||||||
int op1; /* use smaller bitmap header, non cache */
|
|
||||||
int op2; /* use smaller bitmap header in bitmap cache */
|
|
||||||
int desktop_cache;
|
|
||||||
int use_compact_packets; /* rdp5 smaller packets */
|
|
||||||
char hostname[32];
|
|
||||||
int build;
|
|
||||||
int keylayout;
|
|
||||||
char username[256];
|
|
||||||
char password[256];
|
|
||||||
char domain[256];
|
|
||||||
char program[256];
|
|
||||||
char directory[256];
|
|
||||||
int rdp_compression;
|
|
||||||
int rdp_autologin;
|
|
||||||
int crypt_level; /* 1, 2, 3 = low, medium, high */
|
|
||||||
int channel_code; /* 0 = no channels 1 = channels */
|
|
||||||
int sound_code; /* 1 = leave sound at server */
|
|
||||||
int is_mce;
|
|
||||||
int rdp5_performanceflags;
|
|
||||||
int brush_cache_code; /* 0 = no cache 1 = 8x8 standard cache
|
|
||||||
2 = arbitrary dimensions */
|
|
||||||
char client_ip[256];
|
|
||||||
int max_bpp;
|
|
||||||
int jpeg;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct xrdp_brush
|
struct xrdp_brush
|
||||||
{
|
{
|
||||||
|
@ -157,6 +157,7 @@ xrdp_rdp_create(struct xrdp_session* session, struct trans* trans)
|
|||||||
#if defined(XRDP_FREERDP1)
|
#if defined(XRDP_FREERDP1)
|
||||||
self->mppc_enc = mppc_enc_new(PROTO_RDP_50);
|
self->mppc_enc = mppc_enc_new(PROTO_RDP_50);
|
||||||
#endif
|
#endif
|
||||||
|
self->client_info.size = sizeof(self->client_info);
|
||||||
DEBUG(("out xrdp_rdp_create"));
|
DEBUG(("out xrdp_rdp_create"));
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
@ -795,6 +796,32 @@ xrdp_process_capset_brushcache(struct xrdp_rdp* self, struct stream* s,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
static int APP_CC
|
||||||
|
xrdp_process_offscreen_bmpcache(struct xrdp_rdp* self, struct stream* s,
|
||||||
|
int len)
|
||||||
|
{
|
||||||
|
int i32;
|
||||||
|
|
||||||
|
if (len - 4 < 8)
|
||||||
|
{
|
||||||
|
g_writeln("xrdp_process_offscreen_bmpcache: bad len");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
in_uint32_le(s, i32);
|
||||||
|
self->client_info.offscreen_support_level = i32;
|
||||||
|
in_uint16_le(s, i32);
|
||||||
|
self->client_info.offscreen_cache_size = i32 * 1024;
|
||||||
|
in_uint16_le(s, i32);
|
||||||
|
self->client_info.offscreen_cache_entries = i32;
|
||||||
|
g_writeln("xrdp_process_offscreen_bmpcache: support level %d "
|
||||||
|
"cache size %d MB cache entries %d",
|
||||||
|
self->client_info.offscreen_support_level,
|
||||||
|
self->client_info.offscreen_cache_size,
|
||||||
|
self->client_info.offscreen_cache_entries);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
int APP_CC
|
int APP_CC
|
||||||
xrdp_rdp_process_confirm_active(struct xrdp_rdp* self, struct stream* s)
|
xrdp_rdp_process_confirm_active(struct xrdp_rdp* self, struct stream* s)
|
||||||
@ -869,7 +896,8 @@ xrdp_rdp_process_confirm_active(struct xrdp_rdp* self, struct stream* s)
|
|||||||
DEBUG(("--16"));
|
DEBUG(("--16"));
|
||||||
break;
|
break;
|
||||||
case 17: /* 17 */
|
case 17: /* 17 */
|
||||||
DEBUG(("--16"));
|
DEBUG(("CAPSET_TYPE_OFFSCREEN_CACHE"));
|
||||||
|
xrdp_process_offscreen_bmpcache(self, s, len);
|
||||||
break;
|
break;
|
||||||
case RDP_CAPSET_BMPCACHE2: /* 19 */
|
case RDP_CAPSET_BMPCACHE2: /* 19 */
|
||||||
DEBUG(("RDP_CAPSET_BMPCACHE2"));
|
DEBUG(("RDP_CAPSET_BMPCACHE2"));
|
||||||
|
@ -70,6 +70,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||||||
#include "exevents.h"
|
#include "exevents.h"
|
||||||
#include "xserver-properties.h"
|
#include "xserver-properties.h"
|
||||||
#include "xkbsrv.h"
|
#include "xkbsrv.h"
|
||||||
|
#include "../../../common/xrdp_client_info.h"
|
||||||
|
|
||||||
//#include "colormapst.h"
|
//#include "colormapst.h"
|
||||||
|
|
||||||
@ -133,6 +134,8 @@ struct _rdpScreenInfoRec
|
|||||||
int rdp_bpp;
|
int rdp_bpp;
|
||||||
int rdp_Bpp;
|
int rdp_Bpp;
|
||||||
int rdp_Bpp_mask;
|
int rdp_Bpp_mask;
|
||||||
|
|
||||||
|
struct xrdp_client_info client_info;
|
||||||
};
|
};
|
||||||
typedef struct _rdpScreenInfoRec rdpScreenInfoRec;
|
typedef struct _rdpScreenInfoRec rdpScreenInfoRec;
|
||||||
typedef rdpScreenInfoRec* rdpScreenInfoPtr;
|
typedef rdpScreenInfoRec* rdpScreenInfoPtr;
|
||||||
|
@ -413,6 +413,7 @@ rdpup_process_msg(struct stream* s)
|
|||||||
int param2;
|
int param2;
|
||||||
int param3;
|
int param3;
|
||||||
int param4;
|
int param4;
|
||||||
|
int bytes;
|
||||||
|
|
||||||
in_uint16_le(s, msg_type);
|
in_uint16_le(s, msg_type);
|
||||||
if (msg_type == 103)
|
if (msg_type == 103)
|
||||||
@ -494,9 +495,28 @@ param4 %d\n", msg, param1, param2, param3, param4));
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (msg_type == 104)
|
||||||
|
{
|
||||||
|
in_uint32_le(s, bytes);
|
||||||
|
if (bytes > sizeof(g_rdpScreen.client_info))
|
||||||
|
{
|
||||||
|
bytes = sizeof(g_rdpScreen.client_info);
|
||||||
|
}
|
||||||
|
memcpy(&(g_rdpScreen.client_info), s->p - 4, bytes);
|
||||||
|
g_rdpScreen.client_info.size = bytes;
|
||||||
|
ErrorF("rdpup_process_msg: got client info bytes %d\n", bytes);
|
||||||
|
ErrorF(" jpeg support %d\n",
|
||||||
|
g_rdpScreen.client_info.jpeg);
|
||||||
|
ErrorF(" offscreen support %d\n",
|
||||||
|
g_rdpScreen.client_info.offscreen_support_level);
|
||||||
|
ErrorF(" offscreen size %d\n",
|
||||||
|
g_rdpScreen.client_info.offscreen_cache_size);
|
||||||
|
ErrorF(" offscreen entries %d\n",
|
||||||
|
g_rdpScreen.client_info.offscreen_cache_entries);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rdpLog("unknown message type in rdpup_process_msg\n");
|
rdpLog("unknown message type in rdpup_process_msg %d\n", msg_type);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "file_loc.h"
|
#include "file_loc.h"
|
||||||
|
#include "xrdp_client_info.h"
|
||||||
|
|
||||||
/* xrdp.c */
|
/* xrdp.c */
|
||||||
long APP_CC
|
long APP_CC
|
||||||
|
@ -430,6 +430,10 @@ xrdp_mm_setup_mod2(struct xrdp_mm* self)
|
|||||||
list_add_item(self->login_values, (long)g_strdup(text));
|
list_add_item(self->login_values, (long)g_strdup(text));
|
||||||
}
|
}
|
||||||
/* always set these */
|
/* always set these */
|
||||||
|
|
||||||
|
self->mod->mod_set_param(self->mod, "client_info",
|
||||||
|
(char*)(self->wm->session->client_info));
|
||||||
|
|
||||||
name = self->wm->session->client_info->hostname;
|
name = self->wm->session->client_info->hostname;
|
||||||
self->mod->mod_set_param(self->mod, "hostname", name);
|
self->mod->mod_set_param(self->mod, "hostname", name);
|
||||||
g_snprintf(text, 255, "%d", self->wm->session->client_info->keylayout);
|
g_snprintf(text, 255, "%d", self->wm->session->client_info->keylayout);
|
||||||
|
31
xup/xup.c
31
xup/xup.c
@ -248,7 +248,7 @@ lib_mod_connect(struct mod* mod)
|
|||||||
out_uint32_le(s, mod->width);
|
out_uint32_le(s, mod->width);
|
||||||
out_uint32_le(s, mod->height);
|
out_uint32_le(s, mod->height);
|
||||||
out_uint32_le(s, mod->bpp);
|
out_uint32_le(s, mod->bpp);
|
||||||
out_uint32_le(s, mod->rfx); /* send rfx flag */
|
out_uint32_le(s, 0);
|
||||||
s_mark_end(s);
|
s_mark_end(s);
|
||||||
len = (int)(s->end - s->data);
|
len = (int)(s->end - s->data);
|
||||||
s_pop_layer(s, iso_hdr);
|
s_pop_layer(s, iso_hdr);
|
||||||
@ -471,6 +471,29 @@ lib_mod_process_orders(struct mod* mod, int type, struct stream* s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* return error */
|
||||||
|
static int APP_CC
|
||||||
|
lib_send_client_info(struct mod* mod)
|
||||||
|
{
|
||||||
|
struct stream* s;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
make_stream(s);
|
||||||
|
init_stream(s, 8192);
|
||||||
|
s_push_layer(s, iso_hdr, 4);
|
||||||
|
out_uint16_le(s, 104);
|
||||||
|
g_memcpy(s->p, &(mod->client_info), sizeof(mod->client_info));
|
||||||
|
s->p += sizeof(mod->client_info);
|
||||||
|
s_mark_end(s);
|
||||||
|
len = (int)(s->end - s->data);
|
||||||
|
s_pop_layer(s, iso_hdr);
|
||||||
|
out_uint32_le(s, len);
|
||||||
|
lib_send(mod, s->data, len);
|
||||||
|
free_stream(s);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/* return error */
|
/* return error */
|
||||||
int DEFAULT_CC
|
int DEFAULT_CC
|
||||||
@ -531,6 +554,7 @@ lib_mod_signal(struct mod* mod)
|
|||||||
}
|
}
|
||||||
s->p = phold + len;
|
s->p = phold + len;
|
||||||
}
|
}
|
||||||
|
lib_send_client_info(mod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (type == 3) /* order list with len after type */
|
else if (type == 3) /* order list with len after type */
|
||||||
@ -592,10 +616,9 @@ lib_mod_set_param(struct mod* mod, char* name, char* value)
|
|||||||
{
|
{
|
||||||
g_strncpy(mod->port, value, 255);
|
g_strncpy(mod->port, value, 255);
|
||||||
}
|
}
|
||||||
else if (g_strcasecmp(name, "rfx") == 0)
|
else if (g_strcasecmp(name, "client_info") == 0)
|
||||||
{
|
{
|
||||||
mod->rfx = g_atoi(value);
|
g_memcpy(&(mod->client_info), value, sizeof(mod->client_info));
|
||||||
g_writeln("mod->rfx = %d", mod->rfx);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
#include "os_calls.h"
|
#include "os_calls.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
#include "xrdp_client_info.h"
|
||||||
|
|
||||||
#define CURRENT_MOD_VER 2
|
#define CURRENT_MOD_VER 2
|
||||||
|
|
||||||
@ -105,5 +106,5 @@ struct mod
|
|||||||
char port[256];
|
char port[256];
|
||||||
tbus sck_obj;
|
tbus sck_obj;
|
||||||
int shift_state;
|
int shift_state;
|
||||||
int rfx;
|
struct xrdp_client_info client_info;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user