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 "libxrdpinc.h"
|
||||
#include "file_loc.h"
|
||||
#include "xrdp_client_info.h"
|
||||
|
||||
/* tcp */
|
||||
struct xrdp_tcp
|
||||
|
@ -23,50 +23,7 @@
|
||||
#ifndef LIBXRDPINC_H
|
||||
#define LIBXRDPINC_H
|
||||
|
||||
struct xrdp_client_info
|
||||
{
|
||||
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_client_info moved to xrdp_client_info.h */
|
||||
|
||||
struct xrdp_brush
|
||||
{
|
||||
|
@ -157,6 +157,7 @@ xrdp_rdp_create(struct xrdp_session* session, struct trans* trans)
|
||||
#if defined(XRDP_FREERDP1)
|
||||
self->mppc_enc = mppc_enc_new(PROTO_RDP_50);
|
||||
#endif
|
||||
self->client_info.size = sizeof(self->client_info);
|
||||
DEBUG(("out xrdp_rdp_create"));
|
||||
return self;
|
||||
}
|
||||
@ -795,6 +796,32 @@ xrdp_process_capset_brushcache(struct xrdp_rdp* self, struct stream* s,
|
||||
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
|
||||
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"));
|
||||
break;
|
||||
case 17: /* 17 */
|
||||
DEBUG(("--16"));
|
||||
DEBUG(("CAPSET_TYPE_OFFSCREEN_CACHE"));
|
||||
xrdp_process_offscreen_bmpcache(self, s, len);
|
||||
break;
|
||||
case RDP_CAPSET_BMPCACHE2: /* 19 */
|
||||
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 "xserver-properties.h"
|
||||
#include "xkbsrv.h"
|
||||
#include "../../../common/xrdp_client_info.h"
|
||||
|
||||
//#include "colormapst.h"
|
||||
|
||||
@ -133,6 +134,8 @@ struct _rdpScreenInfoRec
|
||||
int rdp_bpp;
|
||||
int rdp_Bpp;
|
||||
int rdp_Bpp_mask;
|
||||
|
||||
struct xrdp_client_info client_info;
|
||||
};
|
||||
typedef struct _rdpScreenInfoRec rdpScreenInfoRec;
|
||||
typedef rdpScreenInfoRec* rdpScreenInfoPtr;
|
||||
|
@ -413,6 +413,7 @@ rdpup_process_msg(struct stream* s)
|
||||
int param2;
|
||||
int param3;
|
||||
int param4;
|
||||
int bytes;
|
||||
|
||||
in_uint16_le(s, msg_type);
|
||||
if (msg_type == 103)
|
||||
@ -494,9 +495,28 @@ param4 %d\n", msg, param1, param2, param3, param4));
|
||||
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
|
||||
{
|
||||
rdpLog("unknown message type in rdpup_process_msg\n");
|
||||
rdpLog("unknown message type in rdpup_process_msg %d\n", msg_type);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include "list.h"
|
||||
#include "file.h"
|
||||
#include "file_loc.h"
|
||||
#include "xrdp_client_info.h"
|
||||
|
||||
/* xrdp.c */
|
||||
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));
|
||||
}
|
||||
/* 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;
|
||||
self->mod->mod_set_param(self->mod, "hostname", name);
|
||||
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->height);
|
||||
out_uint32_le(s, mod->bpp);
|
||||
out_uint32_le(s, mod->rfx); /* send rfx flag */
|
||||
out_uint32_le(s, 0);
|
||||
s_mark_end(s);
|
||||
len = (int)(s->end - s->data);
|
||||
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 */
|
||||
int DEFAULT_CC
|
||||
@ -531,6 +554,7 @@ lib_mod_signal(struct mod* mod)
|
||||
}
|
||||
s->p = phold + len;
|
||||
}
|
||||
lib_send_client_info(mod);
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
else if (g_strcasecmp(name, "rfx") == 0)
|
||||
else if (g_strcasecmp(name, "client_info") == 0)
|
||||
{
|
||||
mod->rfx = g_atoi(value);
|
||||
g_writeln("mod->rfx = %d", mod->rfx);
|
||||
g_memcpy(&(mod->client_info), value, sizeof(mod->client_info));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user