From e98bb31d2745d38591e8a8543f1c19d26bcd0aed Mon Sep 17 00:00:00 2001 From: Benoit LeBlanc Date: Mon, 22 Apr 2013 18:39:18 -0400 Subject: [PATCH] RDP file writing optimization removed function freerdp_get_connection_type TODO: - validate presence of all fields - update cmdline.c to use set_param functions to modify settings. --- client/common/cmdline.c | 37 ---- client/common/file.c | 348 +++++++++++++------------------ include/freerdp/client/cmdline.h | 2 - include/freerdp/settings.h | 2 + libfreerdp/common/settings.c | 12 ++ libfreerdp/core/settings.c | 4 + 6 files changed, 166 insertions(+), 239 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 49bf55017..0633e3432 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -765,43 +765,6 @@ int freerdp_set_connection_type(rdpSettings* settings, int type) return 0; } -FREERDP_API int freerdp_get_connection_type(rdpSettings* settings) -{ - int connectionType; - - connectionType = settings->ConnectionType; - - if (~settings->ConnectionType) - { - if (settings->NetworkAutoDetect) - { - connectionType = CONNECTION_TYPE_AUTODETECT; - } - else if (settings->DisableThemes == TRUE) - { - connectionType = CONNECTION_TYPE_MODEM; - } - else if (settings->DisableWallpaper == TRUE) - { - if (settings->AllowDesktopComposition == FALSE) - { - connectionType = CONNECTION_TYPE_BROADBAND_LOW; - } - else - { - // SATELLITE or BROADBAND_HIGH: same criteria? - connectionType = CONNECTION_TYPE_BROADBAND_HIGH; - } - } - else - { - // WAN or LAN: same criteria? - connectionType = CONNECTION_TYPE_WAN; - } - } - return connectionType; -} - int freerdp_map_keyboard_layout_name_to_id(char* name) { int i; diff --git a/client/common/file.c b/client/common/file.c index 706e32b3f..f3fe41e70 100644 --- a/client/common/file.c +++ b/client/common/file.c @@ -478,80 +478,50 @@ BOOL freerdp_client_parse_rdp_file(rdpFile* file, char* name) return freerdp_client_parse_rdp_file_buffer(file, buffer, file_size); } +#define SETTING_MODIFIED(_settings, _field) (_settings->settings_modified[FreeRDP_##_field]) +#define SETTING_MODIFIED_SET(_target, _settings, _field) if SETTING_MODIFIED(_settings, _field) _target = _settings->_field + BOOL freerdp_client_populate_rdp_file_from_settings(rdpFile* file, rdpSettings* settings) { - if (settings->Domain) - file->Domain = settings->Domain; + SETTING_MODIFIED_SET(file->Domain, settings, Domain); + SETTING_MODIFIED_SET(file->Username, settings, Username); + SETTING_MODIFIED_SET(file->ServerPort, settings, ServerPort); + SETTING_MODIFIED_SET(file->FullAddress, settings, ServerHostname); + SETTING_MODIFIED_SET(file->DesktopWidth, settings, DesktopWidth); + SETTING_MODIFIED_SET(file->DesktopHeight, settings, DesktopHeight); + SETTING_MODIFIED_SET(file->SessionBpp, settings, ColorDepth); + SETTING_MODIFIED_SET(file->ConnectToConsole, settings, ConsoleSession); + SETTING_MODIFIED_SET(file->AdministrativeSession, settings, ConsoleSession); + SETTING_MODIFIED_SET(file->NegotiateSecurityLayer, settings, NegotiateSecurityLayer); + SETTING_MODIFIED_SET(file->EnableCredSSPSupport, settings, NlaSecurity); + SETTING_MODIFIED_SET(file->AlternateShell, settings, AlternateShell); + SETTING_MODIFIED_SET(file->ShellWorkingDirectory, settings, ShellWorkingDirectory); + SETTING_MODIFIED_SET(file->ConnectionType, settings, ConnectionType); - if (settings->Username) + if (SETTING_MODIFIED(settings, AudioPlayback) || SETTING_MODIFIED(settings, RemoteConsoleAudio)) { - file->Username = settings->Username; + if (settings->AudioPlayback) + file->AudioMode = AUDIO_MODE_REDIRECT; + else if (settings->RemoteConsoleAudio) + file->AudioMode = AUDIO_MODE_PLAY_ON_SERVER; + else + file->AudioMode = AUDIO_MODE_NONE; } - if (settings->ServerPort) - file->ServerPort = settings->ServerPort; - if (settings->ServerHostname) - file->FullAddress = settings->ServerHostname; - if (settings->DesktopWidth) - file->DesktopWidth = settings->DesktopWidth; - if (settings->DesktopHeight) - file->DesktopHeight = settings->DesktopHeight; - if (settings->ColorDepth) - file->SessionBpp = settings->ColorDepth; - if (settings->ConsoleSession) - file->ConnectToConsole = settings->ConsoleSession; - if (settings->ConsoleSession) - file->AdministrativeSession = settings->ConsoleSession; - if (settings->NegotiateSecurityLayer) - file->NegotiateSecurityLayer = settings->NegotiateSecurityLayer; - if (settings->NlaSecurity) - file->EnableCredSSPSupport = settings->NlaSecurity; - if (settings->AlternateShell) - file->AlternateShell = settings->AlternateShell; - if (settings->ShellWorkingDirectory) - file->ShellWorkingDirectory = settings->ShellWorkingDirectory; - - file->ConnectionType = freerdp_get_connection_type(settings); + SETTING_MODIFIED_SET(file->GatewayHostname, settings, GatewayHostname); + SETTING_MODIFIED_SET(file->GatewayUsageMethod, settings, GatewayUsageMethod); + SETTING_MODIFIED_SET(file->PromptCredentialOnce, settings, GatewayUseSameCredentials); - if (settings->AudioPlayback) - { - file->AudioMode = AUDIO_MODE_REDIRECT; - } - else if (settings->RemoteConsoleAudio) - { - file->AudioMode = AUDIO_MODE_PLAY_ON_SERVER; - } - else - { - file->AudioMode = AUDIO_MODE_NONE; - } + SETTING_MODIFIED_SET(file->RemoteApplicationMode, settings, RemoteApplicationMode); + SETTING_MODIFIED_SET(file->RemoteApplicationProgram, settings, RemoteApplicationProgram); + SETTING_MODIFIED_SET(file->RemoteApplicationName, settings, RemoteApplicationName); + SETTING_MODIFIED_SET(file->RemoteApplicationIcon, settings, RemoteApplicationIcon); + SETTING_MODIFIED_SET(file->RemoteApplicationFile, settings, RemoteApplicationFile); + SETTING_MODIFIED_SET(file->RemoteApplicationGuid, settings, RemoteApplicationGuid); + SETTING_MODIFIED_SET(file->RemoteApplicationCmdLine, settings, RemoteApplicationCmdLine); - if (settings->GatewayHostname) - file->GatewayHostname = settings->GatewayHostname; - if (settings->GatewayUsageMethod) - file->GatewayUsageMethod = TRUE; - if (settings->GatewayUseSameCredentials) - file->PromptCredentialOnce = TRUE; - - if (settings->RemoteApplicationMode) - file->RemoteApplicationMode = settings->RemoteApplicationMode; - if (settings->RemoteApplicationProgram) - file->RemoteApplicationProgram = settings->RemoteApplicationProgram; - if (settings->RemoteApplicationName) - file->RemoteApplicationName = settings->RemoteApplicationName; - if (settings->RemoteApplicationIcon) - file->RemoteApplicationIcon = settings->RemoteApplicationIcon; - if (settings->RemoteApplicationFile) - file->RemoteApplicationFile = settings->RemoteApplicationFile; - if (settings->RemoteApplicationGuid) - file->RemoteApplicationGuid = settings->RemoteApplicationGuid; - if (settings->RemoteApplicationCmdLine) - file->RemoteApplicationCmdLine = settings->RemoteApplicationCmdLine; - - if (settings->SpanMonitors) - file->SpanMonitors = settings->SpanMonitors; - if (settings->UseMultimon) - file->UseMultiMon = settings->UseMultimon; + SETTING_MODIFIED_SET(file->SpanMonitors, settings, SpanMonitors); + SETTING_MODIFIED_SET(file->UseMultiMon, settings, UseMultimon); return TRUE; } @@ -561,16 +531,10 @@ BOOL freerdp_client_write_rdp_file(rdpFile* file, char* name, BOOL unicode) { BOOL success = FALSE; char* buffer; - char *str; int len, len2; FILE* fp = NULL; WCHAR* unicodestr = NULL; - len = _snprintf(str, len + 1, "%s %d", "test abcdefg", 123); - printf("%s %d\n", str, len); - - free(str); - len = freerdp_client_write_rdp_file_buffer(file, NULL, 0); if (len <= 0) { @@ -611,110 +575,95 @@ BOOL freerdp_client_write_rdp_file(rdpFile* file, char* name, BOOL unicode) return success; } +#define WRITE_RDP_FILE_DECLARE(_file, _buffer, _size) \ + rdpFile* __rdpFile = file; \ + char* __buffer = _buffer; \ + size_t __size = _size; \ + size_t __required_size = 0; \ + int __current = 0; \ + int __count = 0; + +#define WRITE_RDP_FILE_VALUE(_format, _field) \ +if (~__rdpFile->_field) \ + { \ + __count = _snprintf(__buffer == NULL ? NULL : __buffer + __current, __buffer == NULL ? 0 : __size - __required_size, _format, __rdpFile->_field); \ + __required_size += __count; \ + __current += __count; \ + } + +#define WRITE_RDP_FILE_VALUE_STRING(_format, _field) \ + if (~((size_t) __rdpFile->_field) && __rdpFile->_field != NULL) \ + { \ + __count = _snprintf(__buffer == NULL ? NULL : __buffer + __current, __buffer == NULL ? 0 : __size - __required_size, _format, __rdpFile->_field); \ + __required_size += __count; \ + __current += __count; \ + } + +#define WRITE_RDP_FILE_VALUE_RETURN \ + return __required_size; + // TODO: Optimize by only writing the fields that have a value i.e ~((size_t) file->FieldName) != 0 size_t freerdp_client_write_rdp_file_buffer(rdpFile* file, char* buffer, size_t size) { - return _snprintf(buffer, size, - "screen mode id:i:%d\n" - "use multimon:i:%d\n" - "desktopwidth:i:%d\n" - "desktopheight:i:%d\n" - "session bpp:i:%d\n" - "winposstr:s:%s\n" - "compression:i:%d\n" - "keyboardhook:i:%d\n" - "audiocapturemode:i:%d\n" - "videoplaybackmode:i:%d\n" - "connection type:i:%d\n" - "networkautodetect:i:%d\n" - "bandwidthautodetect:i:%d\n" - "displayconnectionbar:i:%d\n" - "enableworkspacereconnect:i:%d\n" - "disable wallpaper:i:%d\n" - "allow font smoothing:i:%d\n" - "allow desktop composition:i:%d\n" - "disable full window drag:i:%d\n" - "disable menu anims:i:%d\n" - "disable themes:i:%d\n" - "disable cursor setting:i:%d\n" - "bitmapcachepersistenable:i:%d\n" - "full address:s:%s\n" - "audiomode:i:%d\n" - "redirectprinters:i:%d\n" - "redirectcomports:i:%d\n" - "redirectsmartcards:i:%d\n" - "redirectclipboard:i:%d\n" - "redirectposdevices:i:%d\n" - "autoreconnection enabled:i:%d\n" - "authentication level:i:%d\n" - "prompt for credentials:i:%d\n" - "negotiate security layer:i:%d\n" - "remoteapplicationmode:i:%d\n" - "alternate shell:s:%s\n" - "shell working directory:s:%s\n" - "gatewayhostname:s:%s\n" - "gatewayusagemethod:i:%d\n" - "gatewaycredentialssource:i:%d\n" - "gatewayprofileusagemethod:i:%d\n" - "promptcredentialonce:i:%d\n" - "use redirection server name:i:%d\n" - "rdgiskdcproxy:i:%d\n" - "kdcproxyname:s:%s\n" - "drivestoredirect:s:%s\n" - "username:s:%s\n", - file->ScreenModeId, - file->UseMultiMon, - file->DesktopWidth, - file->DesktopHeight, - file->SessionBpp, - (~((size_t) file->WinPosStr) && file->WinPosStr != NULL) ? file->WinPosStr : "", - file->Compression, - file->KeyboardHook, - file->AudioCaptureMode, - file->VideoPlaybackMode, - file->ConnectionType, - file->NetworkAutoDetect, - file->BandwidthAutoDetect, - file->DisplayConnectionBar, - file->EnableWorkspaceReconnect, - file->DisableWallpaper, - file->AllowFontSmoothing, - file->AllowDesktopComposition, - file->DisableFullWindowDrag, - file->DisableMenuAnims, - file->DisableThemes, - file->DisableCursorSetting, - file->BitmapCachePersistEnable, - (~((size_t) file->FullAddress) && file->FullAddress != NULL) ? file->FullAddress : "", - file->AudioMode, - file->RedirectPrinters, - file->RedirectComPorts, - file->RedirectSmartCards, - file->RedirectClipboard, - file->RedirectPosDevices, - file->AutoReconnectionEnabled, - file->AuthenticationLevel, - file->PromptForCredentials, - file->NegotiateSecurityLayer, - file->RemoteApplicationMode, - (~((size_t) file->AlternateShell) && file->AlternateShell != NULL) ? file->AlternateShell : "", - (~((size_t) file->ShellWorkingDirectory) && file->ShellWorkingDirectory != NULL) ? file->ShellWorkingDirectory : "", - (~((size_t) file->GatewayHostname) && file->GatewayHostname != NULL) ? file->GatewayHostname : "", - file->GatewayUsageMethod, - file->GatewayCredentialsSource, - file->GatewayProfileUsageMethod, - file->PromptCredentialOnce, - file->UseRedirectionServerName, - file->RdgIsKdcProxy, - (~((size_t) file->KdcProxyName) && file->KdcProxyName != NULL) ? file->KdcProxyName : "", - (~((size_t) file->DrivesToRedirect) && file->DrivesToRedirect != NULL) ? file->DrivesToRedirect : "", - (~((size_t) file->Username) && file->Username != NULL) ? file->Username : ""); + WRITE_RDP_FILE_DECLARE(file, buffer, size) + + WRITE_RDP_FILE_VALUE("screen mode id:i:%d\n", ScreenModeId); + WRITE_RDP_FILE_VALUE("use multimon:i:%d\n", UseMultiMon); + WRITE_RDP_FILE_VALUE("desktopwidth:i:%d\n", DesktopWidth); + WRITE_RDP_FILE_VALUE("desktopheight:i:%d\n", DesktopHeight); + WRITE_RDP_FILE_VALUE("session bpp:i:%d\n", SessionBpp); + WRITE_RDP_FILE_VALUE_STRING("winposstr:s:%s\n", WinPosStr); + WRITE_RDP_FILE_VALUE("compression:i:%d\n", Compression); + WRITE_RDP_FILE_VALUE("keyboardhook:i:%d\n", KeyboardHook); + WRITE_RDP_FILE_VALUE("audiocapturemode:i:%d\n", AudioCaptureMode); + WRITE_RDP_FILE_VALUE("videoplaybackmode:i:%d\n", VideoPlaybackMode); + WRITE_RDP_FILE_VALUE("connection type:i:%d\n", ConnectionType); + WRITE_RDP_FILE_VALUE("networkautodetect:i:%d\n", NetworkAutoDetect); + WRITE_RDP_FILE_VALUE("bandwidthautodetect:i:%d\n", BandwidthAutoDetect); + WRITE_RDP_FILE_VALUE("displayconnectionbar:i:%d\n", DisplayConnectionBar); + WRITE_RDP_FILE_VALUE("enableworkspacereconnect:i:%d\n", EnableWorkspaceReconnect); + WRITE_RDP_FILE_VALUE("disable wallpaper:i:%d\n", DisableWallpaper); + WRITE_RDP_FILE_VALUE("allow font smoothing:i:%d\n", AllowFontSmoothing); + WRITE_RDP_FILE_VALUE("allow desktop composition:i:%d\n", AllowDesktopComposition); + WRITE_RDP_FILE_VALUE("disable full window drag:i:%d\n", DisableFullWindowDrag); + WRITE_RDP_FILE_VALUE("disable menu anims:i:%d\n", DisableMenuAnims); + WRITE_RDP_FILE_VALUE("disable themes:i:%d\n", DisableThemes); + WRITE_RDP_FILE_VALUE("disable cursor setting:i:%d\n", DisableCursorSetting); + WRITE_RDP_FILE_VALUE("bitmapcachepersistenable:i:%d\n", BitmapCachePersistEnable); + WRITE_RDP_FILE_VALUE_STRING("full address:s:%s\n", FullAddress); + WRITE_RDP_FILE_VALUE("audiomode:i:%d\n", AudioMode); + WRITE_RDP_FILE_VALUE("redirectprinters:i:%d\n", RedirectPrinters); + WRITE_RDP_FILE_VALUE("redirectcomports:i:%d\n", RedirectComPorts); + WRITE_RDP_FILE_VALUE("redirectsmartcards:i:%d\n", RedirectSmartCards); + WRITE_RDP_FILE_VALUE("redirectclipboard:i:%d\n", RedirectClipboard); + WRITE_RDP_FILE_VALUE("redirectposdevices:i:%d\n", RedirectPosDevices); + WRITE_RDP_FILE_VALUE("autoreconnection enabled:i:%d\n", AutoReconnectionEnabled); + WRITE_RDP_FILE_VALUE("authentication level:i:%d\n", AuthenticationLevel); + WRITE_RDP_FILE_VALUE("prompt for credentials:i:%d\n", PromptForCredentials); + WRITE_RDP_FILE_VALUE("negotiate security layer:i:%d\n", NegotiateSecurityLayer); + WRITE_RDP_FILE_VALUE("remoteapplicationmode:i:%d\n", RemoteApplicationMode); + WRITE_RDP_FILE_VALUE_STRING("alternate shell:s:%s\n", AlternateShell); + WRITE_RDP_FILE_VALUE_STRING("shell working directory:s:%s\n", ShellWorkingDirectory); + WRITE_RDP_FILE_VALUE_STRING("gatewayhostname:s:%s\n", GatewayHostname); + WRITE_RDP_FILE_VALUE("gatewayusagemethod:i:%d\n", GatewayUsageMethod); + WRITE_RDP_FILE_VALUE("gatewaycredentialssource:i:%d\n", GatewayCredentialsSource); + WRITE_RDP_FILE_VALUE("gatewayprofileusagemethod:i:%d\n", GatewayProfileUsageMethod); + WRITE_RDP_FILE_VALUE("promptcredentialonce:i:%d\n", PromptCredentialOnce); + WRITE_RDP_FILE_VALUE("use redirection server name:i:%d\n", UseRedirectionServerName); + WRITE_RDP_FILE_VALUE("rdgiskdcproxy:i:%d\n", RdgIsKdcProxy); + WRITE_RDP_FILE_VALUE_STRING("kdcproxyname:s:%s\n", KdcProxyName); + WRITE_RDP_FILE_VALUE_STRING("drivestoredirect:s:%s\n", DrivesToRedirect); + WRITE_RDP_FILE_VALUE_STRING("username:s:%s\n", Username); + WRITE_RDP_FILE_VALUE_STRING("domain:s:%s\n", Domain); + + WRITE_RDP_FILE_VALUE_RETURN } + BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* settings) { if (~((size_t) file->Domain)) - settings->Domain = file->Domain; + freerdp_set_param_string(settings, FreeRDP_Domain, file->Domain); if (~((size_t) file->Username)) { @@ -722,84 +671,83 @@ BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* char* domain; freerdp_parse_username(file->Username, &user, &domain); - - settings->Username = user; + freerdp_set_param_string(settings, FreeRDP_Username, user); if (domain != NULL) - settings->Domain = domain; + freerdp_set_param_string(settings, FreeRDP_Domain, domain); } if (~file->ServerPort) - settings->ServerPort = file->ServerPort; + freerdp_set_param_uint32(settings, FreeRDP_ServerPort, file->ServerPort); if (~((size_t) file->FullAddress)) - settings->ServerHostname = file->FullAddress; + freerdp_set_param_string(settings, FreeRDP_ServerHostname, file->FullAddress); + if (~file->DesktopWidth) - settings->DesktopWidth = file->DesktopWidth; + freerdp_set_param_uint32(settings, FreeRDP_DesktopWidth, file->DesktopWidth); if (~file->DesktopHeight) - settings->DesktopHeight = file->DesktopHeight; + freerdp_set_param_uint32(settings, FreeRDP_DesktopHeight, file->DesktopHeight); if (~file->SessionBpp) - settings->ColorDepth = file->SessionBpp; + freerdp_set_param_uint32(settings, FreeRDP_ColorDepth, file->SessionBpp); if (~file->ConnectToConsole) - settings->ConsoleSession = file->ConnectToConsole; + freerdp_set_param_uint32(settings, FreeRDP_ConsoleSession, file->ConnectToConsole); if (~file->AdministrativeSession) - settings->ConsoleSession = file->AdministrativeSession; + freerdp_set_param_uint32(settings, FreeRDP_ConsoleSession, file->AdministrativeSession); if (~file->NegotiateSecurityLayer) - settings->NegotiateSecurityLayer = file->NegotiateSecurityLayer; + freerdp_set_param_uint32(settings, FreeRDP_NegotiateSecurityLayer, file->NegotiateSecurityLayer); if (~file->EnableCredSSPSupport) - settings->NlaSecurity = file->EnableCredSSPSupport; + freerdp_set_param_uint32(settings, FreeRDP_NlaSecurity, file->EnableCredSSPSupport); if (~((size_t) file->AlternateShell)) - settings->AlternateShell = file->AlternateShell; + freerdp_set_param_string(settings, FreeRDP_AlternateShell, file->AlternateShell); if (~((size_t) file->ShellWorkingDirectory)) - settings->ShellWorkingDirectory = file->ShellWorkingDirectory; + freerdp_set_param_string(settings, FreeRDP_ShellWorkingDirectory, file->ShellWorkingDirectory); if (~file->ConnectionType) - { - freerdp_set_connection_type(settings, file->ConnectionType); - } + freerdp_set_param_uint32(settings, FreeRDP_ConnectionType, file->ConnectionType); if (~file->AudioMode) { if (file->AudioMode == AUDIO_MODE_REDIRECT) { - settings->AudioPlayback = TRUE; + freerdp_set_param_bool(settings, FreeRDP_AudioPlayback, TRUE); } else if (file->AudioMode == AUDIO_MODE_PLAY_ON_SERVER) { - settings->RemoteConsoleAudio = TRUE; + freerdp_set_param_bool(settings, FreeRDP_RemoteConsoleAudio, TRUE); } else if (file->AudioMode == AUDIO_MODE_NONE) { - settings->AudioPlayback = FALSE; - settings->RemoteConsoleAudio = FALSE; + freerdp_set_param_bool(settings, FreeRDP_AudioPlayback, FALSE); + freerdp_set_param_bool(settings, FreeRDP_RemoteConsoleAudio, FALSE); } } if (~((size_t) file->GatewayHostname)) - settings->GatewayHostname = file->GatewayHostname; + freerdp_set_param_string(settings, FreeRDP_GatewayHostname, file->GatewayHostname); if (~file->GatewayUsageMethod) - settings->GatewayUsageMethod = TRUE; + freerdp_set_param_bool(settings, FreeRDP_GatewayUsageMethod, file->GatewayUsageMethod); if (~file->PromptCredentialOnce) + freerdp_set_param_bool(settings, FreeRDP_GatewayUsageMethod, file->GatewayUsageMethod); settings->GatewayUseSameCredentials = TRUE; if (~file->RemoteApplicationMode) - settings->RemoteApplicationMode = file->RemoteApplicationMode; + freerdp_set_param_bool(settings, FreeRDP_RemoteApplicationMode, file->RemoteApplicationMode); if (~((size_t) file->RemoteApplicationProgram)) - settings->RemoteApplicationProgram = file->RemoteApplicationProgram; + freerdp_set_param_string(settings, FreeRDP_RemoteApplicationProgram, file->RemoteApplicationProgram); if (~((size_t) file->RemoteApplicationName)) - settings->RemoteApplicationName = file->RemoteApplicationName; + freerdp_set_param_string(settings, FreeRDP_RemoteApplicationName, file->RemoteApplicationName); if (~((size_t) file->RemoteApplicationIcon)) - settings->RemoteApplicationIcon = file->RemoteApplicationIcon; + freerdp_set_param_string(settings, FreeRDP_RemoteApplicationIcon, file->RemoteApplicationIcon); if (~((size_t) file->RemoteApplicationFile)) - settings->RemoteApplicationFile = file->RemoteApplicationFile; + freerdp_set_param_string(settings, FreeRDP_RemoteApplicationGuid, file->RemoteApplicationGuid); if (~((size_t) file->RemoteApplicationGuid)) - settings->RemoteApplicationGuid = file->RemoteApplicationGuid; + freerdp_set_param_string(settings, FreeRDP_RemoteApplicationGuid, file->RemoteApplicationGuid); if (~((size_t) file->RemoteApplicationCmdLine)) - settings->RemoteApplicationCmdLine = file->RemoteApplicationCmdLine; + freerdp_set_param_string(settings, FreeRDP_RemoteApplicationCmdLine, file->RemoteApplicationCmdLine); if (~file->SpanMonitors) - settings->SpanMonitors = file->SpanMonitors; + freerdp_set_param_bool(settings, FreeRDP_SpanMonitors, file->SpanMonitors); if (~file->UseMultiMon) - settings->UseMultimon = file->UseMultiMon; + freerdp_set_param_bool(settings, FreeRDP_UseMultimon, file->UseMultiMon); return TRUE; } diff --git a/include/freerdp/client/cmdline.h b/include/freerdp/client/cmdline.h index 7fcbe1b78..e0a424e7e 100644 --- a/include/freerdp/client/cmdline.h +++ b/include/freerdp/client/cmdline.h @@ -36,8 +36,6 @@ FREERDP_API int freerdp_client_print_command_line_help(int argc, char** argv); FREERDP_API int freerdp_parse_username(char* username, char** user, char** domain); FREERDP_API int freerdp_set_connection_type(rdpSettings* settings, int type); -FREERDP_API int freerdp_get_connection_type(rdpSettings* settings); - FREERDP_API int freerdp_client_add_device_channel(rdpSettings* settings, int count, char** params); FREERDP_API int freerdp_client_add_static_channel(rdpSettings* settings, int count, char** params); FREERDP_API int freerdp_client_add_dynamic_channel(rdpSettings* settings, int count, char** params); diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 0a078c280..6597e6e30 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -1267,6 +1267,8 @@ struct rdp_settings /* Extensions */ ALIGN64 int num_extensions; /* */ ALIGN64 struct rdp_ext_set extensions[16]; /* */ + + ALIGN64 BYTE* settings_modified; /* byte array marking fields that have been modified from their default value */ }; typedef struct rdp_settings rdpSettings; diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index d08078334..c20437371 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -1174,6 +1174,9 @@ int freerdp_set_param_bool(rdpSettings* settings, int id, BOOL param) break; } + // Mark field as modified + settings->settings_modified[id] = 1; + return -1; } @@ -1790,6 +1793,9 @@ int freerdp_set_param_uint32(rdpSettings* settings, int id, UINT32 param) break; } + // Mark field as modified + settings->settings_modified[id] = 1; + return 0; } @@ -1822,6 +1828,9 @@ int freerdp_set_param_uint64(rdpSettings* settings, int id, UINT64 param) break; } + // Mark field as modified + settings->settings_modified[id] = 1; + return 0; } @@ -2150,5 +2159,8 @@ int freerdp_set_param_string(rdpSettings* settings, int id, char* param) break; } + // Mark field as modified + settings->settings_modified[id] = 1; + return 0; } diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index c44ae9667..b3091270f 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -414,6 +414,9 @@ rdpSettings* freerdp_settings_new(void* instance) settings->ConfigPath = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, "freerdp"); settings_load_hkey_local_machine(settings); + + settings->settings_modified = (BYTE*) malloc(sizeof(rdpSettings) / 8 ); + ZeroMemory(settings->settings_modified, sizeof(rdpSettings) / 8); } return settings; @@ -457,6 +460,7 @@ void freerdp_settings_free(rdpSettings* settings) freerdp_device_collection_free(settings); freerdp_static_channel_collection_free(settings); freerdp_dynamic_channel_collection_free(settings); + free(settings->settings_modified); free(settings); } }