From 13a0fbe04001490042f3c084e13071087dfc1035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sat, 27 Oct 2012 21:30:08 -0400 Subject: [PATCH] libfreerdp-client: initial working .rdp file support --- client/X11/xfreerdp.c | 4 +- client/common/file.c | 81 ++++++++++++++++++++++++++++++++++- include/freerdp/client/file.h | 4 ++ libfreerdp/utils/args.c | 3 +- 4 files changed, 86 insertions(+), 6 deletions(-) diff --git a/client/X11/xfreerdp.c b/client/X11/xfreerdp.c index 935caa0d8..ea6e14634 100644 --- a/client/X11/xfreerdp.c +++ b/client/X11/xfreerdp.c @@ -510,12 +510,12 @@ BOOL xf_pre_connect(freerdp* instance) if (settings->connection_file) { - file = (rdpFile*) malloc(sizeof(rdpFile)); - ZeroMemory(file, sizeof(rdpFile)); + file = freerdp_client_rdp_file_new(); printf("Using connection file: %s\n", settings->connection_file); freerdp_client_parse_rdp_file(file, settings->connection_file); + freerdp_client_populate_settings_from_rdp_file(file, settings); } bitmap_cache = settings->bitmap_cache; diff --git a/client/common/file.c b/client/common/file.c index f7141f13b..b9e676169 100644 --- a/client/common/file.c +++ b/client/common/file.c @@ -41,11 +41,11 @@ #include -#include - static BYTE BOM_UTF16_LE[2] = { 0xFF, 0xFE }; static WCHAR CR_LF_STR_W[] = { '\r', '\n', '\0' }; +#define INVALID_INTEGER_VALUE 0xFFFFFFFF + BOOL freerdp_client_rdp_file_set_integer(rdpFile* file, char* name, int value) { if (_stricmp(name, "use multimon") == 0) @@ -392,3 +392,80 @@ BOOL freerdp_client_parse_rdp_file(rdpFile* file, char* name) return freerdp_client_parse_rdp_file_buffer(file, buffer, file_size); } + +BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* settings) +{ + if (~((size_t) file->Domain)) + settings->domain = file->Domain; + + if (~((size_t) file->Username)) + { + char* p; + size_t size; + + p = strchr(file->Username, '\\'); + + if (p) + { + size = p - file->Username; + settings->domain = (char*) malloc(size + 1); + CopyMemory(settings->domain, file->Username, size); + settings->domain[size] = 0; + + size = strlen(file->Username) - size - 1; + settings->username = (char*) malloc(size + 1); + CopyMemory(settings->username, &file->Username[p - file->Username + 1], size); + settings->username[size] = 0; + } + else + { + settings->username = file->Username; + } + } + + if (~file->ServerPort) + settings->port = file->ServerPort; + if (~((size_t) file->FullAddress)) + settings->hostname = file->FullAddress; + if (~file->DesktopWidth) + settings->width = file->DesktopWidth; + if (~file->DesktopHeight) + settings->height = file->DesktopHeight; + if (~file->SessionBpp) + settings->color_depth = file->SessionBpp; + if (~file->ConnectToConsole) + settings->console_session = file->ConnectToConsole; + if (~file->AdministrativeSession) + settings->console_session = file->AdministrativeSession; + if (~file->NegotiateSecurityLayer) + settings->security_layer_negotiation = file->NegotiateSecurityLayer; + if (~file->EnableCredSSPSupport) + settings->nla_security = file->EnableCredSSPSupport; + if (~((size_t) file->AlternateShell)) + settings->shell = file->AlternateShell; + if (~((size_t) file->ShellWorkingDirectory)) + settings->directory = file->ShellWorkingDirectory; + if (~((size_t) file->GatewayHostname)) + settings->tsg_hostname = file->GatewayHostname; + if (~file->RemoteApplicationMode) + settings->remote_app = file->RemoteApplicationMode; + + printf("Username: %s Password: %s Domain: %s\n", settings->username, settings->password, settings->domain); + + return TRUE; +} + +rdpFile* freerdp_client_rdp_file_new() +{ + rdpFile* file; + + file = (rdpFile*) malloc(sizeof(rdpFile)); + FillMemory(file, sizeof(rdpFile), 0xFF); + + return file; +} + +void freerdp_client_rdp_file_free(rdpFile* file) +{ + free(file); +} diff --git a/include/freerdp/client/file.h b/include/freerdp/client/file.h index f24e738c4..a0d96406a 100644 --- a/include/freerdp/client/file.h +++ b/include/freerdp/client/file.h @@ -134,5 +134,9 @@ typedef struct rdp_file rdpFile; FREERDP_API BOOL freerdp_client_parse_rdp_file(rdpFile* file, char* name); FREERDP_API BOOL freerdp_client_parse_rdp_file_buffer(rdpFile* file, BYTE* buffer, size_t size); +FREERDP_API BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* settings); + +FREERDP_API rdpFile* freerdp_client_rdp_file_new(); +FREERDP_API void freerdp_client_rdp_file_free(rdpFile* file); #endif /* FREERDP_CLIENT_RDP_FILE */ diff --git a/libfreerdp/utils/args.c b/libfreerdp/utils/args.c index ac8e307ed..71477cec0 100644 --- a/libfreerdp/utils/args.c +++ b/libfreerdp/utils/args.c @@ -947,7 +947,7 @@ int freerdp_parse_args(rdpSettings* settings, int argc, char** argv, } /* Must have a hostname. Do you? */ - if (NULL == settings->hostname) + if ((settings->hostname == NULL) && (settings->connection_file == NULL)) { printf("missing server name\n"); return FREERDP_ARGS_PARSE_FAILURE; @@ -956,5 +956,4 @@ int freerdp_parse_args(rdpSettings* settings, int argc, char** argv, { return index; } - }