libfreerdp-client: initial working .rdp file support

This commit is contained in:
Marc-André Moreau 2012-10-27 21:30:08 -04:00
parent beefa1a21d
commit 13a0fbe040
4 changed files with 86 additions and 6 deletions

View File

@ -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;

View File

@ -41,11 +41,11 @@
#include <winpr/crt.h>
#include <freerdp/utils/hexdump.h>
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);
}

View File

@ -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 */

View File

@ -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;
}
}