libfreerdp-core: add options for specifying compression level

This commit is contained in:
Marc-André Moreau 2014-03-10 11:16:36 -04:00
parent ab5e2b4f3d
commit 4310089102
8 changed files with 42 additions and 15 deletions

View File

@ -80,6 +80,7 @@ COMMAND_LINE_ARGUMENT_A args[] =
{ "app-file", COMMAND_LINE_VALUE_REQUIRED, "<file name>", NULL, NULL, -1, NULL, "File to open with remote application" },
{ "app-guid", COMMAND_LINE_VALUE_REQUIRED, "<app guid>", NULL, NULL, -1, NULL, "Remote application GUID" },
{ "compression", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, "z", "Compression" },
{ "compression-level", COMMAND_LINE_VALUE_REQUIRED, "<level>", NULL, NULL, -1, NULL, "Compression level (0,1,2)" },
{ "shell", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Alternate shell" },
{ "shell-dir", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Shell working directory" },
{ "sound", COMMAND_LINE_VALUE_OPTIONAL, NULL, NULL, NULL, -1, "audio", "Audio output (sound)" },
@ -1409,6 +1410,10 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings,
{
settings->CompressionEnabled = arg->Value ? TRUE : FALSE;
}
CommandLineSwitchCase(arg, "compression-level")
{
settings->CompressionLevel = atoi(arg->Value);
}
CommandLineSwitchCase(arg, "drives")
{
settings->RedirectDrives = arg->Value ? TRUE : FALSE;

View File

@ -25,14 +25,10 @@
#include <freerdp/types.h>
/* Compression Types */
#define PACKET_COMPRESSED 0x20
#define PACKET_AT_FRONT 0x40
#define PACKET_FLUSHED 0x80
#define PACKET_COMPR_TYPE_8K 0x00
#define PACKET_COMPR_TYPE_64K 0x01
#define PACKET_COMPR_TYPE_RDP6 0x02
#define PACKET_COMPR_TYPE_RDP61 0x03
#define CompressionTypeMask 0x0F
#define RDP6_HISTORY_BUF_SIZE 65536
#define RDP6_OFFSET_CACHE_SIZE 8

View File

@ -251,6 +251,13 @@ typedef struct _TARGET_NET_ADDRESS TARGET_NET_ADDRESS;
#define STATUS_VM_WAKING 0x00000502
#define STATUS_VM_BOOTING 0x00000503
/* Compression Flags */
#define PACKET_COMPR_TYPE_8K 0x00
#define PACKET_COMPR_TYPE_64K 0x01
#define PACKET_COMPR_TYPE_RDP6 0x02
#define PACKET_COMPR_TYPE_RDP61 0x03
#define PACKET_COMPR_TYPE_RDP8 0x04
/* SYSTEM_TIME */
typedef struct
{
@ -538,7 +545,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL;
#define FreeRDP_DesktopPosX 390
#define FreeRDP_DesktopPosY 391
#define FreeRDP_MultitransportFlags 512
#define FreeRDP_SupportMultitransport 513
#define FreeRDP_SupportMultitransport 513
#define FreeRDP_AlternateShell 640
#define FreeRDP_ShellWorkingDirectory 641
#define FreeRDP_AutoLogonEnabled 704
@ -558,6 +565,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL;
#define FreeRDP_UsingSavedCredentials 718
#define FreeRDP_ForceEncryptedCsPdu 719
#define FreeRDP_HiDefRemoteApp 720
#define FreeRDP_CompressionLevel 721
#define FreeRDP_IPv6Enabled 768
#define FreeRDP_ClientAddress 769
#define FreeRDP_ClientDir 770
@ -890,7 +898,8 @@ struct rdp_settings
ALIGN64 BOOL UsingSavedCredentials; /* 718 */
ALIGN64 BOOL ForceEncryptedCsPdu; /* 719 */
ALIGN64 BOOL HiDefRemoteApp; /* 720 */
UINT64 padding0768[768 - 721]; /* 721 */
ALIGN64 UINT32 CompressionLevel; /* 721 */
UINT64 padding0768[768 - 722]; /* 722 */
/* Client Info (Extra) */
ALIGN64 BOOL IPv6Enabled; /* 768 */

View File

@ -131,7 +131,7 @@ UINT32 transposebits(UINT32 x)
int decompress_rdp(struct rdp_mppc_dec* dec, BYTE* cbuf, int len, int ctype, UINT32* roff, UINT32* rlen)
{
int type = ctype & 0x0f;
UINT32 type = ctype & 0x0F;
switch (type)
{

View File

@ -1535,6 +1535,10 @@ UINT32 freerdp_get_param_uint32(rdpSettings* settings, int id)
return settings->MultitransportFlags;
break;
case FreeRDP_CompressionLevel:
return settings->CompressionLevel;
break;
case FreeRDP_AutoReconnectMaxRetries:
return settings->AutoReconnectMaxRetries;
break;
@ -1839,6 +1843,10 @@ int freerdp_set_param_uint32(rdpSettings* settings, int id, UINT32 param)
settings->MultitransportFlags = param;
break;
case FreeRDP_CompressionLevel:
settings->CompressionLevel = param;
break;
case FreeRDP_AutoReconnectMaxRetries:
settings->AutoReconnectMaxRetries = param;
break;

View File

@ -294,8 +294,9 @@ BOOL rdp_read_info_packet(wStream* s, rdpSettings* settings)
UINT16 cbPassword;
UINT16 cbAlternateShell;
UINT16 cbWorkingDir;
UINT32 CompressionLevel;
if (Stream_GetRemainingLength(s) < 18) // invalid packet
if (Stream_GetRemainingLength(s) < 18)
return FALSE;
Stream_Seek_UINT32(s); /* CodePage */
@ -308,6 +309,12 @@ BOOL rdp_read_info_packet(wStream* s, rdpSettings* settings)
settings->RemoteConsoleAudio = ((flags & INFO_REMOTECONSOLEAUDIO) ? TRUE : FALSE);
settings->CompressionEnabled = ((flags & INFO_COMPRESSION) ? TRUE : FALSE);
if (flags & INFO_COMPRESSION)
{
CompressionLevel = ((flags & 0x00001E00) >> 9);
settings->CompressionLevel = CompressionLevel;
}
Stream_Read_UINT16(s, cbDomain); /* cbDomain */
Stream_Read_UINT16(s, cbUserName); /* cbUserName */
Stream_Read_UINT16(s, cbPassword); /* cbPassword */
@ -419,7 +426,10 @@ void rdp_write_info_packet(wStream* s, rdpSettings* settings)
flags |= INFO_REMOTECONSOLEAUDIO;
if (settings->CompressionEnabled)
flags |= INFO_COMPRESSION | INFO_PACKET_COMPR_TYPE_RDP6;
{
flags |= INFO_COMPRESSION;
flags |= ((settings->CompressionLevel << 9) & 0x00001E00);
}
if (settings->Domain)
{

View File

@ -49,11 +49,6 @@
#define INFO_USING_SAVED_CREDS 0x00100000
#define INFO_AUDIOCAPTURE 0x00200000
#define INFO_VIDEO_DISABLE 0x00400000
#define INFO_CompressionTypeMask 0x00001E00
#define INFO_PACKET_COMPR_TYPE_8K 0x00000100
#define INFO_PACKET_COMPR_TYPE_64K 0x00000200
#define INFO_PACKET_COMPR_TYPE_RDP6 0x00000400
#define INFO_PACKET_COMPR_TYPE_RDP61 0x00000600
/* Logon Information Types */
#define INFO_TYPE_LOGON 0x00000000

View File

@ -252,6 +252,9 @@ rdpSettings* freerdp_settings_new(DWORD flags)
settings->EncryptionMethods = ENCRYPTION_METHOD_NONE;
settings->EncryptionLevel = ENCRYPTION_LEVEL_NONE;
settings->CompressionEnabled = FALSE;
settings->CompressionLevel = PACKET_COMPR_TYPE_64K;
settings->Authentication = TRUE;
settings->AuthenticationOnly = FALSE;
settings->CredentialsFromStdin = FALSE;
@ -509,6 +512,7 @@ rdpSettings* freerdp_settings_clone(rdpSettings* settings)
_settings->DesktopPosY = settings->DesktopPosY; /* 391 */
_settings->NumMonitorIds = settings->NumMonitorIds; /* 394 */
_settings->MultitransportFlags = settings->MultitransportFlags; /* 512 */
_settings->CompressionLevel = settings->CompressionLevel; /* 721 */
_settings->AutoReconnectMaxRetries = settings->AutoReconnectMaxRetries; /* 833 */
_settings->PerformanceFlags = settings->PerformanceFlags; /* 960 */
_settings->RequestedProtocols = settings->RequestedProtocols; /* 1093 */