From 73196c3777d5ea8ec145f217d41bf0af413ab054 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 4 Dec 2013 18:25:55 -0500 Subject: [PATCH] libfreerdp-common: add fine grained control over .rdp file writing functions --- client/Windows/wf_interface.c | 31 -------- client/common/client.c | 33 ++++++-- client/common/file.c | 180 +++++++++++++++--------------------------- 3 files changed, 92 insertions(+), 152 deletions(-) diff --git a/client/Windows/wf_interface.c b/client/Windows/wf_interface.c index fa967fe..8a1d016 100644 --- a/client/Windows/wf_interface.c +++ b/client/Windows/wf_interface.c @@ -862,37 +862,6 @@ int freerdp_client_load_settings_from_rdp_file(wfContext* wfc, char* filename) return 0; } -int freerdp_client_save_settings_to_rdp_file(wfContext* wfc, char* filename) -{ - if (!filename) - return 1; - - if (wfc->instance->settings->ConnectionFile) - { - free(wfc->instance->settings->ConnectionFile); - } - - wfc->instance->settings->ConnectionFile = _strdup(filename); - - // Reuse existing rdpFile structure if available, to preserve unsupported settings when saving to disk. - if (wfc->connectionRdpFile == NULL) - { - wfc->connectionRdpFile = freerdp_client_rdp_file_new(); - } - - if (!freerdp_client_populate_rdp_file_from_settings(wfc->connectionRdpFile, wfc->instance->settings)) - { - return 1; - } - - if (!freerdp_client_write_rdp_file(wfc->connectionRdpFile, filename, UNICODE)); - { - return 2; - } - - return 0; -} - void wf_size_scrollbars(wfContext* wfc, int client_width, int client_height) { BOOL rc; diff --git a/client/common/client.c b/client/common/client.c index d531ed2..4dc4600 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -154,19 +154,42 @@ int freerdp_client_settings_parse_connection_file_buffer(rdpSettings* settings, int freerdp_client_settings_write_connection_file(const rdpSettings* settings, const char* filename, BOOL unicode) { rdpFile* file; - int status = -1; file = freerdp_client_rdp_file_new(); - if (freerdp_client_populate_rdp_file_from_settings(file, settings)) + if (!freerdp_client_populate_rdp_file_from_settings(file, settings)) + return -1; + { - if (freerdp_client_write_rdp_file(file, filename, unicode)) + int index; + rdpFileLine* line; + + for (index = 0; index < file->lineCount; index++) { - status = 0; + line = &(file->lines[index]); + + if (line->flags & RDP_FILE_LINE_FLAG_FORMATTED) + { + if (line->flags & RDP_FILE_LINE_FLAG_TYPE_STRING) + { + printf("line %02d: name: %s value: %s, %s\n", + line->index, line->name, line->sValue, + (line->flags & RDP_FILE_LINE_FLAG_STANDARD) ? "standard" : "non-standard"); + } + else if (line->flags & RDP_FILE_LINE_FLAG_TYPE_INTEGER) + { + printf("line %02d: name: %s value: %d, %s\n", + line->index, line->name, line->iValue, + (line->flags & RDP_FILE_LINE_FLAG_STANDARD) ? "standard" : "non-standard"); + } + } } } + if (!freerdp_client_write_rdp_file(file, filename, unicode)) + return -1; + freerdp_client_rdp_file_free(file); - return status; + return 0; } diff --git a/client/common/file.c b/client/common/file.c index 2cf8859..6e93f3a 100644 --- a/client/common/file.c +++ b/client/common/file.c @@ -659,144 +659,92 @@ BOOL freerdp_client_populate_rdp_file_from_settings(rdpFile* file, const rdpSett BOOL freerdp_client_write_rdp_file(const rdpFile* file, const char* name, BOOL unicode) { - int rc = 0; + FILE* fp; + int length; char* buffer; - int len, len2; - FILE* fp = NULL; + int status = 0; WCHAR* unicodestr = NULL; - len = freerdp_client_write_rdp_file_buffer(file, NULL, 0); + length = freerdp_client_write_rdp_file_buffer(file, NULL, 0); - if (len <= 0) + if (length < 0) { - fprintf(stderr, "freerdp_client_write_rdp_file: Error determining buffer size.\n"); + fprintf(stderr, "freerdp_client_write_rdp_file: error determining buffer size.\n"); return FALSE; } - buffer = (char*) malloc((len + 1) * sizeof(char)); - len2 = freerdp_client_write_rdp_file_buffer(file, buffer, len + 1); + buffer = (char*) malloc((length + 1) * sizeof(char)); - if (len2 == len) + if (freerdp_client_write_rdp_file_buffer(file, buffer, length + 1) != length) { - fp = fopen(name, "w+b"); + fprintf(stderr, "freerdp_client_write_rdp_file: error writing to output buffer\n"); + return FALSE; + } - if (fp != NULL) - { - if (unicode) - { - ConvertToUnicode(CP_UTF8, 0, buffer, len, &unicodestr, 0); + fp = fopen(name, "w+b"); - /* Write multi-byte header */ - fwrite(BOM_UTF16_LE, sizeof(BYTE), 2, fp); - fwrite(unicodestr, 2, len, fp); + if (fp) + { + if (unicode) + { + ConvertToUnicode(CP_UTF8, 0, buffer, length, &unicodestr, 0); - free(unicodestr); - } - else - { - fwrite(buffer, 1, len, fp); - } + /* Write multi-byte header */ + fwrite(BOM_UTF16_LE, sizeof(BYTE), 2, fp); + fwrite(unicodestr, 2, length, fp); - rc = fflush(fp); - rc = fclose(fp); + free(unicodestr); + } + else + { + fwrite(buffer, 1, length, fp); } + + status = fflush(fp); + status = fclose(fp); } - if (buffer != NULL) + if (buffer) free(buffer); - return (rc == 0); + return (status == 0) ? TRUE : FALSE; } -#define WRITE_RDP_FILE_DECLARE(_file, _buffer, _size) \ - const 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_INTEGER(_format, _field) \ -if (~__rdpFile->_field) \ - { \ - if (__buffer) \ - __count = sprintf_s(__buffer + __current, __size - __required_size, _format, (int) __rdpFile->_field); \ - else \ - __count = _scprintf(_format, (int) __rdpFile->_field); \ - \ - __required_size += __count; \ - __current += __count; \ - } +size_t freerdp_client_write_rdp_file_buffer(const rdpFile* file, char* buffer, size_t size) +{ + int index; + int length; + char* output; + rdpFileLine* line; + + if (!buffer) + size = 0; + + output = buffer; + + for (index = 0; index < file->lineCount; index++) + { + line = &(file->lines[index]); -#define WRITE_RDP_FILE_VALUE_STRING(_format, _field) \ - if (~((size_t) __rdpFile->_field) && __rdpFile->_field != NULL) \ - { \ - if (__buffer) \ - __count = sprintf_s(__buffer + __current, __size - __required_size, _format, __rdpFile->_field); \ - else \ - __count = _scprintf(_format, __rdpFile->_field); \ - \ - __required_size += __count; \ - __current += __count; \ + length = strlen(line->text); + + if (!buffer) + { + size += length + 1; + } + else + { + CopyMemory(output, line->text, length); + output += length; + *output = '\n'; + output++; + } } -#define WRITE_RDP_FILE_VALUE_RETURN \ - return __required_size; + if (buffer) + size = (output - buffer); -size_t freerdp_client_write_rdp_file_buffer(const rdpFile* file, char* buffer, size_t size) -{ - WRITE_RDP_FILE_DECLARE(file, buffer, size) - - WRITE_RDP_FILE_VALUE_INTEGER("screen mode id:i:%d\n", ScreenModeId); - WRITE_RDP_FILE_VALUE_INTEGER("use multimon:i:%d\n", UseMultiMon); - WRITE_RDP_FILE_VALUE_INTEGER("desktopwidth:i:%d\n", DesktopWidth); - WRITE_RDP_FILE_VALUE_INTEGER("desktopheight:i:%d\n", DesktopHeight); - WRITE_RDP_FILE_VALUE_INTEGER("session bpp:i:%d\n", SessionBpp); - WRITE_RDP_FILE_VALUE_STRING("winposstr:s:%s\n", WinPosStr); - WRITE_RDP_FILE_VALUE_INTEGER("compression:i:%d\n", Compression); - WRITE_RDP_FILE_VALUE_INTEGER("keyboardhook:i:%d\n", KeyboardHook); - WRITE_RDP_FILE_VALUE_INTEGER("audiocapturemode:i:%d\n", AudioCaptureMode); - WRITE_RDP_FILE_VALUE_INTEGER("videoplaybackmode:i:%d\n", VideoPlaybackMode); - WRITE_RDP_FILE_VALUE_INTEGER("connection type:i:%d\n", ConnectionType); - WRITE_RDP_FILE_VALUE_INTEGER("networkautodetect:i:%d\n", NetworkAutoDetect); - WRITE_RDP_FILE_VALUE_INTEGER("bandwidthautodetect:i:%d\n", BandwidthAutoDetect); - WRITE_RDP_FILE_VALUE_INTEGER("displayconnectionbar:i:%d\n", DisplayConnectionBar); - WRITE_RDP_FILE_VALUE_INTEGER("enableworkspacereconnect:i:%d\n", EnableWorkspaceReconnect); - WRITE_RDP_FILE_VALUE_INTEGER("disable wallpaper:i:%d\n", DisableWallpaper); - WRITE_RDP_FILE_VALUE_INTEGER("allow font smoothing:i:%d\n", AllowFontSmoothing); - WRITE_RDP_FILE_VALUE_INTEGER("allow desktop composition:i:%d\n", AllowDesktopComposition); - WRITE_RDP_FILE_VALUE_INTEGER("disable full window drag:i:%d\n", DisableFullWindowDrag); - WRITE_RDP_FILE_VALUE_INTEGER("disable menu anims:i:%d\n", DisableMenuAnims); - WRITE_RDP_FILE_VALUE_INTEGER("disable themes:i:%d\n", DisableThemes); - WRITE_RDP_FILE_VALUE_INTEGER("disable cursor setting:i:%d\n", DisableCursorSetting); - WRITE_RDP_FILE_VALUE_INTEGER("bitmapcachepersistenable:i:%d\n", BitmapCachePersistEnable); - WRITE_RDP_FILE_VALUE_STRING("full address:s:%s\n", FullAddress); - WRITE_RDP_FILE_VALUE_INTEGER("audiomode:i:%d\n", AudioMode); - WRITE_RDP_FILE_VALUE_INTEGER("redirectprinters:i:%d\n", RedirectPrinters); - WRITE_RDP_FILE_VALUE_INTEGER("redirectcomports:i:%d\n", RedirectComPorts); - WRITE_RDP_FILE_VALUE_INTEGER("redirectsmartcards:i:%d\n", RedirectSmartCards); - WRITE_RDP_FILE_VALUE_INTEGER("redirectclipboard:i:%d\n", RedirectClipboard); - WRITE_RDP_FILE_VALUE_INTEGER("redirectposdevices:i:%d\n", RedirectPosDevices); - WRITE_RDP_FILE_VALUE_INTEGER("autoreconnection enabled:i:%d\n", AutoReconnectionEnabled); - WRITE_RDP_FILE_VALUE_INTEGER("authentication level:i:%d\n", AuthenticationLevel); - WRITE_RDP_FILE_VALUE_INTEGER("prompt for credentials:i:%d\n", PromptForCredentials); - WRITE_RDP_FILE_VALUE_INTEGER("negotiate security layer:i:%d\n", NegotiateSecurityLayer); - WRITE_RDP_FILE_VALUE_INTEGER("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_INTEGER("gatewayusagemethod:i:%d\n", GatewayUsageMethod); - WRITE_RDP_FILE_VALUE_INTEGER("gatewaycredentialssource:i:%d\n", GatewayCredentialsSource); - WRITE_RDP_FILE_VALUE_INTEGER("gatewayprofileusagemethod:i:%d\n", GatewayProfileUsageMethod); - WRITE_RDP_FILE_VALUE_INTEGER("promptcredentialonce:i:%d\n", PromptCredentialOnce); - WRITE_RDP_FILE_VALUE_INTEGER("use redirection server name:i:%d\n", UseRedirectionServerName); - WRITE_RDP_FILE_VALUE_INTEGER("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 + return size; } BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* settings) @@ -966,7 +914,7 @@ BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* if (~file->DisableThemes) freerdp_set_param_bool(settings, FreeRDP_DisableThemes, file->DisableThemes); if (~file->AllowDesktopComposition) - freerdp_set_param_bool(settings, FreeRDP_DisableCursorShadow, file->AllowDesktopComposition); + freerdp_set_param_bool(settings, FreeRDP_AllowDesktopComposition, file->AllowDesktopComposition); if (~file->BitmapCachePersistEnable) freerdp_set_param_bool(settings, FreeRDP_BitmapCachePersistEnabled, file->BitmapCachePersistEnable); @@ -1105,7 +1053,7 @@ int freerdp_client_rdp_file_set_string_option(rdpFile* file, const char* name, c length = _scprintf("%s:s:%s", name, value); text = (char*) malloc(length + 1); - sprintf_s(text, length, "%s:s:%s", name, value); + sprintf_s(text, length + 1, "%s:s:%s", name, value ? value : ""); text[length] = '\0'; if (line) @@ -1155,7 +1103,7 @@ int freerdp_client_rdp_file_set_integer_option(rdpFile* file, const char* name, length = _scprintf("%s:i:%d", name, value); text = (char*) malloc(length + 1); - sprintf_s(text, length, "%s:i:%d", name, value); + sprintf_s(text, length + 1, "%s:i:%d", name, value); text[length] = '\0'; if (line) -- 2.7.4