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; }
// TODO: Some of that code is a duplicate of wf_pre_connect. Refactor? int freerdp_client_load_settings_from_rdp_file(wfContext* wfc, char* filename) { rdpSettings* settings; settings = wfc->instance->settings; if (filename) { settings->ConnectionFile = _strdup(filename); // free old settings file freerdp_client_rdp_file_free(wfc->connectionRdpFile); wfc->connectionRdpFile = freerdp_client_rdp_file_new(); WLog_INFO(TAG, "Using connection file: %s", settings->ConnectionFile); if (!freerdp_client_parse_rdp_file(wfc->connectionRdpFile, settings->ConnectionFile)) { return 1; } if (!freerdp_client_populate_settings_from_rdp_file(wfc->connectionRdpFile, settings)) { return 2; } } return 0; }
int freerdp_client_parse_command_line(rdpContext* context, int argc, char** argv) { int status; rdpSettings* settings; context->argc = argc; context->argv = argv; if (context->argc < 1) return 0; if (!context->argv) return -1; settings = context->settings; status = freerdp_client_parse_command_line_arguments(context->argc, context->argv, settings); if (settings->ConnectionFile) { rdpFile* file = freerdp_client_rdp_file_new(); freerdp_client_parse_rdp_file(file, settings->ConnectionFile); freerdp_client_populate_settings_from_rdp_file(file, settings); freerdp_client_rdp_file_free(file); } return status; }
int freerdp_client_settings_parse_connection_file(rdpSettings* settings, const char* filename) { rdpFile* file; file = freerdp_client_rdp_file_new(); freerdp_client_parse_rdp_file(file, filename); freerdp_client_populate_settings_from_rdp_file(file, settings); freerdp_client_rdp_file_free(file); return 0; }
int freerdp_client_parse_connection_file_buffer(rdpContext* context, BYTE* buffer, size_t size) { rdpFile* file; file = freerdp_client_rdp_file_new(); freerdp_client_parse_rdp_file_buffer(file, buffer, size); freerdp_client_populate_settings_from_rdp_file(file, context->settings); freerdp_client_rdp_file_free(file); return 0; }
int freerdp_client_parse_connection_file(rdpContext* context, char* filename) { rdpFile* file; file = freerdp_client_rdp_file_new(); freerdp_client_parse_rdp_file(file, filename); freerdp_client_populate_settings_from_rdp_file(file, context->settings); freerdp_client_rdp_file_free(file); return 0; }
int freerdp_client_settings_write_connection_file(const rdpSettings* settings, const char* filename, BOOL unicode) { rdpFile* file; file = freerdp_client_rdp_file_new(); if (!freerdp_client_populate_rdp_file_from_settings(file, settings)) return -1; if (!freerdp_client_write_rdp_file(file, filename, unicode)) return -1; freerdp_client_rdp_file_free(file); return 0; }
int freerdp_client_parse_connection_file_buffer(rdpContext* context, BYTE* buffer, size_t size) { rdpFile* file; int status = -1; file = freerdp_client_rdp_file_new(); if (freerdp_client_parse_rdp_file_buffer(file, buffer, size) && freerdp_client_populate_settings_from_rdp_file(file, context->settings)) { status = 0; } freerdp_client_rdp_file_free(file); return status; }
int freerdp_client_write_connection_file(rdpContext* context, 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, context->settings)) { if (freerdp_client_write_rdp_file(file, filename, unicode)) { status = 0; } } freerdp_client_rdp_file_free(file); return status; }
int freerdp_client_settings_parse_connection_file(rdpSettings* settings, const char* filename) { rdpFile* file; int ret = -1; file = freerdp_client_rdp_file_new(); if (!file) return -1; if (!freerdp_client_parse_rdp_file(file, filename)) goto out; if (!freerdp_client_populate_settings_from_rdp_file(file, settings)) goto out; ret = 0; out: freerdp_client_rdp_file_free(file); return ret; }
int freerdp_client_settings_parse_connection_file_buffer(rdpSettings* settings, const BYTE* buffer, size_t size) { rdpFile* file; int status = -1; file = freerdp_client_rdp_file_new(); if (!file) return -1; if (freerdp_client_parse_rdp_file_buffer(file, buffer, size) && freerdp_client_populate_settings_from_rdp_file(file, settings)) { status = 0; } freerdp_client_rdp_file_free(file); return status; }
BOOL wf_pre_connect(freerdp* instance) { wfContext* wfc; int desktopWidth; int desktopHeight; rdpContext* context; rdpSettings* settings; context = instance->context; wfc = (wfContext*) instance->context; wfc->instance = instance; wfc->codecs = instance->context->codecs; settings = instance->settings; if (settings->ConnectionFile) { if (wfc->connectionRdpFile) { freerdp_client_rdp_file_free(wfc->connectionRdpFile); } wfc->connectionRdpFile = freerdp_client_rdp_file_new(); WLog_INFO(TAG, "Using connection file: %s", settings->ConnectionFile); freerdp_client_parse_rdp_file(wfc->connectionRdpFile, settings->ConnectionFile); freerdp_client_populate_settings_from_rdp_file(wfc->connectionRdpFile, settings); } settings->OsMajorType = OSMAJORTYPE_WINDOWS; settings->OsMinorType = OSMINORTYPE_WINDOWS_NT; settings->OrderSupport[NEG_DSTBLT_INDEX] = TRUE; settings->OrderSupport[NEG_PATBLT_INDEX] = TRUE; settings->OrderSupport[NEG_SCRBLT_INDEX] = TRUE; settings->OrderSupport[NEG_OPAQUE_RECT_INDEX] = TRUE; settings->OrderSupport[NEG_DRAWNINEGRID_INDEX] = FALSE; settings->OrderSupport[NEG_MULTIDSTBLT_INDEX] = FALSE; settings->OrderSupport[NEG_MULTIPATBLT_INDEX] = FALSE; settings->OrderSupport[NEG_MULTISCRBLT_INDEX] = FALSE; settings->OrderSupport[NEG_MULTIOPAQUERECT_INDEX] = TRUE; settings->OrderSupport[NEG_MULTI_DRAWNINEGRID_INDEX] = FALSE; settings->OrderSupport[NEG_LINETO_INDEX] = TRUE; settings->OrderSupport[NEG_POLYLINE_INDEX] = TRUE; settings->OrderSupport[NEG_MEMBLT_INDEX] = TRUE; settings->OrderSupport[NEG_MEM3BLT_INDEX] = FALSE; settings->OrderSupport[NEG_SAVEBITMAP_INDEX] = FALSE; settings->OrderSupport[NEG_GLYPH_INDEX_INDEX] = FALSE; settings->OrderSupport[NEG_FAST_INDEX_INDEX] = FALSE; settings->OrderSupport[NEG_FAST_GLYPH_INDEX] = FALSE; settings->OrderSupport[NEG_POLYGON_SC_INDEX] = FALSE; settings->OrderSupport[NEG_POLYGON_CB_INDEX] = FALSE; settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE; settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE; settings->GlyphSupportLevel = GLYPH_SUPPORT_NONE; wfc->fullscreen = settings->Fullscreen; if (wfc->fullscreen) wfc->fs_toggle = 1; wfc->clrconv = (HCLRCONV) malloc(sizeof(CLRCONV)); ZeroMemory(wfc->clrconv, sizeof(CLRCONV)); wfc->clrconv->palette = NULL; wfc->clrconv->alpha = FALSE; instance->context->cache = cache_new(settings); desktopWidth = settings->DesktopWidth; desktopHeight = settings->DesktopHeight; if (wfc->percentscreen > 0) { desktopWidth = (GetSystemMetrics(SM_CXSCREEN) * wfc->percentscreen) / 100; settings->DesktopWidth = desktopWidth; desktopHeight = (GetSystemMetrics(SM_CYSCREEN) * wfc->percentscreen) / 100; settings->DesktopHeight = desktopHeight; } if (wfc->fullscreen) { if (settings->UseMultimon) { desktopWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN); desktopHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN); } else { desktopWidth = GetSystemMetrics(SM_CXSCREEN); desktopHeight = GetSystemMetrics(SM_CYSCREEN); } } /* FIXME: desktopWidth has a limitation that it should be divisible by 4, * otherwise the screen will crash when connecting to an XP desktop.*/ desktopWidth = (desktopWidth + 3) & (~3); if (desktopWidth != settings->DesktopWidth) { freerdp_set_param_uint32(settings, FreeRDP_DesktopWidth, desktopWidth); } if (desktopHeight != settings->DesktopHeight) { freerdp_set_param_uint32(settings, FreeRDP_DesktopHeight, desktopHeight); } if ((settings->DesktopWidth < 64) || (settings->DesktopHeight < 64) || (settings->DesktopWidth > 4096) || (settings->DesktopHeight > 4096)) { WLog_ERR(TAG, "invalid dimensions %d %d", settings->DesktopWidth, settings->DesktopHeight); return 1; } freerdp_set_param_uint32(settings, FreeRDP_KeyboardLayout, (int) GetKeyboardLayout(0) & 0x0000FFFF); PubSub_SubscribeChannelConnected(instance->context->pubSub, (pChannelConnectedEventHandler) wf_OnChannelConnectedEventHandler); PubSub_SubscribeChannelDisconnected(instance->context->pubSub, (pChannelDisconnectedEventHandler) wf_OnChannelDisconnectedEventHandler); freerdp_channels_pre_connect(instance->context->channels, instance); return TRUE; }
BOOL wf_pre_connect(freerdp* instance) { int i1; wfInfo* wfi; rdpFile* file; wfContext* context; rdpSettings* settings; context = (wfContext*) instance->context; wfi = context->wfi; wfi->instance = instance; settings = instance->settings; if (settings->ConnectionFile) { file = freerdp_client_rdp_file_new(); fprintf(stderr, "Using connection file: %s\n", settings->ConnectionFile); freerdp_client_parse_rdp_file(file, settings->ConnectionFile); freerdp_client_populate_settings_from_rdp_file(file, settings); freerdp_client_rdp_file_free(file); } settings->OsMajorType = OSMAJORTYPE_WINDOWS; settings->OsMinorType = OSMINORTYPE_WINDOWS_NT; settings->OrderSupport[NEG_DSTBLT_INDEX] = TRUE; settings->OrderSupport[NEG_PATBLT_INDEX] = TRUE; settings->OrderSupport[NEG_SCRBLT_INDEX] = TRUE; settings->OrderSupport[NEG_OPAQUE_RECT_INDEX] = TRUE; settings->OrderSupport[NEG_DRAWNINEGRID_INDEX] = FALSE; settings->OrderSupport[NEG_MULTIDSTBLT_INDEX] = FALSE; settings->OrderSupport[NEG_MULTIPATBLT_INDEX] = FALSE; settings->OrderSupport[NEG_MULTISCRBLT_INDEX] = FALSE; settings->OrderSupport[NEG_MULTIOPAQUERECT_INDEX] = TRUE; settings->OrderSupport[NEG_MULTI_DRAWNINEGRID_INDEX] = FALSE; settings->OrderSupport[NEG_LINETO_INDEX] = TRUE; settings->OrderSupport[NEG_POLYLINE_INDEX] = TRUE; settings->OrderSupport[NEG_MEMBLT_INDEX] = TRUE; settings->OrderSupport[NEG_MEM3BLT_INDEX] = FALSE; settings->OrderSupport[NEG_SAVEBITMAP_INDEX] = FALSE; settings->OrderSupport[NEG_GLYPH_INDEX_INDEX] = FALSE; settings->OrderSupport[NEG_FAST_INDEX_INDEX] = FALSE; settings->OrderSupport[NEG_FAST_GLYPH_INDEX] = FALSE; settings->OrderSupport[NEG_POLYGON_SC_INDEX] = FALSE; settings->OrderSupport[NEG_POLYGON_CB_INDEX] = FALSE; settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE; settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE; settings->GlyphSupportLevel = GLYPH_SUPPORT_NONE; wfi->fullscreen = settings->Fullscreen; wfi->fs_toggle = 1; wfi->sw_gdi = settings->SoftwareGdi; wfi->clrconv = (HCLRCONV) malloc(sizeof(CLRCONV)); ZeroMemory(wfi->clrconv, sizeof(CLRCONV)); wfi->clrconv->palette = NULL; wfi->clrconv->alpha = FALSE; instance->context->cache = cache_new(settings); if (wfi->percentscreen > 0) { i1 = (GetSystemMetrics(SM_CXSCREEN) * wfi->percentscreen) / 100; settings->DesktopWidth = i1; i1 = (GetSystemMetrics(SM_CYSCREEN) * wfi->percentscreen) / 100; settings->DesktopHeight = i1; } if (wfi->fullscreen) { settings->DesktopWidth = GetSystemMetrics(SM_CXSCREEN); settings->DesktopHeight = GetSystemMetrics(SM_CYSCREEN); } i1 = settings->DesktopWidth; i1 = (i1 + 3) & (~3); settings->DesktopWidth = i1; if ((settings->DesktopWidth < 64) || (settings->DesktopHeight < 64) || (settings->DesktopWidth > 4096) || (settings->DesktopHeight > 4096)) { fprintf(stderr, "wf_pre_connect: invalid dimensions %d %d\n", settings->DesktopWidth, settings->DesktopHeight); return 1; } settings->KeyboardLayout = (int) GetKeyboardLayout(0) & 0x0000FFFF; freerdp_channels_pre_connect(instance->context->channels, instance); return TRUE; }
int TestClientRdpFile(int argc, char* argv[]) { rdpFile* file; /* Unicode */ file = freerdp_client_rdp_file_new(); freerdp_client_parse_rdp_file_buffer(file, testRdpFileUTF16, sizeof(testRdpFileUTF16)); if (file->UseMultiMon != 0) { printf("UseMultiMon mismatch: Actual: %ld, Expected: %d\n", file->UseMultiMon, 0); return -1; } if (file->ScreenModeId != 2) { printf("ScreenModeId mismatch: Actual: %ld, Expected: %d\n", file->ScreenModeId, 2); return -1; } if (file->GatewayProfileUsageMethod != 1) { printf("GatewayProfileUsageMethod mismatch: Actual: %ld, Expected: %d\n", file->GatewayProfileUsageMethod, 1); return -1; } if (strcmp(file->GatewayHostname, "LAB1-W2K8R2-GW.lab1.awake.local") != 0) { printf("GatewayHostname mismatch: Actual: %s, Expected: %s\n", file->GatewayHostname, "LAB1-W2K8R2-GW.lab1.awake.local"); return -1; } freerdp_client_rdp_file_free(file); /* Ascii */ file = freerdp_client_rdp_file_new(); freerdp_client_parse_rdp_file_buffer(file, (BYTE*) testRdpFileUTF8, sizeof(testRdpFileUTF8)); if (file->UseMultiMon != 0) { printf("UseMultiMon mismatch: Actual: %ld, Expected: %d\n", file->UseMultiMon, 0); return -1; } if (file->ScreenModeId != 2) { printf("ScreenModeId mismatch: Actual: %ld, Expected: %d\n", file->ScreenModeId, 2); return -1; } if (file->GatewayProfileUsageMethod != 1) { printf("GatewayProfileUsageMethod mismatch: Actual: %ld, Expected: %d\n", file->GatewayProfileUsageMethod, 1); return -1; } if (strcmp(file->GatewayHostname, "LAB1-W2K8R2-GW.lab1.awake.local") != 0) { printf("GatewayHostname mismatch: Actual: %s, Expected: %s\n", file->GatewayHostname, "LAB1-W2K8R2-GW.lab1.awake.local"); return -1; } freerdp_client_rdp_file_free(file); return 0; }
int TestClientRdpFile(int argc, char* argv[]) { int index; int iValue; char* sValue; rdpFile* file; rdpFileLine* line; /* Unicode */ file = freerdp_client_rdp_file_new(); if (!file) { printf("rdp_file_new failed\n"); return -1; } freerdp_client_parse_rdp_file_buffer(file, testRdpFileUTF16, sizeof(testRdpFileUTF16)); if (file->UseMultiMon != 0) { printf("UseMultiMon mismatch: Actual: %"PRIu32", Expected: 0\n", file->UseMultiMon); return -1; } if (file->ScreenModeId != 2) { printf("ScreenModeId mismatch: Actual: %"PRIu32", Expected: 2\n", file->ScreenModeId); return -1; } if (file->GatewayProfileUsageMethod != 1) { printf("GatewayProfileUsageMethod mismatch: Actual: %"PRIu32", Expected: 1\n", file->GatewayProfileUsageMethod); return -1; } if (strcmp(file->GatewayHostname, "LAB1-W2K8R2-GW.lab1.awake.local") != 0) { printf("GatewayHostname mismatch: Actual: %s, Expected: %s\n", file->GatewayHostname, "LAB1-W2K8R2-GW.lab1.awake.local"); return -1; } freerdp_client_rdp_file_free(file); /* Ascii */ file = freerdp_client_rdp_file_new(); freerdp_client_parse_rdp_file_buffer(file, (BYTE*) testRdpFileUTF8, sizeof(testRdpFileUTF8)); if (file->UseMultiMon != 0) { printf("UseMultiMon mismatch: Actual: %"PRIu32", Expected: 0\n", file->UseMultiMon); return -1; } if (file->ScreenModeId != 2) { printf("ScreenModeId mismatch: Actual: %"PRIu32", Expected: 2\n", file->ScreenModeId); return -1; } if (file->GatewayProfileUsageMethod != 1) { printf("GatewayProfileUsageMethod mismatch: Actual: %"PRIu32", Expected: 1\n", file->GatewayProfileUsageMethod); return -1; } if (strcmp(file->GatewayHostname, "LAB1-W2K8R2-GW.lab1.awake.local") != 0) { printf("GatewayHostname mismatch: Actual: %s, Expected: %s\n", file->GatewayHostname, "LAB1-W2K8R2-GW.lab1.awake.local"); return -1; } iValue = freerdp_client_rdp_file_get_integer_option(file, "vendor integer"); if (freerdp_client_rdp_file_set_integer_option(file, "vendor integer", 456) == -1) { printf("failed to set integer: vendor integer"); return -1; } iValue = freerdp_client_rdp_file_get_integer_option(file, "vendor integer"); sValue = (char*) freerdp_client_rdp_file_get_string_option(file, "vendor string"); freerdp_client_rdp_file_set_string_option(file, "vendor string", "apple"); sValue = (char*) freerdp_client_rdp_file_get_string_option(file, "vendor string"); freerdp_client_rdp_file_set_string_option(file, "fruits", "banana,oranges"); if (freerdp_client_rdp_file_set_integer_option(file, "numbers", 123456789) == -1) { printf("failed to set integer: numbers"); return -1; } for (index = 0; index < file->lineCount; index++) { 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: %"PRIu32", %s\n", line->index, line->name, line->iValue, (line->flags & RDP_FILE_LINE_FLAG_STANDARD) ? "standard" : "non-standard"); } } } freerdp_client_rdp_file_free(file); return 0; }